commit cb6994188427a2a4785df6f7f5fc650c69c6af14 Author: Jacob Schmidt Date: Sat May 23 09:23:12 2026 -0500 chore: baseline v0.1.0 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/.gitea/CONTRIBUTING.md b/.gitea/CONTRIBUTING.md new file mode 100644 index 0000000..a378b46 --- /dev/null +++ b/.gitea/CONTRIBUTING.md @@ -0,0 +1,17 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment + +### 1. Clone the repository from GitHub + +### 2. Install HEMTT + +The latest version of HEMTT can be installed by running: + +```cmd +winget install hemtt +``` + +## Coding Guidelines + +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/.gitea/ISSUE_TEMPLATE/bug-report.md b/.gitea/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..2e818b5 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: "" +labels: kind/bug +--- + +## Describe the bug + +A clear and concise description of what the bug is. + +## To reproduce + +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior + +A clear and concise description of what you expected to happen. + +## Attachments + +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context + +Add any other context about the problem here. diff --git a/.gitea/ISSUE_TEMPLATE/feature-request.md b/.gitea/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..7bd655d --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: "" +labels: kind/feature-request +--- + +## Describe the feature that you would like + +A clear and concise description of the feature you'd want. + +## Possible alternatives + +Possible alternatives to your suggestion. + +## Additional context + +Add any other context about the feature here. diff --git a/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..1721684 --- /dev/null +++ b/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +**When merged this pull request will:** + +- Describe what this pull request will do +- Each change in a separate line + +### Important + +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + + +### Known Issues + +- [ ] Issue diff --git a/.gitea/assets/placeholder.txt b/.gitea/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.gitea/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..751ea54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Rust +/target/ +**/*.rs.bk +*.pdb + +# Cargo +Cargo.lock +debug/ +target/ + +# Build artifacts +*.exe +*.dll +*.so +*.dylib + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Misc +node_modules/ +docus/.nuxt/ +docus/.output/ +docus/.data/ +docus/.nitro/ + +# OS +.DS_Store +Thumbs.db + +# Arma +arma/ui/map-viewer/ +arma/server/surrealdb/forge.db/ +promo/ diff --git a/Architecture_Diagram.md b/Architecture_Diagram.md new file mode 100644 index 0000000..329d53a --- /dev/null +++ b/Architecture_Diagram.md @@ -0,0 +1,49 @@ +# Forge Architecture + +## Runtime Flow + +```mermaid +flowchart TD + Client[Arma Client Addons] --> Server[Arma Server Addons] + Server --> Bridge[Extension Bridge] + Bridge --> Extension[Rust arma-rs Extension] + Extension --> Services[Service Layer] + Services --> Repositories[Repository Traits] + Repositories --> Surreal[(SurrealDB)] +``` + +## Persistence Startup + +```mermaid +sequenceDiagram + participant Arma as Arma Server + participant Ext as Forge Extension + participant Db as SurrealDB + + Arma->>Ext: init + Ext->>Db: connect + Ext->>Db: apply schema modules + Db-->>Ext: ready + Arma->>Ext: status + Ext-->>Arma: connected +``` + +## Data Access + +```mermaid +sequenceDiagram + participant SQF as SQF Addon + participant Ext as Extension Command + participant Service as Service + participant Repo as Repository + participant Db as SurrealDB + + SQF->>Ext: domain command + Ext->>Service: validate and execute + Service->>Repo: repository call + Repo->>Db: query/upsert/delete + Db-->>Repo: result + Repo-->>Service: domain model + Service-->>Ext: response + Ext-->>SQF: serialized result +``` diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d08f21f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,18 @@ +[workspace] +members = [ + "arma/server/extension", + "bin/icom", + "lib/models", + "lib/repositories", + "lib/services", + "lib/shared", +] +resolver = "3" + +[workspace.dependencies] +arma-rs = { version = "1.11.15", features = ["chrono", "serde_json", "uuid"] } +chrono = "0.4.42" +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.145" +tokio = { version = "1.47.1", features = ["full"] } +uuid = { version = "1.18.1", features = ["v4"] } diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..0cb1a9b --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +- **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +- **Noncommercial** - You may not use this material for any commercial purposes. +- **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +- **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b65e56 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Forge + +Forge is a framework for Arma 3 persistent game servers. It combines SQF +addons, a Rust `arma-rs` extension, shared service crates, and web-based client +interfaces for player data, organizations, banking, garages, lockers, phones, +CAD, stores, and task workflows. + +## Storage + +Durable persistence is backed by SurrealDB. The server extension loads schema +modules at startup and routes domain repositories through the SurrealDB client. + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +## Workspace + +```text +arma/ + client/ Client-side addons and browser UIs + server/ Server-side addons and extension crate +bin/ + icom/ Interprocess communication helper +lib/ + models/ Shared domain models + repositories/ Repository traits and in-memory test stores + services/ Domain business logic + shared/ Cross-crate helpers +tools/ Web UI build tooling +``` + +## Common Commands + +```powershell +cargo test +npm run build:webui +.\build-arma.ps1 +``` + +## Documentation + +- [Framework Documentation](./docs/README.md) +- [Framework Architecture](./docs/FRAMEWORK_ARCHITECTURE.md) +- [Module Reference](./docs/MODULE_REFERENCE.md) +- [Development Guide](./docs/DEVELOPMENT_GUIDE.md) +- [Git Workflow](./docs/GIT_WORKFLOW.md) + +## Extension Status + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +Both commands report the persistence connection state. diff --git a/arma/client/.editorconfig b/arma/client/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/arma/client/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/arma/client/.gitattributes b/arma/client/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/arma/client/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/arma/client/.github/CONTRIBUTING.md b/arma/client/.github/CONTRIBUTING.md new file mode 100644 index 0000000..a378b46 --- /dev/null +++ b/arma/client/.github/CONTRIBUTING.md @@ -0,0 +1,17 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment + +### 1. Clone the repository from GitHub + +### 2. Install HEMTT + +The latest version of HEMTT can be installed by running: + +```cmd +winget install hemtt +``` + +## Coding Guidelines + +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/arma/client/.github/ISSUE_TEMPLATE/bug-report.md b/arma/client/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..2e818b5 --- /dev/null +++ b/arma/client/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: "" +labels: kind/bug +--- + +## Describe the bug + +A clear and concise description of what the bug is. + +## To reproduce + +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior + +A clear and concise description of what you expected to happen. + +## Attachments + +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context + +Add any other context about the problem here. diff --git a/arma/client/.github/ISSUE_TEMPLATE/feature-request.md b/arma/client/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..7bd655d --- /dev/null +++ b/arma/client/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: "" +labels: kind/feature-request +--- + +## Describe the feature that you would like + +A clear and concise description of the feature you'd want. + +## Possible alternatives + +Possible alternatives to your suggestion. + +## Additional context + +Add any other context about the feature here. diff --git a/arma/client/.github/PULL_REQUEST_TEMPLATE.md b/arma/client/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..1721684 --- /dev/null +++ b/arma/client/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +**When merged this pull request will:** + +- Describe what this pull request will do +- Each change in a separate line + +### Important + +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + + +### Known Issues + +- [ ] Issue diff --git a/arma/client/.github/assets/placeholder.txt b/arma/client/.github/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/.github/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/client/.github/workflows/check.yml b/arma/client/.github/workflows/check.yml new file mode 100644 index 0000000..abb328f --- /dev/null +++ b/arma/client/.github/workflows/check.yml @@ -0,0 +1,28 @@ +name: HEMTT + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + + - name: Validate Config + run: python tools/config_style_checker.py + - name: Check for BOM + uses: arma-actions/bom-check@master + with: + path: "addons" + + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT check + run: hemtt check --pedantic diff --git a/arma/client/.gitignore b/arma/client/.gitignore new file mode 100644 index 0000000..41f642f --- /dev/null +++ b/arma/client/.gitignore @@ -0,0 +1,18 @@ +# HEMTT +hemtt.exe +.hemtt/missions/~* +.hemttout/ +releases/ +.hemttprivatekey + +# Textures +Exports/ +*.spp +*.spp.painter_lock +*.psd + +# Other +*.biprivatekey +*.zip +*.pbo +*.sqfc diff --git a/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml b/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml new file mode 100644 index 0000000..97b2d5f --- /dev/null +++ b/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml @@ -0,0 +1,28 @@ +name: ctrlWebBrowserAction +description: Executes an action on a web browser control +groups: + - GUI Control +syntax: + - call: !Binary [control, actionArray] + ret: + - Nothing + - Nothing + params: + - name: control + type: Control + description: Web browser control to execute action on + - name: actionArray + type: ArrayUnknown + description: | + Array in format [actionType, actionData] where: + - actionType (String): Type of action ("ExecJS", "LoadURL", "Reload", "Stop", etc.) + - actionData (String): Data for the action (JavaScript code for ExecJS, URL for LoadURL, empty string for others) +argument_loc: Local +effect_loc: Local +since: + arma_3: + major: 2 + minor: 2 +examples: + - _control ctrlWebBrowserAction ["ExecJS", "document.getElementById('test').innerHTML = 'Hello World!'"]; + - _control ctrlWebBrowserAction ["LoadURL", "https://community.bistudio.com"]; diff --git a/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai b/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai new file mode 100644 index 0000000..eb59898 --- /dev/null +++ b/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai @@ -0,0 +1,13 @@ +let readme = HEMTT_RFS.join("docs") + .join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_RFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai b/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000..c7930cd --- /dev/null +++ b/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,26 @@ +let modcpp = HEMTT_VFS.join("mod.cpp") + .open_file() + .read(); +modcpp.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("mod.cpp") + .create_file() + .write(modcpp); +print("mod.cpp version set to " + HEMTT.project().version()); + +// Currently unused, but included anyway +let readme = HEMTT_VFS.join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/client/.hemtt/launch.toml b/arma/client/.hemtt/launch.toml new file mode 100644 index 0000000..136dc12 --- /dev/null +++ b/arma/client/.hemtt/launch.toml @@ -0,0 +1,24 @@ +[default] +workshop = [ + "450814997", # CBA_A3 + "3499977893", # Advanced Dev Tools + "623475643", # 3DEN Enhanced + "3023395342", # 3DEN Attributes Fast Load +] +presets = [] +dlc = [] +optionals = [] +parameters = [ + "-skipIntro", + "-noSplash", + "-showScriptErrors", + "-debug", + "-filePatching", + "-world=empty", +] + +[ace] +extends = "default" +workshop = [ + "463939057", # ACE +] diff --git a/arma/client/.hemtt/lints.toml b/arma/client/.hemtt/lints.toml new file mode 100644 index 0000000..af141f2 --- /dev/null +++ b/arma/client/.hemtt/lints.toml @@ -0,0 +1,40 @@ +[sqf.banned_commands] +options.banned = [ + # "spawn", # Scheduled should be avoided whenever possible + "execVM", # Script files should never be run directly, they should be functions + "remoteExec", # CBA events should be used for networking +] + +[sqf.banned_macros] +options.release = [ + "DEBUG_MODE_FULL", + "DISABLE_COMPILE_CACHE", +] + +[sqf.event_unknown] +options.ignore = [ + "JSDialog", +] + +[sqf.this_call] +enabled = true + +[sqf.undefined] +enabled = true +options.check_orphan_code = true + +[sqf.unused] +enabled = true # many false positives without DEBUG_MODE_FULL +options.check_params = false + +[sqf.shadowed] +enabled = false + +[sqf.not_private] +enabled = true + +[config.file_type] +options.allow_no_extension = false + +[stringtables.usage] +options.ignore_unused = true diff --git a/arma/client/.hemtt/project.toml b/arma/client/.hemtt/project.toml new file mode 100644 index 0000000..1beed3e --- /dev/null +++ b/arma/client/.hemtt/project.toml @@ -0,0 +1,24 @@ +name = "forge-client" +author = "J.Schmidt" +prefix = "forge_client" +mainprefix = "forge" + +[version] +path = "addons/main/script_version.hpp" +git_hash = 0 + +[files] +include = [ + "mod.cpp", + "meta.cpp", + "icon_64_ca.paa", + "icon_128_ca.paa", + "icon_128_highlight_ca.paa", + "title_ca.paa", + "LICENSE.md", + "README.md", +] +exclude = [] + +[properties] +author = "J.Schmidt" diff --git a/arma/client/.hemtt/scripts/update_build.rhai b/arma/client/.hemtt/scripts/update_build.rhai new file mode 100644 index 0000000..14bdbeb --- /dev/null +++ b/arma/client/.hemtt/scripts/update_build.rhai @@ -0,0 +1,19 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define BUILD "; +let current = HEMTT.project().version().build(); +let next = current + 1; +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/.hemtt/scripts/update_minor.rhai b/arma/client/.hemtt/scripts/update_minor.rhai new file mode 100644 index 0000000..b8344fb --- /dev/null +++ b/arma/client/.hemtt/scripts/update_minor.rhai @@ -0,0 +1,23 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define MINOR "; +let current = HEMTT.project().version().minor(); +let next = current + 1; + +// Updating minor version should reset patch number +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); +current = HEMTT.project().version().patch(); +script_version.replace("#define PATCH " + current.to_string(), "#define PATCH 0"); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/.hemtt/scripts/update_patch.rhai b/arma/client/.hemtt/scripts/update_patch.rhai new file mode 100644 index 0000000..a90383f --- /dev/null +++ b/arma/client/.hemtt/scripts/update_patch.rhai @@ -0,0 +1,20 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define PATCH "; +let current = HEMTT.project().version().patch(); +let next = current + 1; + +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/LICENSE.md b/arma/client/LICENSE.md new file mode 100644 index 0000000..0cb1a9b --- /dev/null +++ b/arma/client/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +- **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +- **Noncommercial** - You may not use this material for any commercial purposes. +- **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +- **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. diff --git a/arma/client/README.md b/arma/client/README.md new file mode 100644 index 0000000..42176c4 --- /dev/null +++ b/arma/client/README.md @@ -0,0 +1,46 @@ +# Forge Client + +Forge Client contains the Arma client-side addons for Forge. It owns player UI, +browser bridges, client repositories, local event handling, and client-to-server +CBA RPC requests. + +The client mod pairs with `arma/server`: client addons collect player input and +render state, while server addons and the Rust extension own authoritative +state and persistence. + +## Requirements +- CBA A3 +- ACE3 for features that use ACE interactions, arsenal, spectator, or medical + integrations +- Forge Server running the matching server-side addons + +## Addons +- `main`: shared client mod config and macros +- `common`: shared browser UI bridge helpers +- `actor`: player interaction menu and actor repository +- `bank`: banking UI and account request bridge +- `cad`: map/CAD UI for dispatch, groups, tasks, and support requests +- `garage`: vehicle storage and virtual garage UI +- `locker`: locker and virtual arsenal repositories +- `notifications`: notification HUD and sounds +- `org`: organization portal UI +- `phone`: phone, contacts, messages, and email UI +- `store`: storefront catalog and checkout UI + +## UI Pattern +Most feature UIs use an Arma display with a `CT_WEBBROWSER` control. JavaScript +sends JSON events through A3API, SQF handles them in `fnc_handleUIEvents.sqf`, +and response events are sent back into the browser with `ctrlWebBrowserAction +["ExecJS", ...]`. + +Client repositories cache the most recent state for display only. Server addons +and the extension remain authoritative. + +## Documentation +- [Root client usage guide](../../docs/CLIENT_USAGE_GUIDE.md) +- [Client docs](./docs/README.md) +- [Common web UI framework notes](./addons/common/WEB_UI_FRAMEWORK.md) +- [CAD map integration notes](./addons/cad/MAP_README.md) + +## License +Forge Client is licensed under [APL-SA](./LICENSE.md). diff --git a/arma/client/addons/actor/$PBOPREFIX$ b/arma/client/addons/actor/$PBOPREFIX$ new file mode 100644 index 0000000..b2c67a6 --- /dev/null +++ b/arma/client/addons/actor/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\actor diff --git a/arma/client/addons/actor/CfgEventHandlers.hpp b/arma/client/addons/actor/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/actor/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/actor/README.md b/arma/client/addons/actor/README.md new file mode 100644 index 0000000..2684cf8 --- /dev/null +++ b/arma/client/addons/actor/README.md @@ -0,0 +1,28 @@ +# Forge Client Actor + +## Overview +The actor addon owns the player interaction menu and client-side actor +repository. It initializes actor state from the server, tracks client-visible +actor fields, and routes menu actions to other Forge UIs. + +## Dependencies +- `forge_client_main` +- server actor events from `forge_server_actor` +- runtime integrations with bank, CAD, garage, org, phone, store, locker, and + notifications addons + +## Main Components +- `fnc_initRepository.sqf` manages client actor state and server init/save + requests. +- `fnc_openUI.sqf` opens `RscActorMenu`. +- `fnc_handleUIEvents.sqf` handles browser menu actions. + +## Event Surface +The actor menu can open bank, ATM mode, CAD, garage, virtual garage, org, phone, +store, and ACE arsenal interactions. Client post-init also wires player killed +and respawn handlers into the server economy flow. + +## Runtime Notes +Actor state is loaded before dependent systems initialize. When the server sends +actor sync data, the repository updates local view state and clears the loading +screen. diff --git a/arma/client/addons/actor/XEH_PREP.hpp b/arma/client/addons/actor/XEH_PREP.hpp new file mode 100644 index 0000000..97e1950 --- /dev/null +++ b/arma/client/addons/actor/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initRepository); +PREP(openUI); diff --git a/arma/client/addons/actor/XEH_postInit.sqf b/arma/client/addons/actor/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/actor/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/actor/XEH_postInitClient.sqf b/arma/client/addons/actor/XEH_postInitClient.sqf new file mode 100644 index 0000000..d60aacf --- /dev/null +++ b/arma/client/addons/actor/XEH_postInitClient.sqf @@ -0,0 +1,92 @@ +#include "script_component.hpp" + +removeAllWeapons player; +removeAllAssignedItems player; +removeUniform player; +removeVest player; +removeBackpack player; +removeGoggles player; +removeHeadgear player; + +SETPVAR(player,FORGE_isLoaded,false); +cutText ["Loading In...", "BLACK", 1]; + +player addEventHandler ["Killed", { + params ["_unit", "_killer", "_instigator", "_useEffects"]; + [SRPC(economy,onKilled), [_unit]] call CFUNC(serverEvent); +}]; + +player addEventHandler ["Respawn", { + params ["_unit", "_corpse"]; + + private _uid = getPlayerUID player; + [SRPC(economy,onRespawn), [_unit, _corpse, _uid]] call CFUNC(serverEvent); +}]; + +if (isNil QGVAR(ActorRepository)) then { call FUNC(initRepository); }; + +GVAR(resetMedicalSpectator) = { + player switchMove ""; + player playMoveNow ""; + + ["Terminate"] call BFUNC(EGSpectator); + + private _spectatorDisplay = findDisplay 60492; + if !(isNull _spectatorDisplay) then { _spectatorDisplay closeDisplay 1; }; + if !(isNull player) then { + player switchCamera "INTERNAL"; + player enableSimulation true; + }; + + cameraEffectEnableHUD true; + showCinemaBorder false; + disableUserInput false; +}; + +[QGVAR(initActor), { + GVAR(ActorRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(onActorRespawn), { + params [["_loadout", [], [[]]], ["_medSpawnPos", [0,0,0], [[]]], ["_medSpawnDir", 0, [0]]]; + + private _message = ["warning", "Medical Alert", "You have been revived at a medical facility.", 5000]; + EGVAR(notifications,NotificationService) call ["create", _message]; + + player setUnitLoadout _loadout; + player setPosATL _medSpawnPos; + player setDir _medSpawnDir; + player switchMove "Acts_LyingWounded_loop"; + + [] spawn { + ["Initialize", [player, [], false, true, true, true, true, true, false, false]] call BFUNC(EGSpectator); + uiSleep 5; + [SRPC(economy,onHealed), [player]] call CFUNC(serverEvent); + }; +}] call CFUNC(addEventHandler); + +[QGVAR(onActorHealed), { + call GVAR(resetMedicalSpectator); +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitActor), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(ActorRepository) call ["sync", [_data, true]]; + cutText ["", "PLAIN", 1]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncActor), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(ActorRepository) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[QGVAR(initActor), []] call CFUNC(localEvent); + +[{ + GETVAR(player,FORGE_isLoaded,false) +}, { + private _holster = GVAR(ActorRepository) call ["get", ["holster", true]]; + if (_holster) then { [player] call AFUNC(weaponselect,putWeaponAway); }; +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/actor/XEH_preInit.sqf b/arma/client/addons/actor/XEH_preInit.sqf new file mode 100644 index 0000000..630ca03 --- /dev/null +++ b/arma/client/addons/actor/XEH_preInit.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initSettings.inc.sqf" +#include "initKeybinds.inc.sqf" + +["ace_refuel_started", { + params ["_source", "_target", "", "_unit"]; + [SRPC(economy,FuelStart), [_source, _target, _unit]] call CFUNC(serverEvent); +}] call CFUNC(addEventHandler); + +["ace_refuel_tick", { + params ["_source", "_target", "_amount"]; + [SRPC(economy,FuelTick), [_source, _target, _amount]] call CFUNC(serverEvent); +}] call CFUNC(addEventHandler); + +["ace_refuel_stopped", { + params ["_source", "_target"]; + [SRPC(economy,FuelStop), [_source, _target]] call CFUNC(serverEvent); +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/actor/XEH_preInitClient.sqf b/arma/client/addons/actor/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/actor/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/actor/XEH_preStart.sqf b/arma/client/addons/actor/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/actor/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/actor/config.cpp b/arma/client/addons/actor/config.cpp new file mode 100644 index 0000000..94b4a94 --- /dev/null +++ b/arma/client/addons/actor/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscActorMenu.hpp" diff --git a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..cf26ae7 --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,66 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-04-06 + * Public: No + * + * Description: + * Handles the UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_actor_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Actor] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "actor::get::actions": { GVAR(ActorRepository) call ["getNearbyActions", [_control]]; }; + case "actor::close::menu": { closeDialog 1; }; + case "actor::open::atm": { [true] spawn EFUNC(bank,openUI); }; + case "actor::open::bank": { [] spawn EFUNC(bank,openUI); }; + case "actor::open::cad": { [] spawn EFUNC(cad,openUI); }; + case "actor::open::device": { hint "Device interaction is not yet implemented."; }; + case "actor::open::garage": { + private _garageObject = objNull; + if (_data isEqualType createHashMap) then { + private _netId = _data getOrDefault ["netId", ""]; + if (_netId isNotEqualTo "") then { _garageObject = objectFromNetId _netId; }; + }; + [_garageObject] spawn EFUNC(garage,openUI); + }; + case "actor::open::vgarage": { + private _garageObject = objNull; + if (_data isEqualType createHashMap) then { + private _netId = _data getOrDefault ["netId", ""]; + if (_netId isNotEqualTo "") then { _garageObject = objectFromNetId _netId; }; + }; + [_garageObject] spawn EFUNC(garage,openVG); + }; + case "actor::open::org": { [] spawn EFUNC(org,openUI); }; + case "actor::open::vlocker": { [FORGE_Locker_Box, player, false] spawn AFUNC(arsenal,openBox) }; + case "actor::open::phone": { [] spawn EFUNC(phone,openUI); }; + case "actor::open::iplayer": { hint "Player interaction is not yet implemented." }; + case "actor::open::store": { [] spawn EFUNC(store,openUI); }; + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +if (_event isNotEqualTo "actor::get::actions") then { closeDialog 1; }; + +true; diff --git a/arma/client/addons/actor/functions/fnc_initRepository.sqf b/arma/client/addons/actor/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..9e1de3b --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_initRepository.sqf @@ -0,0 +1,140 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the actor repository for managing player actor data. + * + * Arguments: + * None + * + * Return Value: + * Actor repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_actor_fnc_initRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ActorRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "ActorRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["actor", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + private _uid = _self get "uid"; + [SRPC(actor,requestInitActor), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["Loading actor for %1", name player]; + diag_log "[FORGE:Client:Actor] Actor Repository Initialized!"; + }], + ["save", compileFinal { + params [["_sync", false, [false]]]; + + private _uid = _self get "uid"; + [SRPC(actor,requestSaveActor), [_uid, _sync]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["sync", compileFinal { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + private _actor = _self get "actor"; + private _isLoaded = _self get "isLoaded"; + + { + _actor set [_x, _y]; + + if (_jip) then { + switch (_x) do { + case "position": { _self call ["applyPosition"]; }; + case "direction": { _self call ["applyDirection"]; }; + case "stance": { _self call ["applyStance"]; }; + case "rank": { _self call ["applyRank"]; }; + case "loadout": { _self call ["applyLoadout"]; }; + default {}; + }; + }; + } forEach _data; + + _self set ["actor", _actor]; + SETPVAR(player,FORGE_isLoaded,true); + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + diag_log "[FORGE:Client:Actor] Sync completed"; + }], + ["get", compileFinal { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + private _actor = _self get "actor"; + _actor getOrDefault [_key, _default]; + }], + ["applyPosition", compileFinal { + private _position = _self call ["get", ["position", [0, 0, 0]]]; + if (GVAR(enableLoc)) then { + player setPosASL _position; + private _pAlt = ((getPosATLVisual player) select 2); + private _pVelZ = ((velocity player) select 2); + if (_pAlt > 5 && _pVelZ < 0) then { + player setVelocity [0, 0, 0]; + player setPosATL [((getPosATLVisual player) select 0), ((getPosATLVisual player) select 1), 1]; + hint "You logged off mid air. You were moved to a safe position on the ground"; + }; + }; + }], + ["applyDirection", compileFinal { + private _direction = _self call ["get", ["direction", 0]]; + if (GVAR(enableLoc)) then { player setDir _direction; }; + }], + ["applyStance", compileFinal { + private _stance = _self call ["get", ["stance", "STAND"]]; + if (GVAR(enableLoc)) then { player playAction _stance; }; + }], + ["applyRank", compileFinal { + private _rank = _self call ["get", ["rank", "PRIVATE"]]; + player setUnitRank _rank; + }], + ["applyLoadout", compileFinal { + private _loadout = _self call ["get", ["loadout", []]]; + if (GVAR(enableGear) && count _loadout > 0) then { player setUnitLoadout _loadout; }; + }], + ["getNearbyActions", compileFinal { + params [["_control", controlNull, [controlNull]]]; + private _nearbyActions = []; + { + private _isAtm = _x getVariable ["isAtm", false]; + private _isBank = _x getVariable ["isBank", false]; + private _isGarage = _x getVariable ["isGarage", false]; + private _isLocker = _x getVariable ["isLocker", false]; + private _isStore = _x getVariable ["isStore", false]; + private _garageType = _x getVariable ["garageType", ""]; + private _garageContext = createHashMapFromArray [ + ["netId", netId _x], + ["name", vehicleVarName _x], + ["garageType", _garageType] + ]; + private _deviceType = _x getVariable ["deviceType", ""]; + private _isPlayer = _x isKindOf "Man" && isPlayer _x; + + if (_isStore) then { _nearbyActions pushBack ["store", true]; }; + if (_isAtm) then { _nearbyActions pushBack ["atm", true]; }; + if (_isBank) then { _nearbyActions pushBack ["bank", true]; }; + if (_isLocker && GVAR(enableVA)) then { _nearbyActions pushBack ["va", true]; }; + if (_isGarage) then { _nearbyActions pushBack ["garage", _garageContext]; }; + if (_isGarage && GVAR(enableVG)) then { _nearbyActions pushBack ["vg", _garageContext]; }; + if (_deviceType isNotEqualTo "") then { _nearbyActions pushBack ["device", _deviceType]; }; + if (_isPlayer && { _x isNotEqualTo player }) then { _nearbyActions pushBack ["player", name _x]; }; + } forEach (player nearObjects 5); + + _control ctrlWebBrowserAction ["ExecJS", format ["updateAvailableActions(%1)", (toJSON _nearbyActions)]]; + }] +]; + +GVAR(ActorRepository) = createHashMapObject [GVAR(ActorRepositoryBaseClass)]; +GVAR(ActorRepository) diff --git a/arma/client/addons/actor/functions/fnc_openUI.sqf b/arma/client/addons/actor/functions/fnc_openUI.sqf new file mode 100644 index 0000000..ad36acf --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_openUI.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-01-30 + * Public: No + * + * Description: + * Opens the player interaction interface. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_actor_fnc_openUI; + */ + +private _display = createDialog ["RscActorMenu", true]; +private _ctrl = _display displayCtrl 1001; + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; +// _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; + +true; diff --git a/arma/client/addons/actor/initKeybinds.inc.sqf b/arma/client/addons/actor/initKeybinds.inc.sqf new file mode 100644 index 0000000..20eb498 --- /dev/null +++ b/arma/client/addons/actor/initKeybinds.inc.sqf @@ -0,0 +1,8 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" + +[ + _category, QGVAR(ForgeIMenu), + [LSTRING(iMenu), LSTRING(iMenuTooltip)], { + call FUNC(openUI) + }, {}, [DIK_TAB, false, false, false] // Default keybind +] call CBA_fnc_addKeybind; diff --git a/arma/client/addons/actor/initSettings.inc.sqf b/arma/client/addons/actor/initSettings.inc.sqf new file mode 100644 index 0000000..08775e9 --- /dev/null +++ b/arma/client/addons/actor/initSettings.inc.sqf @@ -0,0 +1,24 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required +[ + QGVAR(enableLoc), "CHECKBOX", + [LSTRING(enableLoc), LSTRING(enableLocTooltip)], + _category, true, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableGear), "CHECKBOX", + [LSTRING(enableGear), LSTRING(enableGearTooltip)], + _category, true, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableVA), "CHECKBOX", + [LSTRING(enableVA), LSTRING(enableVATooltip)], + _category, true, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableVG), "CHECKBOX", + [LSTRING(enableVG), LSTRING(enableVGTooltip)], + _category, true, true +] call CBA_fnc_addSetting; diff --git a/arma/client/addons/actor/script_component.hpp b/arma/client/addons/actor/script_component.hpp new file mode 100644 index 0000000..95c04da --- /dev/null +++ b/arma/client/addons/actor/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT actor +#define COMPONENT_BEAUTIFIED Actor +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/actor/stringtable.xml b/arma/client/addons/actor/stringtable.xml new file mode 100644 index 0000000..6e50634 --- /dev/null +++ b/arma/client/addons/actor/stringtable.xml @@ -0,0 +1,38 @@ + + + + + Actor + + + Persistent Gear + + + Enable Persistent Gear + + + Persistent Location + + + Enable Persistent Location + + + Virtual Arsenal + + + Enable Virtual Arsenal + + + Virtual Garage + + + Enable Virtual Garage + + + Interaction Menu + + + Open your interaction menu + + + diff --git a/arma/client/addons/actor/ui/RscActorMenu.hpp b/arma/client/addons/actor/ui/RscActorMenu.hpp new file mode 100644 index 0000000..7b45e60 --- /dev/null +++ b/arma/client/addons/actor/ui/RscActorMenu.hpp @@ -0,0 +1,21 @@ +class RscActorMenu { + idd = 1000; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscActorMenu', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscActorMenu', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1001; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/actor/ui/RscCommon.hpp b/arma/client/addons/actor/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/actor/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/actor/ui/_site/index.html b/arma/client/addons/actor/ui/_site/index.html new file mode 100644 index 0000000..381988c --- /dev/null +++ b/arma/client/addons/actor/ui/_site/index.html @@ -0,0 +1,37 @@ + + + + + + Interaction Menu + + + + + + +
+ + + diff --git a/arma/client/addons/actor/ui/_site/script.js b/arma/client/addons/actor/ui/_site/script.js new file mode 100644 index 0000000..be33f4f --- /dev/null +++ b/arma/client/addons/actor/ui/_site/script.js @@ -0,0 +1,532 @@ +/** + * Interaction Menu - Modern UI Implementation + * Uses vanilla JS with React-like patterns and Redux-like state management + */ + +//============================================================================= +// #region LIBRARY - DOM Helper & State Management +//============================================================================= + +// Helper to create DOM elements (React-like createElement) +function h(tag, props = {}, ...children) { + const el = document.createElement(tag); + + if (props) { + Object.entries(props).forEach(([key, value]) => { + if (key.startsWith("on") && typeof value === "function") { + el.addEventListener(key.substring(2).toLowerCase(), value); + } else if (key === "className") { + el.className = value; + } else if (key === "style" && typeof value === "object") { + Object.assign(el.style, value); + } else { + el.setAttribute(key, value); + } + }); + } + + children.forEach((child) => { + if (typeof child === "string" || typeof child === "number") { + el.appendChild(document.createTextNode(child)); + } else if (child instanceof Node) { + el.appendChild(child); + } else if (Array.isArray(child)) { + child.forEach((c) => { + if (c instanceof Node) el.appendChild(c); + }); + } + }); + + return el; +} + +// Simple Rendering Logic +let _rootContainer = null; +let _rootComponent = null; + +function render(component, container) { + _rootContainer = container; + _rootComponent = component; + _render(); +} + +function _render() { + if (_rootContainer && _rootComponent) { + _rootContainer.innerHTML = ""; + _rootContainer.appendChild(_rootComponent()); + } +} + +//============================================================================= +// #region ACTIONS +//============================================================================= + +const ActionTypes = { + SET_AVAILABLE_ACTIONS: "SET_AVAILABLE_ACTIONS", + SET_MENU_ITEMS: "SET_MENU_ITEMS", + ADD_ACTION: "ADD_ACTION", + REMOVE_ACTION: "REMOVE_ACTION", + CLEAR_ACTIONS: "CLEAR_ACTIONS", +}; + +const actions = { + setAvailableActions: (actionTypes) => ({ + type: ActionTypes.SET_AVAILABLE_ACTIONS, + payload: actionTypes, + }), + + setMenuItems: (menuItems) => ({ + type: ActionTypes.SET_MENU_ITEMS, + payload: menuItems, + }), + + addAction: (actionType) => ({ + type: ActionTypes.ADD_ACTION, + payload: actionType, + }), + + removeAction: (actionType) => ({ + type: ActionTypes.REMOVE_ACTION, + payload: actionType, + }), + + clearActions: () => ({ + type: ActionTypes.CLEAR_ACTIONS, + }), +}; + +//============================================================================= +// #region REDUCER +//============================================================================= + +const baseMenuItems = [ + { + id: "cad", + title: "CAD", + description: "Access CAD (Computer Aided Dispatch)", + action: "actor::open::cad", + }, + { + id: "phone", + title: "Phone", + description: "Access and manage your personal phone", + action: "actor::open::phone", + }, + { + id: "org", + title: "Organization", + description: "View and manage your organization data", + action: "actor::open::org", + }, +]; + +const actionDefinitions = { + atm: { + id: "atm", + title: "ATM", + description: "Access the ATM", + action: "actor::open::atm", + }, + bank: { + id: "bank", + title: "Bank", + description: "Access your bank account and manage finances", + action: "actor::open::bank", + }, + cad: { + id: "cad", + title: "CAD", + description: "Access the CAD", + action: "actor::open::cad", + }, + phone: { + id: "phone", + title: "Phone", + description: "Access and manage your personal phone", + action: "actor::open::phone", + }, + org: { + id: "org", + title: "Organization", + description: "View and manage your organization data", + action: "actor::open::org", + }, + store: { + id: "store", + title: "Store", + description: "Browse and purchase items from the store", + action: "actor::open::store", + }, + device: { + id: "device", + title: "Device", + description: "Manage devices and settings", + action: "actor::open::device", + }, + garage: { + id: "garage", + title: "Garage", + description: "Access and manage your vehicle collection", + action: "actor::open::garage", + }, + player: { + id: "player", + title: "Player", + description: "Interact with player-specific actions", + action: "actor::open::iplayer", + }, + store: { + id: "store", + title: "Store", + description: "Browse and purchase items from the store", + action: "actor::open::store", + }, + va: { + id: "va", + title: "Arsenal", + description: "Access your virtual arsenal", + action: "actor::open::vlocker", + }, + vg: { + id: "vg", + title: "V. Garage", + description: "Access your virtual garage", + action: "actor::open::vgarage", + }, +}; + +const initialState = { + availableActions: [], + menuItems: [...baseMenuItems], + baseMenuItems: [...baseMenuItems], + actionDefinitions: { ...actionDefinitions }, +}; + +function actorReducer(state = initialState, action) { + switch (action.type) { + case ActionTypes.SET_AVAILABLE_ACTIONS: + const newMenuItems = [...state.baseMenuItems]; + + const actionArray = Array.isArray(action.payload) + ? action.payload + : []; + actionArray.forEach((actionItem) => { + if (Array.isArray(actionItem) && actionItem.length === 2) { + const [type, value] = actionItem; + const definition = state.actionDefinitions[type]; + if (definition) { + const context = + value && typeof value === "object" + ? value + : { value }; + const garageLabel = + context.name || context.garageType || ""; + const title = + ["garage", "vg"].includes(type) && garageLabel + ? `${definition.title}: ${garageLabel}` + : definition.title; + newMenuItems.push({ + ...definition, + title, + context, + }); + } else { + console.warn( + `No definition found for: ${type} - ${value}`, + ); + } + } else { + console.warn("Invalid action format:", actionItem); + } + }); + + return { + ...state, + availableActions: action.payload, + menuItems: newMenuItems, + }; + + case ActionTypes.SET_MENU_ITEMS: + return { + ...state, + menuItems: action.payload, + }; + + case ActionTypes.ADD_ACTION: + const definition = state.actionDefinitions[action.payload]; + if ( + definition && + !state.menuItems.find((item) => item.id === definition.id) + ) { + return { + ...state, + menuItems: [...state.menuItems, definition], + }; + } + return state; + + case ActionTypes.REMOVE_ACTION: + return { + ...state, + menuItems: state.menuItems.filter( + (item) => item.id !== action.payload, + ), + }; + + case ActionTypes.CLEAR_ACTIONS: + return { + ...state, + availableActions: [], + menuItems: [...state.baseMenuItems], + }; + + default: + return state; + } +} + +//============================================================================= +// #region STORE +//============================================================================= + +class Store { + constructor(reducer, initialState) { + this.reducer = reducer; + this.state = initialState; + this.listeners = []; + } + + getState() { + return this.state; + } + + dispatch(action) { + console.log("Dispatching action:", action); + this.state = this.reducer(this.state, action); + this.listeners.forEach((listener) => listener(this.state)); + _render(); // Re-render on state change + } + + subscribe(listener) { + this.listeners.push(listener); + return () => { + this.listeners = this.listeners.filter((l) => l !== listener); + }; + } +} + +const store = new Store(actorReducer, initialState); + +//============================================================================= +// #region SELECTORS +//============================================================================= + +const selectors = { + getMenuItems: (state) => state.menuItems, + getAvailableActions: (state) => state.availableActions, + getBaseMenuItems: (state) => state.baseMenuItems, + getActionDefinitions: (state) => state.actionDefinitions, + getMenuItemById: (state, id) => + state.menuItems.find((item) => item.id === id), + getMenuItemsCount: (state) => state.menuItems.length, +}; + +//============================================================================= +// #region UI COMPONENTS +//============================================================================= + +// Tooltip state +let tooltipEl = null; + +function createTooltip() { + if (!tooltipEl) { + tooltipEl = h( + "div", + { className: "radial-tooltip" }, + h("div", { className: "tooltip-title" }), + h("div", { className: "tooltip-description" }), + ); + document.body.appendChild(tooltipEl); + } + return tooltipEl; +} + +function showTooltip(item, x, y) { + const tooltip = createTooltip(); + tooltip.querySelector(".tooltip-title").textContent = item.title; + tooltip.querySelector(".tooltip-description").textContent = + item.description; + tooltip.style.left = `${x + 15}px`; + tooltip.style.top = `${y + 10}px`; + tooltip.classList.add("visible"); +} + +function hideTooltip() { + if (tooltipEl) { + tooltipEl.classList.remove("visible"); + } +} + +function RadialItem({ item, index, total, onClick }) { + const menuRadius = 160; + const itemSize = 80; + + // Calculate position in circle + const angleStep = (2 * Math.PI) / total; + const angle = angleStep * index - Math.PI / 2; // Start from top + + const centerX = menuRadius + itemSize / 2; + const centerY = menuRadius + itemSize / 2; + + const x = centerX + menuRadius * Math.cos(angle) - itemSize / 2; + const y = centerY + menuRadius * Math.sin(angle) - itemSize / 2; + + const el = h( + "div", + { + className: "radial-item", + style: { + left: `${x}px`, + top: `${y}px`, + }, + onClick: () => onClick(item), + }, + h("div", { className: "radial-item-title" }, item.title), + ); + + // Add tooltip events + el.addEventListener("mouseenter", (e) => + showTooltip(item, e.clientX, e.clientY), + ); + el.addEventListener("mousemove", (e) => { + if (tooltipEl && tooltipEl.classList.contains("visible")) { + tooltipEl.style.left = `${e.clientX + 15}px`; + tooltipEl.style.top = `${e.clientY + 10}px`; + } + }); + el.addEventListener("mouseleave", hideTooltip); + + return el; +} + +function RadialCenter({ onClose }) { + return h( + "div", + { + className: "radial-center", + onClick: onClose, + }, + h("div", { className: "center-label" }, "Close"), + ); +} + +function RadialMenu() { + const state = store.getState(); + const menuItems = selectors.getMenuItems(state); + + const handleItemClick = (item) => { + console.log("Menu item clicked:", item); + const alert = { + event: item.action, + data: item.context || {}, + }; + if (typeof A3API !== "undefined") { + A3API.SendAlert(JSON.stringify(alert)); + } + }; + + const handleClose = () => { + console.log("Close menu requested"); + const alert = { + event: "actor::close::menu", + data: {}, + }; + if (typeof A3API !== "undefined") { + A3API.SendAlert(JSON.stringify(alert)); + } + }; + + if (menuItems.length === 0) { + return h( + "div", + { className: "empty-state" }, + h("p", null, "No actions available"), + ); + } + + return h( + "div", + { className: "radial-menu" }, + RadialCenter({ onClose: handleClose }), + menuItems.map((item, index) => + RadialItem({ + item, + index, + total: menuItems.length, + onClick: handleItemClick, + }), + ), + ); +} + +function App() { + return RadialMenu(); +} + +//============================================================================= +// #region DATA HANDLERS (A3API Integration) +//============================================================================= + +function updateAvailableActions(actionTypes) { + console.log("Updating available actions:", actionTypes); + store.dispatch(actions.setAvailableActions(actionTypes)); +} + +function handleGetActionsResponse(data) { + console.log("Received actions data:", data); + store.dispatch(actions.setAvailableActions(data)); +} + +//============================================================================= +// #region INITIALIZATION +//============================================================================= + +let initialized = false; + +function initializeMenu() { + console.log("initializeMenu() called"); + + if (initialized) { + console.log("Menu already initialized, skipping..."); + return; + } + + const root = document.getElementById("app"); + if (root) { + render(App, root); + initialized = true; + console.log("Interaction menu initialized successfully"); + + // Request initial data from A3API + if (typeof A3API !== "undefined") { + const alert = { + event: "actor::get::actions", + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); + } + } else { + console.error("Root element #app not found"); + } +} + +// Auto-initialize based on DOM state +if (document.readyState !== "loading") { + console.log("Script loaded after DOM ready, auto-initializing..."); + initializeMenu(); +} else { + document.addEventListener("DOMContentLoaded", () => { + console.log("DOM loaded, initializing menu..."); + initializeMenu(); + }); +} diff --git a/arma/client/addons/actor/ui/_site/style.css b/arma/client/addons/actor/ui/_site/style.css new file mode 100644 index 0000000..527bc49 --- /dev/null +++ b/arma/client/addons/actor/ui/_site/style.css @@ -0,0 +1,190 @@ +:root { + --bg-app: rgba(0, 0, 0, 0.4); + --bg-surface: #ffffff; + --bg-surface-hover: #f1f5f9; + --primary: #475569; + --primary-hover: #1e293b; + --text-main: #1f2937; + --text-muted: #64748b; + --text-inverse: #f8fafc; + --border: #e2e8f0; + --radius: 8px; + --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --shadow-lg: + 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --menu-radius: 160px; + --item-size: 80px; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: + "Inter", + system-ui, + -apple-system, + sans-serif; + height: 100vh; + width: 100vw; + background: var(--bg-app); + color: var(--text-main); + line-height: 1.4; + overflow: hidden; +} + +#app { + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +/* Radial Menu Container */ +.radial-menu { + position: relative; + width: calc(var(--menu-radius) * 2 + var(--item-size)); + height: calc(var(--menu-radius) * 2 + var(--item-size)); +} + +/* Center Hub */ +.radial-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 90px; + height: 90px; + background: var(--bg-surface); + border: 2px solid var(--border); + border-radius: 50%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-lg); + z-index: 10; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: var(--bg-surface-hover); + border-color: var(--primary); + transform: translate(-50%, -50%) scale(1.05); + } + + .center-icon { + font-size: 1.25rem; + margin-bottom: 0.15rem; + } + + .center-label { + font-size: 0.65rem; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; + } +} + +/* Menu Items */ +.radial-item { + position: absolute; + width: var(--item-size); + height: var(--item-size); + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: var(--radius); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 0.5rem; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: var(--shadow); + text-align: center; + + &:hover { + background: var(--bg-surface-hover); + border-color: var(--primary); + transform: scale(1.15); + box-shadow: var(--shadow-lg); + z-index: 5; + + .radial-item-title { + color: var(--primary-hover); + } + } + + &:active { + transform: scale(0.95); + } +} + +.radial-item-icon { + font-size: 1.25rem; + margin-bottom: 0.25rem; +} + +.radial-item-title { + font-size: 0.6rem; + font-weight: 600; + color: var(--text-main); + line-height: 1.2; + transition: color 0.2s ease; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +/* Tooltip */ +.radial-tooltip { + position: fixed; + background: var(--primary-hover); + color: var(--text-inverse); + padding: 0.5rem 0.75rem; + border-radius: var(--radius); + font-size: 0.75rem; + white-space: nowrap; + pointer-events: none; + opacity: 0; + transition: opacity 0.15s ease; + z-index: 100; + box-shadow: var(--shadow-lg); + + &.visible { + opacity: 1; + } + + .tooltip-title { + font-weight: 600; + } + + .tooltip-description { + font-size: 0.65rem; + color: rgba(255, 255, 255, 0.7); + margin-top: 0.15rem; + } +} + +/* Empty state */ +.empty-state { + text-align: center; + padding: 2rem; + color: var(--text-muted); + background: var(--bg-surface); + border-radius: var(--radius); + box-shadow: var(--shadow); + + p { + font-size: 0.9rem; + } +} diff --git a/arma/client/addons/bank/$PBOPREFIX$ b/arma/client/addons/bank/$PBOPREFIX$ new file mode 100644 index 0000000..92cfac2 --- /dev/null +++ b/arma/client/addons/bank/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\bank diff --git a/arma/client/addons/bank/CfgEventHandlers.hpp b/arma/client/addons/bank/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/bank/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/bank/README.md b/arma/client/addons/bank/README.md new file mode 100644 index 0000000..12f43a8 --- /dev/null +++ b/arma/client/addons/bank/README.md @@ -0,0 +1,35 @@ +# Forge Client Bank + +## Overview +The bank addon provides the client banking UI and browser bridge for account +hydrate, deposits, withdrawals, transfers, PIN entry, earnings deposits, and +credit-line repayment. It also exposes PIN changes from the full bank UI. + +## Dependencies +- `forge_client_common` +- `forge_client_main` +- server bank events from `forge_server_bank` +- notifications for server-driven messages + +## Main Components +- `fnc_initRepository.sqf` tracks account load state. +- `fnc_initUIBridge.sqf` translates browser requests into server RPCs and sends + server responses back to the browser. +- `fnc_handleUIEvents.sqf` handles `bank::*` browser events. +- `fnc_openUI.sqf` opens `RscBank`; ATM mode is supported by passing `true`. + +## Browser Events +- `bank::ready` +- `bank::refresh` +- `bank::deposit::request` +- `bank::withdraw::request` +- `bank::transfer::request` +- `bank::depositEarnings::request` +- `bank::repayCreditLine::request` +- `bank::pin::request` +- `bank::pin::change::request` +- `bank::close` + +## Runtime Notes +The client only displays and requests account changes. The server bank addon and +extension own validation, balances, authorization, and persistence. diff --git a/arma/client/addons/bank/XEH_PREP.hpp b/arma/client/addons/bank/XEH_PREP.hpp new file mode 100644 index 0000000..fb83b48 --- /dev/null +++ b/arma/client/addons/bank/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(handleUIEvents); +PREP(initRepository); +PREP(initUIBridge); +PREP(openUI); diff --git a/arma/client/addons/bank/XEH_postInit.sqf b/arma/client/addons/bank/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/bank/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/bank/XEH_postInitClient.sqf b/arma/client/addons/bank/XEH_postInitClient.sqf new file mode 100644 index 0000000..90c8646 --- /dev/null +++ b/arma/client/addons/bank/XEH_postInitClient.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" + +if (isNil QGVAR(BankRepository)) then { call FUNC(initRepository); }; +if (isNil QGVAR(BankUIBridge)) then { call FUNC(initUIBridge); }; + +GVAR(sendPhoneBankEvent) = { + params [["_functionName", "", [""]], ["_arguments", [], [[]]]]; + + private _display = uiNamespace getVariable ["RscPhone", displayNull]; + if (isNull _display || { _functionName isEqualTo "" }) exitWith { false }; + + private _control = _display displayCtrl 1001; + if (isNull _control) exitWith { false }; + + private _serializedArguments = _arguments apply { toJSON _x }; + private _script = format [ + "window.%1 && window.%1(%2)", + _functionName, + _serializedArguments joinString ", " + ]; + + _control ctrlWebBrowserAction ["ExecJS", _script]; + true +}; + +[QGVAR(initBank), { + GVAR(BankRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitBank), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(BankRepository) call ["markLoaded", []]; + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleAccountSyncResponse", [_data]]; + }; + ["updateMobileBankAccount", [_data]] call GVAR(sendPhoneBankEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncBank), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(BankRepository) call ["markLoaded", []]; + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleAccountSyncResponse", [_data]]; + }; + ["updateMobileBankAccount", [_data]] call GVAR(sendPhoneBankEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseHydrateBank), { + params [["_data", createHashMap, [createHashMap]]]; + + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleHydrateResponse", [_data, "bank::hydrate"]]; + }; + ["updateMobileBank", [_data]] call GVAR(sendPhoneBankEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseBankNotice), { + params [["_type", "error", [""]], ["_message", "", [""]]]; + + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleNoticeResponse", [_type, _message]]; + }; + ["showMobileBankNotice", [_type, _message]] call GVAR(sendPhoneBankEvent); +}] call CFUNC(addEventHandler); + +[{ + EGVAR(actor,ActorRepository) get "isLoaded"; +}, { + [QGVAR(initBank), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/bank/XEH_preInit.sqf b/arma/client/addons/bank/XEH_preInit.sqf new file mode 100644 index 0000000..640756c --- /dev/null +++ b/arma/client/addons/bank/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initSettings.inc.sqf" +#include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/bank/XEH_preInitClient.sqf b/arma/client/addons/bank/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/bank/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/bank/XEH_preStart.sqf b/arma/client/addons/bank/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/bank/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/bank/config.cpp b/arma/client/addons/bank/config.cpp new file mode 100644 index 0000000..87ad980 --- /dev/null +++ b/arma/client/addons/bank/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_common", + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscBank.hpp" diff --git a/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf b/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..ffe5fa3 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,91 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2025-12-16 + * Last Update: 2026-02-17 + * Public: No + * + * Description: + * Handles the UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_bank_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Bank] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "bank::close": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleClose", []]; + }; + + closeDialog 1; + }; + case "bank::ready": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleReady", [_control, _data]]; + }; + }; + case "bank::refresh": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["refreshSession", []]; + }; + }; + case "bank::deposit::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleDepositRequest", [_data]]; + }; + }; + case "bank::withdraw::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleWithdrawRequest", [_data]]; + }; + }; + case "bank::transfer::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleTransferRequest", [_data]]; + }; + }; + case "bank::depositEarnings::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleDepositEarningsRequest", [_data]]; + }; + }; + case "bank::repayCreditLine::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleRepayCreditLineRequest", [_data]]; + }; + }; + case "bank::pin::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleSubmitPinRequest", [_data]]; + }; + }; + case "bank::pin::change::request": { + if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["handleChangePinRequest", [_data]]; + }; + }; + default { + hint format ["Unhandled bank UI event: %1", _event]; + }; +}; + +true; diff --git a/arma/client/addons/bank/functions/fnc_initRepository.sqf b/arma/client/addons/bank/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..a3efc61 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_initRepository.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the bank repository for client bank lifecycle state. + * + * Arguments: + * None + * + * Return Value: + * Bank repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_bank_fnc_initRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "BankRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + [SRPC(bank,requestInitBank), [getPlayerUID player]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["Bank loaded for %1", name player]; + diag_log "[FORGE:Client:Bank] Bank Repository Initialized!"; + }], + ["markLoaded", compileFinal { + if !(_self getOrDefault ["isLoaded", false]) then { _self set ["isLoaded", true]; }; + true + }] +]; + +GVAR(BankRepository) = createHashMapObject [GVAR(BankRepositoryBaseClass)]; +GVAR(BankRepository) diff --git a/arma/client/addons/bank/functions/fnc_initUIBridge.sqf b/arma/client/addons/bank/functions/fnc_initUIBridge.sqf new file mode 100644 index 0000000..b121901 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_initUIBridge.sqf @@ -0,0 +1,172 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the bank UI bridge for browser control state and bank UI events. + * + * Arguments: + * None + * + * Return Value: + * Bank UI bridge object [HASHMAP OBJECT] + * + * Example: + * call forge_client_bank_fnc_initUIBridge; + */ + +#pragma hemtt ignore_variables ["_self"] +private _webUIDeclarations = call EFUNC(common,initWebUIBridge); +private _webUIBridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; + +GVAR(BankUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _webUIBridgeDeclaration], + ["#type", "BankUIBridgeBaseClass"], + ["#create", compileFinal { + _self set ["mode", "bank"]; + }], + ["getActiveBrowserControl", compileFinal { + private _display = uiNamespace getVariable ["RscBank", displayNull]; + if (isNull _display) exitWith { + _self call ["setActiveBrowserControl", [controlNull]]; + controlNull + }; + + private _control = _display displayCtrl 1002; + _self call ["setActiveBrowserControl", [_control]]; + _control + }], + ["getMode", compileFinal { + _self getOrDefault ["mode", "bank"] + }], + ["hasOpenScreen", compileFinal { + private _screen = _self call ["getScreen", []]; + private _control = _self call ["getActiveBrowserControl", []]; + + !(isNull _control) && { _screen call ["isReady", []] } + }], + ["handleDepositEarningsRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = floor (_data getOrDefault ["amount", 0]); + [SRPC(bank,requestDepositEarnings), [getPlayerUID player, _amount]] call CFUNC(serverEvent); + true + }], + ["handleDepositRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = floor (_data getOrDefault ["amount", 0]); + [SRPC(bank,requestDeposit), [getPlayerUID player, _amount]] call CFUNC(serverEvent); + true + }], + ["handleChangePinRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _currentPin = _data getOrDefault ["currentPin", ""]; + private _newPin = _data getOrDefault ["newPin", ""]; + if !(_currentPin isEqualType "") then { _currentPin = str _currentPin; }; + if !(_newPin isEqualType "") then { _newPin = str _newPin; }; + + [SRPC(bank,requestChangePin), [getPlayerUID player, _currentPin, _newPin]] call CFUNC(serverEvent); + true + }], + ["handleRepayCreditLineRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = floor (_data getOrDefault ["amount", 0]); + [SRPC(bank,requestRepayCreditLine), [getPlayerUID player, _amount]] call CFUNC(serverEvent); + true + }], + ["handleHydrateResponse", compileFinal { + params [["_data", createHashMap, [createHashMap]], ["_event", "bank::hydrate", [""]]]; + + if !(_self call ["hasOpenScreen", []]) exitWith { false }; + + _self call ["sendEvent", [_event, _data, _self call ["getActiveBrowserControl", []]]] + }], + ["handleAccountSyncResponse", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + if !(_self call ["hasOpenScreen", []]) exitWith { false }; + + _self call ["sendEvent", ["bank::sync", _data, _self call ["getActiveBrowserControl", []]]] + }], + ["handleNoticeResponse", compileFinal { + params [["_type", "error", [""]], ["_message", "", [""]]]; + + _self call ["sendNotice", [_type, _message]] + }], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["setControl", [_control]]; + _screen call ["markReady", [true]]; + _self call ["flushPendingEvents", []]; + + _self call ["requestHydrate", [true]] + }], + ["handleSubmitPinRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _pin = _data getOrDefault ["pin", ""]; + if !(_pin isEqualType "") then { _pin = str _pin; }; + + [SRPC(bank,requestSubmitPin), [getPlayerUID player, _pin]] call CFUNC(serverEvent); + true + }], + ["handleTransferRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = floor (_data getOrDefault ["amount", 0]); + private _target = _data getOrDefault ["target", ""]; + private _from = toLowerANSI (_data getOrDefault ["from", "bank"]); + + [SRPC(bank,requestTransfer), [getPlayerUID player, _target, _from, _amount]] call CFUNC(serverEvent); + true + }], + ["handleWithdrawRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = floor (_data getOrDefault ["amount", 0]); + [SRPC(bank,requestWithdraw), [getPlayerUID player, _amount]] call CFUNC(serverEvent); + true + }], + ["refreshSession", compileFinal { + _self call ["requestHydrate", [false]] + }], + ["requestHydrate", compileFinal { + params [["_resetAuthorization", false, [false]]]; + + if !(_self call ["hasOpenScreen", []]) exitWith { false }; + + [SRPC(bank,requestHydrateBank), [getPlayerUID player, _self call ["getMode", []], _resetAuthorization]] call CFUNC(serverEvent); + true + }], + ["sendNotice", compileFinal { + params [["_type", "error", [""]], ["_message", "", [""]], ["_control", controlNull, [controlNull]]]; + + if (_message isEqualTo "" || { !(_self call ["hasOpenScreen", []]) }) exitWith { false }; + + _self call ["sendEvent", ["bank::notice", createHashMapFromArray [ + ["message", _message], + ["type", _type] + ], _control]] + }], + ["setMode", compileFinal { + params [["_mode", "bank", [""]]]; + + private _finalMode = toLowerANSI _mode; + if !(_finalMode in ["bank", "atm"]) then { _finalMode = "bank"; }; + + _self set ["mode", _finalMode]; + _finalMode + }] +]; + +GVAR(BankUIBridge) = createHashMapObject [GVAR(BankUIBridgeBaseClass)]; +GVAR(BankUIBridge) diff --git a/arma/client/addons/bank/functions/fnc_openUI.sqf b/arma/client/addons/bank/functions/fnc_openUI.sqf new file mode 100644 index 0000000..9a82824 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_openUI.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-01-30 + * Public: No + * + * Description: + * Opens the player bank interaction interface. + * + * Arguments: + * 0: [BOOL] - Whether to open the ATM interface + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * [true] call forge_client_bank_fnc_openUI; + */ + +params [["_isATM", false, [false]]]; + +private _display = createDialog ["RscBank", true]; +private _ctrl = _display displayCtrl 1002; + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +if !(isNil QGVAR(BankUIBridge)) then { + GVAR(BankUIBridge) call ["setMode", [["bank", "atm"] select _isATM]]; + GVAR(BankUIBridge) call ["setActiveBrowserControl", [_ctrl]]; +}; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; + +true; diff --git a/arma/client/addons/bank/initKeybinds.inc.sqf b/arma/client/addons/bank/initKeybinds.inc.sqf new file mode 100644 index 0000000..2922c52 --- /dev/null +++ b/arma/client/addons/bank/initKeybinds.inc.sqf @@ -0,0 +1 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" diff --git a/arma/client/addons/bank/initSettings.inc.sqf b/arma/client/addons/bank/initSettings.inc.sqf new file mode 100644 index 0000000..416ff52 --- /dev/null +++ b/arma/client/addons/bank/initSettings.inc.sqf @@ -0,0 +1 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required diff --git a/arma/client/addons/bank/script_component.hpp b/arma/client/addons/bank/script_component.hpp new file mode 100644 index 0000000..61a928d --- /dev/null +++ b/arma/client/addons/bank/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT bank +#define COMPONENT_BEAUTIFIED Bank +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/bank/stringtable.xml b/arma/client/addons/bank/stringtable.xml new file mode 100644 index 0000000..a995b52 --- /dev/null +++ b/arma/client/addons/bank/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Bank + + + diff --git a/arma/client/addons/bank/ui/RscBank.hpp b/arma/client/addons/bank/ui/RscBank.hpp new file mode 100644 index 0000000..dc9ec5b --- /dev/null +++ b/arma/client/addons/bank/ui/RscBank.hpp @@ -0,0 +1,21 @@ +class RscBank { + idd = 1001; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscBank', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscBank', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1002; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/bank/ui/RscCommon.hpp b/arma/client/addons/bank/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/bank/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/bank/ui/_site/bank-ui.css b/arma/client/addons/bank/ui/_site/bank-ui.css new file mode 100644 index 0000000..cea6a3b --- /dev/null +++ b/arma/client/addons/bank/ui/_site/bank-ui.css @@ -0,0 +1 @@ +:root{--bank-shell-bg:#f6f4ee;--bank-surface:linear-gradient(180deg, #fff 0%, #f4f8fd 100%);--bank-border:#12365d1f;--bank-border-strong:#12365d2e;--bank-text-main:#142f52;--bank-text-muted:#6f86a3;--bank-text-subtle:#8ea2bb;--bank-accent:#275a8c;--bank-accent-soft:#dfeaf9;--bank-accent-line:#275a8c1f;--bank-shadow:0 16px 30px #12243914}*,:before,:after{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0}body{color:var(--bank-text-main);background:0 0;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;overflow:hidden}button,input,select{font:inherit}.bank-shell{background:var(--bank-shell-bg);flex-direction:column;width:100%;height:100%;display:flex}.bank-scroll-shell{flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.bank-layout{flex:1 0 auto;grid-template-columns:320px minmax(0,1fr);gap:1.25rem;width:min(100%,1600px);min-height:100%;margin:0 auto;padding:1.25rem;display:grid}.bank-sidebar,.bank-main{flex-direction:column;gap:1rem;min-height:0;display:flex}.bank-main{overflow:visible}.bank-module,.bank-card,.bank-atm-panel{background:var(--bank-surface);border:1px solid var(--bank-border);box-shadow:var(--bank-shadow);border-radius:1.3rem;flex-direction:column;padding:1rem;display:flex}.bank-module-header,.bank-card-header,.bank-section-header,.bank-page-header{justify-content:space-between;align-items:flex-start;gap:1rem;display:flex}.bank-module-header,.bank-card-header{margin-bottom:.9rem}.bank-page{gap:1.35rem;padding:.1rem 0 0;display:grid}.bank-page-header{padding-top:.4rem}.bank-page-copy{color:var(--bank-text-muted);max-width:48rem;margin:0;line-height:1.5}.bank-page-divider{border-top:1px solid var(--bank-accent-line)}.bank-page-body{gap:1.25rem;padding-bottom:1.25rem;display:grid}.bank-page-section{border:1px solid var(--bank-border);box-shadow:none;background:#ffffffb8;border-radius:1.3rem;gap:1rem;padding:1.15rem 1.2rem 1.25rem;display:grid}.bank-title,.bank-section-title{color:var(--bank-text-main);letter-spacing:-.02em;margin:0}.bank-title{font-size:1.7rem}.bank-section-title{font-size:1.1rem}.bank-eyebrow,.bank-footer-title,.bank-stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--bank-text-subtle);font-size:.68rem;font-weight:700;display:block}.bank-pill{background:var(--bank-accent-soft);color:var(--bank-accent);letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;border-radius:999px;justify-content:center;align-items:center;padding:.48rem .8rem;font-size:.74rem;font-weight:700;display:inline-flex}.bank-summary-grid,.bank-profile-stack{gap:.8rem;display:grid}.bank-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.bank-stat-card,.bank-metric-card{border:1px solid var(--bank-border);background:#fff9;border-radius:.95rem;flex-direction:column;gap:.25rem;min-width:0;padding:.9rem;display:flex}.bank-stat-card.is-accent,.bank-metric-card.is-accent{background:linear-gradient(#edf4fe 0%,#dfeaf9 100%)}.bank-stat-card.is-success,.bank-metric-card.is-success{background:linear-gradient(#edf9f4 0%,#dff4ea 100%)}.bank-stat-card.is-warning,.bank-metric-card.is-warning{background:linear-gradient(#fdf7ea 0%,#f7edd4 100%)}.bank-stat-value,.bank-metric-value{min-width:0;color:var(--bank-text-main);overflow-wrap:anywhere;font-weight:700}.bank-stat-value{font-size:1rem}.bank-metric-value{letter-spacing:-.03em;font-size:1.8rem}.bank-metric-copy,.bank-card-copy,.bank-empty-copy,.bank-footer-copy,.bank-history-meta{color:var(--bank-text-muted);line-height:1.45}.bank-card-copy{margin:0 0 .9rem}.bank-summary-band{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem;display:grid}.bank-action-sections{grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;display:grid}.bank-support-sections{grid-template-columns:minmax(0,1fr);gap:1rem;display:grid}.bank-form-stack{gap:.75rem;display:grid}.bank-input,.bank-select{border:1px solid var(--bank-border);width:100%;min-width:0;height:2.9rem;color:var(--bank-text-main);background:#ffffffd1;border-radius:.8rem;padding:0 .95rem}.bank-action-row{gap:.75rem;display:flex}.bank-btn{border:1px solid var(--bank-border);letter-spacing:.12em;text-transform:uppercase;cursor:pointer;border-radius:.8rem;justify-content:center;align-items:center;min-height:2.85rem;padding:.75rem 1rem;font-size:.82rem;font-weight:700;transition:background-color .16s,color .16s,border-color .16s;display:inline-flex}.bank-btn:disabled{opacity:.55;cursor:default}.bank-btn-primary{color:#fff;background:#455a77;border-color:#455a77}.bank-btn-primary:hover:not(:disabled){background:#354863;border-color:#354863}.bank-btn-secondary{color:var(--bank-accent);background:#ffffffd1}.bank-btn-secondary:hover:not(:disabled){background:#eef4fd}.bank-history-list{gap:.75rem;display:grid}.bank-history-row{border:1px solid var(--bank-border);background:#fff9;border-radius:.9rem;justify-content:space-between;align-items:center;gap:1rem;padding:.85rem .95rem;display:flex}.bank-history-copy{gap:.18rem;min-width:0;display:grid}.bank-history-title,.bank-empty-title{color:var(--bank-text-main);font-weight:700}.bank-history-value{white-space:nowrap;color:var(--bank-accent);font-weight:700}.bank-empty-state{gap:.35rem;padding:1rem 0;display:grid}.bank-notice-stack{z-index:12;gap:.65rem;display:grid;position:fixed;top:1.2rem;right:1.5rem}.bank-notice{border:1px solid var(--bank-border);background:#fff;border-radius:.9rem;max-width:24rem;padding:.85rem 1rem;font-size:.92rem;box-shadow:0 14px 28px #10223824}.bank-notice.is-success{color:#166534;background:#ecfdf5;border-color:#bbf7d0}.bank-notice.is-error{color:#991b1b;background:#fef2f2;border-color:#fecaca}.bank-footer-bar{color:#f8fafc;background:#1e293b;width:100%;margin-top:auto}.bank-footer{grid-template-columns:repeat(2,minmax(0,1fr));gap:4rem;width:min(100%,1600px);margin:0 auto;padding:3rem 1.25rem;display:grid}.bank-footer-block{flex-direction:column;gap:.75rem;display:flex}.bank-footer-title{color:#f8fafc;text-transform:uppercase;letter-spacing:.1em;border-bottom:1px solid #475569;margin:0;padding-bottom:.5rem;font-size:.85rem;font-weight:700}.bank-footer-list{margin:0;padding:0;list-style:none}.bank-atm-shell{flex:1;justify-content:center;align-items:center;min-height:0;padding:2rem 1rem;display:flex}.bank-atm-panel{gap:1rem;width:min(100%,560px);display:grid}.bank-atm-stack{gap:1rem;display:grid}.bank-pin-display,.bank-balance-display{border:1px solid var(--bank-border-strong);min-height:5rem;color:var(--bank-text-main);text-align:center;background:#ffffffad;border-radius:1rem;justify-content:center;align-items:center;padding:1rem;display:flex}.bank-pin-display{font-size:2rem}.bank-balance-display{letter-spacing:-.03em;font-size:2.5rem;font-weight:800}.bank-pin-indicators{justify-content:center;align-items:center;gap:.9rem;display:flex}.bank-pin-indicator{border:2px solid var(--bank-accent);background:0 0;border-radius:999px;width:1rem;height:1rem}.bank-pin-indicator.is-filled{background:var(--bank-accent)}.bank-keypad{grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem;display:grid}.bank-key{border:1px solid var(--bank-border);min-height:3.2rem;color:var(--bank-text-main);background:#ffffffd1;border-radius:.9rem;padding:.9rem;font-weight:700}.bank-key.is-muted{color:var(--bank-text-muted);background:#eef2f8}.bank-key.is-accent{color:#fff;background:#455a77;border-color:#455a77}.bank-key.is-wide{grid-column:span 3}.bank-atm-action-grid{gap:.75rem;display:grid}.bank-shell.is-atm{background:0 0;justify-content:center;min-height:100%}.bank-shell.is-atm .bank-atm-shell{flex:1;width:100%;max-width:100%;min-height:100%}.bank-footer-copy{color:#cbd5e1;margin:0 0 .75rem;line-height:1.5}@media (width<=1200px){.bank-layout{grid-template-columns:1fr}.bank-main{overflow:visible}}@media (width<=900px){.bank-summary-band,.bank-action-sections,.bank-footer,.bank-summary-grid{grid-template-columns:1fr}} \ No newline at end of file diff --git a/arma/client/addons/bank/ui/_site/bank-ui.js b/arma/client/addons/bank/ui/_site/bank-ui.js new file mode 100644 index 0000000..a33799c --- /dev/null +++ b/arma/client/addons/bank/ui/_site/bank-ui.js @@ -0,0 +1 @@ +!function(){const n=window.ForgeWebUI;(window.BankApp=window.BankApp||{}).runtime=n,window.AppRuntime=n}(),function(){const n=window.BankApp=window.BankApp||{},e={atmAuthorized:!1,creditLine:{amountDue:0,approvedAmount:0,availableAmount:0,interestRate:.1,outstandingPrincipal:0},mode:"bank",orgFunds:0,orgName:"",playerName:"",transferTargets:[],uid:""},t={bank:0,cash:0,earnings:0,transactions:[]};function a(n,e){var t;Object.keys(n).forEach(e=>delete n[e]),Object.assign(n,(t=e,JSON.parse(JSON.stringify(t))))}n.data={account:Object.assign({},t),session:Object.assign({},e),applyAccountPatch(n){const e=Object.assign({},this.account,n||{});a(this.account,Object.assign({},t,e))},applyHydratePayload(n){a(this.session,Object.assign({},e,n?.session||{})),a(this.account,Object.assign({},t,n?.account||{}))}}}(),function(){const n=window.BankApp=window.BankApp||{},{createSignal:e}=n.runtime;n.store=new class{constructor(){[this.getMode,this.setMode]=e("bank"),[this.getNotice,this.setNotice]=e({text:"",type:""}),[this.getPendingAction,this.setPendingAction]=e(""),[this.getAtmView,this.setAtmView]=e("pin"),[this.getEnteredPin,this.setEnteredPin]=e(""),[this.getCustomAmount,this.setCustomAmount]=e(""),[this.getAccountVersion,this.setAccountVersion]=e(0),[this.getSessionVersion,this.setSessionVersion]=e(0)}finishAction(){this.setPendingAction("")}hydrateFromPayload(n){const e=String(n?.session?.mode||"bank").trim().toLowerCase(),t=Boolean(n?.session?.atmAuthorized),a=this.getMode(),s=this.getAtmView(),i=this.getPendingAction();if(this.setMode("atm"===e?"atm":"bank"),this.setPendingAction(""),this.setEnteredPin(""),this.setCustomAmount(""),this.setAccountVersion(this.getAccountVersion()+1),this.setSessionVersion(this.getSessionVersion()+1),"atm"===e)return t?"deposit"===i||"withdraw"===i||"pin"===s||"atm"!==a?void this.setAtmView("menu"):void this.setAtmView(s):void this.setAtmView("pin");this.setAtmView("dashboard")}syncAccountPatch(){this.setPendingAction(""),this.setAccountVersion(this.getAccountVersion()+1)}resetAtm(){this.setEnteredPin(""),this.setCustomAmount(""),this.setAtmView("pin")}startAction(n){this.setPendingAction(String(n||"").trim().toLowerCase())}}}(),function(){const n=window.BankApp=window.BankApp||{},e=n.store,t=window.ForgeWebUI.createBridge({closeEvent:"bank::close",globalName:"ForgeBridge",readyEvent:"bank::ready"});t.on("bank::hydrate",function(t){n.data.applyHydratePayload(t),e.hydrateFromPayload(t)}),t.on("bank::sync",function(t){n.data.applyAccountPatch(t),e.syncAccountPatch()}),t.on("bank::notice",t=>{e.finishAction(),n.actions&&n.actions.showNotice(t.type||"error",t.message||"Bank notice received.")}),n.bridge={notifyReady:()=>t.ready({loaded:!0}),receive:t.receive,requestClose:()=>t.close({}),requestDeposit:n=>t.send("bank::deposit::request",n),requestDepositEarnings:n=>t.send("bank::depositEarnings::request",n),requestRepayCreditLine:n=>t.send("bank::repayCreditLine::request",n),requestRefresh:()=>t.send("bank::refresh",{}),requestChangePin:n=>t.send("bank::pin::change::request",n),requestSubmitPin:n=>t.send("bank::pin::request",n),requestTransfer:n=>t.send("bank::transfer::request",n),requestWithdraw:n=>t.send("bank::withdraw::request",n),sendEvent:t.send}}(),function(){const n=window.BankApp=window.BankApp||{},e=n.store;let t=null;function a(n){const e=Math.floor(Number(n||0));return Number.isFinite(e)?e:0}function s(n,a){e.setNotice({type:n,text:a}),t&&clearTimeout(t),t=setTimeout(()=>{e.setNotice({text:"",type:""}),t=null},3200)}function i(t){const i=a(t),o=n.bridge;if(!o||"function"!=typeof o.requestDeposit)return s("error","Deposit bridge is unavailable."),!1;e.startAction("deposit");return!!o.requestDeposit({amount:i})||(e.finishAction(),s("error","Deposit bridge is unavailable."),!1)}function o(t){const i=a(t),o=n.bridge;if(!o||"function"!=typeof o.requestWithdraw)return s("error","Withdraw bridge is unavailable."),!1;e.startAction("withdraw");return!!o.requestWithdraw({amount:i})||(e.finishAction(),s("error","Withdraw bridge is unavailable."),!1)}function r(n){return String(n||"").replace(/\D/g,"").slice(0,4)}function c(){e.setEnteredPin("")}n.actions={appendCustomAmountDigit:function(n){const t=String(n||"").trim();if(!t)return;const a=String(e.getCustomAmount()||"");a.length>=7||e.setCustomAmount(a+t)},appendPinDigit:function(n){const t=String(n||"").trim();if(!t)return;const a=String(e.getEnteredPin()||"");a.length>=4||e.setEnteredPin(a+t)},backspaceCustomAmount:function(){const n=String(e.getCustomAmount()||"");e.setCustomAmount(n.slice(0,-1))},backspacePin:function(){const n=String(e.getEnteredPin()||"");e.setEnteredPin(n.slice(0,-1))},clearCustomAmount:function(){e.setCustomAmount("")},clearPin:c,closeBank:function(){const e=n.bridge;if(e&&"function"==typeof e.requestClose){if(e.requestClose())return!0}return s("error","Bank bridge is unavailable."),!1},refreshBank:function(){const e=n.bridge;if(e&&"function"==typeof e.requestRefresh){if(e.requestRefresh())return!0}return s("error","Bank refresh bridge is unavailable."),!1},requestAtmAmount:function(n,e){return"deposit"===String(n||"").trim().toLowerCase()?i(e):o(e)},requestChangePin:function(t,a,i){const o=r(t),c=r(a),u=r(i),l=n.bridge;return l&&"function"==typeof l.requestChangePin?4!==o.length?(s("error","Enter your current four-digit PIN."),!1):4!==c.length?(s("error","Choose a new four-digit PIN."),!1):c!==u?(s("error","New PIN confirmation does not match."),!1):o===c?(s("error","Choose a different PIN from your current PIN."),!1):(e.startAction("changepin"),!!l.requestChangePin({currentPin:o,newPin:c})||(e.finishAction(),s("error","PIN change bridge is unavailable."),!1)):(s("error","PIN change bridge is unavailable."),!1)},requestDeposit:i,requestDepositEarnings:function(t){const i=a(t),o=n.bridge;return o&&"function"==typeof o.requestDepositEarnings?(e.startAction("depositearnings"),!!o.requestDepositEarnings({amount:i})||(e.finishAction(),s("error","Earnings bridge is unavailable."),!1)):(s("error","Earnings bridge is unavailable."),!1)},requestRepayCreditLine:function(t){const i=a(t),o=n.bridge;return o&&"function"==typeof o.requestRepayCreditLine?(e.startAction("repaycreditline"),!!o.requestRepayCreditLine({amount:i})||(e.finishAction(),s("error","Credit repayment bridge is unavailable."),!1)):(s("error","Credit repayment bridge is unavailable."),!1)},requestTransfer:function(t,i){const o=a(i),r=String(t||"").trim(),c=n.bridge;return c&&"function"==typeof c.requestTransfer?(e.startAction("transfer"),!!c.requestTransfer({amount:o,from:"bank",target:r})||(e.finishAction(),s("error","Transfer bridge is unavailable."),!1)):(s("error","Transfer bridge is unavailable."),!1)},requestWithdraw:o,selectAtmView:function(n){const t=String(n||"").trim();return!!t&&("pin"===t?(e.resetAtm(),!0):(e.setCustomAmount(""),e.setAtmView(t),!0))},showNotice:s,submitCustomAmount:function(n){const t=a(e.getCustomAmount()),r=String(n||"").trim().toLowerCase();if(t<=0)return s("error","Enter a valid transaction amount."),!1;const c="deposit"===r?i(t):o(t);return c&&e.setCustomAmount(""),c},submitPin:function(){const t=String(e.getEnteredPin()||""),a=n.bridge;return a&&"function"==typeof a.requestSubmitPin?(e.startAction("pin"),a.requestSubmitPin({pin:t})?(c(),!0):(e.finishAction(),s("error","PIN bridge is unavailable."),!1)):(s("error","PIN bridge is unavailable."),!1)}}}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=n.store,{account:a}=n.data;function s(n){return`$${Math.round(Number(n||0)).toLocaleString()}`}n.componentFns=n.componentFns||{},Object.assign(n.componentFns,{clearInputValue:function(n){const e=document.getElementById(n);e&&(e.value="")},formatCurrency:s,keypad:function(n,t,a,s){return e("div",{className:"bank-keypad"},["1","2","3","4","5","6","7","8","9"].map(t=>e("button",{type:"button",className:"bank-key",onClick:()=>n(t)},t)),e("button",{type:"button",className:"bank-key is-muted",onClick:a},"C"),e("button",{type:"button",className:"bank-key",onClick:()=>n("0")},"0"),e("button",{type:"button",className:"bank-key is-accent",onClick:s},"Enter"),e("button",{type:"button",className:"bank-key is-wide",onClick:t},"Backspace"))},metricCard:function(n,t,a,s=""){return e("div",{className:s?`bank-metric-card is-${s}`:"bank-metric-card"},e("span",{className:"bank-eyebrow"},n),e("span",{className:"bank-metric-value"},t),e("span",{className:"bank-metric-copy"},a))},pending:function(n){return t.getPendingAction()===n},pinIndicators:function(n){const t=String(n||"");return e("div",{className:"bank-pin-indicators"},[0,1,2,3].map(n=>e("span",{className:ne("div",{className:"bank-history-row"},e("div",{className:"bank-history-copy"},e("span",{className:"bank-history-title"},n.type||"Transaction"),e("span",{className:"bank-history-meta"},n.date||"Pending timestamp")),e("span",{className:"bank-history-value"},s(n.amount||0)))))}})}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=n.store,a=n.actions,{account:s,session:i}=n.data,{formatCurrency:o,statCard:r}=n.componentFns;n.componentFns=n.componentFns||{},n.componentFns.BankSidebar=function(){return t.getAccountVersion(),t.getSessionVersion(),e("aside",{className:"bank-sidebar"},e("section",{className:"bank-module"},e("div",{className:"bank-module-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Account"),e("h2",{className:"bank-section-title"},"Balances")),e("span",{className:"bank-pill"},"Live")),e("div",{className:"bank-summary-grid"},r("Bank",o(s.bank),"accent"),r("Cash",o(s.cash)),r("Earnings",o(s.earnings),s.earnings>0?"warning":""),r("Org Funds",o(i.orgFunds),i.orgFunds>0?"success":""))),e("section",{className:"bank-module"},e("div",{className:"bank-module-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Profile"),e("h2",{className:"bank-section-title"},"Account Holder")),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.refreshBank()},"Refresh")),e("div",{className:"bank-profile-stack"},r("Name",i.playerName||"Unknown"),r("UID",i.uid||"-"),r("Organization",i.orgName||"No active organization"))))}}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=n.store,{account:a,session:s}=n.data,{formatCurrency:i}=n.componentFns;n.componentFns=n.componentFns||{},n.componentFns.BankFooter=function(){t.getAccountVersion(),t.getSessionVersion();const n=[{title:"Banking Resources",items:["Account Access Policy","Transfer & Wire Guidelines","Cash Handling Schedule","Terminal Security Notice"]},{title:"Bank Support",items:s.orgName?[`Organization: ${s.orgName}`,`Treasury Reference: ${i(s.orgFunds)}`,`${s.transferTargets.length} transfer recipient(s) currently visible.`,`Primary Ledger: ${i(a.bank)}`]:["Organization: No active treasury link",`${s.transferTargets.length} transfer recipient(s) currently visible.`,`Primary Ledger: ${i(a.bank)}`,`Cash On Hand: ${i(a.cash)}`]}];return e("footer",{className:"bank-footer-bar"},e("div",{className:"bank-footer"},...n.map(n=>e("div",{className:"bank-footer-block"},e("h3",{className:"bank-footer-title"},n.title),e("ul",{className:"bank-footer-list"},...(n.items||[]).map(n=>e("li",{className:"bank-footer-copy"},n)))))))}}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=n.store,a=n.actions,{account:s,session:i}=n.data,{clearInputValue:o,formatCurrency:r,metricCard:c,pending:u,readInputValue:l,transactionRows:d}=n.componentFns;function m(){t.getAccountVersion()}function b(){t.getSessionVersion()}n.componentFns=n.componentFns||{},n.componentFns.BankPageHeader=function(){return b(),e("div",{className:"bank-page-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Treasury Desk"),e("h1",{className:"bank-title"},"Personal Banking")),e("span",{className:"bank-pill"},i.playerName||"Account Holder"))},n.componentFns.BankSummarySection=function(){return m(),b(),e("section",{className:"bank-page-section bank-summary-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Overview"),e("h2",{className:"bank-section-title"},"Financial Position")),e("span",{className:"bank-pill"},"Banking Desk")),e("div",{className:"bank-summary-band"},c("Primary Balance",r(s.bank),"Available for transfers and withdrawals.","accent"),c("Cash On Hand",r(s.cash),"Funds currently carried by the player."),c("Pending Earnings",r(s.earnings),"Ready to sweep into the main account ledger.",s.earnings>0?"warning":""),c("Org Snapshot",r(i.orgFunds),"Reference value pulled from the organization treasury.",i.orgFunds>0?"success":""),c("Credit Due",r(i.creditLine?.amountDue||0),Number(i.creditLine?.amountDue||0)>0?`Outstanding principal ${r(i.creditLine?.outstandingPrincipal||0)} at ${Math.round(100*Number(i.creditLine?.interestRate||0))}% interest.`:"No active credit repayment is currently due.",Number(i.creditLine?.amountDue||0)>0?"warning":"")))},n.componentFns.BankActionSections=function(){return b(),e("div",{className:"bank-action-sections"},e("section",{className:"bank-page-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Movement"),e("h2",{className:"bank-section-title"},"Deposit / Withdraw"))),e("div",{className:"bank-form-stack"},e("input",{id:"bank-amount-input",className:"bank-input",type:"number",min:"1",placeholder:"Enter amount"}),e("div",{className:"bank-action-row"},e("button",{type:"button",className:"bank-btn bank-btn-primary",disabled:u("deposit"),onClick:()=>{a.requestDeposit(l("bank-amount-input"))&&o("bank-amount-input")}},u("deposit")?"Depositing...":"Deposit"),e("button",{type:"button",className:"bank-btn bank-btn-secondary",disabled:u("withdraw"),onClick:()=>{a.requestWithdraw(l("bank-amount-input"))&&o("bank-amount-input")}},u("withdraw")?"Withdrawing...":"Withdraw")))),e("section",{className:"bank-page-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Transfer"),e("h2",{className:"bank-section-title"},"Wire Funds"))),e("div",{className:"bank-form-stack"},e("select",{id:"bank-transfer-target",className:"bank-select"},e("option",{value:""},i.transferTargets.length>0?"Select recipient":"No available recipients"),i.transferTargets.map(n=>e("option",{value:n.uid},n.name||n.uid))),e("input",{id:"bank-transfer-amount",className:"bank-input",type:"number",min:"1",placeholder:"Enter transfer amount"}),e("button",{type:"button",className:"bank-btn bank-btn-primary",disabled:u("transfer")||0===i.transferTargets.length,onClick:()=>{a.requestTransfer(l("bank-transfer-target"),l("bank-transfer-amount"))&&o("bank-transfer-amount")}},u("transfer")?"Transferring...":"Transfer Funds"))),e("section",{className:"bank-page-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Credit"),e("h2",{className:"bank-section-title"},"Repay Org Credit"))),e("div",{className:"bank-form-stack"},e("p",{className:"bank-card-copy"},Number(i.creditLine?.amountDue||0)>0?`Outstanding due ${r(i.creditLine.amountDue||0)}. Available reserved credit ${r(i.creditLine.availableAmount||0)}.`:"No repayment is currently due on the assigned organization credit line."),e("input",{id:"bank-credit-line-amount",className:"bank-input",type:"number",min:"1",placeholder:"Enter repayment amount"}),e("button",{type:"button",className:"bank-btn bank-btn-primary",disabled:u("repaycreditline")||Number(i.creditLine?.amountDue||0)<=0,onClick:()=>{a.requestRepayCreditLine(l("bank-credit-line-amount"))&&o("bank-credit-line-amount")}},u("repaycreditline")?"Posting Repayment...":"Repay Credit Line"))))},n.componentFns.BankSupportSection=function(){return m(),e("div",{className:"bank-support-sections"},e("section",{className:"bank-page-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Sweep"),e("h2",{className:"bank-section-title"},"Deposit Earnings"))),e("p",{className:"bank-card-copy"},"Sweep pending earnings into the primary account when you want them reflected in the main balance."),e("button",{type:"button",className:"bank-btn bank-btn-primary",disabled:u("depositearnings")||Number(s.earnings||0)<=0,onClick:()=>a.requestDepositEarnings(s.earnings)},u("depositearnings")?"Depositing...":"Deposit Earnings")),e("section",{className:"bank-page-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"Security"),e("h2",{className:"bank-section-title"},"Change ATM PIN"))),e("div",{className:"bank-form-stack"},e("input",{id:"bank-current-pin",className:"bank-input",type:"password",inputMode:"numeric",maxLength:"4",placeholder:"Current PIN"}),e("input",{id:"bank-new-pin",className:"bank-input",type:"password",inputMode:"numeric",maxLength:"4",placeholder:"New PIN"}),e("input",{id:"bank-confirm-pin",className:"bank-input",type:"password",inputMode:"numeric",maxLength:"4",placeholder:"Confirm new PIN"}),e("button",{type:"button",className:"bank-btn bank-btn-primary",disabled:u("changepin"),onClick:()=>{a.requestChangePin(l("bank-current-pin"),l("bank-new-pin"),l("bank-confirm-pin"))&&(o("bank-current-pin"),o("bank-new-pin"),o("bank-confirm-pin"))}},u("changepin")?"Updating PIN...":"Update PIN"))))},n.componentFns.BankHistorySection=function(){return m(),e("section",{className:"bank-page-section bank-history-section"},e("div",{className:"bank-section-header"},e("div",null,e("span",{className:"bank-eyebrow"},"History"),e("h2",{className:"bank-section-title"},"Recent Transactions"))),d())}}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=n.store,a=n.actions,{account:s}=n.data,{formatCurrency:i,keypad:o,pinIndicators:r}=n.componentFns;function c(n){const t="deposit"===n?"Deposit":"Withdraw";return e("div",{className:"bank-atm-action-grid"},[20,50,100,500].map(s=>e("button",{type:"button",className:"bank-btn bank-btn-primary",onClick:()=>a.requestAtmAmount(n,s)},`${t} ${i(s)}`)),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.selectAtmView("deposit"===n?"customDeposit":"customWithdraw")},"Custom Amount"),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.selectAtmView("menu")},"Back"))}function u(n){const s="deposit"===n?"Deposit":"Withdraw";return e("div",{className:"bank-atm-stack"},e("div",{className:"bank-pin-display"},t.getCustomAmount()?i(t.getCustomAmount()):"$0"),o(a.appendCustomAmountDigit,a.backspaceCustomAmount,a.clearCustomAmount,()=>a.submitCustomAmount(n)),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.selectAtmView("menu")},`Cancel ${s}`))}n.componentFns=n.componentFns||{},n.componentFns.ATMView=function(){t.getAccountVersion();const n=t.getAtmView(),l=String(t.getEnteredPin()||"");let d="Terminal Access",m="Authenticate with the four-digit account PIN before using the terminal.",b=null;switch(n){case"menu":d="ATM Menu",m="Select a banking action. The ATM can deposit, withdraw, and show the live account balance.",b=e("div",{className:"bank-atm-action-grid"},e("button",{type:"button",className:"bank-btn bank-btn-primary",onClick:()=>a.selectAtmView("withdraw")},"Withdraw Cash"),e("button",{type:"button",className:"bank-btn bank-btn-primary",onClick:()=>a.selectAtmView("deposit")},"Deposit Cash"),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.selectAtmView("balance")},"Check Balance"),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.closeBank()},"Exit Terminal"));break;case"withdraw":d="Withdraw Cash",m="Choose a preset amount or enter a custom amount for withdrawal.",b=c("withdraw");break;case"deposit":d="Deposit Cash",m="Move cash on hand back into the main bank balance from the terminal.",b=c("deposit");break;case"customWithdraw":d="Custom Withdraw",m="Enter the exact withdrawal amount.",b=u("withdraw");break;case"customDeposit":d="Custom Deposit",m="Enter the exact deposit amount.",b=u("deposit");break;case"balance":d="Available Balance",m="Current bank balance available at this terminal.",b=e("div",{className:"bank-atm-stack"},e("div",{className:"bank-balance-display"},i(s.bank)),e("button",{type:"button",className:"bank-btn bank-btn-primary",onClick:()=>a.selectAtmView("menu")},"Return to Menu"));break;default:b=e("div",{className:"bank-atm-stack"},e("div",{className:"bank-pin-display"},r(l)),o(a.appendPinDigit,a.backspacePin,a.clearPin,a.submitPin),e("button",{type:"button",className:"bank-btn bank-btn-secondary",onClick:()=>a.closeBank()},"Exit Terminal"))}return e("div",{className:"bank-atm-shell"},e("section",{className:"bank-atm-panel"},e("div",{className:"bank-panel-header"},e("div",null,e("span",{className:"bank-eyebrow"},"ATM"),e("h1",{className:"bank-title"},d)),e("span",{className:"bank-pill"},"Secure Terminal")),e("p",{className:"bank-panel-copy"},m),b))}}(),function(){const n=window.BankApp=window.BankApp||{},{h:e}=n.runtime,t=window.SharedUI.componentFns.WindowTitleBar,a=n.store,s=n.actions;n.componentFns=n.componentFns||{},n.componentFns.NoticeLayer=function(){const n=a.getNotice();return n.text?e("div",{className:"bank-notice-stack"},e("div",{className:"error"===n.type?"bank-notice is-error":"bank-notice is-success"},n.text)):null},n.components=n.components||{},n.components.App=function(){const n=a.getMode();return e("div",{className:"atm"===n?"bank-shell is-atm":"bank-shell"},"atm"===n?null:t({kicker:"FORGE Finance",title:"Global Banking Network",onClose:()=>s.closeBank(),closeLabel:"Close banking interface"}),e("div",{id:"bank-notice-root"}),"atm"===n?e("div",{id:"bank-atm-root"}):[e("div",{className:"bank-scroll-shell","data-preserve-scroll-id":"bank-page-scroll"},[e("div",{className:"bank-layout"},e("div",{id:"bank-sidebar-root"}),e("main",{className:"bank-main"},e("div",{className:"bank-page"},e("div",{id:"bank-page-header-root"}),e("p",{className:"bank-page-copy"},"Manage deposits, withdrawals, transfers, and earnings sweeps from the same shared financial console."),e("div",{className:"bank-page-divider"}),e("div",{className:"bank-page-body"},e("div",{id:"bank-summary-section-root"}),e("div",{id:"bank-action-sections-root"}),e("div",{id:"bank-support-section-root"}),e("div",{id:"bank-history-section-root"}))))),e("div",{id:"bank-footer-root"})])])}}(),function(){const n=window.ForgeWebUI,e=window.BankApp,t=[{id:"bank-notice-root",preserveScroll:!1,render:()=>e.componentFns.NoticeLayer()},{id:"bank-sidebar-root",preserveScroll:!1,render:()=>e.componentFns.BankSidebar()},{id:"bank-page-header-root",preserveScroll:!1,render:()=>e.componentFns.BankPageHeader()},{id:"bank-summary-section-root",preserveScroll:!1,render:()=>e.componentFns.BankSummarySection()},{id:"bank-action-sections-root",preserveScroll:!1,render:()=>e.componentFns.BankActionSections()},{id:"bank-support-section-root",preserveScroll:!1,render:()=>e.componentFns.BankSupportSection()},{id:"bank-history-section-root",preserveScroll:!1,render:()=>e.componentFns.BankHistorySection()},{id:"bank-atm-root",preserveScroll:!1,render:()=>e.componentFns.ATMView()},{id:"bank-footer-root",preserveScroll:!1,render:()=>e.componentFns.BankFooter()}];n.createApp({name:"bank",root:"#app",setup({root:a}){const s=function(){const e=new Map;return{sync:function(){t.forEach(t=>{const a=document.getElementById(t.id),s=e.get(t.id);if(!a)return void(s&&(s.handle.dispose(),e.delete(t.id)));if(s&&s.container===a)return;s&&s.handle.dispose();const i=n.mount(a,t.render,{preserveScroll:t.preserveScroll});e.set(t.id,{container:a,handle:i})})}}}();n.mount(a,()=>e.components.App(),{preserveScroll:!1}),e.bridge&&e.bridge.notifyReady(),n.effect(()=>{e.store.getMode(),requestAnimationFrame(()=>{s.sync()})})}}).start()}(); \ No newline at end of file diff --git a/arma/client/addons/bank/ui/_site/index.html b/arma/client/addons/bank/ui/_site/index.html new file mode 100644 index 0000000..e15a999 --- /dev/null +++ b/arma/client/addons/bank/ui/_site/index.html @@ -0,0 +1 @@ +FORGE Banking Console
\ No newline at end of file diff --git a/arma/client/addons/bank/ui/src/bootstrap.js b/arma/client/addons/bank/ui/src/bootstrap.js new file mode 100644 index 0000000..6496e13 --- /dev/null +++ b/arma/client/addons/bank/ui/src/bootstrap.js @@ -0,0 +1,116 @@ +(function () { + const ForgeWebUI = window.ForgeWebUI; + const BankApp = window.BankApp; + const islandDefinitions = [ + { + id: "bank-notice-root", + preserveScroll: false, + render: () => BankApp.componentFns.NoticeLayer(), + }, + { + id: "bank-sidebar-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankSidebar(), + }, + { + id: "bank-page-header-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankPageHeader(), + }, + { + id: "bank-summary-section-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankSummarySection(), + }, + { + id: "bank-action-sections-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankActionSections(), + }, + { + id: "bank-support-section-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankSupportSection(), + }, + { + id: "bank-history-section-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankHistorySection(), + }, + { + id: "bank-atm-root", + preserveScroll: false, + render: () => BankApp.componentFns.ATMView(), + }, + { + id: "bank-footer-root", + preserveScroll: false, + render: () => BankApp.componentFns.BankFooter(), + }, + ]; + + function createIslandManager() { + const mounts = new Map(); + + function sync() { + islandDefinitions.forEach((definition) => { + const container = document.getElementById(definition.id); + const current = mounts.get(definition.id); + + if (!container) { + if (current) { + current.handle.dispose(); + mounts.delete(definition.id); + } + return; + } + + if (current && current.container === container) { + return; + } + + if (current) { + current.handle.dispose(); + } + + const handle = ForgeWebUI.mount(container, definition.render, { + preserveScroll: definition.preserveScroll, + }); + mounts.set(definition.id, { + container, + handle, + }); + }); + } + + return { + sync, + }; + } + + const app = ForgeWebUI.createApp({ + name: "bank", + root: "#app", + setup({ root }) { + const islandManager = createIslandManager(); + + ForgeWebUI.mount(root, () => BankApp.components.App(), { + preserveScroll: false, + }); + + if (BankApp.bridge) { + BankApp.bridge.notifyReady(); + } + + ForgeWebUI.effect(() => { + BankApp.store.getMode(); + + requestAnimationFrame(() => { + islandManager.sync(); + }); + }); + }, + }); + + app.start(); +})(); diff --git a/arma/client/addons/bank/ui/src/bridge.js b/arma/client/addons/bank/ui/src/bridge.js new file mode 100644 index 0000000..4638ea0 --- /dev/null +++ b/arma/client/addons/bank/ui/src/bridge.js @@ -0,0 +1,66 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const store = BankApp.store; + const bridge = window.ForgeWebUI.createBridge({ + closeEvent: "bank::close", + globalName: "ForgeBridge", + readyEvent: "bank::ready", + }); + + function hydrate(payloadData) { + BankApp.data.applyHydratePayload(payloadData); + store.hydrateFromPayload(payloadData); + } + + function syncAccount(payloadData) { + BankApp.data.applyAccountPatch(payloadData); + store.syncAccountPatch(); + } + + bridge.on("bank::hydrate", hydrate); + bridge.on("bank::sync", syncAccount); + bridge.on("bank::notice", (payloadData) => { + store.finishAction(); + if (BankApp.actions) { + BankApp.actions.showNotice( + payloadData.type || "error", + payloadData.message || "Bank notice received.", + ); + } + }); + + BankApp.bridge = { + notifyReady() { + return bridge.ready({ loaded: true }); + }, + receive: bridge.receive, + requestClose() { + return bridge.close({}); + }, + requestDeposit(payload) { + return bridge.send("bank::deposit::request", payload); + }, + requestDepositEarnings(payload) { + return bridge.send("bank::depositEarnings::request", payload); + }, + requestRepayCreditLine(payload) { + return bridge.send("bank::repayCreditLine::request", payload); + }, + requestRefresh() { + return bridge.send("bank::refresh", {}); + }, + requestChangePin(payload) { + return bridge.send("bank::pin::change::request", payload); + }, + requestSubmitPin(payload) { + return bridge.send("bank::pin::request", payload); + }, + requestTransfer(payload) { + return bridge.send("bank::transfer::request", payload); + }, + requestWithdraw(payload) { + return bridge.send("bank::withdraw::request", payload); + }, + sendEvent: bridge.send, + }; +})(); diff --git a/arma/client/addons/bank/ui/src/components/AppShell.js b/arma/client/addons/bank/ui/src/components/AppShell.js new file mode 100644 index 0000000..4cb7359 --- /dev/null +++ b/arma/client/addons/bank/ui/src/components/AppShell.js @@ -0,0 +1,104 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const WindowTitleBar = window.SharedUI.componentFns.WindowTitleBar; + const store = BankApp.store; + const actions = BankApp.actions; + + BankApp.componentFns = BankApp.componentFns || {}; + BankApp.componentFns.NoticeLayer = function NoticeLayer() { + const notice = store.getNotice(); + + if (!notice.text) { + return null; + } + + return h( + "div", + { className: "bank-notice-stack" }, + h( + "div", + { + className: + notice.type === "error" + ? "bank-notice is-error" + : "bank-notice is-success", + }, + notice.text, + ), + ); + }; + + BankApp.components = BankApp.components || {}; + BankApp.components.App = function App() { + const mode = store.getMode(); + + return h( + "div", + { className: mode === "atm" ? "bank-shell is-atm" : "bank-shell" }, + mode === "atm" + ? null + : WindowTitleBar({ + kicker: "FORGE Finance", + title: "Global Banking Network", + onClose: () => actions.closeBank(), + closeLabel: "Close banking interface", + }), + h("div", { id: "bank-notice-root" }), + mode === "atm" + ? h("div", { id: "bank-atm-root" }) + : [ + h( + "div", + { + className: "bank-scroll-shell", + "data-preserve-scroll-id": "bank-page-scroll", + }, + [ + h( + "div", + { className: "bank-layout" }, + h("div", { id: "bank-sidebar-root" }), + h( + "main", + { className: "bank-main" }, + h( + "div", + { className: "bank-page" }, + h("div", { + id: "bank-page-header-root", + }), + h( + "p", + { className: "bank-page-copy" }, + "Manage deposits, withdrawals, transfers, and earnings sweeps from the same shared financial console.", + ), + h("div", { + className: "bank-page-divider", + }), + h( + "div", + { className: "bank-page-body" }, + h("div", { + id: "bank-summary-section-root", + }), + h("div", { + id: "bank-action-sections-root", + }), + h("div", { + id: "bank-support-section-root", + }), + h("div", { + id: "bank-history-section-root", + }), + ), + ), + ), + ), + h("div", { id: "bank-footer-root" }), + ], + ), + ], + ); + }; +})(); diff --git a/arma/client/addons/bank/ui/src/components/BankSidebar.js b/arma/client/addons/bank/ui/src/components/BankSidebar.js new file mode 100644 index 0000000..6199abf --- /dev/null +++ b/arma/client/addons/bank/ui/src/components/BankSidebar.js @@ -0,0 +1,91 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const store = BankApp.store; + const actions = BankApp.actions; + const { account, session } = BankApp.data; + const { formatCurrency, statCard } = BankApp.componentFns; + + BankApp.componentFns = BankApp.componentFns || {}; + BankApp.componentFns.BankSidebar = function BankSidebar() { + store.getAccountVersion(); + store.getSessionVersion(); + + return h( + "aside", + { className: "bank-sidebar" }, + h( + "section", + { className: "bank-module" }, + h( + "div", + { className: "bank-module-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Account"), + h( + "h2", + { className: "bank-section-title" }, + "Balances", + ), + ), + h("span", { className: "bank-pill" }, "Live"), + ), + h( + "div", + { className: "bank-summary-grid" }, + statCard("Bank", formatCurrency(account.bank), "accent"), + statCard("Cash", formatCurrency(account.cash)), + statCard( + "Earnings", + formatCurrency(account.earnings), + account.earnings > 0 ? "warning" : "", + ), + statCard( + "Org Funds", + formatCurrency(session.orgFunds), + session.orgFunds > 0 ? "success" : "", + ), + ), + ), + h( + "section", + { className: "bank-module" }, + h( + "div", + { className: "bank-module-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Profile"), + h( + "h2", + { className: "bank-section-title" }, + "Account Holder", + ), + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.refreshBank(), + }, + "Refresh", + ), + ), + h( + "div", + { className: "bank-profile-stack" }, + statCard("Name", session.playerName || "Unknown"), + statCard("UID", session.uid || "-"), + statCard( + "Organization", + session.orgName || "No active organization", + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/bank/ui/src/components/Footer.js b/arma/client/addons/bank/ui/src/components/Footer.js new file mode 100644 index 0000000..607e333 --- /dev/null +++ b/arma/client/addons/bank/ui/src/components/Footer.js @@ -0,0 +1,72 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const store = BankApp.store; + const { account, session } = BankApp.data; + const { formatCurrency } = BankApp.componentFns; + + BankApp.componentFns = BankApp.componentFns || {}; + BankApp.componentFns.BankFooter = function BankFooter() { + store.getAccountVersion(); + store.getSessionVersion(); + + const sections = [ + { + title: "Banking Resources", + items: [ + "Account Access Policy", + "Transfer & Wire Guidelines", + "Cash Handling Schedule", + "Terminal Security Notice", + ], + }, + { + title: "Bank Support", + items: session.orgName + ? [ + `Organization: ${session.orgName}`, + `Treasury Reference: ${formatCurrency(session.orgFunds)}`, + `${session.transferTargets.length} transfer recipient(s) currently visible.`, + `Primary Ledger: ${formatCurrency(account.bank)}`, + ] + : [ + "Organization: No active treasury link", + `${session.transferTargets.length} transfer recipient(s) currently visible.`, + `Primary Ledger: ${formatCurrency(account.bank)}`, + `Cash On Hand: ${formatCurrency(account.cash)}`, + ], + }, + ]; + + return h( + "footer", + { className: "bank-footer-bar" }, + h( + "div", + { className: "bank-footer" }, + ...sections.map((section) => + h( + "div", + { className: "bank-footer-block" }, + h( + "h3", + { className: "bank-footer-title" }, + section.title, + ), + h( + "ul", + { className: "bank-footer-list" }, + ...(section.items || []).map((item) => + h( + "li", + { className: "bank-footer-copy" }, + item, + ), + ), + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/bank/ui/src/components/common.js b/arma/client/addons/bank/ui/src/components/common.js new file mode 100644 index 0000000..4cdd707 --- /dev/null +++ b/arma/client/addons/bank/ui/src/components/common.js @@ -0,0 +1,189 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const store = BankApp.store; + const { account } = BankApp.data; + + function formatCurrency(value) { + return `$${Math.round(Number(value || 0)).toLocaleString()}`; + } + + function pending(actionName) { + return store.getPendingAction() === actionName; + } + + function statCard(label, value, tone = "") { + return h( + "div", + { + className: tone + ? `bank-stat-card is-${tone}` + : "bank-stat-card", + }, + h("span", { className: "bank-stat-label" }, label), + h("span", { className: "bank-stat-value" }, value), + ); + } + + function metricCard(label, value, copy, tone = "") { + return h( + "div", + { + className: tone + ? `bank-metric-card is-${tone}` + : "bank-metric-card", + }, + h("span", { className: "bank-eyebrow" }, label), + h("span", { className: "bank-metric-value" }, value), + h("span", { className: "bank-metric-copy" }, copy), + ); + } + + function pinIndicators(value) { + const pin = String(value || ""); + + return h( + "div", + { className: "bank-pin-indicators" }, + [0, 1, 2, 3].map((index) => + h("span", { + className: + index < pin.length + ? "bank-pin-indicator is-filled" + : "bank-pin-indicator", + }), + ), + ); + } + + function readInputValue(id) { + return document.getElementById(id)?.value || ""; + } + + function clearInputValue(id) { + const input = document.getElementById(id); + if (input) { + input.value = ""; + } + } + + function keypad(onDigit, onBackspace, onClear, onEnter) { + const keys = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]; + + return h( + "div", + { className: "bank-keypad" }, + keys.map((digit) => + h( + "button", + { + type: "button", + className: "bank-key", + onClick: () => onDigit(digit), + }, + digit, + ), + ), + h( + "button", + { + type: "button", + className: "bank-key is-muted", + onClick: onClear, + }, + "C", + ), + h( + "button", + { + type: "button", + className: "bank-key", + onClick: () => onDigit("0"), + }, + "0", + ), + h( + "button", + { + type: "button", + className: "bank-key is-accent", + onClick: onEnter, + }, + "Enter", + ), + h( + "button", + { + type: "button", + className: "bank-key is-wide", + onClick: onBackspace, + }, + "Backspace", + ), + ); + } + + function transactionRows() { + const transactions = Array.isArray(account.transactions) + ? account.transactions + : []; + + if (transactions.length === 0) { + return h( + "div", + { className: "bank-empty-state" }, + h("h3", { className: "bank-empty-title" }, "No transactions"), + h( + "p", + { className: "bank-empty-copy" }, + "Deposits, withdrawals, and transfers will appear here after the account begins moving funds.", + ), + ); + } + + return h( + "div", + { className: "bank-history-list" }, + transactions + .slice(0, 8) + .map((entry) => + h( + "div", + { className: "bank-history-row" }, + h( + "div", + { className: "bank-history-copy" }, + h( + "span", + { className: "bank-history-title" }, + entry.type || "Transaction", + ), + h( + "span", + { className: "bank-history-meta" }, + entry.date || "Pending timestamp", + ), + ), + h( + "span", + { className: "bank-history-value" }, + formatCurrency(entry.amount || 0), + ), + ), + ), + ); + } + + BankApp.componentFns = BankApp.componentFns || {}; + Object.assign(BankApp.componentFns, { + clearInputValue, + formatCurrency, + keypad, + metricCard, + pending, + pinIndicators, + readInputValue, + statCard, + transactionRows, + }); +})(); diff --git a/arma/client/addons/bank/ui/src/data.js b/arma/client/addons/bank/ui/src/data.js new file mode 100644 index 0000000..5398487 --- /dev/null +++ b/arma/client/addons/bank/ui/src/data.js @@ -0,0 +1,58 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + + const defaultSession = { + atmAuthorized: false, + creditLine: { + amountDue: 0, + approvedAmount: 0, + availableAmount: 0, + interestRate: 0.1, + outstandingPrincipal: 0, + }, + mode: "bank", + orgFunds: 0, + orgName: "", + playerName: "", + transferTargets: [], + uid: "", + }; + + const defaultAccount = { + bank: 0, + cash: 0, + earnings: 0, + transactions: [], + }; + + function cloneValue(value) { + return JSON.parse(JSON.stringify(value)); + } + + function replaceObject(target, source) { + Object.keys(target).forEach((key) => delete target[key]); + Object.assign(target, cloneValue(source)); + } + + BankApp.data = { + account: Object.assign({}, defaultAccount), + session: Object.assign({}, defaultSession), + applyAccountPatch(patch) { + const nextAccount = Object.assign({}, this.account, patch || {}); + replaceObject( + this.account, + Object.assign({}, defaultAccount, nextAccount), + ); + }, + applyHydratePayload(payload) { + replaceObject( + this.session, + Object.assign({}, defaultSession, payload?.session || {}), + ); + replaceObject( + this.account, + Object.assign({}, defaultAccount, payload?.account || {}), + ); + }, + }; +})(); diff --git a/arma/client/addons/bank/ui/src/pages/ATMView.js b/arma/client/addons/bank/ui/src/pages/ATMView.js new file mode 100644 index 0000000..a64984c --- /dev/null +++ b/arma/client/addons/bank/ui/src/pages/ATMView.js @@ -0,0 +1,238 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const store = BankApp.store; + const actions = BankApp.actions; + const { account } = BankApp.data; + const { formatCurrency, keypad, pinIndicators } = BankApp.componentFns; + + function atmMenuCard() { + return h( + "div", + { className: "bank-atm-action-grid" }, + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + onClick: () => actions.selectAtmView("withdraw"), + }, + "Withdraw Cash", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + onClick: () => actions.selectAtmView("deposit"), + }, + "Deposit Cash", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.selectAtmView("balance"), + }, + "Check Balance", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.closeBank(), + }, + "Exit Terminal", + ), + ); + } + + function atmAmountMenu(kind) { + const label = kind === "deposit" ? "Deposit" : "Withdraw"; + const amounts = [20, 50, 100, 500]; + + return h( + "div", + { className: "bank-atm-action-grid" }, + amounts.map((amount) => + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + onClick: () => actions.requestAtmAmount(kind, amount), + }, + `${label} ${formatCurrency(amount)}`, + ), + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => + actions.selectAtmView( + kind === "deposit" + ? "customDeposit" + : "customWithdraw", + ), + }, + "Custom Amount", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.selectAtmView("menu"), + }, + "Back", + ), + ); + } + + function atmCustomAmount(kind) { + const label = kind === "deposit" ? "Deposit" : "Withdraw"; + + return h( + "div", + { className: "bank-atm-stack" }, + h( + "div", + { className: "bank-pin-display" }, + store.getCustomAmount() + ? formatCurrency(store.getCustomAmount()) + : "$0", + ), + keypad( + actions.appendCustomAmountDigit, + actions.backspaceCustomAmount, + actions.clearCustomAmount, + () => actions.submitCustomAmount(kind), + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.selectAtmView("menu"), + }, + `Cancel ${label}`, + ), + ); + } + + BankApp.componentFns = BankApp.componentFns || {}; + BankApp.componentFns.ATMView = function ATMView() { + store.getAccountVersion(); + const atmViewName = store.getAtmView(); + const enteredPin = String(store.getEnteredPin() || ""); + let title = "Terminal Access"; + let copy = + "Authenticate with the four-digit account PIN before using the terminal."; + let content = null; + + switch (atmViewName) { + case "menu": + title = "ATM Menu"; + copy = + "Select a banking action. The ATM can deposit, withdraw, and show the live account balance."; + content = atmMenuCard(); + break; + case "withdraw": + title = "Withdraw Cash"; + copy = + "Choose a preset amount or enter a custom amount for withdrawal."; + content = atmAmountMenu("withdraw"); + break; + case "deposit": + title = "Deposit Cash"; + copy = + "Move cash on hand back into the main bank balance from the terminal."; + content = atmAmountMenu("deposit"); + break; + case "customWithdraw": + title = "Custom Withdraw"; + copy = "Enter the exact withdrawal amount."; + content = atmCustomAmount("withdraw"); + break; + case "customDeposit": + title = "Custom Deposit"; + copy = "Enter the exact deposit amount."; + content = atmCustomAmount("deposit"); + break; + case "balance": + title = "Available Balance"; + copy = "Current bank balance available at this terminal."; + content = h( + "div", + { className: "bank-atm-stack" }, + h( + "div", + { className: "bank-balance-display" }, + formatCurrency(account.bank), + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + onClick: () => actions.selectAtmView("menu"), + }, + "Return to Menu", + ), + ); + break; + default: + content = h( + "div", + { className: "bank-atm-stack" }, + h( + "div", + { className: "bank-pin-display" }, + pinIndicators(enteredPin), + ), + keypad( + actions.appendPinDigit, + actions.backspacePin, + actions.clearPin, + actions.submitPin, + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + onClick: () => actions.closeBank(), + }, + "Exit Terminal", + ), + ); + break; + } + + return h( + "div", + { className: "bank-atm-shell" }, + h( + "section", + { className: "bank-atm-panel" }, + h( + "div", + { className: "bank-panel-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "ATM"), + h("h1", { className: "bank-title" }, title), + ), + h("span", { className: "bank-pill" }, "Secure Terminal"), + ), + h("p", { className: "bank-panel-copy" }, copy), + content, + ), + ); + }; +})(); diff --git a/arma/client/addons/bank/ui/src/pages/BankView.js b/arma/client/addons/bank/ui/src/pages/BankView.js new file mode 100644 index 0000000..2488b68 --- /dev/null +++ b/arma/client/addons/bank/ui/src/pages/BankView.js @@ -0,0 +1,455 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { h } = BankApp.runtime; + const store = BankApp.store; + const actions = BankApp.actions; + const { account, session } = BankApp.data; + const { + clearInputValue, + formatCurrency, + metricCard, + pending, + readInputValue, + transactionRows, + } = BankApp.componentFns; + + function trackAccount() { + store.getAccountVersion(); + } + + function trackSession() { + store.getSessionVersion(); + } + + function pageHeader() { + trackSession(); + + return h( + "div", + { className: "bank-page-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Treasury Desk"), + h("h1", { className: "bank-title" }, "Personal Banking"), + ), + h( + "span", + { className: "bank-pill" }, + session.playerName || "Account Holder", + ), + ); + } + + function summarySection() { + trackAccount(); + trackSession(); + + return h( + "section", + { className: "bank-page-section bank-summary-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Overview"), + h( + "h2", + { className: "bank-section-title" }, + "Financial Position", + ), + ), + h("span", { className: "bank-pill" }, "Banking Desk"), + ), + h( + "div", + { className: "bank-summary-band" }, + metricCard( + "Primary Balance", + formatCurrency(account.bank), + "Available for transfers and withdrawals.", + "accent", + ), + metricCard( + "Cash On Hand", + formatCurrency(account.cash), + "Funds currently carried by the player.", + ), + metricCard( + "Pending Earnings", + formatCurrency(account.earnings), + "Ready to sweep into the main account ledger.", + account.earnings > 0 ? "warning" : "", + ), + metricCard( + "Org Snapshot", + formatCurrency(session.orgFunds), + "Reference value pulled from the organization treasury.", + session.orgFunds > 0 ? "success" : "", + ), + metricCard( + "Credit Due", + formatCurrency(session.creditLine?.amountDue || 0), + Number(session.creditLine?.amountDue || 0) > 0 + ? `Outstanding principal ${formatCurrency(session.creditLine?.outstandingPrincipal || 0)} at ${Math.round(Number(session.creditLine?.interestRate || 0) * 100)}% interest.` + : "No active credit repayment is currently due.", + Number(session.creditLine?.amountDue || 0) > 0 + ? "warning" + : "", + ), + ), + ); + } + + function actionSections() { + trackSession(); + + return h( + "div", + { className: "bank-action-sections" }, + h( + "section", + { className: "bank-page-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Movement"), + h( + "h2", + { className: "bank-section-title" }, + "Deposit / Withdraw", + ), + ), + ), + h( + "div", + { className: "bank-form-stack" }, + h("input", { + id: "bank-amount-input", + className: "bank-input", + type: "number", + min: "1", + placeholder: "Enter amount", + }), + h( + "div", + { className: "bank-action-row" }, + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + disabled: pending("deposit"), + onClick: () => { + const sent = actions.requestDeposit( + readInputValue("bank-amount-input"), + ); + if (sent) { + clearInputValue("bank-amount-input"); + } + }, + }, + pending("deposit") ? "Depositing..." : "Deposit", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-secondary", + disabled: pending("withdraw"), + onClick: () => { + const sent = actions.requestWithdraw( + readInputValue("bank-amount-input"), + ); + if (sent) { + clearInputValue("bank-amount-input"); + } + }, + }, + pending("withdraw") ? "Withdrawing..." : "Withdraw", + ), + ), + ), + ), + h( + "section", + { className: "bank-page-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Transfer"), + h( + "h2", + { className: "bank-section-title" }, + "Wire Funds", + ), + ), + ), + h( + "div", + { className: "bank-form-stack" }, + h( + "select", + { + id: "bank-transfer-target", + className: "bank-select", + }, + h( + "option", + { value: "" }, + session.transferTargets.length > 0 + ? "Select recipient" + : "No available recipients", + ), + session.transferTargets.map((entry) => + h( + "option", + { value: entry.uid }, + entry.name || entry.uid, + ), + ), + ), + h("input", { + id: "bank-transfer-amount", + className: "bank-input", + type: "number", + min: "1", + placeholder: "Enter transfer amount", + }), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + disabled: + pending("transfer") || + session.transferTargets.length === 0, + onClick: () => { + const sent = actions.requestTransfer( + readInputValue("bank-transfer-target"), + readInputValue("bank-transfer-amount"), + ); + if (sent) { + clearInputValue("bank-transfer-amount"); + } + }, + }, + pending("transfer") + ? "Transferring..." + : "Transfer Funds", + ), + ), + ), + h( + "section", + { className: "bank-page-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Credit"), + h( + "h2", + { className: "bank-section-title" }, + "Repay Org Credit", + ), + ), + ), + h( + "div", + { className: "bank-form-stack" }, + h( + "p", + { className: "bank-card-copy" }, + Number(session.creditLine?.amountDue || 0) > 0 + ? `Outstanding due ${formatCurrency(session.creditLine.amountDue || 0)}. Available reserved credit ${formatCurrency(session.creditLine.availableAmount || 0)}.` + : "No repayment is currently due on the assigned organization credit line.", + ), + h("input", { + id: "bank-credit-line-amount", + className: "bank-input", + type: "number", + min: "1", + placeholder: "Enter repayment amount", + }), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + disabled: + pending("repaycreditline") || + Number(session.creditLine?.amountDue || 0) <= 0, + onClick: () => { + const sent = actions.requestRepayCreditLine( + readInputValue("bank-credit-line-amount"), + ); + if (sent) { + clearInputValue("bank-credit-line-amount"); + } + }, + }, + pending("repaycreditline") + ? "Posting Repayment..." + : "Repay Credit Line", + ), + ), + ), + ); + } + + function supportSection() { + trackAccount(); + + return h( + "div", + { className: "bank-support-sections" }, + h( + "section", + { className: "bank-page-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Sweep"), + h( + "h2", + { className: "bank-section-title" }, + "Deposit Earnings", + ), + ), + ), + h( + "p", + { className: "bank-card-copy" }, + "Sweep pending earnings into the primary account when you want them reflected in the main balance.", + ), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + disabled: + pending("depositearnings") || + Number(account.earnings || 0) <= 0, + onClick: () => + actions.requestDepositEarnings(account.earnings), + }, + pending("depositearnings") + ? "Depositing..." + : "Deposit Earnings", + ), + ), + h( + "section", + { className: "bank-page-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "Security"), + h( + "h2", + { className: "bank-section-title" }, + "Change ATM PIN", + ), + ), + ), + h( + "div", + { className: "bank-form-stack" }, + h("input", { + id: "bank-current-pin", + className: "bank-input", + type: "password", + inputMode: "numeric", + maxLength: "4", + placeholder: "Current PIN", + }), + h("input", { + id: "bank-new-pin", + className: "bank-input", + type: "password", + inputMode: "numeric", + maxLength: "4", + placeholder: "New PIN", + }), + h("input", { + id: "bank-confirm-pin", + className: "bank-input", + type: "password", + inputMode: "numeric", + maxLength: "4", + placeholder: "Confirm new PIN", + }), + h( + "button", + { + type: "button", + className: "bank-btn bank-btn-primary", + disabled: pending("changepin"), + onClick: () => { + const sent = actions.requestChangePin( + readInputValue("bank-current-pin"), + readInputValue("bank-new-pin"), + readInputValue("bank-confirm-pin"), + ); + if (sent) { + clearInputValue("bank-current-pin"); + clearInputValue("bank-new-pin"); + clearInputValue("bank-confirm-pin"); + } + }, + }, + pending("changepin") ? "Updating PIN..." : "Update PIN", + ), + ), + ), + ); + } + + function historySection() { + trackAccount(); + + return h( + "section", + { className: "bank-page-section bank-history-section" }, + h( + "div", + { className: "bank-section-header" }, + h( + "div", + null, + h("span", { className: "bank-eyebrow" }, "History"), + h( + "h2", + { className: "bank-section-title" }, + "Recent Transactions", + ), + ), + ), + transactionRows(), + ); + } + + BankApp.componentFns = BankApp.componentFns || {}; + BankApp.componentFns.BankPageHeader = pageHeader; + BankApp.componentFns.BankSummarySection = summarySection; + BankApp.componentFns.BankActionSections = actionSections; + BankApp.componentFns.BankSupportSection = supportSection; + BankApp.componentFns.BankHistorySection = historySection; +})(); diff --git a/arma/client/addons/bank/ui/src/registry/events.js b/arma/client/addons/bank/ui/src/registry/events.js new file mode 100644 index 0000000..911610c --- /dev/null +++ b/arma/client/addons/bank/ui/src/registry/events.js @@ -0,0 +1,337 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const store = BankApp.store; + + let noticeTimer = null; + + function normalizeAmount(value) { + const amount = Math.floor(Number(value || 0)); + return Number.isFinite(amount) ? amount : 0; + } + + function showNotice(type, text) { + store.setNotice({ type, text }); + + if (noticeTimer) { + clearTimeout(noticeTimer); + } + + noticeTimer = setTimeout(() => { + store.setNotice({ text: "", type: "" }); + noticeTimer = null; + }, 3200); + } + + function closeBank() { + const bridge = BankApp.bridge; + if (bridge && typeof bridge.requestClose === "function") { + const sent = bridge.requestClose(); + if (sent) { + return true; + } + } + + showNotice("error", "Bank bridge is unavailable."); + return false; + } + + function refreshBank() { + const bridge = BankApp.bridge; + if (bridge && typeof bridge.requestRefresh === "function") { + const sent = bridge.requestRefresh(); + if (sent) { + return true; + } + } + + showNotice("error", "Bank refresh bridge is unavailable."); + return false; + } + + function requestDeposit(amountValue) { + const amount = normalizeAmount(amountValue); + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestDeposit !== "function") { + showNotice("error", "Deposit bridge is unavailable."); + return false; + } + + store.startAction("deposit"); + const sent = bridge.requestDeposit({ amount }); + if (!sent) { + store.finishAction(); + showNotice("error", "Deposit bridge is unavailable."); + return false; + } + + return true; + } + + function requestWithdraw(amountValue) { + const amount = normalizeAmount(amountValue); + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestWithdraw !== "function") { + showNotice("error", "Withdraw bridge is unavailable."); + return false; + } + + store.startAction("withdraw"); + const sent = bridge.requestWithdraw({ amount }); + if (!sent) { + store.finishAction(); + showNotice("error", "Withdraw bridge is unavailable."); + return false; + } + + return true; + } + + function requestTransfer(targetUid, amountValue) { + const amount = normalizeAmount(amountValue); + const targetId = String(targetUid || "").trim(); + + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestTransfer !== "function") { + showNotice("error", "Transfer bridge is unavailable."); + return false; + } + + store.startAction("transfer"); + const sent = bridge.requestTransfer({ + amount, + from: "bank", + target: targetId, + }); + if (!sent) { + store.finishAction(); + showNotice("error", "Transfer bridge is unavailable."); + return false; + } + + return true; + } + + function requestDepositEarnings(amountValue) { + const amount = normalizeAmount(amountValue); + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestDepositEarnings !== "function") { + showNotice("error", "Earnings bridge is unavailable."); + return false; + } + + store.startAction("depositearnings"); + const sent = bridge.requestDepositEarnings({ amount }); + if (!sent) { + store.finishAction(); + showNotice("error", "Earnings bridge is unavailable."); + return false; + } + + return true; + } + + function requestRepayCreditLine(amountValue) { + const amount = normalizeAmount(amountValue); + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestRepayCreditLine !== "function") { + showNotice("error", "Credit repayment bridge is unavailable."); + return false; + } + + store.startAction("repaycreditline"); + const sent = bridge.requestRepayCreditLine({ amount }); + if (!sent) { + store.finishAction(); + showNotice("error", "Credit repayment bridge is unavailable."); + return false; + } + + return true; + } + + function normalizePin(value) { + return String(value || "") + .replace(/\D/g, "") + .slice(0, 4); + } + + function requestChangePin(currentPinValue, newPinValue, confirmPinValue) { + const currentPin = normalizePin(currentPinValue); + const newPin = normalizePin(newPinValue); + const confirmPin = normalizePin(confirmPinValue); + const bridge = BankApp.bridge; + + if (!bridge || typeof bridge.requestChangePin !== "function") { + showNotice("error", "PIN change bridge is unavailable."); + return false; + } + if (currentPin.length !== 4) { + showNotice("error", "Enter your current four-digit PIN."); + return false; + } + if (newPin.length !== 4) { + showNotice("error", "Choose a new four-digit PIN."); + return false; + } + if (newPin !== confirmPin) { + showNotice("error", "New PIN confirmation does not match."); + return false; + } + if (currentPin === newPin) { + showNotice( + "error", + "Choose a different PIN from your current PIN.", + ); + return false; + } + + store.startAction("changepin"); + const sent = bridge.requestChangePin({ currentPin, newPin }); + if (!sent) { + store.finishAction(); + showNotice("error", "PIN change bridge is unavailable."); + return false; + } + + return true; + } + + function appendPinDigit(digit) { + const nextDigit = String(digit || "").trim(); + if (!nextDigit) { + return; + } + + const currentPin = String(store.getEnteredPin() || ""); + if (currentPin.length >= 4) { + return; + } + + store.setEnteredPin(currentPin + nextDigit); + } + + function backspacePin() { + const currentPin = String(store.getEnteredPin() || ""); + store.setEnteredPin(currentPin.slice(0, -1)); + } + + function clearPin() { + store.setEnteredPin(""); + } + + function submitPin() { + const enteredPin = String(store.getEnteredPin() || ""); + const bridge = BankApp.bridge; + if (!bridge || typeof bridge.requestSubmitPin !== "function") { + showNotice("error", "PIN bridge is unavailable."); + return false; + } + + store.startAction("pin"); + const sent = bridge.requestSubmitPin({ pin: enteredPin }); + if (!sent) { + store.finishAction(); + showNotice("error", "PIN bridge is unavailable."); + return false; + } + + clearPin(); + return true; + } + + function selectAtmView(view) { + const nextView = String(view || "").trim(); + if (!nextView) { + return false; + } + + if (nextView === "pin") { + store.resetAtm(); + return true; + } + + store.setCustomAmount(""); + store.setAtmView(nextView); + return true; + } + + function appendCustomAmountDigit(digit) { + const nextDigit = String(digit || "").trim(); + if (!nextDigit) { + return; + } + + const currentValue = String(store.getCustomAmount() || ""); + if (currentValue.length >= 7) { + return; + } + + store.setCustomAmount(currentValue + nextDigit); + } + + function backspaceCustomAmount() { + const currentValue = String(store.getCustomAmount() || ""); + store.setCustomAmount(currentValue.slice(0, -1)); + } + + function clearCustomAmount() { + store.setCustomAmount(""); + } + + function submitCustomAmount(kind) { + const amount = normalizeAmount(store.getCustomAmount()); + const nextKind = String(kind || "") + .trim() + .toLowerCase(); + + if (amount <= 0) { + showNotice("error", "Enter a valid transaction amount."); + return false; + } + + const success = + nextKind === "deposit" + ? requestDeposit(amount) + : requestWithdraw(amount); + + if (success) { + store.setCustomAmount(""); + } + + return success; + } + + function requestAtmAmount(kind, amount) { + const nextKind = String(kind || "") + .trim() + .toLowerCase(); + const success = + nextKind === "deposit" + ? requestDeposit(amount) + : requestWithdraw(amount); + + return success; + } + + BankApp.actions = { + appendCustomAmountDigit, + appendPinDigit, + backspaceCustomAmount, + backspacePin, + clearCustomAmount, + clearPin, + closeBank, + refreshBank, + requestAtmAmount, + requestChangePin, + requestDeposit, + requestDepositEarnings, + requestRepayCreditLine, + requestTransfer, + requestWithdraw, + selectAtmView, + showNotice, + submitCustomAmount, + submitPin, + }; +})(); diff --git a/arma/client/addons/bank/ui/src/registry/store.js b/arma/client/addons/bank/ui/src/registry/store.js new file mode 100644 index 0000000..d3ff565 --- /dev/null +++ b/arma/client/addons/bank/ui/src/registry/store.js @@ -0,0 +1,84 @@ +(function () { + const BankApp = (window.BankApp = window.BankApp || {}); + const { createSignal } = BankApp.runtime; + + class BankStore { + constructor() { + [this.getMode, this.setMode] = createSignal("bank"); + [this.getNotice, this.setNotice] = createSignal({ + text: "", + type: "", + }); + [this.getPendingAction, this.setPendingAction] = createSignal(""); + [this.getAtmView, this.setAtmView] = createSignal("pin"); + [this.getEnteredPin, this.setEnteredPin] = createSignal(""); + [this.getCustomAmount, this.setCustomAmount] = createSignal(""); + [this.getAccountVersion, this.setAccountVersion] = createSignal(0); + [this.getSessionVersion, this.setSessionVersion] = createSignal(0); + } + + finishAction() { + this.setPendingAction(""); + } + + hydrateFromPayload(payload) { + const mode = String(payload?.session?.mode || "bank") + .trim() + .toLowerCase(); + const atmAuthorized = Boolean(payload?.session?.atmAuthorized); + const currentMode = this.getMode(); + const currentAtmView = this.getAtmView(); + const currentPendingAction = this.getPendingAction(); + + this.setMode(mode === "atm" ? "atm" : "bank"); + this.setPendingAction(""); + this.setEnteredPin(""); + this.setCustomAmount(""); + this.setAccountVersion(this.getAccountVersion() + 1); + this.setSessionVersion(this.getSessionVersion() + 1); + + if (mode === "atm") { + if (!atmAuthorized) { + this.setAtmView("pin"); + return; + } + + if ( + currentPendingAction === "deposit" || + currentPendingAction === "withdraw" || + currentAtmView === "pin" || + currentMode !== "atm" + ) { + this.setAtmView("menu"); + return; + } + + this.setAtmView(currentAtmView); + return; + } + + this.setAtmView("dashboard"); + } + + syncAccountPatch() { + this.setPendingAction(""); + this.setAccountVersion(this.getAccountVersion() + 1); + } + + resetAtm() { + this.setEnteredPin(""); + this.setCustomAmount(""); + this.setAtmView("pin"); + } + + startAction(action) { + this.setPendingAction( + String(action || "") + .trim() + .toLowerCase(), + ); + } + } + + BankApp.store = new BankStore(); +})(); diff --git a/arma/client/addons/bank/ui/src/runtime.js b/arma/client/addons/bank/ui/src/runtime.js new file mode 100644 index 0000000..b51513e --- /dev/null +++ b/arma/client/addons/bank/ui/src/runtime.js @@ -0,0 +1,6 @@ +(function () { + const runtime = window.ForgeWebUI; + const BankApp = (window.BankApp = window.BankApp || {}); + BankApp.runtime = runtime; + window.AppRuntime = runtime; +})(); diff --git a/arma/client/addons/bank/ui/src/styles.css b/arma/client/addons/bank/ui/src/styles.css new file mode 100644 index 0000000..c418b82 --- /dev/null +++ b/arma/client/addons/bank/ui/src/styles.css @@ -0,0 +1,590 @@ +:root { + --bank-shell-bg: #f6f4ee; + --bank-surface: linear-gradient(180deg, #ffffff 0%, #f4f8fd 100%); + --bank-border: rgba(18, 54, 93, 0.12); + --bank-border-strong: rgba(18, 54, 93, 0.18); + --bank-text-main: #142f52; + --bank-text-muted: #6f86a3; + --bank-text-subtle: #8ea2bb; + --bank-accent: #275a8c; + --bank-accent-soft: #dfeaf9; + --bank-accent-line: rgba(39, 90, 140, 0.12); + --bank-shadow: 0 16px 30px rgba(18, 36, 57, 0.08); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body, +#app { + width: 100%; + height: 100%; + margin: 0; +} + +body { + overflow: hidden; + background: transparent; + color: var(--bank-text-main); + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; +} + +button, +input, +select { + font: inherit; +} + +.bank-shell { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + background: var(--bank-shell-bg); +} + +.bank-scroll-shell { + flex: 1; + min-height: 0; + overflow: auto; + display: flex; + flex-direction: column; +} + +.bank-layout { + min-height: 100%; + width: min(100%, 1600px); + margin: 0 auto; + display: grid; + grid-template-columns: 320px minmax(0, 1fr); + gap: 1.25rem; + padding: 1.25rem; + flex: 1 0 auto; +} + +.bank-sidebar, +.bank-main { + min-height: 0; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.bank-main { + overflow: visible; +} + +.bank-module, +.bank-card, +.bank-atm-panel { + background: var(--bank-surface); + border: 1px solid var(--bank-border); + border-radius: 1.3rem; + box-shadow: var(--bank-shadow); +} + +.bank-module, +.bank-card, +.bank-atm-panel { + padding: 1rem; + display: flex; + flex-direction: column; +} + +.bank-module-header, +.bank-card-header, +.bank-section-header, +.bank-page-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; +} + +.bank-module-header, +.bank-card-header { + margin-bottom: 0.9rem; +} + +.bank-page { + display: grid; + gap: 1.35rem; + padding: 0.1rem 0 0; +} + +.bank-page-header { + padding-top: 0.4rem; +} + +.bank-page-copy { + margin: 0; + color: var(--bank-text-muted); + line-height: 1.5; + max-width: 48rem; +} + +.bank-page-divider { + border-top: 1px solid var(--bank-accent-line); +} + +.bank-page-body { + display: grid; + gap: 1.25rem; + padding-bottom: 1.25rem; +} + +.bank-page-section { + display: grid; + gap: 1rem; + padding: 1.15rem 1.2rem 1.25rem; + border: 1px solid var(--bank-border); + border-radius: 1.3rem; + background: rgba(255, 255, 255, 0.72); + box-shadow: none; +} + +.bank-title, +.bank-section-title { + margin: 0; + color: var(--bank-text-main); + letter-spacing: -0.02em; +} + +.bank-title { + font-size: 1.7rem; +} + +.bank-section-title { + font-size: 1.1rem; +} + +.bank-eyebrow, +.bank-footer-title, +.bank-stat-label { + display: block; + font-size: 0.68rem; + letter-spacing: 0.16em; + text-transform: uppercase; + font-weight: 700; + color: var(--bank-text-subtle); +} + +.bank-pill { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.48rem 0.8rem; + border-radius: 999px; + background: var(--bank-accent-soft); + color: var(--bank-accent); + font-size: 0.74rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + white-space: nowrap; +} + +.bank-summary-grid, +.bank-profile-stack { + display: grid; + gap: 0.8rem; +} + +.bank-summary-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.bank-stat-card, +.bank-metric-card { + min-width: 0; + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 0.9rem; + border-radius: 0.95rem; + border: 1px solid var(--bank-border); + background: rgba(255, 255, 255, 0.6); +} + +.bank-stat-card.is-accent, +.bank-metric-card.is-accent { + background: linear-gradient(180deg, #edf4fe 0%, #dfeaf9 100%); +} + +.bank-stat-card.is-success, +.bank-metric-card.is-success { + background: linear-gradient(180deg, #edf9f4 0%, #dff4ea 100%); +} + +.bank-stat-card.is-warning, +.bank-metric-card.is-warning { + background: linear-gradient(180deg, #fdf7ea 0%, #f7edd4 100%); +} + +.bank-stat-value, +.bank-metric-value { + min-width: 0; + color: var(--bank-text-main); + font-weight: 700; + overflow-wrap: anywhere; +} + +.bank-stat-value { + font-size: 1rem; +} + +.bank-metric-value { + font-size: 1.8rem; + letter-spacing: -0.03em; +} + +.bank-metric-copy, +.bank-card-copy, +.bank-empty-copy, +.bank-footer-copy, +.bank-history-meta { + color: var(--bank-text-muted); + line-height: 1.45; +} + +.bank-card-copy { + margin: 0 0 0.9rem; +} + +.bank-summary-band { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.85rem; +} + +.bank-action-sections { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; +} + +.bank-support-sections { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 1rem; +} + +.bank-form-stack { + display: grid; + gap: 0.75rem; +} + +.bank-input, +.bank-select { + width: 100%; + min-width: 0; + height: 2.9rem; + padding: 0 0.95rem; + border-radius: 0.8rem; + border: 1px solid var(--bank-border); + background: rgba(255, 255, 255, 0.82); + color: var(--bank-text-main); +} + +.bank-action-row { + display: flex; + gap: 0.75rem; +} + +.bank-btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.85rem; + padding: 0.75rem 1rem; + border-radius: 0.8rem; + border: 1px solid var(--bank-border); + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + cursor: pointer; + transition: + background-color 160ms ease, + color 160ms ease, + border-color 160ms ease; +} + +.bank-btn:disabled { + opacity: 0.55; + cursor: default; +} + +.bank-btn-primary { + background: #455a77; + border-color: #455a77; + color: #fff; +} + +.bank-btn-primary:hover:not(:disabled) { + background: #354863; + border-color: #354863; +} + +.bank-btn-secondary { + background: rgba(255, 255, 255, 0.82); + color: var(--bank-accent); +} + +.bank-btn-secondary:hover:not(:disabled) { + background: #eef4fd; +} + +.bank-history-list { + display: grid; + gap: 0.75rem; +} + +.bank-history-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.85rem 0.95rem; + border-radius: 0.9rem; + border: 1px solid var(--bank-border); + background: rgba(255, 255, 255, 0.6); +} + +.bank-history-copy { + min-width: 0; + display: grid; + gap: 0.18rem; +} + +.bank-history-title, +.bank-empty-title { + color: var(--bank-text-main); + font-weight: 700; +} + +.bank-history-value { + white-space: nowrap; + font-weight: 700; + color: var(--bank-accent); +} + +.bank-empty-state { + display: grid; + gap: 0.35rem; + padding: 1rem 0; +} + +.bank-notice-stack { + position: fixed; + top: 1.2rem; + right: 1.5rem; + z-index: 12; + display: grid; + gap: 0.65rem; +} + +.bank-notice { + max-width: 24rem; + padding: 0.85rem 1rem; + border-radius: 0.9rem; + border: 1px solid var(--bank-border); + background: #fff; + box-shadow: 0 14px 28px rgba(16, 34, 56, 0.14); + font-size: 0.92rem; +} + +.bank-notice.is-success { + background: #ecfdf5; + border-color: #bbf7d0; + color: #166534; +} + +.bank-notice.is-error { + background: #fef2f2; + border-color: #fecaca; + color: #991b1b; +} + +.bank-footer-bar { + width: 100%; + margin-top: auto; + background: #1e293b; + color: #f8fafc; +} + +.bank-footer { + width: min(100%, 1600px); + margin: 0 auto; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 4rem; + padding: 3rem 1.25rem; +} + +.bank-footer-block { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.bank-footer-title { + margin: 0; + color: #f8fafc; + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.1em; + font-weight: 700; + padding-bottom: 0.5rem; + border-bottom: 1px solid #475569; +} + +.bank-footer-list { + margin: 0; + padding: 0; + list-style: none; +} + +.bank-atm-shell { + flex: 1; + min-height: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem 1rem; +} + +.bank-atm-panel { + width: min(100%, 560px); + display: grid; + gap: 1rem; +} + +.bank-atm-stack { + display: grid; + gap: 1rem; +} + +.bank-pin-display, +.bank-balance-display { + display: flex; + align-items: center; + justify-content: center; + min-height: 5rem; + padding: 1rem; + border-radius: 1rem; + border: 1px solid var(--bank-border-strong); + background: rgba(255, 255, 255, 0.68); + color: var(--bank-text-main); + text-align: center; +} + +.bank-pin-display { + font-size: 2rem; +} + +.bank-balance-display { + font-size: 2.5rem; + font-weight: 800; + letter-spacing: -0.03em; +} + +.bank-pin-indicators { + display: flex; + align-items: center; + justify-content: center; + gap: 0.9rem; +} + +.bank-pin-indicator { + width: 1rem; + height: 1rem; + border-radius: 999px; + border: 2px solid var(--bank-accent); + background: transparent; +} + +.bank-pin-indicator.is-filled { + background: var(--bank-accent); +} + +.bank-keypad { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.75rem; +} + +.bank-key { + min-height: 3.2rem; + padding: 0.9rem; + border-radius: 0.9rem; + border: 1px solid var(--bank-border); + background: rgba(255, 255, 255, 0.82); + color: var(--bank-text-main); + font-weight: 700; +} + +.bank-key.is-muted { + background: #eef2f8; + color: var(--bank-text-muted); +} + +.bank-key.is-accent { + background: #455a77; + border-color: #455a77; + color: #fff; +} + +.bank-key.is-wide { + grid-column: span 3; +} + +.bank-atm-action-grid { + display: grid; + gap: 0.75rem; +} + +.bank-shell.is-atm { + background: transparent; + min-height: 100%; + justify-content: center; +} + +.bank-shell.is-atm .bank-atm-shell { + flex: 1; + width: 100%; + min-height: 100%; + max-width: 100%; +} + +.bank-footer-copy { + color: #cbd5e1; + line-height: 1.5; + margin: 0 0 0.75rem; +} + +@media (max-width: 1200px) { + .bank-layout { + grid-template-columns: 1fr; + } + + .bank-main { + overflow: visible; + } +} + +@media (max-width: 900px) { + .bank-summary-band, + .bank-action-sections, + .bank-footer { + grid-template-columns: 1fr; + } + + .bank-summary-grid { + grid-template-columns: 1fr; + } +} diff --git a/arma/client/addons/bank/ui/ui.config.mjs b/arma/client/addons/bank/ui/ui.config.mjs new file mode 100644 index 0000000..d323273 --- /dev/null +++ b/arma/client/addons/bank/ui/ui.config.mjs @@ -0,0 +1,38 @@ +export default { + addonName: "bank", + title: "FORGE Banking Console", + logLabel: "Bank UI", + outputDir: "_site", + jsBundles: [ + { + name: "Bank UI app", + output: "bank-ui.js", + sources: [ + "src/runtime.js", + "src/data.js", + "src/registry/store.js", + "src/bridge.js", + "src/registry/events.js", + "src/components/common.js", + "src/components/BankSidebar.js", + "src/components/Footer.js", + "src/pages/BankView.js", + "src/pages/ATMView.js", + "src/components/AppShell.js", + "src/bootstrap.js", + ], + }, + ], + cssBundles: [ + { + name: "Bank UI styles", + output: "bank-ui.css", + sources: ["src/styles.css"], + }, + ], + site: { + styles: ["bank-ui.css"], + commonScripts: ["forge-webui.js"], + scripts: ["bank-ui.js"], + }, +}; diff --git a/arma/client/addons/cad/$PBOPREFIX$ b/arma/client/addons/cad/$PBOPREFIX$ new file mode 100644 index 0000000..4067b98 --- /dev/null +++ b/arma/client/addons/cad/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\cad diff --git a/arma/client/addons/cad/CfgEventHandlers.hpp b/arma/client/addons/cad/CfgEventHandlers.hpp new file mode 100644 index 0000000..289a18f --- /dev/null +++ b/arma/client/addons/cad/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/cad/MAP_README.md b/arma/client/addons/cad/MAP_README.md new file mode 100644 index 0000000..157db6b --- /dev/null +++ b/arma/client/addons/cad/MAP_README.md @@ -0,0 +1,214 @@ +# Integrated Map Display System (A3API Pattern) + +This system integrates the Arma 3 native map control (`RscMapControl`) within an HTML/CSS/JS UI using Arma's proper WebBrowser control (type 106) and A3API communication pattern. + +## How It Works + +### Layered Architecture + +1. **IFrame Control (type 106)** - Loads HTML content using `ctrlWebBrowserAction` +2. **Map Control (RscMapControl)** - Native Arma map positioned behind/within the UI +3. **A3API Communication** - Bidirectional communication between JavaScript and SQF + +### Communication Flow + +**JavaScript → SQF:** +```javascript +// Send alert (no response expected) +A3API.SendAlert(JSON.stringify({ + event: "map::zoomIn", + data: null +})); + +// Send confirm (expects response via ExecJS) +A3API.SendConfirm(JSON.stringify({ + event: "map::getPosition", + data: null +})); +``` + +**SQF → JavaScript:** +```sqf +_control ctrlWebBrowserAction ["ExecJS", "updateMapState({center: [1000, 2000], scale: 0.5});"]; +``` + +## File Structure + +``` +UI/map/ +├── _site/ +│ ├── index.html # HTML with A3API dynamic loading +│ ├── script.js # JavaScript using A3API +│ └── style.css # Styling +└── MAP_README.md # This file + +functions/map/ +├── fn_openMap.sqf # Opens the display +├── fn_mapHandleUIEvents.sqf # Handles JS events +├── fn_mapDisplay.sqf # Display initialization +└── fn_mapDisplayUpdate.sqf # Update loop + +UI/MapDisplay.h # Dialog definition +``` + +## Usage + +### Opening the Map + +```sqf +[] call FORGE_fnc_openMap; +``` + +### From Init or Action + +```sqf +// Add player action +player addAction ["Open Map", {[] call FORGE_fnc_openMap;}]; + +// In init.sqf +[] call FORGE_fnc_openMap; +``` + +## Key Differences from Standard HTML/CSS/JS + +### 1. Dynamic Resource Loading + +Instead of `` and ` +``` + +### 2. Event Communication + +Use **A3API.SendAlert()** for one-way messages: +```javascript +A3API.SendAlert(JSON.stringify({event: "map::action", data: value})); +``` + +Use **A3API.SendConfirm()** for messages expecting a response: +```javascript +A3API.SendConfirm(JSON.stringify({event: "map::getdata", data: null})); +``` + +### 3. Pointer Events + +UI elements need `pointer-events: auto` while the body has `pointer-events: none`: + +```css +body { + pointer-events: none; /* Allows clicks through to map */ +} + +#topBar { + pointer-events: auto; /* UI elements catch clicks */ +} +``` + +## Dialog Definition Pattern + +```cpp +class RscMapDisplay { + idd = 9000; + onLoad = "['onLoad', _this] call FORGE_fnc_mapDisplay;"; + + class Controls { + class Browser: RscText { + type = 106; // IFrame control type + idc = 9001; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW"; + h = "safeZoneH"; + }; + + class MapControl: RscMapControl { + idc = 9002; + // Position to fit within HTML UI + }; + }; +}; +``` + +## Event Handler Pattern + +In `fn_openMap.sqf`: +```sqf +private _ctrl = _display displayCtrl 9001; + +// Add JSDialog event handler +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + [_control, _isConfirmDialog, _message] call FORGE_fnc_mapHandleUIEvents; +}]; + +// Load HTML file +_ctrl ctrlWebBrowserAction ["LoadFile", "UI\\map\\_site\\index.html"]; +``` + +In `fn_mapHandleUIEvents.sqf`: +```sqf +params ["_control", "_isConfirmDialog", "_message"]; + +private _eventData = fromJSON _message; +private _event = _eventData get "event"; +private _data = _eventData get "data"; + +switch (_event) do { + case "map::ready": { + // Initialize + }; + case "map::zoomIn": { + // Handle zoom + }; +}; +``` + +## Benefits of This Pattern + +1. **Proper Arma Integration** - Uses native WebBrowser control (type 106) +2. **File System Compatibility** - A3API.RequestFile() works with Arma's file system +3. **Reliable Communication** - JSDialog event handler is more stable than htmlLoad +4. **Modular** - CSS and JS in separate files, dynamically loaded +5. **Consistent** - Matches bank module pattern used in FORGE + +## Troubleshooting + +**Files not loading:** +- Check paths use double backslashes: `"UI\\map\\_site\\style.css"` +- Verify files exist in the correct directory +- Check .rpt log for file loading errors + +**Events not firing:** +- Verify JSDialog event handler is attached +- Check JSON formatting in A3API calls +- Look for JavaScript console errors (use OpenDevConsole) + +**Map not showing:** +- Verify MapControl idc matches (9002) +- Check map control positioning in MapDisplay.h +- Ensure map control is rendered after browser control + +## Developer Tools + +Enable dev console in `fn_openMap.sqf`: +```sqf +_ctrl ctrlWebBrowserAction ["OpenDevConsole"]; +``` + +This opens Chromium dev tools for debugging JavaScript, CSS, and network requests. diff --git a/arma/client/addons/cad/README.md b/arma/client/addons/cad/README.md new file mode 100644 index 0000000..5f5d438 --- /dev/null +++ b/arma/client/addons/cad/README.md @@ -0,0 +1,37 @@ +# Forge Client CAD + +## Overview +The CAD addon provides the client map and dispatch interface for task +assignment, dispatch orders, support requests, group status, group roles, and +task acknowledge/decline actions. + +## Dependencies +- `forge_client_main` +- server CAD events from `forge_server_cad` +- server task catalog data exposed through CAD hydrate payloads + +## Main Components +- `fnc_initRepository.sqf` caches hydrated CAD view state. +- `fnc_initUI.sqf` wires the native map, top bar, bottom bar, side panel, and + dispatcher browser controls. +- `fnc_initUIBridge.sqf` sends browser actions to server CAD RPCs and pushes + state back to the UI. +- `fnc_handleUIEvents.sqf` handles `cad::*` browser events. +- `fnc_openUI.sqf` opens the CAD display. + +## Supported Actions +- hydrate CAD state +- assign active tasks to groups +- create and close dispatch orders +- submit and close support requests +- acknowledge or decline assigned tasks +- update group status, role, and profile +- focus map requests and toggle panels + +## Notes +CAD task visibility depends on server-side task catalog entries. Tasks created +through Forge task modules or `forge_server_task_fnc_startTask` are the normal +CAD-compatible task sources. + +See [MAP_README.md](./MAP_README.md) for details on the integrated native map +and browser layout. diff --git a/arma/client/addons/cad/XEH_PREP.hpp b/arma/client/addons/cad/XEH_PREP.hpp new file mode 100644 index 0000000..3a2f563 --- /dev/null +++ b/arma/client/addons/cad/XEH_PREP.hpp @@ -0,0 +1,5 @@ +PREP(handleUIEvents); +PREP(initRepository); +PREP(initUIBridge); +PREP(initUI); +PREP(openUI); diff --git a/arma/client/addons/cad/XEH_postInitClient.sqf b/arma/client/addons/cad/XEH_postInitClient.sqf new file mode 100644 index 0000000..a64fb15 --- /dev/null +++ b/arma/client/addons/cad/XEH_postInitClient.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" + +if (isNil QGVAR(CADRepository)) then { call FUNC(initRepository); }; +if (isNil QGVAR(CADUIBridge)) then { call FUNC(initUIBridge); }; + +[QGVAR(openCAD), { + call FUNC(openUI); +}] call CFUNC(addEventHandler); + +[QGVAR(responseHydrateCad), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(CADUIBridge) call ["handleHydrateResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCadAssignment), { + params [["_result", createHashMap, [createHashMap]]]; + + GVAR(CADUIBridge) call ["handleAssignmentResponse", [_result]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCadGroupUpdate), { + params [["_result", createHashMap, [createHashMap]]]; + + GVAR(CADUIBridge) call ["handleGroupUpdateResponse", [_result]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCadRequest), { + params [["_result", createHashMap, [createHashMap]]]; + + GVAR(CADUIBridge) call ["handleRequestResponse", [_result]]; +}] call CFUNC(addEventHandler); + +[QGVAR(invalidateCadState), { + if (isNil QGVAR(CADRepository)) exitWith {}; + if !(GVAR(CADRepository) getOrDefault ["isOpen", false]) exitWith {}; + if (isNil QGVAR(CADUIBridge)) exitWith {}; + + GVAR(CADUIBridge) call ["requestHydrate", []]; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/cad/XEH_preInit.sqf b/arma/client/addons/cad/XEH_preInit.sqf new file mode 100644 index 0000000..1f72eca --- /dev/null +++ b/arma/client/addons/cad/XEH_preInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; diff --git a/arma/client/addons/cad/XEH_preInitClient.sqf b/arma/client/addons/cad/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/cad/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/cad/config.cpp b/arma/client/addons/cad/config.cpp new file mode 100644 index 0000000..47de21d --- /dev/null +++ b/arma/client/addons/cad/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscMapUI.hpp" diff --git a/arma/client/addons/cad/functions/fnc_handleUIEvents.sqf b/arma/client/addons/cad/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..d7bca1a --- /dev/null +++ b/arma/client/addons/cad/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,247 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2026-03-28 + * Public: No + * + * Description: + * Handles CAD browser UI events. + * + * Arguments: + * 0: Control [CONTROL] + * 1: Confirm dialog flag [BOOL] + * 2: Browser message [STRING] + * + * Return Value: + * UI event handled [BOOL] + * + * Example: + * [_control, false, _message] call forge_client_cad_fnc_handleUIEvents + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert getOrDefault ["event", ""]; +private _data = _alert getOrDefault ["data", nil]; + +diag_log format ["[FORGE:Client:CAD] Handling UI event: %1", _event]; + +if (_isConfirmDialog) exitWith { true }; + +switch (_event) do { + case "cad::topbar::ready": { + GVAR(CADUIBridge) call ["handleTopBarReady", []]; + }; + case "cad::ready": { + GVAR(CADUIBridge) call ["handleReady", [_control, _data]]; + }; + case "cad::dispatcher::ready": { + GVAR(CADUIBridge) call ["handleDispatcherReady", []]; + }; + case "cad::mode::set": { + private _mode = ""; + if (_data isEqualType createHashMap) then { + _mode = _data getOrDefault ["mode", ""]; + }; + + GVAR(CADUIBridge) call ["setMode", [_mode]]; + }; + case "cad::dispatchView::set": { + private _dispatchView = ""; + if (_data isEqualType createHashMap) then { + _dispatchView = _data getOrDefault ["dispatchView", ""]; + }; + + GVAR(CADUIBridge) call ["setDispatchView", [_dispatchView]]; + }; + case "cad::refresh": { + GVAR(CADUIBridge) call ["requestHydrate", []]; + }; + case "cad::tasks::assign": { + private _taskID = ""; + private _groupID = ""; + private _note = ""; + if (_data isEqualType createHashMap) then { + _taskID = _data getOrDefault ["taskID", ""]; + _groupID = _data getOrDefault ["groupID", ""]; + _note = _data getOrDefault ["note", ""]; + }; + + GVAR(CADUIBridge) call ["requestAssignTask", [_taskID, _groupID, _note]]; + }; + case "cad::dispatchOrder::create": { + private _assigneeGroupID = ""; + private _targetGroupID = ""; + private _note = ""; + private _priority = "priority"; + private _request = createHashMap; + if (_data isEqualType createHashMap) then { + _assigneeGroupID = _data getOrDefault ["assigneeGroupID", ""]; + _targetGroupID = _data getOrDefault ["targetGroupID", ""]; + _note = _data getOrDefault ["note", ""]; + _priority = _data getOrDefault ["priority", "priority"]; + _request = _data getOrDefault ["request", createHashMap]; + }; + + GVAR(CADUIBridge) call ["requestCreateDispatchOrder", [_assigneeGroupID, _targetGroupID, _note, _priority, _request]]; + }; + case "cad::generatedTask::request": { + private _taskType = ""; + private _metadata = createHashMap; + if (_data isEqualType createHashMap) then { + _taskType = _data getOrDefault ["taskType", ""]; + _metadata = _data getOrDefault ["metadata", createHashMap]; + }; + + GVAR(CADUIBridge) call ["requestGeneratedMissionTask", [_taskType, _metadata]]; + }; + case "cad::supportRequest::submit": { + private _type = ""; + private _fields = createHashMap; + private _priority = "priority"; + if (_data isEqualType createHashMap) then { + _type = _data getOrDefault ["type", ""]; + _fields = _data getOrDefault ["fields", createHashMap]; + _priority = _data getOrDefault ["priority", "priority"]; + }; + + GVAR(CADUIBridge) call ["requestSubmitSupportRequest", [_type, _fields, _priority]]; + }; + case "cad::dispatchOrder::close": { + private _taskID = ""; + if (_data isEqualType createHashMap) then { + _taskID = _data getOrDefault ["taskID", ""]; + }; + + GVAR(CADUIBridge) call ["requestCloseDispatchOrder", [_taskID]]; + }; + case "cad::supportRequest::close": { + private _requestID = ""; + if (_data isEqualType createHashMap) then { + _requestID = _data getOrDefault ["requestID", ""]; + }; + + GVAR(CADUIBridge) call ["requestCloseSupportRequest", [_requestID]]; + }; + case "cad::tasks::acknowledge": { + private _taskID = ""; + if (_data isEqualType createHashMap) then { + _taskID = _data getOrDefault ["taskID", ""]; + }; + + GVAR(CADUIBridge) call ["requestAcknowledgeTask", [_taskID]]; + }; + case "cad::tasks::decline": { + private _taskID = ""; + if (_data isEqualType createHashMap) then { + _taskID = _data getOrDefault ["taskID", ""]; + }; + + GVAR(CADUIBridge) call ["requestDeclineTask", [_taskID]]; + }; + case "cad::groups::status": { + private _groupID = ""; + private _status = ""; + if (_data isEqualType createHashMap) then { + _groupID = _data getOrDefault ["groupID", ""]; + _status = _data getOrDefault ["status", ""]; + }; + + GVAR(CADUIBridge) call ["requestGroupStatus", [_groupID, _status]]; + }; + case "cad::groups::role": { + private _groupID = ""; + private _role = ""; + if (_data isEqualType createHashMap) then { + _groupID = _data getOrDefault ["groupID", ""]; + _role = _data getOrDefault ["role", ""]; + }; + + GVAR(CADUIBridge) call ["requestGroupRole", [_groupID, _role]]; + }; + case "cad::groups::profile": { + private _groupID = ""; + private _status = ""; + private _role = ""; + if (_data isEqualType createHashMap) then { + _groupID = _data getOrDefault ["groupID", ""]; + _status = _data getOrDefault ["status", ""]; + _role = _data getOrDefault ["role", ""]; + }; + + GVAR(CADUIBridge) call ["requestGroupProfile", [_groupID, _status, _role]]; + }; + case "cad::groups::focus": { + private _groupID = ""; + if (_data isEqualType createHashMap) then { + _groupID = _data getOrDefault ["groupID", ""]; + }; + + GVAR(CADUIBridge) call ["focusGroup", [_groupID]]; + }; + case "cad::members::focus": { + private _uid = ""; + if (_data isEqualType createHashMap) then { + _uid = _data getOrDefault ["uid", ""]; + }; + + GVAR(CADUIBridge) call ["focusMember", [_uid]]; + }; + case "cad::tasks::focus": { + private _taskID = ""; + if (_data isEqualType createHashMap) then { + _taskID = _data getOrDefault ["taskID", ""]; + }; + + GVAR(CADUIBridge) call ["focusTask", [_taskID]]; + }; + case "cad::requests::focus": { + private _requestID = ""; + if (_data isEqualType createHashMap) then { + _requestID = _data getOrDefault ["requestID", ""]; + }; + + GVAR(CADUIBridge) call ["focusRequest", [_requestID]]; + }; + case "map::zoomIn": { + private _mapCtrl = uiNamespace getVariable [QGVAR(MapCtrl), controlNull]; + if (isNull _mapCtrl) exitWith {}; + + private _currentZoom = ctrlMapScale _mapCtrl; + private _newZoom = (_currentZoom * 0.5) max 0.001; + private _center = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; + _mapCtrl ctrlMapAnimAdd [0.3, _newZoom, _center]; + ctrlMapAnimCommit _mapCtrl; + }; + case "map::zoomOut": { + private _mapCtrl = uiNamespace getVariable [QGVAR(MapCtrl), controlNull]; + if (isNull _mapCtrl) exitWith {}; + + private _currentZoom = ctrlMapScale _mapCtrl; + private _newZoom = (_currentZoom * 2) min 1; + private _center = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; + _mapCtrl ctrlMapAnimAdd [0.3, _newZoom, _center]; + ctrlMapAnimCommit _mapCtrl; + }; + case "map::search": { + private _query = str _data; + private _bottomBar = uiNamespace getVariable [QGVAR(BottomBarCtrl), controlNull]; + if (isNull _bottomBar) exitWith {}; + + _bottomBar ctrlWebBrowserAction ["ExecJS", format ["updateStatus('Search not yet implemented: %1');", _query]]; + }; + case "map::close": { + if !(isNil QGVAR(CADUIBridge)) then { + GVAR(CADUIBridge) call ["handleClose", []]; + }; + closeDialog 1; + }; + default { + diag_log format ["[FORGE:Client:CAD] WARNING: Unhandled UI event: %1", _event]; + }; +}; + +true diff --git a/arma/client/addons/cad/functions/fnc_initRepository.sqf b/arma/client/addons/cad/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..07e535d --- /dev/null +++ b/arma/client/addons/cad/functions/fnc_initRepository.sqf @@ -0,0 +1,105 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-28 + * Public: No + * + * Description: + * Initializes the CAD repository for lightweight client lifecycle state. + * + * Arguments: + * None + * + * Return Value: + * CAD repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_cad_fnc_initRepository + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(CADRepository) = createHashMapObject [[ + ["#type", "CADRepository"], + ["#create", compileFinal { + _self set ["isLoaded", true]; + _self set ["isOpen", false]; + _self set ["groups", []]; + _self set ["contracts", []]; + _self set ["requests", []]; + _self set ["assignments", []]; + _self set ["activity", []]; + _self set ["session", createHashMap]; + _self set ["mode", "operations"]; + _self set ["dispatchView", "board"]; + }], + ["getHydratePayload", compileFinal { + createHashMapFromArray [ + ["groups", +(_self getOrDefault ["groups", []])], + ["contracts", +(_self getOrDefault ["contracts", []])], + ["requests", +(_self getOrDefault ["requests", []])], + ["assignments", +(_self getOrDefault ["assignments", []])], + ["activity", +(_self getOrDefault ["activity", []])], + ["session", +(_self getOrDefault ["session", createHashMap])], + ["mode", _self getOrDefault ["mode", "operations"]], + ["dispatchView", _self getOrDefault ["dispatchView", "board"]] + ] + }], + ["getCurrentGroup", compileFinal { + private _session = _self getOrDefault ["session", createHashMap]; + private _groupID = _session getOrDefault ["groupId", ""]; + if (_groupID isEqualTo "") exitWith { createHashMap }; + + private _groups = _self getOrDefault ["groups", []]; + private _group = _groups findIf { (_x getOrDefault ["groupId", ""]) isEqualTo _groupID }; + if (_group < 0) exitWith { createHashMap }; + + +(_groups # _group) + }], + ["pushHydratePayload", compileFinal { + params [["_bridge", createHashMap, [createHashMap]]]; + + if (_bridge isEqualTo createHashMap) exitWith { false }; + + _bridge call ["sendEvent", ["cad::hydrate", _self call ["getHydratePayload", []]]] + }], + ["setHydratePayload", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + _self set ["groups", +(_payload getOrDefault ["groups", []])]; + _self set ["contracts", +(_payload getOrDefault ["contracts", []])]; + _self set ["requests", +(_payload getOrDefault ["requests", []])]; + _self set ["assignments", +(_payload getOrDefault ["assignments", []])]; + _self set ["activity", +(_payload getOrDefault ["activity", []])]; + _self set ["session", +(_payload getOrDefault ["session", createHashMap])]; + true + }], + ["setMode", compileFinal { + params [["_mode", "operations", [""]]]; + + if !(_mode in ["operations", "dispatch"]) then { + _mode = "operations"; + }; + + _self set ["mode", _mode]; + _mode + }], + ["setDispatchView", compileFinal { + params [["_dispatchView", "board", [""]]]; + + if !(_dispatchView in ["board", "map"]) then { + _dispatchView = "board"; + }; + + _self set ["dispatchView", _dispatchView]; + _dispatchView + }], + ["setOpen", compileFinal { + params [["_isOpen", false, [false]]]; + _self set ["isOpen", _isOpen]; + true + }] +]]; + +GVAR(CADRepository) diff --git a/arma/client/addons/cad/functions/fnc_initUI.sqf b/arma/client/addons/cad/functions/fnc_initUI.sqf new file mode 100644 index 0000000..981d317 --- /dev/null +++ b/arma/client/addons/cad/functions/fnc_initUI.sqf @@ -0,0 +1,51 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUI.sqf + * Author: IDSolutions + * Date: 2026-03-28 + * Public: No + * + * Description: + * Initializes the CAD map dialog controls and local map event handling. + * + * Arguments: + * 0: Display [DISPLAY] + * + * Return Value: + * UI initialized [BOOL] + * + * Example: + * [_display] call forge_client_cad_fnc_initUI + */ + +params [["_display", displayNull, [displayNull]]]; + +if (isNull _display) exitWith { false }; + +private _mapCtrl = _display displayCtrl 1001; +private _topBarCtrl = _display displayCtrl 1002; +private _bottomBarCtrl = _display displayCtrl 1003; +private _sidePanelCtrl = _display displayCtrl 1005; +private _dispatcherCtrl = _display displayCtrl 1006; + +uiNamespace setVariable [QGVAR(Display), _display]; +uiNamespace setVariable [QGVAR(MapCtrl), _mapCtrl]; +uiNamespace setVariable [QGVAR(TopBarCtrl), _topBarCtrl]; +uiNamespace setVariable [QGVAR(BottomBarCtrl), _bottomBarCtrl]; +uiNamespace setVariable [QGVAR(SidePanelCtrl), _sidePanelCtrl]; +uiNamespace setVariable [QGVAR(DispatcherCtrl), _dispatcherCtrl]; + +_dispatcherCtrl ctrlShow false; + +private _center = if (isNull player) then { + [worldSize / 2, worldSize / 2, 0] +} else { + getPosATL player +}; + +_mapCtrl ctrlMapAnimAdd [0, 0.2, _center]; +ctrlMapAnimCommit _mapCtrl; + +diag_log "[FORGE:Client:CAD] CAD UI initialized."; +true diff --git a/arma/client/addons/cad/functions/fnc_initUIBridge.sqf b/arma/client/addons/cad/functions/fnc_initUIBridge.sqf new file mode 100644 index 0000000..e59768a --- /dev/null +++ b/arma/client/addons/cad/functions/fnc_initUIBridge.sqf @@ -0,0 +1,488 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-28 + * Public: No + * + * Description: + * Initializes the CAD UI bridge for sidepanel browser state and CAD event routing. + * + * Arguments: + * None + * + * Return Value: + * CAD UI bridge object [HASHMAP OBJECT] + * + * Example: + * call forge_client_cad_fnc_initUIBridge + */ + +#pragma hemtt ignore_variables ["_self"] +private _webUIDeclarations = call EFUNC(common,initWebUIBridge); +private _webUIBridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; + +GVAR(CADUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _webUIBridgeDeclaration], + ["#type", "CADUIBridgeBaseClass"], + ["#create", compileFinal { + _self set ["dispatcherReady", false]; + _self set ["topBarReady", false]; + }], + ["getActiveBrowserControl", compileFinal { + private _display = uiNamespace getVariable [QGVAR(Display), displayNull]; + if (isNull _display) exitWith { + _self call ["setActiveBrowserControl", [controlNull]]; + controlNull + }; + + private _control = _display displayCtrl 1005; + _self call ["setActiveBrowserControl", [_control]]; + _control + }], + ["getTopBarControl", compileFinal { + private _display = uiNamespace getVariable [QGVAR(Display), displayNull]; + if (isNull _display) exitWith { controlNull }; + + _display displayCtrl 1002 + }], + ["getBottomBarControl", compileFinal { + private _display = uiNamespace getVariable [QGVAR(Display), displayNull]; + if (isNull _display) exitWith { controlNull }; + + _display displayCtrl 1003 + }], + ["getMapControl", compileFinal { + private _display = uiNamespace getVariable [QGVAR(Display), displayNull]; + if (isNull _display) exitWith { controlNull }; + + _display displayCtrl 1001 + }], + ["getDispatcherControl", compileFinal { + private _display = uiNamespace getVariable [QGVAR(Display), displayNull]; + if (isNull _display) exitWith { controlNull }; + + _display displayCtrl 1006 + }], + ["hasOpenScreen", compileFinal { + private _screen = _self call ["getScreen", []]; + private _control = _self call ["getActiveBrowserControl", []]; + !(isNull _control) && { _screen call ["isReady", []] } + }], + ["isDispatcher", compileFinal { + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _session = GVAR(CADRepository) getOrDefault ["session", createHashMap]; + _session getOrDefault ["isDispatcher", false] + }], + ["applyLayout", compileFinal { + private _mode = if (isNil QGVAR(CADRepository)) then { + "operations" + } else { + GVAR(CADRepository) getOrDefault ["mode", "operations"] + }; + private _dispatchView = if (isNil QGVAR(CADRepository)) then { + "board" + } else { + GVAR(CADRepository) getOrDefault ["dispatchView", "board"] + }; + + private _mapCtrl = _self call ["getMapControl", []]; + private _bottomBarCtrl = _self call ["getBottomBarControl", []]; + private _sidePanelCtrl = _self call ["getActiveBrowserControl", []]; + private _dispatcherCtrl = _self call ["getDispatcherControl", []]; + + private _showMapLayout = (_mode isEqualTo "operations") || { _mode isEqualTo "dispatch" && { _dispatchView isEqualTo "map" } }; + + if !(isNull _mapCtrl) then { _mapCtrl ctrlShow _showMapLayout; }; + if !(isNull _bottomBarCtrl) then { _bottomBarCtrl ctrlShow true; }; + if !(isNull _sidePanelCtrl) then { _sidePanelCtrl ctrlShow _showMapLayout; }; + if !(isNull _dispatcherCtrl) then { _dispatcherCtrl ctrlShow (_mode isEqualTo "dispatch" && { _dispatchView isEqualTo "board" }); }; + + _self call ["refreshHydrate", []]; + _self call ["refreshTopBarState", []]; + _self call ["refreshDispatcher", []]; + true + }], + ["setMode", compileFinal { + params [["_mode", "operations", [""]]]; + + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _targetMode = _mode; + if !(_targetMode in ["operations", "dispatch"]) then { + _targetMode = "operations"; + }; + + if (_targetMode isEqualTo "dispatch" && !(_self call ["isDispatcher", []])) then { + _targetMode = "operations"; + }; + + GVAR(CADRepository) call ["setMode", [_targetMode]]; + if (_targetMode isEqualTo "dispatch") then { + GVAR(CADRepository) call ["setDispatchView", ["board"]]; + }; + _self call ["applyLayout", []] + }], + ["setDispatchView", compileFinal { + params [["_dispatchView", "board", [""]]]; + + if (isNil QGVAR(CADRepository)) exitWith { false }; + if ((GVAR(CADRepository) getOrDefault ["mode", "operations"]) isNotEqualTo "dispatch") exitWith { false }; + if !(_self call ["isDispatcher", []]) exitWith { false }; + + GVAR(CADRepository) call ["setDispatchView", [_dispatchView]]; + _self call ["applyLayout", []] + }], + ["refreshTopBarState", compileFinal { + if !(_self getOrDefault ["topBarReady", false]) exitWith { false }; + + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _topBarCtrl = _self call ["getTopBarControl", []]; + if (isNull _topBarCtrl) exitWith { false }; + + private _session = +(GVAR(CADRepository) getOrDefault ["session", createHashMap]); + private _currentGroup = GVAR(CADRepository) call ["getCurrentGroup", []]; + private _payload = createHashMapFromArray [ + ["mode", GVAR(CADRepository) getOrDefault ["mode", "operations"]], + ["dispatchView", GVAR(CADRepository) getOrDefault ["dispatchView", "board"]], + ["session", _session], + ["currentGroup", _currentGroup] + ]; + + _topBarCtrl ctrlWebBrowserAction ["ExecJS", format [ + "window.cadTopbar && window.cadTopbar.receiveState(%1);", + toJSON _payload + ]]; + true + }], + ["refreshDispatcher", compileFinal { + if !(_self getOrDefault ["dispatcherReady", false]) exitWith { false }; + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _dispatcherCtrl = _self call ["getDispatcherControl", []]; + if (isNull _dispatcherCtrl) exitWith { false }; + + private _payload = GVAR(CADRepository) call ["getHydratePayload", []]; + _dispatcherCtrl ctrlWebBrowserAction ["ExecJS", format [ + "window.cadDispatcher && window.cadDispatcher.receiveHydrate(%1);", + toJSON _payload + ]]; + true + }], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["setControl", [_control]]; + _screen call ["markReady", [true]]; + _self call ["flushPendingEvents", []]; + + _self call ["requestHydrate", []]; + _self call ["refreshHydrate", []]; + _self call ["refreshTopBarState", []]; + true + }], + ["handleClose", compileFinal { + _self set ["dispatcherReady", false]; + _self set ["topBarReady", false]; + + private _screen = _self call ["getScreen", []]; + _screen call ["dispose", []]; + true + }], + ["handleTopBarReady", compileFinal { + _self set ["topBarReady", true]; + _self call ["refreshTopBarState", []] + }], + ["handleDispatcherReady", compileFinal { + _self set ["dispatcherReady", true]; + _self call ["refreshDispatcher", []] + }], + ["requestHydrate", compileFinal { + [SRPC(cad,requestHydrateCad), [getPlayerUID player]] call CFUNC(serverEvent); + true + }], + ["requestAssignTask", compileFinal { + params [["_taskID", "", [""]], ["_groupID", "", [""]], ["_note", "", [""]]]; + + if (_taskID isEqualTo "" || { _groupID isEqualTo "" }) exitWith { false }; + + [SRPC(cad,requestAssignCadTask), [getPlayerUID player, _taskID, _groupID, _note]] call CFUNC(serverEvent); + true + }], + ["requestCreateDispatchOrder", compileFinal { + params [ + ["_assigneeGroupID", "", [""]], + ["_targetGroupID", "", [""]], + ["_note", "", [""]], + ["_priority", "priority", [""]], + ["_request", createHashMap, [createHashMap]] + ]; + + if (_assigneeGroupID isEqualTo "" || { _targetGroupID isEqualTo "" }) exitWith { false }; + + [SRPC(cad,requestCreateCadDispatchOrder), [getPlayerUID player, _assigneeGroupID, _targetGroupID, _note, _priority, _request]] call CFUNC(serverEvent); + true + }], + ["requestGeneratedMissionTask", compileFinal { + params [ + ["_taskType", "", [""]], + ["_metadata", createHashMap, [createHashMap]] + ]; + + if (_taskType isEqualTo "") exitWith { false }; + + [SRPC(cad,requestGenerateCadMissionTask), [getPlayerUID player, _taskType, _metadata]] call CFUNC(serverEvent); + true + }], + ["requestSubmitSupportRequest", compileFinal { + params [ + ["_type", "", [""]], + ["_fields", createHashMap, [createHashMap]], + ["_priority", "priority", [""]] + ]; + + if (_type isEqualTo "") exitWith { false }; + + [SRPC(cad,requestSubmitCadSupportRequest), [getPlayerUID player, _type, _fields, _priority]] call CFUNC(serverEvent); + true + }], + ["requestCloseDispatchOrder", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + [SRPC(cad,requestCloseCadDispatchOrder), [getPlayerUID player, _taskID]] call CFUNC(serverEvent); + true + }], + ["requestCloseSupportRequest", compileFinal { + params [["_requestID", "", [""]]]; + + if (_requestID isEqualTo "") exitWith { false }; + + [SRPC(cad,requestCloseCadSupportRequest), [getPlayerUID player, _requestID]] call CFUNC(serverEvent); + true + }], + ["requestAcknowledgeTask", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + [SRPC(cad,requestAcknowledgeCadTask), [getPlayerUID player, _taskID]] call CFUNC(serverEvent); + true + }], + ["requestDeclineTask", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + [SRPC(cad,requestDeclineCadTask), [getPlayerUID player, _taskID]] call CFUNC(serverEvent); + true + }], + ["requestGroupStatus", compileFinal { + params [["_groupID", "", [""]], ["_status", "", [""]]]; + + if (_groupID isEqualTo "" || { _status isEqualTo "" }) exitWith { false }; + + [SRPC(cad,requestUpdateCadGroupStatus), [getPlayerUID player, _groupID, _status]] call CFUNC(serverEvent); + true + }], + ["requestGroupRole", compileFinal { + params [["_groupID", "", [""]], ["_role", "", [""]]]; + + if (_groupID isEqualTo "" || { _role isEqualTo "" }) exitWith { false }; + + [SRPC(cad,requestUpdateCadGroupRole), [getPlayerUID player, _groupID, _role]] call CFUNC(serverEvent); + true + }], + ["requestGroupProfile", compileFinal { + params [["_groupID", "", [""]], ["_status", "", [""]], ["_role", "", [""]]]; + + if (_groupID isEqualTo "") exitWith { false }; + if (_status isEqualTo "" && { _role isEqualTo "" }) exitWith { false }; + + [SRPC(cad,requestUpdateCadGroupProfile), [getPlayerUID player, _groupID, _status, _role]] call CFUNC(serverEvent); + true + }], + ["focusGroup", compileFinal { + params [["_groupID", "", [""]]]; + + if (_groupID isEqualTo "") exitWith { false }; + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _groups = GVAR(CADRepository) getOrDefault ["groups", []]; + private _groupIndex = _groups findIf { (_x getOrDefault ["groupId", ""]) isEqualTo _groupID }; + if (_groupIndex < 0) exitWith { false }; + + private _group = _groups # _groupIndex; + private _position = _group getOrDefault ["position", []]; + if !(_position isEqualType []) exitWith { false }; + if ((count _position) < 2) exitWith { false }; + + private _mapCtrl = _self call ["getMapControl", []]; + if (isNull _mapCtrl) exitWith { false }; + + private _targetPosition = [_position # 0, _position # 1, 0]; + _mapCtrl ctrlMapAnimAdd [0.35, ctrlMapScale _mapCtrl, _targetPosition]; + ctrlMapAnimCommit _mapCtrl; + true + }], + ["focusMember", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _groups = GVAR(CADRepository) getOrDefault ["groups", []]; + private _position = []; + { + private _members = _x getOrDefault ["members", []]; + private _memberIndex = _members findIf { (_x getOrDefault ["uid", ""]) isEqualTo _uid }; + if (_memberIndex >= 0) exitWith { + _position = (_members # _memberIndex) getOrDefault ["position", []]; + }; + } forEach _groups; + + if !(_position isEqualType []) exitWith { false }; + if ((count _position) < 2) exitWith { false }; + + private _mapCtrl = _self call ["getMapControl", []]; + if (isNull _mapCtrl) exitWith { false }; + + private _targetPosition = [_position # 0, _position # 1, 0]; + _mapCtrl ctrlMapAnimAdd [0.35, ctrlMapScale _mapCtrl, _targetPosition]; + ctrlMapAnimCommit _mapCtrl; + true + }], + ["focusTask", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _contracts = GVAR(CADRepository) getOrDefault ["contracts", []]; + private _taskIndex = _contracts findIf { + private _entryTaskID = _x getOrDefault ["taskId", _x getOrDefault ["taskID", ""]]; + _entryTaskID isEqualTo _taskID + }; + if (_taskIndex < 0) exitWith { false }; + + private _task = _contracts # _taskIndex; + private _position = _task getOrDefault ["position", []]; + if !(_position isEqualType []) exitWith { false }; + if ((count _position) < 2) exitWith { false }; + + private _mapCtrl = _self call ["getMapControl", []]; + if (isNull _mapCtrl) exitWith { false }; + + private _targetPosition = [_position # 0, _position # 1, 0]; + _mapCtrl ctrlMapAnimAdd [0.35, ctrlMapScale _mapCtrl, _targetPosition]; + ctrlMapAnimCommit _mapCtrl; + true + }], + ["focusRequest", compileFinal { + params [["_requestID", "", [""]]]; + + if (_requestID isEqualTo "") exitWith { false }; + if (isNil QGVAR(CADRepository)) exitWith { false }; + + private _requests = GVAR(CADRepository) getOrDefault ["requests", []]; + private _requestIndex = _requests findIf { (_x getOrDefault ["requestId", ""]) isEqualTo _requestID }; + if (_requestIndex < 0) exitWith { false }; + + private _request = _requests # _requestIndex; + private _position = _request getOrDefault ["position", []]; + if !(_position isEqualType []) exitWith { false }; + if ((count _position) < 2) exitWith { false }; + + private _mapCtrl = _self call ["getMapControl", []]; + if (isNull _mapCtrl) exitWith { false }; + + private _targetPosition = [_position # 0, _position # 1, 0]; + _mapCtrl ctrlMapAnimAdd [0.35, ctrlMapScale _mapCtrl, _targetPosition]; + ctrlMapAnimCommit _mapCtrl; + true + }], + ["refreshHydrate", compileFinal { + if (isNil QGVAR(CADRepository)) exitWith { false }; + GVAR(CADRepository) call ["pushHydratePayload", [_self]] + }], + ["handleHydrateResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + if (isNil QGVAR(CADRepository)) exitWith { false }; + + GVAR(CADRepository) call ["setHydratePayload", [_payload]]; + if !(_self call ["isDispatcher", []]) then { + GVAR(CADRepository) call ["setMode", ["operations"]]; + }; + + _self call ["refreshHydrate", []]; + _self call ["refreshTopBarState", []]; + _self call ["refreshDispatcher", []]; + _self call ["applyLayout", []] + }], + ["handleAssignmentResponse", compileFinal { + params [["_result", createHashMap, [createHashMap]]]; + + if (_self getOrDefault ["dispatcherReady", false]) then { + private _dispatcherCtrl = _self call ["getDispatcherControl", []]; + if !(isNull _dispatcherCtrl) then { + _dispatcherCtrl ctrlWebBrowserAction ["ExecJS", format [ + "window.cadDispatcher && window.cadDispatcher.setStatus(%1, %2);", + str (_result getOrDefault ["message", "Task request processed."]), + str ([ "error", "success" ] select (_result getOrDefault ["success", false])) + ]]; + }; + }; + + _self call ["sendEvent", ["cad::assignment::response", createHashMapFromArray [ + ["message", _result getOrDefault ["message", "Task request processed."]], + ["success", _result getOrDefault ["success", false]] + ]]] + }], + ["handleGroupUpdateResponse", compileFinal { + params [["_result", createHashMap, [createHashMap]]]; + + if (_self getOrDefault ["dispatcherReady", false]) then { + private _dispatcherCtrl = _self call ["getDispatcherControl", []]; + if !(isNull _dispatcherCtrl) then { + _dispatcherCtrl ctrlWebBrowserAction ["ExecJS", format [ + "window.cadDispatcher && window.cadDispatcher.setStatus(%1, %2);", + str (_result getOrDefault ["message", "Group update processed."]), + str ([ "error", "success" ] select (_result getOrDefault ["success", false])) + ]]; + }; + }; + + _self call ["sendEvent", ["cad::group::response", createHashMapFromArray [ + ["message", _result getOrDefault ["message", "Group update processed."]], + ["success", _result getOrDefault ["success", false]] + ]]] + }], + ["handleRequestResponse", compileFinal { + params [["_result", createHashMap, [createHashMap]]]; + + if (_self getOrDefault ["dispatcherReady", false]) then { + private _dispatcherCtrl = _self call ["getDispatcherControl", []]; + if !(isNull _dispatcherCtrl) then { + _dispatcherCtrl ctrlWebBrowserAction ["ExecJS", format [ + "window.cadDispatcher && window.cadDispatcher.setStatus(%1, %2);", + str (_result getOrDefault ["message", "Request processed."]), + str (["error", "success"] select (_result getOrDefault ["success", false])) + ]]; + }; + }; + + _self call ["sendEvent", ["cad::request::response", createHashMapFromArray [ + ["message", _result getOrDefault ["message", "Request processed."]], + ["success", _result getOrDefault ["success", false]] + ]]] + }] +]; + +GVAR(CADUIBridge) = createHashMapObject [GVAR(CADUIBridgeBaseClass)]; +GVAR(CADUIBridge) diff --git a/arma/client/addons/cad/functions/fnc_openUI.sqf b/arma/client/addons/cad/functions/fnc_openUI.sqf new file mode 100644 index 0000000..d648613 --- /dev/null +++ b/arma/client/addons/cad/functions/fnc_openUI.sqf @@ -0,0 +1,49 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-03-28 + * Public: No + * + * Description: + * Opens the CAD map interface. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_cad_fnc_openUI + */ + +private _display = createDialog ["RscMapUI", true]; +if (isNull _display) exitWith { + diag_log "[FORGE:Client:CAD] ERROR: Failed to create CAD dialog."; + false +}; + +private _topBarCtrl = _display displayCtrl 1002; +private _bottomBarCtrl = _display displayCtrl 1003; +private _sidePanelCtrl = _display displayCtrl 1005; +private _dispatcherCtrl = _display displayCtrl 1006; + +{ + _x ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); + }]; +} forEach [_topBarCtrl, _bottomBarCtrl, _sidePanelCtrl, _dispatcherCtrl]; + +_topBarCtrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\topbar.html)]; +_bottomBarCtrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\bottombar.html)]; +_sidePanelCtrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\sidepanel.html)]; +_dispatcherCtrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\dispatcher.html)]; + +if !(isNil QGVAR(CADRepository)) then { + GVAR(CADRepository) call ["setOpen", [true]]; +}; + +true diff --git a/arma/client/addons/cad/script_component.hpp b/arma/client/addons/cad/script_component.hpp new file mode 100644 index 0000000..6fb40c2 --- /dev/null +++ b/arma/client/addons/cad/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT cad +#define COMPONENT_BEAUTIFIED CAD +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/cad/ui/RscCommon.hpp b/arma/client/addons/cad/ui/RscCommon.hpp new file mode 100644 index 0000000..4135f3f --- /dev/null +++ b/arma/client/addons/cad/ui/RscCommon.hpp @@ -0,0 +1,6 @@ +// Control types +#define CT_STATIC 0 +#define CT_MAP 100 + +class RscText; +class RscMapControl; diff --git a/arma/client/addons/cad/ui/RscMapUI.hpp b/arma/client/addons/cad/ui/RscMapUI.hpp new file mode 100644 index 0000000..f4bffd3 --- /dev/null +++ b/arma/client/addons/cad/ui/RscMapUI.hpp @@ -0,0 +1,109 @@ +class RscMapUI { + idd = 1004; + movingEnable = 0; + enableSimulation = 1; + fadein = 0; + fadeout = 0; + duration = 1e+011; + onLoad = "uiNamespace setVariable ['forge_client_cad_Display', _this select 0]; [_this select 0] call forge_client_cad_fnc_initUI;"; + onUnLoad = "uiNamespace setVariable ['forge_client_cad_Display', nil]; uiNamespace setVariable ['forge_client_cad_MapCtrl', nil]; uiNamespace setVariable ['forge_client_cad_TopBarCtrl', nil]; uiNamespace setVariable ['forge_client_cad_BottomBarCtrl', nil]; uiNamespace setVariable ['forge_client_cad_SidePanelCtrl', nil]; uiNamespace setVariable ['forge_client_cad_DispatcherCtrl', nil]; if !(isNil 'forge_client_cad_CADRepository') then { forge_client_cad_CADRepository set ['isOpen', false]; };"; + + class controlsBackground { + class SurfaceBackground: RscText { + idc = -1; + x = "safeZoneX + (safeZoneW * 0.1)"; + y = "safeZoneY + (safeZoneH * 0.1)"; + w = "safeZoneW * 0.8"; + h = "safeZoneH * 0.8"; + colorBackground[] = {0.04, 0.06, 0.09, 0.96}; + }; + + class MapControl: RscMapControl { + idc = 1001; + x = "safeZoneX + (safeZoneW * 0.1)"; // 10% margin (80% width centered) + y = "safeZoneY + (safeZoneH * 0.1) + 0.10372"; // 10% margin + 56px visible top bar + w = "safeZoneW * 0.8"; // 80% width + h = "(safeZoneH * 0.8) - 0.10372 - 0.0556"; // 80% height minus visible top and bottom bars + + // Map specific settings + maxSatelliteAlpha = 0.85; + alphaFadeStartScale = 0.35; + alphaFadeEndScale = 0.4; + colorBackground[] = {0.969, 0.957, 0.949, 1}; + colorSea[] = {0.467, 0.631, 0.851, 0.5}; + colorForest[] = {0.624, 0.78, 0.388, 0.5}; + colorRocks[] = {0, 0, 0, 0}; + colorCountlines[] = {0.572, 0.354, 0.318, 0.25}; + colorMainCountlines[] = {0.572, 0.354, 0.318, 0.5}; + colorCountlinesWater[] = {0.491, 0.577, 0.702, 0.3}; + colorMainCountlinesWater[] = {0.491, 0.577, 0.702, 0.6}; + colorForestBorder[] = {0, 0, 0, 0}; + colorRocksBorder[] = {0, 0, 0, 0}; + colorPowerLines[] = {0.1, 0.1, 0.1, 1}; + colorRailWay[] = {0.8, 0.2, 0, 1}; + colorNames[] = {0.1, 0.1, 0.1, 0.9}; + colorInactive[] = {1, 1, 1, 0.5}; + colorLevels[] = {0.286, 0.177, 0.094, 0.5}; + colorTracks[] = {0.84, 0.76, 0.65, 0.15}; + colorRoads[] = {0.7, 0.7, 0.7, 1}; + colorMainRoads[] = {0.9, 0.5, 0.3, 1}; + colorTracksFill[] = {0.84, 0.76, 0.65, 1}; + colorRoadsFill[] = {1, 1, 1, 1}; + colorMainRoadsFill[] = {1, 0.6, 0.4, 1}; + colorGrid[] = {0.1, 0.1, 0.1, 0.6}; + colorGridMap[] = {0.1, 0.1, 0.1, 0.6}; + colorText[] = {1, 1, 1, 1}; + font = "PuristaMedium"; + sizeEx = 0.04; + showCountourInterval = 0; + scaleMin = 0.001; + scaleMax = 1; + scaleDefault = 0.16; + }; + }; + + class controls { + // Top bar browser + class TopBarBrowser: RscText { + type = 106; + idc = 1002; + x = "safeZoneX + (safeZoneW * 0.1)"; + y = "safeZoneY + (safeZoneH * 0.1)"; + w = "safeZoneW * 0.8"; + h = "0.24076"; // 130px, allows dropdowns to open over the map + colorBackground[] = {0, 0, 0, 0}; + }; + + // Bottom bar browser + class BottomBarBrowser: RscText { + type = 106; + idc = 1003; + x = "safeZoneX + (safeZoneW * 0.1)"; + y = "safeZoneY + (safeZoneH * 0.9) - 0.0556"; + w = "safeZoneW * 0.8"; + h = "0.0556"; // 30px + colorBackground[] = {0, 0, 0, 0}; + }; + + // Side panel browser (overlays from right side of 80% box) + class SidePanelBrowser: RscText { + type = 106; + idc = 1005; + x = "safeZoneX + (safeZoneW * 0.1) + (safeZoneW * 0.8) - 0.5550"; // Right edge of 80% box minus panel width + y = "safeZoneY + (safeZoneH * 0.1) + 0.10372"; // Below visible top bar + w = "0.5550"; // Wider panel for four-tab operations layout + h = "(safeZoneH * 0.8) - 0.10372 - 0.0556"; // Full height minus visible bars + colorBackground[] = {0, 0, 0, 0}; + }; + + class DispatcherBrowser: RscText { + type = 106; + idc = 1006; + x = "safeZoneX + (safeZoneW * 0.1)"; + y = "safeZoneY + (safeZoneH * 0.1) + 0.10372"; + w = "safeZoneW * 0.8"; + h = "(safeZoneH * 0.8) - 0.10372 - 0.0556"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/cad/ui/_site/bottombar.html b/arma/client/addons/cad/ui/_site/bottombar.html new file mode 100644 index 0000000..57d4b5e --- /dev/null +++ b/arma/client/addons/cad/ui/_site/bottombar.html @@ -0,0 +1 @@ +CAD Systems by IDS v1.0.0 \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-bottombar.css b/arma/client/addons/cad/ui/_site/cad-bottombar.css new file mode 100644 index 0000000..d6213e6 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-bottombar.css @@ -0,0 +1 @@ +body{-webkit-backdrop-filter:blur(18px);background:linear-gradient(90deg,#0e131bf5,#121720ed 55%,#0d1219f5);border-top:1px solid #ffffff24;justify-content:space-between;align-items:center;min-height:36px;padding:0 20px;display:flex;position:absolute;bottom:0;left:0;right:0;overflow:hidden;box-shadow:0 -12px 26px #0000003d}.footer-brand,.footer-version{color:#f5f8ffcc;text-shadow:0 1px 10px #00000047;font-size:12px}.footer-brand{color:var(--accent);letter-spacing:.08em;text-transform:uppercase;font-weight:600}.footer-version{color:#f5f8ff9e} \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-bottombar.js b/arma/client/addons/cad/ui/_site/cad-bottombar.js new file mode 100644 index 0000000..7710154 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-bottombar.js @@ -0,0 +1 @@ +window.CADBottombar=window.CADBottombar||{init:()=>!0},window.CADBottombar.init(); \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-common.css b/arma/client/addons/cad/ui/_site/cad-common.css new file mode 100644 index 0000000..c2d789e --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-common.css @@ -0,0 +1 @@ +:root{--bg:#090c12d1;--panel:#141821e6;--panel2:#11151ed1;--stroke:#ffffff1f;--stroke2:#fff3;--text:#f5f8ffeb;--muted:#f5f8ff9e;--muted2:#f5f8ff6b;--accent:#68c4fff2;--danger:#ff6060f2;--shadow:0 20px 60px #0000008c;--radius:14px;--radius2:10px;--font:ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif}*{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font);color:var(--text);background:var(--bg);-webkit-backdrop-filter:blur(16px)}.btn{border-radius:var(--radius2);color:var(--text);cursor:pointer;user-select:none;background:#ffffff08;border:1px solid #ffffff1a;padding:8px 16px;font-size:14px;transition:background .16s,border-color .16s,transform .16s}.btn:hover{background:#ffffff12;border-color:#ffffff29}.btn:active{transform:scale(.98)}.btn-close{color:#ffdcdcf2;background:#ff60601a;border-color:#ff606040;font-weight:700}.btn-close:hover{background:#ff606033;border-color:#ff606059}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-thumb{background:#ffffff1a;border:2px solid #0000001a;border-radius:999px} \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-dispatcher.css b/arma/client/addons/cad/ui/_site/cad-dispatcher.css new file mode 100644 index 0000000..f09c4d1 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-dispatcher.css @@ -0,0 +1 @@ +html,body{background:radial-gradient(circle at 0 0,#29455d2e,#0000 30%),linear-gradient(#090e14f5,#0f161ffa);width:100%;height:100%;margin:0;padding:0;overflow:hidden}body{color:var(--text);font-family:var(--font)}.dispatch-shell{flex-direction:column;gap:14px;height:100%;padding:18px;display:flex}.dispatch-header{justify-content:space-between;align-items:center;gap:16px;display:flex}.dispatch-panel-actions{align-items:center;gap:8px;display:flex}.dispatch-kicker{color:var(--accent);text-transform:uppercase;letter-spacing:.1em;margin:0 0 4px;font-size:11px;font-weight:700}.dispatch-header h2{margin:0;font-size:24px;font-weight:650}.dispatch-header button,.dispatch-btn,.dispatch-select{color:var(--text);background:#181f28e6;border:1px solid #ffffff1f}.dispatch-header button,.dispatch-btn{cursor:pointer;padding:10px 14px}.dispatch-btn-compact{min-height:32px;padding:8px 10px;font-size:12px}.dispatch-btn-secondary{background:#352827eb}.dispatch-status{color:#e9f1f8c7;min-height:20px;font-size:13px}.dispatch-status[data-type=success]{color:#79d28a}.dispatch-status[data-type=error]{color:#ff8a80}.dispatch-danger-alert{color:#ffd4cf;letter-spacing:.06em;text-transform:uppercase;background:linear-gradient(90deg,#5c1212f0,#801d1dd1);border:1px solid #ff6b6b61;padding:10px 12px;font-size:12px;font-weight:700;animation:1.35s ease-in-out infinite cad-danger-pulse}.dispatch-danger-alert.is-hidden{display:none}.dispatch-warning-alert{color:#ffe9b2;letter-spacing:.06em;text-transform:uppercase;background:linear-gradient(90deg,#59400cf0,#7d5c12d6);border:1px solid #f6c6546b;padding:10px 12px;font-size:12px;font-weight:700;animation:1.35s ease-in-out infinite cad-warning-pulse}.dispatch-warning-alert.is-hidden{display:none}.dispatch-metrics{grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;display:grid}.metric-card{background:#0d131ab8;border:1px solid #ffffff14;padding:14px}.metric-label{color:#e9f1f899;text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px;font-size:11px;display:block}.metric-card strong{font-size:28px;font-weight:700}.metric-card.is-danger{background:linear-gradient(#4a1111db,#160d10eb);border-color:#ff6b6b57;animation:1.35s ease-in-out infinite cad-danger-pulse;box-shadow:inset 0 0 0 1px #ff6b6b1f}.metric-card.is-warning{background:linear-gradient(#5c410edb,#1d160beb);border-color:#f6c65457;animation:1.35s ease-in-out infinite cad-warning-pulse;box-shadow:inset 0 0 0 1px #f6c6541f}.dispatch-grid{flex:1;grid-template-columns:repeat(12,minmax(0,1fr));grid-auto-rows:minmax(0,1fr);gap:14px;min-height:0;display:grid}.dispatch-panel{background:#0b1118c7;border:1px solid #ffffff14;flex-direction:column;min-width:0;min-height:0;display:flex}.dispatch-panel-open{grid-column:span 5}.dispatch-panel-assigned{grid-column:span 7}.dispatch-panel-groups{grid-column:span 8}.dispatch-panel-activity{grid-column:span 4}.dispatch-panel-header{border-bottom:1px solid #ffffff14;justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.dispatch-panel-header h3{text-transform:uppercase;letter-spacing:.08em;color:var(--accent);margin:0;font-size:13px}.dispatch-list{flex-direction:column;flex:1;gap:10px;padding:12px;display:flex;overflow:auto}.dispatch-inline-section{flex-direction:column;gap:10px;display:flex}.dispatch-inline-header{color:var(--accent);text-transform:uppercase;letter-spacing:.08em;font-size:11px;font-weight:700}.dispatch-card{background:#131a22b8;border:1px solid #ffffff0f;padding:12px}.dispatch-card-interactive{cursor:pointer}.dispatch-card-interactive:hover{background:#171f28d1;border-color:#5bbbff33}.dispatch-card-header,.dispatch-meta{justify-content:space-between;gap:10px;display:flex}.dispatch-card-header-actions{align-items:center;gap:8px;display:flex}.dispatch-card-header-main{align-items:center;gap:8px;min-width:0;display:flex}.dispatch-card-header{margin-bottom:8px}.dispatch-description{color:#f1f6fbd1;margin:0 0 10px;font-size:13px;line-height:1.45}.dispatch-meta{color:#e5edf4b3;margin-bottom:10px;font-size:12px}.dispatch-badge{color:var(--accent);text-transform:uppercase;background:#102b3db3;border:1px solid #5bbbff2e;padding:3px 7px;font-size:11px}.dispatch-alert-badge{color:#ffd8d1;text-transform:uppercase;letter-spacing:.08em;background:#5f1717e0;border:1px solid #ff6b6b70;padding:3px 7px;font-size:11px;font-weight:700}.dispatch-icon-btn{width:32px;height:32px;color:var(--text);cursor:pointer;background:#181f28eb;border:1px solid #ffffff24;padding:0}.dispatch-icon-btn:hover{background:#202a34f5}.dispatch-actions{flex-direction:column;gap:8px;display:flex}.dispatch-card.is-danger{background:linear-gradient(#451416c7,#1c1115eb);border-color:#ff6b6b57;animation:1.35s ease-in-out infinite cad-danger-pulse;box-shadow:inset 0 0 0 1px #ff6b6b1a}.dispatch-card.is-danger .dispatch-meta,.dispatch-card.is-danger .dispatch-description{color:#ffe8e4d1}.dispatch-card.is-warning{background:linear-gradient(#564011c7,#221b10eb);border-color:#f6c65457;animation:1.35s ease-in-out infinite cad-warning-pulse;box-shadow:inset 0 0 0 1px #f6c6541a}.dispatch-card.is-warning .dispatch-meta,.dispatch-card.is-warning .dispatch-description{color:#fff3d6d6}.dispatch-actions-split{margin-top:10px}.dispatch-select{width:100%;padding:9px 10px}.dispatch-textarea{width:100%;min-height:92px;color:var(--text);font:inherit;resize:vertical;box-sizing:border-box;background:#181f28eb;border:1px solid #ffffff1f;padding:10px 12px}.placeholder-message{text-align:center;color:#e9f1f899;padding:18px}.dispatch-modal{z-index:30;box-sizing:border-box;justify-content:center;align-items:center;padding:32px 24px;display:flex;position:fixed;inset:0}.dispatch-modal.is-hidden{display:none}.dispatch-modal-backdrop{background:#04080cb8;position:absolute;inset:0}.dispatch-modal-dialog{background:#0b1118fa;border:1px solid #ffffff1f;flex-direction:column;width:min(560px,100% - 48px);max-height:calc(100vh - 64px);margin:0;display:flex;position:relative;box-shadow:0 24px 64px #0000006b}.dispatch-modal-header,.dispatch-modal-actions{justify-content:space-between;align-items:center;gap:12px;padding:14px 16px;display:flex}.dispatch-modal-header{border-bottom:1px solid #ffffff14}.dispatch-modal-header h3{margin:0;font-size:22px;font-weight:650}.dispatch-modal-body{flex:1;min-height:0;padding:16px;overflow:auto}.dispatch-meta-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:18px;display:grid}.dispatch-meta-grid strong{margin-top:4px;font-size:14px;font-weight:600;display:block}.dispatch-modal-fields{gap:12px;display:grid}.dispatch-field{gap:6px;display:grid}.dispatch-field span{text-transform:uppercase;letter-spacing:.08em;color:#e9f1f8b3;font-size:12px;font-weight:650}.dispatch-modal-actions{border-top:1px solid #ffffff14;justify-content:flex-end}.dispatch-detail-block,.dispatch-detail-list{background:#131a22b8;border:1px solid #ffffff14}.dispatch-detail-block{color:#f1f6fbd1;white-space:pre-wrap;padding:12px;line-height:1.45}.dispatch-detail-list{gap:1px;display:grid;overflow:hidden}.dispatch-detail-row{background:#0e141ceb;grid-template-columns:minmax(0,180px) minmax(0,1fr);gap:12px;padding:10px 12px;display:grid}.dispatch-detail-label{color:#e9f1f8a3;text-transform:uppercase;letter-spacing:.06em;font-size:12px;font-weight:650}.dispatch-detail-value{color:#f1f6fbd6;word-break:break-word;white-space:pre-wrap;line-height:1.4}@keyframes cad-danger-pulse{0%,to{box-shadow:inset 0 0 0 1px #ff6b6b14,0 0 #ff6b6b00}50%{box-shadow:inset 0 0 0 1px #ff8d8d38,0 0 18px #ff6b6b29}}@keyframes cad-warning-pulse{0%,to{box-shadow:inset 0 0 0 1px #f6c65414,0 0 #f6c65400}50%{box-shadow:inset 0 0 0 1px #fbd47638,0 0 18px #f6c65429}} \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-dispatcher.js b/arma/client/addons/cad/ui/_site/cad-dispatcher.js new file mode 100644 index 0000000..db9bd0d --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-dispatcher.js @@ -0,0 +1 @@ +window.cadDispatcherFormatters={getDangerGroups(){return this.groups.filter(e=>"danger"===(e.status||""))},getSupportAlertRequests(){return this.requests.filter(e=>["medevac_9line","fire_support","air_support"].includes(e.type||""))},buildSupportAlertMessage(){const e=this.getSupportAlertRequests();if(!e.length)return"";return`Support request alert: ${e.map(e=>`${e.groupCallsign||e.groupId||"Unknown Group"} ${this.getRequestTypeLabel(e.type||"request")}`).join(", ")}`},getSortedGroups(){return this.groups.slice().sort((e,t)=>{const s="danger"===(e.status||"")?0:1,n="danger"===(t.status||"")?0:1;if(s!==n)return s-n;const r=e.callsign||e.groupId||"",a=t.callsign||t.groupId||"";return r.localeCompare(a)})},isDispatchOrder:e=>!!e.isDispatchOrder||"dispatch_order"===(e.type||""),formatTypeLabel(e){const t=(e.type||"task").replaceAll("_"," ");return this.isDispatchOrder(e)?"dispatch order":t},getRequestTypeLabel(e){switch(e){case"medevac_9line":return"9-Line MEDEVAC";case"ace_lace":return"ACE/LACE";case"fire_support":return"Fire Support";case"air_support":return"Air Support";case"logreq":return"LOGREQ";default:return(e||"request").replaceAll("_"," ")}},buildGroupOptions(e){return this.getSortedGroups().map(t=>{const s=t.groupId||"";return``}).join("")},buildTaskTypeOptions(e){return this.taskTypes.map(t=>{const s=t.value||"";return``}).join("")},formatRequestFieldLabel:e=>(e||"field").replaceAll("_"," ").replace(/\b\w/g,e=>e.toUpperCase()),formatRequestFieldValue(e){if(Array.isArray(e))return e.join(", ");if(e&&"object"==typeof e)return JSON.stringify(e);return String(e??"").trim()||"Not provided"},buildRequestOrderNote(e){const t=this.getRequestTypeLabel(e.type||"request"),s=e.groupCallsign||e.groupId||"Unknown Group",n=(e.summary||"").trim(),r=e.fields&&"object"==typeof e.fields?Object.entries(e.fields).map(([e,t])=>{const s=this.formatRequestFieldValue(t);return"Not provided"===s?"":`${this.formatRequestFieldLabel(e)} ${s}`}).filter(Boolean):[],a=r.length?r:[n].filter(Boolean);return a.length?`${t} requested by ${s}. ${a.join(" | ")}`:`${t} requested by ${s}.`}},window.cadDispatcherModals={openTaskModal(){this.populateTaskModal(),document.getElementById("dispatcherTaskModal").classList.remove("is-hidden")},closeTaskModal(){document.getElementById("dispatcherTaskModal").classList.add("is-hidden")},populateTaskModal(){const e=document.getElementById("dispatcherTaskTypeSelect");e&&(e.innerHTML=this.buildTaskTypeOptions(e.value||this.taskTypes[0]?.value||""))},openOrderModal(){this.convertingRequestId="",this.populateOrderModal(),document.getElementById("dispatcherOrderModalTitle").textContent="Create Support Order",document.getElementById("dispatcherOrderModal").classList.remove("is-hidden")},closeOrderModal(){this.convertingRequestId="",document.getElementById("dispatcherOrderNoteInput").value="",document.getElementById("dispatcherOrderPrioritySelect").value="priority",document.getElementById("dispatcherOrderModalTitle").textContent="Create Support Order",document.getElementById("dispatcherOrderModal").classList.add("is-hidden")},openRequestModal(e){const t=this.requests.find(t=>t.requestId===e);t&&(this.viewingRequestId=e,this.populateRequestModal(t),document.getElementById("dispatcherRequestModal").classList.remove("is-hidden"))},closeRequestModal(){this.viewingRequestId="",document.getElementById("dispatcherRequestModal").classList.add("is-hidden")},syncRequestModal(){if(!this.viewingRequestId)return;const e=this.requests.find(e=>e.requestId===this.viewingRequestId);e?this.populateRequestModal(e):this.closeRequestModal()},populateRequestModal(e){const t=e.fields&&"object"==typeof e.fields?Object.entries(e.fields):[],s=t.length?t.map(([e,t])=>`\n
\n ${this.formatRequestFieldLabel(e)}\n ${this.formatRequestFieldValue(t)}\n
\n `).join(""):'

No submitted fields.

';document.getElementById("dispatcherRequestTitle").textContent=e.title||e.requestId||"Support Request",document.getElementById("dispatcherRequestPriority").textContent=(e.priority||"priority").replaceAll("_"," "),document.getElementById("dispatcherRequestGroup").textContent=e.groupCallsign||e.groupId||"Unknown",document.getElementById("dispatcherRequestType").textContent=this.getRequestTypeLabel(e.type||"request"),document.getElementById("dispatcherRequestSummary").textContent=e.summary||"No summary provided.",document.getElementById("dispatcherRequestFields").innerHTML=s},convertRequestToOrder(e){const t=this.requests.find(t=>(t.requestId||"")===e);if(!t)return void this.setStatus("Selected request is no longer available.","error");const s=t.groupId||"";if(!s)return void this.setStatus("Selected request has no owning group to target.","error");this.groups.find(e=>(e.groupId||"")===s)?(this.convertingRequestId=e,this.populateOrderModal({selectedAssigneeID:this.getSortedGroups().find(e=>(e.groupId||"")!==s)?.groupId||"",selectedTargetID:s,note:this.buildRequestOrderNote(t),priority:t.priority||"priority"}),document.getElementById("dispatcherOrderModalTitle").textContent="Create Order From Request",document.getElementById("dispatcherOrderModal").classList.remove("is-hidden"),this.setStatus("Preparing dispatch order from request...","info")):this.setStatus("Selected request group is no longer available.","error")},convertViewedRequestToOrder(){if(!this.viewingRequestId)return;const e=this.viewingRequestId;this.closeRequestModal(),this.convertRequestToOrder(e)},populateOrderModal(e={}){const t=this.getSortedGroups(),s=document.getElementById("dispatcherOrderAssigneeSelect"),n=document.getElementById("dispatcherOrderTargetSelect"),r=document.getElementById("dispatcherOrderNoteInput"),a=document.getElementById("dispatcherOrderPrioritySelect");if(!s||!n)return;const d=e.selectedAssigneeID||"",i=e.selectedTargetID||"",o=d||t.find(e=>(e.groupId||"")!==i)?.groupId||t[0]?.groupId||"",c=i||t.find(e=>(e.groupId||"")!==o)?.groupId||t[0]?.groupId||"";s.innerHTML=this.buildGroupOptions(o),n.innerHTML=this.buildGroupOptions(c),r&&(r.value=e.note||""),a&&(a.value=e.priority||"priority")},syncOrderModal(){const e=document.getElementById("dispatcherOrderModal");e&&!e.classList.contains("is-hidden")&&this.populateOrderModal({selectedAssigneeID:document.getElementById("dispatcherOrderAssigneeSelect")?.value||"",selectedTargetID:document.getElementById("dispatcherOrderTargetSelect")?.value||"",note:document.getElementById("dispatcherOrderNoteInput")?.value||"",priority:document.getElementById("dispatcherOrderPrioritySelect")?.value||"priority"})},openGroupModal(e){const t=this.groups.find(t=>t.groupId===e);t&&(this.editingGroupId=e,document.getElementById("dispatcherModalGroupCallsign").textContent=t.callsign||t.groupId||"Unknown",document.getElementById("dispatcherModalGroupLeader").textContent=t.leaderName||"Unknown",document.getElementById("dispatcherModalGroupTask").textContent=t.currentTaskId||"None",document.getElementById("dispatcherModalGroupOrg").textContent=t.orgId||"default",document.getElementById("dispatcherModalRoleSelect").innerHTML=this.roles.map(e=>``).join(""),document.getElementById("dispatcherModalStatusSelect").innerHTML=this.statuses.map(e=>``).join(""),document.getElementById("dispatcherGroupModal").classList.remove("is-hidden"))},closeGroupModal(){this.editingGroupId="",document.getElementById("dispatcherGroupModal").classList.add("is-hidden")},syncOpenModal(){if(!this.editingGroupId)return;const e=this.groups.find(e=>e.groupId===this.editingGroupId);e?(document.getElementById("dispatcherModalGroupCallsign").textContent=e.callsign||e.groupId||"Unknown",document.getElementById("dispatcherModalGroupLeader").textContent=e.leaderName||"Unknown",document.getElementById("dispatcherModalGroupTask").textContent=e.currentTaskId||"None",document.getElementById("dispatcherModalGroupOrg").textContent=e.orgId||"default"):this.closeGroupModal()}},window.cadDispatcherRender={updateDangerAlert(){const e=document.getElementById("dispatcherDangerAlert");if(!e)return;const t=this.getDangerGroups();if(!t.length)return e.textContent="",void e.classList.add("is-hidden");const s=t.map(e=>e.callsign||e.groupId||"Unknown Group");e.textContent=`Danger alert active: ${s.join(", ")}`,e.classList.remove("is-hidden")},updateRequestAlert(){const e=document.getElementById("dispatcherRequestAlert");if(!e)return;const t=this.buildSupportAlertMessage();if(!t)return e.textContent="",void e.classList.add("is-hidden");e.textContent=t,e.classList.remove("is-hidden")},buildGroupEditorButton:e=>`\n \n ⚙\n \n `,buildCloseOrderButton:e=>`\n \n Close\n \n `,buildCloseRequestButton:e=>`\n \n Close\n \n `,buildConvertRequestButton:e=>`\n \n Convert to Order\n \n `,renderMetrics(){const e=this.contracts.filter(e=>"unassigned"!==(e.assignmentState||"unassigned")),t=this.contracts.filter(e=>"unassigned"===(e.assignmentState||"unassigned")),s=this.requests.length,n=this.getSupportAlertRequests(),r=this.groups.filter(e=>"danger"===(e.status||""));document.getElementById("metricOpenContracts").textContent=t.length,document.getElementById("metricAssignedContracts").textContent=e.length,document.getElementById("metricActiveGroups").textContent=this.groups.length,document.getElementById("metricOpenRequests").textContent=s,document.getElementById("metricDangerGroups").textContent=r.length;const a=document.getElementById("metricDangerGroupsCard");a&&a.classList.toggle("is-danger",r.length>0);const d=document.getElementById("metricOpenRequestsCard");d&&d.classList.toggle("is-warning",n.length>0)},renderOpenContracts(){const e=document.getElementById("dispatcherOpenContracts"),t=this.contracts.filter(e=>"unassigned"===(e.assignmentState||"unassigned"));if(!t.length)return void(e.innerHTML='

No open contracts.

');const s=this.buildGroupOptions("");e.innerHTML=t.map(e=>{const t=e.taskId||e.taskID||"",n=Array.isArray(e.position)?e.position:[0,0,0],r=this.groups.find(t=>t.groupId===(e.targetGroupId||""));return`\n
\n
\n ${e.title||t}\n ${this.formatTypeLabel(e)}\n
\n

${e.description||""}

\n
\n Unassigned\n ${window.mapUI.formatPosition(n)}\n
\n
\n Target: ${r?r.callsign:e.targetGroupCallsign||"None"}\n Priority: ${(e.priority||"priority").replaceAll("_"," ")}\n
\n
\n \n \n
\n
\n `}).join("")},renderAssignedContracts(){const e=document.getElementById("dispatcherAssignedContracts"),t=this.contracts.filter(e=>"unassigned"!==(e.assignmentState||"unassigned"));t.length?e.innerHTML=t.map(e=>{const t=e.taskId||e.taskID||"",s=this.groups.find(t=>t.groupId===(e.assignedGroupId||"")),n=this.groups.find(t=>t.groupId===(e.targetGroupId||"")),r=this.isDispatchOrder(e);return`\n
\n
\n ${e.title||t}\n ${e.assignmentState||"assigned"}\n
\n

${e.description||""}

\n
\n Group: ${s?s.callsign:e.assignedGroupId||"Unknown"}\n Type: ${this.formatTypeLabel(e)}\n
\n
\n Target: ${n?n.callsign:e.targetGroupCallsign||"None"}\n Priority: ${(e.priority||"priority").replaceAll("_"," ")}\n
\n ${r?`
${this.buildCloseOrderButton(t)}
`:""}\n
\n `}).join(""):e.innerHTML='

No assigned contracts.

'},renderGroups(){const e=document.getElementById("dispatcherGroups");this.groups.length?e.innerHTML=this.getSortedGroups().map(e=>{const t="danger"===(e.status||"");return`\n
\n
\n
\n ${e.callsign||e.groupId}\n ${e.role||"group"}\n ${t?'Danger':""}\n
\n
\n ${this.buildGroupEditorButton(e.groupId)}\n
\n
\n
\n Leader: ${e.leaderName||"Unknown"}\n Status: ${e.status||"unknown"}\n
\n
\n Org: ${e.orgId||"default"}\n Task: ${e.currentTaskId||"None"}\n
\n
\n `}).join(""):e.innerHTML='

No active groups available.

'},renderActivity(){const e=document.getElementById("dispatcherActivity"),t=this.requests.length?this.requests.map(e=>`\n
\n
\n ${e.title||e.requestId||"Support Request"}\n ${(e.priority||"priority").replaceAll("_"," ")}\n
\n

${e.summary||""}

\n
\n Group: ${e.groupCallsign||e.groupId||"Unknown"}\n ${this.getRequestTypeLabel(e.type||"request")}\n
\n
\n ${this.buildConvertRequestButton(e.requestId||"")}\n ${this.buildCloseRequestButton(e.requestId||"")}\n
\n
\n `).join(""):'

No active support requests.

',s=this.activity.length?this.activity.slice().reverse().slice(0,8).map(e=>`\n
\n
\n ${e.type||"activity"}\n ${Math.round(e.timestamp||0)}s\n
\n

${e.message||""}

\n
\n `).join(""):'

No recent activity.

';e.innerHTML=`\n
\n
Support Requests
\n ${t}\n
\n
\n
Recent Activity
\n ${s}\n
\n `},render(){this.updateDangerAlert(),this.updateRequestAlert(),this.renderMetrics(),this.renderOpenContracts(),this.renderAssignedContracts(),this.renderGroups(),this.renderActivity()}};const dispatcherFormatters=window.cadDispatcherFormatters||{},dispatcherModals=window.cadDispatcherModals||{},dispatcherRender=window.cadDispatcherRender||{};window.cadDispatcher={contracts:[],requests:[],groups:[],activity:[],session:{},editingGroupId:"",viewingRequestId:"",convertingRequestId:"",taskTypes:[{value:"attack",label:"Attack"},{value:"defend",label:"Defend"},{value:"delivery",label:"Delivery"},{value:"destroy",label:"Destroy"},{value:"defuse",label:"Defuse"},{value:"hostage",label:"Hostage"},{value:"hvtkill",label:"Kill HVT"},{value:"hvtcapture",label:"Capture HVT"}],statuses:["available","en_route","on_task","holding","danger","unavailable"],roles:["infantry","recon","armor","air","logistics","support"],...dispatcherFormatters,...dispatcherModals,...dispatcherRender,init(){document.getElementById("dispatcherRequestTaskBtn").addEventListener("click",()=>{this.openTaskModal()}),document.getElementById("dispatcherCreateOrderBtn").addEventListener("click",()=>{this.openOrderModal()}),document.getElementById("dispatcherGroupModalCloseBtn").addEventListener("click",()=>{this.closeGroupModal()}),document.getElementById("dispatcherGroupModalSaveBtn").addEventListener("click",()=>{this.applyGroupUpdates()}),document.querySelector("#dispatcherGroupModal .dispatch-modal-backdrop").addEventListener("click",()=>{this.closeGroupModal()}),document.getElementById("dispatcherOrderModalCloseBtn").addEventListener("click",()=>{this.closeOrderModal()}),document.getElementById("dispatcherOrderModalSaveBtn").addEventListener("click",()=>{this.createDispatchOrder()}),document.querySelector("#dispatcherOrderModal .dispatch-modal-backdrop").addEventListener("click",()=>{this.closeOrderModal()}),document.getElementById("dispatcherTaskModalCloseBtn").addEventListener("click",()=>{this.closeTaskModal()}),document.getElementById("dispatcherTaskModalSaveBtn").addEventListener("click",()=>{this.requestGeneratedTask()}),document.querySelector("#dispatcherTaskModal .dispatch-modal-backdrop").addEventListener("click",()=>{this.closeTaskModal()}),document.getElementById("dispatcherRequestModalCloseBtn").addEventListener("click",()=>{this.closeRequestModal()}),document.getElementById("dispatcherRequestModalDoneBtn").addEventListener("click",()=>{this.closeRequestModal()}),document.getElementById("dispatcherRequestConvertBtn").addEventListener("click",()=>{this.convertViewedRequestToOrder()}),document.querySelector("#dispatcherRequestModal .dispatch-modal-backdrop").addEventListener("click",()=>{this.closeRequestModal()}),window.mapUI.sendEvent("cad::dispatcher::ready",{})},receiveHydrate(e){this.contracts=Array.isArray(e.contracts)?e.contracts:[],this.requests=Array.isArray(e.requests)?e.requests:[],this.groups=Array.isArray(e.groups)?e.groups:[],this.activity=Array.isArray(e.activity)?e.activity:[],this.session=e.session&&"object"==typeof e.session?e.session:{};const t=document.getElementById("dispatcherStatusMessage");!t||t.dataset.type&&"info"!==t.dataset.type||this.setStatus("",""),this.syncOpenModal(),this.syncOrderModal(),this.syncRequestModal(),this.render()},setStatus(e,t){const s=document.getElementById("dispatcherStatusMessage");s&&(s.textContent=e||"",s.dataset.type=t||"")},createDispatchOrder(){const e=document.getElementById("dispatcherOrderAssigneeSelect").value,t=document.getElementById("dispatcherOrderTargetSelect").value,s=document.getElementById("dispatcherOrderPrioritySelect").value,n=document.getElementById("dispatcherOrderNoteInput").value,r=this.convertingRequestId&&this.requests.find(e=>(e.requestId||"")===this.convertingRequestId)||null;e&&t?e!==t?(this.setStatus(this.convertingRequestId?"Creating dispatch order from request...":"Creating dispatch order...","info"),window.mapUI.sendEvent("cad::dispatchOrder::create",{assigneeGroupID:e,targetGroupID:t,note:n.trim(),priority:s,request:r?{requestId:r.requestId||"",type:r.type||"",title:r.title||"",summary:r.summary||"",fields:r.fields&&"object"==typeof r.fields?r.fields:{}}:{}}),this.closeOrderModal()):this.setStatus("Assignee and target groups must be different.","error"):this.setStatus("Select both an assignee and a target group.","error")},requestGeneratedTask(){const e=document.getElementById("dispatcherTaskTypeSelect").value;e?(this.setStatus("Requesting generated task...","info"),window.mapUI.sendEvent("cad::generatedTask::request",{taskType:e}),this.closeTaskModal()):this.setStatus("Select a task type before requesting a task.","error")},assignTask(e){const t=document.getElementById(`dispatcher-assign-group-${e}`);t&&t.value?(this.setStatus("Submitting assignment...","info"),window.mapUI.sendEvent("cad::tasks::assign",{taskID:e,groupID:t.value,note:""})):this.setStatus("Select a group before assigning a contract.","error")},applyGroupUpdates(){if(!this.editingGroupId)return;const e=this.groups.find(e=>e.groupId===this.editingGroupId);if(!e)return void this.closeGroupModal();const t=document.getElementById("dispatcherModalRoleSelect").value,s=document.getElementById("dispatcherModalStatusSelect").value,n=t&&t!==(e.role||"")?t:"",r=s&&s!==(e.status||"")?s:"";if(!(n||r))return this.setStatus("No group changes to save.","info"),void this.closeGroupModal();this.setStatus("Updating group profile...","info"),window.mapUI.sendEvent("cad::groups::profile",{groupID:this.editingGroupId,role:n,status:r}),this.closeGroupModal()},closeDispatchOrder(e){e&&(this.setStatus("Closing dispatch order...","info"),window.mapUI.sendEvent("cad::dispatchOrder::close",{taskID:e}))},closeSupportRequest(e){e&&(this.setStatus("Closing support request...","info"),window.mapUI.sendEvent("cad::supportRequest::close",{requestID:e}))}},window.cadDispatcher.init(); \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-shared.js b/arma/client/addons/cad/ui/_site/cad-shared.js new file mode 100644 index 0000000..7032729 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-shared.js @@ -0,0 +1 @@ +window.mapUIState={layersPanelVisible:!0,sidePanelElement:null},window.mapUI={formatGridCoordinate:t=>Math.round(Number(t)||0).toString().padStart(4,"0"),formatPosition(t){const e=Array.isArray(t)?t:[0,0,0];return`X: ${this.formatGridCoordinate(e[0])} Y: ${this.formatGridCoordinate(e[1])}`},sendEvent(t,e){A3API.SendAlert(JSON.stringify({event:t,data:e}))},updateCoordinates(t,e){const n=document.getElementById("coordsDisplay");n&&(n.textContent=this.formatPosition([t,e,0]))},updateScale(t){const e=document.getElementById("scaleDisplay");e&&(e.textContent=`Scale: 1:${Math.round(t)}`)},updateStatus(t){const e=document.getElementById("statusText");e&&(e.textContent=t)}},window.updateCoordinates=window.mapUI.updateCoordinates,window.updateScale=window.mapUI.updateScale,window.updateStatus=window.mapUI.updateStatus,window.ForgeBridge=window.ForgeBridge||{_handlers:{},on(t,e){this._handlers[t]=this._handlers[t]||[],this._handlers[t].push(e)},ready:t=>(window.mapUI.sendEvent("cad::ready",t||{}),!0),receive(t){if(!t||"object"!=typeof t)return;(this._handlers[t.event]||[]).forEach(e=>e(t.data||{}))},send:(t,e)=>(window.mapUI.sendEvent(t,e||{}),!0),close:t=>(window.mapUI.sendEvent("map::close",t||{}),!0)}; \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-sidepanel.css b/arma/client/addons/cad/ui/_site/cad-sidepanel.css new file mode 100644 index 0000000..7f3b6d0 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-sidepanel.css @@ -0,0 +1 @@ +html,body{background:var(--panel);border-left:1px solid var(--stroke);width:100%;height:100%;box-shadow:var(--shadow);-webkit-backdrop-filter:blur(12px);margin:0;padding:0;overflow:hidden}body{opacity:1;visibility:visible}.panel-header{border-bottom:1px solid var(--stroke);background:linear-gradient(#ffffff0d,#0000);justify-content:space-between;align-items:center;padding:14px;display:flex}.panel-header h3{color:var(--accent);text-transform:uppercase;letter-spacing:.8px;font-size:14px;font-weight:650}.panel-content{height:calc(100% - 56px);padding:14px;overflow:auto}.placeholder-message{text-align:center;padding:20px}.placeholder-message p{color:var(--muted);font-size:13px;font-style:italic}.cad-tabs{grid-template-columns:repeat(4,1fr);gap:5px;margin-bottom:12px;display:grid}.cad-tabs.is-two-col{grid-template-columns:repeat(2,1fr)}.cad-tabs.is-three-col{grid-template-columns:repeat(3,1fr)}.cad-tab{color:#f3f6f9c7;text-transform:uppercase;letter-spacing:.08em;white-space:nowrap;cursor:pointer;background:#141b21e0;border:1px solid #ffffff24;min-width:0;padding:8px 7px;font-size:10px}.cad-tab:hover{color:#f3f6f9;background:#1f282ff0}.cad-tab.is-active{color:var(--accent);background:#0f283af5;border-color:#5bbbff6b}.cad-tab-panels{min-height:0}.cad-section{display:none}.cad-section.is-active{display:block}.cad-section-header{color:var(--accent);text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px;font-size:12px;font-weight:700}.task-accept-btn,.task-secondary-btn,.cad-select{color:#f3f6f9;background:#1e252be6;border:1px solid #fff3;width:100%;padding:8px 10px}.task-accept-btn,.task-secondary-btn{cursor:pointer}.task-accept-btn:hover,.task-secondary-btn:hover{background:#2e3942f2}.task-accept-btn:disabled,.task-secondary-btn:disabled{opacity:.55;cursor:default}.task-status-message{color:#cdd6dd;min-height:18px;margin-bottom:10px;font-size:12px}.task-status-message[data-type=success]{color:#79d28a}.task-status-message[data-type=error]{color:#ff8a80}.cad-modal{z-index:40;position:fixed;inset:0}.cad-modal.is-hidden{display:none}.cad-modal-backdrop{background:#04080cc2;position:absolute;inset:0}.cad-modal-dialog{background:#0b1118fa;border:1px solid #ffffff1f;width:min(480px,100% - 28px);margin:32px auto 0;position:relative;box-shadow:0 24px 64px #0000006b}.cad-modal-header,.cad-modal-actions{justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}.cad-modal-header{border-bottom:1px solid #ffffff14}.cad-modal-header h3{margin:4px 0 0;font-size:18px;font-weight:650}.cad-modal-body{max-height:62vh;padding:14px;overflow:auto}.cad-modal-fields{gap:10px;display:grid}.cad-field{gap:6px;display:grid}.cad-field span{text-transform:uppercase;letter-spacing:.08em;color:#e9f1f8b3;font-size:11px;font-weight:700}.cad-input,.cad-textarea{color:#f3f6f9;box-sizing:border-box;width:100%;font:inherit;background:#1e252be6;border:1px solid #fff3;padding:8px 10px}.cad-textarea{resize:vertical;min-height:74px}.cad-icon-btn{width:30px;height:30px;color:var(--text);cursor:pointer;background:#181f28eb;border:1px solid #ffffff24;padding:0}.cad-modal-actions{border-top:1px solid #ffffff14;justify-content:flex-end}.cad-danger-alert{color:#ffd4cf;letter-spacing:.06em;text-transform:uppercase;background:linear-gradient(90deg,#5c1212f0,#801d1dd1);border:1px solid #ff6b6b5c;margin-bottom:10px;padding:8px 10px;font-size:11px;font-weight:700;animation:1.35s ease-in-out infinite cad-danger-pulse}.cad-danger-alert.is-hidden{display:none}.cad-warning-alert{color:#ffe9b2;letter-spacing:.06em;text-transform:uppercase;background:linear-gradient(90deg,#59400cf0,#7d5c12d6);border:1px solid #f6c65466;margin-bottom:10px;padding:8px 10px;font-size:11px;font-weight:700;animation:1.35s ease-in-out infinite cad-warning-pulse}.cad-warning-alert.is-hidden{display:none}.task-list{flex-direction:column;gap:10px;display:flex}.cad-request-actions{gap:8px;display:grid}.cad-request-btn{text-align:left}.task-action-stack,.task-action-row{flex-direction:column;gap:8px;display:flex}.task-action-row{flex-direction:row}.task-card{background:#0c10149e;border:1px solid #ffffff14;padding:10px}.task-card.is-danger,.roster-summary-card.is-danger{background:linear-gradient(#451416c7,#1c1115eb);border-color:#ff6b6b57;animation:1.35s ease-in-out infinite cad-danger-pulse;box-shadow:inset 0 0 0 1px #ff6b6b1a}.task-card-header{justify-content:space-between;gap:8px;margin-bottom:8px;display:flex}.task-type{opacity:.7;text-transform:uppercase;font-size:11px}.task-description{margin:0 0 8px;font-size:12px;line-height:1.4}.task-meta{opacity:.8;justify-content:space-between;gap:8px;margin-bottom:8px;font-size:11px;display:flex}.task-secondary-btn{background:#3c302deb}.roster-summary-card{background:#10171dd1;border:1px solid #ffffff14;padding:10px}.task-alert-badge{color:#ffd8d1;letter-spacing:.08em;text-transform:uppercase;background:#5f1717e0;border:1px solid #ff6b6b70;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}.roster-member-card{background:#0c1014bd}.dispatch-map-group-card{text-align:left;-webkit-appearance:none;appearance:none;width:100%;color:var(--text);font:inherit;cursor:pointer;border-radius:0;transition:border-color .12s,background .12s,transform .12s}.dispatch-map-group-card strong{color:var(--text)}.dispatch-map-group-card .task-type{color:var(--accent);opacity:.9}.dispatch-map-group-card .task-meta{color:var(--muted);opacity:1}.dispatch-map-group-card:hover{background:#121d26e6;border-color:#5bbbff42;transform:translate(-2px)}.dispatch-map-group-card.is-selected{background:#0f283aeb;border-color:#5bbbff85;box-shadow:inset 0 0 0 1px #5bbbff2e}.dispatch-map-group-card.is-danger:not(.is-selected){background:linear-gradient(#451416c7,#1c1115eb);border-color:#ff6b6b57}.dispatch-map-group-card.is-danger .task-meta,.roster-summary-card.is-danger .task-meta{color:#ffe8e4d1}.dispatch-map-card{text-align:left;-webkit-appearance:none;appearance:none;width:100%;color:var(--text);font:inherit;cursor:pointer;border-radius:0;transition:border-color .12s,background .12s,transform .12s}.dispatch-map-card strong{color:var(--text)}.dispatch-map-card .task-type{color:var(--accent);opacity:.9}.dispatch-map-card .task-description{color:var(--muted)}.dispatch-map-card .task-meta{color:var(--muted);opacity:1}.dispatch-map-card:hover{background:#121d26e6;border-color:#5bbbff42;transform:translate(-2px)}.dispatch-map-card.is-selected{background:#0f283aeb;border-color:#5bbbff85;box-shadow:inset 0 0 0 1px #5bbbff2e}.dispatch-map-card.is-warning:not(.is-selected){background:linear-gradient(#564011c7,#221b10eb);border-color:#f6c65457}.dispatch-map-card.is-warning .task-meta,.dispatch-map-card.is-warning .task-description{color:#fff3d6d6}.roster-leader-badge{color:var(--accent);letter-spacing:.06em;text-transform:uppercase;background:#0f283ad1;border:1px solid #5bbbff47;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}@keyframes cad-danger-pulse{0%,to{box-shadow:inset 0 0 0 1px #ff6b6b14,0 0 #ff6b6b00}50%{box-shadow:inset 0 0 0 1px #ff8d8d38,0 0 14px #ff6b6b24}}@keyframes cad-warning-pulse{0%,to{box-shadow:inset 0 0 0 1px #f6c65414,0 0 #f6c65400}50%{box-shadow:inset 0 0 0 1px #fbd47638,0 0 18px #f6c65429}} \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-sidepanel.js b/arma/client/addons/cad/ui/_site/cad-sidepanel.js new file mode 100644 index 0000000..6ff06af --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-sidepanel.js @@ -0,0 +1 @@ +window.cadTasks={contracts:[],requests:[],groups:[],activity:[],session:{},mode:"operations",dispatchView:"board",activeTab:"contracts",selectedDispatchGroupId:"",selectedDispatchTaskId:"",selectedDispatchRequestId:"",selectedRosterMemberUid:"",focusStatusTimer:null,requestModalType:"",statuses:["available","en_route","on_task","holding","danger","unavailable"],roles:["infantry","recon","armor","air","logistics","support"],requestTypes:[{id:"medevac_9line",label:"9-Line MEDEVAC",defaultPriority:"emergency",fields:[{id:"pickup_location",label:"Line 1 Pickup Location",type:"text",defaultFromGroupPosition:!0},{id:"radio_freq",label:"Line 2 Radio / Call Sign",type:"text"},{id:"precedence",label:"Line 3 Precedence",type:"select",options:["urgent","urgent_surgical","priority","routine","convenience"]},{id:"special_equipment",label:"Line 4 Special Equipment",type:"select",options:["none","hoist","extraction","ventilator"]},{id:"patient_type",label:"Line 5 Patient Type",type:"select",options:["litter","ambulatory","mixed"]},{id:"security",label:"Line 6 Security",type:"select",options:["secure","possible_enemy","enemy_in_area","hot"]},{id:"marking",label:"Line 7 Marking",type:"select",options:["panels","smoke","ir","none","other"]},{id:"patient_nationality",label:"Line 8 Patient Nationality",type:"select",options:["coalition","civilian","enemy","epw","mixed"]},{id:"terrain",label:"Line 9 Terrain",type:"select",options:["flat","restricted","slope","rooftop","wooded"]}]},{id:"ace_lace",label:"ACE/LACE",defaultPriority:"routine",fields:[{id:"ammo",label:"Ammo",type:"textarea"},{id:"casualties",label:"Casualties",type:"textarea"},{id:"equipment",label:"Equipment",type:"textarea"},{id:"notes",label:"Notes",type:"textarea"}]},{id:"fire_support",label:"Fire Support",defaultPriority:"priority",fields:[{id:"target_location",label:"Target Location",type:"text",defaultFromGroupPosition:!0},{id:"target_description",label:"Target Description",type:"textarea"},{id:"requested_effect",label:"Requested Effect",type:"select",options:["suppress","destroy","illum","smoke","screen"]},{id:"ordnance",label:"Requested Ordnance",type:"text"},{id:"danger_close",label:"Danger Close",type:"select",options:["no","yes"]},{id:"remarks",label:"Remarks",type:"textarea"}]},{id:"air_support",label:"Air Support",defaultPriority:"priority",fields:[{id:"target_location",label:"Target Location",type:"text",defaultFromGroupPosition:!0},{id:"target_description",label:"Target Description",type:"textarea"},{id:"target_marking",label:"Target Marking",type:"select",options:["smoke","ir","laser","grid","visual"]},{id:"requested_effect",label:"Requested Effect",type:"select",options:["show_of_force","escort","suppress","destroy","recon"]},{id:"remarks",label:"Remarks",type:"textarea"}]},{id:"logreq",label:"LOGREQ",defaultPriority:"priority",fields:[{id:"category",label:"Category",type:"select",options:["ammo","medical","fuel","repair","vehicle","equipment","weapons","mixed"]},{id:"delivery_method",label:"Delivery Method",type:"select",options:["ground","airdrop","pickup","dispatch_discretion"]},{id:"delivery_location",label:"Delivery Location",type:"text",defaultFromGroupPosition:!0},{id:"requested_items",label:"Requested Items",type:"textarea"},{id:"quantity",label:"Quantity / Package",type:"text"},{id:"remarks",label:"Remarks",type:"textarea"}]}],init(){document.querySelectorAll(".cad-tab").forEach(e=>{e.addEventListener("click",()=>{this.setActiveTab(e.dataset.tab||"contracts")})}),document.getElementById("cadRequestModalCloseBtn").addEventListener("click",()=>{this.closeRequestModal()}),document.getElementById("cadRequestModalSaveBtn").addEventListener("click",()=>{this.submitSupportRequest()}),document.querySelector("#cadRequestModal .cad-modal-backdrop").addEventListener("click",()=>{this.closeRequestModal()}),window.ForgeBridge.on("cad::hydrate",e=>{this.setHydratePayload(e||{})}),window.ForgeBridge.on("cad::assignment::response",e=>{this.handleServerResponse(!!e.success,e.message||"")}),window.ForgeBridge.on("cad::group::response",e=>{this.handleServerResponse(!!e.success,e.message||"")}),window.ForgeBridge.on("cad::request::response",e=>{this.handleServerResponse(!!e.success,e.message||"")}),window.ForgeBridge.ready({loaded:!0})},setActiveTab(e){this.activeTab=e||"contracts",document.querySelectorAll(".cad-tab").forEach(e=>{e.classList.toggle("is-active",e.dataset.tab===this.activeTab)}),document.querySelectorAll("[data-panel]").forEach(e=>{e.classList.toggle("is-active",e.dataset.panel===this.activeTab)})},syncLayoutState(){const e=document.querySelector(".cad-tabs"),t=document.getElementById("tabContractsBtn"),s=document.getElementById("tabRosterBtn"),a=document.getElementById("tabRequestsBtn"),n=document.getElementById("tabActivityBtn"),i=document.getElementById("contractsPanel"),r=document.getElementById("rosterPanel"),o=document.getElementById("requestsPanel"),d=document.getElementById("activityPanel"),c=i?.querySelector(".cad-section-header"),l=r?.querySelector(".cad-section-header");if(this.isDispatchMapMode())return e&&(e.style.display="",e.classList.remove("is-two-col"),e.classList.add("is-three-col")),t&&(t.style.display=""),s&&(s.textContent="Groups"),n&&(n.style.display="none"),a&&(a.style.display=""),d&&(d.classList.remove("is-active"),d.style.display="none"),o&&(o.style.display=""),r&&(r.style.display=""),l&&(l.textContent="Active Groups"),i&&(i.style.display=""),c&&(c.textContent="Contracts"),void(["contracts","roster","requests"].includes(this.activeTab)||(this.activeTab="contracts"));e&&(e.style.display="",e.classList.remove("is-three-col"),e.classList.remove("is-two-col")),t&&(t.style.display=""),s&&(s.textContent="Roster"),n&&(n.style.display=""),a&&(a.style.display=""),i&&(i.style.display=""),d&&(d.style.display=""),o&&(o.style.display=""),r&&(r.style.display=""),l&&(l.textContent="Roster"),c&&(c.textContent="Contracts")},setHydratePayload(e){this.contracts=Array.isArray(e.contracts)?e.contracts:[],this.requests=Array.isArray(e.requests)?e.requests:[],this.groups=Array.isArray(e.groups)?e.groups:[],this.activity=Array.isArray(e.activity)?e.activity:[],this.session=e.session&&"object"==typeof e.session?e.session:{},this.mode=e&&"string"==typeof e.mode?e.mode:"operations",this.dispatchView=e&&"string"==typeof e.dispatchView?e.dispatchView:"board";const t=document.getElementById("cadStatusMessage");if(!t||t.dataset.type&&"info"!==t.dataset.type||this.setStatus("",""),this.selectedDispatchGroupId&&!this.groups.some(e=>e.groupId===this.selectedDispatchGroupId)&&(this.selectedDispatchGroupId=""),this.selectedRosterMemberUid){this.groups.some(e=>this.normalizeCollection(e.members).some(e=>(e.uid||"")===this.selectedRosterMemberUid))||(this.selectedRosterMemberUid="")}this.selectedDispatchTaskId&&!this.contracts.some(e=>(e.taskId||e.taskID||"")===this.selectedDispatchTaskId)&&(this.selectedDispatchTaskId=""),this.selectedDispatchRequestId&&!this.requests.some(e=>(e.requestId||"")===this.selectedDispatchRequestId)&&(this.selectedDispatchRequestId=""),"dispatch"!==this.mode||"map"!==this.dispatchView||["contracts","roster","requests"].includes(this.activeTab)||(this.activeTab="contracts"),this.render()},setStatus(e,t){const s=document.getElementById("cadStatusMessage");s&&(s.textContent=e||"",s.dataset.type=t||"")},getDangerGroups(){return this.groups.filter(e=>"danger"===(e.status||""))},getSupportAlertRequests(){return this.requests.filter(e=>["medevac_9line","fire_support","air_support"].includes(e.type||""))},buildSupportAlertMessage(){const e=this.getSupportAlertRequests();if(!e.length)return"";return`Support request alert: ${e.map(e=>`${e.groupCallsign||e.groupId||"Unknown Group"} ${this.getRequestTypeLabel(e.type||"request")}`).join(", ")}`},getCurrentGroupCoordinates(){const e=this.getCurrentGroup(),t=Array.isArray(e?.position)?e.position:[0,0,0];return window.mapUI.formatPosition(t)},getSortedGroups(){return this.groups.slice().sort((e,t)=>{const s="danger"===(e.status||"")?0:1,a="danger"===(t.status||"")?0:1;if(s!==a)return s-a;const n=e.callsign||e.groupId||"",i=t.callsign||t.groupId||"";return n.localeCompare(i)})},isDispatchOrder:e=>!!e.isDispatchOrder||"dispatch_order"===(e.type||""),formatTypeLabel(e){const t=(e.type||"task").replaceAll("_"," ");return this.isDispatchOrder(e)?"dispatch order":t},getRequestDefinition(e){return this.requestTypes.find(t=>t.id===e)||null},getRequestTypeLabel(e){return this.getRequestDefinition(e)?.label||e},canSubmitSupportRequest(){return"operations"===this.mode&&this.isLeader()},openRequestModal(e){const t=this.getRequestDefinition(e);t&&(this.requestModalType=e,document.getElementById("cadRequestModalTitle").textContent=t.label,document.getElementById("cadRequestPrioritySelect").value=t.defaultPriority||"priority",this.renderRequestFields(t),document.getElementById("cadRequestModal").classList.remove("is-hidden"))},closeRequestModal(){this.requestModalType="",document.getElementById("cadRequestFields").innerHTML="",document.getElementById("cadRequestModal").classList.add("is-hidden")},renderRequestFields(e){const t=document.getElementById("cadRequestFields");if(!t||!e)return;const s=this.getCurrentGroupCoordinates();t.innerHTML=e.fields.map(e=>{const t=e.defaultFromGroupPosition?s:"";return"select"===e.type?`\n \n `:"textarea"===e.type?`\n \n `:`\n \n `}).join("")},submitSupportRequest(){const e=this.getRequestDefinition(this.requestModalType);if(!e)return;const t={};e.fields.forEach(e=>{const s=document.getElementById(`cadRequestField_${e.id}`);t[e.id]=s?String(s.value||"").trim():""});const s=document.getElementById("cadRequestPrioritySelect").value;this.setStatus("Submitting support request...","info"),window.mapUI.sendEvent("cad::supportRequest::submit",{type:e.id,fields:t,priority:s}),this.closeRequestModal()},closeSupportRequest(e){e&&(this.setStatus(this.isDispatchMode()?"Closing support request...":"Cancelling support request...","info"),window.mapUI.sendEvent("cad::supportRequest::close",{requestID:e}))},renderRequests(){const e=document.getElementById("requestList");if(!e)return;if(this.isDispatchMapMode()){const t=this.requests.slice().sort((e,t)=>{const s=e.title||e.requestId||"",a=t.title||t.requestId||"";return s.localeCompare(a)});return t.length?void(e.innerHTML=t.map(e=>{const t=e.requestId||"",s=Array.isArray(e.position)?e.position:[0,0,0];return`\n \n
\n ${e.title||t||"Support Request"}\n ${this.getRequestTypeLabel(e.type||"request")}\n
\n

${e.summary||""}

\n
\n Group: ${e.groupCallsign||e.groupId||"Unknown"}\n ${(e.priority||"priority").replaceAll("_"," ")}\n
\n
\n ${window.mapUI.formatPosition(s)}\n ${t||"request"}\n
\n \n `}).join("")):void(e.innerHTML='

No support requests are currently active.

')}const t=this.canSubmitSupportRequest()?`\n
\n ${this.requestTypes.map(e=>`\n \n ${e.label}\n \n `).join("")}\n
\n `:"";this.requests.length?e.innerHTML=`\n ${t}\n ${this.requests.map(e=>{const t=this.isLeader()&&(e.groupId||"")===this.getPlayerGroupId(),s=this.canDispatch()||t,a=this.isDispatchMode()?"Close":"Cancel",n=e.requestId||"";return`\n \n
\n ${e.title||this.getRequestTypeLabel(e.type||"")}\n ${(e.priority||"priority").replaceAll("_"," ")}\n
\n

${e.summary||""}

\n
\n Group: ${e.groupCallsign||e.groupId||"Unknown"}\n ${this.getRequestTypeLabel(e.type||"")}\n
\n ${s?`
\n \n
`:""}\n \n `}).join("")}\n `:e.innerHTML=`\n ${t}\n

No support requests are currently active.

\n `},updateDangerAlert(){const e=document.getElementById("cadDangerAlert");if(!e)return;if(!this.isDispatchMapMode())return e.textContent="",void e.classList.add("is-hidden");const t=this.getDangerGroups();if(!t.length)return e.textContent="",void e.classList.add("is-hidden");const s=t.map(e=>e.callsign||e.groupId||"Unknown Group");e.textContent=`Danger alert active: ${s.join(", ")}`,e.classList.remove("is-hidden")},updateRequestAlert(){const e=document.getElementById("cadRequestAlert");if(!e)return;if(!this.isDispatchMapMode())return e.textContent="",void e.classList.add("is-hidden");const t=this.buildSupportAlertMessage();if(!t)return e.textContent="",void e.classList.add("is-hidden");e.textContent=t,e.classList.remove("is-hidden")},clearFocusStatusSoon(e){this.focusStatusTimer&&window.clearTimeout(this.focusStatusTimer),this.focusStatusTimer=window.setTimeout(()=>{const t=document.getElementById("cadStatusMessage");t&&"info"===t.dataset.type&&t.textContent===e&&this.setStatus("","")},1800)},handleServerResponse(e,t){this.setStatus(t||(e?"CAD update succeeded.":"CAD update failed."),e?"success":"error")},acknowledgeTask(e){this.setStatus("Acknowledging contract...","info"),window.mapUI.sendEvent("cad::tasks::acknowledge",{taskID:e})},declineTask(e){this.setStatus("Declining contract...","info"),window.mapUI.sendEvent("cad::tasks::decline",{taskID:e})},updateGroupStatus(e,t){this.setStatus("Updating group status...","info"),window.mapUI.sendEvent("cad::groups::status",{groupID:e,status:t})},updateGroupRole(e,t){this.setStatus("Updating group role...","info"),window.mapUI.sendEvent("cad::groups::role",{groupID:e,role:t})},focusGroup(e){const t=this.groups.find(t=>t.groupId===e);if(!t)return void this.setStatus("Selected group is no longer available.","error");this.selectedDispatchGroupId=e,this.selectedDispatchTaskId="",this.selectedDispatchRequestId="",this.selectedRosterMemberUid="";const s=`Centering map on ${t.callsign||t.groupId||"group"}...`;this.setStatus(s,"info"),this.clearFocusStatusSoon(s),window.mapUI.sendEvent("cad::groups::focus",{groupID:e}),this.render()},focusMember(e){let t=null;if(this.groups.some(s=>this.normalizeCollection(s.members).some(s=>(s.uid||"")===e&&(t=s,!0))),!t)return void this.setStatus("Selected group member is no longer available.","error");if((Array.isArray(t.position)?t.position:[]).length<2)return void this.setStatus("Selected group member has no map position.","error");this.selectedRosterMemberUid=e,this.selectedDispatchGroupId="",this.selectedDispatchTaskId="",this.selectedDispatchRequestId="";const s=`Centering map on ${t.name||"group member"}...`;this.setStatus(s,"info"),this.clearFocusStatusSoon(s),window.mapUI.sendEvent("cad::members::focus",{uid:e}),this.render()},focusTask(e){const t=this.contracts.find(t=>(t.taskId||t.taskID||"")===e);if(!t)return void this.setStatus("Selected contract is no longer available.","error");this.selectedDispatchTaskId=e,this.selectedDispatchGroupId="",this.selectedDispatchRequestId="",this.selectedRosterMemberUid="";const s=`Centering map on ${t.title||e}...`;this.setStatus(s,"info"),this.clearFocusStatusSoon(s),window.mapUI.sendEvent("cad::tasks::focus",{taskID:e}),this.render()},focusRequest(e){const t=this.requests.find(t=>(t.requestId||"")===e);if(!t)return void this.setStatus("Selected request is no longer available.","error");if((Array.isArray(t.position)?t.position:[]).length<2)return void this.setStatus("Selected request has no map position.","error");this.selectedDispatchRequestId=e,this.selectedDispatchGroupId="",this.selectedDispatchTaskId="",this.selectedRosterMemberUid="";const s=`Centering map on ${t.title||e}...`;this.setStatus(s,"info"),this.clearFocusStatusSoon(s),window.mapUI.sendEvent("cad::requests::focus",{requestID:e}),this.render()},getPlayerGroupId(){return this.session.groupId||""},getCurrentGroup(){const e=this.getPlayerGroupId();return this.groups.find(t=>t.groupId===e)||null},normalizeCollection:e=>Array.isArray(e)?e:e&&"object"==typeof e?Object.values(e):[],canDispatch(){return!!this.session.isDispatcher},isDispatchMode(){return"dispatch"===this.mode},isDispatchMapMode(){return"dispatch"===this.mode&&"map"===this.dispatchView},isLeader(){return!!this.session.isLeader},renderContracts(){const e=document.getElementById("taskList");if(!e)return;if(this.isDispatchMapMode()){if(!this.contracts.length)return void(e.innerHTML='

No contracts are currently available.

');const t=this.contracts.slice().sort((e,t)=>{const s="unassigned"===(e.assignmentState||"unassigned")?0:1,a="unassigned"===(t.assignmentState||"unassigned")?0:1;if(s!==a)return s-a;const n=e.taskId||e.taskID||"",i=t.taskId||t.taskID||"";return n.localeCompare(i)});return void(e.innerHTML=t.map(e=>{const t=e.taskId||e.taskID||"",s=Array.isArray(e.position)?e.position:[0,0,0],a=e.assignedGroupId||"",n=e.assignmentState||"unassigned",i=this.groups.find(e=>e.groupId===a),r=t===this.selectedDispatchTaskId,o="unassigned"===n?"Unassigned":`${n}: ${i?i.callsign:a||"Unknown"}`;return`\n \n
\n ${e.title||t}\n ${this.formatTypeLabel(e)}\n
\n

${e.description||""}

\n
\n ${o}\n ${window.mapUI.formatPosition(s)}\n
\n \n `}).join(""))}const t=this.getPlayerGroupId(),s=this.contracts.filter(e=>(e.assignedGroupId||"")===t);s.length?e.innerHTML=s.map(e=>{const s=e.taskId||e.taskID||"",a=Array.isArray(e.position)?e.position:[0,0,0],n=e.assignedGroupId||"",i=e.assignmentState||"unassigned",r=this.groups.find(e=>e.groupId===n),o=this.isLeader()&&n===t;return`\n \n
\n ${e.title||s}\n ${this.formatTypeLabel(e)}\n
\n

${e.description||""}

\n
\n ${"unassigned"===i?"Available":`${i}: ${r?r.callsign:n}`}\n ${window.mapUI.formatPosition(a)}\n
\n ${o&&"assigned"===i?`
\n \n \n
`:""}\n \n `}).join(""):e.innerHTML='

No contract is currently assigned to your group.

'},renderRoster(){const e=document.getElementById("rosterList");if(!e)return;if(this.isDispatchMapMode())return this.groups.length?void(e.innerHTML=this.getSortedGroups().map(e=>{const t=(e.groupId||"")===this.selectedDispatchGroupId,s="danger"===(e.status||"");return`\n \n
\n ${e.callsign||e.groupId||"Unknown Group"}\n ${e.role||"group"}\n ${s?'Danger':""}\n
\n
\n Leader: ${e.leaderName||"Unknown"}\n Status: ${e.status||"unknown"}\n
\n
\n Members: ${this.normalizeCollection(e.members).length}\n Task: ${e.currentTaskId||"None"}\n
\n \n `}).join("")):void(e.innerHTML='

No active groups are currently available.

');const t=this.getCurrentGroup();if(!t)return void(e.innerHTML='

Your group is not currently available.

');const s=this.normalizeCollection(t.members),a="danger"===(t.status||"");s.length?e.innerHTML=`\n
\n
\n ${t.callsign||t.groupId||"Current Group"}\n ${s.length} member${1===s.length?"":"s"}\n ${a?'Danger':""}\n
\n
\n Leader: ${t.leaderName||"Unknown"}\n Status: ${t.status||"unknown"}\n
\n
\n Role: ${t.role||"unassigned"}\n Task: ${t.currentTaskId||"None"}\n
\n
\n ${s.map(e=>{const t=(e.lifeState||"unknown").replaceAll("_"," "),s=e.isLeader?'Leader':"",a=e.uid||"";return`\n \n
\n ${e.name||"Unknown Operator"}\n ${t}\n
\n
\n ${e.uid||"No UID"}\n ${s}\n
\n \n `}).join("")}\n `:e.innerHTML='

No roster members are currently available.

'},renderActivity(){const e=document.getElementById("activityList");e&&(this.activity.length?e.innerHTML=this.activity.slice().reverse().slice(0,8).map(e=>`\n
\n
\n ${e.type||"activity"}\n ${Math.round(e.timestamp||0)}s\n
\n

${e.message||""}

\n
\n `).join(""):e.innerHTML='

No recent activity.

')},render(){this.updateDangerAlert(),this.updateRequestAlert(),this.syncLayoutState(),this.renderContracts(),this.renderRoster(),this.renderRequests(),this.renderActivity(),this.setActiveTab(this.activeTab)}},window.cadTasks.init(); \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-topbar.css b/arma/client/addons/cad/ui/_site/cad-topbar.css new file mode 100644 index 0000000..90ccdde --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-topbar.css @@ -0,0 +1 @@ +body{background:0 0;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;column-gap:16px;height:60px;padding:0 16px;display:grid;position:absolute;top:0;left:0;right:0;overflow:visible}body[data-mode=operations]{grid-template-columns:auto minmax(0,1fr) auto auto}body[data-mode=dispatch]{grid-template-columns:auto minmax(0,1fr) auto auto auto}body:before{content:"";height:60px;box-shadow:none;-webkit-backdrop-filter:blur(18px);z-index:0;pointer-events:none;background:linear-gradient(90deg,#10161ff5,#131a24f0 55%,#0f141cf5);border-bottom:none;position:absolute;inset:0 0 auto}body>*{z-index:1;position:relative}.logo{color:var(--accent);text-transform:uppercase;letter-spacing:.08em;text-shadow:0 1px 12px #00000059;font-size:15px;font-weight:650}.header-main{align-items:center;gap:12px;min-width:0;display:flex}.title-block{flex-direction:column;flex:none;gap:1px;min-width:0;display:flex}.title-kicker{color:#dae3ec8f;text-transform:uppercase;letter-spacing:.12em;font-size:10px}.title-main{color:#f5f8ffeb;font-size:15px;font-weight:600}.operator-strip{flex:auto;align-items:center;gap:8px;min-width:0;display:flex}.operator-strip.is-hidden,.operator-controls.is-hidden{display:none}.operator-info{flex-direction:column;gap:0;min-width:88px;display:flex}.operator-label{color:#dae3ec80;text-transform:uppercase;letter-spacing:.12em;font-size:9px}.operator-info strong{color:#f5f8ffe6;font-size:12px;font-weight:550}.operator-controls{align-items:center;gap:6px;min-width:0;display:flex}.operator-select{min-width:92px;max-width:112px;color:var(--text);background:#0e141cf5;border:1px solid #ffffff24;padding:5px 8px;font-size:11px}.btn-operator{text-transform:uppercase;letter-spacing:.08em;min-width:84px;font-size:10px}.mode-controls{justify-self:end;align-items:center;gap:8px;display:flex}.mode-controls.is-hidden{display:none}.dispatch-view-controls{justify-self:end;align-items:center;gap:6px;display:flex}.dispatch-view-controls.is-hidden{display:none}.controls{justify-self:end;align-items:center;gap:8px;display:flex}.mode-text{color:#e9f1f8b8;text-transform:uppercase;letter-spacing:.1em;font-size:10px}.mode-switch{align-items:center;width:54px;height:28px;display:inline-flex;position:relative}.mode-switch input{opacity:0;pointer-events:none;position:absolute}.mode-slider{background:#161d27eb;border:1px solid #ffffff24;border-radius:999px;width:54px;height:28px;transition:border-color .16s,background .16s;position:relative;box-shadow:inset 0 1px 10px #00000038}.mode-slider:after{content:"";background:linear-gradient(#edf4fbfa,#bdcdddeb);border-radius:50%;width:20px;height:20px;transition:transform .16s,background .16s;position:absolute;top:3px;left:3px;box-shadow:0 4px 12px #00000042}.mode-switch input:checked+.mode-slider{background:#0e2538f2;border-color:#5bbbff6b}.mode-switch input:checked+.mode-slider:after{background:linear-gradient(#83d4fffa,#48aae7f0);transform:translate(26px)}.btn-close{min-width:42px}.btn-dispatch-view{text-transform:uppercase;letter-spacing:.08em;min-width:66px;padding:6px 10px;font-size:10px}.btn-icon{justify-content:center;align-items:center;width:34px;min-width:34px;height:30px;padding:0;font-size:16px;line-height:1;display:inline-flex}.btn-refresh{width:40px;min-width:40px;font-size:17px;font-weight:600}.btn-dispatch-view.is-active{color:var(--accent);background:#0f283af5;border-color:#5bbbff6b}.btn-close{font-size:14px}body{pointer-events:none}body .logo,body .title-block,body .operator-strip,body .operator-controls,body .mode-controls,body .dispatch-view-controls,body .controls,body .mode-switch,body .mode-switch *,body button,body select,body label{pointer-events:auto} \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/cad-topbar.js b/arma/client/addons/cad/ui/_site/cad-topbar.js new file mode 100644 index 0000000..6d3986f --- /dev/null +++ b/arma/client/addons/cad/ui/_site/cad-topbar.js @@ -0,0 +1 @@ +window.cadTopbar={mode:"operations",dispatchView:"board",currentGroup:null,session:{},init(){document.getElementById("btnClose").addEventListener("click",()=>{window.mapUI.sendEvent("map::close",null)}),document.getElementById("modeToggle").addEventListener("change",e=>{window.mapUI.sendEvent("cad::mode::set",{mode:e.target.checked?"dispatch":"operations"})}),document.getElementById("dispatchRefreshBtn").addEventListener("click",()=>{window.mapUI.sendEvent("cad::refresh",{})}),document.getElementById("dispatchBoardBtn").addEventListener("click",()=>{window.mapUI.sendEvent("cad::dispatchView::set",{dispatchView:"board"})}),document.getElementById("dispatchMapBtn").addEventListener("click",()=>{window.mapUI.sendEvent("cad::dispatchView::set",{dispatchView:"map"})}),document.getElementById("operatorRoleBtn").addEventListener("click",()=>{this.currentGroup&&window.mapUI.sendEvent("cad::groups::role",{groupID:this.currentGroup.groupId||"",role:document.getElementById("operatorRoleSelect").value})}),document.getElementById("operatorStatusBtn").addEventListener("click",()=>{this.currentGroup&&window.mapUI.sendEvent("cad::groups::status",{groupID:this.currentGroup.groupId||"",status:document.getElementById("operatorStatusSelect").value})}),window.mapUI.sendEvent("cad::topbar::ready",{})},formatLocation(e){const t=Array.isArray(e?.position)?e.position:[0,0,0];return window.mapUI.formatPosition(t)},receiveState(e){this.session=e&&e.session&&"object"==typeof e.session?e.session:{},this.mode=e&&"string"==typeof e.mode?e.mode:"operations",this.dispatchView=e&&"string"==typeof e.dispatchView?e.dispatchView:"board",this.currentGroup=e&&e.currentGroup&&"object"==typeof e.currentGroup?e.currentGroup:null;const t=document.getElementById("modeControls"),o=!!this.session.isDispatcher,s=!(!this.currentGroup||!this.session.isLeader&&!this.session.isDispatcher),n=document.getElementById("operatorStrip"),d=document.getElementById("operatorControls"),i=document.getElementById("dispatchViewControls"),r=document.getElementById("dispatchRefreshBtn"),a=document.getElementById("dispatchBoardBtn"),c=document.getElementById("dispatchMapBtn");t.classList.toggle("is-hidden",!o),i.classList.toggle("is-hidden",!o||"dispatch"!==this.mode),n.classList.toggle("is-hidden","operations"!==this.mode||!this.currentGroup),d.classList.toggle("is-hidden",!s),document.body.dataset.mode=this.mode,document.body.dataset.dispatcher=o?"true":"false",document.getElementById("modeToggle").checked="dispatch"===this.mode,a.classList.toggle("is-active","board"===this.dispatchView),c.classList.toggle("is-active","map"===this.dispatchView),r.title="dispatch"===this.mode?"Refresh dispatch board":"Refresh CAD",r.setAttribute("aria-label","dispatch"===this.mode?"Refresh dispatch board":"Refresh CAD"),document.getElementById("operatorGroupName").textContent=this.currentGroup?this.currentGroup.callsign||this.currentGroup.groupId||"Current Group":"No Group",document.getElementById("operatorLocation").textContent=this.currentGroup?this.formatLocation(this.currentGroup):"Unavailable",this.currentGroup&&(document.getElementById("operatorRoleSelect").value=this.currentGroup.role||"infantry",document.getElementById("operatorStatusSelect").value=this.currentGroup.status||"available")}},window.cadTopbar.init(); \ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/dispatcher.html b/arma/client/addons/cad/ui/_site/dispatcher.html new file mode 100644 index 0000000..1056721 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/dispatcher.html @@ -0,0 +1 @@ +

Dispatch Dashboard

Operational Board

Open Contracts 0
Assigned Contracts 0
Active Groups 0
Open Requests 0
Groups In Danger 0

Available Contracts

Assigned Contracts

Group Board

Requests & Activity

\ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/sidepanel.html b/arma/client/addons/cad/ui/_site/sidepanel.html new file mode 100644 index 0000000..5afd6e0 --- /dev/null +++ b/arma/client/addons/cad/ui/_site/sidepanel.html @@ -0,0 +1 @@ +

CAD System

Contracts

Loading contracts...

Roster

Loading roster...

Support Requests

No support requests.

Activity

No recent activity.

\ No newline at end of file diff --git a/arma/client/addons/cad/ui/_site/topbar.html b/arma/client/addons/cad/ui/_site/topbar.html new file mode 100644 index 0000000..47eb58f --- /dev/null +++ b/arma/client/addons/cad/ui/_site/topbar.html @@ -0,0 +1 @@ +
Cad Systems FORGE Command & Dispatch
\ No newline at end of file diff --git a/arma/client/addons/cad/ui/src/bottombar.html b/arma/client/addons/cad/ui/src/bottombar.html new file mode 100644 index 0000000..061c255 --- /dev/null +++ b/arma/client/addons/cad/ui/src/bottombar.html @@ -0,0 +1,49 @@ + + + + + + + CAD Systems by IDS + v1.0.0 + + + + diff --git a/arma/client/addons/cad/ui/src/bottombar.js b/arma/client/addons/cad/ui/src/bottombar.js new file mode 100644 index 0000000..1afc0b7 --- /dev/null +++ b/arma/client/addons/cad/ui/src/bottombar.js @@ -0,0 +1,7 @@ +window.CADBottombar = window.CADBottombar || { + init() { + return true; + }, +}; + +window.CADBottombar.init(); diff --git a/arma/client/addons/cad/ui/src/dispatcher.html b/arma/client/addons/cad/ui/src/dispatcher.html new file mode 100644 index 0000000..b368315 --- /dev/null +++ b/arma/client/addons/cad/ui/src/dispatcher.html @@ -0,0 +1,426 @@ + + + + + + +
+
+
+

Dispatch Dashboard

+

Operational Board

+
+
+ +
+ + + +
+
+ Open Contracts + 0 +
+
+ Assigned Contracts + 0 +
+
+ Active Groups + 0 +
+
+ Open Requests + 0 +
+
+ Groups In Danger + 0 +
+
+ +
+
+
+

Available Contracts

+
+ + +
+
+
+
+ +
+
+

Assigned Contracts

+
+
+
+ +
+
+

Group Board

+
+
+
+ +
+
+

Requests & Activity

+
+
+
+
+ + + + + + + + +
+ + + + diff --git a/arma/client/addons/cad/ui/src/dispatcher/formatters.js b/arma/client/addons/cad/ui/src/dispatcher/formatters.js new file mode 100644 index 0000000..607a1a9 --- /dev/null +++ b/arma/client/addons/cad/ui/src/dispatcher/formatters.js @@ -0,0 +1,129 @@ +window.cadDispatcherFormatters = { + getDangerGroups() { + return this.groups.filter((group) => (group.status || "") === "danger"); + }, + getSupportAlertRequests() { + return this.requests.filter((request) => + ["medevac_9line", "fire_support", "air_support"].includes( + request.type || "", + ), + ); + }, + buildSupportAlertMessage() { + const alertRequests = this.getSupportAlertRequests(); + if (!alertRequests.length) { + return ""; + } + + const labels = alertRequests.map((request) => { + const groupLabel = + request.groupCallsign || request.groupId || "Unknown Group"; + const typeLabel = this.getRequestTypeLabel( + request.type || "request", + ); + return `${groupLabel} ${typeLabel}`; + }); + + return `Support request alert: ${labels.join(", ")}`; + }, + getSortedGroups() { + return this.groups.slice().sort((left, right) => { + const leftDanger = (left.status || "") === "danger" ? 0 : 1; + const rightDanger = (right.status || "") === "danger" ? 0 : 1; + + if (leftDanger !== rightDanger) { + return leftDanger - rightDanger; + } + + const leftCallsign = left.callsign || left.groupId || ""; + const rightCallsign = right.callsign || right.groupId || ""; + return leftCallsign.localeCompare(rightCallsign); + }); + }, + isDispatchOrder(entry) { + return ( + !!entry.isDispatchOrder || (entry.type || "") === "dispatch_order" + ); + }, + formatTypeLabel(entry) { + const typeLabel = (entry.type || "task").replaceAll("_", " "); + return this.isDispatchOrder(entry) ? "dispatch order" : typeLabel; + }, + getRequestTypeLabel(typeID) { + switch (typeID) { + case "medevac_9line": + return "9-Line MEDEVAC"; + case "ace_lace": + return "ACE/LACE"; + case "fire_support": + return "Fire Support"; + case "air_support": + return "Air Support"; + case "logreq": + return "LOGREQ"; + default: + return (typeID || "request").replaceAll("_", " "); + } + }, + buildGroupOptions(selectedGroupID) { + return this.getSortedGroups() + .map((group) => { + const groupID = group.groupId || ""; + return ``; + }) + .join(""); + }, + buildTaskTypeOptions(selectedTaskType) { + return this.taskTypes + .map((taskType) => { + const value = taskType.value || ""; + const selected = value === selectedTaskType ? "selected" : ""; + return ``; + }) + .join(""); + }, + formatRequestFieldLabel(fieldID) { + return (fieldID || "field") + .replaceAll("_", " ") + .replace(/\b\w/g, (character) => character.toUpperCase()); + }, + formatRequestFieldValue(value) { + if (Array.isArray(value)) { + return value.join(", "); + } + + if (value && typeof value === "object") { + return JSON.stringify(value); + } + + const text = String(value ?? "").trim(); + return text || "Not provided"; + }, + buildRequestOrderNote(request) { + const typeLabel = this.getRequestTypeLabel(request.type || "request"); + const groupLabel = + request.groupCallsign || request.groupId || "Unknown Group"; + const summary = (request.summary || "").trim(); + const fieldDetails = + request.fields && typeof request.fields === "object" + ? Object.entries(request.fields) + .map(([fieldID, value]) => { + const fieldValue = + this.formatRequestFieldValue(value); + if (fieldValue === "Not provided") { + return ""; + } + + return `${this.formatRequestFieldLabel(fieldID)} ${fieldValue}`; + }) + .filter(Boolean) + : []; + const details = fieldDetails.length + ? fieldDetails + : [summary].filter(Boolean); + + return details.length + ? `${typeLabel} requested by ${groupLabel}. ${details.join(" | ")}` + : `${typeLabel} requested by ${groupLabel}.`; + }, +}; diff --git a/arma/client/addons/cad/ui/src/dispatcher/index.js b/arma/client/addons/cad/ui/src/dispatcher/index.js new file mode 100644 index 0000000..7331fbd --- /dev/null +++ b/arma/client/addons/cad/ui/src/dispatcher/index.js @@ -0,0 +1,326 @@ +const dispatcherFormatters = window.cadDispatcherFormatters || {}; +const dispatcherModals = window.cadDispatcherModals || {}; +const dispatcherRender = window.cadDispatcherRender || {}; + +window.cadDispatcher = { + contracts: [], + requests: [], + groups: [], + activity: [], + session: {}, + editingGroupId: "", + viewingRequestId: "", + convertingRequestId: "", + taskTypes: [ + { value: "attack", label: "Attack" }, + { value: "defend", label: "Defend" }, + { value: "delivery", label: "Delivery" }, + { value: "destroy", label: "Destroy" }, + { value: "defuse", label: "Defuse" }, + { value: "hostage", label: "Hostage" }, + { value: "hvtkill", label: "Kill HVT" }, + { value: "hvtcapture", label: "Capture HVT" }, + ], + statuses: [ + "available", + "en_route", + "on_task", + "holding", + "danger", + "unavailable", + ], + roles: ["infantry", "recon", "armor", "air", "logistics", "support"], + ...dispatcherFormatters, + ...dispatcherModals, + ...dispatcherRender, + init() { + document + .getElementById("dispatcherRequestTaskBtn") + .addEventListener("click", () => { + this.openTaskModal(); + }); + + document + .getElementById("dispatcherCreateOrderBtn") + .addEventListener("click", () => { + this.openOrderModal(); + }); + + document + .getElementById("dispatcherGroupModalCloseBtn") + .addEventListener("click", () => { + this.closeGroupModal(); + }); + + document + .getElementById("dispatcherGroupModalSaveBtn") + .addEventListener("click", () => { + this.applyGroupUpdates(); + }); + + document + .querySelector("#dispatcherGroupModal .dispatch-modal-backdrop") + .addEventListener("click", () => { + this.closeGroupModal(); + }); + + document + .getElementById("dispatcherOrderModalCloseBtn") + .addEventListener("click", () => { + this.closeOrderModal(); + }); + + document + .getElementById("dispatcherOrderModalSaveBtn") + .addEventListener("click", () => { + this.createDispatchOrder(); + }); + + document + .querySelector("#dispatcherOrderModal .dispatch-modal-backdrop") + .addEventListener("click", () => { + this.closeOrderModal(); + }); + + document + .getElementById("dispatcherTaskModalCloseBtn") + .addEventListener("click", () => { + this.closeTaskModal(); + }); + + document + .getElementById("dispatcherTaskModalSaveBtn") + .addEventListener("click", () => { + this.requestGeneratedTask(); + }); + + document + .querySelector("#dispatcherTaskModal .dispatch-modal-backdrop") + .addEventListener("click", () => { + this.closeTaskModal(); + }); + + document + .getElementById("dispatcherRequestModalCloseBtn") + .addEventListener("click", () => { + this.closeRequestModal(); + }); + + document + .getElementById("dispatcherRequestModalDoneBtn") + .addEventListener("click", () => { + this.closeRequestModal(); + }); + + document + .getElementById("dispatcherRequestConvertBtn") + .addEventListener("click", () => { + this.convertViewedRequestToOrder(); + }); + + document + .querySelector("#dispatcherRequestModal .dispatch-modal-backdrop") + .addEventListener("click", () => { + this.closeRequestModal(); + }); + + window.mapUI.sendEvent("cad::dispatcher::ready", {}); + }, + receiveHydrate(payload) { + this.contracts = Array.isArray(payload.contracts) + ? payload.contracts + : []; + this.requests = Array.isArray(payload.requests) ? payload.requests : []; + this.groups = Array.isArray(payload.groups) ? payload.groups : []; + this.activity = Array.isArray(payload.activity) ? payload.activity : []; + this.session = + payload.session && typeof payload.session === "object" + ? payload.session + : {}; + + const statusEl = document.getElementById("dispatcherStatusMessage"); + if ( + statusEl && + (!statusEl.dataset.type || statusEl.dataset.type === "info") + ) { + this.setStatus("", ""); + } + + this.syncOpenModal(); + this.syncOrderModal(); + this.syncRequestModal(); + this.render(); + }, + setStatus(message, type) { + const statusEl = document.getElementById("dispatcherStatusMessage"); + if (!statusEl) { + return; + } + + statusEl.textContent = message || ""; + statusEl.dataset.type = type || ""; + }, + createDispatchOrder() { + const assigneeGroupID = document.getElementById( + "dispatcherOrderAssigneeSelect", + ).value; + const targetGroupID = document.getElementById( + "dispatcherOrderTargetSelect", + ).value; + const priority = document.getElementById( + "dispatcherOrderPrioritySelect", + ).value; + const note = document.getElementById("dispatcherOrderNoteInput").value; + const sourceRequest = this.convertingRequestId + ? this.requests.find( + (entry) => + (entry.requestId || "") === this.convertingRequestId, + ) || null + : null; + + if (!assigneeGroupID || !targetGroupID) { + this.setStatus( + "Select both an assignee and a target group.", + "error", + ); + return; + } + + if (assigneeGroupID === targetGroupID) { + this.setStatus( + "Assignee and target groups must be different.", + "error", + ); + return; + } + + this.setStatus( + this.convertingRequestId + ? "Creating dispatch order from request..." + : "Creating dispatch order...", + "info", + ); + window.mapUI.sendEvent("cad::dispatchOrder::create", { + assigneeGroupID: assigneeGroupID, + targetGroupID: targetGroupID, + note: note.trim(), + priority: priority, + request: sourceRequest + ? { + requestId: sourceRequest.requestId || "", + type: sourceRequest.type || "", + title: sourceRequest.title || "", + summary: sourceRequest.summary || "", + fields: + sourceRequest.fields && + typeof sourceRequest.fields === "object" + ? sourceRequest.fields + : {}, + } + : {}, + }); + + this.closeOrderModal(); + }, + requestGeneratedTask() { + const taskType = document.getElementById( + "dispatcherTaskTypeSelect", + ).value; + if (!taskType) { + this.setStatus( + "Select a task type before requesting a task.", + "error", + ); + return; + } + + this.setStatus("Requesting generated task...", "info"); + window.mapUI.sendEvent("cad::generatedTask::request", { + taskType: taskType, + }); + this.closeTaskModal(); + }, + assignTask(taskID) { + const selector = document.getElementById( + `dispatcher-assign-group-${taskID}`, + ); + if (!selector || !selector.value) { + this.setStatus( + "Select a group before assigning a contract.", + "error", + ); + return; + } + + this.setStatus("Submitting assignment...", "info"); + window.mapUI.sendEvent("cad::tasks::assign", { + taskID: taskID, + groupID: selector.value, + note: "", + }); + }, + applyGroupUpdates() { + if (!this.editingGroupId) { + return; + } + + const group = this.groups.find( + (entry) => entry.groupId === this.editingGroupId, + ); + if (!group) { + this.closeGroupModal(); + return; + } + + const roleValue = document.getElementById( + "dispatcherModalRoleSelect", + ).value; + const statusValue = document.getElementById( + "dispatcherModalStatusSelect", + ).value; + const nextRole = + roleValue && roleValue !== (group.role || "") ? roleValue : ""; + const nextStatus = + statusValue && statusValue !== (group.status || "") + ? statusValue + : ""; + const hasChanges = nextRole || nextStatus; + + if (!hasChanges) { + this.setStatus("No group changes to save.", "info"); + this.closeGroupModal(); + return; + } + + this.setStatus("Updating group profile...", "info"); + window.mapUI.sendEvent("cad::groups::profile", { + groupID: this.editingGroupId, + role: nextRole, + status: nextStatus, + }); + + this.closeGroupModal(); + }, + closeDispatchOrder(taskID) { + if (!taskID) { + return; + } + + this.setStatus("Closing dispatch order...", "info"); + window.mapUI.sendEvent("cad::dispatchOrder::close", { + taskID: taskID, + }); + }, + closeSupportRequest(requestID) { + if (!requestID) { + return; + } + + this.setStatus("Closing support request...", "info"); + window.mapUI.sendEvent("cad::supportRequest::close", { + requestID: requestID, + }); + }, +}; + +window.cadDispatcher.init(); diff --git a/arma/client/addons/cad/ui/src/dispatcher/modals.js b/arma/client/addons/cad/ui/src/dispatcher/modals.js new file mode 100644 index 0000000..ab0393f --- /dev/null +++ b/arma/client/addons/cad/ui/src/dispatcher/modals.js @@ -0,0 +1,292 @@ +window.cadDispatcherModals = { + openTaskModal() { + this.populateTaskModal(); + document + .getElementById("dispatcherTaskModal") + .classList.remove("is-hidden"); + }, + closeTaskModal() { + document + .getElementById("dispatcherTaskModal") + .classList.add("is-hidden"); + }, + populateTaskModal() { + const taskTypeSelect = document.getElementById( + "dispatcherTaskTypeSelect", + ); + if (!taskTypeSelect) { + return; + } + + taskTypeSelect.innerHTML = this.buildTaskTypeOptions( + taskTypeSelect.value || this.taskTypes[0]?.value || "", + ); + }, + openOrderModal() { + this.convertingRequestId = ""; + this.populateOrderModal(); + document.getElementById("dispatcherOrderModalTitle").textContent = + "Create Support Order"; + document + .getElementById("dispatcherOrderModal") + .classList.remove("is-hidden"); + }, + closeOrderModal() { + this.convertingRequestId = ""; + document.getElementById("dispatcherOrderNoteInput").value = ""; + document.getElementById("dispatcherOrderPrioritySelect").value = + "priority"; + document.getElementById("dispatcherOrderModalTitle").textContent = + "Create Support Order"; + document + .getElementById("dispatcherOrderModal") + .classList.add("is-hidden"); + }, + openRequestModal(requestID) { + const request = this.requests.find( + (entry) => entry.requestId === requestID, + ); + if (!request) { + return; + } + + this.viewingRequestId = requestID; + this.populateRequestModal(request); + document + .getElementById("dispatcherRequestModal") + .classList.remove("is-hidden"); + }, + closeRequestModal() { + this.viewingRequestId = ""; + document + .getElementById("dispatcherRequestModal") + .classList.add("is-hidden"); + }, + syncRequestModal() { + if (!this.viewingRequestId) { + return; + } + + const request = this.requests.find( + (entry) => entry.requestId === this.viewingRequestId, + ); + if (!request) { + this.closeRequestModal(); + return; + } + + this.populateRequestModal(request); + }, + populateRequestModal(request) { + const fields = + request.fields && typeof request.fields === "object" + ? Object.entries(request.fields) + : []; + const fieldsHTML = fields.length + ? fields + .map( + ([fieldID, value]) => ` +
+ ${this.formatRequestFieldLabel(fieldID)} + ${this.formatRequestFieldValue(value)} +
+ `, + ) + .join("") + : '

No submitted fields.

'; + + document.getElementById("dispatcherRequestTitle").textContent = + request.title || request.requestId || "Support Request"; + document.getElementById("dispatcherRequestPriority").textContent = ( + request.priority || "priority" + ).replaceAll("_", " "); + document.getElementById("dispatcherRequestGroup").textContent = + request.groupCallsign || request.groupId || "Unknown"; + document.getElementById("dispatcherRequestType").textContent = + this.getRequestTypeLabel(request.type || "request"); + document.getElementById("dispatcherRequestSummary").textContent = + request.summary || "No summary provided."; + document.getElementById("dispatcherRequestFields").innerHTML = + fieldsHTML; + }, + convertRequestToOrder(requestID) { + const request = this.requests.find( + (entry) => (entry.requestId || "") === requestID, + ); + if (!request) { + this.setStatus("Selected request is no longer available.", "error"); + return; + } + + const targetGroupID = request.groupId || ""; + if (!targetGroupID) { + this.setStatus( + "Selected request has no owning group to target.", + "error", + ); + return; + } + + const targetGroup = this.groups.find( + (group) => (group.groupId || "") === targetGroupID, + ); + if (!targetGroup) { + this.setStatus( + "Selected request group is no longer available.", + "error", + ); + return; + } + + this.convertingRequestId = requestID; + this.populateOrderModal({ + selectedAssigneeID: + this.getSortedGroups().find( + (group) => (group.groupId || "") !== targetGroupID, + )?.groupId || "", + selectedTargetID: targetGroupID, + note: this.buildRequestOrderNote(request), + priority: request.priority || "priority", + }); + document.getElementById("dispatcherOrderModalTitle").textContent = + "Create Order From Request"; + document + .getElementById("dispatcherOrderModal") + .classList.remove("is-hidden"); + this.setStatus("Preparing dispatch order from request...", "info"); + }, + convertViewedRequestToOrder() { + if (!this.viewingRequestId) { + return; + } + + const requestID = this.viewingRequestId; + this.closeRequestModal(); + this.convertRequestToOrder(requestID); + }, + populateOrderModal(options = {}) { + const sortedGroups = this.getSortedGroups(); + const assigneeSelect = document.getElementById( + "dispatcherOrderAssigneeSelect", + ); + const targetSelect = document.getElementById( + "dispatcherOrderTargetSelect", + ); + const noteInput = document.getElementById("dispatcherOrderNoteInput"); + const prioritySelect = document.getElementById( + "dispatcherOrderPrioritySelect", + ); + if (!assigneeSelect || !targetSelect) { + return; + } + + const selectedAssigneeID = options.selectedAssigneeID || ""; + const selectedTargetID = options.selectedTargetID || ""; + const fallbackAssignee = + selectedAssigneeID || + sortedGroups.find( + (group) => (group.groupId || "") !== selectedTargetID, + )?.groupId || + sortedGroups[0]?.groupId || + ""; + const fallbackTarget = + selectedTargetID || + sortedGroups.find( + (group) => (group.groupId || "") !== fallbackAssignee, + )?.groupId || + sortedGroups[0]?.groupId || + ""; + + assigneeSelect.innerHTML = this.buildGroupOptions(fallbackAssignee); + targetSelect.innerHTML = this.buildGroupOptions(fallbackTarget); + if (noteInput) { + noteInput.value = options.note || ""; + } + if (prioritySelect) { + prioritySelect.value = options.priority || "priority"; + } + }, + syncOrderModal() { + const modalEl = document.getElementById("dispatcherOrderModal"); + if (!modalEl || modalEl.classList.contains("is-hidden")) { + return; + } + + this.populateOrderModal({ + selectedAssigneeID: + document.getElementById("dispatcherOrderAssigneeSelect") + ?.value || "", + selectedTargetID: + document.getElementById("dispatcherOrderTargetSelect")?.value || + "", + note: + document.getElementById("dispatcherOrderNoteInput")?.value || + "", + priority: + document.getElementById("dispatcherOrderPrioritySelect") + ?.value || "priority", + }); + }, + openGroupModal(groupID) { + const group = this.groups.find((entry) => entry.groupId === groupID); + if (!group) { + return; + } + + this.editingGroupId = groupID; + document.getElementById("dispatcherModalGroupCallsign").textContent = + group.callsign || group.groupId || "Unknown"; + document.getElementById("dispatcherModalGroupLeader").textContent = + group.leaderName || "Unknown"; + document.getElementById("dispatcherModalGroupTask").textContent = + group.currentTaskId || "None"; + document.getElementById("dispatcherModalGroupOrg").textContent = + group.orgId || "default"; + document.getElementById("dispatcherModalRoleSelect").innerHTML = + this.roles + .map( + (role) => + ``, + ) + .join(""); + document.getElementById("dispatcherModalStatusSelect").innerHTML = + this.statuses + .map( + (status) => + ``, + ) + .join(""); + + document + .getElementById("dispatcherGroupModal") + .classList.remove("is-hidden"); + }, + closeGroupModal() { + this.editingGroupId = ""; + document + .getElementById("dispatcherGroupModal") + .classList.add("is-hidden"); + }, + syncOpenModal() { + if (!this.editingGroupId) { + return; + } + + const group = this.groups.find( + (entry) => entry.groupId === this.editingGroupId, + ); + if (!group) { + this.closeGroupModal(); + return; + } + + document.getElementById("dispatcherModalGroupCallsign").textContent = + group.callsign || group.groupId || "Unknown"; + document.getElementById("dispatcherModalGroupLeader").textContent = + group.leaderName || "Unknown"; + document.getElementById("dispatcherModalGroupTask").textContent = + group.currentTaskId || "None"; + document.getElementById("dispatcherModalGroupOrg").textContent = + group.orgId || "default"; + }, +}; diff --git a/arma/client/addons/cad/ui/src/dispatcher/render.js b/arma/client/addons/cad/ui/src/dispatcher/render.js new file mode 100644 index 0000000..022745e --- /dev/null +++ b/arma/client/addons/cad/ui/src/dispatcher/render.js @@ -0,0 +1,325 @@ +window.cadDispatcherRender = { + updateDangerAlert() { + const alertEl = document.getElementById("dispatcherDangerAlert"); + if (!alertEl) { + return; + } + + const dangerGroups = this.getDangerGroups(); + if (!dangerGroups.length) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + const callsigns = dangerGroups.map( + (group) => group.callsign || group.groupId || "Unknown Group", + ); + alertEl.textContent = `Danger alert active: ${callsigns.join(", ")}`; + alertEl.classList.remove("is-hidden"); + }, + updateRequestAlert() { + const alertEl = document.getElementById("dispatcherRequestAlert"); + if (!alertEl) { + return; + } + + const alertMessage = this.buildSupportAlertMessage(); + if (!alertMessage) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + alertEl.textContent = alertMessage; + alertEl.classList.remove("is-hidden"); + }, + buildGroupEditorButton(groupID) { + return ` + + `; + }, + buildCloseOrderButton(taskID) { + return ` + + `; + }, + buildCloseRequestButton(requestID) { + return ` + + `; + }, + buildConvertRequestButton(requestID) { + return ` + + `; + }, + renderMetrics() { + const assignedContracts = this.contracts.filter( + (entry) => (entry.assignmentState || "unassigned") !== "unassigned", + ); + const openContracts = this.contracts.filter( + (entry) => (entry.assignmentState || "unassigned") === "unassigned", + ); + const openRequests = this.requests.length; + const supportAlertRequests = this.getSupportAlertRequests(); + const dangerGroups = this.groups.filter( + (group) => (group.status || "") === "danger", + ); + + document.getElementById("metricOpenContracts").textContent = + openContracts.length; + document.getElementById("metricAssignedContracts").textContent = + assignedContracts.length; + document.getElementById("metricActiveGroups").textContent = + this.groups.length; + document.getElementById("metricOpenRequests").textContent = + openRequests; + document.getElementById("metricDangerGroups").textContent = + dangerGroups.length; + + const dangerMetricCard = document.getElementById( + "metricDangerGroupsCard", + ); + if (dangerMetricCard) { + dangerMetricCard.classList.toggle( + "is-danger", + dangerGroups.length > 0, + ); + } + + const requestMetricCard = document.getElementById( + "metricOpenRequestsCard", + ); + if (requestMetricCard) { + requestMetricCard.classList.toggle( + "is-warning", + supportAlertRequests.length > 0, + ); + } + }, + renderOpenContracts() { + const container = document.getElementById("dispatcherOpenContracts"); + const openContracts = this.contracts.filter( + (entry) => (entry.assignmentState || "unassigned") === "unassigned", + ); + + if (!openContracts.length) { + container.innerHTML = + '

No open contracts.

'; + return; + } + + const groupOptions = this.buildGroupOptions(""); + + container.innerHTML = openContracts + .map((task) => { + const taskId = task.taskId || task.taskID || ""; + const position = Array.isArray(task.position) + ? task.position + : [0, 0, 0]; + const targetGroup = this.groups.find( + (group) => group.groupId === (task.targetGroupId || ""), + ); + + return ` +
+
+ ${task.title || taskId} + ${this.formatTypeLabel(task)} +
+

${task.description || ""}

+
+ Unassigned + ${window.mapUI.formatPosition(position)} +
+
+ Target: ${targetGroup ? targetGroup.callsign : task.targetGroupCallsign || "None"} + Priority: ${(task.priority || "priority").replaceAll("_", " ")} +
+
+ + +
+
+ `; + }) + .join(""); + }, + renderAssignedContracts() { + const container = document.getElementById( + "dispatcherAssignedContracts", + ); + const assignedContracts = this.contracts.filter( + (entry) => (entry.assignmentState || "unassigned") !== "unassigned", + ); + + if (!assignedContracts.length) { + container.innerHTML = + '

No assigned contracts.

'; + return; + } + + container.innerHTML = assignedContracts + .map((task) => { + const taskId = task.taskId || task.taskID || ""; + const assignedGroup = this.groups.find( + (group) => group.groupId === (task.assignedGroupId || ""), + ); + const targetGroup = this.groups.find( + (group) => group.groupId === (task.targetGroupId || ""), + ); + const isDispatchOrder = this.isDispatchOrder(task); + + return ` +
+
+ ${task.title || taskId} + ${task.assignmentState || "assigned"} +
+

${task.description || ""}

+
+ Group: ${assignedGroup ? assignedGroup.callsign : task.assignedGroupId || "Unknown"} + Type: ${this.formatTypeLabel(task)} +
+
+ Target: ${targetGroup ? targetGroup.callsign : task.targetGroupCallsign || "None"} + Priority: ${(task.priority || "priority").replaceAll("_", " ")} +
+ ${isDispatchOrder ? `
${this.buildCloseOrderButton(taskId)}
` : ""} +
+ `; + }) + .join(""); + }, + renderGroups() { + const container = document.getElementById("dispatcherGroups"); + if (!this.groups.length) { + container.innerHTML = + '

No active groups available.

'; + return; + } + + container.innerHTML = this.getSortedGroups() + .map((group) => { + const isDanger = (group.status || "") === "danger"; + return ` +
+
+
+ ${group.callsign || group.groupId} + ${group.role || "group"} + ${isDanger ? 'Danger' : ""} +
+
+ ${this.buildGroupEditorButton(group.groupId)} +
+
+
+ Leader: ${group.leaderName || "Unknown"} + Status: ${group.status || "unknown"} +
+
+ Org: ${group.orgId || "default"} + Task: ${group.currentTaskId || "None"} +
+
+ `; + }) + .join(""); + }, + renderActivity() { + const container = document.getElementById("dispatcherActivity"); + const requestsHTML = this.requests.length + ? this.requests + .map( + (request) => ` +
+
+ ${request.title || request.requestId || "Support Request"} + ${(request.priority || "priority").replaceAll("_", " ")} +
+

${request.summary || ""}

+
+ Group: ${request.groupCallsign || request.groupId || "Unknown"} + ${this.getRequestTypeLabel(request.type || "request")} +
+
+ ${this.buildConvertRequestButton(request.requestId || "")} + ${this.buildCloseRequestButton(request.requestId || "")} +
+
+ `, + ) + .join("") + : '

No active support requests.

'; + + const activityHTML = this.activity.length + ? this.activity + .slice() + .reverse() + .slice(0, 8) + .map( + (entry) => ` +
+
+ ${entry.type || "activity"} + ${Math.round(entry.timestamp || 0)}s +
+

${entry.message || ""}

+
+ `, + ) + .join("") + : '

No recent activity.

'; + + container.innerHTML = ` +
+
Support Requests
+ ${requestsHTML} +
+
+
Recent Activity
+ ${activityHTML} +
+ `; + }, + render() { + this.updateDangerAlert(); + this.updateRequestAlert(); + this.renderMetrics(); + this.renderOpenContracts(); + this.renderAssignedContracts(); + this.renderGroups(); + this.renderActivity(); + }, +}; diff --git a/arma/client/addons/cad/ui/src/shared.js b/arma/client/addons/cad/ui/src/shared.js new file mode 100644 index 0000000..d1b3813 --- /dev/null +++ b/arma/client/addons/cad/ui/src/shared.js @@ -0,0 +1,74 @@ +/** + * Shared JavaScript for Map UI + * Provides common utilities and state management across all UI components + */ + +window.mapUIState = { + layersPanelVisible: true, + sidePanelElement: null, +}; + +window.mapUI = { + formatGridCoordinate(value) { + return Math.round(Number(value) || 0) + .toString() + .padStart(4, "0"); + }, + formatPosition(position) { + const safePosition = Array.isArray(position) ? position : [0, 0, 0]; + return `X: ${this.formatGridCoordinate(safePosition[0])} Y: ${this.formatGridCoordinate(safePosition[1])}`; + }, + sendEvent(event, data) { + A3API.SendAlert(JSON.stringify({ event: event, data: data })); + }, + updateCoordinates(x, y) { + const coordDisplay = document.getElementById("coordsDisplay"); + if (coordDisplay) { + coordDisplay.textContent = this.formatPosition([x, y, 0]); + } + }, + updateScale(scale) { + const scaleDisplay = document.getElementById("scaleDisplay"); + if (scaleDisplay) { + scaleDisplay.textContent = `Scale: 1:${Math.round(scale)}`; + } + }, + updateStatus(text) { + const statusText = document.getElementById("statusText"); + if (statusText) { + statusText.textContent = text; + } + }, +}; + +window.updateCoordinates = window.mapUI.updateCoordinates; +window.updateScale = window.mapUI.updateScale; +window.updateStatus = window.mapUI.updateStatus; + +window.ForgeBridge = window.ForgeBridge || { + _handlers: {}, + on(event, handler) { + this._handlers[event] = this._handlers[event] || []; + this._handlers[event].push(handler); + }, + ready(payload) { + window.mapUI.sendEvent("cad::ready", payload || {}); + return true; + }, + receive(payload) { + if (!payload || typeof payload !== "object") { + return; + } + + const handlers = this._handlers[payload.event] || []; + handlers.forEach((handler) => handler(payload.data || {})); + }, + send(event, data) { + window.mapUI.sendEvent(event, data || {}); + return true; + }, + close(data) { + window.mapUI.sendEvent("map::close", data || {}); + return true; + }, +}; diff --git a/arma/client/addons/cad/ui/src/sidepanel.html b/arma/client/addons/cad/ui/src/sidepanel.html new file mode 100644 index 0000000..1838951 --- /dev/null +++ b/arma/client/addons/cad/ui/src/sidepanel.html @@ -0,0 +1,190 @@ + + + + + + +
+

CAD System

+
+
+
+ + +
+ + + + +
+
+
+
Contracts
+
+
+

Loading contracts...

+
+
+
+
+
Roster
+
+
+

Loading roster...

+
+
+
+
+
Support Requests
+
+
+

No support requests.

+
+
+
+
+
Activity
+
+
+

No recent activity.

+
+
+
+
+
+ + + + + + diff --git a/arma/client/addons/cad/ui/src/sidepanel.js b/arma/client/addons/cad/ui/src/sidepanel.js new file mode 100644 index 0000000..a247a3b --- /dev/null +++ b/arma/client/addons/cad/ui/src/sidepanel.js @@ -0,0 +1,1328 @@ +window.cadTasks = { + contracts: [], + requests: [], + groups: [], + activity: [], + session: {}, + mode: "operations", + dispatchView: "board", + activeTab: "contracts", + selectedDispatchGroupId: "", + selectedDispatchTaskId: "", + selectedDispatchRequestId: "", + selectedRosterMemberUid: "", + focusStatusTimer: null, + requestModalType: "", + statuses: [ + "available", + "en_route", + "on_task", + "holding", + "danger", + "unavailable", + ], + roles: ["infantry", "recon", "armor", "air", "logistics", "support"], + requestTypes: [ + { + id: "medevac_9line", + label: "9-Line MEDEVAC", + defaultPriority: "emergency", + fields: [ + { + id: "pickup_location", + label: "Line 1 Pickup Location", + type: "text", + defaultFromGroupPosition: true, + }, + { + id: "radio_freq", + label: "Line 2 Radio / Call Sign", + type: "text", + }, + { + id: "precedence", + label: "Line 3 Precedence", + type: "select", + options: [ + "urgent", + "urgent_surgical", + "priority", + "routine", + "convenience", + ], + }, + { + id: "special_equipment", + label: "Line 4 Special Equipment", + type: "select", + options: ["none", "hoist", "extraction", "ventilator"], + }, + { + id: "patient_type", + label: "Line 5 Patient Type", + type: "select", + options: ["litter", "ambulatory", "mixed"], + }, + { + id: "security", + label: "Line 6 Security", + type: "select", + options: [ + "secure", + "possible_enemy", + "enemy_in_area", + "hot", + ], + }, + { + id: "marking", + label: "Line 7 Marking", + type: "select", + options: ["panels", "smoke", "ir", "none", "other"], + }, + { + id: "patient_nationality", + label: "Line 8 Patient Nationality", + type: "select", + options: ["coalition", "civilian", "enemy", "epw", "mixed"], + }, + { + id: "terrain", + label: "Line 9 Terrain", + type: "select", + options: [ + "flat", + "restricted", + "slope", + "rooftop", + "wooded", + ], + }, + ], + }, + { + id: "ace_lace", + label: "ACE/LACE", + defaultPriority: "routine", + fields: [ + { id: "ammo", label: "Ammo", type: "textarea" }, + { id: "casualties", label: "Casualties", type: "textarea" }, + { id: "equipment", label: "Equipment", type: "textarea" }, + { id: "notes", label: "Notes", type: "textarea" }, + ], + }, + { + id: "fire_support", + label: "Fire Support", + defaultPriority: "priority", + fields: [ + { + id: "target_location", + label: "Target Location", + type: "text", + defaultFromGroupPosition: true, + }, + { + id: "target_description", + label: "Target Description", + type: "textarea", + }, + { + id: "requested_effect", + label: "Requested Effect", + type: "select", + options: [ + "suppress", + "destroy", + "illum", + "smoke", + "screen", + ], + }, + { id: "ordnance", label: "Requested Ordnance", type: "text" }, + { + id: "danger_close", + label: "Danger Close", + type: "select", + options: ["no", "yes"], + }, + { id: "remarks", label: "Remarks", type: "textarea" }, + ], + }, + { + id: "air_support", + label: "Air Support", + defaultPriority: "priority", + fields: [ + { + id: "target_location", + label: "Target Location", + type: "text", + defaultFromGroupPosition: true, + }, + { + id: "target_description", + label: "Target Description", + type: "textarea", + }, + { + id: "target_marking", + label: "Target Marking", + type: "select", + options: ["smoke", "ir", "laser", "grid", "visual"], + }, + { + id: "requested_effect", + label: "Requested Effect", + type: "select", + options: [ + "show_of_force", + "escort", + "suppress", + "destroy", + "recon", + ], + }, + { id: "remarks", label: "Remarks", type: "textarea" }, + ], + }, + { + id: "logreq", + label: "LOGREQ", + defaultPriority: "priority", + fields: [ + { + id: "category", + label: "Category", + type: "select", + options: [ + "ammo", + "medical", + "fuel", + "repair", + "vehicle", + "equipment", + "weapons", + "mixed", + ], + }, + { + id: "delivery_method", + label: "Delivery Method", + type: "select", + options: [ + "ground", + "airdrop", + "pickup", + "dispatch_discretion", + ], + }, + { + id: "delivery_location", + label: "Delivery Location", + type: "text", + defaultFromGroupPosition: true, + }, + { + id: "requested_items", + label: "Requested Items", + type: "textarea", + }, + { + id: "quantity", + label: "Quantity / Package", + type: "text", + }, + { + id: "remarks", + label: "Remarks", + type: "textarea", + }, + ], + }, + ], + init() { + document.querySelectorAll(".cad-tab").forEach((tab) => { + tab.addEventListener("click", () => { + this.setActiveTab(tab.dataset.tab || "contracts"); + }); + }); + + document + .getElementById("cadRequestModalCloseBtn") + .addEventListener("click", () => { + this.closeRequestModal(); + }); + + document + .getElementById("cadRequestModalSaveBtn") + .addEventListener("click", () => { + this.submitSupportRequest(); + }); + + document + .querySelector("#cadRequestModal .cad-modal-backdrop") + .addEventListener("click", () => { + this.closeRequestModal(); + }); + + window.ForgeBridge.on("cad::hydrate", (payload) => { + this.setHydratePayload(payload || {}); + }); + + window.ForgeBridge.on("cad::assignment::response", (payload) => { + this.handleServerResponse(!!payload.success, payload.message || ""); + }); + + window.ForgeBridge.on("cad::group::response", (payload) => { + this.handleServerResponse(!!payload.success, payload.message || ""); + }); + + window.ForgeBridge.on("cad::request::response", (payload) => { + this.handleServerResponse(!!payload.success, payload.message || ""); + }); + + window.ForgeBridge.ready({ loaded: true }); + }, + setActiveTab(tabName) { + this.activeTab = tabName || "contracts"; + + document.querySelectorAll(".cad-tab").forEach((tab) => { + tab.classList.toggle( + "is-active", + tab.dataset.tab === this.activeTab, + ); + }); + + document.querySelectorAll("[data-panel]").forEach((panel) => { + panel.classList.toggle( + "is-active", + panel.dataset.panel === this.activeTab, + ); + }); + }, + syncLayoutState() { + const tabsEl = document.querySelector(".cad-tabs"); + const contractsTab = document.getElementById("tabContractsBtn"); + const rosterTab = document.getElementById("tabRosterBtn"); + const requestsTab = document.getElementById("tabRequestsBtn"); + const activityTab = document.getElementById("tabActivityBtn"); + const contractsPanel = document.getElementById("contractsPanel"); + const rosterPanel = document.getElementById("rosterPanel"); + const requestsPanel = document.getElementById("requestsPanel"); + const activityPanel = document.getElementById("activityPanel"); + const contractsHeader = contractsPanel?.querySelector( + ".cad-section-header", + ); + const rosterHeader = rosterPanel?.querySelector(".cad-section-header"); + + if (this.isDispatchMapMode()) { + if (tabsEl) { + tabsEl.style.display = ""; + tabsEl.classList.remove("is-two-col"); + tabsEl.classList.add("is-three-col"); + } + if (contractsTab) { + contractsTab.style.display = ""; + } + if (rosterTab) { + rosterTab.textContent = "Groups"; + } + if (activityTab) { + activityTab.style.display = "none"; + } + if (requestsTab) { + requestsTab.style.display = ""; + } + if (activityPanel) { + activityPanel.classList.remove("is-active"); + activityPanel.style.display = "none"; + } + if (requestsPanel) { + requestsPanel.style.display = ""; + } + if (rosterPanel) { + rosterPanel.style.display = ""; + } + if (rosterHeader) { + rosterHeader.textContent = "Active Groups"; + } + if (contractsPanel) { + contractsPanel.style.display = ""; + } + if (contractsHeader) { + contractsHeader.textContent = "Contracts"; + } + if (!["contracts", "roster", "requests"].includes(this.activeTab)) { + this.activeTab = "contracts"; + } + return; + } + + if (tabsEl) { + tabsEl.style.display = ""; + tabsEl.classList.remove("is-three-col"); + tabsEl.classList.remove("is-two-col"); + } + if (contractsTab) { + contractsTab.style.display = ""; + } + if (rosterTab) { + rosterTab.textContent = "Roster"; + } + if (activityTab) { + activityTab.style.display = ""; + } + if (requestsTab) { + requestsTab.style.display = ""; + } + if (contractsPanel) { + contractsPanel.style.display = ""; + } + if (activityPanel) { + activityPanel.style.display = ""; + } + if (requestsPanel) { + requestsPanel.style.display = ""; + } + if (rosterPanel) { + rosterPanel.style.display = ""; + } + if (rosterHeader) { + rosterHeader.textContent = "Roster"; + } + if (contractsHeader) { + contractsHeader.textContent = "Contracts"; + } + }, + setHydratePayload(payload) { + this.contracts = Array.isArray(payload.contracts) + ? payload.contracts + : []; + this.requests = Array.isArray(payload.requests) ? payload.requests : []; + this.groups = Array.isArray(payload.groups) ? payload.groups : []; + this.activity = Array.isArray(payload.activity) ? payload.activity : []; + this.session = + payload.session && typeof payload.session === "object" + ? payload.session + : {}; + this.mode = + payload && typeof payload.mode === "string" + ? payload.mode + : "operations"; + this.dispatchView = + payload && typeof payload.dispatchView === "string" + ? payload.dispatchView + : "board"; + + const statusEl = document.getElementById("cadStatusMessage"); + if ( + statusEl && + (!statusEl.dataset.type || statusEl.dataset.type === "info") + ) { + this.setStatus("", ""); + } + + if ( + this.selectedDispatchGroupId && + !this.groups.some( + (group) => group.groupId === this.selectedDispatchGroupId, + ) + ) { + this.selectedDispatchGroupId = ""; + } + + if (this.selectedRosterMemberUid) { + const memberExists = this.groups.some((group) => + this.normalizeCollection(group.members).some( + (member) => + (member.uid || "") === this.selectedRosterMemberUid, + ), + ); + + if (!memberExists) { + this.selectedRosterMemberUid = ""; + } + } + + if ( + this.selectedDispatchTaskId && + !this.contracts.some((task) => { + const taskId = task.taskId || task.taskID || ""; + return taskId === this.selectedDispatchTaskId; + }) + ) { + this.selectedDispatchTaskId = ""; + } + + if ( + this.selectedDispatchRequestId && + !this.requests.some( + (request) => + (request.requestId || "") === + this.selectedDispatchRequestId, + ) + ) { + this.selectedDispatchRequestId = ""; + } + + if ( + this.mode === "dispatch" && + this.dispatchView === "map" && + !["contracts", "roster", "requests"].includes(this.activeTab) + ) { + this.activeTab = "contracts"; + } + + this.render(); + }, + setStatus(message, type) { + const statusEl = document.getElementById("cadStatusMessage"); + if (!statusEl) { + return; + } + + statusEl.textContent = message || ""; + statusEl.dataset.type = type || ""; + }, + getDangerGroups() { + return this.groups.filter((group) => (group.status || "") === "danger"); + }, + getSupportAlertRequests() { + return this.requests.filter((request) => + ["medevac_9line", "fire_support", "air_support"].includes( + request.type || "", + ), + ); + }, + buildSupportAlertMessage() { + const alertRequests = this.getSupportAlertRequests(); + if (!alertRequests.length) { + return ""; + } + + const labels = alertRequests.map((request) => { + const groupLabel = + request.groupCallsign || request.groupId || "Unknown Group"; + const typeLabel = this.getRequestTypeLabel( + request.type || "request", + ); + return `${groupLabel} ${typeLabel}`; + }); + + return `Support request alert: ${labels.join(", ")}`; + }, + getCurrentGroupCoordinates() { + const currentGroup = this.getCurrentGroup(); + const position = Array.isArray(currentGroup?.position) + ? currentGroup.position + : [0, 0, 0]; + return window.mapUI.formatPosition(position); + }, + getSortedGroups() { + return this.groups.slice().sort((left, right) => { + const leftDanger = (left.status || "") === "danger" ? 0 : 1; + const rightDanger = (right.status || "") === "danger" ? 0 : 1; + + if (leftDanger !== rightDanger) { + return leftDanger - rightDanger; + } + + const leftCallsign = left.callsign || left.groupId || ""; + const rightCallsign = right.callsign || right.groupId || ""; + return leftCallsign.localeCompare(rightCallsign); + }); + }, + isDispatchOrder(entry) { + return ( + !!entry.isDispatchOrder || (entry.type || "") === "dispatch_order" + ); + }, + formatTypeLabel(entry) { + const typeLabel = (entry.type || "task").replaceAll("_", " "); + return this.isDispatchOrder(entry) ? "dispatch order" : typeLabel; + }, + getRequestDefinition(typeID) { + return this.requestTypes.find((entry) => entry.id === typeID) || null; + }, + getRequestTypeLabel(typeID) { + return this.getRequestDefinition(typeID)?.label || typeID; + }, + canSubmitSupportRequest() { + return this.mode === "operations" && this.isLeader(); + }, + openRequestModal(typeID) { + const definition = this.getRequestDefinition(typeID); + if (!definition) { + return; + } + + this.requestModalType = typeID; + document.getElementById("cadRequestModalTitle").textContent = + definition.label; + document.getElementById("cadRequestPrioritySelect").value = + definition.defaultPriority || "priority"; + this.renderRequestFields(definition); + document + .getElementById("cadRequestModal") + .classList.remove("is-hidden"); + }, + closeRequestModal() { + this.requestModalType = ""; + document.getElementById("cadRequestFields").innerHTML = ""; + document.getElementById("cadRequestModal").classList.add("is-hidden"); + }, + renderRequestFields(definition) { + const container = document.getElementById("cadRequestFields"); + if (!container || !definition) { + return; + } + + const coords = this.getCurrentGroupCoordinates(); + container.innerHTML = definition.fields + .map((field) => { + const defaultValue = field.defaultFromGroupPosition + ? coords + : ""; + + if (field.type === "select") { + return ` + + `; + } + + if (field.type === "textarea") { + return ` + + `; + } + + return ` + + `; + }) + .join(""); + }, + submitSupportRequest() { + const definition = this.getRequestDefinition(this.requestModalType); + if (!definition) { + return; + } + + const fields = {}; + definition.fields.forEach((field) => { + const input = document.getElementById( + `cadRequestField_${field.id}`, + ); + fields[field.id] = input ? String(input.value || "").trim() : ""; + }); + + const priority = document.getElementById( + "cadRequestPrioritySelect", + ).value; + this.setStatus("Submitting support request...", "info"); + window.mapUI.sendEvent("cad::supportRequest::submit", { + type: definition.id, + fields: fields, + priority: priority, + }); + this.closeRequestModal(); + }, + closeSupportRequest(requestID) { + if (!requestID) { + return; + } + + this.setStatus( + this.isDispatchMode() + ? "Closing support request..." + : "Cancelling support request...", + "info", + ); + window.mapUI.sendEvent("cad::supportRequest::close", { + requestID: requestID, + }); + }, + renderRequests() { + const listEl = document.getElementById("requestList"); + if (!listEl) { + return; + } + + if (this.isDispatchMapMode()) { + const dispatchRequests = this.requests + .slice() + .sort((left, right) => { + const leftTitle = left.title || left.requestId || ""; + const rightTitle = right.title || right.requestId || ""; + return leftTitle.localeCompare(rightTitle); + }); + + if (!dispatchRequests.length) { + listEl.innerHTML = + '

No support requests are currently active.

'; + return; + } + + listEl.innerHTML = dispatchRequests + .map((request) => { + const requestID = request.requestId || ""; + const position = Array.isArray(request.position) + ? request.position + : [0, 0, 0]; + const isSelected = + requestID === this.selectedDispatchRequestId; + const isWarning = [ + "medevac_9line", + "fire_support", + "air_support", + ].includes(request.type || ""); + + return ` + + `; + }) + .join(""); + return; + } + + const requestButtons = this.canSubmitSupportRequest() + ? ` +
+ ${this.requestTypes + .map( + (requestType) => ` + + `, + ) + .join("")} +
+ ` + : ""; + + if (!this.requests.length) { + listEl.innerHTML = ` + ${requestButtons} +

No support requests are currently active.

+ `; + return; + } + + listEl.innerHTML = ` + ${requestButtons} + ${this.requests + .map((request) => { + const isOwnGroupLeader = + this.isLeader() && + (request.groupId || "") === this.getPlayerGroupId(); + const canClose = this.canDispatch() || isOwnGroupLeader; + const requestActionLabel = this.isDispatchMode() + ? "Close" + : "Cancel"; + const requestID = request.requestId || ""; + const isSelected = + requestID === this.selectedDispatchRequestId; + return ` +
+
+ ${request.title || this.getRequestTypeLabel(request.type || "")} + ${(request.priority || "priority").replaceAll("_", " ")} +
+

${request.summary || ""}

+
+ Group: ${request.groupCallsign || request.groupId || "Unknown"} + ${this.getRequestTypeLabel(request.type || "")} +
+ ${ + canClose + ? `
+ +
` + : "" + } +
+ `; + }) + .join("")} + `; + }, + updateDangerAlert() { + const alertEl = document.getElementById("cadDangerAlert"); + if (!alertEl) { + return; + } + + if (!this.isDispatchMapMode()) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + const dangerGroups = this.getDangerGroups(); + if (!dangerGroups.length) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + const callsigns = dangerGroups.map( + (group) => group.callsign || group.groupId || "Unknown Group", + ); + alertEl.textContent = `Danger alert active: ${callsigns.join(", ")}`; + alertEl.classList.remove("is-hidden"); + }, + updateRequestAlert() { + const alertEl = document.getElementById("cadRequestAlert"); + if (!alertEl) { + return; + } + + if (!this.isDispatchMapMode()) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + const alertMessage = this.buildSupportAlertMessage(); + if (!alertMessage) { + alertEl.textContent = ""; + alertEl.classList.add("is-hidden"); + return; + } + + alertEl.textContent = alertMessage; + alertEl.classList.remove("is-hidden"); + }, + clearFocusStatusSoon(message) { + if (this.focusStatusTimer) { + window.clearTimeout(this.focusStatusTimer); + } + + this.focusStatusTimer = window.setTimeout(() => { + const statusEl = document.getElementById("cadStatusMessage"); + if (!statusEl) { + return; + } + + if ( + statusEl.dataset.type === "info" && + statusEl.textContent === message + ) { + this.setStatus("", ""); + } + }, 1800); + }, + handleServerResponse(success, message) { + this.setStatus( + message || + (success ? "CAD update succeeded." : "CAD update failed."), + success ? "success" : "error", + ); + }, + acknowledgeTask(taskID) { + this.setStatus("Acknowledging contract...", "info"); + window.mapUI.sendEvent("cad::tasks::acknowledge", { taskID: taskID }); + }, + declineTask(taskID) { + this.setStatus("Declining contract...", "info"); + window.mapUI.sendEvent("cad::tasks::decline", { taskID: taskID }); + }, + updateGroupStatus(groupID, status) { + this.setStatus("Updating group status...", "info"); + window.mapUI.sendEvent("cad::groups::status", { + groupID: groupID, + status: status, + }); + }, + updateGroupRole(groupID, role) { + this.setStatus("Updating group role...", "info"); + window.mapUI.sendEvent("cad::groups::role", { + groupID: groupID, + role: role, + }); + }, + focusGroup(groupID) { + const group = this.groups.find((entry) => entry.groupId === groupID); + if (!group) { + this.setStatus("Selected group is no longer available.", "error"); + return; + } + + this.selectedDispatchGroupId = groupID; + this.selectedDispatchTaskId = ""; + this.selectedDispatchRequestId = ""; + this.selectedRosterMemberUid = ""; + const statusMessage = `Centering map on ${group.callsign || group.groupId || "group"}...`; + this.setStatus(statusMessage, "info"); + this.clearFocusStatusSoon(statusMessage); + window.mapUI.sendEvent("cad::groups::focus", { + groupID: groupID, + }); + this.render(); + }, + focusMember(uid) { + let selectedMember = null; + + this.groups.some((group) => + this.normalizeCollection(group.members).some((member) => { + if ((member.uid || "") !== uid) { + return false; + } + + selectedMember = member; + return true; + }), + ); + + if (!selectedMember) { + this.setStatus( + "Selected group member is no longer available.", + "error", + ); + return; + } + + const position = Array.isArray(selectedMember.position) + ? selectedMember.position + : []; + if (position.length < 2) { + this.setStatus( + "Selected group member has no map position.", + "error", + ); + return; + } + + this.selectedRosterMemberUid = uid; + this.selectedDispatchGroupId = ""; + this.selectedDispatchTaskId = ""; + this.selectedDispatchRequestId = ""; + const statusMessage = `Centering map on ${selectedMember.name || "group member"}...`; + this.setStatus(statusMessage, "info"); + this.clearFocusStatusSoon(statusMessage); + window.mapUI.sendEvent("cad::members::focus", { + uid: uid, + }); + this.render(); + }, + focusTask(taskID) { + const task = this.contracts.find((entry) => { + const entryTaskID = entry.taskId || entry.taskID || ""; + return entryTaskID === taskID; + }); + if (!task) { + this.setStatus( + "Selected contract is no longer available.", + "error", + ); + return; + } + + this.selectedDispatchTaskId = taskID; + this.selectedDispatchGroupId = ""; + this.selectedDispatchRequestId = ""; + this.selectedRosterMemberUid = ""; + const statusMessage = `Centering map on ${task.title || taskID}...`; + this.setStatus(statusMessage, "info"); + this.clearFocusStatusSoon(statusMessage); + window.mapUI.sendEvent("cad::tasks::focus", { + taskID: taskID, + }); + this.render(); + }, + focusRequest(requestID) { + const request = this.requests.find( + (entry) => (entry.requestId || "") === requestID, + ); + if (!request) { + this.setStatus("Selected request is no longer available.", "error"); + return; + } + + const position = Array.isArray(request.position) + ? request.position + : []; + if (position.length < 2) { + this.setStatus("Selected request has no map position.", "error"); + return; + } + + this.selectedDispatchRequestId = requestID; + this.selectedDispatchGroupId = ""; + this.selectedDispatchTaskId = ""; + this.selectedRosterMemberUid = ""; + const statusMessage = `Centering map on ${request.title || requestID}...`; + this.setStatus(statusMessage, "info"); + this.clearFocusStatusSoon(statusMessage); + window.mapUI.sendEvent("cad::requests::focus", { + requestID: requestID, + }); + this.render(); + }, + getPlayerGroupId() { + return this.session.groupId || ""; + }, + getCurrentGroup() { + const currentGroupId = this.getPlayerGroupId(); + return ( + this.groups.find((group) => group.groupId === currentGroupId) || + null + ); + }, + normalizeCollection(value) { + if (Array.isArray(value)) { + return value; + } + + if (value && typeof value === "object") { + return Object.values(value); + } + + return []; + }, + canDispatch() { + return !!this.session.isDispatcher; + }, + isDispatchMode() { + return this.mode === "dispatch"; + }, + isDispatchMapMode() { + return this.mode === "dispatch" && this.dispatchView === "map"; + }, + isLeader() { + return !!this.session.isLeader; + }, + renderContracts() { + const listEl = document.getElementById("taskList"); + if (!listEl) { + return; + } + + if (this.isDispatchMapMode()) { + if (!this.contracts.length) { + listEl.innerHTML = + '

No contracts are currently available.

'; + return; + } + + const dispatchContracts = this.contracts + .slice() + .sort((left, right) => { + const leftAssigned = + (left.assignmentState || "unassigned") === "unassigned" + ? 0 + : 1; + const rightAssigned = + (right.assignmentState || "unassigned") === "unassigned" + ? 0 + : 1; + + if (leftAssigned !== rightAssigned) { + return leftAssigned - rightAssigned; + } + + const leftId = left.taskId || left.taskID || ""; + const rightId = right.taskId || right.taskID || ""; + return leftId.localeCompare(rightId); + }); + + listEl.innerHTML = dispatchContracts + .map((task) => { + const taskId = task.taskId || task.taskID || ""; + const position = Array.isArray(task.position) + ? task.position + : [0, 0, 0]; + const assignedGroupId = task.assignedGroupId || ""; + const assignmentState = + task.assignmentState || "unassigned"; + const assignedGroup = this.groups.find( + (group) => group.groupId === assignedGroupId, + ); + const isSelected = taskId === this.selectedDispatchTaskId; + const stateLabel = + assignmentState === "unassigned" + ? "Unassigned" + : `${assignmentState}: ${assignedGroup ? assignedGroup.callsign : assignedGroupId || "Unknown"}`; + + return ` + + `; + }) + .join(""); + return; + } + + const currentGroupId = this.getPlayerGroupId(); + const visibleContracts = this.contracts.filter( + (task) => (task.assignedGroupId || "") === currentGroupId, + ); + + if (!visibleContracts.length) { + listEl.innerHTML = + '

No contract is currently assigned to your group.

'; + return; + } + + listEl.innerHTML = visibleContracts + .map((task) => { + const taskId = task.taskId || task.taskID || ""; + const position = Array.isArray(task.position) + ? task.position + : [0, 0, 0]; + const assignedGroupId = task.assignedGroupId || ""; + const assignmentState = task.assignmentState || "unassigned"; + const assignedGroup = this.groups.find( + (group) => group.groupId === assignedGroupId, + ); + const isAssignedToLeader = + this.isLeader() && assignedGroupId === currentGroupId; + const isSelected = taskId === this.selectedDispatchTaskId; + + return ` +
+
+ ${task.title || taskId} + ${this.formatTypeLabel(task)} +
+

${task.description || ""}

+
+ ${assignmentState === "unassigned" ? "Available" : `${assignmentState}: ${assignedGroup ? assignedGroup.callsign : assignedGroupId}`} + ${window.mapUI.formatPosition(position)} +
+ ${ + isAssignedToLeader && assignmentState === "assigned" + ? `
+ + +
` + : "" + } +
+ `; + }) + .join(""); + }, + renderRoster() { + const listEl = document.getElementById("rosterList"); + if (!listEl) { + return; + } + + if (this.isDispatchMapMode()) { + if (!this.groups.length) { + listEl.innerHTML = + '

No active groups are currently available.

'; + return; + } + + listEl.innerHTML = this.getSortedGroups() + .map((group) => { + const isSelected = + (group.groupId || "") === this.selectedDispatchGroupId; + const isDanger = (group.status || "") === "danger"; + return ` + + `; + }) + .join(""); + return; + } + + const currentGroup = this.getCurrentGroup(); + if (!currentGroup) { + listEl.innerHTML = + '

Your group is not currently available.

'; + return; + } + + const roster = this.normalizeCollection(currentGroup.members); + const isDanger = (currentGroup.status || "") === "danger"; + + if (!roster.length) { + listEl.innerHTML = + '

No roster members are currently available.

'; + return; + } + + listEl.innerHTML = ` +
+
+ ${currentGroup.callsign || currentGroup.groupId || "Current Group"} + ${roster.length} member${roster.length === 1 ? "" : "s"} + ${isDanger ? 'Danger' : ""} +
+
+ Leader: ${currentGroup.leaderName || "Unknown"} + Status: ${currentGroup.status || "unknown"} +
+
+ Role: ${currentGroup.role || "unassigned"} + Task: ${currentGroup.currentTaskId || "None"} +
+
+ ${roster + .map((member) => { + const lifeState = ( + member.lifeState || "unknown" + ).replaceAll("_", " "); + const leaderBadge = member.isLeader + ? 'Leader' + : ""; + const memberUid = member.uid || ""; + const isSelected = + memberUid && memberUid === this.selectedRosterMemberUid; + + return ` +
+
+ ${member.name || "Unknown Operator"} + ${lifeState} +
+
+ ${member.uid || "No UID"} + ${leaderBadge} +
+
+ `; + }) + .join("")} + `; + }, + renderActivity() { + const listEl = document.getElementById("activityList"); + if (!listEl) { + return; + } + + if (!this.activity.length) { + listEl.innerHTML = + '

No recent activity.

'; + return; + } + + listEl.innerHTML = this.activity + .slice() + .reverse() + .slice(0, 8) + .map( + (entry) => ` +
+
+ ${entry.type || "activity"} + ${Math.round(entry.timestamp || 0)}s +
+

${entry.message || ""}

+
+ `, + ) + .join(""); + }, + render() { + this.updateDangerAlert(); + this.updateRequestAlert(); + this.syncLayoutState(); + this.renderContracts(); + this.renderRoster(); + this.renderRequests(); + this.renderActivity(); + this.setActiveTab(this.activeTab); + }, +}; + +window.cadTasks.init(); diff --git a/arma/client/addons/cad/ui/src/styles/bottombar.css b/arma/client/addons/cad/ui/src/styles/bottombar.css new file mode 100644 index 0000000..b9468e2 --- /dev/null +++ b/arma/client/addons/cad/ui/src/styles/bottombar.css @@ -0,0 +1,40 @@ +body { + position: absolute; + bottom: 0; + left: 0; + right: 0; + min-height: 36px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20px; + background: linear-gradient( + 90deg, + rgba(14, 19, 27, 0.96), + rgba(18, 23, 32, 0.93) 55%, + rgba(13, 18, 25, 0.96) + ); + border-top: 1px solid rgba(255, 255, 255, 0.14); + box-shadow: 0 -12px 26px rgba(0, 0, 0, 0.24); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + overflow: hidden; +} + +.footer-brand, +.footer-version { + color: rgba(245, 248, 255, 0.8); + font-size: 12px; + text-shadow: 0 1px 10px rgba(0, 0, 0, 0.28); +} + +.footer-brand { + color: var(--accent); + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.footer-version { + color: rgba(245, 248, 255, 0.62); +} diff --git a/arma/client/addons/cad/ui/src/styles/common.css b/arma/client/addons/cad/ui/src/styles/common.css new file mode 100644 index 0000000..d674ed5 --- /dev/null +++ b/arma/client/addons/cad/ui/src/styles/common.css @@ -0,0 +1,78 @@ +:root { + --bg: rgba(9, 12, 18, 0.82); + --panel: rgba(20, 24, 33, 0.9); + --panel2: rgba(17, 21, 30, 0.82); + --stroke: rgba(255, 255, 255, 0.12); + --stroke2: rgba(255, 255, 255, 0.2); + --text: rgba(245, 248, 255, 0.92); + --muted: rgba(245, 248, 255, 0.62); + --muted2: rgba(245, 248, 255, 0.42); + --accent: rgba(104, 196, 255, 0.95); + --danger: rgba(255, 96, 96, 0.95); + --shadow: 0 20px 60px rgba(0, 0, 0, 0.55); + --radius: 14px; + --radius2: 10px; + --font: + ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, + sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font); + color: var(--text); + background: var(--bg); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); +} + +.btn { + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.03); + padding: 8px 16px; + border-radius: var(--radius2); + font-size: 14px; + color: var(--text); + cursor: pointer; + transition: + background 0.16s ease, + border-color 0.16s ease, + transform 0.16s ease; + user-select: none; +} + +.btn:hover { + background: rgba(255, 255, 255, 0.07); + border-color: rgba(255, 255, 255, 0.16); +} + +.btn:active { + transform: scale(0.98); +} + +.btn-close { + background: rgba(255, 96, 96, 0.1); + border-color: rgba(255, 96, 96, 0.25); + color: rgba(255, 220, 220, 0.95); + font-weight: bold; +} + +.btn-close:hover { + background: rgba(255, 96, 96, 0.2); + border-color: rgba(255, 96, 96, 0.35); +} + +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + border-radius: 999px; + border: 2px solid rgba(0, 0, 0, 0.1); +} diff --git a/arma/client/addons/cad/ui/src/styles/dispatcher.css b/arma/client/addons/cad/ui/src/styles/dispatcher.css new file mode 100644 index 0000000..457565b --- /dev/null +++ b/arma/client/addons/cad/ui/src/styles/dispatcher.css @@ -0,0 +1,574 @@ +html, +body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + background: + radial-gradient( + circle at top left, + rgba(41, 69, 93, 0.18), + transparent 30% + ), + linear-gradient(180deg, rgba(9, 14, 20, 0.96), rgba(15, 22, 31, 0.98)); +} + +body { + color: var(--text); + font-family: var(--font); +} + +.dispatch-shell { + height: 100%; + display: flex; + flex-direction: column; + padding: 18px; + gap: 14px; +} + +.dispatch-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.dispatch-panel-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.dispatch-kicker { + margin: 0 0 4px; + color: var(--accent); + text-transform: uppercase; + letter-spacing: 0.1em; + font-size: 11px; + font-weight: 700; +} + +.dispatch-header h2 { + margin: 0; + font-size: 24px; + font-weight: 650; +} + +.dispatch-header button, +.dispatch-btn, +.dispatch-select { + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(24, 31, 40, 0.9); + color: var(--text); +} + +.dispatch-header button, +.dispatch-btn { + padding: 10px 14px; + cursor: pointer; +} + +.dispatch-btn-compact { + padding: 8px 10px; + min-height: 32px; + font-size: 12px; +} + +.dispatch-btn-secondary { + background: rgba(53, 40, 39, 0.92); +} + +.dispatch-status { + min-height: 20px; + font-size: 13px; + color: rgba(233, 241, 248, 0.78); +} + +.dispatch-status[data-type="success"] { + color: #79d28a; +} + +.dispatch-status[data-type="error"] { + color: #ff8a80; +} + +.dispatch-danger-alert { + padding: 10px 12px; + border: 1px solid rgba(255, 107, 107, 0.38); + background: linear-gradient( + 90deg, + rgba(92, 18, 18, 0.94), + rgba(128, 29, 29, 0.82) + ); + color: #ffd4cf; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + animation: cad-danger-pulse 1.35s ease-in-out infinite; +} + +.dispatch-danger-alert.is-hidden { + display: none; +} + +.dispatch-warning-alert { + padding: 10px 12px; + border: 1px solid rgba(246, 198, 84, 0.42); + background: linear-gradient( + 90deg, + rgba(89, 64, 12, 0.94), + rgba(125, 92, 18, 0.84) + ); + color: #ffe9b2; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + animation: cad-warning-pulse 1.35s ease-in-out infinite; +} + +.dispatch-warning-alert.is-hidden { + display: none; +} + +.dispatch-metrics { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 12px; +} + +.metric-card { + padding: 14px; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(13, 19, 26, 0.72); +} + +.metric-label { + display: block; + margin-bottom: 8px; + color: rgba(233, 241, 248, 0.6); + text-transform: uppercase; + letter-spacing: 0.08em; + font-size: 11px; +} + +.metric-card strong { + font-size: 28px; + font-weight: 700; +} + +.metric-card.is-danger { + border-color: rgba(255, 107, 107, 0.34); + background: linear-gradient( + 180deg, + rgba(74, 17, 17, 0.86), + rgba(22, 13, 16, 0.92) + ); + box-shadow: inset 0 0 0 1px rgba(255, 107, 107, 0.12); + animation: cad-danger-pulse 1.35s ease-in-out infinite; +} + +.metric-card.is-warning { + border-color: rgba(246, 198, 84, 0.34); + background: linear-gradient( + 180deg, + rgba(92, 65, 14, 0.86), + rgba(29, 22, 11, 0.92) + ); + box-shadow: inset 0 0 0 1px rgba(246, 198, 84, 0.12); + animation: cad-warning-pulse 1.35s ease-in-out infinite; +} + +.dispatch-grid { + flex: 1; + display: grid; + grid-template-columns: repeat(12, minmax(0, 1fr)); + grid-auto-rows: minmax(0, 1fr); + gap: 14px; + min-height: 0; +} + +.dispatch-panel { + display: flex; + flex-direction: column; + min-height: 0; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(11, 17, 24, 0.78); + min-width: 0; +} + +.dispatch-panel-open { + grid-column: span 5; +} + +.dispatch-panel-assigned { + grid-column: span 7; +} + +.dispatch-panel-groups { + grid-column: span 8; +} + +.dispatch-panel-activity { + grid-column: span 4; +} + +.dispatch-panel-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 14px; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); +} + +.dispatch-panel-header h3 { + margin: 0; + font-size: 13px; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--accent); +} + +.dispatch-list { + flex: 1; + overflow: auto; + display: flex; + flex-direction: column; + gap: 10px; + padding: 12px; +} + +.dispatch-inline-section { + display: flex; + flex-direction: column; + gap: 10px; +} + +.dispatch-inline-header { + color: var(--accent); + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.dispatch-card { + padding: 12px; + border: 1px solid rgba(255, 255, 255, 0.06); + background: rgba(19, 26, 34, 0.72); +} + +.dispatch-card-interactive { + cursor: pointer; +} + +.dispatch-card-interactive:hover { + border-color: rgba(91, 187, 255, 0.2); + background: rgba(23, 31, 40, 0.82); +} + +.dispatch-card-header, +.dispatch-meta { + display: flex; + justify-content: space-between; + gap: 10px; +} + +.dispatch-card-header-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.dispatch-card-header-main { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; +} + +.dispatch-card-header { + margin-bottom: 8px; +} + +.dispatch-description { + margin: 0 0 10px; + line-height: 1.45; + color: rgba(241, 246, 251, 0.82); + font-size: 13px; +} + +.dispatch-meta { + margin-bottom: 10px; + font-size: 12px; + color: rgba(229, 237, 244, 0.7); +} + +.dispatch-badge { + padding: 3px 7px; + border: 1px solid rgba(91, 187, 255, 0.18); + background: rgba(16, 43, 61, 0.7); + color: var(--accent); + font-size: 11px; + text-transform: uppercase; +} + +.dispatch-alert-badge { + padding: 3px 7px; + border: 1px solid rgba(255, 107, 107, 0.44); + background: rgba(95, 23, 23, 0.88); + color: #ffd8d1; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.dispatch-icon-btn { + width: 32px; + height: 32px; + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(24, 31, 40, 0.92); + color: var(--text); + cursor: pointer; +} + +.dispatch-icon-btn:hover { + background: rgba(32, 42, 52, 0.96); +} + +.dispatch-actions { + display: flex; + flex-direction: column; + gap: 8px; +} + +.dispatch-card.is-danger { + border-color: rgba(255, 107, 107, 0.34); + background: linear-gradient( + 180deg, + rgba(69, 20, 22, 0.78), + rgba(28, 17, 21, 0.92) + ); + box-shadow: inset 0 0 0 1px rgba(255, 107, 107, 0.1); + animation: cad-danger-pulse 1.35s ease-in-out infinite; +} + +.dispatch-card.is-danger .dispatch-meta, +.dispatch-card.is-danger .dispatch-description { + color: rgba(255, 232, 228, 0.82); +} + +.dispatch-card.is-warning { + border-color: rgba(246, 198, 84, 0.34); + background: linear-gradient( + 180deg, + rgba(86, 64, 17, 0.78), + rgba(34, 27, 16, 0.92) + ); + box-shadow: inset 0 0 0 1px rgba(246, 198, 84, 0.1); + animation: cad-warning-pulse 1.35s ease-in-out infinite; +} + +.dispatch-card.is-warning .dispatch-meta, +.dispatch-card.is-warning .dispatch-description { + color: rgba(255, 243, 214, 0.84); +} + +.dispatch-actions-split { + margin-top: 10px; +} + +.dispatch-select { + width: 100%; + padding: 9px 10px; +} + +.dispatch-textarea { + width: 100%; + min-height: 92px; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(24, 31, 40, 0.92); + color: var(--text); + font: inherit; + resize: vertical; + box-sizing: border-box; +} + +.placeholder-message { + padding: 18px; + text-align: center; + color: rgba(233, 241, 248, 0.6); +} + +.dispatch-modal { + position: fixed; + inset: 0; + z-index: 30; + display: flex; + align-items: center; + justify-content: center; + padding: 32px 24px; + box-sizing: border-box; +} + +.dispatch-modal.is-hidden { + display: none; +} + +.dispatch-modal-backdrop { + position: absolute; + inset: 0; + background: rgba(4, 8, 12, 0.72); +} + +.dispatch-modal-dialog { + position: relative; + display: flex; + flex-direction: column; + width: min(560px, calc(100% - 48px)); + max-height: calc(100vh - 64px); + margin: 0; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(11, 17, 24, 0.98); + box-shadow: 0 24px 64px rgba(0, 0, 0, 0.42); +} + +.dispatch-modal-header, +.dispatch-modal-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 14px 16px; +} + +.dispatch-modal-header { + border-bottom: 1px solid rgba(255, 255, 255, 0.08); +} + +.dispatch-modal-header h3 { + margin: 0; + font-size: 22px; + font-weight: 650; +} + +.dispatch-modal-body { + flex: 1; + min-height: 0; + padding: 16px; + overflow: auto; +} + +.dispatch-meta-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; + margin-bottom: 18px; +} + +.dispatch-meta-grid strong { + display: block; + margin-top: 4px; + font-size: 14px; + font-weight: 600; +} + +.dispatch-modal-fields { + display: grid; + gap: 12px; +} + +.dispatch-field { + display: grid; + gap: 6px; +} + +.dispatch-field span { + font-size: 12px; + font-weight: 650; + text-transform: uppercase; + letter-spacing: 0.08em; + color: rgba(233, 241, 248, 0.7); +} + +.dispatch-modal-actions { + justify-content: flex-end; + border-top: 1px solid rgba(255, 255, 255, 0.08); +} + +.dispatch-detail-block, +.dispatch-detail-list { + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(19, 26, 34, 0.72); +} + +.dispatch-detail-block { + padding: 12px; + color: rgba(241, 246, 251, 0.82); + line-height: 1.45; + white-space: pre-wrap; +} + +.dispatch-detail-list { + display: grid; + gap: 1px; + overflow: hidden; +} + +.dispatch-detail-row { + display: grid; + grid-template-columns: minmax(0, 180px) minmax(0, 1fr); + gap: 12px; + padding: 10px 12px; + background: rgba(14, 20, 28, 0.92); +} + +.dispatch-detail-label { + color: rgba(233, 241, 248, 0.64); + font-size: 12px; + font-weight: 650; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.dispatch-detail-value { + color: rgba(241, 246, 251, 0.84); + line-height: 1.4; + word-break: break-word; + white-space: pre-wrap; +} + +@keyframes cad-danger-pulse { + 0%, + 100% { + box-shadow: + inset 0 0 0 1px rgba(255, 107, 107, 0.08), + 0 0 0 rgba(255, 107, 107, 0); + } + + 50% { + box-shadow: + inset 0 0 0 1px rgba(255, 141, 141, 0.22), + 0 0 18px rgba(255, 107, 107, 0.16); + } +} + +@keyframes cad-warning-pulse { + 0%, + 100% { + box-shadow: + inset 0 0 0 1px rgba(246, 198, 84, 0.08), + 0 0 0 rgba(246, 198, 84, 0); + } + + 50% { + box-shadow: + inset 0 0 0 1px rgba(251, 212, 118, 0.22), + 0 0 18px rgba(246, 198, 84, 0.16); + } +} diff --git a/arma/client/addons/cad/ui/src/styles/sidepanel.css b/arma/client/addons/cad/ui/src/styles/sidepanel.css new file mode 100644 index 0000000..34f6d12 --- /dev/null +++ b/arma/client/addons/cad/ui/src/styles/sidepanel.css @@ -0,0 +1,554 @@ +html, +body { + overflow: hidden; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: var(--panel); + border-left: 1px solid var(--stroke); + box-shadow: var(--shadow); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); +} + +body { + opacity: 1; + visibility: visible; +} + +.panel-header { + padding: 14px; + border-bottom: 1px solid var(--stroke); + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.05), + transparent + ); + display: flex; + justify-content: space-between; + align-items: center; +} + +.panel-header h3 { + color: var(--accent); + font-size: 14px; + font-weight: 650; + text-transform: uppercase; + letter-spacing: 0.8px; +} + +.panel-content { + padding: 14px; + height: calc(100% - 56px); + overflow: auto; +} + +.placeholder-message { + padding: 20px; + text-align: center; +} + +.placeholder-message p { + color: var(--muted); + font-size: 13px; + font-style: italic; +} + +.cad-tabs { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 5px; + margin-bottom: 12px; +} + +.cad-tabs.is-two-col { + grid-template-columns: repeat(2, 1fr); +} + +.cad-tabs.is-three-col { + grid-template-columns: repeat(3, 1fr); +} + +.cad-tab { + min-width: 0; + padding: 8px 7px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(20, 27, 33, 0.88); + color: rgba(243, 246, 249, 0.78); + text-transform: uppercase; + letter-spacing: 0.08em; + font-size: 10px; + white-space: nowrap; + cursor: pointer; +} + +.cad-tab:hover { + background: rgba(31, 40, 47, 0.94); + color: #f3f6f9; +} + +.cad-tab.is-active { + border-color: rgba(91, 187, 255, 0.42); + background: rgba(15, 40, 58, 0.96); + color: var(--accent); +} + +.cad-tab-panels { + min-height: 0; +} + +.cad-section { + display: none; +} + +.cad-section.is-active { + display: block; +} + +.cad-section-header { + margin-bottom: 8px; + color: var(--accent); + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.task-accept-btn, +.task-secondary-btn, +.cad-select { + width: 100%; + padding: 8px 10px; + border: 1px solid rgba(255, 255, 255, 0.2); + background: rgba(30, 37, 43, 0.9); + color: #f3f6f9; +} + +.task-accept-btn, +.task-secondary-btn { + cursor: pointer; +} + +.task-accept-btn:hover, +.task-secondary-btn:hover { + background: rgba(46, 57, 66, 0.95); +} + +.task-accept-btn:disabled, +.task-secondary-btn:disabled { + opacity: 0.55; + cursor: default; +} + +.task-status-message { + min-height: 18px; + margin-bottom: 10px; + font-size: 12px; + color: #cdd6dd; +} + +.task-status-message[data-type="success"] { + color: #79d28a; +} + +.task-status-message[data-type="error"] { + color: #ff8a80; +} + +.cad-modal { + position: fixed; + inset: 0; + z-index: 40; +} + +.cad-modal.is-hidden { + display: none; +} + +.cad-modal-backdrop { + position: absolute; + inset: 0; + background: rgba(4, 8, 12, 0.76); +} + +.cad-modal-dialog { + position: relative; + width: min(480px, calc(100% - 28px)); + margin: 32px auto 0; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(11, 17, 24, 0.98); + box-shadow: 0 24px 64px rgba(0, 0, 0, 0.42); +} + +.cad-modal-header, +.cad-modal-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 12px 14px; +} + +.cad-modal-header { + border-bottom: 1px solid rgba(255, 255, 255, 0.08); +} + +.cad-modal-header h3 { + margin: 4px 0 0; + font-size: 18px; + font-weight: 650; +} + +.cad-modal-body { + padding: 14px; + max-height: 62vh; + overflow: auto; +} + +.cad-modal-fields { + display: grid; + gap: 10px; +} + +.cad-field { + display: grid; + gap: 6px; +} + +.cad-field span { + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: rgba(233, 241, 248, 0.7); +} + +.cad-input, +.cad-textarea { + width: 100%; + padding: 8px 10px; + border: 1px solid rgba(255, 255, 255, 0.2); + background: rgba(30, 37, 43, 0.9); + color: #f3f6f9; + box-sizing: border-box; + font: inherit; +} + +.cad-textarea { + min-height: 74px; + resize: vertical; +} + +.cad-icon-btn { + width: 30px; + height: 30px; + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(24, 31, 40, 0.92); + color: var(--text); + cursor: pointer; +} + +.cad-modal-actions { + justify-content: flex-end; + border-top: 1px solid rgba(255, 255, 255, 0.08); +} + +.cad-danger-alert { + margin-bottom: 10px; + padding: 8px 10px; + border: 1px solid rgba(255, 107, 107, 0.36); + background: linear-gradient( + 90deg, + rgba(92, 18, 18, 0.94), + rgba(128, 29, 29, 0.82) + ); + color: #ffd4cf; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + animation: cad-danger-pulse 1.35s ease-in-out infinite; +} + +.cad-danger-alert.is-hidden { + display: none; +} + +.cad-warning-alert { + margin-bottom: 10px; + padding: 8px 10px; + border: 1px solid rgba(246, 198, 84, 0.4); + background: linear-gradient( + 90deg, + rgba(89, 64, 12, 0.94), + rgba(125, 92, 18, 0.84) + ); + color: #ffe9b2; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + animation: cad-warning-pulse 1.35s ease-in-out infinite; +} + +.cad-warning-alert.is-hidden { + display: none; +} + +.task-list { + display: flex; + flex-direction: column; + gap: 10px; +} + +.cad-request-actions { + display: grid; + gap: 8px; +} + +.cad-request-btn { + text-align: left; +} + +.task-action-stack, +.task-action-row { + display: flex; + flex-direction: column; + gap: 8px; +} + +.task-action-row { + flex-direction: row; +} + +.task-card { + padding: 10px; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(12, 16, 20, 0.62); +} + +.task-card.is-danger, +.roster-summary-card.is-danger { + border-color: rgba(255, 107, 107, 0.34); + background: linear-gradient( + 180deg, + rgba(69, 20, 22, 0.78), + rgba(28, 17, 21, 0.92) + ); + box-shadow: inset 0 0 0 1px rgba(255, 107, 107, 0.1); + animation: cad-danger-pulse 1.35s ease-in-out infinite; +} + +.task-card-header { + display: flex; + justify-content: space-between; + gap: 8px; + margin-bottom: 8px; +} + +.task-type { + opacity: 0.7; + text-transform: uppercase; + font-size: 11px; +} + +.task-description { + margin: 0 0 8px; + font-size: 12px; + line-height: 1.4; +} + +.task-meta { + display: flex; + justify-content: space-between; + gap: 8px; + margin-bottom: 8px; + font-size: 11px; + opacity: 0.8; +} + +.task-secondary-btn { + background: rgba(60, 48, 45, 0.92); +} + +.roster-summary-card { + padding: 10px; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(16, 23, 29, 0.82); +} + +.task-alert-badge { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border: 1px solid rgba(255, 107, 107, 0.44); + background: rgba(95, 23, 23, 0.88); + color: #ffd8d1; + font-size: 10px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.roster-member-card { + background: rgba(12, 16, 20, 0.74); +} + +.dispatch-map-group-card { + width: 100%; + text-align: left; + appearance: none; + -webkit-appearance: none; + border-radius: 0; + color: var(--text); + font: inherit; + cursor: pointer; + transition: + border-color 120ms ease, + background 120ms ease, + transform 120ms ease; +} + +.dispatch-map-group-card strong { + color: var(--text); +} + +.dispatch-map-group-card .task-type { + color: var(--accent); + opacity: 0.9; +} + +.dispatch-map-group-card .task-meta { + color: var(--muted); + opacity: 1; +} + +.dispatch-map-group-card:hover { + border-color: rgba(91, 187, 255, 0.26); + background: rgba(18, 29, 38, 0.9); + transform: translateX(-2px); +} + +.dispatch-map-group-card.is-selected { + border-color: rgba(91, 187, 255, 0.52); + background: rgba(15, 40, 58, 0.92); + box-shadow: inset 0 0 0 1px rgba(91, 187, 255, 0.18); +} + +.dispatch-map-group-card.is-danger:not(.is-selected) { + border-color: rgba(255, 107, 107, 0.34); + background: linear-gradient( + 180deg, + rgba(69, 20, 22, 0.78), + rgba(28, 17, 21, 0.92) + ); +} + +.dispatch-map-group-card.is-danger .task-meta, +.roster-summary-card.is-danger .task-meta { + color: rgba(255, 232, 228, 0.82); +} + +.dispatch-map-card { + width: 100%; + text-align: left; + appearance: none; + -webkit-appearance: none; + border-radius: 0; + color: var(--text); + font: inherit; + cursor: pointer; + transition: + border-color 120ms ease, + background 120ms ease, + transform 120ms ease; +} + +.dispatch-map-card strong { + color: var(--text); +} + +.dispatch-map-card .task-type { + color: var(--accent); + opacity: 0.9; +} + +.dispatch-map-card .task-description { + color: var(--muted); +} + +.dispatch-map-card .task-meta { + color: var(--muted); + opacity: 1; +} + +.dispatch-map-card:hover { + border-color: rgba(91, 187, 255, 0.26); + background: rgba(18, 29, 38, 0.9); + transform: translateX(-2px); +} + +.dispatch-map-card.is-selected { + border-color: rgba(91, 187, 255, 0.52); + background: rgba(15, 40, 58, 0.92); + box-shadow: inset 0 0 0 1px rgba(91, 187, 255, 0.18); +} + +.dispatch-map-card.is-warning:not(.is-selected) { + border-color: rgba(246, 198, 84, 0.34); + background: linear-gradient( + 180deg, + rgba(86, 64, 17, 0.78), + rgba(34, 27, 16, 0.92) + ); +} + +.dispatch-map-card.is-warning .task-meta, +.dispatch-map-card.is-warning .task-description { + color: rgba(255, 243, 214, 0.84); +} + +.roster-leader-badge { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border: 1px solid rgba(91, 187, 255, 0.28); + background: rgba(15, 40, 58, 0.82); + color: var(--accent); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +@keyframes cad-danger-pulse { + 0%, + 100% { + box-shadow: + inset 0 0 0 1px rgba(255, 107, 107, 0.08), + 0 0 0 rgba(255, 107, 107, 0); + } + + 50% { + box-shadow: + inset 0 0 0 1px rgba(255, 141, 141, 0.22), + 0 0 14px rgba(255, 107, 107, 0.14); + } +} + +@keyframes cad-warning-pulse { + 0%, + 100% { + box-shadow: + inset 0 0 0 1px rgba(246, 198, 84, 0.08), + 0 0 0 rgba(246, 198, 84, 0); + } + + 50% { + box-shadow: + inset 0 0 0 1px rgba(251, 212, 118, 0.22), + 0 0 18px rgba(246, 198, 84, 0.16); + } +} diff --git a/arma/client/addons/cad/ui/src/styles/topbar.css b/arma/client/addons/cad/ui/src/styles/topbar.css new file mode 100644 index 0000000..0f24d57 --- /dev/null +++ b/arma/client/addons/cad/ui/src/styles/topbar.css @@ -0,0 +1,296 @@ +body { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60px; + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto auto auto; + align-items: center; + column-gap: 16px; + padding: 0 16px; + background: transparent; + overflow: visible; +} + +body[data-mode="operations"] { + grid-template-columns: auto minmax(0, 1fr) auto auto; +} + +body[data-mode="dispatch"] { + grid-template-columns: auto minmax(0, 1fr) auto auto auto; +} + +body::before { + content: ""; + position: absolute; + inset: 0 0 auto 0; + height: 60px; + background: linear-gradient( + 90deg, + rgba(16, 22, 31, 0.96), + rgba(19, 26, 36, 0.94) 55%, + rgba(15, 20, 28, 0.96) + ); + border-bottom: none; + box-shadow: none; + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + z-index: 0; + pointer-events: none; +} + +body > * { + position: relative; + z-index: 1; +} + +.logo { + color: var(--accent); + font-size: 15px; + font-weight: 650; + text-transform: uppercase; + letter-spacing: 0.08em; + text-shadow: 0 1px 12px rgba(0, 0, 0, 0.35); +} + +.header-main { + min-width: 0; + display: flex; + align-items: center; + gap: 12px; +} + +.title-block { + display: flex; + flex-direction: column; + gap: 1px; + min-width: 0; + flex: 0 0 auto; +} + +.title-kicker { + color: rgba(218, 227, 236, 0.56); + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.12em; +} + +.title-main { + color: rgba(245, 248, 255, 0.92); + font-size: 15px; + font-weight: 600; +} + +.operator-strip { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; + flex: 1 1 auto; +} + +.operator-strip.is-hidden, +.operator-controls.is-hidden { + display: none; +} + +.operator-info { + display: flex; + flex-direction: column; + min-width: 88px; + gap: 0; +} + +.operator-label { + color: rgba(218, 227, 236, 0.5); + font-size: 9px; + text-transform: uppercase; + letter-spacing: 0.12em; +} + +.operator-info strong { + color: rgba(245, 248, 255, 0.9); + font-size: 12px; + font-weight: 550; +} + +.operator-controls { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.operator-select { + min-width: 92px; + max-width: 112px; + padding: 5px 8px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(14, 20, 28, 0.96); + color: var(--text); + font-size: 11px; +} + +.btn-operator { + min-width: 84px; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.mode-controls { + display: flex; + gap: 8px; + align-items: center; + justify-self: end; +} + +.mode-controls.is-hidden { + display: none; +} + +.dispatch-view-controls { + display: flex; + align-items: center; + gap: 6px; + justify-self: end; +} + +.dispatch-view-controls.is-hidden { + display: none; +} + +.controls { + display: flex; + gap: 8px; + align-items: center; + justify-self: end; +} + +.mode-text { + color: rgba(233, 241, 248, 0.72); + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.1em; +} + +.mode-switch { + position: relative; + width: 54px; + height: 28px; + display: inline-flex; + align-items: center; +} + +.mode-switch input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.mode-slider { + position: relative; + width: 54px; + height: 28px; + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 999px; + background: rgba(22, 29, 39, 0.92); + box-shadow: inset 0 1px 10px rgba(0, 0, 0, 0.22); + transition: + border-color 0.16s ease, + background 0.16s ease; +} + +.mode-slider::after { + content: ""; + position: absolute; + top: 3px; + left: 3px; + width: 20px; + height: 20px; + border-radius: 50%; + background: linear-gradient( + 180deg, + rgba(237, 244, 251, 0.98), + rgba(189, 205, 221, 0.92) + ); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.26); + transition: + transform 0.16s ease, + background 0.16s ease; +} + +.mode-switch input:checked + .mode-slider { + border-color: rgba(91, 187, 255, 0.42); + background: rgba(14, 37, 56, 0.95); +} + +.mode-switch input:checked + .mode-slider::after { + transform: translateX(26px); + background: linear-gradient( + 180deg, + rgba(131, 212, 255, 0.98), + rgba(72, 170, 231, 0.94) + ); +} + +.btn-close { + min-width: 42px; +} + +.btn-dispatch-view { + min-width: 66px; + padding: 6px 10px; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.btn-icon { + min-width: 34px; + width: 34px; + height: 30px; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + font-size: 16px; + line-height: 1; +} + +.btn-refresh { + min-width: 40px; + width: 40px; + font-size: 17px; + font-weight: 600; +} + +.btn-dispatch-view.is-active { + border-color: rgba(91, 187, 255, 0.42); + background: rgba(15, 40, 58, 0.96); + color: var(--accent); +} + +.btn-close { + font-size: 14px; +} + +body { + pointer-events: none; +} + +body .logo, +body .title-block, +body .operator-strip, +body .operator-controls, +body .mode-controls, +body .dispatch-view-controls, +body .controls, +body .mode-switch, +body .mode-switch *, +body button, +body select, +body label { + pointer-events: auto; +} diff --git a/arma/client/addons/cad/ui/src/topbar.html b/arma/client/addons/cad/ui/src/topbar.html new file mode 100644 index 0000000..8736261 --- /dev/null +++ b/arma/client/addons/cad/ui/src/topbar.html @@ -0,0 +1,132 @@ + + + + + + + +
+
+ Cad Systems + FORGE Command & Dispatch +
+ +
+ + +
+ + +
+ + + + diff --git a/arma/client/addons/cad/ui/src/topbar.js b/arma/client/addons/cad/ui/src/topbar.js new file mode 100644 index 0000000..42a22e3 --- /dev/null +++ b/arma/client/addons/cad/ui/src/topbar.js @@ -0,0 +1,162 @@ +window.cadTopbar = { + mode: "operations", + dispatchView: "board", + currentGroup: null, + session: {}, + init() { + document.getElementById("btnClose").addEventListener("click", () => { + window.mapUI.sendEvent("map::close", null); + }); + + document + .getElementById("modeToggle") + .addEventListener("change", (event) => { + window.mapUI.sendEvent("cad::mode::set", { + mode: event.target.checked ? "dispatch" : "operations", + }); + }); + + document + .getElementById("dispatchRefreshBtn") + .addEventListener("click", () => { + window.mapUI.sendEvent("cad::refresh", {}); + }); + + document + .getElementById("dispatchBoardBtn") + .addEventListener("click", () => { + window.mapUI.sendEvent("cad::dispatchView::set", { + dispatchView: "board", + }); + }); + + document + .getElementById("dispatchMapBtn") + .addEventListener("click", () => { + window.mapUI.sendEvent("cad::dispatchView::set", { + dispatchView: "map", + }); + }); + + document + .getElementById("operatorRoleBtn") + .addEventListener("click", () => { + if (!this.currentGroup) { + return; + } + + window.mapUI.sendEvent("cad::groups::role", { + groupID: this.currentGroup.groupId || "", + role: document.getElementById("operatorRoleSelect").value, + }); + }); + + document + .getElementById("operatorStatusBtn") + .addEventListener("click", () => { + if (!this.currentGroup) { + return; + } + + window.mapUI.sendEvent("cad::groups::status", { + groupID: this.currentGroup.groupId || "", + status: document.getElementById("operatorStatusSelect") + .value, + }); + }); + + window.mapUI.sendEvent("cad::topbar::ready", {}); + }, + formatLocation(group) { + const position = Array.isArray(group?.position) + ? group.position + : [0, 0, 0]; + return window.mapUI.formatPosition(position); + }, + receiveState(payload) { + this.session = + payload && payload.session && typeof payload.session === "object" + ? payload.session + : {}; + this.mode = + payload && typeof payload.mode === "string" + ? payload.mode + : "operations"; + this.dispatchView = + payload && typeof payload.dispatchView === "string" + ? payload.dispatchView + : "board"; + this.currentGroup = + payload && + payload.currentGroup && + typeof payload.currentGroup === "object" + ? payload.currentGroup + : null; + + const modeControls = document.getElementById("modeControls"); + const canDispatch = !!this.session.isDispatcher; + const canOperateGroup = + !!this.currentGroup && + (!!this.session.isLeader || !!this.session.isDispatcher); + const operatorStrip = document.getElementById("operatorStrip"); + const operatorControls = document.getElementById("operatorControls"); + const dispatchViewControls = document.getElementById( + "dispatchViewControls", + ); + const dispatchRefreshBtn = + document.getElementById("dispatchRefreshBtn"); + const dispatchBoardBtn = document.getElementById("dispatchBoardBtn"); + const dispatchMapBtn = document.getElementById("dispatchMapBtn"); + + modeControls.classList.toggle("is-hidden", !canDispatch); + dispatchViewControls.classList.toggle( + "is-hidden", + !canDispatch || this.mode !== "dispatch", + ); + operatorStrip.classList.toggle( + "is-hidden", + this.mode !== "operations" || !this.currentGroup, + ); + operatorControls.classList.toggle("is-hidden", !canOperateGroup); + + document.body.dataset.mode = this.mode; + document.body.dataset.dispatcher = canDispatch ? "true" : "false"; + + document.getElementById("modeToggle").checked = + this.mode === "dispatch"; + dispatchBoardBtn.classList.toggle( + "is-active", + this.dispatchView === "board", + ); + dispatchMapBtn.classList.toggle( + "is-active", + this.dispatchView === "map", + ); + dispatchRefreshBtn.title = + this.mode === "dispatch" ? "Refresh dispatch board" : "Refresh CAD"; + dispatchRefreshBtn.setAttribute( + "aria-label", + this.mode === "dispatch" ? "Refresh dispatch board" : "Refresh CAD", + ); + + document.getElementById("operatorGroupName").textContent = this + .currentGroup + ? this.currentGroup.callsign || + this.currentGroup.groupId || + "Current Group" + : "No Group"; + document.getElementById("operatorLocation").textContent = this + .currentGroup + ? this.formatLocation(this.currentGroup) + : "Unavailable"; + + if (this.currentGroup) { + document.getElementById("operatorRoleSelect").value = + this.currentGroup.role || "infantry"; + document.getElementById("operatorStatusSelect").value = + this.currentGroup.status || "available"; + } + }, +}; + +window.cadTopbar.init(); diff --git a/arma/client/addons/cad/ui/ui.config.mjs b/arma/client/addons/cad/ui/ui.config.mjs new file mode 100644 index 0000000..366f58e --- /dev/null +++ b/arma/client/addons/cad/ui/ui.config.mjs @@ -0,0 +1,89 @@ +export default { + addonName: "cad", + title: "FORGE CAD", + logLabel: "CAD UI", + outputDir: "_site", + generateIndex: false, + jsBundles: [ + { + name: "CAD shared bridge/runtime", + output: "cad-shared.js", + sources: ["src/shared.js"], + }, + { + name: "CAD topbar app", + output: "cad-topbar.js", + sources: ["src/topbar.js"], + }, + { + name: "CAD sidepanel app", + output: "cad-sidepanel.js", + sources: ["src/sidepanel.js"], + }, + { + name: "CAD dispatcher app", + output: "cad-dispatcher.js", + sources: [ + "src/dispatcher/formatters.js", + "src/dispatcher/modals.js", + "src/dispatcher/render.js", + "src/dispatcher/index.js", + ], + }, + { + name: "CAD bottombar app", + output: "cad-bottombar.js", + sources: ["src/bottombar.js"], + }, + ], + cssBundles: [ + { + name: "CAD common styles", + output: "cad-common.css", + sources: ["src/styles/common.css"], + }, + { + name: "CAD topbar styles", + output: "cad-topbar.css", + sources: ["src/styles/topbar.css"], + }, + { + name: "CAD sidepanel styles", + output: "cad-sidepanel.css", + sources: ["src/styles/sidepanel.css"], + }, + { + name: "CAD dispatcher styles", + output: "cad-dispatcher.css", + sources: ["src/styles/dispatcher.css"], + }, + { + name: "CAD bottombar styles", + output: "cad-bottombar.css", + sources: ["src/styles/bottombar.css"], + }, + ], + htmlTemplates: [ + { + name: "CAD topbar page", + output: "topbar.html", + source: "src/topbar.html", + }, + { + name: "CAD sidepanel page", + output: "sidepanel.html", + source: "src/sidepanel.html", + }, + { + name: "CAD dispatcher page", + output: "dispatcher.html", + source: "src/dispatcher.html", + }, + { + name: "CAD bottombar page", + output: "bottombar.html", + source: "src/bottombar.html", + }, + ], + site: {}, +}; diff --git a/arma/client/addons/common/$PBOPREFIX$ b/arma/client/addons/common/$PBOPREFIX$ new file mode 100644 index 0000000..c2897bb --- /dev/null +++ b/arma/client/addons/common/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\common diff --git a/arma/client/addons/common/CfgEventHandlers.hpp b/arma/client/addons/common/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/client/addons/common/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/arma/client/addons/common/CfgSounds.hpp b/arma/client/addons/common/CfgSounds.hpp new file mode 100644 index 0000000..b3e080e --- /dev/null +++ b/arma/client/addons/common/CfgSounds.hpp @@ -0,0 +1,23 @@ +class CfgSounds { + sounds[] = {}; + class FORGE_timerBeep { + name = "FORGE_timerBeep"; + sound[] = {QUOTE(PATHTOF(sounds\timerClick.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_timerBeepShort { + name = "FORGE_timerBeepShort"; + sound[] = {QUOTE(PATHTOF(sounds\timerClickShort.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_timerEnd { + name = "FORGE_timerEnd"; + sound[] = {QUOTE(PATHTOF(sounds\timerEnd.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_defused { + name = "FORGE_defused"; + sound[] = {QUOTE(PATHTOF(sounds\defused.wav)), 1, 3}; + titles[] = {}; + }; +}; diff --git a/arma/client/addons/common/CfgVehicles.hpp b/arma/client/addons/common/CfgVehicles.hpp new file mode 100644 index 0000000..61587be --- /dev/null +++ b/arma/client/addons/common/CfgVehicles.hpp @@ -0,0 +1,12 @@ +class CfgVehicles { + class Land_Bodybag_01_black_F; + class forge_bodyBag: Land_Bodybag_01_black_F { + maximumLoad = 2000; + transportMaxWeapons = 500; + transportMaxMagazines = 2000; + transportMaxItems = 1000; + ace_dragging_canCarry = 1; + ace_dragging_carryPosition[] = {0, 0.5, 1.2}; + ace_dragging_carryDirection = 90; + }; +}; diff --git a/arma/client/addons/common/README.md b/arma/client/addons/common/README.md new file mode 100644 index 0000000..71c1190 --- /dev/null +++ b/arma/client/addons/common/README.md @@ -0,0 +1,18 @@ +# Forge Client Common + +## Overview +The common addon contains shared client-side UI bridge helpers and common +configuration used by browser-based feature addons. + +## Dependencies +- `forge_client_main` + +## Main Components +- `fnc_initWebUIBridge.sqf` provides shared bridge behavior for web browser UI + controls. +- `WEB_UI_FRAMEWORK.md` documents the proposed shared browser runtime and event + API for Forge web UIs. + +## Notes +Keep feature-specific behavior in the owning addon. Common should hold reusable +browser bridge patterns, not copied application logic. diff --git a/arma/client/addons/common/WEB_UI_FRAMEWORK.md b/arma/client/addons/common/WEB_UI_FRAMEWORK.md new file mode 100644 index 0000000..be0077f --- /dev/null +++ b/arma/client/addons/common/WEB_UI_FRAMEWORK.md @@ -0,0 +1,991 @@ +# Web UI Framework Proposal + +## Goal + +Create a shared web UI framework inside `forge_client_common` that provides one browser runtime for all `CT_WEBBROWSER` interfaces: + +- store +- bank +- garage +- org +- actor +- notifications + +The framework should standardize: + +- browser bootstrapping +- Arma to JS messaging +- JS to Arma messaging +- reactive state updates +- shared UI primitives +- asset loading +- teardown and remount behavior + +## Why This Should Live In `common` + +The current client web UIs already share the same underlying concerns: + +- `A3API.RequestFile` for loading scripts and styles +- `A3API.SendAlert` for outbound events +- `ctrlWebBrowserAction ["ExecJS", ...]` for inbound events +- full-page rerender on every signal update +- duplicated runtime and bridge code across addons + +That makes `forge_client_common` the right owner for: + +- the browser runtime +- the bridge contract +- reusable DOM helpers +- shared components and styles + +Each addon should keep only: + +- app-specific state +- app-specific event names +- app-specific SQF handlers +- app-specific views and theme assets + +## Constraints From `CT_WEBBROWSER` + +This framework should be built for the actual browser host, not for a generic modern frontend stack. + +- Browser engine should be treated as conservative Chromium/CEF. +- HTML is hosted inside the Arma browser control, not a normal web server app. +- Asset loading must work through `A3API.RequestFile`. +- Game integration must work through `A3API.SendAlert` and SQF `ExecJS`. +- Browser controls are opened and destroyed by UI displays, so mount/unmount must be explicit. +- Startup latency matters because players open these UIs interactively in-game. + +## Design Principles + +1. Keep the runtime small. +2. Avoid framework dependencies like React or Vue. +3. Prefer one shared bundle plus one app bundle per UI. +4. Support coarse-grained reactivity first, then targeted DOM patching where it matters. +5. Make the Arma bridge a first-class host adapter, not an afterthought. +6. Keep app logic plain JavaScript so views are easy to reason about. +7. Make every UI follow the same bootstrap contract. + +## Proposed Ownership + +### Common addon + +`forge_client_common` should own: + +- browser host adapter +- reactive runtime +- DOM renderer +- shared event bus +- base CSS tokens and utility classes +- shared components +- generic bootstrap helper +- SQF bridge base class + +### Feature addons + +Each feature addon should own: + +- one app entrypoint +- feature store/state +- feature bridge schema +- feature views/components +- feature-specific CSS layer +- feature SQF bridge subclass/instance + +## Proposed Folder Layout + +```text +arma/client/addons/common/ + ui/ + src/ + runtime.js + host.js + bridge.js + app.js + index.js + _site/ + forge-webui.js + functions/ + fnc_initWebUIBridge.sqf + fnc_openWebUI.sqf + fnc_sendWebUIEvent.sqf + README.md + WEB_UI_FRAMEWORK.md +``` + +Feature addon structure would then look like: + +```text +arma/client/addons/org/ + ui/ + _site/ + index.html + app.js + views/ + components/ + theme.css + functions/ + fnc_initOrgUIBridge.sqf + fnc_openUI.sqf + fnc_handleUIEvents.sqf +``` + +## Runtime API Sketch + +The shared runtime should expose a small API on `window.ForgeWebUI`. + +### Core API + +```js +ForgeWebUI = { + h, + text, + fragment, + signal, + computed, + effect, + batch, + mount, + unmount, + createApp, + createBridge, + createAssetLoader, + createNoticeCenter, +}; +``` + +### Reactive primitives + +```js +const count = signal(0); +const doubled = computed(() => count() * 2); + +effect(() => { + console.log("count", count()); +}); + +count.set(5); +``` + +Design notes: + +- `signal()` returns a getter function with `.set()` and `.update()`. +- `computed()` caches until one of its dependencies changes. +- `effect()` is for bridge sync, timers, DOM subscriptions, and cleanup. +- `batch()` groups several writes into one render pass. + +### DOM/rendering + +```js +function CounterView() { + return h("button", { + onClick() { + count.update((value) => value + 1); + } + }, `Count: ${count()}`); +} + +mount(document.getElementById("app"), CounterView); +``` + +The renderer should support: + +- keyed child reconciliation +- event binding +- text node updates +- conditional sections +- list rendering +- SVG nodes +- mount cleanup + +It should not rebuild the whole root on every write. + +## App Bootstrap Contract + +Every app should use the same bootstrap shape: + +```js +const app = ForgeWebUI.createApp({ + name: "org", + root: "#app", + setup({ host, bridge, assets, notices }) { + const store = createOrgStore(); + + bridge.on("org::sync", (payload) => { + store.hydrate(payload); + }); + + bridge.ready(); + + return () => OrgApp({ store, host, notices }); + } +}); + +app.start(); +``` + +Responsibilities: + +- `createApp()` locates the root node +- waits for DOM readiness +- sets up host services +- mounts the view +- wires bridge event listeners +- exposes teardown hooks + +## Host Adapter API + +The Arma host layer should hide `A3API` details behind one consistent service. + +```js +const host = { + isArma: true, + requestFile(path), + requestTexture(path, size), + send(event, data), + exec(name, data), + on(event, handler), + off(event, handler), + ready(data), + close(data), +}; +``` + +Behavior: + +- `send()` wraps `A3API.SendAlert(JSON.stringify(...))` +- `on()` and `off()` subscribe to messages injected from SQF +- `ready()` announces page readiness to SQF +- `close()` sends a standard close event +- if `A3API` is unavailable, fallback behavior supports local browser testing + +## JS Bridge Contract + +Each page should expose one stable bridge object to SQF: + +```js +window.ForgeBridge.receive({ + event: "org::sync", + data: { ... } +}); +``` + +This replaces app-specific globals like: + +- `StoreUIBridge` +- `OrgUIBridge` + +Recommended interface: + +```js +window.ForgeBridge = { + receive(payload), + receiveMany(events), + reset(), + ping(), +}; +``` + +Feature apps should register handlers with the shared bridge: + +```js +bridge.on("store::hydrate", handleHydrate); +bridge.on("store::checkout::success", handleCheckoutSuccess); +``` + +That removes duplicated payload parsing from each app bridge file. + +## SQF Bridge Base Class + +The SQF side should also be normalized in `common`. + +### Shared base responsibilities + +- find active browser control +- execute JS safely +- send `{ event, data }` payloads +- queue payloads until page ready +- flush pending payloads on ready +- standardize close handling +- standardize logging and diagnostics + +### SQF API sketch + +```sqf +GVAR(WebUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "WebUIBridgeBaseClass"], + ["#create", compileFinal { + _self set ["pendingEvents", []]; + _self set ["isReady", false]; + }], + ["getActiveBrowserControl", compileFinal { ... }], + ["execJS", compileFinal { ... }], + ["sendEvent", compileFinal { ... }], + ["queueEvent", compileFinal { ... }], + ["flushPendingEvents", compileFinal { ... }], + ["handleReady", compileFinal { ... }], + ["handleClose", compileFinal { ... }] +]; +``` + +Feature bridges like org or store would then extend only the behavior they need: + +- payload building +- server RPC dispatch +- feature response mapping + +## SQF Type Model With `createHashMapObject` + +The SQF side should lean into `createHashMapObject` instead of using plain hash maps for everything. + +This gives us: + +- inheritance through `#base` +- explicit type tagging through `#type` +- constructors through `#create` +- cleanup through `#delete` + +That is a strong fit for browser UI infrastructure because the UI layer already has clear object roles. + +### Recommended types + +At minimum, define these object families in `forge_client_common`: + +- `IWebUIBridge` +- `IWebUIScreen` +- `IWebUIRequest` +- `IWebUISubscription` + +Feature addons can then define their own types on top: + +- `OrgUIBridge` +- `StoreUIBridge` +- `BankUIBridge` +- `GarageUIBridge` + +### Example hierarchy + +```sqf +private _webUIBridgeDeclaration = [ + ["#type", "IWebUIBridge"], + ["#create", { ... }], + ["getActiveBrowserControl", { ... }], + ["sendEvent", { ... }], + ["handleReady", { ... }], + ["dispose", { ... }] +]; + +private _orgUIBridgeDeclaration = [ + ["#base", _webUIBridgeDeclaration], + ["#type", "OrgUIBridge"], + ["buildHydratePayload", { ... }], + ["handleCreditResponse", { ... }] +]; +``` + +Type checks then become straightforward: + +```sqf +if ("IWebUIBridge" in (_bridge get "#type")) then { + _bridge call ["sendEvent", ["ui::ping", createHashMap]]; +}; +``` + +### Why Example 4 matters + +Example 4 on the wiki shows the important lifecycle property: + +- constructor creates a resource +- object holds that resource +- destructor deletes that resource when the object is released + +That pattern maps directly to UI/session resources. + +### Good uses of `#delete` in this framework + +- clear pending request queues +- unregister display event handlers +- null out active browser control references +- stop polling/update loops +- remove temporary mission event handlers +- release temporary response trackers + +### Example use: request/response object + +```sqf +private _requestDeclaration = [ + ["#type", "IWebUIRequest"], + ["#create", { + params ["_requestId", "_onTimeout"]; + _self set ["requestId", _requestId]; + _self set ["onTimeout", _onTimeout]; + _self set ["isResolved", false]; + }], + ["resolve", { + _self set ["isResolved", true]; + }], + ["#delete", { + if !(_self getOrDefault ["isResolved", false]) then { + private _onTimeout = _self getOrDefault ["onTimeout", {}]; + call _onTimeout; + }; + }] +]; +``` + +This is the same concept as Example 4: + +- object owns a resource or responsibility +- when the object is released, cleanup happens automatically + +## Lifecycle Guidance + +Use destructors as a cleanup safety net, not as the only control path. + +Reason: + +- `#delete` runs when the last reference is removed +- that is useful, but not always the best moment for gameplay/UI logic + +Recommended pattern: + +1. expose an explicit `dispose` or `close` method +2. perform normal cleanup there +3. let `#delete` catch anything missed + +That keeps UI shutdown deterministic while still benefiting from automatic cleanup. + +## Typed Screen Objects + +We can also model each open browser UI as a typed screen object instead of just storing a control reference. + +Example: + +```sqf +private _screenDeclaration = [ + ["#type", "IWebUIScreen"], + ["#create", { + params ["_displayName", "_control"]; + _self set ["displayName", _displayName]; + _self set ["control", _control]; + _self set ["isReady", false]; + _self set ["pendingEvents", []]; + }], + ["markReady", { + _self set ["isReady", true]; + }], + ["queueEvent", { ... }], + ["flushPendingEvents", { ... }], + ["dispose", { + _self set ["pendingEvents", []]; + _self set ["control", controlNull]; + }] +]; +``` + +That gives us a cleaner split: + +- bridge object owns app-level behavior +- screen object owns one live browser control/session +- request objects own transient async work + +## Recommended Application To Current Addons + +The current org and store bridge objects already use `createHashMapObject`. + +This should evolve into: + +- one shared `IWebUIBridge` base declaration in `common` +- one shared `IWebUIScreen` declaration in `common` +- feature bridge types inheriting from `IWebUIBridge` +- optional transient request/session helper types where async cleanup matters + +That will make the SQF side more explicit, easier to test, and safer around UI teardown. + +## Event Naming + +Keep namespaced events. The current event style is good. + +Examples: + +- `org::ready` +- `org::sync` +- `org::create::request` +- `store::checkout::request` +- `notifications::ready` + +Standardize a small set of host-level events: + +- `ui::ready` +- `ui::close` +- `ui::error` +- `ui::ping` + +And keep feature events under their own namespace. + +## State Model + +The framework should support two store patterns: + +### Local signal store + +Good for: + +- form state +- modal state +- selection state +- optimistic UI flags + +### Domain store wrapper + +Good for: + +- hydrated server payloads +- catalog data +- actor action lists +- organization portal data + +Recommended store API: + +```js +function createStore(initialState) { + const state = signal(initialState); + + return { + get state() { + return state(); + }, + patch(partial) { + state.set({ ...state(), ...partial }); + }, + replace(next) { + state.set(next); + } + }; +} +``` + +## Component Update Model + +The framework should update component subtrees, not the full UI root. + +That means: + +- no browser page reload +- no `innerHTML = ""` on the app root for every state change +- only components that read changed state should rerender + +### Practical expectation + +Examples: + +- adding a member updates `MembersCard` and any member count badge +- granting a credit line updates `TreasuryCard` and the specific member row +- updating funds updates treasury summary components only +- showing a modal or notice updates only the overlay layer + +## Store Contract + +Each app store should expose three layers: + +1. domain state signals +2. derived selectors/computed values +3. mutation methods + +Recommended shape: + +```js +function createOrgStore() { + const org = signal({ + id: "", + name: "", + ownerUid: "", + }); + + const session = signal({ + actorUid: "", + actorName: "", + role: "", + ceo: false, + }); + + const treasury = signal({ + funds: 0, + reputation: 0, + creditLines: [], + }); + + const roster = signal({ + members: [], + }); + + const ui = signal({ + modal: null, + notices: [], + treasuryTab: "overview", + }); + + const memberCount = computed(() => roster().members.length); + const activeCreditCount = computed(() => treasury().creditLines.length); + + return { + org, + session, + treasury, + roster, + ui, + memberCount, + activeCreditCount, + hydrate(payload) { ... }, + addMember(member) { ... }, + removeMember(memberUid) { ... }, + upsertCreditLine(line) { ... }, + setFunds(amount) { ... }, + openModal(type, data) { ... }, + closeModal() { ... }, + }; +} +``` + +### Rules + +- component code reads signals directly from the store +- mutation methods are the only place that update domain state +- derived values use `computed()` instead of recalculating in every component +- UI state stays separate from domain state + +## Component Contract + +Components should be plain functions that subscribe only to the signals they read. + +Example: + +```js +function MembersCard({ store, actions }) { + const members = store.roster().members; + const canManageMembers = store.canManageMembers(); + + return Card({ + title: "Members", + body: List({ + items: members, + key: (member) => member.uid, + renderItem: (member) => + MemberRow({ + member, + canRemove: canManageMembers && !store.isProtectedMember(member), + onRemove: () => actions.removeMember(member.uid), + }), + }), + }); +} +``` + +In this model: + +- `MembersCard` rerenders when `roster().members` changes +- it does not rerender when treasury funds change +- `TreasuryCard` rerenders when `treasury()` changes +- modal components rerender when `ui().modal` changes + +## Patch-Oriented Mutations + +Interactive actions should prefer small patch events over full app hydration. + +Recommended event examples: + +- `org::member::added` +- `org::member::removed` +- `org::member::creditUpdated` +- `org::treasury::fundsUpdated` +- `org::notice::show` + +Initial load can still use a hydrate event: + +- `org::hydrate` + +But actions like assigning credit lines should not require rebuilding the full portal payload. + +Example: + +```js +bridge.on("org::member::creditUpdated", ({ memberUid, memberName, amount }) => { + store.upsertCreditLine({ + uid: memberUid, + member: memberName, + amount, + }); +}); +``` + +## List Reconciliation + +To make targeted updates real, list rendering must be keyed. + +Requirement: + +- every repeated domain item must have a stable key + +Examples: + +- members use `uid` +- credit lines use `uid` +- assets use `className` or inventory id +- fleet entries use vehicle id + +Without keyed reconciliation, a list change still forces the entire list DOM to be replaced. + +## Org UI Example + +Using the current organization portal as the model: + +### `MembersCard` + +Depends on: + +- `store.roster().members` +- membership permission selectors + +Should update when: + +- a member is added +- a member is removed +- a member name or role changes + +Should not update when: + +- treasury funds change +- a modal opens +- a fleet item changes + +### `TreasuryCard` + +Depends on: + +- `store.treasury().funds` +- `store.treasury().creditLines` +- treasury permissions +- `store.ui().treasuryTab` + +Should update when: + +- funds change +- a credit line is added or updated +- the user changes treasury tab + +Should not update when: + +- member roster changes unrelated to treasury display +- fleet changes + +### `ModalLayer` + +Depends on: + +- `store.ui().modal` + +Should update when: + +- a modal opens +- a modal closes +- modal payload changes + +Should not update when unrelated domain state changes. + +## Mutation Examples + +### Add member + +```js +addMember(member) { + this.roster.update((state) => ({ + ...state, + members: [...state.members, member], + })); +} +``` + +Only subscribers to `roster` rerender. + +### Update credit line + +```js +upsertCreditLine(nextLine) { + this.treasury.update((state) => { + const exists = state.creditLines.some((line) => line.uid === nextLine.uid); + + return { + ...state, + creditLines: exists + ? state.creditLines.map((line) => + line.uid === nextLine.uid ? nextLine : line + ) + : [...state.creditLines, nextLine], + }; + }); +} +``` + +Only subscribers to `treasury` rerender. + +## Bridge Response Strategy + +For responsive UIs, each server-backed action should define: + +- request event +- success patch event +- failure notice event or payload + +Example credit line flow: + +1. JS sends `org::credit::request` +2. SQF/server validates and persists +3. SQF sends: + - `org::member::creditUpdated` on success + - `org::credit::failure` on failure +4. JS store applies a targeted patch +5. `TreasuryCard` and any dependent member row update + +This is preferable to sending a full `org::sync` after every action. + +## Shared Components + +The common addon should provide plain, themeable primitives only. + +Recommended first set: + +- app shell +- title bar +- navbar +- modal +- notice/toast +- stat card +- empty state +- action row +- form field +- spinner +- error banner + +These should accept data and callbacks, not own business logic. + +## Styling Model + +Use layered CSS: + +1. common tokens +2. common primitives +3. feature theme +4. feature view styles + +The common layer should define: + +- spacing scale +- type scale +- colors +- elevation/shadows +- radius +- focus states +- motion durations + +Feature UIs should override tokens rather than rewriting primitive CSS. + +## Asset Loading + +The loader should support: + +- `A3API.RequestFile` +- `A3API.RequestTexture` +- local `fetch()` fallback for browser testing + +Recommended change: + +- stop loading many small scripts individually in production +- build one common runtime file and one feature app file +- keep source files split in repo, but ship bundled outputs into `_site` + +That reduces browser startup cost and simplifies ordering problems. + +## Error Handling + +The framework should standardize: + +- bridge unavailable errors +- malformed payload errors +- timeout handling for requests that expect responses +- visible in-UI notices for recoverable failures +- `console.error` plus `diag_log` friendly payloads + +Recommended bridge helper: + +```js +bridge.request("store::checkout::request", payload, { + pending: "Submitting order...", + timeoutMs: 15000, + onTimeout() { + notices.error("The checkout request timed out."); + } +}); +``` + +## Migration Plan + +### Phase 1 + +Extract common pieces without changing app behavior: + +- shared JS host adapter +- shared JS bridge +- shared signal/runtime +- shared SQF bridge base class + +### Phase 2 + +Migrate `org` and `store` first because they already use the same custom runtime pattern. + +### Phase 3 + +Migrate `bank`, `garage`, and `notifications`. + +### Phase 4 + +Migrate `actor`, which may need more event-heavy interaction handling. + +### Phase 5 + +Bundle all `_site` apps into production-ready outputs. + +## First Implementation Targets + +The first concrete files to build should be: + +1. `arma/client/addons/common/ui/src/host.js` +2. `arma/client/addons/common/ui/src/runtime.js` +3. `arma/client/addons/common/ui/src/bridge.js` +4. `arma/client/addons/common/ui/src/app.js` +5. `arma/client/addons/common/functions/fnc_initWebUIBridge.sqf` + +Those five pieces establish the core contract. After that, `org` and `store` can be migrated with low risk. + +## Non-Goals + +At least initially, this framework should not try to provide: + +- client-side routing between pages +- SSR or pre-rendering +- JSX compilation +- TypeScript-only tooling assumptions +- a giant component system +- generalized diffing for every possible DOM edge case + +This should stay focused on Arma in-browser application UIs. + +## Recommended Direction + +Use `forge_client_common` as the host for a small custom reactive framework, not as a dumping ground for copied app utilities. + +The correct abstraction boundary is: + +- `common` owns the browser platform +- each addon owns the application + +That gives one UI system across the repo without forcing all screens into one monolithic app. diff --git a/arma/client/addons/common/XEH_PREP.hpp b/arma/client/addons/common/XEH_PREP.hpp new file mode 100644 index 0000000..ae721c8 --- /dev/null +++ b/arma/client/addons/common/XEH_PREP.hpp @@ -0,0 +1,2 @@ + +PREP(initWebUIBridge); diff --git a/arma/client/addons/common/XEH_preInit.sqf b/arma/client/addons/common/XEH_preInit.sqf new file mode 100644 index 0000000..dbef1ae --- /dev/null +++ b/arma/client/addons/common/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +// #include "initSettings.inc.sqf" +// #include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/common/XEH_preStart.sqf b/arma/client/addons/common/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/common/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/common/config.cpp b/arma/client/addons/common/config.cpp new file mode 100644 index 0000000..68199a3 --- /dev/null +++ b/arma/client/addons/common/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgSounds.hpp" +#include "CfgVehicles.hpp" diff --git a/arma/client/addons/common/functions/fnc_initWebUIBridge.sqf b/arma/client/addons/common/functions/fnc_initWebUIBridge.sqf new file mode 100644 index 0000000..15450d6 --- /dev/null +++ b/arma/client/addons/common/functions/fnc_initWebUIBridge.sqf @@ -0,0 +1,209 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initWebUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-13 + * Last Update: 2026-03-13 + * Public: No + * + * Description: + * Initializes the shared web UI bridge and screen declarations used by + * CT_WEBBROWSER feature bridges. + * + * Arguments: + * None + * + * Return Value: + * Web UI bridge declarations [HASHMAP] + * + * Example: + * call forge_client_common_fnc_initWebUIBridge + */ + +if !(isNil QGVAR(WebUIScreenDeclaration) || { isNil QGVAR(WebUIBridgeDeclaration) }) exitWith { + createHashMapFromArray [ + ["bridgeDeclaration", GVAR(WebUIBridgeDeclaration)], + ["screenDeclaration", GVAR(WebUIScreenDeclaration)] + ] +}; + +#pragma hemtt ignore_variables ["_self"] +GVAR(WebUIScreenDeclaration) = compileFinal createHashMapFromArray [ + ["#type", "IWebUIScreen"], + ["#create", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self set ["control", _control]; + _self set ["readyState", false]; + _self set ["pendingEvents", []]; + }], + ["dispose", compileFinal { + _self set ["control", controlNull]; + _self set ["readyState", false]; + _self set ["pendingEvents", []]; + + true + }], + ["getControl", compileFinal { + _self getOrDefault ["control", controlNull] + }], + ["consumePendingEvents", compileFinal { + private _pendingEvents = +(_self getOrDefault ["pendingEvents", []]); + _self set ["pendingEvents", []]; + + _pendingEvents + }], + ["isReady", compileFinal { + _self getOrDefault ["readyState", false] + }], + ["markReady", compileFinal { + params [["_isReady", true, [false]]]; + + _self set ["readyState", _isReady]; + _isReady + }], + ["queueEvent", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _pendingEvents = +(_self getOrDefault ["pendingEvents", []]); + _pendingEvents pushBack _payload; + _self set ["pendingEvents", _pendingEvents]; + + count _pendingEvents + }], + ["setControl", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self set ["control", _control]; + _control + }], + ["#delete", compileFinal { + _self call ["dispose", []]; + }] +]; + +GVAR(WebUIBridgeDeclaration) = compileFinal createHashMapFromArray [ + ["#type", "IWebUIBridge"], + ["#create", compileFinal { + _self set ["screen", createHashMapObject [GVAR(WebUIScreenDeclaration)]]; + }], + ["deliverPayload", compileFinal { + params [["_control", controlNull, [controlNull]], ["_payload", createHashMap, [createHashMap]]]; + + if (isNull _control) exitWith { false }; + + private _json = toJSON _payload; + _control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]]; + + true + }], + ["execJS", compileFinal { + params [["_control", controlNull, [controlNull]], ["_statement", "", [""]]]; + + if (isNull _control || { _statement isEqualTo "" }) exitWith { false }; + + _control ctrlWebBrowserAction ["ExecJS", _statement]; + true + }], + ["flushPendingEvents", compileFinal { + private _screen = _self call ["getScreen", []]; + private _control = _self call ["getActiveBrowserControl", []]; + if (isNull _control) exitWith { 0 }; + + private _pendingEvents = _screen call ["consumePendingEvents", []]; + + { + _self call ["deliverPayload", [_control, _x]]; + } forEach _pendingEvents; + + count _pendingEvents + }], + ["getActiveBrowserControl", compileFinal { + private _screen = _self call ["getScreen", []]; + _screen call ["getControl", []] + }], + ["getScreen", compileFinal { + private _hasScreen = "screen" in _self; + private _screen = if (_hasScreen) then { + _self get "screen" + } else { + createHashMap + }; + + if (!_hasScreen) then { + _screen = createHashMapObject [GVAR(WebUIScreenDeclaration)]; + _self set ["screen", _screen]; + }; + + _screen + }], + ["handleClose", compileFinal { + private _screen = _self call ["getScreen", []]; + _screen call ["dispose", []] + }], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["setControl", [_control]]; + _screen call ["markReady", [true]]; + + _self call ["flushPendingEvents", []]; + true + }], + ["queueEvent", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["queueEvent", [_payload]] + }], + ["sendEvent", compileFinal { + params [ + ["_event", "", [""]], + ["_data", createHashMap, [createHashMap]], + ["_control", controlNull, [controlNull]] + ]; + + if (_event isEqualTo "") exitWith { false }; + + private _payload = createHashMapFromArray [ + ["event", _event], + ["data", _data] + ]; + private _screen = _self call ["getScreen", []]; + private _targetControl = _control; + + if (isNull _targetControl) then { + _targetControl = _self call ["getActiveBrowserControl", []]; + }; + + if (isNull _targetControl) exitWith { + _self call ["queueEvent", [_payload]]; + false + }; + + _screen call ["setControl", [_targetControl]]; + + if !(_screen call ["isReady", []]) exitWith { + _self call ["queueEvent", [_payload]]; + false + }; + + _self call ["deliverPayload", [_targetControl, _payload]] + }], + ["setActiveBrowserControl", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["setControl", [_control]] + }], + ["#delete", compileFinal { + _self call ["handleClose", []]; + }] +]; + +createHashMapFromArray [ + ["bridgeDeclaration", GVAR(WebUIBridgeDeclaration)], + ["screenDeclaration", GVAR(WebUIScreenDeclaration)] +] diff --git a/arma/client/addons/common/script_component.hpp b/arma/client/addons/common/script_component.hpp new file mode 100644 index 0000000..39adea8 --- /dev/null +++ b/arma/client/addons/common/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT common +#define COMPONENT_BEAUTIFIED Common +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/common/sounds/defused.wav b/arma/client/addons/common/sounds/defused.wav new file mode 100644 index 0000000..a3d067f Binary files /dev/null and b/arma/client/addons/common/sounds/defused.wav differ diff --git a/arma/client/addons/common/sounds/timerClick.wav b/arma/client/addons/common/sounds/timerClick.wav new file mode 100644 index 0000000..4dcbbeb Binary files /dev/null and b/arma/client/addons/common/sounds/timerClick.wav differ diff --git a/arma/client/addons/common/sounds/timerClickShort.wav b/arma/client/addons/common/sounds/timerClickShort.wav new file mode 100644 index 0000000..8216e58 Binary files /dev/null and b/arma/client/addons/common/sounds/timerClickShort.wav differ diff --git a/arma/client/addons/common/sounds/timerEnd.wav b/arma/client/addons/common/sounds/timerEnd.wav new file mode 100644 index 0000000..1297da8 Binary files /dev/null and b/arma/client/addons/common/sounds/timerEnd.wav differ diff --git a/arma/client/addons/common/stringtable.xml b/arma/client/addons/common/stringtable.xml new file mode 100644 index 0000000..1ba94dc --- /dev/null +++ b/arma/client/addons/common/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Common + + + diff --git a/arma/client/addons/common/ui/_site/forge-site-loader.js b/arma/client/addons/common/ui/_site/forge-site-loader.js new file mode 100644 index 0000000..529e33b --- /dev/null +++ b/arma/client/addons/common/ui/_site/forge-site-loader.js @@ -0,0 +1 @@ +!function(e){const o=e.ForgeSiteLoader=e.ForgeSiteLoader||{};function t(e){return"string"==typeof e&&e.startsWith("forge\\")}function r({addonRoot:e,browserBase:o,assetPath:r}){if("undefined"!=typeof A3API&&A3API&&"function"==typeof A3API.RequestFile){const o=t(r)?r:e+String(r||"").replace(/\//g,"\\");return A3API.RequestFile(o)}const n=t(r)?r:function(e,o){return`${String(e||"./").replace(/\\/g,"/")}${String(o||"").replace(/\\/g,"/")}`}(o,r);return fetch(n).then(e=>{if(!e.ok)throw new Error(`Failed to load ${n}`);return e.text()})}function n(e){const o=document.createElement("style");o.textContent=e,document.head.appendChild(o)}function a(e){const o=document.createElement("script");o.text=e,document.head.appendChild(o)}async function i(e){const o=e&&e.addonName?e.addonName:"";if(!o)throw new Error("ForgeSiteLoader requires a config.addonName value.");const t=e.addonRoot||function(e){return`forge\\forge_client\\addons\\${e}\\ui\\_site\\`}(o),i=e.browserAddonBase||"./",s=e.browserCommonBase||"../../../common/ui/_site/",c=Array.isArray(e.styles)?e.styles:[],d=Array.isArray(e.commonScripts)?e.commonScripts:[],f=Array.isArray(e.scripts)?e.scripts:[];(await Promise.all(c.map(e=>r({addonRoot:t,browserBase:i,assetPath:e})))).forEach(n);(await Promise.all(d.map(e=>r({addonRoot:"forge\\forge_client\\addons\\common\\ui\\_site\\",browserBase:s,assetPath:e})))).forEach(a);(await Promise.all(f.map(e=>r({addonRoot:t,browserBase:i,assetPath:e})))).forEach(a)}o.boot=i,e.ForgeSiteConfig&&!1!==e.ForgeSiteConfig.autoBoot&&i(e.ForgeSiteConfig).catch(o=>{const t=e.ForgeSiteConfig.logLabel||e.ForgeSiteConfig.addonName||"Forge UI";console.error(`[${t}] Failed to load site assets.`,o)})}(window); \ No newline at end of file diff --git a/arma/client/addons/common/ui/_site/forge-webui.js b/arma/client/addons/common/ui/_site/forge-webui.js new file mode 100644 index 0000000..66fb106 --- /dev/null +++ b/arma/client/addons/common/ui/_site/forge-webui.js @@ -0,0 +1 @@ +!function(e){const n=e.ForgeWebUI=e.ForgeWebUI||{},t=new Set(["svg","path","circle","rect","line","polyline","polygon","g","defs","use","text","tspan","clipPath","mask"]),o=new Set,r=new Set;let i=null,c=0,a=!1;function l(){for(;r.size>0;){const e=Array.from(r);r.clear(),e.forEach(e=>u(e))}}function s(e){if("function"==typeof e.cleanup)try{e.cleanup()}catch(e){console.error("[ForgeWebUI] Observer cleanup failed.",e)}e.cleanup=null,e.dependencies.forEach(n=>{n.delete(e)}),e.dependencies.clear()}function u(e){if(!e||e.disposed)return;s(e);const n=i;i=e;try{const n=e.fn();"function"==typeof n&&(e.cleanup=n)}catch(e){console.error("[ForgeWebUI] Observer execution failed.",e)}finally{i=n}}function d(e){e&&!e.disposed&&(r.add(e),a||c>0||(a=!0,queueMicrotask(()=>{a=!1,l()})))}function f(e){let n=e;const t=new Set;function o(){var e;return e=t,i&&(e.add(i),i.dependencies.add(e)),n}return o.peek=()=>n,o.set=e=>{const o="function"==typeof e?e(n):e;return Object.is(o,n)||(n=o,t.forEach(e=>d(e))),n},o.update=e=>o.set(e),o.subscribe=e=>b(()=>{e(o())}),o}function b(e){const n={cleanup:null,dependencies:new Set,disposed:!1,fn:e,dispose:()=>{n.disposed||(n.disposed=!0,r.delete(n),s(n))}};return u(n),n.dispose}function p(e,n){null!=n&&!1!==n&&(Array.isArray(n)?n.forEach(n=>p(e,n)):"string"!=typeof n&&"number"!=typeof n&&"bigint"!=typeof n?n instanceof Node&&e.appendChild(n):e.appendChild(document.createTextNode(String(n))))}function m(...e){const n=document.createDocumentFragment();return e.forEach(e=>p(n,e)),n}function w(e){return document.createTextNode(String(e??""))}function g(e){return null==e||!1===e?document.createDocumentFragment():Array.isArray(e)?m(...e):"string"==typeof e||"number"==typeof e||"bigint"==typeof e?w(e):e instanceof Node?e:document.createDocumentFragment()}function y(e,n,t={}){const o=!1!==t.preserveScroll,r=b(()=>{const t=o?function(e){return Array.from(e.querySelectorAll("[data-preserve-scroll-id]")).map(e=>({id:e.getAttribute("data-preserve-scroll-id"),scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}))}(e):[],r=g(n());e.replaceChildren(r),o&&t.length>0&&requestAnimationFrame(()=>{!function(e,n){Array.isArray(n)&&0!==n.length&&n.forEach(n=>{if(!n||!n.id)return;const t=e.querySelector(`[data-preserve-scroll-id="${n.id}"]`);t&&(t.scrollTop=Number(n.scrollTop||0),t.scrollLeft=Number(n.scrollLeft||0))})}(e,t)})});return{container:e,dispose:r,rerender(){e.replaceChildren(g(n()))}}}n.batch=function(e){c+=1;try{return e()}finally{c=Math.max(0,c-1),0===c&&l()}},n.computed=function(e){const n=f(void 0);let t=!1;return b(()=>{const o=e();t&&Object.is(o,n.peek())||(t=!0,n.set(o))}),n},n.createSignal=function(e){const n=f(e);return[n,n.set]},n.effect=b,n.ensureScopedStyle=function(e,n){if(!e||!n||o.has(e))return;const t=document.createElement("style");t.setAttribute("data-ui-style",e),t.textContent=n,document.head.appendChild(t),o.add(e)},n.fragment=m,n.h=function(e,n={},...o){const r=t.has(e),i=r?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return n&&"object"==typeof n&&Object.entries(n).forEach(([e,n])=>{!function(e,n,t,o){"key"!==n&&("ref"!==n||"function"!=typeof t?"className"!==n?"style"===n&&t&&"object"==typeof t?Object.assign(e.style,t):"dataset"===n&&t&&"object"==typeof t?Object.entries(t).forEach(([n,t])=>{e.dataset[n]=t}):n.startsWith("on")&&"function"==typeof t?e.addEventListener(n.slice(2).toLowerCase(),t):"value"===n&&"value"in e?e.value=t??"":"checked"===n&&"checked"in e?e.checked=Boolean(t):"selected"===n&&"selected"in e?e.selected=Boolean(t):"boolean"!=typeof t?null!=t?e.setAttribute(n,t):e.removeAttribute(n):t?e.setAttribute(n,""):e.removeAttribute(n):o?e.setAttribute("class",t||""):e.className=t||"":t(e))}(i,e,n,r)}),o.forEach(e=>p(i,e)),i},n.mount=y,n.render=function(e,n,t={}){return y(n,e,t)},n.signal=f,n.text=w,n.unmount=function(e){e&&"function"==typeof e.dispose&&e.dispose()}}(window),function(e){(e.ForgeWebUI=e.ForgeWebUI||{}).createHost=function(){const n=e.A3API;return{isArma:Boolean(n),close(e="ui::close",n={}){return this.send(e,n)},exec:e=>!(!n||"function"!=typeof n.Exec||"string"!=typeof e)&&(n.Exec(e),!0),requestFile:e=>n&&"function"==typeof n.RequestFile?n.RequestFile(e):fetch(e).then(n=>{if(!n.ok)throw new Error(`Failed to load ${e}`);return n.text()}),requestTexture:(e,t=512)=>n&&"function"==typeof n.RequestTexture?n.RequestTexture(e,t):Promise.reject(new Error("Texture requests are unavailable outside Arma.")),send:(e,t={})=>!(!n||"function"!=typeof n.SendAlert||"string"!=typeof e||""===e)&&(n.SendAlert(JSON.stringify({event:e,data:t})),!0)}}}(window),function(e){const n=e.ForgeWebUI=e.ForgeWebUI||{};n.createBridge=function(t={}){const o=t.host&&"object"==typeof t.host?t.host:n.createHost(),r=t.globalName||"ForgeBridge",i=t.readyEvent||"ui::ready",c=t.closeEvent||"ui::close",a=new Map;function l(e,n){const t=a.get(e);t&&0!==t.size&&t.forEach(t=>{try{t(n)}catch(n){console.error(`[ForgeWebUI] Bridge listener failed for ${e}.`,n)}})}function s(e,n={}){const t=String("object"==typeof e&&null!==e?e.event||"":e||""),o="object"==typeof e&&null!==e?e.data||{}:n;return!!t&&(l(t,o),l("*",{data:o,event:t}),!0)}function u(e){return!!Array.isArray(e)&&(e.forEach(e=>s(e)),!0)}const d={ping:()=>!0,receive:s,receiveMany:u,reset:()=>(a.clear(),!0)},f={close:(e={})=>o.send(c,e),emit:l,host:o,installCompatibility:n=>(n&&(e[n]=d),f),off(e,n){const t=a.get(e);return!!t&&(t.delete(n),0===t.size&&a.delete(e),!0)},on:(e,n)=>(function(e){return a.has(e)||a.set(e,new Set),a.get(e)}(e).add(n),()=>f.off(e,n)),ready:(e={loaded:!0})=>o.send(i,e),receive:s,receiveMany:u,request:(e,n={})=>o.send(e,n),send:(e,n={})=>o.send(e,n)};return e[r]=d,f}}(window),function(e){const n=e.ForgeWebUI=e.ForgeWebUI||{};n.createApp=function(e={}){const t=e.name||"app",o=e.root||"#app",r="function"==typeof e.setup?e.setup:()=>{};let i=!1;return{start:function(){if(i)return;i=!0;const e=()=>{const e=function(e){return e?"string"==typeof e?document.querySelector(e):e instanceof Element?e:null:null}(o);e?r({name:t,root:e,runtime:n}):console.error(`[ForgeWebUI] Root node not found for ${t}.`)};"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}}}}(window),function(e){const n=e.ForgeWebUI,t=e.SharedUI=e.SharedUI||{},{h:o,ensureScopedStyle:r}=n;function i({type:e}){return"minimize"===e?o("svg",{className:"ui-window-control-icon",viewBox:"0 0 16 16","aria-hidden":"true"},o("line",{x1:"3",y1:"8",x2:"13",y2:"8"})):"maximize"===e?o("svg",{className:"ui-window-control-icon",viewBox:"0 0 16 16","aria-hidden":"true"},o("rect",{x:"3.5",y:"3.5",width:"9",height:"9"})):o("svg",{className:"ui-window-control-icon",viewBox:"0 0 16 16","aria-hidden":"true"},o("line",{x1:"4",y1:"4",x2:"12",y2:"12"}),o("line",{x1:"12",y1:"4",x2:"4",y2:"12"}))}t.componentFns=t.componentFns||{},t.componentFns.WindowTitleBar=function({kicker:e="",title:n="",onClose:t=null,closeLabel:c="Close interface",minimizeLabel:a="Minimize unavailable",maximizeLabel:l="Maximize unavailable"}={}){return r("shared-window-titlebar","\n.ui-window-titlebar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: var(--ui-titlebar-min-height, 3.5rem);\n padding: var(--ui-titlebar-padding, 0.65rem 0.8rem 0.7rem 0.95rem);\n background: var(\n --ui-titlebar-bg,\n linear-gradient(180deg, #12325b 0%, #0d2643 100%)\n );\n color: var(--ui-titlebar-text, #f4f8fd);\n border-bottom: 1px solid var(--ui-titlebar-border, rgb(33 73 120 / 1));\n box-shadow: var(--ui-titlebar-shadow, 0 8px 18px rgb(18 50 91 / 0.18));\n position: var(--ui-titlebar-position, relative);\n top: var(--ui-titlebar-top, auto);\n z-index: var(--ui-titlebar-z-index, 5);\n flex-shrink: 0;\n}\n\n.ui-window-titlebar-brand {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 0.1rem;\n min-width: 0;\n}\n\n.ui-window-titlebar-kicker {\n font-size: 0.64rem;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--ui-titlebar-kicker-color, rgb(214 227 241 / 0.72));\n}\n\n.ui-window-titlebar-title {\n font-size: var(--ui-titlebar-title-size, 1rem);\n font-weight: 700;\n line-height: 1.1;\n letter-spacing: var(--ui-titlebar-title-spacing, -0.03em);\n color: inherit;\n}\n\n.ui-window-titlebar-controls {\n display: flex;\n align-items: center;\n gap: 0.12rem;\n}\n\n.ui-window-control-btn {\n min-width: 2rem;\n height: 2rem;\n margin: 0;\n padding: 0;\n border-radius: 0.38rem;\n border: 1px solid var(--ui-window-control-border, rgb(197 220 243 / 0.16));\n background: var(--ui-window-control-bg, rgb(255 255 255 / 0.04));\n color: var(--ui-window-control-text, rgb(237 244 251 / 0.88));\n line-height: 1;\n font-size: 0.82rem;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n box-shadow: none;\n transform: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.ui-window-control-btn + .ui-window-control-btn {\n margin-left: 0;\n}\n\n.ui-window-control-btn:hover {\n background: var(--ui-window-control-hover-bg, rgb(255 255 255 / 0.04));\n box-shadow: none;\n transform: none;\n}\n\n.ui-window-control-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ui-window-control-btn.is-close {\n cursor: pointer;\n opacity: 1;\n background: var(--ui-window-control-close-bg, rgb(255 255 255 / 0.1));\n}\n\n.ui-window-control-btn.is-close:hover {\n background: var(\n --ui-window-control-close-hover-bg,\n rgb(185 67 67 / 0.9)\n );\n border-color: var(\n --ui-window-control-close-hover-border,\n rgb(255 222 222 / 0.45)\n );\n}\n\n.ui-window-control-icon {\n width: 0.78rem;\n height: 0.78rem;\n stroke: currentColor;\n fill: none;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n pointer-events: none;\n}\n\n@media (max-width: 960px) {\n .ui-window-titlebar {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .ui-window-titlebar-controls {\n width: 100%;\n justify-content: flex-end;\n }\n}\n"),o("div",{className:"ui-window-titlebar"},o("div",{className:"ui-window-titlebar-brand"},e?o("span",{className:"ui-window-titlebar-kicker"},e):null,o("span",{className:"ui-window-titlebar-title"},n)),o("div",{className:"ui-window-titlebar-controls"},o("button",{type:"button",className:"ui-window-control-btn",disabled:!0,title:a,"aria-label":a},i({type:"minimize"})),o("button",{type:"button",className:"ui-window-control-btn",disabled:!0,title:l,"aria-label":l},i({type:"maximize"})),o("button",{type:"button",className:"ui-window-control-btn is-close",title:"Close","aria-label":c,onClick:"function"==typeof t?t:()=>{}},i({type:"close"}))))}}(window),function(e){(e.ForgeWebUI=e.ForgeWebUI||{}).version="0.1.0"}(window); \ No newline at end of file diff --git a/arma/client/addons/common/ui/src/app.js b/arma/client/addons/common/ui/src/app.js new file mode 100644 index 0000000..a3ad096 --- /dev/null +++ b/arma/client/addons/common/ui/src/app.js @@ -0,0 +1,60 @@ +(function (global) { + const ForgeWebUI = (global.ForgeWebUI = global.ForgeWebUI || {}); + + function resolveRoot(root) { + if (!root) { + return null; + } + + if (typeof root === "string") { + return document.querySelector(root); + } + + return root instanceof Element ? root : null; + } + + function createApp(options = {}) { + const name = options.name || "app"; + const root = options.root || "#app"; + const setup = + typeof options.setup === "function" ? options.setup : () => {}; + let started = false; + + function start() { + if (started) { + return; + } + + started = true; + + const boot = () => { + const rootNode = resolveRoot(root); + if (!rootNode) { + console.error( + `[ForgeWebUI] Root node not found for ${name}.`, + ); + return; + } + + setup({ + name, + root: rootNode, + runtime: ForgeWebUI, + }); + }; + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", boot, { + once: true, + }); + return; + } + + boot(); + } + + return { start }; + } + + ForgeWebUI.createApp = createApp; +})(window); diff --git a/arma/client/addons/common/ui/src/bridge.js b/arma/client/addons/common/ui/src/bridge.js new file mode 100644 index 0000000..877f393 --- /dev/null +++ b/arma/client/addons/common/ui/src/bridge.js @@ -0,0 +1,128 @@ +(function (global) { + const ForgeWebUI = (global.ForgeWebUI = global.ForgeWebUI || {}); + + function createBridge(options = {}) { + const host = + options.host && typeof options.host === "object" + ? options.host + : ForgeWebUI.createHost(); + const globalName = options.globalName || "ForgeBridge"; + const readyEvent = options.readyEvent || "ui::ready"; + const closeEvent = options.closeEvent || "ui::close"; + const listeners = new Map(); + + function getListeners(eventName) { + if (!listeners.has(eventName)) { + listeners.set(eventName, new Set()); + } + + return listeners.get(eventName); + } + + function emit(eventName, payload) { + const eventListeners = listeners.get(eventName); + if (!eventListeners || eventListeners.size === 0) { + return; + } + + eventListeners.forEach((listener) => { + try { + listener(payload); + } catch (error) { + console.error( + `[ForgeWebUI] Bridge listener failed for ${eventName}.`, + error, + ); + } + }); + } + + function receive(eventOrPayload, data = {}) { + const eventName = + typeof eventOrPayload === "object" && eventOrPayload !== null + ? String(eventOrPayload.event || "") + : String(eventOrPayload || ""); + const payload = + typeof eventOrPayload === "object" && eventOrPayload !== null + ? eventOrPayload.data || {} + : data; + + if (!eventName) { + return false; + } + + emit(eventName, payload); + emit("*", { data: payload, event: eventName }); + return true; + } + + function receiveMany(events) { + if (!Array.isArray(events)) { + return false; + } + + events.forEach((payload) => receive(payload)); + return true; + } + + const globalBridge = { + ping() { + return true; + }, + receive, + receiveMany, + reset() { + listeners.clear(); + return true; + }, + }; + + const api = { + close(data = {}) { + return host.send(closeEvent, data); + }, + emit, + host, + installCompatibility(name) { + if (name) { + global[name] = globalBridge; + } + + return api; + }, + off(eventName, listener) { + const eventListeners = listeners.get(eventName); + if (!eventListeners) { + return false; + } + + eventListeners.delete(listener); + if (eventListeners.size === 0) { + listeners.delete(eventName); + } + + return true; + }, + on(eventName, listener) { + getListeners(eventName).add(listener); + return () => api.off(eventName, listener); + }, + ready(data = { loaded: true }) { + return host.send(readyEvent, data); + }, + receive, + receiveMany, + request(eventName, payload = {}) { + return host.send(eventName, payload); + }, + send(eventName, payload = {}) { + return host.send(eventName, payload); + }, + }; + + global[globalName] = globalBridge; + return api; + } + + ForgeWebUI.createBridge = createBridge; +})(window); diff --git a/arma/client/addons/common/ui/src/host.js b/arma/client/addons/common/ui/src/host.js new file mode 100644 index 0000000..8c199fd --- /dev/null +++ b/arma/client/addons/common/ui/src/host.js @@ -0,0 +1,68 @@ +(function (global) { + const ForgeWebUI = (global.ForgeWebUI = global.ForgeWebUI || {}); + + function createHost() { + const api = global.A3API; + + return { + isArma: Boolean(api), + close(event = "ui::close", data = {}) { + return this.send(event, data); + }, + exec(statement) { + if ( + !api || + typeof api.Exec !== "function" || + typeof statement !== "string" + ) { + return false; + } + + api.Exec(statement); + return true; + }, + requestFile(path) { + if (api && typeof api.RequestFile === "function") { + return api.RequestFile(path); + } + + return fetch(path).then((response) => { + if (!response.ok) { + throw new Error(`Failed to load ${path}`); + } + + return response.text(); + }); + }, + requestTexture(path, size = 512) { + if (api && typeof api.RequestTexture === "function") { + return api.RequestTexture(path, size); + } + + return Promise.reject( + new Error("Texture requests are unavailable outside Arma."), + ); + }, + send(event, data = {}) { + if ( + !api || + typeof api.SendAlert !== "function" || + typeof event !== "string" || + event === "" + ) { + return false; + } + + api.SendAlert( + JSON.stringify({ + event, + data, + }), + ); + return true; + }, + }; + } + + ForgeWebUI.createHost = createHost; +})(window); diff --git a/arma/client/addons/common/ui/src/index.js b/arma/client/addons/common/ui/src/index.js new file mode 100644 index 0000000..ef53b2e --- /dev/null +++ b/arma/client/addons/common/ui/src/index.js @@ -0,0 +1,5 @@ +(function (global) { + const ForgeWebUI = (global.ForgeWebUI = global.ForgeWebUI || {}); + + ForgeWebUI.version = "0.1.0"; +})(window); diff --git a/arma/client/addons/common/ui/src/runtime.js b/arma/client/addons/common/ui/src/runtime.js new file mode 100644 index 0000000..aa453b3 --- /dev/null +++ b/arma/client/addons/common/ui/src/runtime.js @@ -0,0 +1,428 @@ +(function (global) { + const ForgeWebUI = (global.ForgeWebUI = global.ForgeWebUI || {}); + + const SVG_NS = "http://www.w3.org/2000/svg"; + const SVG_TAGS = new Set([ + "svg", + "path", + "circle", + "rect", + "line", + "polyline", + "polygon", + "g", + "defs", + "use", + "text", + "tspan", + "clipPath", + "mask", + ]); + + const injectedStyles = new Set(); + const scheduledObservers = new Set(); + let activeObserver = null; + let batchDepth = 0; + let flushQueued = false; + + function queueFlush() { + if (flushQueued || batchDepth > 0) { + return; + } + + flushQueued = true; + queueMicrotask(() => { + flushQueued = false; + flushObservers(); + }); + } + + function flushObservers() { + while (scheduledObservers.size > 0) { + const queue = Array.from(scheduledObservers); + scheduledObservers.clear(); + queue.forEach((observer) => runObserver(observer)); + } + } + + function cleanupObserver(observer) { + if (typeof observer.cleanup === "function") { + try { + observer.cleanup(); + } catch (error) { + console.error("[ForgeWebUI] Observer cleanup failed.", error); + } + } + + observer.cleanup = null; + observer.dependencies.forEach((dependency) => { + dependency.delete(observer); + }); + observer.dependencies.clear(); + } + + function runObserver(observer) { + if (!observer || observer.disposed) { + return; + } + + cleanupObserver(observer); + + const previousObserver = activeObserver; + activeObserver = observer; + + try { + const cleanup = observer.fn(); + if (typeof cleanup === "function") { + observer.cleanup = cleanup; + } + } catch (error) { + console.error("[ForgeWebUI] Observer execution failed.", error); + } finally { + activeObserver = previousObserver; + } + } + + function scheduleObserver(observer) { + if (!observer || observer.disposed) { + return; + } + + scheduledObservers.add(observer); + queueFlush(); + } + + function trackDependency(dependency) { + if (!activeObserver) { + return; + } + + dependency.add(activeObserver); + activeObserver.dependencies.add(dependency); + } + + function createSignalValue(initialValue) { + let value = initialValue; + const subscribers = new Set(); + + function read() { + trackDependency(subscribers); + return value; + } + + read.peek = () => value; + read.set = (nextValue) => { + const resolvedValue = + typeof nextValue === "function" ? nextValue(value) : nextValue; + + if (Object.is(resolvedValue, value)) { + return value; + } + + value = resolvedValue; + subscribers.forEach((observer) => scheduleObserver(observer)); + return value; + }; + read.update = (updater) => read.set(updater); + read.subscribe = (listener) => + effect(() => { + listener(read()); + }); + + return read; + } + + function createSignal(initialValue) { + const signal = createSignalValue(initialValue); + return [signal, signal.set]; + } + + function computed(factory) { + const valueSignal = createSignalValue(undefined); + let initialized = false; + + effect(() => { + const nextValue = factory(); + if (!initialized || !Object.is(nextValue, valueSignal.peek())) { + initialized = true; + valueSignal.set(nextValue); + } + }); + + return valueSignal; + } + + function effect(fn) { + const observer = { + cleanup: null, + dependencies: new Set(), + disposed: false, + fn, + }; + + observer.dispose = () => { + if (observer.disposed) { + return; + } + + observer.disposed = true; + scheduledObservers.delete(observer); + cleanupObserver(observer); + }; + + runObserver(observer); + return observer.dispose; + } + + function batch(fn) { + batchDepth += 1; + + try { + return fn(); + } finally { + batchDepth = Math.max(0, batchDepth - 1); + if (batchDepth === 0) { + flushObservers(); + } + } + } + + function appendChild(node, child) { + if (child === null || child === undefined || child === false) { + return; + } + + if (Array.isArray(child)) { + child.forEach((entry) => appendChild(node, entry)); + return; + } + + if ( + typeof child === "string" || + typeof child === "number" || + typeof child === "bigint" + ) { + node.appendChild(document.createTextNode(String(child))); + return; + } + + if (child instanceof Node) { + node.appendChild(child); + } + } + + function fragment(...children) { + const node = document.createDocumentFragment(); + children.forEach((child) => appendChild(node, child)); + return node; + } + + function text(value) { + return document.createTextNode(String(value ?? "")); + } + + function applyProp(node, key, value, isSvg) { + if (key === "key") { + return; + } + + if (key === "ref" && typeof value === "function") { + value(node); + return; + } + + if (key === "className") { + if (isSvg) { + node.setAttribute("class", value || ""); + } else { + node.className = value || ""; + } + return; + } + + if (key === "style" && value && typeof value === "object") { + Object.assign(node.style, value); + return; + } + + if (key === "dataset" && value && typeof value === "object") { + Object.entries(value).forEach(([name, datasetValue]) => { + node.dataset[name] = datasetValue; + }); + return; + } + + if (key.startsWith("on") && typeof value === "function") { + node.addEventListener(key.slice(2).toLowerCase(), value); + return; + } + + if (key === "value" && "value" in node) { + node.value = value ?? ""; + return; + } + + if (key === "checked" && "checked" in node) { + node.checked = Boolean(value); + return; + } + + if (key === "selected" && "selected" in node) { + node.selected = Boolean(value); + return; + } + + if (typeof value === "boolean") { + if (value) { + node.setAttribute(key, ""); + } else { + node.removeAttribute(key); + } + return; + } + + if (value === null || value === undefined) { + node.removeAttribute(key); + return; + } + + node.setAttribute(key, value); + } + + function h(tag, props = {}, ...children) { + const isSvg = SVG_TAGS.has(tag); + const node = isSvg + ? document.createElementNS(SVG_NS, tag) + : document.createElement(tag); + + if (props && typeof props === "object") { + Object.entries(props).forEach(([key, value]) => { + applyProp(node, key, value, isSvg); + }); + } + + children.forEach((child) => appendChild(node, child)); + return node; + } + + function normalizeNode(node) { + if (node === null || node === undefined || node === false) { + return document.createDocumentFragment(); + } + + if (Array.isArray(node)) { + return fragment(...node); + } + + if ( + typeof node === "string" || + typeof node === "number" || + typeof node === "bigint" + ) { + return text(node); + } + + if (node instanceof Node) { + return node; + } + + return document.createDocumentFragment(); + } + + function captureScrollState(container) { + return Array.from( + container.querySelectorAll("[data-preserve-scroll-id]"), + ).map((node) => ({ + id: node.getAttribute("data-preserve-scroll-id"), + scrollLeft: node.scrollLeft, + scrollTop: node.scrollTop, + })); + } + + function restoreScrollState(container, scrollState) { + if (!Array.isArray(scrollState) || scrollState.length === 0) { + return; + } + + scrollState.forEach((entry) => { + if (!entry || !entry.id) { + return; + } + + const target = container.querySelector( + `[data-preserve-scroll-id="${entry.id}"]`, + ); + + if (!target) { + return; + } + + target.scrollTop = Number(entry.scrollTop || 0); + target.scrollLeft = Number(entry.scrollLeft || 0); + }); + } + + function mount(container, render, options = {}) { + const preserveScroll = options.preserveScroll !== false; + + const dispose = effect(() => { + const scrollState = preserveScroll + ? captureScrollState(container) + : []; + const nextNode = normalizeNode(render()); + + container.replaceChildren(nextNode); + + if (preserveScroll && scrollState.length > 0) { + requestAnimationFrame(() => { + restoreScrollState(container, scrollState); + }); + } + }); + + return { + container, + dispose, + rerender() { + container.replaceChildren(normalizeNode(render())); + }, + }; + } + + function render(component, container, options = {}) { + return mount(container, component, options); + } + + function unmount(mountHandle) { + if (!mountHandle || typeof mountHandle.dispose !== "function") { + return; + } + + mountHandle.dispose(); + } + + function ensureScopedStyle(id, cssText) { + if (!id || !cssText || injectedStyles.has(id)) { + return; + } + + const style = document.createElement("style"); + style.setAttribute("data-ui-style", id); + style.textContent = cssText; + document.head.appendChild(style); + injectedStyles.add(id); + } + + ForgeWebUI.batch = batch; + ForgeWebUI.computed = computed; + ForgeWebUI.createSignal = createSignal; + ForgeWebUI.effect = effect; + ForgeWebUI.ensureScopedStyle = ensureScopedStyle; + ForgeWebUI.fragment = fragment; + ForgeWebUI.h = h; + ForgeWebUI.mount = mount; + ForgeWebUI.render = render; + ForgeWebUI.signal = createSignalValue; + ForgeWebUI.text = text; + ForgeWebUI.unmount = unmount; +})(window); diff --git a/arma/client/addons/common/ui/src/siteLoader.js b/arma/client/addons/common/ui/src/siteLoader.js new file mode 100644 index 0000000..57237ce --- /dev/null +++ b/arma/client/addons/common/ui/src/siteLoader.js @@ -0,0 +1,126 @@ +(function (global) { + const ForgeSiteLoader = (global.ForgeSiteLoader = + global.ForgeSiteLoader || {}); + const commonAddonRoot = "forge\\forge_client\\addons\\common\\ui\\_site\\"; + const defaultBrowserCommonBase = "../../../common/ui/_site/"; + + function isArmaAvailable() { + return ( + typeof A3API !== "undefined" && + A3API && + typeof A3API.RequestFile === "function" + ); + } + + function isAbsoluteAddonPath(path) { + return typeof path === "string" && path.startsWith("forge\\"); + } + + function normalizeAddonRoot(addonName) { + return `forge\\forge_client\\addons\\${addonName}\\ui\\_site\\`; + } + + function normalizeBrowserPath(basePath, assetPath) { + const normalizedBase = String(basePath || "./").replace(/\\/g, "/"); + const normalizedAssetPath = String(assetPath || "").replace(/\\/g, "/"); + return `${normalizedBase}${normalizedAssetPath}`; + } + + function requestText({ addonRoot, browserBase, assetPath }) { + if (isArmaAvailable()) { + const resolvedPath = isAbsoluteAddonPath(assetPath) + ? assetPath + : addonRoot + String(assetPath || "").replace(/\//g, "\\"); + return A3API.RequestFile(resolvedPath); + } + + const browserPath = isAbsoluteAddonPath(assetPath) + ? assetPath + : normalizeBrowserPath(browserBase, assetPath); + + return fetch(browserPath).then((response) => { + if (!response.ok) { + throw new Error(`Failed to load ${browserPath}`); + } + + return response.text(); + }); + } + + function appendStyle(cssText) { + const style = document.createElement("style"); + style.textContent = cssText; + document.head.appendChild(style); + } + + function appendScript(jsText) { + const script = document.createElement("script"); + script.text = jsText; + document.head.appendChild(script); + } + + async function boot(config) { + const addonName = config && config.addonName ? config.addonName : ""; + + if (!addonName) { + throw new Error( + "ForgeSiteLoader requires a config.addonName value.", + ); + } + + const addonRoot = config.addonRoot || normalizeAddonRoot(addonName); + const browserAddonBase = config.browserAddonBase || "./"; + const browserCommonBase = + config.browserCommonBase || defaultBrowserCommonBase; + const styles = Array.isArray(config.styles) ? config.styles : []; + const commonScripts = Array.isArray(config.commonScripts) + ? config.commonScripts + : []; + const scripts = Array.isArray(config.scripts) ? config.scripts : []; + + const styleChunks = await Promise.all( + styles.map((assetPath) => + requestText({ + addonRoot, + browserBase: browserAddonBase, + assetPath, + }), + ), + ); + styleChunks.forEach(appendStyle); + + const commonScriptChunks = await Promise.all( + commonScripts.map((assetPath) => + requestText({ + addonRoot: commonAddonRoot, + browserBase: browserCommonBase, + assetPath, + }), + ), + ); + commonScriptChunks.forEach(appendScript); + + const scriptChunks = await Promise.all( + scripts.map((assetPath) => + requestText({ + addonRoot, + browserBase: browserAddonBase, + assetPath, + }), + ), + ); + scriptChunks.forEach(appendScript); + } + + ForgeSiteLoader.boot = boot; + + if (global.ForgeSiteConfig && global.ForgeSiteConfig.autoBoot !== false) { + boot(global.ForgeSiteConfig).catch((error) => { + const logLabel = + global.ForgeSiteConfig.logLabel || + global.ForgeSiteConfig.addonName || + "Forge UI"; + console.error(`[${logLabel}] Failed to load site assets.`, error); + }); + } +})(window); diff --git a/arma/client/addons/common/ui/src/windowTitleBar.js b/arma/client/addons/common/ui/src/windowTitleBar.js new file mode 100644 index 0000000..fe8ea58 --- /dev/null +++ b/arma/client/addons/common/ui/src/windowTitleBar.js @@ -0,0 +1,238 @@ +(function (global) { + const ForgeWebUI = global.ForgeWebUI; + const SharedUI = (global.SharedUI = global.SharedUI || {}); + const { h, ensureScopedStyle } = ForgeWebUI; + const titleBarCss = ` +.ui-window-titlebar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + min-height: var(--ui-titlebar-min-height, 3.5rem); + padding: var(--ui-titlebar-padding, 0.65rem 0.8rem 0.7rem 0.95rem); + background: var( + --ui-titlebar-bg, + linear-gradient(180deg, #12325b 0%, #0d2643 100%) + ); + color: var(--ui-titlebar-text, #f4f8fd); + border-bottom: 1px solid var(--ui-titlebar-border, rgb(33 73 120 / 1)); + box-shadow: var(--ui-titlebar-shadow, 0 8px 18px rgb(18 50 91 / 0.18)); + position: var(--ui-titlebar-position, relative); + top: var(--ui-titlebar-top, auto); + z-index: var(--ui-titlebar-z-index, 5); + flex-shrink: 0; +} + +.ui-window-titlebar-brand { + display: flex; + flex-direction: column; + justify-content: center; + gap: 0.1rem; + min-width: 0; +} + +.ui-window-titlebar-kicker { + font-size: 0.64rem; + font-weight: 700; + line-height: 1; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--ui-titlebar-kicker-color, rgb(214 227 241 / 0.72)); +} + +.ui-window-titlebar-title { + font-size: var(--ui-titlebar-title-size, 1rem); + font-weight: 700; + line-height: 1.1; + letter-spacing: var(--ui-titlebar-title-spacing, -0.03em); + color: inherit; +} + +.ui-window-titlebar-controls { + display: flex; + align-items: center; + gap: 0.12rem; +} + +.ui-window-control-btn { + min-width: 2rem; + height: 2rem; + margin: 0; + padding: 0; + border-radius: 0.38rem; + border: 1px solid var(--ui-window-control-border, rgb(197 220 243 / 0.16)); + background: var(--ui-window-control-bg, rgb(255 255 255 / 0.04)); + color: var(--ui-window-control-text, rgb(237 244 251 / 0.88)); + line-height: 1; + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + box-shadow: none; + transform: none; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.ui-window-control-btn + .ui-window-control-btn { + margin-left: 0; +} + +.ui-window-control-btn:hover { + background: var(--ui-window-control-hover-bg, rgb(255 255 255 / 0.04)); + box-shadow: none; + transform: none; +} + +.ui-window-control-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.ui-window-control-btn.is-close { + cursor: pointer; + opacity: 1; + background: var(--ui-window-control-close-bg, rgb(255 255 255 / 0.1)); +} + +.ui-window-control-btn.is-close:hover { + background: var( + --ui-window-control-close-hover-bg, + rgb(185 67 67 / 0.9) + ); + border-color: var( + --ui-window-control-close-hover-border, + rgb(255 222 222 / 0.45) + ); +} + +.ui-window-control-icon { + width: 0.78rem; + height: 0.78rem; + stroke: currentColor; + fill: none; + stroke-width: 1.5; + stroke-linecap: round; + stroke-linejoin: round; + pointer-events: none; +} + +@media (max-width: 960px) { + .ui-window-titlebar { + flex-direction: column; + align-items: flex-start; + } + + .ui-window-titlebar-controls { + width: 100%; + justify-content: flex-end; + } +} +`; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + function WindowControlIcon({ type }) { + if (type === "minimize") { + return h( + "svg", + { + className: "ui-window-control-icon", + viewBox: "0 0 16 16", + "aria-hidden": "true", + }, + h("line", { x1: "3", y1: "8", x2: "13", y2: "8" }), + ); + } + + if (type === "maximize") { + return h( + "svg", + { + className: "ui-window-control-icon", + viewBox: "0 0 16 16", + "aria-hidden": "true", + }, + h("rect", { x: "3.5", y: "3.5", width: "9", height: "9" }), + ); + } + + return h( + "svg", + { + className: "ui-window-control-icon", + viewBox: "0 0 16 16", + "aria-hidden": "true", + }, + h("line", { x1: "4", y1: "4", x2: "12", y2: "12" }), + h("line", { x1: "12", y1: "4", x2: "4", y2: "12" }), + ); + } + + SharedUI.componentFns.WindowTitleBar = function WindowTitleBar({ + kicker = "", + title = "", + onClose = null, + closeLabel = "Close interface", + minimizeLabel = "Minimize unavailable", + maximizeLabel = "Maximize unavailable", + } = {}) { + ensureScopedStyle("shared-window-titlebar", titleBarCss); + + return h( + "div", + { className: "ui-window-titlebar" }, + h( + "div", + { className: "ui-window-titlebar-brand" }, + kicker + ? h( + "span", + { className: "ui-window-titlebar-kicker" }, + kicker, + ) + : null, + h("span", { className: "ui-window-titlebar-title" }, title), + ), + h( + "div", + { className: "ui-window-titlebar-controls" }, + h( + "button", + { + type: "button", + className: "ui-window-control-btn", + disabled: true, + title: minimizeLabel, + "aria-label": minimizeLabel, + }, + WindowControlIcon({ type: "minimize" }), + ), + h( + "button", + { + type: "button", + className: "ui-window-control-btn", + disabled: true, + title: maximizeLabel, + "aria-label": maximizeLabel, + }, + WindowControlIcon({ type: "maximize" }), + ), + h( + "button", + { + type: "button", + className: "ui-window-control-btn is-close", + title: "Close", + "aria-label": closeLabel, + onClick: + typeof onClose === "function" ? onClose : () => {}, + }, + WindowControlIcon({ type: "close" }), + ), + ), + ); + }; +})(window); diff --git a/arma/client/addons/garage/$PBOPREFIX$ b/arma/client/addons/garage/$PBOPREFIX$ new file mode 100644 index 0000000..61c8412 --- /dev/null +++ b/arma/client/addons/garage/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\garage diff --git a/arma/client/addons/garage/CfgEventHandlers.hpp b/arma/client/addons/garage/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/garage/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/garage/README.md b/arma/client/addons/garage/README.md new file mode 100644 index 0000000..f469a4e --- /dev/null +++ b/arma/client/addons/garage/README.md @@ -0,0 +1,48 @@ +# Forge Client Garage + +## Overview +The garage addon provides player vehicle storage UI, vehicle store/retrieve +actions, selected nearby vehicle service requests, and virtual garage state on +the client. + +## Dependencies +- `forge_client_common` +- `forge_client_main` +- server garage events from `forge_server_garage` +- notifications for action feedback + +## Main Components +- `fnc_initRepository.sqf` manages player garage view state. +- `fnc_initVGRepository.sqf` manages virtual garage view state. +- `fnc_initHelperService.sqf` resolves vehicle names, hit points, and payload + details. +- `fnc_initContextService.sqf` gathers nearby/current vehicle context. +- `fnc_initPayloadService.sqf` builds browser hydrate payloads. +- `fnc_initActionService.sqf` sends store/retrieve requests, forwards selected + nearby vehicle refuel/repair service requests, and handles action responses. +- `fnc_initUIBridge.sqf` pushes hydrate/sync events to the browser. +- `fnc_openUI.sqf` opens `RscGarage`. +- `fnc_openVG.sqf` opens the Arma garage-style virtual garage view. + +## Browser Events +- `garage::ready` +- `garage::refresh` +- `garage::vehicle::retrieve::request` +- `garage::vehicle::store::request` +- `garage::vehicle::refuel::request` +- `garage::vehicle::repair::request` +- `garage::close` + +## Runtime Notes +The client builds vehicle context and sends requests. The server garage addon +and extension own stored vehicle state. + +Virtual garage spawning resolves the active garage context and category lane, +then finalizes only the vehicle selected in that BIS garage session. Nearby +world vehicles are ignored as spawn candidates and are only used for the spawn +blocking check at the resolved lane. + +Refuel and repair buttons are available from the selected vehicle detail panel +for nearby world vehicles. Stored records must be retrieved before they can be +serviced because fuel and repair operate on live vehicle objects. Service +billing is handled by the server economy addon and charges organization funds. diff --git a/arma/client/addons/garage/XEH_PREP.hpp b/arma/client/addons/garage/XEH_PREP.hpp new file mode 100644 index 0000000..f39faee --- /dev/null +++ b/arma/client/addons/garage/XEH_PREP.hpp @@ -0,0 +1,10 @@ +PREP(handleUIEvents); +PREP(initActionService); +PREP(initContextService); +PREP(initHelperService); +PREP(initPayloadService); +PREP(initRepository); +PREP(initUIBridge); +PREP(initVGRepository); +PREP(openUI); +PREP(openVG); diff --git a/arma/client/addons/garage/XEH_postInit.sqf b/arma/client/addons/garage/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/garage/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/garage/XEH_postInitClient.sqf b/arma/client/addons/garage/XEH_postInitClient.sqf new file mode 100644 index 0000000..e187c2d --- /dev/null +++ b/arma/client/addons/garage/XEH_postInitClient.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" + +if (isNil QGVAR(GarageHelperService)) then { call FUNC(initHelperService); }; +if (isNil QGVAR(GarageRepository)) then { call FUNC(initRepository); }; +if (isNil QGVAR(GarageContextService)) then { call FUNC(initContextService); }; +if (isNil QGVAR(GaragePayloadService)) then { call FUNC(initPayloadService); }; +if (isNil QGVAR(GarageActionService)) then { call FUNC(initActionService); }; +if (isNil QGVAR(GarageUIBridge)) then { call FUNC(initUIBridge); }; +if (isNil QGVAR(VGRepository)) then { call FUNC(initVGRepository); }; + +[QGVAR(initGarage), { + GVAR(GarageRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitGarage), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(GarageRepository) call ["sync", [_data]]; + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["refreshGarage", []]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncGarage), { + params [["_data", createHashMap, [createHashMap, []]]]; + + GVAR(GarageRepository) call ["sync", [_data]]; + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["refreshGarage", []]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseGarageAction), { + params [["_payload", createHashMap, [createHashMap]]]; + + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleActionResponse", [_payload]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(initVG), { + GVAR(VGRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitVG), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(VGRepository) call ["sync", [_data]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncVG), { + params [["_data", createHashMap, [createHashMap, []]]]; + + GVAR(VGRepository) call ["sync", [_data]]; +}] call CFUNC(addEventHandler); + +[{ + EGVAR(actor,ActorRepository) get "isLoaded"; +}, { + [QGVAR(initGarage), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); + +[{ + GVAR(GarageRepository) get "isLoaded"; +}, { + [QGVAR(initVG), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/garage/XEH_preInit.sqf b/arma/client/addons/garage/XEH_preInit.sqf new file mode 100644 index 0000000..2c2e472 --- /dev/null +++ b/arma/client/addons/garage/XEH_preInit.sqf @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +// #include "initSettings.inc.sqf" +// #include "initKeybinds.inc.sqf" + +GVAR(Cars) = []; +GVAR(Armor) = []; +GVAR(Helis) = []; +GVAR(Planes) = []; +GVAR(Naval) = []; +GVAR(Other) = []; diff --git a/arma/client/addons/garage/XEH_preInitClient.sqf b/arma/client/addons/garage/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/garage/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/garage/XEH_preStart.sqf b/arma/client/addons/garage/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/garage/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/garage/config.cpp b/arma/client/addons/garage/config.cpp new file mode 100644 index 0000000..07836a5 --- /dev/null +++ b/arma/client/addons/garage/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_common", + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscGarage.hpp" diff --git a/arma/client/addons/garage/functions/fnc_handleUIEvents.sqf b/arma/client/addons/garage/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..0257e43 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,81 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2025-12-16 + * Last Update: 2026-04-18 + * Public: No + * + * Description: + * Handles the UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_garage_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Garage] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "garage::close": { + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["handleClose", []]; + }; + + closeDialog 1; + }; + case "garage::ready": { + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["handleReady", [_control, _data]]; + }; + }; + case "garage::vehicle::retrieve::request": { + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleRetrieveRequest", [_data]]; + }; + }; + case "garage::vehicle::store::request": { + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleStoreRequest", [_data]]; + }; + }; + case "garage::vehicle::refuel::request": { + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleRefuelRequest", [_data]]; + }; + }; + case "garage::vehicle::repair::request": { + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleRepairRequest", [_data]]; + }; + }; + case "garage::vehicle::rearm::request": { + if !(isNil QGVAR(GarageActionService)) then { + GVAR(GarageActionService) call ["handleRearmRequest", [_data]]; + }; + }; + case "garage::refresh": { + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["refreshGarage", []]; + }; + }; + default { + hint format ["Unhandled garage UI event: %1", _event]; + }; +}; + +true; diff --git a/arma/client/addons/garage/functions/fnc_initActionService.sqf b/arma/client/addons/garage/functions/fnc_initActionService.sqf new file mode 100644 index 0000000..7bca7e2 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initActionService.sqf @@ -0,0 +1,231 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initActionService.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Last Update: 2026-04-18 + * Public: No + * + * Description: + * Initializes the garage action service for retrieve, store, refuel, rearm, + * and repair world actions. + * + * Arguments: + * None + * + * Return Value: + * Garage action service object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initActionService; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GarageActionServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "GarageActionServiceBaseClass"], + ["#create", compileFinal { + _self set ["pendingStoreVehicle", objNull]; + _self set ["pendingRetrieve", createHashMap]; + }], + ["sendServiceResult", compileFinal { + params [["_action", "", [""]], ["_success", false, [false]], ["_message", "", [""]]]; + + private _event = ["garage::service::failure", "garage::service::success"] select _success; + GVAR(GarageUIBridge) call ["sendEvent", [_event, createHashMapFromArray [["action", _action], ["message", _message]]]]; + }], + ["refreshAfterService", compileFinal { + [] spawn { + sleep 0.75; + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["refreshGarage", []]; + }; + }; + }], + ["resolveServiceVehicle", compileFinal { + params [["_data", createHashMap, [createHashMap]], ["_action", "service", [""]]]; + + private _netId = _data getOrDefault ["netId", ""]; + if (_netId isEqualTo "") exitWith { + _self call ["sendServiceResult", [_action, false, "Select a nearby vehicle first."]]; + objNull + }; + + private _vehicle = objectFromNetId _netId; + if (isNull _vehicle) exitWith { + _self call ["sendServiceResult", [_action, false, "The selected vehicle is no longer available."]]; + objNull + }; + + if !(_vehicle isKindOf "Car" || { _vehicle isKindOf "Tank" } || { _vehicle isKindOf "Air" } || { _vehicle isKindOf "Ship" }) exitWith { + _self call ["sendServiceResult", [_action, false, "Selected object is not a serviceable vehicle."]]; + objNull + }; + + _vehicle + }], + ["vehicleNeedsRepair", compileFinal { + params [["_vehicle", objNull, [objNull]]]; + + if (isNull _vehicle) exitWith { false }; + if ((damage _vehicle) > 0.001) exitWith { true }; + + private _rawHitPoints = getAllHitPointsDamage _vehicle; + private _hitPointValues = if (_rawHitPoints isEqualType [] && { count _rawHitPoints >= 3 }) then { _rawHitPoints param [2, []] } else { [] }; + ({ _x > 0.001 } count _hitPointValues) > 0 + }], + ["handleRetrieveRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _plate = _data getOrDefault ["plate", ""]; + if (_plate isEqualTo "") exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [["message", "Select a stored vehicle to retrieve."]]]]; + }; + + private _garageMap = if (isNil QGVAR(GarageRepository)) then { createHashMap } else { GVAR(GarageRepository) call ["getState", []] }; + private _vehicleData = _garageMap getOrDefault [_plate, createHashMap]; + if (_vehicleData isEqualTo createHashMap) exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [["message", "Stored vehicle record could not be found."]]]]; + }; + + private _className = _vehicleData getOrDefault ["classname", ""]; + if (_className isEqualTo "") exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [["message", "Stored vehicle record is missing a classname."]]]]; + }; + + private _context = GVAR(GarageContextService) call ["getContext", []]; + private _vehicleCategory = GVAR(GarageHelperService) call ["resolveVGCategory", [_className]]; + private _spawnLane = GVAR(GarageContextService) call ["getExactSpawnLane", [_vehicleCategory, _context]]; + if (_spawnLane isEqualTo createHashMap) exitWith { + private _categoryLabel = GVAR(GarageHelperService) call ["resolveGarageCategoryLabel", [_vehicleCategory]]; + GVAR(GarageUIBridge) call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [["message", format ["This garage does not support spawning %1.", _categoryLabel]]]]]; + }; + + private _spawnPosition = _spawnLane getOrDefault ["spawnPosition", _context getOrDefault ["spawnPosition", getPosATL player]]; + private _spawnHeading = _spawnLane getOrDefault ["spawnHeading", _context getOrDefault ["spawnHeading", getDir player]]; + private _spawnRadius = _context getOrDefault ["spawnRadius", 6]; + private _blockingVehicles = []; + { _blockingVehicles pushBackUnique _x; } forEach (_spawnPosition nearEntities [["Car", "Tank", "Air", "Ship"], _spawnRadius]); + { _blockingVehicles pushBackUnique _x; } forEach (nearestObjects [_spawnPosition, ["Car", "Tank", "Air", "Ship"], _spawnRadius]); + if (_blockingVehicles isNotEqualTo []) exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [["message", "The garage spawn area is blocked."]]]]; + }; + + private _vehicle = createVehicle [_className, _spawnPosition, [], 0, "CAN_COLLIDE"]; + _vehicle setDir _spawnHeading; + _vehicle setFuel (_vehicleData getOrDefault ["fuel", 0]); + _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]); + + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _hitPointNames = _hitPoints getOrDefault ["names", []]; + private _hitPointValues = _hitPoints getOrDefault ["values", []]; + for "_index" from 0 to ((count _hitPointNames) - 1) do { + _vehicle setHitPointDamage [_hitPointNames param [_index, ""], _hitPointValues param [_index, 0]]; + }; + + _vehicle setVariable ["forge_garage_plate", _plate, true]; + _vehicle setVariable ["forge_garage_owner_uid", getPlayerUID player, true]; + + _self set ["pendingRetrieve", createHashMapFromArray [["plate", _plate], ["vehicle", _vehicle]]]; + [SRPC(garage,requestRetrieveVehicle), [getPlayerUID player, _plate]] call CFUNC(serverEvent); + }], + ["handleStoreRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _netId = _data getOrDefault ["netId", ""]; + if (_netId isEqualTo "") exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::store::failure", createHashMapFromArray [["message", "Select a nearby vehicle to store."]]]]; + }; + + private _vehicle = objectFromNetId _netId; + if (isNull _vehicle) exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::store::failure", createHashMapFromArray [["message", "The selected vehicle is no longer available."]]]]; + }; + + if (crew _vehicle isNotEqualTo []) exitWith { + GVAR(GarageUIBridge) call ["sendEvent", ["garage::store::failure", createHashMapFromArray [["message", "All crew must exit the vehicle before storing it."]]]]; + }; + + private _rawHitPoints = getAllHitPointsDamage _vehicle; + private _hitPointsJson = toJSON (createHashMapFromArray [["names", _rawHitPoints param [0, []]], ["selections", _rawHitPoints param [1, []]], ["values", _rawHitPoints param [2, []]]]); + + _self set ["pendingStoreVehicle", _vehicle]; + [SRPC(garage,requestStoreVehicle), [getPlayerUID player, netId _vehicle, typeOf _vehicle, fuel _vehicle, damage _vehicle, _hitPointsJson]] call CFUNC(serverEvent); + }], + ["handleRefuelRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _vehicle = _self call ["resolveServiceVehicle", [_data, "refuel"]]; + if (isNull _vehicle) exitWith { false }; + + if ((fuel _vehicle) >= 0.999) exitWith { + _self call ["sendServiceResult", ["refuel", false, "Vehicle fuel tank is already full."]]; + false + }; + + [SRPC(economy,RefuelService), [_vehicle, player]] call CFUNC(serverEvent); + _self call ["sendServiceResult", ["refuel", true, "Refuel request sent. Billing result will appear as a notification."]]; + _self call ["refreshAfterService", []]; + true + }], + ["handleRepairRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _vehicle = _self call ["resolveServiceVehicle", [_data, "repair"]]; + if (isNull _vehicle) exitWith { false }; + + if !(_self call ["vehicleNeedsRepair", [_vehicle]]) exitWith { + _self call ["sendServiceResult", ["repair", false, "Vehicle has no reported damage."]]; + false + }; + + [SRPC(economy,RepairService), [_vehicle, player, -1]] call CFUNC(serverEvent); + _self call ["sendServiceResult", ["repair", true, "Repair request sent. Billing result will appear as a notification."]]; + _self call ["refreshAfterService", []]; + true + }], + ["handleRearmRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _vehicle = _self call ["resolveServiceVehicle", [_data, "rearm"]]; + if (isNull _vehicle) exitWith { false }; + + [SRPC(economy,RearmService), [_vehicle, player, -1]] call CFUNC(serverEvent); + _self call ["sendServiceResult", ["rearm", true, "Rearm request sent. Billing result will appear as a notification."]]; + _self call ["refreshAfterService", []]; + true + }], + ["handleActionResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _action = _payload getOrDefault ["action", ""]; + private _success = _payload getOrDefault ["success", false]; + private _message = _payload getOrDefault ["message", "Garage action failed."]; + + switch (_action) do { + case "retrieve": { + private _pendingRetrieve = _self getOrDefault ["pendingRetrieve", createHashMap]; + private _vehicle = _pendingRetrieve getOrDefault ["vehicle", objNull]; + if (!_success && { !isNull _vehicle }) then { deleteVehicle _vehicle; }; + _self set ["pendingRetrieve", createHashMap]; + GVAR(GarageUIBridge) call ["sendEvent", [[ "garage::retrieve::failure", "garage::retrieve::success" ] select _success, createHashMapFromArray [["message", _message]]]]; + }; + case "store": { + private _vehicle = _self getOrDefault ["pendingStoreVehicle", objNull]; + if (_success && { !isNull _vehicle }) then { deleteVehicle _vehicle; }; + _self set ["pendingStoreVehicle", objNull]; + GVAR(GarageUIBridge) call ["sendEvent", [[ "garage::store::failure", "garage::store::success" ] select _success, createHashMapFromArray [["message", _message]]]]; + }; + }; + + [] spawn { + sleep 0.05; + if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["refreshGarage", []]; + }; + }; + }] +]; + +GVAR(GarageActionService) = createHashMapObject [GVAR(GarageActionServiceBaseClass)]; +GVAR(GarageActionService) diff --git a/arma/client/addons/garage/functions/fnc_initContextService.sqf b/arma/client/addons/garage/functions/fnc_initContextService.sqf new file mode 100644 index 0000000..89e41f9 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initContextService.sqf @@ -0,0 +1,298 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initContextService.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the garage context service for local garage context and nearby state. + * + * Arguments: + * None + * + * Return Value: + * Garage context service object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initContextService; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GarageContextServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "GarageContextServiceBaseClass"], + ["#create", compileFinal { + _self set ["lastContext", createHashMap]; + _self set ["activeGarageObject", objNull]; + }], + ["#delete", compileFinal { + _self set ["lastContext", createHashMap]; + _self set ["activeGarageObject", objNull]; + }], + ["setActiveGarageObject", compileFinal { + params [["_garageObject", objNull, [objNull]]]; + + if (isNull _garageObject || { !(_garageObject getVariable ["isGarage", false]) }) exitWith { + _self set ["activeGarageObject", objNull]; + false + }; + + _self set ["activeGarageObject", _garageObject]; + true + }], + ["getActiveGarageObject", compileFinal { + private _garageObject = _self getOrDefault ["activeGarageObject", objNull]; + if (isNull _garageObject || { !(_garageObject getVariable ["isGarage", false]) }) exitWith { objNull }; + if ((player distance2D _garageObject) > 12) exitWith { + _self set ["activeGarageObject", objNull]; + objNull + }; + + _garageObject + }], + ["createDefaultContext", compileFinal { + createHashMapFromArray [ + ["name", "Vehicle Garage"], + ["anchorPosition", getPosATL player], + ["sourceObject", objNull], + ["garageType", ""], + ["spawnHeading", getDir player], + ["spawnPosition", player getPos [8, getDir player]], + ["spawnLanes", createHashMap], + ["spawnRadius", 6], + ["nearbyRadius", 30], + ["laneRadius", 25] + ] + }], + ["findNearbyGarageObject", compileFinal { + private _nearestGarage = objNull; + private _nearestDistance = 1e10; + + { + if (isNull _x || { !(_x getVariable ["isGarage", false]) }) then { continue; }; + private _distance = player distance2D _x; + if (_distance < _nearestDistance) then { + _nearestDistance = _distance; + _nearestGarage = _x; + }; + } forEach (player nearObjects 12); + + _nearestGarage + }], + ["resolveGarageName", compileFinal { + params [["_garageObject", objNull, [objNull]]]; + + if (isNull _garageObject) exitWith { "Vehicle Garage" }; + + private _displayName = _garageObject getVariable ["garageName", ""]; + if (_displayName isNotEqualTo "") exitWith { _displayName }; + + private _varName = vehicleVarName _garageObject; + if (_varName isEqualTo "") exitWith { "Vehicle Garage" }; + + _varName + }], + ["buildMarkerLane", compileFinal { + params [["_markerName", "", [""]], ["_garageObject", objNull, [objNull]]]; + + if (_markerName isEqualTo "" || { markerShape _markerName isEqualTo "" }) exitWith { createHashMap }; + + private _spawnCategory = GVAR(GarageHelperService) call ["inferGarageCategory", [_markerName]]; + if (_spawnCategory isEqualTo "") exitWith { createHashMap }; + + private _spawnPosition = markerPos _markerName; + private _interactionPosition = if (isNull _garageObject) then { _spawnPosition } else { getPosATL _garageObject }; + private _markerDistance = if (isNull _garageObject) then { player distance2D _spawnPosition } else { _garageObject distance2D _spawnPosition }; + private _garageVarName = if (isNull _garageObject) then { "" } else { toLowerANSI (vehicleVarName _garageObject) }; + private _markerKey = toLowerANSI _markerName; + private _isExplicitMatch = _garageVarName isNotEqualTo "" && { (_markerKey find _garageVarName) >= 0 }; + + createHashMapFromArray [ + ["name", _markerName], + ["isExplicitMatch", _isExplicitMatch], + ["interactionPosition", _interactionPosition], + ["sourceObject", _garageObject], + ["spawnCategory", _spawnCategory], + ["spawnHeading", markerDir _markerName], + ["spawnPosition", _spawnPosition], + ["score", _markerDistance] + ] + }], + ["discoverSpawnLanes", compileFinal { + params [["_garageObject", objNull, [objNull]]]; + + private _laneRadius = (_self call ["createDefaultContext", []]) getOrDefault ["laneRadius", 25]; + private _explicitLanes = createHashMap; + private _fallbackLanes = createHashMap; + + { + private _markerName = _x; + if ((toLowerANSI _markerName find "garage") < 0) then { continue; }; + + private _entry = _self call ["buildMarkerLane", [_markerName, _garageObject]]; + if (_entry isEqualTo createHashMap) then { continue; }; + + private _spawnPosition = _entry getOrDefault ["spawnPosition", []]; + if (_spawnPosition isEqualTo []) then { continue; }; + + private _distance = if (isNull _garageObject) then { player distance2D _spawnPosition } else { _garageObject distance2D _spawnPosition }; + if (_distance > _laneRadius) then { continue; }; + + private _spawnCategory = _entry getOrDefault ["spawnCategory", ""]; + private _laneSet = _fallbackLanes; + if (_entry getOrDefault ["isExplicitMatch", false]) then { + _laneSet = _explicitLanes; + }; + private _currentEntry = _laneSet getOrDefault [_spawnCategory, createHashMap]; + + if (_currentEntry isEqualTo createHashMap || { (_entry getOrDefault ["score", 1e10]) < (_currentEntry getOrDefault ["score", 1e10]) }) then { + _laneSet set [_spawnCategory, _entry]; + }; + } forEach allMapMarkers; + + private _lanes = createHashMap; + { _lanes set [_x, _y]; } forEach _fallbackLanes; + { _lanes set [_x, _y]; } forEach _explicitLanes; + + _lanes + }], + ["selectSpawnLane", compileFinal { + params [ + ["_lanes", createHashMap, [createHashMap]], + ["_preferredCategory", "", [""]], + ["_defaultPosition", [], [[]]], + ["_defaultHeading", 0, [0]] + ]; + + private _normalizedCategory = GVAR(GarageHelperService) call ["normalizeGarageCategory", [_preferredCategory]]; + private _lane = createHashMap; + + if (_normalizedCategory isNotEqualTo "") then { + _lane = _lanes getOrDefault [_normalizedCategory, createHashMap]; + }; + + if (_lane isEqualTo createHashMap) then { + { + private _candidate = _lanes getOrDefault [_x, createHashMap]; + if (_candidate isNotEqualTo createHashMap) exitWith { _lane = _candidate; }; + } forEach ["cars", "armor", "helis", "planes", "naval", "other"]; + }; + + if (_lane isEqualTo createHashMap) then { + _lane = createHashMapFromArray [ + ["spawnCategory", _normalizedCategory], + ["spawnHeading", _defaultHeading], + ["spawnPosition", _defaultPosition] + ]; + }; + + _lane + }], + ["getSpawnLane", compileFinal { + params [["_category", "", [""]], ["_context", createHashMap, [createHashMap]]]; + + private _resolvedContext = _context; + if (_resolvedContext isEqualTo createHashMap) then { + _resolvedContext = _self call ["getContext", []]; + }; + + private _spawnLanes = _resolvedContext getOrDefault ["spawnLanes", createHashMap]; + private _defaultPosition = _resolvedContext getOrDefault ["spawnPosition", getPosATL player]; + private _defaultHeading = _resolvedContext getOrDefault ["spawnHeading", getDir player]; + _self call ["selectSpawnLane", [_spawnLanes, _category, _defaultPosition, _defaultHeading]] + }], + ["getExactSpawnLane", compileFinal { + params [["_category", "", [""]], ["_context", createHashMap, [createHashMap]]]; + + private _resolvedContext = _context; + if (_resolvedContext isEqualTo createHashMap) then { + _resolvedContext = _self call ["getContext", []]; + }; + + private _normalizedCategory = GVAR(GarageHelperService) call ["normalizeGarageCategory", [_category]]; + if (_normalizedCategory isEqualTo "") exitWith { createHashMap }; + + private _spawnLanes = _resolvedContext getOrDefault ["spawnLanes", createHashMap]; + _spawnLanes getOrDefault [_normalizedCategory, createHashMap] + }], + ["resolveContext", compileFinal { + params [["_preferredGarageObject", objNull, [objNull]]]; + + private _context = _self call ["createDefaultContext", []]; + private _garageObject = _preferredGarageObject; + if (isNull _garageObject || { !(_garageObject getVariable ["isGarage", false]) }) then { + _garageObject = _self call ["getActiveGarageObject", []]; + }; + if (isNull _garageObject) then { + _garageObject = _self call ["findNearbyGarageObject", []]; + }; + private _garageName = _self call ["resolveGarageName", [_garageObject]]; + private _garageType = ""; + private _anchorPosition = getPosATL player; + private _spawnHeading = getDir player; + private _spawnPosition = player getPos [8, _spawnHeading]; + private _spawnLanes = createHashMap; + + if (!isNull _garageObject) then { + _garageType = GVAR(GarageHelperService) call ["normalizeGarageCategory", [_garageObject getVariable ["garageType", ""]]]; + _anchorPosition = getPosATL _garageObject; + _spawnHeading = getDir _garageObject; + _spawnPosition = _garageObject getPos [8, _spawnHeading]; + _spawnLanes = _self call ["discoverSpawnLanes", [_garageObject]]; + }; + + private _selectedLane = _self call ["selectSpawnLane", [_spawnLanes, _garageType, _spawnPosition, _spawnHeading]]; + _spawnHeading = _selectedLane getOrDefault ["spawnHeading", _spawnHeading]; + _spawnPosition = _selectedLane getOrDefault ["spawnPosition", _spawnPosition]; + + _context set ["name", _garageName]; + _context set ["anchorPosition", _anchorPosition]; + _context set ["sourceObject", _garageObject]; + _context set ["garageType", _garageType]; + _context set ["spawnHeading", _spawnHeading]; + _context set ["spawnPosition", _spawnPosition]; + _context set ["spawnLanes", _spawnLanes]; + _self set ["lastContext", _context]; + _context + }], + ["getContext", compileFinal { + params [["_preferredGarageObject", objNull, [objNull]]]; + _self call ["resolveContext", [_preferredGarageObject]] + }], + ["buildNearbyState", compileFinal { + private _context = _self call ["getContext", []]; + private _anchorPosition = _context getOrDefault ["anchorPosition", []]; + private _spawnPosition = _context getOrDefault ["spawnPosition", getPosATL player]; + private _spawnRadius = _context getOrDefault ["spawnRadius", 6]; + private _nearbyRadius = _context getOrDefault ["nearbyRadius", 30]; + private _nearbyOrigin = [_anchorPosition, _spawnPosition] select (_anchorPosition isEqualTo []); + private _nearbyVehicles = []; + private _nearbyEntities = []; + private _candidateVehicles = []; + { _candidateVehicles pushBackUnique _x; } forEach (_nearbyOrigin nearEntities [["Car", "Tank", "Air", "Ship"], _nearbyRadius]); + { _candidateVehicles pushBackUnique _x; } forEach ((getPosATL player) nearEntities [["Car", "Tank", "Air", "Ship"], _nearbyRadius]); + { _candidateVehicles pushBackUnique _x; } forEach (nearestObjects [_nearbyOrigin, ["AllVehicles"], _nearbyRadius]); + { _candidateVehicles pushBackUnique _x; } forEach (nearestObjects [getPosATL player, ["AllVehicles"], _nearbyRadius]); + { + if (isNull _x) then { continue; }; + if (_x isKindOf "CAManBase") then { continue; }; + if !(_x isKindOf "Car" || _x isKindOf "Tank" || _x isKindOf "Air" || _x isKindOf "Ship") then { continue; }; + _nearbyEntities pushBackUnique _x; + } forEach _candidateVehicles; + { + if (isNull _x) then { continue; }; + private _builtVehicle = GVAR(GarageHelperService) call ["buildNearbyVehicle", [_x, _nearbyOrigin]]; + if (_builtVehicle isEqualTo createHashMap) then { continue; }; + _nearbyVehicles pushBack _builtVehicle; + } forEach _nearbyEntities; + private _nearbyVehiclePairs = _nearbyVehicles apply { [_x getOrDefault ["distance", 0], _x] }; + _nearbyVehiclePairs sort true; + _nearbyVehicles = _nearbyVehiclePairs apply { _x param [1, createHashMap] }; + private _spawnBlocked = ((_spawnPosition nearEntities [["Car", "Tank", "Air", "Ship"], _spawnRadius]) + (nearestObjects [_spawnPosition, ["Car", "Tank", "Air", "Ship"], _spawnRadius])) isNotEqualTo []; + createHashMapFromArray [["session", createHashMapFromArray [["garageName", _context getOrDefault ["name", "Vehicle Garage"]], ["nearbyCount", count _nearbyVehicles], ["spawnBlocked", _spawnBlocked], ["spawnStatus", ["Ready", "Blocked"] select _spawnBlocked]]], ["nearby", createHashMapFromArray [["vehicles", _nearbyVehicles]]]] + }] +]; + +GVAR(GarageContextService) = createHashMapObject [GVAR(GarageContextServiceBaseClass)]; +GVAR(GarageContextService) diff --git a/arma/client/addons/garage/functions/fnc_initHelperService.sqf b/arma/client/addons/garage/functions/fnc_initHelperService.sqf new file mode 100644 index 0000000..88d35e7 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initHelperService.sqf @@ -0,0 +1,223 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initHelperService.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the garage helper service for vehicle metadata and UI-friendly shaping. + * + * Arguments: + * None + * + * Return Value: + * Garage helper service object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initHelperService; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GarageHelperServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "GarageHelperServiceBaseClass"], + ["normalizeGarageCategory", compileFinal { + params [["_value", "", [""]]]; + + private _normalized = toLowerANSI (trim _value); + if (_normalized isEqualTo "") exitWith { "" }; + if (_normalized in ["cars", "armor", "helis", "planes", "naval", "other"]) exitWith { _normalized }; + "" + }], + ["inferGarageCategory", compileFinal { + params [["_value", "", [""]]]; + + private _normalized = toLowerANSI (trim _value); + if (_normalized isEqualTo "") exitWith { "" }; + + private _resolvedCategory = _self call ["normalizeGarageCategory", [_normalized]]; + if (_resolvedCategory isNotEqualTo "") exitWith { _resolvedCategory }; + + switch (true) do { + case ((_normalized find "cars") >= 0): { "cars" }; + case ((_normalized find "armor") >= 0): { "armor" }; + case ((_normalized find "helis") >= 0): { "helis" }; + case ((_normalized find "planes") >= 0): { "planes" }; + case ((_normalized find "naval") >= 0): { "naval" }; + case ((_normalized find "other") >= 0): { "other" }; + default { "" }; + } + }], + ["resolveCategory", compileFinal { + params [["_className", "", [""]]]; + + if (_className isEqualTo "") exitWith { "other" }; + + switch (true) do { + case (_className isKindOf ["Car", configFile >> "CfgVehicles"]): { "car" }; + case (_className isKindOf ["Tank", configFile >> "CfgVehicles"]): { "armor" }; + case (_className isKindOf ["Helicopter", configFile >> "CfgVehicles"]): { "air" }; + case (_className isKindOf ["Plane", configFile >> "CfgVehicles"]): { "air" }; + case (_className isKindOf ["Ship", configFile >> "CfgVehicles"]): { "naval" }; + default { "other" }; + } + }], + ["resolveVGCategory", compileFinal { + params [["_className", "", [""]]]; + + if (_className isEqualTo "") exitWith { "other" }; + + switch (true) do { + case (_className isKindOf ["Car", configFile >> "CfgVehicles"]): { "cars" }; + case (_className isKindOf ["Tank", configFile >> "CfgVehicles"]): { "armor" }; + case (_className isKindOf ["Helicopter", configFile >> "CfgVehicles"]): { "helis" }; + case (_className isKindOf ["Plane", configFile >> "CfgVehicles"]): { "planes" }; + case (_className isKindOf ["Ship", configFile >> "CfgVehicles"]): { "naval" }; + default { "other" }; + } + }], + ["resolveGarageCategoryLabel", compileFinal { + params [["_category", "", [""]]]; + + switch (_category) do { + case "cars": { "cars" }; + case "armor": { "armored vehicles" }; + case "helis": { "helicopters" }; + case "planes": { "planes" }; + case "naval": { "naval vehicles" }; + case "other": { "other vehicles" }; + default { "this vehicle type" }; + } + }], + ["resolveDisplayName", compileFinal { + params [["_className", "", [""]]]; + + private _displayName = getText (configFile >> "CfgVehicles" >> _className >> "displayName"); + if (_displayName isEqualTo "") then { + _displayName = _className; + }; + + _displayName + }], + ["resolvePicture", compileFinal { + params [["_className", "", [""]]]; + + private _picture = getText (configFile >> "CfgVehicles" >> _className >> "editorPreview"); + if (_picture isEqualTo "") then { + _picture = getText (configFile >> "CfgVehicles" >> _className >> "picture"); + }; + + _picture + }], + ["buildHitPointRows", compileFinal { + params [["_hitPoints", createHashMap, [createHashMap]]]; + + private _rows = []; + private _names = _hitPoints getOrDefault ["names", []]; + private _selections = _hitPoints getOrDefault ["selections", []]; + private _values = _hitPoints getOrDefault ["values", []]; + private _count = count _names; + + for "_index" from 0 to (_count - 1) do { + private _rowName = _names param [_index, ""]; + _rows pushBack (createHashMapFromArray [ + ["name", _rowName], + ["selection", _selections param [_index, ""]], + ["value", _values param [_index, 0]] + ]); + }; + + _rows + }], + ["resolveHealth", compileFinal { + params [["_damage", 0, [0]], ["_hitPointRows", [], [[]]]]; + + private _worstHitPoint = 0; + { + private _value = _x getOrDefault ["value", 0]; + if (_value > _worstHitPoint) then { + _worstHitPoint = _value; + }; + } forEach _hitPointRows; + + 1 - ((_damage max _worstHitPoint) min 1) + }], + ["buildStoredVehicle", compileFinal { + params [["_plate", "", [""]], ["_vehicleData", createHashMap, [createHashMap]]]; + + private _className = _vehicleData getOrDefault ["classname", ""]; + private _damage = _vehicleData getOrDefault ["damage", 0]; + private _fuel = _vehicleData getOrDefault ["fuel", 0]; + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _hitPointRows = _self call ["buildHitPointRows", [_hitPoints]]; + + createHashMapFromArray [ + ["entryKind", "stored"], + ["plate", _plate], + ["classname", _className], + ["displayName", _self call ["resolveDisplayName", [_className]]], + ["picture", _self call ["resolvePicture", [_className]]], + ["category", _self call ["resolveCategory", [_className]]], + ["damage", _damage], + ["fuel", _fuel], + ["health", _self call ["resolveHealth", [_damage, _hitPointRows]]], + ["hitPoints", _hitPointRows] + ] + }], + ["buildNearbyVehicle", compileFinal { + params [ + ["_vehicle", objNull, [objNull]], + ["_origin", [], [[]]] + ]; + + if (isNull _vehicle) exitWith { createHashMap }; + + private _className = typeOf _vehicle; + private _rawHitPoints = getAllHitPointsDamage _vehicle; + private _hitPointRows = []; + if (_rawHitPoints isEqualType [] && { count _rawHitPoints >= 3 }) then { + private _names = _rawHitPoints param [0, []]; + private _selections = _rawHitPoints param [1, []]; + private _values = _rawHitPoints param [2, []]; + private _count = count _names; + + for "_index" from 0 to (_count - 1) do { + _hitPointRows pushBack (createHashMapFromArray [ + ["name", _names param [_index, ""]], + ["selection", _selections param [_index, ""]], + ["value", _values param [_index, 0]] + ]); + }; + }; + + private _damage = damage _vehicle; + private _distance = if (_origin isEqualType [] && { count _origin >= 2 }) then { + _vehicle distance2D _origin + } else { + _vehicle distance2D player + }; + private _ownerUid = _vehicle getVariable ["forge_garage_owner_uid", ""]; + private _plate = _vehicle getVariable ["forge_garage_plate", ""]; + + createHashMapFromArray [ + ["entryKind", "nearby"], + ["netId", netId _vehicle], + ["plate", _plate], + ["classname", _className], + ["displayName", _self call ["resolveDisplayName", [_className]]], + ["picture", _self call ["resolvePicture", [_className]]], + ["category", _self call ["resolveCategory", [_className]]], + ["damage", _damage], + ["fuel", fuel _vehicle], + ["health", _self call ["resolveHealth", [_damage, _hitPointRows]]], + ["hitPoints", _hitPointRows], + ["distance", _distance], + ["ownerUid", _ownerUid], + ["isEmpty", crew _vehicle isEqualTo []] + ] + }] +]; + +GVAR(GarageHelperService) = createHashMapObject [GVAR(GarageHelperServiceBaseClass)]; +GVAR(GarageHelperService) diff --git a/arma/client/addons/garage/functions/fnc_initPayloadService.sqf b/arma/client/addons/garage/functions/fnc_initPayloadService.sqf new file mode 100644 index 0000000..184065e --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initPayloadService.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initPayloadService.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the garage payload service for browser hydrate payload composition. + * + * Arguments: + * None + * + * Return Value: + * Garage payload service object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initPayloadService; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GaragePayloadServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "GaragePayloadServiceBaseClass"], + ["buildStoredVehicles", compileFinal { + private _garageMap = if (isNil QGVAR(GarageRepository)) then { createHashMap } else { GVAR(GarageRepository) call ["getState", []] }; + private _storedVehicles = []; + { _storedVehicles pushBack (GVAR(GarageHelperService) call ["buildStoredVehicle", [_x, _y]]); } forEach _garageMap; + private _storedVehiclePairs = _storedVehicles apply { [toLowerANSI (_x getOrDefault ["displayName", ""]), _x] }; + _storedVehiclePairs sort true; + _storedVehiclePairs apply { _x param [1, createHashMap] } + }], + ["buildPayload", compileFinal { + private _localState = GVAR(GarageContextService) call ["buildNearbyState", []]; + private _storedVehicles = _self call ["buildStoredVehicles", []]; + private _session = +(_localState getOrDefault ["session", createHashMap]); + _session set ["capacityUsed", count _storedVehicles]; + _session set ["capacityMax", 5]; + createHashMapFromArray [["session", _session], ["garage", createHashMapFromArray [["vehicles", _storedVehicles]]], ["nearby", +(_localState getOrDefault ["nearby", createHashMap])]] + }] +]; + +GVAR(GaragePayloadService) = createHashMapObject [GVAR(GaragePayloadServiceBaseClass)]; +GVAR(GaragePayloadService) diff --git a/arma/client/addons/garage/functions/fnc_initRepository.sqf b/arma/client/addons/garage/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..5129610 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initRepository.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the garage repository for persisted stored vehicle records. + * + * Arguments: + * None + * + * Return Value: + * Garage repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GarageRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "GarageRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["garage", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + private _uid = _self get "uid"; + [SRPC(garage,requestInitGarage), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["Garage loaded for %1", name player]; + diag_log "[FORGE:Client:Garage] Garage Repository Initialized!"; + }], + ["save", compileFinal { + private _uid = _self get "uid"; + [SRPC(garage,requestSaveGarage), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + }], + ["sync", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _isLoaded = _self get "isLoaded"; + private _garage = createHashMap; + { _garage set [_x, _y]; } forEach _data; + _self set ["garage", _garage]; + + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + diag_log "[FORGE:Client:Garage] Repository sync completed"; + }], + ["getState", compileFinal { + _self getOrDefault ["garage", createHashMap] + }], + ["get", compileFinal { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _garage = _self get "garage"; + _garage getOrDefault [_key, _default]; + }] +]; + +GVAR(GarageRepository) = createHashMapObject [GVAR(GarageRepositoryBaseClass)]; +GVAR(GarageRepository) diff --git a/arma/client/addons/garage/functions/fnc_initUIBridge.sqf b/arma/client/addons/garage/functions/fnc_initUIBridge.sqf new file mode 100644 index 0000000..ee20a28 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initUIBridge.sqf @@ -0,0 +1,59 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the garage UI bridge for browser control state and UI events. + * + * Arguments: + * None + * + * Return Value: + * Garage UI bridge object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initUIBridge; + */ + +#pragma hemtt ignore_variables ["_self"] +private _webUIDeclarations = call EFUNC(common,initWebUIBridge); +private _webUIBridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; + +GVAR(GarageUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _webUIBridgeDeclaration], + ["#type", "GarageUIBridgeBaseClass"], + ["getActiveBrowserControl", compileFinal { + private _display = uiNamespace getVariable ["RscGarage", displayNull]; + if (isNull _display) exitWith { + _self call ["setActiveBrowserControl", [controlNull]]; + controlNull + }; + + private _control = _display displayCtrl 1006; + _self call ["setActiveBrowserControl", [_control]]; + _control + }], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]]; + + private _screen = _self call ["getScreen", []]; + _screen call ["setControl", [_control]]; + _screen call ["markReady", [true]]; + + _self call ["flushPendingEvents", []]; + _self call ["sendEvent", ["garage::hydrate", GVAR(GaragePayloadService) call ["buildPayload", []], _control]]; + }], + ["refreshGarage", compileFinal { + private _control = _self call ["getActiveBrowserControl", []]; + if (isNull _control) exitWith { false }; + + _self call ["sendEvent", ["garage::sync", GVAR(GaragePayloadService) call ["buildPayload", []], _control]] + }] +]; + +GVAR(GarageUIBridge) = createHashMapObject [GVAR(GarageUIBridgeBaseClass)]; +GVAR(GarageUIBridge) diff --git a/arma/client/addons/garage/functions/fnc_initVGRepository.sqf b/arma/client/addons/garage/functions/fnc_initVGRepository.sqf new file mode 100644 index 0000000..4e99a8a --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_initVGRepository.sqf @@ -0,0 +1,96 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initVGRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the virtual garage repository for BIS virtual garage state. + * + * Arguments: + * None + * + * Return Value: + * Virtual garage repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_garage_fnc_initVGRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(VGRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "VGRepositoryBaseClass"], + ["#create", compileFinal { + GVAR(isPreLoaded) = false; + _self set ["uid", getPlayerUID player]; + _self set ["vGarage", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + private _uid = _self get "uid"; + [SRPC(garage,requestInitVG), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["VGarage loaded for %1", name player]; + diag_log "[FORGE:Client:VGarage] Repository Initialized!"; + }], + ["save", compileFinal { + private _uid = _self get "uid"; + [SRPC(garage,requestSaveVG), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + }], + ["sync", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _vGarage = _self get "vGarage"; + private _isLoaded = _self get "isLoaded"; + + { + _vGarage set [_x, _y]; + switch (_x) do { + case "cars": { _self call ["apply", ["cars"]]; }; + case "armor": { _self call ["apply", ["armor"]]; }; + case "helis": { _self call ["apply", ["helis"]]; }; + case "planes": { _self call ["apply", ["planes"]]; }; + case "naval": { _self call ["apply", ["naval"]]; }; + case "other": { _self call ["apply", ["other"]]; }; + default {}; + }; + } forEach _data; + + _self set ["vGarage", _vGarage]; + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + diag_log "[FORGE:Client:VGarage] Repository sync completed"; + }], + ["get", compileFinal { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _vGarage = _self get "vGarage"; + _vGarage getOrDefault [_key, _default]; + }], + ["apply", compileFinal { + params [["_key", "", [""]]]; + + private _vehicles = _self call ["get", [_key, []]]; + private _appliedVehicles = []; + { + _appliedVehicles append [getText (configFile >> "CfgVehicles" >> _x >> "model"), [configFile >> "CfgVehicles" >> _x]]; + } forEach _vehicles; + + switch (_key) do { + case "cars": { GVAR(Cars) = _appliedVehicles; }; + case "armor": { GVAR(Armor) = _appliedVehicles; }; + case "helis": { GVAR(Helis) = _appliedVehicles; }; + case "planes": { GVAR(Planes) = _appliedVehicles; }; + case "naval": { GVAR(Naval) = _appliedVehicles; }; + case "other": { GVAR(Other) = _appliedVehicles; }; + default {}; + }; + }] +]; + +GVAR(VGRepository) = createHashMapObject [GVAR(VGRepositoryBaseClass)]; +GVAR(VGRepository) diff --git a/arma/client/addons/garage/functions/fnc_openUI.sqf b/arma/client/addons/garage/functions/fnc_openUI.sqf new file mode 100644 index 0000000..8c47906 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_openUI.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2025-12-16 + * Last Update: 2026-01-30 + * Public: No + * + * Description: + * Opens the garage UI. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_garage_fnc_openUI; + */ + +params [["_garageObject", objNull, [objNull]]]; + +if (!isNull _garageObject) then { + GVAR(GarageContextService) call ["setActiveGarageObject", [_garageObject]]; +}; + +private _display = createDialog ["RscGarage", true]; +private _ctrl = _display displayCtrl 1006; + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +if !(isNil QGVAR(GarageUIBridge)) then { + GVAR(GarageUIBridge) call ["setActiveBrowserControl", [_ctrl]]; +}; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; + +true; diff --git a/arma/client/addons/garage/functions/fnc_openVG.sqf b/arma/client/addons/garage/functions/fnc_openVG.sqf new file mode 100644 index 0000000..4046b82 --- /dev/null +++ b/arma/client/addons/garage/functions/fnc_openVG.sqf @@ -0,0 +1,130 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openVG.sqf + * Author: IDSolutions + * Date: 2025-12-16 + * Last Update: 2026-04-22 + * Public: No + * + * Description: + * Opens the Virtual Garage. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_client_garage_fnc_openVG + */ + +params [["_garageObject", objNull, [objNull]]]; + +if (!isNull _garageObject) then { + GVAR(GarageContextService) call ["setActiveGarageObject", [_garageObject]]; +}; + +private _context = GVAR(GarageContextService) call ["getContext", [_garageObject]]; +private _spawnLane = GVAR(GarageContextService) call ["getSpawnLane", [_context getOrDefault ["garageType", ""], _context]]; + +FORGE_VehSpawnPos = _spawnLane getOrDefault ["spawnPosition", player getPos [8, getDir player]]; +missionNamespace setVariable [QGVAR(activeVGContext), _context]; +missionNamespace setVariable [QGVAR(activeVGNearbyVehicles), + (FORGE_VehSpawnPos nearEntities [["Car", "Tank", "Air", "Ship"], 15])]; + +BIS_fnc_garage_center = createVehicle ["Land_HelipadEmpty_F", FORGE_VehSpawnPos, [], 0, "NONE"]; +BIS_fnc_garage_centerType = getText (configFile >> "CfgVehicles" >> "B_Quadbike_01_F" >> "model"); + +if !(GVAR(isPreLoaded)) then { + [missionNamespace, "garageOpened", { + params ["_display", "_toggleSpace"]; + + missionNamespace setVariable ["BIS_fnc_garage_data", [ + GVAR(Cars), + GVAR(Armor), + GVAR(Helis), + GVAR(Planes), + GVAR(Naval), + GVAR(Other) + ]]; + + { + lbClear (_display displayCtrl (960 + _forEachIndex)); + } forEach BIS_fnc_garage_data; + + _display displayAddEventHandler ["KeyDown", "_this select 3"]; + { (_display displayCtrl _x) ctrlShow false } forEach [44151, 44150, 44146, 44147, 44148, 44149, 44346, 44347, 978]; + + ["ListAdd", [_display]] call BFUNC(garage); + }] call BFUNC(addScriptedEventHandler); + + [missionNamespace, "garageClosed", { + private _nearbyVehicles = BIS_fnc_garage_center nearEntities [["Car", "Tank", "Air", "Ship"], 15]; + private _preExistingVehicles = missionNamespace getVariable [QGVAR(activeVGNearbyVehicles), []]; + private _spawnedVehicles = _nearbyVehicles select { !(_x in _preExistingVehicles) }; + + if (_spawnedVehicles isNotEqualTo []) then { + private _spawnedVehiclePairs = _spawnedVehicles apply { [_x distance2D BIS_fnc_garage_center, _x] }; + _spawnedVehiclePairs sort true; + + private _obj = (_spawnedVehiclePairs select 0) param [1, objNull]; + if (isNull _obj) exitWith { + missionNamespace setVariable [QGVAR(activeVGNearbyVehicles), nil]; + missionNamespace setVariable [QGVAR(activeVGContext), nil]; + }; + + private _veh = typeOf _obj; + private _textures = getObjectTextures _obj; + private _animationNames = animationNames _obj; + private _context = missionNamespace getVariable [QGVAR(activeVGContext), createHashMap]; + private _spawnCategory = GVAR(GarageHelperService) call ["resolveVGCategory", [_veh]]; + private _spawnLane = GVAR(GarageContextService) call ["getExactSpawnLane", [_spawnCategory, _context]]; + private _spawnLabel = GVAR(GarageHelperService) call ["resolveGarageCategoryLabel", [_spawnCategory]]; + + { deleteVehicle _x } forEach _spawnedVehicles; + + if (_spawnLane isEqualTo createHashMap) exitWith { + missionNamespace setVariable [QGVAR(activeVGNearbyVehicles), nil]; + missionNamespace setVariable [QGVAR(activeVGContext), nil]; + private _params = ["warning", "Virtual Garage", format ["This garage does not support spawning %1.", _spawnLabel], 4000]; + EGVAR(notifications,NotificationService) call ["create", _params]; + }; + + private _spawnPosition = _spawnLane getOrDefault ["spawnPosition", FORGE_VehSpawnPos]; + private _spawnHeading = _spawnLane getOrDefault ["spawnHeading", getDir _obj]; + private _createVehicle = createVehicle [_veh, _spawnPosition, [], 0, "CAN_COLLIDE"]; + _createVehicle setDir _spawnHeading; + + if (_textures isNotEqualTo []) then { + private _count = 0; + { + _createVehicle setObjectTextureGlobal [_count, _x]; + _count = _count + 1; + } forEach _textures; + }; + + if (_animationNames isNotEqualTo []) then { + private _animationPhase = []; + + for "_i" from 0 to count _animationNames -1 do { + _animationPhase pushBack [_animationNames select _i, _obj animationPhase (_animationNames select _i)]; + { _createVehicle animate _x; } forEach _animationPhase; + }; + }; + }; + + missionNamespace setVariable [QGVAR(activeVGNearbyVehicles), nil]; + missionNamespace setVariable [QGVAR(activeVGContext), nil]; + }] call BFUNC(addScriptedEventHandler); + + GVAR(isPreLoaded) = true; +}; + +private _nearVehicles = FORGE_VehSpawnPos nearEntities [["Car", "Tank", "Air", "Ship"], 5]; +if (_nearVehicles isNotEqualTo []) exitWith { + private _params = ["warning", "Virtual Garage", "Vehicle spawn position is blocked. Please move the vehicle before accessing the garage.", 3000]; + EGVAR(notifications,NotificationService) call ["create", _params]; +}; + +["Open", true] call BFUNC(garage); diff --git a/arma/client/addons/garage/script_component.hpp b/arma/client/addons/garage/script_component.hpp new file mode 100644 index 0000000..cdb1497 --- /dev/null +++ b/arma/client/addons/garage/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT garage +#define COMPONENT_BEAUTIFIED Garage +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/garage/stringtable.xml b/arma/client/addons/garage/stringtable.xml new file mode 100644 index 0000000..32789f3 --- /dev/null +++ b/arma/client/addons/garage/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Garage + + + diff --git a/arma/client/addons/garage/ui/RscCommon.hpp b/arma/client/addons/garage/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/garage/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/garage/ui/RscGarage.hpp b/arma/client/addons/garage/ui/RscGarage.hpp new file mode 100644 index 0000000..e6f392d --- /dev/null +++ b/arma/client/addons/garage/ui/RscGarage.hpp @@ -0,0 +1,21 @@ +class RscGarage { + idd = 1005; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscGarage', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscGarage', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1006; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/garage/ui/_site/garage-ui.css b/arma/client/addons/garage/ui/_site/garage-ui.css new file mode 100644 index 0000000..fe65676 --- /dev/null +++ b/arma/client/addons/garage/ui/_site/garage-ui.css @@ -0,0 +1 @@ +:root{--garage-shell-bg:#e4e3df;--garage-surface:#f5f3ef;--garage-surface-alt:#ece8e2;--garage-border:#4a5b6e33;--garage-border-strong:#142e4f2e;--garage-text-main:#1f2d3d;--garage-text-muted:#6a7787;--garage-text-subtle:#8792a0;--garage-accent:#12365d;--garage-accent-soft:#dbe7f3;--garage-accent-line:#12365d1f;--garage-warning:#8f5f26}*{box-sizing:border-box}html,body{width:100%;height:100%;margin:0;overflow:hidden}body{color:var(--garage-text-main);background:var(--garage-shell-bg);font-family:Segoe UI,Trebuchet MS,sans-serif}button,input{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.72}:focus-visible{outline-offset:2px;outline:2px solid #12365d59}#app{width:100%;height:100%}.garage-shell{background:var(--garage-shell-bg);flex-direction:column;width:100%;height:100%;display:flex;overflow:hidden}.garage-layout{flex:1;grid-template-columns:308px minmax(0,1fr);gap:1.25rem;width:min(100%,1613px);min-height:0;margin:0 auto;padding:1.25rem;display:grid}.garage-sidebar,.garage-main{flex-direction:column;gap:1rem;min-height:0;display:flex}.garage-main{overflow:hidden}.garage-module,.garage-panel,.garage-card{background:linear-gradient(180deg, var(--garage-surface) 0%, var(--garage-surface-alt) 100%);border:1px solid var(--garage-border);border-radius:1.35rem}.garage-module,.garage-card{padding:1rem}.garage-module{align-content:start;gap:.85rem;display:grid}.garage-panel{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.garage-panel-header,.garage-module-header,.garage-card-header{justify-content:space-between;align-items:center;gap:1rem;display:flex}.garage-panel-header{padding:1rem 1rem 0}.garage-module-header{align-items:flex-start}.garage-panel-intro{border-bottom:1px solid var(--garage-accent-line);padding:0 1rem 1rem}.garage-dashboard{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:stretch;gap:1rem;min-height:0;padding:1rem;display:grid}.garage-list-card,.garage-detail-card{flex-direction:column;min-height:0;display:flex}.garage-detail-card{grid-column:1/-1}.garage-scroll-body{flex:1;gap:.8rem;min-height:clamp(10rem,20vh,16rem);max-height:clamp(12rem,25vh,19rem);padding-right:.2rem;display:grid;overflow:auto}.garage-detail-body{padding-top:.75rem}.garage-detail-grid{grid-template-columns:minmax(0,1.25fr) minmax(280px,.85fr);gap:1rem;display:grid}.garage-detail-meta,.garage-summary-grid,.garage-search-actions,.garage-category-grid,.garage-action-row,.garage-inline-meters,.garage-hitpoint-grid,.garage-footer{gap:.75rem;display:grid}.garage-detail-meta{grid-template-columns:repeat(3,minmax(0,1fr));margin-bottom:.7rem}.garage-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.garage-summary-grid>:last-child{grid-column:1/-1}.garage-search-actions,.garage-action-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:.55rem}.garage-category-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem}.garage-action-refresh{grid-column:1/-1}.garage-footer-bar{border-top:1px solid #12365d1a;width:100%}.garage-footer{grid-template-columns:repeat(3,minmax(0,1fr));width:min(100%,1613px);margin:0 auto;padding:.95rem 1.25rem 1.15rem}.garage-meter-stack{gap:.55rem;margin-bottom:.7rem;display:grid}.garage-eyebrow,.garage-footer-title,.garage-stat-label,.garage-meter-label,.garage-hitpoint-selection{letter-spacing:.18em;text-transform:uppercase;color:var(--garage-text-subtle);font-size:.68rem;font-weight:700}.garage-title,.garage-section-title{letter-spacing:-.02em;color:var(--garage-text-main);margin:.16rem 0 0;font-weight:700}.garage-title{font-size:1.1rem}.garage-section-title{font-size:1.05rem}.garage-copy,.garage-detail-note,.garage-empty-copy,.garage-footer-copy,.garage-vehicle-meta,.garage-detail-caption{color:var(--garage-text-muted);margin:0;font-size:.92rem;line-height:1.48}.garage-pill,.garage-badge{letter-spacing:.1em;text-transform:uppercase;background:var(--garage-accent-soft);color:var(--garage-accent);border-radius:999px;justify-content:center;align-items:center;padding:.48rem .8rem;font-size:.74rem;font-weight:700;display:inline-flex}.garage-badge.is-warning{color:var(--garage-warning);background:#f6e2c1e0}.garage-search-form{gap:.75rem;display:grid}.garage-search-input{border:1px solid var(--garage-border);width:100%;height:2.9rem;color:var(--garage-text-main);background:#ffffffbf;border-radius:.8rem;padding:0 .95rem}.garage-stat-card{border:1px solid var(--garage-border);background:#ffffff7a;border-radius:.85rem;flex-direction:column;gap:.3rem;min-width:0;padding:.85rem;display:flex}.garage-stat-card.is-accent{background:linear-gradient(#edf3f9eb 0%,#dfe8f2b8 100%)}.garage-stat-card.is-danger{background:linear-gradient(#fef2f2f2 0%,#fce1e1d1 100%);border-color:#dc979761}.garage-stat-value{color:var(--garage-text-main);overflow-wrap:anywhere;word-break:break-word;font-size:1rem;font-weight:700;line-height:1.3}.garage-chip{border:1px solid var(--garage-border);min-height:2.6rem;color:var(--garage-text-muted);letter-spacing:.08em;text-transform:uppercase;background:#ffffff85;border-radius:.85rem;padding:.68rem .9rem;font-size:.8rem;font-weight:700}.garage-chip.is-active{background:var(--garage-accent-soft);color:var(--garage-accent);border-color:#12365d33}.garage-vehicle-item{border:1px solid var(--garage-border);width:100%;color:inherit;text-align:left;background:#ffffff7a;border-radius:.95rem;padding:.9rem}.garage-vehicle-item.is-selected{background:linear-gradient(#edf3f9f5 0%,#dfe8f2bd 100%);border-color:#12365d3d;box-shadow:0 16px 26px #12365d14}.garage-vehicle-item-head,.garage-meter-label-row,.garage-subsystem-header,.garage-hitpoint-row{justify-content:space-between;align-items:center;gap:.75rem;display:flex}.garage-vehicle-copy,.garage-hitpoint-copy,.garage-footer-block{flex-direction:column;gap:.18rem;min-width:0;display:flex}.garage-vehicle-title,.garage-hitpoint-name,.garage-hitpoint-value{color:var(--garage-text-main);font-size:.9rem;font-weight:700}.garage-meter{gap:.32rem;display:grid}.garage-meter-track{background:#12365d14;border-radius:999px;width:100%;height:.45rem;overflow:hidden}.garage-meter-value{color:var(--garage-text-main);font-size:.78rem;font-weight:700}.garage-meter-fill{border-radius:inherit;height:100%;display:block}.garage-meter-fill.is-health{background:linear-gradient(90deg,#2f7d5b 0%,#4eaa82 100%)}.garage-meter-fill.is-fuel{background:linear-gradient(90deg,#12365d 0%,#3c6792 100%)}.garage-btn{border:1px solid var(--garage-border-strong);letter-spacing:.08em;text-transform:uppercase;border-radius:.8rem;min-height:2.5rem;padding:.62rem 1rem;font-size:.82rem;font-weight:700}.garage-btn-primary{color:var(--garage-accent);background:#ffffffad}.garage-btn-primary:hover{background:#dbe7f3e0}.garage-btn-secondary{color:var(--garage-text-muted);background:#ffffff6b}.garage-btn-secondary:hover{color:var(--garage-text-main);background:#fff9}.garage-hitpoint-row{border:1px solid var(--garage-border);background:#ffffff85;border-radius:.85rem;padding:.72rem .78rem}.garage-detail-empty,.garage-empty-state{flex-direction:column;justify-content:center;align-items:flex-start;min-height:100%;display:flex}.garage-empty-title{color:var(--garage-text-main);margin:0 0 .35rem;font-size:1rem;font-weight:700}.garage-empty-inline{border:1px dashed var(--garage-border);color:var(--garage-text-muted);background:#ffffff5c;border-radius:.85rem;padding:.9rem}.garage-toast-stack{z-index:10;flex-direction:column;gap:.65rem;display:flex;position:fixed;top:1.2rem;right:1.5rem}.garage-toast{border:1px solid var(--garage-border);background:#fff;border-radius:.9rem;max-width:24rem;padding:.85rem 1rem;font-size:.92rem;box-shadow:0 14px 28px #10223824}.garage-toast.is-success{color:#166534;background:#ecfdf5;border-color:#bbf7d0}.garage-toast.is-error{color:#991b1b;background:#fef2f2;border-color:#fecaca}@media (width<=1440px){.garage-layout{grid-template-columns:288px minmax(0,1fr)}.garage-detail-grid{grid-template-columns:1fr}}@media (width<=1120px){.garage-layout{grid-template-columns:1fr;overflow:auto}.garage-main,.garage-sidebar{min-height:auto}.garage-dashboard{grid-template-columns:1fr}.garage-detail-card{grid-column:auto}.garage-scroll-body{min-height:16rem;max-height:none}.garage-footer{grid-template-columns:1fr}} \ No newline at end of file diff --git a/arma/client/addons/garage/ui/_site/garage-ui.js b/arma/client/addons/garage/ui/_site/garage-ui.js new file mode 100644 index 0000000..89e096a --- /dev/null +++ b/arma/client/addons/garage/ui/_site/garage-ui.js @@ -0,0 +1 @@ +!function(){const e=window.ForgeWebUI;(window.GarageApp=window.GarageApp||{}).runtime=e,window.AppRuntime=e}(),function(){const e=window.GarageApp=window.GarageApp||{},a={garageName:"Vehicle Garage",capacityUsed:0,capacityMax:5,nearbyCount:0,spawnBlocked:!1,spawnStatus:"Ready"},r={vehicles:[]},t={vehicles:[]};function s(e,a){var r;Object.keys(e).forEach(a=>delete e[a]),Object.assign(e,(r=a,JSON.parse(JSON.stringify(r))))}e.data={categories:[{id:"all",label:"All"},{id:"car",label:"Cars"},{id:"armor",label:"Armor"},{id:"air",label:"Air"},{id:"naval",label:"Naval"},{id:"other",label:"Other"}],session:Object.assign({},a),garage:Object.assign({},r),nearby:Object.assign({},t),applyHydratePayload(e){s(this.session,Object.assign({},a,e?.session||{})),s(this.garage,Object.assign({},r,e?.garage||{})),s(this.nearby,Object.assign({},t,e?.nearby||{}))}}}(),function(){const e=window.GarageApp=window.GarageApp||{},{createSignal:a}=e.runtime;e.store=new class{constructor(){[this.getSelectedKind,this.setSelectedKind]=a(""),[this.getSelectedId,this.setSelectedId]=a(""),[this.getSearchQuery,this.setSearchQuery]=a(""),[this.getCategoryFilter,this.setCategoryFilter]=a("all"),[this.getPendingAction,this.setPendingAction]=a(""),[this.getNotice,this.setNotice]=a({type:"",text:""})}getSelection(){return{id:this.getSelectedId(),kind:this.getSelectedKind()}}clearSelection(){this.setSelectedKind(""),this.setSelectedId("")}select(e,a){this.setSelectedKind(String(e||"")),this.setSelectedId(String(a||""))}startAction(e){this.setPendingAction(String(e||""))}finishAction(){this.setPendingAction("")}matchesSelection(e){if(!e||"object"!=typeof e)return!1;const a=this.getSelection();return!(!a.kind||!a.id)&&("stored"===a.kind?"stored"===e.entryKind&&String(e.plate||"")===a.id:"nearby"===a.kind&&("nearby"===e.entryKind&&String(e.netId||"")===a.id))}ensureSelection(){const a=Array.isArray(e.data?.garage?.vehicles)?e.data.garage.vehicles:[],r=Array.isArray(e.data?.nearby?.vehicles)?e.data.nearby.vehicles:[];if([...a,...r].some(e=>this.matchesSelection(e)))return;const t=a[0]||null;if(t)return void this.select("stored",t.plate||"");const s=r[0]||null;s?this.select("nearby",s.netId||""):this.clearSelection()}hydrateFromPayload(){this.finishAction(),this.ensureSelection()}}}(),function(){const e=window.GarageApp=window.GarageApp||{},a=e.store,r=window.ForgeWebUI.createBridge({closeEvent:"garage::close",globalName:"ForgeBridge",readyEvent:"garage::ready"});function t(r){e.data.applyHydratePayload(r),a.hydrateFromPayload(r)}r.on("garage::hydrate",t),r.on("garage::sync",t),r.on("garage::retrieve::success",r=>{a.finishAction(),e.actions&&e.actions.showNotice("success",r.message||"Vehicle retrieved from the garage.")}),r.on("garage::retrieve::failure",r=>{a.finishAction(),e.actions&&e.actions.showNotice("error",r.message||"Unable to retrieve vehicle.")}),r.on("garage::store::success",r=>{a.finishAction(),e.actions&&e.actions.showNotice("success",r.message||"Vehicle stored in the garage.")}),r.on("garage::store::failure",r=>{a.finishAction(),e.actions&&e.actions.showNotice("error",r.message||"Unable to store vehicle.")}),r.on("garage::service::success",r=>{a.finishAction(),e.actions&&e.actions.showNotice("success",r.message||"Service request sent.")}),r.on("garage::service::failure",r=>{a.finishAction(),e.actions&&e.actions.showNotice("error",r.message||"Unable to service vehicle.")}),e.bridge={notifyReady:function(){return r.ready({loaded:!0})},receive:r.receive,requestClose:function(){return r.close({})},requestRefresh:function(){return r.send("garage::refresh",{})},requestRearm:function(e){return r.send("garage::vehicle::rearm::request",e)},requestRefuel:function(e){return r.send("garage::vehicle::refuel::request",e)},requestRepair:function(e){return r.send("garage::vehicle::repair::request",e)},requestRetrieve:function(e){return r.send("garage::vehicle::retrieve::request",e)},requestStore:function(e){return r.send("garage::vehicle::store::request",e)},sendEvent:r.send}}(),function(){const e=window.GarageApp=window.GarageApp||{},a=e.store;let r=null;function t(){const r=a.getSelection();return"stored"===r.kind?(Array.isArray(e.data?.garage?.vehicles)?e.data.garage.vehicles:[]).find(e=>String(e.plate||"")===r.id)||null:"nearby"===r.kind&&(Array.isArray(e.data?.nearby?.vehicles)?e.data.nearby.vehicles:[]).find(e=>String(e.netId||"")===r.id)||null}function s(e,t){a.setNotice({type:e,text:t}),r&&clearTimeout(r),r=setTimeout(()=>{a.setNotice({type:"",text:""}),r=null},3200)}e.actions={showNotice:s,closeGarage:function(){const a=e.bridge;if(a&&"function"==typeof a.requestClose){if(a.requestClose())return!0}return s("error","Garage bridge is unavailable."),!1},refreshGarage:function(){const a=e.bridge;if(a&&"function"==typeof a.requestRefresh){if(a.requestRefresh())return!0}return s("error","Garage refresh bridge is unavailable."),!1},applySearchQuery:function(e){a.setSearchQuery(String(e||"").trim())},clearSearch:function(){a.setSearchQuery("")},selectCategory:function(e){a.setCategoryFilter(String(e||"all").trim()||"all")},selectEntry:function(e,r){a.select(e,r)},getSelectedEntry:t,requestRearmSelected:function(){const r=t();if(!r||"nearby"!==r.entryKind)return s("error","Select a nearby vehicle to rearm."),!1;const i=e.bridge;return i&&"function"==typeof i.requestRearm?(a.startAction("rearm"),!!i.requestRearm({netId:r.netId||""})||(a.finishAction(),s("error","Garage rearm bridge is unavailable."),!1)):(s("error","Garage rearm bridge is unavailable."),!1)},requestRefuelSelected:function(){const r=t();if(!r||"nearby"!==r.entryKind)return s("error","Select a nearby vehicle to refuel."),!1;if(Number(r.fuel||0)>=.999)return s("error","Vehicle fuel tank is already full."),!1;const i=e.bridge;return i&&"function"==typeof i.requestRefuel?(a.startAction("refuel"),!!i.requestRefuel({netId:r.netId||""})||(a.finishAction(),s("error","Garage refuel bridge is unavailable."),!1)):(s("error","Garage refuel bridge is unavailable."),!1)},requestRepairSelected:function(){const r=t();if(!r||"nearby"!==r.entryKind)return s("error","Select a nearby vehicle to repair."),!1;if(Number(r.health||0)>=.999)return s("error","Vehicle has no reported damage."),!1;const i=e.bridge;return i&&"function"==typeof i.requestRepair?(a.startAction("repair"),!!i.requestRepair({netId:r.netId||""})||(a.finishAction(),s("error","Garage repair bridge is unavailable."),!1)):(s("error","Garage repair bridge is unavailable."),!1)},requestRetrieveSelected:function(){const r=t();if(!r||"stored"!==r.entryKind)return s("error","Select a stored vehicle to retrieve."),!1;if(e.data?.session?.spawnBlocked)return s("error","The garage spawn area is blocked."),!1;const i=e.bridge;return i&&"function"==typeof i.requestRetrieve?(a.startAction("retrieve"),!!i.requestRetrieve({plate:r.plate||""})||(a.finishAction(),s("error","Garage retrieve bridge is unavailable."),!1)):(s("error","Garage retrieve bridge is unavailable."),!1)},requestStoreSelected:function(){const r=t();if(!r||"nearby"!==r.entryKind)return s("error","Select a nearby vehicle to store."),!1;if(!1===r.isEmpty)return s("error","All crew must exit the vehicle before storing it."),!1;const i=e.bridge;return i&&"function"==typeof i.requestStore?(a.startAction("store"),!!i.requestStore({netId:r.netId||""})||(a.finishAction(),s("error","Garage store bridge is unavailable."),!1)):(s("error","Garage store bridge is unavailable."),!1)}}}(),function(){const e=window.GarageApp=window.GarageApp||{},{h:a}=e.runtime,r=window.SharedUI.componentFns.WindowTitleBar,t=e.store,s=e.actions,{categories:i,garage:n,nearby:c,session:l}=e.data;function o(e){return Math.max(0,Math.min(100,Math.round(100*Number(e||0))))}function g(e){const a=i.find(a=>a.id===String(e||"other").toLowerCase());return a?a.label:"Other"}function d(e){return`${Math.round(Number(e||0))} m`}function u(e){return String(e||"").trim()||"Untracked"}function m(e,a){return(e||[]).filter(e=>("all"===a.categoryFilter||String(e.category||"").toLowerCase()===a.categoryFilter)&&function(e,a){const r=String(e||"").trim().toLowerCase();return!r||a.some(e=>String(e||"").toLowerCase().includes(r))}(a.searchQuery,[e.displayName,e.classname,e.plate,e.netId,e.category]))}function p(e,r,t=""){return a("div",{className:t?`garage-stat-card is-${t}`:"garage-stat-card"},a("span",{className:"garage-stat-label"},e),a("span",{className:"garage-stat-value"},r))}function h(e,r,t){return a("div",{className:"garage-meter"},a("div",{className:"garage-meter-label-row"},a("span",{className:"garage-meter-label"},e),a("span",{className:"garage-meter-value"},`${r}%`)),a("div",{className:"garage-meter-track"},a("span",{className:`garage-meter-fill is-${t}`,style:{width:`${r}%`}})))}function y(e,r,t,i,n){return a("section",{className:"garage-card garage-list-card"},a("div",{className:"garage-card-header"},a("div",null,a("span",{className:"garage-eyebrow"},r),a("h2",{className:"garage-section-title"},e)),a("span",{className:"garage-pill"},`${i.length} ${1===i.length?"Vehicle":"Vehicles"}`)),a("div",{className:"garage-card-body garage-scroll-body","data-preserve-scroll-id":t},i.length>0?i.map(e=>function(e,r){const t="stored"===e.entryKind?String(e.plate||""):String(e.netId||""),i="nearby"===e.entryKind;return a("button",{type:"button",className:(n=e,c=r,n&&c&&String(n.entryKind||"")===String(c.entryKind||"")&&String(n.plate||"")===String(c.plate||"")&&String(n.netId||"")===String(c.netId||"")?"garage-vehicle-item is-selected":"garage-vehicle-item"),onClick:()=>s.selectEntry(e.entryKind,t)},a("div",{className:"garage-vehicle-item-head"},a("div",{className:"garage-vehicle-copy"},a("span",{className:"garage-vehicle-title"},e.displayName||e.classname||"Vehicle"),a("span",{className:"garage-vehicle-meta"},i?`Nearby ${d(e.distance)}`:`Plate ${u(e.plate)}`)),a("span",{className:i&&!1===e.isEmpty?"garage-badge is-warning":"garage-badge"},i?!1===e.isEmpty?"Crewed":"Empty":g(e.category))),a("div",{className:"garage-inline-meters"},h("Health",o(e.health),"health"),h("Fuel",o(e.fuel),"fuel")));var n,c}(e,n)):a("div",{className:"garage-empty-state"},a("h3",{className:"garage-empty-title"},"No matching vehicles"),a("p",{className:"garage-empty-copy"},"Adjust the current search or category filter to view more records."))))}function b(e){const r=(Array.isArray(e)?e:[]).slice().sort((e,a)=>Number(a.value||0)-Number(e.value||0)).slice(0,6).filter(e=>Number(e.value||0)>0);return 0===r.length?a("div",{className:"garage-empty-inline"},"No subsystem damage reported."):a("div",{className:"garage-hitpoint-grid"},r.map(e=>{return a("div",{className:"garage-hitpoint-row"},a("div",{className:"garage-hitpoint-copy"},a("span",{className:"garage-hitpoint-name"},(r=e.name,String(r||"").replace(/^Hit/i,"").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").trim()||"Subsystem")),e.selection?a("span",{className:"garage-hitpoint-selection"},e.selection):null),a("span",{className:"garage-hitpoint-value"},`${Math.round(100*Number(e.value||0))}%`));var r}))}e.components=e.components||{},e.components.App=function(){const e={categoryFilter:t.getCategoryFilter(),notice:t.getNotice(),pendingAction:t.getPendingAction(),searchQuery:t.getSearchQuery(),selectedId:t.getSelectedId(),selectedKind:t.getSelectedKind()},v=function(e){return"stored"===e.selectedKind?(n.vehicles||[]).find(a=>String(a.plate||"")===e.selectedId)||null:"nearby"===e.selectedKind&&(c.vehicles||[]).find(a=>String(a.netId||"")===e.selectedId)||null}(e),f=m(n.vehicles||[],e),N=m(c.vehicles||[],e),S=e.searchQuery?`Search: ${e.searchQuery}`:"Live";return a("div",{className:"garage-shell"},r({kicker:"FORGE Logistics",title:"Vehicle Garage",onClose:()=>s.closeGarage(),closeLabel:"Close garage interface"}),e.notice.text?a("div",{className:"garage-toast-stack"},a("div",{className:"error"===e.notice.type?"garage-toast is-error":"garage-toast is-success"},e.notice.text)):null,a("div",{className:"garage-layout"},a("aside",{className:"garage-sidebar"},a("section",{className:"garage-module"},a("div",{className:"garage-module-header"},a("div",null,a("span",{className:"garage-eyebrow"},"Search"),a("h2",{className:"garage-section-title"},"Vehicle Records")),a("span",{className:"garage-pill"},S)),a("div",{className:"garage-search-form"},a("input",{id:"garage-search-input",type:"text",className:"garage-search-input",placeholder:"Search by name, plate, or category",value:e.searchQuery}),a("div",{className:"garage-search-actions"},a("button",{type:"button",className:"garage-btn garage-btn-primary",onClick:()=>s.applySearchQuery(document.getElementById("garage-search-input")?.value||"")},"Apply Search"),a("button",{type:"button",className:"garage-btn garage-btn-secondary",onClick:()=>s.clearSearch()},"Clear")))),a("section",{className:"garage-module"},a("div",{className:"garage-module-header"},a("div",null,a("span",{className:"garage-eyebrow"},"Filter"),a("h2",{className:"garage-section-title"},"Vehicle Categories"))),a("div",{className:"garage-category-grid"},i.map(r=>a("button",{type:"button",className:e.categoryFilter===r.id?"garage-chip is-active":"garage-chip",onClick:()=>s.selectCategory(r.id)},r.label)))),a("section",{className:"garage-module"},a("div",{className:"garage-module-header"},a("div",null,a("span",{className:"garage-eyebrow"},"Status"),a("h2",{className:"garage-section-title"},"Garage Summary")),a("button",{type:"button",className:"garage-btn garage-btn-secondary",disabled:Boolean(e.pendingAction),onClick:()=>s.refreshGarage()},"Refresh")),a("div",{className:"garage-summary-grid"},p("Stored",`${l.capacityUsed}/${l.capacityMax}`),p("Nearby",l.nearbyCount,"accent"),p("Spawn Lane",l.spawnStatus,l.spawnBlocked?"danger":"")))),a("main",{className:"garage-main"},a("section",{className:"garage-panel"},a("div",{className:"garage-panel-header"},a("div",null,a("span",{className:"garage-eyebrow"},"Operations Bay"),a("h1",{className:"garage-title"},l.garageName||"Vehicle Garage")),a("span",{className:"garage-pill"},`${l.capacityUsed}/${l.capacityMax} Stored`)),a("div",{className:"garage-panel-intro"},a("p",{className:"garage-copy"},"Retrieve stored vehicles into the active spawn lane or store nearby empty vehicles back into persistent ownership records.")),a("div",{className:"garage-dashboard"},y("Stored Vehicles","Persistent Records","garage-stored-list",f,v),y("Nearby Vehicles","Store Window","garage-nearby-list",N,v),function(e,r){if(!e)return a("section",{className:"garage-card garage-detail-card"},a("div",{className:"garage-card-header"},a("div",null,a("span",{className:"garage-eyebrow"},"Selection"),a("h2",{className:"garage-section-title"},"Vehicle Detail"))),a("div",{className:"garage-card-body garage-detail-empty"},a("h3",{className:"garage-empty-title"},"Select a vehicle"),a("p",{className:"garage-empty-copy"},"Choose a stored record to retrieve or a nearby vehicle to store.")));const t="stored"===e.entryKind,i=String(r.pendingAction||""),n=Boolean(i),c=t&&!l.spawnBlocked&&!n,m=!t&&!1!==e.isEmpty&&!n,y=!t&&Number(e.fuel||0)<.999&&!n,v=!t&&Number(e.health||0)<.999&&!n,f=!t&&!n;return a("section",{className:"garage-card garage-detail-card"},a("div",{className:"garage-card-header"},a("div",null,a("span",{className:"garage-eyebrow"},t?"Stored Record":"Nearby Vehicle"),a("h2",{className:"garage-section-title"},e.displayName||e.classname||"Vehicle")),a("span",{className:"nearby"===e.entryKind&&!1===e.isEmpty?"garage-badge is-warning":"garage-badge"},t?`Plate ${u(e.plate)}`:!1===e.isEmpty?"Crewed":"Ready")),a("div",{className:"garage-card-body garage-detail-body"},a("div",{className:"garage-detail-grid"},a("div",{className:"garage-detail-copy"},a("div",{className:"garage-detail-meta"},p("Category",g(e.category)),p("Status",(N=e)?"stored"===N.entryKind?"Stored":!1===N.isEmpty?"Crewed":"Ready":"-","nearby"===e.entryKind&&!1===e.isEmpty?"danger":""),p(t?"Record":"Distance",t?u(e.plate):d(e.distance),t?"":"accent")),a("div",{className:"garage-meter-stack"},h("Health",o(e.health),"health"),h("Fuel",o(e.fuel),"fuel")),a("div",{className:"garage-action-row"},t?a("button",{type:"button",className:"garage-btn garage-btn-primary",disabled:!c,onClick:()=>s.requestRetrieveSelected()},"retrieve"===i?"Retrieving...":"Retrieve Vehicle"):a("button",{type:"button",className:"garage-btn garage-btn-primary",disabled:!m,onClick:()=>s.requestStoreSelected()},"store"===i?"Storing...":"Store Vehicle"),a("button",{type:"button",className:"garage-btn garage-btn-secondary",disabled:!y,onClick:()=>s.requestRefuelSelected()},"refuel"===i?"Refueling...":"Refuel"),a("button",{type:"button",className:"garage-btn garage-btn-secondary",disabled:!v,onClick:()=>s.requestRepairSelected()},"repair"===i?"Repairing...":"Repair"),a("button",{type:"button",className:"garage-btn garage-btn-secondary",disabled:!f,onClick:()=>s.requestRearmSelected()},"rearm"===i?"Rearming...":"Rearm"),a("button",{type:"button",className:"garage-btn garage-btn-secondary garage-action-refresh",disabled:n,onClick:()=>s.refreshGarage()},"Refresh")),a("p",{className:"garage-detail-note"},t?l.spawnBlocked?"The garage spawn lane is currently blocked.":"Retrieve this stored vehicle into the active spawn lane before refuel, rearm, or repair service.":!1===e.isEmpty?"Only empty nearby vehicles can be stored.":"Store this nearby vehicle or request organization-billed refuel, rearm, and repair service.")),a("div",{className:"garage-detail-subsystems"},a("div",{className:"garage-subsystem-header"},a("span",{className:"garage-eyebrow"},"Subsystems"),a("span",{className:"garage-detail-caption"},"Highest damage first")),b(e.hitPoints)))));var N}(v,e))))),a("footer",{className:"garage-footer-bar"},a("div",{className:"garage-footer"},a("div",{className:"garage-footer-block"},a("span",{className:"garage-footer-title"},"Storage Capacity"),a("span",{className:"garage-footer-copy"},`${l.capacityUsed} of ${l.capacityMax} vehicle slot(s) are currently occupied.`)),a("div",{className:"garage-footer-block"},a("span",{className:"garage-footer-title"},"Retrieval Window"),a("span",{className:"garage-footer-copy"},l.spawnBlocked?"Spawn lane is blocked. Clear the bay before retrieving another vehicle.":"Spawn lane is clear. Stored vehicles can be retrieved immediately.")),a("div",{className:"garage-footer-block"},a("span",{className:"garage-footer-title"},"Store Rules"),a("span",{className:"garage-footer-copy"},"Only nearby empty vehicles can be stored. Nearby count updates from the live world state.")))))}}(),function(){const e=window.ForgeWebUI,a=window.GarageApp;e.createApp({name:"garage",root:"#app",setup({root:r}){e.mount(r,()=>a.components.App(),{preserveScroll:!0}),a.bridge&&a.bridge.notifyReady()}}).start()}(); \ No newline at end of file diff --git a/arma/client/addons/garage/ui/_site/index.html b/arma/client/addons/garage/ui/_site/index.html new file mode 100644 index 0000000..02cdff9 --- /dev/null +++ b/arma/client/addons/garage/ui/_site/index.html @@ -0,0 +1 @@ +FORGE Vehicle Garage
\ No newline at end of file diff --git a/arma/client/addons/garage/ui/src/bootstrap.js b/arma/client/addons/garage/ui/src/bootstrap.js new file mode 100644 index 0000000..f6b5949 --- /dev/null +++ b/arma/client/addons/garage/ui/src/bootstrap.js @@ -0,0 +1,19 @@ +(function () { + const ForgeWebUI = window.ForgeWebUI; + const GarageApp = window.GarageApp; + const app = ForgeWebUI.createApp({ + name: "garage", + root: "#app", + setup({ root }) { + ForgeWebUI.mount(root, () => GarageApp.components.App(), { + preserveScroll: true, + }); + + if (GarageApp.bridge) { + GarageApp.bridge.notifyReady(); + } + }, + }); + + app.start(); +})(); diff --git a/arma/client/addons/garage/ui/src/bridge.js b/arma/client/addons/garage/ui/src/bridge.js new file mode 100644 index 0000000..7941864 --- /dev/null +++ b/arma/client/addons/garage/ui/src/bridge.js @@ -0,0 +1,122 @@ +(function () { + const GarageApp = (window.GarageApp = window.GarageApp || {}); + const store = GarageApp.store; + const bridge = window.ForgeWebUI.createBridge({ + closeEvent: "garage::close", + globalName: "ForgeBridge", + readyEvent: "garage::ready", + }); + + function requestClose() { + return bridge.close({}); + } + + function requestRefresh() { + return bridge.send("garage::refresh", {}); + } + + function requestRetrieve(payload) { + return bridge.send("garage::vehicle::retrieve::request", payload); + } + + function requestStore(payload) { + return bridge.send("garage::vehicle::store::request", payload); + } + + function requestRefuel(payload) { + return bridge.send("garage::vehicle::refuel::request", payload); + } + + function requestRepair(payload) { + return bridge.send("garage::vehicle::repair::request", payload); + } + + function requestRearm(payload) { + return bridge.send("garage::vehicle::rearm::request", payload); + } + + function notifyReady() { + return bridge.ready({ loaded: true }); + } + + function hydrate(payloadData) { + GarageApp.data.applyHydratePayload(payloadData); + store.hydrateFromPayload(payloadData); + } + + bridge.on("garage::hydrate", hydrate); + bridge.on("garage::sync", hydrate); + + bridge.on("garage::retrieve::success", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "success", + payloadData.message || "Vehicle retrieved from the garage.", + ); + } + }); + + bridge.on("garage::retrieve::failure", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "error", + payloadData.message || "Unable to retrieve vehicle.", + ); + } + }); + + bridge.on("garage::store::success", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "success", + payloadData.message || "Vehicle stored in the garage.", + ); + } + }); + + bridge.on("garage::store::failure", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "error", + payloadData.message || "Unable to store vehicle.", + ); + } + }); + + bridge.on("garage::service::success", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "success", + payloadData.message || "Service request sent.", + ); + } + }); + + bridge.on("garage::service::failure", (payloadData) => { + store.finishAction(); + if (GarageApp.actions) { + GarageApp.actions.showNotice( + "error", + payloadData.message || "Unable to service vehicle.", + ); + } + }); + + GarageApp.bridge = { + notifyReady, + receive: bridge.receive, + requestClose, + requestRefresh, + requestRearm, + requestRefuel, + requestRepair, + requestRetrieve, + requestStore, + sendEvent: bridge.send, + }; +})(); diff --git a/arma/client/addons/garage/ui/src/components/AppShell.js b/arma/client/addons/garage/ui/src/components/AppShell.js new file mode 100644 index 0000000..9026934 --- /dev/null +++ b/arma/client/addons/garage/ui/src/components/AppShell.js @@ -0,0 +1,879 @@ +(function () { + const GarageApp = (window.GarageApp = window.GarageApp || {}); + const { h } = GarageApp.runtime; + const WindowTitleBar = window.SharedUI.componentFns.WindowTitleBar; + const store = GarageApp.store; + const actions = GarageApp.actions; + const { categories, garage, nearby, session } = GarageApp.data; + + function q(query, values) { + const needle = String(query || "") + .trim() + .toLowerCase(); + if (!needle) { + return true; + } + + return values.some((value) => + String(value || "") + .toLowerCase() + .includes(needle), + ); + } + + function pct(value) { + return Math.max(0, Math.min(100, Math.round(Number(value || 0) * 100))); + } + + function categoryLabel(category) { + const match = categories.find( + (entry) => entry.id === String(category || "other").toLowerCase(), + ); + return match ? match.label : "Other"; + } + + function distanceLabel(value) { + return `${Math.round(Number(value || 0))} m`; + } + + function plateLabel(value) { + return String(value || "").trim() || "Untracked"; + } + + function statusLabel(vehicle) { + if (!vehicle) { + return "-"; + } + + if (vehicle.entryKind === "stored") { + return "Stored"; + } + + return vehicle.isEmpty === false ? "Crewed" : "Ready"; + } + + function normalizeHitPointLabel(value) { + return String(value || "") + .replace(/^Hit/i, "") + .replace(/([a-z])([A-Z])/g, "$1 $2") + .replace(/_/g, " ") + .trim(); + } + + function sameEntry(left, right) { + if (!left || !right) { + return false; + } + + return ( + String(left.entryKind || "") === String(right.entryKind || "") && + String(left.plate || "") === String(right.plate || "") && + String(left.netId || "") === String(right.netId || "") + ); + } + + function selectedEntry(state) { + if (state.selectedKind === "stored") { + return ( + (garage.vehicles || []).find( + (vehicle) => + String(vehicle.plate || "") === state.selectedId, + ) || null + ); + } + + if (state.selectedKind === "nearby") { + return ( + (nearby.vehicles || []).find( + (vehicle) => + String(vehicle.netId || "") === state.selectedId, + ) || null + ); + } + + return null; + } + + function visibleVehicles(vehicles, state) { + return (vehicles || []).filter((vehicle) => { + if ( + state.categoryFilter !== "all" && + String(vehicle.category || "").toLowerCase() !== + state.categoryFilter + ) { + return false; + } + + return q(state.searchQuery, [ + vehicle.displayName, + vehicle.classname, + vehicle.plate, + vehicle.netId, + vehicle.category, + ]); + }); + } + + function stat(label, value, tone = "") { + return h( + "div", + { + className: tone + ? `garage-stat-card is-${tone}` + : "garage-stat-card", + }, + h("span", { className: "garage-stat-label" }, label), + h("span", { className: "garage-stat-value" }, value), + ); + } + + function meter(label, percent, tone) { + return h( + "div", + { className: "garage-meter" }, + h( + "div", + { className: "garage-meter-label-row" }, + h("span", { className: "garage-meter-label" }, label), + h("span", { className: "garage-meter-value" }, `${percent}%`), + ), + h( + "div", + { className: "garage-meter-track" }, + h("span", { + className: `garage-meter-fill is-${tone}`, + style: { width: `${percent}%` }, + }), + ), + ); + } + + function vehicleItem(vehicle, currentSelection) { + const id = + vehicle.entryKind === "stored" + ? String(vehicle.plate || "") + : String(vehicle.netId || ""); + const isNearby = vehicle.entryKind === "nearby"; + + return h( + "button", + { + type: "button", + className: sameEntry(vehicle, currentSelection) + ? "garage-vehicle-item is-selected" + : "garage-vehicle-item", + onClick: () => actions.selectEntry(vehicle.entryKind, id), + }, + h( + "div", + { className: "garage-vehicle-item-head" }, + h( + "div", + { className: "garage-vehicle-copy" }, + h( + "span", + { className: "garage-vehicle-title" }, + vehicle.displayName || vehicle.classname || "Vehicle", + ), + h( + "span", + { className: "garage-vehicle-meta" }, + isNearby + ? `Nearby ${distanceLabel(vehicle.distance)}` + : `Plate ${plateLabel(vehicle.plate)}`, + ), + ), + h( + "span", + { + className: + isNearby && vehicle.isEmpty === false + ? "garage-badge is-warning" + : "garage-badge", + }, + isNearby + ? vehicle.isEmpty === false + ? "Crewed" + : "Empty" + : categoryLabel(vehicle.category), + ), + ), + h( + "div", + { className: "garage-inline-meters" }, + meter("Health", pct(vehicle.health), "health"), + meter("Fuel", pct(vehicle.fuel), "fuel"), + ), + ); + } + + function vehicleList(title, eyebrow, scrollId, vehicles, currentSelection) { + return h( + "section", + { className: "garage-card garage-list-card" }, + h( + "div", + { className: "garage-card-header" }, + h( + "div", + null, + h("span", { className: "garage-eyebrow" }, eyebrow), + h("h2", { className: "garage-section-title" }, title), + ), + h( + "span", + { className: "garage-pill" }, + `${vehicles.length} ${vehicles.length === 1 ? "Vehicle" : "Vehicles"}`, + ), + ), + h( + "div", + { + className: "garage-card-body garage-scroll-body", + "data-preserve-scroll-id": scrollId, + }, + vehicles.length > 0 + ? vehicles.map((vehicle) => + vehicleItem(vehicle, currentSelection), + ) + : h( + "div", + { className: "garage-empty-state" }, + h( + "h3", + { className: "garage-empty-title" }, + "No matching vehicles", + ), + h( + "p", + { className: "garage-empty-copy" }, + "Adjust the current search or category filter to view more records.", + ), + ), + ), + ); + } + + function hitPointRows(hitPoints) { + const rows = (Array.isArray(hitPoints) ? hitPoints : []) + .slice() + .sort( + (left, right) => + Number(right.value || 0) - Number(left.value || 0), + ) + .slice(0, 6) + .filter((row) => Number(row.value || 0) > 0); + + if (rows.length === 0) { + return h( + "div", + { className: "garage-empty-inline" }, + "No subsystem damage reported.", + ); + } + + return h( + "div", + { className: "garage-hitpoint-grid" }, + rows.map((row) => + h( + "div", + { className: "garage-hitpoint-row" }, + h( + "div", + { className: "garage-hitpoint-copy" }, + h( + "span", + { className: "garage-hitpoint-name" }, + normalizeHitPointLabel(row.name) || "Subsystem", + ), + row.selection + ? h( + "span", + { className: "garage-hitpoint-selection" }, + row.selection, + ) + : null, + ), + h( + "span", + { className: "garage-hitpoint-value" }, + `${Math.round(Number(row.value || 0) * 100)}%`, + ), + ), + ), + ); + } + + function detailPanel(currentSelection, state) { + if (!currentSelection) { + return h( + "section", + { className: "garage-card garage-detail-card" }, + h( + "div", + { className: "garage-card-header" }, + h( + "div", + null, + h("span", { className: "garage-eyebrow" }, "Selection"), + h( + "h2", + { className: "garage-section-title" }, + "Vehicle Detail", + ), + ), + ), + h( + "div", + { className: "garage-card-body garage-detail-empty" }, + h( + "h3", + { className: "garage-empty-title" }, + "Select a vehicle", + ), + h( + "p", + { className: "garage-empty-copy" }, + "Choose a stored record to retrieve or a nearby vehicle to store.", + ), + ), + ); + } + + const isStored = currentSelection.entryKind === "stored"; + const pendingAction = String(state.pendingAction || ""); + const isBusy = Boolean(pendingAction); + const canRetrieve = isStored && !session.spawnBlocked && !isBusy; + const canStore = + !isStored && currentSelection.isEmpty !== false && !isBusy; + const canRefuel = + !isStored && Number(currentSelection.fuel || 0) < 0.999 && !isBusy; + const canRepair = + !isStored && + Number(currentSelection.health || 0) < 0.999 && + !isBusy; + const canRearm = !isStored && !isBusy; + + return h( + "section", + { className: "garage-card garage-detail-card" }, + h( + "div", + { className: "garage-card-header" }, + h( + "div", + null, + h( + "span", + { className: "garage-eyebrow" }, + isStored ? "Stored Record" : "Nearby Vehicle", + ), + h( + "h2", + { className: "garage-section-title" }, + currentSelection.displayName || + currentSelection.classname || + "Vehicle", + ), + ), + h( + "span", + { + className: + currentSelection.entryKind === "nearby" && + currentSelection.isEmpty === false + ? "garage-badge is-warning" + : "garage-badge", + }, + isStored + ? `Plate ${plateLabel(currentSelection.plate)}` + : currentSelection.isEmpty === false + ? "Crewed" + : "Ready", + ), + ), + h( + "div", + { className: "garage-card-body garage-detail-body" }, + h( + "div", + { className: "garage-detail-grid" }, + h( + "div", + { className: "garage-detail-copy" }, + h( + "div", + { className: "garage-detail-meta" }, + stat( + "Category", + categoryLabel(currentSelection.category), + ), + stat( + "Status", + statusLabel(currentSelection), + currentSelection.entryKind === "nearby" && + currentSelection.isEmpty === false + ? "danger" + : "", + ), + stat( + isStored ? "Record" : "Distance", + isStored + ? plateLabel(currentSelection.plate) + : distanceLabel(currentSelection.distance), + isStored ? "" : "accent", + ), + ), + h( + "div", + { className: "garage-meter-stack" }, + meter( + "Health", + pct(currentSelection.health), + "health", + ), + meter("Fuel", pct(currentSelection.fuel), "fuel"), + ), + h( + "div", + { className: "garage-action-row" }, + isStored + ? h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-primary", + disabled: !canRetrieve, + onClick: () => + actions.requestRetrieveSelected(), + }, + pendingAction === "retrieve" + ? "Retrieving..." + : "Retrieve Vehicle", + ) + : h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-primary", + disabled: !canStore, + onClick: () => + actions.requestStoreSelected(), + }, + pendingAction === "store" + ? "Storing..." + : "Store Vehicle", + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary", + disabled: !canRefuel, + onClick: () => + actions.requestRefuelSelected(), + }, + pendingAction === "refuel" + ? "Refueling..." + : "Refuel", + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary", + disabled: !canRepair, + onClick: () => + actions.requestRepairSelected(), + }, + pendingAction === "repair" + ? "Repairing..." + : "Repair", + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary", + disabled: !canRearm, + onClick: () => + actions.requestRearmSelected(), + }, + pendingAction === "rearm" + ? "Rearming..." + : "Rearm", + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary garage-action-refresh", + disabled: isBusy, + onClick: () => actions.refreshGarage(), + }, + "Refresh", + ), + ), + h( + "p", + { className: "garage-detail-note" }, + isStored + ? session.spawnBlocked + ? "The garage spawn lane is currently blocked." + : "Retrieve this stored vehicle into the active spawn lane before refuel, rearm, or repair service." + : currentSelection.isEmpty === false + ? "Only empty nearby vehicles can be stored." + : "Store this nearby vehicle or request organization-billed refuel, rearm, and repair service.", + ), + ), + h( + "div", + { className: "garage-detail-subsystems" }, + h( + "div", + { className: "garage-subsystem-header" }, + h( + "span", + { className: "garage-eyebrow" }, + "Subsystems", + ), + h( + "span", + { className: "garage-detail-caption" }, + "Highest damage first", + ), + ), + hitPointRows(currentSelection.hitPoints), + ), + ), + ), + ); + } + + GarageApp.components = GarageApp.components || {}; + GarageApp.components.App = function App() { + const state = { + categoryFilter: store.getCategoryFilter(), + notice: store.getNotice(), + pendingAction: store.getPendingAction(), + searchQuery: store.getSearchQuery(), + selectedId: store.getSelectedId(), + selectedKind: store.getSelectedKind(), + }; + const currentSelection = selectedEntry(state); + const storedVehicles = visibleVehicles(garage.vehicles || [], state); + const nearbyVehicles = visibleVehicles(nearby.vehicles || [], state); + const searchLabel = state.searchQuery + ? `Search: ${state.searchQuery}` + : "Live"; + + return h( + "div", + { className: "garage-shell" }, + WindowTitleBar({ + kicker: "FORGE Logistics", + title: "Vehicle Garage", + onClose: () => actions.closeGarage(), + closeLabel: "Close garage interface", + }), + state.notice.text + ? h( + "div", + { className: "garage-toast-stack" }, + h( + "div", + { + className: + state.notice.type === "error" + ? "garage-toast is-error" + : "garage-toast is-success", + }, + state.notice.text, + ), + ) + : null, + h( + "div", + { className: "garage-layout" }, + h( + "aside", + { className: "garage-sidebar" }, + h( + "section", + { className: "garage-module" }, + h( + "div", + { className: "garage-module-header" }, + h( + "div", + null, + h( + "span", + { className: "garage-eyebrow" }, + "Search", + ), + h( + "h2", + { className: "garage-section-title" }, + "Vehicle Records", + ), + ), + h( + "span", + { className: "garage-pill" }, + searchLabel, + ), + ), + h( + "div", + { className: "garage-search-form" }, + h("input", { + id: "garage-search-input", + type: "text", + className: "garage-search-input", + placeholder: + "Search by name, plate, or category", + value: state.searchQuery, + }), + h( + "div", + { className: "garage-search-actions" }, + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-primary", + onClick: () => + actions.applySearchQuery( + document.getElementById( + "garage-search-input", + )?.value || "", + ), + }, + "Apply Search", + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary", + onClick: () => actions.clearSearch(), + }, + "Clear", + ), + ), + ), + ), + h( + "section", + { className: "garage-module" }, + h( + "div", + { className: "garage-module-header" }, + h( + "div", + null, + h( + "span", + { className: "garage-eyebrow" }, + "Filter", + ), + h( + "h2", + { className: "garage-section-title" }, + "Vehicle Categories", + ), + ), + ), + h( + "div", + { className: "garage-category-grid" }, + categories.map((category) => + h( + "button", + { + type: "button", + className: + state.categoryFilter === category.id + ? "garage-chip is-active" + : "garage-chip", + onClick: () => + actions.selectCategory(category.id), + }, + category.label, + ), + ), + ), + ), + h( + "section", + { className: "garage-module" }, + h( + "div", + { className: "garage-module-header" }, + h( + "div", + null, + h( + "span", + { className: "garage-eyebrow" }, + "Status", + ), + h( + "h2", + { className: "garage-section-title" }, + "Garage Summary", + ), + ), + h( + "button", + { + type: "button", + className: + "garage-btn garage-btn-secondary", + disabled: Boolean(state.pendingAction), + onClick: () => actions.refreshGarage(), + }, + "Refresh", + ), + ), + h( + "div", + { className: "garage-summary-grid" }, + stat( + "Stored", + `${session.capacityUsed}/${session.capacityMax}`, + ), + stat("Nearby", session.nearbyCount, "accent"), + stat( + "Spawn Lane", + session.spawnStatus, + session.spawnBlocked ? "danger" : "", + ), + ), + ), + ), + h( + "main", + { className: "garage-main" }, + h( + "section", + { className: "garage-panel" }, + h( + "div", + { className: "garage-panel-header" }, + h( + "div", + null, + h( + "span", + { className: "garage-eyebrow" }, + "Operations Bay", + ), + h( + "h1", + { className: "garage-title" }, + session.garageName || "Vehicle Garage", + ), + ), + h( + "span", + { className: "garage-pill" }, + `${session.capacityUsed}/${session.capacityMax} Stored`, + ), + ), + h( + "div", + { className: "garage-panel-intro" }, + h( + "p", + { className: "garage-copy" }, + "Retrieve stored vehicles into the active spawn lane or store nearby empty vehicles back into persistent ownership records.", + ), + ), + h( + "div", + { className: "garage-dashboard" }, + vehicleList( + "Stored Vehicles", + "Persistent Records", + "garage-stored-list", + storedVehicles, + currentSelection, + ), + vehicleList( + "Nearby Vehicles", + "Store Window", + "garage-nearby-list", + nearbyVehicles, + currentSelection, + ), + detailPanel(currentSelection, state), + ), + ), + ), + ), + h( + "footer", + { className: "garage-footer-bar" }, + h( + "div", + { className: "garage-footer" }, + h( + "div", + { className: "garage-footer-block" }, + h( + "span", + { className: "garage-footer-title" }, + "Storage Capacity", + ), + h( + "span", + { className: "garage-footer-copy" }, + `${session.capacityUsed} of ${session.capacityMax} vehicle slot(s) are currently occupied.`, + ), + ), + h( + "div", + { className: "garage-footer-block" }, + h( + "span", + { className: "garage-footer-title" }, + "Retrieval Window", + ), + h( + "span", + { className: "garage-footer-copy" }, + session.spawnBlocked + ? "Spawn lane is blocked. Clear the bay before retrieving another vehicle." + : "Spawn lane is clear. Stored vehicles can be retrieved immediately.", + ), + ), + h( + "div", + { className: "garage-footer-block" }, + h( + "span", + { className: "garage-footer-title" }, + "Store Rules", + ), + h( + "span", + { className: "garage-footer-copy" }, + "Only nearby empty vehicles can be stored. Nearby count updates from the live world state.", + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/garage/ui/src/data.js b/arma/client/addons/garage/ui/src/data.js new file mode 100644 index 0000000..deca479 --- /dev/null +++ b/arma/client/addons/garage/ui/src/data.js @@ -0,0 +1,57 @@ +(function () { + const GarageApp = (window.GarageApp = window.GarageApp || {}); + + const defaultSession = { + garageName: "Vehicle Garage", + capacityUsed: 0, + capacityMax: 5, + nearbyCount: 0, + spawnBlocked: false, + spawnStatus: "Ready", + }; + + const defaultGarage = { + vehicles: [], + }; + + const defaultNearby = { + vehicles: [], + }; + + function cloneValue(value) { + return JSON.parse(JSON.stringify(value)); + } + + function replaceObject(target, source) { + Object.keys(target).forEach((key) => delete target[key]); + Object.assign(target, cloneValue(source)); + } + + GarageApp.data = { + categories: [ + { id: "all", label: "All" }, + { id: "car", label: "Cars" }, + { id: "armor", label: "Armor" }, + { id: "air", label: "Air" }, + { id: "naval", label: "Naval" }, + { id: "other", label: "Other" }, + ], + session: Object.assign({}, defaultSession), + garage: Object.assign({}, defaultGarage), + nearby: Object.assign({}, defaultNearby), + applyHydratePayload(payload) { + replaceObject( + this.session, + Object.assign({}, defaultSession, payload?.session || {}), + ); + replaceObject( + this.garage, + Object.assign({}, defaultGarage, payload?.garage || {}), + ); + replaceObject( + this.nearby, + Object.assign({}, defaultNearby, payload?.nearby || {}), + ); + }, + }; +})(); diff --git a/arma/client/addons/garage/ui/src/registry/events.js b/arma/client/addons/garage/ui/src/registry/events.js new file mode 100644 index 0000000..266c44b --- /dev/null +++ b/arma/client/addons/garage/ui/src/registry/events.js @@ -0,0 +1,268 @@ +(function () { + const GarageApp = (window.GarageApp = window.GarageApp || {}); + const store = GarageApp.store; + + let noticeTimer = null; + + function getStoredVehicles() { + return Array.isArray(GarageApp.data?.garage?.vehicles) + ? GarageApp.data.garage.vehicles + : []; + } + + function getNearbyVehicles() { + return Array.isArray(GarageApp.data?.nearby?.vehicles) + ? GarageApp.data.nearby.vehicles + : []; + } + + function getSelectedEntry() { + const selection = store.getSelection(); + if (selection.kind === "stored") { + return ( + getStoredVehicles().find( + (vehicle) => String(vehicle.plate || "") === selection.id, + ) || null + ); + } + + if (selection.kind === "nearby") { + return ( + getNearbyVehicles().find( + (vehicle) => String(vehicle.netId || "") === selection.id, + ) || null + ); + } + + return null; + } + + function showNotice(type, text) { + store.setNotice({ type, text }); + + if (noticeTimer) { + clearTimeout(noticeTimer); + } + + noticeTimer = setTimeout(() => { + store.setNotice({ type: "", text: "" }); + noticeTimer = null; + }, 3200); + } + + function closeGarage() { + const bridge = GarageApp.bridge; + if (bridge && typeof bridge.requestClose === "function") { + const sent = bridge.requestClose(); + if (sent) { + return true; + } + } + + showNotice("error", "Garage bridge is unavailable."); + return false; + } + + function refreshGarage() { + const bridge = GarageApp.bridge; + if (bridge && typeof bridge.requestRefresh === "function") { + const sent = bridge.requestRefresh(); + if (sent) { + return true; + } + } + + showNotice("error", "Garage refresh bridge is unavailable."); + return false; + } + + function applySearchQuery(value) { + store.setSearchQuery(String(value || "").trim()); + } + + function clearSearch() { + store.setSearchQuery(""); + } + + function selectCategory(categoryId) { + store.setCategoryFilter(String(categoryId || "all").trim() || "all"); + } + + function selectEntry(kind, id) { + store.select(kind, id); + } + + function requestRetrieveSelected() { + const selectedEntry = getSelectedEntry(); + if (!selectedEntry || selectedEntry.entryKind !== "stored") { + showNotice("error", "Select a stored vehicle to retrieve."); + return false; + } + + if (GarageApp.data?.session?.spawnBlocked) { + showNotice("error", "The garage spawn area is blocked."); + return false; + } + + const bridge = GarageApp.bridge; + if (!bridge || typeof bridge.requestRetrieve !== "function") { + showNotice("error", "Garage retrieve bridge is unavailable."); + return false; + } + + store.startAction("retrieve"); + const sent = bridge.requestRetrieve({ + plate: selectedEntry.plate || "", + }); + + if (!sent) { + store.finishAction(); + showNotice("error", "Garage retrieve bridge is unavailable."); + return false; + } + + return true; + } + + function requestStoreSelected() { + const selectedEntry = getSelectedEntry(); + if (!selectedEntry || selectedEntry.entryKind !== "nearby") { + showNotice("error", "Select a nearby vehicle to store."); + return false; + } + + if (selectedEntry.isEmpty === false) { + showNotice( + "error", + "All crew must exit the vehicle before storing it.", + ); + return false; + } + + const bridge = GarageApp.bridge; + if (!bridge || typeof bridge.requestStore !== "function") { + showNotice("error", "Garage store bridge is unavailable."); + return false; + } + + store.startAction("store"); + const sent = bridge.requestStore({ + netId: selectedEntry.netId || "", + }); + + if (!sent) { + store.finishAction(); + showNotice("error", "Garage store bridge is unavailable."); + return false; + } + + return true; + } + + function requestRefuelSelected() { + const selectedEntry = getSelectedEntry(); + if (!selectedEntry || selectedEntry.entryKind !== "nearby") { + showNotice("error", "Select a nearby vehicle to refuel."); + return false; + } + + if (Number(selectedEntry.fuel || 0) >= 0.999) { + showNotice("error", "Vehicle fuel tank is already full."); + return false; + } + + const bridge = GarageApp.bridge; + if (!bridge || typeof bridge.requestRefuel !== "function") { + showNotice("error", "Garage refuel bridge is unavailable."); + return false; + } + + store.startAction("refuel"); + const sent = bridge.requestRefuel({ + netId: selectedEntry.netId || "", + }); + + if (!sent) { + store.finishAction(); + showNotice("error", "Garage refuel bridge is unavailable."); + return false; + } + + return true; + } + + function requestRepairSelected() { + const selectedEntry = getSelectedEntry(); + if (!selectedEntry || selectedEntry.entryKind !== "nearby") { + showNotice("error", "Select a nearby vehicle to repair."); + return false; + } + + if (Number(selectedEntry.health || 0) >= 0.999) { + showNotice("error", "Vehicle has no reported damage."); + return false; + } + + const bridge = GarageApp.bridge; + if (!bridge || typeof bridge.requestRepair !== "function") { + showNotice("error", "Garage repair bridge is unavailable."); + return false; + } + + store.startAction("repair"); + const sent = bridge.requestRepair({ + netId: selectedEntry.netId || "", + }); + + if (!sent) { + store.finishAction(); + showNotice("error", "Garage repair bridge is unavailable."); + return false; + } + + return true; + } + + function requestRearmSelected() { + const selectedEntry = getSelectedEntry(); + if (!selectedEntry || selectedEntry.entryKind !== "nearby") { + showNotice("error", "Select a nearby vehicle to rearm."); + return false; + } + + const bridge = GarageApp.bridge; + if (!bridge || typeof bridge.requestRearm !== "function") { + showNotice("error", "Garage rearm bridge is unavailable."); + return false; + } + + store.startAction("rearm"); + const sent = bridge.requestRearm({ + netId: selectedEntry.netId || "", + }); + + if (!sent) { + store.finishAction(); + showNotice("error", "Garage rearm bridge is unavailable."); + return false; + } + + return true; + } + + GarageApp.actions = { + showNotice, + closeGarage, + refreshGarage, + applySearchQuery, + clearSearch, + selectCategory, + selectEntry, + getSelectedEntry, + requestRearmSelected, + requestRefuelSelected, + requestRepairSelected, + requestRetrieveSelected, + requestStoreSelected, + }; +})(); diff --git a/arma/client/addons/garage/ui/src/registry/store.js b/arma/client/addons/garage/ui/src/registry/store.js new file mode 100644 index 0000000..776c5bd --- /dev/null +++ b/arma/client/addons/garage/ui/src/registry/store.js @@ -0,0 +1,113 @@ +(function () { + const GarageApp = (window.GarageApp = window.GarageApp || {}); + const { createSignal } = GarageApp.runtime; + + class GarageStore { + constructor() { + [this.getSelectedKind, this.setSelectedKind] = createSignal(""); + [this.getSelectedId, this.setSelectedId] = createSignal(""); + [this.getSearchQuery, this.setSearchQuery] = createSignal(""); + [this.getCategoryFilter, this.setCategoryFilter] = + createSignal("all"); + [this.getPendingAction, this.setPendingAction] = createSignal(""); + [this.getNotice, this.setNotice] = createSignal({ + type: "", + text: "", + }); + } + + getSelection() { + return { + id: this.getSelectedId(), + kind: this.getSelectedKind(), + }; + } + + clearSelection() { + this.setSelectedKind(""); + this.setSelectedId(""); + } + + select(kind, id) { + this.setSelectedKind(String(kind || "")); + this.setSelectedId(String(id || "")); + } + + startAction(action) { + this.setPendingAction(String(action || "")); + } + + finishAction() { + this.setPendingAction(""); + } + + matchesSelection(entry) { + if (!entry || typeof entry !== "object") { + return false; + } + + const selection = this.getSelection(); + if (!selection.kind || !selection.id) { + return false; + } + + if (selection.kind === "stored") { + return ( + entry.entryKind === "stored" && + String(entry.plate || "") === selection.id + ); + } + + if (selection.kind === "nearby") { + return ( + entry.entryKind === "nearby" && + String(entry.netId || "") === selection.id + ); + } + + return false; + } + + ensureSelection() { + const garageVehicles = Array.isArray( + GarageApp.data?.garage?.vehicles, + ) + ? GarageApp.data.garage.vehicles + : []; + const nearbyVehicles = Array.isArray( + GarageApp.data?.nearby?.vehicles, + ) + ? GarageApp.data.nearby.vehicles + : []; + const hasCurrentSelection = [ + ...garageVehicles, + ...nearbyVehicles, + ].some((entry) => this.matchesSelection(entry)); + + if (hasCurrentSelection) { + return; + } + + const firstStored = garageVehicles[0] || null; + if (firstStored) { + this.select("stored", firstStored.plate || ""); + return; + } + + const firstNearby = nearbyVehicles[0] || null; + if (firstNearby) { + this.select("nearby", firstNearby.netId || ""); + return; + } + + this.clearSelection(); + } + + hydrateFromPayload() { + this.finishAction(); + this.ensureSelection(); + } + } + + GarageApp.store = new GarageStore(); +})(); diff --git a/arma/client/addons/garage/ui/src/runtime.js b/arma/client/addons/garage/ui/src/runtime.js new file mode 100644 index 0000000..f6daa1d --- /dev/null +++ b/arma/client/addons/garage/ui/src/runtime.js @@ -0,0 +1,7 @@ +(function () { + const runtime = window.ForgeWebUI; + const GarageApp = (window.GarageApp = window.GarageApp || {}); + + GarageApp.runtime = runtime; + window.AppRuntime = runtime; +})(); diff --git a/arma/client/addons/garage/ui/src/styles.css b/arma/client/addons/garage/ui/src/styles.css new file mode 100644 index 0000000..fc0303f --- /dev/null +++ b/arma/client/addons/garage/ui/src/styles.css @@ -0,0 +1,583 @@ +:root { + --garage-shell-bg: #e4e3df; + --garage-surface: #f5f3ef; + --garage-surface-alt: #ece8e2; + --garage-border: rgba(74, 91, 110, 0.2); + --garage-border-strong: rgba(20, 46, 79, 0.18); + --garage-text-main: #1f2d3d; + --garage-text-muted: #6a7787; + --garage-text-subtle: #8792a0; + --garage-accent: #12365d; + --garage-accent-soft: #dbe7f3; + --garage-accent-line: rgba(18, 54, 93, 0.12); + --garage-warning: #8f5f26; +} + +* { + box-sizing: border-box; +} + +html, +body { + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; +} + +body { + font-family: "Segoe UI", "Trebuchet MS", sans-serif; + color: var(--garage-text-main); + background: var(--garage-shell-bg); +} + +button, +input { + font: inherit; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.72; +} + +:focus-visible { + outline: 2px solid rgb(18 54 93 / 0.35); + outline-offset: 2px; +} + +#app { + width: 100%; + height: 100%; +} + +.garage-shell { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + overflow: hidden; + background: var(--garage-shell-bg); +} + +.garage-layout { + flex: 1; + min-height: 0; + width: min(100%, 1613px); + margin: 0 auto; + padding: 1.25rem; + display: grid; + grid-template-columns: 308px minmax(0, 1fr); + gap: 1.25rem; +} + +.garage-sidebar, +.garage-main { + min-height: 0; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.garage-main { + overflow: hidden; +} + +.garage-module, +.garage-panel, +.garage-card { + background: linear-gradient( + 180deg, + var(--garage-surface) 0%, + var(--garage-surface-alt) 100% + ); + border: 1px solid var(--garage-border); + border-radius: 1.35rem; +} + +.garage-module, +.garage-card { + padding: 1rem; +} + +.garage-module { + display: grid; + gap: 0.85rem; + align-content: start; +} + +.garage-panel { + flex: 1 1 auto; + min-height: 0; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.garage-panel-header, +.garage-module-header, +.garage-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.garage-panel-header { + padding: 1rem 1rem 0; +} + +.garage-module-header { + align-items: flex-start; +} + +.garage-panel-intro { + padding: 0 1rem 1rem; + border-bottom: 1px solid var(--garage-accent-line); +} + +.garage-dashboard { + flex: 1; + min-height: 0; + padding: 1rem; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 1rem; + align-items: stretch; +} + +.garage-list-card, +.garage-detail-card { + min-height: 0; + display: flex; + flex-direction: column; +} + +.garage-detail-card { + grid-column: 1 / -1; +} + +.garage-scroll-body { + flex: 1; + min-height: clamp(10rem, 20vh, 16rem); + max-height: clamp(12rem, 25vh, 19rem); + overflow: auto; + display: grid; + gap: 0.8rem; + padding-right: 0.2rem; +} + +.garage-detail-body { + padding-top: 0.75rem; +} + +.garage-detail-grid { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(280px, 0.85fr); + gap: 1rem; +} + +.garage-detail-meta, +.garage-summary-grid, +.garage-search-actions, +.garage-category-grid, +.garage-action-row, +.garage-inline-meters, +.garage-hitpoint-grid, +.garage-footer { + display: grid; + gap: 0.75rem; +} + +.garage-detail-meta { + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-bottom: 0.7rem; +} + +.garage-summary-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.garage-summary-grid > :last-child { + grid-column: 1 / -1; +} + +.garage-search-actions, +.garage-action-row { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.55rem; +} + +.garage-category-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.65rem; +} + +.garage-action-refresh { + grid-column: 1 / -1; +} + +.garage-footer-bar { + width: 100%; + border-top: 1px solid rgb(18 54 93 / 0.1); +} + +.garage-footer { + width: min(100%, 1613px); + margin: 0 auto; + grid-template-columns: repeat(3, minmax(0, 1fr)); + padding: 0.95rem 1.25rem 1.15rem; +} + +.garage-meter-stack { + display: grid; + gap: 0.55rem; + margin-bottom: 0.7rem; +} + +.garage-eyebrow, +.garage-footer-title, +.garage-stat-label, +.garage-meter-label, +.garage-hitpoint-selection { + font-size: 0.68rem; + font-weight: 700; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--garage-text-subtle); +} + +.garage-title, +.garage-section-title { + margin: 0.16rem 0 0; + font-weight: 700; + letter-spacing: -0.02em; + color: var(--garage-text-main); +} + +.garage-title { + font-size: 1.1rem; +} + +.garage-section-title { + font-size: 1.05rem; +} + +.garage-copy, +.garage-detail-note, +.garage-empty-copy, +.garage-footer-copy, +.garage-vehicle-meta, +.garage-detail-caption { + margin: 0; + font-size: 0.92rem; + line-height: 1.48; + color: var(--garage-text-muted); +} + +.garage-pill, +.garage-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.48rem 0.8rem; + border-radius: 999px; + font-size: 0.74rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + background: var(--garage-accent-soft); + color: var(--garage-accent); +} + +.garage-badge.is-warning { + background: rgb(246 226 193 / 0.88); + color: var(--garage-warning); +} + +.garage-search-form { + display: grid; + gap: 0.75rem; +} + +.garage-search-input { + width: 100%; + height: 2.9rem; + padding: 0 0.95rem; + border-radius: 0.8rem; + border: 1px solid var(--garage-border); + background: rgb(255 255 255 / 0.75); + color: var(--garage-text-main); +} + +.garage-stat-card { + min-width: 0; + padding: 0.85rem; + border-radius: 0.85rem; + border: 1px solid var(--garage-border); + background: rgb(255 255 255 / 0.48); + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +.garage-stat-card.is-accent { + background: linear-gradient( + 180deg, + rgb(237 243 249 / 0.92) 0%, + rgb(223 232 242 / 0.72) 100% + ); +} + +.garage-stat-card.is-danger { + background: linear-gradient( + 180deg, + rgb(254 242 242 / 0.95) 0%, + rgb(252 225 225 / 0.82) 100% + ); + border-color: rgb(220 151 151 / 0.38); +} + +.garage-stat-value { + font-size: 1rem; + font-weight: 700; + color: var(--garage-text-main); + line-height: 1.3; + overflow-wrap: anywhere; + word-break: break-word; +} + +.garage-chip { + min-height: 2.6rem; + padding: 0.68rem 0.9rem; + border-radius: 0.85rem; + border: 1px solid var(--garage-border); + background: rgb(255 255 255 / 0.52); + color: var(--garage-text-muted); + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.garage-chip.is-active { + background: var(--garage-accent-soft); + color: var(--garage-accent); + border-color: rgb(18 54 93 / 0.2); +} + +.garage-vehicle-item { + width: 100%; + padding: 0.9rem; + border-radius: 0.95rem; + border: 1px solid var(--garage-border); + background: rgb(255 255 255 / 0.48); + color: inherit; + text-align: left; +} + +.garage-vehicle-item.is-selected { + border-color: rgb(18 54 93 / 0.24); + background: linear-gradient( + 180deg, + rgb(237 243 249 / 0.96) 0%, + rgb(223 232 242 / 0.74) 100% + ); + box-shadow: 0 16px 26px rgb(18 54 93 / 0.08); +} + +.garage-vehicle-item-head, +.garage-meter-label-row, +.garage-subsystem-header, +.garage-hitpoint-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +.garage-vehicle-copy, +.garage-hitpoint-copy, +.garage-footer-block { + min-width: 0; + display: flex; + flex-direction: column; + gap: 0.18rem; +} + +.garage-vehicle-title, +.garage-hitpoint-name, +.garage-hitpoint-value { + font-size: 0.9rem; + font-weight: 700; + color: var(--garage-text-main); +} + +.garage-meter { + display: grid; + gap: 0.32rem; +} + +.garage-meter-track { + width: 100%; + height: 0.45rem; + overflow: hidden; + border-radius: 999px; + background: rgb(18 54 93 / 0.08); +} + +.garage-meter-value { + font-size: 0.78rem; + font-weight: 700; + color: var(--garage-text-main); +} + +.garage-meter-fill { + display: block; + height: 100%; + border-radius: inherit; +} + +.garage-meter-fill.is-health { + background: linear-gradient(90deg, #2f7d5b 0%, #4eaa82 100%); +} + +.garage-meter-fill.is-fuel { + background: linear-gradient(90deg, #12365d 0%, #3c6792 100%); +} + +.garage-btn { + min-height: 2.5rem; + padding: 0.62rem 1rem; + border-radius: 0.8rem; + border: 1px solid var(--garage-border-strong); + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.garage-btn-primary { + background: rgb(255 255 255 / 0.68); + color: var(--garage-accent); +} + +.garage-btn-primary:hover { + background: rgb(219 231 243 / 0.88); +} + +.garage-btn-secondary { + background: rgb(255 255 255 / 0.42); + color: var(--garage-text-muted); +} + +.garage-btn-secondary:hover { + background: rgb(255 255 255 / 0.6); + color: var(--garage-text-main); +} + +.garage-hitpoint-row { + padding: 0.72rem 0.78rem; + border-radius: 0.85rem; + border: 1px solid var(--garage-border); + background: rgb(255 255 255 / 0.52); +} + +.garage-detail-empty, +.garage-empty-state { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + min-height: 100%; +} + +.garage-empty-title { + margin: 0 0 0.35rem; + font-size: 1rem; + font-weight: 700; + color: var(--garage-text-main); +} + +.garage-empty-inline { + padding: 0.9rem; + border-radius: 0.85rem; + border: 1px dashed var(--garage-border); + color: var(--garage-text-muted); + background: rgb(255 255 255 / 0.36); +} + +.garage-toast-stack { + position: fixed; + top: 1.2rem; + right: 1.5rem; + z-index: 10; + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +.garage-toast { + max-width: 24rem; + padding: 0.85rem 1rem; + border-radius: 0.9rem; + border: 1px solid var(--garage-border); + background: #fff; + box-shadow: 0 14px 28px rgb(16 34 56 / 0.14); + font-size: 0.92rem; +} + +.garage-toast.is-success { + background: #ecfdf5; + border-color: #bbf7d0; + color: #166534; +} + +.garage-toast.is-error { + background: #fef2f2; + border-color: #fecaca; + color: #991b1b; +} + +@media (max-width: 1440px) { + .garage-layout { + grid-template-columns: 288px minmax(0, 1fr); + } + + .garage-detail-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 1120px) { + .garage-layout { + grid-template-columns: 1fr; + overflow: auto; + } + + .garage-main, + .garage-sidebar { + min-height: auto; + } + + .garage-dashboard { + grid-template-columns: 1fr; + } + + .garage-detail-card { + grid-column: auto; + } + + .garage-scroll-body { + max-height: none; + min-height: 16rem; + } + + .garage-footer { + grid-template-columns: 1fr; + } +} diff --git a/arma/client/addons/garage/ui/ui.config.mjs b/arma/client/addons/garage/ui/ui.config.mjs new file mode 100644 index 0000000..bd3a713 --- /dev/null +++ b/arma/client/addons/garage/ui/ui.config.mjs @@ -0,0 +1,33 @@ +export default { + addonName: "garage", + title: "FORGE Vehicle Garage", + logLabel: "Garage UI", + outputDir: "_site", + jsBundles: [ + { + name: "Garage UI app", + output: "garage-ui.js", + sources: [ + "src/runtime.js", + "src/data.js", + "src/registry/store.js", + "src/bridge.js", + "src/registry/events.js", + "src/components/AppShell.js", + "src/bootstrap.js", + ], + }, + ], + cssBundles: [ + { + name: "Garage UI styles", + output: "garage-ui.css", + sources: ["src/styles.css"], + }, + ], + site: { + styles: ["garage-ui.css"], + commonScripts: ["forge-webui.js"], + scripts: ["garage-ui.js"], + }, +}; diff --git a/arma/client/addons/locker/$PBOPREFIX$ b/arma/client/addons/locker/$PBOPREFIX$ new file mode 100644 index 0000000..29dca0c --- /dev/null +++ b/arma/client/addons/locker/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\locker diff --git a/arma/client/addons/locker/CfgEventHandlers.hpp b/arma/client/addons/locker/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/locker/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/locker/README.md b/arma/client/addons/locker/README.md new file mode 100644 index 0000000..b5530cf --- /dev/null +++ b/arma/client/addons/locker/README.md @@ -0,0 +1,27 @@ +# Forge Client Locker + +## Overview +The locker addon manages client repositories for personal locker state and +virtual arsenal unlock state. It also integrates with ACE Arsenal display +behavior. + +## Dependencies +- `forge_client_main` +- ACE Arsenal +- server locker events from `forge_server_locker` + +## Main Components +- `fnc_initRepository.sqf` manages locker state, container open/close behavior, + and server sync requests. +- `fnc_initVARepository.sqf` manages virtual arsenal state. + +## Runtime Behavior +- Requests locker and virtual arsenal state after actor load. +- Syncs server responses into client repositories. +- Sends locker override data to the server when a managed locker container is + closed. +- Hides selected ACE Arsenal controls when the arsenal display opens. + +## Notes +The client repository is display/input state. The server locker addon and +extension own saved locker and virtual arsenal data. diff --git a/arma/client/addons/locker/XEH_PREP.hpp b/arma/client/addons/locker/XEH_PREP.hpp new file mode 100644 index 0000000..b979dfe --- /dev/null +++ b/arma/client/addons/locker/XEH_PREP.hpp @@ -0,0 +1,2 @@ +PREP(initRepository); +PREP(initVARepository); diff --git a/arma/client/addons/locker/XEH_postInit.sqf b/arma/client/addons/locker/XEH_postInit.sqf new file mode 100644 index 0000000..ba2da81 --- /dev/null +++ b/arma/client/addons/locker/XEH_postInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +["ace_arsenal_displayOpened", { + disableSerialization; + params ["_display"]; + _display displayAddEventHandler ["KeyDown", "_this select 3"]; + { (_display displayCtrl _x) ctrlShow false } forEach [1002, 1003, 1004, 1005, 1006]; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/locker/XEH_postInitClient.sqf b/arma/client/addons/locker/XEH_postInitClient.sqf new file mode 100644 index 0000000..a0a878d --- /dev/null +++ b/arma/client/addons/locker/XEH_postInitClient.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" + +if (isNil QGVAR(LockerRepository)) then { call FUNC(initRepository); }; +if (isNil QGVAR(VARepository)) then { call FUNC(initVARepository); }; + +[QGVAR(initLocker), { + GVAR(LockerRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitLocker), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(LockerRepository) call ["sync", [_data]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncLocker), { + params [["_data", createHashMap, [createHashMap, []]], ["_jip", false, [false]]]; + + GVAR(LockerRepository) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[QGVAR(initVA), { + GVAR(VARepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitVA), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(VARepository) call ["sync", [_data]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncVA), { + params [["_data", createHashMap, [createHashMap, []]], ["_jip", false, [false]]]; + + GVAR(VARepository) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[{ + EGVAR(actor,ActorRepository) get "isLoaded"; +}, { + [QGVAR(initLocker), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); + +[{ + GVAR(LockerRepository) get "isLoaded"; +}, { + [QGVAR(initVA), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/locker/XEH_preInit.sqf b/arma/client/addons/locker/XEH_preInit.sqf new file mode 100644 index 0000000..dbef1ae --- /dev/null +++ b/arma/client/addons/locker/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +// #include "initSettings.inc.sqf" +// #include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/locker/XEH_preInitClient.sqf b/arma/client/addons/locker/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/locker/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/locker/XEH_preStart.sqf b/arma/client/addons/locker/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/locker/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/locker/config.cpp b/arma/client/addons/locker/config.cpp new file mode 100644 index 0000000..595b77a --- /dev/null +++ b/arma/client/addons/locker/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/client/addons/locker/functions/fnc_initRepository.sqf b/arma/client/addons/locker/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..02a33af --- /dev/null +++ b/arma/client/addons/locker/functions/fnc_initRepository.sqf @@ -0,0 +1,301 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the locker repository for managing player locker items. + * + * Arguments: + * None + * + * Return Value: + * Locker repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_locker_fnc_initRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(LockerRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "LockerRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + _self set ["locker", createHashMap]; + }], + ["init", compileFinal { + private _uid = _self get "uid"; + + [SRPC(locker,requestInitLocker), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["Locker loaded for %1", name player]; + diag_log "[FORGE:Client:Locker] Locker Repository Initialized!"; + }], + ["get", compileFinal { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _locker = _self get "locker"; + _locker getOrDefault [_key, _default]; + }], + ["getCargo", compileFinal { + params [["_container", objNull, [objNull]], ["_locker", createHashMap, [createHashMap]]]; + + private _cargoData = [ + ["item", getItemCargo _container], + ["weapon", getWeaponCargo _container], + ["magazine", getMagazineCargo _container], + ["backpack", getBackpackCargo _container] + ]; + + { + _x params ["_category", "_data"]; + _data params ["_classes", "_counts"]; + + { + private _class = _x; + private _count = _counts select _forEachIndex; + + _locker set [_class, createHashMapFromArray [ + ["amount", _count], + ["classname", _class], + ["category", _category] + ]]; + } forEach _classes; + } forEach _cargoData; + + _locker + }], + ["getContainerItems", compileFinal { + params [["_container", objNull, [objNull]], ["_locker", createHashMap, [createHashMap]]]; + + private _allContainers = everyContainer _container; + { + _x params ["_containerClass", "_containerObj"]; + + private _cfgVehicles = configFile >> "CfgVehicles" >> _containerClass; + private _cfgWeapons = configFile >> "CfgWeapons" >> _containerClass; + private _itemInfoType = getNumber (_cfgWeapons >> "ItemInfo" >> "type"); + private _isBackpack = isClass _cfgVehicles; + private _isUniform = isClass _cfgWeapons && { _itemInfoType == TYPE_UNIFORM }; + private _isVest = isClass _cfgWeapons && { _itemInfoType == TYPE_VEST }; + + if (!_isBackpack && !_isVest && !_isUniform) then { continue; }; + + private _containerItems = getItemCargo _containerObj; + _containerItems params ["_classes", "_counts"]; + { + private _class = _x; + private _count = _counts select _forEachIndex; + private _existing = _locker getOrDefault [_class, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_class, createHashMapFromArray [ + ["amount", _existingCount + _count], + ["classname", _class], + ["category", "item"] + ]]; + } forEach _classes; + + private _containerMags = getMagazineCargo _containerObj; + _containerMags params ["_classes", "_counts"]; + { + private _class = _x; + private _count = _counts select _forEachIndex; + private _existing = _locker getOrDefault [_class, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_class, createHashMapFromArray [ + ["amount", _existingCount + _count], + ["classname", _class], + ["category", "magazine"] + ]]; + } forEach _classes; + + private _containerWeapons = getWeaponCargo _containerObj; + _containerWeapons params ["_classes", "_counts"]; + { + private _class = _x; + private _count = _counts select _forEachIndex; + private _existing = _locker getOrDefault [_class, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_class, createHashMapFromArray [ + ["amount", _existingCount + _count], + ["classname", _class], + ["category", "weapon"] + ]]; + } forEach _classes; + } forEach _allContainers; + + _locker + }], + ["getAttachments", compileFinal { + params [["_container", objNull, [objNull]], ["_locker", createHashMap, [createHashMap]]]; + + private _weaponItems = weaponsItemsCargo _container; + { + private _muzzle = _x param [1, ""]; + private _pointer = _x param [2, ""]; + private _optic = _x param [3, ""]; + private _primaryMag = _x param [4, ["", 0]]; + private _underbarrel = _x param [5, ""]; + private _bipod = _x param [6, ""]; + private _secondaryMag = _x param [7, ["", 0]]; + private _attachments = [_muzzle, _pointer, _optic, _underbarrel, _bipod] select { (_x isEqualType "") && { _x != "" } }; + { + private _existing = _locker getOrDefault [_x, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_x, createHashMapFromArray [ + ["amount", _existingCount + 1], + ["classname", _x], + ["category", "item"] + ]]; + } forEach _attachments; + + if (_primaryMag isNotEqualTo ["", 0]) then { + _primaryMag params ["_magClass", "_ammoCount"]; + if (_magClass != "") then { + private _existing = _locker getOrDefault [_magClass, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_magClass, createHashMapFromArray [ + ["amount", _existingCount + 1], + ["classname", _magClass], + ["category", "magazine"] + ]]; + }; + }; + + if (_secondaryMag isNotEqualTo ["", 0]) then { + _secondaryMag params ["_magClass", "_ammoCount"]; + if (_magClass != "") then { + private _existing = _locker getOrDefault [_magClass, createHashMap]; + private _existingCount = _existing getOrDefault ["amount", 0]; + + _locker set [_magClass, createHashMapFromArray [ + ["amount", _existingCount + 1], + ["classname", _magClass], + ["category", "magazine"] + ]]; + }; + }; + } forEach _weaponItems; + + _locker + }], + ["save", compileFinal { + private _uid = _self get "uid"; + [SRPC(locker,requestSaveLocker), [_uid]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["setEventHandlers", compileFinal { + params [["_locker", objNull, [objNull]]]; + + _locker addEventHandler ["ContainerOpened", { + params ["_container", "_unit"]; + + private _index = GVAR(LockerRepository) get "locker"; + + clearBackpackCargo _container; + clearItemCargo _container; + clearMagazineCargo _container; + clearWeaponCargo _container; + + { + private _amount = _y get "amount"; + private _category = _y get "category"; + private _className = _y get "classname"; + + switch (_category) do { + case "backpack": { _container addBackpackCargo [_className, _amount]; }; + case "item": { _container addItemCargo [_className, _amount]; }; + case "magazine": { _container addMagazineCargo [_className, _amount]; }; + case "weapon": { _container addWeaponCargo [_className, _amount]; }; + default { _container addItemCargo [_className, _amount]; }; + }; + } forEach _index; + + if (count _index > 25) then { + private _params = ["warning", "Over Capacity", "Locker has more then 25 items, please remove some items", 3000]; + GVAR(NotificationService) call ["create", _params]; + }; + }]; + + _locker addEventHandler ["ContainerClosed", { + params ["_container", "_unit"]; + + private _newLocker = createHashMap; + _newLocker = GVAR(LockerRepository) call ["getCargo", [_container, _newLocker]]; + _newLocker = GVAR(LockerRepository) call ["getContainerItems", [_container, _newLocker]]; + _newLocker = GVAR(LockerRepository) call ["getAttachments", [_container, _newLocker]]; + + private _uid = getPlayerUID _unit; + [SRPC(locker,requestOverrideLocker), [_uid, _newLocker]] call CFUNC(serverEvent); + GVAR(LockerRepository) set ["locker", _newLocker]; + + if (count _newLocker > 25) then { + private _params = ["warning", "Over Capacity", "Locker has more then 25 items, please remove some items", 3000]; + GVAR(NotificationService) call ["create", _params]; + }; + }]; + }], + ["setup", compileFinal { + private _lockers = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ("locker" in _x) && { _var isEqualType objNull } && { !isNull _var } && { _x isNotEqualTo "forge_locker_box" } + }; + + if (_lockers isEqualTo []) exitWith { diag_log "[FORGE:Client:Locker] No lockers found in missionNamespace."; }; + + { + private _globalLocker = missionNamespace getVariable _x; + private _pos = getPosASL _globalLocker; + private _vDir = vectorDir _globalLocker; + private _vUp = vectorUp _globalLocker; + private _lockerClass = typeOf _globalLocker; + if (_lockerClass isEqualTo "") then { + _lockerClass = "Box_NATO_Equip_F"; + }; + + private _localLocker = createVehicleLocal [_lockerClass, [0, 0, 0]]; + _localLocker setPosASL _pos; + _localLocker setVectorDirAndUp [_vDir, _vUp]; + _localLocker allowDamage false; + _localLocker setVariable ["isLocker", true]; + + clearBackpackCargo _localLocker; + clearItemCargo _localLocker; + clearMagazineCargo _localLocker; + clearWeaponCargo _localLocker; + + private _localVarName = format ["FORGE_Locker_Local_%1", _forEachIndex]; + _localLocker setVehicleVarName _localVarName; + missionNamespace setVariable [_localVarName, _localLocker]; + + _self call ["setEventHandlers", [_localLocker]]; + } forEach _lockers; + }], + ["sync", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _isLoaded = _self get "isLoaded"; + private _locker = _self get "locker"; + + { _locker set [_x, _y]; } forEach _data; + _self set ["locker", _locker]; + + if !(_isLoaded) then { _self set ["isLoaded", true]; _self call ["setup", []]; }; + diag_log "[FORGE:Client:Locker] Sync completed"; + }] +]; + +GVAR(LockerRepository) = createHashMapObject [GVAR(LockerRepositoryBaseClass)]; +GVAR(LockerRepository) diff --git a/arma/client/addons/locker/functions/fnc_initVARepository.sqf b/arma/client/addons/locker/functions/fnc_initVARepository.sqf new file mode 100644 index 0000000..d4aa4b9 --- /dev/null +++ b/arma/client/addons/locker/functions/fnc_initVARepository.sqf @@ -0,0 +1,94 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initVARepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the virtual arsenal repository for managing player arsenal unlocks. + * + * Arguments: + * None + * + * Return Value: + * Virtual arsenal repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_locker_fnc_initVARepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(VARepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "VARepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["vArsenal", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + private _uid = _self get "uid"; + FORGE_Locker_Box = "ReammoBox_F" createVehicleLocal [0, 0, -999]; + [SRPC(locker,requestInitVA), [_uid]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["VArsenal loaded for %1", name player]; + diag_log "[FORGE:Client:VArsenal] Repository Initialized!"; + }], + ["save", compileFinal { + private _uid = _self get "uid"; + [SRPC(locker,requestSaveVA), [_uid]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["sync", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _vArsenal = _self get "vArsenal"; + private _isLoaded = _self get "isLoaded"; + + { + _vArsenal set [_x, _y]; + + switch (_x) do { + case "items": { _self call ["applyItems", []]; }; + case "weapons": { _self call ["applyWeapons", []]; }; + case "magazines": { _self call ["applyMagazines", []]; }; + case "backpacks": { _self call ["applyBackpacks", []]; }; + default {}; + }; + } forEach _data; + + _self set ["vArsenal", _vArsenal]; + + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + diag_log "[FORGE:Client:VArsenal] Sync completed"; + }], + ["get", compileFinal { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _vArsenal = _self get "vArsenal"; + _vArsenal getOrDefault [_key, _default]; + }], + ["applyItems", compileFinal { + private _items = _self call ["get", ["items", []]]; + [FORGE_Locker_Box, _items] call AFUNC(arsenal,addVirtualItems); + }], + ["applyWeapons", compileFinal { + private _weapons = _self call ["get", ["weapons", []]]; + [FORGE_Locker_Box, _weapons] call AFUNC(arsenal,addVirtualItems); + }], + ["applyMagazines", compileFinal { + private _magazines = _self call ["get", ["magazines", []]]; + [FORGE_Locker_Box, _magazines] call AFUNC(arsenal,addVirtualItems); + }], + ["applyBackpacks", compileFinal { + private _backpacks = _self call ["get", ["backpacks", []]]; + [FORGE_Locker_Box, _backpacks] call AFUNC(arsenal,addVirtualItems); + }] +]; + +GVAR(VARepository) = createHashMapObject [GVAR(VARepositoryBaseClass)]; +GVAR(VARepository) diff --git a/arma/client/addons/locker/script_component.hpp b/arma/client/addons/locker/script_component.hpp new file mode 100644 index 0000000..3ed1fbb --- /dev/null +++ b/arma/client/addons/locker/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT locker +#define COMPONENT_BEAUTIFIED Locker +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/locker/stringtable.xml b/arma/client/addons/locker/stringtable.xml new file mode 100644 index 0000000..d6824eb --- /dev/null +++ b/arma/client/addons/locker/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Locker + + + diff --git a/arma/client/addons/main/$PBOPREFIX$ b/arma/client/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..1d61036 --- /dev/null +++ b/arma/client/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\main diff --git a/arma/client/addons/main/CfgSettings.hpp b/arma/client/addons/main/CfgSettings.hpp new file mode 100644 index 0000000..05d0b0b --- /dev/null +++ b/arma/client/addons/main/CfgSettings.hpp @@ -0,0 +1,13 @@ +class CfgSettings { + class CBA { + class Versioning { + class PREFIX { + main_addon = QUOTE(ADDON); + + class dependencies { + CBA[] = {"cba_main", REQUIRED_CBA_VERSION, "true"}; + }; + }; + }; + }; +}; diff --git a/arma/client/addons/main/README.md b/arma/client/addons/main/README.md new file mode 100644 index 0000000..52bdcff --- /dev/null +++ b/arma/client/addons/main/README.md @@ -0,0 +1,18 @@ +# Forge Client Main + +## Overview +The main addon provides shared mod metadata, macros, settings, and compile +infrastructure for Forge client addons. + +## Dependencies +- `cba_main` + +## Main Components +- `script_macros.hpp` defines shared function, RPC, path, variable, and compile + macros. +- `script_mod.hpp` and `script_version.hpp` define mod identity and version. +- `CfgSettings.hpp` contains client-side CBA settings. + +## Notes +Feature logic should live in the owning addon. Main is the shared foundation for +configuration, macros, and mod-level metadata. diff --git a/arma/client/addons/main/config.cpp b/arma/client/addons/main/config.cpp new file mode 100644 index 0000000..2b42b1e --- /dev/null +++ b/arma/client/addons/main/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = CSTRING(url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "cba_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgSettings.hpp" diff --git a/arma/client/addons/main/data/hpp/defineDIKCodes.hpp b/arma/client/addons/main/data/hpp/defineDIKCodes.hpp new file mode 100644 index 0000000..6eca2b4 --- /dev/null +++ b/arma/client/addons/main/data/hpp/defineDIKCodes.hpp @@ -0,0 +1,33 @@ +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +#define DIK_MOUSELEFT 0xF0 +#define DIK_MOUSERIGHT 0xF1 +#define DIK_MOUSEMIDDLE 0xF2 +#define DIK_MOUSE4 0xF3 +#define DIK_MOUSE5 0xF4 +#define DIK_MOUSE6 0xF5 +#define DIK_MOUSE7 0xF6 +#define DIK_MOUSE8 0xF7 +#define DIK_MOUSEUP 0xF8 +#define DIK_MOUSEDOWN 0xF9 + +#define DIK_USERCUSTOM1 0xFA +#define DIK_USERCUSTOM2 0xFB +#define DIK_USERCUSTOM3 0xFC +#define DIK_USERCUSTOM4 0xFD +#define DIK_USERCUSTOM5 0xFE +#define DIK_USERCUSTOM6 0xFF +#define DIK_USERCUSTOM7 0x100 +#define DIK_USERCUSTOM8 0x101 +#define DIK_USERCUSTOM9 0x102 +#define DIK_USERCUSTOM10 0x103 +#define DIK_USERCUSTOM11 0x104 +#define DIK_USERCUSTOM12 0x105 +#define DIK_USERCUSTOM13 0x106 +#define DIK_USERCUSTOM14 0x107 +#define DIK_USERCUSTOM15 0x108 +#define DIK_USERCUSTOM16 0x109 +#define DIK_USERCUSTOM17 0x10A +#define DIK_USERCUSTOM18 0x10B +#define DIK_USERCUSTOM19 0x10C +#define DIK_USERCUSTOM20 0x10D diff --git a/arma/client/addons/main/data/ui/placeholder.txt b/arma/client/addons/main/data/ui/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/addons/main/data/ui/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/client/addons/main/script_component.hpp b/arma/client/addons/main/script_component.hpp new file mode 100644 index 0000000..32d193a --- /dev/null +++ b/arma/client/addons/main/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT main +#define COMPONENT_BEAUTIFIED Main +#include "script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "script_macros.hpp" diff --git a/arma/client/addons/main/script_macros.hpp b/arma/client/addons/main/script_macros.hpp new file mode 100644 index 0000000..6727a66 --- /dev/null +++ b/arma/client/addons/main/script_macros.hpp @@ -0,0 +1,152 @@ +// Global toggles for caching/logging +// #define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +#define DEBUG_SYNCHRONOUS + +#include "\x\cba\addons\main\script_macros_common.hpp" +#include "\x\cba\addons\xeh\script_xeh.hpp" + +// Functions +#define AFUNC(var1,var2) TRIPLES(DOUBLES(ace,var1),fnc,var2) +#define BFUNC(var1) TRIPLES(BIS,fnc,var1) +#define CFUNC(var1) TRIPLES(CBA,fnc,var1) + +// Remote Procedure Calls +#define CRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_client,var1),var2)) +#define SRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_server,var1),var2)) +#define SREG(var1,var2) DOUBLES(DOUBLES(forge_server,var1),var2) + +#define CLASS(var1) DOUBLES(PREFIX,var1) +#define QCLASS(var1) QUOTE(DOUBLES(PREFIX,var1)) + +#define QQUOTE(var1) QUOTE(QUOTE(var1)) + +// QPATHTOF but without a leading slash +#define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\var1 +#define QPATHTOF2(var1) QUOTE(PATHTOF2(var1)) + +#ifdef SUBCOMPONENT + #define SUBADDON DOUBLES(ADDON,SUBCOMPONENT) + + // Update PATHTO macros to point to subaddon instead + #undef PATHTO + #define PATHTO(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF + #define PATHTOF(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 + #undef PATHTO2 + #define PATHTO2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF2 + #define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 +#endif + +#undef PREP +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {call FUNC(x)} + #define PREP(fncName) FUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) + #define PREP_RECOMPILE_START if (isNil "forge_client_fnc_recompile") then {forge_client_recompiles = []; forge_client_fnc_recompile = {{call _x} forEach forge_client_recompiles;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; forge_client_recompiles pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + +#define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] +#define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] +#define SETPVAR_SYS(var1,var2) setVariable [ARR_3(QUOTE(var1),var2,true)] + +#undef GETVAR +#define GETVAR(var1,var2,var3) (var1 GETVAR_SYS(var2,var3)) +#define GETMVAR(var1,var2) (missionNamespace GETVAR_SYS(var1,var2)) +#define GETUVAR(var1,var2) (uiNamespace GETVAR_SYS(var1,var2)) +#define GETPRVAR(var1,var2) (profileNamespace GETVAR_SYS(var1,var2)) +#define GETPAVAR(var1,var2) (parsingNamespace GETVAR_SYS(var1,var2)) + +#undef SETVAR +#define SETVAR(var1,var2,var3) var1 SETVAR_SYS(var2,var3) +#define SETPVAR(var1,var2,var3) var1 SETPVAR_SYS(var2,var3) +#define SETMVAR(var1,var2) missionNamespace SETVAR_SYS(var1,var2) +#define SETUVAR(var1,var2) uiNamespace SETVAR_SYS(var1,var2) +#define SETPRVAR(var1,var2) profileNamespace SETVAR_SYS(var1,var2) +#define SETPAVAR(var1,var2) parsingNamespace SETVAR_SYS(var1,var2) + +#define GETGVAR(var1,var2) GETMVAR(GVAR(var1),var2) +#define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) + +#define WEAP_XX(WEAP, COUNT) class DOUBLES(_xx,WEAP) { \ + weapon = QUOTE(WEAP); \ + count = COUNT; \ +} + +#define MAG_XX(MAG, COUNT) class DOUBLES(_xx,MAG) { \ + magazine = QUOTE(MAG); \ + count = COUNT; \ +} + +#define ITEM_XX(ITEM, COUNT) class DOUBLES(_xx,ITEM) { \ + name = QUOTE(ITEM); \ + count = COUNT; \ +} + +// ACE Cargo +#define CARGO_XX(ITEM, COUNT) class ITEM { \ + type = QUOTE(ITEM); \ + amount = COUNT; \ +} + +#define MAG_CSW(var1,var2) class DOUBLES(var1,csw): var1 { \ + scope = var2; \ + type = TYPE_MAGAZINE_PRIMARY_AND_THROW; \ +} + +// Debug textures, mainly for testing hiddenSelections +#define DBUG_TEX_RED "#(rgb,8,8,3)color(1,0,0,1)" +#define DBUG_TEX_GRN "#(rgb,8,8,3)color(0,1,0,1)" +#define DBUG_TEX_BLU "#(rgb,8,8,3)color(0,0,1,1)" +#define DBUG_TEX_PUR "#(rgb,8,8,3)color(1,0,1,1)" +#define DBUG_TEX_YEL "#(rgb,8,8,3)color(1,1,0,1)" + +// Statements and conditions +#define CLAMP(var1,lower,upper) (lower max (var1 min upper)) + +// Weapon types +#define TYPE_WEAPON_PRIMARY 1 +#define TYPE_WEAPON_HANDGUN 2 +#define TYPE_WEAPON_SECONDARY 4 +// Magazine types +#define TYPE_MAGAZINE_HANDGUN_AND_GL 16 // mainly +#define TYPE_MAGAZINE_PRIMARY_AND_THROW 256 +#define TYPE_MAGAZINE_SECONDARY_AND_PUT 512 // mainly +#define TYPE_MAGAZINE_MISSILE 768 +// More types +#define TYPE_BINOCULAR_AND_NVG 4096 +#define TYPE_WEAPON_VEHICLE 65536 +#define TYPE_ITEM 131072 +// Item types +#define TYPE_DEFAULT 0 +#define TYPE_MUZZLE 101 +#define TYPE_OPTICS 201 +#define TYPE_FLASHLIGHT 301 +#define TYPE_BIPOD 302 +#define TYPE_FIRST_AID_KIT 401 +#define TYPE_FINS 501 // not implemented +#define TYPE_BREATHING_BOMB 601 // not implemented +#define TYPE_NVG 602 +#define TYPE_GOGGLE 603 +#define TYPE_SCUBA 604 // not implemented +#define TYPE_HEADGEAR 605 +#define TYPE_FACTOR 607 +#define TYPE_MAP 608 +#define TYPE_COMPASS 609 +#define TYPE_WATCH 610 +#define TYPE_RADIO 611 +#define TYPE_GPS 612 +#define TYPE_HMD 616 +#define TYPE_BINOCULAR 617 +#define TYPE_MEDIKIT 619 +#define TYPE_TOOLKIT 620 +#define TYPE_UAV_TERMINAL 621 +#define TYPE_VEST 701 +#define TYPE_UNIFORM 801 +#define TYPE_BACKPACK 901 diff --git a/arma/client/addons/main/script_mod.hpp b/arma/client/addons/main/script_mod.hpp new file mode 100644 index 0000000..d1337cc --- /dev/null +++ b/arma/client/addons/main/script_mod.hpp @@ -0,0 +1,26 @@ +#define MAINPREFIX forge +#define PREFIX forge_client +#define MOD_NAME forge-client +#define AUTHOR "J.Schmidt" + +#define REQUIRED_VERSION 2.20 +#define REQUIRED_CBA_VERSION {3,18,4} +#define REQUIRED_ACE_VERSION {3,20,0} + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCH.BUILD +#define VERSION_AR MAJOR,MINOR,PATCH,BUILD + +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif +#ifdef SUBCOMPONENT + #ifndef SUBCOMPONENT_BEAUTIFIED + #define SUBCOMPONENT_BEAUTIFIED SUBCOMPONENT + #endif + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED (SUBCOMPONENT_BEAUTIFIED)) +#else + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED) +#endif diff --git a/arma/client/addons/main/script_version.hpp b/arma/client/addons/main/script_version.hpp new file mode 100644 index 0000000..3e6aaab --- /dev/null +++ b/arma/client/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 1 +#define MINOR 0 +#define PATCH 0 +#define BUILD 0 diff --git a/arma/client/addons/main/stringtable.xml b/arma/client/addons/main/stringtable.xml new file mode 100644 index 0000000..99b18ab --- /dev/null +++ b/arma/client/addons/main/stringtable.xml @@ -0,0 +1,24 @@ + + + + + Main + + + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + + + diff --git a/arma/client/addons/notifications/$PBOPREFIX$ b/arma/client/addons/notifications/$PBOPREFIX$ new file mode 100644 index 0000000..6f3cabe --- /dev/null +++ b/arma/client/addons/notifications/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\notifications diff --git a/arma/client/addons/notifications/CfgEventHandlers.hpp b/arma/client/addons/notifications/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/notifications/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/notifications/CfgSounds.hpp b/arma/client/addons/notifications/CfgSounds.hpp new file mode 100644 index 0000000..ae86ed6 --- /dev/null +++ b/arma/client/addons/notifications/CfgSounds.hpp @@ -0,0 +1,9 @@ +class CfgSounds { + sounds[] += {QGVAR(notify)}; + + class GVAR(notify) { + name = QGVAR(notify); + sound[] = {QPATHTOF2(sounds\notify.ogg), 1, 1}; + titles[] = {}; + }; +}; diff --git a/arma/client/addons/notifications/README.md b/arma/client/addons/notifications/README.md new file mode 100644 index 0000000..5c3fe16 --- /dev/null +++ b/arma/client/addons/notifications/README.md @@ -0,0 +1,27 @@ +# Forge Client Notifications + +## Overview +The notifications addon owns the client notification HUD, notification sound, +and local notification service used by other Forge client and server modules. + +## Dependencies +- `forge_client_main` + +## Main Components +- `fnc_initService.sqf` manages queued and visible notifications. +- `fnc_openUI.sqf` opens the notification HUD display. +- `fnc_handleUIEvents.sqf` handles browser/HUD events. +- `CfgSounds.hpp` defines the notification sound. + +## Event Surface +`forge_client_notifications_recieveNotification` accepts: + +```sqf +[_type, _title, _content, _duration] +``` + +The event plays the configured sound and adds the notification to the HUD. + +## Runtime Notes +The HUD opens after the virtual arsenal repository is loaded. Other addons +should use this notification event instead of creating their own transient UI. diff --git a/arma/client/addons/notifications/XEH_PREP.hpp b/arma/client/addons/notifications/XEH_PREP.hpp new file mode 100644 index 0000000..e3b9ad1 --- /dev/null +++ b/arma/client/addons/notifications/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initService); +PREP(openUI); diff --git a/arma/client/addons/notifications/XEH_postInit.sqf b/arma/client/addons/notifications/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/notifications/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/notifications/XEH_postInitClient.sqf b/arma/client/addons/notifications/XEH_postInitClient.sqf new file mode 100644 index 0000000..6504295 --- /dev/null +++ b/arma/client/addons/notifications/XEH_postInitClient.sqf @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +[{ + EGVAR(locker,VARepository) get "isLoaded"; +}, { + ("NotificationHudLayer" call BFUNC(rscLayer)) cutRsc ["RscNotifications", "PLAIN"]; + call FUNC(openUI); + if (isNil QGVAR(NotificationService)) then { call FUNC(initService); }; +}] call CFUNC(waitUntilAndExecute); + +[QGVAR(recieveNotification), { + params [["_type", "", [""]], ["_title", "", [""]], ["_content", "", [""]], ["_duration", 4000, [4000]]]; + + playSound QGVAR(notify); + GVAR(NotificationService) call ["create", [_type, _title, _content, _duration]]; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/notifications/XEH_preInit.sqf b/arma/client/addons/notifications/XEH_preInit.sqf new file mode 100644 index 0000000..dbef1ae --- /dev/null +++ b/arma/client/addons/notifications/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +// #include "initSettings.inc.sqf" +// #include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/notifications/XEH_preInitClient.sqf b/arma/client/addons/notifications/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/notifications/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/notifications/XEH_preStart.sqf b/arma/client/addons/notifications/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/notifications/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/notifications/config.cpp b/arma/client/addons/notifications/config.cpp new file mode 100644 index 0000000..e458924 --- /dev/null +++ b/arma/client/addons/notifications/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgSounds.hpp" +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscNotifications.hpp" diff --git a/arma/client/addons/notifications/functions/fnc_handleUIEvents.sqf b/arma/client/addons/notifications/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..287842c --- /dev/null +++ b/arma/client/addons/notifications/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-01-30 + * Public: No + * + * Description: + * Handles the UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_notifications_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Notifications] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "notifications::ready": { + GVAR(NotificationService) call ["init", []]; + }; + default { hint format ["[FORGE:Client:Notifications] Unhandled event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/notifications/functions/fnc_initService.sqf b/arma/client/addons/notifications/functions/fnc_initService.sqf new file mode 100644 index 0000000..cfdb3ce --- /dev/null +++ b/arma/client/addons/notifications/functions/fnc_initService.sqf @@ -0,0 +1,56 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initService.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the notification service for client notification display. + * + * Arguments: + * None + * + * Return Value: + * Notification service object [HASHMAP OBJECT] + * + * Example: + * call forge_client_notifications_fnc_initService; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(NotificationService) = createHashMapObject [[ + ["#type", "INotificationService"], + ["#create", { + private _display = uiNamespace getVariable ["RscNotifications", nil]; + private _control = _display displayCtrl 1004; + + _self set ["control", _control]; + _self set ["isLoaded", false]; + }], + ["init", { + private _params = ["success", "System Ready", "Notification system handshake complete!", 3000]; + + _self call ["create", _params]; + _self set ["isLoaded", true]; + + systemChat format ["Notifications loaded for %1", name player]; + diag_log "[FORGE:Client:Notifications] Notification Service Initialized!"; + }], + ["create", { + params [["_type", "", ["info"]], ["_title", "", [""]], ["_content", "", [""]], ["_duration", 4000]]; + + private _control = _self get "control"; + private _message = createHashMap; + + _message set ["type", _type]; + _message set ["title", _title]; + _message set ["message", _content]; + _message set ["duration", _duration]; + + _control ctrlWebBrowserAction ["ExecJS", format ["window.dispatchEvent(new CustomEvent('forge:notify', { detail: %1 }))", (toJSON _message)]]; + }] +]]; + +GVAR(NotificationService) diff --git a/arma/client/addons/notifications/functions/fnc_openUI.sqf b/arma/client/addons/notifications/functions/fnc_openUI.sqf new file mode 100644 index 0000000..f3af405 --- /dev/null +++ b/arma/client/addons/notifications/functions/fnc_openUI.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-01-30 + * Public: No + * + * Description: + * Opens the notification interface. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_notifications_fnc_openUI; + */ + +private _display = uiNamespace getVariable ["RscNotifications", nil]; +private _ctrl = (_display displayCtrl 1004); + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; +// _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; + +true; diff --git a/arma/client/addons/notifications/initKeybinds.inc.sqf b/arma/client/addons/notifications/initKeybinds.inc.sqf new file mode 100644 index 0000000..2922c52 --- /dev/null +++ b/arma/client/addons/notifications/initKeybinds.inc.sqf @@ -0,0 +1 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" diff --git a/arma/client/addons/notifications/initSettings.inc.sqf b/arma/client/addons/notifications/initSettings.inc.sqf new file mode 100644 index 0000000..416ff52 --- /dev/null +++ b/arma/client/addons/notifications/initSettings.inc.sqf @@ -0,0 +1 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required diff --git a/arma/client/addons/notifications/script_component.hpp b/arma/client/addons/notifications/script_component.hpp new file mode 100644 index 0000000..b05c9b3 --- /dev/null +++ b/arma/client/addons/notifications/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT notifications +#define COMPONENT_BEAUTIFIED Notifications +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/notifications/sounds/notify.ogg b/arma/client/addons/notifications/sounds/notify.ogg new file mode 100644 index 0000000..06e8125 Binary files /dev/null and b/arma/client/addons/notifications/sounds/notify.ogg differ diff --git a/arma/client/addons/notifications/stringtable.xml b/arma/client/addons/notifications/stringtable.xml new file mode 100644 index 0000000..4fef435 --- /dev/null +++ b/arma/client/addons/notifications/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Notifications + + + diff --git a/arma/client/addons/notifications/ui/RscCommon.hpp b/arma/client/addons/notifications/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/notifications/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/notifications/ui/RscNotifications.hpp b/arma/client/addons/notifications/ui/RscNotifications.hpp new file mode 100644 index 0000000..5824951 --- /dev/null +++ b/arma/client/addons/notifications/ui/RscNotifications.hpp @@ -0,0 +1,22 @@ +class RscTitles { + class RscNotifications { + idd = 1003; + fadein = 0; + fadeout = 0; + duration = 1e+011; + onLoad = "uinamespace setVariable ['RscNotifications', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscNotifications', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1004; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW"; + h = "safeZoneH"; + }; + }; + }; +}; diff --git a/arma/client/addons/notifications/ui/_site/index.html b/arma/client/addons/notifications/ui/_site/index.html new file mode 100644 index 0000000..d1d769a --- /dev/null +++ b/arma/client/addons/notifications/ui/_site/index.html @@ -0,0 +1,44 @@ + + + + + + Forge - Notification System + + + + + + +
+
+
+ + + diff --git a/arma/client/addons/notifications/ui/_site/script.js b/arma/client/addons/notifications/ui/_site/script.js new file mode 100644 index 0000000..7bb10f2 --- /dev/null +++ b/arma/client/addons/notifications/ui/_site/script.js @@ -0,0 +1,388 @@ +//============================================================================= +// #region ACTIONS +//============================================================================= + +const NotificationActionTypes = { + ADD_NOTIFICATION: "ADD_NOTIFICATION", + REMOVE_NOTIFICATION: "REMOVE_NOTIFICATION", + CLEAR_NOTIFICATIONS: "CLEAR_NOTIFICATIONS", + UPDATE_NOTIFICATION: "UPDATE_NOTIFICATION", +}; + +const notificationActions = { + addNotification: (notification) => ({ + type: NotificationActionTypes.ADD_NOTIFICATION, + payload: { + id: Date.now() + Math.random(), + timestamp: Date.now(), + type: "info", + title: "Notification", + message: "Default message", + duration: 0, + status: "showing", + ...notification, + }, + }), + removeNotification: (id) => ({ + type: NotificationActionTypes.REMOVE_NOTIFICATION, + payload: { id }, + }), + clearNotifications: () => ({ + type: NotificationActionTypes.CLEAR_NOTIFICATIONS, + }), + updateNotification: (id, updates) => ({ + type: NotificationActionTypes.UPDATE_NOTIFICATION, + payload: { id, updates }, + }), +}; + +//============================================================================= +// #region REDUCER +//============================================================================= + +const notificationInitialState = { + notifications: [], + maxNotifications: 3, +}; + +function notificationReducer(state = notificationInitialState, action = {}) { + switch (action.type) { + case NotificationActionTypes.ADD_NOTIFICATION: { + if (!action.payload) return state; + let newNotifications = [...state.notifications]; + if (newNotifications.length >= state.maxNotifications) { + newNotifications = newNotifications.slice(1); + } + return { + ...state, + notifications: [...newNotifications, action.payload], + }; + } + case NotificationActionTypes.REMOVE_NOTIFICATION: { + if (!action.payload || !action.payload.id) return state; + return { + ...state, + notifications: state.notifications.filter( + (n) => n.id !== action.payload.id, + ), + }; + } + case NotificationActionTypes.CLEAR_NOTIFICATIONS: + return { ...state, notifications: [] }; + case NotificationActionTypes.UPDATE_NOTIFICATION: { + if ( + !action.payload || + !action.payload.id || + !action.payload.updates + ) + return state; + return { + ...state, + notifications: state.notifications.map((n) => + n.id === action.payload.id + ? { ...n, ...action.payload.updates } + : n, + ), + }; + } + default: + return state; + } +} + +//============================================================================= +// #region STORE +//============================================================================= + +class Store { + constructor(reducer, initialState) { + this.reducer = reducer; + this.state = initialState; + this.listeners = []; + } + + getState() { + return this.state; + } + + dispatch(action) { + this.state = this.reducer(this.state, action); + this.listeners.forEach((listener) => listener(this.state)); + return action; + } + + subscribe(listener) { + this.listeners.push(listener); + return () => { + this.listeners = this.listeners.filter((l) => l !== listener); + }; + } +} + +const notificationStore = new Store( + notificationReducer, + notificationInitialState, +); + +//============================================================================= +// #region SELECTORS +//============================================================================= + +const notificationSelectors = { + getNotifications: (state) => state.notifications, + getMaxNotifications: (state) => state.maxNotifications, +}; + +//============================================================================= +// #region UI COMPONENT +//============================================================================= + +class NotificationUI { + constructor(store) { + this.store = store; + this.unsubscribe = null; + this.container = document.getElementById("notification-container"); + this.renderedNotifications = new Map(); + this.dismissTimers = new Map(); + } + + init() { + if (!this.container) { + console.error("Notification container not found"); + return; + } + this.unsubscribe = this.store.subscribe((state) => this.render(state)); + this.render(this.store.getState()); + } + + destroy() { + if (this.unsubscribe) this.unsubscribe(); + this.dismissTimers.forEach((timers) => { + clearTimeout(timers.hideTimer); + clearTimeout(timers.removeTimer); + clearTimeout(timers.progressTimer); + }); + this.dismissTimers.clear(); + this.renderedNotifications.forEach((el) => { + if (el.parentNode) el.parentNode.removeChild(el); + }); + this.renderedNotifications.clear(); + } + + render(state) { + const notifications = notificationSelectors.getNotifications(state); + + // Remove notifications no longer present + const currentIds = new Set(notifications.map((n) => n.id)); + for (const [id, el] of this.renderedNotifications.entries()) { + if (!currentIds.has(id)) { + this.clearDismissTimers(id); + if (el.parentNode) el.parentNode.removeChild(el); + this.renderedNotifications.delete(id); + } + } + + // Add or update notifications + notifications.forEach((notification) => { + if (!notification || !notification.id) return; + if (!this.renderedNotifications.has(notification.id)) { + this.createNotificationElement(notification); + } else { + this.updateNotificationElement(notification); + } + }); + } + + clearDismissTimers(id) { + const timers = this.dismissTimers.get(id); + if (!timers) return; + + clearTimeout(timers.hideTimer); + clearTimeout(timers.removeTimer); + clearTimeout(timers.progressTimer); + this.dismissTimers.delete(id); + } + + escapeHTML(value) { + return String(value == null ? "" : value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + normalizeType(type) { + const supportedTypes = new Set([ + "success", + "danger", + "warning", + "info", + ]); + return supportedTypes.has(type) ? type : "info"; + } + + formatTypeLabel(type) { + const labels = { + success: "Success", + danger: "Critical", + warning: "Warning", + info: "Info", + }; + return labels[this.normalizeType(type)] || labels.info; + } + + getDurationLabel(duration) { + if (!(duration > 0)) return "Pinned"; + const seconds = Math.max(1, Math.round(duration / 100) / 10); + return `${seconds.toFixed(1)}s`; + } + + getTimestampLabel(timestamp) { + const date = new Date(timestamp || Date.now()); + const hours = String(date.getHours()).padStart(2, "0"); + const minutes = String(date.getMinutes()).padStart(2, "0"); + return `${hours}:${minutes}`; + } + + createNotificationElement(notification) { + const type = this.normalizeType(notification.type); + const title = this.escapeHTML(notification.title || "Notification"); + const message = this.escapeHTML(notification.message || "No message"); + const isPersistent = !(notification.duration > 0); + const el = document.createElement("div"); + el.className = `notification ${type}${isPersistent ? " is-persistent" : ""}`; + el.dataset.id = notification.id; + el.innerHTML = ` +
+
+
${title}
+
Forge alert
+
+
+
+ ${this.formatTypeLabel(type)} + ${this.getTimestampLabel(notification.timestamp)} +
+
${message}
+ +
+
+ ${notification.duration > 0 ? '
' : ""} + `; + this.container.appendChild(el); + this.renderedNotifications.set(notification.id, el); + requestAnimationFrame(() => { + requestAnimationFrame(() => el.classList.add("show")); + }); + + // Set progress bar animation duration + if (notification.duration > 0) { + const progressBar = el.querySelector(".notification-progress-bar"); + if (progressBar) { + progressBar.style.transitionDuration = `${notification.duration}ms`; + const progressTimer = setTimeout(() => { + progressBar.style.transform = "scaleX(0)"; + }, 30); + this.dismissTimers.set(notification.id, { progressTimer }); + } + + const hideTimer = setTimeout(() => { + notificationStore.dispatch( + notificationActions.updateNotification(notification.id, { + status: "hiding", + }), + ); + }, notification.duration); + const removeTimer = setTimeout(() => { + this.clearDismissTimers(notification.id); + notificationStore.dispatch( + notificationActions.removeNotification(notification.id), + ); + }, notification.duration + 260); + + const existingTimers = + this.dismissTimers.get(notification.id) || {}; + this.dismissTimers.set(notification.id, { + ...existingTimers, + hideTimer, + removeTimer, + }); + } + } + + updateNotificationElement(notification) { + const el = this.renderedNotifications.get(notification.id); + if (!el) return; + if (notification.status === "hiding") { + el.classList.add("hide"); + } + } +} + +//============================================================================= +// #region GLOBAL API & EVENT HANDLING +//============================================================================= + +let notificationUI = null; +let notificationUIInitialized = false; + +function notifyArmaNotificationReady() { + if ( + window.parent && + window.parent !== window && + typeof window.parent.postMessage === "function" + ) { + window.parent.postMessage({ event: "notifications::ready" }, "*"); + } + if (typeof A3API !== "undefined" && typeof A3API.SendAlert === "function") { + A3API.SendAlert(JSON.stringify({ event: "notifications::ready" })); + } +} + +function initializeNotifications() { + if (notificationUIInitialized) { + console.log("Notification system already initialized, skipping..."); + return; + } + notificationUI = new NotificationUI(notificationStore); + notificationUI.init(); + notificationUIInitialized = true; + console.log("Notification system is ready!"); + notifyArmaNotificationReady(); +} + +// Expose global notification API +const showNotification = (type, title, message, duration) => { + return notificationStore.dispatch( + notificationActions.addNotification({ type, title, message, duration }), + ); +}; +const clearAllNotifications = () => { + return notificationStore.dispatch(notificationActions.clearNotifications()); +}; +window.showNotification = showNotification; +window.clearAllNotifications = clearAllNotifications; +window.ForgeNotifications = { + show: showNotification, + clear: clearAllNotifications, +}; + +// Listen for global notification events (for Arma/SQF or other scripts) +window.addEventListener("forge:notify", function (e) { + if (!e || !e.detail) return; + const { type, title, message, duration } = e.detail; + showNotification(type, title, message, duration); +}); + +// Auto-initialize if DOM is already loaded when script executes +if (document.readyState !== "loading") { + initializeNotifications(); +} else { + document.addEventListener("DOMContentLoaded", initializeNotifications, { + once: true, + }); +} diff --git a/arma/client/addons/notifications/ui/_site/styles.css b/arma/client/addons/notifications/ui/_site/styles.css new file mode 100644 index 0000000..685c9b4 --- /dev/null +++ b/arma/client/addons/notifications/ui/_site/styles.css @@ -0,0 +1,245 @@ +:root { + --hud-top: 30px; + --hud-right: 20px; + --header-bg: linear-gradient( + 180deg, + rgba(13, 37, 69, 0.98) 0%, + rgba(8, 24, 48, 0.98) 100% + ); + --body-bg: rgba(242, 238, 228, 0.97); + --panel-edge: rgba(121, 166, 212, 0.22); + --panel-shadow: 0 14px 24px rgba(0, 0, 0, 0.34); + --header-text: rgba(235, 243, 255, 0.98); + --header-muted: rgba(166, 189, 221, 0.8); + --body-text: rgba(31, 45, 64, 0.96); + --body-muted: rgba(86, 102, 122, 0.82); + --body-faint: rgba(111, 126, 144, 0.76); + --success: #6de2b3; + --success-soft: rgba(109, 226, 179, 0.12); + --danger: #ff7b7b; + --danger-soft: rgba(255, 123, 123, 0.12); + --warning: #ffd36b; + --warning-soft: rgba(255, 211, 107, 0.12); + --info: #78b9ff; + --info-soft: rgba(120, 185, 255, 0.12); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, +body { + min-height: 100vh; +} + +body { + background: transparent; + color: var(--body-text); + font-family: "Bahnschrift", "Segoe UI", Tahoma, sans-serif; + letter-spacing: 0.01em; + overflow: hidden; + pointer-events: none; + user-select: none; +} + +.notifications-hud { + position: fixed; + top: var(--hud-top); + right: var(--hud-right); + width: 384px; + max-width: calc(100vw - 24px); + z-index: 1000; +} + +.notification-container { + display: grid; + gap: 8px; +} + +.notification { + position: relative; + overflow: hidden; + background: transparent; + border: 1px solid var(--panel-edge); + border-radius: 12px; + box-shadow: var(--panel-shadow); + opacity: 0; + transform: translateX(28px) scale(0.985); + transition: + opacity 0.18s ease, + transform 0.18s ease, + border-color 0.18s ease; +} + +.notification::before { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.08), + transparent 24% + ); + pointer-events: none; +} + +.notification.show { + opacity: 1; + transform: translateX(0) scale(1); +} + +.notification.hide { + opacity: 0; + transform: translateX(32px) scale(0.985); +} + +.notification-inner { + position: relative; + display: block; + padding: 0; +} + +.notification-body { + display: flex; + flex-direction: column; + gap: 7px; + min-width: 0; + padding: 10px 11px 11px; + background: var(--body-bg); +} + +.notification-meta, +.notification-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.notification-header { + display: flex; + flex-direction: column; + gap: 6px; + padding: 10px 11px; + background: var(--header-bg); + border-bottom: 1px solid rgba(255, 255, 255, 0.08); +} + +.notification-meta { + color: var(--body-muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.notification-badge { + padding: 3px 6px; + border-radius: 999px; + border: 1px solid currentColor; + background: rgba(34, 51, 74, 0.08); +} + +.notification-time { + color: var(--body-faint); +} + +.notification-title { + color: var(--header-text); + font-size: 14px; + font-weight: 700; + line-height: 1.1; +} + +.notification-subtitle { + color: var(--header-muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.notification-message { + color: var(--body-text); + font-size: 12px; + line-height: 1.35; + word-break: break-word; +} + +.notification-footer { + color: var(--body-faint); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.notification-progress { + height: 4px; + background: rgba(34, 51, 74, 0.16); +} + +.notification-progress-bar { + height: 100%; + width: 100%; + background: currentColor; + opacity: 0.95; + transform: scaleX(1); + transform-origin: left center; + transition: transform linear; +} + +.notification.is-persistent .notification-progress { + display: none; +} + +.notification.success { + color: var(--success); + border-color: rgba(109, 226, 179, 0.24); +} + +.notification.success .notification-badge { + background-color: var(--success-soft); +} + +.notification.danger { + color: var(--danger); + border-color: rgba(255, 123, 123, 0.24); +} + +.notification.danger .notification-badge { + background-color: var(--danger-soft); +} + +.notification.warning { + color: var(--warning); + border-color: rgba(255, 211, 107, 0.24); +} + +.notification.warning .notification-badge { + background-color: var(--warning-soft); +} + +.notification.info { + color: var(--info); + border-color: rgba(120, 185, 255, 0.24); +} + +.notification.info .notification-badge { + background-color: var(--info-soft); +} + +@media (max-width: 720px) { + :root { + --hud-top: 18px; + --hud-right: 12px; + } + + .notifications-hud { + width: calc(100vw - 16px); + max-width: calc(100vw - 16px); + } +} diff --git a/arma/client/addons/org/$PBOPREFIX$ b/arma/client/addons/org/$PBOPREFIX$ new file mode 100644 index 0000000..cc69cc0 --- /dev/null +++ b/arma/client/addons/org/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\org diff --git a/arma/client/addons/org/CfgEventHandlers.hpp b/arma/client/addons/org/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/org/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/org/README.md b/arma/client/addons/org/README.md new file mode 100644 index 0000000..798bf20 --- /dev/null +++ b/arma/client/addons/org/README.md @@ -0,0 +1,34 @@ +# Forge Client Organization + +## Overview +The organization addon provides the client organization portal UI and bridge for +organization hydrate, registration, membership, invitations, credit lines, +leave/disband actions, assets, fleet, and treasury display. Registration shows +the $50,000 personal funds requirement enforced by the server org addon. + +## Dependencies +- `forge_client_common` +- `forge_client_main` +- server organization events from `forge_server_org` +- notifications for user feedback + +## Main Components +- `fnc_initRepository.sqf` caches organization portal state. +- `fnc_initUIBridge.sqf` sends browser requests to server org RPCs and pushes + hydrate/sync events back to the browser. +- `fnc_handleUIEvents.sqf` handles `org::*` browser events. +- `fnc_openUI.sqf` opens `RscOrg`. + +## Browser Events +- `org::login::request` +- `org::create::request` +- `org::disband::request` +- `org::leave::request` +- `org::credit::request` +- `org::invite::request` +- `org::invite::accept` +- `org::invite::decline` + +## Runtime Notes +The client portal is a view/controller. Organization state, funds, reputation, +credit lines, assets, fleet, and membership are authoritative on the server. diff --git a/arma/client/addons/org/XEH_PREP.hpp b/arma/client/addons/org/XEH_PREP.hpp new file mode 100644 index 0000000..fb83b48 --- /dev/null +++ b/arma/client/addons/org/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(handleUIEvents); +PREP(initRepository); +PREP(initUIBridge); +PREP(openUI); diff --git a/arma/client/addons/org/XEH_postInit.sqf b/arma/client/addons/org/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/org/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/org/XEH_postInitClient.sqf b/arma/client/addons/org/XEH_postInitClient.sqf new file mode 100644 index 0000000..cce0b05 --- /dev/null +++ b/arma/client/addons/org/XEH_postInitClient.sqf @@ -0,0 +1,75 @@ +#include "script_component.hpp" + +if (isNil QGVAR(OrgRepository)) then { call FUNC(initRepository); }; +if (isNil QGVAR(OrgUIBridge)) then { call FUNC(initUIBridge); }; + +[QGVAR(initOrg), { + GVAR(OrgRepository) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitOrg), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(OrgRepository) call ["markLoaded", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncOrg), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(OrgRepository) call ["markLoaded", []]; + GVAR(OrgUIBridge) call ["refreshPortal", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseHydrateOrg), { + params [["_payload", createHashMap, [createHashMap]], ["_bridgeEvent", "org::sync", [""]]]; + + GVAR(OrgUIBridge) call ["handleHydrateResponse", [_payload, _bridgeEvent]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCreateOrg), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleCreateResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseDisbandOrg), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleDisbandResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseLeaveOrg), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleLeaveResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCreditLine), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleCreditLineResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseTreasuryAction), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleTreasuryResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInviteOrg), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleInviteResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInviteDecision), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(OrgUIBridge) call ["handleInviteDecisionResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[{ + EGVAR(actor,ActorRepository) get "isLoaded"; +}, { + [QGVAR(initOrg), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/org/XEH_preInit.sqf b/arma/client/addons/org/XEH_preInit.sqf new file mode 100644 index 0000000..640756c --- /dev/null +++ b/arma/client/addons/org/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initSettings.inc.sqf" +#include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/org/XEH_preInitClient.sqf b/arma/client/addons/org/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/org/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/org/XEH_preStart.sqf b/arma/client/addons/org/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/org/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/org/config.cpp b/arma/client/addons/org/config.cpp new file mode 100644 index 0000000..3aca435 --- /dev/null +++ b/arma/client/addons/org/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_common", + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscOrg.hpp" diff --git a/arma/client/addons/org/functions/fnc_handleUIEvents.sqf b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..f46ca7e --- /dev/null +++ b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,70 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Handles the org UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_org_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Org] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "org::close": { closeDialog 1; }; + case "org::login::request": { + GVAR(OrgUIBridge) call ["handleLoginRequest", [_control]]; + }; + case "org::create::request": { + GVAR(OrgUIBridge) call ["handleCreateRequest", [_control, _data]]; + }; + case "org::disband::request": { + GVAR(OrgUIBridge) call ["requestDisband", []]; + }; + case "org::leave::request": { + GVAR(OrgUIBridge) call ["requestLeave", []]; + }; + case "org::credit::request": { + GVAR(OrgUIBridge) call ["requestCreditLine", [_data]]; + }; + case "org::payroll::request": { + GVAR(OrgUIBridge) call ["requestPayroll", [_data]]; + }; + case "org::transfer::request": { + GVAR(OrgUIBridge) call ["requestTransferFunds", [_data]]; + }; + case "org::invite::request": { + GVAR(OrgUIBridge) call ["requestInvite", [_data]]; + }; + case "org::invite::accept": { + GVAR(OrgUIBridge) call ["requestAcceptInvite", [_data]]; + }; + case "org::invite::decline": { + GVAR(OrgUIBridge) call ["requestDeclineInvite", [_data]]; + }; + case "org::ready": { + GVAR(OrgUIBridge) call ["handleReady", [_control]]; + }; + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/org/functions/fnc_initRepository.sqf b/arma/client/addons/org/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..1a6ca54 --- /dev/null +++ b/arma/client/addons/org/functions/fnc_initRepository.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRepository.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the org repository for client org lifecycle state. + * + * Arguments: + * None + * + * Return Value: + * Org repository object [HASHMAP OBJECT] + * + * Example: + * call forge_client_org_fnc_initRepository; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(OrgRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "OrgRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["uid", getPlayerUID player]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + }], + ["init", compileFinal { + [SRPC(org,requestInitOrg), [getPlayerUID player]] call CFUNC(serverEvent); + _self set ["lastSave", time]; + + systemChat format ["Org loaded for %1", name player]; + diag_log "[FORGE:Client:Org] Org Repository Initialized!"; + }], + ["markLoaded", compileFinal { + if !(_self getOrDefault ["isLoaded", false]) then { _self set ["isLoaded", true]; }; + true + }] +]; + +GVAR(OrgRepository) = createHashMapObject [GVAR(OrgRepositoryBaseClass)]; +GVAR(OrgRepository) diff --git a/arma/client/addons/org/functions/fnc_initUIBridge.sqf b/arma/client/addons/org/functions/fnc_initUIBridge.sqf new file mode 100644 index 0000000..b8dfc67 --- /dev/null +++ b/arma/client/addons/org/functions/fnc_initUIBridge.sqf @@ -0,0 +1,248 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-10 + * Last Update: 2026-03-13 + * Public: No + * + * Description: + * Initializes the org UI bridge for browser control state and event routing. + * + * Arguments: + * None + * + * Return Value: + * Org UI bridge object [HASHMAP OBJECT] + * + * Examples: + * call forge_client_org_fnc_initUIBridge + */ + +#pragma hemtt ignore_variables ["_self"] +private _webUIDeclarations = call EFUNC(common,initWebUIBridge); +private _webUIBridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; + +GVAR(OrgUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _webUIBridgeDeclaration], + ["#type", "OrgUIBridgeBaseClass"], + ["setPendingBrowserControl", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self set ["pendingBrowserControl", _control]; + _control + }], + ["consumePendingBrowserControl", compileFinal { + private _control = _self getOrDefault ["pendingBrowserControl", controlNull]; + _self set ["pendingBrowserControl", controlNull]; + + _control + }], + ["getActiveBrowserControl", compileFinal { + private _display = uiNamespace getVariable ["RscOrg", displayNull]; + if (isNull _display) exitWith { + _self call ["setActiveBrowserControl", [controlNull]]; + controlNull + }; + + private _control = _display displayCtrl 1003; + _self call ["setActiveBrowserControl", [_control]]; + _control + }], + ["hasOpenScreen", compileFinal { + private _screen = _self call ["getScreen", []]; + private _control = _self call ["getActiveBrowserControl", []]; + + !(isNull _control) && { _screen call ["isReady", []] } + }], + ["requestHydrate", compileFinal { + params [["_bridgeEvent", "org::sync", [""]]]; + + if !(_self call ["hasOpenScreen", []]) exitWith { false }; + + private _event = _bridgeEvent; + if !(_event in ["org::login::success", "org::create::success", "org::sync"]) then { + _event = "org::sync"; + }; + + [SRPC(org,requestHydrateOrg), [getPlayerUID player, _event]] call CFUNC(serverEvent); + true + }], + ["handleHydrateResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]], ["_bridgeEvent", "org::sync", [""]]]; + + if !(_self call ["hasOpenScreen", []]) exitWith { false }; + + private _event = _bridgeEvent; + if !(_event in ["org::login::success", "org::create::success", "org::sync"]) then { + _event = "org::sync"; + }; + + _self call ["sendEvent", [_event, _payload, _self call ["getActiveBrowserControl", []]]] + }], + ["handleLoginRequest", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self call ["setActiveBrowserControl", [_control]]; + _self call ["requestHydrate", ["org::login::success"]]; + }], + ["handleCreateRequest", compileFinal { + params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]]; + + private _orgName = _data getOrDefault ["orgName", ""]; + if (_orgName isEqualTo "") exitWith { + _self call ["sendEvent", ["org::create::failure", createHashMapFromArray [ + ["message", "Enter an organization name."] + ], _control]]; + }; + + _self call ["setPendingBrowserControl", [_control]]; + [SRPC(org,requestCreateOrg), [getPlayerUID player, _orgName]] call CFUNC(serverEvent); + }], + ["handleCreateResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _control = _self call ["consumePendingBrowserControl", []]; + private _success = _payload getOrDefault ["success", false]; + if (!_success) exitWith { + if (isNull _control) exitWith {}; + + _self call ["sendEvent", ["org::create::failure", createHashMapFromArray [ + ["message", _payload getOrDefault ["message", "Organization registration failed."]] + ], _control]]; + }; + + if !(isNull _control) then { + _self call ["setActiveBrowserControl", [_control]]; + }; + + _self call ["requestHydrate", ["org::create::success"]]; + }], + ["handleDisbandResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = if (_payload getOrDefault ["success", false]) then { + ["org::portal::revoked", "org::disband::success"] select (_payload getOrDefault ["requester", false]) + } else { + "org::disband::failure" + }; + + _self call ["sendEvent", [_eventName, _payload]]; + }], + ["handleLeaveResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = [ + "org::leave::failure", + "org::leave::success" + ] select (_payload getOrDefault ["success", false]); + + _self call ["sendEvent", [_eventName, _payload]]; + }], + ["handleCreditLineResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = [ + "org::credit::failure", + "org::credit::success" + ] select (_payload getOrDefault ["success", false]); + + _self call ["sendEvent", [_eventName, _payload]]; + + if (_payload getOrDefault ["success", false]) then { + private _memberUid = _payload getOrDefault ["memberUid", ""]; + if (_memberUid isNotEqualTo "") then { + _self call ["sendEvent", ["org::member::creditUpdated", createHashMapFromArray [ + ["amount", _payload getOrDefault ["amount", 0]], + ["memberName", _payload getOrDefault ["memberName", ""]], + ["memberUid", _memberUid] + ]]]; + }; + }; + }], + ["handleTreasuryResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = [ + "org::treasury::failure", + "org::treasury::success" + ] select (_payload getOrDefault ["success", false]); + + _self call ["sendEvent", [_eventName, _payload]]; + }], + ["handleInviteResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = [ + "org::invite::failure", + "org::invite::success" + ] select (_payload getOrDefault ["success", false]); + + _self call ["sendEvent", [_eventName, _payload]]; + }], + ["handleInviteDecisionResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _eventName = [ + "org::invite::decision::failure", + "org::invite::decision::success" + ] select (_payload getOrDefault ["success", false]); + + _self call ["sendEvent", [_eventName, _payload]]; + }], + ["requestDisband", compileFinal { + [SRPC(org,requestDisbandOrg), [getPlayerUID player]] call CFUNC(serverEvent); + }], + ["requestLeave", compileFinal { + [SRPC(org,requestLeaveOrg), [getPlayerUID player]] call CFUNC(serverEvent); + }], + ["requestCreditLine", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _memberUid = _data getOrDefault ["memberUid", ""]; + private _memberName = _data getOrDefault ["memberName", ""]; + private _amount = _data getOrDefault ["amount", 0]; + + [SRPC(org,requestAssignCreditLine), [getPlayerUID player, _memberUid, _memberName, _amount]] call CFUNC(serverEvent); + }], + ["requestPayroll", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _amount = _data getOrDefault ["amount", 0]; + [SRPC(org,requestPayroll), [getPlayerUID player, _amount]] call CFUNC(serverEvent); + }], + ["requestTransferFunds", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _memberUid = _data getOrDefault ["memberUid", ""]; + private _memberName = _data getOrDefault ["memberName", ""]; + private _amount = _data getOrDefault ["amount", 0]; + [SRPC(org,requestTreasuryTransfer), [getPlayerUID player, _memberUid, _memberName, _amount]] call CFUNC(serverEvent); + }], + ["requestInvite", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _targetUid = _data getOrDefault ["targetUid", ""]; + private _targetName = _data getOrDefault ["targetName", ""]; + [SRPC(org,requestInviteOrgMember), [getPlayerUID player, _targetUid, _targetName]] call CFUNC(serverEvent); + }], + ["requestAcceptInvite", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _orgID = _data getOrDefault ["orgId", ""]; + [SRPC(org,requestAcceptOrgInvite), [getPlayerUID player, _orgID]] call CFUNC(serverEvent); + }], + ["requestDeclineInvite", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _orgID = _data getOrDefault ["orgId", ""]; + [SRPC(org,requestDeclineOrgInvite), [getPlayerUID player, _orgID]] call CFUNC(serverEvent); + }], + ["refreshPortal", compileFinal { + _self call ["requestHydrate", ["org::sync"]] + }] +]; + +GVAR(OrgUIBridge) = createHashMapObject [GVAR(OrgUIBridgeBaseClass)]; +GVAR(OrgUIBridge) diff --git a/arma/client/addons/org/functions/fnc_openUI.sqf b/arma/client/addons/org/functions/fnc_openUI.sqf new file mode 100644 index 0000000..e146d45 --- /dev/null +++ b/arma/client/addons/org/functions/fnc_openUI.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Opens the org UI. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_org_fnc_openUI; + */ + +private _display = createDialog ["RscOrg", true]; +private _ctrl = _display displayCtrl 1003; + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; +// _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; + +true; diff --git a/arma/client/addons/org/initKeybinds.inc.sqf b/arma/client/addons/org/initKeybinds.inc.sqf new file mode 100644 index 0000000..2922c52 --- /dev/null +++ b/arma/client/addons/org/initKeybinds.inc.sqf @@ -0,0 +1 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" diff --git a/arma/client/addons/org/initSettings.inc.sqf b/arma/client/addons/org/initSettings.inc.sqf new file mode 100644 index 0000000..416ff52 --- /dev/null +++ b/arma/client/addons/org/initSettings.inc.sqf @@ -0,0 +1 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required diff --git a/arma/client/addons/org/script_component.hpp b/arma/client/addons/org/script_component.hpp new file mode 100644 index 0000000..746956a --- /dev/null +++ b/arma/client/addons/org/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT org +#define COMPONENT_BEAUTIFIED Org +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/org/stringtable.xml b/arma/client/addons/org/stringtable.xml new file mode 100644 index 0000000..cd5b9ba --- /dev/null +++ b/arma/client/addons/org/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Org + + + diff --git a/arma/client/addons/org/ui/RscCommon.hpp b/arma/client/addons/org/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/org/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/org/ui/RscOrg.hpp b/arma/client/addons/org/ui/RscOrg.hpp new file mode 100644 index 0000000..d63a41c --- /dev/null +++ b/arma/client/addons/org/ui/RscOrg.hpp @@ -0,0 +1,21 @@ +class RscOrg { + idd = 1002; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscOrg', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscOrg', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1003; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/org/ui/_site/index.html b/arma/client/addons/org/ui/_site/index.html new file mode 100644 index 0000000..05d3f52 --- /dev/null +++ b/arma/client/addons/org/ui/_site/index.html @@ -0,0 +1 @@ +ORBIS - Global Organization Network
\ No newline at end of file diff --git a/arma/client/addons/org/ui/_site/org-ui.css b/arma/client/addons/org/ui/_site/org-ui.css new file mode 100644 index 0000000..2972aa6 --- /dev/null +++ b/arma/client/addons/org/ui/_site/org-ui.css @@ -0,0 +1 @@ +:root{--bg-app:#fdfcf8;--bg-surface:#fff;--bg-surface-hover:#f1f5f9;--primary:#475569;--primary-hover:#1e293b;--text-main:#1f2937;--text-muted:#64748b;--text-inverse:#f8fafc;--border:#e2e8f0;--radius:8px;--shadow:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--footer-bg:#1e293b}html,body{height:100%}*,:before,:after{box-sizing:border-box}body{background:var(--bg-app);color:var(--text-main);margin:0;padding:0;font-family:Inter,system-ui,-apple-system,sans-serif;line-height:1.6;overflow:hidden}#app{height:100vh;overflow:hidden}.app-shell{flex-direction:column;height:100vh;display:flex;overflow:hidden}#org-portal-frame-root{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}main{overscroll-behavior:contain;flex-direction:column;flex:auto;min-height:0;display:flex;overflow:auto}.container{box-sizing:border-box;flex-direction:column;flex:1;width:100%;max-width:1200px;margin:0 auto;padding:2rem;display:flex}.header{text-align:center;border-bottom:1px solid var(--border);margin-bottom:3rem;padding-bottom:2rem}.header h1{letter-spacing:-.025em;color:var(--primary-hover);margin-bottom:.5rem;font-size:2.5rem;font-weight:700}.header p{color:var(--text-muted);font-size:1.1rem}.card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);text-align:center;padding:2rem}.card h2{color:var(--primary-hover);margin-top:0;font-size:1.8rem}button{background:var(--primary);color:#fff;border-radius:var(--radius);cursor:pointer;border:none;padding:.75rem 1.5rem;font-size:1rem;font-weight:500;transition:all .2s}button:hover{background:var(--primary-hover);transform:translateY(-1px);box-shadow:0 4px 6px -1px #0000001a}button:disabled{cursor:not-allowed;opacity:.65;box-shadow:none;transform:none}button+button{margin-left:1rem}.footer{background:var(--footer-bg);color:var(--text-inverse);margin-top:auto;display:block}.footer .wrapper{box-sizing:border-box;grid-template-columns:1fr 1fr;gap:4rem;width:100%;max-width:1200px;margin:0 auto;padding:3rem 2rem;display:grid}.footer h3{color:var(--text-inverse);text-transform:uppercase;letter-spacing:.1em;border-bottom:1px solid #475569;margin-bottom:1.5rem;margin-right:1rem;padding-bottom:.5rem;font-size:.85rem;font-weight:700}.footer ul li{color:#cbd5e1;cursor:pointer;margin-bottom:.75rem;font-size:.95rem;transition:color .2s}.footer ul li:hover{color:#fff}.org-secondary-btn{background:var(--bg-surface);color:var(--text-main);border:1px solid var(--border)}.org-secondary-btn:hover{background:var(--bg-surface-hover);color:var(--text-main)}.org-danger-btn{color:#fef2f2;background:#7f1d1d}.org-danger-btn:hover{background:#991b1b}.org-icon-btn{justify-content:center;align-items:center;width:2.5rem;height:2.5rem;padding:0;display:inline-flex}.org-icon{width:1rem;height:1rem}.org-page-header{text-align:left;margin-bottom:0}.org-page-heading{flex-direction:column;gap:.35rem;display:flex}.org-page-kicker{text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);font-size:.7rem;font-weight:600}.org-page-title{margin:0}.org-page-subtitle{color:var(--text-muted);margin:0;font-size:.9rem}.org-page-meta{color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-size:.75rem}@media (width<=960px){.container{padding:1.5rem}.header{margin-bottom:2rem;padding-bottom:1.5rem}.header h1{font-size:2rem}.footer .wrapper{grid-template-columns:1fr}.org-page-heading{gap:.3rem}} \ No newline at end of file diff --git a/arma/client/addons/org/ui/_site/org-ui.js b/arma/client/addons/org/ui/_site/org-ui.js new file mode 100644 index 0000000..b3eb4cc --- /dev/null +++ b/arma/client/addons/org/ui/_site/org-ui.js @@ -0,0 +1 @@ +!function(){const e=window.ForgeWebUI,n=window.RegistryApp=window.RegistryApp||{},r=window.OrgPortal=window.OrgPortal||{};n.runtime=e,r.runtime=e,window.AppRuntime=e}(),function(){const e=window.RegistryApp=window.RegistryApp||{},{createSignal:n}=e.runtime;e.store=new class{constructor(){[this.getView,this.setView]=n("home"),[this.getIsAuthenticating,this.setIsAuthenticating]=n(!1),[this.getLoginError,this.setLoginError]=n(""),[this.getIsCreating,this.setIsCreating]=n(!1),[this.getCreateError,this.setCreateError]=n("")}startLogin(){this.setLoginError(""),this.setIsAuthenticating(!0)}startCreate(){this.setCreateError(""),this.setIsCreating(!0)}failLogin(e){this.setIsAuthenticating(!1),this.setLoginError(e||"Authentication failed.")}failCreate(e){this.setIsCreating(!1),this.setCreateError(e||"Organization registration failed.")}hydratePortal(e){const n=window.OrgPortal&&window.OrgPortal.data?window.OrgPortal.data:null,r=window.OrgPortal&&window.OrgPortal.store?window.OrgPortal.store:null,t=e&&e.portalData?e.portalData:null,a=e&&e.session?e.session:null;return!!(n&&"function"==typeof n.applyLoginPayload&&r&&"function"==typeof r.hydrateFromPayload&&t&&a)&&(n.applyLoginPayload(e),r.hydrateFromPayload(e),!0)}completeLogin(e){this.hydratePortal(e)?(this.setLoginError(""),this.setIsAuthenticating(!1),this.setView("portal")):this.failLogin("Login response was missing portal data.")}completeCreate(e){this.hydratePortal(e)?(this.setCreateError(""),this.setIsCreating(!1),this.setView("portal")):this.failCreate("Organization registration response was missing portal data.")}}}(),function(){const e=window.RegistryApp=window.RegistryApp||{},n=e.store,r=window.ForgeWebUI.createBridge({closeEvent:"org::close",globalName:"ForgeBridge",readyEvent:"org::ready"});function t(e,n){return r.send(e,n)}r.on("org::login::success",e=>{n.completeLogin(e)}),r.on("org::login::failure",e=>{n.failLogin(e.message||"Authentication failed.")}),r.on("org::create::success",e=>{n.completeCreate(e)}),r.on("org::create::failure",e=>{n.failCreate(e.message||"Organization registration failed.")}),r.on("org::sync",e=>{n&&"function"==typeof n.hydratePortal&&n.hydratePortal(e)}),r.on("org::credit::success",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setModal(null),n&&n.actions&&n.actions.showTreasuryNotice("success",e.message||"Credit line assigned.")}),r.on("org::credit::failure",e=>{const n=window.OrgPortal;n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Unable to assign credit line.")}),r.on("org::treasury::success",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setModal(null),n&&n.actions&&n.actions.showTreasuryNotice("success",e.message||"Treasury action completed.")}),r.on("org::treasury::failure",e=>{const n=window.OrgPortal;n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Treasury action failed.")}),r.on("org::invite::success",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setModal(null),n&&n.actions&&n.actions.showTreasuryNotice("success",e.message||"Organization invite sent.")}),r.on("org::invite::failure",e=>{const n=window.OrgPortal;n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Unable to send organization invite.")}),r.on("org::invite::decision::success",e=>{const n=window.OrgPortal;n&&n.actions&&n.actions.showTreasuryNotice("success",e.message||"Organization invite updated.")}),r.on("org::invite::decision::failure",e=>{const n=window.OrgPortal;n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Unable to update organization invite.")}),r.on("org::member::creditUpdated",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setCreditLines(n=>{const r={amount:e.availableAmount||e.amount||0,amountDue:e.amountDue||0,approvedAmount:e.approvedAmount||e.availableAmount||e.amount||0,availableAmount:e.availableAmount||e.amount||0,interestRate:e.interestRate||.1,member:e.memberName||"",outstandingPrincipal:e.outstandingPrincipal||0,uid:e.memberUid||""},t=n.findIndex(e=>e.uid===r.uid);return-1===t?[...n,r]:n.map((e,n)=>n===t?r:e)})}),r.on("org::disband::success",()=>{const e=window.OrgPortal;e&&e.store&&(e.store.setModal(null),e.store.setOrgDisbanded(!0))}),r.on("org::disband::failure",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setModal(null),n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Organization disbanding failed.")}),r.on("org::leave::success",e=>{const r=window.OrgPortal;r&&r.store&&r.store.setModal(null),n.failLogin(e.message||"You have left the organization."),n.setView("home")}),r.on("org::leave::failure",e=>{const n=window.OrgPortal;n&&n.store&&n.store.setModal(null),n&&n.actions&&n.actions.showTreasuryNotice("error",e.message||"Unable to leave the organization.")}),r.on("org::portal::revoked",e=>{const r=window.OrgPortal;r&&r.store&&r.store.setModal(null),n.failLogin(e.message||"Organization access is no longer available."),n.setView("home")}),e.bridge={close:r.close,ready:r.ready,receive:r.receive,requestLogin:function(e){n.startLogin(),t("org::login::request",e)||n.failLogin("Arma login bridge is unavailable.")},requestCreateOrg:function(e){n.startCreate(),t("org::create::request",e)||n.failCreate("Arma registration bridge is unavailable.")},requestDisbandOrg:function(){if(t("org::disband::request",{}))return;const e=window.OrgPortal;e&&e.actions&&e.actions.showTreasuryNotice("error","Arma disband bridge is unavailable.")},requestLeaveOrg:function(){if(t("org::leave::request",{}))return;const e=window.OrgPortal;e&&e.actions&&e.actions.showTreasuryNotice("error","Arma leave bridge is unavailable.")},requestCreditLine:function(e){if(t("org::credit::request",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma credit line bridge is unavailable."),!1},requestPayroll:function(e){if(t("org::payroll::request",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma payroll bridge is unavailable."),!1},requestTreasuryTransfer:function(e){if(t("org::transfer::request",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma treasury transfer bridge is unavailable."),!1},requestInvitePlayer:function(e){if(t("org::invite::request",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma organization invite bridge is unavailable."),!1},requestAcceptInvite:function(e){if(t("org::invite::accept",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma organization invite bridge is unavailable."),!1},requestDeclineInvite:function(e){if(t("org::invite::decline",e))return!0;const n=window.OrgPortal;return n&&n.actions&&n.actions.showTreasuryNotice("error","Arma organization invite bridge is unavailable."),!1},sendEvent:t}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},n={type:"Organization",status:"Operational",headquarters:"ArmA Verse"};function r(e){return JSON.parse(JSON.stringify(e))}function t(e,n){Object.keys(e).forEach(n=>delete e[n]),Object.assign(e,r(n))}function a(e,n){e.splice(0,e.length,...r(n))}function o(e){if(e&&"object"==typeof e&&!Array.isArray(e))return e;if(Array.isArray(e)){if(e.every(e=>Array.isArray(e)&&e.length>=2&&"string"==typeof e[0]))return Object.fromEntries(e)}if("string"==typeof e&&""!==e.trim())try{return o(JSON.parse(e))}catch(n){return e}return e}function i(e){return(Array.isArray(e)?e:e&&"object"==typeof e?Object.values(e):[]).map(o).filter(Boolean)}e.data={portalData:{org:Object.assign({name:"",tag:"",owner:"",ownerUid:"",isDefault:!1},n),funds:0,reputation:0,creditLines:[],members:[],pendingInvites:[],inviteablePlayers:[],fleet:[],assets:[],activity:[],roadmap:[{name:"Contracts Board",status:"Planned",detail:"Track payouts, assignments, and claim approvals."},{name:"Diplomacy",status:"Future Review",detail:"Possible future module pending a full design and scope review."},{name:"Logistics Queue",status:"Future Review",detail:"Possible future module pending a full design and scope review."},{name:"Permissions",status:"Future Review",detail:"Possible future module pending a full design and scope review."}]},session:{actorName:"",actorUid:"",role:"",ceo:!1},applyLoginPayload(e){t(this.portalData.org,Object.assign({},e.portalData.org||{},n)),this.portalData.funds=e.portalData.funds||0,this.portalData.reputation=e.portalData.reputation||0,a(this.portalData.creditLines,i(e.portalData.creditLines)),a(this.portalData.members,i(e.portalData.members)),a(this.portalData.pendingInvites,i(e.portalData.pendingInvites)),a(this.portalData.inviteablePlayers,i(e.portalData.inviteablePlayers)),a(this.portalData.fleet,i(e.portalData.fleet)),a(this.portalData.assets,i(e.portalData.assets)),a(this.portalData.activity,i(e.portalData.activity)),a(this.portalData.roadmap,i(e.portalData.roadmap)),t(this.session,e.session||{})}}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{createSignal:n}=window.RegistryApp.runtime,{portalData:r}=e.data;function t(e){if(e&&"object"==typeof e&&!Array.isArray(e))return e;if(Array.isArray(e)){if(e.every(e=>Array.isArray(e)&&e.length>=2&&"string"==typeof e[0]))return Object.fromEntries(e)}if("string"==typeof e&&""!==e.trim())try{return t(JSON.parse(e))}catch(n){return e}return e}function a(e){return(Array.isArray(e)?e:e&&"object"==typeof e?Object.values(e):[]).map(t).filter(Boolean)}e.store=new class{constructor(){[this.getFunds,this.setFunds]=n(r.funds),[this.getReputation,this.setReputation]=n(r.reputation),[this.getMembers,this.setMembers]=n([...r.members]),[this.getPendingInvites,this.setPendingInvites]=n([...r.pendingInvites]),[this.getInviteablePlayers,this.setInviteablePlayers]=n([...r.inviteablePlayers]),[this.getCreditLines,this.setCreditLines]=n([...r.creditLines]),[this.getFleet,this.setFleet]=n([...r.fleet]),[this.getAssets,this.setAssets]=n([...r.assets]),[this.getActivity,this.setActivity]=n([...r.activity]),[this.getTreasuryNotice,this.setTreasuryNotice]=n({type:"",text:""}),[this.getModal,this.setModal]=n(null),[this.getInviteMenuOpen,this.setInviteMenuOpen]=n(!1),[this.getOrgDisbanded,this.setOrgDisbanded]=n(!1)}hydrateFromPayload(e){const n=e.portalData||{};this.setFunds(n.funds||0),this.setReputation(n.reputation||0),this.setMembers([...a(n.members)]),this.setPendingInvites([...a(n.pendingInvites)]),this.setInviteablePlayers([...a(n.inviteablePlayers)]),this.setCreditLines([...a(n.creditLines)]),this.setFleet([...a(n.fleet)]),this.setAssets([...a(n.assets)]),this.setActivity([...a(n.activity)])}}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{portalData:n,session:r}=e.data;e.getters=new class{formatCurrency(e){return"$"+Number(e||0).toLocaleString()}formatVehicleType(e){return e?e.charAt(0).toUpperCase()+e.slice(1):""}formatAssetType(e){return e?e.charAt(0).toUpperCase()+e.slice(1):""}formatDisplayName(e){return e?String(e).trim().split(/\s+/).map(e=>e?e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():"").join(" "):""}getAssetReadiness(){const r=e.store?e.store.getFleet():n.fleet;if(0===r.length)return null;const t=r.reduce((e,n)=>e+(100-parseInt(n.damage,10)),0);return Math.round(t/r.length)}getNormalizedRole(){return String(r.role||"").trim().toUpperCase()}isDefaultOrg(){return!0===n.org.isDefault||"DEFAULT"===String(n.org.tag||"").trim().toUpperCase()}isOrgOwner(){const e=String(n.org.ownerUid||n.org.owner||"").trim().toLowerCase(),t=String(r.actorUid||"").trim().toLowerCase();return e&&t?t===e:String(r.actorName||"").trim().toLowerCase()===String(n.org.owner||"").trim().toLowerCase()}isSessionCeo(){return!0===r.ceo}isOrgLeaderOrCeo(){return this.isOrgOwner()||"LEADER"===this.getNormalizedRole()||this.isDefaultOrg()&&this.isSessionCeo()}canManageMembers(){return this.isOrgLeaderOrCeo()}canManageTreasury(){return this.isOrgLeaderOrCeo()}canDisbandOrg(){return this.isOrgOwner()&&!this.isDefaultOrg()}canLeaveOrg(){return!this.isDefaultOrg()&&!this.isOrgOwner()}getMemberName(e){return String(e&&"object"==typeof e?e.name||"":e||"")}getMemberUid(e){return e&&"object"==typeof e?String(e.uid||""):""}isOwnerMember(e){return this.getMemberName(e).trim().toLowerCase()===String(n.org.owner||"").trim().toLowerCase()}isCurrentMember(e){const n=this.getMemberUid(e).trim().toLowerCase(),t=String(r.actorUid||"").trim().toLowerCase();return n&&t?n===t:this.getMemberName(e).trim().toLowerCase()===String(r.actorName||"").trim().toLowerCase()}isProtectedMember(e){return this.isOwnerMember(e)||this.isCurrentMember(e)}}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{portalData:n}=e.data,r=e.store,t=e.getters,a=window.RegistryApp.store;e.actions=new class{constructor(){this.treasuryNoticeTimer=null}showTreasuryNotice(e,n){r.setTreasuryNotice({type:e,text:n}),this.treasuryNoticeTimer&&clearTimeout(this.treasuryNoticeTimer),this.treasuryNoticeTimer=setTimeout(()=>{r.setTreasuryNotice({type:"",text:""}),this.treasuryNoticeTimer=null},3500)}parseAmount(e){const n=Number(e);return Number.isFinite(n)?Math.round(n):0}getInputValue(e){const n=document.getElementById(e);return n?n.value:""}closePortal(){const e=window.RegistryApp?window.RegistryApp.bridge:null;e&&"function"==typeof e.close?e.close({}):a&&a.setView("home")}openModal(e){"payroll"!==e&&"transfer"!==e&&"credit"!==e||t.canManageTreasury()?"invite"!==e||t.canManageMembers()?("disband"!==e||t.canDisbandOrg())&&("leave"!==e||t.canLeaveOrg())&&r.setModal({type:e}):this.showTreasuryNotice("error","Only the organization leader or CEO can invite players."):this.showTreasuryNotice("error","Only the organization leader or CEO can manage treasury actions.")}closeModal(){r.setModal(null)}toggleInviteMenu(){r.setInviteMenuOpen(!r.getInviteMenuOpen())}closeInviteMenu(){r.setInviteMenuOpen(!1)}removeMember(e){if(!t.canManageMembers())return!1;if(t.isProtectedMember(e))return!1;const n=t.getMemberUid(e),a=t.getMemberName(e);return r.setMembers(e=>e.filter(e=>n?e.uid!==n:e.name!==a)),r.setCreditLines(e=>e.filter(e=>n?e.uid!==n:e.member!==a)),!0}disbandOrganization(){if(!t.canDisbandOrg())return!1;const e=window.RegistryApp?window.RegistryApp.bridge:null;return e&&"function"==typeof e.requestDisbandOrg?(this.closeModal(),e.requestDisbandOrg(),!0):(this.showTreasuryNotice("error","Disband bridge is unavailable."),!1)}leaveOrganization(){if(!t.canLeaveOrg())return!1;const e=window.RegistryApp?window.RegistryApp.bridge:null;return e&&"function"==typeof e.requestLeaveOrg?(this.closeModal(),e.requestLeaveOrg(),!0):(this.showTreasuryNotice("error","Leave bridge is unavailable."),!1)}runPayroll(e){if(!t.canManageTreasury())return this.showTreasuryNotice("error","Only the organization leader or CEO can manage treasury actions."),!1;const n=r.getMembers(),a=r.getFunds();if(0===n.length)return this.showTreasuryNotice("error","No members available for payroll."),!1;if(e<=0)return this.showTreasuryNotice("error","Enter a valid payroll amount."),!1;if(e*n.length>a)return this.showTreasuryNotice("error","Insufficient org funds for payroll."),!1;const o=window.RegistryApp?window.RegistryApp.bridge:null;return o&&"function"==typeof o.requestPayroll?o.requestPayroll({amount:e}):(this.showTreasuryNotice("error","Payroll bridge is unavailable."),!1)}sendFundsToMember(e,n){if(!t.canManageTreasury())return this.showTreasuryNotice("error","Only the organization leader or CEO can manage treasury actions."),!1;const a=r.getFunds();if(!e)return this.showTreasuryNotice("error","Select a member to receive funds."),!1;if(n<=0)return this.showTreasuryNotice("error","Enter a valid transfer amount."),!1;if(n>a)return this.showTreasuryNotice("error","Insufficient org funds for this transfer."),!1;const o=r.getMembers().find(n=>t.getMemberUid(n)===e),i=o?t.getMemberName(o):"";if(!i)return this.showTreasuryNotice("error","Selected member was not found in the organization roster."),!1;const s=window.RegistryApp?window.RegistryApp.bridge:null;return s&&"function"==typeof s.requestTreasuryTransfer?s.requestTreasuryTransfer({memberUid:e,memberName:i,amount:n}):(this.showTreasuryNotice("error","Treasury transfer bridge is unavailable."),!1)}grantCreditLine(e,n){if(!t.canManageTreasury())return this.showTreasuryNotice("error","Only the organization leader or CEO can manage treasury actions."),!1;if(!e)return this.showTreasuryNotice("error","Select a member for the credit line."),!1;if(n<=0)return this.showTreasuryNotice("error","Enter a valid credit line amount."),!1;const a=r.getMembers().find(n=>t.getMemberUid(n)===e),o=a?t.getMemberName(a):"";if(!o)return this.showTreasuryNotice("error","Selected member was not found in the organization roster."),!1;const i=window.RegistryApp?window.RegistryApp.bridge:null;return i&&"function"==typeof i.requestCreditLine?i.requestCreditLine({memberUid:e,memberName:o,amount:n}):(this.showTreasuryNotice("error","Credit line bridge is unavailable."),!1)}sendInvite(e){if(!t.canManageMembers())return this.showTreasuryNotice("error","Only the organization leader or CEO can invite players."),!1;const n=r.getInviteablePlayers().find(n=>String(n.uid||"")===String(e));if(!n)return this.showTreasuryNotice("error","Select an online player to invite."),!1;const a=window.RegistryApp?window.RegistryApp.bridge:null;return a&&"function"==typeof a.requestInvitePlayer?a.requestInvitePlayer({targetUid:String(n.uid||""),targetName:String(n.name||"")}):(this.showTreasuryNotice("error","Organization invite bridge is unavailable."),!1)}acceptInvite(e){const n=window.RegistryApp?window.RegistryApp.bridge:null;return n&&"function"==typeof n.requestAcceptInvite?(this.closeInviteMenu(),n.requestAcceptInvite({orgId:e})):(this.showTreasuryNotice("error","Organization invite bridge is unavailable."),!1)}declineInvite(e){const n=window.RegistryApp?window.RegistryApp.bridge:null;return n&&"function"==typeof n.requestDeclineInvite?(this.closeInviteMenu(),n.requestDeclineInvite({orgId:e})):(this.showTreasuryNotice("error","Organization invite bridge is unavailable."),!1)}}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.RegistryApp=window.RegistryApp||{},{h:r,ensureScopedStyle:t}=n.runtime,a="data-ui-navbar",o=`[${a}]`,i=`\n${o} {\n background: var(--bg-surface);\n border-bottom: 1px solid var(--border);\n box-shadow: var(--shadow);\n}\n\n${o} .app-navbar-inner {\n display: flex;\n justify-content: space-between;\n align-items: center;\n max-width: 1200px;\n width: 100%;\n margin: 0 auto;\n padding: 1rem 2rem;\n box-sizing: border-box;\n}\n\n${o} .app-navbar-brand {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n${o} .app-navbar-kicker {\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n font-weight: 600;\n}\n\n${o} .app-navbar-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--primary-hover);\n letter-spacing: -0.025em;\n}\n\n${o} .app-navbar-actions {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n}\n\n${o} .app-navbar-view {\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--text-muted);\n font-weight: 600;\n}\n\n${o} .app-close-btn {\n background: transparent;\n color: var(--text-muted);\n border: 1px solid var(--border);\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n}\n\n${o} .app-close-btn:hover {\n background: var(--bg-surface-hover);\n color: var(--primary-hover);\n border-color: var(--primary);\n transform: none;\n box-shadow: none;\n}\n\n@media (max-width: 960px) {\n ${o} .app-navbar-inner {\n flex-direction: column;\n align-items: flex-start;\n padding: 1rem 1.5rem;\n }\n\n ${o} .app-navbar-actions {\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.Navbar=function({kicker:e="ORBIS",title:n="",viewLabel:o="",actionLabel:s="",onAction:l=null}){return t("shared-navbar",i),r("nav",{className:"app-navbar",[a]:""},r("div",{className:"app-navbar-inner"},r("div",{className:"app-navbar-brand"},r("span",{className:"app-navbar-kicker"},e),r("span",{className:"app-navbar-title"},n)),r("div",{className:"app-navbar-actions"},r("span",{className:"app-navbar-view"},o),s&&"function"==typeof l?r("button",{type:"button",className:"app-close-btn",onClick:l},s):null)))}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.RegistryApp=window.RegistryApp||{},{h:r}=n.runtime;e.componentFns=e.componentFns||{},e.componentFns.Header=function({title:e,subtitle:n="Organization Registration & Management Portal",onTitleClick:t=null}){return r("div",{className:"header"},r("h1",{style:{cursor:t?"pointer":"default"},onClick:t},e),r("p",null,n))}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.OrgPortal=window.OrgPortal||{},{h:r}=n.runtime;e.componentFns=e.componentFns||{},e.componentFns.Hero=function({className:e="",kicker:n="",title:t="",subtitle:a="",meta:o=""}){const i=["card org-panel org-span-12 org-page-header",e].filter(Boolean).join(" ");return r("section",{className:i},r("div",{className:"org-page-heading"},r("span",{className:"org-page-kicker"},n),r("h1",{className:"org-page-title"},t),r("p",{className:"org-page-subtitle"},a),r("span",{className:"org-page-meta"},o)))}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.RegistryApp=window.RegistryApp||{},{h:r}=n.runtime;e.componentFns=e.componentFns||{},e.componentFns.Footer=function({sections:e=[]}){return r("div",{className:"footer"},r("div",{className:"wrapper"},...e.map(e=>r("div",null,r("h3",null,e.title),r("ul",{style:{listStyleType:"none",padding:0}},...(e.items||[]).map(e=>r("li",null,e)))))))}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.RegistryApp=window.RegistryApp||{},{h:r,ensureScopedStyle:t}=n.runtime,a="data-ui-modal",o=`[${a}]`,i=`\n${o} {\n position: fixed;\n inset: 0;\n background: rgb(15 23 42 / 0.38);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem;\n z-index: 20;\n}\n\n${o} .app-modal-card {\n width: min(100%, 30rem);\n margin-bottom: 0;\n text-align: left;\n}\n\n${o} .app-modal-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1rem;\n}\n\n${o} .app-modal-title {\n margin: 0;\n color: var(--primary-hover);\n font-size: 1.45rem;\n}\n\n${o} .app-modal-close {\n width: 2.25rem;\n height: 2.25rem;\n padding: 0;\n background: var(--bg-surface);\n color: var(--text-main);\n border: 1px solid var(--border);\n box-shadow: none;\n transform: none;\n}\n\n${o} .app-modal-close:hover {\n background: var(--bg-surface-hover);\n color: var(--text-main);\n box-shadow: none;\n transform: none;\n}\n\n${o} .app-modal-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n${o} .app-modal-form label {\n display: block;\n margin-bottom: 0.5rem;\n color: var(--text-muted);\n font-weight: 500;\n font-size: 0.9rem;\n}\n\n${o} .app-modal-form input,\n${o} .app-modal-form select {\n width: 100%;\n padding: 0.75rem;\n border-radius: var(--radius);\n border: 1px solid var(--border);\n background: var(--bg-app);\n color: var(--text-main);\n font-family: inherit;\n font-size: 1rem;\n box-sizing: border-box;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n${o} .app-modal-form input:focus,\n${o} .app-modal-form select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 2px rgb(71 85 105 / 0.12);\n}\n\n${o} .app-modal-form input:disabled,\n${o} .app-modal-form select:disabled {\n background: #f1f5f9;\n color: var(--text-muted);\n cursor: not-allowed;\n}\n\n${o} .app-modal-actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.75rem;\n margin-top: 0.5rem;\n}\n\n${o} .app-modal-actions button + button,\n${o} .app-modal-danger-actions button + button {\n margin-left: 0;\n}\n\n${o} .app-modal-danger {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid #fecaca;\n border-radius: var(--radius);\n background: #fff1f2;\n align-items: flex-start;\n}\n\n${o} .app-modal-danger p {\n margin: 0;\n color: var(--text-main);\n}\n\n${o} .app-modal-danger-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n}\n\n@media (max-width: 960px) {\n ${o} .app-modal-head,\n ${o} .app-modal-danger {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.Modal=function({title:e="",body:n=null,onClose:o=null}){return t("shared-modal",i),r("div",{className:"app-modal-backdrop",[a]:"",onClick:e=>{e.target===e.currentTarget&&o&&o()}},r("div",{className:"card app-modal-card"},r("div",{className:"app-modal-head"},r("div",null,r("h2",{className:"app-modal-title"},e)),r("button",{type:"button",className:"app-modal-close",onClick:o,"aria-label":"Close dialog"},"x")),n))}}(),function(){const e=window.SharedUI=window.SharedUI||{},n=window.RegistryApp=window.RegistryApp||{},{h:r,ensureScopedStyle:t}=n.runtime,a="data-ui-panel-card",o=`[${a}]`,i=`\n${o} {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n${o} .org-panel-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1.5rem;\n}\n\n${o} .org-panel-body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n}\n\n${o} .org-eyebrow {\n font-size: 0.8rem;\n font-weight: 700;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: var(--text-muted);\n margin-bottom: 0.4rem;\n}\n\n${o} .org-panel-title {\n margin: 0;\n color: var(--primary-hover);\n font-size: 1.45rem;\n}\n\n${o} .org-panel-subtitle {\n margin: 0.35rem 0 0;\n color: var(--text-muted);\n font-size: 0.95rem;\n}\n\n@media (max-width: 960px) {\n ${o} .org-panel-head {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.PanelCard=function({className:e="",eyebrow:n="",title:o="",subtitle:s="",headerExtras:l=null,body:d=null,rootProps:c={}}){const m=["card org-panel",e].filter(Boolean).join(" ");return t("shared-panel-card",i),r("section",{className:m,[a]:"",...c},r("div",{className:"org-panel-head"},r("div",null,n?r("div",{className:"org-eyebrow"},n):null,r("h2",{className:"org-panel-title"},o),s?r("p",{className:"org-panel-subtitle"},s):null),l),r("div",{className:"org-panel-body"},d))}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,t="data-ui-metric-card",a=`[${t}]`,o=`\n${a} {\n display: flex;\n flex-direction: column;\n gap: 0.45rem;\n padding: 1rem;\n border-radius: var(--radius);\n border: 1px solid var(--border);\n background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);\n}\n\n${a}:nth-child(4n + 2),\n${a}:nth-child(4n + 3) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(226 232 240) 100%);\n border-color: rgb(100 116 139 / 0.35);\n box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.6);\n}\n\n${a} .org-metric-label {\n font-size: 0.76rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--text-muted);\n}\n\n${a} .org-metric-value {\n font-size: 1.8rem;\n color: var(--primary-hover);\n line-height: 1.1;\n}\n\n${a}:nth-child(4n + 2) .org-metric-value,\n${a}:nth-child(4n + 3) .org-metric-value {\n color: #334155;\n}\n\n${a} .org-metric-note {\n color: var(--text-muted);\n font-size: 0.9rem;\n}\n\n@media (max-width: 960px) {\n ${a}:nth-child(4n + 3) {\n background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);\n border-color: var(--border);\n box-shadow: none;\n }\n\n ${a}:nth-child(4n + 3) .org-metric-value {\n color: var(--primary-hover);\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.MetricCard=function(e,a,i){return r("portal-metric-card",o),n("div",{className:"org-metric-card",[t]:""},n("span",{className:"org-metric-label"},e),n("strong",{className:"org-metric-value"},a),n("span",{className:"org-metric-note"},i))}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,t="data-ui-simple-stat",a=`[${t}]`,o=`\n${a} {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n min-width: 90px;\n}\n\n${a} .org-simple-label {\n font-size: 0.72rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n}\n\n${a} .org-simple-value {\n font-size: 0.95rem;\n color: var(--text-main);\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.SimpleStat=function(e,a){return r("portal-simple-stat",o),n("div",{className:"org-simple-stat",[t]:""},n("span",{className:"org-simple-label"},e),n("strong",{className:"org-simple-value"},a))}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,{portalData:t}=e.data,a=e.store,o=e.getters,i="data-ui-overview-card",s=`[${i}]`,l=`\n${s} .org-hero-grid {\n display: grid;\n grid-template-columns: 1.3fr 1fr;\n gap: 1.5rem;\n align-items: start;\n}\n\n${s} .org-summary {\n margin: 0;\n font-size: 1.05rem;\n color: var(--text-main);\n}\n\n${s} .org-meta-row {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 1rem;\n margin-top: 1.5rem;\n}\n\n${s} .org-meta-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${s} .org-meta-item:nth-child(even) {\n background: linear-gradient(180deg, rgb(241 245 249) 0%, rgb(226 232 240) 100%);\n border-color: rgb(148 163 184 / 0.45);\n}\n\n${s} .org-meta-label {\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n}\n\n${s} .org-meta-value {\n font-size: 1rem;\n font-weight: 600;\n color: var(--primary-hover);\n}\n\n${s} .org-metric-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 1rem;\n}\n\n@media (max-width: 960px) {\n ${s} .org-hero-grid,\n ${s} .org-meta-row,\n ${s} .org-metric-grid {\n grid-template-columns: 1fr;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.OverviewCard=function(){const s=e.componentFns.MetricCard,d=window.SharedUI.componentFns.PanelCard,c=o.getAssetReadiness(),m=t.org.headquarters||"ArmA Verse",g=a.getAssets().length,u=a.getFleet().length,p=a.getFunds(),b=a.getMembers().length,f=a.getReputation();return r("portal-overview-card",l),d({className:"org-span-12",eyebrow:t.org.tag,title:"Organization Overview",rootProps:{[i]:""},body:n("div",{className:"org-hero-grid"},n("div",{className:"org-hero-copy"},n("p",{className:"org-summary"},t.org.type," operating from ",m,". Treasury, fleet status, inventory, and roster management are surfaced here first."),n("div",{className:"org-meta-row"},n("div",{className:"org-meta-item"},n("span",{className:"org-meta-label"},"Director"),n("span",{className:"org-meta-value"},o.formatDisplayName(t.org.owner))),n("div",{className:"org-meta-item"},n("span",{className:"org-meta-label"},"Active Members"),n("span",{className:"org-meta-value"},`${b} total`)),n("div",{className:"org-meta-item"},n("span",{className:"org-meta-label"},"Fleet Readiness"),n("span",{className:"org-meta-value"},null===c?"N/A":`${c}%`)))),n("div",{className:"org-metric-grid"},s("Org Funds",o.formatCurrency(p),"Organization treasury balance"),s("Reputation",f,"Organization standing"),s("Asset Lines",g,"Tracked supply and equipment entries"),s("Fleet Vehicles",u,"Tracked air, ground, and naval vehicles")))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,{portalData:t}=e.data,a=e.getters,o="data-ui-fleet-card",i=`[${o}]`,s=`\n${i} .org-simple-list {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0.85rem;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${i} .org-simple-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${i} .org-simple-row:nth-child(even) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(148 163 184 / 0.45);\n}\n\n${i} .org-simple-name {\n color: var(--primary-hover);\n}\n\n${i} .org-simple-meta {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 1rem;\n}\n\n@media (max-width: 960px) {\n ${i} .org-simple-row {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.FleetCard=function(){const t=window.SharedUI.componentFns.PanelCard,i=e.componentFns.SimpleStat,l=e.store.getFleet();return r("portal-fleet-card",s),t({className:"org-scroll-panel org-span-7",title:"Fleet",subtitle:"Individual vehicles with type, status, and overall damage.",rootProps:{[o]:""},body:n("div",{className:"org-simple-list"},...l.map(e=>n("article",{className:"org-simple-row"},n("strong",{className:"org-simple-name"},e.name),n("div",{className:"org-simple-meta"},i("Type",a.formatVehicleType(e.type)),i("Status",e.status),i("Damage",e.damage)))))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r,createSignal:t}=e.runtime,{portalData:a}=e.data,o=e.store,i=e.getters,s=e.actions,l="data-ui-treasury-card",d=`[${l}]`,[c,m]=t("overview"),[g,u]=t(!1),p=`\n${d} .org-treasury-menu {\n position: relative;\n}\n\n${d} .org-menu-btn {\n width: 2.75rem;\n height: 2.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 1px solid var(--border);\n background: #f8fafc;\n color: var(--text-muted);\n}\n\n${d} .org-menu-btn:hover {\n color: var(--primary-hover);\n border-color: rgb(148 163 184 / 0.65);\n}\n\n${d} .org-menu-btn svg {\n width: 1.1rem;\n height: 1.1rem;\n}\n\n${d} .org-menu-dropdown {\n position: absolute;\n top: calc(100% + 0.6rem);\n right: 0;\n min-width: 10.5rem;\n padding: 0.45rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #fff;\n box-shadow: 0 12px 28px rgb(15 23 42 / 0.12);\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n z-index: 5;\n}\n\n${d} .org-menu-option + .org-menu-option {\n margin-left: 0;\n}\n\n${d} .org-menu-option {\n width: 100%;\n justify-content: flex-start;\n background: transparent;\n color: var(--text-main);\n border: 1px solid transparent;\n}\n\n${d} .org-menu-option:hover {\n background: #f8fafc;\n border-color: rgb(148 163 184 / 0.35);\n}\n\n${d} .org-menu-option.is-active {\n background: rgb(226 232 240 / 0.7);\n color: var(--primary-hover);\n border-color: rgb(148 163 184 / 0.35);\n}\n\n${d} .org-finance-meta {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 1rem;\n margin-bottom: 1.5rem;\n}\n\n${d} .org-finance-meta > div {\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n\n${d} .org-meta-label {\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n}\n\n${d} .org-action-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n${d} .org-action-grid button + button {\n margin-left: 0;\n}\n\n${d} .org-action-grid button {\n width: 100%;\n}\n\n${d} .org-access-note {\n margin: 0 0 1rem;\n color: var(--text-muted);\n font-size: 0.95rem;\n}\n\n${d} .org-credit-summary {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n padding: 0.85rem 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${d} .org-credit-summary strong {\n font-size: 1rem;\n}\n\n${d} .org-credit-summary span:last-child {\n font-size: 0.92rem;\n line-height: 1.45;\n}\n\n${d} .org-credit-lines-list {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n${d} .org-treasury-body {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 1rem;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${d} .org-credit-line-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${d} .org-credit-line-row:nth-child(even) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(148 163 184 / 0.45);\n}\n\n${d} .org-credit-line-member {\n display: flex;\n flex-direction: column;\n gap: 0.3rem;\n}\n\n${d} .org-credit-line-label {\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n}\n\n${d} .org-credit-line-empty {\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n color: var(--text-muted);\n}\n\n@media (max-width: 960px) {\n ${d} .org-finance-meta {\n grid-template-columns: 1fr;\n }\n\n ${d} .org-credit-line-row {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.TreasuryCard=function(){const e=window.SharedUI.componentFns.PanelCard,t=o.getCreditLines(),a=o.getReputation(),d=i.canManageTreasury(),b=c(),f=g(),v=t.reduce((e,n)=>e+Number(n.availableAmount||n.amount||0),0),w=t.reduce((e,n)=>e+Number(n.amountDue||0),0),h=1===t.length?"1 active credit line":`${t.length} active credit lines`;return r("portal-treasury-card",p),e({className:"org-scroll-panel org-span-5",title:"Treasury",subtitle:"Organization funds, reputation and payouts.",headerExtras:n("div",{className:"org-treasury-menu"},n("button",{type:"button",className:"org-menu-btn",title:"Treasury views","aria-label":"Treasury views",onClick:()=>u(e=>!e)},n("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},n("line",{x1:"4",y1:"7",x2:"20",y2:"7"}),n("line",{x1:"4",y1:"12",x2:"20",y2:"12"}),n("line",{x1:"4",y1:"17",x2:"20",y2:"17"}))),f?n("div",{className:"org-menu-dropdown"},n("button",{type:"button",className:"overview"===b?"org-menu-option is-active":"org-menu-option",onClick:()=>{m("overview"),u(!1)}},"Overview"),n("button",{type:"button",className:"credit"===b?"org-menu-option is-active":"org-menu-option",onClick:()=>{m("credit"),u(!1)}},"Credit Lines")):null),rootProps:{[l]:""},body:n("div",{className:"org-treasury-body"},"credit"===b?t.length>0?n("div",{className:"org-credit-lines-list"},...t.map(e=>n("article",{className:"org-credit-line-row"},n("div",{className:"org-credit-line-member"},n("span",{className:"org-credit-line-label"},"Member"),n("strong",null,e.member)),n("div",{className:"org-credit-line-member"},n("span",{className:"org-credit-line-label"},"Available"),n("strong",null,i.formatCurrency(e.availableAmount||e.amount))),n("div",{className:"org-credit-line-member"},n("span",{className:"org-credit-line-label"},"Amount Due"),n("strong",null,i.formatCurrency(e.amountDue))),n("div",{className:"org-credit-line-member"},n("span",{className:"org-credit-line-label"},"Interest"),n("strong",null,`${Math.round(100*Number(e.interestRate||0))}%`))))):n("div",{className:"org-credit-line-empty"},"No active credit lines."):n("div",null,n("div",{className:"org-finance-meta"},n("div",null,n("span",{className:"org-meta-label"},"Funds"),n("strong",null,i.formatCurrency(o.getFunds()))),n("div",null,n("span",{className:"org-meta-label"},"Reputation"),n("strong",null,`${a}`)),n("div",null,n("span",{className:"org-meta-label"},"Reserved Credit"),n("strong",null,i.formatCurrency(v))),n("div",null,n("span",{className:"org-meta-label"},"Outstanding Due"),n("strong",null,i.formatCurrency(w)))),d?n("div",{className:"org-action-grid"},n("button",{type:"button",onClick:()=>s.openModal("payroll")},"Run Payroll"),n("button",{type:"button",className:"org-secondary-btn",onClick:()=>s.openModal("transfer")},"Send Funds"),n("button",{type:"button",className:"org-secondary-btn",onClick:()=>s.openModal("credit")},"Credit Line")):n("p",{className:"org-access-note"},"Only the organization leader or CEO can manage treasury actions."),n("div",{className:"org-credit-summary"},n("span",{className:"org-meta-label"},"Credit Line Status"),n("strong",null,h),n("span",null,t.length>0?"Open the Credit Lines tab to review reserved balances, due amounts, and member exposure.":"Assign a credit line to create the first approved member limit."))))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,{portalData:t}=e.data,a=e.getters,o="data-ui-assets-card",i=`[${o}]`,s=`\n${i} .org-simple-list {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0.85rem;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${i} .org-simple-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${i} .org-simple-row:nth-child(even) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(148 163 184 / 0.45);\n}\n\n${i} .org-simple-name {\n color: var(--primary-hover);\n}\n\n${i} .org-simple-meta {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 1rem;\n}\n\n@media (max-width: 960px) {\n ${i} .org-simple-row {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.AssetsCard=function(){const t=window.SharedUI.componentFns.PanelCard,i=e.componentFns.SimpleStat,l=e.store.getAssets();return r("portal-assets-card",s),t({className:"org-scroll-panel org-span-7",title:"Assets",subtitle:"Inventory supplies and equipment with quantity totals.",rootProps:{[o]:""},body:n("div",{className:"org-simple-list"},...l.map(e=>n("article",{className:"org-simple-row"},n("strong",{className:"org-simple-name"},e.name),n("div",{className:"org-simple-meta"},i("Type",a.formatAssetType(e.type)),i("Quantity",e.quantity)))))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,t=e.store,a=e.getters,o=e.actions,i="data-ui-members-card",s=`[${i}]`,l=`\n${s} .org-name-list {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0.85rem;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${s} .org-members-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1rem;\n position: relative;\n}\n\n${s} .org-members-copy {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n}\n\n${s} .org-members-kicker {\n margin: 0;\n font-size: 0.85rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--text-muted);\n}\n\n${s} .org-members-subtitle {\n margin: 0;\n font-size: 0.9rem;\n color: var(--text-muted);\n}\n\n${s} .org-members-tools {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n}\n\n${s} .org-tool-btn {\n position: relative;\n width: 2.4rem;\n height: 2.4rem;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n${s} .org-tool-badge {\n position: absolute;\n top: -0.25rem;\n right: -0.25rem;\n min-width: 1.1rem;\n height: 1.1rem;\n padding: 0 0.2rem;\n border-radius: 999px;\n background: #b91c1c;\n color: white;\n font-size: 0.68rem;\n font-weight: 700;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n${s} .org-invite-menu {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n width: min(24rem, 100%);\n max-height: 22rem;\n overflow: auto;\n padding: 0.75rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: white;\n box-shadow: 0 18px 45px rgb(15 23 42 / 0.18);\n z-index: 4;\n}\n\n${s} .org-invite-menu-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 0.75rem;\n}\n\n${s} .org-invite-menu-title {\n margin: 0;\n font-size: 0.85rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--text-muted);\n}\n\n${s} .org-invite-menu-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n${s} .org-invite-row,\n${s} .org-name-row {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${s} .org-name-row:nth-child(even) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(148 163 184 / 0.45);\n}\n\n${s} .org-name-row button {\n margin-left: auto;\n}\n\n${s} .org-name-copy {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n}\n\n${s} .org-name-meta {\n font-size: 0.8rem;\n color: var(--text-muted);\n}\n\n${s} .org-inline-actions,\n${s} .org-invite-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n}\n\n${s} .org-members-empty {\n margin: 0;\n font-size: 0.9rem;\n color: var(--text-muted);\n}\n\n@media (max-width: 960px) {\n ${s} .org-members-head {\n flex-direction: column;\n align-items: flex-start;\n }\n\n ${s} .org-members-tools {\n margin-left: 0;\n }\n\n ${s} .org-invite-menu {\n left: 0;\n right: auto;\n width: 100%;\n }\n\n ${s} .org-name-row,\n ${s} .org-invite-row {\n flex-direction: column;\n align-items: flex-start;\n }\n\n ${s} .org-name-row button,\n ${s} .org-inline-actions,\n ${s} .org-invite-actions {\n margin-left: 0;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.MembersCard=function(){const e=window.SharedUI.componentFns.PanelCard,s=t.getMembers(),d=t.getPendingInvites(),c=t.getInviteMenuOpen(),m=a.canManageMembers();return r("portal-members-card",l),e({className:"org-scroll-panel org-span-5",title:"Members",subtitle:"Current roster listing. The organization owner and your own member entry cannot be removed.",rootProps:{[i]:""},body:n("div",{className:"org-name-list"},n("div",{className:"org-members-head"},n("div",{className:"org-members-copy"},n("h4",{className:"org-members-kicker"},"Roster"),n("p",{className:"org-members-subtitle"},"Manage membership and review incoming organization invites.")),n("div",{className:"org-members-tools"},n("button",{type:"button",className:"org-secondary-btn org-icon-btn org-tool-btn",title:"Pending invitations","aria-label":"Pending invitations",onClick:()=>o.toggleInviteMenu()},n("svg",{className:"org-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},n("path",{d:"M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 1 0-12 0v3.2a2 2 0 0 1-.6 1.4L4 17h5"}),n("path",{d:"M9.73 21a2 2 0 0 0 4.54 0"})),d.length>0?n("span",{className:"org-tool-badge"},String(d.length)):null),m?n("button",{type:"button",className:"org-secondary-btn org-icon-btn org-tool-btn",title:"Invite player","aria-label":"Invite player",onClick:()=>o.openModal("invite")},n("svg",{className:"org-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},n("path",{d:"M12 5v14"}),n("path",{d:"M5 12h14"}))):null,c?n("div",{className:"org-invite-menu"},n("div",{className:"org-invite-menu-head"},n("h4",{className:"org-invite-menu-title"},"Pending Invites"),n("button",{type:"button",className:"org-secondary-btn org-icon-btn org-tool-btn",title:"Close invites","aria-label":"Close invites",onClick:()=>o.closeInviteMenu()},n("svg",{className:"org-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},n("path",{d:"M18 6 6 18"}),n("path",{d:"m6 6 12 12"})))),0===d.length?n("p",{className:"org-members-empty"},"No incoming organization invites."):n("div",{className:"org-invite-menu-list"},...d.map(e=>n("article",{className:"org-invite-row"},n("div",{className:"org-name-copy"},n("strong",null,e.orgName||"Unknown Organization"),n("span",{className:"org-name-meta"},"Invited by ",e.inviterName||"Unknown")),n("div",{className:"org-invite-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>o.declineInvite(String(e.orgId||""))},"Decline"),n("button",{type:"button",onClick:()=>o.acceptInvite(String(e.orgId||""))},"Accept")))))):null)),...s.map(e=>{const r=m&&!a.isProtectedMember(e);return n("article",{className:"org-name-row"},n("div",{className:"org-name-copy"},n("strong",null,e.name),e.uid?n("span",{className:"org-name-meta"},e.uid):null),r?n("button",{type:"button",className:"org-danger-btn org-icon-btn",title:`Remove ${e.name}`,"aria-label":`Remove ${e.name}`,onClick:()=>o.removeMember(e)},n("svg",{className:"org-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},n("path",{d:"M9 3h6"}),n("path",{d:"M4 7h16"}),n("path",{d:"M6 7l1 13h10l1-13"}),n("path",{d:"M10 11v6"}),n("path",{d:"M14 11v6"}))):null)}))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,{portalData:t}=e.data,a="data-ui-activity-card",o=`[${a}]`,i=`\n${o} .org-activity-list {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0.85rem;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${o} .org-activity-row {\n padding: 1rem;\n border: 1px solid var(--border);\n border-left: 3px solid #94a3b8;\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${o} .org-activity-row:nth-child(even) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(148 163 184 / 0.45);\n border-left-color: #64748b;\n}\n\n${o} .org-activity-row p {\n margin: 0;\n color: var(--text-main);\n}\n\n${o} .org-activity-time {\n display: inline-block;\n margin-bottom: 0.35rem;\n color: var(--text-muted);\n font-size: 0.8rem;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.ActivityCard=function(){const t=window.SharedUI.componentFns.PanelCard,o=e.store.getActivity();return r("portal-activity-card",i),t({className:"org-scroll-panel org-span-6",title:"Command Feed",subtitle:"Recent organization-level actions and updates.",rootProps:{[a]:""},body:n("div",{className:"org-activity-list"},...o.map(e=>n("article",{className:"org-activity-row"},n("span",{className:"org-activity-time"},e.time),n("p",null,e.text))))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,t="data-ui-future-card",a=[{name:"Contracts Board",status:"Planned",detail:"Track payouts, assignments, and claim approvals."},{name:"Diplomacy",status:"Future Review",detail:"Possible future module pending a full design and scope review."},{name:"Logistics Queue",status:"Future Review",detail:"Possible future module pending a full design and scope review."},{name:"Permissions",status:"Future Review",detail:"Possible future module pending a full design and scope review."}],o=`[${t}]`,i=`\n${o} .org-roadmap-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 1rem;\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding-right: 0.35rem;\n scrollbar-width: thin;\n scrollbar-color: #94a3b8 #e2e8f0;\n}\n\n${o} .org-roadmap-card {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.7rem;\n border: 1px solid var(--border);\n border-radius: var(--radius);\n background: #f8fafc;\n}\n\n${o} .org-roadmap-card:nth-child(4n + 2),\n${o} .org-roadmap-card:nth-child(4n + 3) {\n background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%);\n border-color: rgb(100 116 139 / 0.4);\n}\n\n${o} .org-roadmap-card p {\n margin: 0;\n color: var(--text-main);\n}\n\n${o} .org-list-tag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.2rem 0.55rem;\n border-radius: 999px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n background: #e2e8f0;\n color: var(--primary-hover);\n}\n\n${o} .org-roadmap-card:nth-child(4n + 2) .org-list-tag,\n${o} .org-roadmap-card:nth-child(4n + 3) .org-list-tag {\n background: #cbd5e1;\n color: #1e293b;\n}\n\n@media (max-width: 960px) {\n ${o} .org-roadmap-grid {\n grid-template-columns: 1fr;\n }\n\n ${o} .org-roadmap-card:nth-child(4n + 3) {\n background: #f8fafc;\n border-color: var(--border);\n }\n\n ${o} .org-roadmap-card:nth-child(4n + 3) .org-list-tag {\n background: #e2e8f0;\n color: var(--primary-hover);\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.FutureCard=function(){const e=window.SharedUI.componentFns.PanelCard;return r("portal-future-card",i),e({className:"org-scroll-panel org-span-6",title:"Expansion Slots",subtitle:"Potential modules are tagged by status such as Planned, In Design, In Review, and Future Review.",rootProps:{[t]:""},body:n("div",{className:"org-roadmap-grid"},...a.map(e=>n("article",{className:"org-roadmap-card"},n("span",{className:"org-list-tag"},e.status),n("strong",null,e.name),n("p",null,e.detail))))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,t=e.getters,a=e.actions,o="data-ui-danger-card",i=`[${o}]`,s=`\n${i} {\n border-color: #fecaca;\n background: linear-gradient(180deg, #ffffff 0%, #fff7f7 100%);\n}\n\n${i} .org-danger-copy {\n margin-bottom: 1rem;\n}\n\n${i} .org-danger-copy strong,\n${i} .org-danger-copy p {\n display: block;\n}\n\n${i} .org-danger-copy p {\n margin: 0.4rem 0 0;\n color: var(--text-muted);\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.DangerCard=function(){const e=window.SharedUI.componentFns.PanelCard;return r("portal-danger-card",s),t.canDisbandOrg()?e({className:"org-span-12 org-danger-panel",title:"Organization Controls",subtitle:"Leader-only actions for membership and permanent organization removal.",rootProps:{[o]:""},body:n("div",null,n("div",{className:"org-danger-copy"},n("strong",null,"Disband organization"),n("p",null,"This removes the organization and revokes access to the portal for all members.")),n("button",{type:"button",className:"org-danger-btn",onClick:()=>a.openModal("disband")},"Disband Organization"))}):null}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n}=e.runtime,{portalData:r}=e.data,t=e.store,a=e.actions;e.componentFns=e.componentFns||{},e.componentFns.ModalLayer=function(){const e=window.SharedUI.componentFns.Modal,o=t.getModal();if(!o)return null;const i=t.getMembers(),s=t.getInviteablePlayers(),l=0===i.length?{disabled:!0}:{},d=0===s.length?{disabled:!0}:{};let c="",m=null;return"payroll"===o.type?(c="Run Payroll",m=n("div",{className:"app-modal-form"},n("div",null,n("label",null,"Amount Per Member"),n("input",{id:"treasury-payroll-amount",type:"number",min:"1",placeholder:"500",autofocus:"true"})),n("div",{className:"app-modal-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",onClick:()=>{a.runPayroll(a.parseAmount(a.getInputValue("treasury-payroll-amount")))&&a.closeModal()}},"Run Payroll")))):"transfer"===o.type?(c="Send Funds",m=n("div",{className:"app-modal-form"},n("div",null,n("label",null,"Member"),n("select",{id:"treasury-transfer-member",...l},...i.map(e=>n("option",{value:e.uid},e.name)))),n("div",null,n("label",null,"Amount"),n("input",{id:"treasury-transfer-amount",type:"number",min:"1",placeholder:"1500"})),n("div",{className:"app-modal-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",...l,onClick:()=>{a.sendFundsToMember(String(a.getInputValue("treasury-transfer-member")||""),a.parseAmount(a.getInputValue("treasury-transfer-amount")))&&a.closeModal()}},"Send Funds")))):"credit"===o.type?(c="Assign Credit Line",m=n("div",{className:"app-modal-form"},n("div",null,n("label",null,"Member"),n("select",{id:"treasury-credit-member",...l},...i.map(e=>n("option",{value:e.uid},e.name)))),n("div",null,n("label",null,"Credit Amount"),n("input",{id:"treasury-credit-amount",type:"number",min:"1",placeholder:"5000"})),n("div",{className:"app-modal-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",...l,onClick:()=>{a.grantCreditLine(String(a.getInputValue("treasury-credit-member")||""),a.parseAmount(a.getInputValue("treasury-credit-amount")))&&a.closeModal()}},"Assign Credit Line")))):"invite"===o.type?(c="Invite Player",m=n("div",{className:"app-modal-form"},n("div",null,n("label",null,"Online Player"),n("select",{id:"org-invite-player",...d},...s.map(e=>n("option",{value:e.uid},e.name||e.uid)))),0===s.length?n("p",null,"No eligible online players are currently available for invites."):null,n("div",{className:"app-modal-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",...d,onClick:()=>{a.sendInvite(String(a.getInputValue("org-invite-player")||""))&&a.closeModal()}},"Send Invite")))):"disband"===o.type?(c="Disband Organization",m=n("div",{className:"app-modal-danger"},n("p",null,"This action is permanent. Disband ",r.org.name,"?"),n("div",{className:"app-modal-danger-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",className:"org-danger-btn",onClick:()=>a.disbandOrganization()},"Confirm Disband")))):"leave"===o.type&&(c="Leave Organization",m=n("div",{className:"app-modal-danger"},n("p",null,"Leave ",r.org.name," and return to the default organization?"),n("div",{className:"app-modal-danger-actions"},n("button",{type:"button",className:"org-secondary-btn",onClick:()=>a.closeModal()},"Cancel"),n("button",{type:"button",className:"org-danger-btn",onClick:()=>a.leaveOrganization()},"Confirm Leave")))),e({title:c,body:m,onClose:()=>a.closeModal()})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n}=e.runtime,{portalData:r}=e.data,t=window.RegistryApp.store;e.componentFns=e.componentFns||{},e.componentFns.DisbandedView=function(){return(0,window.SharedUI.componentFns.PanelCard)({className:"org-span-12 org-empty-state",eyebrow:"Organization Removed",title:r.org.name,body:n("div",null,n("p",{className:"org-summary"},"This organization has been disbanded. Member access, assets, and fleet management are no longer available from this portal preview."),n("button",{type:"button",className:"org-secondary-btn",onClick:()=>t.setView("home")},"Return to Registry"))})}}(),function(){const e=window.OrgPortal=window.OrgPortal||{},{h:n,ensureScopedStyle:r}=e.runtime,{portalData:t,session:a}=e.data,o=e.store,i="[data-ui-portal-view]";r("portal-view",`\n ${i} {\n --org-row-card-max-height: 36rem;\n }\n\n ${i} .org-toast-stack {\n position: fixed;\n top: 1.5rem;\n right: 2rem;\n z-index: 20;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n pointer-events: none;\n }\n\n ${i} .org-toast {\n max-width: 24rem;\n padding: 0.9rem 1rem;\n border-radius: var(--radius);\n border: 1px solid var(--border);\n background: #fff;\n box-shadow: 0 12px 28px rgb(15 23 42 / 0.14);\n font-size: 0.92rem;\n pointer-events: auto;\n }\n\n ${i} .org-toast.is-success {\n background: #ecfdf5;\n border-color: #bbf7d0;\n color: #166534;\n }\n\n ${i} .org-toast.is-error {\n background: #fef2f2;\n border-color: #fecaca;\n color: #991b1b;\n }\n\n ${i} .org-dashboard-grid {\n display: grid;\n grid-template-columns: repeat(12, minmax(0, 1fr));\n gap: 1.5rem;\n align-items: stretch;\n }\n\n ${i} .org-panel {\n margin-bottom: 0;\n text-align: left;\n }\n\n ${i} .org-scroll-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n max-height: var(--org-row-card-max-height);\n overflow: hidden;\n }\n\n ${i} .org-island-root {\n display: flex;\n align-self: stretch;\n min-height: 0;\n min-width: 0;\n }\n\n ${i} .org-island-root > .org-panel {\n height: 100%;\n width: 100%;\n }\n\n ${i} .org-span-12 {\n grid-column: span 12;\n }\n\n ${i} .org-span-7 {\n grid-column: span 7;\n }\n\n ${i} .org-span-6 {\n grid-column: span 6;\n }\n\n ${i} .org-span-5 {\n grid-column: span 5;\n }\n\n @media (max-width: 960px) {\n ${i} .org-toast-stack {\n top: 1rem;\n right: 1rem;\n left: 1rem;\n }\n\n ${i} .org-toast {\n max-width: none;\n }\n\n ${i} .org-span-12,\n ${i} .org-span-7,\n ${i} .org-span-6,\n ${i} .org-span-5 {\n grid-column: span 12;\n }\n\n ${i} .org-scroll-panel {\n max-height: none;\n }\n\n }\n `),e.components=e.components||{},e.componentFns=e.componentFns||{},e.componentFns.TreasuryNoticeLayer=function(){const e=o.getTreasuryNotice();return e.text?n("div",{className:"org-toast-stack"},n("div",{className:"error"===e.type?"org-toast is-error":"org-toast is-success"},e.text)):null},e.components.App=function(){const r=window.SharedUI.componentFns.Hero,i=window.SharedUI.componentFns.Footer,s=e.componentFns.FutureCard,l=e.componentFns.DangerCard,d=e.componentFns.DisbandedView,c=[{title:"Organization Controls",items:["Roster Management","Fleet Assignment","Treasury Permissions","Asset Registry"]},{title:"Planned Extensions",items:["Contracts Board","Diplomacy Layer","Procurement Queue","Reputation History"]}];return o.getOrgDisbanded()?n("main",{"data-ui-portal-view":""},n("div",{className:"container"},n("div",{className:"org-dashboard-grid"},r({kicker:t.org.tag,title:t.org.name,subtitle:"Player organization command portal",meta:`${a.actorName} - ${a.role}`}),d())),n("div",{id:"org-portal-modal-root"}),i({sections:c})):n("main",{"data-ui-portal-view":""},n("div",{id:"org-portal-toast-root"}),n("div",{className:"container"},n("div",{className:"org-dashboard-grid"},r({kicker:t.org.tag,title:t.org.name,subtitle:"Player organization command portal",meta:`${a.actorName} - ${a.role}`}),n("div",{className:"org-island-root org-span-12",id:"org-overview-card-root"}),n("div",{className:"org-island-root org-span-7",id:"org-fleet-card-root"}),n("div",{className:"org-island-root org-span-5",id:"org-treasury-card-root"}),n("div",{className:"org-island-root org-span-5",id:"org-members-card-root"}),n("div",{className:"org-island-root org-span-7",id:"org-assets-card-root"}),n("div",{className:"org-island-root org-span-6",id:"org-activity-card-root"}),s(),l())),n("div",{id:"org-portal-modal-root"}),i({sections:c}))}}(),function(){const e=window.RegistryApp=window.RegistryApp||{},{h:n,ensureScopedStyle:r}=e.runtime,t=e.store,a=e.bridge,o="data-ui-registration-view",i=`[${o}]`,s=`\n${i} {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2rem;\n align-items: center;\n width: 100%;\n}\n\n${i} .info-panel {\n text-align: left;\n padding: 1rem;\n}\n\n${i} .create-feature-list {\n text-align: left;\n margin-top: 1.5rem;\n list-style-type: none;\n padding: 0;\n}\n\n${i} .create-feature-item {\n margin-bottom: 0.5rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n${i} .create-feature-icon {\n width: 1.2rem;\n height: 1.2rem;\n flex-shrink: 0;\n}\n\n${i} .price-tag {\n margin-top: 2rem;\n padding: 1rem;\n background: var(--bg-app);\n border-radius: var(--radius);\n border: 1px solid var(--border);\n}\n\n${i} .price-label {\n display: block;\n font-size: 0.9rem;\n color: var(--text-muted);\n}\n\n${i} .price-value {\n display: block;\n font-size: 2rem;\n font-weight: 700;\n color: var(--primary);\n}\n\n${i} .form-panel {\n margin: 0;\n}\n\n${i} .app-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n text-align: left;\n}\n\n${i} .app-form label {\n display: block;\n margin-bottom: 0.5rem;\n color: var(--text-muted);\n font-weight: 500;\n font-size: 0.9rem;\n}\n\n${i} .app-form input,\n${i} .app-form select {\n width: 100%;\n padding: 0.75rem;\n border-radius: var(--radius);\n border: 1px solid var(--border);\n background: var(--bg-app);\n color: var(--text-main);\n font-family: inherit;\n font-size: 1rem;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n${i} .app-form input:focus,\n${i} .app-form select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 2px rgb(59 130 246 / 0.1);\n}\n\n${i} .form-actions {\n margin-top: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n align-items: center;\n}\n\n${i} .submit-btn {\n width: 100%;\n}\n\n${i} .cancel-link {\n font-size: 0.9rem;\n color: var(--text-muted);\n cursor: pointer;\n text-decoration: underline;\n}\n\n${i} .cancel-link:hover {\n color: var(--primary);\n}\n\n${i} .form-feedback {\n padding: 0.85rem 1rem;\n border-radius: var(--radius);\n font-size: 0.92rem;\n}\n\n${i} .form-feedback.is-error {\n background: #fef2f2;\n border: 1px solid #fecaca;\n color: #991b1b;\n}\n\n@media (max-width: 960px) {\n ${i} {\n grid-template-columns: 1fr;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.RegistrationView=function(){const e=t.getIsCreating(),i=t.getCreateError();r("main-registration-view",s);return n("div",{className:"split-container",[o]:""},n("div",{className:"info-panel"},n("h2",null,"Registration Details"),n("p",null,"Complete the form to add your organization to the Global Organization Registry. Registration requires at least $50,000 in personal funds."),n("ul",{className:"create-feature-list"},n("li",{className:"create-feature-item"},n("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"#10b981","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",className:"create-feature-icon"},n("path",{d:"M20 6L9 17l-5-5"})),"Official Organization Designator"),n("li",{className:"create-feature-item"},n("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"#10b981","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",className:"create-feature-icon"},n("path",{d:"M20 6L9 17l-5-5"})),"Secure Comms Channel"),n("li",{className:"create-feature-item"},n("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"#10b981","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",className:"create-feature-icon"},n("path",{d:"M20 6L9 17l-5-5"})),"Deployment Roster Access"),n("li",{className:"create-feature-item"},n("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"#10b981","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",className:"create-feature-icon"},n("path",{d:"M20 6L9 17l-5-5"})),"After-Action Report Tools")),n("div",{className:"price-tag"},n("span",{className:"price-label"},"Required Registration Fee"),n("span",{className:"price-value"},"$50,000"))),n("div",{className:"form-panel card"},n("h2",null,"Organization Registration"),n("div",{className:"app-form"},n("div",null,n("label",null,"Organization Name"),n("input",{id:"org-create-name",type:"text",placeholder:"e.g. Task Force 141"})),n("div",null,n("label",null,"Organization Type"),n("select",{id:"org-create-type"},n("option",{value:"infantry"},"Infantry / Milsim"),n("option",{value:"aviation"},"Aviation Wing"),n("option",{value:"pmc"},"Private Military Company"),n("option",{value:"support"},"Logistics & Support"))),n("div",{className:"form-actions"},i?n("div",{className:"form-feedback is-error"},i):null,n("button",{type:"button",className:"submit-btn",disabled:e,onClick:()=>{const e={orgName:String(document.getElementById("org-create-name")?.value||"").trim(),type:String(document.getElementById("org-create-type")?.value||"")};a&&"function"==typeof a.requestCreateOrg?a.requestCreateOrg(e):t.failCreate("Registration bridge is not available.")}},e?"Submitting Registration...":"Submit Registration"),n("span",{className:"cancel-link",onClick:()=>t.setView("home")},"Cancel / Return to Main")))))}}(),function(){const e=window.RegistryApp=window.RegistryApp||{},{h:n,ensureScopedStyle:r}=e.runtime,t=e.store,a=e.bridge,o="data-ui-home-view",i=`[${o}]`,s=`\n${i} {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2rem;\n margin-bottom: 2rem;\n}\n\n${i} .home-feedback {\n padding: 0.85rem 1rem;\n border-radius: var(--radius);\n font-size: 0.92rem;\n background: #fef2f2;\n border: 1px solid #fecaca;\n color: #991b1b;\n}\n\n@media (max-width: 960px) {\n ${i} {\n grid-template-columns: 1fr;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.HomeView=function(){const e=t.getIsAuthenticating(),i=t.getLoginError();return r("main-home-view",s),n("div",{className:"content",[o]:""},n("div",{className:"card"},n("h2",null,"Create Organization"),n("p",null,"Establish your Task Force, PMC, or Milsim unit with the Global Organization Network. Registration requires $50,000 in personal funds."),n("button",{onClick:()=>t.setView("create")},"Register")),n("div",{className:"card"},n("h2",null,"Organization Portal"),n("p",null,"Access your unit dashboard to modify rosters, adjust active deployments, and submit after-action reports through the secure field uplink."),i?n("div",{className:"home-feedback"},i):null,n("button",{disabled:e,onClick:()=>{a?a.requestLogin({}):t.failLogin("Login bridge is not available.")}},e?"Opening Portal...":"Login")))}}(),function(){const e=window.RegistryApp=window.RegistryApp||{},{h:n}=e.runtime,r=e.store;e.components=e.components||{},e.components.App=function(){const t=window.SharedUI.componentFns.Navbar,a=window.SharedUI.componentFns.Header,o=window.SharedUI.componentFns.Footer,i=window.SharedUI.componentFns.WindowTitleBar,s=e.componentFns.HomeView,l=e.componentFns.RegistrationView,d=window.OrgPortal&&window.OrgPortal.components?window.OrgPortal.components.App:null,c=r.getView(),m=window.OrgPortal&&window.OrgPortal.getters?window.OrgPortal.getters:null,g=window.OrgPortal&&window.OrgPortal.actions?window.OrgPortal.actions:null,u="create"===c?"Organization Registration":"portal"===c?"Organization Portal":"Entry Hub";function p(){e.bridge&&"function"==typeof e.bridge.close?e.bridge.close({}):r.setView("home")}if("portal"===c&&d){const e=m&&"function"==typeof m.canLeaveOrg&&m.canLeaveOrg();return n("div",{className:"app-shell"},i({kicker:"FORGE ORBIS",title:"Global Organization Network",onClose:p,closeLabel:"Close organization interface"}),t({title:"Global Organization Network",viewLabel:u,actionLabel:e?"Leave Organization":"",onAction:e&&g&&"function"==typeof g.openModal?()=>g.openModal("leave"):null}),n("div",{id:"org-portal-frame-root"}))}let b;return"home"===c?b=s():"create"===c&&(b=l()),n("div",{className:"app-shell"},i({kicker:"FORGE ORBIS",title:"Global Organization Network",onClose:p,closeLabel:"Close organization interface"}),n("main",null,t({title:"Global Organization Network",viewLabel:u}),n("div",{className:"container"},a({title:"Global Organization Network",onTitleClick:()=>r.setView("home")}),b),o({sections:[{title:"Registry Resources",items:["Registration Guidelines","Tax & Fee Schedule","Legal Compliance","Trademark Database"]},{title:"Bureau Support",items:["Office: Sector 7 Admin Block","Hours: 0800 - 1600 (GST)","Helpdesk: 555-01-REGISTRY","support@org-bureau.gov"]}]})))}}(),function(){const e=window.ForgeWebUI,n=window.RegistryApp,r=window.OrgPortal,t=[{id:"org-portal-frame-root",preserveScroll:!0,render:()=>r.components.App()},{id:"org-portal-toast-root",preserveScroll:!1,render:()=>r.componentFns.TreasuryNoticeLayer()},{id:"org-overview-card-root",preserveScroll:!1,render:()=>r.componentFns.OverviewCard()},{id:"org-fleet-card-root",preserveScroll:!0,render:()=>r.componentFns.FleetCard()},{id:"org-treasury-card-root",preserveScroll:!1,render:()=>r.componentFns.TreasuryCard()},{id:"org-members-card-root",preserveScroll:!0,render:()=>r.componentFns.MembersCard()},{id:"org-assets-card-root",preserveScroll:!0,render:()=>r.componentFns.AssetsCard()},{id:"org-activity-card-root",preserveScroll:!0,render:()=>r.componentFns.ActivityCard()},{id:"org-portal-modal-root",preserveScroll:!1,render:()=>r.componentFns.ModalLayer()}];e.createApp({name:"org",root:"#app",setup({root:r}){const a=function(){const n=new Map;return{sync:function(){t.forEach(r=>{const t=document.getElementById(r.id),a=n.get(r.id);if(!t)return void(a&&(a.handle.dispose(),n.delete(r.id)));if(a&&a.container===t)return;a&&a.handle.dispose();const o=e.mount(t,r.render,{preserveScroll:r.preserveScroll});n.set(r.id,{container:t,handle:o})})}}}();e.mount(r,()=>n.components.App(),{preserveScroll:!1}),n.bridge.ready({loaded:!0}),e.effect(()=>{n.store.getView(),requestAnimationFrame(()=>{a.sync()})})}}).start()}(); \ No newline at end of file diff --git a/arma/client/addons/org/ui/src/bootstrap.js b/arma/client/addons/org/ui/src/bootstrap.js new file mode 100644 index 0000000..474ba30 --- /dev/null +++ b/arma/client/addons/org/ui/src/bootstrap.js @@ -0,0 +1,114 @@ +(function () { + const ForgeWebUI = window.ForgeWebUI; + const RegistryApp = window.RegistryApp; + const OrgPortal = window.OrgPortal; + const islandDefinitions = [ + { + id: "org-portal-frame-root", + preserveScroll: true, + render: () => OrgPortal.components.App(), + }, + { + id: "org-portal-toast-root", + preserveScroll: false, + render: () => OrgPortal.componentFns.TreasuryNoticeLayer(), + }, + { + id: "org-overview-card-root", + preserveScroll: false, + render: () => OrgPortal.componentFns.OverviewCard(), + }, + { + id: "org-fleet-card-root", + preserveScroll: true, + render: () => OrgPortal.componentFns.FleetCard(), + }, + { + id: "org-treasury-card-root", + preserveScroll: false, + render: () => OrgPortal.componentFns.TreasuryCard(), + }, + { + id: "org-members-card-root", + preserveScroll: true, + render: () => OrgPortal.componentFns.MembersCard(), + }, + { + id: "org-assets-card-root", + preserveScroll: true, + render: () => OrgPortal.componentFns.AssetsCard(), + }, + { + id: "org-activity-card-root", + preserveScroll: true, + render: () => OrgPortal.componentFns.ActivityCard(), + }, + { + id: "org-portal-modal-root", + preserveScroll: false, + render: () => OrgPortal.componentFns.ModalLayer(), + }, + ]; + + function createIslandManager() { + const mounts = new Map(); + + function sync() { + islandDefinitions.forEach((definition) => { + const container = document.getElementById(definition.id); + const current = mounts.get(definition.id); + + if (!container) { + if (current) { + current.handle.dispose(); + mounts.delete(definition.id); + } + return; + } + + if (current && current.container === container) { + return; + } + + if (current) { + current.handle.dispose(); + } + + const handle = ForgeWebUI.mount(container, definition.render, { + preserveScroll: definition.preserveScroll, + }); + mounts.set(definition.id, { + container, + handle, + }); + }); + } + + return { + sync, + }; + } + + const app = ForgeWebUI.createApp({ + name: "org", + root: "#app", + setup({ root }) { + const islandManager = createIslandManager(); + + ForgeWebUI.mount(root, () => RegistryApp.components.App(), { + preserveScroll: false, + }); + RegistryApp.bridge.ready({ loaded: true }); + + ForgeWebUI.effect(() => { + RegistryApp.store.getView(); + + requestAnimationFrame(() => { + islandManager.sync(); + }); + }); + }, + }); + + app.start(); +})(); diff --git a/arma/client/addons/org/ui/src/bridge.js b/arma/client/addons/org/ui/src/bridge.js new file mode 100644 index 0000000..adb92c5 --- /dev/null +++ b/arma/client/addons/org/ui/src/bridge.js @@ -0,0 +1,397 @@ +(function () { + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const store = RegistryApp.store; + const bridge = window.ForgeWebUI.createBridge({ + closeEvent: "org::close", + globalName: "ForgeBridge", + readyEvent: "org::ready", + }); + + function sendEvent(event, data) { + return bridge.send(event, data); + } + + function requestLogin(credentials) { + store.startLogin(); + + const sent = sendEvent("org::login::request", credentials); + if (sent) { + return; + } + + store.failLogin("Arma login bridge is unavailable."); + } + + function requestCreateOrg(registration) { + store.startCreate(); + + const sent = sendEvent("org::create::request", registration); + if (sent) { + return; + } + + store.failCreate("Arma registration bridge is unavailable."); + } + + function requestDisbandOrg() { + const sent = sendEvent("org::disband::request", {}); + if (sent) { + return; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma disband bridge is unavailable.", + ); + } + } + + function requestLeaveOrg() { + const sent = sendEvent("org::leave::request", {}); + if (sent) { + return; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma leave bridge is unavailable.", + ); + } + } + + function requestCreditLine(payload) { + const sent = sendEvent("org::credit::request", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma credit line bridge is unavailable.", + ); + } + + return false; + } + + function requestPayroll(payload) { + const sent = sendEvent("org::payroll::request", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma payroll bridge is unavailable.", + ); + } + + return false; + } + + function requestTreasuryTransfer(payload) { + const sent = sendEvent("org::transfer::request", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma treasury transfer bridge is unavailable.", + ); + } + + return false; + } + + function requestInvitePlayer(payload) { + const sent = sendEvent("org::invite::request", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma organization invite bridge is unavailable.", + ); + } + + return false; + } + + function requestAcceptInvite(payload) { + const sent = sendEvent("org::invite::accept", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma organization invite bridge is unavailable.", + ); + } + + return false; + } + + function requestDeclineInvite(payload) { + const sent = sendEvent("org::invite::decline", payload); + if (sent) { + return true; + } + + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + "Arma organization invite bridge is unavailable.", + ); + } + + return false; + } + + bridge.on("org::login::success", (payloadData) => { + store.completeLogin(payloadData); + }); + + bridge.on("org::login::failure", (payloadData) => { + store.failLogin(payloadData.message || "Authentication failed."); + }); + + bridge.on("org::create::success", (payloadData) => { + store.completeCreate(payloadData); + }); + + bridge.on("org::create::failure", (payloadData) => { + store.failCreate( + payloadData.message || "Organization registration failed.", + ); + }); + + bridge.on("org::sync", (payloadData) => { + if (store && typeof store.hydratePortal === "function") { + store.hydratePortal(payloadData); + } + }); + + bridge.on("org::credit::success", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "success", + payloadData.message || "Credit line assigned.", + ); + } + }); + + bridge.on("org::credit::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Unable to assign credit line.", + ); + } + }); + + bridge.on("org::treasury::success", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "success", + payloadData.message || "Treasury action completed.", + ); + } + }); + + bridge.on("org::treasury::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Treasury action failed.", + ); + } + }); + + bridge.on("org::invite::success", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "success", + payloadData.message || "Organization invite sent.", + ); + } + }); + + bridge.on("org::invite::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Unable to send organization invite.", + ); + } + }); + + bridge.on("org::invite::decision::success", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "success", + payloadData.message || "Organization invite updated.", + ); + } + }); + + bridge.on("org::invite::decision::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Unable to update organization invite.", + ); + } + }); + + bridge.on("org::member::creditUpdated", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (!OrgPortal || !OrgPortal.store) { + return; + } + + OrgPortal.store.setCreditLines((currentLines) => { + const nextLine = { + amount: payloadData.availableAmount || payloadData.amount || 0, + amountDue: payloadData.amountDue || 0, + approvedAmount: + payloadData.approvedAmount || + payloadData.availableAmount || + payloadData.amount || + 0, + availableAmount: + payloadData.availableAmount || payloadData.amount || 0, + interestRate: payloadData.interestRate || 0.1, + member: payloadData.memberName || "", + outstandingPrincipal: payloadData.outstandingPrincipal || 0, + uid: payloadData.memberUid || "", + }; + const matchIndex = currentLines.findIndex( + (line) => line.uid === nextLine.uid, + ); + + if (matchIndex === -1) { + return [...currentLines, nextLine]; + } + + return currentLines.map((line, index) => + index === matchIndex ? nextLine : line, + ); + }); + }); + + bridge.on("org::disband::success", () => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + OrgPortal.store.setOrgDisbanded(true); + } + }); + + bridge.on("org::disband::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Organization disbanding failed.", + ); + } + }); + + bridge.on("org::leave::success", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + store.failLogin( + payloadData.message || "You have left the organization.", + ); + store.setView("home"); + }); + + bridge.on("org::leave::failure", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + if (OrgPortal && OrgPortal.actions) { + OrgPortal.actions.showTreasuryNotice( + "error", + payloadData.message || "Unable to leave the organization.", + ); + } + }); + + bridge.on("org::portal::revoked", (payloadData) => { + const OrgPortal = window.OrgPortal; + if (OrgPortal && OrgPortal.store) { + OrgPortal.store.setModal(null); + } + + store.failLogin( + payloadData.message || + "Organization access is no longer available.", + ); + store.setView("home"); + }); + + RegistryApp.bridge = { + close: bridge.close, + ready: bridge.ready, + receive: bridge.receive, + requestLogin, + requestCreateOrg, + requestDisbandOrg, + requestLeaveOrg, + requestCreditLine, + requestPayroll, + requestTreasuryTransfer, + requestInvitePlayer, + requestAcceptInvite, + requestDeclineInvite, + sendEvent, + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/AppShell.js b/arma/client/addons/org/ui/src/components/AppShell.js new file mode 100644 index 0000000..185b369 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/AppShell.js @@ -0,0 +1,134 @@ +(function () { + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h } = RegistryApp.runtime; + const store = RegistryApp.store; + + RegistryApp.components = RegistryApp.components || {}; + + RegistryApp.components.App = function App() { + const Navbar = window.SharedUI.componentFns.Navbar; + const Header = window.SharedUI.componentFns.Header; + const Footer = window.SharedUI.componentFns.Footer; + const WindowTitleBar = window.SharedUI.componentFns.WindowTitleBar; + const HomeView = RegistryApp.componentFns.HomeView; + const RegistrationView = RegistryApp.componentFns.RegistrationView; + const PortalApp = + window.OrgPortal && window.OrgPortal.components + ? window.OrgPortal.components.App + : null; + + const view = store.getView(); + const portalGetters = + window.OrgPortal && window.OrgPortal.getters + ? window.OrgPortal.getters + : null; + const portalActions = + window.OrgPortal && window.OrgPortal.actions + ? window.OrgPortal.actions + : null; + const viewLabel = + view === "create" + ? "Organization Registration" + : view === "portal" + ? "Organization Portal" + : "Entry Hub"; + const footerSections = [ + { + title: "Registry Resources", + items: [ + "Registration Guidelines", + "Tax & Fee Schedule", + "Legal Compliance", + "Trademark Database", + ], + }, + { + title: "Bureau Support", + items: [ + "Office: Sector 7 Admin Block", + "Hours: 0800 - 1600 (GST)", + "Helpdesk: 555-01-REGISTRY", + "support@org-bureau.gov", + ], + }, + ]; + + function closeRegistry() { + if ( + RegistryApp.bridge && + typeof RegistryApp.bridge.close === "function" + ) { + RegistryApp.bridge.close({}); + return; + } + + store.setView("home"); + } + + if (view === "portal" && PortalApp) { + const canLeaveOrg = + portalGetters && + typeof portalGetters.canLeaveOrg === "function" && + portalGetters.canLeaveOrg(); + + return h( + "div", + { className: "app-shell" }, + WindowTitleBar({ + kicker: "FORGE ORBIS", + title: "Global Organization Network", + onClose: closeRegistry, + closeLabel: "Close organization interface", + }), + Navbar({ + title: "Global Organization Network", + viewLabel, + actionLabel: canLeaveOrg ? "Leave Organization" : "", + onAction: + canLeaveOrg && + portalActions && + typeof portalActions.openModal === "function" + ? () => portalActions.openModal("leave") + : null, + }), + h("div", { id: "org-portal-frame-root" }), + ); + } + + let mainContent; + if (view === "home") { + mainContent = HomeView(); + } else if (view === "create") { + mainContent = RegistrationView(); + } + + return h( + "div", + { className: "app-shell" }, + WindowTitleBar({ + kicker: "FORGE ORBIS", + title: "Global Organization Network", + onClose: closeRegistry, + closeLabel: "Close organization interface", + }), + h( + "main", + null, + Navbar({ + title: "Global Organization Network", + viewLabel, + }), + h( + "div", + { className: "container" }, + Header({ + title: "Global Organization Network", + onTitleClick: () => store.setView("home"), + }), + mainContent, + ), + Footer({ sections: footerSections }), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/footer.js b/arma/client/addons/org/ui/src/components/footer.js new file mode 100644 index 0000000..4401f4b --- /dev/null +++ b/arma/client/addons/org/ui/src/components/footer.js @@ -0,0 +1,32 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h } = RegistryApp.runtime; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.Footer = function Footer({ sections = [] }) { + return h( + "div", + { className: "footer" }, + h( + "div", + { className: "wrapper" }, + ...sections.map((section) => + h( + "div", + null, + h("h3", null, section.title), + h( + "ul", + { style: { listStyleType: "none", padding: 0 } }, + ...(section.items || []).map((item) => + h("li", null, item), + ), + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/header.js b/arma/client/addons/org/ui/src/components/header.js new file mode 100644 index 0000000..6734ac1 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/header.js @@ -0,0 +1,27 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h } = RegistryApp.runtime; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.Header = function Header({ + title, + subtitle = "Organization Registration & Management Portal", + onTitleClick = null, + }) { + return h( + "div", + { className: "header" }, + h( + "h1", + { + style: { cursor: onTitleClick ? "pointer" : "default" }, + onClick: onTitleClick, + }, + title, + ), + h("p", null, subtitle), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/hero.js b/arma/client/addons/org/ui/src/components/hero.js new file mode 100644 index 0000000..a022e70 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/hero.js @@ -0,0 +1,35 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h } = OrgPortal.runtime; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.Hero = function Hero({ + className = "", + kicker = "", + title = "", + subtitle = "", + meta = "", + }) { + const finalClassName = [ + "card org-panel org-span-12 org-page-header", + className, + ] + .filter(Boolean) + .join(" "); + + return h( + "section", + { className: finalClassName }, + h( + "div", + { className: "org-page-heading" }, + h("span", { className: "org-page-kicker" }, kicker), + h("h1", { className: "org-page-title" }, title), + h("p", { className: "org-page-subtitle" }, subtitle), + h("span", { className: "org-page-meta" }, meta), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/modal.js b/arma/client/addons/org/ui/src/components/modal.js new file mode 100644 index 0000000..862b115 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/modal.js @@ -0,0 +1,190 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h, ensureScopedStyle } = RegistryApp.runtime; + const scopeAttr = "data-ui-modal"; + const scopeSelector = `[${scopeAttr}]`; + const modalCss = ` +${scopeSelector} { + position: fixed; + inset: 0; + background: rgb(15 23 42 / 0.38); + display: flex; + align-items: center; + justify-content: center; + padding: 1.5rem; + z-index: 20; +} + +${scopeSelector} .app-modal-card { + width: min(100%, 30rem); + margin-bottom: 0; + text-align: left; +} + +${scopeSelector} .app-modal-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +${scopeSelector} .app-modal-title { + margin: 0; + color: var(--primary-hover); + font-size: 1.45rem; +} + +${scopeSelector} .app-modal-close { + width: 2.25rem; + height: 2.25rem; + padding: 0; + background: var(--bg-surface); + color: var(--text-main); + border: 1px solid var(--border); + box-shadow: none; + transform: none; +} + +${scopeSelector} .app-modal-close:hover { + background: var(--bg-surface-hover); + color: var(--text-main); + box-shadow: none; + transform: none; +} + +${scopeSelector} .app-modal-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +${scopeSelector} .app-modal-form label { + display: block; + margin-bottom: 0.5rem; + color: var(--text-muted); + font-weight: 500; + font-size: 0.9rem; +} + +${scopeSelector} .app-modal-form input, +${scopeSelector} .app-modal-form select { + width: 100%; + padding: 0.75rem; + border-radius: var(--radius); + border: 1px solid var(--border); + background: var(--bg-app); + color: var(--text-main); + font-family: inherit; + font-size: 1rem; + box-sizing: border-box; + transition: border-color 0.2s, box-shadow 0.2s; +} + +${scopeSelector} .app-modal-form input:focus, +${scopeSelector} .app-modal-form select:focus { + outline: none; + border-color: var(--primary); + box-shadow: 0 0 0 2px rgb(71 85 105 / 0.12); +} + +${scopeSelector} .app-modal-form input:disabled, +${scopeSelector} .app-modal-form select:disabled { + background: #f1f5f9; + color: var(--text-muted); + cursor: not-allowed; +} + +${scopeSelector} .app-modal-actions { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 0.75rem; + margin-top: 0.5rem; +} + +${scopeSelector} .app-modal-actions button + button, +${scopeSelector} .app-modal-danger-actions button + button { + margin-left: 0; +} + +${scopeSelector} .app-modal-danger { + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 1rem; + padding: 1rem; + border: 1px solid #fecaca; + border-radius: var(--radius); + background: #fff1f2; + align-items: flex-start; +} + +${scopeSelector} .app-modal-danger p { + margin: 0; + color: var(--text-main); +} + +${scopeSelector} .app-modal-danger-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; +} + +@media (max-width: 960px) { + ${scopeSelector} .app-modal-head, + ${scopeSelector} .app-modal-danger { + flex-direction: column; + align-items: flex-start; + } +} +`; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.Modal = function Modal({ + title = "", + body = null, + onClose = null, + }) { + ensureScopedStyle("shared-modal", modalCss); + + return h( + "div", + { + className: "app-modal-backdrop", + [scopeAttr]: "", + onClick: (e) => { + if (e.target === e.currentTarget && onClose) { + onClose(); + } + }, + }, + h( + "div", + { className: "card app-modal-card" }, + h( + "div", + { className: "app-modal-head" }, + h( + "div", + null, + h("h2", { className: "app-modal-title" }, title), + ), + h( + "button", + { + type: "button", + className: "app-modal-close", + onClick: onClose, + "aria-label": "Close dialog", + }, + "x", + ), + ), + body, + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/navbar.js b/arma/client/addons/org/ui/src/components/navbar.js new file mode 100644 index 0000000..427841b --- /dev/null +++ b/arma/client/addons/org/ui/src/components/navbar.js @@ -0,0 +1,131 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h, ensureScopedStyle } = RegistryApp.runtime; + const scopeAttr = "data-ui-navbar"; + const scopeSelector = `[${scopeAttr}]`; + const navbarCss = ` +${scopeSelector} { + background: var(--bg-surface); + border-bottom: 1px solid var(--border); + box-shadow: var(--shadow); +} + +${scopeSelector} .app-navbar-inner { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 1200px; + width: 100%; + margin: 0 auto; + padding: 1rem 2rem; + box-sizing: border-box; +} + +${scopeSelector} .app-navbar-brand { + display: flex; + flex-direction: column; + gap: 0.125rem; +} + +${scopeSelector} .app-navbar-kicker { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + font-weight: 600; +} + +${scopeSelector} .app-navbar-title { + font-size: 1.25rem; + font-weight: 700; + color: var(--primary-hover); + letter-spacing: -0.025em; +} + +${scopeSelector} .app-navbar-actions { + display: flex; + align-items: center; + gap: 1.5rem; +} + +${scopeSelector} .app-navbar-view { + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-muted); + font-weight: 600; +} + +${scopeSelector} .app-close-btn { + background: transparent; + color: var(--text-muted); + border: 1px solid var(--border); + padding: 0.5rem 1rem; + font-size: 0.85rem; +} + +${scopeSelector} .app-close-btn:hover { + background: var(--bg-surface-hover); + color: var(--primary-hover); + border-color: var(--primary); + transform: none; + box-shadow: none; +} + +@media (max-width: 960px) { + ${scopeSelector} .app-navbar-inner { + flex-direction: column; + align-items: flex-start; + padding: 1rem 1.5rem; + } + + ${scopeSelector} .app-navbar-actions { + align-items: flex-start; + } +} +`; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.Navbar = function Navbar({ + kicker = "ORBIS", + title = "", + viewLabel = "", + actionLabel = "", + onAction = null, + }) { + ensureScopedStyle("shared-navbar", navbarCss); + + return h( + "nav", + { className: "app-navbar", [scopeAttr]: "" }, + h( + "div", + { className: "app-navbar-inner" }, + h( + "div", + { className: "app-navbar-brand" }, + h("span", { className: "app-navbar-kicker" }, kicker), + h("span", { className: "app-navbar-title" }, title), + ), + h( + "div", + { className: "app-navbar-actions" }, + h("span", { className: "app-navbar-view" }, viewLabel), + actionLabel && typeof onAction === "function" + ? h( + "button", + { + type: "button", + className: "app-close-btn", + onClick: onAction, + }, + actionLabel, + ) + : null, + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/panelCard.js b/arma/client/addons/org/ui/src/components/panelCard.js new file mode 100644 index 0000000..02b6cae --- /dev/null +++ b/arma/client/addons/org/ui/src/components/panelCard.js @@ -0,0 +1,97 @@ +(function () { + const SharedUI = (window.SharedUI = window.SharedUI || {}); + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h, ensureScopedStyle } = RegistryApp.runtime; + const scopeAttr = "data-ui-panel-card"; + const scopeSelector = `[${scopeAttr}]`; + const panelCardCss = ` +${scopeSelector} { + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; +} + +${scopeSelector} .org-panel-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1.5rem; +} + +${scopeSelector} .org-panel-body { + display: flex; + flex: 1 1 auto; + flex-direction: column; + min-height: 0; +} + +${scopeSelector} .org-eyebrow { + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--text-muted); + margin-bottom: 0.4rem; +} + +${scopeSelector} .org-panel-title { + margin: 0; + color: var(--primary-hover); + font-size: 1.45rem; +} + +${scopeSelector} .org-panel-subtitle { + margin: 0.35rem 0 0; + color: var(--text-muted); + font-size: 0.95rem; +} + +@media (max-width: 960px) { + ${scopeSelector} .org-panel-head { + flex-direction: column; + align-items: flex-start; + } +} +`; + + SharedUI.componentFns = SharedUI.componentFns || {}; + + SharedUI.componentFns.PanelCard = function PanelCard({ + className = "", + eyebrow = "", + title = "", + subtitle = "", + headerExtras = null, + body = null, + rootProps = {}, + }) { + const finalClassName = ["card org-panel", className] + .filter(Boolean) + .join(" "); + ensureScopedStyle("shared-panel-card", panelCardCss); + + return h( + "section", + { className: finalClassName, [scopeAttr]: "", ...rootProps }, + h( + "div", + { className: "org-panel-head" }, + h( + "div", + null, + eyebrow + ? h("div", { className: "org-eyebrow" }, eyebrow) + : null, + h("h2", { className: "org-panel-title" }, title), + subtitle + ? h("p", { className: "org-panel-subtitle" }, subtitle) + : null, + ), + headerExtras, + ), + h("div", { className: "org-panel-body" }, body), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/activityCard.js b/arma/client/addons/org/ui/src/components/portal/activityCard.js new file mode 100644 index 0000000..19316aa --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/activityCard.js @@ -0,0 +1,80 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const scopeAttr = "data-ui-activity-card"; + const scopeSelector = `[${scopeAttr}]`; + const activityCardCss = ` +${scopeSelector} .org-activity-list { + display: flex; + flex-direction: column; + flex: 1; + gap: 0.85rem; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-activity-row { + padding: 1rem; + border: 1px solid var(--border); + border-left: 3px solid #94a3b8; + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-activity-row:nth-child(even) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(148 163 184 / 0.45); + border-left-color: #64748b; +} + +${scopeSelector} .org-activity-row p { + margin: 0; + color: var(--text-main); +} + +${scopeSelector} .org-activity-time { + display: inline-block; + margin-bottom: 0.35rem; + color: var(--text-muted); + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.05em; + text-transform: uppercase; +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.ActivityCard = function ActivityCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + const activity = OrgPortal.store.getActivity(); + ensureScopedStyle("portal-activity-card", activityCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-6", + title: "Command Feed", + subtitle: "Recent organization-level actions and updates.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-activity-list" }, + ...activity.map((item) => + h( + "article", + { className: "org-activity-row" }, + h( + "span", + { className: "org-activity-time" }, + item.time, + ), + h("p", null, item.text), + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/assetsCard.js b/arma/client/addons/org/ui/src/components/portal/assetsCard.js new file mode 100644 index 0000000..f33ea67 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/assetsCard.js @@ -0,0 +1,95 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const getters = OrgPortal.getters; + const scopeAttr = "data-ui-assets-card"; + const scopeSelector = `[${scopeAttr}]`; + const assetsCardCss = ` +${scopeSelector} .org-simple-list { + display: flex; + flex-direction: column; + flex: 1; + gap: 0.85rem; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-simple-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-simple-row:nth-child(even) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(148 163 184 / 0.45); +} + +${scopeSelector} .org-simple-name { + color: var(--primary-hover); +} + +${scopeSelector} .org-simple-meta { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 1rem; +} + +@media (max-width: 960px) { + ${scopeSelector} .org-simple-row { + flex-direction: column; + align-items: flex-start; + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.AssetsCard = function AssetsCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + const SimpleStat = OrgPortal.componentFns.SimpleStat; + const assets = OrgPortal.store.getAssets(); + ensureScopedStyle("portal-assets-card", assetsCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-7", + title: "Assets", + subtitle: "Inventory supplies and equipment with quantity totals.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-simple-list" }, + ...assets.map((asset) => + h( + "article", + { className: "org-simple-row" }, + h( + "strong", + { className: "org-simple-name" }, + asset.name, + ), + h( + "div", + { className: "org-simple-meta" }, + SimpleStat( + "Type", + getters.formatAssetType(asset.type), + ), + SimpleStat("Quantity", asset.quantity), + ), + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/dangerCard.js b/arma/client/addons/org/ui/src/components/portal/dangerCard.js new file mode 100644 index 0000000..22027fb --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/dangerCard.js @@ -0,0 +1,70 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const getters = OrgPortal.getters; + const actions = OrgPortal.actions; + const scopeAttr = "data-ui-danger-card"; + const scopeSelector = `[${scopeAttr}]`; + const dangerCardCss = ` +${scopeSelector} { + border-color: #fecaca; + background: linear-gradient(180deg, #ffffff 0%, #fff7f7 100%); +} + +${scopeSelector} .org-danger-copy { + margin-bottom: 1rem; +} + +${scopeSelector} .org-danger-copy strong, +${scopeSelector} .org-danger-copy p { + display: block; +} + +${scopeSelector} .org-danger-copy p { + margin: 0.4rem 0 0; + color: var(--text-muted); +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.DangerCard = function DangerCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + ensureScopedStyle("portal-danger-card", dangerCardCss); + + if (!getters.canDisbandOrg()) { + return null; + } + + return PanelCard({ + className: "org-span-12 org-danger-panel", + title: "Organization Controls", + subtitle: + "Leader-only actions for membership and permanent organization removal.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + null, + h( + "div", + { className: "org-danger-copy" }, + h("strong", null, "Disband organization"), + h( + "p", + null, + "This removes the organization and revokes access to the portal for all members.", + ), + ), + h( + "button", + { + type: "button", + className: "org-danger-btn", + onClick: () => actions.openModal("disband"), + }, + "Disband Organization", + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/fleetCard.js b/arma/client/addons/org/ui/src/components/portal/fleetCard.js new file mode 100644 index 0000000..a6b368b --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/fleetCard.js @@ -0,0 +1,97 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const getters = OrgPortal.getters; + const scopeAttr = "data-ui-fleet-card"; + const scopeSelector = `[${scopeAttr}]`; + const fleetCardCss = ` +${scopeSelector} .org-simple-list { + display: flex; + flex-direction: column; + flex: 1; + gap: 0.85rem; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-simple-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-simple-row:nth-child(even) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(148 163 184 / 0.45); +} + +${scopeSelector} .org-simple-name { + color: var(--primary-hover); +} + +${scopeSelector} .org-simple-meta { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 1rem; +} + +@media (max-width: 960px) { + ${scopeSelector} .org-simple-row { + flex-direction: column; + align-items: flex-start; + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.FleetCard = function FleetCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + const SimpleStat = OrgPortal.componentFns.SimpleStat; + const fleet = OrgPortal.store.getFleet(); + ensureScopedStyle("portal-fleet-card", fleetCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-7", + title: "Fleet", + subtitle: + "Individual vehicles with type, status, and overall damage.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-simple-list" }, + ...fleet.map((unit) => + h( + "article", + { className: "org-simple-row" }, + h( + "strong", + { className: "org-simple-name" }, + unit.name, + ), + h( + "div", + { className: "org-simple-meta" }, + SimpleStat( + "Type", + getters.formatVehicleType(unit.type), + ), + SimpleStat("Status", unit.status), + SimpleStat("Damage", unit.damage), + ), + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/futureCard.js b/arma/client/addons/org/ui/src/components/portal/futureCard.js new file mode 100644 index 0000000..343835f --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/futureCard.js @@ -0,0 +1,126 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const scopeAttr = "data-ui-future-card"; + const ROADMAP = [ + { + name: "Contracts Board", + status: "Planned", + detail: "Track payouts, assignments, and claim approvals.", + }, + { + name: "Diplomacy", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + { + name: "Logistics Queue", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + { + name: "Permissions", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + ]; + const scopeSelector = `[${scopeAttr}]`; + const futureCardCss = ` +${scopeSelector} .org-roadmap-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + flex: 1; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-roadmap-card { + padding: 1rem; + display: flex; + flex-direction: column; + gap: 0.7rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-roadmap-card:nth-child(4n + 2), +${scopeSelector} .org-roadmap-card:nth-child(4n + 3) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(100 116 139 / 0.4); +} + +${scopeSelector} .org-roadmap-card p { + margin: 0; + color: var(--text-main); +} + +${scopeSelector} .org-list-tag { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.2rem 0.55rem; + border-radius: 999px; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + background: #e2e8f0; + color: var(--primary-hover); +} + +${scopeSelector} .org-roadmap-card:nth-child(4n + 2) .org-list-tag, +${scopeSelector} .org-roadmap-card:nth-child(4n + 3) .org-list-tag { + background: #cbd5e1; + color: #1e293b; +} + +@media (max-width: 960px) { + ${scopeSelector} .org-roadmap-grid { + grid-template-columns: 1fr; + } + + ${scopeSelector} .org-roadmap-card:nth-child(4n + 3) { + background: #f8fafc; + border-color: var(--border); + } + + ${scopeSelector} .org-roadmap-card:nth-child(4n + 3) .org-list-tag { + background: #e2e8f0; + color: var(--primary-hover); + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.FutureCard = function FutureCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + ensureScopedStyle("portal-future-card", futureCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-6", + title: "Expansion Slots", + subtitle: + "Potential modules are tagged by status such as Planned, In Design, In Review, and Future Review.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-roadmap-grid" }, + ...ROADMAP.map((item) => + h( + "article", + { className: "org-roadmap-card" }, + h("span", { className: "org-list-tag" }, item.status), + h("strong", null, item.name), + h("p", null, item.detail), + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/membersCard.js b/arma/client/addons/org/ui/src/components/portal/membersCard.js new file mode 100644 index 0000000..14c3f72 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/membersCard.js @@ -0,0 +1,484 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const store = OrgPortal.store; + const getters = OrgPortal.getters; + const actions = OrgPortal.actions; + const scopeAttr = "data-ui-members-card"; + const scopeSelector = `[${scopeAttr}]`; + const membersCardCss = ` +${scopeSelector} .org-name-list { + display: flex; + flex-direction: column; + flex: 1; + gap: 0.85rem; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-members-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; + position: relative; +} + +${scopeSelector} .org-members-copy { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +${scopeSelector} .org-members-kicker { + margin: 0; + font-size: 0.85rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text-muted); +} + +${scopeSelector} .org-members-subtitle { + margin: 0; + font-size: 0.9rem; + color: var(--text-muted); +} + +${scopeSelector} .org-members-tools { + display: flex; + align-items: center; + gap: 0.5rem; + margin-left: auto; +} + +${scopeSelector} .org-tool-btn { + position: relative; + width: 2.4rem; + height: 2.4rem; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; +} + +${scopeSelector} .org-tool-badge { + position: absolute; + top: -0.25rem; + right: -0.25rem; + min-width: 1.1rem; + height: 1.1rem; + padding: 0 0.2rem; + border-radius: 999px; + background: #b91c1c; + color: white; + font-size: 0.68rem; + font-weight: 700; + display: inline-flex; + align-items: center; + justify-content: center; +} + +${scopeSelector} .org-invite-menu { + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + width: min(24rem, 100%); + max-height: 22rem; + overflow: auto; + padding: 0.75rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: white; + box-shadow: 0 18px 45px rgb(15 23 42 / 0.18); + z-index: 4; +} + +${scopeSelector} .org-invite-menu-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 0.75rem; +} + +${scopeSelector} .org-invite-menu-title { + margin: 0; + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); +} + +${scopeSelector} .org-invite-menu-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +${scopeSelector} .org-invite-row, +${scopeSelector} .org-name-row { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 1rem; + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-name-row:nth-child(even) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(148 163 184 / 0.45); +} + +${scopeSelector} .org-name-row button { + margin-left: auto; +} + +${scopeSelector} .org-name-copy { + display: flex; + flex-direction: column; + gap: 0.2rem; +} + +${scopeSelector} .org-name-meta { + font-size: 0.8rem; + color: var(--text-muted); +} + +${scopeSelector} .org-inline-actions, +${scopeSelector} .org-invite-actions { + display: flex; + align-items: center; + gap: 0.5rem; + margin-left: auto; +} + +${scopeSelector} .org-members-empty { + margin: 0; + font-size: 0.9rem; + color: var(--text-muted); +} + +@media (max-width: 960px) { + ${scopeSelector} .org-members-head { + flex-direction: column; + align-items: flex-start; + } + + ${scopeSelector} .org-members-tools { + margin-left: 0; + } + + ${scopeSelector} .org-invite-menu { + left: 0; + right: auto; + width: 100%; + } + + ${scopeSelector} .org-name-row, + ${scopeSelector} .org-invite-row { + flex-direction: column; + align-items: flex-start; + } + + ${scopeSelector} .org-name-row button, + ${scopeSelector} .org-inline-actions, + ${scopeSelector} .org-invite-actions { + margin-left: 0; + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.MembersCard = function MembersCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + const members = store.getMembers(); + const pendingInvites = store.getPendingInvites(); + const inviteMenuOpen = store.getInviteMenuOpen(); + const allowMemberManagement = getters.canManageMembers(); + ensureScopedStyle("portal-members-card", membersCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-5", + title: "Members", + subtitle: + "Current roster listing. The organization owner and your own member entry cannot be removed.", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-name-list" }, + h( + "div", + { className: "org-members-head" }, + h( + "div", + { className: "org-members-copy" }, + h("h4", { className: "org-members-kicker" }, "Roster"), + h( + "p", + { className: "org-members-subtitle" }, + "Manage membership and review incoming organization invites.", + ), + ), + h( + "div", + { className: "org-members-tools" }, + h( + "button", + { + type: "button", + className: + "org-secondary-btn org-icon-btn org-tool-btn", + title: "Pending invitations", + "aria-label": "Pending invitations", + onClick: () => actions.toggleInviteMenu(), + }, + h( + "svg", + { + className: "org-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true", + }, + h("path", { + d: "M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 1 0-12 0v3.2a2 2 0 0 1-.6 1.4L4 17h5", + }), + h("path", { d: "M9.73 21a2 2 0 0 0 4.54 0" }), + ), + pendingInvites.length > 0 + ? h( + "span", + { className: "org-tool-badge" }, + String(pendingInvites.length), + ) + : null, + ), + allowMemberManagement + ? h( + "button", + { + type: "button", + className: + "org-secondary-btn org-icon-btn org-tool-btn", + title: "Invite player", + "aria-label": "Invite player", + onClick: () => + actions.openModal("invite"), + }, + h( + "svg", + { + className: "org-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true", + }, + h("path", { d: "M12 5v14" }), + h("path", { d: "M5 12h14" }), + ), + ) + : null, + inviteMenuOpen + ? h( + "div", + { className: "org-invite-menu" }, + h( + "div", + { className: "org-invite-menu-head" }, + h( + "h4", + { + className: + "org-invite-menu-title", + }, + "Pending Invites", + ), + h( + "button", + { + type: "button", + className: + "org-secondary-btn org-icon-btn org-tool-btn", + title: "Close invites", + "aria-label": "Close invites", + onClick: () => + actions.closeInviteMenu(), + }, + h( + "svg", + { + className: "org-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true", + }, + h("path", { d: "M18 6 6 18" }), + h("path", { d: "m6 6 12 12" }), + ), + ), + ), + pendingInvites.length === 0 + ? h( + "p", + { + className: "org-members-empty", + }, + "No incoming organization invites.", + ) + : h( + "div", + { + className: + "org-invite-menu-list", + }, + ...pendingInvites.map((invite) => + h( + "article", + { + className: + "org-invite-row", + }, + h( + "div", + { + className: + "org-name-copy", + }, + h( + "strong", + null, + invite.orgName || + "Unknown Organization", + ), + h( + "span", + { + className: + "org-name-meta", + }, + "Invited by ", + invite.inviterName || + "Unknown", + ), + ), + h( + "div", + { + className: + "org-invite-actions", + }, + h( + "button", + { + type: "button", + className: + "org-secondary-btn", + onClick: () => + actions.declineInvite( + String( + invite.orgId || + "", + ), + ), + }, + "Decline", + ), + h( + "button", + { + type: "button", + onClick: () => + actions.acceptInvite( + String( + invite.orgId || + "", + ), + ), + }, + "Accept", + ), + ), + ), + ), + ), + ) + : null, + ), + ), + ...members.map((member) => { + const canRemoveMember = + allowMemberManagement && + !getters.isProtectedMember(member); + + return h( + "article", + { className: "org-name-row" }, + h( + "div", + { className: "org-name-copy" }, + h("strong", null, member.name), + member.uid + ? h( + "span", + { className: "org-name-meta" }, + member.uid, + ) + : null, + ), + canRemoveMember + ? h( + "button", + { + type: "button", + className: "org-danger-btn org-icon-btn", + title: `Remove ${member.name}`, + "aria-label": `Remove ${member.name}`, + onClick: () => + actions.removeMember(member), + }, + h( + "svg", + { + className: "org-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true", + }, + h("path", { d: "M9 3h6" }), + h("path", { d: "M4 7h16" }), + h("path", { d: "M6 7l1 13h10l1-13" }), + h("path", { d: "M10 11v6" }), + h("path", { d: "M14 11v6" }), + ), + ) + : null, + ); + }), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/metricCard.js b/arma/client/addons/org/ui/src/components/portal/metricCard.js new file mode 100644 index 0000000..ed0d7a3 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/metricCard.js @@ -0,0 +1,77 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const scopeAttr = "data-ui-metric-card"; + const scopeSelector = `[${scopeAttr}]`; + const metricCardCss = ` +${scopeSelector} { + display: flex; + flex-direction: column; + gap: 0.45rem; + padding: 1rem; + border-radius: var(--radius); + border: 1px solid var(--border); + background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); +} + +${scopeSelector}:nth-child(4n + 2), +${scopeSelector}:nth-child(4n + 3) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(226 232 240) 100%); + border-color: rgb(100 116 139 / 0.35); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.6); +} + +${scopeSelector} .org-metric-label { + font-size: 0.76rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text-muted); +} + +${scopeSelector} .org-metric-value { + font-size: 1.8rem; + color: var(--primary-hover); + line-height: 1.1; +} + +${scopeSelector}:nth-child(4n + 2) .org-metric-value, +${scopeSelector}:nth-child(4n + 3) .org-metric-value { + color: #334155; +} + +${scopeSelector} .org-metric-note { + color: var(--text-muted); + font-size: 0.9rem; +} + +@media (max-width: 960px) { + ${scopeSelector}:nth-child(4n + 3) { + background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); + border-color: var(--border); + box-shadow: none; + } + + ${scopeSelector}:nth-child(4n + 3) .org-metric-value { + color: var(--primary-hover); + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.MetricCard = function MetricCard( + label, + value, + note, + ) { + ensureScopedStyle("portal-metric-card", metricCardCss); + + return h( + "div", + { className: "org-metric-card", [scopeAttr]: "" }, + h("span", { className: "org-metric-label" }, label), + h("strong", { className: "org-metric-value" }, value), + h("span", { className: "org-metric-note" }, note), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/modalLayer.js b/arma/client/addons/org/ui/src/components/portal/modalLayer.js new file mode 100644 index 0000000..85caa78 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/modalLayer.js @@ -0,0 +1,361 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const store = OrgPortal.store; + const actions = OrgPortal.actions; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.ModalLayer = function ModalLayer() { + const Modal = window.SharedUI.componentFns.Modal; + const modal = store.getModal(); + if (!modal) { + return null; + } + + const members = store.getMembers(); + const inviteablePlayers = store.getInviteablePlayers(); + const memberSelectProps = + members.length === 0 ? { disabled: true } : {}; + const inviteSelectProps = + inviteablePlayers.length === 0 ? { disabled: true } : {}; + + let title = ""; + let body = null; + + if (modal.type === "payroll") { + title = "Run Payroll"; + body = h( + "div", + { className: "app-modal-form" }, + h( + "div", + null, + h("label", null, "Amount Per Member"), + h("input", { + id: "treasury-payroll-amount", + type: "number", + min: "1", + placeholder: "500", + autofocus: "true", + }), + ), + h( + "div", + { className: "app-modal-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + onClick: () => { + if ( + actions.runPayroll( + actions.parseAmount( + actions.getInputValue( + "treasury-payroll-amount", + ), + ), + ) + ) { + actions.closeModal(); + } + }, + }, + "Run Payroll", + ), + ), + ); + } else if (modal.type === "transfer") { + title = "Send Funds"; + body = h( + "div", + { className: "app-modal-form" }, + h( + "div", + null, + h("label", null, "Member"), + h( + "select", + { + id: "treasury-transfer-member", + ...memberSelectProps, + }, + ...members.map((member) => + h("option", { value: member.uid }, member.name), + ), + ), + ), + h( + "div", + null, + h("label", null, "Amount"), + h("input", { + id: "treasury-transfer-amount", + type: "number", + min: "1", + placeholder: "1500", + }), + ), + h( + "div", + { className: "app-modal-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + ...memberSelectProps, + onClick: () => { + if ( + actions.sendFundsToMember( + String( + actions.getInputValue( + "treasury-transfer-member", + ) || "", + ), + actions.parseAmount( + actions.getInputValue( + "treasury-transfer-amount", + ), + ), + ) + ) { + actions.closeModal(); + } + }, + }, + "Send Funds", + ), + ), + ); + } else if (modal.type === "credit") { + title = "Assign Credit Line"; + body = h( + "div", + { className: "app-modal-form" }, + h( + "div", + null, + h("label", null, "Member"), + h( + "select", + { id: "treasury-credit-member", ...memberSelectProps }, + ...members.map((member) => + h("option", { value: member.uid }, member.name), + ), + ), + ), + h( + "div", + null, + h("label", null, "Credit Amount"), + h("input", { + id: "treasury-credit-amount", + type: "number", + min: "1", + placeholder: "5000", + }), + ), + h( + "div", + { className: "app-modal-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + ...memberSelectProps, + onClick: () => { + if ( + actions.grantCreditLine( + String( + actions.getInputValue( + "treasury-credit-member", + ) || "", + ), + actions.parseAmount( + actions.getInputValue( + "treasury-credit-amount", + ), + ), + ) + ) { + actions.closeModal(); + } + }, + }, + "Assign Credit Line", + ), + ), + ); + } else if (modal.type === "invite") { + title = "Invite Player"; + body = h( + "div", + { className: "app-modal-form" }, + h( + "div", + null, + h("label", null, "Online Player"), + h( + "select", + { + id: "org-invite-player", + ...inviteSelectProps, + }, + ...inviteablePlayers.map((player) => + h( + "option", + { value: player.uid }, + player.name || player.uid, + ), + ), + ), + ), + inviteablePlayers.length === 0 + ? h( + "p", + null, + "No eligible online players are currently available for invites.", + ) + : null, + h( + "div", + { className: "app-modal-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + ...inviteSelectProps, + onClick: () => { + if ( + actions.sendInvite( + String( + actions.getInputValue( + "org-invite-player", + ) || "", + ), + ) + ) { + actions.closeModal(); + } + }, + }, + "Send Invite", + ), + ), + ); + } else if (modal.type === "disband") { + title = "Disband Organization"; + body = h( + "div", + { className: "app-modal-danger" }, + h( + "p", + null, + "This action is permanent. Disband ", + portalData.org.name, + "?", + ), + h( + "div", + { className: "app-modal-danger-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + className: "org-danger-btn", + onClick: () => actions.disbandOrganization(), + }, + "Confirm Disband", + ), + ), + ); + } else if (modal.type === "leave") { + title = "Leave Organization"; + body = h( + "div", + { className: "app-modal-danger" }, + h( + "p", + null, + "Leave ", + portalData.org.name, + " and return to the default organization?", + ), + h( + "div", + { className: "app-modal-danger-actions" }, + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => actions.closeModal(), + }, + "Cancel", + ), + h( + "button", + { + type: "button", + className: "org-danger-btn", + onClick: () => actions.leaveOrganization(), + }, + "Confirm Leave", + ), + ), + ); + } + + return Modal({ + title, + body, + onClose: () => actions.closeModal(), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/overviewCard.js b/arma/client/addons/org/ui/src/components/portal/overviewCard.js new file mode 100644 index 0000000..050a97f --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/overviewCard.js @@ -0,0 +1,180 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const store = OrgPortal.store; + const getters = OrgPortal.getters; + const scopeAttr = "data-ui-overview-card"; + const scopeSelector = `[${scopeAttr}]`; + const overviewCardCss = ` +${scopeSelector} .org-hero-grid { + display: grid; + grid-template-columns: 1.3fr 1fr; + gap: 1.5rem; + align-items: start; +} + +${scopeSelector} .org-summary { + margin: 0; + font-size: 1.05rem; + color: var(--text-main); +} + +${scopeSelector} .org-meta-row { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin-top: 1.5rem; +} + +${scopeSelector} .org-meta-item { + display: flex; + flex-direction: column; + gap: 0.4rem; + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-meta-item:nth-child(even) { + background: linear-gradient(180deg, rgb(241 245 249) 0%, rgb(226 232 240) 100%); + border-color: rgb(148 163 184 / 0.45); +} + +${scopeSelector} .org-meta-label { + font-size: 0.76rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); +} + +${scopeSelector} .org-meta-value { + font-size: 1rem; + font-weight: 600; + color: var(--primary-hover); +} + +${scopeSelector} .org-metric-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; +} + +@media (max-width: 960px) { + ${scopeSelector} .org-hero-grid, + ${scopeSelector} .org-meta-row, + ${scopeSelector} .org-metric-grid { + grid-template-columns: 1fr; + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.OverviewCard = function OverviewCard() { + const MetricCard = OrgPortal.componentFns.MetricCard; + const PanelCard = window.SharedUI.componentFns.PanelCard; + const readiness = getters.getAssetReadiness(); + const headquarters = portalData.org.headquarters || "ArmA Verse"; + const assetCount = store.getAssets().length; + const fleetCount = store.getFleet().length; + const funds = store.getFunds(); + const memberCount = store.getMembers().length; + const reputation = store.getReputation(); + ensureScopedStyle("portal-overview-card", overviewCardCss); + + return PanelCard({ + className: "org-span-12", + eyebrow: portalData.org.tag, + title: "Organization Overview", + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-hero-grid" }, + h( + "div", + { className: "org-hero-copy" }, + h( + "p", + { className: "org-summary" }, + portalData.org.type, + " operating from ", + headquarters, + ". Treasury, fleet status, inventory, and roster management are surfaced here first.", + ), + h( + "div", + { className: "org-meta-row" }, + h( + "div", + { className: "org-meta-item" }, + h( + "span", + { className: "org-meta-label" }, + "Director", + ), + h( + "span", + { className: "org-meta-value" }, + getters.formatDisplayName(portalData.org.owner), + ), + ), + h( + "div", + { className: "org-meta-item" }, + h( + "span", + { className: "org-meta-label" }, + "Active Members", + ), + h( + "span", + { className: "org-meta-value" }, + `${memberCount} total`, + ), + ), + h( + "div", + { className: "org-meta-item" }, + h( + "span", + { className: "org-meta-label" }, + "Fleet Readiness", + ), + h( + "span", + { className: "org-meta-value" }, + readiness === null ? "N/A" : `${readiness}%`, + ), + ), + ), + ), + h( + "div", + { className: "org-metric-grid" }, + MetricCard( + "Org Funds", + getters.formatCurrency(funds), + "Organization treasury balance", + ), + MetricCard( + "Reputation", + reputation, + "Organization standing", + ), + MetricCard( + "Asset Lines", + assetCount, + "Tracked supply and equipment entries", + ), + MetricCard( + "Fleet Vehicles", + fleetCount, + "Tracked air, ground, and naval vehicles", + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/simpleStat.js b/arma/client/addons/org/ui/src/components/portal/simpleStat.js new file mode 100644 index 0000000..eceb6f6 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/simpleStat.js @@ -0,0 +1,39 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const scopeAttr = "data-ui-simple-stat"; + const scopeSelector = `[${scopeAttr}]`; + const simpleStatCss = ` +${scopeSelector} { + display: flex; + flex-direction: column; + gap: 0.2rem; + min-width: 90px; +} + +${scopeSelector} .org-simple-label { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); +} + +${scopeSelector} .org-simple-value { + font-size: 0.95rem; + color: var(--text-main); +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.SimpleStat = function SimpleStat(label, value) { + ensureScopedStyle("portal-simple-stat", simpleStatCss); + + return h( + "div", + { className: "org-simple-stat", [scopeAttr]: "" }, + h("span", { className: "org-simple-label" }, label), + h("strong", { className: "org-simple-value" }, value), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/components/portal/treasuryCard.js b/arma/client/addons/org/ui/src/components/portal/treasuryCard.js new file mode 100644 index 0000000..6b95c49 --- /dev/null +++ b/arma/client/addons/org/ui/src/components/portal/treasuryCard.js @@ -0,0 +1,523 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle, createSignal } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const store = OrgPortal.store; + const getters = OrgPortal.getters; + const actions = OrgPortal.actions; + const scopeAttr = "data-ui-treasury-card"; + const scopeSelector = `[${scopeAttr}]`; + const [getTreasuryTab, setTreasuryTab] = createSignal("overview"); + const [getTreasuryMenuOpen, setTreasuryMenuOpen] = createSignal(false); + const treasuryCardCss = ` +${scopeSelector} .org-treasury-menu { + position: relative; +} + +${scopeSelector} .org-menu-btn { + width: 2.75rem; + height: 2.75rem; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + border: 1px solid var(--border); + background: #f8fafc; + color: var(--text-muted); +} + +${scopeSelector} .org-menu-btn:hover { + color: var(--primary-hover); + border-color: rgb(148 163 184 / 0.65); +} + +${scopeSelector} .org-menu-btn svg { + width: 1.1rem; + height: 1.1rem; +} + +${scopeSelector} .org-menu-dropdown { + position: absolute; + top: calc(100% + 0.6rem); + right: 0; + min-width: 10.5rem; + padding: 0.45rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #fff; + box-shadow: 0 12px 28px rgb(15 23 42 / 0.12); + display: flex; + flex-direction: column; + gap: 0.35rem; + z-index: 5; +} + +${scopeSelector} .org-menu-option + .org-menu-option { + margin-left: 0; +} + +${scopeSelector} .org-menu-option { + width: 100%; + justify-content: flex-start; + background: transparent; + color: var(--text-main); + border: 1px solid transparent; +} + +${scopeSelector} .org-menu-option:hover { + background: #f8fafc; + border-color: rgb(148 163 184 / 0.35); +} + +${scopeSelector} .org-menu-option.is-active { + background: rgb(226 232 240 / 0.7); + color: var(--primary-hover); + border-color: rgb(148 163 184 / 0.35); +} + +${scopeSelector} .org-finance-meta { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + margin-bottom: 1.5rem; +} + +${scopeSelector} .org-finance-meta > div { + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; + display: flex; + flex-direction: column; + gap: 0.4rem; +} + +${scopeSelector} .org-meta-label { + font-size: 0.76rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); +} + +${scopeSelector} .org-action-grid { + display: flex; + flex-direction: column; + gap: 0.75rem; + margin-bottom: 1rem; +} + +${scopeSelector} .org-action-grid button + button { + margin-left: 0; +} + +${scopeSelector} .org-action-grid button { + width: 100%; +} + +${scopeSelector} .org-access-note { + margin: 0 0 1rem; + color: var(--text-muted); + font-size: 0.95rem; +} + +${scopeSelector} .org-credit-summary { + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 0.85rem 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-credit-summary strong { + font-size: 1rem; +} + +${scopeSelector} .org-credit-summary span:last-child { + font-size: 0.92rem; + line-height: 1.45; +} + +${scopeSelector} .org-credit-lines-list { + display: flex; + flex-direction: column; + gap: 0.85rem; +} + +${scopeSelector} .org-treasury-body { + display: flex; + flex: 1; + flex-direction: column; + gap: 1rem; + min-height: 0; + overflow: auto; + padding-right: 0.35rem; + scrollbar-width: thin; + scrollbar-color: #94a3b8 #e2e8f0; +} + +${scopeSelector} .org-credit-line-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; +} + +${scopeSelector} .org-credit-line-row:nth-child(even) { + background: linear-gradient(180deg, rgb(248 250 252) 0%, rgb(241 245 249) 100%); + border-color: rgb(148 163 184 / 0.45); +} + +${scopeSelector} .org-credit-line-member { + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +${scopeSelector} .org-credit-line-label { + font-size: 0.76rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); +} + +${scopeSelector} .org-credit-line-empty { + padding: 1rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: #f8fafc; + color: var(--text-muted); +} + +@media (max-width: 960px) { + ${scopeSelector} .org-finance-meta { + grid-template-columns: 1fr; + } + + ${scopeSelector} .org-credit-line-row { + flex-direction: column; + align-items: flex-start; + } +} +`; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.TreasuryCard = function TreasuryCard() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + const creditLines = store.getCreditLines(); + const reputation = store.getReputation(); + const allowTreasuryActions = getters.canManageTreasury(); + const activeTab = getTreasuryTab(); + const isMenuOpen = getTreasuryMenuOpen(); + const totalReserved = creditLines.reduce( + (sum, line) => + sum + Number(line.availableAmount || line.amount || 0), + 0, + ); + const totalDue = creditLines.reduce( + (sum, line) => sum + Number(line.amountDue || 0), + 0, + ); + const activeCreditLabel = + creditLines.length === 1 + ? "1 active credit line" + : `${creditLines.length} active credit lines`; + ensureScopedStyle("portal-treasury-card", treasuryCardCss); + + return PanelCard({ + className: "org-scroll-panel org-span-5", + title: "Treasury", + subtitle: "Organization funds, reputation and payouts.", + headerExtras: h( + "div", + { className: "org-treasury-menu" }, + h( + "button", + { + type: "button", + className: "org-menu-btn", + title: "Treasury views", + "aria-label": "Treasury views", + onClick: () => setTreasuryMenuOpen((open) => !open), + }, + h( + "svg", + { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "aria-hidden": "true", + }, + h("line", { x1: "4", y1: "7", x2: "20", y2: "7" }), + h("line", { x1: "4", y1: "12", x2: "20", y2: "12" }), + h("line", { x1: "4", y1: "17", x2: "20", y2: "17" }), + ), + ), + isMenuOpen + ? h( + "div", + { className: "org-menu-dropdown" }, + h( + "button", + { + type: "button", + className: + activeTab === "overview" + ? "org-menu-option is-active" + : "org-menu-option", + onClick: () => { + setTreasuryTab("overview"); + setTreasuryMenuOpen(false); + }, + }, + "Overview", + ), + h( + "button", + { + type: "button", + className: + activeTab === "credit" + ? "org-menu-option is-active" + : "org-menu-option", + onClick: () => { + setTreasuryTab("credit"); + setTreasuryMenuOpen(false); + }, + }, + "Credit Lines", + ), + ) + : null, + ), + rootProps: { [scopeAttr]: "" }, + body: h( + "div", + { className: "org-treasury-body" }, + activeTab === "credit" + ? creditLines.length > 0 + ? h( + "div", + { className: "org-credit-lines-list" }, + ...creditLines.map((line) => + h( + "article", + { className: "org-credit-line-row" }, + h( + "div", + { + className: + "org-credit-line-member", + }, + h( + "span", + { + className: + "org-credit-line-label", + }, + "Member", + ), + h("strong", null, line.member), + ), + h( + "div", + { + className: + "org-credit-line-member", + }, + h( + "span", + { + className: + "org-credit-line-label", + }, + "Available", + ), + h( + "strong", + null, + getters.formatCurrency( + line.availableAmount || + line.amount, + ), + ), + ), + h( + "div", + { + className: + "org-credit-line-member", + }, + h( + "span", + { + className: + "org-credit-line-label", + }, + "Amount Due", + ), + h( + "strong", + null, + getters.formatCurrency( + line.amountDue, + ), + ), + ), + h( + "div", + { + className: + "org-credit-line-member", + }, + h( + "span", + { + className: + "org-credit-line-label", + }, + "Interest", + ), + h( + "strong", + null, + `${Math.round(Number(line.interestRate || 0) * 100)}%`, + ), + ), + ), + ), + ) + : h( + "div", + { className: "org-credit-line-empty" }, + "No active credit lines.", + ) + : h( + "div", + null, + h( + "div", + { className: "org-finance-meta" }, + h( + "div", + null, + h( + "span", + { className: "org-meta-label" }, + "Funds", + ), + h( + "strong", + null, + getters.formatCurrency(store.getFunds()), + ), + ), + h( + "div", + null, + h( + "span", + { className: "org-meta-label" }, + "Reputation", + ), + h("strong", null, `${reputation}`), + ), + h( + "div", + null, + h( + "span", + { className: "org-meta-label" }, + "Reserved Credit", + ), + h( + "strong", + null, + getters.formatCurrency(totalReserved), + ), + ), + h( + "div", + null, + h( + "span", + { className: "org-meta-label" }, + "Outstanding Due", + ), + h( + "strong", + null, + getters.formatCurrency(totalDue), + ), + ), + ), + allowTreasuryActions + ? h( + "div", + { className: "org-action-grid" }, + h( + "button", + { + type: "button", + onClick: () => + actions.openModal("payroll"), + }, + "Run Payroll", + ), + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => + actions.openModal("transfer"), + }, + "Send Funds", + ), + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => + actions.openModal("credit"), + }, + "Credit Line", + ), + ) + : h( + "p", + { className: "org-access-note" }, + "Only the organization leader or CEO can manage treasury actions.", + ), + h( + "div", + { className: "org-credit-summary" }, + h( + "span", + { className: "org-meta-label" }, + "Credit Line Status", + ), + h("strong", null, activeCreditLabel), + h( + "span", + null, + creditLines.length > 0 + ? "Open the Credit Lines tab to review reserved balances, due amounts, and member exposure." + : "Assign a credit line to create the first approved member limit.", + ), + ), + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/portal/actions.js b/arma/client/addons/org/ui/src/portal/actions.js new file mode 100644 index 0000000..02d9d93 --- /dev/null +++ b/arma/client/addons/org/ui/src/portal/actions.js @@ -0,0 +1,424 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { portalData } = OrgPortal.data; + const store = OrgPortal.store; + const getters = OrgPortal.getters; + const registryStore = window.RegistryApp.store; + + class OrgPortalActions { + constructor() { + this.treasuryNoticeTimer = null; + } + + showTreasuryNotice(type, text) { + store.setTreasuryNotice({ type, text }); + + if (this.treasuryNoticeTimer) { + clearTimeout(this.treasuryNoticeTimer); + } + + this.treasuryNoticeTimer = setTimeout(() => { + store.setTreasuryNotice({ type: "", text: "" }); + this.treasuryNoticeTimer = null; + }, 3500); + } + + parseAmount(value) { + const amount = Number(value); + return Number.isFinite(amount) ? Math.round(amount) : 0; + } + + getInputValue(id) { + const el = document.getElementById(id); + return el ? el.value : ""; + } + + closePortal() { + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (bridge && typeof bridge.close === "function") { + bridge.close({}); + return; + } + + if (registryStore) { + registryStore.setView("home"); + } + } + + openModal(type) { + if ( + (type === "payroll" || + type === "transfer" || + type === "credit") && + !getters.canManageTreasury() + ) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can manage treasury actions.", + ); + return; + } + + if (type === "invite" && !getters.canManageMembers()) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can invite players.", + ); + return; + } + + if (type === "disband" && !getters.canDisbandOrg()) { + return; + } + + if (type === "leave" && !getters.canLeaveOrg()) { + return; + } + + store.setModal({ type }); + } + + closeModal() { + store.setModal(null); + } + + toggleInviteMenu() { + store.setInviteMenuOpen(!store.getInviteMenuOpen()); + } + + closeInviteMenu() { + store.setInviteMenuOpen(false); + } + + removeMember(member) { + if (!getters.canManageMembers()) { + return false; + } + + if (getters.isProtectedMember(member)) { + return false; + } + + const memberUid = getters.getMemberUid(member); + const memberName = getters.getMemberName(member); + + store.setMembers((currentMembers) => + currentMembers.filter((entry) => + memberUid + ? entry.uid !== memberUid + : entry.name !== memberName, + ), + ); + store.setCreditLines((currentLines) => + currentLines.filter((line) => + memberUid + ? line.uid !== memberUid + : line.member !== memberName, + ), + ); + return true; + } + + disbandOrganization() { + if (!getters.canDisbandOrg()) { + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestDisbandOrg !== "function") { + this.showTreasuryNotice( + "error", + "Disband bridge is unavailable.", + ); + return false; + } + + this.closeModal(); + bridge.requestDisbandOrg(); + return true; + } + + leaveOrganization() { + if (!getters.canLeaveOrg()) { + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestLeaveOrg !== "function") { + this.showTreasuryNotice( + "error", + "Leave bridge is unavailable.", + ); + return false; + } + + this.closeModal(); + bridge.requestLeaveOrg(); + return true; + } + + runPayroll(amountPerMember) { + if (!getters.canManageTreasury()) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can manage treasury actions.", + ); + return false; + } + + const members = store.getMembers(); + const funds = store.getFunds(); + + if (members.length === 0) { + this.showTreasuryNotice( + "error", + "No members available for payroll.", + ); + return false; + } + + if (amountPerMember <= 0) { + this.showTreasuryNotice( + "error", + "Enter a valid payroll amount.", + ); + return false; + } + + const total = amountPerMember * members.length; + if (total > funds) { + this.showTreasuryNotice( + "error", + "Insufficient org funds for payroll.", + ); + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestPayroll !== "function") { + this.showTreasuryNotice( + "error", + "Payroll bridge is unavailable.", + ); + return false; + } + + return bridge.requestPayroll({ + amount: amountPerMember, + }); + } + + sendFundsToMember(memberUid, amount) { + if (!getters.canManageTreasury()) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can manage treasury actions.", + ); + return false; + } + + const funds = store.getFunds(); + + if (!memberUid) { + this.showTreasuryNotice( + "error", + "Select a member to receive funds.", + ); + return false; + } + + if (amount <= 0) { + this.showTreasuryNotice( + "error", + "Enter a valid transfer amount.", + ); + return false; + } + + if (amount > funds) { + this.showTreasuryNotice( + "error", + "Insufficient org funds for this transfer.", + ); + return false; + } + + const member = store + .getMembers() + .find((entry) => getters.getMemberUid(entry) === memberUid); + const memberName = member ? getters.getMemberName(member) : ""; + if (!memberName) { + this.showTreasuryNotice( + "error", + "Selected member was not found in the organization roster.", + ); + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if ( + !bridge || + typeof bridge.requestTreasuryTransfer !== "function" + ) { + this.showTreasuryNotice( + "error", + "Treasury transfer bridge is unavailable.", + ); + return false; + } + + return bridge.requestTreasuryTransfer({ + memberUid, + memberName, + amount, + }); + } + + grantCreditLine(memberUid, amount) { + if (!getters.canManageTreasury()) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can manage treasury actions.", + ); + return false; + } + + if (!memberUid) { + this.showTreasuryNotice( + "error", + "Select a member for the credit line.", + ); + return false; + } + + if (amount <= 0) { + this.showTreasuryNotice( + "error", + "Enter a valid credit line amount.", + ); + return false; + } + + const member = store + .getMembers() + .find((entry) => getters.getMemberUid(entry) === memberUid); + const memberName = member ? getters.getMemberName(member) : ""; + + if (!memberName) { + this.showTreasuryNotice( + "error", + "Selected member was not found in the organization roster.", + ); + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestCreditLine !== "function") { + this.showTreasuryNotice( + "error", + "Credit line bridge is unavailable.", + ); + return false; + } + + return bridge.requestCreditLine({ + memberUid, + memberName, + amount, + }); + } + + sendInvite(targetUid) { + if (!getters.canManageMembers()) { + this.showTreasuryNotice( + "error", + "Only the organization leader or CEO can invite players.", + ); + return false; + } + + const target = store + .getInviteablePlayers() + .find((entry) => String(entry.uid || "") === String(targetUid)); + + if (!target) { + this.showTreasuryNotice( + "error", + "Select an online player to invite.", + ); + return false; + } + + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestInvitePlayer !== "function") { + this.showTreasuryNotice( + "error", + "Organization invite bridge is unavailable.", + ); + return false; + } + + return bridge.requestInvitePlayer({ + targetUid: String(target.uid || ""), + targetName: String(target.name || ""), + }); + } + + acceptInvite(orgId) { + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestAcceptInvite !== "function") { + this.showTreasuryNotice( + "error", + "Organization invite bridge is unavailable.", + ); + return false; + } + + this.closeInviteMenu(); + return bridge.requestAcceptInvite({ orgId }); + } + + declineInvite(orgId) { + const bridge = window.RegistryApp + ? window.RegistryApp.bridge + : null; + + if (!bridge || typeof bridge.requestDeclineInvite !== "function") { + this.showTreasuryNotice( + "error", + "Organization invite bridge is unavailable.", + ); + return false; + } + + this.closeInviteMenu(); + return bridge.requestDeclineInvite({ orgId }); + } + } + + OrgPortal.actions = new OrgPortalActions(); +})(); diff --git a/arma/client/addons/org/ui/src/portal/data.js b/arma/client/addons/org/ui/src/portal/data.js new file mode 100644 index 0000000..0e7f29d --- /dev/null +++ b/arma/client/addons/org/ui/src/portal/data.js @@ -0,0 +1,159 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const staticOrgProfile = { + type: "Organization", + status: "Operational", + headquarters: "ArmA Verse", + }; + + function cloneValue(value) { + return JSON.parse(JSON.stringify(value)); + } + + function replaceObject(target, source) { + Object.keys(target).forEach((key) => delete target[key]); + Object.assign(target, cloneValue(source)); + } + + function replaceArray(target, source) { + target.splice(0, target.length, ...cloneValue(source)); + } + + function normalizeRecord(value) { + if (value && typeof value === "object" && !Array.isArray(value)) { + return value; + } + + if (Array.isArray(value)) { + const isEntryArray = value.every( + (entry) => + Array.isArray(entry) && + entry.length >= 2 && + typeof entry[0] === "string", + ); + + if (isEntryArray) { + return Object.fromEntries(value); + } + } + + if (typeof value === "string" && value.trim() !== "") { + try { + return normalizeRecord(JSON.parse(value)); + } catch (_error) { + return value; + } + } + + return value; + } + + function normalizeCollection(value) { + const source = Array.isArray(value) + ? value + : value && typeof value === "object" + ? Object.values(value) + : []; + + return source.map(normalizeRecord).filter(Boolean); + } + + OrgPortal.data = { + portalData: { + org: Object.assign( + { + name: "", + tag: "", + owner: "", + ownerUid: "", + isDefault: false, + }, + staticOrgProfile, + ), + funds: 0, + reputation: 0, + creditLines: [], + members: [], + pendingInvites: [], + inviteablePlayers: [], + fleet: [], + assets: [], + activity: [], + roadmap: [ + { + name: "Contracts Board", + status: "Planned", + detail: "Track payouts, assignments, and claim approvals.", + }, + { + name: "Diplomacy", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + { + name: "Logistics Queue", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + { + name: "Permissions", + status: "Future Review", + detail: "Possible future module pending a full design and scope review.", + }, + ], + }, + session: { + actorName: "", + actorUid: "", + role: "", + ceo: false, + }, + applyLoginPayload(payload) { + replaceObject( + this.portalData.org, + Object.assign( + {}, + payload.portalData.org || {}, + staticOrgProfile, + ), + ); + this.portalData.funds = payload.portalData.funds || 0; + this.portalData.reputation = payload.portalData.reputation || 0; + replaceArray( + this.portalData.creditLines, + normalizeCollection(payload.portalData.creditLines), + ); + + replaceArray( + this.portalData.members, + normalizeCollection(payload.portalData.members), + ); + replaceArray( + this.portalData.pendingInvites, + normalizeCollection(payload.portalData.pendingInvites), + ); + replaceArray( + this.portalData.inviteablePlayers, + normalizeCollection(payload.portalData.inviteablePlayers), + ); + replaceArray( + this.portalData.fleet, + normalizeCollection(payload.portalData.fleet), + ); + replaceArray( + this.portalData.assets, + normalizeCollection(payload.portalData.assets), + ); + replaceArray( + this.portalData.activity, + normalizeCollection(payload.portalData.activity), + ); + replaceArray( + this.portalData.roadmap, + normalizeCollection(payload.portalData.roadmap), + ); + + replaceObject(this.session, payload.session || {}); + }, + }; +})(); diff --git a/arma/client/addons/org/ui/src/portal/getters.js b/arma/client/addons/org/ui/src/portal/getters.js new file mode 100644 index 0000000..534c93c --- /dev/null +++ b/arma/client/addons/org/ui/src/portal/getters.js @@ -0,0 +1,178 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { portalData, session } = OrgPortal.data; + + class OrgPortalGetters { + formatCurrency(value) { + return "$" + Number(value || 0).toLocaleString(); + } + + formatVehicleType(type) { + if (!type) { + return ""; + } + + return type.charAt(0).toUpperCase() + type.slice(1); + } + + formatAssetType(type) { + if (!type) { + return ""; + } + + return type.charAt(0).toUpperCase() + type.slice(1); + } + + formatDisplayName(value) { + if (!value) { + return ""; + } + + return String(value) + .trim() + .split(/\s+/) + .map((part) => { + if (!part) { + return ""; + } + + return ( + part.charAt(0).toUpperCase() + + part.slice(1).toLowerCase() + ); + }) + .join(" "); + } + + getAssetReadiness() { + const fleet = OrgPortal.store + ? OrgPortal.store.getFleet() + : portalData.fleet; + if (fleet.length === 0) { + return null; + } + + const total = fleet.reduce( + (sum, unit) => sum + (100 - parseInt(unit.damage, 10)), + 0, + ); + return Math.round(total / fleet.length); + } + + getNormalizedRole() { + return String(session.role || "") + .trim() + .toUpperCase(); + } + + isDefaultOrg() { + return ( + portalData.org.isDefault === true || + String(portalData.org.tag || "") + .trim() + .toUpperCase() === "DEFAULT" + ); + } + + isOrgOwner() { + const ownerUid = String( + portalData.org.ownerUid || portalData.org.owner || "", + ) + .trim() + .toLowerCase(); + const actorUid = String(session.actorUid || "") + .trim() + .toLowerCase(); + + if (ownerUid && actorUid) { + return actorUid === ownerUid; + } + + return ( + String(session.actorName || "") + .trim() + .toLowerCase() === + String(portalData.org.owner || "") + .trim() + .toLowerCase() + ); + } + + isSessionCeo() { + return session.ceo === true; + } + + isOrgLeaderOrCeo() { + return ( + this.isOrgOwner() || + this.getNormalizedRole() === "LEADER" || + (this.isDefaultOrg() && this.isSessionCeo()) + ); + } + + canManageMembers() { + return this.isOrgLeaderOrCeo(); + } + + canManageTreasury() { + return this.isOrgLeaderOrCeo(); + } + + canDisbandOrg() { + return this.isOrgOwner() && !this.isDefaultOrg(); + } + + canLeaveOrg() { + return !this.isDefaultOrg() && !this.isOrgOwner(); + } + + getMemberName(member) { + if (member && typeof member === "object") { + return String(member.name || ""); + } + + return String(member || ""); + } + + getMemberUid(member) { + if (member && typeof member === "object") { + return String(member.uid || ""); + } + + return ""; + } + + isOwnerMember(member) { + return ( + this.getMemberName(member).trim().toLowerCase() === + String(portalData.org.owner || "") + .trim() + .toLowerCase() + ); + } + + isCurrentMember(member) { + const memberUid = this.getMemberUid(member).trim().toLowerCase(); + const actorUid = String(session.actorUid || "") + .trim() + .toLowerCase(); + + if (memberUid && actorUid) { + return memberUid === actorUid; + } + + return ( + this.getMemberName(member).trim().toLowerCase() === + String(session.actorName || "") + .trim() + .toLowerCase() + ); + } + + isProtectedMember(member) { + return this.isOwnerMember(member) || this.isCurrentMember(member); + } + } + + OrgPortal.getters = new OrgPortalGetters(); +})(); diff --git a/arma/client/addons/org/ui/src/portal/store.js b/arma/client/addons/org/ui/src/portal/store.js new file mode 100644 index 0000000..bc96b18 --- /dev/null +++ b/arma/client/addons/org/ui/src/portal/store.js @@ -0,0 +1,103 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { createSignal } = window.RegistryApp.runtime; + const { portalData } = OrgPortal.data; + + function normalizeRecord(value) { + if (value && typeof value === "object" && !Array.isArray(value)) { + return value; + } + + if (Array.isArray(value)) { + const isEntryArray = value.every( + (entry) => + Array.isArray(entry) && + entry.length >= 2 && + typeof entry[0] === "string", + ); + + if (isEntryArray) { + return Object.fromEntries(value); + } + } + + if (typeof value === "string" && value.trim() !== "") { + try { + return normalizeRecord(JSON.parse(value)); + } catch (_error) { + return value; + } + } + + return value; + } + + function normalizeCollection(value) { + const source = Array.isArray(value) + ? value + : value && typeof value === "object" + ? Object.values(value) + : []; + + return source.map(normalizeRecord).filter(Boolean); + } + + class OrgPortalStore { + constructor() { + [this.getFunds, this.setFunds] = createSignal(portalData.funds); + [this.getReputation, this.setReputation] = createSignal( + portalData.reputation, + ); + [this.getMembers, this.setMembers] = createSignal([ + ...portalData.members, + ]); + [this.getPendingInvites, this.setPendingInvites] = createSignal([ + ...portalData.pendingInvites, + ]); + [this.getInviteablePlayers, this.setInviteablePlayers] = + createSignal([...portalData.inviteablePlayers]); + [this.getCreditLines, this.setCreditLines] = createSignal([ + ...portalData.creditLines, + ]); + [this.getFleet, this.setFleet] = createSignal([ + ...portalData.fleet, + ]); + [this.getAssets, this.setAssets] = createSignal([ + ...portalData.assets, + ]); + [this.getActivity, this.setActivity] = createSignal([ + ...portalData.activity, + ]); + [this.getTreasuryNotice, this.setTreasuryNotice] = createSignal({ + type: "", + text: "", + }); + [this.getModal, this.setModal] = createSignal(null); + [this.getInviteMenuOpen, this.setInviteMenuOpen] = + createSignal(false); + [this.getOrgDisbanded, this.setOrgDisbanded] = createSignal(false); + } + + hydrateFromPayload(payload) { + const nextPortalData = payload.portalData || {}; + + this.setFunds(nextPortalData.funds || 0); + this.setReputation(nextPortalData.reputation || 0); + this.setMembers([...normalizeCollection(nextPortalData.members)]); + this.setPendingInvites([ + ...normalizeCollection(nextPortalData.pendingInvites), + ]); + this.setInviteablePlayers([ + ...normalizeCollection(nextPortalData.inviteablePlayers), + ]); + this.setCreditLines([ + ...normalizeCollection(nextPortalData.creditLines), + ]); + this.setFleet([...normalizeCollection(nextPortalData.fleet)]); + this.setAssets([...normalizeCollection(nextPortalData.assets)]); + this.setActivity([...normalizeCollection(nextPortalData.activity)]); + } + } + + OrgPortal.store = new OrgPortalStore(); +})(); diff --git a/arma/client/addons/org/ui/src/registry/store.js b/arma/client/addons/org/ui/src/registry/store.js new file mode 100644 index 0000000..131ceba --- /dev/null +++ b/arma/client/addons/org/ui/src/registry/store.js @@ -0,0 +1,91 @@ +(function () { + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { createSignal } = RegistryApp.runtime; + + class RegistryStore { + constructor() { + [this.getView, this.setView] = createSignal("home"); + [this.getIsAuthenticating, this.setIsAuthenticating] = + createSignal(false); + [this.getLoginError, this.setLoginError] = createSignal(""); + [this.getIsCreating, this.setIsCreating] = createSignal(false); + [this.getCreateError, this.setCreateError] = createSignal(""); + } + + startLogin() { + this.setLoginError(""); + this.setIsAuthenticating(true); + } + + startCreate() { + this.setCreateError(""); + this.setIsCreating(true); + } + + failLogin(message) { + this.setIsAuthenticating(false); + this.setLoginError(message || "Authentication failed."); + } + + failCreate(message) { + this.setIsCreating(false); + this.setCreateError(message || "Organization registration failed."); + } + + hydratePortal(payload) { + const portalApi = + window.OrgPortal && window.OrgPortal.data + ? window.OrgPortal.data + : null; + const portalStore = + window.OrgPortal && window.OrgPortal.store + ? window.OrgPortal.store + : null; + const portalData = + payload && payload.portalData ? payload.portalData : null; + const sessionData = + payload && payload.session ? payload.session : null; + + if ( + !portalApi || + typeof portalApi.applyLoginPayload !== "function" || + !portalStore || + typeof portalStore.hydrateFromPayload !== "function" || + !portalData || + !sessionData + ) { + return false; + } + + portalApi.applyLoginPayload(payload); + portalStore.hydrateFromPayload(payload); + return true; + } + + completeLogin(payload) { + if (!this.hydratePortal(payload)) { + this.failLogin("Login response was missing portal data."); + return; + } + + this.setLoginError(""); + this.setIsAuthenticating(false); + this.setView("portal"); + } + + completeCreate(payload) { + if (!this.hydratePortal(payload)) { + this.failCreate( + "Organization registration response was missing portal data.", + ); + return; + } + + this.setCreateError(""); + this.setIsCreating(false); + this.setView("portal"); + } + } + + RegistryApp.store = new RegistryStore(); +})(); diff --git a/arma/client/addons/org/ui/src/runtime.js b/arma/client/addons/org/ui/src/runtime.js new file mode 100644 index 0000000..da7fc91 --- /dev/null +++ b/arma/client/addons/org/ui/src/runtime.js @@ -0,0 +1,9 @@ +(function () { + const runtime = window.ForgeWebUI; + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + + RegistryApp.runtime = runtime; + OrgPortal.runtime = runtime; + window.AppRuntime = runtime; +})(); diff --git a/arma/client/addons/org/ui/src/styles.css b/arma/client/addons/org/ui/src/styles.css new file mode 100644 index 0000000..e4677c8 --- /dev/null +++ b/arma/client/addons/org/ui/src/styles.css @@ -0,0 +1,280 @@ +:root { + --bg-app: #fdfcf8; + --bg-surface: #ffffff; + --bg-surface-hover: #f1f5f9; + --primary: #475569; + --primary-hover: #1e293b; + --text-main: #1f2937; + --text-muted: #64748b; + --text-inverse: #f8fafc; + --border: #e2e8f0; + --radius: 8px; + --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --footer-bg: #1e293b; +} + +html, +body { + height: 100%; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +body { + font-family: + "Inter", + system-ui, + -apple-system, + sans-serif; + margin: 0; + padding: 0; + background: var(--bg-app); + color: var(--text-main); + line-height: 1.6; + overflow: hidden; +} + +#app { + height: 100vh; + overflow: hidden; +} + +.app-shell { + height: 100vh; + display: flex; + flex-direction: column; + overflow: hidden; +} + +#org-portal-frame-root { + display: flex; + flex: 1 1 auto; + flex-direction: column; + min-height: 0; + overflow: hidden; +} + +main { + display: flex; + flex-direction: column; + flex: 1 1 auto; + min-height: 0; + overflow: auto; + overscroll-behavior: contain; +} + +.container { + max-width: 1200px; + width: 100%; + margin: 0 auto; + padding: 2rem; + flex: 1; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +.header { + text-align: center; + margin-bottom: 3rem; + padding-bottom: 2rem; + border-bottom: 1px solid var(--border); + + h1 { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 0.5rem; + letter-spacing: -0.025em; + color: var(--primary-hover); + } + + p { + color: var(--text-muted); + font-size: 1.1rem; + } +} + +.card { + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 2rem; + box-shadow: var(--shadow); + text-align: center; + + h2 { + margin-top: 0; + font-size: 1.8rem; + color: var(--primary-hover); + } +} + +button { + background: var(--primary); + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: var(--radius); + cursor: pointer; + font-size: 1rem; + font-weight: 500; + transition: all 0.2s ease; + + &:hover { + background: var(--primary-hover); + transform: translateY(-1px); + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); + } + + &:disabled { + cursor: not-allowed; + opacity: 0.65; + transform: none; + box-shadow: none; + } + + & + & { + margin-left: 1rem; + } +} + +.footer { + margin-top: auto; + background: var(--footer-bg); + color: var(--text-inverse); + display: block; + + .wrapper { + max-width: 1200px; + width: 100%; + margin: 0 auto; + padding: 3rem 2rem; + box-sizing: border-box; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4rem; + } + + h3 { + color: var(--text-inverse); + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.1em; + font-weight: 700; + margin-bottom: 1.5rem; + border-bottom: 1px solid #475569; + padding-bottom: 0.5rem; + margin-right: 1rem; + } + + ul { + li { + color: #cbd5e1; + font-size: 0.95rem; + margin-bottom: 0.75rem; + cursor: pointer; + transition: color 0.2s; + + &:hover { + color: white; + } + } + } +} + +.org-secondary-btn { + background: var(--bg-surface); + color: var(--text-main); + border: 1px solid var(--border); + + &:hover { + background: var(--bg-surface-hover); + color: var(--text-main); + } +} + +.org-danger-btn { + background: #7f1d1d; + color: #fef2f2; + + &:hover { + background: #991b1b; + } +} + +.org-icon-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.5rem; + height: 2.5rem; + padding: 0; +} + +.org-icon { + width: 1rem; + height: 1rem; +} + +.org-page-header { + text-align: left; + margin-bottom: 0; +} + +.org-page-heading { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.org-page-kicker { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + font-weight: 600; +} + +.org-page-title { + margin: 0; +} + +.org-page-subtitle { + font-size: 0.9rem; + color: var(--text-muted); + margin: 0; +} + +.org-page-meta { + font-size: 0.75rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +@media (max-width: 960px) { + .container { + padding: 1.5rem; + } + + .header { + margin-bottom: 2rem; + padding-bottom: 1.5rem; + + h1 { + font-size: 2rem; + } + } + + .footer .wrapper { + grid-template-columns: 1fr; + } + + .org-page-heading { + gap: 0.3rem; + } +} diff --git a/arma/client/addons/org/ui/src/views/DisbandedView.js b/arma/client/addons/org/ui/src/views/DisbandedView.js new file mode 100644 index 0000000..01659e0 --- /dev/null +++ b/arma/client/addons/org/ui/src/views/DisbandedView.js @@ -0,0 +1,36 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h } = OrgPortal.runtime; + const { portalData } = OrgPortal.data; + const registryStore = window.RegistryApp.store; + + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.DisbandedView = function DisbandedView() { + const PanelCard = window.SharedUI.componentFns.PanelCard; + + return PanelCard({ + className: "org-span-12 org-empty-state", + eyebrow: "Organization Removed", + title: portalData.org.name, + body: h( + "div", + null, + h( + "p", + { className: "org-summary" }, + "This organization has been disbanded. Member access, assets, and fleet management are no longer available from this portal preview.", + ), + h( + "button", + { + type: "button", + className: "org-secondary-btn", + onClick: () => registryStore.setView("home"), + }, + "Return to Registry", + ), + ), + }); + }; +})(); diff --git a/arma/client/addons/org/ui/src/views/HomeView.js b/arma/client/addons/org/ui/src/views/HomeView.js new file mode 100644 index 0000000..23af224 --- /dev/null +++ b/arma/client/addons/org/ui/src/views/HomeView.js @@ -0,0 +1,89 @@ +(function () { + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h, ensureScopedStyle } = RegistryApp.runtime; + const store = RegistryApp.store; + const bridge = RegistryApp.bridge; + const scopeAttr = "data-ui-home-view"; + const scopeSelector = `[${scopeAttr}]`; + const homeViewCss = ` +${scopeSelector} { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; + margin-bottom: 2rem; +} + +${scopeSelector} .home-feedback { + padding: 0.85rem 1rem; + border-radius: var(--radius); + font-size: 0.92rem; + background: #fef2f2; + border: 1px solid #fecaca; + color: #991b1b; +} + +@media (max-width: 960px) { + ${scopeSelector} { + grid-template-columns: 1fr; + } +} +`; + + RegistryApp.componentFns = RegistryApp.componentFns || {}; + + RegistryApp.componentFns.HomeView = function HomeView() { + const isAuthenticating = store.getIsAuthenticating(); + const loginError = store.getLoginError(); + ensureScopedStyle("main-home-view", homeViewCss); + + return h( + "div", + { className: "content", [scopeAttr]: "" }, + h( + "div", + { className: "card" }, + h("h2", null, "Create Organization"), + h( + "p", + null, + "Establish your Task Force, PMC, or Milsim unit with the Global Organization Network. Registration requires $50,000 in personal funds.", + ), + h( + "button", + { onClick: () => store.setView("create") }, + "Register", + ), + ), + h( + "div", + { className: "card" }, + h("h2", null, "Organization Portal"), + h( + "p", + null, + "Access your unit dashboard to modify rosters, adjust active deployments, and submit after-action reports through the secure field uplink.", + ), + loginError + ? h("div", { className: "home-feedback" }, loginError) + : null, + h( + "button", + { + disabled: isAuthenticating, + onClick: () => { + if (!bridge) { + store.failLogin( + "Login bridge is not available.", + ); + return; + } + + bridge.requestLogin({}); + }, + }, + isAuthenticating ? "Opening Portal..." : "Login", + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/views/PortalView.js b/arma/client/addons/org/ui/src/views/PortalView.js new file mode 100644 index 0000000..989fa71 --- /dev/null +++ b/arma/client/addons/org/ui/src/views/PortalView.js @@ -0,0 +1,247 @@ +(function () { + const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const { h, ensureScopedStyle } = OrgPortal.runtime; + const { portalData, session } = OrgPortal.data; + const store = OrgPortal.store; + const portalViewScope = "[data-ui-portal-view]"; + + ensureScopedStyle( + "portal-view", + ` + ${portalViewScope} { + --org-row-card-max-height: 36rem; + } + + ${portalViewScope} .org-toast-stack { + position: fixed; + top: 1.5rem; + right: 2rem; + z-index: 20; + display: flex; + flex-direction: column; + gap: 0.75rem; + pointer-events: none; + } + + ${portalViewScope} .org-toast { + max-width: 24rem; + padding: 0.9rem 1rem; + border-radius: var(--radius); + border: 1px solid var(--border); + background: #fff; + box-shadow: 0 12px 28px rgb(15 23 42 / 0.14); + font-size: 0.92rem; + pointer-events: auto; + } + + ${portalViewScope} .org-toast.is-success { + background: #ecfdf5; + border-color: #bbf7d0; + color: #166534; + } + + ${portalViewScope} .org-toast.is-error { + background: #fef2f2; + border-color: #fecaca; + color: #991b1b; + } + + ${portalViewScope} .org-dashboard-grid { + display: grid; + grid-template-columns: repeat(12, minmax(0, 1fr)); + gap: 1.5rem; + align-items: stretch; + } + + ${portalViewScope} .org-panel { + margin-bottom: 0; + text-align: left; + } + + ${portalViewScope} .org-scroll-panel { + display: flex; + flex-direction: column; + min-height: 0; + max-height: var(--org-row-card-max-height); + overflow: hidden; + } + + ${portalViewScope} .org-island-root { + display: flex; + align-self: stretch; + min-height: 0; + min-width: 0; + } + + ${portalViewScope} .org-island-root > .org-panel { + height: 100%; + width: 100%; + } + + ${portalViewScope} .org-span-12 { + grid-column: span 12; + } + + ${portalViewScope} .org-span-7 { + grid-column: span 7; + } + + ${portalViewScope} .org-span-6 { + grid-column: span 6; + } + + ${portalViewScope} .org-span-5 { + grid-column: span 5; + } + + @media (max-width: 960px) { + ${portalViewScope} .org-toast-stack { + top: 1rem; + right: 1rem; + left: 1rem; + } + + ${portalViewScope} .org-toast { + max-width: none; + } + + ${portalViewScope} .org-span-12, + ${portalViewScope} .org-span-7, + ${portalViewScope} .org-span-6, + ${portalViewScope} .org-span-5 { + grid-column: span 12; + } + + ${portalViewScope} .org-scroll-panel { + max-height: none; + } + + } + `, + ); + + OrgPortal.components = OrgPortal.components || {}; + OrgPortal.componentFns = OrgPortal.componentFns || {}; + + OrgPortal.componentFns.TreasuryNoticeLayer = + function TreasuryNoticeLayer() { + const treasuryNotice = store.getTreasuryNotice(); + if (!treasuryNotice.text) { + return null; + } + + return h( + "div", + { className: "org-toast-stack" }, + h( + "div", + { + className: + treasuryNotice.type === "error" + ? "org-toast is-error" + : "org-toast is-success", + }, + treasuryNotice.text, + ), + ); + }; + + OrgPortal.components.App = function App() { + const Hero = window.SharedUI.componentFns.Hero; + const Footer = window.SharedUI.componentFns.Footer; + const FutureCard = OrgPortal.componentFns.FutureCard; + const DangerCard = OrgPortal.componentFns.DangerCard; + const DisbandedView = OrgPortal.componentFns.DisbandedView; + const footerSections = [ + { + title: "Organization Controls", + items: [ + "Roster Management", + "Fleet Assignment", + "Treasury Permissions", + "Asset Registry", + ], + }, + { + title: "Planned Extensions", + items: [ + "Contracts Board", + "Diplomacy Layer", + "Procurement Queue", + "Reputation History", + ], + }, + ]; + if (store.getOrgDisbanded()) { + return h( + "main", + { "data-ui-portal-view": "" }, + h( + "div", + { className: "container" }, + h( + "div", + { className: "org-dashboard-grid" }, + Hero({ + kicker: portalData.org.tag, + title: portalData.org.name, + subtitle: "Player organization command portal", + meta: `${session.actorName} - ${session.role}`, + }), + DisbandedView(), + ), + ), + h("div", { id: "org-portal-modal-root" }), + Footer({ sections: footerSections }), + ); + } + + return h( + "main", + { "data-ui-portal-view": "" }, + h("div", { id: "org-portal-toast-root" }), + h( + "div", + { className: "container" }, + h( + "div", + { className: "org-dashboard-grid" }, + Hero({ + kicker: portalData.org.tag, + title: portalData.org.name, + subtitle: "Player organization command portal", + meta: `${session.actorName} - ${session.role}`, + }), + h("div", { + className: "org-island-root org-span-12", + id: "org-overview-card-root", + }), + h("div", { + className: "org-island-root org-span-7", + id: "org-fleet-card-root", + }), + h("div", { + className: "org-island-root org-span-5", + id: "org-treasury-card-root", + }), + h("div", { + className: "org-island-root org-span-5", + id: "org-members-card-root", + }), + h("div", { + className: "org-island-root org-span-7", + id: "org-assets-card-root", + }), + h("div", { + className: "org-island-root org-span-6", + id: "org-activity-card-root", + }), + FutureCard(), + DangerCard(), + ), + ), + h("div", { id: "org-portal-modal-root" }), + Footer({ sections: footerSections }), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/src/views/RegistrationView.js b/arma/client/addons/org/ui/src/views/RegistrationView.js new file mode 100644 index 0000000..c93ad39 --- /dev/null +++ b/arma/client/addons/org/ui/src/views/RegistrationView.js @@ -0,0 +1,346 @@ +(function () { + const RegistryApp = (window.RegistryApp = window.RegistryApp || {}); + const { h, ensureScopedStyle } = RegistryApp.runtime; + const store = RegistryApp.store; + const bridge = RegistryApp.bridge; + const scopeAttr = "data-ui-registration-view"; + const scopeSelector = `[${scopeAttr}]`; + const registrationViewCss = ` +${scopeSelector} { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; + align-items: center; + width: 100%; +} + +${scopeSelector} .info-panel { + text-align: left; + padding: 1rem; +} + +${scopeSelector} .create-feature-list { + text-align: left; + margin-top: 1.5rem; + list-style-type: none; + padding: 0; +} + +${scopeSelector} .create-feature-item { + margin-bottom: 0.5rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +${scopeSelector} .create-feature-icon { + width: 1.2rem; + height: 1.2rem; + flex-shrink: 0; +} + +${scopeSelector} .price-tag { + margin-top: 2rem; + padding: 1rem; + background: var(--bg-app); + border-radius: var(--radius); + border: 1px solid var(--border); +} + +${scopeSelector} .price-label { + display: block; + font-size: 0.9rem; + color: var(--text-muted); +} + +${scopeSelector} .price-value { + display: block; + font-size: 2rem; + font-weight: 700; + color: var(--primary); +} + +${scopeSelector} .form-panel { + margin: 0; +} + +${scopeSelector} .app-form { + display: flex; + flex-direction: column; + gap: 1rem; + text-align: left; +} + +${scopeSelector} .app-form label { + display: block; + margin-bottom: 0.5rem; + color: var(--text-muted); + font-weight: 500; + font-size: 0.9rem; +} + +${scopeSelector} .app-form input, +${scopeSelector} .app-form select { + width: 100%; + padding: 0.75rem; + border-radius: var(--radius); + border: 1px solid var(--border); + background: var(--bg-app); + color: var(--text-main); + font-family: inherit; + font-size: 1rem; + box-sizing: border-box; + transition: border-color 0.2s; +} + +${scopeSelector} .app-form input:focus, +${scopeSelector} .app-form select:focus { + outline: none; + border-color: var(--primary); + box-shadow: 0 0 0 2px rgb(59 130 246 / 0.1); +} + +${scopeSelector} .form-actions { + margin-top: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; + align-items: center; +} + +${scopeSelector} .submit-btn { + width: 100%; +} + +${scopeSelector} .cancel-link { + font-size: 0.9rem; + color: var(--text-muted); + cursor: pointer; + text-decoration: underline; +} + +${scopeSelector} .cancel-link:hover { + color: var(--primary); +} + +${scopeSelector} .form-feedback { + padding: 0.85rem 1rem; + border-radius: var(--radius); + font-size: 0.92rem; +} + +${scopeSelector} .form-feedback.is-error { + background: #fef2f2; + border: 1px solid #fecaca; + color: #991b1b; +} + +@media (max-width: 960px) { + ${scopeSelector} { + grid-template-columns: 1fr; + } +} +`; + + RegistryApp.componentFns = RegistryApp.componentFns || {}; + + RegistryApp.componentFns.RegistrationView = function RegistrationView() { + const isCreating = store.getIsCreating(); + const createError = store.getCreateError(); + ensureScopedStyle("main-registration-view", registrationViewCss); + + const handleCreate = () => { + const data = { + orgName: String( + document.getElementById("org-create-name")?.value || "", + ).trim(), + type: String( + document.getElementById("org-create-type")?.value || "", + ), + }; + + if (!bridge || typeof bridge.requestCreateOrg !== "function") { + store.failCreate("Registration bridge is not available."); + return; + } + + bridge.requestCreateOrg(data); + }; + + return h( + "div", + { className: "split-container", [scopeAttr]: "" }, + h( + "div", + { className: "info-panel" }, + h("h2", null, "Registration Details"), + h( + "p", + null, + "Complete the form to add your organization to the Global Organization Registry. Registration requires at least $50,000 in personal funds.", + ), + h( + "ul", + { className: "create-feature-list" }, + h( + "li", + { className: "create-feature-item" }, + h( + "svg", + { + viewBox: "0 0 24 24", + fill: "none", + stroke: "#10b981", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + className: "create-feature-icon", + }, + h("path", { d: "M20 6L9 17l-5-5" }), + ), + "Official Organization Designator", + ), + h( + "li", + { className: "create-feature-item" }, + h( + "svg", + { + viewBox: "0 0 24 24", + fill: "none", + stroke: "#10b981", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + className: "create-feature-icon", + }, + h("path", { d: "M20 6L9 17l-5-5" }), + ), + "Secure Comms Channel", + ), + h( + "li", + { className: "create-feature-item" }, + h( + "svg", + { + viewBox: "0 0 24 24", + fill: "none", + stroke: "#10b981", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + className: "create-feature-icon", + }, + h("path", { d: "M20 6L9 17l-5-5" }), + ), + "Deployment Roster Access", + ), + h( + "li", + { className: "create-feature-item" }, + h( + "svg", + { + viewBox: "0 0 24 24", + fill: "none", + stroke: "#10b981", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + className: "create-feature-icon", + }, + h("path", { d: "M20 6L9 17l-5-5" }), + ), + "After-Action Report Tools", + ), + ), + h( + "div", + { className: "price-tag" }, + h( + "span", + { className: "price-label" }, + "Required Registration Fee", + ), + h("span", { className: "price-value" }, "$50,000"), + ), + ), + h( + "div", + { className: "form-panel card" }, + h("h2", null, "Organization Registration"), + h( + "div", + { className: "app-form" }, + h( + "div", + null, + h("label", null, "Organization Name"), + h("input", { + id: "org-create-name", + type: "text", + placeholder: "e.g. Task Force 141", + }), + ), + h( + "div", + null, + h("label", null, "Organization Type"), + h( + "select", + { id: "org-create-type" }, + h( + "option", + { value: "infantry" }, + "Infantry / Milsim", + ), + h("option", { value: "aviation" }, "Aviation Wing"), + h( + "option", + { value: "pmc" }, + "Private Military Company", + ), + h( + "option", + { value: "support" }, + "Logistics & Support", + ), + ), + ), + h( + "div", + { className: "form-actions" }, + createError + ? h( + "div", + { className: "form-feedback is-error" }, + createError, + ) + : null, + h( + "button", + { + type: "button", + className: "submit-btn", + disabled: isCreating, + onClick: handleCreate, + }, + isCreating + ? "Submitting Registration..." + : "Submit Registration", + ), + h( + "span", + { + className: "cancel-link", + onClick: () => store.setView("home"), + }, + "Cancel / Return to Main", + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/org/ui/ui.config.mjs b/arma/client/addons/org/ui/ui.config.mjs new file mode 100644 index 0000000..caa5279 --- /dev/null +++ b/arma/client/addons/org/ui/ui.config.mjs @@ -0,0 +1,56 @@ +export default { + addonName: "org", + title: "ORBIS - Global Organization Network", + logLabel: "Org UI", + outputDir: "_site", + jsBundles: [ + { + name: "Org UI app", + output: "org-ui.js", + sources: [ + "src/runtime.js", + "src/registry/store.js", + "src/bridge.js", + "src/portal/data.js", + "src/portal/store.js", + "src/portal/getters.js", + "src/portal/actions.js", + "src/components/navbar.js", + "src/components/header.js", + "src/components/hero.js", + "src/components/footer.js", + "src/components/modal.js", + "src/components/panelCard.js", + "src/components/portal/metricCard.js", + "src/components/portal/simpleStat.js", + "src/components/portal/overviewCard.js", + "src/components/portal/fleetCard.js", + "src/components/portal/treasuryCard.js", + "src/components/portal/assetsCard.js", + "src/components/portal/membersCard.js", + "src/components/portal/activityCard.js", + "src/components/portal/futureCard.js", + "src/components/portal/dangerCard.js", + "src/components/portal/modalLayer.js", + "src/views/DisbandedView.js", + "src/views/PortalView.js", + "src/views/RegistrationView.js", + "src/views/HomeView.js", + "src/components/AppShell.js", + "src/bootstrap.js", + ], + }, + ], + cssBundles: [ + { + name: "Org UI styles", + output: "org-ui.css", + sources: ["src/styles.css"], + }, + ], + site: { + styles: ["org-ui.css"], + commonScripts: ["forge-webui.js"], + scripts: ["org-ui.js"], + }, +}; diff --git a/arma/client/addons/phone.7z b/arma/client/addons/phone.7z new file mode 100644 index 0000000..e058c7c Binary files /dev/null and b/arma/client/addons/phone.7z differ diff --git a/arma/client/addons/phone/$PBOPREFIX$ b/arma/client/addons/phone/$PBOPREFIX$ new file mode 100644 index 0000000..6193056 --- /dev/null +++ b/arma/client/addons/phone/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\phone diff --git a/arma/client/addons/phone/CfgEventHandlers.hpp b/arma/client/addons/phone/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/phone/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/phone/README.md b/arma/client/addons/phone/README.md new file mode 100644 index 0000000..3eb674d --- /dev/null +++ b/arma/client/addons/phone/README.md @@ -0,0 +1,29 @@ +# Forge Client Phone + +## Overview +The phone addon provides the in-game phone UI for contacts, SMS messages, and +email. It keeps a local `PhoneRepository` facade for view state and sends all +authoritative operations to the server phone addon. + +## Dependencies +- `forge_client_main` +- server phone events from `forge_server_phone` +- notifications for contact/message/email feedback + +## Main Components +- `fnc_initRepository.sqf` initializes the local phone repository. +- `fnc_handleUIEvents.sqf` translates browser events into server phone RPCs. +- `fnc_openUI.sqf` opens `RscPhone`. +- `ui/_site` contains the browser phone UI source. + +## Supported Operations +- initialize and sync phone state +- refresh contacts +- add/remove contacts by UID, phone number, or email +- send, read, and delete SMS messages +- send, read, and delete email +- push incoming message/email updates into the browser UI + +## Runtime Notes +Phone data is owned by the server extension. Client state is only used to render +the phone UI and provide immediate feedback. diff --git a/arma/client/addons/phone/XEH_PREP.hpp b/arma/client/addons/phone/XEH_PREP.hpp new file mode 100644 index 0000000..97e1950 --- /dev/null +++ b/arma/client/addons/phone/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initRepository); +PREP(openUI); diff --git a/arma/client/addons/phone/XEH_postInit.sqf b/arma/client/addons/phone/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/phone/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/phone/XEH_postInitClient.sqf b/arma/client/addons/phone/XEH_postInitClient.sqf new file mode 100644 index 0000000..532ae08 --- /dev/null +++ b/arma/client/addons/phone/XEH_postInitClient.sqf @@ -0,0 +1,340 @@ +#include "script_component.hpp" + +[{ + GETVAR(player,FORGE_isLoaded,false) +}, { + [QGVAR(initPhone), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); + +if (isNil QGVAR(PhoneRepository)) then { [] call FUNC(initRepository); }; + +[QGVAR(initPhone), { + GVAR(PhoneRepository) call ["init", []]; + + ["forge_server_phone_requestInitPhone", [getPlayerUID player, createHashMap]] call CFUNC(serverEvent); + ["forge_server_phone_requestRefreshContacts", [getPlayerUID player, player]] call CFUNC(serverEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncPhone), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(PhoneRepository) call ["sync", [_data]]; +}] call CFUNC(addEventHandler); + +// Contact Management Response Events +[QGVAR(responseAddContact), { + params [["_success", false, [false]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Contact Added", "Contact added successfully", 3000]]; + [QGVAR(refreshUI), []] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Contact Error", "Failed to add contact", 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseAddContactByPhone), { + params [["_success", false, [false]], ["_phoneNumber", "", [""]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Contact Added", format ["Contact with phone %1 added successfully", _phoneNumber], 3000]]; + [QGVAR(refreshUI), []] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["warning", "Contact Not Found", format ["Player with phone %1 not found", _phoneNumber], 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseAddContactByEmail), { + params [["_success", false, [false]], ["_email", "", [""]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Contact Added", format ["Contact with email %1 added successfully", _email], 3000]]; + [QGVAR(refreshUI), []] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["warning", "Contact Not Found", format ["Player with email %1 not found", _email], 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseRemoveContact), { + params [["_success", false, [false]], ["_contactUid", "", [""]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Contact Removed", "Contact removed successfully", 3000]]; + [QGVAR(refreshUI), []] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Contact Error", "Failed to remove contact", 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseRefreshContacts), { + params [["_contacts", [], [[]]]]; + + diag_log format ["[FORGE:Client:Phone] Contacts refreshed: %1 contacts", count _contacts]; + + [QGVAR(updateContacts), [_contacts]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseGetContacts), { + params [["_contactUids", [], [[]]]]; + + diag_log format ["[FORGE:Client:Phone] Got contact UIDs: %1", _contactUids]; +}] call CFUNC(addEventHandler); + +// Messaging Response Events +[QGVAR(responseMessageSent), { + params [["_messageObj", createHashMap, [createHashMap]]]; + + diag_log format ["[FORGE:Client:Phone] Message sent: %1", _messageObj]; + + [QGVAR(updateMessageSent), [_messageObj]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseMessageReceived), { + params [["_messageObj", createHashMap, [createHashMap]]]; + + private _fromUid = _messageObj get "from"; + private _message = _messageObj get "message"; + private _contacts = player getVariable ["FORGE_Contacts", []]; + private _senderName = "Unknown"; + + { + if ((_x get "uid") isEqualTo _fromUid) exitWith { + _senderName = _x get "name"; + }; + } forEach _contacts; + + EGVAR(notifications,NotificationService) call ["create", ["info", "New Message", format ["From %1", _senderName], 4000]]; + + diag_log format ["[FORGE:Client:Phone] Message received from %1: %2", _fromUid, _message]; + + [QGVAR(updateMessageReceived), [_messageObj]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseSendMessage), { + params [["_success", false, [false]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Message Sent", "Message sent successfully", 2000]]; + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Message Failed", "Failed to send message", 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseGetMessages), { + params [["_messages", [], [[]]]]; + + diag_log format ["[FORGE:Client:Phone] Got %1 messages", count _messages]; + + [QGVAR(updateMessages), [_messages]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseGetMessageThread), { + params [["_messages", [], [[]]], ["_otherUid", "", [""]]]; + + diag_log format ["[FORGE:Client:Phone] Got message thread with %1: %2 messages", _otherUid, count _messages]; + + [QGVAR(updateMessageThread), [_messages, _otherUid]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseMarkMessageRead), { + params [["_success", false, [false]], ["_messageId", "", [""]]]; + + if (_success) then { diag_log format ["[FORGE:Client:Phone] Message %1 marked as read", _messageId]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseMessageRead), { + params [["_messageId", "", [""]]]; + + diag_log format ["[FORGE:Client:Phone] Message %1 marked as read", _messageId]; + + [QGVAR(updateMessageRead), [_messageId]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseDeleteMessage), { + params [["_success", false, [false]], ["_messageId", "", [""]]]; + + if (_success) then { + diag_log format ["[FORGE:Client:Phone] Message %1 deleted", _messageId]; + [QGVAR(updateMessageDeleted), [_messageId]] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Message Delete Failed", "Failed to delete message", 4000]]; + }; +}] call CFUNC(addEventHandler); + +// Email Response Events +[QGVAR(responseEmailSent), { + params [["_emailObj", createHashMap, [createHashMap]]]; + + diag_log format ["[FORGE:Client:Phone] Email sent: %1", _emailObj]; + + [QGVAR(updateEmailSent), [_emailObj]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseEmailReceived), { + params [["_emailObj", createHashMap, [createHashMap]]]; + + private _fromUid = _emailObj get "from"; + private _subject = _emailObj get "subject"; + private _contacts = player getVariable ["FORGE_Contacts", []]; + private _senderName = "Unknown"; + + { + if ((_x get "uid") isEqualTo _fromUid) exitWith { + _senderName = _x get "name"; + }; + } forEach _contacts; + + EGVAR(notifications,NotificationService) call ["create", ["info", "New Email", format ["From %1: %2", _senderName, _subject], 4000]]; + + diag_log format ["[FORGE:Client:Phone] Email received from %1: %2", _fromUid, _subject]; + + [QGVAR(updateEmailReceived), [_emailObj]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseSendEmail), { + params [["_success", false, [false]]]; + + if (_success) then { + EGVAR(notifications,NotificationService) call ["create", ["success", "Email Sent", "Email sent successfully", 2000]]; + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Email Failed", "Failed to send email", 4000]]; + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseGetEmails), { + params [["_emails", [], [[]]]]; + + diag_log format ["[FORGE:Client:Phone] Got %1 emails", count _emails]; + + [QGVAR(updateEmails), [_emails]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseMarkEmailRead), { + params [["_success", false, [false]], ["_emailId", "", [""]]]; + + if (_success) then { + diag_log format ["[FORGE:Client:Phone] Email %1 marked as read", _emailId]; + [QGVAR(updateEmailRead), [_emailId]] call CFUNC(localEvent); + }; +}] call CFUNC(addEventHandler); + +[QGVAR(responseEmailRead), { + params [["_emailId", "", [""]]]; + + diag_log format ["[FORGE:Client:Phone] Email %1 marked as read", _emailId]; + + [QGVAR(updateEmailRead), [_emailId]] call CFUNC(localEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(responseDeleteEmail), { + params [["_success", false, [false]], ["_emailId", "", [""]]]; + + if (_success) then { + diag_log format ["[FORGE:Client:Phone] Email %1 deleted", _emailId]; + [QGVAR(updateEmailDeleted), [_emailId]] call CFUNC(localEvent); + } else { + EGVAR(notifications,NotificationService) call ["create", ["danger", "Email Delete Failed", "Failed to delete email", 4000]]; + }; +}] call CFUNC(addEventHandler); + +// Cleanup Response Events +[QGVAR(responseRemovePhone), { + params [["_success", false, [false]]]; + + if (_success) then { diag_log "[FORGE:Client:Phone] Phone data removed successfully"; }; +}] call CFUNC(addEventHandler); + +// UI Update Events (for internal use) +[QGVAR(refreshUI), { + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", "refreshContacts()"]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateContacts), { + params [["_contacts", [], [[]]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateContacts(%1)", (toJSON _contacts)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateMessageSent), { + params [["_messageObj", createHashMap, [createHashMap]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateMessageSent(%1)", (toJSON _messageObj)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateMessageReceived), { + params [["_messageObj", createHashMap, [createHashMap]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateMessageReceived(%1)", (toJSON _messageObj)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateMessages), { + params [["_messages", [], [[]]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateMessages(%1)", (toJSON _messages)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateMessageThread), { + params [["_messages", [], [[]]], ["_otherUid", "", [""]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateMessageThread(%1, %2)", (toJSON _messages), (toJSON _otherUid)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateMessageDeleted), { + params [["_messageId", "", [""]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateMessageDeleted(%1)", (toJSON _messageId)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateEmailSent), { + params [["_emailObj", createHashMap, [createHashMap]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateEmailSent(%1)", (toJSON _emailObj)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateEmailReceived), { + params [["_emailObj", createHashMap, [createHashMap]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateEmailReceived(%1)", (toJSON _emailObj)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateEmails), { + params [["_emails", [], [[]]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateEmails(%1)", (toJSON _emails)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateEmailRead), { + params [["_emailId", "", [""]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateEmailRead(%1)", (toJSON _emailId)]]; }; +}] call CFUNC(addEventHandler); + +[QGVAR(updateEmailDeleted), { + params [["_emailId", "", [""]]]; + + private _control = (uiNamespace getVariable ["RscPhone", displayNull]) displayCtrl 1001; + + if (!isNull _control) then { _control ctrlWebBrowserAction ["ExecJS", format ["updateEmailDeleted(%1)", (toJSON _emailId)]]; }; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/phone/XEH_preInit.sqf b/arma/client/addons/phone/XEH_preInit.sqf new file mode 100644 index 0000000..814e573 --- /dev/null +++ b/arma/client/addons/phone/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/phone/XEH_preInitClient.sqf b/arma/client/addons/phone/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/phone/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/phone/XEH_preStart.sqf b/arma/client/addons/phone/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/phone/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/phone/config.cpp b/arma/client/addons/phone/config.cpp new file mode 100644 index 0000000..a80ac19 --- /dev/null +++ b/arma/client/addons/phone/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J. Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscPhone.hpp" diff --git a/arma/client/addons/phone/functions/fnc_handleUIEvents.sqf b/arma/client/addons/phone/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..a5c4936 --- /dev/null +++ b/arma/client/addons/phone/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,401 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Handles UI events. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_phone_fnc_handleUIEvents; + * + * Public: No + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +// diag_log format ["[FORGE:Client:Phone] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "phone::get::player": { + private _uid = getPlayerUID player; + _control ctrlWebBrowserAction ["ExecJS", format ["setPlayerUid(%1)", (toJSON _uid)]]; + }; + case "phone::get::theme": { + private _isDark = profileNamespace getVariable ["FORGE_Phone_isDark", true]; + private _theme = ["light", "dark"] select (_isDark); + + _control ctrlWebBrowserAction ["ExecJS", format ["setTheme(%1)", (toJSON _theme)]]; + }; + case "phone::get::contacts": { + private _contacts = player getVariable ["FORGE_Contacts", []]; + + _control ctrlWebBrowserAction ["ExecJS", format ["loadContacts(%1)", (toJSON _contacts)]]; + ["forge_server_phone_requestRefreshContacts", [getPlayerUID player, player]] call CFUNC(serverEvent); + }; + case "phone::set::theme": { + private _isDark = _data get "isDark"; + + profileNamespace setVariable ["FORGE_Phone_isDark", _isDark]; + }; + case "phone::add::contact": { + private _contactPhone = _data get "phone"; + + if (_contactPhone isNotEqualTo "") then { + ["forge_server_phone_requestAddContactByPhone", [getPlayerUID player, _contactPhone, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No phone number provided for contact addition"; + }; + }; + case "phone::add::contact::by::phone": { + private _phoneNumber = _data get "phone"; + + if (_phoneNumber isNotEqualTo "") then { + ["forge_server_phone_requestAddContactByPhone", [getPlayerUID player, _phoneNumber, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No phone number provided"; + }; + }; + case "phone::add::contact::by::email": { + private _email = _data get "email"; + + if (_email isNotEqualTo "") then { + ["forge_server_phone_requestAddContactByEmail", [getPlayerUID player, _email, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No email provided"; + }; + }; + case "phone::remove::contact": { + private _contactUid = _data get "uid"; + + if (_contactUid isNotEqualTo "") then { + ["forge_server_phone_requestRemoveContact", [getPlayerUID player, _contactUid, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No contact UID provided for removal"; + }; + }; + case "phone::refresh::contacts": { + ["forge_server_phone_requestRefreshContacts", [getPlayerUID player, player]] call CFUNC(serverEvent); + }; + case "phone::send::message": { + private _contactName = _data get "contactName"; + private _messageData = _data get "message"; + private _messageText = _messageData get "text"; + private _toUid = _data get "toUid"; + + if (_toUid isNotEqualTo "") then { + ["forge_server_phone_requestSendMessage", [getPlayerUID player, _toUid, _messageText, player]] call CFUNC(serverEvent); + } else { + diag_log format ["[FORGE:Client:Phone] No recipient UID provided for message to %1", _contactName]; + }; + }; + case "phone::get::messages": { + ["forge_server_phone_requestGetMessages", [getPlayerUID player, player]] call CFUNC(serverEvent); + }; + case "phone::get::message::thread": { + private _otherUid = _data get "otherUid"; + + if (_otherUid isNotEqualTo "") then { + ["forge_server_phone_requestGetMessageThread", [getPlayerUID player, _otherUid, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No other UID provided for message thread"; + }; + }; + case "phone::mark::message::read": { + private _messageId = _data get "messageId"; + + if (_messageId isNotEqualTo "") then { + ["forge_server_phone_requestMarkMessageRead", [getPlayerUID player, _messageId, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No message ID provided for mark read"; + }; + }; + case "phone::delete::message": { + private _messageId = _data get "messageId"; + + if (_messageId isNotEqualTo "") then { + ["forge_server_phone_requestDeleteMessage", [getPlayerUID player, _messageId, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No message ID provided for delete"; + }; + }; + case "phone::send::email": { + private _toUid = _data get "toUid"; + private _subject = _data get "subject"; + private _body = _data get "body"; + if (_subject isEqualTo "") then { _subject = "No subject"; }; + + if (_toUid isNotEqualTo "" && _body isNotEqualTo "") then { + diag_log format ["[FORGE:Client:Phone] Sending email to %1 subject length %2 body length %3", _toUid, count _subject, count _body]; + ["forge_server_phone_requestSendEmail", [getPlayerUID player, _toUid, _subject, _body, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] Missing required email parameters"; + }; + }; + case "phone::get::emails": { + ["forge_server_phone_requestGetEmails", [getPlayerUID player, player]] call CFUNC(serverEvent); + }; + case "phone::mark::email::read": { + private _emailId = _data get "emailId"; + + if (_emailId isNotEqualTo "") then { + ["forge_server_phone_requestMarkEmailRead", [getPlayerUID player, _emailId, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No email ID provided for mark read"; + }; + }; + case "phone::delete::email": { + private _emailId = _data get "emailId"; + + if (_emailId isNotEqualTo "") then { + ["forge_server_phone_requestDeleteEmail", [getPlayerUID player, _emailId, player]] call CFUNC(serverEvent); + } else { + diag_log "[FORGE:Client:Phone] No email ID provided for delete"; + }; + }; + case "phone::get::notes": { + private _notes = GVAR(PhoneRepository) call ["getAllNotes", []]; + + _control ctrlWebBrowserAction ["ExecJS", format ["loadNotes(%1)", (toJSON _notes)]]; + }; + case "phone::save::note": { + private _success = GVAR(PhoneRepository) call ["addNote", [_data]]; + _success + }; + case "phone::delete::note": { + private _noteId = _data get "id"; + + private _success = GVAR(PhoneRepository) call ["deleteNote", [_noteId]]; + _success + }; + case "phone::get::events": { + private _events = profileNamespace getVariable ["FORGE_Phone_Events", []]; + + _control ctrlWebBrowserAction ["ExecJS", format ["loadCalendarEvents(%1)", (toJSON _events)]]; + }; + case "phone::save::event": { + private _eventId = _data get "id"; + private _eventTitle = _data get "title"; + + private _events = profileNamespace getVariable ["FORGE_Phone_Events", []]; + private _existingIndex = -1; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _eventId) then { + _existingIndex = _forEachIndex; + }; + } forEach _events; + + if (_existingIndex >= 0) then { + _events set [_existingIndex, _data]; + diag_log format ["[PHONE] Updated event: %1 [ID: %2]", _eventTitle, _eventId]; + } else { + _events pushBack _data; + diag_log format ["[PHONE] Added new event: %1 [ID: %2]", _eventTitle, _eventId]; + }; + + profileNamespace setVariable ["FORGE_Phone_Events", _events]; + diag_log format ["[PHONE] Saved events to profile. Total events: %1", count _events]; + }; + case "phone::delete::event": { + private _eventId = _data get "id"; + private _events = profileNamespace getVariable ["FORGE_Phone_Events", []]; + + private _newEvents = []; + private _deleted = false; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _eventId) then { + _deleted = true; + } else { + _newEvents pushBack _x; + }; + } forEach _events; + + if (_deleted) then { + profileNamespace setVariable ["FORGE_Phone_Events", _newEvents]; + diag_log format ["[PHONE] Deleted calendar event [ID: %1]. Remaining events: %2", _eventId, count _newEvents]; + } else { + diag_log format ["[PHONE] Calendar event not found for deletion [ID: %1]", _eventId]; + }; + }; + case "phone::get::clocks": { + private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []]; + + _control ctrlWebBrowserAction ["ExecJS", format ["loadWorldClocks(%1)", (toJSON _worldClocks)]]; + }; + case "phone::save::clock": { + private _clockId = _data get "id"; + private _timezone = _data get "timezone"; + private _city = _data get "city"; + + private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []]; + private _clockExists = false; + { + private _existingId = _x get "id"; + private _existingTimezone = _x get "timezone"; + if (_existingId isEqualTo _clockId || _existingTimezone isEqualTo _timezone) then { + _clockExists = true; + }; + } forEach _worldClocks; + + if (!_clockExists) then { + _worldClocks pushBack _data; + profileNamespace setVariable ["FORGE_Phone_WorldClocks", _worldClocks]; + + diag_log format ["[PHONE] Added world clock: %1 (%2) [ID: %3]. Total clocks: %4", _city, _timezone, _clockId, count _worldClocks]; + } else { + diag_log format ["[PHONE] World clock already exists: %1 (%2) [ID: %3]. Skipping duplicate.", _city, _timezone, _clockId]; + }; + }; + case "phone::delete::clock": { + private _clockId = _data get "id"; + + private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []]; + private _newClocks = []; + private _deleted = false; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _clockId) then { + _deleted = true; + } else { + _newClocks pushBack _x; + }; + } forEach _worldClocks; + + if (_deleted) then { + profileNamespace setVariable ["FORGE_Phone_WorldClocks", _newClocks]; + diag_log format ["[PHONE] Deleted world clock [ID: %1]. Remaining clocks: %2", _clockId, count _newClocks]; + } else { + diag_log format ["[PHONE] World clock not found for deletion [ID: %1]", _clockId]; + }; + }; + case "phone::get::alarms": { + private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []]; + + _control ctrlWebBrowserAction ["ExecJS", format ["loadAlarms(%1)", (toJSON _alarms)]]; + }; + case "phone::save::alarm": { + private _alarmId = _data get "id"; + private _alarmTime = _data get "time"; + private _alarmLabel = _data get "label"; + + private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []]; + private _existingIndex = -1; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _alarmId) then { + _existingIndex = _forEachIndex; + }; + } forEach _alarms; + + if (_existingIndex >= 0) then { + _alarms set [_existingIndex, _data]; + diag_log format ["[PHONE] Updated alarm: %1 at %2 [ID: %3]", _alarmLabel, _alarmTime, _alarmId]; + } else { + _alarms pushBack _data; + diag_log format ["[PHONE] Added new alarm: %1 at %2 [ID: %3]", _alarmLabel, _alarmTime, _alarmId]; + }; + + profileNamespace setVariable ["FORGE_Phone_Alarms", _alarms]; + diag_log format ["[PHONE] Saved alarms to profile. Total alarms: %1", count _alarms]; + }; + case "phone::delete::alarm": { + private _alarmId = _data get "id"; + + private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []]; + private _newAlarms = []; + private _deleted = false; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _alarmId) then { + _deleted = true; + } else { + _newAlarms pushBack _x; + }; + } forEach _alarms; + + if (_deleted) then { + profileNamespace setVariable ["FORGE_Phone_Alarms", _newAlarms]; + diag_log format ["[PHONE] Deleted alarm [ID: %1]. Remaining alarms: %2", _alarmId, count _newAlarms]; + } else { + diag_log format ["[PHONE] Alarm not found for deletion [ID: %1]", _alarmId]; + }; + }; + case "phone::toggle::alarm": { + private _alarmId = _data get "id"; + + private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []]; + { + private _existingId = _x get "id"; + if (_existingId isEqualTo _alarmId) then { + private _currentEnabled = _x get "enabled"; + _x set ["enabled", !_currentEnabled]; + diag_log format ["[PHONE] Toggled alarm [ID: %1] to %2", _alarmId, !_currentEnabled]; + }; + } forEach _alarms; + + profileNamespace setVariable ["FORGE_Phone_Alarms", _alarms]; + }; + case "phone::bank::refresh": { + ["forge_server_bank_requestHydrateBank", [getPlayerUID player, "bank", false]] call CFUNC(serverEvent); + }; + case "phone::bank::transfer::request": { + private _amount = floor (_data getOrDefault ["amount", 0]); + private _target = _data getOrDefault ["target", ""]; + private _from = toLowerANSI (_data getOrDefault ["from", "bank"]); + + if (_target isNotEqualTo "" && { _amount > 0 }) then { + ["forge_server_bank_requestTransfer", [getPlayerUID player, _target, _from, _amount]] call CFUNC(serverEvent); + } else { + private _display = uiNamespace getVariable ["RscPhone", displayNull]; + if !(isNull _display) then { + private _control = _display displayCtrl 1001; + if !(isNull _control) then { + _control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Choose a recipient and valid amount.')"]; + }; + }; + }; + }; + case "phone::bank::depositEarnings::request": { + private _amount = floor (_data getOrDefault ["amount", 0]); + + if (_amount > 0) then { + ["forge_server_bank_requestDepositEarnings", [getPlayerUID player, _amount]] call CFUNC(serverEvent); + } else { + private _display = uiNamespace getVariable ["RscPhone", displayNull]; + if !(isNull _display) then { + private _control = _display displayCtrl 1001; + if !(isNull _control) then { + _control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Enter a valid earnings amount.')"]; + }; + }; + }; + }; + case "phone::bank::repayCreditLine::request": { + private _amount = floor (_data getOrDefault ["amount", 0]); + + if (_amount > 0) then { + ["forge_server_bank_requestRepayCreditLine", [getPlayerUID player, _amount]] call CFUNC(serverEvent); + } else { + private _display = uiNamespace getVariable ["RscPhone", displayNull]; + if !(isNull _display) then { + private _control = _display displayCtrl 1001; + if !(isNull _control) then { + _control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Enter a valid payment amount.')"]; + }; + }; + }; + }; + default { hint format ["Unhandled phone event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/phone/functions/fnc_initRepository.sqf b/arma/client/addons/phone/functions/fnc_initRepository.sqf new file mode 100644 index 0000000..d563b93 --- /dev/null +++ b/arma/client/addons/phone/functions/fnc_initRepository.sqf @@ -0,0 +1,256 @@ +#include "..\script_component.hpp" + +#pragma hemtt ignore_variables ["_self"] + +/* + * Author: IDSolutions + * Initialize phone repository + * + * Arguments: + * N/A + * + * Return Value: + * Phone repository object + * + * Examples: + * [] call forge_client_phone_fnc_initRepository + * + * Public: Yes + */ + +GVAR(PhoneRepository) = createHashMapObject [[ + ["#type", "IPhoneRepository"], + ["#create", { + _self set ["uid", getPlayerUID player]; + _self set ["notes", createHashMap]; + _self set ["events", []]; + _self set ["settings", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + + private _settings = createHashMap; + _settings set ["theme", "light"]; + _settings set ["notifications", true]; + _settings set ["sound", true]; + _settings set ["vibration", true]; + _self set ["settings", _settings]; + }], + ["init", { + private _savedNotes = profileNamespace getVariable ["FORGE_Phone_Notes", createHashMap]; + private _savedEvents = profileNamespace getVariable ["FORGE_Phone_Events", []]; + private _savedSettings = profileNamespace getVariable ["FORGE_Phone_Settings", createHashMap]; + + _self set ["notes", _savedNotes]; + _self set ["events", _savedEvents]; + + private _defaultSettings = _self get "settings"; + { + _defaultSettings set [_x, _y]; + } forEach _savedSettings; + + _self set ["settings", _defaultSettings]; + _self set ["isLoaded", true]; + + systemChat format ["Phone loaded for %1", name player]; + diag_log "[FORGE:Client:Phone] Phone Repository Initialized!"; + }], + ["_padString", { + params [["_number", 0, [0]], ["_length", 0, [0]]]; + + private _str = str _number; + while { (_str select [(_length - 1), 1]) == "" } do { _str = "0" + _str }; + _str + }], + ["save", { + params [["_sync", false, [false]]]; + + profileNamespace setVariable ["FORGE_Phone_Notes", _self get "notes"]; + profileNamespace setVariable ["FORGE_Phone_Events", _self get "events"]; + profileNamespace setVariable ["FORGE_Phone_Settings", _self get "settings"]; + + if (_sync) then { saveProfileNamespace; }; + _self set ["lastSave", time]; + }], + ["sync", { + params [["_data", createHashMap, [createHashMap]]]; + if (_data isEqualTo createHashMap) exitWith { diag_log "[FORGE:Client:Phone] Empty data received for sync, skipping."; }; + }], + ["get", { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _settings = _self get "settings"; + _settings getOrDefault [_key, _default]; + }], + ["addNote", { + params [["_data", createHashMap, [createHashMap]]]; + if (_data isEqualTo createHashMap) exitWith { false }; + + private _noteId = _data get "id"; + private _notes = _self get "notes"; + _notes set [_noteId, _data]; + _self call ["save", [true]]; + + diag_log format ["[FORGE:Client:Phone] Added note [ID: %1]", _noteId]; + true + }], + ["updateNote", { + params [["_data", createHashMap, [createHashMap]]]; + + private _noteId = _data get "id"; + if (isNil "_noteId" || _noteId == "") exitWith { false }; + + private _notes = _self get "notes"; + if !(_noteId in _notes) exitWith { false }; + + _notes set [_noteId, _data]; + _self set ["notes", _notes]; + _self call ["save", [true]]; + + diag_log format ["[FORGE:Client:Phone] Updated note [ID: %1]", _noteId]; + true + }], + ["deleteNote", { + params [["_noteId", "", [""]]]; + if (_noteId == "") exitWith { false }; + + private _notes = _self get "notes"; + if !(_noteId in _notes) exitWith { false }; + + _notes deleteAt _noteId; + _self set ["notes", _notes]; + _self call ["save", [true]]; + + diag_log format ["[FORGE:Client:Phone] Deleted note [ID: %1]", _noteId]; + true + }], + ["getNote", { + params [["_noteId", "", [""]], ["_default", nil]]; + + private _notes = _self get "notes"; + _notes getOrDefault [_noteId, _default]; + }], + ["getAllNotes", { + private _notes = _self get "notes"; + private _notesArray = []; + + { + _notesArray pushBack _y; + } forEach _notes; + + _notesArray + }], + ["setSetting", { + params [["_key", "", [""]], ["_value", nil]]; + if (_key == "") exitWith { false }; + + private _settings = _self get "settings"; + _settings set [_key, _value]; + _self set ["settings", _settings]; + _self call ["save", [true]]; + + true + }], + ["getSetting", { + params [["_key", "", [""]], ["_default", nil]]; + + private _settings = _self get "settings"; + _settings getOrDefault [_key, _default]; + }], + ["getAllSettings", { + _self get "settings"; + }], + ["addEvent", { + params [["_eventData", createHashMap, [createHashMap]]]; + if (_eventData isEqualTo createHashMap) exitWith { false }; + + private _eventId = _eventData get "id"; + if (isNil "_eventId" || _eventId == "") exitWith { false }; + + private _events = _self get "events"; + private _existingIndex = _events findIf { (_x get "id") isEqualTo _eventId }; + + if (_existingIndex >= 0) then { + _events set [_existingIndex, _eventData]; + diag_log format ["[FORGE:Client:Phone] Updated event [ID: %1]", _eventId]; + } else { + _events pushBack _eventData; + diag_log format ["[FORGE:Client:Phone] Added event [ID: %1]", _eventId]; + }; + + _self set ["events", _events]; + _self call ["save", [true]]; + true + }], + ["updateEvent", { + params [["_eventData", createHashMap, [createHashMap]]]; + + private _eventId = _eventData get "id"; + if (isNil "_eventId" || _eventId == "") exitWith { false }; + + private _events = _self get "events"; + private _existingIndex = _events findIf { (_x get "id") isEqualTo _eventId }; + if (_existingIndex < 0) exitWith { false }; + + _events set [_existingIndex, _eventData]; + _self set ["events", _events]; + _self call ["save", [true]]; + + diag_log format ["[FORGE:Client:Phone] Updated event [ID: %1]", _eventId]; + true + }], + ["deleteEvent", { + params [["_eventId", "", [""]]]; + if (_eventId == "") exitWith { false }; + + private _events = _self get "events"; + private _existingIndex = _events findIf { (_x get "id") isEqualTo _eventId }; + if (_existingIndex < 0) exitWith { false }; + + _events deleteAt _existingIndex; + _self set ["events", _events]; + _self call ["save", [true]]; + + diag_log format ["[FORGE:Client:Phone] Deleted event [ID: %1]", _eventId]; + true + }], + ["getEvent", { + params [["_eventId", "", [""]], ["_default", nil]]; + + private _events = _self get "events"; + private _event = _events select { (_x get "id") isEqualTo _eventId }; + if (_event isNotEqualTo []) then { _event select 0 } else { _default }; + }], + ["getAllEvents", { + _self get "events"; + }], + ["getEventsByDate", { + params [["_date", "", [""]]]; + + private _events = _self get "events"; + _events select { + private _eventStartTime = _x get "startTime"; + if (isNil "_eventStartTime") then { false } else { + private _eventDate = (_eventStartTime splitString "T") select 0; + _eventDate isEqualTo _date + }; + } + }], + ["clearAllEvents", { + _self set ["events", []]; + _self call ["save", [true]]; + diag_log "[FORGE:Client:Phone] Cleared all events"; + true + }], + ["getEventsForToday", { + private _currentTime = systemTimeUTC; + private _todayDate = format ["%1-%2-%3", + _currentTime select 0, + _self call ["_padString", [(_currentTime select 1), 2]], + _self call ["_padString", [(_currentTime select 2), 2]] + ]; + + _self call ["getEventsByDate", [_todayDate]] + }] +]]; + +GVAR(PhoneRepository) diff --git a/arma/client/addons/phone/functions/fnc_openUI.sqf b/arma/client/addons/phone/functions/fnc_openUI.sqf new file mode 100644 index 0000000..e52b08c --- /dev/null +++ b/arma/client/addons/phone/functions/fnc_openUI.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Open phone interface. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_phone_fnc_openUI; + * + * Public: No + */ + +private _display = (findDisplay 46) createDisplay "RscPhone"; +private _ctrl = (_display displayCtrl 1001); + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +_ctrl ctrlWebBrowserAction ["LoadFile", QUOTE(PATHTOF(ui\_site\index.html))]; +// _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; + +true; diff --git a/arma/client/addons/phone/initKeybinds.inc.sqf b/arma/client/addons/phone/initKeybinds.inc.sqf new file mode 100644 index 0000000..3981da7 --- /dev/null +++ b/arma/client/addons/phone/initKeybinds.inc.sqf @@ -0,0 +1,8 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" + +[ + _category, QGVAR(ForgePhone), + [LSTRING(phone), LSTRING(phoneTooltip)], { + [] call FUNC(openUI) + }, {}, [DIK_P, [false, false, false]] +] call CFUNC(addKeybind); diff --git a/arma/client/addons/phone/script_component.hpp b/arma/client/addons/phone/script_component.hpp new file mode 100644 index 0000000..9a22aa9 --- /dev/null +++ b/arma/client/addons/phone/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT phone +#define COMPONENT_BEAUTIFIED Phone +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/phone/stringtable.xml b/arma/client/addons/phone/stringtable.xml new file mode 100644 index 0000000..7dbec09 --- /dev/null +++ b/arma/client/addons/phone/stringtable.xml @@ -0,0 +1,14 @@ + + + + + Phone + + + Phone + + + Open your phone + + + diff --git a/arma/client/addons/phone/ui/RscCommon.hpp b/arma/client/addons/phone/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/phone/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/phone/ui/RscPhone.hpp b/arma/client/addons/phone/ui/RscPhone.hpp new file mode 100644 index 0000000..8c425f2 --- /dev/null +++ b/arma/client/addons/phone/ui/RscPhone.hpp @@ -0,0 +1,22 @@ +class RscPhone { + idd = 1000; + movingEnable = 1; + enableSimulation = 1; + duration = 1e011; + fadeIn = 0; + fadeOut = 0; + onLoad = "uiNamespace setVariable ['RscPhone', _this select 0]"; + + class controlsBackground {}; + class controls { + class Background: RscText { + type = 106; + idc = 1001; + x = "safezoneX + (safezoneW * 0.4125)"; + y = "safezoneY + (safezoneH * 0.1)"; + w = "safezoneW * 1"; + h = "safezoneH * 1"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/phone/ui/_site/README.md b/arma/client/addons/phone/ui/_site/README.md new file mode 100644 index 0000000..a90b767 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/README.md @@ -0,0 +1,156 @@ +# Phone UI Framework + +A lightweight, component-based framework for building phone-like user interfaces in the browser. This framework provides a React-like development experience without external dependencies, making it perfect for creating mobile-first web applications. + +## Features + +- Component-based architecture (React-like API) +- Virtual DOM-like rendering system +- Built-in global and local state management +- Modular, maintainable CSS structure +- Mobile-first, accessible design (ARIA roles/labels) +- No external dependencies +- Easy production bundling (JS & CSS) + +## Getting Started + +1. Clone the repository +2. **On Windows, run the provided script to build and start the local server:** + ```powershell + ./start.ps1 + ``` + This will automatically build the JS and CSS bundles and open the app in your browser at [http://localhost:8000](http://localhost:8000). + +3. **On Linux/macOS, run the provided shell script:** + ```sh + chmod +x start.sh + ./start.sh + ``` + This will automatically build the JS and CSS bundles and open the app in your browser at [http://localhost:8000](http://localhost:8000). + +4. If you prefer, you can run the build manually with `node tools/concat-all.js` and start a local server (e.g., `python3 -m http.server`). + +> **Note:** The app will not work unless you run the build script. Always re-run the build script if you add, remove, or change any JS or CSS files. + +## Project Structure + +``` +├── index.html # Main entry point +├── dist/ # Production bundles (auto-generated) +│ ├── app.bundle.js +│ └── app.bundle.css +├── styles/ # CSS files +│ ├── base.css +│ ├── main.css +│ └── components/ # Component-specific styles +├── js/ # JavaScript files +│ ├── core/ # Core framework (Component, StateManager) +│ ├── components/ # Shared UI components +│ ├── apps/ # App modules (phone, messages, contacts, settings) +│ ├── utils/ # Utility functions (scriptLoader, helpers) +│ ├── app.js # Main app integration/root +│ └── main.js # App initialization +├── tools/ # Build and utility scripts +│ ├── concat-js.js +│ ├── concat-css.js +│ └── concat-all.js +├── start.ps1 # Windows script to build and start local server +├── start.sh # Linux/macOS script to build and start local server +└── images/ # Image assets +``` + +## App Structure + +- **Main App (`App` class in `js/app.js`)**: Handles app switching, global modals, and integration. +- **Apps (`js/apps/`)**: Each app (Phone, Messages, Contacts, Settings) has its own entry point (`index.js`) and components. +- **Components (`js/components/` and app subfolders)**: Reusable UI elements (NavigationBar, Modal, StatusBar, etc.). +- **State Management (`js/core/StateManager.js`)**: Global state via `globalState`, plus local state in components. +- **Utilities (`js/utils/`)**: Script loader, helpers, etc. + +## Creating Components + +Components are created by extending the base `Component` class: + +```javascript +class MyComponent extends Component { + constructor(props) { + super(props); + this.state = { /* ... */ }; + } + render() { + return this.createElement('div', { className: 'my-component' }, 'Hello World'); + } +} +``` + +### Component Lifecycle +- `constructor(props)`: Initialize component +- `render()`: Define component structure +- `componentDidMount()`: Called after mount +- `componentWillUnmount()`: Called before unmount +- `onStateChange(prevState, newState)`: On state change + +### State Management +- Local: `this.setState({ ... })` +- Global: `globalState.setState({ ... })`, `globalState.subscribe(cb)` + +## Creating Elements + +Use `createElement` to create DOM elements: + +```javascript +this.createElement('div', { className: 'container', onClick: ... }, 'Content'); +``` + +## Styling + +- Base styles: `base.css`, `main.css` +- Component styles: `styles/components/` +- For all environments, use the bundled `dist/app.bundle.css` + +## Available Components + +- `StatusBar`, `NavigationBar`, `Modal`, `HomeScreen`, `HomeIndicator`, `Header`, `SearchBar` +- App-specific: `ContactList`, `ContactItem`, `AddContactForm`, `MessagesList`, `MessageItem`, `ConversationView`, `Dialpad`, `Settings` + +## Scripts + +- `tools/concat-js.js`: Bundles all JS files into `dist/app.bundle.js` +- `tools/concat-css.js`: Bundles all CSS files into `dist/app.bundle.css` +- `tools/concat-all.js`: Bundles both JS and CSS (**required for all environments**) +- `start.ps1`: Builds and starts a local server on Windows +- `start.sh`: Builds and starts a local server on Linux/macOS + +## How to Add a New App + +1. Create a new folder in `js/apps/yourapp/` with an `index.js` and any components. +2. Add your app's entry point to the bundler scripts and (if needed) to the app switch logic in `js/app.js`. +3. Add styles in `styles/components/yourapp.css` and include in the CSS bundle list. +4. **Re-run the build script after any changes.** + +## Best Practices + +1. Keep components small and focused +2. Use state management for global data +3. Follow the component lifecycle +4. Use modular CSS for styling +5. Handle cleanup in `componentWillUnmount` +6. Use ARIA roles/labels for accessibility + +## Development & Production + +- **Always run the build script (`node tools/concat-all.js`, `./start.ps1`, or `./start.sh`) before starting or deploying the app.** +- The app will not work unless all JS and CSS are bundled. +- If you encounter issues, re-run the build script to ensure all files are up to date. + +## Contributing + +1. Fork the repository +2. Create your feature branch +3. Commit your changes +4. Push to the branch +5. Create a Pull Request + +## License + +This project is licensed under the MIT License. \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/dist/app.bundle.css b/arma/client/addons/phone/ui/_site/dist/app.bundle.css new file mode 100644 index 0000000..502f764 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/dist/app.bundle.css @@ -0,0 +1,3303 @@ + +/* ---- ../styles/base.css ---- */ +/* Base styles and CSS reset */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + /* Light theme (default) */ + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --text-primary: #000000; + --text-secondary: #6c757d; + --text-tertiary: #1c1c1e; + --border-color: #e9ecef; + --accent-color: #007aff; + --status-bar-bg: rgba(248, 249, 250, 0.95); + --nav-bg: #f8f9fa; + --message-bubble-user: #007aff; + --message-bubble-contact: #e9ecef; + --message-text-user: #ffffff; + --message-text-contact: #000000; + --input-bg: #ffffff; + --input-border: #ddd; + --icon-path: 'images/light/'; +} + +[data-theme="dark"] { + --bg-primary: #000000; + --bg-secondary: #1c1c1e; + --text-primary: #ffffff; + --text-secondary: #8e8e93; + --border-color: #38383a; + --accent-color: #0a84ff; + --status-bar-bg: rgba(28, 28, 30, 0.95); + --nav-bg: #1c1c1e; + --message-bubble-user: #0a84ff; + --message-bubble-contact: #2c2c2e; + --message-text-user: #ffffff; + --message-text-contact: #ffffff; + --input-bg: #2c2c2e; + --input-border: #38383a; + --icon-path: 'images/dark/'; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + background: transparent; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + padding: 20px; + color: var(--text-primary); +} + +html, body { + overflow: hidden !important; + -ms-overflow-style: none !important; + scrollbar-width: none !important; +} + +html::-webkit-scrollbar, +body::-webkit-scrollbar { + width: 0px !important; + height: 0px !important; + display: none !important; +} + +/* ---- ../styles/main.css ---- */ +/* Utility classes */ +.hidden { + display: none !important; +} + +/* Animations */ +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes slideUp { + from { + transform: translateY(20px); + opacity: 0; + } + + to { + transform: translateY(0); + opacity: 1; + } +} + +.fade-in { + animation: fadeIn 0.3s ease forwards; +} + +.slide-up { + animation: slideUp 0.3s ease forwards; +} + +/* Responsive Design */ +@media (max-width: 480px) { + .phone-container { + width: 100%; + height: 100vh; + border-radius: 0; + padding: 0; + } + + .phone-screen { + border-radius: 0; + } + + body { + padding: 0; + } +} + +/* Remove unused styles */ +.home-button-container, +.home-button, +.nav-home-button { + display: none; +} + +/* Search Bar */ +.search-bar { + input { + &::placeholder { + color: var(--text-secondary); + } + } +} + +/* ---- ../styles/components/layout.css ---- */ +/* App Container */ +.app-container { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + margin-bottom: 25px; + scrollbar-width: none !important; +} + +/* Content Areas */ +.content { + flex: 1; + overflow: hidden; + padding: 10px; + background: var(--bg-primary); + color: var(--text-primary); + scrollbar-width: none !important; +} + +/* ---- ../styles/components/phone.css ---- */ +/* Phone */ +.phone-container { + width: 375px; + height: 720px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border: 2px solid #a8a8a8; + border-radius: 40px; + padding: 8px; + position: relative; + + /* Volume Up Button */ + &::before { + content: ''; + position: absolute; + top: 120px; + right: -4px; + width: 3px; + height: 30px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Volume Down Button */ + &::after { + content: ''; + position: absolute; + top: 160px; + right: -4px; + width: 3px; + height: 30px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Power Button */ + .power-button { + position: absolute; + top: 200px; + right: -4px; + width: 3px; + height: 40px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Mute Switch */ + .mute-switch { + position: absolute; + top: 100px; + left: -4px; + width: 3px; + height: 20px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Action Button */ + .action-button { + position: absolute; + top: 140px; + left: -4px; + width: 3px; + height: 20px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } +} + +.phone-screen { + width: 100%; + height: 100%; + background: var(--bg-primary); + border-radius: 32px; + overflow: hidden; + position: relative; + display: flex; + flex-direction: column; + z-index: 1; + color: var(--text-primary); + box-shadow: 0 -2px 8px 0 rgba(0, 0, 0, 0.7), 0 2px 8px 0 rgba(0, 0, 0, 0.05); + border-top: 3px solid #0f0f0f; + + &::after { + content: ''; + position: absolute; + top: 8px; + left: 50%; + transform: translateX(-50%); + width: 142px; + height: 32px; + background: #000000; + border-radius: 16px; + z-index: 1001; + display: none; + } + + &.dynamic-island::after { + display: block; + } +} + +.dynamic-island-content { + position: absolute; + top: 8px; + left: 50%; + transform: translateX(-50%); + width: 142px; + height: 32px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px; + z-index: 1002; + + .speaker { + width: 64px; + height: 6px; + background: #333333; + border-radius: 3px; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 52px; + height: 2px; + background: #000000; + border-radius: 1px; + } + } + + .camera { + width: 12px; + height: 12px; + background: #333333; + border-radius: 50%; + border: 1px solid #000000; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 6px; + height: 6px; + background: #000000; + border-radius: 50%; + } + } +} + +/* Home Indicator */ +.home-indicator-container { + position: absolute; + bottom: 4px; + left: 50%; + transform: translateX(-50%); + padding: 8px 16px; + cursor: pointer; + z-index: 100; + background: var(--status-bar-bg); + border-radius: 12px; + backdrop-filter: blur(10px); + border: 1px solid var(--border-color); + + &:hover .home-indicator { + background: var(--text-primary); + opacity: 0.5; + transform: scaleY(1.2); + } + + .home-indicator { + width: 134px; + height: 5px; + background: var(--text-primary); + opacity: 0.3; + border-radius: 3px; + transition: all 0.2s ease; + } +} + +/* ---- ../styles/components/buttons.css ---- */ +/* Button Styles */ +.button { + background: #007aff; + color: white; + border: none; + padding: 12px 24px; + border-radius: 8px; + font-size: 16px; + cursor: pointer; + transition: background-color 0.2s; + margin: 10px 5px; + + &:hover { + background: #0056cc; + } + + &.secondary { + background: #6c757d; + + &:hover { + background: #545b62; + } + } +} + +/* ---- ../styles/components/modal.css ---- */ +/* Modal */ +.modal-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + + .modal { + background: var(--bg-primary); + border-radius: 12px; + padding: 24px; + margin: 20px; + max-width: 300px; + width: 100%; + border: 1px solid var(--border-color); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + + h2 { + margin-bottom: 16px; + font-size: 18px; + color: var(--text-primary); + } + + p { + margin-bottom: 20px; + color: var(--text-secondary); + } + + .modal-actions { + display: flex; + justify-content: flex-end; + gap: 10px; + + button { + width: 100%; + } + + /* Style delete buttons differently */ + button[aria-label="Delete"] { + background: #ff4444; + border-color: #ff4444; + } + + button[aria-label="Delete"]:hover { + background: #ff3333; + border-color: #ff3333; + } + + button[aria-label="Delete"]:active { + background: #ff2222; + border-color: #ff2222; + } + } + } +} + +/* ---- ../styles/components/nav-bar.css ---- */ +/* Navigation Bar */ +.navigation-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 20px; + background: var(--nav-bg); + border-bottom: 1px solid var(--border-color); + min-height: 50px; + position: relative; + z-index: 1; +} + +.navigation-bar .nav-back-button { + background: none; + border: none; + color: var(--accent-color); + font-size: 16px; + cursor: pointer; + padding: 8px 12px; + border-radius: 6px; + transition: background-color 0.2s; +} + +.navigation-bar .nav-back-button:hover { + background: rgba(0, 122, 255, 0.1); +} + +.navigation-bar .nav-title { + font-size: 18px; + font-weight: 600; + color: var(--text-primary); + margin: 0; + flex: 1; + text-align: center; + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +.navigation-bar .nav-spacer { + width: 64px; +} + +.navigation-bar .nav-button { + background: none; + border: none; + color: var(--accent-color); + font-size: 24px; + padding: 8px 12px; + cursor: pointer; + transition: opacity 0.2s; + position: relative; + z-index: 2; +} + +.navigation-bar .nav-button:hover { + opacity: 0.8; +} + +.navigation-bar .nav-button:active { + opacity: 0.6; +} + +.navigation-bar .nav-button.add-button { + font-size: 28px; + font-weight: 300; + line-height: 1; + color: var(--accent-color); +} + +/* ---- ../styles/components/status-bar.css ---- */ +/* Status Bar */ +.status-bar { + height: 44px; + background: var(--status-bar-bg); + backdrop-filter: blur(10px); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; + font-size: 14px; + font-weight: 600; + flex-shrink: 0; + z-index: 10; + position: relative; + color: var(--text-primary); + + .status-left { + display: flex; + align-items: center; + gap: 8px; + flex: 1; + } + + .status-center { + position: absolute; + left: 50%; + transform: translateX(-50%); + font-weight: 600; + font-size: 14px; + } + + .status-right { + display: flex; + align-items: center; + gap: 4px; + flex: 1; + justify-content: flex-end; + + .status-indicators { + display: flex; + align-items: center; + gap: 5px; + + .signal-bars { + display: flex; + align-items: flex-end; + gap: 1px; + height: 12px; + + .bar { + background: var(--text-primary); + border-radius: 1px; + width: 3px; + margin-right: 1px; + + &:nth-child(1) { + height: 3px; + } + + &:nth-child(2) { + height: 5px; + } + + &:nth-child(3) { + height: 7px; + } + + &:nth-child(4) { + height: 9px; + } + } + } + + .network-battery { + display: flex; + align-items: center; + gap: 5px; + font-size: 12px; + color: var(--text-primary); + + .battery-icon { + position: relative; + display: inline-block; + width: 20px; + height: 10px; + border: 1.5px solid var(--text-primary); + border-radius: 3px; + box-sizing: border-box; + + &::before { + content: ""; + position: absolute; + top: 2px; + left: 2px; + right: 2px; + bottom: 2px; + border-radius: 1px; + background: var(--text-primary); + } + + &::after { + content: ""; + position: absolute; + top: 2px; + right: -4px; + width: 2px; + height: 4px; + border-radius: 0 1px 1px 0; + background: var(--text-primary); + } + } + } + } + } +} + + +/* ---- ../styles/components/home.css ---- */ +/* Home Screen */ +.home-screen { + flex: 1; + background-size: cover; + background-position: center; + padding: 60px 0 20px; + display: flex; + flex-direction: column; + position: relative; +} + +[data-theme="dark"] .home-screen { + background-size: cover; + background-position: center; +} + +.home-header { + text-align: center; + margin-bottom: 40px; + padding: 0 20px; + + h1 { + color: rgba(255, 255, 255, 0.8); + font-size: 24px; + font-weight: 500; + } +} + +.app-grid { + display: grid; + grid-template-columns: repeat(4, 65px); + gap: 25px; + justify-content: center; + flex: 1; + align-content: start; + padding: 0; + width: 100%; +} + +.dock { + position: absolute; + bottom: 32px; + left: 50%; + transform: translateX(-50%); + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-radius: 20px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15); + padding: 8px 8px 4px 8px; + display: flex; + align-items: center; + gap: 20px; +} + +[data-theme="dark"] .dock { + background: rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3); +} + +.app-icon { + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + cursor: pointer; + transition: transform 0.2s ease; + + &:hover { + transform: scale(1.05); + } + + .app-icon-symbol { + width: 64px; + height: 64px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + font-size: 28px; + position: relative; + overflow: hidden; + padding: 0; + + &[style*="background"] { + background: var(--app-color); + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 16px; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + } + + .app-title { + color: var(--text-primary); + font-size: 12px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + text-align: center; + width: 65px; + } +} + +/* ---- ../styles/components/contacts.css ---- */ +/* Contacts App */ +.contact-list { + list-style: none; + + .contact-item { + display: flex; + align-items: center; + padding: 15px 0; + border-bottom: 1px solid #e9ecef; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: #f8f9fa; + color: var(--text-tertiary); + } + + .contact-avatar { + width: 50px; + height: 50px; + border-radius: 25px; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4); + display: flex; + align-items: center; + justify-content: center; + color: white; + font-weight: bold; + margin-right: 15px; + } + + .contact-info { + h3 { + font-size: 16px; + margin-bottom: 4px; + } + + p { + font-size: 14px; + color: #6c757d; + } + } + } +} + +/* Add Contact Form */ +.add-contact-form { + background: var(--bg-primary); + margin-bottom: 10px; + + h3 { + color: var(--text-primary); + font-size: 18px; + font-weight: 600; + margin-bottom: 15px; + } + + input { + background: var(--bg-secondary); + color: var(--text-primary); + border: 1px solid var(--border-color); + transition: border-color 0.2s; + width: 100%; + margin-bottom: 15px; + padding: 10px; + border-radius: 4px; + + &:focus { + outline: none; + } + + &::placeholder { + color: var(--text-secondary); + } + } + + button { + background: var(--accent-color); + color: white; + border: none; + padding: 12px; + border-radius: 8px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s; + margin: 0 !important; + width: 100% !important; + + &:hover { + opacity: 0.9; + } + + &:active { + opacity: 0.8; + } + } +} + +/* ---- ../styles/components/dialpad.css ---- */ +/* Dialpad */ +.phone-dialpad { + display: flex; + flex-direction: column; + height: 100%; + padding: 20px; + background: var(--bg-primary); + color: var(--text-primary); + + &.call-active { + justify-content: center; + text-align: center; + } +} + +.phone-display { + text-align: center; + padding: 40px 20px; + margin-bottom: 20px; +} + +.phone-number { + font-size: 32px; + font-weight: 300; + color: var(--text-primary); + min-height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.dialpad { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin-bottom: 30px; + max-width: 300px; + margin-left: auto; + margin-right: auto; +} + +.dialpad-btn { + width: 75px; + height: 75px; + border-radius: 50%; + border: none; + background: var(--bg-secondary); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s ease; + position: relative; + overflow: hidden; + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + + .number { + font-size: 32px; + font-weight: 400; + color: var(--text-primary); + line-height: 1; + margin-bottom: 2px; + } + + .letters { + font-size: 10px; + color: var(--text-secondary); + font-weight: 500; + margin-top: 2px; + letter-spacing: 1px; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0) 50%, + rgba(0, 0, 0, 0.05) 100%); + } +} + +.phone-actions { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 280px; + margin: 0 auto; + padding: 0 20px; +} + +.action-btn { + width: 60px; + height: 60px; + border-radius: 50%; + border: none; + font-size: 24px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background: var(--bg-secondary); + color: var(--text-primary); + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + + &.delete-btn { + color: var(--text-secondary); + position: relative; + + &::before { + content: ''; + position: absolute; + padding: 0 4px 0 0; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + filter: brightness(0) saturate(100%) invert(30%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(90%) contrast(90%); + } + } + + &.call-btn { + color: var(--text-secondary); + color: white; + margin: 0 15px; + background: #34c759; + + img { + width: 32px; + height: 32px; + filter: brightness(0) invert(1); + } + + &:disabled { + background: #2eb350; + cursor: not-allowed; + transform: none; + box-shadow: none; + opacity: 0.5; + } + + &:hover:not(:disabled) { + background: #30d158; + } + + &:active:not(:disabled) { + background: #2eb350; + } + } + + &.contact-btn { + color: var(--text-secondary); + background: var(--bg-secondary); + + img { + width: 38px; + height: 38px; + filter: brightness(0) saturate(100%) invert(30%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(90%) contrast(90%); + } + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + } +} + +/* Call Active State */ +.call-info { + margin-bottom: 60px; +} + +.call-status { + font-size: 18px; + color: var(--text-secondary); + margin-bottom: 20px; +} + +.call-number { + font-size: 36px; + font-weight: 300; + color: var(--text-primary); + margin-bottom: 10px; +} + +.call-duration { + font-size: 20px; + color: var(--text-secondary); +} + +.call-actions { + display: flex; + justify-content: center; +} + +.end-call-btn { + width: 64px; + height: 64px; + border-radius: 50%; + border: none; + background: #ff3b30; + color: white; + font-size: 28px; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 4px 12px rgba(255, 59, 48, 0.2); + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 0; + + img { + width: 32px; + height: 32px; + filter: brightness(0) invert(1); + } + + &:hover { + background: #ff453a; + transform: scale(1.1); + box-shadow: 0 6px 16px rgba(255, 59, 48, 0.3); + } + + &:active { + transform: scale(0.9); + background: #ff2d55; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, + rgba(255, 255, 255, 0.1) 0%, + rgba(255, 255, 255, 0) 40%, + rgba(0, 0, 0, 0.05) 100%); + border-radius: 50%; + opacity: 0.5; + } +} + +/* ---- ../styles/components/messages.css ---- */ +/* Messages App */ +.messages-list { + padding: 0; + margin-bottom: 0; + + .message-item { + display: flex; + align-items: center; + padding: 15px 20px; + border-bottom: 1px solid var(--border-color); + cursor: pointer; + transition: background-color 0.2s; + background: var(--bg-primary); + + &:hover { + background-color: var(--bg-secondary); + } + + .message-avatar { + width: 50px; + height: 50px; + border-radius: 25px; + background: linear-gradient(45deg, #34c759, #30d158); + display: flex; + align-items: center; + justify-content: center; + color: white; + font-weight: bold; + margin-right: 15px; + font-size: 16px; + } + + .message-content { + flex: 1; + min-width: 0; + + .message-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; + + .contact-name { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + } + + .message-time { + font-size: 12px; + color: var(--text-secondary); + } + } + + .message-preview { + display: flex; + justify-content: space-between; + align-items: center; + + p { + font-size: 14px; + color: var(--text-secondary); + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .unread-badge { + background: #ff3b30; + color: white; + border-radius: 10px; + padding: 2px 6px; + font-size: 12px; + font-weight: bold; + min-width: 18px; + text-align: center; + margin-left: 8px; + } + } + } + + .message-thread-delete-button { + border: 1px solid rgba(255, 59, 48, 0.55); + border-radius: 10px; + background: rgba(255, 59, 48, 0.14); + color: #ff6b61; + cursor: pointer; + flex-shrink: 0; + font-size: 12px; + font-weight: 700; + margin-left: 10px; + padding: 7px 9px; + } + + .message-thread-delete-button:hover { + background: rgba(255, 59, 48, 0.22); + } + } +} + +.message-nav-delete-button { + border: 0; + border-radius: 10px; + background: rgba(255, 59, 48, 0.18); + color: #ff6b61; + cursor: pointer; + font: inherit; + font-size: 12px; + font-weight: 700; + padding: 7px 10px; +} + +.message-nav-delete-button:hover { + background: rgba(255, 59, 48, 0.28); +} + +.messages-empty-state { + align-items: center; + color: var(--text-secondary); + display: flex; + flex-direction: column; + gap: 6px; + justify-content: center; + min-height: 190px; + text-align: center; +} + +.messages-empty-state strong { + color: var(--text-primary); + font-size: 16px; +} + +/* Conversation View */ +.conversation-view { + height: 100%; + display: flex; + flex-direction: column; + margin-bottom: 25px; + overflow: hidden; + + .conversation-header { + background: #34c759; + color: white; + padding: 15px 20px; + display: flex; + align-items: center; + gap: 15px; + flex-shrink: 0; + + .back-button { + background: none; + border: none; + color: white; + font-size: 16px; + cursor: pointer; + padding: 5px 10px; + border-radius: 4px; + transition: background-color 0.2s; + + &:hover { + background: rgba(255, 255, 255, 0.2); + } + } + + h2 { + font-size: 18px; + font-weight: 600; + } + } + + .messages-container { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; + padding: 10px; + box-sizing: border-box; + overflow-y: auto; + overflow-x: hidden; + min-height: 0; + /* Force hardware acceleration for smoother scrolling */ + transform: translateZ(0); + -webkit-overflow-scrolling: touch; + /* Hide scrollbar but keep functionality */ + scrollbar-width: none !important; + /* scrollbar-color: rgba(0, 0, 0, 0.3) rgba(0, 0, 0, 0.1); */ + + /* Ultra-thin scrollbar for webkit browsers */ + /* &::-webkit-scrollbar { + width: 2px; + height: 2px; + } + + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); + border-radius: 1px; + } + + &::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.3); + border-radius: 1px; + min-height: 20px; + + &:hover { + background: rgba(0, 0, 0, 0.5); + } + } */ + + .message-bubble { + max-width: 70%; + padding: 12px 16px; + border-radius: 18px; + position: relative; + word-wrap: break-word; + flex-shrink: 0; + margin-bottom: 8px; + + &.user { + background: var(--message-bubble-user); + color: var(--message-text-user); + align-self: flex-end; + border-bottom-right-radius: 4px; + } + + &.contact { + background: var(--message-bubble-contact); + color: var(--message-text-contact); + align-self: flex-start; + border-bottom-left-radius: 4px; + } + + p { + margin: 0 0 4px 0; + font-size: 16px; + line-height: 1.4; + } + + .message-timestamp { + font-size: 11px; + opacity: 0.7; + display: block; + margin-top: 4px; + } + } + } + + .message-input-form { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15); + display: flex; + align-items: center; + padding: 8px; + flex-shrink: 0; + margin-bottom: 0; + position: absolute; + bottom: 32px; + left: 50%; + transform: translateX(-50%); + width: calc(100% - 24px); + border-radius: 20px; + + .message-input { + flex: 1; + padding: 10px 16px; + border: none; + border-radius: 18px; + font-size: 16px; + outline: none; + background: #eee; + color: var(--text-primary); + min-height: 36px; + max-height: 120px; + line-height: 1.4; + resize: none; + overflow-y: auto; + box-shadow: none; + transition: background-color 0.2s; + font-family: inherit; + + &:focus { + background: #f8f8f8; + } + + &::placeholder { + color: var(--text-secondary); + opacity: 0.7; + } + } + + .send-button { + width: 40px !important; + height: 40px !important; + border-radius: 50%; + background: var(--accent-color); + color: white; + border: none; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2); + transition: all 0.2s ease; + flex-shrink: 0; + padding: 0; + margin-left: 8px !important; + cursor: pointer; + + &:hover { + transform: scale(1.05); + box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3); + } + + &:active { + transform: scale(0.95); + } + + svg { + display: block; + width: 22px; + height: 22px; + stroke: currentColor; + } + + img { + display: block; + width: 22px; + height: 22px; + pointer-events: none; + } + } + } +} + +/* Dark theme adjustments */ +[data-theme="dark"] { + .conversation-view { + .messages-container { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.1); + + &::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); + } + + &::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + + &:hover { + background: rgba(255, 255, 255, 0.5); + } + } + } + } + + .message-input-form { + background: rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3); + + .message-input { + background: rgba(255, 255, 255, 0.05); + color: var(--text-primary); + + &:focus { + background: rgba(255, 255, 255, 0.08); + } + } + } +} + + +/* ---- ../styles/components/mail.css ---- */ +/* Mail App */ +.mail-content, +.mail-list-container { + height: 100%; + display: flex; + flex-direction: column; +} + +.mail-list { + flex: 1; + overflow-y: auto; + padding: 10px; +} + +.mail-item { + width: 100%; + border: 0; + border-bottom: 1px solid var(--border-color); + background: var(--bg-primary); + color: var(--text-primary); + padding: 14px 12px; + text-align: left; + cursor: pointer; +} + +.mail-item.unread { + font-weight: 700; +} + +.mail-item.read { + opacity: 0.74; +} + +.mail-item-header { + display: flex; + justify-content: space-between; + gap: 10px; + font-size: 12px; + color: var(--text-secondary); +} + +.mail-item-subject { + margin-top: 6px; + font-size: 16px; + color: var(--text-primary); +} + +.mail-item-preview { + margin-top: 4px; + color: var(--text-secondary); + font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mail-empty { + color: var(--text-secondary); + padding: 32px 16px; + text-align: center; +} + +.mail-composer { + display: flex; + flex-direction: column; + gap: 12px; + padding: 14px; +} + +.mail-composer label { + display: flex; + flex-direction: column; + gap: 6px; + color: var(--text-secondary); + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; +} + +.mail-composer input, +.mail-composer select, +.mail-composer textarea { + width: 100%; + border: 1px solid var(--border-color); + border-radius: 10px; + background: var(--bg-secondary); + color: var(--text-primary); + padding: 10px 12px; + font: inherit; + box-sizing: border-box; +} + +.mail-composer textarea { + resize: none; +} + +.mail-send-button { + border: 0; + border-radius: 12px; + background: var(--accent-color); + color: white; + cursor: pointer; + font-weight: 700; +} + +.mail-send-button { + padding: 12px 14px; +} + +.mail-detail { + padding: 16px; + overflow-y: auto; + color: var(--text-primary); +} + +.mail-detail h2 { + margin: 0 0 12px; + font-size: 20px; +} + +.mail-meta { + display: flex; + flex-direction: column; + gap: 4px; + color: var(--text-secondary); + font-size: 12px; + margin-bottom: 18px; +} + +.mail-body { + white-space: pre-wrap; + line-height: 1.45; + margin: 0; +} + +.mail-delete-button { + margin-top: 18px; + width: 100%; + border: 1px solid rgba(255, 59, 48, 0.55); + border-radius: 12px; + background: rgba(255, 59, 48, 0.14); + color: #ff6b61; + cursor: pointer; + font: inherit; + font-weight: 700; + padding: 11px 14px; +} + +.mail-delete-button:hover { + background: rgba(255, 59, 48, 0.22); +} + + +/* ---- ../styles/components/settings.css ---- */ +/* Settings */ +.settings-list { + background: var(--bg-primary); +} + +.settings-item { + border-bottom: 1px solid var(--border-color); + color: var(--text-primary); +} + +.settings-item:hover { + background: var(--bg-secondary); +} + +/* Theme Toggle Switch */ +.theme-toggle { + display: flex; + align-items: center; + justify-content: space-between; + padding: 15px 20px; + border-bottom: 1px solid var(--border-color); + background: var(--bg-primary); + color: var(--text-primary); +} + +.toggle-switch { + position: relative; + width: 51px; + height: 31px; +} + +.toggle-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #e9ecef; + transition: .4s; + border-radius: 34px; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 27px; + width: 27px; + left: 2px; + bottom: 2px; + background-color: white; + transition: .4s; + border-radius: 50%; +} + +input:checked+.toggle-slider { + background-color: var(--accent-color); +} + +input:checked+.toggle-slider:before { + transform: translateX(20px); +} + +/* ---- ../styles/components/notes.css ---- */ +/* Notes App Styles */ + +/* Notes List */ +.notes-list { + padding: 0; + margin: 0; +} + +.notes-list.empty { + display: flex; + align-items: center; + justify-content: center; + height: 60vh; +} + +.notes-empty-state { + text-align: center; + color: var(--text-secondary); + padding: 2rem; +} + +.notes-empty-state .empty-icon { + margin-bottom: 1rem; + display: flex; + justify-content: center; + align-items: center; +} + +.notes-empty-state .empty-icon img { + width: 64px; + height: 64px; + display: block; +} + +.notes-empty-state h3 { + margin: 0 0 0.5rem 0; + font-size: 1.2rem; + color: var(--text-primary); +} + +.notes-empty-state p { + margin: 0; + font-size: 0.9rem; +} + +/* Note Item */ +.note-item { + padding: 1rem; + border-bottom: 1px solid var(--border-color); + cursor: pointer; + transition: background-color 0.2s ease; + background: var(--background-primary); +} + +.note-item:hover { + background: var(--background-secondary); +} + +.note-item:active { + background: var(--background-tertiary); +} + +.note-item:last-child { + border-bottom: none; +} + +.note-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 0.5rem; + gap: 1rem; +} + +.note-title { + margin: 0; + font-size: 1rem; + font-weight: 600; + color: var(--text-primary); + line-height: 1.3; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.note-date { + font-size: 0.8rem; + color: var(--text-secondary); + white-space: nowrap; + flex-shrink: 0; +} + +.note-preview { + margin: 0; + font-size: 0.9rem; + color: var(--text-secondary); + line-height: 1.4; + display: -webkit-box; + line-clamp: 3; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Note Editor */ +.note-editor { + height: 100vh; + display: flex; + flex-direction: column; +} + +.editor-content { + flex: 1; + display: flex; + flex-direction: column; + padding: 1rem; + gap: 1rem; + overflow: hidden; +} + +.note-title-input { + border: none; + background: transparent; + font-size: 1.5rem; + font-weight: 600; + color: var(--text-primary); + padding: 0; + margin: 0; + outline: none; + width: 100%; +} + +.note-title-input::placeholder { + color: var(--text-secondary); + opacity: 0.7; +} + +.note-content-input { + flex: 1; + border: none; + background: transparent; + font-size: 1rem; + color: var(--text-primary); + padding: 0; + margin: 0; + outline: none; + resize: none; + font-family: inherit; + line-height: 1.5; + overflow-y: auto; +} + +.note-content-input::placeholder { + color: var(--text-secondary); + opacity: 0.7; +} + +.editor-footer { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem 0; + border-top: 1px solid var(--border-color); + margin-top: auto; + flex-shrink: 0; +} + +.editor-status { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.8rem; + color: var(--text-secondary); +} + +.word-count { + color: var(--text-secondary); +} + +.modified-indicator { + color: var(--accent-color); + font-weight: 500; +} + +.delete-button { + background: transparent; + border: none; + color: #ff4444; + font-size: 0.9rem; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; +} + +.delete-button:hover { + background: rgba(255, 68, 68, 0.1); +} + +.delete-button:active { + background: rgba(255, 68, 68, 0.2); +} + +/* Navigation Buttons - Note Editor specific */ +.note-editor .navigation-bar .nav-button.cancel-button { + color: var(--text-secondary) !important; + font-size: 0.9rem !important; + font-weight: 400 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.note-editor .navigation-bar .nav-button.cancel-button:hover { + color: var(--text-primary) !important; +} + +.note-editor .navigation-bar .nav-button.save-button { + color: var(--accent-color) !important; + font-size: 0.9rem !important; + font-weight: 600 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.note-editor .navigation-bar .nav-button.save-button:hover { + color: var(--accent-color-hover) !important; +} + +/* Dark theme adjustments */ +[data-theme="dark"] .note-item { + border-bottom-color: rgba(255, 255, 255, 0.1); +} + +[data-theme="dark"] .editor-footer { + border-top-color: rgba(255, 255, 255, 0.1); +} + +/* Light theme adjustments */ +[data-theme="light"] .note-item { + border-bottom-color: rgba(0, 0, 0, 0.1); +} + +[data-theme="light"] .editor-footer { + border-top-color: rgba(0, 0, 0, 0.1); +} + +/* Focus states */ +.note-item:focus { + outline: 2px solid var(--accent-color); + outline-offset: -2px; +} + +.note-title-input:focus, +.note-content-input:focus { + outline: none; +} + +/* Responsive adjustments */ +@media (max-width: 375px) { + .note-header { + gap: 0.5rem; + } + + .note-title { + font-size: 0.95rem; + } + + .note-preview { + font-size: 0.85rem; + } + + .editor-content { + padding: 0.75rem; + } + + .note-title-input { + font-size: 1.3rem; + } +} + + + +/* ---- ../styles/components/calendar.css ---- */ +/* Calendar App Styles */ +.app-container { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-primary); +} + +.content { + flex: 1; + overflow-y: auto; + padding: 16px; +} + +/* Calendar Container */ +.calendar-container { + background: var(--bg-primary); + border-radius: 12px; + width: 100%; + max-width: 375px; + margin: 0 auto; +} + +/* Calendar Header */ +.calendar-header { + display: flex; + justify-content: space-between; + align-items: center; + margin: 10px; + padding: 0 16px; +} + +.calendar-title { + font-size: 20px; + font-weight: 600; + color: var(--text-primary); +} + +.calendar-nav { + display: flex; + gap: 8px; +} + +.calendar-nav-btn { + background: var(--bg-secondary); + border: none; + border-radius: 8px; + padding: 8px; + color: var(--accent-color); + font-weight: 500; + cursor: pointer; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + min-width: 36px; + height: 36px; +} + +.calendar-nav-btn img { + width: 20px; + height: 20px; + color: var(--accent-color); +} + +.calendar-nav-btn:hover { + background: var(--border-color); +} + +.nav-button.add-button img { + width: 24px; + height: 24px; + color: var(--accent-color); +} + +/* Calendar Grid */ +.calendar-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 4px; + padding: 0 16px; +} + +.calendar-weekday { + text-align: center; + font-size: 12px; + color: var(--text-secondary); + padding: 8px 0; + font-weight: 500; +} + +.calendar-day { + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; + position: relative; + border: 2px solid transparent; +} + +.calendar-day:hover { + background: var(--bg-secondary); +} + +.calendar-day.today { + background: var(--accent-color); + color: white; + border: 2px solid transparent; +} + +.calendar-day.selected { + background: var(--accent-color); + color: white; +} + +.calendar-day.today:not(.selected) { + background: transparent; + color: var(--text-primary); + border: 2px solid var(--accent-color); +} + +.calendar-day.today.selected { + border: 2px solid white; +} + +.calendar-day.other-month { + color: var(--text-secondary); + opacity: 0.5; +} + +.calendar-day.has-events::after { + content: ''; + position: absolute; + bottom: 4px; + width: 4px; + height: 4px; + border-radius: 50%; + background: var(--accent-color); +} + +/* Calendar Events */ +.calendar-events { + margin-top: 20px; + border-top: 1px solid var(--border-color); + padding: 16px; +} + +.no-events { + text-align: center; + color: var(--text-secondary); + font-size: 14px; + padding: 20px 0; +} + +.event-item { + display: flex; + align-items: center; + padding: 12px; + border-radius: 8px; + margin-bottom: 8px; + background: var(--bg-secondary); + cursor: pointer; + transition: background-color 0.2s; +} + +.event-item:hover { + background: var(--border-color); +} + +.event-time { + font-size: 12px; + color: var(--text-secondary); + margin-right: 12px; + min-width: 60px; +} + +.event-title { + font-size: 14px; + color: var(--text-primary); + flex-grow: 1; +} + +.event-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--accent-color); + margin-right: 8px; +} + +/* Event Editor */ +.event-editor { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-primary); +} + +.event-form { + display: flex; + flex-direction: column; + padding: 16px; + gap: 16px; +} + +.event-title-input { + font-size: 20px; + padding: 8px 0; + border: none; + border-bottom: 1px solid var(--border-color); + background: none; + color: var(--text-primary); + outline: none; +} + +.time-container { + display: flex; + gap: 16px; +} + +.time-input { + flex: 1; + padding: 8px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 14px; +} + +.event-description-input { + min-height: 100px; + padding: 8px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 14px; + resize: none; +} + +.delete-event-button { + background: transparent; + border: none; + color: #ff4444; + font-size: 0.9rem; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; +} + +.delete-event-button:hover { + background: rgba(255, 68, 68, 0.1); +} + +.delete-event-button:active { + background: rgba(255, 68, 68, 0.2); +} + +/* Navigation Buttons - Event Editor specific */ +.event-editor .navigation-bar .nav-button.cancel-button { + color: var(--text-secondary) !important; + font-size: 0.9rem !important; + font-weight: 400 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.event-editor .navigation-bar .nav-button.cancel-button:hover { + color: var(--text-primary) !important; +} + +.event-editor .navigation-bar .nav-button.save-button { + color: var(--accent-color) !important; + font-size: 0.9rem !important; + font-weight: 600 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.event-editor .navigation-bar .nav-button.save-button:hover { + color: var(--accent-color-hover) !important; +} + +/* ---- ../styles/components/clock.css ---- */ +/* Clock App Styles */ + +/* Clock Tabs */ +.clock-tabs { + display: flex; + background: var(--background-secondary); + border-bottom: 1px solid var(--border-color); + margin-bottom: 1rem; +} + +.clock-tab { + flex: 1; + padding: 0.75rem 0.5rem; + background: none; + border: none; + color: var(--text-secondary); + font-size: 0.8rem; + cursor: pointer; + transition: all 0.2s ease; + border-bottom: 2px solid transparent; +} + +.clock-tab.active { + color: var(--accent-color); + border-bottom-color: var(--accent-color); + background: var(--bg-primary); +} + +.clock-tab:hover { + color: var(--text-primary); + background: var(--background-tertiary); +} + +.clock-content { + padding: 0 1rem; + overflow-y: auto; + max-height: calc(100vh - 200px); +} + +/* World Clock */ +.world-clock { + padding-bottom: 2rem; +} + +.local-time-section { + text-align: center; + margin-bottom: 2rem; + padding: 1.5rem; + background: var(--background-secondary); + border-radius: 12px; +} + +.local-time-label { + margin: 0 0 1rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--text-primary); +} + +.local-time-display { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.local-time { + font-size: 2.5rem; + font-weight: 300; + color: var(--accent-color); + font-family: 'SF Mono', monospace; +} + +.local-date { + font-size: 1rem; + color: var(--text-secondary); +} + +.add-world-clock-button { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + background: var(--accent-color); + color: white; + border: none; + border-radius: 8px; + font-size: 0.9rem; + cursor: pointer; + transition: background 0.2s ease; +} + +.add-world-clock-button:hover { + background: var(--accent-color-hover); +} + +.add-clock-form { + background: var(--background-secondary); + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; +} + +.add-clock-form h3 { + margin: 0 0 1rem 0; + font-size: 1rem; + color: var(--text-primary); +} + +.timezone-select { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 0.9rem; +} + +.form-buttons { + display: flex; + gap: 0.5rem; +} + +.form-buttons button { + flex: 1; + padding: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + cursor: pointer; + transition: all 0.2s ease; +} + +.form-buttons .add-button { + background: var(--accent-color); + color: white; + border-color: var(--accent-color); +} + +.form-buttons .add-button:hover { + background: var(--accent-color-hover); +} + +.form-buttons .add-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.world-clocks-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.world-clock-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + background: var(--background-secondary); + border-radius: 8px; + gap: 1rem; +} + +.clock-info { + flex: 1; +} + +.clock-city { + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.25rem; +} + +.clock-timezone { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.clock-time-info { + text-align: right; +} + +.clock-time { + font-size: 1.2rem; + font-weight: 500; + color: var(--accent-color); + font-family: 'SF Mono', monospace; +} + +.clock-date { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.remove-clock-button { + background: none; + border: 1px solid #ff4444; + color: #ff4444; + font-size: 0.8rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 4px; + transition: all 0.2s ease; +} + +.remove-clock-button:hover { + background: #ff4444; + color: white; +} + +/* Stopwatch */ +.stopwatch { + text-align: center; + padding: 2rem 1rem; +} + +.stopwatch-display { + margin-bottom: 2rem; +} + +.stopwatch-time { + font-size: 3rem; + font-weight: 300; + font-family: 'SF Mono', monospace; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.stopwatch-time.running { + color: var(--accent-color); +} + +.stopwatch-status { + font-size: 0.9rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 1px; +} + +.stopwatch-controls { + display: flex; + justify-content: center; + gap: 1rem; + margin-bottom: 2rem; +} + +.control-button { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 25px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + min-width: 80px; +} + +.start-button { + background: #4CAF50; + color: white; +} + +.start-button:hover { + background: #45a049; +} + +.stop-button { + background: #f44336; + color: white; +} + +.stop-button:hover { + background: #da190b; +} + +.lap-button { + background: var(--accent-color); + color: white; +} + +.lap-button:hover { + background: var(--accent-color-hover); +} + +.reset-button { + background: var(--text-secondary); + color: white; +} + +.reset-button:hover { + background: var(--text-primary); +} + +.lap-times-section { + text-align: left; +} + +.lap-times-title { + margin: 0 0 1rem 0; + font-size: 1.1rem; + color: var(--text-primary); + text-align: center; +} + +.lap-times-list { + max-height: 300px; + overflow-y: auto; + border: 1px solid var(--border-color); + border-radius: 8px; +} + +.lap-time-item { + display: grid; + grid-template-columns: 1fr 1fr 1fr auto; + gap: 1rem; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + align-items: center; + font-family: 'SF Mono', monospace; + font-size: 0.9rem; +} + +.lap-time-item:last-child { + border-bottom: none; +} + +.lap-time-item.fastest { + background: rgba(76, 175, 80, 0.1); + color: #4CAF50; +} + +.lap-time-item.slowest { + background: rgba(244, 67, 54, 0.1); + color: #f44336; +} + +.lap-number { + font-weight: 600; +} + +.lap-indicator { + font-size: 0.7rem; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 0.5px; +} + +/* Timer */ +.timer { + text-align: center; + padding: 2rem 1rem; +} + +.timer-display { + margin-bottom: 2rem; +} + +.timer-time { + font-size: 3rem; + font-weight: 300; + font-family: 'SF Mono', monospace; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.timer-time.finished { + color: #f44336; + animation: pulse 1s infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.timer-status { + font-size: 0.9rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 1px; +} + +.time-setters { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 2rem; +} + +.time-setter { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} + +.time-setter label { + font-size: 0.8rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.time-setter input { + width: 60px; + padding: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + text-align: center; + font-size: 1.1rem; + font-family: 'SF Mono', monospace; +} + +.timer-controls { + display: flex; + justify-content: center; + gap: 1rem; +} + +/* Alarm Clock */ +.alarm-clock { + padding-bottom: 2rem; +} + +.add-alarm-button { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + background: var(--accent-color); + color: white; + border: none; + border-radius: 8px; + font-size: 0.9rem; + cursor: pointer; + transition: background 0.2s ease; +} + +.add-alarm-button:hover { + background: var(--accent-color-hover); +} + +.add-alarm-form { + background: var(--background-secondary); + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; +} + +.add-alarm-form h3 { + margin: 0 0 1rem 0; + font-size: 1rem; + color: var(--text-primary); +} + +.add-alarm-form input { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 0.9rem; +} + +.alarms-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.alarm-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + background: var(--background-secondary); + border-radius: 8px; + gap: 1rem; + opacity: 1; + transition: opacity 0.2s ease; +} + +.alarm-item.disabled { + opacity: 0.6; +} + +.alarm-info { + flex: 1; +} + +.alarm-time { + font-size: 1.4rem; + font-weight: 500; + color: var(--text-primary); + font-family: 'SF Mono', monospace; + margin-bottom: 0.25rem; +} + +.alarm-label { + font-size: 0.9rem; + color: var(--text-secondary); + margin-bottom: 0.25rem; +} + +.alarm-days { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.alarm-controls { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.toggle-alarm { + padding: 0.5rem 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + cursor: pointer; + font-size: 0.8rem; + transition: all 0.2s ease; +} + +.alarm-item.enabled .toggle-alarm { + background: var(--accent-color); + color: white; + border-color: var(--accent-color); +} + +.remove-alarm { + background: none; + border: 1px solid #ff4444; + color: #ff4444; + font-size: 0.8rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 4px; + transition: all 0.2s ease; +} + +.remove-alarm:hover { + background: #ff4444; + color: white; +} + +/* Empty States */ +.empty-state { + text-align: center; + padding: 2rem; + color: var(--text-secondary); +} + +/* Responsive */ +@media (max-width: 375px) { + .clock-tabs { + font-size: 0.7rem; + } + + .clock-tab { + padding: 0.5rem 0.25rem; + } + + .local-time { + font-size: 2rem; + } + + .stopwatch-time, + .timer-time { + font-size: 2.5rem; + } + + .time-setters { + gap: 1rem; + } +} + + + +/* ---- ../styles/components/wallet.css ---- */ +/* Wallet */ +.wallet-app { + background: var(--bg-primary); +} + +.wallet-content { + background: var(--bg-primary); + color: var(--text-primary); + display: flex; + flex-direction: column; + gap: 12px; + height: calc(100% - 44px); + overflow-y: auto; + padding: 12px 16px 28px; +} + +.wallet-nav-button { + background: transparent; + border: 0; + color: #275a8c; + cursor: pointer; + font-size: 13px; + font-weight: 700; +} + +[data-theme="dark"] .wallet-nav-button { + color: #8bb9e6; +} + +.wallet-notice { + border-radius: 12px; + font-size: 13px; + font-weight: 700; + line-height: 1.35; + padding: 10px 12px; +} + +.wallet-notice-success { + background: rgba(47, 125, 91, 0.16); + color: #2f7d5b; +} + +.wallet-notice-error { + background: rgba(196, 57, 57, 0.16); + color: #b42323; +} + +.wallet-notice-info { + background: rgba(39, 90, 140, 0.14); + color: #275a8c; +} + +.wallet-balance-card { + background: linear-gradient(160deg, #142f52 0%, #275a8c 58%, #4f86bd 100%); + border-radius: 20px; + box-shadow: 0 14px 26px rgba(20, 47, 82, 0.22); + color: #ffffff; + display: flex; + flex-direction: column; + min-height: 142px; + padding: 18px; +} + +.wallet-eyebrow, +.wallet-card-title, +.wallet-metric span, +.wallet-transaction-meta { + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.wallet-eyebrow { + color: rgba(255, 255, 255, 0.72); + font-size: 11px; + font-weight: 800; +} + +.wallet-balance { + font-size: 34px; + letter-spacing: 0; + line-height: 1.1; + margin-top: 14px; +} + +.wallet-owner { + color: rgba(255, 255, 255, 0.8); + font-size: 13px; + margin-top: auto; +} + +.wallet-metrics { + display: grid; + gap: 10px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.wallet-metric, +.wallet-card { + background: linear-gradient(180deg, #ffffff 0%, #f4f8fd 100%); + border: 1px solid rgba(18, 54, 93, 0.12); + border-radius: 16px; +} + +[data-theme="dark"] .wallet-metric, +[data-theme="dark"] .wallet-card { + background: linear-gradient(180deg, #1c1c1e 0%, #151b23 100%); + border-color: rgba(139, 185, 230, 0.18); +} + +.wallet-metric { + display: flex; + flex-direction: column; + gap: 6px; + min-width: 0; + padding: 12px; +} + +.wallet-metric span, +.wallet-card-title { + color: #6f86a3; + font-size: 11px; + font-weight: 800; +} + +[data-theme="dark"] .wallet-metric span, +[data-theme="dark"] .wallet-card-title, +[data-theme="dark"] .wallet-transaction-meta { + color: #8ea2bb; +} + +.wallet-metric strong { + color: #142f52; + font-size: 18px; + line-height: 1.15; +} + +[data-theme="dark"] .wallet-metric strong { + color: #ffffff; +} + +.wallet-card { + display: flex; + flex-direction: column; + gap: 10px; + padding: 14px; +} + +.wallet-input { + background: var(--input-bg); + border: 1px solid rgba(18, 54, 93, 0.16); + border-radius: 12px; + color: var(--text-primary); + font: inherit; + min-height: 42px; + padding: 0 12px; + width: 100%; +} + +[data-theme="dark"] .wallet-input { + border-color: var(--input-border); +} + +.wallet-primary-button { + background: #275a8c; + border: 0; + border-radius: 12px; + color: #ffffff; + cursor: pointer; + font: inherit; + font-weight: 800; + min-height: 42px; +} + +.wallet-secondary-button { + background: rgba(39, 90, 140, 0.12); + border: 1px solid rgba(39, 90, 140, 0.18); + border-radius: 12px; + color: #275a8c; + cursor: pointer; + font: inherit; + font-size: 12px; + font-weight: 800; + min-height: 42px; + padding: 0 10px; +} + +.wallet-full-button { + width: 100%; +} + +[data-theme="dark"] .wallet-secondary-button { + background: rgba(139, 185, 230, 0.13); + border-color: rgba(139, 185, 230, 0.2); + color: #8bb9e6; +} + +.wallet-action-block { + background: rgba(39, 90, 140, 0.08); + border-radius: 12px; + display: grid; + gap: 10px; + padding: 10px 12px; +} + +.wallet-action-block + .wallet-action-block { + margin-top: 2px; +} + +[data-theme="dark"] .wallet-action-block { + background: rgba(139, 185, 230, 0.1); +} + +.wallet-action-summary { + display: grid; + gap: 3px; +} + +.wallet-action-summary span { + color: #6f86a3; + font-size: 11px; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.wallet-action-summary strong { + color: #142f52; + font-size: 18px; +} + +.wallet-action-summary small { + color: var(--text-secondary); + font-size: 12px; + line-height: 1.25; +} + +[data-theme="dark"] .wallet-action-summary span, +[data-theme="dark"] .wallet-action-summary strong { + color: #ffffff; +} + +.wallet-action-controls { + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) 112px; +} + +.wallet-primary-button:disabled, +.wallet-secondary-button:disabled, +.wallet-nav-button:disabled { + cursor: not-allowed; + opacity: 0.58; +} + +.wallet-transaction-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.wallet-transaction-row { + align-items: center; + border-top: 1px solid rgba(18, 54, 93, 0.1); + display: flex; + gap: 10px; + justify-content: space-between; + padding-top: 10px; +} + +[data-theme="dark"] .wallet-transaction-row { + border-top-color: rgba(139, 185, 230, 0.14); +} + +.wallet-transaction-copy { + display: flex; + flex-direction: column; + gap: 3px; + min-width: 0; +} + +.wallet-transaction-title { + color: var(--text-primary); + font-size: 14px; + font-weight: 700; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.wallet-transaction-meta { + color: #6f86a3; + font-size: 10px; + font-weight: 700; +} + +.wallet-transaction-value { + color: #142f52; + flex-shrink: 0; + font-size: 14px; + font-weight: 800; +} + +[data-theme="dark"] .wallet-transaction-value { + color: #ffffff; +} + +.wallet-empty-state { + border: 1px dashed rgba(18, 54, 93, 0.18); + border-radius: 12px; + color: var(--text-secondary); + font-size: 13px; + padding: 14px; + text-align: center; +} + + +/* ---- ../styles/components/loader.css ---- */ +#script-loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.8); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +} + +.loader-content { + text-align: center; + color: white; +} + +.spinner { + width: 50px; + height: 50px; + border: 5px solid #f3f3f3; + border-top: 5px solid #3498db; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.script-load-error { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.9); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +} + +.error-content { + background: white; + padding: 30px; + border-radius: 10px; + text-align: center; + max-width: 400px; + margin: 20px; +} + +.error-content h2 { + color: #e74c3c; + margin-bottom: 15px; +} + +.error-content button { + background: #3498db; + color: white; + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + margin-top: 15px; + font-size: 16px; +} + +.error-content button:hover { + background: #2980b9; +} diff --git a/arma/client/addons/phone/ui/_site/dist/app.bundle.js b/arma/client/addons/phone/ui/_site/dist/app.bundle.js new file mode 100644 index 0000000..a270d21 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/dist/app.bundle.js @@ -0,0 +1,8389 @@ + +// ---- ../js/core/Component.js ---- +/** @format */ + +/** + * @fileoverview Core Component class that provides the foundation for all UI components + * in the phone application. Implements a lightweight component lifecycle and virtual DOM-like + * functionality without external dependencies. + */ + +/** + * Base Component class that handles rendering, lifecycle events, and state management. + * Provides a React-like component interface for building UI elements. + * + * @class + * @example + * class MyComponent extends Component { + * constructor(props) { + * super(props); + * this.state = { count: 0 }; + * } + * + * render() { + * return this.createElement('div', {}, `Count: ${this.state.count}`); + * } + * } + */ +class Component { + /** + * Creates a new Component instance. + * @param {Object} props - Initial properties for the component + */ + constructor(props = {}) { + this.props = props; + this.state = {}; + this.element = null; + this.children = []; + this.eventListeners = new Map(); + this.mounted = false; + this.pendingUpdate = false; + } + + /** + * Updates component state and triggers a re-render. + * State updates are batched to prevent multiple renders in the same tick. + * + * @param {Object} newState - Object containing state updates + */ + setState(newState) { + const prevState = { ...this.state }; + this.state = { ...this.state, ...newState }; + + // Prevent multiple updates in the same tick + if (!this.pendingUpdate) { + this.pendingUpdate = true; + setTimeout(() => { + this.pendingUpdate = false; + this.updateComponent(prevState); + }, 0); + } + } + + /** + * Internal method to handle component updates. + * Manages the re-rendering process and maintains child component state. + * + * @private + * @param {Object} prevState - Previous state before update + */ + updateComponent(prevState) { + // Call onStateChange hook + this.onStateChange(prevState, this.state); + + // Re-render and update DOM + if (this.element && this.element.parentNode) { + const container = this.element.parentNode; + const oldElement = this.element; + + // Store input states and elements before update + const inputStates = new Map(); + oldElement.querySelectorAll('input').forEach(input => { + inputStates.set(input, { + element: input, + value: input.value, + selectionStart: input.selectionStart, + selectionEnd: input.selectionEnd, + isFocused: document.activeElement === input + }); + }); + + // Store mounted state of children + const childStates = new Map(); + this.children.forEach((child) => { + childStates.set(child, child.mounted); + }); + + // Create new element + const newElement = this.render(); + + // Update the DOM while preserving input elements + if (oldElement && newElement) { + // Replace the old element with the new one + container.replaceChild(newElement, oldElement); + this.element = newElement; + + // Restore input elements and their states + inputStates.forEach((state, oldInput) => { + const newInput = newElement.querySelector(`input[type="${oldInput.type}"]`); + if (newInput) { + // Replace the new input with the old one + newInput.parentNode.replaceChild(oldInput, newInput); + + // Restore input state + if (state.isFocused) { + oldInput.focus(); + oldInput.setSelectionRange(state.selectionStart, state.selectionEnd); + } + } + }); + + // Restore child components that were previously mounted + this.children.forEach((child) => { + if (childStates.get(child)) { + child.mount(this.element); + } + }); + } + } + } + + /** + * Lifecycle method called when state changes. + * Override in subclasses to handle state updates. + * + * @param {Object} prevState - Previous state + * @param {Object} newState - New state + */ + onStateChange(prevState, newState) { + // Override in subclasses if needed + } + + /** + * Mounts the component to a DOM container. + * Handles initial render and lifecycle methods. + * + * @param {HTMLElement} container - DOM element to mount component into + * @returns {Component} The component instance + */ + mount(container) { + // Skip if already mounted to this container + if (this.mounted && this.element && this.element.parentNode === container) { + return this; + } + + const newElement = this.render(); + if (this.element && this.element.parentNode) { + this.element.parentNode.replaceChild(newElement, this.element); + } else { + container.appendChild(newElement); + } + this.element = newElement; + + // Call componentDidMount after mounting + if (!this.mounted && this.componentDidMount) { + this.componentDidMount(); + } + this.mounted = true; + return this; + } + + /** + * Creates a DOM element with specified properties and children. + * Handles event listeners, styles, and refs. + * + * @param {string} tag - HTML tag name + * @param {Object} props - Element properties and attributes + * @param {...(string|number|Component|HTMLElement)} children - Child elements + * @returns {HTMLElement} Created DOM element + */ + createElement(tag, props = {}, ...children) { + const element = document.createElement(tag); + + // Set attributes and properties + Object.entries(props).forEach(([key, value]) => { + if (key.startsWith('on') && typeof value === 'function') { + const event = key.slice(2).toLowerCase(); + element.addEventListener(event, value); + + // Store event listener for cleanup + if (!this.eventListeners.has(element)) { + this.eventListeners.set(element, []); + } + this.eventListeners.get(element).push({ event, handler: value }); + } else if (key === 'className') { + element.className = value; + } else if (key === 'style' && typeof value === 'object') { + Object.assign(element.style, value); + } else if (key === 'ref' && typeof value === 'function') { + value(element); + } else if (typeof value === 'boolean') { + if (value) { + element.setAttribute(key, key); + } + } else if (value !== null && value !== undefined) { + element.setAttribute(key, value); + } else { + return; + } + }); + + // Add children + children.flat().forEach((child) => { + if (child === null || child === undefined) { + return; + } + + if (typeof child === 'string' || typeof child === 'number') { + element.appendChild(document.createTextNode(child)); + } else if (child instanceof Component) { + child.mount(element); + this.children.push(child); + } else if (child instanceof HTMLElement) { + element.appendChild(child); + } + }); + + return element; + } + + /** + * Renders the component's DOM representation. + * Must be overridden by subclasses to define component structure. + * + * @returns {HTMLElement} The rendered DOM element + */ + render() { + // Override in subclasses + return this.createElement('div'); + } + + /** + * Unmounts the component and cleans up resources. + * Removes event listeners and unmounts children. + */ + unmount() { + // Call componentWillUnmount before cleanup + if (this.mounted && this.componentWillUnmount) { + this.componentWillUnmount(); + } + + // Clean up event listeners + this.eventListeners.forEach((listeners, element) => { + listeners.forEach(({ event, handler }) => { + element.removeEventListener(event, handler); + }); + }); + this.eventListeners.clear(); + + // Unmount children + this.children.forEach((child) => { + if (child.mounted) { + child.unmount(); + } + }); + this.children = []; + + // Remove from DOM + if (this.element && this.element.parentNode) { + this.element.parentNode.removeChild(this.element); + } + this.element = null; + this.mounted = false; + } +} + + +// ---- ../js/core/StateManager.js ---- +/** + * @format + * @fileoverview State management system for the phone application. Implements a simple pub/sub pattern for managing global application state. + */ + +/** + * Initial application state containing mock data for development. + * @type {Object} + */ +const initialAppState = { + // Navigation state + currentApp: 'home', + showModal: false, + + // Contact management + contacts: [], + + // Message management + messages: [], + + // Server-synced data (non-UI mapped) + // Keep raw server payloads separate to avoid breaking current UI + rawMessages: [], + emails: [], + selectedEmail: null, + showEmailComposer: false, + selectedConversationRaw: null, + + // UI state + selectedContact: null, + selectedConversation: null, + showMessageContactPicker: false, + newMessage: '', + currentUid: null, + + // Clock state + clockMode: 'world', + worldClocks: [], + timers: [], + alarms: [], + clockSettings: { format24h: true }, + + // Notes state + notes: [], + currentNote: null, + showNoteEditor: false, + + // Calendar state + events: [], + currentEvent: null, + showEventEditor: false, + + // Mobile bank state + mobileBank: { + account: { + bank: 0, + cash: 0, + earnings: 0, + transactions: [], + }, + session: { + playerName: '', + transferTargets: [], + uid: '', + }, + notice: null, + pendingAction: '', + }, +}; + +/** + * Manages global application state using a publish/subscribe pattern. + * Provides methods for accessing and updating state while notifying subscribers. + * + * @class + * @example + * const state = new StateManager({ count: 0 }); + * state.subscribe((newState, prevState) => { + * console.log('State changed:', newState); + * }); + * state.setState({ count: 1 }); + */ +class StateManager { + /** + * Creates a new StateManager instance. + * @param {Object} initialState - Initial state object + */ + constructor(initialState = {}) { + /** @private */ + this.state = { ...initialState }; + /** @private */ + this.subscribers = new Set(); + } + + /** + * Gets current state object. + * @returns {Object} Copy of current state + */ + getState() { + return { ...this.state }; + } + + /** + * Updates state and notifies subscribers. + * @param {Object} updates - Object containing state updates + */ + setState(updates) { + const prevState = { ...this.state }; + this.state = { ...this.state, ...updates }; + this.notifySubscribers(prevState, this.state); + } + + /** + * Subscribes to state changes. + * @param {Function} callback - Function to call when state changes + * @returns {Function} Unsubscribe function + */ + subscribe(callback) { + this.subscribers.add(callback); + return () => this.subscribers.delete(callback); + } + + /** + * Notifies subscribers of state changes. + * @private + * @param {Object} prevState - Previous state + * @param {Object} newState - New state + */ + notifySubscribers(prevState, newState) { + this.subscribers.forEach((callback) => { + callback(newState, prevState); + }); + } +} + +// Create and export global state instance +const globalState = new StateManager(initialAppState); + + +// ---- ../js/utils/helpers.js ---- +/** @format */ + +/** + * @fileoverview Utility functions for the phone application + * Contains helper functions for common operations like debouncing, + * ID generation, phone number formatting, and text manipulation. + */ + +/** + * Creates a debounced function that delays invoking func until after wait milliseconds have elapsed + * @param {Function} func - The function to debounce + * @param {number} wait - The number of milliseconds to delay + * @returns {Function} The debounced function + */ +const debounce = (func, wait) => { + let timeout; + + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +}; + +/** + * Generates a unique identifier using timestamp and random number. + * + * @returns {string} A unique string identifier + * @example + * const newId = generateId(); // Returns something like "lh8d3m4k2n1" + */ +const generateId = () => { + return Date.now().toString(36) + Math.random().toString(36).substr(2); +}; + +/** + * Formats a phone number string into a standardized format. + * Converts "11234567890" to "+1 (123) 456-7890" + * + * @param {string} phoneNumber - The raw phone number to format + * @returns {string} The formatted phone number + * @example + * const formatted = formatPhoneNumber('11234567890'); // Returns "+1 (123) 456-7890" + */ +const formatPhoneNumber = (phoneNumber) => { + const cleaned = phoneNumber.replace(/\D/g, ''); + const match = cleaned.match(/^(\d{1})(\d{3})(\d{3})(\d{4})$/); + if (match) { + return `+${match[1]} (${match[2]}) ${match[3]}-${match[4]}`; + } + return phoneNumber; +}; + +/** + * Extracts initials from a person's name. + * Takes first letter of first and last name, up to 2 characters. + * + * @param {string} name - The full name to get initials from + * @returns {string} The initials (maximum 2 characters) + * @example + * const initials = getInitials('John Doe'); // Returns "JD" + * const singleInitial = getInitials('John'); // Returns "J" + */ +const getInitials = (name) => { + return name + .split(' ') + .map((word) => word.charAt(0).toUpperCase()) + .join('') + .substring(0, 2); +}; + + +// ---- ../js/utils/PhoneMedia.js ---- +/** @format */ + +const PhoneMedia = (() => { + const addonRoot = 'forge\\forge_client\\addons\\phone\\ui\\_site\\'; + const cache = new Map(); + + function assetPath(...parts) { + return `${addonRoot}${parts.join('\\')}`; + } + + function base64Path(...parts) { + const path = assetPath(...parts); + return path.endsWith('.b64') ? path : `${path}.b64`; + } + + function toBrowserPath(path) { + return String(path || '') + .replace(addonRoot, '') + .replace(/\\/g, '/') + .replace(/\.b64$/i, ''); + } + + function toDataUrl(base64Text, mimeType = 'image/png') { + const value = String(base64Text || '').trim(); + if (!value) return ''; + return value.startsWith('data:') ? value : `data:${mimeType};base64,${value}`; + } + + function loadImage(path) { + const base64AssetPath = path.endsWith('.b64') ? path : `${path}.b64`; + + if (cache.has(base64AssetPath)) { + return Promise.resolve(cache.get(base64AssetPath)); + } + + if (typeof A3API !== 'undefined' && A3API.RequestFile) { + return A3API.RequestFile(base64AssetPath).then((base64Text) => { + const dataUrl = toDataUrl(base64Text); + cache.set(base64AssetPath, dataUrl); + return dataUrl; + }); + } + + const browserPath = toBrowserPath(base64AssetPath); + cache.set(base64AssetPath, browserPath); + return Promise.resolve(browserPath); + } + + return { + assetPath, + base64Path, + loadImage + }; +})(); + + +// ---- ../js/components/StatusBar.js ---- +/** @format */ + +/** + * @class StatusBar + * @extends Component + * @description A component that displays the status bar at the top of the phone interface. + * Shows current time, signal strength, network status, and battery indicator. + */ +class StatusBar extends Component { + /** + * Cache for loaded icons + * @static + * @private + */ + static iconCache = new Map(); + + /** + * Time update interval in milliseconds + * @static + * @private + */ + static TIME_UPDATE_INTERVAL = 1000; + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + this.state = { + currentTime: this.getCurrentTime(), + }; + this.timerInterval = null; + } + + /** + * Start the timer when component mounts + * @lifecycle + */ + componentDidMount() { + if (!this.timerInterval) { + this.timerInterval = setInterval(() => { + this.setState({ currentTime: this.getCurrentTime() }); + }, StatusBar.TIME_UPDATE_INTERVAL); + } + } + + /** + * Clean up timer when component unmounts + * @lifecycle + */ + componentWillUnmount() { + if (this.timerInterval) { + clearInterval(this.timerInterval); + this.timerInterval = null; + } + } + + /** + * Get the current time in 24-hour format + * @returns {string} Formatted time string (HH:mm) + * @private + */ + getCurrentTime() { + return new Date().toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }); + } + + /** + * Render signal strength indicator + * @returns {HTMLElement} Signal bars element + * @private + */ + renderSignalBars() { + return this.createElement( + 'div', + { + className: 'signal-bars', + 'aria-label': 'Signal strength indicator', + role: 'meter', + 'aria-valuenow': '4', + 'aria-valuemin': '0', + 'aria-valuemax': '4', + }, + Array(4) + .fill(null) + .map(() => + this.createElement('div', { + className: 'bar', + 'aria-hidden': 'true', + }) + ) + ); + } + + /** + * Render battery icon + * @returns {HTMLElement} Battery icon element + * @private + */ + renderBatteryIcon() { + return this.createElement('span', { + className: 'battery-icon', + role: 'img', + 'aria-label': 'Battery full' + }); + } + + /** + * Render status indicators (network and battery) + * @returns {HTMLElement} Status indicators element + * @private + */ + renderStatusIndicators() { + return this.createElement( + 'div', + { className: 'status-indicators' }, + this.renderSignalBars(), + this.createElement( + 'span', + { + className: 'network-battery', + 'aria-label': 'Network: 5G, Battery: Full', + }, + '5G', + this.renderBatteryIcon() + ) + ); + } + + /** + * Render the status bar + * @returns {HTMLElement} The rendered status bar element + */ + render() { + const { currentTime } = this.state; + + return this.createElement( + 'div', + { + className: 'status-bar', + role: 'banner', + 'aria-label': 'Status bar', + }, + this.createElement( + 'div', + { + className: 'status-left', + role: 'timer', + 'aria-label': 'Current time', + }, + currentTime + ), + this.createElement('div', { + className: 'status-center', + 'aria-hidden': 'true', + }), + this.createElement('div', { className: 'status-right' }, this.renderStatusIndicators()) + ); + } +} + + +// ---- ../js/components/Modal.js ---- +/** @format */ + +/** + * @class Modal + * @extends Component + * @description A reusable modal dialog component. + * Provides an overlay with a modal dialog box containing customizable content and actions. + * Supports keyboard interaction and click-outside-to-close behavior. + */ +class Modal extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} props.show - Whether the modal is visible + * @param {string} [props.title='Modal'] - Title of the modal + * @param {Array|Object} [props.children=[]] - Content to display in the modal + * @param {Function} [props.onClose] - Callback when modal is closed + * @param {Function} [props.onConfirm] - Callback when confirm button is clicked + */ + constructor(props) { + super(props); + + // Bind event handlers + this.handleOverlayClick = this.handleOverlayClick.bind(this); + this.handleModalClick = this.handleModalClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Handle click events on the overlay + * @param {Event} e - Click event object + * @private + */ + handleOverlayClick(e) { + if (e.target === e.currentTarget && this.props.onClose) { + this.props.onClose(); + } + } + + /** + * Prevent click events from bubbling through the modal + * @param {Event} e - Click event object + * @private + */ + handleModalClick(e) { + e.stopPropagation(); + } + + /** + * Handle keyboard events for accessibility + * @param {KeyboardEvent} e - Keyboard event object + * @private + */ + handleKeyDown(e) { + if (e.key === 'Escape' && this.props.onClose) { + this.props.onClose(); + } + } + + /** + * Render the modal actions (buttons) + * @param {Function} onClose - Close callback + * @param {Function} onConfirm - Confirm callback + * @param {string} confirmText - Text for confirm button + * @param {string} cancelText - Text for cancel button + * @returns {HTMLElement} The rendered actions element + * @private + */ + renderActions(onClose, onConfirm, confirmText = 'Call', cancelText = 'Cancel', extraActions = [], hideCancel = false, hideConfirm = false) { + if (hideCancel && hideConfirm && !extraActions.length) { + return null; + } + + return this.createElement( + 'div', + { className: 'modal-actions' }, + hideCancel ? null : this.createElement( + 'button', + { + className: 'button secondary', + onClick: () => onClose?.(), + type: 'button', + 'aria-label': cancelText, + }, + cancelText + ), + ...extraActions.map((action) => this.createElement( + 'button', + { + className: action.className || 'button secondary', + onClick: () => action.onClick?.(), + type: 'button', + disabled: action.disabled === true, + 'aria-label': action.ariaLabel || action.text, + }, + action.text + )), + hideConfirm ? null : this.createElement( + 'button', + { + className: 'button', + onClick: () => onConfirm?.(), + type: 'button', + 'aria-label': confirmText, + }, + confirmText + ) + ); + } + + /** + * Render the modal + * @returns {HTMLElement} The rendered modal element + */ + render() { + const { show, title, children = [], onClose, onConfirm, confirmText, cancelText, extraActions = [], hideCancel = false, hideConfirm = false } = this.props; + + if (!show) { + return this.createElement('div', { + className: 'hidden', + style: { display: 'none' }, + 'aria-hidden': 'true', + }); + } + + // Ensure children is always an array + const childElements = Array.isArray(children) ? children : [children]; + + return this.createElement( + 'div', + { + className: 'modal-overlay', + onClick: this.handleOverlayClick, + onKeyDown: this.handleKeyDown, + role: 'dialog', + 'aria-modal': 'true', + 'aria-labelledby': 'modal-title', + }, + this.createElement( + 'div', + { + className: 'modal', + onClick: this.handleModalClick, + role: 'document', + tabIndex: -1, + }, + this.createElement( + 'h2', + { + id: 'modal-title', + role: 'heading', + 'aria-level': '2', + }, + title || 'Modal' + ), + this.createElement( + 'div', + { + className: 'modal-content', + role: 'region', + 'aria-label': 'Modal content', + }, + ...childElements.filter((child) => child != null) + ), + this.renderActions(onClose, onConfirm, confirmText, cancelText, extraActions, hideCancel, hideConfirm) + ) + ); + } +} + + +// ---- ../js/components/NavigationBar.js ---- +/** @format */ + +/** + * @class NavigationBar + * @extends Component + * @description A navigation bar component that provides app navigation controls. + * Handles back navigation and displays the current screen title. + */ +class NavigationBar extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} [props.showBackButton=false] - Whether to show the back button + * @param {string} [props.title] - Title to display in the navigation bar + * @param {Object|HTMLElement} [props.leftButton] - Optional custom button to display on the left side (overrides back button) + * @param {Object|HTMLElement} [props.rightButton] - Optional button to display on the right side + */ + constructor(props) { + super(props); + this.handleBackClick = this.handleBackClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Handle back button click event + * @private + */ + handleBackClick() { + const currentState = globalState.getState(); + + // Priority 1: If we're in a conversation, go back to messages list + if (currentState.selectedConversation) { + globalState.setState({ + selectedConversation: null, + selectedConversationRaw: null, + }); + return; // Exit early, don't execute the rest + } + + if (currentState.showMessageContactPicker) { + globalState.setState({ + showMessageContactPicker: false, + }); + return; + } + + if (currentState.selectedEmail || currentState.showEmailComposer) { + globalState.setState({ + selectedEmail: null, + showEmailComposer: false, + }); + return; + } + + // Priority 2: If we came from phone app, go back to phone + if (currentState.previousApp === 'phone') { + globalState.setState({ + currentApp: 'phone', + previousApp: null, + }); + return; // Exit early + } + + // Priority 3: Default - go to home and clear everything + globalState.setState({ + currentApp: 'home', + previousApp: null, + selectedConversation: null, + selectedConversationRaw: null, + selectedContact: null, + showMessageContactPicker: false, + showModal: false, + }); + } + + /** + * Handle keyboard events for accessibility + * @param {KeyboardEvent} e - Keyboard event object + * @private + */ + handleKeyDown(e) { + if (e.key === 'Backspace' && this.props.showBackButton) { + this.handleBackClick(); + } + } + + /** + * Render the left section (custom button, back button, or spacer) + * @returns {HTMLElement} The rendered element + * @private + */ + renderLeftSection() { + const { leftButton, showBackButton } = this.props; + + // Priority 1: Custom left button + if (leftButton) { + if (leftButton instanceof HTMLElement) { + return leftButton; + } + + return this.createElement( + leftButton.element || 'button', + leftButton.props || {}, + leftButton.content + ); + } + + // Priority 2: Default back button + if (showBackButton) { + return this.createElement( + 'button', + { + className: 'nav-back-button', + onClick: this.handleBackClick, + 'aria-label': 'Go back', + type: 'button', + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: '', + style: 'width:24px;height:24px;padding:0;margin:0;display:block;pointer-events:none;' + }) + ); + } + + // Priority 3: Empty spacer + return this.createElement('div', { + className: 'nav-spacer', + 'aria-hidden': 'true', + }); + } + + /** + * Render the right button section + * @returns {HTMLElement} The rendered element + * @private + */ + renderRightSection() { + const { rightButton } = this.props; + + if (!rightButton) { + return this.createElement('div', { + className: 'nav-spacer', + 'aria-hidden': 'true', + }); + } + + if (rightButton instanceof HTMLElement) { + return rightButton; + } + + return this.createElement( + rightButton.element || 'button', + rightButton.props || {}, + rightButton.content + ); + } + + /** + * Render the navigation bar + * @returns {HTMLElement} The rendered navigation bar element + */ + render() { + const { title } = this.props; + + return this.createElement( + 'nav', + { + className: 'navigation-bar', + role: 'navigation', + 'aria-label': 'Main navigation', + onKeyDown: this.handleKeyDown, + }, + this.renderLeftSection(), + title && + this.createElement( + 'h1', + { + className: 'nav-title', + role: 'heading', + 'aria-level': '1', + }, + title + ), + this.renderRightSection() + ); + } +} + + +// ---- ../js/components/HomeIndicator.js ---- +/** @format */ + +/** + * @class HomeIndicator + * @extends Component + * @description A component that renders the iPhone-style home indicator. + * Provides navigation back to the home screen via click or swipe gestures. + * Currently implements click handling, with swipe gesture support planned for future. + */ +class HomeIndicator extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + + // Bind event handlers + this.handleClick = this.handleClick.bind(this); + this.handleSwipeUp = this.handleSwipeUp.bind(this); + + // Touch event state for future swipe implementation + this.touchStartY = 0; + } + + /** + * Resets the app state and navigates to home screen + * @private + */ + handleClick() { + globalState.setState({ + currentApp: 'home', + selectedConversation: null, + selectedConversationRaw: null, + selectedContact: null, + showMessageContactPicker: false, + showModal: false, + }); + } + + /** + * Handles swipe up gesture + * @param {Event} e - Touch/swipe event object + * @private + * @todo Implement proper swipe gesture detection + */ + handleSwipeUp(e) { + // Simple click handler for now, swipe gesture to be implemented + this.handleClick(); + } + + /** + * Render the home indicator + * @returns {HTMLElement} The rendered home indicator element + */ + render() { + return this.createElement( + 'div', + { + className: 'home-indicator-container', + onClick: this.handleClick, + role: 'button', + 'aria-label': 'Return to home screen', + tabIndex: 0, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleClick(); + } + }, + }, + this.createElement('div', { + className: 'home-indicator', + 'aria-hidden': 'true', + }) + ); + } +} + + +// ---- ../js/components/SearchBar.js ---- +/** @format */ + +/** + * @class SearchBar + * @extends Component + * @description A search input component that provides debounced search functionality. + * Includes built-in debouncing to prevent excessive search updates. + */ +class SearchBar extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {string} [props.placeholder='Search contacts...'] - Placeholder text for the search input + * @param {Function} [props.onSearch] - Callback function when search value changes + * @param {string} [props.value] - Initial input value + */ + constructor(props) { + super(props); + + // Set debounce delay + this.DEBOUNCE_DELAY = 300; // milliseconds + + // Initialize state + this.state = { + searchTerm: props.value || '' + }; + + // Bind methods + this.handleInput = debounce(this.handleInput.bind(this), this.DEBOUNCE_DELAY); + this.handleInputChange = this.handleInputChange.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Update state when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ searchTerm: nextProps.value }); + } + } + + /** + * Handle input change events + * @param {Event} e - Input change event + * @private + */ + handleInputChange(e) { + const value = e.target.value; + this.setState({ searchTerm: value }); + this.handleInput(value); + } + + /** + * Debounced search handler + * @param {string} searchTerm - Current search term + * @private + */ + handleInput(searchTerm) { + const { onSearch } = this.props; + if (onSearch) { + onSearch(searchTerm); + } + } + + /** + * Handle keyboard events + * @param {KeyboardEvent} e - Keyboard event + * @private + */ + handleKeyDown(e) { + // Clear search on Escape + if (e.key === 'Escape') { + this.setState({ searchTerm: '' }); + this.handleInput(''); + } + } + + /** + * Render the search bar + * @returns {HTMLElement} The rendered search bar element + */ + render() { + const { placeholder = 'Search contacts...' } = this.props; + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'search-bar', + role: 'search', + 'aria-label': 'Search contacts', + style: { + paddingBottom: '10px', + borderBottom: '1px solid #e9ecef', + }, + }, + this.createElement('input', { + type: 'search', + placeholder, + value: searchTerm, + onInput: this.handleInputChange, + onKeyDown: this.handleKeyDown, + 'aria-label': placeholder, + style: { + width: '100%', + padding: '10px', + border: '1px solid #ddd', + borderRadius: '20px', + fontSize: '16px', + outline: 'none', + }, + }) + ); + } +} + + +// ---- ../js/components/Header.js ---- +/** @format */ + +/** + * @class Header + * @extends Component + * @description A component that renders a header section with a title. + * Used for displaying page or section titles in the phone UI. + */ +class Header extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {string} [props.title='Phone UI'] - The title text to display in the header + */ + constructor(props) { + super(props); + } + + /** + * Render the header component + * @returns {HTMLElement} The rendered header element + */ + render() { + const { title = 'Phone UI' } = this.props; + + return this.createElement( + 'header', + { + className: 'header', + role: 'banner', + 'aria-label': 'Page header', + }, + this.createElement( + 'h1', + { + role: 'heading', + 'aria-level': '1', + }, + title + ) + ); + } +} + + +// ---- ../js/components/HomeScreen.js ---- +/** @format */ + +/** + * @class HomeScreen + * @extends Component + * @description The main home screen component that displays the app grid. + * Manages the display and interaction of app icons, handling navigation to different apps. + */ +class HomeScreen extends Component { + /** + * Cache for loaded icons + * @static + * @private + */ + static iconCache = new Map(); + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + this.handleAppClick = this.handleAppClick.bind(this); + this.state = { + isDarkTheme: document.documentElement.getAttribute('data-theme') === 'dark' + }; + } + + static iconPath(app, isDarkTheme) { + return PhoneMedia.base64Path('images', isDarkTheme ? 'dark' : 'light', `${app.icon}.png`); + } + + static backgroundPath(isDarkTheme) { + return PhoneMedia.base64Path('images', 'bg', isDarkTheme ? 'bgdark_01_ca.png' : 'bglight_01_ca.png'); + } + + componentDidMount() { + // Initial background update + this.updateBackground(); + + // Listen for theme changes + document.addEventListener('themeChanged', (event) => { + const isDarkTheme = event.detail.theme === 'dark'; + + // Update background immediately + const bgPath = HomeScreen.backgroundPath(isDarkTheme); + + PhoneMedia.loadImage(bgPath).then(imageContent => { + if (this.element) { + this.element.style.background = `url('${imageContent}')`; + this.element.style.backgroundSize = 'contain'; + this.element.style.backgroundPosition = 'center'; + } + }).catch(error => { + console.error(`Failed to load background image: ${bgPath}`, error); + }); + + // Update state after background change + this.setState({ isDarkTheme }); + }); + } + + updateBackground() { + const isDarkTheme = document.documentElement.getAttribute('data-theme') === 'dark'; + const bgPath = HomeScreen.backgroundPath(isDarkTheme); + + PhoneMedia.loadImage(bgPath).then(imageContent => { + if (this.element) { + this.element.style.background = `url('${imageContent}')`; + this.element.style.backgroundSize = 'contain'; + this.element.style.backgroundPosition = 'center'; + this.element.style.backgroundRepeat = 'no-repeat'; + this.element.style.backgroundColor = isDarkTheme ? '#000000' : '#ffffff'; + } else { + console.error('HomeScreen element not found during background update'); + } + }).catch(error => { + console.error(`Failed to load background image: ${bgPath}`, error); + }); + } + + /** + * List of available apps with their configurations + * @type {Array} + * @private + */ + static get apps() { + return [ + { name: 'safari', title: 'Safari', icon: 'Safari', color: '' }, + { name: 'mail', title: 'Mail', icon: 'Mail', color: '' }, + { name: 'notes', title: 'Notes', icon: 'Notes', color: '' }, + { name: 'iCloud', title: 'iCloud', icon: 'iCloud', color: '' }, + { name: 'camera', title: 'Camera', icon: 'Camera', color: '' }, + { name: 'photos', title: 'Photos', icon: 'Photos', color: '' }, + { name: 'clock', title: 'Clock', icon: 'Clock', color: '' }, + { name: 'calendar', title: 'Calendar', icon: 'Calendar', color: '' }, + { name: 'wallet', title: 'Wallet', icon: 'Wallet', color: '' }, + { name: 'store', title: 'App Store', icon: 'AppStore', color: '' }, + ]; + } + + /** + * List of apps to show in the dock + * @type {Array} + * @private + */ + static get dockApps() { + return [ + { name: 'phone', title: '', icon: 'Phone', color: '' }, + { name: 'contacts', title: '', icon: 'Contacts', color: '' }, + { name: 'messages', title: '', icon: 'Message', color: '' }, + { name: 'settings', title: '', icon: 'Settings', color: '' }, + ]; + } + + /** + * Handles app icon click events + * @param {string} appName - Name of the clicked app + * @private + */ + handleAppClick(appName) { + globalState.setState({ currentApp: appName }); + } + + /** + * Renders an individual app icon + * @param {AppConfig} app - App configuration object + * @returns {HTMLElement} The rendered app icon element + * @private + */ + renderAppIcon(app) { + const imgElement = this.createElement('img', { + alt: app.title, + style: { display: 'none' } // Hide initially + }); + + const isDarkTheme = document.documentElement.getAttribute('data-theme') === 'dark'; + const iconPath = HomeScreen.iconPath(app, isDarkTheme); + + // Check cache first + if (HomeScreen.iconCache.has(iconPath)) { + imgElement.src = HomeScreen.iconCache.get(iconPath); + imgElement.style.display = 'block'; + } else { + // Load the file if not in cache + PhoneMedia.loadImage(iconPath).then(imageContent => { + HomeScreen.iconCache.set(iconPath, imageContent); + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error(`Failed to load icon for ${app.title}:`, error); + }); + } + + return this.createElement( + 'div', + { + className: 'app-icon', + onClick: () => this.handleAppClick(app.name), + role: 'button', + 'aria-label': `Open ${app.title} app`, + tabIndex: 0, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleAppClick(app.name); + } + }, + }, + this.createElement( + 'div', + { + className: 'app-icon-symbol', + 'aria-hidden': 'true', + style: app.color ? { background: app.color } : {} + }, + imgElement + ), + this.createElement('span', { className: 'app-title' }, app.title) + ); + } + + /** + * Render the home screen + * @returns {HTMLElement} The rendered home screen element + */ + render() { + return this.createElement( + 'div', + { + className: 'home-screen', + role: 'main', + 'aria-label': 'Home screen', + }, + this.createElement( + 'div', + { + className: 'app-grid', + role: 'grid', + 'aria-label': 'App grid', + }, + ...HomeScreen.apps.map((app) => this.renderAppIcon(app)) + ), + this.createElement( + 'div', + { + className: 'dock', + role: 'toolbar', + 'aria-label': 'App dock', + }, + ...HomeScreen.dockApps.map((app) => this.renderAppIcon(app)) + ) + ); + } +} + +/** + * @typedef {Object} AppConfig + * @property {string} name - Internal name/identifier of the app + * @property {string} title - Display title of the app + * @property {string} icon - Emoji icon representing the app + * @property {string} color - Background color for the app icon (if any) + */ + + +// ---- ../js/apps/phone/components/Dialpad.js ---- +/** + * @format + * @class Dialpad + * @extends Component + * @description A phone dialpad component providing a touch-tone keypad interface for making calls. Manages phone number input, formatting, call state, and integration with contacts. + */ + +class Dialpad extends Component { + static fieldCommanderPhoneNumber = '0160000000'; + + static assetPath(...parts) { + return PhoneMedia.base64Path('images', ...parts); + } + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + + this.state = { + phoneNumber: '', // Current phone number in the dialpad + isCallActive: false, // Whether a call is currently in progress + callDuration: 0, // Duration of active call in seconds + }; + + // Bind event handlers + this.handleNumberClick = this.handleNumberClick.bind(this); + this.handleCall = this.handleCall.bind(this); + this.handleEndCall = this.handleEndCall.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.handleOpenContacts = this.handleOpenContacts.bind(this); + this.handleGlobalStateChange = this.handleGlobalStateChange.bind(this); + + this.callTimer = null; + + // Subscribe to global state changes + globalState.subscribe(this.handleGlobalStateChange); + } + + // ------------------------------------------------------------------------- + // Lifecycle Methods + // ------------------------------------------------------------------------- + + /** + * @method componentDidMount + * @description Initializes component after mounting, handling any existing phone number in global state + */ + componentDidMount() { + const state = globalState.getState(); + if (state.phoneNumber) { + this.setState( + { + phoneNumber: this.cleanPhoneNumber(state.phoneNumber), + }, + () => { + globalState.setState({ phoneNumber: '' }); + } + ); + } + } + + /** + * @method componentWillUnmount + * @description Cleanup resources and subscriptions when component unmounts + */ + componentWillUnmount() { + if (this.callTimer) { + clearInterval(this.callTimer); + } + globalState.unsubscribe(this.handleGlobalStateChange); + } + + // ------------------------------------------------------------------------- + // Phone Number Utilities + // ------------------------------------------------------------------------- + + /** + * @method cleanPhoneNumber + * @description Removes all non-digit characters from a phone number + * @param {string} number - The phone number to clean + * @returns {string} The cleaned phone number containing only digits + */ + cleanPhoneNumber(number) { + if (!number) return ''; + return number.replace(/\D/g, ''); + } + + /** + * @method formatPhoneNumber + * @description Formats a phone number into a readable format + * @param {string} number - The phone number to format + * @returns {string} Formatted phone number as (XXX) XXX-XXXX + */ + formatPhoneNumber(number) { + if (!number || number.length === 0) return ''; + + const cleaned = number.replace(/[^\d]/g, ''); + + if (cleaned.length <= 3) { + return cleaned; + } else if (cleaned.length <= 6) { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3)}`; + } else if (cleaned.length <= 10) { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6)}`; + } else { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6, 10)}`; + } + } + + /** + * @method formatTime + * @description Formats seconds into MM:SS format + * @param {number} seconds - Number of seconds to format + * @returns {string} Time formatted as MM:SS + */ + formatTime(seconds) { + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } + + // ------------------------------------------------------------------------- + // Event Handlers + // ------------------------------------------------------------------------- + + /** + * @method handleGlobalStateChange + * @description Handles changes in the global state, specifically phone number updates + * @param {Object} newState - The new global state + */ + handleGlobalStateChange(newState) { + if (newState.phoneNumber) { + const cleaned = this.cleanPhoneNumber(newState.phoneNumber); + if (cleaned && cleaned !== this.state.phoneNumber) { + this.setState( + { + phoneNumber: cleaned, + }, + () => { + globalState.setState({ phoneNumber: '' }); + } + ); + } + } + } + + /** + * @method handleNumberClick + * @description Handles digit button clicks on the dialpad + * @param {string} number - The digit that was clicked + */ + handleNumberClick(number) { + if (!this.state.isCallActive) { + this.setState({ + phoneNumber: this.state.phoneNumber + number, + }); + } + } + + /** + * @method handleDelete + * @description Handles the delete button click, removing the last digit + */ + handleDelete() { + if (!this.state.isCallActive) { + this.setState({ + phoneNumber: this.state.phoneNumber.slice(0, -1), + }); + } + } + + /** + * @method handleCall + * @description Initiates a phone call and starts the call timer + */ + handleCall() { + if ( + this.state.phoneNumber && + !this.state.isCallActive && + this.cleanPhoneNumber(this.state.phoneNumber) !== Dialpad.fieldCommanderPhoneNumber + ) { + this.setState({ + isCallActive: true, + callDuration: 0, + }); + + this.callTimer = setInterval(() => { + // Update state directly to avoid re-render during call + this.state.callDuration = this.state.callDuration + 1; + + // Update only the call duration display element + const durationElement = document.querySelector('.call-duration'); + if (durationElement) { + durationElement.textContent = this.formatTime(this.state.callDuration); + } + }, 1000); + } + } + + /** + * @method handleEndCall + * @description Ends the current call and resets the dialpad state + */ + handleEndCall() { + if (this.callTimer) { + clearInterval(this.callTimer); + this.callTimer = null; + } + + this.setState({ + isCallActive: false, + callDuration: 0, + phoneNumber: '', + }); + } + + /** + * @method handleOpenContacts + * @description Navigates to the contacts view + */ + handleOpenContacts() { + globalState.setState({ + currentApp: 'contacts', + previousApp: 'phone', + }); + } + + // ------------------------------------------------------------------------- + // Render Methods + // ------------------------------------------------------------------------- + + /** + * @method render + * @description Renders the phone dialpad interface + * @returns {Object} Virtual DOM representation of the component + */ + render() { + const { phoneNumber, isCallActive, callDuration } = this.state; + const isPhoneNumberEmpty = phoneNumber.length === 0; + + const dialpadNumbers = [ + ['1', ''], + ['2', 'ABC'], + ['3', 'DEF'], + ['4', 'GHI'], + ['5', 'JKL'], + ['6', 'MNO'], + ['7', 'PQRS'], + ['8', 'TUV'], + ['9', 'WXYZ'], + ['*', ''], + ['0', '+'], + ['#', ''], + ]; + + if (isCallActive) { + return this.createElement( + 'div', + { + className: 'phone-dialpad call-active', + role: 'region', + 'aria-label': 'Active call interface', + }, + this.createElement( + 'div', + { + className: 'call-info', + role: 'status', + 'aria-live': 'polite', + }, + this.createElement('div', { className: 'call-status' }, 'Calling...'), + this.createElement('div', { className: 'call-number' }, this.formatPhoneNumber(phoneNumber)), + this.createElement('div', { className: 'call-duration' }, this.formatTime(callDuration)) + ), + this.createElement( + 'div', + { className: 'call-actions' }, + this.createElement( + 'button', + { + className: 'end-call-btn', + onClick: this.handleEndCall, + 'aria-label': 'End call', + }, + (() => { + const imgElement = this.createElement('img', { + alt: 'End call', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'HangUp.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load hang up icon:', error); + }); + + return imgElement; + })() + ) + ) + ); + } + + const callButtonProps = { + className: 'action-btn call-btn', + onClick: this.handleCall, + 'aria-label': 'Make call', + }; + + if (isPhoneNumberEmpty || this.cleanPhoneNumber(phoneNumber) === Dialpad.fieldCommanderPhoneNumber) { + callButtonProps.disabled = true; + } + + return this.createElement( + 'div', + { + className: 'phone-dialpad', + role: 'region', + 'aria-label': 'Phone dialer', + }, + this.createElement( + 'div', + { + className: 'phone-display', + role: 'textbox', + 'aria-label': 'Phone number display', + }, + this.createElement('div', { className: 'phone-number' }, this.formatPhoneNumber(phoneNumber) || 'Enter a number') + ), + this.createElement( + 'div', + { + className: 'dialpad', + role: 'grid', + 'aria-label': 'Dial pad', + }, + ...dialpadNumbers.map(([number, letters]) => + this.createElement( + 'button', + { + className: 'dialpad-btn', + onClick: () => this.handleNumberClick(number), + 'aria-label': `Dial ${number}${letters ? ` (${letters})` : ''}`, + }, + this.createElement('span', { className: 'number' }, number), + letters && this.createElement('span', { className: 'letters' }, letters) + ) + ) + ), + this.createElement( + 'div', + { + className: 'phone-actions', + role: 'toolbar', + 'aria-label': 'Phone actions', + }, + this.createElement( + 'button', + { + className: 'action-btn delete-btn', + onClick: this.handleDelete, + 'aria-label': 'Delete last digit', + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Delete', + style: 'width:28px;height:28px;padding:0;margin:4px 4px 0 0;display:block;pointer-events:none;' + }) + ), + this.createElement('button', callButtonProps, + (() => { + const imgElement = this.createElement('img', { + alt: 'Make call', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'Call.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load call icon:', error); + }); + + return imgElement; + })() + ), + this.createElement( + 'button', + { + className: 'action-btn contact-btn', + onClick: this.handleOpenContacts, + 'aria-label': 'Open contacts', + }, + (() => { + const imgElement = this.createElement('img', { + alt: 'Open contacts', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'Contact.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load contact icon:', error); + }); + + return imgElement; + })() + ) + ) + ); + } +} + + +// ---- ../js/apps/phone/index.js ---- +/** + * @fileoverview Main entry point for the Phone application + * + * This module initializes the Phone app UI, including: + * - Rendering the dialpad component + * - Mounting the dialpad into the provided container + * + * The initializePhoneApp function is exposed globally for use by the main app. + */ + +// Initialize the phone app +function initializePhoneApp(container) { + // Create and mount the dialpad component + const phoneDialpad = new Dialpad(); + phoneDialpad.mount(container); +} + +// Make initialization function globally available +window.initializePhoneApp = initializePhoneApp; + +// ---- ../js/apps/messages/components/MessagesList.js ---- +/** @format */ + +/** + * @class MessagesList + * @extends Component + * @description A component that renders a list of message items. + * Manages the display of MessageItem components and handles message selection. + */ +class MessagesList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} [props.messages=[]] - Array of message objects to display + * @param {Function} [props.onMessageClick] - Callback function when a message is clicked + */ + constructor(props) { + super(props); + this.state = { + filteredMessages: this.buildRows(props.messages || [], props.contacts || [], ''), + searchTerm: '' + }; + } + + /** + * Update filtered messages when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if ( + nextProps.messages !== this.props.messages || + nextProps.contacts !== this.props.contacts || + nextProps.includeContacts !== this.props.includeContacts || + nextProps.includeContactsOnSearch !== this.props.includeContactsOnSearch + ) { + // Re-apply current search filter to new messages + this.handleSearch(this.state.searchTerm); + } + } + + buildRows(messages = [], contacts = [], searchTerm = '') { + const searchTermLower = searchTerm.toLowerCase(); + const includeContacts = this.props.includeContacts === true || (this.props.includeContactsOnSearch === true && searchTermLower.length > 0); + const byContactId = new Map(); + const contactByUid = new Map(); + + contacts + .filter((contact) => contact && contact.uid) + .forEach((contact) => contactByUid.set(contact.uid, contact)); + + messages.forEach((message) => { + if (!message) return; + const contactId = message.contactId || message.id; + const contact = contactByUid.get(contactId) || {}; + + byContactId.set(contactId, { + ...contact, + ...message, + id: contactId, + contactId, + contactName: message.contactName || contact.fullName || contact.name || contactId, + phone: contact.phone || message.phone || '', + email: contact.email || message.email || '', + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + hasConversation: Array.isArray(message.conversation) && message.conversation.length > 0 + }); + }); + + if (includeContacts) { + contacts + .filter((contact) => contact && contact.uid && contact.canMessage !== false) + .forEach((contact) => { + if (byContactId.has(contact.uid)) return; + + byContactId.set(contact.uid, { + id: contact.uid, + contactId: contact.uid, + contactName: contact.fullName || contact.name || contact.uid, + fullName: contact.fullName || contact.name || contact.uid, + name: contact.name || contact.fullName || contact.uid, + phone: contact.phone || '', + email: contact.email || '', + avatar: contact.avatar, + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + lastMessage: 'Start conversation', + timestamp: null, + unread: 0, + conversation: [], + hasConversation: false + }); + }); + } + + return Array.from(byContactId.values()).filter((message) => { + if (!searchTermLower) return true; + + return [ + message.contactName, + message.lastMessage, + message.contactId, + message.id, + message.phone, + message.email + ].some((value) => (value || '').toString().toLowerCase().includes(searchTermLower)); + }); + } + + /** + * Filter messages based on search term + * @param {string} searchTerm - The search term to filter messages + * @private + */ + handleSearch(searchTerm) { + const { messages = [], contacts = [] } = this.props; + const filtered = this.buildRows(messages, contacts, searchTerm); + + this.setState({ + filteredMessages: filtered, + searchTerm + }); + } + + /** + * Creates MessageItem components from the filtered messages array + * @private + * @returns {Array} Array of MessageItem components + */ + renderMessageItems() { + const { onMessageClick, onMessageDelete } = this.props; + const { filteredMessages } = this.state; + + if (!filteredMessages.length) { + return [ + this.createElement( + 'div', + { className: 'messages-empty-state' }, + this.createElement('strong', {}, this.props.emptyTitle || 'No conversations'), + this.createElement('span', {}, this.props.emptySubtitle || 'Tap + to start a new conversation.') + ) + ]; + } + + return filteredMessages.map( + (message) => + new MessageItem({ + message, + onClick: onMessageClick, + onDelete: onMessageDelete, + key: message.id, + }) + ); + } + + /** + * Render the messages list with search bar + * @returns {HTMLElement} The rendered messages list element + */ + render() { + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'messages-container', + style: { + display: 'flex', + flexDirection: 'column', + height: '100%' + } + }, + new SearchBar({ + placeholder: this.props.searchPlaceholder || 'Search by contact name...', + onSearch: this.handleSearch.bind(this), + value: searchTerm + }), + this.createElement( + 'div', + { + className: 'messages-list', + role: 'list', + 'aria-label': 'Messages list', + style: { + flex: 1, + overflowY: 'auto', + padding: '10px' + } + }, + ...this.renderMessageItems() + ) + ); + } +} + + +// ---- ../js/apps/messages/components/MessageItem.js ---- +/** @format */ + +/** + * @class MessageItem + * @extends Component + * @description A component that renders a single message preview item in the messages list. + * Displays contact information, last message, timestamp, and unread count. + */ +class MessageItem extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} props.message - Message data object + * @param {string} props.message.contactName - Name of the contact + * @param {string} props.message.lastMessage - Most recent message text + * @param {Date} props.message.timestamp - Timestamp of the last message + * @param {number} props.message.unread - Number of unread messages + * @param {Function} [props.onClick] - Callback function when message is clicked + */ + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + this.handleDeleteClick = this.handleDeleteClick.bind(this); + } + + /** + * Handles click events on the message item + * @private + */ + handleClick() { + const { onClick, message } = this.props; + if (onClick) { + onClick(message); + } + } + + /** + * Handles delete clicks without opening the conversation. + * @param {Event} event - Click event + * @private + */ + handleDeleteClick(event) { + event.stopPropagation(); + const { onDelete, message } = this.props; + if (onDelete) { + onDelete(message); + } + } + + /** + * Formats the timestamp into a relative time string + * @param {Date} timestamp - The timestamp to format + * @returns {string} Formatted relative time (e.g., "5m ago", "2h ago", "3d ago") + * @private + */ + formatTime(timestamp) { + if (!timestamp) return ''; + + const now = new Date(); + const messageTime = new Date(timestamp); + if (Number.isNaN(messageTime.getTime())) return ''; + + const diffInHours = (now - messageTime) / (1000 * 60 * 60); + + if (diffInHours < 1) { + const minutes = Math.floor(diffInHours * 60); + return `${minutes}m ago`; + } else if (diffInHours < 24) { + return `${Math.floor(diffInHours)}h ago`; + } else { + const days = Math.floor(diffInHours / 24); + return `${days}d ago`; + } + } + + /** + * Gets contact initials from the full name + * @param {string} fullName - Full name of the contact + * @returns {string} Contact's initials + * @private + */ + getContactInitials(fullName) { + return fullName + .split(' ') + .map((n) => n[0]) + .join(''); + } + + /** + * Renders the message header with contact name and timestamp + * @param {Object} message - Message data object + * @returns {HTMLElement} The rendered message header + * @private + */ + renderMessageHeader(message) { + return this.createElement( + 'div', + { className: 'message-header' }, + this.createElement( + 'h3', + { + className: 'contact-name', + role: 'heading', + 'aria-level': '3', + }, + message.contactName + ), + this.createElement( + 'span', + { + className: 'message-time', + 'aria-label': message.timestamp ? `Sent ${this.formatTime(message.timestamp)}` : '', + }, + this.formatTime(message.timestamp) + ) + ); + } + + /** + * Renders the message preview with last message and unread count + * @param {Object} message - Message data object + * @returns {HTMLElement} The rendered message preview + * @private + */ + renderMessagePreview(message) { + const preview = message.hasConversation ? message.lastMessage : 'Start conversation'; + + return this.createElement( + 'div', + { className: 'message-preview' }, + this.createElement( + 'p', + { + role: 'text', + 'aria-label': 'Last message', + }, + preview + ), + message.unread > 0 && + this.createElement( + 'span', + { + className: 'unread-badge', + role: 'status', + 'aria-label': `${message.unread} unread messages`, + }, + message.unread.toString() + ) + ); + } + + /** + * Render the message item + * @returns {HTMLElement} The rendered message item element + */ + render() { + const { message } = this.props; + const initials = this.getContactInitials(message.contactName); + const canDelete = Array.isArray(message.conversation) && message.conversation.length > 0; + + return this.createElement( + 'div', + { + className: 'message-item', + onClick: this.handleClick, + role: 'button', + tabIndex: 0, + 'aria-label': `Conversation with ${message.contactName}`, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleClick(); + } + }, + }, + this.createElement( + 'div', + { + className: 'message-avatar', + 'aria-hidden': 'true', + }, + initials + ), + this.createElement( + 'div', + { className: 'message-content' }, + this.renderMessageHeader(message), + this.renderMessagePreview(message) + ), + canDelete ? this.createElement( + 'button', + { + type: 'button', + className: 'message-thread-delete-button', + 'aria-label': `Delete conversation with ${message.contactName}`, + onClick: this.handleDeleteClick + }, + 'Delete' + ) : null + ); + } +} + + +// ---- ../js/apps/messages/components/ConversationView.js ---- +/** @format */ + +/** + * @class ConversationView + * @extends Component + * @description A component that displays and manages a messaging conversation. + * Handles message display, input management, and message sending functionality. + */ +class ConversationView extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.conversation] - The conversation data to display + * @param {string} props.conversation.contactName - Name of the contact + * @param {Array} props.conversation.conversation - Array of message objects + */ + constructor(props = {}) { + super(props); + this.state = { + newMessage: '', + }; + + this.inputRef = null; + this.messagesContainerRef = null; + + // Bind methods + this.handleInputChange = this.handleInputChange.bind(this); + this.handleSendMessage = this.handleSendMessage.bind(this); + this.setInputRef = this.setInputRef.bind(this); + this.setMessagesContainerRef = this.setMessagesContainerRef.bind(this); + this.renderMessageBubble = this.renderMessageBubble.bind(this); + this.scrollToBottom = this.scrollToBottom.bind(this); + this.updateScrollbar = this.updateScrollbar.bind(this); + } + + /** + * Component lifecycle - after component mounts + */ + componentDidMount() { + this.scrollToBottom(); + this.updateScrollbar(); + // Add resize listener to update scrollbar + window.addEventListener('resize', this.updateScrollbar); + } + + /** + * Component lifecycle - after component updates + */ + componentDidUpdate(prevProps) { + // If conversation changed or new messages added, scroll to bottom + if (prevProps.conversation !== this.props.conversation || + (prevProps.conversation && this.props.conversation && + prevProps.conversation.conversation.length !== this.props.conversation.conversation.length)) { + this.scrollToBottom(); + this.updateScrollbar(); + } + } + + /** + * Component lifecycle - before component unmounts + */ + componentWillUnmount() { + window.removeEventListener('resize', this.updateScrollbar); + } + + /** + * Stores reference to the messages container element + * @param {HTMLElement} element - The messages container DOM element + * @private + */ + setMessagesContainerRef(element) { + if (element) { + this.messagesContainerRef = element; + this.updateScrollbar(); + } + } + + /** + * Stores reference to the input element and manages focus + * @param {HTMLInputElement} element - The input DOM element + * @private + */ + setInputRef(element) { + if (element) { + this.inputRef = element; + if (document.activeElement !== element) { + element.focus(); + } + } + } + + /** + * Scrolls the messages container to the bottom + * @private + */ + scrollToBottom() { + if (this.messagesContainerRef) { + requestAnimationFrame(() => { + this.messagesContainerRef.scrollTop = this.messagesContainerRef.scrollHeight; + }); + } + } + + /** + * Forces scrollbar update by triggering reflow + * @private + */ + updateScrollbar() { + if (this.messagesContainerRef) { + requestAnimationFrame(() => { + // Force reflow to update scrollbar + const container = this.messagesContainerRef; + const currentScrollTop = container.scrollTop; + + // Temporarily change overflow to force scrollbar recalculation + const originalOverflow = container.style.overflow; + container.style.overflow = 'hidden'; + + // Force reflow + container.offsetHeight; + + // Restore overflow + container.style.overflow = originalOverflow || 'auto'; + + // Restore scroll position + container.scrollTop = currentScrollTop; + }); + } + } + + /** + * Handles changes to the message input + * @param {Event} e - Input change event + * @private + */ + handleInputChange(e) { + // Update state without triggering a re-render + this.state.newMessage = e.target.value; + } + + /** + * Handles message sending when button is clicked + * @private + */ + handleSendMessage() { + const { newMessage } = this.state; + const { conversation } = this.props; + + if (conversation && conversation.canMessage === false) { + return; + } + + if (newMessage.trim()) { + // Create new message object + const newMessageObj = { + id: generateId(), + text: newMessage.trim(), + sender: 'user', + timestamp: new Date(), + }; + + // Send alert to Arma 3 via A3API + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: "phone::send::message", + data: { + conversationId: conversation.id, + contactName: conversation.contactName, + toUid: conversation.contactId || conversation.id, + message: newMessageObj + } + })); + } + + // Reset input + this.state.newMessage = ''; + if (this.inputRef) { + this.inputRef.value = ''; + this.inputRef.focus(); + } + + // Scroll to bottom after sending message + setTimeout(() => { + this.scrollToBottom(); + this.updateScrollbar(); + }, 50); + } + } + + /** + * Formats message timestamp for display + * @param {Date} timestamp - Message timestamp + * @returns {string} Formatted time string + * @private + */ + formatMessageTime(timestamp) { + return new Date(timestamp).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + }); + } + + /** + * Renders a single message bubble + * @param {Object} msg - Message object + * @returns {HTMLElement} Message bubble element + * @private + */ + renderMessageBubble(msg) { + return this.createElement( + 'div', + { + className: `message-bubble ${msg.sender}`, + key: msg.id, + role: 'article', + 'aria-label': `${msg.sender === 'user' ? 'Sent' : 'Received'} message`, + }, + this.createElement('p', { role: 'text' }, msg.text), + this.createElement( + 'span', + { + className: 'message-timestamp', + 'aria-label': 'Message time', + }, + this.formatMessageTime(msg.timestamp) + ) + ); + } + + /** + * Renders the message input container + * @returns {HTMLElement} Container element + * @private + */ + renderMessageForm() { + const { conversation } = this.props; + const canMessage = !conversation || conversation.canMessage !== false; + + return this.createElement( + 'div', + { + className: 'message-input-form', + role: 'form', + 'aria-label': 'Message input form', + }, + this.createElement('textarea', { + className: 'message-input', + placeholder: canMessage ? 'Type a message...' : 'Replies disabled for this contact', + value: this.state.newMessage, + disabled: !canMessage, + onInput: (e) => { + if (!canMessage) return; + this.handleInputChange(e); + // Auto-grow logic + if (e.target) { + e.target.style.height = 'auto'; + e.target.style.height = e.target.scrollHeight + 'px'; + } + }, + onKeyDown: (e) => { + // Send message on Enter key (but not Shift+Enter) + if (canMessage && e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + this.handleSendMessage(); + } + }, + ref: (el) => { + this.setInputRef(el); + if (el) { + el.style.height = 'auto'; + el.style.height = el.scrollHeight + 'px'; + } + }, + rows: 1, + 'aria-label': 'Message input', + style: 'resize: none; overflow: hidden;' + }), + this.createElement( + 'button', + { + type: 'button', + className: 'send-button', + onClick: this.handleSendMessage, + disabled: !canMessage, + 'aria-label': canMessage ? 'Send message' : 'Replies disabled' + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Send', + style: 'width:22px;height:22px;padding:0;margin:4px 4px 0 0;display:block;pointer-events:none;' + }) + ) + ); + } + + /** + * Render the conversation view + * @returns {HTMLElement} The rendered conversation view + */ + render() { + const { conversation } = this.props; + + if (!conversation) { + return this.createElement('div', { role: 'alert' }, 'No conversation selected'); + } + + return this.createElement( + 'div', + { + className: 'conversation-view', + role: 'main', + 'aria-label': `Conversation with ${conversation.contactName}`, + style: 'display: flex; flex-direction: column; height: 100%; overflow: hidden;' + }, + // Messages container + this.createElement( + 'div', + { + className: 'messages-container', + role: 'log', + 'aria-label': 'Message history', + ref: this.setMessagesContainerRef, + style: 'flex: 1; overflow-y: auto; overflow-x: hidden; padding: 10px; box-sizing: border-box;', + onScroll: () => { + // Update scrollbar on scroll + requestAnimationFrame(this.updateScrollbar); + } + }, + ...conversation.conversation.map(this.renderMessageBubble) + ), + // Message input form + this.renderMessageForm() + ); + } +} + + +// ---- ../js/apps/messages/index.js ---- +/** + * @fileoverview Main entry point for the Messages application. + */ + +function initializeMessagesApp(container) { + const { messages = [], contacts = [], selectedConversation, showMessageContactPicker } = globalState.getState(); + const appContainer = document.createElement('div'); + + const openConversation = (conversation) => { + if (!conversation) return; + + const contactId = conversation.contactId || conversation.uid || conversation.id; + const { rawMessages = [], currentUid = window.__playerUid } = globalState.getState(); + const selectedRawMessages = rawMessages.filter((message) => + message && + ( + (message.from === currentUid && message.to === contactId) || + (message.from === contactId && message.to === currentUid) + ) + ); + + globalState.setState({ + selectedConversation: { + ...conversation, + id: contactId, + contactId, + contactName: conversation.contactName || conversation.fullName || conversation.name || contactId, + conversation: conversation.conversation || [] + }, + selectedConversationRaw: { + otherUid: contactId, + messages: selectedRawMessages + }, + showMessageContactPicker: false + }); + }; + + const deleteConversationMessages = (conversation) => { + const messageIds = ((conversation && conversation.conversation) || []) + .map((message) => message && message.id) + .filter(Boolean); + + if (!messageIds.length) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + messageIds.forEach((messageId) => { + A3API.SendAlert(JSON.stringify({ + event: 'phone::delete::message', + data: { messageId } + })); + }); + } + }; + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Messages'); + + const navBar = new NavigationBar({ + title: selectedConversation ? selectedConversation.contactName : (showMessageContactPicker ? 'New Conversation' : 'Messages'), + showBackButton: !!selectedConversation || showMessageContactPicker, + rightButton: selectedConversation && selectedConversation.conversation && selectedConversation.conversation.length ? { + element: 'button', + props: { + type: 'button', + className: 'message-nav-delete-button', + onClick: () => { + deleteConversationMessages(selectedConversation); + globalState.setState({ selectedConversation: null, selectedConversationRaw: null }); + } + }, + content: 'Delete' + } : (!selectedConversation && !showMessageContactPicker) ? { + element: 'button', + props: { + type: 'button', + className: 'nav-button add-button', + onClick: () => globalState.setState({ showMessageContactPicker: true }), + 'aria-label': 'Start conversation', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } : null + }); + navBar.mount(appContainer); + + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + if (selectedConversation) { + const conversationView = new ConversationView({ conversation: selectedConversation }); + conversationView.mount(contentContainer); + } else { + const messagesList = new MessagesList({ + messages, + contacts, + includeContacts: showMessageContactPicker, + includeContactsOnSearch: true, + searchPlaceholder: 'Search contacts or conversations...', + emptyTitle: showMessageContactPicker ? 'No contacts found' : 'No conversations', + emptySubtitle: showMessageContactPicker ? 'Try another search.' : 'Search for a contact to start texting.', + onMessageClick: openConversation, + onMessageDelete: deleteConversationMessages + }); + messagesList.mount(contentContainer); + } + + container.appendChild(appContainer); +} + +window.initializeMessagesApp = initializeMessagesApp; + + +// ---- ../js/apps/mail/components/MailList.js ---- +/** @format */ + +class MailList extends Component { + constructor(props = {}) { + super(props); + this.state = { + searchTerm: '' + }; + + this.handleSearch = this.handleSearch.bind(this); + this.renderEmailItem = this.renderEmailItem.bind(this); + } + + handleSearch(searchTerm) { + this.setState({ searchTerm }); + } + + formatEmailTime(timestamp) { + const parsed = new Date(timestamp); + if (Number.isNaN(parsed.getTime())) return ''; + + return parsed.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }); + } + + resolveContactName(uid) { + const contact = (this.props.contacts || []).find((entry) => entry.uid === uid || entry.id === uid); + return contact ? contact.name : uid; + } + + getFilteredEmails() { + const { emails = [] } = this.props; + const searchTerm = (this.state.searchTerm || '').toLowerCase(); + + if (!searchTerm) return emails; + + return emails.filter((email) => { + const senderName = this.resolveContactName(email.from || '').toLowerCase(); + const recipientName = this.resolveContactName(email.to || '').toLowerCase(); + return ( + (email.subject || '').toLowerCase().includes(searchTerm) || + (email.body || '').toLowerCase().includes(searchTerm) || + senderName.includes(searchTerm) || + recipientName.includes(searchTerm) + ); + }); + } + + renderEmailItem(email) { + const { currentUid, onEmailClick } = this.props; + const isSent = email.from === currentUid; + const actorName = this.resolveContactName(isSent ? email.to : email.from); + const bodyPreview = email.body || ''; + + return this.createElement( + 'button', + { + className: `mail-item ${email.read ? 'read' : 'unread'}`, + type: 'button', + onClick: () => onEmailClick && onEmailClick(email), + 'aria-label': `Open email ${email.subject || 'No subject'}` + }, + this.createElement('div', { className: 'mail-item-header' }, + this.createElement('strong', {}, `${isSent ? 'To' : 'From'}: ${actorName || 'Unknown'}`), + this.createElement('span', {}, this.formatEmailTime(email.timestamp)) + ), + this.createElement('div', { className: 'mail-item-subject' }, email.subject || 'No subject'), + this.createElement('div', { className: 'mail-item-preview' }, bodyPreview) + ); + } + + render() { + const filteredEmails = this.getFilteredEmails(); + + return this.createElement( + 'div', + { className: 'mail-list-container' }, + new SearchBar({ + placeholder: 'Search mail...', + onSearch: this.handleSearch, + value: this.state.searchTerm + }), + this.createElement( + 'div', + { className: 'mail-list', role: 'list', 'aria-label': 'Email list' }, + filteredEmails.length > 0 + ? filteredEmails.map(this.renderEmailItem) + : this.createElement('div', { className: 'mail-empty' }, 'No email yet.') + ) + ); + } +} + + +// ---- ../js/apps/mail/components/MailDetail.js ---- +/** @format */ + +class MailDetail extends Component { + resolveContactName(uid) { + const contact = (this.props.contacts || []).find((entry) => entry.uid === uid || entry.id === uid); + return contact ? contact.name : uid; + } + + formatEmailTime(timestamp) { + const parsed = new Date(timestamp); + if (Number.isNaN(parsed.getTime())) return ''; + + return parsed.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }); + } + + componentDidMount() { + const { email } = this.props; + if (!email || email.read) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: 'phone::mark::email::read', + data: { emailId: email.id } + })); + } + } + + handleDeleteEmail(emailId) { + if (!emailId) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: 'phone::delete::email', + data: { emailId } + })); + } + } + + render() { + const { email } = this.props; + + if (!email) { + return this.createElement('div', { className: 'mail-empty' }, 'No email selected.'); + } + + return this.createElement( + 'article', + { className: 'mail-detail' }, + this.createElement('h2', {}, email.subject || 'No subject'), + this.createElement('div', { className: 'mail-meta' }, + this.createElement('span', {}, `From: ${this.resolveContactName(email.from) || 'Unknown'}`), + this.createElement('span', {}, `To: ${this.resolveContactName(email.to) || 'Unknown'}`), + this.createElement('span', {}, this.formatEmailTime(email.timestamp)) + ), + this.createElement('p', { className: 'mail-body' }, email.body || ''), + this.createElement( + 'button', + { + type: 'button', + className: 'mail-delete-button', + onClick: () => this.handleDeleteEmail(email.id) + }, + 'Delete Email' + ) + ); + } +} + + +// ---- ../js/apps/mail/components/MailComposer.js ---- +/** @format */ + +class MailComposer extends Component { + constructor(props = {}) { + super(props); + const contacts = this.emailableContacts(props.contacts || []); + const defaultRecipient = contacts.length === 1 ? (contacts[0].uid || contacts[0].id || '') : ''; + this.state = { + toUid: defaultRecipient, + subject: '', + body: '' + }; + + this.toRef = null; + this.subjectRef = null; + this.bodyRef = null; + this.lastSendAt = 0; + + this.handleSend = this.handleSend.bind(this); + this.syncSubject = this.syncSubject.bind(this); + this.syncBody = this.syncBody.bind(this); + } + + emailableContacts(contacts = []) { + return contacts.filter((contact) => contact && contact.canEmail !== false && (contact.uid || contact.id)); + } + + readField(id, ref, fallback = '') { + const scopedElement = this.element ? this.element.querySelector(`#${id}`) : null; + const documentElement = typeof document !== 'undefined' ? document.getElementById(id) : null; + const element = scopedElement || documentElement || ref; + if (!element) return fallback; + + if (typeof element.value === 'string' && element.value.length > 0) { + return element.value; + } + + if (typeof element.textContent === 'string' && element.textContent.length > 0) { + return element.textContent; + } + + return fallback; + } + + syncSubject(event) { + this.state.subject = event?.target?.value || ''; + } + + syncBody(event) { + this.state.body = event?.target?.value || ''; + } + + handleSend(event) { + event?.preventDefault?.(); + event?.stopPropagation?.(); + + const now = Date.now(); + if (now - this.lastSendAt < 500) return; + + const toUid = this.readField('phone-mail-recipient', this.toRef, this.state.toUid).trim(); + const subject = this.readField('phone-mail-subject', this.subjectRef, this.state.subject).trim() || 'No subject'; + const body = this.readField('phone-mail-body', this.bodyRef, this.state.body).trim(); + + if (!toUid || !body) { + console.warn('MailComposer: missing required email fields', { + hasRecipient: !!toUid, + hasSubject: subject !== 'No subject', + hasBody: !!body, + toUid, + subjectLength: subject.length, + bodyLength: body.length + }); + return; + } + + this.lastSendAt = now; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + console.log('MailComposer: sending email', { toUid, subjectLength: subject.length, bodyLength: body.length }); + A3API.SendAlert(JSON.stringify({ + event: 'phone::send::email', + data: { toUid, subject, body } + })); + } else { + console.warn('MailComposer: A3API.SendAlert unavailable'); + } + + globalState.setState({ + showEmailComposer: false, + selectedEmail: null + }); + } + + renderContactOptions() { + const contacts = this.emailableContacts(this.props.contacts || []); + + return [ + this.createElement('option', { value: '' }, 'Select recipient'), + ...contacts.map((contact) => this.createElement( + 'option', + { value: contact.uid || contact.id }, + `${contact.fullName || contact.name || 'Unknown'}${contact.email ? ` (${contact.email})` : ''}` + )) + ]; + } + + render() { + return this.createElement( + 'div', + { className: 'mail-composer' }, + this.createElement('label', {}, + 'To', + this.createElement( + 'select', + { + id: 'phone-mail-recipient', + name: 'phone-mail-recipient', + value: this.state.toUid, + onInput: (event) => { this.state.toUid = event.target.value; }, + onChange: (event) => { this.state.toUid = event.target.value; }, + ref: (element) => { + this.toRef = element; + if (element && this.state.toUid && !element.value) { + element.value = this.state.toUid; + } + }, + 'aria-label': 'Email recipient' + }, + ...this.renderContactOptions() + ) + ), + this.createElement('label', {}, + 'Subject', + this.createElement('input', { + id: 'phone-mail-subject', + name: 'phone-mail-subject', + type: 'text', + value: this.state.subject, + onInput: this.syncSubject, + onChange: this.syncSubject, + onKeyUp: this.syncSubject, + ref: (element) => { this.subjectRef = element; }, + placeholder: 'Subject' + }) + ), + this.createElement('label', {}, + 'Message', + this.createElement('textarea', { + id: 'phone-mail-body', + name: 'phone-mail-body', + value: this.state.body, + onInput: this.syncBody, + onChange: this.syncBody, + onKeyUp: this.syncBody, + ref: (element) => { this.bodyRef = element; }, + placeholder: 'Write email body...', + rows: 8 + }) + ), + this.createElement( + 'button', + { + type: 'button', + className: 'mail-send-button', + onClick: this.handleSend, + onMouseDown: this.handleSend + }, + 'Send' + ) + ); + } +} + + +// ---- ../js/apps/mail/index.js ---- +/** @format */ + +function initializeMailApp(container) { + const { emails, contacts, currentUid, selectedEmail, showEmailComposer } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Mail'); + + if (typeof requestEmails === 'function') requestEmails(); + if (typeof requestContacts === 'function') requestContacts(); + + const navBar = new NavigationBar({ + title: selectedEmail ? 'Email' : (showEmailComposer ? 'New Email' : 'Mail'), + showBackButton: !!selectedEmail || !!showEmailComposer, + rightButton: (!selectedEmail && !showEmailComposer) ? { + element: 'button', + props: { + type: 'button', + className: 'nav-button add-button', + onClick: () => globalState.setState({ showEmailComposer: true, selectedEmail: null }), + 'aria-label': 'Compose email', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } : null + }); + navBar.mount(appContainer); + + const contentContainer = document.createElement('div'); + contentContainer.className = 'content mail-content'; + appContainer.appendChild(contentContainer); + + if (showEmailComposer) { + new MailComposer({ contacts }).mount(contentContainer); + } else if (selectedEmail) { + new MailDetail({ email: selectedEmail, contacts }).mount(contentContainer); + } else { + new MailList({ + emails, + contacts, + currentUid, + onEmailClick: (email) => globalState.setState({ selectedEmail: email, showEmailComposer: false }) + }).mount(contentContainer); + } + + container.appendChild(appContainer); +} + +window.initializeMailApp = initializeMailApp; + + +// ---- ../js/apps/contacts/components/ContactList.js ---- +/** @format */ + +/** + * @class ContactList + * @extends Component + * @description A component that renders a list of contacts. + * Manages the display of multiple ContactItem components and handles contact selection. + */ +class ContactList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} [props.contacts=[]] - Array of contact objects to display + * @param {Function} [props.onContactClick] - Callback function when a contact is clicked + */ + constructor(props) { + super(props); + this.state = { + filteredContacts: props.contacts || [], + searchTerm: '' + }; + } + + /** + * Update filtered contacts when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if (nextProps.contacts !== this.props.contacts) { + // Re-apply current search filter to new contacts + this.handleSearch(this.state.searchTerm); + } + } + + /** + * Filter contacts based on search term + * @param {string} searchTerm - The search term to filter contacts + * @private + */ + handleSearch(searchTerm) { + const { contacts = [] } = this.props; + const searchTermLower = searchTerm.toLowerCase(); + + const filtered = contacts.filter(contact => + contact.name.toLowerCase().includes(searchTermLower) || + contact.phone.toLowerCase().includes(searchTermLower) + ); + + this.setState({ + filteredContacts: filtered, + searchTerm + }); + } + + /** + * Creates ContactItem components from the filtered contacts array + * @private + * @returns {Array} Array of ContactItem components + */ + renderContactItems() { + const { onContactClick } = this.props; + const { filteredContacts } = this.state; + + return filteredContacts.map( + (contact) => + new ContactItem({ + contact, + onClick: onContactClick, + key: contact.id, + }) + ); + } + + /** + * Render the contact list with search bar + * @returns {HTMLElement} The rendered contact list element + */ + render() { + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'contacts-container', + style: { + display: 'flex', + flexDirection: 'column', + height: '100%' + } + }, + new SearchBar({ + placeholder: 'Search contacts...', + onSearch: this.handleSearch.bind(this), + value: searchTerm + }), + this.createElement( + 'ul', + { + className: 'contact-list', + role: 'list', + 'aria-label': 'Contacts list', + style: { + flex: 1, + overflowY: 'auto', + padding: '10px', + margin: 0, + listStyle: 'none' + } + }, + ...this.renderContactItems() + ) + ); + } +} + +// ---- ../js/apps/contacts/components/ContactItem.js ---- +/** @format */ + +/** + * @class ContactItem + * @extends Component + * @description A component that renders a single contact item in the contacts list. + * Displays the contact's avatar, name, and phone number, and handles click interactions. + */ +class ContactItem extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} props.contact - The contact data to display + * @param {string} props.contact.name - Contact's full name + * @param {string} props.contact.phone - Contact's phone number + * @param {string} props.contact.avatar - Contact's avatar text (usually initials) + * @param {Function} [props.onClick] - Callback function when contact is clicked + */ + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + } + + /** + * Handle click events on the contact item + * @param {Event} e - Click event object + * @private + */ + handleClick(e) { + const { onClick, contact } = this.props; + + if (onClick) { + onClick(contact); + } else { + console.warn('ContactItem: No onClick handler provided'); + } + } + + /** + * Render the contact item + * @returns {HTMLElement} The rendered contact item element + */ + render() { + const { contact } = this.props; + const displayName = contact.fullName || contact.name; + const subtitleParts = [contact.phone]; + if (contact.system) subtitleParts.push('system contact'); + + return this.createElement( + 'li', + { + className: `contact-item${contact.system ? ' system-contact' : ''}`, + onClick: this.handleClick, + role: 'button', + 'aria-label': `Contact ${displayName}`, + }, + // Avatar section + this.createElement( + 'div', + { + className: 'contact-avatar', + 'aria-hidden': 'true', + }, + contact.avatar + ), + // Contact information section + this.createElement( + 'div', + { className: 'contact-info' }, + this.createElement('h3', {}, displayName), + this.createElement('p', { 'aria-label': 'Phone number' }, subtitleParts.filter(Boolean).join(' - ')) + ) + ); + } +} + + +// ---- ../js/apps/contacts/components/AddContactForm.js ---- +/** @format */ + +/** + * @class AddContactForm + * @extends Component + * @description A form component for adding new contacts to the phone app. + * Manages its own state for form inputs and handles contact creation. + */ +class AddContactForm extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Function} [props.onAdd] - Callback function called when a new contact is added + */ + constructor(props) { + super(props); + + // Initialize form state + this.state = { + name: '', + phone: '', + }; + + // Create refs for input elements + this.nameInputRef = null; + this.phoneInputRef = null; + + // Bind methods + this.handleAddContact = this.handleAddContact.bind(this); + this.handleNameChange = this.handleNameChange.bind(this); + this.handlePhoneChange = this.handlePhoneChange.bind(this); + this.setNameInputRef = this.setNameInputRef.bind(this); + this.setPhoneInputRef = this.setPhoneInputRef.bind(this); + } + + /** + * Store reference to the name input element + * @param {HTMLInputElement} element - The input DOM element + */ + setNameInputRef(element) { + if (element) { + this.nameInputRef = element; + } + } + + /** + * Store reference to the phone input element + * @param {HTMLInputElement} element - The input DOM element + */ + setPhoneInputRef(element) { + if (element) { + this.phoneInputRef = element; + } + } + + /** + * Handle changes to the name input + * @param {Event} e - Input change event + */ + handleNameChange(e) { + // Update state directly to avoid re-render + this.state.name = e.target.value; + } + + /** + * Handle changes to the phone input + * @param {Event} e - Input change event + */ + handlePhoneChange(e) { + // Update state directly to avoid re-render + this.state.phone = e.target.value; + } + + /** + * Handle add contact button click + */ + handleAddContact() { + const { name, phone } = this.state; + + if (name.trim() && phone.trim()) { + const currentState = globalState.getState(); + const trimmedName = name.trim(); + const trimmedPhone = phone.trim(); + + // Check if contact already exists (by name or phone) + const contactExists = currentState.contacts.some(contact => + contact.name.toLowerCase() === trimmedName.toLowerCase() || + contact.phone === trimmedPhone + ); + + if (contactExists) { + console.warn('Contact already exists with this name or phone number'); + // You could show a user-friendly message here + return; + } + + // Server owns the actual contact entry; name is only used for local duplicate checks. + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: "phone::add::contact::by::phone", + data: { + name: trimmedName, + phone: trimmedPhone + } + })); + } + + // Reset form state and input values + this.state.name = ''; + this.state.phone = ''; + + if (this.nameInputRef) { + this.nameInputRef.value = ''; + } + if (this.phoneInputRef) { + this.phoneInputRef.value = ''; + } + + // Focus back on name input for quick consecutive entries + if (this.nameInputRef) { + this.nameInputRef.focus(); + } + + // Notify parent component if callback provided + if (this.props.onAdd) { + this.props.onAdd({ name: trimmedName, phone: trimmedPhone }); + } + } + } + + /** + * Render the form + * @returns {HTMLElement} The rendered form element + */ + render() { + return this.createElement( + 'div', + { + className: 'add-contact-form', + }, + this.createElement( + 'h3', + { + style: { marginBottom: '15px' }, + }, + 'Add New Contact' + ), + this.createElement('input', { + type: 'text', + placeholder: 'Name', + ref: this.setNameInputRef, + onInput: this.handleNameChange + }), + this.createElement('input', { + type: 'tel', + placeholder: 'Phone Number', + ref: this.setPhoneInputRef, + onInput: this.handlePhoneChange + }), + this.createElement( + 'button', + { + type: 'button', + onClick: this.handleAddContact + }, + 'Add Contact' + ) + ); + } +} + + +// ---- ../js/apps/contacts/index.js ---- +/** + * @fileoverview Main entry point for the Contacts application + * + * This module initializes the Contacts app UI, including: + * - Rendering the navigation bar with a toggle button for the add contact form + * - Displaying the contact list + * - Handling the add contact form visibility and submission + * + * The add contact button toggles the form and switches between '+' and '-' icons. + * The contact list is always shown; the form appears above it when toggled. + */ + +// Initialize the contacts app +function initializeContactsApp(container) { + // Get current contacts and form visibility from global state + const { contacts, showAddContactForm } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Contacts'); + + /** + * Navigation bar with toggle button + * - Button toggles add contact form visibility + * - Icon switches between '+' (show form) and '-' (hide form) + */ + const navBar = new NavigationBar({ + title: 'Contacts', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-button', + onClick: () => globalState.setState({ showAddContactForm: !showAddContactForm }), + 'aria-label': showAddContactForm ? 'Close Form' : 'Add Contact', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: showAddContactForm ? '-' : '+' + } + }); + navBar.mount(appContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + /** + * Add contact form + * - Only shown if showAddContactForm is true + * - On submit, adds contact and hides form + */ + if (showAddContactForm) { + const addContactForm = new AddContactForm({ + onAdd: (newContact) => { + // Hide form after adding contact + globalState.setState({ + showAddContactForm: false + }); + console.log('New contact added:', newContact); + } + }); + addContactForm.mount(contentContainer); + } + + /** + * Contact list + * - Always shown + * - Clicking a contact opens a modal to call + */ + const contactList = new ContactList({ + contacts, + onContactClick: (contact) => { + globalState.setState({ + selectedContact: contact, + showModal: true + }); + } + }); + contactList.mount(contentContainer); + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeContactsApp = initializeContactsApp; + + +// ---- ../js/apps/settings/components/Settings.js ---- +/** + * @format + * @class Settings + * @extends Component + * @description A settings component for the phone app. + */ + +class Settings extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor() { + super(); + // Get current theme from document attribute + const currentTheme = document.documentElement.getAttribute('data-theme'); + this.state = { isDarkTheme: currentTheme === 'dark' }; + } + + /** + * @method componentDidMount + * @description Sets the initial theme when the component mounts + */ + componentDidMount() { + // Get current theme from game + const alert = { + "event": "phone::get::theme", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + /** + * @method updateTheme + * @param {boolean} isDark - Whether the theme is dark + * @description Updates the theme and phone screen background + */ + updateTheme(isDark) { + const theme = isDark ? 'dark' : 'light'; + + // Update document theme + document.documentElement.setAttribute('data-theme', theme); + + // Update phone screen background + const phoneScreen = document.querySelector('.phone-screen'); + if (phoneScreen) { + phoneScreen.style.background = isDark ? '#000000' : '#ffffff'; + } + + // Save theme preference to game + const alert = { + "event": "phone::set::theme", + "data": { + "isDark": isDark + } + }; + A3API.SendAlert(JSON.stringify(alert)); + + // Update state + this.setState({ isDarkTheme: isDark }); + + // Dispatch theme change event + const themeEvent = new CustomEvent('themeChanged', { + detail: { theme } + }); + document.dispatchEvent(themeEvent); + } + + /** + * @method handleThemeToggle + * @description Handles the theme toggle click + */ + handleThemeToggle = () => { + const newTheme = !this.state.isDarkTheme; + this.updateTheme(newTheme); + } + + /** + * @method render + * @description Renders the settings component + */ + render() { + return this.createElement('div', { className: 'settings-list' }, + this.createElement('div', { className: 'theme-toggle' }, + this.createElement('span', {}, 'Dark Mode'), + this.createElement('div', { + className: this.state.isDarkTheme ? 'custom-toggle active' : 'custom-toggle', + onClick: this.handleThemeToggle, + style: { + width: '50px', + height: '25px', + backgroundColor: this.state.isDarkTheme ? '#0a84ff' : '#e9ecef', + borderRadius: '34px', + position: 'relative', + cursor: 'pointer', + transition: 'background-color 0.2s' + } + }, + this.createElement('div', { + style: { + width: '25px', + height: '25px', + backgroundColor: '#fff', + borderRadius: '50%', + position: 'absolute', + left: this.state.isDarkTheme ? '25px' : '0px', + transition: 'left 0.2s' + } + }) + ) + ) + ); + } +} + +// ---- ../js/apps/settings/index.js ---- +/** + * @fileoverview Main entry point for the Settings application + * + * This module initializes the Settings app UI, including: + * - Rendering the Settings component + * - Mounting the Settings component into the provided container + * + * The initializeSettingsApp function is exposed globally for use by the main app. + */ + +// Initialize the settings app +function initializeSettingsApp(container) { + /** + * Navigation bar with toggle button + * - Button toggles add contact form visibility + * - Icon switches between '+' (show form) and '-' (hide form) + */ + const navBar = new NavigationBar({ + title: 'Settings' + }); + navBar.mount(container); + + // Create and mount the Settings component + const settings = new Settings(); + settings.mount(container); +} + +// Make initialization function globally available +window.initializeSettingsApp = initializeSettingsApp; + +// ---- ../js/apps/notes/components/NotesList.js ---- +/** + * @format + * @class NotesList + * @extends Component + * @description A component that displays a list of notes with preview content. + */ + +class NotesList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} props.notes - Array of note objects + * @param {Function} props.onNoteClick - Callback when a note is clicked + */ + constructor(props = {}) { + super(props); + this.state = { + notes: props.notes || [] + }; + + // Bind methods + this.handleNoteClick = this.handleNoteClick.bind(this); + this.formatDate = this.formatDate.bind(this); + this.truncateText = this.truncateText.bind(this); + } + + /** + * Handle note click + * @param {Object} note - The clicked note + */ + handleNoteClick(note) { + if (this.props.onNoteClick) { + this.props.onNoteClick(note); + } + } + + /** + * Format date for display + * @param {Date|string} date - Date to format + * @returns {string} Formatted date string + */ + formatDate(date) { + if (!date) return ''; + + const noteDate = new Date(date); + const now = new Date(); + const diffTime = Math.abs(now - noteDate); + const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); + + if (diffDays === 0) { + return noteDate.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit' + }); + } else if (diffDays === 1) { + return 'Yesterday'; + } else if (diffDays < 7) { + return noteDate.toLocaleDateString('en-US', { weekday: 'long' }); + } else { + return noteDate.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric' + }); + } + } + + /** + * Truncate text for preview + * @param {string} text - Text to truncate + * @param {number} maxLength - Maximum length + * @returns {string} Truncated text + */ + truncateText(text, maxLength = 100) { + if (!text) return ''; + if (text.length <= maxLength) return text; + return text.substring(0, maxLength).trim() + '...'; + } + + /** + * Render a single note item + * @param {Object} note - Note object + * @returns {HTMLElement} Note item element + */ + renderNoteItem(note) { + return this.createElement( + 'div', + { + className: 'note-item', + onClick: () => this.handleNoteClick(note), + role: 'button', + tabIndex: 0, + 'aria-label': `Open note: ${note.title || 'Untitled'}`, + onKeyDown: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + this.handleNoteClick(note); + } + } + }, + this.createElement( + 'div', + { className: 'note-header' }, + this.createElement( + 'h3', + { className: 'note-title' }, + note.title || 'Untitled' + ), + this.createElement( + 'span', + { className: 'note-date' }, + this.formatDate(note.updatedAt || note.createdAt) + ) + ), + this.createElement( + 'p', + { className: 'note-preview' }, + this.truncateText(note.content) + ) + ); + } + + /** + * Render empty state + * @returns {HTMLElement} Empty state element + */ + renderEmptyState() { + return this.createElement( + 'div', + { className: 'notes-empty-state' }, + this.createElement( + 'div', + { className: 'empty-icon' }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Notes', + style: 'width:64px;height:64px;opacity:0.5;display:block;' + }) + ), + this.createElement( + 'h3', + {}, + 'No Notes Yet' + ), + this.createElement( + 'p', + {}, + 'Tap the + button to create your first note' + ) + ); + } + + /** + * Render the notes list + * @returns {HTMLElement} The rendered notes list + */ + render() { + const { notes } = this.props; + + if (!notes || notes.length === 0) { + return this.createElement( + 'div', + { className: 'notes-list empty' }, + this.renderEmptyState() + ); + } + + return this.createElement( + 'div', + { + className: 'notes-list', + role: 'list', + 'aria-label': `${notes.length} notes` + }, + ...notes.map((note, index) => { + const noteElement = this.renderNoteItem(note); + noteElement.setAttribute('role', 'listitem'); + noteElement.setAttribute('key', note.id || index); + return noteElement; + }) + ); + } +} + + + +// ---- ../js/apps/notes/components/NoteEditor.js ---- +/** + * @format + * @class NoteEditor + * @extends Component + * @description A component for creating and editing notes. + */ + +class NoteEditor extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.note] - Existing note to edit + * @param {Function} props.onSave - Callback when note is saved + * @param {Function} props.onCancel - Callback when editing is cancelled + * @param {Function} [props.onDelete] - Callback when note is deleted + */ + constructor(props = {}) { + super(props); + + const existingNote = props.note || {}; + this.state = { + title: existingNote.title || '', + content: existingNote.content || '', + id: existingNote.id || null, + createdAt: existingNote.createdAt || new Date().toISOString(), + updatedAt: existingNote.updatedAt || new Date().toISOString(), + isModified: false + }; + + // References for DOM elements + this.titleInputRef = null; + this.contentTextareaRef = null; + + // Bind methods + this.handleTitleChange = this.handleTitleChange.bind(this); + this.handleContentChange = this.handleContentChange.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.setTitleInputRef = this.setTitleInputRef.bind(this); + this.setContentTextareaRef = this.setContentTextareaRef.bind(this); + this.autoSave = this.autoSave.bind(this); + + // Auto-save timer + this.autoSaveTimer = null; + } + + /** + * Component mounted - focus on title if new note + */ + componentDidMount() { + if (!this.state.id && this.titleInputRef) { + this.titleInputRef.focus(); + } else if (this.contentTextareaRef) { + this.contentTextareaRef.focus(); + // Move cursor to end + const length = this.contentTextareaRef.value.length; + this.contentTextareaRef.setSelectionRange(length, length); + } + } + + /** + * Component will unmount - clear auto-save timer + */ + componentWillUnmount() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + } + + /** + * Set title input reference and manage focus + */ + setTitleInputRef(element) { + if (element) { + this.titleInputRef = element; + + // Ensure input displays the correct content + if (this.state.title && element.value !== this.state.title) { + element.value = this.state.title; + } + + // Maintain focus if this element was previously focused + if (document.activeElement !== element && !this.state.id) { + element.focus(); + } + } + } + + /** + * Set content textarea reference and manage focus + */ + setContentTextareaRef(element) { + if (element) { + this.contentTextareaRef = element; + + // Ensure textarea displays the correct content + if (this.state.content && element.value !== this.state.content) { + element.value = this.state.content; + element.textContent = this.state.content; + } + + // Maintain focus if this element was previously focused + if (document.activeElement !== element && this.state.id) { + element.focus(); + // Move cursor to end + const length = element.value.length; + element.setSelectionRange(length, length); + } + } + } + + /** + * Handle title input change + */ + handleTitleChange(e) { + // Update state directly to avoid re-render during typing + this.state.title = e.target.value; + this.state.isModified = true; + this.scheduleAutoSave(); + } + + /** + * Handle content textarea change + */ + handleContentChange(e) { + // Update state directly to avoid re-render during typing + this.state.content = e.target.value; + this.state.isModified = true; + this.scheduleAutoSave(); + } + + /** + * Schedule auto-save (debounced) + */ + scheduleAutoSave() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + + this.autoSaveTimer = setTimeout(() => { + this.autoSave(); + }, 30000); // Auto-save after 30 seconds of inactivity + } + + /** + * Auto-save the note + */ + autoSave() { + if (this.state.isModified && (this.state.title.trim() || this.state.content.trim())) { + this.handleSave(false); // Save without closing editor + } + } + + /** + * Handle save button click + */ + handleSave(shouldClose = true) { + const { title, content, id, createdAt } = this.state; + + // Don't save empty notes + if (!title.trim() && !content.trim()) { + if (shouldClose) { + this.handleCancel(); + } + return; + } + + const savedNote = { + id: id || generateId(), + title: title.trim() || 'Untitled', + content: content.trim(), + createdAt: createdAt, + updatedAt: new Date().toISOString() + }; + + this.setState({ + isModified: false, + id: savedNote.id, + updatedAt: savedNote.updatedAt + }); + + if (this.props.onSave) { + this.props.onSave(savedNote); + } + + if (shouldClose) { + // Note: The parent component will handle navigation + } + } + + /** + * Handle cancel button click + */ + handleCancel() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + + if (this.props.onCancel) { + this.props.onCancel(); + } + } + + /** + * Handle delete button click + */ + handleDelete() { + if (!this.state.id) { + console.warn('Cannot delete note: no ID present'); + return; + } + + if (!this.props.onDelete) { + console.warn('Cannot delete note: no onDelete callback provided'); + return; + } + + try { + // Show delete confirmation modal using global state + globalState.setState({ + showDeleteModal: true, + noteToDelete: { + id: this.state.id, + title: this.state.title || 'Untitled' + } + }); + } catch (error) { + console.error('Error showing delete confirmation:', error); + } + } + + + /** + * Get the word count for the note + */ + getWordCount() { + const { content } = this.state; + if (!content.trim()) return 0; + return content.trim().split(/\s+/).length; + } + + /** + * Render the editor + */ + render() { + const { title, content, id, isModified } = this.state; + const wordCount = this.getWordCount(); + + return this.createElement( + 'div', + { className: 'note-editor' }, + + // Navigation bar + new NavigationBar({ + title: id ? 'Edit Note' : 'New Note', + leftButton: { + element: 'button', + props: { + className: 'nav-button cancel-button', + onClick: this.handleCancel, + 'aria-label': 'Cancel' + }, + content: 'Cancel' + }, + rightButton: { + element: 'button', + props: { + className: 'nav-button save-button', + onClick: () => this.handleSave(true), + 'aria-label': 'Save note' + }, + content: 'Save' + } + }), + + // Editor content + this.createElement( + 'div', + { className: 'editor-content' }, + + // Title input + this.createElement('input', { + type: 'text', + className: 'note-title-input', + placeholder: 'Note title...', + value: title, + onInput: this.handleTitleChange, + ref: this.setTitleInputRef + }), + + // Content textarea + this.createElement('textarea', { + className: 'note-content-input', + placeholder: 'Start writing...', + value: content, + onInput: this.handleContentChange, + ref: this.setContentTextareaRef + }), + + // Editor footer + this.createElement( + 'div', + { className: 'editor-footer' }, + + // Word count and status + this.createElement( + 'div', + { className: 'editor-status' }, + this.createElement( + 'span', + { className: 'word-count' }, + `${wordCount} word${wordCount !== 1 ? 's' : ''}` + ), + isModified && this.createElement( + 'span', + { className: 'modified-indicator' }, + ' * Modified' + ) + ), + + // Delete button (only for existing notes) + id && this.createElement( + 'button', + { + className: 'delete-button', + onClick: this.handleDelete, + 'aria-label': 'Delete note' + }, + 'Delete' + ) + ) + ) + ); + } +} + +// ---- ../js/apps/notes/index.js ---- +/** + * @fileoverview Main entry point for the Notes application + * + * This module initializes the Notes app UI, including: + * - Rendering the navigation bar with add note and search functionality + * - Displaying the notes list + * - Handling note creation, editing, and deletion + * - Managing note persistence via A3API + * + * The notes app supports: + * - Creating new notes + * - Editing existing notes + * - Deleting notes + * - Searching through notes + * - Auto-saving to Arma 3 profile + */ + +// Initialize the notes app +function initializeNotesApp(container) { + // Get current notes and view state from global state + const { notes = [], currentNote = null, showNoteEditor = false } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Notes'); + + // Check if we're viewing/editing a specific note + if (showNoteEditor || currentNote) { + // Show note editor + const noteEditor = new NoteEditor({ + note: currentNote, + onSave: (savedNote) => { + const currentNotes = globalState.getState().notes || []; + let updatedNotes; + + if (savedNote.id && currentNotes.find(n => n.id === savedNote.id)) { + // Update existing note + updatedNotes = currentNotes.map(n => n.id === savedNote.id ? savedNote : n); + } else { + // Add new note + updatedNotes = [savedNote, ...currentNotes]; + } + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false + }); + + // Save to server + if (typeof saveNote === 'function') { + saveNote(savedNote); + } + }, + onCancel: () => { + globalState.setState({ + currentNote: null, + showNoteEditor: false + }); + }, + onDelete: (noteId) => { + const currentNotes = globalState.getState().notes || []; + const updatedNotes = currentNotes.filter(n => n.id !== noteId); + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false + }); + + // Delete from server + if (typeof deleteNote === 'function') { + deleteNote(noteId); + } + } + }); + noteEditor.mount(appContainer); + } else { + // Show notes list + const navBar = new NavigationBar({ + title: 'Notes', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-button', + onClick: () => { + globalState.setState({ + showNoteEditor: true, + currentNote: null + }); + }, + 'aria-label': 'Add Note', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } + }); + navBar.mount(appContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + // Search bar + const searchBar = new SearchBar({ + placeholder: 'Search notes...', + onSearch: (query) => { + // Filter notes based on search query + const filteredNotes = notes.filter(note => + note.title.toLowerCase().includes(query.toLowerCase()) || + note.content.toLowerCase().includes(query.toLowerCase()) + ); + + // Update the notes list + const existingList = contentContainer.querySelector('.notes-list'); + if (existingList) { + existingList.remove(); + } + + const notesList = new NotesList({ + notes: filteredNotes, + onNoteClick: (note) => { + globalState.setState({ + currentNote: note, + showNoteEditor: true + }); + } + }); + notesList.mount(contentContainer); + } + }); + searchBar.mount(contentContainer); + + // Notes list + const notesList = new NotesList({ + notes, + onNoteClick: (note) => { + globalState.setState({ + currentNote: note, + showNoteEditor: true + }); + } + }); + notesList.mount(contentContainer); + } + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeNotesApp = initializeNotesApp; + +// ---- ../js/apps/clock/components/WorldClock.js ---- +/** + * @format + * @class WorldClock + * @extends Component + * @description A component that displays multiple world clocks for different time zones. + */ + +class WorldClock extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} props.clocks - Array of world clock objects + * @param {boolean} props.format24h - Whether to use 24-hour format + * @param {Function} props.onAddClock - Callback when adding a new clock + * @param {Function} props.onRemoveClock - Callback when removing a clock + */ + constructor(props = {}) { + super(props); + this.state = { + currentTime: new Date(), + showAddForm: false, + selectedTimezone: '' + }; + + // Bind methods + this.updateTime = this.updateTime.bind(this); + this.toggleAddForm = this.toggleAddForm.bind(this); + this.handleAddClock = this.handleAddClock.bind(this); + this.handleRemoveClock = this.handleRemoveClock.bind(this); + this.formatTime = this.formatTime.bind(this); + this.getTimezoneTime = this.getTimezoneTime.bind(this); + + // Timer for real-time updates + this.timeUpdateInterval = null; + + // Popular time zones + this.popularTimezones = [ + 'America/New_York', + 'America/Los_Angeles', + 'America/Chicago', + 'Europe/London', + 'Europe/Paris', + 'Europe/Berlin', + 'Asia/Tokyo', + 'Asia/Shanghai', + 'Asia/Kolkata', + 'Australia/Sydney', + 'Pacific/Auckland', + 'Africa/Cairo', + 'America/Sao_Paulo', + 'Asia/Dubai', + 'Europe/Moscow' + ]; + } + + /** + * Component mounted - start time updates + */ + componentDidMount() { + this.timeUpdateInterval = setInterval(this.updateTime, 1000); + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.timeUpdateInterval) { + clearInterval(this.timeUpdateInterval); + } + } + + /** + * Update current time + */ + updateTime() { + // Update state directly to avoid re-render during time updates + this.state.currentTime = new Date(); + const currentTime = this.state.currentTime; + + // Update local time display + const localTimeElement = document.querySelector('.local-time'); + if (localTimeElement) { + const timeOptions = { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + localTimeElement.textContent = currentTime.toLocaleTimeString('en-US', timeOptions); + } + + // Update all world clock time displays + const worldClockItems = document.querySelectorAll('.world-clock-item'); + worldClockItems.forEach((clockItem, index) => { + const clockTimeElement = clockItem.querySelector('.clock-time'); + const clockDateElement = clockItem.querySelector('.clock-date'); + + if (clockTimeElement && this.props.clocks && this.props.clocks[index]) { + const timezone = this.props.clocks[index].timezone; + + // Update time + try { + const timeOptions = { + timeZone: timezone, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + clockTimeElement.textContent = currentTime.toLocaleTimeString('en-US', timeOptions); + } catch (error) { + clockTimeElement.textContent = '--:--:--'; + } + + // Update date + if (clockDateElement) { + try { + const dateOptions = { + timeZone: timezone, + weekday: 'short', + month: 'short', + day: 'numeric' + }; + clockDateElement.textContent = currentTime.toLocaleDateString('en-US', dateOptions); + } catch (error) { + clockDateElement.textContent = 'Invalid date'; + } + } + } + }); + } + + /** + * Toggle add clock form + */ + toggleAddForm() { + // Use setState for form visibility changes as they need re-render + this.setState({ + showAddForm: !this.state.showAddForm, + selectedTimezone: '' // Reset selection when toggling + }); + } + + /** + * Handle adding a new clock + */ + handleAddClock() { + const selectedTimezone = this.state.selectedTimezone; + if (selectedTimezone && this.props.onAddClock) { + this.props.onAddClock(selectedTimezone); + // Use setState to hide form and reset state + this.setState({ + showAddForm: false, + selectedTimezone: '' + }); + } + } + + /** + * Handle removing a clock + */ + handleRemoveClock(clockId) { + if (this.props.onRemoveClock) { + this.props.onRemoveClock(clockId); + } + } + + /** + * Get time for a specific timezone + */ + getTimezoneTime(timezone) { + try { + return new Date().toLocaleString('en-US', { + timeZone: timezone, + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }); + } catch (error) { + return 'Invalid timezone'; + } + } + + /** + * Format time for display + */ + formatTime(date, timezone) { + try { + const options = { + timeZone: timezone, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + return date.toLocaleTimeString('en-US', options); + } catch (error) { + return '--:--:--'; + } + } + + /** + * Get date for timezone + */ + getTimezoneDate(timezone) { + try { + return new Date().toLocaleDateString('en-US', { + timeZone: timezone, + weekday: 'short', + month: 'short', + day: 'numeric' + }); + } catch (error) { + return 'Invalid date'; + } + } + + /** + * Render local time section + */ + renderLocalTime() { + const { currentTime } = this.state; + const { format24h } = this.props; + + const timeOptions = { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !format24h + }; + + const dateOptions = { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }; + + return this.createElement( + 'div', + { className: 'local-time-section' }, + this.createElement( + 'h2', + { className: 'local-time-label' }, + 'Local Time' + ), + this.createElement( + 'div', + { className: 'local-time-display' }, + this.createElement( + 'div', + { className: 'local-time' }, + currentTime.toLocaleTimeString('en-US', timeOptions) + ), + this.createElement( + 'div', + { className: 'local-date' }, + currentTime.toLocaleDateString('en-US', dateOptions) + ) + ) + ); + } + + /** + * Render add clock form + */ + renderAddForm() { + if (!this.state.showAddForm) return null; + + return this.createElement( + 'div', + { className: 'add-clock-form' }, + this.createElement( + 'h3', + {}, + 'Add World Clock' + ), + this.createElement( + 'select', + { + className: 'timezone-select', + value: this.state.selectedTimezone, + onChange: (e) => { + // Update state directly to avoid re-render during selection + this.state.selectedTimezone = e.target.value; + + // Update button disabled state directly + const addButton = document.querySelector('.add-button'); + if (addButton) { + addButton.disabled = !e.target.value; + } + } + }, + this.createElement('option', { value: '' }, 'Select a timezone...'), + ...this.popularTimezones.map(tz => + this.createElement( + 'option', + { value: tz, key: tz }, + tz.replace('_', ' ').split('/').join(' - ') + ) + ) + ), + this.createElement( + 'div', + { className: 'form-buttons' }, + this.createElement( + 'button', + { + type: 'button', + onClick: this.toggleAddForm, + className: 'cancel-button' + }, + 'Cancel' + ), + this.createElement( + 'button', + { + type: 'button', + onClick: this.handleAddClock, + className: 'add-button', + disabled: !this.state.selectedTimezone + }, + 'Add Clock' + ) + ) + ); + } + + /** + * Render world clocks list + */ + renderWorldClocks() { + const { clocks } = this.props; + const { currentTime } = this.state; + + if (!clocks || clocks.length === 0) { + return this.createElement( + 'div', + { className: 'empty-state' }, + this.createElement( + 'p', + {}, + 'No world clocks added yet. Tap + to add one.' + ) + ); + } + + return this.createElement( + 'div', + { className: 'world-clocks-list' }, + ...clocks.map(clock => + this.createElement( + 'div', + { + className: 'world-clock-item', + key: clock.id + }, + this.createElement( + 'div', + { className: 'clock-info' }, + this.createElement( + 'div', + { className: 'clock-city' }, + clock.city + ), + this.createElement( + 'div', + { className: 'clock-timezone' }, + clock.timezone.split('/').join(' / ') + ) + ), + this.createElement( + 'div', + { className: 'clock-time-info' }, + this.createElement( + 'div', + { className: 'clock-time' }, + this.formatTime(currentTime, clock.timezone) + ), + this.createElement( + 'div', + { className: 'clock-date' }, + this.getTimezoneDate(clock.timezone) + ) + ), + this.createElement( + 'button', + { + className: 'remove-clock-button', + onClick: () => this.handleRemoveClock(clock.id), + 'aria-label': `Remove ${clock.city} clock` + }, + 'Remove' + ) + ) + ) + ); + } + + /** + * Render the world clock component + */ + render() { + return this.createElement( + 'div', + { className: 'world-clock' }, + + // Local time section + this.renderLocalTime(), + + // Add clock button + !this.state.showAddForm && this.createElement( + 'button', + { + className: 'add-world-clock-button', + onClick: this.toggleAddForm + }, + '+ Add World Clock' + ), + + // Add clock form + this.renderAddForm(), + + // World clocks list + this.renderWorldClocks() + ); + } +} + + + +// ---- ../js/apps/clock/components/Stopwatch.js ---- +/** + * @format + * @class Stopwatch + * @extends Component + * @description A component that provides stopwatch functionality with lap timing. + */ + +class Stopwatch extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} props.format24h - Whether to use 24-hour format + */ + constructor(props = {}) { + super(props); + this.state = { + time: 0, // Time in milliseconds + isRunning: false, + lapTimes: [], + startTime: null + }; + + // Bind methods + this.start = this.start.bind(this); + this.stop = this.stop.bind(this); + this.reset = this.reset.bind(this); + this.lap = this.lap.bind(this); + this.updateTime = this.updateTime.bind(this); + this.formatTime = this.formatTime.bind(this); + + // Timer for updates + this.interval = null; + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + /** + * Start the stopwatch + */ + start() { + if (!this.state.isRunning) { + const startTime = Date.now() - this.state.time; + this.setState({ + isRunning: true, + startTime: startTime + }); + + this.interval = setInterval(this.updateTime, 10); // Update every 10ms for precision + } + } + + /** + * Stop the stopwatch + */ + stop() { + if (this.state.isRunning) { + this.setState({ isRunning: false }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + } + + /** + * Reset the stopwatch + */ + reset() { + this.setState({ + time: 0, + isRunning: false, + lapTimes: [], + startTime: null + }); + + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Record a lap time + */ + lap() { + if (this.state.isRunning) { + const currentTime = this.state.time; + const previousLapTime = this.state.lapTimes.length > 0 + ? this.state.lapTimes[this.state.lapTimes.length - 1].totalTime + : 0; + + const lapTime = { + id: generateId(), + lapNumber: this.state.lapTimes.length + 1, + lapTime: currentTime - previousLapTime, + totalTime: currentTime, + timestamp: new Date().toISOString() + }; + + this.setState({ + lapTimes: [...this.state.lapTimes, lapTime] + }); + } + } + + /** + * Update the current time + */ + updateTime() { + if (this.state.isRunning && this.state.startTime) { + const currentTime = Date.now() - this.state.startTime; + // Update state directly to avoid re-render during stopwatch running + this.state.time = currentTime; + + // Update only the stopwatch time display element + const stopwatchDisplay = document.querySelector('.stopwatch-time'); + if (stopwatchDisplay) { + stopwatchDisplay.textContent = this.formatTime(currentTime); + } + } + } + + /** + * Format time for display (HH:MM:SS.mmm) + */ + formatTime(milliseconds) { + const totalSeconds = Math.floor(milliseconds / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + const ms = Math.floor((milliseconds % 1000) / 10); // Show centiseconds + + return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(2, '0')}`; + } + + /** + * Get the fastest and slowest lap times + */ + getLapStats() { + if (this.state.lapTimes.length === 0) return null; + + const lapTimes = this.state.lapTimes.map(lap => lap.lapTime); + const fastest = Math.min(...lapTimes); + const slowest = Math.max(...lapTimes); + + return { + fastest: this.state.lapTimes.find(lap => lap.lapTime === fastest), + slowest: this.state.lapTimes.find(lap => lap.lapTime === slowest) + }; + } + + /** + * Render the main stopwatch display + */ + renderStopwatchDisplay() { + const { time, isRunning } = this.state; + + return this.createElement( + 'div', + { className: 'stopwatch-display' }, + this.createElement( + 'div', + { + className: `stopwatch-time ${isRunning ? 'running' : 'stopped'}`, + 'aria-live': 'polite', + 'aria-label': 'Stopwatch time' + }, + this.formatTime(time) + ), + this.createElement( + 'div', + { className: 'stopwatch-status' }, + isRunning ? 'Running' : (time > 0 ? 'Stopped' : 'Ready') + ) + ); + } + + /** + * Render control buttons + */ + renderControls() { + const { isRunning, time } = this.state; + + return this.createElement( + 'div', + { className: 'stopwatch-controls' }, + + // Start/Stop button + this.createElement( + 'button', + { + className: `control-button ${isRunning ? 'stop-button' : 'start-button'}`, + onClick: isRunning ? this.stop : this.start, + 'aria-label': isRunning ? 'Stop stopwatch' : 'Start stopwatch' + }, + isRunning ? 'Stop' : 'Start' + ), + + // Lap button (only when running) + isRunning && this.createElement( + 'button', + { + className: 'control-button lap-button', + onClick: this.lap, + 'aria-label': 'Record lap time' + }, + 'Lap' + ), + + // Reset button (only when stopped and time > 0) + !isRunning && time > 0 && this.createElement( + 'button', + { + className: 'control-button reset-button', + onClick: this.reset, + 'aria-label': 'Reset stopwatch' + }, + 'Reset' + ) + ); + } + + /** + * Render lap times list + */ + renderLapTimes() { + const { lapTimes } = this.state; + + if (lapTimes.length === 0) { + return null; + } + + const stats = this.getLapStats(); + + return this.createElement( + 'div', + { className: 'lap-times-section' }, + this.createElement( + 'h3', + { className: 'lap-times-title' }, + 'Lap Times' + ), + + // Lap times list + this.createElement( + 'div', + { className: 'lap-times-list' }, + ...lapTimes.slice().reverse().map(lap => { + const isFastest = stats && lap.id === stats.fastest.id; + const isSlowest = stats && lap.id === stats.slowest.id && lapTimes.length > 1; + + return this.createElement( + 'div', + { + className: `lap-time-item ${ + isFastest ? 'fastest' : isSlowest ? 'slowest' : '' + }`, + key: lap.id + }, + this.createElement( + 'div', + { className: 'lap-number' }, + `Lap ${lap.lapNumber}` + ), + this.createElement( + 'div', + { className: 'lap-time' }, + this.formatTime(lap.lapTime) + ), + this.createElement( + 'div', + { className: 'total-time' }, + this.formatTime(lap.totalTime) + ), + (isFastest || isSlowest) && this.createElement( + 'div', + { className: 'lap-indicator' }, + isFastest ? 'Fastest' : 'Slowest' + ) + ); + }) + ) + ); + } + + /** + * Render the stopwatch component + */ + render() { + return this.createElement( + 'div', + { className: 'stopwatch' }, + + // Main stopwatch display + this.renderStopwatchDisplay(), + + // Control buttons + this.renderControls(), + + // Lap times + this.renderLapTimes() + ); + } +} + + + +// ---- ../js/apps/clock/components/Timer.js ---- +/** + * @format + * @class Timer + * @extends Component + * @description A countdown timer component. + */ + +class Timer extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + this.state = { + minutes: 5, + seconds: 0, + totalTime: 0, + timeLeft: 0, + isRunning: false, + isFinished: false + }; + + // Bind methods + this.start = this.start.bind(this); + this.pause = this.pause.bind(this); + this.reset = this.reset.bind(this); + this.setTime = this.setTime.bind(this); + this.updateTimer = this.updateTimer.bind(this); + this.formatTime = this.formatTime.bind(this); + + // Timer interval + this.interval = null; + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + /** + * Set timer duration + */ + setTime(minutes, seconds) { + const totalSeconds = minutes * 60 + seconds; + this.setState({ + minutes, + seconds, + totalTime: totalSeconds, + timeLeft: totalSeconds, + isFinished: false + }); + } + + /** + * Start the timer + */ + start() { + if (this.state.timeLeft > 0 && !this.state.isRunning) { + this.setState({ isRunning: true }); + this.interval = setInterval(this.updateTimer, 1000); + } + } + + /** + * Pause the timer + */ + pause() { + this.setState({ isRunning: false }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Reset the timer + */ + reset() { + this.setState({ + timeLeft: this.state.totalTime, + isRunning: false, + isFinished: false + }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Update timer countdown + */ + updateTimer() { + if (this.state.timeLeft > 0) { + // Update state directly to avoid re-render during countdown + this.state.timeLeft = this.state.timeLeft - 1; + + // Update only the timer display element + const timerDisplay = document.querySelector('.timer-time'); + if (timerDisplay) { + timerDisplay.textContent = this.formatTime(this.state.timeLeft); + } + } else { + // Timer finished - this needs a full re-render + this.setState({ + isRunning: false, + isFinished: true + }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + } + + /** + * Format time for display + */ + formatTime(totalSeconds) { + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; + } + + /** + * Render timer controls + */ + renderControls() { + const { isRunning, timeLeft, isFinished } = this.state; + + return this.createElement( + 'div', + { className: 'timer-controls' }, + + // Start/Pause button + timeLeft > 0 && !isFinished && this.createElement( + 'button', + { + className: `control-button ${isRunning ? 'pause-button' : 'start-button'}`, + onClick: isRunning ? this.pause : this.start + }, + isRunning ? 'Pause' : 'Start' + ), + + // Reset button + (timeLeft !== this.state.totalTime || isFinished) && this.createElement( + 'button', + { + className: 'control-button reset-button', + onClick: this.reset + }, + 'Reset' + ) + ); + } + + /** + * Render time setters + */ + renderTimeSetters() { + if (this.state.isRunning) return null; + + return this.createElement( + 'div', + { className: 'time-setters' }, + this.createElement( + 'div', + { className: 'time-setter' }, + this.createElement('label', {}, 'Minutes'), + this.createElement('input', { + type: 'number', + min: '0', + max: '59', + value: this.state.minutes, + onChange: (e) => { + // Update state directly to avoid re-render during input + const minutes = parseInt(e.target.value) || 0; + this.state.minutes = minutes; + this.setTime(minutes, this.state.seconds); + } + }) + ), + this.createElement( + 'div', + { className: 'time-setter' }, + this.createElement('label', {}, 'Seconds'), + this.createElement('input', { + type: 'number', + min: '0', + max: '59', + value: this.state.seconds, + onChange: (e) => { + // Update state directly to avoid re-render during input + const seconds = parseInt(e.target.value) || 0; + this.state.seconds = seconds; + this.setTime(this.state.minutes, seconds); + } + }) + ) + ); + } + + /** + * Render the timer component + */ + render() { + const { timeLeft, isFinished } = this.state; + + return this.createElement( + 'div', + { className: 'timer' }, + + // Timer display + this.createElement( + 'div', + { className: 'timer-display' }, + this.createElement( + 'div', + { + className: `timer-time ${isFinished ? 'finished' : ''}`, + 'aria-live': 'polite' + }, + this.formatTime(timeLeft) + ), + this.createElement( + 'div', + { className: 'timer-status' }, + isFinished ? 'Time\'s up!' : 'Timer' + ) + ), + + // Time setters + this.renderTimeSetters(), + + // Controls + this.renderControls() + ); + } +} + + + +// ---- ../js/apps/clock/components/AlarmClock.js ---- +/** + * @format + * @class AlarmClock + * @extends Component + * @description A component for managing alarms. + */ + +class AlarmClock extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + this.state = { + showAddForm: false, + newAlarmTime: '07:00', + newAlarmLabel: '' + }; + + // Bind methods + this.toggleAddForm = this.toggleAddForm.bind(this); + this.handleAddAlarm = this.handleAddAlarm.bind(this); + this.formatTime = this.formatTime.bind(this); + } + + /** + * Toggle add alarm form + */ + toggleAddForm() { + // Use setState for form visibility changes as they need re-render + this.setState({ + showAddForm: !this.state.showAddForm, + newAlarmTime: '07:00', + newAlarmLabel: '' + }); + } + + /** + * Handle adding a new alarm + */ + handleAddAlarm() { + const newAlarmTime = this.state.newAlarmTime; + const newAlarmLabel = this.state.newAlarmLabel; + if (newAlarmTime && this.props.onAddAlarm) { + this.props.onAddAlarm({ + time: newAlarmTime, + label: newAlarmLabel || 'Alarm', + enabled: true, + days: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] // Default to weekdays + }); + // Use setState to hide form and reset state + this.setState({ + showAddForm: false, + newAlarmTime: '07:00', + newAlarmLabel: '' + }); + } + } + + /** + * Format time for display + */ + formatTime(timeString) { + const [hours, minutes] = timeString.split(':'); + if (this.props.format24h) { + return `${hours}:${minutes}`; + } else { + const hour = parseInt(hours); + const ampm = hour >= 12 ? 'PM' : 'AM'; + const displayHour = hour % 12 || 12; + return `${displayHour}:${minutes} ${ampm}`; + } + } + + /** + * Render add alarm form + */ + renderAddForm() { + if (!this.state.showAddForm) return null; + + return this.createElement( + 'div', + { className: 'add-alarm-form' }, + this.createElement('h3', {}, 'Add Alarm'), + + this.createElement('input', { + type: 'time', + value: this.state.newAlarmTime, + onChange: (e) => { + // Update state directly to avoid re-render during input + this.state.newAlarmTime = e.target.value; + } + }), + + this.createElement('input', { + type: 'text', + placeholder: 'Alarm label (optional)', + value: this.state.newAlarmLabel, + onChange: (e) => { + // Update state directly to avoid re-render during input + this.state.newAlarmLabel = e.target.value; + } + }), + + this.createElement( + 'div', + { className: 'form-buttons' }, + this.createElement( + 'button', + { onClick: this.toggleAddForm }, + 'Cancel' + ), + this.createElement( + 'button', + { onClick: this.handleAddAlarm }, + 'Add Alarm' + ) + ) + ); + } + + /** + * Render alarms list + */ + renderAlarms() { + const { alarms } = this.props; + + if (!alarms || alarms.length === 0) { + return this.createElement( + 'div', + { className: 'empty-state' }, + this.createElement('p', {}, 'No alarms set. Tap + to add one.') + ); + } + + return this.createElement( + 'div', + { className: 'alarms-list' }, + ...alarms.map(alarm => + this.createElement( + 'div', + { + className: `alarm-item ${alarm.enabled ? 'enabled' : 'disabled'}`, + key: alarm.id + }, + this.createElement( + 'div', + { className: 'alarm-info' }, + this.createElement( + 'div', + { className: 'alarm-time' }, + this.formatTime(alarm.time) + ), + this.createElement( + 'div', + { className: 'alarm-label' }, + alarm.label + ), + alarm.days && this.createElement( + 'div', + { className: 'alarm-days' }, + alarm.days.join(', ') + ) + ), + this.createElement( + 'div', + { className: 'alarm-controls' }, + this.createElement( + 'button', + { + className: 'toggle-alarm', + onClick: () => this.props.onToggleAlarm(alarm.id) + }, + alarm.enabled ? 'On' : 'Off' + ), + this.createElement( + 'button', + { + className: 'remove-alarm', + onClick: () => this.props.onRemoveAlarm(alarm.id), + 'aria-label': 'Delete alarm' + }, + 'Delete' + ) + ) + ) + ) + ); + } + + /** + * Render the alarm clock component + */ + render() { + return this.createElement( + 'div', + { className: 'alarm-clock' }, + + // Add alarm button + !this.state.showAddForm && this.createElement( + 'button', + { + className: 'add-alarm-button', + onClick: this.toggleAddForm + }, + '+ Add Alarm' + ), + + // Add alarm form + this.renderAddForm(), + + // Alarms list + this.renderAlarms() + ); + } +} + + + +// ---- ../js/apps/clock/index.js ---- +/** + * @fileoverview Main entry point for the Clock application + * + * This module initializes the Clock app UI, including: + * - Multiple clock modes (World Clock, Stopwatch, Timer, Alarm) + * - Tab-based navigation between different clock features + * - Real-time updates and time synchronization + * - Persistent settings and preferences + * + * The clock app supports: + * - World clocks for different time zones + * - Stopwatch with lap times + * - Countdown timers + * - Alarm management + * - 12/24 hour format switching + */ + +// Initialize the clock app +function initializeClockApp(container) { + // Get current clock state from global state + const { + clockMode = 'world', + worldClocks = [], + timers = [], + alarms = [], + clockSettings = { format24h: true } + } = globalState.getState(); + + const appContainer = document.createElement('div'); + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Clock'); + + // Navigation bar with mode switching + const navBar = new NavigationBar({ + title: 'Clock', + leftButton: { + element: 'button', + props: { + className: 'nav-button settings-button', + onClick: () => { + // Toggle 12/24 hour format + const newFormat = !clockSettings.format24h; + globalState.setState({ + clockSettings: { ...clockSettings, format24h: newFormat } + }); + }, + 'aria-label': 'Toggle time format' + }, + content: clockSettings.format24h ? '24h' : '12h' + } + }); + navBar.mount(appContainer); + + // Tab navigation + const tabContainer = document.createElement('div'); + tabContainer.className = 'clock-tabs'; + + const tabs = [ + { id: 'world', label: 'World Clock' }, + { id: 'stopwatch', label: 'Stopwatch' }, + { id: 'timer', label: 'Timer' }, + { id: 'alarm', label: 'Alarm' } + ]; + + tabs.forEach(tab => { + const tabButton = document.createElement('button'); + tabButton.className = `clock-tab ${clockMode === tab.id ? 'active' : ''}`; + tabButton.textContent = tab.label; + tabButton.setAttribute('aria-label', tab.label); + tabButton.onclick = () => { + globalState.setState({ clockMode: tab.id }); + }; + tabContainer.appendChild(tabButton); + }); + + appContainer.appendChild(tabContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'clock-content'; + appContainer.appendChild(contentContainer); + + // Render appropriate clock mode + switch (clockMode) { + case 'world': + const worldClock = new WorldClock({ + clocks: worldClocks, + format24h: clockSettings.format24h, + onAddClock: (timezone) => { + const newClock = { + id: generateId(), + timezone: timezone, + city: timezone.split('/').pop().replace('_', ' '), + addedAt: new Date().toISOString() + }; + + // Save to server + if (typeof saveWorldClock === 'function') { + saveWorldClock(newClock); + } + + globalState.setState({ + worldClocks: [...worldClocks, newClock] + }); + }, + onRemoveClock: (clockId) => { + // Delete from server + if (typeof deleteWorldClock === 'function') { + deleteWorldClock(clockId); + } + + globalState.setState({ + worldClocks: worldClocks.filter(c => c.id !== clockId) + }); + } + }); + worldClock.mount(contentContainer); + break; + + case 'stopwatch': + const stopwatch = new Stopwatch({ + format24h: clockSettings.format24h + }); + stopwatch.mount(contentContainer); + break; + + case 'timer': + const timer = new Timer({ + timers: timers, + onAddTimer: (timerData) => { + const newTimer = { + id: generateId(), + ...timerData, + createdAt: new Date().toISOString() + }; + globalState.setState({ + timers: [...timers, newTimer] + }); + }, + onRemoveTimer: (timerId) => { + globalState.setState({ + timers: timers.filter(t => t.id !== timerId) + }); + } + }); + timer.mount(contentContainer); + break; + + case 'alarm': + const alarm = new AlarmClock({ + alarms: alarms, + format24h: clockSettings.format24h, + onAddAlarm: (alarmData) => { + const newAlarm = { + id: generateId(), + ...alarmData, + createdAt: new Date().toISOString() + }; + + // Save to server + if (typeof saveAlarm === 'function') { + saveAlarm(newAlarm); + } + + globalState.setState({ + alarms: [...alarms, newAlarm] + }); + }, + onRemoveAlarm: (alarmId) => { + // Delete from server + if (typeof deleteAlarm === 'function') { + deleteAlarm(alarmId); + } + + globalState.setState({ + alarms: alarms.filter(a => a.id !== alarmId) + }); + }, + onToggleAlarm: (alarmId) => { + // Toggle on server + if (typeof toggleAlarm === 'function') { + toggleAlarm(alarmId); + } + + globalState.setState({ + alarms: alarms.map(a => + a.id === alarmId ? { ...a, enabled: !a.enabled } : a + ) + }); + } + }); + alarm.mount(contentContainer); + break; + } + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeClockApp = initializeClockApp; + +// ---- ../js/apps/calendar/components/Calendar.js ---- +/** + * @format + * @fileoverview Calendar component for displaying and managing calendar events + */ + +class Calendar extends Component { + constructor(props = {}) { + super(props); + + let selectedDate = props.selectedDate; + if (!(selectedDate instanceof Date) || isNaN(selectedDate.getTime())) { + selectedDate = new Date(); + } + + this.state = { + currentDate: props.selectedDate || new Date(), + selectedDate: props.selectedDate || new Date(), + events: props.events || [], + }; + + this.onEventClick = props.onEventClick; + this.onDayClick = props.onDayClick; + + this.handleDayClick = this.handleDayClick.bind(this); + this.handleEventClick = this.handleEventClick.bind(this); + } + + /** + * Called when the component is first mounted to the DOM. + * Ensures the initial view is rendered. + */ + componentDidMount() { + this.render(); // Initial render after component is mounted + } + + /** + * Called when the component's state or props change. + * Updates the component if necessary. + */ + componentDidUpdate(prevProps, prevState) { + // Re-render if selectedDate or events have changed significantly + if ( + prevState.selectedDate.toDateString() !== this.state.selectedDate.toDateString() || + JSON.stringify(prevState.events) !== JSON.stringify(this.state.events) || + prevState.currentDate.toDateString() !== this.state.currentDate.toDateString() + ) { + this.render(); + } + } + + render() { + const { currentDate } = this.state; + const year = currentDate.getFullYear(); + const month = currentDate.getMonth(); + + return this.createElement( + 'div', + { className: 'calendar-container' }, + + this.createElement('div', { className: 'calendar-header' }, this.createElement('div', { className: 'calendar-title' }, `${this.getMonthName(month)} ${year}`)), + + this.createElement('div', { className: 'calendar-grid' }, this.renderWeekdays(), this.renderDays(year, month)), + + this.createElement('div', { className: 'calendar-events' }, this.renderEvents()) + ); + } + + renderWeekdays() { + const weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + return weekdays.map((day) => this.createElement('div', { className: 'calendar-weekday' }, day)); + } + + renderDays(year, month) { + const firstDay = new Date(year, month, 1); + const lastDay = new Date(year, month + 1, 0); + const startingDay = firstDay.getDay(); + const totalDays = lastDay.getDate(); + + let days = []; + + // Previous month's days (empty placeholders or actual days if needed, currently empty for visual alignment) + for (let i = 0; i < startingDay; i++) { + days.push(this.createElement('div', { className: 'calendar-day other-month' })); + } + + // Current month's days + for (let day = 1; day <= totalDays; day++) { + const date = new Date(year, month, day); + const isToday = this.isToday(date); + const isSelected = this.isSelected(date); + const hasEvents = this.hasEvents(date); + + let classes = ['calendar-day']; + if (isToday) classes.push('today'); + if (isSelected) classes.push('selected'); + if (hasEvents) classes.push('has-events'); + + days.push( + this.createElement( + 'div', + { + className: classes.join(' '), + 'data-date': date.toISOString(), + onClick: () => this.handleDayClick(date), + }, + day + ) + ); + } + + // Next month's days (empty placeholders for visual alignment) + const remainingCells = 42 - days.length; // 42 = 6 rows * 7 days + for (let i = 0; i < remainingCells; i++) { + days.push(this.createElement('div', { className: 'calendar-day other-month' })); + } + + return days; + } + + renderEvents() { + const events = this.getEventsForDate(this.state.selectedDate); + if (!events || events.length === 0) { + return this.createElement('div', { className: 'no-events' }, 'No events for this day'); + } + + return events.map((event) => + this.createElement( + 'div', + { + className: 'event-item', + 'data-event-id': event.id, + onClick: () => this.handleEventClick(event), + }, + this.createElement('div', { className: 'event-dot' }), + this.createElement('div', { className: 'event-time' }, this.formatTime(event.startTime)), + this.createElement('div', { className: 'event-title' }, event.title) + ) + ); + } + + handleDayClick(date) { + this.setState({ selectedDate: date }); + + if (this.onDayClick) { + this.onDayClick(date); + } + } + + handleEventClick(event) { + if (this.onEventClick) { + this.onEventClick(event); + } + } + + getEventsForDate(date) { + const dateKey = this.getDateKey(date); + return this.state.events.filter((event) => { + const eventStartDate = new Date(event.startTime); + return this.getDateKey(eventStartDate) === dateKey; + }); + } + + hasEvents(date) { + return this.getEventsForDate(date).length > 0; + } + + getDateKey(date) { + return date.toISOString().split('T')[0]; + } + + isToday(date) { + const today = new Date(); + return date.toDateString() === today.toDateString(); + } + + isSelected(date) { + return date.toDateString() === this.state.selectedDate.toDateString(); + } + + getMonthName(month) { + return new Date(2000, month, 1).toLocaleString('default', { month: 'long' }); + } + + formatTime(time) { + return new Date(time).toLocaleTimeString('default', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }); + } +} + + +// ---- ../js/apps/calendar/components/EventEditor.js ---- +/** + * @format + * @class EventEditor + * @extends Component + * @description A component for creating and editing calendar events. + */ + +class EventEditor extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.event] - Existing event to edit + * @param {Function} props.onSave - Callback when event is saved + * @param {Function} props.onCancel - Callback when editing is cancelled + * @param {Function} [props.onDelete] - Callback when event is deleted + */ + constructor(props = {}) { + super(props); + + const existingEvent = props.event || { + title: '', + startTime: new Date(), + endTime: new Date(new Date().getTime() + 60 * 60 * 1000), + description: '', + }; + + this.state = { + title: existingEvent.title || '', + startTime: this.formatDateTimeForInput(existingEvent.startTime), + endTime: this.formatDateTimeForInput(existingEvent.endTime), + description: existingEvent.description || '', + id: existingEvent.id || null, + isModified: false, + }; + + // References for DOM elements + this.titleInputRef = null; + this.startTimeInputRef = null; + this.endTimeInputRef = null; + this.descriptionInputRef = null; + + // Bind methods + this.handleTitleChange = this.handleTitleChange.bind(this); + this.handleStartTimeChange = this.handleStartTimeChange.bind(this); + this.handleEndTimeChange = this.handleEndTimeChange.bind(this); + this.handleDescriptionChange = this.handleDescriptionChange.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.setTitleInputRef = this.setTitleInputRef.bind(this); + this.setStartTimeInputRef = this.setStartTimeInputRef.bind(this); + this.setEndTimeInputRef = this.setEndTimeInputRef.bind(this); + this.setDescriptionInputRef = this.setDescriptionInputRef.bind(this); + } + + /** + * Component mounted - focus on title if new event + */ + componentDidMount() { + if (!this.state.id && this.titleInputRef) { + this.titleInputRef.focus(); + } + } + + // Ref setter methods + setTitleInputRef(element) { + if (element) { + this.titleInputRef = element; + if (this.state.title && element.value !== this.state.title) { + element.value = this.state.title; + } + } + } + + setStartTimeInputRef(element) { + if (element) { + this.startTimeInputRef = element; + if (this.state.startTime && element.value !== this.state.startTime) { + element.value = this.state.startTime; + } + } + } + + setEndTimeInputRef(element) { + if (element) { + this.endTimeInputRef = element; + if (this.state.endTime && element.value !== this.state.endTime) { + element.value = this.state.endTime; + } + } + } + + setDescriptionInputRef(element) { + if (element) { + this.descriptionInputRef = element; + if (this.state.description && element.value !== this.state.description) { + element.value = this.state.description; + } + } + } + + // Input change handlers + handleTitleChange(e) { + this.state.title = e.target.value; + this.state.isModified = true; + } + + handleStartTimeChange(e) { + this.state.startTime = e.target.value; + this.state.isModified = true; + } + + handleEndTimeChange(e) { + this.state.endTime = e.target.value; + this.state.isModified = true; + } + + handleDescriptionChange(e) { + this.state.description = e.target.value; + this.state.isModified = true; + } + + handleSave() { + const { title, startTime, endTime, description, id } = this.state; + + // if (!title.trim() || !startTime || !endTime) { + // alert('Please fill in all required fields.'); + // return; + // } + + const savedEvent = { + id: id || generateId(), + title: title.trim(), + startTime: new Date(startTime), + endTime: new Date(endTime), + description: description.trim(), + }; + + this.setState({ + isModified: false, + id: savedEvent.id, + }); + + if (this.props.onSave) { + this.props.onSave(savedEvent); + } + } + + handleCancel() { + if (this.props.onCancel) { + this.props.onCancel(); + } + } + + handleDelete() { + if (!this.state.id) { + console.warn('Cannot delete event: no ID present'); + return; + } + + if (!this.props.onDelete) { + console.warn('Cannot delete event: no onDelete callback provided'); + return; + } + + try { + // Show delete confirmation modal using global state + globalState.setState({ + showDeleteModal: true, + eventToDelete: { + id: this.state.id, + title: this.state.title || 'Untitled', + }, + }); + } catch (error) { + console.error('Error showing delete confirmation:', error); + } + } + + formatDateTimeForInput(date) { + // Make sure date is a valid Date object + if (!(date instanceof Date) || isNaN(date.getTime())) { + // If it's a string that looks like a date, try to parse it + if (typeof date === 'string') { + date = new Date(date); + } + // If still not valid, return current time + if (!(date instanceof Date) || isNaN(date.getTime())) { + date = new Date(); + } + } + return date.toISOString().slice(0, 16); // Format: YYYY-MM-DDTHH:mm + } + + render() { + const { title, startTime, endTime, description, id } = this.state; + + return this.createElement( + 'div', + { className: 'event-editor' }, + + // Navigation bar + new NavigationBar({ + title: id ? 'Edit Event' : 'New Event', + leftButton: { + element: 'button', + props: { + className: 'nav-button cancel-button', + onClick: this.handleCancel, + 'aria-label': 'Cancel', + }, + content: 'Cancel', + }, + rightButton: { + element: 'button', + props: { + className: 'nav-button save-button', + onClick: this.handleSave, + 'aria-label': 'Save event', + }, + content: 'Save', + }, + }), + + // Editor content + this.createElement( + 'div', + { className: 'event-form' }, + + // Title input + this.createElement('input', { + type: 'text', + className: 'event-title-input', + placeholder: 'Event title...', + value: title, + onInput: this.handleTitleChange, + ref: this.setTitleInputRef, + required: true, + }), + + // Time inputs container + this.createElement( + 'div', + { className: 'time-container' }, + + // Start time input + this.createElement('input', { + type: 'datetime-local', + className: 'time-input', + value: startTime, + onInput: this.handleStartTimeChange, + ref: this.setStartTimeInputRef, + required: true, + }), + + // End time input + this.createElement('input', { + type: 'datetime-local', + className: 'time-input', + value: endTime, + onInput: this.handleEndTimeChange, + ref: this.setEndTimeInputRef, + required: true, + }) + ), + + // Description textarea + this.createElement('textarea', { + className: 'event-description-input', + placeholder: 'Add description...', + value: description, + onInput: this.handleDescriptionChange, + ref: this.setDescriptionInputRef, + }), + + // Delete button (only for existing events) + id && + this.createElement( + 'button', + { + type: 'button', + className: 'delete-event-button', + onClick: this.handleDelete, + }, + 'Delete Event' + ) + ) + ); + } +} + + +// ---- ../js/apps/calendar/index.js ---- +/** + * @fileoverview Main entry point for the Calendar application + * + * This module initializes the Calendar app UI, including: + * - Displaying the calendar view + * - Handling event creation, editing, and deletion via EventEditor + * - Managing event persistence via A3API + */ + +/** + * Initializes and mounts the Calendar application. + * @param {HTMLElement} container - The DOM element to mount the app into. + */ +function initializeCalendarApp(container) { + const { events = [], selectedDate = new Date(), showEventEditor = false, currentEvent = null } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Calendar'); + + // Check if we're viewing/editing a specific event + if (showEventEditor || currentEvent) { + // Show event editor + const eventEditor = new EventEditor({ + event: currentEvent, + onSave: (savedEvent) => { + const currentEvents = globalState.getState().events || []; + let updatedEvents; + + if (savedEvent.id && currentEvents.find(e => e.id === savedEvent.id)) { + // Update existing event + updatedEvents = currentEvents.map(e => e.id === savedEvent.id ? savedEvent : e); + } else { + // Add new event + updatedEvents = [savedEvent, ...currentEvents]; + } + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false + }); + + // Save to server + if (typeof saveCalendarEvent === 'function') { + saveCalendarEvent(savedEvent); + } + }, + onCancel: () => { + globalState.setState({ + currentEvent: null, + showEventEditor: false + }); + }, + onDelete: (eventId) => { + const currentEvents = globalState.getState().events || []; + const updatedEvents = currentEvents.filter(e => e.id !== eventId); + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false + }); + + // Delete from server + if (typeof deleteCalendarEvent === 'function') { + deleteCalendarEvent(eventId); + } + } + }); + eventEditor.mount(appContainer); + } else { + // Show calendar view + const navBar = new NavigationBar({ + title: 'Calendar', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-event-button', + onClick: () => { + globalState.setState({ + showEventEditor: true, + currentEvent: null + }); + }, + 'aria-label': 'Add Event' + }, + content: '+' + } + }); + navBar.mount(appContainer); + + const calendar = new Calendar({ + selectedDate: selectedDate, + events: events, + onDayClick: (date) => { + globalState.setState({ + selectedDate: date, + currentEvent: null, + showEventEditor: false + }); + }, + onEventClick: (event) => { + globalState.setState({ + currentEvent: event, + showEventEditor: true + }); + } + }); + calendar.mount(appContainer); + } + + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeCalendarApp = initializeCalendarApp; + +// ---- ../js/apps/wallet/index.js ---- +/** @format */ + +let lastMobileBankRequest = 0; +let mobileBankNoticeTimer = null; +const MOBILE_BANK_REQUEST_COOLDOWN = 1000; + +function defaultMobileBankState() { + return { + account: { + bank: 0, + cash: 0, + earnings: 0, + transactions: [], + }, + session: { + creditLine: { + amountDue: 0, + approvedAmount: 0, + availableAmount: 0, + outstandingPrincipal: 0, + }, + orgName: '', + playerName: '', + transferTargets: [], + uid: '', + }, + notice: null, + pendingAction: '', + }; +} + +function getMobileBankState() { + return { + ...defaultMobileBankState(), + ...(globalState.getState().mobileBank || {}), + }; +} + +function setMobileBankState(patch) { + globalState.setState({ + mobileBank: { + ...getMobileBankState(), + ...patch, + }, + }); +} + +function formatMobileBankCurrency(value) { + const amount = Math.floor(Number(value || 0)); + return `$${Math.max(0, amount).toLocaleString()}`; +} + +function normalizeMobileBankAmount(value) { + const amount = Math.floor(Number(value || 0)); + return Number.isFinite(amount) ? amount : 0; +} + +function sendMobileBankEvent(event, data = {}) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ event, data })); + return true; + } + + showMobileBankNotice('error', 'Bank bridge is unavailable.'); + return false; +} + +function requestMobileBankRefresh(force = false) { + const now = Date.now(); + if (!force && now - lastMobileBankRequest < MOBILE_BANK_REQUEST_COOLDOWN) { + return false; + } + + lastMobileBankRequest = now; + return sendMobileBankEvent('phone::bank::refresh', {}); +} + +function requestMobileBankTransfer(target, amountValue) { + const targetUid = String(target || '').trim(); + const amount = normalizeMobileBankAmount(amountValue); + + if (!targetUid) { + showMobileBankNotice('error', 'Choose a recipient.'); + return false; + } + + if (amount <= 0) { + showMobileBankNotice('error', 'Enter a valid transfer amount.'); + return false; + } + + setMobileBankState({ pendingAction: 'transfer' }); + const sent = sendMobileBankEvent('phone::bank::transfer::request', { + amount, + from: 'bank', + target: targetUid, + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function requestMobileBankDepositEarnings() { + const state = getMobileBankState(); + const availableEarnings = normalizeMobileBankAmount(state.account.earnings); + + if (availableEarnings <= 0) { + showMobileBankNotice('error', 'No earnings are available to deposit.'); + return false; + } + + setMobileBankState({ pendingAction: 'depositearnings' }); + const sent = sendMobileBankEvent('phone::bank::depositEarnings::request', { + amount: availableEarnings, + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function requestMobileBankRepayCreditLine(amountValue) { + const amount = normalizeMobileBankAmount(amountValue); + const state = getMobileBankState(); + const amountDue = normalizeMobileBankAmount(state.session.creditLine?.amountDue); + + if (amountDue <= 0) { + showMobileBankNotice('error', 'No credit line payment is due.'); + return false; + } + + if (amount <= 0) { + showMobileBankNotice('error', 'Enter a valid payment amount.'); + return false; + } + + setMobileBankState({ pendingAction: 'repaycreditline' }); + const sent = sendMobileBankEvent('phone::bank::repayCreditLine::request', { + amount: Math.min(amount, amountDue), + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function updateMobileBank(payload) { + const current = getMobileBankState(); + setMobileBankState({ + account: { + ...current.account, + ...(payload && payload.account ? payload.account : {}), + }, + session: { + ...current.session, + ...(payload && payload.session ? payload.session : {}), + }, + pendingAction: '', + }); +} + +function updateMobileBankAccount(accountPatch) { + const current = getMobileBankState(); + setMobileBankState({ + account: { + ...current.account, + ...(accountPatch || {}), + }, + pendingAction: '', + }); +} + +function showMobileBankNotice(type, message) { + if (!message) return; + + setMobileBankState({ + notice: { + type: type || 'info', + message, + }, + pendingAction: '', + }); + + if (mobileBankNoticeTimer) { + clearTimeout(mobileBankNoticeTimer); + } + + mobileBankNoticeTimer = setTimeout(() => { + setMobileBankState({ notice: null }); + mobileBankNoticeTimer = null; + }, 3200); +} + +function mobileBankTransactionRows(transactions) { + const rows = Array.isArray(transactions) ? transactions.slice(0, 5) : []; + + if (rows.length === 0) { + const empty = document.createElement('div'); + empty.className = 'wallet-empty-state'; + empty.textContent = 'No recent transactions'; + return empty; + } + + const list = document.createElement('div'); + list.className = 'wallet-transaction-list'; + + rows.forEach((entry) => { + const row = document.createElement('div'); + row.className = 'wallet-transaction-row'; + + const copy = document.createElement('div'); + copy.className = 'wallet-transaction-copy'; + + const title = document.createElement('span'); + title.className = 'wallet-transaction-title'; + title.textContent = entry.type || 'Transaction'; + + const meta = document.createElement('span'); + meta.className = 'wallet-transaction-meta'; + meta.textContent = entry.date || 'Pending timestamp'; + + const value = document.createElement('span'); + value.className = 'wallet-transaction-value'; + value.textContent = formatMobileBankCurrency(entry.amount || 0); + + copy.append(title, meta); + row.append(copy, value); + list.appendChild(row); + }); + + return list; +} + +function initializeMobileBankApp(container) { + const state = getMobileBankState(); + const { account, session, notice, pendingAction } = state; + const transferTargets = Array.isArray(session.transferTargets) + ? session.transferTargets + : []; + const creditLine = session.creditLine || {}; + const amountDue = normalizeMobileBankAmount(creditLine.amountDue); + const outstandingPrincipal = normalizeMobileBankAmount(creditLine.outstandingPrincipal); + + requestMobileBankRefresh(false); + + const appContainer = document.createElement('div'); + appContainer.className = 'app-container wallet-app'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Wallet'); + + const navBar = new NavigationBar({ + title: 'Wallet', + rightButton: { + element: 'button', + props: { + className: 'wallet-nav-button', + type: 'button', + disabled: pendingAction !== '', + onClick: () => requestMobileBankRefresh(true), + 'aria-label': 'Refresh wallet', + }, + content: 'Refresh', + }, + }); + navBar.mount(appContainer); + + const content = document.createElement('div'); + content.className = 'content wallet-content'; + + if (notice && notice.message) { + const noticeElement = document.createElement('div'); + noticeElement.className = `wallet-notice wallet-notice-${notice.type || 'info'}`; + noticeElement.textContent = notice.message; + content.appendChild(noticeElement); + } + + const hero = document.createElement('section'); + hero.className = 'wallet-balance-card'; + hero.innerHTML = ` + Available Balance + ${formatMobileBankCurrency(account.bank)} + ${session.playerName || 'Personal account'} + `; + content.appendChild(hero); + + const metrics = document.createElement('section'); + metrics.className = 'wallet-metrics'; + metrics.innerHTML = ` +
+ Cash + ${formatMobileBankCurrency(account.cash)} +
+
+ Earnings + ${formatMobileBankCurrency(account.earnings)} +
+ `; + content.appendChild(metrics); + + const bankingActions = document.createElement('section'); + bankingActions.className = 'wallet-card'; + + const bankingTitle = document.createElement('div'); + bankingTitle.className = 'wallet-card-title'; + bankingTitle.textContent = 'Account Actions'; + + const earningsAction = document.createElement('div'); + earningsAction.className = 'wallet-action-block'; + + const earningsSummary = document.createElement('div'); + earningsSummary.className = 'wallet-action-summary'; + earningsSummary.innerHTML = ` + Deposit Earnings + ${formatMobileBankCurrency(account.earnings)} available + Move mission earnings into your bank balance. + `; + + const earningsButton = document.createElement('button'); + earningsButton.className = 'wallet-secondary-button wallet-full-button'; + earningsButton.type = 'button'; + earningsButton.disabled = pendingAction !== '' || normalizeMobileBankAmount(account.earnings) <= 0; + earningsButton.textContent = pendingAction === 'depositearnings' ? 'Depositing...' : 'Deposit Earnings'; + earningsButton.addEventListener('click', () => { + requestMobileBankDepositEarnings(); + }); + earningsAction.append(earningsSummary, earningsButton); + + const creditAction = document.createElement('div'); + creditAction.className = 'wallet-action-block'; + + const creditSummary = document.createElement('div'); + creditSummary.className = 'wallet-action-summary'; + creditSummary.innerHTML = ` + Credit Line Payment + ${formatMobileBankCurrency(amountDue)} due + ${session.orgName || 'Organization'} - ${formatMobileBankCurrency(outstandingPrincipal)} outstanding + `; + + const creditControls = document.createElement('div'); + creditControls.className = 'wallet-action-controls'; + + const creditAmount = document.createElement('input'); + creditAmount.className = 'wallet-input'; + creditAmount.type = 'number'; + creditAmount.min = '1'; + creditAmount.step = '1'; + creditAmount.placeholder = amountDue > 0 ? 'Payment amount' : 'No payment due'; + creditAmount.setAttribute('aria-label', 'Credit line payment amount'); + creditAmount.inputMode = 'numeric'; + creditAmount.disabled = pendingAction !== '' || amountDue <= 0; + + const creditButton = document.createElement('button'); + creditButton.className = 'wallet-secondary-button'; + creditButton.type = 'button'; + creditButton.disabled = pendingAction !== '' || amountDue <= 0; + creditButton.textContent = pendingAction === 'repaycreditline' ? 'Paying...' : 'Pay Credit'; + creditButton.addEventListener('click', () => { + requestMobileBankRepayCreditLine(creditAmount.value || amountDue); + }); + + creditControls.append(creditAmount, creditButton); + creditAction.append(creditSummary, creditControls); + bankingActions.append(bankingTitle, earningsAction, creditAction); + content.appendChild(bankingActions); + + const transferCard = document.createElement('section'); + transferCard.className = 'wallet-card'; + + const transferTitle = document.createElement('div'); + transferTitle.className = 'wallet-card-title'; + transferTitle.textContent = 'Transfer'; + + const targetSelect = document.createElement('select'); + targetSelect.className = 'wallet-input'; + targetSelect.setAttribute('aria-label', 'Transfer recipient'); + targetSelect.disabled = pendingAction !== '' || transferTargets.length === 0; + + const placeholder = document.createElement('option'); + placeholder.value = ''; + placeholder.textContent = transferTargets.length === 0 ? 'No online recipients' : 'Choose recipient'; + targetSelect.appendChild(placeholder); + + transferTargets.forEach((target) => { + const option = document.createElement('option'); + option.value = target.uid || ''; + option.textContent = target.name || target.uid || 'Player'; + targetSelect.appendChild(option); + }); + + const amountInput = document.createElement('input'); + amountInput.className = 'wallet-input'; + amountInput.type = 'number'; + amountInput.min = '1'; + amountInput.step = '1'; + amountInput.placeholder = 'Amount'; + amountInput.inputMode = 'numeric'; + amountInput.disabled = pendingAction !== ''; + + const transferButton = document.createElement('button'); + transferButton.className = 'wallet-primary-button'; + transferButton.type = 'button'; + transferButton.disabled = pendingAction !== '' || transferTargets.length === 0; + transferButton.textContent = pendingAction === 'transfer' ? 'Sending...' : 'Send Transfer'; + transferButton.addEventListener('click', () => { + requestMobileBankTransfer(targetSelect.value, amountInput.value); + }); + + transferCard.append(transferTitle, targetSelect, amountInput, transferButton); + content.appendChild(transferCard); + + const historyCard = document.createElement('section'); + historyCard.className = 'wallet-card'; + + const historyTitle = document.createElement('div'); + historyTitle.className = 'wallet-card-title'; + historyTitle.textContent = 'Recent Activity'; + + historyCard.append(historyTitle, mobileBankTransactionRows(account.transactions)); + content.appendChild(historyCard); + + appContainer.appendChild(content); + container.appendChild(appContainer); +} + +window.initializeMobileBankApp = initializeMobileBankApp; +window.requestMobileBankRefresh = requestMobileBankRefresh; +window.updateMobileBank = updateMobileBank; +window.updateMobileBankAccount = updateMobileBankAccount; +window.showMobileBankNotice = showMobileBankNotice; + + +// ---- ../js/app.js ---- +/** + * @fileoverview Root application component and integration logic. + * + * The App class manages: + * - Switching between different app modules (home, phone, messages, contacts, settings) + * - Rendering the correct app UI based on global state + * - Handling global modals (e.g., call confirmation) + * - Integrating shared UI elements (status bar, home indicator, dynamic island) + * + * Each app module is initialized via its global function (e.g., window.initializePhoneApp) and mounted into the app container. + * The placeholder app view is shown for unimplemented apps. + * + * This is the main entry point for the phone UI framework. + */ + +/** + * @class App + * @extends Component + * @description The root component that manages app switching and integration + */ +class App extends Component { + /** + * @constructor + * Initializes state and subscribes to global state changes. + */ + constructor(props = {}) { + super(props); + this.state = { + ...globalState.getState(), + currentApp: 'home', + showAddContactForm: false + }; + + this.unsubscribe = null; + } + + /** + * Subscribe to global state changes after mounting + * @lifecycle + */ + componentDidMount() { + this.unsubscribe = globalState.subscribe((newState) => { + this.setState(newState); + }); + } + + /** + * Clean up subscriptions before unmounting + * @lifecycle + */ + componentWillUnmount() { + if (this.unsubscribe) { + this.unsubscribe(); + } + } + + /** + * Render the current app based on app state + * @returns {HTMLElement} Current app view + * @private + */ + renderCurrentApp() { + const { currentApp } = this.state; + const appContainer = this.createElement('div', { className: 'app-container' }); + + switch (currentApp) { + case 'clock': + window.initializeClockApp(appContainer); + break; + case 'calendar': + window.initializeCalendarApp(appContainer); + break; + case 'home': + return new HomeScreen(); + case 'phone': + window.initializePhoneApp(appContainer); + break; + case 'messages': + window.initializeMessagesApp(appContainer); + break; + case 'mail': + window.initializeMailApp(appContainer); + break; + case 'notes': + window.initializeNotesApp(appContainer); + break; + case 'contacts': + window.initializeContactsApp(appContainer); + break; + case 'settings': + window.initializeSettingsApp(appContainer); + break; + case 'wallet': + window.initializeMobileBankApp(appContainer); + break; + default: + return this.renderPlaceholderApp(currentApp); + } + + return appContainer; + } + + /** + * Render a placeholder for unimplemented apps + * @param {string} appName - App name + * @returns {HTMLElement} Placeholder app view + * @private + */ + renderPlaceholderApp(appName) { + const appIcons = { + calendar: '', + camera: '', + store: '', + mail: '', + icloud: '', + photos: '', + safari: '', + wallet: '' + }; + + return this.createElement( + 'div', + { className: 'app-container' }, + new NavigationBar({ title: appName }), + this.createElement( + 'div', + { className: 'content' }, + this.createElement( + 'div', + { + style: { + textAlign: 'center', + padding: '50px 20px', + color: '#6c757d', + }, + }, + this.createElement('h2', { role: 'img', 'aria-label': appName }, appIcons[appName] || ''), + this.createElement('p', {}, `${appName} app coming soon!`) + ) + ) + ); + } + + /** + * Render the phone app UI, including status bar, main content, home indicator, and modals. + * @returns {HTMLElement} The rendered phone app + */ + render() { + const { currentApp, selectedContact, showModal, showDeleteModal, noteToDelete, eventToDelete } = this.state; + const openMessageThread = (contact) => { + if (!contact || contact.canMessage === false) return; + + const contactId = contact.contactId || contact.uid || contact.id; + if (!contactId) return; + + const { messages = [], rawMessages = [], currentUid = window.__playerUid } = globalState.getState(); + const existingConversation = messages.find((message) => (message.contactId || message.id) === contactId); + const selectedRawMessages = rawMessages.filter((message) => + message && + ( + (message.from === currentUid && message.to === contactId) || + (message.from === contactId && message.to === currentUid) + ) + ); + const conversation = existingConversation || { + ...contact, + id: contactId, + contactId, + contactName: contact.fullName || contact.name || contactId, + conversation: [], + hasConversation: false + }; + + globalState.setState({ + currentApp: 'messages', + selectedContact: null, + showModal: false, + showMessageContactPicker: false, + selectedConversation: { + ...conversation, + id: contactId, + contactId, + contactName: conversation.contactName || contact.fullName || contact.name || contactId, + conversation: conversation.conversation || [] + }, + selectedConversationRaw: { + otherUid: contactId, + messages: selectedRawMessages + } + }); + }; + + return this.createElement( + 'div', + { + className: 'phone-container', + role: 'application', + 'aria-label': 'Phone interface', + }, + this.createElement( + 'div', + { + className: 'phone-screen dynamic-island', + role: 'main', + }, + // Dynamic Island content + this.createElement( + 'div', + { + className: 'dynamic-island-content', + 'aria-hidden': 'true', + }, + this.createElement('div', { className: 'speaker' }), + this.createElement('div', { className: 'camera' }) + ), + + // Status bar + new StatusBar(), + + // Main app content + this.renderCurrentApp(), + + // Home indicator (except on home screen) + currentApp !== 'home' && new HomeIndicator(), + + // Call modal + showModal && selectedContact && new Modal({ + show: showModal, + title: selectedContact.canCall === false ? (selectedContact.fullName || selectedContact.name) : `Call ${selectedContact.fullName || selectedContact.name}?`, + confirmText: selectedContact.canCall === false ? 'Close' : 'Call', + cancelText: selectedContact.canCall === false ? 'Back' : 'Cancel', + hideCancel: true, + hideConfirm: selectedContact.canCall === false, + extraActions: selectedContact.canMessage === false || !(selectedContact.contactId || selectedContact.uid || selectedContact.id) ? [] : [{ + text: 'Text', + ariaLabel: `Text ${selectedContact.fullName || selectedContact.name}`, + className: 'button secondary', + onClick: () => openMessageThread(selectedContact) + }], + onClose: () => globalState.setState({ showModal: false, selectedContact: null }), + onConfirm: () => { + if (selectedContact.canCall === false) { + globalState.setState({ showModal: false, selectedContact: null }); + return; + } + + globalState.setState({ + phoneNumber: selectedContact.phone, + showModal: false, + selectedContact: null, + currentApp: 'phone' + }); + }, + children: [ + this.createElement( + 'p', + { role: 'alert' }, + selectedContact.canCall === false + ? `${selectedContact.fullName || selectedContact.name} is a command broadcast contact. Incoming messages and email are available, but direct calls are disabled.` + : `Do you want to call ${selectedContact.fullName || selectedContact.name} at ${selectedContact.phone}?` + ) + ] + }), + + // Delete note confirmation modal + showDeleteModal && noteToDelete && new Modal({ + show: showDeleteModal, + title: `Delete "${noteToDelete.title}"?`, + confirmText: 'Delete', + cancelText: 'Cancel', + onClose: () => globalState.setState({ showDeleteModal: false, noteToDelete: null }), + onConfirm: () => { + // Find the onDelete handler from the notes editor and call it + const currentState = globalState.getState(); + const currentNotes = currentState.notes || []; + const updatedNotes = currentNotes.filter(n => n.id !== noteToDelete.id); + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false, + showDeleteModal: false, + noteToDelete: null + }); + + // Delete from server + if (typeof deleteNote === 'function') { + deleteNote(noteToDelete.id); + } + + console.log('Note deleted:', noteToDelete.id); + }, + children: [this.createElement('p', { role: 'alert' }, `Are you sure you want to delete this note? This action cannot be undone.`)] + }), + + showDeleteModal && eventToDelete && new Modal({ + show: showDeleteModal, + title: `Delete "${eventToDelete.title}"?`, + confirmText: 'Delete', + cancelText: 'Cancel', + onClose: () => globalState.setState({ showDeleteModal: false, eventToDelete: null }), + onConfirm: () => { + // Find the onDelete handler from the events editor and call it + const currentState = globalState.getState(); + const currentEvents = currentState.events || []; + const updatedEvents = currentEvents.filter(n => n.id !== eventToDelete.id); + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false, + showDeleteModal: false, + eventToDelete: null + }); + + // Delete from server + if (typeof deleteCalendarEvent === 'function') { + deleteCalendarEvent(eventToDelete.id); + } + + console.log('Event deleted:', eventToDelete.id); + }, + children: [this.createElement('p', { role: 'alert' }, `Are you sure you want to delete this event? This action cannot be undone.`)] + }) + ) + ); + } +} + + +// ---- ../js/main.js ---- +/** @format */ + +/** + * @fileoverview Main entry point for the phone application. + * Initializes the application and mounts the root component. + */ + +/** + * Initialize and mount the phone application. + * Sets up error boundaries and debugging tools. + * + * @function + * @name initializeApp + * @throws {Error} If app container element is not found + */ +const initializeApp = () => { + try { + const appContainer = document.getElementById('app'); + if (!appContainer) { + throw new Error('App container element not found. Make sure there is an element with id="app" in the HTML.'); + } + + // Set default theme first + document.documentElement.setAttribute('data-theme', 'dark'); + + // Get theme from game using A3API + const themeAlert = { + "event": "phone::get::theme", + "data": {} + }; + A3API.SendAlert(JSON.stringify(themeAlert)); + + // Request player UID for correct message mapping + const meAlert = { + "event": "phone::get::player", + "data": {} + }; + A3API.SendAlert(JSON.stringify(meAlert)); + + // Request contacts from server + const contactsAlert = { + "event": "phone::get::contacts", + "data": {} + }; + A3API.SendAlert(JSON.stringify(contactsAlert)); + + // Request messages from server + const messagesAlert = { + "event": "phone::get::messages", + "data": {} + }; + A3API.SendAlert(JSON.stringify(messagesAlert)); + + // Request emails from server + const emailsAlert = { + "event": "phone::get::emails", + "data": {} + }; + A3API.SendAlert(JSON.stringify(emailsAlert)); + + // Request notes from server + const notesAlert = { + "event": "phone::get::notes", + "data": {} + }; + A3API.SendAlert(JSON.stringify(notesAlert)); + + // Request events from server + const eventsAlert = { + "event": "phone::get::events", + "data": {} + }; + A3API.SendAlert(JSON.stringify(eventsAlert)); + + // Request world clocks from server + const worldClocksAlert = { + "event": "phone::get::clocks", + "data": {} + }; + A3API.SendAlert(JSON.stringify(worldClocksAlert)); + + // Request alarms from server + const alarmsAlert = { + "event": "phone::get::alarms", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alarmsAlert)); + + // Initialize phone app + const app = new App(); + app.mount(appContainer); + + console.log('Phone app initialized successfully'); + } catch (error) { + console.error('Failed to initialize phone app:', error); + throw error; + } +}; + + +// ---- ../js/global.js ---- +/** @format */ + +/** + * @fileoverview Global exports for the phone application. + * Exposes all API functions and initialization to the global window object. + */ + +/** + * Sets the theme for the phone application + * @param {string} theme - The theme to set ('dark' or 'light') + */ +function setTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); + + // Dispatch theme change event + const themeEvent = new CustomEvent('themeChanged', { + detail: { theme } + }); + document.dispatchEvent(themeEvent); +} + +// Debounce variables for contact requests +let lastContactRequest = 0; +const CONTACT_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests contacts from the server (Arma 3) with debouncing + */ +function requestContacts() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastContactRequest < CONTACT_REQUEST_COOLDOWN) { + console.log('Contact request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::contacts", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastContactRequest = now; + console.log('Requested contacts from server'); + } else { + console.warn('A3API not available, cannot request contacts'); + } +} + +/** + * Loads contacts into the global state (called by Arma 3) + * @param {Array} contacts - Array of contact objects from the server + */ +function loadContacts(contacts) { + try { + if (Array.isArray(contacts)) { + const normalizedContacts = normalizeContacts(contacts); + globalState.setState({ + contacts: normalizedContacts + }); + console.log(`Loaded ${contacts.length} contacts from server:`, contacts); + } else { + console.warn('Invalid contacts data received:', contacts); + } + } catch (error) { + console.error('Error loading contacts:', error); + } +} + +/** + * Refresh contacts via SQF-triggered UI event + */ +function refreshContacts() { + try { + requestContacts(); + } catch (e) { + console.error('Error refreshing contacts:', e); + } +} + +/** + * Updates contacts in state (SQF -> JS bridge) + * @param {Array} contacts + */ +function updateContacts(contacts) { + try { + if (Array.isArray(contacts)) { + const normalizedContacts = normalizeContacts(contacts); + globalState.setState({ contacts: normalizedContacts }); + // Rebuild message summaries to resolve names if raw present + rebuildMessageSummariesFromRaw(); + console.log(`Updated contacts from server: ${contacts.length}`); + } else { + console.warn('updateContacts: invalid data', contacts); + } + } catch (e) { + console.error('Error in updateContacts:', e); + } +} + +function normalizeContacts(contacts) { + return contacts + .filter(contact => contact && typeof contact === 'object') + .map(contact => { + const name = contact.name || contact.uid || 'Unknown Player'; + const uid = contact.uid || contact.id || ''; + return { + ...contact, + id: uid || contact.phone || name, + uid, + name, + fullName: contact.fullName || name, + phone: contact.phone || '', + email: contact.email || '', + avatar: contact.avatar || getInitials(name), + online: Boolean(contact.online), + system: Boolean(contact.system), + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + canEmail: contact.canEmail !== false + }; + }); +} + +// Player UID handling +function setPlayerUid(uid) { + try { + if (!uid || typeof uid !== 'string') { + console.warn('setPlayerUid: invalid uid', uid); + return; + } + window.__playerUid = uid; + globalState.setState({ currentUid: uid }); + // With UID known, we can build summaries + rebuildMessageSummariesFromRaw(); + // Optionally (re)request messages when UID is set + requestMessages(); + } catch (e) { + console.error('Error in setPlayerUid:', e); + } +} + +// Messages: request + update handlers + +let lastMessagesRequest = 0; +const MESSAGES_REQUEST_COOLDOWN = 1000; + +function requestMessages() { + const now = Date.now(); + if (now - lastMessagesRequest < MESSAGES_REQUEST_COOLDOWN) return; + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { event: 'phone::get::messages', data: {} }; + A3API.SendAlert(JSON.stringify(alert)); + lastMessagesRequest = now; + console.log('Requested messages from server'); + } else { + console.warn('A3API not available, cannot request messages'); + } +} + +/** + * Updates raw messages from server into state without breaking UI + * @param {Array} messages + */ +function updateMessages(messages) { + try { + if (Array.isArray(messages)) { + globalState.setState({ rawMessages: messages }); + rebuildMessageSummariesFromRaw(); + console.log(`Updated raw messages: ${messages.length}`); + } else { + console.warn('updateMessages: invalid data', messages); + } + } catch (e) { + console.error('Error in updateMessages:', e); + } +} + +/** + * Updates a specific message thread payload + * @param {Array} threadMessages + * @param {string} otherUid + */ +function updateMessageThread(threadMessages, otherUid) { + try { + if (!Array.isArray(threadMessages)) { + console.warn('updateMessageThread: invalid messages', threadMessages); + return; + } + const selectedConversationRaw = { otherUid, messages: threadMessages }; + globalState.setState({ selectedConversationRaw }); + // Update derived selectedConversation as well + rebuildMessageSummariesFromRaw(); + console.log(`Updated message thread with ${otherUid}: ${threadMessages.length}`); + } catch (e) { + console.error('Error in updateMessageThread:', e); + } +} + +/** + * Append a newly sent message to raw store + * @param {Object} messageObj + */ +function updateMessageSent(messageObj) { + try { + const { rawMessages = [], currentUid = window.__playerUid, selectedConversation } = globalState.getState(); + const next = [...rawMessages, messageObj]; + const otherUid = messageObj.from === currentUid ? messageObj.to : messageObj.from; + const statePatch = { rawMessages: next }; + if (selectedConversation && selectedConversation.id === otherUid) { + statePatch.selectedConversationRaw = { + otherUid, + messages: next.filter(message => + (message.from === currentUid && message.to === otherUid) || + (message.from === otherUid && message.to === currentUid) + ) + }; + } + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageSent:', e); + } +} + +/** + * Append a newly received message to raw store + * @param {Object} messageObj + */ +function updateMessageReceived(messageObj) { + try { + const { rawMessages = [], currentUid = window.__playerUid, selectedConversation } = globalState.getState(); + const next = [...rawMessages, messageObj]; + const otherUid = messageObj.from === currentUid ? messageObj.to : messageObj.from; + const statePatch = { rawMessages: next }; + if (selectedConversation && selectedConversation.id === otherUid) { + statePatch.selectedConversationRaw = { + otherUid, + messages: next.filter(message => + (message.from === currentUid && message.to === otherUid) || + (message.from === otherUid && message.to === currentUid) + ) + }; + } + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageReceived:', e); + } +} + +/** + * Mark message read in raw store by id + * @param {string} messageId + */ +function updateMessageRead(messageId) { + try { + const { rawMessages = [] } = globalState.getState(); + const updated = rawMessages.map(m => (m && m.id === messageId ? { ...m, read: true } : m)); + globalState.setState({ rawMessages: updated }); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageRead:', e); + } +} + +/** + * Remove a message from the local phone state after server delete succeeds + * @param {string} messageId + */ +function updateMessageDeleted(messageId) { + try { + const { rawMessages = [], selectedConversationRaw = null } = globalState.getState(); + const nextRawMessages = rawMessages.filter(message => message && message.id !== messageId); + const statePatch = { rawMessages: nextRawMessages }; + + if (selectedConversationRaw && Array.isArray(selectedConversationRaw.messages)) { + statePatch.selectedConversationRaw = { + ...selectedConversationRaw, + messages: selectedConversationRaw.messages.filter(message => message && message.id !== messageId) + }; + } + + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageDeleted:', e); + } +} + +// Transform raw message payloads into UI-friendly summary and thread structures +function rebuildMessageSummariesFromRaw() { + try { + const state = globalState.getState(); + const { rawMessages = [], contacts = [], currentUid = window.__playerUid, selectedConversationRaw } = state; + if (!Array.isArray(rawMessages) || !currentUid) { + // Nothing to do until we have both raw data and the player's UID + return; + } + + // Build contact lookup map by uid + const contactByUid = new Map(); + contacts.forEach(c => { if (c && c.uid) contactByUid.set(c.uid, c); }); + + // Group messages by other participant + const threadsMap = new Map(); + for (const m of rawMessages) { + if (!m) continue; + const from = m.from; + const to = m.to; + const otherUid = from === currentUid ? to : from; + if (!threadsMap.has(otherUid)) threadsMap.set(otherUid, []); + threadsMap.get(otherUid).push(m); + } + + // Helper to convert timestamp to Date + const toJsDate = (t) => { + if (t instanceof Date) return t; + if (typeof t === 'number') { + // serverTime is seconds; convert + return new Date(t * 1000); + } + // Fallback parse + const parsed = Date.parse(t); + return isNaN(parsed) ? new Date() : new Date(parsed); + }; + + // Build UI message summaries + const uiMessages = []; + for (const [otherUid, arr] of threadsMap.entries()) { + // Sort by timestamp ascending + const sorted = [...arr].sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0)); + const last = sorted[sorted.length - 1]; + const contact = contactByUid.get(otherUid) || { name: otherUid, uid: otherUid }; + + const conversation = sorted.map((msg, idx) => ({ + id: msg.id || idx, + text: msg.message || msg.text || '', + sender: msg.from === currentUid ? 'user' : 'contact', + timestamp: toJsDate(msg.timestamp) + })); + + uiMessages.push({ + id: otherUid, + contactId: otherUid, + contactName: contact.name || otherUid, + canMessage: contact.canMessage !== false, + lastMessage: (last && (last.message || last.text)) || '', + timestamp: toJsDate(last && last.timestamp), + unread: arr.filter(m => m.read === false && m.to === currentUid).length || 0, + conversation + }); + } + + // Sort conversations by last timestamp desc for UI list + uiMessages.sort((a, b) => (b.timestamp?.getTime?.() || 0) - (a.timestamp?.getTime?.() || 0)); + + const nextState = { messages: uiMessages }; + + // If we have a selected raw thread, map it to selectedConversation too + if (selectedConversationRaw && selectedConversationRaw.otherUid) { + const thread = threadsMap.get(selectedConversationRaw.otherUid) || selectedConversationRaw.messages || []; + const contact = contactByUid.get(selectedConversationRaw.otherUid) || { name: selectedConversationRaw.otherUid }; + nextState.selectedConversation = { + id: selectedConversationRaw.otherUid, + contactId: selectedConversationRaw.otherUid, + contactName: contact.name, + canMessage: contact.canMessage !== false, + lastMessage: thread.length ? (thread[thread.length - 1].message || thread[thread.length - 1].text) : '', + timestamp: thread.length ? toJsDate(thread[thread.length - 1].timestamp) : new Date(), + unread: thread.filter(m => m.read === false && m.to === currentUid).length || 0, + conversation: thread.map((msg, idx) => ({ + id: msg.id || idx, + text: msg.message || msg.text || '', + sender: msg.from === currentUid ? 'user' : 'contact', + timestamp: toJsDate(msg.timestamp) + })) + }; + } + + globalState.setState(nextState); + } catch (e) { + console.error('Error rebuilding message summaries:', e); + } +} + +// Emails: request + update handlers + +let lastEmailsRequest = 0; +const EMAILS_REQUEST_COOLDOWN = 1000; + +function requestEmails() { + const now = Date.now(); + if (now - lastEmailsRequest < EMAILS_REQUEST_COOLDOWN) return; + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { event: 'phone::get::emails', data: {} }; + A3API.SendAlert(JSON.stringify(alert)); + lastEmailsRequest = now; + console.log('Requested emails from server'); + } else { + console.warn('A3API not available, cannot request emails'); + } +} + +function normalizeEmails(emails) { + if (!Array.isArray(emails)) return []; + + const byId = new Map(); + emails + .filter((email) => email && typeof email === 'object') + .forEach((email) => { + const id = email.id || `${email.from || ''}:${email.to || ''}:${email.timestamp || ''}:${email.subject || ''}`; + byId.set(id, { + id, + from: email.from || '', + to: email.to || '', + subject: email.subject || '', + body: email.body || '', + timestamp: email.timestamp || '', + read: !!email.read + }); + }); + + return Array.from(byId.values()).sort((left, right) => { + const leftTime = new Date(left.timestamp).getTime() || 0; + const rightTime = new Date(right.timestamp).getTime() || 0; + return rightTime - leftTime; + }); +} + +/** + * Replace emails in state + * @param {Array} emails + */ +function updateEmails(emails) { + try { + if (Array.isArray(emails)) { + globalState.setState({ emails: normalizeEmails(emails) }); + console.log(`Updated emails: ${emails.length}`); + } else { + console.warn('updateEmails: invalid data', emails); + } + } catch (e) { + console.error('Error in updateEmails:', e); + } +} + +/** + * Append a newly sent email to state + * @param {Object} emailObj + */ +function updateEmailSent(emailObj) { + try { + const { emails = [] } = globalState.getState(); + globalState.setState({ emails: normalizeEmails([emailObj, ...emails]) }); + } catch (e) { + console.error('Error in updateEmailSent:', e); + } +} + +/** + * Append a newly received email to state + * @param {Object} emailObj + */ +function updateEmailReceived(emailObj) { + try { + const { emails = [] } = globalState.getState(); + globalState.setState({ emails: normalizeEmails([emailObj, ...emails]) }); + } catch (e) { + console.error('Error in updateEmailReceived:', e); + } +} + +/** + * Mark email read in state by id + * @param {string} emailId + */ +function updateEmailRead(emailId) { + try { + const { emails = [], selectedEmail = null } = globalState.getState(); + const updated = emails.map(e => (e && e.id === emailId ? { ...e, read: true } : e)); + globalState.setState({ + emails: updated, + selectedEmail: selectedEmail && selectedEmail.id === emailId ? { ...selectedEmail, read: true } : selectedEmail + }); + } catch (e) { + console.error('Error in updateEmailRead:', e); + } +} + +/** + * Remove an email from the local phone state after server delete succeeds + * @param {string} emailId + */ +function updateEmailDeleted(emailId) { + try { + const { emails = [], selectedEmail = null } = globalState.getState(); + globalState.setState({ + emails: emails.filter(email => email && email.id !== emailId), + selectedEmail: selectedEmail && selectedEmail.id === emailId ? null : selectedEmail + }); + } catch (e) { + console.error('Error in updateEmailDeleted:', e); + } +} + +// Debounce variables for notes requests +let lastNotesRequest = 0; +const NOTES_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests notes from the server (Arma 3) with debouncing + */ +function requestNotes() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastNotesRequest < NOTES_REQUEST_COOLDOWN) { + console.log('Notes request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::notes", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastNotesRequest = now; + console.log('Requested notes from server'); + } else { + console.warn('A3API not available, cannot request notes'); + } +} + +/** + * Loads notes into the global state (called by Arma 3) + * @param {Array} notes - Array of note objects from the server + */ +function loadNotes(notes) { + try { + if (Array.isArray(notes)) { + // Sort notes by updated date (newest first) + const sortedNotes = notes.sort((a, b) => { + const dateA = new Date(a.updatedAt || a.createdAt); + const dateB = new Date(b.updatedAt || b.createdAt); + return dateB - dateA; + }); + + // Update global state with loaded notes + globalState.setState({ + notes: sortedNotes + }); + console.log(`Loaded ${notes.length} notes from server:`, notes); + } else { + console.warn('Invalid notes data received:', notes); + } + } catch (error) { + console.error('Error loading notes:', error); + } +} + +/** + * Saves a note to the server (Arma 3) + * @param {Object} note - Note object to save + */ +function saveNote(note) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::note", + "data": note + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved note to server:', note); + } else { + console.warn('A3API not available, cannot save note'); + } +} + +/** + * Deletes a note from the server (Arma 3) + * @param {string} noteId - ID of the note to delete + */ +function deleteNote(noteId) { + if (!noteId) { + console.error('Cannot delete note: no ID provided'); + return; + } + + try { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::note", + "data": { id: noteId } + }; + A3API.SendAlert(JSON.stringify(alert)); + } else { + console.warn('A3API not available, cannot delete note. A3API type:', typeof A3API); + if (typeof A3API !== 'undefined') { + console.log('A3API object:', A3API); + console.log('A3API.SendAlert available:', !!A3API.SendAlert); + } + } + } catch (error) { + console.error('Error in deleteNote function:', error); + } +} + +// Debounce variables for events requests +let lastEventsRequest = 0; +const EVENTS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Request events from the server (Arma 3) with debouncing + */ +function requestCalendarEvents() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastEventsRequest < EVENTS_REQUEST_COOLDOWN) { + console.log('Events request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::events", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastNotesRequest = now; + console.log('Requested events from server'); + } else { + console.warn('A3API not available, cannot request events'); + } +} + +/** + * Loads calendar events into the global state (called by Arma 3) + * @param {Array} events - Array of calendar event objects from the server + */ +function loadCalendarEvents(events) { + try { + if (Array.isArray(events)) { + globalState.setState({ + events: events + }); + console.log(`Loaded ${events.length} calendar events from server:`, events); + } else { + console.warn('Invalid calendar events data received:', events); + } + } catch (error) { + console.error('Error loading calendar events:', error); + } +} + +/** + * Saves a calendar event to the server (Arma 3) + * @param {Object} event - Event object to save + */ +function saveCalendarEvent(event) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::event", + "data": event + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved calendar event to server:', event); + } else { + console.warn('A3API not available, cannot save calendar event'); + } +} + +/** + * Deletes a calendar event from the server (Arma 3) + * @param {string} eventId - ID of the event to delete + */ +function deleteCalendarEvent(eventId) { + if (!eventId) { + console.error('Cannot delete calendar event: no ID provided'); + return; + } + + try { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::event", + "data": { id: eventId } + }; + A3API.SendAlert(JSON.stringify(alert)); + } else { + console.warn('A3API not available, cannot delete calendar event.'); + } + } catch (error) { + console.error('Error in deleteCalendarEvent function:', error); + } +} + +// Debounce variables for world clocks requests +let lastWorldClocksRequest = 0; +const WORLD_CLOCKS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests world clocks from the server (Arma 3) with debouncing + */ +function requestWorldClocks() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastWorldClocksRequest < WORLD_CLOCKS_REQUEST_COOLDOWN) { + console.log('World clocks request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::clocks", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastWorldClocksRequest = now; + console.log('Requested world clocks from server'); + } else { + console.warn('A3API not available, cannot request world clocks'); + } +} + +/** + * Loads world clocks into the global state (called by Arma 3) + * @param {Array} worldClocks - Array of world clock objects from the server + */ +function loadWorldClocks(worldClocks) { + try { + if (Array.isArray(worldClocks)) { + // Update global state with loaded world clocks + globalState.setState({ + worldClocks: worldClocks + }); + console.log(`Loaded ${worldClocks.length} world clocks from server:`, worldClocks); + } else { + console.warn('Invalid world clocks data received:', worldClocks); + } + } catch (error) { + console.error('Error loading world clocks:', error); + } +} + +/** + * Saves a world clock to the server (Arma 3) + * @param {Object} worldClock - World clock object to save + */ +function saveWorldClock(worldClock) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::clock", + "data": worldClock + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved world clock to server:', worldClock); + } else { + console.warn('A3API not available, cannot save world clock'); + } +} + +/** + * Deletes a world clock from the server (Arma 3) + * @param {string} clockId - ID of the world clock to delete + */ +function deleteWorldClock(clockId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::clock", + "data": { id: clockId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Deleted world clock from server:', clockId); + } else { + console.warn('A3API not available, cannot delete world clock'); + } +} + +// Debounce variables for alarms requests +let lastAlarmsRequest = 0; +const ALARMS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests alarms from the server (Arma 3) with debouncing + */ +function requestAlarms() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastAlarmsRequest < ALARMS_REQUEST_COOLDOWN) { + console.log('Alarms request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::alarms", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastAlarmsRequest = now; + console.log('Requested alarms from server'); + } else { + console.warn('A3API not available, cannot request alarms'); + } +} + +/** + * Loads alarms into the global state (called by Arma 3) + * @param {Array} alarms - Array of alarm objects from the server + */ +function loadAlarms(alarms) { + try { + if (Array.isArray(alarms)) { + // Update global state with loaded alarms + globalState.setState({ + alarms: alarms + }); + console.log(`Loaded ${alarms.length} alarms from server:`, alarms); + } else { + console.warn('Invalid alarms data received:', alarms); + } + } catch (error) { + console.error('Error loading alarms:', error); + } +} + +/** + * Saves an alarm to the server (Arma 3) + * @param {Object} alarm - Alarm object to save + */ +function saveAlarm(alarm) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::alarm", + "data": alarm + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved alarm to server:', alarm); + } else { + console.warn('A3API not available, cannot save alarm'); + } +} + +/** + * Deletes an alarm from the server (Arma 3) + * @param {string} alarmId - ID of the alarm to delete + */ +function deleteAlarm(alarmId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::alarm", + "data": { id: alarmId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Deleted alarm from server:', alarmId); + } else { + console.warn('A3API not available, cannot delete alarm'); + } +} + +/** + * Toggles an alarm on/off on the server (Arma 3) + * @param {string} alarmId - ID of the alarm to toggle + */ +function toggleAlarm(alarmId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::toggle::alarm", + "data": { id: alarmId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Toggled alarm on server:', alarmId); + } else { + console.warn('A3API not available, cannot toggle alarm'); + } +} + +// Handle any uncaught errors +window.addEventListener('error', (event) => { + console.error('Uncaught error:', event.error); +}); + +// Export the initialization function and all API functions to global scope +window.initializeApp = initializeApp; +window.setTheme = setTheme; +window.requestContacts = requestContacts; +window.loadContacts = loadContacts; +window.refreshContacts = refreshContacts; +window.updateContacts = updateContacts; +window.setPlayerUid = setPlayerUid; +// Messages +window.requestMessages = requestMessages; +window.updateMessages = updateMessages; +window.updateMessageThread = updateMessageThread; +window.updateMessageSent = updateMessageSent; +window.updateMessageReceived = updateMessageReceived; +window.updateMessageRead = updateMessageRead; +window.updateMessageDeleted = updateMessageDeleted; +// Emails +window.requestEmails = requestEmails; +window.updateEmails = updateEmails; +window.updateEmailSent = updateEmailSent; +window.updateEmailReceived = updateEmailReceived; +window.updateEmailRead = updateEmailRead; +window.updateEmailDeleted = updateEmailDeleted; +window.requestNotes = requestNotes; +window.loadNotes = loadNotes; +window.saveNote = saveNote; +window.deleteNote = deleteNote; +window.requestCalendarEvents = requestCalendarEvents; +window.loadCalendarEvents = loadCalendarEvents; +window.saveCalendarEvent = saveCalendarEvent; +window.deleteCalendarEvent = deleteCalendarEvent; +window.requestWorldClocks = requestWorldClocks; +window.loadWorldClocks = loadWorldClocks; +window.saveWorldClock = saveWorldClock; +window.deleteWorldClock = deleteWorldClock; +window.requestAlarms = requestAlarms; +window.loadAlarms = loadAlarms; +window.saveAlarm = saveAlarm; +window.deleteAlarm = deleteAlarm; +window.toggleAlarm = toggleAlarm; + diff --git a/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png b/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png new file mode 100644 index 0000000..099df57 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png differ diff --git a/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png.b64 b/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png.b64 new file mode 100644 index 0000000..6902876 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/bg/bgdark_01_ca.png.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/bg/bgdark_02_ca.png b/arma/client/addons/phone/ui/_site/images/bg/bgdark_02_ca.png new file mode 100644 index 0000000..3120d25 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/bg/bgdark_02_ca.png differ diff --git a/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png b/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png new file mode 100644 index 0000000..cb171bd Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png differ diff --git a/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png.b64 b/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png.b64 new file mode 100644 index 0000000..533f0f1 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/bg/bglight_01_ca.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAgAAAAQACAYAAACXqOHAAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+kGBxIXAYIu7u0AACAASURBVHgBABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZYDDowAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABakPsKAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuy/MMAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyH+njAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACox2tYAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7iQNkAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXVPEKAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACi3XrTAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6kRFoAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/2xv3wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjyvctAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyweDQAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLm3iwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX3XHYAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnVOAUAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7TqaDAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9yqnWAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbmdIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf0r5AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARY3AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9nIKwAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANo8SmgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYsWR6AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIG/89QAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtpTTuAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPRyjAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRixZ8AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIea+jgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKeEvXAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE3xLykAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+VY89QAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqEwQhAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKADpKYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4QUeAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiRZMYAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFOHoQAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3CbqtgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABz+lpOAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPIqUAAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3/0pAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8u+E3AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSPoX8AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjOp4rwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLX/uZAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPW3GEgAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuTgEWQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdbq+6AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1M2CsAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZsh1wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKOXWlAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRfMdoAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw5gAoAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOG4W+AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPTGE84AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7pqQRwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxn5mPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIRoLMAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn3MOrgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7NgepAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzXLhAAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf47ZtQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLdD5cAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzMOkUAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzOHtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkr/ZAMng7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJK/2QDc6fIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50uUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA04NQ5wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQJAAAECQDP6PgAmMLfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzOHwAMzh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJjC3wDM4fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM4e8A/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDQIhpAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAD3AAAAAAAAAP0A/QDA3e0A+v36AG5BJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AP0A/QD9AAAAAAAAAAAAyeDtAMng7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJK/2QDJ4O0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gD9AAAAAAD+AP0AAAAAAAAAAADJ3+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbcQPMAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB/QAFAQAAAwH9AAUDAwAABAkAAAQJAMnk9gCmw98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAAAAAAAAAAAAAAAAAAAAAAC14PAAncXfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwAAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz+LwAM/i8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ3F3wDP4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwYoMKAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAADAQAAAwEAAAMBAAADAQAA+AAAAPgAAADJ4+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwIAAAMCAAADAgAAAAAAAAAAAADM4vAAmMXfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/QAAAv0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzOLwANHl8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/0AAAL9AAAC/QAAAAAAAAAAAAMBAAADAQAAAAAAAAAAAAAAAAAAAAAAAKPK3wDR5fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuTo3vAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBAAACQQAAAkDBgAJAAkACQMGAAkDBgAGAwAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj8AACbxt8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAncffAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAADAQAAAwEAAAMBAAADAwAAAwMAAAMDAAADAwAAAwMDAAUFBQAFBQUAAwMDAAAAAAAAAAAAz+TwAM/k8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAACAgAAAgIAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAAAAAAAAAAAAAJ3H3wDf6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHY72RYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgACAgIAAMBCAADAQgAAwEIAAMBCAAFAQAABQEAAAUBAAAFAQAABQQAAAMC/gADAv4AAwL+AAADCAAABQgAAAMIAAADCACVy+cA0ebyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABQAAAAUAAAAFAAAABQUAAAUFAAAFBQAABQUAAAICAAACAgAAAgIAAAICAAACAAAAAAAAAAIAAAACAAAAAAAA0ufzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAA0ebyAKPN5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAANHm8gDR5vIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAWargAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAAAAAAAAAAAADAAAAAAAAAP0AAAAAAAAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAEAAAAAAAAAAAAALTZ7QADAwMALBcLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAAAAAAAAAMAAAADAwAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAwQDAAMEAwADBAMAAwQDAAAAAAAAAAAAAAAAAPX7+wDU6fUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAMDAAADAwADAwAAAwMAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAgQCAAYDAwAGAwMABgMDAAAAAADU6fUAqNLqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAACAP0AAAAAAAAAAAADAwAA/QACAAAAAAAAAAAAAAAAAAAAAAAAAAAABQICAAAAAAD9/wAA1On1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZzlchAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAAAAAAAAP37AAAAAAAAAAAAAAAAAAAE/gAAAAAAAP/9AAABAwAA/wAAAAAAAAAAAAAAAwMAAwEDAAAAAAAAAAAAAAAAAAP/AwAAAAAAAwIAAP3+AAARCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAP7+AAAAAAAAAgIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAABAwAAAQMAAAICAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAADAgAAAwIAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf8fgAvuLvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAABAwAAAQMAAAEDAAABAwAAAgIAAAICAAACAgAAAAAAAwIAAAMCAAADAQAAAwEAAAMDAAADAwAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3/H4AN/x+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJh5I8AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAIBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMACQkJAMfr+AADAwMAHgwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAAAAAAMDAAADAwAAAwMDAAUFBQAFBQUAAwMDAAMDAAAFBQAABQUAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADE6PUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAMDAwADAwMAAwMDAAUFBQACAgAABQUAAAICAAACAgAAAgICAAAAAAAAAAAAAgICAAICAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxOj1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAIAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAMDAwAAAPsAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAA+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4vT7AMTo9QA8GAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAij9lhAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDCAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAACAgAAAAAAAAAAAAAAAAAAOr8+wDf9PgAIQwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf9fsACwQFABYIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAICAAACAgAABQMAAAUDAAAFAwAABQMAAAUDAAACAgIAAgICAAAAAAACAgIAAgIAAAICAAACAgAAAgIAAAICAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw+/0A1PD7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAAAD9AwMAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTw+wAsEAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiQ0+UAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAkAAAAAAAD++wMAAAAAAAAAAAAAAAAAAgD9AAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAsGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAgAIBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAA4vj9ABP4AgAZCAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAP4AAAAFAwMAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA+/79AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAAAAAA/f8AAAAAAAAAAAAAAAAAAM/w+wAAEAAAGQgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQMAAAAAAAAAAAAAAAAAAwEAAAAAAAD9/f0AAwMDAAAAAAAGAwMAAAAAAAAAAAAAAAAAAAAAAPr8/QAAAAAABQMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAP4AAAAAAAD9/wAAAAAAAAAAAADP8PsAGRgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBAMAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAwMAAP3/AAD9/QAAAAAAAAAAAAAAAAAAz/D4ADEQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJ3AlwAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQgJAAAAAAD4/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAD8AAAAAAAABQQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwAQCAMAAAAAAPj8+AAAAAAAAAAAAAMBAAADBAAAAAAAAAAAAAAAAAAA9wAAANn1+wAnCwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAMAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQMAAAAAAP3//QAAAAAAAAAAAO37/QDt+wIAEwUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgQCAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP38/QAbCwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUDBQAAAAAA/v7+AAAAAAACAgIA/v7+AAUDBQAAAAAAAAD7AAAAAADZ9fsAOhADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv8/QAAAAAABQQDAP38+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAwAAAAAAAAIAAAAAAAAAAAAAAgICAAAAAAADAQMAAAD7AAAAAAAAAAAA2fX7ACcLBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAujFfKQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAwIAAAAAAD4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQMDAAAAAAD+/v0A/f8AAAAAAAAAAAAAA/8AAAMDAwAAAAAAAP8AABAMCAD1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAJBAAAAAAAAPf8AAAAAAAAAwEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA7fsAAN/4AAAhCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAwAAAAAAAP7+AAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAACAgAAAgAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P0AAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEAAAAAAAAAAAAAAYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAPD8AADw/AAAEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQAAAAAAAAMDAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAYCAgAAAAAAAAAAAPr+/gADAQAAAAAAAAAAAAD9/wAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD8AADv/AAAAAAAAAAAAADw/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAOX7AAAAAAAAAAAAAAAEAAAAAAAADgEAAAAAAAANAgAADgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAP78AADf+AAAIQgAABAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYCAgD9//0AAAAAAAAAAAADAQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1/QAA6vsAAAAAAADw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8v8AAAAAAADy/QAA5QAAAAAAAAAOAQAAAv8AABEDAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAAAAAAAA+v0AAAYDAAAAAAAAAAAAAAAAAAD6/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7/wAABAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fgAAPL8AAAGU7AAAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAAAAAAA//sAAAAAAAAAAAAAAAAAAAEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF//4AAAAAAAAAAAAAAAAA/gEAAAAAAAAAAAAAAAAAAAIABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw/AAA7/wAAPD8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAgIAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAP3/AAADAQAAAAAAAAAAAAAAAAAA/f8AAAMBAAD1AAAA/QAAAPD9AAAAAAAACAQAABYAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAABgQAAAAAAAAAAAAAAAAAAAAAAAAGBAAAAAAAAAAAAAAAAAAAAAAAAP0DAAAAAAAA9QAAAN8AAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAPgAAAAAAAAAAPz4AAAAAAADAwMA/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcECAAAAAAAEQQAAPgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAP8AAAAAAAAAAAAAAwMAAAD+AAAAAAAAAAAAAP3/AAAAAgIAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy/QAA7fsAAPD8AAAAAAAAAAAAAAAAAAAAAAAAAwMAAAAAAAD9AAAAAAAAAAMAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAADAQAAAAAAAAICAAAAAAAA/v4AAAMBAAACAgAAAAAAAAAAAAD+/gAAAwEAAAICAAAAAAAAAP4AAAAAAAAAAAAA/f8AAOoBAAAAAAAACwAAAAsAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAICAAD+/gAAAAAAAAMBAAAAAAAAAAAAAPv9AADqAwAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAAAAAAD+/v4AAwMDAAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAMDAwAAAAAAAAEAAAIEAgAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAwIAAAAAAAD9/gAAAAAAAAMBAAD9AAAAAAICAAAAAAAAAAAABf8AAAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8v0AAOX7AAAAAAAA+PwAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAMBAAACAgAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAADAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QAAAPUAAAAGAAAADQAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAQAAAAAAAAIDAAD7/wAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAMBAAAAAAAAAAAAAAAAAAD1AAAA9QAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAD+/v4AAwMDAAAAAAAAAAAAAgICAAAAAAADAwMAAAQAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMAAP39AAADAwAAAAAAAwEAAAAAAAADAwAA/f0AAAAAAAADAgAAAAAAAAAAAAD9/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOr7AADt/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAwMAAAAAAAD9/QAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAICAAADAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8wAAAPMAAAANAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAQAA+/8AAAAAAAADAQAA/f8AAAMBAAAAAAAA/f8AAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6gAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQazP4AACAASURBVBAEAAAAAAAA+AADAAAAAAAAAAAAAAAAAAAAAAADAwMA/f39AAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCAAAAAAAAP38AAAAAwMAAAAAAAAAAAADAwAAAAAAAAAAAAADAwAAAAIAAAD+AAAAAAAAAAAAAAYAAwAAAAAAAAAAAAAAAAAAAQAA/QAAAAAAAAAAAAAACQAAAPb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD9AADv/gAA8P0AAAMAAAACAAAAAAAAAAAAAAAIBAAAAAAAAAAAAAAAAQAAAP8AAAADAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAP8AAAAAAAAAAwAAAPUAAAD4AAAACwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPoDAAAAAAAABQAAAP4AAAD9AQAAAAAAAAAAAAADAQAAAP8AAAABAAADAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAA5QAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGA/sA8v39AAAAAAAFAQUAAAAAAAAAAAAAAAAA+/8DAAAAAAADAAAAAAAAAAAA+wAA/fsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+PwAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAAAAAAAAAAAAAAAAD+AAAAAwAAAP0AAAAAAAAAAAAAAAACAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAD9AAAAAwAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4/QAA5/4AAPD9AAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAA/QAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAACAAAA/gAAAAAAAAAAAAAAAwAAAP0AAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QAAAPUAAAALAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPIAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/sAAwMDAP39/QAAAAAAAAEAAAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAD9/QAAAAAAAP7+AAD9/QAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAgAAAAAAAAAAAAAA/QAAAAD+AAAAAAAAAAAAAAAAAAD9/wAAAAAAAAMBAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3/gAA8P0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAADAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAA/QAAAAAAAAADAAAAAgAAAP0AAAD9AAAA/QAAAAMAAAAAAAAA/QAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1AAAA+gAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAP0AAAADAAAAAAAAAP3/AAAAAQAAAAAAAAAAAAADAAAAAgAAAP4AAAAAAAAAAgAAAAMAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAPMAAAAGAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy/f0AAAAAAAAAAAAFBQUAAAAAAAAAAAD9/f0AAPv7AAAAAAAAAwMAAAAAAAACAAAA/gAAAAIAAAD+AAAAAgAAAAAAAAICAAACAgAA+/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBQAA8AAAAPD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAA/gAAAAAAAAACAAAAAwAAAAAAAAAAAAAA/QAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+wAAAAAAAAD4AAAAAAAAAAAAAAAAAAAACAAAAOcAAAARAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAIAAAAAAAAAAAAAAP0AAAD+AAAAAAAAAAMAAAAAAAAAAAAAAAAAAADvAAAAEQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOPMpgAAIABJREFUAAAAAAAOAwMA8v39AAAAAAD+/v4AAAAAAAAAAAAAAAAAAAMDAAD9/QAAAAAAAAAAAAD+AAAAAAAAAP4AAAACAAAAAAAAAwMAAAAAAAAAAAAACQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAAAAD/AAAAAAAAAAAAAAD+AAD9AAAAAAAAAAAAAAAA/gAAAAAAAAACAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAADAwAAAAAAAP39AAAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQUAANf9AAAAAAAAAAAAAAAEAAAA/QAAAAAAAAADAAADAQAAAgIAAP7+AAAAAAAAAgMAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAAAAAAA/gAAAP0AAAADAAAAAgAAAAAAAAD+AAAAAAAAAP0AAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAwAAAAAAAAAAAAAAAAAAAPsAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvAAAAAAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAP3+wAAAAAA/QkFAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAD9AAAA/QAAAAAAAAAAAAAABQAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAD+AAAA7QAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAQAA+gD9AAAAAAAABQAA/f0AAAAAAAAAAAAAAP79AAACAAAAAP0AAAAAAP3/AAAAAAAAAAAAAAD/AAALCAgAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAA+PwAAAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAACAAAA/gAAAAAAAAAAAAACAgAAAAAAAAAAAAD+/gAAAAAAAAAAAAADAQAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsFAADl+wAAAAAAAAD9AAAAAwAAAAAAAAAAAAACAgAAAAAAAAICAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAA/QAAAAAAAAAAAAAA/QAAAP0AAAAFAAAAAgAAAAIAAAD+AAAA/gAAAAIAAAACAAAAAAAAAAIAAAD+AAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAwAAAAIAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLx+AAeDwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAA+wAAAAMAAAAAAAAAAAAAAP0AAAADAAAA/gAAAAIAAAAAAAAAAAAAAPIAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv/PoAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADi4ucAAAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAJx4ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1/wAACwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4DAAAAAAAA5fsAAAAAAAAA/QAAAAMAAAAAAAD+/gAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAAAAAAAA/QAAAP0AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAD9/wAAAAAAAP7+AAD9/P0ACAcDAAAAAAD4+f0A8vj4AAAAAAAAAAAA6/H1AAgABQDi8fcAPB4RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOr2+gAAAAAABQAAAA4JBQAAAAAAAAAAAP39AAD+/gAAAgIAAP39AAADAwAAAAAAAAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPMAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6u0AAAAAAOrr7AD4+P4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJx4ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAADAwAAAAAAAP39AAAAAAAAAAAAAAMDAAD9/QAAAAAAAAMBAAAAAAAAAAAAAAAAAAD9AAAAAgIAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f8AAOL9AAAAAAAAFgMAAAsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAwAA8/4AAPL8AAAAAAAAAP4AAAACAAD9AwAAAAAAAAMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAA/QAAAAMAAAAAAAAA/QAAAP3/AAAAAAAA/v4AAAAAAAAAAAAA+Pn9APf6/gD4+f0A9vb1AAAAAADq8fUAAAAAAAAACAAAAAAAptPnADweEQAeDwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOr3+wAAAAAAAPf7APMJBQAAAAAADQoGAAYBBQAAAAAAAAAAAAAAAAAAAgAAAwEAAP3/AAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAADAAAAAAAAAAAAAADzAAAAAwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRhLEEAAAgAElEQVQAAAAAAAAAAADw/PsAAAAAAAAAAAALAwMAAAAAAP39AAADAwAAAAAAAAAAAAD6+vcA+/n4APL2/gDq6+wA6urtAAAAAADw8PgAAAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAATTsxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP9AAAAAAAAAAAAAAABAAD9/wAAAAAAAAMDAAADAQAAAAAAAAAAAAADBAAA/f8AAAP/AAAAAAAAAAAAAP39AAADAwAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3PH1APsAAAAAAAAA9QgGAAsIBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwUAAPT4+wDt+f0AEwcDAAAAAAD4BAIAAAAAAAYFAwD9/QAAAwQAAAAAAAAAAAAAAAAAAAIAAAAAAAAA/gAAAAAAAAD9AAAAAAAAAAAAAAAA/wAA/QEAAAAAAAAA/QAAAP8AAAADAAAAAQAAAP8AAAAAAAD7AAAAAv4AAAAAAAD+AgAABQEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAP0AAAAAAAAAAAAAAPv8AAAAAAAAAAAAAAAAAADv9PsAAAAAAPL19QDz9fUA+/39APr9AAD7/gAA+v0AAP79+AAAAAAAAAAAAL7d5wBYLiEAAAAAAAAAAAAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAOfr7wAAAAAAAwMDAPUHAgALBwMA8vMAABEKDgAQDgsA/f0AAAAAAAD9/vsAAwcFAAMBAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAD+AAD9AAAAAwMAAAAAAAD9/wAAAAAAAAABAAAAAAAA8P0AAAsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD95O8AAAAAAAAAAAD1FBEAAAAAAAAAAAAAAAAAAPz3AAAAAAAAAAAA4uTtAOzn6gDw9fsA7/b6APD1+wADBAAAAAAAAAAAAAAAAAAA/fwAAAAAAAAAAAAAAPT4AAAQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAACAAAA/v4AAAAAAAAFAwAAAAAAAAAAAAD9/wAAAP4AAAD/AAAAAAAAAgIAAAICAAD+AAAAAAAAAAAAAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ8PUA7fj7AA4IBQAAAAAA6vj6AAAAAAAWCAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcNBQDG+f0A7fn9AAAAAAAG/gAAAAAAAAAAAAAGBQMA+/v9AAAAAAAFBQMAAAAAAAAAAAAAAAAAAgAAAP4AAAAAAAAAAP8AAAAAAAAA/gAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD+AAACAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7fHyAAAAAAD0+PsA8/X1AAAAAADy9fUA+AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP6AAC52uUARyYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fn9APX5/QALB/4AAAAAAAD99QAAAAAAAAAAABAOCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAAADAgAAAP4AAAACAAAAAAAAAAAAAOX9AAAbAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM198AAAAAAAAAAAAbIfsAHBwWAAAAAAAAAAAA4uTtAAAAAADh4+0AAAAAAOrv9QDw9fsAAAAAAAAAAAAAAAAAAAAAAAAAAAD6/AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQAAAAAAAAAAAAAAAAAAAwMAAP3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAADAwAAAAAAAAAAAAAA/wAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnw9QDt+PsAAAAAAOr4+wAAAAAAAAAAAOr4+wAvEAsAEwgFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnDQUA2fP7AAAAAAD6+/0AAAAAAAAAAAAAAAAAA/7+AAYGAgD7+/0ABQUDAP4AAAACAAAAAAAAAP0AAAAA/QAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAP4AAAD/AAAAAQAAAAAAAAAAAAAC/gAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3/AAAAAAAAAwAAAAAAAADy9/gAAAAAAPP2+gAAAAAA7PHzAAAAAADt8fIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc7fIAANoAAEcmGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1+f0ACwcDAPDy9QDw8vUAEA4LAAAAAAAQDwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAD9/QAAAAAAAAAAAAAA/QAAAAAAAAD9AAAAAAAA8gAAAAAAAAAA/QAAGwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzNjfAAAAAAAABAYAAAAAAAAAAADl4+oA+vz9AAAAAADi5O0AAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAAAAAAAAA/f8AAP7+AAAAAgAAAwEAAP3/AAD7/QAAAAAAAAD/AAAAAAAAAAAAAAAAAAD7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/wAA3PH1AO34+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ8PUAJxALABMIBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATBwMAE/r+AO35/QAAAAAAAAAAAPr7/QD6+/0ACQQAAAAAAAAGBgIAAAAAAAAAAAAAAAAAAAAAAAMAAAD9AgAAAP4AAAAAAAAAAAAAAAAAAAACAAAA/gAAAAAAAAD+AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/0AAAAAAAAAAAAAAgIAAP7+AAD9/wAA9ff4APP29wAAAAAA8vf4APr6/gDt8fIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3O3yAADaAABHJhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fn9AAYEAAAAAAAA8PL1AAAAAAD/AvsACPoFAAkGBgAIBwUAAAAAAAAAAAAAAAAAAAAAAP39AAAAAAAA+/sAAAMDAAADAQAAAAAAAAAAAAAAAAAAAAAAAAAAAADy/wAADf8AAA4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUTYyYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OoA5OTqAAAAAAAAAAAA+PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAD4/AAAAAAAAAAAAAD9/QAA+wAAAAAAAAD7+wAAAAAAAP0B/QAA/QAAAAAAAP78/gD6/QIAAwMDAAAAAAAAAAAAAPz4AAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX8fsA6vj7AAAAAAAAAAAAAAAAAP0BBQAAAAAAAAAAAAAAAADw/wMA4vgAABMIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJw0FANf9/QDv/AAAAAAAAAAAAAAAAAAA9/wAAP8DAAAD/gAABQAAAAP7AAAAAAAAAAAAAAMAAAD9AQAAAAAAAAAAAAAAAAAABgEAAAD+AAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAPv18gAAAAAAAAAAAAAAAAD1Aw4AAAAAAAAAAADy9PUA9fjyAO/1+wD4+v0AAAAAAAAAAAD7AQgAAAAAAAICAAD+/gAA/f8AAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAACAAAAAAAA/v4AAAAAAAAABAgAAAAAANzx+gD93OcAUigZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj4AAAAAAAA/QMAAAMBAAAAAAAAAAAAAPX8/QAFAP4AAAAAAPDu7QDn8ggAEQwIABANCQARDAgACAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAD9AQAAAAAAAAD/AAAAAQAAAwL9AAAAAAAAAAAA6PwAAAMEAwALAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6+PsA9/P4AAAAAADoAPAAAAAAAAgICAAAAAAAAAQIAP3/AAAAAAAA/v4AAP8AAwAAAAAAAAAAAAAAAAD+//0AAAAAAAAAAAAAAAAA8vz4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv9AAAAAAAA+v4AAAAAAAAA/gAAAAAAAAMDAAAAAAAAAAAAAP39AAAAAAAA/f0AAAAA/gAAAAAA/fz9AAAAAAD9/wAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTw+wDq+P0A/QEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5/j9AADwAAAxEAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkQCADG7PgAAAAAAAAAAAAAAAAAAAAAAPj5/QAAAAAAAAAAAPj/AwAOAwAA8v0AAAAAAAAIBAAAAAAAAAsBAAALAgAACwEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1/wAA9f4AAPX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy9PUA8/P1AAAAAADy9PUA9wAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAP7+AAAAAAAAAwEAAAAAAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAD9/QAAAAAAAAAAAADf7/gAud3lAEcjGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAIAAAAAAAAAAAAAAAAA7/T4AO/0+ADwDAgAGREOAAAAAAAQDAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOr9AAAhBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39/cAAAAAAAAAAAAICAgA+/0AAAICAAAAAAAA/f8AAAIBAAAAAAAA+/76AAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgIAAPr+AAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAgIAAAD/AgAAAAAAAAAAAP38/QAAAAAA/f7+AAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6vj9AOr4/QAAAAAAAAAAAAAAAAD+AgIAAAAAAAL+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOf4/QAY+AIAGQgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnDQUA2fP7AAAAAAAAAAAAAAAAAAAAAAD4+f0AAAAAAAkFAwDy/QAADgMAAA0CAAAOAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAQAACwMAAAAAAAAAAAAA9f8AAOUAAAAAAAAA6vHzAOrx8gD4/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3/AAAAAAAAAAAAAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3O7yACMRDQAkEg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v4AAAACAAADAQAAAAAAAPoAAwAAAAAAAAAAAPoAAwAIAAAAAAAAAAAAAADv9PgA+Pj4AAAAAAAQDAsAEQ0LABAMCwAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq/QAAFgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39wAAAAAAAAgIAAIAAAD+/gAAAAAAAPv++gAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+/gAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr+AAAAAAAAAAAAAAAAAAAAAAAA/f0AAP7+AAAAAAAA/f0AAAMDAAACAgAAAAAAAAAAAAAAAAAAAAAAAAMEAwAD/QIA/f7+AAAAAAADAgIAAP/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1PD7AAAAAAAAAAAAAAAAAP4CAgAC/v4AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8PsAAxADABYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATBwMAJwAAANnz+wAAAAAAAAAAAAAAAAAAAAAAAAAAAA4DAAAbBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwEAABYPDgAAAAAAAAAAAAAAAADi7foAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v4AAAAAAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gIAAAX/AAAAAAAA/f8AAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAALnd5QAAAAAAJBIOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/wAAAAAAAAMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw9PUAAAAAAPf48gARDREAAAAAAAgHCAAAAgAAAP0AAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1/wAA6v0AABYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApNHqwgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PgAAAAAAAAAAAAAAAAACQgQAP7+AAD9/wAAAAAAAAAAAAD6/fsABgMFAPr9+wAD/wMAAAAAAP39/QAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL5+wAAAAAAAAcFAAAAAAD6+/0AAAAAAPv9AwAAAAAAAAAAAP39/QAAAAAAAAADAP39AAAAAAAAAAADAAAAAAD9/wAA/f7+AAD++wAAAAAAAAAAAP3+/QADAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/wAAAAA/0AAAAAAAAAAAADAAIAAwAAAAACAgAA/v4AAAL+AAAAAAAAAAAAAAAAAAP+/gAAAAAAAAAAAAAAAADU9AAAQggIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATBwMAE/r+AO35/QAAAAAAAAAAACcNBQATBwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQDw4AJg8OAN8O9QDf7/UA3/D1AAAAAAAAAAAAAAAAAAAAAAAAAAAA+wAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAD+AQAAAAAAAAAAAAAAAAAA+wEAAAL+AAAAAAAAAgIAAAD+AwAAAAAAAgL6AAAAAAAAAAgAAAAAAN3v+AAkEg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj8AAAAAAAA+AD4AAAAAAADAAMA/v4AAAAAAAAAAAAAAwMFAAAAAAAA/wAAAAEAAPv9AwACAgIAAAAAAAAAAAD3/PsABgEAAAAAAAD49PUA/goIAPb57wANCQkAAP8AAAgICAAAAAAAAP8AAAD9AAD9APsAAAAAAAAAAAAAAAAABQQDAAAAAAD1/wAA3/wAACEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv19QD48PAAAAAAAP0HBQAAAAAAAwUDAPj4+AD77e0ABQsLAAAAAAAAAAAAAAQIAAAAAwD6/QAAAAADAP39+AAAAAAA/f8AAAAAAAD7+AAAAAAAAAAAAAAAAPgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO37/QATBQMA+vv9AAAAAAD7+v4AAAAAAAAAAAAAAAAAAAAAAP3+/gAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAD9/v4A/f/9AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2fP7AO/7+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAP7+AAAAAAAAAAAA1PP7ACwNBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJw0FANkAAAAAAAAAJw0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEQCwAhEAsA3/D1AL7f6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP4AAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC+gAAAAAAAAAAAAAAAAAAAAAAAAAAANzu9QAAAOoARyMWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAQAAAAAAAAAAAAD+/v4AAgICAAAAAAAAAAAA+v8AAAYBAAD6/wAA+Pb4AA4KCADz9/cAAAAAAP3/AAAAAAAACwkIAAAAAAAAAAAAAAAAAAAAAAAAAAAA5ebtAAAAAAAAAAAAAAAAACEeEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP76/gAAAAAAAAAAAAAAAAD9+/UAAAAAAAULCwAAAAAAAAAAAP36+AAAAAAAAAAAAAABAAAAAAAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt+/0ABgEAAAAAAAAAAAAAAAAAAP3+/gADAgIA/f7+AAAAAAAAAAAA/f7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEDAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt+f0A7fn9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAD+AAAAAAAAAAAAAAAAAAABAwAA//0AAAICAAAAAAAAAAAA6vn9ANQAAAAsDQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcNBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRALAGMxIQC+3+oA3/D1AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc7vUALBT4ABsPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AAICAgAAAAAAAAAAAPr/AAAA/gAAAwMAAPL2+AAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAD19e8AAAAAAAAAAADq6/AA/foCAAAAAAAAAAAAAAAAAK7l5wBSOSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9+/0AAAAAAAAAAAD9+/UAAAAAAAAAAAAAAAAAAgkAAAAAAAAAAAAAAAAAAAAAAAD+/gAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv9AAAAAAAAAAAAAAAAAAMDAwD9/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ8/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAOr5/QDqBgIAFgcDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCIRYAvt/qAN/w9QAAAAAAAP4AAAD/AAAAAAAAAAAAAAACAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyeLvAFItGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/wUAAAAAAAD/AAAAAAAAAAEAAP3//QAAAAAAAwEDAAAAAAAAAAAAAAAAAAAAAAD6/wAACQAAAAAAAAAAAAAA8vb4AAL/AAAAAAAA9ff4AAAAAAD18/AAAAAAAOrs7wAAAAAA+PQAAAAAAAAAAAAAAAAAAPj8+ACux9QAUjksAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvvx3VAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP37/QAAAAAA/fv9AAAAAAAAAAAA+/X1APv19QAFCwsAA/76AAMGCAAAAAAAAgUJAPv9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAA/QD9AAAAAAAAAAAAAAAAAAD+AAAAAgAAAAAAAAAAAAADAQMAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP/9AAABAAAAAAAAAAAAAAD/AAD3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnz+wAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAAEFAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAADc8/sAAwAAABMHAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQiEWAN/w9QC+3+oAAP8AAAAAAAAAAAAAAAAAAP3/AAAAAQAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAA/v/+AAAAAAAC/gIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5/j4ALnd6gBHIxYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAAAAAAAAAAAAAAAACAAIAAAAAAAAAAAD9Af0AAwADAAAAAAAAAAAAAP8AAAAAAAAAAgAA/QD9AP3+/QADAwAAAAAAAAAAAAAAAAAA9/wAAAAAAAAAAAAAAAAAAADz+ADy8/gAAAAAAAAAAAD19e8A+Pj9APf4/gAAAAAAAAAFAAAAAAD9/f0AAAAAAPv7AADG2OoAIxnqAC8gFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX4+gDw9PcAAAAAAAMEAwAAAAAAAAAAAAAAAAD9AP0AAAAAAAAAAAD48fcAAPgOAAgKAwAICw4A/fkAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//0AAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO35/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAgICAAICAgAAAAAAAAAAAAIAAAD9AAAA7Pr+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEQCwBCIRYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzu9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAA8vP1APLz+ADy8vcA5OXvAOTl7wDv8PsA9/j+AAAAAAAAAAAA/f39AP39/QD+/v4A/v7+AAAAAAAAAAAAo7/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr8+wD6/PsA+vz7APr8+wD9/f0A/f39AP39/QAAAAAA+PXyAPj28gD49fIA+PXyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9AAD//QAAAAAAAAAAAAAAAAAAAAAAAP4AAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2fP7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/gAAAAAAAgICAAICAgACAgIAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAA7fn9ANnz+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhEAsAYy0ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAC53eoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP4AAAAAAAD9/QAAAAAAAP39AAAAAAAAAAAAAPLz9QDy8/UA8/L1AOTl7wDy8/gAAAAAAAAAAAAAAAAAAAAAAPj4/QD4+P0A/v7+AP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAKO/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A/v7+AP7+/gD7+/sAAAAAAPj18gDw6+QA+PbyAPj49QD4+PUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAA/gAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAA7fn9AAAAAAAAAAAAAAAAAAIA/gACAP4AAgD+AAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAMAAAADAAAAAwAAAAICAgACAgIAAAAAAP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAABQGAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMtGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAMAAAAAAAAAAAAAAAAAAv4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/37AAP9+wAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAADc7vUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD+AAD+/gAA/f0AAP7+AAD7+wAA8vP1APPy9QDl5eoA8vP1AAAAAAAAAAAAAAAAAAAAAAD4+P0A+Pj9AAAAAAAAAAAA/f39AP39/QD9/f0A/f39AAAAAAAAAAAAAAAAANHg6gC2x98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVwx4sAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv8+gD7/PoA+/z6APv8+gD9/f0A/f39AP39/QD9/f0AAAAAAAAAAAAAAAAA+PXyAPDw6gD4+PUA+Pj1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAADAAAA/QAAAP3//QAA/wAAAP4AAAAAAAAA/wAAAAMAAAAAAAAAAAAA/v4AAAAAAAAAAAAAAAAAAP0AAwAC/voAAAAAAAAAAAAD/AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADe8/sAAAMAAAAAAAAAAAAAAP0AAAEBBQAAAAAAAAAAAAAAAAAAAAAAAAAAAP79AAABAAMAAgAAAAADAAAAAAAAAAAAAAMAAwAA/QAAAAAAAAMBAwAAAAAAAAAAAAAAAAAAAAAAIQwAABMHAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAABHIxYAud3qAAMAAAAAAAAAAAAAAAAAAAAA/wAAAwADAAAAAAAAAAAAAAIAAAD+AAAAAAAAAAAAAAD+/QAAAAAAAAEFAAAAAAADAP0AAAAAAAACAAAAAAAA/QADAAAAAAAAAAAAttjnAEooGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAAAAAD9AgAAAAAAAAAAAAAAAAAAAP79AAAAAAAAAwMAAAAAAAD/AAAAAQAAAAAAAAAAAAD9AAAA/f8AAPX0+AD18vcA/fv4APv7/QADAAUAAAAAAPj9AAAAAAAAAAAAAPv7+AAFAQAAAAAAAAAAAAAAAAAA+PwAAAAAAAAAAAAAAAAAAAD8+AAAAAAAAAAAAAAAAADR2tQADgr7ADwvJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv9+wD4/PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAP/9AAMBAwD9//0AAwEDAAD07wD9/foA+//6AAAA+gAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL++gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt+f0AAAAAAAD+AAAA/gAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATBwMAGQgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkEgsARyMWAAAAAAAAAAAAAAAAAAAAAAAA/QAAAP0AAAD+AAAAAAAAAAAAAAACAAAAAAAAAP8AAAD+/gAA/v4AAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3/P4AN/u9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9AAAD/QAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fP4APXy9wD18/gA9fX7APr6/gAAAAAA+vr+APv7+AD7+/gA+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw9DZAMTR2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAD9/QAA/f0AAP39AAD9/QAA/f0AAAAAAAADAwAA/f7+AP3//QAAAAAA/f/9AAAAAAD79/UA9e3qAPv39QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnz+wAAAAAAAP4AAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMHAwAnDQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBILAN3vCwDc7vUAAAAAAAAAAAAAAwAAAP4AAAD/AAAA/gAAAAIAAAD+AAAA/wAAAAEAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/v9QAhEgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0DAAAAAAAAAwEDAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pf4APf29wD7+AAAAAAAAPXz+AAAAAAAAAAAAAAAAAD6+v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4APf4+AAAAAAA/vz6AAAAAAAAAAAAAAAAAAMCAwAAAAAA9/f1AAAAAADf2+0AAAAAAAAAAAA8LyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+/gAAAAAAAAAAAAMDAAAAAAAAAAAAAPr29QAFDwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP0AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO35/QAAAAAAAP8AAAD9AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAACcNBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcjFgDc7t8AAAAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/u9QAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAAAAAAAAAAAAPv7AO/19wAAAAAA+Pf4AAAAAAD49AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/v9AP39+AAAAAAAAAAAAPv7+AD//AAA+Pj4AAAAAAAAAAAAAPz3AAAAAAAAAAAAAAAAAAABAwAAAAAAAAAAAPj29QAAAAAAAAAAAMTR2gCHobMAeV9NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjd+LAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+AAAAAAAAAAIAAAAAAAAAAAAA/f/9AAAAAAAAAAAAAAAAAPv39QAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAP/9AAAAAAAAAAAAAAAAAAP+/gAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA/v3+AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAADAPsAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6vj7APj8+AAAAAAABQMFAAAAAAD+AQYAAv76AAMBAwAAAQAAAP8AAAABAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAD9/QAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAJBAAAEAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIxYAud3qAAAAAAAAAAAAAAEAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAwD9AAAAAAAAAAAAAAAAAPj8AwC52uoARyYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+PwAAAAAAAAIAAAAAAAAAAAAAAAAAAAA+Pj7AAAAAAAAAAAA9fX4APr3+AAAAAAA9fX1APX29gD+/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vn6AAD9AAAGBgYAAAAAAPr6+gD9+vUA/f4AAAAAAAAAAAAA+/0AAAAAAAAAAAAAAAAAAAAA/QD9+/sAAAAAAP76/QAAAAAAAAAAAAAAAADBzdcAOikhAD82LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr+AAD3/AAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAP0DAAAAAAAAAP79AAABAAAA/wAAAAEAAPf8AAAAAAAAAwMDAAMCAgDn6OcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6vj6AAAAAAAAAAAAAAAAAAAAAAAC/voAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQsFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkEgsA3e8LANzu9QADAQAA/f8AAAMBAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj5+wAAAAAAAAAAAPX1+AAAAAAA9fb3AAUBAAD19fUA9fb2APX19QABAAAAAAAAAPf39wAAAAAABgMGAAAAAAAAAAAAAAAAAPr5+gD7+/sAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0AAAAAAAD+/gAAAAAA/vr6AAAAAAAAAAAA/fz9AAAAAAD+/P4AgpSoAH5sWAA/NiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9AAAAAAAA/QIAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3+/gAAAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A/v7+AP7+/gD+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6vj7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP39AAAAAAAAAAAAAAAAAP3//QD9//0A/f/9AAAAAAAhCwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxELAAAAAAACAgAABQMAAAICAAADAQAAAgIAAAICAAAAAAAAAAAAAAAAAAACAgAAAgIAAAICAAACAgAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QADAAAAAADc7fUA3O31AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+fsA7/P1APf6+gD3+voA9fX4APX29wD19vcAAAAAAPX19QD19vYA9fX1AAAAAAD39/cA9/f3AAAAAAD4+PgA+vn6APr5+gD6+foA+vn6AAAAAAD6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/gAA/f39AP39/QAAAAAA/v7+AP76+gD++voA/fv7AP37+wD9/P0AAAAAAP78/gD9/P0AAAAAAMHK1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//QAA//0AAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq+PsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAAAAAD+AAAA/gAAAAAAAAD+/gAA+/sAAPv7AP7+/gD+/v4A+/37AAAAAAAQBQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBILACQSCwADAQAAAwEAAAMBAAACAgAAAAAAAAMDAAAFBQAAAgIAAAICAAAAAAAAAwMAAAMDAAADAwAAAAAAAAICAAACAgAAAgD+AAAAAAAAAAAAAwD9AAAAAAAAAAAA3e31AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv8/UA+Pn7APj5+wD4+fsA9fb3AAAAAAD19fgA9fX4APX29gD19fUAAAAAAAAAAAAAAAAAAAAAAPj4+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYAAAAAAAAAAAACAQAAAAAAAP3+AAAAAAAA/v7+AP7+/gD+/v4A/f39AAAAAAD9+/sAAAAAAAAAAAAAAAAA/vz+AP38/QAAAAAAAAAAAMHK1ACClKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsTVEtAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz4AAAAAAAAAAAAAAAAAAAAAAAA//0A/QAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOX0/QAA/P0AAAAAAAkEBQD3/fsAAAAAAAAAAAAAAAAAAwQDAAD/AAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAD4/PsAAAAAAAAAAAAAAAAAAPv9AAAAAAAAAAAAJA8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhcOAOzx8wAAAAAAAAAAAAAAAAD4AwIAAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAD8AAADAAAAAAAAAAAAAAAAAAUAAwAAAAAAAAAAAAAA9e7lAAAAAAANEx4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4AAAAAAD97OIAAAAAAAD8BQAAAAAAAAAAAAAAAAD9+QAA9fXyAAAAAAD19vMA/f37AAAAAAD7+voAAAAAAAD8AAD7/fsAAwEDAAAAAAD7+/sAAAAAAAICAgADAwMAAwMDAAIDAwAAAAAA+/r6AP39AAAAAAAAAAAAAP38+wD9/f0AAAAAAP37+wAAAAAAAP39AAAAAAD7/PoAAAAAAP38/gAAAAAA/f39AP7+/QD9/PgAAAAAALnGzAAkGw4AWlFKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAAD8AAAAAAAA/QMAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAADAAMAAAAAAAAAAAAAAAAA/QD9AAAAAAAAAAAA/f39AAAE/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj8+gAAAAAAAAAAAPf8+wAAAQAAAAAAAAAAAAAAAAAA+wD6AAAAAAAFBAYAAAAAAAAAAAD9/foAAAAAAAAAAAAAAAAAAAAAAP39/QAAAAAAAwADAAAAAAAAAAAAFgkFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH2+IAOiYeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fT1AAAAAAD4+f0A9fbzAAAAAAAAAAAAAAAAAPv6+gD6+/sAAAAAAAD//wAAAAAA/f/9AAMBAwAAAAAAAAAAAP7+/gAAAAAAAwMDAAAAAAD7+voA+vv7AAD+/QAAAAAAAAAAAP78+gAAAAMA/fv7AAAAAAAAAAAA+/z6AAAAAAAAAAAA+vz7AAD9AAD+/v0A/f39AAAAAAAAAAAAAAAAAAAAAACVq74AIyAhADcxKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAAAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vn7APf8+wAAAAAAAAAAAAAAAAAA/v0AAAAAAAAAAAAAAAAA+v8AAAYEBQD7/PoAAAAAAAIBAAD+/vsAAAAAAAAAAAAAAQMA/f39AAAAAAD+/v0AAwEDAAAAAAAWCQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoXDQDW6fMAAAAAAAAAAAAAAAAAAAAAAO3s6gAAAAAAAwEGABATEAAAAAAAAAAAAAAAAADy8fIAAAAAAAAAAAD7/PsAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAxtriADomHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAydzlAB4UFQD19PYAAAAAAPX09QD4/PcAAAAAAAAAAAAAAAAAAwIDAPr7+wAAAAAAAAAAAP7+/gD9//0AAAAAAP3//QADAAMA/f39AAMDAwD+/v4A+vv7APr7+wAAAAAA+/r6AAMA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAP76+gAAAAAAAAAAAAAAAAD6/PsA+/z6AAP/AwD9/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkp+uAG4AUgA3MSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAgAAAP4AAAACAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fP1APj8+gAIBAYA+Pz6AAAAAAAIAAAAAAAAAAAAAAAAAAAA+wD9AAAAAAAAAAAAAAAAAAYDAAAAAAAAAAAAAAAAAAD9/f0AAAAAAAAAAAD9/f0ABQQAAAAAAAAWCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkXDgCt0uUAAAAAAAAAAAAOBPoA7ezqAAAAAADt7OoACAQRABDuEAAAAAAAERIRAPXy9QDy8fIAAAAAAAAAAAADBwMA7e3tAAAAAAAAAAAA7/wAAAAAAAAAAAAAAAAAADomHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJ3OUAAAAAAOro6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/r6AAAAAAAAAAAAAAAAAAAAAAD9/f0AAAAAAP39/QAAAAAA/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEBgD9/P0AAwUFAP76+gD9+/sA/QD9AAAAAAD7/PoAAAAAAP39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKfrgClMXsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKG8n/IAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAADAQIAAAAAAAMDAwAAAAAAAAQFAP39/QAAAAAAAAAAAPr/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf6AAAAAAD7BQYAAAAAAAAAAAAAAAAA+wAAAAAAAAAA/QAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAMA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QH/AAP/AAD7+/oAAwAAAAAAAAD9AgMAAAAAAAAAAAD+/vsAAwEAAP78+AAAAAAAAgQFAP39BgAAAAAAAAAAAAAAAAD7/PcAAAAAAAAAAAD7/P0A+PjvABsNCwAWCRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgECAAW+PUAydjiAAAAAAD9Af0A/v79AP39/QADAwMA9f/1AO3u9QAAAAAACw7wAAAAAAD6+/oA+/r7AAAAAAAC//oAAAAAAAAAAAAAAAAADgEGAPL2+gAAAAAA7+bqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAA+PcAAAAAAPgAAAAAAAAAAAAAAAD9AAAA/gAA/f/9AAAAAAAAAAAAAwQDAAYBBQAAAAAAAAIAAPv++gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCLSEAAAQDAMbT3AAAAAAAAAAAAPj8+wAAAAAACAYIAAkFBgD/Cf8A9fX1APsC/QD4/PcACAQJAPr7+gACAAMA+/r7AP3++gADAgAA/f4AAAAAAAAA/gAAAAAAAAAAAAAAAAAA1+jvAAAAAAB3j6MAiXFdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgUFAAkICAAAAAAA9/z4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBwMAAAAAAAAAAAAFBQAAAwMJAAAAAAAAAAAA+vv6AAMBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3/D1AAAAAAAAAPUAAAAAAAgHBgAAAAAAAAAAAAkHBQAIBwYA+Pn6AAD9AAAAAAAA9/v7AAAAAAAAAPoAAAAAAAAAAAAAAAAADgAJAAsICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6vf4AAAAAAAAAAAAAAAAAAAAAAD+/vsAAgIFAP7++wAAAAAAAgQFAAMEBgAAAAAAAAAAAAD8AAAAAAAA+Pn4APj59wADBgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v0AAAAAAAAAAAD9/f0A/fv9AAAAAAAGBwYA9fL1APr++gAAAAAAAAAAAAYFBgAAAAAA+/wAAAAAAAAAAAAA+Pv6AAAAAAAAAAAA1+PvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAD+AAD9//0AAwEDAPv9+wACAgIA+vv7AAAAAAAGBQUABgUFAAMAAAAAAAAAAAAAAPj5+gAAAAAAAAAAAAAAAAAAAAAAc1lHAMbT3AAAAAAAAAAAABELEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv6AAAAAAAAAAAAAAAAAAAAAAD6+wAAAAAAAAAAAAADAQAAAAAAAAAAAAD9/wAAAAAAAAAAAAC7x9EARDguAEU5LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYFBgAAAAAAAAAAAAUGBQAAAAAAAAAAAAAAAAADAv0A/v4AAAAAAAD+/gAA/f76AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj5+gAAAAAAAAAAAPj5+gAAAPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAA+Pr4AAAAAAALCAgACwkJAAsIBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAMDAAAAAAsAAAAAAAMDBgAAAAAAAAQAAAAAAAAAAAAA/fz6APv5/gD4+fcAAAAAAAAAAAD6+/4AAAAAAAAAAAAAAAAAAwEAABwOCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3KR4AydjiAAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAAAAAD6+foAAAAAAAAFAAAAAAAAAAAAAPr7+gADAAAAAAAAAPr7AAAAAAAAAwAAAAAAAAAAAAAAAAAAAM/S1AAxLiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAAAgAAAAAAAAAAAAADAQMA/f/9AAAAAAD+/v4AAgEDAAAAAAD6+/sABgUFAAkHBQAIBwYA+Pn6AAAAAAD4/PoAFg8LAAAAAAAAAAAAAAAAAHNZRwCNp7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/r7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd4+jABELBgA0LikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERARAAAAAAAAAAAAAAAAAAAAAAD6+/oAAAAAAAAAAAD7+wAAAAAAAAAAAAAAAAAA/f37AAAAAAAAAAAAAAAAAAMHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1+PgA9ff3AOX0+ADl9PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq9/gAAAAAAAAAAAAAAAAAAAAAAP39AAD9/foA/f36AP39+gD7+/UA+/j1APv49QD49O8A+/j1APj59wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsNCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3KB4AAAAAAAAAAAAFBQYABQUGAAUFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vsAAAAAAAD7/AAAAAAAAAAAAAAAAAAAAAAAAOfp6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP4AAAAAAAD9//0A/v7+AAAAAAD9//0AAAAAAAAAAAAAAAAAAAAAAAAAAAD4+foA9/n7APj5+gAAAAAA6vH1AAAAAAAAAAAAAAAAADotJABzWUcAAAAAAAAAAAAAAAAAAAAAAAAAAAD19fUA9vX1APX19QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAwMAAAMDAAAAAAAAAAAAAP3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJikrgAAAAAAAAAAAAAAAAAAvNHH9wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv6APr7+gD6+/oA+vv6APr7+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9Af0AAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAPv/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+PT4AAj8+AAhEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy9vgA+/b4AP0CAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAIA+Pz4AAAAAAAAAAAA+Pn7AAACBQAAAAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAACwkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMiYYAMbW3wAIBBEA/v36AAAAAAD9/QAAAP8AAAAAAAD+A/0AAAAAAAL7/QAAAAAAAAAAAAAAAAD9AgAAAAIAAPv6AAAAAAAA+PwAAAAAAAAAAQAAAAAAAM/k+ABKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD49/gAAAAAAAUDBQAAAAAAAAAAAP7+/gACAgAAAgIAAAAAAAACAAMAAwH6AAsGCwD7/fsABQMAAAP8/QD9/QAACP0CAAgECAAACQAAAAAAAPr+/QAIBAAAAAAAAAAAAAA6LSQAz9TaALbL1wAAAAAAAAAAAAAAAAAA/PgA+vb6AAD8AAAAAAAAAAD/AAAAAAD9/v4AAAAAAAAAAwAAAAAAAAAAAP39/QAAAQAAAAAAAAABAAAA/gAAAAAAAAAAAAAA/gAAAAAAAM7c7wB3jKMAiXRdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAAAA/v39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39AAAAAAAAAAAAAAD7AP3+AAAAAAAAAAAAAPr0AAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AAAAAAAAAAAAAgACAAAAAAD+/v4AAAAAAAABAAAAAAAAAAAAAAD9AAAAAAAAAP4AAAACAAAAAAAAAAD9AAAAAAAA/v4AAAICAAAAAwDf7fIAAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj5+wAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA+Pv7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr8+wAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+voAAAAAAPr7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv9+wAAAAAAAAAAAAAAAAACAAMAAAAAAAYDAgAAAAAAAwEDAAAAAAAFAwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa1lKAPL6/QDE0doAAAAAAAAAAAD19foA+/v9AAAAAAAAAAAAAwMDAP39/QAAAAAAAAAAAAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAC7xtEARMYuAEU6LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9AAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f4AAP39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4AAAAAAAAAAAAAAAAA/v7+AAAAAAAAAAAA/f39AAABAAAAAAAAAAAAAAAAAAAA/gAAAP0AAAAAAAAAAAAAAAD+AAAAAAAAAAAAAPv7AAAEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADd7e8A3O3wABAHBQAAAAAAAAAAAAAAAAAAA/0AAAAAAAAAAAAAAAAAAQADAPf5+gAAAAAAAAAAAAEC/QAAAAAAAAAAAAAAAAD9//0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOSkhAMbW3wD6+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAAADAAAAAAAAAAMDAAD9/QAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQMA/f/9AAUDBQAAAP4ABgMCAAAAAAAFAwMAAwEDAAAAAAAAAAAAAAAAAAAAAAADAwAAAwMAAAAAAAD6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0wJwDE0doAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAgD9/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAD9AAAAAAAAd4yjAAB0AABFOi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/v4A/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QD9/f0AAAAAAP39/QD9/f0AAAAAAAAAAAAA/gAAAP4AAAD+AAAA/QAAAAAAAAD9AAAA/QAAAP39AAAAAAAA/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj5+wD4+fsA+Pn7APj5+wD4+vgA+Pr4APj6+AD4+vgA9/n6AAAAAAAAAAAA+Pn7APf69wD3+vcA9/r3APf69wD6/PsA+vz7APr8+wD6/PsAGQwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEDAAMBAwAGAwIAAAAAAAUDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAwMAAAMDAAATDAgAEwwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvJgB5X00AAAAAAAAAAAD7+/0AAAAAAAAAAAAAAAAAAAAAAAMDAwAGBQUABgUFAAAAAAADAgIABgUFAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAHduI9qEAAAgAElEQVSMowDn6OcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9AAAAAAAA//0AAAAAAAAAAAAAAAAA/f7+AP3+/gD9/v4A/f7+AP3+/gD9/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pz4AAAAAAAAAQMAAAAAAAABAwAA/voA/f39AAAAAAAAAAAAAAD+AAD+AgAA/v4AAAAAAAAAAAAAAP0A/f8AAAAAAAAAAAAAA/0AAAD8/QAAAAAAAAAAAAby5wAAAAAAAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAwMA6vP1APoJCwAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAD7AAAAAAD9/QAA/v8AAP39AQAAAAAAAP39AAADAwAAAAAAAAAAAAAAAAAAAAAAEAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8DAPj7CQAFAv0AAAAAAAAAAAAAAAAAAAQAAAAAAAACAAMAAAAAAP4AAAAAAAAAAAAAAAAA/QD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAM7f5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICQgAAAAAAP33+wAA/wAAAAAAAAMB/QAFAQEA+Pn6AP0A+wAIBwYABgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAACAwDz8/sAAAAAAAYAAwD4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8LyYAMiIWAL7K0QAAAAgAAAAAAAAAAAAAAAAACAcDAAACAwAA/v0AAP39APoABgD7/PsAAAAAAAMBAwD9Av0AAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAACQp7wAiXFdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP37AAD8+AAAAAAA/QEDAAAA/gAAAAAAAAAAAPr++wAAAAAAAP4AAAD/AAAAAAAAAAAAAAAAAAAA//0AAAD+AAAAAAAAAAAAAAAAAAD9BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD++gAAAAAAAAD+AAAAAAAAAP4AAAACAAAAAAAAAAAAAAAAAAAAAAD9/wAAAAAAAAAAAAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAP39AAD+/gAA/f0AAAD9/QAA/f0AAAAAAAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCseAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAwACAAMAAAAAAAAAAAAAAAAAAwEAAAMBAAADAQAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYFAgAAAAAA+/z9APr7/gD4+foAAAAAAAAAAAAAAAAAAwMDAAMDAwADAwMAAAAAAAAAAAAAAAAAAP/9AAD+/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg2xdAEI2LwAAAAAAAAAAAAAAAAAAAAAAAAUGAAADAwAABQYAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7x9EAd4+jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAP8AAAAAAAAA//0AAP/9AAD//QAA/v4AAP4CAAD+AgAA/gIAAP4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fsAAAAAAAAAAAAAAAAAAAAAAAABAwAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+PT1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADS3eIAAAAAAPv4+gD7+PoAAAAAAAAAAAAAAAAAAAAAAP37/QD9+/0A/v4AAP7+AAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj1+gDv6/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/f0A/vv9AP77/QD++/0AAAAAAAAAAAAAAAAAAgADAAMAAwAFAwAAAgIAAAICAAACAgAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHBgAJBwUABQUGAAICAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAINsXQAuJB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAACAAAAAAAAu8fRALvH0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP7+AAD+/gAA//0AAP8DAAD/AwAA/wMAAP8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/voAAP76AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAD+AAAAAAAAAQMAAAICAAD//QAAAAAA/v4AAP7+AAAAAAAAAAAAAAAAAAD49PUA7+jqANHa3wDR2t8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0d3iAPXw9QD18PUA8OjvAPXw9QD48PcA+/X6AAAAAAAAAAAA/f0AAAAAAAAAAAAAAAAAAAD7+gAA/v0AAP79AAD+/QD49foA+PX6APf2+wD49foACwgFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/f0A/v39APv6+gD9/f0A/fr9AP36/QD9+v0A/vv9AAAAAAD+AP0A/gD9AAIAAwADAQAAAwEAAAMBAAADAQAABQYGAAIDAwACAwMAAgMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv8/QAAAAAABQQDAAYFAgAIBwYAEQ4LABEOCwAIBwYA/f39AP7+/QAAAAAAAwMDAAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAOrw9QDq8PUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdST0AAAAAAAAAAAAAAAAAAPv6AAAAAAAAAAAAAAIDAAYEBgAFBAUAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEx+MwAACAASURBVAIAAAABAAAAAAAAAAAAAHePowC7x9EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PgAAAAAAAABAAAAAAAAAAAAAAABAAAA//0AAAAAAAAAAAD9/QAAAP/9AAAAAAAAAAAAAAAAAAP9AAADAAAAAAAAAAAAAAAICAgA5+TlAOjj5ADn5OUA+Pj3ADwyLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrl6gDf198A4gTfAAAAAAAAAAAABQQAAA4UFgAWGRUAFhgWAAAAAAADAAkAAPwAAAUAAAAAAAAA+AAJAAD9AAAAAAAAAAAAAAD/AAD18fIA9fLzAAAAAAAD/v0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+OznAAgMEAD7+PUA+vj1AAAAAAAGCAYABQgIAAAAAAD9+gAABQQIAAMAAAAAAAAAAAD9AAAA+AAAAAAACQkJAAgICAAABAgAAAAAAPj4+AAAAAAA9/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3+AAAAAAA/QAAABQLCwAIBgYAAAAAAAAAAAAAAAAAA/8AAP39AAD9/f0AAAAAAAYDBgAAAAAA/f/3AAAAAAAAAAAAAAAAAPjz8ADq8fUAAAAAAA4AEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AADo1KQCDbFgAfZSoAAAAAAD9+gAABgD9AAAAAAD6+v0A+//6AP39/QD9//4AAAAAAAMAAwAAAQAAAAAAAP3/BQADAfsAAAAAAAABAAD9AQUA/v/9AAAAAAAAAAAAAP8AAAIB+wAAAAAAAAAAAKmvvABFOS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/v0AAwIAAAAAAAD9/gAAAP0AAAD//QAA/v4AAAAAAP3/AAAAAAAAAAAAAAMACAD+AP0AAAAAAAUA/gAAAAAA/QAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAA/f0AAP39AAAAAAAAAAAAAAAAAAAAAAAA/vwAAAAAAAAAAAAAAAAAAAAAAADPx8kAz8fJAOfk5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/wAAOro6gDUz9UAvre/ANTP1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fDvAPXx8gD18vMAAAAAAAAAAADs7/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPXw6gD18OoA+/j1APv49QD18O8A9fDvAPv4+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQAREREACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf7+wAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAAAGAwYABgMGAAAAAAD6/foAAAAAAAAAAAAAAAAA9fX1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAABCNiwAQjYsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAgIAAAAAAAAAAAAAAAAAAAAAAAMB+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQL+AAAAAAAAAAAAAAAAAM7g5wB3j6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f4AAP3+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPsAAgD7AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAD9AQAAAAAAAP7+AAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAADt6eoA7OnqAO3p6gD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vwAAAAAAAAAAAAAAAAAAAMEAAAAAAAAAAAAAOro6gDUzc8AAAAAABYZGAAWGhkAAAAAAAAAAAD18O8AAAAAAPXy8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv49QAAAAAAAAAAAAAAAAAAAAAA+/j4AAAAAAD6+PcA+AQDAAAAAAAICAsACAgLAAgICAAAAAAAAAAAAAAAAAAAAAAA+Pj4APf39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFBQAAAAAAAAAAAAUFAAD7+wAAAAAAAAAAAAAAAAAAAAAAAPr9+gAAAAAAAAAAAAAAAAD19fUA9fX1APX1/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg2xYAACUqADJ0doA+vr9APv7/QAAAAAA/QH9AAAAAAD9/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f8FAAAAAAADAfsAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7x9EARDguAEU5LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAMDAAD9/QAAAP/9AAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAP0A+wABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAA/QAAAAAAAAAAAAAAAAAA/v4AAP39AAAAAAAAAwAAAAAAAAACBAAA+/gAAPLt6gDs6eoA7enqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/wAAAAAAAAAAAAAAAAAAAMEAAAAAAAAAAAAAAAAAADq5ucAAAAAAAAAAADq5+gAAwP/AAAAAAAAAAAAAAAAAAMPFwAAAAAA9fHyAAAAAADt7vIAACMbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBztoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv4+AAAAAAA+wQAAAAAAAAAAAAA+Pj1APj4BgAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQsLAAAAAAD4+voACAYGAP7+AAADAwAA/f0AAAAAAAD6/foA+/77APr9+gAAAAAACQQIAPX19QD19fUA9fX1AAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE2LADO1t0A9fX6AAAAAAAAAAAA/f7+AAAAAAAAAAAA/f39AAMBAwAAAAAAAAAAAAAAAAAAAAAAAwH7AAAAAAAAAAAATUtDIgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd4+jAAAAAABFOS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAP39AAAD/wAAAwAAAAUAAAAAAAAA+Pj3AAAAAAD9AAAA7ejqAPLo7QDq7eoAAAAAAPX29QAIBAAA/f0AAAAAAAAAAAAA+PT4APv4+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr4+gD49PcA/QMDAAAAAAADBQYAAAAAAPj49wAAAAAAAAAAAAAAAAAD/wYABQUDAOrm5wAAAAAAAAQIAAAAAAAAAAAACAgIAADz4QAAAAAA+PX4APj29wDSFggAOjUpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9+/oA+PDvAP0B/gAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAA/wAAAAAAAD49/gAAAIDAAD8/gAAAAAAAAAAAAAAAAD7APUAAgQFAAMEBgAAAAAAOiERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgECAAAAAAACAYGAPX19QALCwsAAAAAAP39AAAAAAAAAAAAAAAAAAD+//0A+/n6AAEAAAAAAAAA7/f4APj4+wD4+f0AAAQIAPj09wAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI2LAAAAP0AfZSjAAAAAAAAAAAAA/sAAAAAAAAAAAAAAwMAAPr9/QAAAAAAAAAAAAAAAAAGAwYAAAAAAAAAAAAAAAAA+v36AAAAAAADAwMAAAAAAAP9AwAAAAAAAAAAAAAAAAAGBAUAAAAAAICTqwAsJR8AGRQQAAAAAAAAAAAAAAAAAAAAAAD6/gAA9/wAAAAAAAAA/wAAAAAAAAAAAAAA/gAAAAAAAAAAAAAA//0AAAAAAAEBBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3o6gDs5+sAAAAAAPDu7AD19vUAAAAAAAAAAAD9/QAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD00LADEy9QAAAAAAAAAAAD9+/oAAAAAAAAA/QAAAAAAAAAAAAAAAAD9/v0AAAAAAPr6/QAAAAAAAwf/AAAAAAAAAAAA+Pj3AAD/AAAAAAAAAAAAAPj1+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/yNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/QAA/QMAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAPr//QAAAAAAAAAAAAAAAAD+AP0A/fz6AP4E+wACBAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fX1AAAAAAD19fUAAAAAAAMDAwAAAAAAAAAAAAAAAAD4/PgAAAAAAAAAAAD39/gA+PwAAPj49wAAAAAA+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCNi8AvzbSAL7K0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAA/f39AAMAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNn7MAjHVdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAP7+AAADAQAAAAAAAPDt7QAAAAAA4drfAAAAAADt6OoAAAAAAPj89wAAAAAAAAAAAAAAAAD+/gAAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vr7AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAACBAAA+vr9AAAAAAAAAAAA+Pj4AAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39APsA/gAAAAAAAAAAAAUEBQAAAAAAAAAAAP38+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fX1AAAAAAAAAAAAAAAAAAUFBQAAAAAAAAAAAAAAAAABBQAAAAAAAPf3+AD4+PgA+Pz/AAAAAAD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg2xdAACUAAC+ytEAAAAAAAAAAAAAAAAABQYJAAL+/QAAAAAACQYFAAAAAAD6/AAAAAAAAPv6+wAAAAAAAwMDAAAAAAAAAAAAAwMDAAD9AAADBAIAAAAAAAAAAAAAAAAAAAAAAAAAAADHz9kAfZSoAINsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAAAAAAA/v4AAAAAAAAAAAAA8O3tAO/u7ADw7e0A7+jwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw1LAAAlwAA/fv6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9//0AAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM0dcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAD9/gAAAAAAAAAAAPv8+wADBAIAAAAAAAAAAAD9/PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fX1AAAAAAAAAAAAAAAAAAgICAAAAAAAAAAAAAAAAAAA/AAAAAAAAPj4+AAAAAAA+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE2LgC+ytEABQYJAAAAAAAGBwgAAAAAAAgEAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAYHBgBd0FnmAAAgAElEQVT6+foAA/8CAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAP38/QAAAAAAAAAAAAAAAAAAAAAAvsrUAEHK1ABCNiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAP8AAAAAAAAAwAAAAAAAAD49PcA8uzxAO3p7QDq6ecAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAP39/QD7/wMAAAAAAAAAAAAAAAAA+Pj4APv7+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PAAAAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAABfwDAAMEBQAAAAAA/fz7AAMABQAAAAAA/f/9AP7+/gDf6PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+ydQAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAMSggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjk6AAAAAAAAAQAAAAAAAD9/P0AAwQDAPv09QAAAAAAAAAAAAUEAwAABAgAAAAAAPv7AgD6+vsAAAAAAAAAAAAAAAAAAP39AAD8AwAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI2LwAAaf4Ajae+AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAI/AAA/f39AAAAAAAFBQUA/v7+AAAAAAAAAAAAAAAAAAAB/wAAAAAA+vz7AAD8+gD/+/4AAAAAAAAAAAAAAAAAAfwCAH2QqAAAb1gAQjcsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAD+AAD+AP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn5eQA5+XkAOjl5QDU0s8A6unnAAAAAAAAAAAAAAAAAP7+AAD+/gAA+/sAAP39/QD7+/sA/v7+AP39/QD9/PsA/fz7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAD+/gAA/v4AAP7+AAD+/gAA/v4AAP7+AAD9/QAA+/sAAP7+AAD+/gAA/v4A/fz7AP78+gD+/PoA/vz6AP7+/gD+/v4A/v7+AP3//QAAAAAAwcjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/I1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAP0AAAD9AAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWEAsAGRYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vz9AP78/QD+/P0AAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/oA+/v6APv7+gAAAAAAAP7+AAD+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANy0kADctJAAAAAAAAAAAAAD9/QAAAAAAAP7+AAD9/QAAAAAAAAAAAP39/QD9/f0A/f39AAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAUEBgAIBwYACQYFAAAAAAAAAAAAAAAAAAAAAAC+ydQAfZGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfl5ADo5eUA5+XkAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v4AAP39AAAAAAAAAAAAAPv7+wAAAAAAAAAAAAAAAAD+/PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBOjIAvsXSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAQAAAP39AAAAAAAAAAAAAAAAAP38+wAAAAAAAwQFAP3//QAAAAAAAAAAAAAAAAAAAAAAwcnRAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIRYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vz9AP0A/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQYA+/r7AAAAAAAAAAAAAP39AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5ZRwCSAAAAydPcAAAAAAAA/v4AAP39AAAAAAD7+/sAAwMDANzYuigAACAASURBVAAAAAD9/f0AAAAAAPv7+wAAAAAAAAAAAPj7+AAAAAAAAAAAAAAAAAAD/f0AAAAAAAkGBQD3+vsAAAAAAAAAAAAAAAAAvsnUAD7H0QAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy3dkAxM7UAAAECQD9+/oAAAADAAAAAAD++foAAAAAAAAAAAAAAAAA/fz7AAAAAAAAAAAA/f0AAAAAAwAAAAAAAAAAAP7++gD9AQMAAAAAAAD9/QAAAAAA9/j4APr6+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhGhAA9/n9AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAf0AAAAAAAAAAAAAAAAABgAGAAAAAAAAAAAA/f3+AAAA/gADAwUAAAAAAAAAAAD4AAAAAAAAAL7H0QBCOS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3+DfALXJzAAAAAAAAAAAAAYABQD9/v4AAAAAAAYFBQD9/f0AAAAAAAMDAwAAAAAAAAEAAAAAAAAAAAAAAAAAAAMAAAAA/wAAAAEAAAAAAAAAAwAAAAAAAAAAAAABCAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj47wAAAAAAAAQIAAAAAAAAAAAA/fv7AAMCAgAAAwMAAAAAAAD9/QAAAgAAAAAAAAABAwD7+/oA/f4AAAAAAAAAAAAAAAEDAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAwIAAAAAABCMyYAyc/UAPD09wAAAAAAAAAAAAAAAAAIBAAA/fwAAPr8/QAAAAAA/gADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAAAAAAAAAAAAABAQIAAgT9AAYEAwD6/P0AAAAAAIiaqwAhFREAAAAAAAAAAAADAAAAAAAAAAAAAAD9/wAAAwADAAAAAAAAAAAAAAEAAP39/QAA/wAAAAAAAAAAAAACAQMAAAIAAAAAAAAA/gAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEztQAAAAAAP37+gD++vsA/vr7AP76+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAAAAAAA/v76AAAAAAAA/f0AAP39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhICEALCQbAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/v4AAP7+AAD+/gAA/v4A/f76AP3++gAAAAAA/f76AP3++gD9/fsA/f37AAAAAAAAAAAAAAAAAL/I0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxtPcAAAAAAAAAAAAAAAAAP3+/gAAAAAAAwICAAAAAAAAAAAAAAAAAP39/QD9/f0AAPsAAAD+AAAAAAAAAAAAAAACAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAABBNCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP37+wD9+/sAAAAAAAAAAAAA/f0AAP39AAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8MikAeWRSAAAAAAAAAAAAAAAAAAAAAAD1+PsA9fj7APv8/gD7/P4AAAAAAAAAAAD9/P0A+vj7APf4+AD3+PgA+vv7APr7+wD6+/sA/f39AP39/QD9/f0AAAAAAPr8/QAGBAMABgQDAAAAAADf6+8AEQsIAAAAAAADAgAAAwIAAAMCAAADAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAABAAAAAMAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP76+wAAAAAAAAAAAAAAAAAFBAMAAAAAAPr8/gD6/P4A/f0AAP39AAAAAAAA/v4AAP7++gD+/voA/f37AP39+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCUcAAAAAAAAAAAAAAAAAAD+AAAA/gAAAP4AAAD+AAAA/f0AAP39AAD9/QAA/f0AAAAAAAAAAAD9/voAAAAAAAAAAAD9/voAAAAAAP39+wAAAAAAAAAAAL7H0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx9TdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABCNSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fv7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDIpAD8zKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vj7APr4+wD9/P4A/fz9AAAAAAAAAAAA/f39AP39/QD9/f0A+vv7APr7+wD9/v4A+/z+AAAAAAD1+PsA9fj7AO/1+ADv9fgA7/X4AAAAAAD9/gAA+v0AAPr9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP37+gAAAAAAAgYFAAIGBQD7/P0A+vz+AAAAAAD7/P0A/v4AAP7+AAD+/gAAAAAAAP39+wD9/fsAAAAAAAAAAAAA/v4AAP7+AAD+/gAA+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCQbAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA/f37AP39+wD9/fsA/f37AP39+wAAAAAA/f76AAAAAAAAAAAAAAAAAAAAAAB9j6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2t74AxtPcAAAAAAAAAAAAAAAAAAAAAAADAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/v4AAAAAAAD+AAAA/QAAAP0AAAD+AAAA/wAAAP8AAAAAAAAAAAAAAAAAAEI1LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fr6AP36+gD9+voA/fr6AAD+/gAA/v4AAP7+AAAAAAAA/v4AAP7+AAAAAAAA//0AAAAAAAAAAAAAAAAAA//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5nUwA/MykAAAAAAAAAAAAAAAAAItrwigAAIABJREFUAAAAAAAAAAD6/P0AAAAAAP38/QD9/P0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0AAAAAAPv8/gD6/P0A+vz9AAAAAAAAAAAAAAAAAAAAAAD9/wAAAAAAAAAAAAD9/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj0+AAAAAAAAwMDAAUDAgAA/f0AAAAAAPv8+wD++/sAAAAAAAMAAAD9/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAAP//QAAAAAAAAAAAPr8/QD49PcA+vj6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKRToAfJOmAAAAAAAAAAAA/f0FAAAAAAAAAAAAAwMDAP3/BQAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAwMDAP39AAAAAAAA/f39AAD7/QAAAAAACwkFANbX2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfa5QAG/wAAAAAAAAAAAAAAAAAAAAD9AAD+/QADAQAAAAAAAP0AAAAAAAAAAAAAAAMBAAD9AAAAAP0AAAMBBQAAAAAAAAAAAAD9AAAAAAAAAAAAAAD8+AAAAAAAQTIpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAA9/T4AAAAAAAAAQAAAAAAAAAAAAAAAwAA/foAAAMDAwAAAAAAAP39AP0BBQAAAAAAAwMDAAAAAAADAAMAAAAAAAAAAAD9/QAAA//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAEo6LwDR0dcAAAAAAOf4/QAAAAAAAAAAAAAAAAAA//0AAwMAAAAAAAAAAAAA/f8AAAD+AAAA/wAAAAAAAAADAAAAAQAAAP8AAAAAAAD6/P0AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAD9AwUAAwH7AAAAAAAAAAAAAwADAAAAAAAAAAAAAAAAAAABAAAAAAAA/f/9AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAAAAAAD7+/sA+/v7APv7+wD9/f0A/f39AP39/QAAAAAAAAAAAAD+/gAA/v4A/f0AAP39AAADAwAAAAAAAAAAAAD6/P0A+vz9APv8/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxAAAAAAAAAAAA/v7+AP7+/gAAAAAA/f39AP7+/gD+/v4A/v7+AP7+/gAAAAAAAAAAAAAAAAAAAAAA/f39AP39/QD9/f0AAAAAAAAAAAAAAAAA9ff7AN/k8ACHlKMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvsnRAL7J0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/wAA/f8AAAAAAAAAAAAA/fwAAP38AAD9/PoAAAAAAP38+wAAAAAAAAAAAAD9/QAA/f0AAP39AAAAAAAAAAAAQjcvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAA+vv7APr7+wD9/f0A/f39AP3+/gAAAAAA/f39AP39/QD9/fsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw1LAB5aVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAP0AAAAAAAAAAAAAAAAAAAAAAAADAfsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/v7APv7+wD6+voA9fX1AP39/QAAAAAAAAAAAAAAAAAA/v4AAP7+AAAAAAAAAAAAAAAAAAAAAAD9/QAAAAAAAPr8/QD7/P4A+/z+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARDwyAAAAAAAAAAAAAAAAAAAAAAD+/v4A/v7+AAAAAAAAAAAAAAAAAAAAAAD+/v4A/v7+AP7+/gD+/v4A/v7+AAAAAAAAAAAA/f39AAAAAAAAAAAAAAAAAAAAAADEytEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfZGjAAAAAAD9/gAA/f4AAP3+AAD9/gAA/f4AAP3+AAAAAAAA/f4AAP38AAD9/AAAAAAAAAAAAAAAAAAA/fz6AAAAAAD9/PsAAPv7AAD+/gAA/v4AAPv7AAAAAABCNy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAP4AAAD+AAAA/gAAAAAAAP39/QD9/v4A/f7+AAAAAAD9/v4A/f7+AP3+/gD9/voA/f37AP39+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8NSwAPDUsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAD+AAAAAAAAAAAAAAD+AAAA/gAAAP4AAAAAAAAA/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP0DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEDAAMBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vr6APr6+gD7+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAP39AAD9/QAA/f0AAAAAAP3+AAD9/gAA+vsAAPv8/gAAAAAA+vz9APr8/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3//QD9//0A/f/9AP3//QAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gD+/v4A/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAh5SjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9kaMAAAAAAAAAAAADAgAAAwIAAAYDAAADAgAAAwIAAAMCAAAAAAAAAAAAAP38AAD9/AAA/fwAAP38AAD9/PsAAAAAAP38+gD9/PoAAP39AAD9/QAA/f0AAAAAAAAAAABBOC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAP0AAAAAAAAAAAAAAAAAAAAAAAD9/f0A/f39AP39/QD9/f0A/f39AP39/QAAAAAA/f76AP3++gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6c7h6AAAgAElEQVQAeWlYAEIxIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/gAAAP4AAAAAAAAA/wAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/wUAAAAAAP3/BQAAAAAAAAAAAAAAAAAAAAAAAwICAAMCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj0+AAAAAAAAAQAAAAAAAD9/AAAAAAAAAMEAAAAAAAA/fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vsAAAD9/QAA/v4AAAAAAP38/QAAAAAAAwAAAP0BAAAA/AAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAAAAAAD86NAC5wswAAAD9AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD9AP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAP38/QAAAAAAAAAAAAAAAADf5PgA3+TBACcfHgBCOS8AEBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/P1wC1wckAAAAAAAAAAAALBwsABgUFAAAAAAD6+/sA/gH9AAAAAAD9/P0AAPz+AAAA/QAAAAAAAAAAAAD9AAAAAAMA/f3+AAAAAAAAAwUA9/z4AAAAAAAAAAAAAAAAADooIQBCNy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAD9AAAAAAAAAgEDAAAAAAAAA/0AAAAAAAD8+AAAAAAAAAAAAAAAAAD9AQUAAAAAAAAAAAD9/voAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAIx5awA7WnQAAAAAAAAAAAD3+AAAAwMAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAIAAAD+AAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD/AAAAAPsA/f8AAAAA+wD9AP0AAAAAAAMDAwADAgIAAAAAAAAAAAADAgIA/f7+AP39/QAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fwAAP38AAAAAAAAAAAAAAAAAAD9/AAAAAAAAP38AAD9/AAA/fwAAP38AAD9/AAAAP39AAD+/gAA/f0AAP39AAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI98aAAAAAAAAP4AAAD9AAAA/QAAAP4AAAAAAAAAAAAAAP4AAAD+AAAA/gAAAP4AAAD9AAAA/QAAAP4AAAD9AAAA/QAAAP8AAP38AAD9/AAA/fwAAP38AAAAAAAAAAAAAL7I0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJetuQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBQUAAAAAAAAAAAAAAAAAAAAAAAD9AAAA/QAAAP0AAAAAAAAA/voAAP76AAD++gAA+/UAAAAAAAAAAAAAAAAAAAAAADEuJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4CAAAAAAAA/QMAAAAAAP0AAAD9AAAA/QAAAP0AAAAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAACDb10AAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAIAAAAAAAAAAAAAAAH9AAAB/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fwAAP38AAD9/AAAAAAAAP38AAAAAAAA/fwAAAAAAAAAAAAAAAAAAP38AAD9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7H0QB8j6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd4SYAMzW3AAAAAAAAAAAAAAAAAD7+voA+vv7APr7+wD6+/sA/fz9APr4+wD9/P4A/fz9AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAD9+wAA/fsAAAAAAAAAAAAAAAAAJx8WAGNcTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAPv7AAD7+wAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCNy8Ag29dAAAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/QAAAf0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f7+AP39/QAAAAAA/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP38AAD9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIPjQAAP8AAAAAAAAAAAAAAP8AAAD9AAAA/QAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP78AAD+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+x9EAjZedAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7wswAu8LMAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/r6APv6+gD7+voA+vj7AP38/QD9/P0AAAAAAAD+AAAA/gAAAP4AAAAAAAAA/fsAAP37AAAAAAAAAAAAAAAAAAAAAAAAAAAATT4sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOIott0AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAQjcvAEI3LwD6+wAA/f0AAP39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf0AAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8DAAD/AwAA/wMAAAAAAP39/QD6+/sA/f39APr7+wD6+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf4+AAAAAAAAAEFAAAAAAAAAwMA/fwAAAP/+gAAAAAAAAAAAAAAAAD9/f4AAAAAAAAAAAAAAAAAAP0AAP3//QAAAAAA/v79AP3/AwAAAAAAAAAAAAAAAAD4APgA+wD7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPjQARz80ALnBzAAAAAAAAAAAAP3//QAAAAAAAAAAAAAAAAADAAMAAAAAAAAAAAD9/wAAAAD9AAAAAAAAAAAAAAAAAAIDAAAAAAAAAP8AAAAAAAD9AAAAAAAAAAAAAAAAAAAAnafHACwoLwBHQTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3iKAAAAQIAAD8AAAAAAAAAAAAAAAAAAAABPsAAAAAAAAAAAD9/AAAAP39AAAAAAAAAAAAAAAAAP3+/gAAAAAAAwH9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz4AAAAAAAAAAAAUlFKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAwAAAAAAAAAAAAAAAAH7AAD/AAD9AQAAAP0AAAMAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAwAAAPj4AAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHtnVQD6+wAAu8bRAAAAAAD9/QAAAAH9AAADAwAAAAAAAP39AAAAAAAAAAMA/QD9AAAAAAAAAAAAAAH9AAAAAAAAAAAAAwD7AAAAAAD9//0AAwEDAP0ABQAAAAAAAP4AAAAAAAAAAv0AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AAAAAAAA+/sAAPv7APv6+wD7+vsAAAAAAPv6+wD9/f0A/f39AP39/QD7+/oA/f/9AP7+/QD7/foA/f/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAASEA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/wAA/f8AAP3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHF/mAC5v8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJeWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP38AAD9/AAAAP7+AAD+/gAAAAAAAP7+AAAAAAAAAAAA/f8DAAAAAAAA/wMAAP8DAAD/AwAA/wMAAAAAAAAAAACEd2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAD/AAAAAgAAAAIAAAAAAAAAAAAAAP8AAAD/AAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABEOi4AAAAAAAAAAAAAAAAAAAAAAAD9/QAA/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP0AAAD9AAAA/gAAAP4AAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAAAAAAAAAAAAAAAAAAAA+/r7AAAAAAAAAAAA/v79APv7+gD9/f0A+/36AP3//QAAAAAAAAAAAAAAAAAAAP0AAAD9AAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAARz80AEc/NAAAAAAAAAAAAAMB+gADAfoAAwH6AAMB+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxf5gAcX+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFPTEART0xAAAAAAAAAAAAAAAAAAAAAAD9/AAA/fwAAP38AAAAAAAAAAAAAAAAAAAA+/sAAAAAAP7+AgAAAAAAAAAAAAAAAAAAAAAAAAH9AAAB/QAAAf0AAAAAAEI7MQBCOzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAD9AQAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFOi8AiXRdAAAAAAAAAAAAAPv7AAD7+wAA/v4AAAAAAAAAAAAA/f0AAAAAAAAAAAAA/v4AAP7+AAD+/gAAAAAAAAAAAAAAAAAGAwUAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAAAAAAAAAAAAAAAAPr7+gD+/v0AAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI9/aAAAAAAAAAAAAP3/BgD9/wYA/f8GAP3/BgAAAAAAAAAAAAAAAAD+/gAA/v4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/MAHyDjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXljADIkGQAAAAAAAAAAAAAAAAAAAAAA/fwAAAAAAAAAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAD+/gIA/v4CAP3/AwAAAAAAAP8DAAD/AwAA/wMAAAAAAEI8MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQWd+EAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTovAEU6LwAAAAAAAAAAAAAAAAAA/f0AAP7+AAD+/gAA+/sAAPv7AAD+/gAA/f0AAAAAAAAAAAAA/v4AAAAAAAAAAAD9/v4AAAAAAAD/AAAA/QAAAAAAAAAAAAAAAAAAAP8AAAD+AAAA/QAAAP4AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAP39AAD9/QAA/f0AAAAAAPr8/QD6/P0A+vz9AAABAwD9/gMA/f4DAP3+AwAAAQYAAAAAAAAAAAAA/wAAAP8AAP39/QD7//0A+//9APv//QAA/AAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPfWUAAPz3AAP9+gAD/foAA/36AAP9+gAAAPoAAAD6AAAA+gAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAA/gAAAAD+/QAA/v0AAAP9AAAD/QAAA/0AAAP9AK67zgBxf5IAub/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdTSgAAAAAAAAAAAAAAAAD7/PsA/gD7AP4A+wD+APsAAAH9AAAB/QAAAf0A/QD9AAIA+wACAPsAAgD7AAD+/QAAAf0AAAH9AAAB/QAAAf0AW0UpAEo/OQAIBAgACAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQCAAIEAgAAPwAAAD8AAADAAAAAwAAAAMAAAAAAAAA/QEAAP0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAD+AQAA/gEAAP4BAAD+AQAAAPwAAAD8AAAA/AAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl0XQA6KBkAAAAAAAAAAAAAAAAAAP39AAD9/QAA/QAAAP0AAAD9/QAA/wAAAP39AAD9/QAA/f0A/fv9AP37/QD9+/0A/fv9AAD8+AAA/PgAAP79AAD+/QAA/AAAAP0AAAD+/QAA//0AAAD9AAD+/QAA/v0AAAMAAAMCAAADAgAAAwAAAAMCAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39AP39/QD9/f0A/f39AAACAwAA//0AAP/9AAAAAAAAAAAAAP79AAD+/QAA/v0AAP8AAAD/AAAA/gAAAP4AAAAAAAAC/gAAAv4AAAL+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQTcAR0E3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMAAAEDAAAAAAC5v8kAcX+SALm/yQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnCzAC5w8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEU7MQCJd2MAAAAAAAAAAAAFBAIAAAAAAAAAAAAAAAAA/f8AAAAAAAAAAAAA/v4AAP7+AAD+/gAA/v4AAP7+AAAAAAAAAAAAAAAAAAAAAAAATUtNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjWU0AAAAAAAAAAAAAAAAAAAAAAAD9AAAA/gAAAAAAAAD9AAAA/gAAAP8AAAD/AAAA/wAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AAAAAAAA/fsAAP37AAD9+wAA/v4AAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/QD+/v0A/v79AAD+/QAAAQMAAAAAAAAAAAAA/v0AAAAAAAD9/QAA/f0AAP0AAAD9AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4FuAC8qIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAv0AAgL7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP79AAAAAAAA//0AAP/9AAAAAAAAAAAAAAAAAHF/kgBsf40Atr/GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5wswAcYSYAHGEmAC4xMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFOzEARTsxAAAAAAAAAAAAAAAAAAAAAAD6/P0AAAAAAP3/AAD9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJeWgAJiYmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/foA/f36AAAAAAAAAAAAA/8AAAP/AAAD/wAAA/8AAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxLSYAiXdjAAAAAAAAAAAAAAAAAAD+AAAAAAAAAP4AAAAAAAAAAAAAAP4AAAD9AAAA/QAA/v4AAP3/AAD9/wAA/f8AAAAAAAAAAAAAAAAAAAD+/gAAAAAAAP/9AAAAAAAA//0AAAAAAAAAAAAAAAAAAP39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//QAA//0AAAAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1TQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB/QADAf0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/QAA/v0AAAAAAAAAAAAAAAAAAAAAAAAAAAC2v8YAbH+NAGx/jQC2v8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz8/PAHGEmABxhJgAucLMAAAAAAC5w8wAcYeYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXdjAEU7MQD7/P4ABQQCAAAAAAAGBAMAAwEAAAAAAAD+/gAAAgIAAAUFAAAFBQAABQUAAAUFAAAAAAAAAAAAAEU9NABFPTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/UA/v77AP39+gD9/foAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQF4HdAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxAIl3YwAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAAAP39AAD9/QAA//0AAAAAAAAAAAAAAAAAAP39AAD+/gAA/v4AAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pz3AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAEDAAAAAAD9AP0AAAAAAAMAAAD9AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkVCALvG1AC5wckAAAAAAAAAAAAAAAAA/QADAAAAAAADAQMA/f/6AAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAIAAAAAAAAA/gAAAAAAAAAAAgMA/v79AAAAAAACAAAAAAADAAAAAAAAAAAAAAAAAAUBCwAAAAAAu8DRALvA0QC5vscARDwxAEU7MgAAAAAACAwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PgAwcnRAMHI0gDBydEA9/j4AAgEAAAAAAAAAAAAAAkICADKy9QAvsbPAEI6MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcF9KAMTNzwAAAAAABgADAAAAAAD9/AAA+vz9AAMAAAAGBAMACwwFAAAAAAAAAAAAAAAAABgQEAAAAAAAiXloAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD49OcAAAAAAP0ABQD9/PcAAwT6AAAAAAADA/4AAAAAAAAAAAAAAAAAAAAFAAAAAAAA/gAAAAAAAAICAwAA/gAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxALY2LAC5wswACAQIAAAAAAAA/wAAAAAAAP0BAAAAAAAAAAAAAAAAAAAF/wAA/QMAAAAAAAAAAAAA/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz9AAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP4AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9AAAAAAAD/wAAAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI9/bgBHPzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v0A/v79AP7+/QD+/v0AAgIDAAICAwADAQMAAgIDAAAAAAD+/v0A/gADAP4AAwAAAAAAAAAAAP7++wAAAAAAAAAAAAMDBgC7xc4Ad4mdADJOawB3iZ0Aub/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvsbPAH2MnQBDWnQAgpGjAMHJ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfYydAL7GzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRgZAINxYwAAAAAAAAAAAAAAAAAFBAIABgQDAAYEAwAFBAIAAAAAAAAAAAAAAAAAAAAAAAAAAABuYVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP78/gD+/P4A+/j7AP38/QD9+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wMAAP8DAAD9AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI98aABHPjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39AAD7+wAA/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//0AAAEDAAAAAAD9AQAAAAAAAP0BAAAD/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIQDcAucHJAAAAAAAAAAAAAAAAAAAAAAD9//oAAAAAAAAAAAAAAAAA/v79AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9//0AAAAAAAAAAAAAAAAAAgD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39+gADAwAAAAAAAAAAAAC7xc4Au8HOAAB/AABHQTcAAAAAAAYFBgBEPjQAAAAAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAEAAAAAAAC/xs4AAAAAAAAAAAC+xs8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAAwICAAAAAAAAAAAAAAAAAL/GzgBCOjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI5MQAAAGMAfY+dAAAAAAD7/P4AAAAAAAUEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAG5hWAA3MSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP38/QAAAAAAAAAAAAAAAAD+AfsAAAAAAAAAAAADBQYAAP8DAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIPjQAwcbUAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f0AAAAAAAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwAA/v0AAAAAAAAAAAD9AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPzcAj39uAHmJmwD7/P0A+vz9APv8/QADAf4AAgIFAAAAAAAAAAAAAgIDAP7+/QAAAAAAAAAAAAAAAAAAAAAA/v79AAAAAAACAgMAAAAAAAICAwD+/v0AAAAAAAAAAAAAAAAAAAAAAAICBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5v8kAAAAAAAgICQC7wswAAAAAAAAAAAAJCAgAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAMCAgADAwMAAAAAAAAAAAAAAAAAAAAAAL7GzwAgp64AY1lSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCOTEAv8gxAL7HzwAAAAAABQQCAAYEAwAAAAAAAAAAAAAAAAAAAAAAa1VKADcxLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9+/oAAAAAAAIGBQAAAAAAAAAAAAAB/QAA/wMAAAAAAAACAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMoRcNwAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPjQA/fXyAHyTrgAAAAAAAAAAAAAAAAAAAAAAAv4AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAD9//0AAAAAAAAAAAAA/wAAAAIDAAD+AAD+AgAAAv4AAAMC/QAA/gAAAP/9AAAA/QAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARz83AAD+AABxf5IAAwAAAAMAAAD7AAIA/v79AAAAAAAAAAAAAP/9AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA//0AAAAAAAAAAAACAAAA/gEDAAAAAAACAgMAAAAAAAABAAD+/P0AAAAAAAIEAwD9/wMAAAAAAAAAAAADAQMAAAT3AP39AAAAAAAAAAAAAPj59wAAAgAAAAAAAAABAAD79/oAAgIDAAMDAwAAAAAAA/8CAAAAAAAGBQYAAAAAAAD8AAAAAAAAAAAAAPr9+gADAgMA/f7+AP3//QAAAAAAAAAAAAAAAAAAAAAAAwMDAAD/AAAAAAAAAAEAAAAAAACmr74AJCAhAD85MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg3FjAOfjfADn7PgAAAAAAAAAAAAAAAAA+Pz4AAAAAAA/NzEAUk1KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAMA/QAAAAAAAAAAAAD8/QD4AAMABQMAAAb+AAADAAAAAAAAAAD/AwAAAAAAAAAAAAD9AAAAAwAAAAEAAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASklCAMHS3wC7xc8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAA/0AAAABAAAA/wAAAAMAAAAAAAD9AAAAAAAAAAAAAAD+/gAA/QAAAAICAAAAAAAAA/39AAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwCPgW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAA/gAAAP4AAAD+AAAAAAAAAAAAAAD+/v0A/v79AP78/QAAAAAAAAAAAP78/QD+/v0AAAAAAAAAAAD9//0AAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD9/f0A/v79AP39/QAAAAAAAAAAAAAAAAD6+/oA+vv6APX79QD6/foA9fv1APv++wD6/fsAAAAAAAMBAwADAQMAAwMDAAMCAgAAAAAA/f39AAAAAAAAAAAAAP0AAAD/AAAAAAAAgo+dAMHHzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhfWAAAAAAAAAAAAAAAAAAAAAAAAAAAAD83MQB+b2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/n6APr6+wD18/UA/fz6AAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl3YwBFOzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+AAAAAAAAAAAAAAAAAAAAAAAA/QMAAAD/AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A/v7+AP7+/gAAAAAA/gIAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQTcAj4FuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v79AP7+/QD+/v0A/f0AAP39AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAA/f39AP7+/QD7+/oA+/r7APv6+wD7+vsA+/r7AAAAAAD7/vsAAAAAAAUCBQAGAwUAAwICAAMCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAIKPnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQvLAB5bF0AAAAAAAAAAAAAAAAAPzcxAH5vYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAPv5+gAAAAAA+/j1APv49QD9/PoAAAAAAAD+AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEPDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAD+/gAAAAAAAAAAAAAAAAAAA/0AAAABAAAAAAAAAAAAAAAAAAADAQAAAAAAAAAAAAACAgAAAAAAAAAAAAADAQAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv4AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0E3AI+BbgALBgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9//0A/v4AAP7+AAD+/gAA/v4AAAD/AAAA/wAAAP4AAAAAAAAAAAAAAAAAAP39/QD9/f0AAAAAAAAAAAAAAAAA+vv6APr9+gD6/foAAAAAAAAAAAD9/v4A+v37APr9+wD9//0A/f39AP3+/gD9/v4AAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAACCj50AAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Ni8APDYvAAAAAAA8Ni8Afm9jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+foAAAAAAP38+gD+/PsA/fz6AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM04QAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFOzEAiXdjAP7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAAFAwAA/gIAAAAAAAAD/QAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAADAQAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQj4sAPj88AAFAgMABf/9AAUCAwADAAEAAwIAAAMCAAADAAAAAwIAAP3+AAD9/gAA/f4AAP0AAAD+APsA/gD7AP4A+wD+APsAAP//AAD//wAA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwCJemUABf8AAAX/AAAF/wAA/QAAAP0AAAD9AAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP79AAD+/QAA/v0AAP79AAAA/QAAAP0AAAD9AAAA/QAA//0AAP/9AAD//QADAAAAAAEAAAABAAAAAQAAAAEAAPsAAAD9AAAA/f8AAAD9AAAA/wAAAP8AAAD/AAAAAQAA/f79AP8AAAD/AAAABQUGAAgAAAAIAQMAAgAAAP3++wD9/PcAAPz3AAD9+gAA//0AAPz3AP38+gD9/PoA+vz9APf9+AD6/fsA/f/9AP3//QD1+f0A9fn9APX5/QC5w88AgpKdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeWxdAGtdSgB5bF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAABBgAAAQYAAAEGAAABBgADAQMAAwEDAAMBAwADAQMA+/v7AP39/QD9/PoA+/j1APv7+gAA/QAAAPwAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxAI54YwAD/QAAA/0AAAP9AAABAAAAAQAAAAMBAAD+/wAAA/4AAAEAAAD+AwAA/gMAAAD+AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAMAAAAAAAAAAAAAAAMBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGAAAAAAAAAgUAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv4CAAL+AgAC/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQTcAj4FuAEdBNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBgAAAgMAAAAAAAAAAAAA//0AAAAAAAD//QAA/v0AAAAAAAAAAAAAAAAAAAAAAAMBAwAAAAAA/f7+AP3+/gAAAAAAAAAAAAAAAAD9/f0AwcfPAMHHzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpFQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gD7+/sA/f39APr6+wD7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEU9MQBFPTEAAAAAAAAAAAAAAAAAAAAAAPv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFAAACBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAC/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0E3AI+BbgBHQTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAABAwAAAAAAAAAAAAAAAAAAAwYAAAEDAAABAwAAAgMAAAMGAAAAAAAAAAAAAAMGAAMCAgADAgIAAAAAAAAAAAD6+/sA/f7+AP3+/gAAAAAAAAAAAIKPnQDBx88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+APv7+gD6+vsA+/v6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJeWMART0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgW4Ae2VLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAA/f39AP7+/QAAAAAAAAAAAAAAAAAAAQMAAAAAAAAAAAAAAAAAAAIDAAACAwAAAQMAAAAAAAAAAAAABQsAAAAAAAAAAAAAAAAAAAAAAP3//QAAAAAA/f39AAAAAAADAwMAAAAAAAAAAADByM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/oA+vr7APv7+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwnsdOAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARDwyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAACAAAAP0AAAIAAAD9AAAAAQAAAAAAAAD+AAAAAAAAAAAAAAD+/gAAAAAA/QAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA+AAAAPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY11aABkbIAC2vscAtr7GAAUECAAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAACAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAEAAAAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/gAAAAAAAAAAAAAAAAAABgMDAAD9AAADBQMAAAAAAAAAAAAAAAAAAAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAAAAGAf0AAAAAAP3+/gAAAAAA/f/9AAAAAAAAAAAAAAAAAP39/QAKCggA9vv9AAAAAAC5w88A+/2dAIBxYAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AwUAAP/7AAAAAAAAAAAAAAAAAAAA+AAAAAAA/v7+AP39AwD99O8AAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAART0xAPPwUgCEm64AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAAAAAA/wAAAAAAAAIA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpCOgCUhHMAlIRzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fz9AAAAAAD9/P0AAAAAAP39/QD9/f0A/f39AP39/QD9/f0AAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMNCwAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv79QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJNQgBFOzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAgAAAAAAAAACAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkI6AAMBAwC4wMkAub/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gD+AAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/P0AAAAAAAABAAAAAAAA/v79AP39/QADAwMAAAAAAAMDAwAAAAAAAAAAAAMCAgADAwMA/f39AP3//QAAAAAAAAAAAAMBAwD9AP0AAAAAAAAAAAAAAAAAAAAAAEI6MQBBOjIAQjoxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/fsA/QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJd2MAAImdALvFzwAAAAAAAAAAAAABAwAAAAAAAAAAAAD//QAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD+AAAA/gAAAAIAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwBHQTcAuUDJALjAyQC2v8kAAAAAAAYAAAD6AAAAAAAAAAAAAAAAAAAA/v7+AAADAAACAAIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP38/QAAAAAAAAAAAAIFAwAAAAAA/f39AAAAAAD9/f0AAgIDAAAAAAAAAAAAAwMDAAAAAAD9/f0A/f7+AAABAAADAQMAAwICAAAAAAD9AP0AAAAAAO3z9QA6KCEAUlRKAEI6MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f36AAMDBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGOgoYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARDwyALvFzwAAAAAAAAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAACAAAAAACAAAAAQAAAAIAAAD+AAAA/QAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQTcAR0E3AEhAyQC4wMkAub/JAAMAAAAABQMAAAAAAAAAAAADAAMAAPwAAAAAAAAAAAAAAAAAAPv//QAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAD9AP0A/fv9AAAAAAD9/QAAAAAAAAMDAAD7+/oAAAAGAAMDAwD9Af0A/f/9AAAAAAAAAQAAAPwAAP0A/QD9AP0AAAAAAAD89wBFPjcARD43AEU+NwAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QP9AAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAA/f36AAUBAAAAAAAAAAAAAPj5+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFOzEAAHhlAHeMowAA/PgAAAAAAAAAAAAAAAAAAAEDAAAAAAAA//0AAAAAAAAAAAAAAAAAAAAAAAAAAAACAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwBHQTcAuUDJALjAyQC5w8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+/gD+AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA/f4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v79AAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAART00AEQ7MQBFPjcAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTovALw60gC7wskAAAAAAAAAAAAAAAAAAAAAAAACAgAA/gAAAP/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwAAAAAAAP/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP0AAAAAAAAAAAAAAAAAAAMAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0E3AEdBNwD4+PgAu8PMALzEywC7w8wAAAAAAAAAAAAAAAAAAAAAAP4CAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAgIAAAAAAAADAwMAAAAAAP39/QADBAMAAAAAAAAAAAAAAAAART00AEQ8NABFPTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl0XQD39/UAxMvUAAAAAAAAAAAAAAICAAAAAAAAAgIAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAP39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+/gD+AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAART00AEU9NACJeQAAvr/GANHY3wDS198A0djfAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAP0AAAADAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAwMAAAAAAAAAAAAAAgIDAAAAAAAAAAAAPzUvAEA0LgA/NS8AEBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdCOgAAAAAACwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAwAAAAAAAAAAACkjHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArpM/ZQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5aVgAhwCoAMTL1AAAAAAAAAEDAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCOSwAHBMIAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAAAAAAAAAAAAAAAAASklCAEpJAAAAAAAA5+TnANrj5QDByMwAAAAAAMHHzADn7PcAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAAAAAEo8MgAvKyYAAAAAAC4sJwAvKyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+EcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZFBAATUM3AMTP1AAAAAAAAAD4AAABAAAAAAAAAAMAAAD9AwAAAAAAAAAAAAAAAAAAAgAAAAAAAAAA/gAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAucHJAAAAAAAAAAAAuMDJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIQDcAAAAAAAAAAABHPzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvGzwB3jJ0AAAAAAAAAAAAAAAAAAAAAAAD9AwAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAH9AAAAAAAAAAAAvpqEABAUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3jJ0Au8bPAAAAAAAAAAAAAAAAAAD9AwAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAH9AAAAAAAAAAAAvpqEABAUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmgENJAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJdGMAMiAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm/xgBxf40AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV1NKAAD8AAAA/AAAAPwAAAD//QAA//0AAP/9AAD8AAAAAAAAAAAAAAAAAAAAAAAAAPwAAAD8AAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4AHF/jQC5v8YAcX+NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTsxAIl3YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAEdBOgAAAAAASEA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEU7MQBFOzEAAAAAAPv49QD9/PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPEhgQAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd4mdALO5vgAAAAAAAwQGAAIEBQAD/P4AAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAvp6EABAUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4/PgAAAAAAAAAAAAAAAAACAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaFtKALO5vgAAAAAA/fz6AP38+gD7/wAAAAEAAAAAAAAAAAAAAPD3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnByQC4wMkAucHJAAAAAAAhFBEAPDkxAHlxYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5v8kAyc3PAMHGzAAAAAAAAAAAADQ1NABEPDQART00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAucHJALjAyQBIQDcAuMDJALnByQAAAAAArZaEACkoIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGytEAx8rSAHNsXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBxswAwcbMAD86NAA/OjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vgC/vr8Ag4SDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnByQC4vsQAAAAAALm/xgAAAAAACAgIAEU+NwBEPjcART43AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/GALjAzAC5v8kAAAAAAAAAAABNRjcARD43AEU+NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm/xgC4wMcAysvOAAAAAABCPTcAQTw3AEI9NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRwZAI9/bgBxgZIAAAAAAAAAAAAAAAAAAP8AAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vHyALjAyQC5wckARz83AAAAAADa1doAxMfPAIcAnQB5cWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHF/kgC5v8kAGRQJAD86NAAAAAAAAAAAALC+zAC7w8wAAABoAEU9NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuMDJALnByQC5wckAAAAAAEc/NwC5wckADg0LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHytIAxsrRAACUAABzbF0AAAAAAAAAAAAAAAAAAP8AAAABAACCjJgAAAAAAH50aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL++vwC+vr4AQb5BAEJCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAucHJAHGBkgAA/PgAR0E6AEdBOgAAAAAABgUFALvCyQC7wskARbqlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxf40Aub/GAAAACABHQTcAAAAAAAAAAAC7wskAu8LJAAB8bgBFPjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/GAHF/jQAAAAAAU0k/AAAAAAC+w8kAvsPJABYSeQAsKywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEc/NwCPf24AcYGSAAAAAAAA/QAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4/AAAEQgJAAkCAQD49PAA+PTwADw5MQC1qpQAeXFjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKy9IAEQwJAI+BbgAAAAAAAAAAAAAAAAAAAAAART00AId4ZQD4/PcAcYSSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAJAEo8MgBHPzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAgECAAsKiYA5+zvAMPG0QAAAAAAAAAAAAAAAAAAAAAAtr7MAO/0AAA5NjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9AMVAO8EIAD7AQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi+xAAA/PgAj31rAEdBOgAAAAAAAAAAAAAAAAAAAAAAAAAAAIl8bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAysvOABEMCACPgXMAAAAAAAAAAAAAAAAAAAAAAEU+NwCHe24A+PwAAHGBkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUAAAQIAAACAwAAAAAAAAAAAIN5bgDFtqUAQkFCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPf24AMSQZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhIRsAAAAAAMHH0QDBx9EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAL7DzAAAAAAAQj00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEc+NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8rJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEPjcAAAAAALzCyQAAAAAAAAAAAAAAAAC7w8wAu8LMAEU+NABFPjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/GALm/xgBHQToAR0E6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+w8kAAAAAAEI9NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIQDcAAAAAALjAyQC5vsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbmddAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEA4AfnFdAIKPowCCj6MAAI+jADY1KQBIQDkAR0E6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAL/EzAAAAAAAvsPMAL7DZADv+PcAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFPjcAvD43ALvCyQBEw8wART00AAAAAAC8xMwAAAAAAEQ+NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/xMkAAAAAAL7DyQC+w1sA7/QAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHPzcARz83ALnByQC5ucEAR0LHAEhCOQBHQjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzMvAI+BbgBxf5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzkvAL05LwDBx9EAwcjSALC7wAC5v8YAR8DHAI+BcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQj00AAAAAAD0+voAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAASD43AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4sJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARD43ALvCyQC8xMwART00AAAAAAC7w8wART40AEU+NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIQDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI9NwAwmjmwAAAgAElEQVQAAAAA9PgAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAEhANwAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj39uALnByQC4u8QAub7GALm+xgBHQscAXk9CADE1MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwBHwDcAub/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwQAAAAAABHRT8AR0U/AD88MwC4wMcAub/GALlAOQBHQToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw4MQCtt8MAPDgxAEdBNwAAAAAAAAAAAAAAAAAAAAAA+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPoAAAD3APX29QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAART43ALEwKgCzu8MAcGFPAMHJ0QD4+PcAPzcmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv+AAAACAC2vckAPzkyAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ODQArbfBADw4NABHQToAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEc/NwA/Oy8Ah4BrAHeElwC5wswAAAMFADE1MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgW4AghCYAMHHzADn6PcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBOgBIQDkAAAAAALjAxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuMDJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3h5cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEuKQAAAAAAwcnRAMHI0gA/Ny8ASkVCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAART40AAAAAAC7wswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALjAxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgn99AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl8aQBFPjQAub/JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSmaMAcX+NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdBNwBHQTcAub/JALm/yQAAAAAAAAAAAAAAAAAAAAAAAAAAAHeHlwC7w8wAu8PMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNcUgA/Ny8AgpGjAMHJ0QA/OC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEU+NAAAAAAAd4SXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQToAR0E6ALm/xgC5v8YAAAAAAAAAAAAAAAAAAAAAAAAAAACCf30Awb++AIJ/fQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa+xgBsfI0Atr7GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzk0AH5xaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJzdEAub/GAHF/jQAAAAAAAAAAALm/xgC4wMcAAAAAAEhAOQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIQDcAAAAAAHF/kgCmq64A4uTlAAAAAADEx8kAd4eXALvDzABFPTQART00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/OC4AAAAAAD83LwA/Ny8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl8aQBFPjQAu8LMAGRqdADMztEAAAAAAAAAAADEx88Ah4+dAEtWbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEA5AJD+gDAAACAASURBVAAAAABxf40ApqeuAOLi5QAAAAAA4uLlAIJ/fQDBv74AP0FCAH6BgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2vsYAbHyNALa+xgAAAAAAAAAAAHeElwC7wswAR0E3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD85NACEdGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8cmMAoKm7ALvByQAyQlsAAAAAAPD8+AAAAAAAlIFzAEdBOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQTcAlwdxAIKMmACMm60AjJutAAAAAAAAAAAA+PwAAEc/NwCPf24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/usAEfzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYT0gAm6W0ABkWEwAZGBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAABlWUUADQLtALbE3wBmdIoAAAAAAAAAAADw+PAAAAAAAEpCPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0E6AJcHBgCCjJgAhJetAACXrQAAAAAAAAAAAAAAAABHQVcAhoFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpCOgCUhAAAbHyNAGx8jQAIBAgAAAAAAAAAAABHQTcAZllFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSTkIAw8rPALm+xgAQFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvByQC8wMkAAAAAAD8+NABKQToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7wskAvMLJAAAAAAAAAAAAQj03AEc/NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+v74Av8C/AFxeYgAnIyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwcfPAD85MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/JALjAyQCPgW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7wckAvMDJAAAAAAA/PTIAAAAAAEpCPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAub/JALjAyQAAAAAASEA3AAAAAABHQTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa+xgC7wcwAAAAAAEhANwBHQTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHF8jQCPhHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm+xgBHQjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr2ZI/AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl46V7AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENXxoEAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTOFhQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXXuY6AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhLrJcAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS5Fd6wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACo/LIEAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuCh08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgKzdgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYO+J3AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNKAxcAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyOJGjQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLHq9BAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhEACIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa4/pdAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw4yEAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6W7P4AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr9ev2AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXIOFvAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByeCi4AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+f5E4wAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADG3fDEAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCVh7MAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWhwJ5gAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdjaSoAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa+IEYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6FopQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGznaPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEue3UUAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1dqwewAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYMm2cAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEO/2bIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzl0TKgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKQt0RAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF+LOFIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhhLEagAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/10ebAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlV36IAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATKbdkQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFACgHAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5enjkAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWzOFAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADajOQXAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvARmgAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBA9yQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATqYvlAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZWimUAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqr4xQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2piu0AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIKm4AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjC+GxAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaPA9vAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKD7C3UAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGnVvQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvyCABAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMXR05QAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAndVJpAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZIUsBAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvkocYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAszg3vgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIDvfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/Uqq/AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgO9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYihRsAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCA738AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPvzvwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAABUtJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//xbCAYlihX5sAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/bg/bglight_02_ca.png b/arma/client/addons/phone/ui/_site/images/bg/bglight_02_ca.png new file mode 100644 index 0000000..3e122c7 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/bg/bglight_02_ca.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/AppStore.png b/arma/client/addons/phone/ui/_site/images/dark/AppStore.png new file mode 100644 index 0000000..9a6c362 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/AppStore.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/AppStore.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/AppStore.png.b64 new file mode 100644 index 0000000..5f5213a --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/AppStore.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEIO4s+h5gAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4f8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf////iAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAD//wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAAAA/wAAAAEAAAAAAQEBAAD/AAAAAAD/AAAAAQAAAP8AAAABAAEAAQAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQAAAAEAAAD/AAAAAQAAAAH///8AAQABAQEBAQEAAAAAAQEBAAEBAQD//v//AQEBAAAAAAAAAQABAQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAf////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAAAADgZGRnR6Ojo2AAAAAAAS4rHFQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAAAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAABAAAA/wAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAADvEhISIsDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAQEB/wD/AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQD/AP8AAP8A/wAAAAEBAQEA/wD/AAD/AP8BAQEBAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQEAAQD///8AAAAA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAAAAAAD/AP8AAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAB////AP///wAAAAD/AP8AAP///wD///8A////AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAAAQEBAP//////AP8AAAAAAAAAAAEAAAAA////AAAAAAABAAEAAAAAAAAAAAEAAAD/AQEBAAAAAP8AAAAA/////wAAAAAAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAA/wAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQAAAAH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQEAAQD///8AAAAAAAEAAQEAAAAA/////wEBAQD///8AAQEBAf////8AAQABAQABAP////8BAQEBAAAAAAAAAAD///8AAQABAf8A//8BAAEB/wD/AAEAAQEBAQEA/////wABAAEA/wD/AP8AAAEBAQH/AP8AAP8A/wABAAAA/wAAAQEBAQAAAAAAAAAAAAAAAAEBAQH/AP8A/////wAAAAABAQEBAP8AAP8A/wABAQEAAAAAAAAAAAAAAAAB/hQbAPY5SwD8HSgAAAD/AAbZzQEH0L//A+3nAQAAAAD/////AP8AAAAAAAEAAAAAAAAAAAAAAAD/Cg0A9kRaAPsbJgD/Cw0ABOPZAAq8pgED7ecAAQEBAQAAAAABAAEBAAAAAP8A/wAB/wEAAAAAAAAAAAAAAAAAAAAA//8A/wEAAAAAAQABAP8A/wABAAEAAAAA/////wH/////AAAAAAABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wEAAQD/Af8B/////wEBAQAAAAABAAAAAP8A/wABAAEAAAAAAP///wABAQEAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD/AAD/AP8BAQEB6+vrIAAAANAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAC0tLU////+w/wD/AAEAAQD///8AAQEBAP8A//8A/wABAQEBAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAD/AP8AAAAAAAD/AAABAQEAAAAAAP8A/wAAAAAAAAAAAAAAAAABAAEAAAAAAP///wABAQEA/////wAAAAAAAAABAAAA/wEBAQH/AP8AAP8AAAEBAQAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wAA/wD/AAAAAAAAAAAAAQABAP8AAAEBAQD2Q1oA81Z0AAAA/wAAAQEAAQAAAP8AAAAB9vMADLOZAAm8pQAAAQAAAP8AAAEBAQD/////AAAAAfg6TQD0V3UA/gkMAAAAAAAAAAEAAAAAAAAAAAALtJgADLOaAAAAAAD/////AAAAAQEBAQD/////AQEBAf8A//8BAAEB/wD/AAD/AAAAAAD/AQEBAf////8AAQABAP8AAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAA/wAAAAABAQEB/wD/AAAAAAABAAEAAAAAAAAAAAD/////AAAAAAEBAQH///8AAAAA/wEBAQH/AP8AAAAAAAEAAQAAAAAA////AAAAAAAAAQAAAP8A/wEBAQH/////AwMDYdLS0qEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBATH/////AP8AAP////8BAQEA////AAAAAAEAAAAA////AAAAAAEAAAAA//////////8AAAAB//////////8A/wAAAP8A/wABAAD/AP8A////AAD/AAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAP//AP8AAAEAAQAAAAAAAAD/AAAAAP//////////AAEAAP///wD///8AAP8A//8A/wD///8A/wD/AAD/AP8AAAABAAAAAQEBAQEA/wAAAQEBAPc4TADzVXMAAP8AAAD/AQAA/gAAAP8AAAD+/wD/CAwA81VzAPsnNAAA/wD/AAAAAP///wAAAAAB+jFBAPJfggD/CA0AAP8BAAD/AAAA//8AAP//AAD//wD1S2gA9UJZAP////8AAAABAAAA//////8AAAAA////AAEAAQH///8AAP8AAAABAAAAAAAA/wD/AAAAAAEAAAAAAAAAAP///////////wD/AAAAAAD///8A////AAAAAP8AAAD/AAAAAAABAAEAAAAAAAAAAAD/AP//AP8A/wD/AP////8BAQEBAAAAAf///wAAAAD/AAAAAf///wAA/wD/AQABAP////////8AAAAA/wEBAQAA/wAAAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//wAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAEA/wAAAP8A/wABAAEAAAABAAAAAQAAAAECAQIBAP8AAP8A//8AAAD/AAAAAQD/AAD/AP//AP8AAAAAAAEBAQEAAAAAAP7//v8BAQEA////APVLZwAA/wAAAP//AAD//wAA//8A//7/AAD/AAAA/wAAAP8AAPJegAD/Cg0BAAEAAAAAAAAAAAAA81R0AAD//wAA//8AAP//AAD/AAAB/wEAAP8AAAD/AAAA//8A9kxoAP8LDQEAAAD/AAAAAf///wAAAAABAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP////8A/wAA/wD//wAAAAD/AP8AAP8AAAAAAAAAAAAAAQEBAP8A/wAAAAAAAAAAAf/+//////8A//7//wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAAABAAAAAAAAAAAAAAEBAQEBAQEAAAAAAP////8AAAAA/wD/Af////8AAAAA/wD///////////8AAAAAAAEAAQEAAAAB/////wAAAAAA/wAAAQEBAAAAAAD+/v7/AAEAAAEAAQH///8A+iYzAP4TGwAA/wAAAf8AAAH/AAAB/wEAAf8AAAD/AAAB/wEAAf8BAP4SGwD2QVoAAP8AAP/////1TGcA/RIZAAD/AAD//wAAAP8AAAH/AAD///8AAP8AAAH/AAAB/wAA/wgMAPwbJwAAAAAB/wD/AAEBAQEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wD/AAEBAQAAAAAAAAAAAf8A/wEBAAEBAAEAAP7//gAAAAAA/v/+AAEBAQEAAAAB/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAAD///8BAP8AAP/+////AP8AAAAAAAAAAAD+/v4A/////wAAAAH/AP8AAQABAAAAAAH///8AAP8AAAEBAQEAAAAA/////wAAAAD/////AAEAAf///wAAAAAB/v/+AAAAAAABAQEB////AAAAAAD/AP///hIbAAD//wAB/gAA//4AAAD/AAAA//8AAP8AAAH+AAAA//8AAP7/AAD//wD3QVoA/woNAP4TGwH4N04AAf8BAAH+AAAA/gAAAf8AAAD/AQAB/wAAAf8AAAD+AAD//gAAAP8AAP0SGQD/AP8AAQABAP8A/wAAAAAAAP8AAAAAAAD/AP8A////AP8A/wAAAAAAAQABAP///wD///8AAQABAAAAAAD///////7//wAAAAD/AP8AAAAAAP////8AAAAAAQEBAf8A//8AAAAAAAAAAP8A/wAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAEAAAEBAQEAAAAA/wD/AP8A/wAAAAAA/////wAAAAAA/wABAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAAAP///wAAAAAAAAEAAQD/AAAA/wD//wD/AAAAAAAAAAABAAAAAQAAAP8A/wAB/wD/AAAAAP8AAQABAP8AAP////8AAAAAAAAAAf///wAAAQABAAAAAAABAAABAAEA////AP8A//8AAAAAAAEAAf///wAAAAABAfbxAAD/AQABAAAAAAD/AAD+AAAAAQAA//8AAAEAAAAAAAAAAP8AAAAAAAD/CQ0A9FJzAAAAAAD+EhkAAP7/AAAAAAABAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAABAQAAAP8AAAH28wAA/wAA/wD//wAAAAH/AP//AAAAAQABAP8A/wABAAAA/wD/AAH/AP8AAAAAAAAAAAAAAQAA/wD/AAD/AP8AAQABAP8AAAD/AAAAAAAAAAAAAAABAAH///8AAAAA/wAAAAAAAQAAAAAAAAD/AAD/Af8AAP8AAAABAAABAAEA/////wAAAAEA/wD/AAAAAQAAAP//Af8BAAAAAAD/AP8AAAAAAAAAAAADPYIAAAAgAElEQVQAAP8AAAABAAAAAAABAAD///8AAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP8A//8BAQEBAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAIBAgH/AP8B/////wAAAAAAAAAA////AAABAAEA/wAAAQABAP8A/wAAAAABAAAAAAAAAAAAAAAAAAAA/wABAAEA/wAAAAAAAAAAAAEA/wAAAAAAAQAAAP8AAAABAAAA/wAAAAAA/wAB/wD//wEAAQEAAQAAAAAAAP8A/wABAAEB/////wEAAQAAAAABBdrNAAL18gD+CQ0AAAAAAAABAAAA/v8AAQEBAAD/AAAA/wAAAAAAAAEAAAD//wAA+TdOAP8AAAAA/gAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP8AAAAAAAD///8AAQEBAATazAAAAAAAAAAAAAAAAP8AAAABAAAAAAD/AAAAAAAAAAEAAQD/AAAAAAAAAAAAAAAAAAH//v//AQEBAQAAAAEA/wD/AAAAAQAAAAD/AP//AQABAAD/AAEAAAAAAAAAAf////8AAAAA/wD/AAEAAQAA/wAA/////wEAAQH/AP8AAAAAAAAAAAAAAAABAQEBAP7//gAB/wEAAAEAAAD/AAEAAAAA/wD//wEAAQH///8AAAAAAP8A//8BAAEB/wD/EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP//AAAA//8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAf///wAAAAAAAAAAAQAAAAEAAAABAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAAAAP//////AP8AAAAAAQD/AAD/AP8AAAEAAAAAAP//////AAAAAP8A/wAAAAAA////AAAAAAH/AP8AAQABAf////////8AAAAAAAEAAQH/////AQABAQAAAAEBAQEAAffzAAi+pQABAAAAAP//AAD+AAAA/gAAAP4AAAEAAAAA/wAAAP8AAP/+AAAA/wAAAP8AAAD/AAABAAAAAP8AAAD/AAAA/wAAAf8BAAD/AAABAAAAAP8AAAD/AAAB/wEACrSYAAL38wAAAAAAAAEAAQAAAAEAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD//wAAAAABAQEB/wD/AAAAAAD///8AAAAAAAAAAP8BAAEBAAAAAQAAAAAAAQAAAAAAAAABAAH/////AQABAQAAAAAAAAAAAAEAAQABAAAAAAD/AAAAAQAAAAAAAAAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAP////8AAAAA/wD/AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP//AP8AAAAAAAAAAAD/AP8A/wD/AAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAAAA/wD/AAAAAP///wABAQEB/////wEAAQH/AP//AAEAAQAAAAAA/wD//wD/AAAAAAAAAAAA/////wAAAAABAQEB/wD/AAAAAAD/////AAAAAAnApgAB9PIAAP8AAAD//wAAAAEAAP8AAAD+AAAB/wAAAf8AAAD//wAA/wAA//8AAAH/AAD//gAAAf8AAAH/AAAA//8AAP8AAAH/AAD//gAAAP//AAH/AAAC7eUAB8my/wAAAAAAAAAA////AAAAAAD///8A/////////wH/AP8A/wD/AP///wAAAAAAAQABAf//////////AQABAP8A/wAAAQAB/wD/AP8A/wH/AP//AAAAAP8A/wAA/wD//////wD/AP8AAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAAAAAAB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAIDAhD/AP8A/wD/AAABAAH///8AAP8A/wABAAEAAAAAAQABAAEBAQAA/wAAAP8AAQEBAQEBAAEBAAAAAP8A/wEBAAEAAAAAAP8A/wABAAEAAP8AAP///wD/AP//AP8A/wAAAAAAAAAAAAAAAP8A/wAAAQABAP8AAAAAAAH/////AAAAAf8A/wAA/wAAAQABAP////8AAAAAAAAA/wAAAAD/////AAAAAP8A////AP8AAAAAAP///wD/AP8B/////wH38wAKt5kAAP8AAAD+AAAB/wAAAf//AAD/AAD//v8AAP8AAAH/AQAB/wAAAf//AAD/AAAB/wAAAP8AAP/+/wAA/wAA////AAD/AAAB//8AAP4AAAD/AAAKtpkAAu3mAf8A/wD/AP8AAP8AAP////8AAQABAAAAAQAAAAABAAEAAQABAAEBAQD/////////AAAAAAEBAQEB/v/+/wD/AP8A/wD/AP8AAAEAAQAA/wAB/////wEAAQD///8AAQEBAQABAAEBAQEB/wD/AAD/AP8AAAAAAP8A//8A////////AAAAAP8A/wEA/wAAAAEAAP8A/wAA/wD//wD/AP////8A/wD/AP8AAQAAAAH/AP8AAP8A/wD/AAH///8AAAAADwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP79/hAA/wAAAP8AAAD/AAAAAAAAAAAAAQAAAAAA/wAA////AP///wAAAAD/AAAA//////////8AAAAA/wAAAAD+//7//////wAAAAD///8AAAAAAAAAAP8A/wABAAAAAf///wAAAAAA////AAD/AAAA/wAA////AAAAAAAAAAABAAAAAAD/AAAAAAAB//////8A/wABAQEBAP8AAQAAAAAAAAABAAAAAQD/AAEAAAAAAP8AAAAAAAAA/wAAAAAAAf///wAHwKUABtvMAAH/AAAA//8A//4AAAD/AAABAAAAAP//AP/+/wAA/wAAAP8BAAD/AAAA/wAA//7/AAD/AAAB/wEAAP8AAAD/AAAA/gAAAQABAALs5QAHybIAAAEAAAD/AAAA/wD/AAAAAAAAAAEA/wD//wD//wAAAAD///8A/v7+/////wAAAAABAAAA/wAAAAD///8AAQABAQAAAAEAAAABAAAAAP///wAAAQAAAAAAAf///wAAAAAB////AAD/AAD/////AAAAAAAAAAAAAAAAAQEBAQAAAAH/AP8AAP8AAAD/AAD/AP//AP8AAAD/AAAAAAABAAAAAAAAAAEAAAABAAAAAAD/AAAA/wAAAAEAAQAAAAAAAAAA////EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQD/AAD/AP8A/wD/AAAAAAH/AP8A/////wAAAP8A/wAA/wD///8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAQAAAAD///8AAAAAAP8A/wEAAAAAAAAAAAAAAAD//////wD//wABAAAAAAAA/wD/AAAAAP//AP8ACbeZAAAAAAAA/wEAAf8AAAD+/wAA/gAAAP8AAAD/AAAA/wAAAP//AAD//wAA/v8AAf8AAAIAAQD//v8AAf4AAAD+/wAAAAEAAP8AAAydcv//////AP8AAAAAAAAAAAAB//////8A//8AAAABAQABAf8A//8BAQEAAQEBAf////8AAQAA////AAAAAP//AP//AAAA//8A/wAAAAAAAAAAAP8A//8A/wAAAAAA/wAAAAAAAAAAAAAA//////8AAAABAAAAAAAAAAH///8A/v/+/wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wABAAAAAAEBAQEAAAAAAAAAAP8A/wD///8A/////wD/AP//AP8A/wD/Af////8AAAAA//////8A/wD/AP////7//wAAAAAA/wAAAQABAP8A/wABAAEAAQEBAf///wEAAAAAAQABAQAAAAAAAAAA/wD/AP8A////AP8AAAAAAAEAAQH/AP///wD/AAAAAAEAAAAAAAAAAAEAAQAAAAAAAAEAAP///wAA/wAAAP8AAAD/AAD/////AQABAAAAAAEAAAAAA9vL/wbSvwAA/v8AAP8AAAD/AAAA/wAAAP8AAAH/AAAA/v8AAf8BAAD+AAAA/wAA////AP/+/wACAAEAAP8AAAD/AAAA/v8ABsmxAAPk2AEAAQABAAAAAP8A/wD/AP8AAAAAAQEAAQH/AP8A/wD//wAAAAH+//7//wD/AAAAAAD//v//AAEAAQAAAAEA/wAB/wD/AQAAAP//////AAAAAAEAAQH/AP8A////AAAAAAD/AP//////AQEBAQH/////AP8AAP8A/wAAAAAAAAAAAf8A//8BAAEBAAAAAP8A//8BAAEB/wD//////wABAAEBAAAAAQAAAAH/AP//AQABAf/+////AP8AAAAAAAABAAH/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAf8A/wAAAAAA////AAEAAQD///8AAAAAAAEBAQD//////wD/AAD/AAAAAAAAAAAAAAAAAAEAAAAA/wD/AP////8AAAABAP8AAAD/AP//AP8A////AP////////////7/AAABAAAAAAABAAAAAQAAAAAAAAAA//////////8BAAEAAAEAAQmvi/8B9vMAAf8AAAD//wAA/wAAAf4BAAD/AAAA//8A//7/AAD/AAAB/wAAAf8BAAD/AAD//v8AAP8AAAD/AAAA/wAACbiYAAABAAAAAAAA////AAD/AAABAAEAAAEAAP8A/wABAAEAAP8AAQD/AAAA/wAAAAAA/wABAAEAAQABAAAAAP////8AAAAAAP8A/wD/AAEAAAAB/wD//////wAA/wD/AAEAAf////8BAAEBAAAAAP///wAAAAAB/////wD/AAD/AP8AAAAAAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAA/wD/AQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wEAAQAAAQAAAAAAAP8A/wAAAAD/////AP////8AAQABAP8AAAAAAP////8AAP8A/wD/AAAA/wD/AQABAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAAABAAAAAAD/AAAAAQAAAAAA/////wAAAQABAAAAAQAAAAEAAAAAAP8A/wLu5gEIwaf///8AAAH/AQABAAEAAP//AAD/AAAA/gAAAf8AAAH/AAD//wAAAP//AAH/AAAA//8AAf8AAAH/AAAJuZkAA+/nAAD/AAAAAAAAAAAAAAAAAP////8AAP8AAAD/AAD///8AAAAA/wAAAAAAAAABAQABAQD/AP8A/wD/AAAAAAABAAEAAAAAAAAAAQAAAP8AAAAAAP8AAAAAAAAAAAAAAP8AAAABAAH/AP8AAAEAAAAAAAAAAAAAAAAAAQABAAAA/wAAAP8AAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AP///wAAAAABAAAAAP///wABAAEA/////wD/AAD/////////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAAD/AAAAAAABAAAAAAAAAAEA/wAA/wD//wAAAAEAAAAAAAAAAAABAAAAAAAB////AAAAAAEAAAD/AP8AAAABAAEAAAAA/wD//wAAAAAAAAD//wD/AAAAAAD///8AAAAAAQAAAAD///8AAAAAAAAAAAD///8A/wD/AAAAAAAGwqIAAu7mAP/+/wD//v4A//7/AAH/AAAAAAEAAP8AAP///wAA//8AAP8BAP///wAA/wEA//7/AALu5gAIuZcA////AP////8A/wAA/wD//wAAAAEAAAAAAAAA//8A//8AAAAAAAAAAf8A//8AAAAA/v7+/wAAAAEAAAABAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAQAAAAAAAAABAAAA/wD/AAAA/wAAAP8AAAAAAAD/////AAAA/wD/AAD/AP//AAEAAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAP///////v///////wAAAAAAAAAAAAAAAP8A//8AAAAAAQEBAQAAAAD/AP8A////AP/+/wAAAAAA/wD/////////AP8A////////////////AQABAf//////AP8BAQABAP8A/wABAAEAAAAAAP////8BAAEAAAAAAAAAAAD/AP8AAQABAf8A//8C+PQBCbmYAAH/AQAB/wEAAP8AAP/+/wAA//8AAP8AAAH/AQAB/wEAAf8AAAH/AQAA/v8AAQABAAe5lwD/////AAAAAAABAAEAAQAAAQABAQAAAAAAAAAAAAAAAQEAAQEAAAD//////wAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAP//////AP8AAAAAAAEBAQH/AP8A/wD/AAAAAAAAAAAAAAAAAf////8AAAAAAAAAAP8A//8BAQEB/wD/Af8A//8A/wAAAP8AAAEAAQH/AP8A/wD///8A/wAAAAAB/wD//wAAAAAAAQAB/wD/AAD/AAABAAEBAAAAAQEAAQH///8A////AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wABAAEAAAAAAAAAAAD/AP//Af8BAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAB/wD/AAABAAEA/wD/AAAAAAEBAQH/AP8AAP8A//8B/wAA/wAAAAEAAAAAAAEAAAAAAP8AAP8A/wAA/wD/AAEAAQAAAP//AP8BAAAAAQAAAP8AAAABAAEA/wEAAQH/AP//AAAAAAAAAAAA/wAA/wD//wAAAAEAAQAA/wD/AAAAAAH/AP8AAP8AAAAAAAAAAAAA/wD//wAAAAAAAQAA/RonAP///wAB/wAAAQAAAAAAAQD///8AAAD/AAABAAAAAAEAAAAAAAD//wABAQEAA+XYAAbMsgAAAAAAAAAAAAEAAQD//v//AAAAAQAAAAABAQEA/wD/AAD/AP8AAQABAAEA/wAAAAH/////AAAAAQAAAP8AAAAAAAAAAQAAAAAA/wD//wD/AAABAAEAAAAAAP8AAP8B/wAA/wD/AAEAAQAAAAAAAAAA/wD/AAD/AAH/AP8AAAAA/wEBAQEAAQAA/wD/AAD/AP8BAQEB////AAEBAQD/AP8AAP8AAAABAAD///8AAAAAAAABAAD///8AAAEAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AP8A/wAAAAD/AP8AAAD/AP8AAAAB////AP///wAAAAAAAAEAAQD/AAAAAAAAAQABAAAAAAD//////////wD/AAAAAQABAP8A/wAAAAH/////AAAAAP8A/wAAAAAAAP8AAf///wAAAAAB/wD/AAABAAEAAAAAAAEAAQAAAAD/////AP8AAAABAAABAAEA/wD//wAAAAD/AP//AAAAAAABAAH9ERkA+TpaAAH/AAAA/wAAAP8AAAAAAAAB/wAAAAABAAD/AQAA/v8AAP//AAD/AAAA/v8ACqFxAAD/AP8AAAAAAAAAAP///wAAAAAAAAAA/wAAAAD/////AP8AAAAAAAAAAAAAAP8AAQEAAQAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAAB/wD/AAAAAAAAAAAAAAAA/wEAAQAAAAABAQABAAAAAAH///8A/////wAAAP8AAAAAAAAAAAAAAAD+//7/AP8AAAAAAAH///8AAAAAAf///wAA/wAAAAAAAf////8A/wAAAP8AAAD/AAEAAAAAAP8AAAD/AP////8AAP8A//8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD+//4A/wD//wD/AAAAAAAAAP8AAP8A//8A/wAAAAAAAAAAAAD/AP//AP8AAP//////AP8AAAEAAP8A/wD/////AAEAAAAAAAAA/wAA/////wAAAAAAAAAA////AAD/AAAAAAABAAAAAQAAAAAA/wAAAAAAAQD/AAABAAEBAQABAAEBAQEA/wAAAAEAAAAAAAAAAAD/AQABAAD/AAAAAAD/AP8AAAAAAAD/AP8BAAAAAAD/AAD///8AAQABAf8A//8AAAAAAAAAAQD/AAD4Q2gAAP8AAAD/AAAA/wAAAP8AAAD+/wAA/wAAAP7/AAD+/wAA/wAAAP4AAP/+/wAGzLIAAu7mAAABAAEAAAAB////AP8A//8AAAABAAAAAQAAAAAAAQABAAAA/wAAAAH///8AAAAAAP///wAAAAABAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAQABAf////8A/wAAAAAAAf7//v8AAAAA//////8A//8AAAD/AQABAQAAAAH/AP8AAAAAAf///wABAAEBAAAAAP8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEBAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD/AP//////AP//AAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA////AAD/AAAAAAD/AP8AAP8A/wAAAAAB////AP8A/wD/AP8B/wD///////8BAAEA/wD/AP////8AAAAA/////wEAAQEAAAABAAAAAPszTgD7Mk0AAP8AAAH/AAAA/wAAAf8AAAD/AAAA/wAAAP7/AAD/AAAB/wAAAP8AAAPv5wAHu5f/AAAAAAD/AAD6M04A/CI0AAEAAQEAAAAAAAAAAP8A/wAA/wD//wD/AQAAAAABAQEA/wD/AP8A////AP8A////AAAAAAAA/wAA//7//wAAAAD//////wD/AAAAAAH/AP//AAEAAAEAAQEAAAAA////AAEAAQH/AP8BAAAAAAABAAABAAEA//////8A//8AAAAAAAAAAAEAAQEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAAAAAD/AAAAAf////8AAQAAAQABAf///wABAQEAAP8AAP////8AAQABAP8AAAABAAEAAAAA/////wAAAAAAAQAAAAEAAf8A/wAAAAAAAQABAP8B/wEA/wD//wD//wABAAEAAAD/AAAAAQAAAP//AP8BAP8A/wEBAQH/AP8AAP8AAAABAAD/AP8AAQABAAAAAAAAAAAAAAAAAQEBAQD/AP8AAP8A/wABAAH/AP8AAQEBAf8A/wAAAAAA/wD/APhCaAAA/wEAAP//AP8BAQABAAAAAAABAAAA/wAA//8AAAAAAAAAAAAAAAAAAP//AAbNsgAB7+YA/wAA//4SGgH5QmgAAQAAAAyMSgD//v//AQEBAQD/AP//AP8BAQEBAP8A/wAA/wAAAQABAP8A/wEA/wD/AAEAAf////8AAQABAAAAAQAAAAAAAQABAAAAAAAAAAAAAAABAP8AAP////8AAAABAAAAAP////8AAQAB////AAAAAAAA/wD/AAAAAAD/AAD/Af8AAQABAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAA/wEAAQH//v8AAGKQlWkAACAASURBVAAAAQABAAAAAAABAQABAP8A//8A/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAQEBAQEA/wAAAP8A/wAAAAAA/wD//wD/AAAAAAAAAQABAAAAAQAAAAAAAAABAAAAAAD/AAAA/wD/AAEAAf///wAA/wAAAAAAAAD/AAAA/wD//////wAAAAAAAAAAAP8AAP///wAAAAAAAAAAAQD/AP8A/wD/////AAAAAAAA/wD/+jpbAP4PGQAA/v8AAP8AAAD+/wAA/wAA//7/AAH/AAABAAEAAQABAAH/AAD//v8AAu/nAAa9lwAAAAABAAEAAflCaQD+DxkA/hAaAPk5WgAAAAAA/wD/AAABAAAAAAAA/wD/AAD/AAAA/wD//////wAAAAAAAAABAP8AAAAAAAAAAAAAAQEBAP////8A/wAAAP8AAAD/AAAA/wD/////AAAAAAEAAQAAAQEBAQAAAAEA/wD/AAAAAAD/AAAAAAABAAEAAQAAAAEA/wAA/v/+/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAf///wAAAQAAAAAAAAD/AP8AAAAA/////wD/AAAAAAABAP8AAf8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP////////7//v8A/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA////AAAAAAD///8A/////////wD/AP8AAAAAAP////8AAQABAP8AAAD/AAAA/wD/AAAAAAD/AAAA/wAAAP8AAP8A/wH/AP8AAP8A/wAAAP//AP8AAAAA//8A//8AAAABAAAAAQEAAQD//////wD//wAAAP///////wD//wABAAEAAAABAAAA/wD/AAD+ERoB+jlcAAD/AAAA/wAAAQABAAEAAQD//v8AAf8AAP/+/wAA/gAA//7/AAD+AAABAAEAB72XAAD/AP//AP8A+jFOAPwxTgABAAEAAP4AAPpBaAD/CA0BAP8A/wD/AAEAAAAAAP8AAP8A//8AAAABAAEAAQD/AAD/AP///wD///8A/wD//////wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAA/wAA////AAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAP8A//8AAQAAAQABAf///wAAAAABAAAAAP8A//8A/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAEA/wD/AAAAAQABAAEAAAAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEAAQABAQEAAQH/AP8A/wD//wAAAAD/AP//AP8AAAAAAAAAAAAA////AP///wD///8AAQEBAQAAAAABAAEAAP8AAAAAAAAAAAABAAAAAQAAAAH//v//AAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEBAAAAAAAAAAEBAAEBAAEAAQD/AAD/AP8AAAAAAP///wABAAEBAAAAAf8A/wEBAAEBAAAAAf///wAAAAAAAAEAAf8A///6QWgA/w8ZAAH/AAABAAEAAP8AAAD+AAAA/wAAAP//AAH/AAAA//8AAf8BAAD/AAAE1b4ABc6yAAAAAAEBAAEA+0FpAAD+/wAA/gAAAP//AP8HDgD6QmkAAAAAAP//////////AAAAAAEBAQH/AP//AP8AAP8A/wABAAEBAAAAAAAAAAEAAAAB//7//wAAAAD//////wD///////8AAAAA/wD/AP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD//////wD/AAAAAAAAAAAA/wD/AAAAAAD/AP//////AAAAAAAAAAAAAAAAAP////8AAAAAAAAAAP8A/wD///8AAAAAAP///wD/AP8AAAAAAP8A//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAB////AP////8A/wAAAAAAAQAAAAAA/wAA/wD///8A/wD/////AP8AAAEAAQAAAAAA////////////////AAAAAf8A/wAA/wD//////wEAAQAAAQAB/////////wD/AP8A////AAAAAAD/AP8A////AAAAAAD/AP8A////AAAAAAD/////AP8AAAEBAQEA/wD//wD/AAAAAAAAAQAAAQABAAEAAQD/AP8AAP8A/wAAAAD///8A////AP8PGwH7ME4AAP8AAAD/AAAA/v8AAP7/AAAAAAAB/wAAAf8BAAD/AAAA/wAAAP//AAD//wAHtooA/wD/AP/////7IDMA/g8ZAAEAAQAA//8A//8AAAH/AAD6OFoA/RgmAQAAAAABAQEBAAAAAP///wAAAAAB////AAAAAAD/AP8AAAAAAQEAAQAAAAAAAQEBAQAAAAABAQEBAAAAAQAAAAH/AP8AAAAAAAEAAQEAAAAA/wD/AP8A/wAA/wAA/wD/AAD/AP8AAAABAP8AAAEAAQEA/wAAAP8A/wAAAAABAAEBAAAAAAD/AAD/AP8A/wD//wABAAH/AP8A////AAAAAAAAAAAB/////wAAAP8AAAAA/////wAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP////8AAAAA/wABAAEAAQAAAAAAAP///wAAAAAAAQABAQD/AAAAAQABAAAA//8A/wAA/wAAAQEBAQAAAAEAAQABAAAAAAEAAQAAAQABAAEAAf////8A/wD/AAAAAQD/AAAA/wD/AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAEAAf///wABAQEB/wD/AP8A/wAAAAAAAAAAAP8A/wD///8A/v/+//////8A/wD/AAEAAQD/AAAAAAAAAQABAPhRgQAA/wAAAP4AAAH/AQAA/wAAAP8AAAD+/wAB/wEA////AAD/AAAA/wAAAf8BAATOs/8B8OYAAP8A/wABAAH9ME8AAP4AAP/+/wAA/wAAAf8AAP///wAA/wAA+Uh2AAABAAH///8A////AAD/AAAAAAAAAAEAAAAAAAAA/wD/AP8A//////8AAAD//wD/AP///wD///8AAAAAAAAAAAAA/wD/AAAAAP///wD///8AAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAAAAAP7//v//////AQEBAf///wD/AP8AAP8A/wAAAAAA/wAAAP8AAQEAAQAA/wAAAQEBAAD/AP8AAAAAAAAAAAD/AAEAAAAAAAAAAAD/AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAQAAAQEBAf///wAA/wAAAP8AAP8A//8AAAAB/////wAAAAAAAAAAAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAEAAP///wAA/wD//////wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAQAAAP8A/wAAAAEAAQD/AAAA/wD///////8A//8AAAAA/////wD/AAAAAQABAP8AAAAAAAAAAAAAAQABAQABAAEAAQABAP8AAP8A////AP//+i9NAP4gNQAA/wAAAAAAAP///wAA/wAAAP8AAAH/AAD///8AAf8AAAH/AAAA/wAAAO7kAAa/lgH/////AAEAAQD/AP/8KEEAAP8AAAD+AAAA/wAAAP8AAAH/AQAB/wEA/iA0AP0fNAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAQEBAQAAAAEA/wAAAAAAAP8A//8AAQAAAAAAAAAAAAAAAAAB/////wABAAAAAAD/AP8AAP8A/wAA/wAAAAAAAQD/AAAAAAAAAAEAAAEAAQEAAAABAAAAAAABAAAA/wAAAQEBAf8A/wAAAAAAAAAA//8A/wAAAAD/////AAAAAAEAAQAAAAAAAQAAAAAA/wD//wD/AP8A/wD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA////AAEAAQD/AP8AAAAAAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAAAAAAAAAD//wD/AAAAAAD///8AAP8AAP8A/wD/AP8BAQABAf////8AAAABAAAAAQAAAAAAAAABAAAAAP8A/wH/AP//AP8AAAAAAAAAAAABAQABAQEAAQH+//7/AQABAAAAAAAA/wAAAAAAAP/+//8A/wAAAAAA/wD/AAAA/wAA/wD/AAAAAAEBAQEB+0BpAP/+/wAA/gAAAP8AAAH/AAAA/v8AAf8AAP/+AAAB/gAAAP8AAAD/AAAB/wAAB8CYAAHw5QABAAEB////AP0gNAEABg0AAP8AAAEAAAAA/gAAAf4AAAD//wD///8A//4AAPlQgwD+CA3/AAAAAAAAAP8AAAAA/wD//wAAAAAAAAAB/v/+/wAAAAD///8AAP8AAAAAAAH///8A////AAAAAAAAAAAAAAAAAP//////AP8B/wD/AAEAAQEAAAAAAAAAAP8A//8AAAAAAP8AAP8A////AP///v/+AP////8AAQAA/v7+/wEAAQH/AP8AAAAAAQD/AAAAAAABAAAAAP8A////////AAAA//8A////AP8AAAAAAAEAAQEBAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP8A/wABAAEAAAAAAAEBAQD/AP8BAAAAAAD/AAD/AP//AP8AAP8A/wAAAAABAAAAAP////8A/wD//wD/AAD/AP8BAQEA/////wAAAAD/AP8AAAAAAP8A/wD/AP8A//7//wAAAP8AAAABAAEAAP8A/wD/AP///wD/AAAAAAAAAAAB////AP8A////////AAAAAAABAAH/AP8A/wD/Af8A/wD/AP8AAAAAAAEAAQD6PmkA/w4aAAH/AQABAAAAAf8AAAD/AAAA/wAA//4AAAD//wAA/wAA//7/AAD+AAAB7uUAA8+x/wAAAP8AAAAAAAAAAP4YJwD//wAAAf8AAAD+AAABAAAAAP8AAAD+AAAA/v8AAf8AAAAPGwD8N1sB/wD/AAAAAAH/////AAAAAf//////////AAAAAf8A/wAAAAAAAAAAAAEAAQAAAAAAAAAAAP////8AAAAAAQABAQAAAAEBAAEAAQABAP8A/wD/AP8A/////wAAAAEAAAAA/////wEAAQEAAAABAAAAAAD/AAAA/wAAAAEAAf8A/wABAAEAAAAAAP///////////wD//wEAAQEA/wAA////AQEAAQEAAAABAAAAAf8A/wAA/wAA//7/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/////wAAAAD///8A////AP/+//8A/wD//////////wAAAAAB/wD/AAD/AP////8AAP8A/wAAAAEAAAABAQABAAABAAEA/wAAAQEBAQABAAEA/wAA/wD/AAAAAAAAAAAAAQEBAQEAAQEAAAAA////AAD/AP8A/wABAP8A//////8AAAD/AAAAAQD/AAEAAQAB////AAD/AAAAAAAAAAAAAAD/AAAA/wD/AP8AAP4PGQD8N1sAAP//AAAAAAAA/gAAAP4AAAD+AAAB/wAAAP//AAEAAQAA//8AAP8AAAAAAAAGuYsAAQEBAQAAAAH/AP8AAQABAAAHDQAB/wAAAP//AAD/AAAA/gAAAQAAAAD/AAAB/wAAAP8AAP///wD8NlwA/wcOAP8A/wAAAAABAP8A/wEBAQEAAQABAAAAAAD/AP8AAAAB//////8A//8A/wD/AP8A/wAAAAD//////v/+//////////8A/wD/AAD/AP8A/wD/AAEAAAEAAQD///8AAAEAAf///wD/////AQABAAABAAH/AP8AAP8A/wEAAQD//////wD/AAABAAAAAAAAAQABAf8A/wAAAQABAAEA/////wAAAAAAAAAAAAAAAAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAQD/AP//AP//AAAA/wAAAAEAAQAB/wD/AAAAAAAA/wAAAP8AAAAAAAEBAQEAAAEAAf8A//8AAAAA////AP//////AP8A////AAAAAAAAAAAAAP8AAAD/AAAA/wAA////AP////8A/wAAAAAAAAABAAEAAAD/AAEAAQAAAAEAAAABAAAA/wABAAAA/wAAAAAAAAAAAAAAAAAAAQABAAAAAP8BAQEBAAAAAPo+aQD/Bg0AAf8BAAD+/wAA//8AAP//AAD//wAA/wAAAf8AAAD+/wAA/wEAAf8AAAPPsQAD2L7//wD/AAD/AAAA/wAA////AP///wAA/wAAAP8AAAD/AAAA/wAA//7/AAD//wAB/wEAAP//AP/+/wD/Bw0A+kZ1AP////8AAAAA/wD/Af8A/wAA/wAAAQABAAAAAAEAAAAAAAAAAQD/AAEAAAABAAEAAQAAAAH/AP8AAQABAQEAAQEAAAAAAP8AAAAAAAEAAAABAAAAAf8A/wAAAAD/////AAAAAP8BAAEB/wD/AAD/AP8A/wD/AAAAAf//////AP8BAP8AAP///wAAAAAB////AAD/AP8A/wAA////AAAAAP8A/wAAAP8AAAD/AAD//////////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAAAAAAEBAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wD////////+//7//////wAAAAAAAQAA/wD//wEAAQD/////AAAAAP///wD/AP//AAAA//8A/wAAAAAA/wD/AP8A/wAAAAAAAP8AAAD/AAAAAAABAP8AAP8A/wAA/wD/AAAAAQD/AAAAAAAA/wD//wAAAAAAAAAA////AP8A/wD///8A/xAbAP0uTgAB/wAA////AAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA//8AAP8AAAXClv//AP8B/////wAAAAAAAAAAAAAAAAD/AAAA//8AAP4AAAD//wAA//8AAf8BAAD/AAD//wAAAP8AAAH/AAAA//8A/S5OAP4fNQEAAAAAAQABAP///wAAAAAA////AAAAAAAAAAAAAAAA/wABAAD/AP8AAAAAAAAAAAABAAEB/wD//wEBAQD/AP8AAAAAAAAAAAAAAAAA//////////8AAAABAQABAP8A/wAAAAAA/////wAAAAH/AP8BAAAAAP8A/wEBAAH//wD/AAEAAQEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAEAAAAAAAAAAP8A//8BAAEB/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//////v/+AAAAAAAAAAAAAAAAAQAAAAD/////AAAAAf8A/wAAAAABAQABAQAAAAABAAEBAQABAQEAAQH///8AAQABAf8A/wEBAAEBAAAAAAAAAAAAAAAB////AAD/AP8AAAAAAQABAAEAAQH/AP8AAAAAAAAAAAD/AP8A/wD/AAD/AP//AP8BAAEAAP////8AAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAA+VucAAD+AAD//v8AAP8AAAH/AQAA/wAAAQABAAD/AAAB/wAAAf8BAAD+AAAB/wEABcKYAALw5wEBAAEAAAAAAf8A/wD//////////wLw5wAA/gAAAAAAAAD+AAAB/wAAAP//AAD/AAAA//8AAP8AAAD/AAAA/wAAAP8AAPw9aQD//////wD//wEAAQD/AP8A//////8A/wD//////wD/AAD/AAAA/wD/////AAAAAAD/AP8AAP8AAP///wABAAEA/wD/AAAAAAD/////AQABAQEAAQH/AP8A/wD/AAEAAQH/////AP8AAAAAAAABAAEAAAAAAAEAAQD///8AAQABAAABAAAAAAAA/wD/AAABAAAAAAAAAAAAAf8A/wD/////AAAAAAD/AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wD///8A//////////8AAAABAAAA/wAAAAAAAAAA/wD/AAABAAD/AP8A/////////wAAAAAA////AAD/AAD/AP8A/////wAAAAAAAAAAAAEAAQABAAH/AP8A/////wAAAAAAAAAA/wD/AP////8AAAAAAP8A/wABAAEAAAAA/////wABAAD/AP8AAAAAAP8A/wD/AP8A/wD/AAD/AAD8Lk7//w8aAAEAAAAA/wAAAP4AAP/+/wAA/wAAAP7/AAD+AAAA/wAA//7/AAEAAAAA7+UAA9GxAP///wD/AP//AP8AAAD/AP8AAAAAAAAAAALZvQAC+fMAAf8AAAH/AAD//wAA//8AAAD/AAAB/wAAAf8AAAD+AAAB/wAAAf8AAP0dNAD9L1ABAP8AAf8A/wAAAAAAAAEAAQAAAAABAQEBAP8AAP8A/wAAAAABAQABAP8A/wAAAAD/AAEAAf8A/wAAAAAAAP8A/////wAAAAAA/wD/AP8A/wAA/wAAAAAAAP8A/wAAAAABAAEAAf///wAAAAAA////AP8A/wD/AP8A/wD/AP/+/wD/AP8AAP8A///+/wAA/wAAAAAAAAD/AP8AAQAA/wD//wAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wD/AAD/AAAAAQAAAAAAAQABAAEAAQAAAP8AAQD/AAD/AP8A/////wD/AAEA/wAAAAEAAQAAAAAA/wAAAAEAAAABAAD/////AAEAAQAAAAD/////AAAAAAD/AAAA/wAAAAEAAf8A/wABAAEAAP8AAAABAAEAAAAAAAEAAQAAAAAAAAAAAAAAAQAAAAEA/wAAAP8AAAD/AP8A/wD/AQABAP8IDQD8O2kBAP4AAAD/AAAB/wAAAQAAAAEAAAAA//8AAP8AAAEAAAAA/wAAAP8AAP/+AAAFw5YAAPDk/wABAAAA/wAB/wD//wABAAEAAAABAAAAAQD48wAEuooAAP4AAP//AAAB/wAAAf4AAAH+AAD//gAA//4AAAH/AAAA/wAAAP8AAAEAAQD7Q3UA/wgN/wAAAAD/////AAAAAAD/AP////8AAAAAAQD/AAAAAQAA/////wD/AAD///8AAP8AAAD/AP8AAAAAAAAAAQAAAP8AAAAB//////////8AAAD/AP8AAAD/AAAAAAAAAP8AAAAAAAD+//7/AAEAAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAQABAAAAAAAAAP8AAAABAAEA/wABAP8AAQAAAAEAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////v///wD/AAD/AAAA/wD/AAAAAAAAAAD/////AQABAQAAAAAAAQAAAAAAAP8A////////AP8AAAD/AAABAAEAAQABAP/+//8BAAEA/////wABAAAAAAAA////AAD/AAD//////wD//wD/AAAA/wAAAP8AAP//////////////AP///wAAAAD/AAAAAAAAAAEAAAAB////AP00XAD/DhoAAAAAAP/+/wD///8AAP8AAAD+AAAB/wEAAP8AAAD+AAD//v8AAP//AAHw5QAD0rIAAQABAf///wD/AP8AAAAAAAD/AAD/AP//AAAAAAAAAAAD07EAAeHLAAH/AAD//v8AAAAAAAD/AAABAAAAAf8AAAAAAAAA/gAAAP4AAAD+/wAABg0A/DRbAQD/AAABAAEBAAAAAAAAAAH/AP8A/wD//wAAAAAAAAAA/wD/AAABAAAAAAAAAAEAAAAAAAH///8AAAAAAAAAAAH/AP8AAQABAAEAAQAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAABAAEB/////wEAAQH//////////wABAAD/AP//AAAAAP//////AP8AAAAAAP////8AAAD/AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAEBAQEBAAAAAP8A/wD/AP8AAAAAAP8A//8AAAAB/wD/AAAAAAD/////AAAAAAD/AAAAAQAB/wD/AP8A/wD/AP8A////AAABAAEAAAABAAAAAf/+////AP8AAQEBAP8A/wD/AP8BAQABAf8A/wD/AP///wD/AAAAAAEAAAABAQABAAAAAAAAAAAB/wD/AP8A/wD/AP8A/w8aAP08aQAA//8AAP4AAAH/AQAB/wEAAP7/AAD/AAABAAAAAP7/AAD/AAAB/wEAAf8AAAamYv8AAAAAAAAAAAD/AP8AAAD/AAAAAQABAAAAAAABAAAAAP8A/wAA/wAABcSXAAD/AAAB/wEAAP4AAAD/AAAA/v8AAP//AP/+/wAA/wAAAP8AAAD//wAA/wAA/jRdAP8PGgD/AP//////AAABAAAAAAD/AAAAAf8A/wD/////AP8AAAD/AAAAAAAA//7/////////AP///wD/AP8A/wAAAAAA/wD/Af8A/wEAAAAA/wD/AAAAAAD/AP8BAAAAAAABAAAAAAAAAAAAAP8A//8ARvzliwAAIABJREFUAAABAAAAAAD/AAABAAEB/////wEAAQEAAAD//wD/AAAAAAAAAAAB/wD/AP8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQABAP///wAA/wD/AAAA/wAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AAD/AAH///8AAAEAAQD/AP8A/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAAA/wD/AAEAAQD/AP////8AAAAAAAAAAP8AAAAAAQABAAAAAAEBAAEAAQABAAD/AP8AAAAAAAAAAP////8AAAAAAP8AAAAAAAD8O2kAAP8AAAD/AQAA/wAAAP8AAAD+/wAA/wEAAP8AAP/+/wAAAAEAAP//AAD//wAD07IAAfDmAP///wAAAAAAAAAAAAAAAAEAAAAA////AAAAAAD/AP8AAAAAAP8A/wAB4cv/AtKwAAD/AAAB/wAAAP8AAAD/AAABAAEAAf8AAAD//wAA//8AAP8AAAD//wD/Bg0A+0mDAAEAAQEAAAAA//7/AAAAAAEBAAEAAAAAAAEAAQEAAQABAAAAAAAAAAEAAQABAAEAAQD/AAEAAAAAAAAAAAAAAAAAAAAAAP8A//8A/wAA/wD//////wD/AAAAAAAA////AP8A/wABAAEBAAAAAQD/AAAA/wAA/wD/AP8A//8AAQABAAAAAAD/AAEA/wD/AP8AAf////8BAAEAAP8A//////8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//////wABAAAAAQABAAAAAQAAAAD///8A/wD/AAEBAQAA/wAAAAAAAP8A//8AAAAAAP8A/wAAAAAAAAAAAP8A/wD/AAEAAAAAAAAAAP8A/wD/AP8AAP8A/wAAAAEA/wD/AP8A/wD/AAH///8AAAAAAAD/AP////8A/wD/AAAAAAH///8AAQABAP8A/wAAAAAAAAAA//4dNQD+K08AAP4AAAD+/wAA/v8AAP8AAAEAAQAA/v8AAP8AAAD/AQAA/v8AAP4AAAD/AAADxJYAAAEAAQABAAD///8AAAEAAQD/AP8A/wAAAP8A/wAAAAD/////AAAAAAAAAAD/AP8ABMWXAAH38gD///8AAf8AAAH/AQD//v8AAP4AAAD/AQAA/wAAAP8BAAH/AQAA//8A/h00AP4dNAD/////AAAA/wD/AP/+//7/AP8A//8A/////////////wD/AAAA/wAAAP8A/wEBAQAA/wAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAP8A///+//7//////wD/AP//AP8AAP8AAAABAAAAAQABAP8AAAD/AAEAAAAA////AAEBAQAAAAABAAAA//8A/wD/AP8AAAEAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAAEAAQD/AAAA/wAA////////////AP//AQABAf///wAAAAAAAP8AAAAAAAD///8AAAAAAQABAAEAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAABAAEBAAAAAP8A//8AAAABAAAAAAAAAAAAAAD/////AAAAAAH/AP8A//////8A/wD/AP//////AAD/AAAA/wAAAAAAAf1IhAAA/wAAAP8AAAD/AAABAAEAAP7/AAD/AAAA/wAAAP7/AAD+/wAA/wAAAQAAAAPElwAB8eYAAP8AAAAAAAAAAQAAAP8A//8A/wAAAAAA/wD/Af////8BAAEB/////wAAAAAAAAAAAfHm/wPMpAAB/gAAAP8AAP/+/wAB/wAAAQAAAAH/AAAB/wEAAf8AAP/+/wAA/gAAAP4AAPw5aQABAAEBAAAAAQABAAEBAQEB/wD/AAAAAAEBAAEBAAEAAQABAAD//////wD/Af///wAAAQAAAP8AAAD/AAD/////AP8AAP8A/wEAAAAAAAAAAQEBAQEAAAABAQABAQAAAAEAAAAA/wD/AAD/AAAA/wD/AAEAAAAAAAAAAAAA/wD//////wD/AP8AAAAAAQAAAAAA/wD/AAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD//wABAAAAAAAAAP8AAP8A////AP//AAAAAAEAAQEAAAABAAAAAAAAAAAAAAAA/wD//wEAAQEAAAAA/wD////+//8AAAAAAAAAAf8A/wD//////wD/AP8A/wD/////AAAAAQEAAQEAAAAAAAAAAQABAAD/AP8B/wD//wAAAAAAAAD/AAAAAAEAAQABAAEB/////wEBAQEAAAAA/itPAP4NGQD//v8AAP7/AAD/AAD//v8AAP8AAAD//wAB/wAAAQAAAAD/AAAA/wAAAPDmAAPGlgAAAAAA/wD/AAD/AAD///8AAAAAAQEAAQEAAAAAAAAAAAEBAQH/AP8AAAAAAf///wABAAEBAAAAAQLMo/8B8uYA//7/AAH/AAD//gAAAP8AAAD+/wAA//8AAP7/AAD/AAAA/wAAAP8AAP8dNAD9M1wA/wD/AP/+//////8AAAAAAP///wAAAAD/AP8AAAD/AAAAAAAAAAAAAP8A//8A/wAA/wD///8A//8AAAAB/wD//wEAAf8AAAAAAAAAAP////8AAAD//wD/AP8A/wAA/wD/AQEBAP////8AAAAB/////wAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD///8AAP8AAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEA/////wAAAAEAAAABAQABAQABAAABAAEA/wD/AP8A/wAAAAAAAP8AAP8A/wABAAEAAP8AAQAAAAH//////wD/AAEAAQAAAAAAAQEBAAD/AP8AAAAA/////wAAAAD/AP8AAAAAAP///wAAAAD/AP8AAAABAAAAAAABAAAAAf8A/wAAAAAAAAEAAf8A/wD/DhoA/DlpAAEAAAAB/wAAAP8AAAH/AAAB/wAAAf8AAAD+AAAA/wAAAP8AAAH/AAAA/wAAA8aW/wEAAQAAAAAAAP8A//////8A/wD//wD/AP//////AP8AAP8AAP/+/wAAAAD/AAAAAAD/AAD/AP8A/////wD68wEDvYkAAQABAAD/AAAB/wAAAP4AAAD/AAAA/wAAAP8AAAH/AAAB/wAAAP8AAAD+AAD8OGkAAAcOAAABAAEAAAAAAP8AAAAAAAAAAAAB//////8A/wAAAAAAAQABAAAAAAH/AP8AAAAAAQAAAAEAAAAAAQABAf7//gD/AP8A/wD/AAD/AAABAQEBAAAAAAAAAAD/AP8B////AAAAAAD/////AP8AAP//////AP8AAP8A//8A/wAAAAAA/////wD/AAEAAQAB////AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AAD/AP8AAAAAAf////8AAAAA////AP/+/wD/////AP8AAAAAAP//AP8AAAEAAQAAAAD/////AAAAAP8A//8AAAABAP8AAP8A/wAAAQABAP8AAP8A/wAAAQABAAAAAf////8AAAAA////AAAAAAAAAAABAAAAAf/+/wAA/wD/AP8AAAD/AP/+//7/AP8AAAD/AAD9MVsAAA0aAAD+AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAC6tkAAtSxAf8A/wD/////AAAAAP8A/wAAAQAB/////wAAAAEAAAAAAAEAAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAQD/AP8B3b4AAuLLAAH/AAAA/wAA////AAD/AAAB/gEAAP8AAAD/AAAA/wAAAf8AAAD/AAABBg0A/jJcAAAAAP8AAAAAAAAAAQAAAAD/AP8A/wD/AAAAAAAAAAAA/////wD/AAD/////AAAAAAAAAAAAAAAA////AAEBAQEBAAEAAAAAAAABAAH//v8AAAAA/wD/AAAAAAD/AP8A//8A/wAAAAAAAQEBAQAAAAEBAAEAAAAAAQAAAAAA/wAAAAEAAQABAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAEAAQH//////wD//wAAAAAAAAABAAEAAP///wAA/wAAAP8AAP////8AAAABAQEBAAEAAQEAAAD//wD/AAD/AAD/////////AAEAAQEAAAAA/wD//wAAAAH///8AAAAAAP///wD/////AAAAAAABAAAAAQABAAAAAAABAAEBAAEBAAEAAP8PGwD+MV0AAP8AAAD/AAAA/v8AAP8AAAEAAAAA/wAAAf8AAAD/AAAA/wAAAP8AAAD/AAADsW4AAAAA/////wD/AP8AAAAAAQAAAAAAAAAAAQEBAQAAAAD/////AP8AAP8A/wAA/wAAAAAAAAD/AAAA/wAAAAAA//8A/wEA/wAAAsaWAP//AAAA//8AAf8BAAD+/wD///8AAP8AAAD//wAA//8AAP8AAAD/AAAA/wAA/TdpAAAOGwH/////AAAAAAD/AAAAAAAAAQABAQAAAAAAAAAAAAEAAQAAAAABAAEBAP8AAAD/AAAA/wAA/wD//wD/AAD///8A/////wD/AAD/AP8AAAAAAQAAAP8AAAABAAAAAAEBAQH/AP8A////AAABAAD///8AAAAAAAAAAAD/AP8AAP8AAP////8A/wD/AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAf8A////AP8AAAAAAAAAAAD/AP8A/wD//wEAAQH/AP///v/+AP8A////AP8AAQABAP8A//8BAAEB/wD///8A/wD///8AAAAAAP8A/wAAAAAA/wD//wAAAP8AAAABAAAAAAAAAAD///8A/wD/AAAAAAD/AP8AAP8A//43aQAA/wAAAP//AAD+/wAA/wEAAf8AAP/+AAAA/wAA//7/AAD/AAAA/wAAAf8AAALVsQAA8uX//wD/AAD/AP8BAAEB/wD//wEAAQH////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AAAD+AAAA/wAAAAAAAAH/AQAA/wAAAP8AAP/9/gAAAAAAAP8AAAD+AAAABg0A/idPAf8A/wAAAAAA/wD//wD/AAAAAAD/AAEAAAEAAQH/AP8A////AAABAAEBAQEAAAAAAAEAAQEAAAD/AAAAAf///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP8AAAAAAAEAAAAAAAAA/wD/AP8AAAAAAAAA/wAAAP8AAf///wAAGTQAAP8AAAAAAAAB/wAAAP8AAAD+AAABAAAAAP8AAAD/AAAA/wAAAAAAAP///wAA/wAAAP8AAAD/AAAB/wAAAQAAAAH/AAAB/wAAAP8AAAH/AQAA/gAAAP8AAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA//8AAAEAAAAB/wAAAf8AAAD+AAAA/wAAAP4AAAH/AQAB/wEAAAAAAAD+AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAaNQD/GjUA/////wO+fAAB/wEAAP8AAAD+/wAA/wAAAP7/AAD/AAAA/wAAAAAAAAD/AAAAAAAAAP8AAAD+AAAA/wAAAP8AAAD//wAB/wAAAP8AAAAAAAAA/wAAAP8AAP/+/wAB/wAAAP8AAAD/AQAA/v8AAP8AAAD//wAA/wAAABQnAAEAAQAA/wD/AAAAAQEBAQEA/wAB////AP8A/wAAAAAAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8AAQAAAQABAf//////////AAAAAAABAAAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAP7/AAD/AAD//v8AAf8BAAH/AAD//gAAAP4AAAH/AAAB/wAAAf8AAAD+/wAA/v8AAP4AAAD+/wAA/wAA//8AAP/+AAD//v8AAf8AAAD+/wABAAAAAP4AAAH/AAAA//8AAf8AAAH/AAAB/wAAAP7/AAD/AAAA/wAAAP7/AAD+AAAB/wAAAP4AAAD/AAD//v8A//7/AAD/AAAA/wAAAAAAAP/+/gABAAAAAP4AAAEAAAAA/wAAAf8AAAD+/wAB/gAAAf8AAAH/AAAA/gAAAP7/AP/+/wAAJ04AAAEAAf/x5QAB0qIAAP4AAAD/AAAB/wAAAAABAAD/AAAA/gAAAP8AAAD+AAAA/gAAAf8AAAD//wAA/v8AAf4AAAD/AQD//v8AAP4AAAD+/wAA/v8AAf8AAAD/AAD//v8AAP7/AAAAAAAB/wEAAP8AAAEAAQAA/gAAAP8AAP////8AAQABAP8A//8A/wAAAQAAAQEBAQD/AAAAAAAAAAAAAAAAAAAAAAAB/////wAAAAD///8A/wD/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf8A/wAA/wAAAAAAAP8A/wEAAQABAAAAAAD/AAH/////AAAAAAABAAAAAQAB/wD/AAAAAAAA/wAA/wD///8A//8A69gAAQABAAD+/wAB/wEAAP//AAAAAAABAAAAAQAAAAD+AAD//v8AAP8AAAH/AQAA/wAAAf8AAAEAAQD//v8AAP7/AAD//wAA/wAA//7/AP///wAA/gAAAP8AAAD/AAAB/wEAAP4AAAD/AAAA/wAAAQABAAD+/wAA/v8AAQABAAEAAAAA/gAAAf8AAP/+/wAA/wEAAP8AAAEAAAAB/wAAAP7/AAEAAQD//v8AAP//AP/+AAAB/wAA//4AAAD/AAAA/wAAAP4AAP/+/wAA//8AAQABAAH/AQAAGTYA////AAAAAAABy5f/AfnyAAEAAQAA/gAAAP7/AAH+AAAA/wAAAf4AAAH/AAAB/wAA//7/AAD/AAAB/wEAAP8AAAEAAAABAAEAAQAAAAH/AQAA/wAA//7/AAD/AAAA/wAAAf8BAAD+AAAAAAAAAf8AAAD+AAAxuWBKAAAgAElEQVQBAAAAAebMAP8A/wEAAAAAAAAAAQAAAAD/////////AAAAAAAAAAAAAP8AAAD/AAD/AP8AAQABAQD/AAAAAAAAAQABAf////8A/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAH/AP//AAEAAAAAAAD///8A/wD///////8AAAAAAP8AAAD/AAD///8AAAAA/////wD/////AQABAQAAAAEB2rEA//fxAAH/AQAA/wAA//7/AAD+/wAB/wAAAP7/AP///wAB/wEAAP4AAAD//wAA/wAAAP8AAAD+AAAA/wAAAf8BAAD/AAAB/wAAAf8BAAEAAQAA//8AAP//AAD+/wAA/wAA////AP/9/wAA/gAA//7/AAD/AAAB/wAAAP8AAAD+/wAA//8A////AAH/AQAB//8AAf8AAAD+AAAA/v8AAf8BAAD+/wAB/wEAAf8BAAH/AAAA//8AAf8AAAH/AQAA/wAAAP8AAAH/AAAA/wAAAP4AAAD/AAD/DBoAAAAAAP8A/wD/+fIAAMyWAAD+AAAA//8AAP8AAP///wABAAAA////AP///wAA/wAAAf8AAAH/AQD///8AAP//AP/+/wAA/gAAAP4AAP///wAB/wAAAf8AAAH/AAAA/wAAAP//AAH//wAA/gAAAP7/AP///wAA9/IA/+XK/wAAAAD//v///wD/AP////8BAAEBAAAAAP8A/wAA/wAA/wD/AAABAAAAAAD//wD/AP8A/wAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wEAAQAAAAAB//7//wEAAQAA/wAAAAAAAf8A/wAAAAABAAEAAAABAAABAAEAAAAAAQAAAAAAAAAA/v/+/wAAAAD/+fIAAcaJAAD//wABAAAAAf8AAAD/AAAA/wAAAP8AAAH/AAAA//8AAP8AAAD/AAAB/wEAAP//AAD//wAB/wAAAP8AAAH/AAAA/wAAAP//AAD+AAAA/wEAAf8BAAEAAQAA//8AAf8AAAEAAQAA//8AAf8AAAL/AQAA/wAAAP7/AAD/AAD//wAAAf8BAAD/AAAA/wEAAP8BAAD//wAA/wAAAP//AAD/AAAA//8A//7/AAD//wAA/wAAAP//AAD//wAA//8AAP//AAD/AQAB/wAAAP//AAD/AAAB+fQAAAAAAAAAAAAAAAABANGjAADs1wAA/wAAAf8AAAH/AAAA/v8AAf8AAAH/AAAA//8AAP8BAP/+/wAB/wEAAP8AAAH/AQAA//8AAP8AAAD/AAAB/wEAAP8AAAD//wAB/wEAAP8AAAD/AQAA/wAAAP8AAAH/AAAAzZYAAPPlAQAAAP8BAQEBAAAAAAAAAAD/AP8AAP8A/wAAAP//////AAAAAP///wAA/wAAAP8AAAAAAAD/AP8AAP8AAAABAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8AAAAAAAD/AAAAAQABAQABAf////8A/wAA/9mw/wC5bgD/8eQAAf8BAAD/AAD//v8AAP8AAAD/AAAA/wAAAP8AAAD/AAAA//8AAP8AAAD/AAAA/wAAAP7/AAD/AAAA/wAAAP8BAAH/AAAA//8AAP7/AP/+/wD//gAAAP8AAAD/AAD//gAAAP8AAP///wAA/wAAAP8AAAD/AAAB/gAAAP//AAD//wAA//8AAP7/AAD/AAAA/gAAAP4AAAD/AAAA/wAAAQAAAAD/AQAA/wAAAf8BAAD/AAAA/wAAAP8AAAD+/wAB/wEAAP8AAAD//wAA7NcAAAAAAAAAAAAA/wAAAAEAAADGiQAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AAAA/wAAAP7/AAEAAAAA//8AAP8AAAD//wAA/gAAAP//AAH/AAD///8AAP8AAAD+AAAA//8AAf8BAAD//wAA/wAA//LlAACzYQAA06MAAAAAAAAAAAH/AP8AAP8AAP///wAA/wD//wD/AAD/AAABAQEBAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/////wH/AQEAAQAAAQABAf8A//8BAAEA////AQAAAAABAAEAAP8AAAAAAAAA/wAAAAAAAAEBAQEBAAEA////AP/gvf8B4L4B/xk1AAAHDQD/BQ0AAAAA/wAAAAAAAQABAQABAP///wABAQEA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP7//wABAQEAAAAAAAAAAAABAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAQEBAAAAAAD/////AAAAAAEBAQEAAAAA////AAABAAABAAEA/v//AAEBAQD/AP8AAP8A/wAAAAEAAQEAAP8AAP8A/wAB7tkA/////wAAAAABAQEB/////wDmygEB5csAABk1AAAAAAAAAQAAAAD/AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAEAAAAAAAAA7dgAANSkAP8A/wAAAAAAAQABAP8A//8BAAEB/v//AAEBAQD/7dcAAe3ZAAAAAAD/AP//AAAAAQEAAQD/AP8AAQAB/wEBAQH/////AQEBAf/+//8AAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAB/wEA/wD//wEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////8AAAABAQABAAAAAAEAAQAAAf8BAP8A////AP8BAAAAAAAAAAAAAAD/AAAAAQD/AP//AP8BAAAAAAAAAAEAAAAA/+fKAAAAAAAA/wD/AQEBAf8A/wAAAAD//wAAAQAAAP//AAABAAAAAf8AAP8AAAAAAQEBAf////8AAAABAP8A/wABAAH/AAD/AQABAQAAAAAAAAAAAAAAAAEAAAD/AP8AAQEBAP/+//8AAAAAAAEAAQAAAAAAAAAAAQABAP////8BAQEB/wD/AAAAAAAAAAABAAAAAP8AAAAAAAAAAAAA/wAAAAD/AAABAAAAAP8AAAAAAAAAAP8AAAECAQAA/wAA/wD/AAEAAQD/AP//AQABAf8A//8AAAAAAAAAAQAAAAD/wXv/AlKtAQAGDQD//gAAAAAAAAABAAAA/wAAAAEAAAEAAAD//wAAAP//AAEBAQD/ESgAAPPlAADnygAAAAAA/wAA/wEBAQH///8AAQEBAP///wAAAAAA/wAA/wEAAQEBAQEB////AP8A/wABAAEA/wD/AQD/AP8BAAEB////AAABAAH/AP8AAAAAAAAAAAABAAEA/////wAAAAEAAQAAAQABAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD/////AAAAAQEAAQH/////AAEAAQAAAAAAAAABAAAAAAD/AAAAAQAAAAAAAQEAAQD/////AQEBAf8A/wAAAQAB/wD/AAAAAAAAAAABAP8A/wABAAEBGTYAABIoAAATJwEA/wAAAAEAAAH68wEA58sA/+G9AQEAAQD/AP8B/wD/AAAAAAAAAAAAAAAAAAEAAQAAAAAAAP8AAAEBAQEAAAAA/wD//wAAAAEAAAAA/wD/AAABAAH/AP8AAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AQAAAAAAAAAAAAAAAAEAAQD/////AAEAAf///wAAAAAAAAAAAP8A/wAA/wAA/wD//wEBAQH///8AAP8AAAABAAAA9OUB/9SjAAAwaQAAAAEAAAD/AAD/AQABAAAAAAABAP///wAAAAAAAAAAAP///wABAAEA/zBpAADnygAAAAAAAP8AAP8A//8AAAAB////AAAAAAAA/wD/AAEAAf////8AAAABAAAAAAAAAAD/AP8AAQABAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AP8AAP8AAQABAAD//v//AAEAAQABAAH/AP//AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHR0d/wABAAAAAAAAAQABAP8A/wAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAP8AAAABAAAAAP8A/wABAQEAAAAAAAD/AP//AP8AAQABAAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAP////8AAQEBAQElUQABPIQA/wAAAAEBAAAAAAAAAP//AP8AAAABAAEA//TlAADPlgD/3LAAAQABAP7//v8BAQEBAAAAAP////8BAAEBAAEAAAAAAAD/////AQABAQAAAAAAAQAAAAAAAAD/AAD/AP//AQEBAQD/AP8AAQABAP8A/wAAAAEAAAAAAAAAAAAAAAD/AP//AQEBAQAAAAD/////AQEBAQD/AP//AP8AAQEBAAAAAAEBAAEA/wD//wAAAAEAAAAA/////wEBAQEAAAAAAAYNAAFVugABBw4AAAAAAAAAAAD///8AAQABAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAP/DewD/27AAAP8AAP8A//8AAAAAAQABAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAABAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAQAB4+LjAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAA/wAA/v/+AP////8AAQAA/wD/AAAAAAD/AP8AAAEAAAABAAEAAQAA/wD//wAAAAD///8AAP8AAAAAAAABAQEBAAAAAf8A/wEAAQABAQEBAf///wAAAAAAAP8A/wAAAAEBAAEBAAUNAAEvaQAA//8AAf8AAAD+AAAA/gAA//4AAAH/AQAA//8AAQsbAAA8hAABMGsA/////wEAAQH///8A////AAAAAAH/AP//AAAAAP////8AAAAA/wD//wAAAAD///8AAP8A/wAAAP8BAQEBAP8AAAAAAAEAAAAAAAAAAQAAAAAAAAAA/wD/AP8A//8BAAEB/////wAAAAABAAEAAP8A/wAAAAEBAQEBAP8AAQD/AAD/AP8A////AAAAAAD///8AAQABAQD/AAAAAAAA//ny///IiQAA/v8AAP4AAAD+AAAB/wEA////AAD+/wD//v8A////AP///wAA/wAA//7/AAE1dwAABQ4AAAAAAAAAAAABAAEBAAEAAf////8A/wAAAAAAAAD/AAAA/wAA////AAABAAEAAQD/AP8A/wABAAD/////AP8AAAD/AAAA/wD/AP8A/////wAAAAAAAP8AAP////8AAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAQEBAAAAAAH/////AQABAAD/AAAAAAAAAP8AAAD/AAD///8AAAAAAQEAAQAAAAAA/wD///8A/wH///8A/wD/AAD/AP//////////AAAAAAAA/wAA/wD/Af//////AP8AASpdAAALGwAA/wEAAP8AAAD/AAAA//8AAQAAAAD/AAAA/gAAAP//AAH/AQABL2oAATyFAQAAAAABAAEAAAAA/wAAAAABAQEBAP8AAAAAAAEBAQEBAQEBAQAAAAAAAAAA/wD/AQAAAAH///8A/wD///8A/wAAAAAA//////8A//8AAAAAAAAA/wAAAAEAAAAAAAAAAf///wD/AP8BAAAAAf8A/wD///8A/wD/AP8A/wD/////AQABAf///wABAQEA/wD/AP8A/wAAAAAAAQABAf/crwAA58sAAP//AAD//wD//v8AAf8AAAD/AQAB/wAAAf8BAAIAAQAA//8AAv8BAAEFDgABKl3/AAAAAAAAAAH/AP//////AAEAAQEAAAAAAP8AAP8A////AP8AAQABAP///wAA/wABAAAAAf///wAAAAAB//////8A/wD///8A/wD/AQEAAQAAAAAA/////wAAAAH/AP8A/wD/AP8A/wAAAAD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP8AAAAAAAAAAP8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAAD/AAABCxsAAS5qAAD//wD//v8AAP//AAD+/wAA/wAAAP8AAAD//wAAAAAAAP8AAAH/AAAB/wAA/tCVAP8A////AP8AAP8AAAAAAAD//v//AAAAAAAAAAD///8A////AP8A/wAAAAAAAP8A//8A/wABAAEA////AAAAAAD///8AAAEAAQD/AAD/AP8AAQABAQAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAD///8AAAAAAAD/AP////8A/wD/AAD/AP/+0JUAAP8AAAD/AAAB/wAAAP8AAAD//wAA/gAAAP//AP/+/wAA/gAA////AP/+/wABKFwBAAsa/wAAAP8AAAABAQABAP8A/wD/AP8A/wD/AAAAAAEAAAD//wD/AAAAAAD/AP8A/wD/AAAAAAAAAAD//wD/AAD/AP8AAQAAAQABAP8A/wD///8AAAEAAQEBAQABAAEAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQH/////AAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAAEBL2oAAQAAAAD/AAAB/wAAAP4AAAD/AAAA/wAAAP8AAAH/AQAB/wAAAf8BAP///wD+268AAPTlAAAAAAEAAAAAAAEAAQAAAAAAAQAB/wD/AAAAAAAA/wD/AAAA/wAAAP8AAAAAAAEAAQAAAAD/////AQEBAQAAAAAAAAAAAP8AAAAAAAEAAAAAAAAAAP////8A/wAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wD//wD/AAAAAAAA/wD/AQABAAAAAAEAAAAA/////wABAAH/58v//9uwAAD/AAAAAAAAAP8AAAH/AAAA/wAAAP4AAAD/AAAA/wAAAP4AAAAAAAAABQ0AAjuFAQAAAAEAAAD/////AAAAAAAA/wAAAP8AAAAAAAAAAAABAAAAAAD/AAAAAAAAAQEBAAD/AP8AAAABAQEBAQAAAAH///8A/wD/AAAAAAABAAEAAP8AAP7+/v//AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP//////////AAEAAAAAAAABAAEBAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAA/////wAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAA/wD//wAdQgABIlAA//4AAAD+/wAB/wAAAf8AAAD/AAAA/gAAAP4AAAD//wD//gAAAP7/AAD58wD+0pYAAP8AAP///wAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQAAAAH///8A////AAAAAAAAAAABAAAAAAAAAAAAAAAA/wD/AAAAAP//////////AAEAAQEAAAAAAAAAAAABAAAAAAAA/////wAAAAEAAAAAAAAAAAD/AAAAAQABAP8AAP////8AAQAB////AAAAAAD///8AAAAAAQAAAAAAAAAA/cuIAAD48wAA/wAAAf8AAP/+AAAAAAAAAf8AAAD+AAAB/wAAAf8AAAD+AAAA/wAAARY1AAAWNf8AAAABAAAAAP//////AP//AAAAAAD/AAAA/wD/AAAAAAABAAAA/wAA//7//wABAAH/////AAAAAAABAAABAAEBAP8A/wD/AAD/AP8AAAEAAAEAAQEA/wD/AP8AAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQIB8AAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAQAA////AP8A/wD///8AAAAAAf///wD//////wD/AP8A/wD//////wD//wEAAQEAAQAA/wD///////8AAAAAAAAAAQQzeQAB/wAAAf8AAAH/AQAAAAAAAAAAAAH/AAAB/wAAAf8AAP/+AAAB/wAA//8AAP7WogAA9OUAAAAAAAEBAQD/AP//AP8AAAD/AAD/////AAEAAAAAAAAAAAAB//////////8BAAEAAQEBAP///wAAAAAA////AP///wAA/wAAAQABAAAAAAEAAAABAAAAAP8A/wD/AP8A////AAD/AAD///8AAAAAAAAAAAAA/wAA/////wABAAAAAAAA/wD/AAD/AAAA/wAAAAAAAP8A//8BAQEAAQEBAP///wD/AP8AAfrzAP7XogAB/gAAAP4AAAH/AAAA/gAA////AAH/AAAA/wAAAP8AAAH/AAAB/wAAAP8AAAI0eAH//////wD//wAAAAEBAAEB/wD//wAAAAAAAQAB////AP///wAAAAAA/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAABAQABAAAAAAAAAAABAAAAAQAAAAD//v//AAAAAQAAAAH/AP8AAR1DAAAKGgAA/wAA////AAD/AAAA/gAA//7/AAD/AAAAAAAAAP//AAH//wAA/wAAAPTlAP/SlgD///8A/wD/AP///wAAAAAA//////8A//8A/wAA/v7+/wD/AAAAAAAAAAAAAQAAAAEAAQAA////AAAAAP//AP//AAAAAAAAAAD/AP///wD/AP8A/wAA/wD//wD/AAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAf///wD/AP8AAAAAAP////////8AAAAAAAABAAAAAAAA/wD/AAAAAAH///8AAP8AAP////8A/wAA/wD/AP/ZowD/9OUA////AP///wAB/wAAAf8BAAD/AAAA/wAAAP8AAAD/AAAA/wAA////AAIQKAABFjUAAAAAAQAAAP8AAAAAAAAAAf////////8AAAAAAAAAAAD/AP//AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQAAAAAAAhY1AAD/AAAA//8AAf8AAP/+/wAA//8AAf8BAAD/AAAA/gAAAP8BAAD+AAAA//8A/tGVAP8A/wAAAAAAAAAAAAAAAAABAQEBAAEAAQD/AAEAAQABAQEBAf8A/wAA/wAAAAAAAAAAAAD///8AAP8AAP///wAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAABAP8AAAAAAAAA/wD/AAAAAAD/AAD///8AAAAA/wAAAP8AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAAA/wAA/wD/AAEBAQEAAQABAAAA///58gD9xnoAAf8BAAH/AAAA/wAAAP//AP/+/wAA/wAAAP8AAAD/AAAA/wAAAf8BAAH/AAABHEMBAAAAAAAAAAH/AP8AAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////AAAAAAD/AP//AP8AAP///wAAAAAAAAQNAAD/AAAA/wAAAP8AAAEAAAAA/wEAAP//AAD//wAA/wAAAP8AAAAAAQD/6MoA/d6vAAD/AAAAAAAAAAAAAAD/AAD//v8AAP8AAP8A//8A/wAAAAAAAP////8AAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP//////AP//AAEAAAD/AP8AAQABAP8AAAABAAABAQEA////AQD/AAEA/wAAAP8A/wAAAAAAAAAAAP8AAAD/AP8AAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAQD/AAD/6ssA/ujJAAD/AQAA/v8AAP8AAAEAAAAA//8AAP//AAD+/wAA/wAAAP//AP/+/wABBQ0A/////47Rb5kAACAASURBVAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAAAAAAAAAAAA/wD///8A/wAA/wAA//DYAAD+/wAA/gAAAP4AAAD+AAAA//8AAP4AAAH/AQAA/v8AAf8AAAD//wD9yHwAAQABAAAAAAAA/wAA////AAABAAD/AP8A/wD/AAEBAQEAAAAA/////wEAAQEAAQAAAAEAAP//////////AAAAAAEBAQEAAAAA////AAAAAAD/AP8AAAAAAAEAAQEAAAAAAAAAAAABAAEA/wAA/wD/AAD/AAD+//4AAAAAAP8A/wD/AP///wD/AQD/AAD//////wD/AAABAAH/////////AP8A//8BAQEA////AP///wD/AP////////8A//8A/wAA/s+JAAD+/wAA/wAAAP4AAAD+AAAA/gAAAP4AAAAAAAAA/wAAAP4AAAD/AAD/79gAAAAAAf8A/wAAAAAA////AP///wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/gD+8P///wD///8AAAAAAAD/AAAAAAAA/////////wD/AP8A////AAAAAAD/////AAAAAAAAAP//AP8A/wD/AP////8AAAAB////AP8A/wAA/wAAAAAAAQAAAAD/AP8A/uO9AAD/AAABAAAAAP8AAAEAAAAA/gAAAQABAP/+/wAA/wAA////AP7esAD/9uUA/wD///8A/wD/////AAAAAP////8BAAEAAAAA/////wD/AP8AAAAAAf8A/wD///8A/////wD/AAAAAAAB////AP///wD///8AAAAAAAAAAAEAAAAAAAAAAP8A//8AAAAB////AP///wD/AP//AAAAAAAAAAAAAAAAAQABAAAAAAAA/wAAAQABAP8A/wAAAAABAQABAP///wAAAAABAAAAAAEBAQH/////AAAAAAAAAAAAAAABAAAAAQAAAAH/AP///u7XAP3ZpP8BAAAAAQAAAAD/AAAA/wAAAP8AAAD+AAAA/v8AAP8AAAD/AAD+5L0AAAAAAAAAAAD/////AP8A/wAAAAD/AP8AAAAAAQAAAAABAAEBAAAAAP///wAAAAAA////AAABAAD///8AAAAAAf8A//8AAAAA/wD/AAEBAQAAAAAAAAAA/wEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD/////AAAA//8A//8AAAAAAAEAAQAAAAABAAEAAQABAP/+//8AAAAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAAAAP////8AAQABAQABAP////8BAAEA//XlAP3UlQAA/gAAAf8AAP/+AAAB/wAAAP7/AAEAAQAB/wAAAPTmAP3UlQD///8AAAAAAQAAAAAAAQABAQABAAAAAAH/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAD/AP8AAQABAAAAAAAAAAAAAAAA/wD/AAD/AP//////AAAAAP///wAAAAABAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wAAAAAAAP3UkwH/9OYA//4AAAD+/wAA/wAAAP//AAH/AAAB/wAAAf8AAP7VlQD/9eX/AP8A/wAAAAAAAAABAAEAAQAAAP8AAAAAAAAAAAAAAAD/AP8AAAAAAP////8BAAEAAAAAAP///wAAAAD/AP8A/wAAAAEAAAAAAAAAAP///wD///8AAAAAAP7+/v/+/v7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAB//8A/wABAAEB////AAAAAAEAAAAAAP8AAAD/AAD///8A/wD/AAAAAAH///8AAP8AAP////8AAAAA////AAAAAAAAAQAAAAAAAAAAAAD/////////AAAAAAD+//7/AAAAAP3VlQD91ZUAAP8AAAD/AAAA/wAAAP8AAAD+/wD/79gA+75fAP/15QAA/wAAAP8AAAAAAAAA/wAA/wD/AAAAAAABAAEA////AAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AP////8AAAAA////AAAAAAAA/wAA/////////wAA/wAAAP8AAP////8AAAAA//////8A/wAAAAAA/v/+//////8AAAD/AAAAAAABAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAD///8A/wD/AAAAAAAAAQABAAAAAP/68gD7v18AAPXlAAEAAQAB/wAAAf8BAAAAAQAA/wAA/NWVAPvTlP8A/wAA/wD/AAAAAAAA/wD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEAAQD///8BAAAAAf////8AAAAAAAAAAAAAAAAAAQAAAAAAAQEAAQECAgLhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4f7+/gAAAAAAAQABAQD/AAD/AP//AAAAAQAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQEA/wD/AQABAQD/AAD/AP8AAAAAAAEAAQEAAAAA/wD/AAEBAQEAAAAA////AAEBAQD81JX//eCwAQEaQgACDygAAPrzAP3mvQD+68oAAQABAAAAAAD/AP//AQABAf///wABAAEA/////wEAAQH+AP7/AAAAAf///wAAAAAAAAAAAQAAAP8A/wAA/wD//wAAAAEAAAD/AAAAAQD/AAABAAEAAAAA/wEBAQH/////AAAAAf///wABAAEAAQABAQAAAAAAAAD//wD/AQEAAQH///8AAQABAf8A////////AAAAAQEBAQD///8AAQEBAAD/AAD/AP8AAQABAP///wABAAEA/wD/AAEBAQAA/wD/AAAAAP////8BAQEBAAAAAAEAAQD+9OT/+bREAAIaQwADFjYB/wUMAP/x2QD/4LAA/vryAAAAAAD/AP8BAQABAAD/AAAAAAAB/////wAAAAABAAEB/wD//wAAAAEAAAD/AQABAQABAAAAAAAAAAEAAP7//v8AAAAA/wD/AQEAAQD/////AQABAQABAAD/////AAAAAAAAAAH8/vzvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4AEBAQD///8A/wD//wAAAAEBAAEB/wD/AAAAAP8AAAAB////AAAAAAD///8AAAAAAAD/AAAAAAABAAAA/wAAAAEAAAAAAQABAP8A/wAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAAB//Pk/wHbowH9//8AAAAAAAAAAAAAAAD/AAEAAf///wAAAAAB/wD//wAAAAH/AP8AAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQABAf8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAAEAAQD+//7/AQEBAQAAAP8AAAAAAAAAAP8A/wABAAEA/wD/AAAAAAEAAAAAAAAAAP///wAAAAAA////AAAAAP8BAAEB////AAEAAQD/AP8AAAAAAAAAAAAAAAABAAAA/wAAAAH/////AQEBAf////8AAQAAAAAAAf7mvQD+5r0AAQEBAP///wABAQEAAAAAAAAAAAAAAAAA/wD/AAAAAP8BAAEBAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAB/wD/AAD/AAAAAAAAAAAA/wEBAQH//v//AAEAAP8A/wABAAEB/wD/AAEAAQAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAwMD0P///wD/////AAAAAAAAAAD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAEAAQAAAAD/AAAAAQAAAAAAAAD//wD//wAAAAAAAAAAAAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAD/AP8AAAAB/v7+/wAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAP8A//8AAAAAAP8A/wD/AP8AAAD/AP8AAP////8AAAAA/wD/AP////8AAAAAAAAAAAAAAAD/////AAAAAAAAAAD///8AAAAAAP7//v8BAQEB/////wAAAAEAAAABAAAAAAAAAAD/AP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////////wAAAAAAAAAAAQAAAAAAAAAA////AAABAAEAAAABAAAAAP////8AAAAA////AP////////8AAAAAAP///wD/////AAAA/wAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAf7+/v8AAQABAP8A/wAAAAD/AP8AAAAAAP///wAAAAABAQEBAAEAAQACAwLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAABAA4AD/AAABAQEBAAAAAQAAAAAAAAABAAEAAP///wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAD/AAD///8AAAEAAQAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAEAAAAAAAEAAf8A/wAAAAABAAEAAAAAAAEAAAAAAQABAAEBAQEA/wD/////AAAAAAABAQEBAAAAAAAAAP8BAAEBAAAAAAEBAQH///8AAQABAAAAAAABAQEAAAAAAAAAAAAAAAAA////AQAAAAD/////AAAA/wAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAAAA/wAAAAAAAAAAAAAA/wEAAQEA/wAAAP8AAAEBAQEAAAAAAAAAAAAAAAEBAQEB////AAD/AP//////AAAAAAD/AAAA/wAB/////wAAAAEA/wAAAP8AAAAAAP8BAAEAAAAAAAEAAQEAAAAAAAEAAQD/AAAA/wAAAAAAAAAAAAAA/wAA/v7+//8A/wAEAATQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8P8A/+AA/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAB////AP8A/wD/AP8AAQABAQAAAAAAAQAA/wD//wAAAAH+//7/AAAAAP8A//8AAAAAAP8AAAABAAEAAAAAAP8AAAAAAAAAAQAAAQABAQEAAdDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD///7+/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAH/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wABzaW0UAAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoQAQEBOP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAQEB4QgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtdS82AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//Qz5CaRUtJsMAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Calendar.png b/arma/client/addons/phone/ui/_site/images/dark/Calendar.png new file mode 100644 index 0000000..dc719e8 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Calendar.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Calendar.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Calendar.png.b64 new file mode 100644 index 0000000..199c97f --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Calendar.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEID6qKcy0AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4f8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf////iAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAD//wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAAAA/wAAAAEAAAAAAQEBAAD/AAAAAAD/AAAAAQAAAP8AAAABAAEAAQAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQAAAAEAAAD/AAAAAQAAAAH///8AAQABAQEBAQEAAAAAAQEBAAEBAQD//v//AQEBAAAAAAAAAQABAQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAf////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAAAADgZGRnR6Ojo2AAAAAAAS4rHFQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAAAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAABAAAA/wAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAADvEhISIsDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/DQEBAQ0BAQAAAAAAAAAAAPP//wDz//8AAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEaAgIAAAAAAAAAAP8BAAAB5f/+AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQAMAQAAJwID/xsCAgEAAAAA8///ANj9/QDn//8AAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQ4BAgAMAP8AAAABAPT//wDyAP8AAP8AAAAAAP8BAQEB/////wAAAAAAAAABGgICAAAAAAAAAAAA9AAAAPL+/gAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAABAAAAAf///wAAAAAB/wD/AAD/AP8AAAABAAAA/////wABAQEBAAAA//8A/wACAQIA/v7+AAEBAQAAAAAAAP8A/wAAAAEBAQEA/v/+AAEAAQAAAAAAAAAAAQAAAP////8AAQEBAP8A/wAAAAAAWwcGAGkHBwAAAAAAAAAAAMz8/ABj9fYAAQEBAf////8BAQEB////AAAAAAAAAAAAAAAAAU4GBgCDCQgAAAAAAAAAAAHm/v4ASPPz/wAAAAAAAAABAAAAAP///wABAQEAGQEBAFwHBgBOBQUADQEBAQAAAAAAAAAAAAAAAAAAAADZ/f4Apfr5ALH6+/8AAAABAAAAAAD/AAAAAAABAAAAAFwFBf9nCAcBAAAAAOb+/gBW9PUA8wD/AAEBAQH///8AAAAAAQAAAAAAAAAAtw0MAAAAAAAAAAAAmPn5AJb4+P8BAAEBAAAAAP///wAAAAABAP8AAAAAAAH/////AAAAAAAAAAEAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAADQEBAANAQEA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//04FBAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAEAAAAAAAAAAAAAAAAnAgIAqgwLAFsGBgANAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAwIAggkJAGkHBwEAAAAAAAAAAQAAAP8AAAAA//////4AAAEAAAAAAAAAABoCAgB2CAcAAAAAAP////8AAAAAAAAA////////AP8AAAAAAAAAAAAAAAAA/wAAAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AAAAAAAAAAAAAAAAAAAAAABcBgYAAQEBAf////8BAAEAAAAAAf8A/wABAAEBHAIDATUEBAAAAAAAAAAAAAAAAAAAAAAA////AP8A//8AAAAAAAAA/xoCAgCcCwoADQEBAAAAAAAAAAAA8v//AKT5+gCX+PkAy/z8AAAAAAAAAAAAAAAAAGgIBwBbBgYA/wD/AP8A/wAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAABOBgYAQQUEAP8A/wEAAAAAAQEBAQAAAAABAAEAAAAAAAAAAAAAAAAAAP//AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAABAAAAAAAAAAAAAAAAAAAAAABbBwYA/wD/AAAAAAH/////AAAAAAEAAQD///8AZwcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AAH/AP8A/wD/AWgHBwANAQEAAAAAAAAAAACX+PkAPPHy/4r39/+X+PgAZPX2AEnz9ADm/v4AAAAAAAAAAAB2CQgAGgECAAD/AAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwkJABsBAgAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAgD//wAAAAAAAAAAAAAAAAAAAAANAQEANQMEAAAAAAAAAAAB////AP///wAAAAD/NQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAGgECAE8GBQAAAAAAAAAAALP6+v+X+fgAAAAAAAAAAAEAAAAA////AOX+/QB99/cAAAAAAAAAAAAAAAAATwYGAAAAAP8AAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAADQEBAIIKCQD///8AAAAAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAA/gABAQAAAAAAAAAA5v7+AAAAAAAAAAAAaAgHAP//////AP//AAAAAAAAAABCBQQBGgICAAAAAADL/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAQgUEAAAAAAAAAAAAAAAAAKL5+gEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AADL+/wAy/z8AAAAAAAAAAAATwYFAAAAAAAAAAAA////AAAA/wAAAAAAAAAAAAAAAADz//8AAAAAADUEBABcBwYAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQAAAAD///8A/wD/AAEAAQEAAAAA/////wAAAP//////AAAAAP//////AP8AAAAAAP////8AAAAAAAAAAAAAAAD///8AAQABAQAAAAABAAEB/wD/AAAAAAEBAQEB//////8A/wD///////7//wAAAAD/AP8AAAD/AAAAAAAAAAAAyvz8AMv8/AAAAAAANQQEAA8CAgEAAAAB//////////9OBgYAAAAAAAAAAACk+foAAAAAAAAAAAAAAAAAAAAAAP////8A/wAAJwMDAAAAAAAAAAAA8///ANn9/QD//////////////wD///8AAAAAAAAAAAAAAAAA2f3+AAAAAAAAAAAAGgICAA0BAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAB89vcAAAAAAAAAAABpCAgAGgICAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wD///////////8A/wD/////AAAAAQAAAAAAAAABAAAAAAEAAQAAAQAB/////wAAAP8AAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD/AP////8AAAAA6+vrIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/Q8AAAAAAAAAAAAAAAAA/wAAAQABAP8A//////8AAQEBAf///wAAAAAAAAAAAAEBAQEA/wD/AAAAAAEBAQH/AP8A/wD/AP///wABAAEAAAAAAAABAAH/AP8AAAAAAP8A/wAAAAAAAQEBAQD/AAABAQEBAAAAAP////8A/wAA//8AAAAAAAAAAAAAAP8AAL77+wAAAAAAAAAAAFsHBwABAAEAAQEBARsDAgFCBQUAAAAAANj9/QDY/fwAAAAAAAAAAAAAAAAA/wD//wAAAAAAAAAAGgICAAAAAAAAAAAA2P39AP///wAAAAABAAAAAQEBAQD/////////AP///wD/AP8A2Pz8/wAAAAAAAAAAAAAAAAwBAP//AP8AAAAAAAAAAQAAAAAAAAAAAAAAAAC++vr/pPn5AAAAAAANAQEAkQsKAAD/AAAA/wD/AAAAAAAAAAAAAAAA/wAAAAAAAAABAQEBAQEBAQEAAQABAQEBAAAAAP///wD///8A////AP////8BAAEAAAEAAf8A/wEAAAAAAAAAAAEAAQD//////////wEBAQH///8A/////wAAAAD/AP8A/wD/AAAAAAEAAAAA////AP///wD/AP8AAP8A/wEBAQH/////AwMDLwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBATH/////AP8AAP////8BAQEA////AAAAAAEAAAAA////AAAAAAEAAAAA//////////8AAAAB//////////8A/wAAAP8A/wABAAD/AP8A////AAD/AAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAP//AP8AAAEAAQAAAAAAAAD/AQEAAAAAAAAAAAAAAAEAALH5+gDy//8AAAAAAFwHBgD///8A/wD/AE8FBgAAAAAAAAAAAKT5+QAA/wAAAAAAAAAAAAAAAAAAAP8AAQAAAAD///8AAAAAAAAAAAAAAAAADQEBAAABAAAA/wD/AAAAAP///wAAAAABAQEBAAAAAAABAAEAAQEAAQAAAAAAAAAAAAAAAP///wAA/wD/////AAAA/wAAAAAAAAAAAAAAAAAAAAAAlvf4AOX+/gAAAAAAJwMDAHcKCQAAAAAAAAAAAAAAAAAAAAAAAQAAAP///////////wD/AAAAAAD///8A////AAAAAP8AAAD/AAAAAAABAAEAAAAAAAAAAAD/AP//AP8A/wD/AP////8BAQEBAAAAAf///wAAAAD/AAAAAf///wAA/wD/AQABAP////////8AAAAA/wEBAQAA/wAAAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//wAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAEA/wAAAP8A/wABAAEAAAAB/wAAAAAAAAAAAAAAAQAAAPL//v+y+voAAAAAAA0BAQA0BAQAAP8AAE8HBgAAAAAA8///AL76+/8BAQEAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP//5f3+AAAAAAAAAAAADgEBAAD/AAAAAAABAAEAAAAAAAAAAAAA////AAAAAP//////GQEBAAAAAAAAAAAAAAAAAPT/AAEAAAABAAEAAP8AAAAAAAAAAAAAAAAAAAAAAAAB8///AH319gAAAAAAAAAAAFwHBwA0BAQAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AP8AAP8AAAAAAAAAAAAAAQEBAP8A/wAAAAAAAAAAAf/+//////8A//7//wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAAABAAAAAAAAAAAAAAEBAQEBAQEAAAAAAP////8AAAAA/wD/Af////8AAAAAAP8AAAAAAAAAAAAAAAAAAAEAAQG++vsAAAAAAAAAAABqCQgANQUEABoCAgAAAAAAvvv7APP//wH///8AAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEB2f39AAAAAAAAAAAAGgICAA4CAQD/AP8AAP8AAP////8AAAAAAAAAAP8A/wAAAAABKAQEAAAAAAAAAAAA5f3+APP//wAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAMv8/ACj+PkAAAAAAAAAAACFCwoBAAAAAAAAAAAAAAAAAP8AAP8A/wEBAAEBAAEAAP7//gAAAAAA/v/+AAEBAQEAAAAB/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAAD///8BAP8AAP/+////AP8AAAAAAAAAAAD+/v4A/////wAAAAH/AP8AAQABAAAAAAH///8AAgD//wAAAAAAAAAA//8AAAAAAADK+/v/y/z7AAAAAAA1BAQAXAcHAAAAAAAAAAAAo/j4AAAAAAD/AP//AAAAAAAAAAAAAAAA//////8A/wAAAAAA2f39AAAAAAAAAAAAAAAAAFwHBwAA/wAAAAAAAAEBAQH///8AAAAAAAAAAAEaAgH/QgUFAAAAAAAAAAAAzP38AAAAAAD//////wD/AAIA//8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAACW+PcA5f3+AAAAAAAaAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////7//wAAAAD/AP8AAAAAAP////8AAAAAAQEBAf8A//8AAAAAAAAAAP8A/wAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAH///8A/wD/AAEBAQEBAAEBAAAAAP8A/wAAAAAA/////wAAAP8A/wAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAAABAAAAAP///wAAAAAAAAEAAQAAAAEA/wD///////////8AAAAAAAAAAQAAAP8A/wAA////AAD/AP8AAQAA/gAAAQAAAAAAAAAAAAD/AP///wAAAQABvvr8AAAAAAAAAAAAQgUFAAAAAADl/v4A2P39AP///wAA/wABAAAAAAAAAAAAAAAAAAEAAQD/AAD/AP8Ayvv7/8v8+wAAAAAAAAAAAGkICABCBgUA//////////8BAQEA////AA4BAQCRDAwBAAAAAAAAAAAAAAAAsPn6AP///wAAAQABAAAAAP4AAQEAAAAAAAAAAAAAAAD/////////AP8A///z/v8Ab/T0/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAQD/AAAA/wAAAP8AAAAAAAH///8A/////wD/AAAAAAAAAAAAAAD/AAD/AP8A////AAAAAAABAAEA/////wAAAAAA/wD/AP8AAAD/AP//AP8AAAAAAAD/AP8A/wD/AP8AAACXQJIAAAAgAElEQVQAAP8AAAAAAAAAAAABAAD///8A////EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP////8AAAAAAP8AAAD/AAAAAAAAAAAAAQAAAAEAAAD//////wEAAQAAAAAB/////wAAAP8AAAD//////wABAAAAAAAAAQABAAAAAAAAAAABAAAAAQAAAAEAAAAAAAAA/wABAAEAAAAAAAAAAAAAAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAr/n4//L//wAAAAAAAAAAAAAAAACW9vcA/////wAAAP8BAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAD/////AAEAAZb2+AAAAAAAAAAAAAAAAACSDAwAhQwLAUIGBgFBBQQAagkIALgPDwAoAwMAAAAAAAAAAACw+fkAyvv6/wAAAAD/////AP8AAAAA/wAAAAAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAAA2P79AZb3+AAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAEA/wD/AAAAAAAAAAD/AP//AAAA/wD/AAAAAAAAAAAAAf///wD///8A/wD/AAAAAAAA/wAA/////wD/AAD///8AAAAAAAAAAAAAAAABAQEBAP8A/wAA/wAAAAEAAAAAAAEAAAAB/wD/AAAAAAH///8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A/wD//wEBAQEA/wAAAAAA/wAAAAAAAQABAP8AAAABAAAA/wAAAAAAAP8A//8BAQEBAP8A/wAAAAEAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAQAAAAAAAAD//wD/AAEAAQEAAAAA/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEAAQD/AP8BAQEBAAAAAP8A/wD/////AQABAQAAAAD/AP//AQABAQAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAANfX1wEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQD/AAD/AP8A/wD/AAAAAAH/AP8A/////wAAAP8A/wAA/wD///8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAQAAAAD///8AAAAAAP8A/wEAAAAAAAAAAAAAAAD//////wD//wABAAAAAAAA/wD/AAAAAP//AP8AAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAAAAAAAAf8A/wAA/wAAAAAAAAD/AAAAAAAAAAAAAAEBAQH/////AAAAAP8A//8AAQAAAAEAAAAAAAD/////AP8AAAAAAAAAAAAB//////8A//8AAAABAQABAf8A//8BAQEAAQEBAf////8AAQAA////AAAAAP//AP//AAAA//8A/wAAAAAAAAAAAP8A//8A/wAAAAAA/wAAAAAAAAAAAAAA//////8AAAABAAAAAAAAAAH///8A/v/+/wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAAEAAAEBAQEAAAAAAAAAAP8A/wAA/wAAAP8A/wAAAAD/Af8BAAAAAQD/AP8BAQEB/////wABAAEAAAD/AP4AAAEBAQEA/wAAAQEBAP8A/wABAAEAAAEAAf///wABAQEAAQABAf8A/wAAAAAA/wD/AAAAAP8AAAABAQABAAEAAQH/AP//AAAAAQAAAAEAAAAAAAAAAAEAAQAAAAAAAAEAAP/+/wAAAAAAAAAAAAAAAAD/////AQEBAQAAAAEAAAAA/////wAAAAABAQEBAP8AAAABAAD/////AQEBAQD/AAD/Af8AAQEBAP///wABAAEA/////wAAAAEBAQEB////AAD/AP//AP8AAAAAAAD/AAEAAQAAAAAAAP8A/wAAAAAAAAAAAQEAAQD/AP8AAAAA/wAAAAH+//7/AAAAAQAAAAD//v//AAEAAQAAAAAA/wAA/wH/AAAAAP////8AAQEBAQEAAQH/AP8AAP8AAAEBAQD/AP//AP8AAQEBAQD/////AQABAf8A/wABAAEAAAAAAf8A//8BAAEB/wD/AP8A//8BAAEB/wD//wD/AAEBAAEB/wD/AAAAAAD/AP//AQABAf/+//8AAQABAQABAAABAAH/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wAAAAAAAQABAAAAAAAAAAAAAAAAAAEAAQD/AP8A/wAAAAAAAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAP8A/wAAAAAA////AAEBAQD///8AAQEBAAEBAQD/////AAEAAQD/AAAAAQAAAAAAAAAAAAEAAAAA/wD/AAD/AP8AAQABAP8AAAAAAP//Af8BAP8AAAAAAP8AAAAAAP8AAQABAAAA/wABAAAAAAAAAAAAAAAA/////wAAAAABAQEB/wH/AQD/AP////8AAQEBAP////8AAQABAAAAAAABAAEA/wD/////AQAAAAAAAQAAAAAAAAD/AP////8AAAAAAQAAAAAA/wAAAAAAAAABAAAAAAAA////AAAAAAABAQEA/wH/AP8A/wABAAEA////AQAAAAAAAAAAAAEA/wABAAEAAAAAAAAAAP////8AAAABAP8A/wAAAAEAAAAA/wD//wD/AAEAAAD/AAEAAf////8BAQEB/wD/AP///wAAAAAB/////wAAAAH/Af8AAAAAAAEAAQH/AP8AAP8AAAAAAAH/Af8AAQABAQAAAAD/////AAAAAQEBAQD/AP8BAAAAAAABAAAAAAAAAAAAAAD/AAAAAAD/AQEBAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wEAAQAAAQAAAAAAAP8A/wAAAAD/////AP////8AAQABAP8AAAAAAP////8AAP8A/wD/AAAA/wD/AQABAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAAABAAAAAAD/AAAAAQAAAAAA/////wAAAQABAAAAAQAAAAEAAAAAAP8A/wAAAAEAAAD//wD/AAEBAQEBAAEA////AAD/AAD/AP8AAQEBAAAAAAD///8AAAAAAAAAAAEAAAAAAAEAAAABAAEBAQEAAQEBAAD/AAAAAAAAAAAAAAAAAP////8AAP8AAAD/AAD///8AAAAA/wAAAAAAAAABAQABAQD/AP8A/wD/AAAAAAABAAEAAAAAAAAAAQAAAP8AAAAAAP8AAAAAAAAAAAAAAP8AAAABAAH/AP8AAAEAAAAAAAAAAAAAAAAAAQABAAAA/wAAAP8AAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AP///wAAAAABAAAAAP///wABAAEA/////wD/AAD/////////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAAD/AAAAAAABAAAAAAAAAAEA/wAA/wD//wAAAAEAAAAAAAAAAAABAAAAAAAB////AAAAAAEAAAD/AP8AAAABAAEAAAAA/wD//wAAAAAAAAD//wD/AAAAAAD///8AAAAAAQAAAAD///8AAAAAAAAAAAD///8A/wD/AAAAAAD///8A//////7//v//////AAAAAAABAAABAAEB////AAAAAAAAAAD/AAAAAAAAAAAAAAAB//7//wD/AAD///8A////AP////8A/wAA/wD//wAAAAEAAAAAAAAA//8A//8AAAAAAAAAAf8A//8AAAAA/v7+/wAAAAEAAAABAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAQAAAAAAAAABAAAA/wD/AAAA/wAAAP8AAAAAAAD/////AAAA/wD/AAD/AP//AAEAAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAP///wABAAEB/wD/AAEAAQAA/wAAAQABAQAAAAD/////AQEBAf/+//8AAQAAAQABAf////8A/wAAAAEAAAEAAQEAAAAAAAAAAP8A//8BAAEBAQEBAQD/AAD/AP8AAP8AAAD/AAABAQEA/wD//wD/AAAAAQAAAP8A/wAAAAAA/wAAAQEBAf////8AAQABAQABAP8A/wABAAEAAAAAAP////8BAQEBAAAAAAAAAAD/AP8AAQABAf8A//8BAQEBAAAAAAAAAAAAAAAA/wD/AAD+AP8AAQABAQABAAAAAAAAAAABAAAAAAAAAAD/////AQEBAf8A/wAA/wD/AQEBAQABAAEAAQAAAf8BAQAAAAAAAAAAAAAAAQEAAQAAAAD/////AAABAAAAAAAAAQEBAQAAAAAAAAAAAAAAAP////8AAQABAQABAAEBAQH/AP8AAAAAAAEAAQAAAAAAAAAAAf////8BAQEBAAAAAP8A//8BAQEB/wD/AAAAAP8A/wAAAAAAAAEAAQH/AP8AAAAA/wAAAAEBAAEB/wD//wEAAQEAAQAB////AAD/AAABAQEB/wD/AAEAAQD///8AAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wABAAEAAAAAAAAAAAD/AP//Af8BAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAB/wD/AAABAAEA/wD/AAAAAAEBAQH/AP8AAP8A//8B/wAA/wAAAAEAAAAAAAEAAAAAAP8AAP8A/wAA/wD/AAEAAQAAAP//AP8BAAAAAQAAAP8AAAABAAEA/wEAAQH/AP//AAAAAAAAAAAA/wAA/wD//wAAAAEAAQAA/wD/AAAAAAH/AP8AAP8AAAAAAAAAAAAA/wD//wAAAAAAAQAAAAAAAP////8AAAABAAAAAAABAAEA/wD//wH/AQAAAAABAAEA/wD/AAD/AAABAQEB/wD/AAAAAAAAAAAAAAAAAAEAAQD//v//AAAAAQAAAAABAQEA/wD/AAD/AP8AAQABAAEA/wAAAAH/////AAAAAQAAAP8AAAAAAAAAAQAAAAAA/wD//wD/AAABAAEAAAAAAP8AAP8B/wAA/wD/AAEAAQAAAAAAAAAA/wD/AAD/AAH/AP8AAAAA/wEBAQEAAQAA/wD/AAD/AP8BAQEB////AAEBAQD/AP8AAP8AAAABAAD///8AAAAAAAABAAD///8AAAEAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AP8A/wAAAAD/AP8AAAD/AP8AAAAB////AP///wAAAAAAAAEAAQD/AAAAAAAAAQABAAAAAAD//////////wD/AAAAAQABAP8A/wAAAAH/////AAAAAP8A/wAAAAAAAP8AAf///wAAAAAB/wD/AAABAAEAAAAAAAEAAQAAAAD/////AP8AAAABAAABAAEA/wD//wAAAAD/AP//AAAAAAABAAH/////////AAAAAAH/AP//AAAA/wAAAAAAAAABAAAAAAAAAAD///8AAP8AAAAAAAD///8AAAAAAAD/AP8AAAAAAAAAAP///wAAAAAAAAAA/wAAAAD/////AP8AAAAAAAAAAAAAAP8AAQEAAQAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAAB/wD/AAAAAAAAAAAAAAAA/wEAAQAAAAABAQABAAAAAAH///8A/////wAAAP8AAAAAAAAAAAAAAAD+//7/AP8AAAAAAAH///8AAAAAAf///wAA/wAAAAAAAf////8A/wAAAP8AAAD/AAEAAAAAAP8AAAD/AP////8AAP8A//8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD+//4A/wD//wD/AAAAAAAAAP8AAP8A//8A/wAAAAAAAAAAAAD/AP//AP8AAP//////AP8AAAEAAP8A/wD/////AAEAAAAAAAAA/wAA/////wAAAAAAAAAA////AAD/AAAAAAABAAAAAQAAAAAA/wAAAAAAAQD/AAABAAEBAQABAAEBAQEA/wAAAAEAAAAAAAAAAAD/AQABAAD/AAAAAAD/AP8AAAAAAAD/AP8BAAAAAAD/AAD///8AAQABAf8A//8AAAAAAAAAAQD/AAAAAAABAAAAAP8A//8BAAEBAAAAAQD/AAAAAAAAAP8AAAD/AAAAAAAAAAAAAP////8AAAAAAP8AAAABAAEAAAAB////AP8A//8AAAABAAAAAQAAAAAAAQABAAAA/wAAAAH///8AAAAAAP///wAAAAABAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAQABAf////8A/wAAAAAAAf7//v8AAAAA//////8A//8AAAD/AQABAQAAAAH/AP8AAAAAAf///wABAAEBAAAAAP8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEBAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD/AP//////AP//AAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA////AAD/AAAAAAD/AP8AAP8A/wAAAAAB////AP8A/wD/AP8B/wD///////8BAAEA/wD/AP////8AAAAA/////wEAAQEAAAABAAAAAAAAAAD//////wD/AAEAAQH/AP8AAAAAAAAAAAD/AP8A/////wAAAP8AAAAA/wD//wABAAD/AP//AAAAAAD/AAD/AP8AAAAAAAEAAQEAAAAAAAAAAP8A/wAA/wD//wD/AQAAAAABAQEA/wD/AP8A////AP8A////AAAAAAAA/wAA//7//wAAAAD//////wD/AAAAAAH/AP//AAEAAAEAAQEAAAAA////AAEAAQH/AP8BAAAAAAABAAABAAEA//////8A//8AAAAAAAAAAAEAAQEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAAAAAD/AAAAAf////8AAQAAAQABAf///wABAQEAAP8AAP////8AAQABAP8AAAABAAEAAAAA/////wAAAAAAAQAAAAEAAf8A/wAAAAAAAQABAP8B/wEA/wD//wD//wABAAEAAAD/AAAAAQAAAP//AP8BAP8A/wEBAQH/AP8AAP8AAAABAAD/AP8AAQABAAAAAAAAAAAAAAAAAQEBAQD/AP8AAP8A/wABAAH/AP8AAQEBAf8A/wAAAAAA/wD/AAD/AP8AAQABAP8A//8B/wEBAAEAAAAAAP///wAAAAD/AAAAAP///wABAQEAAP8AAAABAAAA/wAA/wD//wABAAAAAAABAAAAAAABAAD//v//AQEBAQD/AP//AP8BAQEBAP8A/wAA/wAAAQABAP8A/wEA/wD/AAEAAf////8AAQABAAAAAQAAAAAAAQABAAAAAAAAAAAAAAABAP8AAP////8AAAABAAAAAP////8AAQAB////AAAAAAAA/wD/AAAAAAD/AAD/Af8AAQABAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAA/wEAAQH//v8AAJqhVNEAACAASURBVAAAAQABAAAAAAABAQABAP8A//8A/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAQEBAQEA/wAAAP8A/wAAAAAA/wD//wD/AAAAAAAAAQABAAAAAQAAAAAAAAABAAAAAAD/AAAA/wD/AAEAAf///wAA/wAAAAAAAAD/AAAA/wD//////wAAAAAAAAAAAP8AAP///wAAAAAAAAAAAQD/AP8A/wD/////AAAAAAAA/wD/AAAAAP8A/wAA/wD/AAAAAQD/AP//AP8A/////wABAAAAAQABAAAAAQABAAH///8AAAAAAAAAAAEAAAABAAEAAQAAAAAA/wAA/wD/AP/+/wAAAAAA/wD/AAABAAAAAAAA/wD/AAD/AAAA/wD//////wAAAAAAAAABAP8AAAAAAAAAAAAAAQEBAP////8A/wAAAP8AAAD/AAAA/wD/////AAAAAAEAAQAAAQEBAQAAAAEA/wD/AAAAAAD/AAAAAAABAAEAAQAAAAEA/wAA/v/+/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAf///wAAAQAAAAAAAAD/AP8AAAAA/////wD/AAAAAAABAP8AAf8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAP8AAP8A/wABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA//7/AAEBAQD///8AAAAA/wAAAAH/AP8AAQABAP////8BAQEBAP8AAAAAAAAAAAD/AAAAAQD/AAAAAAAAAAAAAP8A/wEAAAD/Af8B/wAAAAD/AP8AAQAB//8A/wAPDg8BGhsaACopKgANDg3/DQwNAQEBAQDy8vIA5OXkAPTz9AHW1tYA8/Pz/wD/AAEAAAABAAAAAAD/AAD/Af8AAQABAAAAAAH/////AQEBAf////8BAAEA/wD/AAEAAQEAAAAAAAEAAQD/AP//AP8BAP8A/wEBAQEAAAAAAP8AAP8A/wABAAEBAP8A/wAAAAEAAAAAAP8AAP8A//8BAAEBAAEAAAD/AAD/AP//AAAAAAAAAAAA/wD/AAEAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAA/wAA/wD/AAAAAAD/AP8AAQABAAAAAAAAAAAAAP8AAP8A//8BAQEBAf8BAf///wAAAAABAAAAAP8A//8B/wEBAAAAAAAAAAAA/wAAAAAAAAAAAAEA/wD/AAAAAQABAAAA/wAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAAAA/wEAAQH/AP//Af8BAQAAAAAAAAAA////AAAAAAAAAAAAAQEBAQAAAAABAAEA////AAABAAAAAAABAAAAAAAAAAD//v//AQEBAQABAAAA/wABAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAEBAAAA/wAAAAE3NzcARENEAENDQwAcHBwAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA19fXAdfY1wCvr68AysnK/wABAAEBAAEAAAAAAAAAAAAA/wAA/wD/AAEAAQEAAAAAAQABAAD/AAAAAAD/AP8AAQAAAAEBAAEAAAEAAQD/AAAAAAAA/wD//wEAAQEAAQAAAP8AAP////8AAAAAAQEBAQEBAQH/////Af8BAf8A/wABAAEB/wD//21tbQEcGxwA////AAEBAQD///8AAQEBAP8A/wB5eHkA/wD/AAAAAP8BAAEBAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wD/AAEAAQAAAAAAAAAA/wD/AAEAAQD/AP//AP8AAQAAAAAAAAAAAAAAAP////8BAQEBAAAAAP8A/wAA/wAAAQEBAP///wAAAAAAAQABAP8A//8BAAEB////AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACUmJf8BAAEA////AAAAAP8AAAABAAEAAAEAAQD/////AAEAAAAAAAEA/wD/AAAAAQEBAQD/AP8AAP8A/wAAAAAAAAAAAAAAAQABAAAA/wD/AAAAAAEBAQH/AP8AAP8A/wABAAEAAAAAAP8AAAEBAQD/AP8AAP8A/wABAAEAAAAANzY3AG1tbQA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXlAJOUkwCurq4AAP8A/wEBAQH///8AAQEBAP////8AAQABAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEAAQEBAQD///8AAP8A/wEBAQH///8AAAAAAAAAAP8BAQEBAAAAAP8A/wAAAAAAAP8AAAABAAAcGxwAiIiIADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJyYAAAAAAAEAAQAAAAAA/wD/AAAAAAAA/wD/AAEAAQD/AP8AAAABAAAAAAEBAQAAAAAA/////wEBAQEAAAAA/wD/AAD/AP8AAQABAAAA/wAAAAEAAAAAAP8AAAABAAAA/wAAAAAA/wABAAAAAAABAP8A/wABAAEBAAEA/wD/ANva2wEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACUlJf4AAAABAAAA/wABAAEAAAAAAAAAAAD/AAAAAAD/AQEBAf///wAAAQAAAP8A/wABAAEA/wAAAQEBAP///wAAAQAAAP8AAAEBAQD/AP8AAAAAAAD/AP8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAEAAQAAAP8A/xwcHAGIiIgANjY2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX19cAa2trAOTk5AAAAQAA/////wEAAQAAAAABAQEBAP////8AAQABAP8A/wABAAEA/wD/AAAAAAAAAAAAAQABAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAFJSUgB7ensADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJib/AAEAAQD/AAAAAAAAAAEAAAD/AP8AAQABAP8A/wABAAEA/wAAAAAAAP8A//8BAAEAAQEBAf///wAAAQAAAP8A/wAAAAAAAAABAAAAAAEBAQD///8AAQEBAP////8AAAABAAAA/wAAAAEAAQAAAP8A/wAAAAAAAAABAAEAANva2wEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAQAAAQEBAf///wAA/wAAAP8AAP8A//8AAAAB/////wAAAAAAAAAAAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAEAAP///wAA/wD//////wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAQAAAP8A/wAAREREAbGxsQA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkAsLCwAEVFRQAA/wAAAQEBAQAAAAEAAAAA/v/+/wAAAAH/////AAEAAQD/AP8AAAAA/wD/AP8A/wAA/wAAAP8AAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAANDQ0Ae3p7AIiHiAANDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////wABAAAAAAD/AP8AAP8A/wAA/wAAAAAAAQD/AAAAAAAAAAEAAAEAAQEAAAABAAAAAAABAAAA/wAAAQEBAf8A/wAAAAAAAAAA//8A/wAAAAD/////AAAAAAEAAQAAAAAAAQAAAAAA/wD//wD/AP8A/wD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA////AAEAAQD/AP8AAAAAAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAAAAAAAAAD//wD/AAAAAAD///8AAP8AAP8A/wD/AP8BAQABAf////8AAAABAAAAAQAAAAAAAAABAAAAAP8A/wFRUlEAlpaWAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OAJWVlQA2NjYAAP8AAAAAAAAAAAAAAQEBAf8A/wABAAEB////AAAAAAEAAAABAAAAAAEAAQH/AP//AAAAAAD/AAAA/wAA/wD//wAAAAD/AP//AAAAACkpKQCysbIAX19fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AP8B/wD/AAEAAQEAAAAAAAAAAP8A//8AAAAAAP8AAP8A////AP///v/+AP////8AAQAA/v7+/wEAAQH/AP8AAAAAAQD/AAAAAAABAAAAAP8A////////AAAA//8A////AP8AAAAAAAEAAQEBAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACUlJf8AAAAA/wD/AAAAAAABAAEAAAAAAAABAAD///8AAQABAAAAAAD/AP//AQABAf8A/wABAAEA/wD/AAD/AP8AAAAAAAEAAQD/AP8BAgEB//7//wAAAAAAAQABAQABAP8A/wAAAAAAAP8A/yoqKgGxsbEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQAvL28ANfW1wDl5eUAAAAAAAAAAAAAAQAAKSgpACkpKQA3NzcAGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIAT09P/+Tl5AEAAAAAAP8A/wABAAABAAEB/wD/AAAAAAAAAAD/AQABAf8A/wABAAEA/wD/AAEAAQD/////AAEAAQEBAQAA/wAAYGBgAHp6egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJiYAAAAAAP8A/wABAAEAAAAAAP8A/wAAAAAAAP8A/wABAAEBAAEA/////wEBAQH/AP8AAAAAAAD/AP8BAQEB/wD/AAAAAAABAAEAAAAAAP////8AAAAAAAEAAAEAAQH/////AAAAAQEBAQD/AP8AAAAAAAAAAAABAAEA////ANzc3AEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACQlJP8A/wAA/wD//wEBAQEA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAQAAAAAAAAD/AP8AAAABAAAA/wAAAAEAAAAAAQEBAP8A/wABAAEAAAAAAP8A/wAA/wAAAAEAAAAAAAAAAAAAHBscAKSkpAAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycnJAJOTkwDJyskAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAD/AAAAAQABAAAAAAAAUlFSAG5ubgAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycnJAF1dXQD///8AAQEBAP8A/wAAAAAAAQABAAAAAAD/AP8AAP8A/wABAAEBAAEAAAAAAP8A/wAA/wAAAAEAABwbHACIiIgANzc3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJSX//wD/AAAAAAABAAEBAAEAAAD/AP8AAAAAAAEAAAEAAQH///8AAAEAAAD/AAD/AP//AgECAf8A/wAAAAAAAP8A/wEBAQH/////AAEAAQAAAP8A/wAAAQEBAf8A/wAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAQABANvb2wEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAQD/AP//AP//AAAA/wAAAAEAAQAB/wD/AAAAAAAA/wAAAP8AAAAAAAEBAQEAAAEAAf8A//8AAAAA////AP//////AP8A////AAAAAAAAAAAAAP8AAAD/AAAA/wAAbW1tABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz8wBqamoAXFxc/8nKyQAA/wAAAAAAAAAAAAAAAAAAAQABAAAAAP8BAQEBAAAAAP////8A/wAArq+uAEBAQAChoaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzc3ADU2Nf8AAAD//wD/AAD/AAAA/wAA////AP///wAA/wAAAAAAAQD/AAD/AP8A////AAD/AP8AAQAAREREALGysQA3NzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/PzALy8vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAQEAAQEAAAAAAP8AAAAAAAEAAAABAAAAAf8A/wAAAAD/////AAAAAP8BAAEB/wD/AAD/AP8A/wD/AAAAAf//////AP8BAP8AAP///wAAAAAB////AAD/AP8A/wAA////AAAAAP8A/wAAAP8AAAD/AAD//////////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAAAAAAEBAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wD////////+//7//////wAAAAAAAQAA/wD//wEAAQD/////AAAAAP///wD/AP//AAAA//8A/wAbGxsAUlJSAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/PzAE1NTQC7u7v/AAAAAQD/AAAAAAAA/wD//wAAAAAAAAAA////AP8A/wD///8AAAAAAAEAAQEAAAAAAP8AAP8A//+Dg4P/u7u7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5tbgH/AP8B/////wAAAAAAAAAAAAAAAAAAAAD/AP8A/wD///8A//8A/wD/AAAAAA0ODQF7ensAl5aXAA4NDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJyckATU5NAJ+gnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEB/wD//wEBAQD/AP8AAAAAAAAAAAAAAAAA//////////8AAAABAQABAP8A/wAAAAAA/////wAAAAH/AP8BAAAAAP8A/wEBAAH//wD/AAEAAQEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAEAAAAAAAAAAP8A//8BAAEB/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//////v/+AAAAAAAAAAAAAAAAAQAAAAD/////AAAAAf8A/wAAAAABAQABAQAAAAABAAEBAQABAQEAAQH///8AAQABAf8A/wEBAAEBAAAAAAAAAAAAAAAB////AAD/AP9ubm4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISEAOTk5P//AP8BAAEAAP////8AAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAA//////8A/wD//////wD/AAEAAQEAAAABeHh4APPz8wAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwAPDg8AAAAAAf8A/wD//////////wAAAAAA/wD/AQABAQD/AAAAAAABKSkpALKysgBgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISFhABbXFsA5OPk/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAP///wABAAEA/wD/AAAAAAD/////AQABAQEAAQH/AP8A/wD/AAEAAQH/////AP8AAAAAAAABAAEAAAAAAAEAAQD///8AAQABAAABAAAAAAAA/wD/AAABAAAAAAAAAAAAAf8A/wD/////AAAAAAD/AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wD///8A//////////8AAAABAAAA/wAAAAAAAAAA/wD/AAABAAD/AP8A/////////wAAAAAA////AAD/AAD/AP8A/////wAAAAAAAAAAAAEAAQABAAE3NzcAAAAAAAAAAAAAAAAAAAAAAAAAAAC7u7sAra2t/wABAAEAAAAA/////wABAAD/AP8AAAAAAP8A/wD/AP8A/wD/AAD/AAD/AP//AAEAAQAAAAAAAAAAAP8AAP////8AAAD/8fLxAK2trQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2Njb/AP8AAAD/AP8AAAAAAAAAAP///wAAAQAB/wD/AAABAAE2NzYAsrKyABwbHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUATk5OAKCgoAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEAAf8A/wAAAAAAAP8A/////wAAAAAA/wD/AP8A/wAA/wAAAAAAAP8A/wAAAAABAAEAAf///wAAAAAA////AP8A/wD/AP8A/wD/AP/+/wD/AP8AAP8A///+/wAA/wAAAAAAAAD/AP8AAQAA/wD//wAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wD/AAD/AAAAAQAAAAAAAQABAAEAAQAAAP8AAQD/AAD/AP8A/////wD/AAEA/wAAAAEAAQAAAAAA/wAAAAEAAAABAAD/////AAEAAQAAAAD/////AAAAACkpKQAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAACgoaAAAAEAAQAAAAAAAAAAAAAAAQAAAAEA/wAAAP8AAAD/AP8A/wD/AQABAAAAAAAA/wABAP8AAAAAAAAAAAABAAEAAAABAAH/AP8AAP8AAMrKygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsB/wD//wABAAEAAAABAAAAAQAAAAAA/wAAAAAAAP////8bGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCgoABMTUz/1dbV/wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAP8AAAD/AP8AAAAAAAAAAQAAAP8AAAAB//////////8AAAD/AP8AAAD/AAAAAAAAAP8AAAAAAAD+//7/AAEAAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAQABAAAAAAAAAP8AAAABAAEA/wABAP8AAQAAAAEAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wD/AAAA/wAAAAEAAQH/AQAAAAD/AAAAAQAAAAD/////AQABAQAAAAAAAQAAAAAAAP8A//8A/wAAAQABAQAAAAABAAEAAQABAP7+/v8BAQEA/////xwcHAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJyMkAAAAAAP8A//8AAAAAAAAAAQAAAAABAAH/AAAAAQAAAAEAAAAA////AAAAAP8AAAABAAEAAP////8AAAAAAQABAf///wAAAAAAAAAAANbW1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4AAAAAAAD/AAD/AP//AQABAQAAAAAAAQAA/////wEAAQEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAdnZ2AMjJyAABAAEBAAAA/wD/AAABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAH///8AAAAAAAAAAAH/AP8AAQABAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAABAAEB/////wEAAQH/////AAAAAAEBAQH/////AQABAf////8AAAABAQABAP////8BAAEAAAAAAQAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAABAAEA/wD/AP8A/wAAAAAAAQABAP8A//8AAAAB/wD/AAEAAQD/////AQEBAQD/AAAAAQAB/wD/AAAAAAAAAAAAAP8AAAABAAEAAAAAAAAAACopKv8AAAABAAAAAAAAAAAAAAAAAAAAAMnJyQD/AP//AAAAAQAAAAEAAAAAAQABAP8A/wAAAAAB/wD/AAAAAAAAAAAAAQABAAAAAAH/AP8AAf8BAAEAAQEAAAAA/////wEAAQEAAAAB//////Ly8gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAA/wABAAAAAP8A/wAB/wEAAQABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf90dHQB8vPyAAAAAP8AAAABAQABAf8A/wAAAAD/AP8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//7//wAAAAAAAQAAAAAAAQAAAAAAAAAA/wD/AQAAAAABAAEA/wD/AAEAAQD/AP8BAQABAAABAAAA/wAAAAAAAP8A//8ANrb8TAAAIABJREFUAAABAAAA/wD/AAABAAEB/////wEBAQH/AP///wD/AQAAAAAAAAAB/wD/AAAAAAABAAEA/wD//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA////AAABAAAAAAAAAQABAP///wAAAAD/AAEAAAAAAAEAAAAAAP8AAAAAAAAAAQAA/wD/AAD/AAH/AP8AAAEAAQD/AP8AAAABAAEAAAAAAAD/AP8AAAAAAAAAAAAA/wD/np6eAaysrP8AAQABAAAAAAAAAP8BAAEBAAAAAAAAAAEBAAEAAAAAAP////8AAQABAAAAAP////8AAQABAP8AAAABAAD/AP8AAQEBAAD/AAD/AP8AAAAAAAD/AP8AAQAB/wD/AAD/AAAAAQAB/////wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAP8A/wAA/wD/AAAAAQAAAAAAAAAAAAAAAPPz8wCRkZEAn5+fAQABAAAA/wD/AAEAAf////8AAQABAAAAAAEAAQH/AP8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8A//8B/wEA/wD//wD/AAAAAAEAAQAA////AAAAAAABAAEB/wD/AAD/AAAAAAAA/wH/AAAAAP8AAQABAAAAAAD/AAEAAAD/AAAAAf8A//8BAQEB//////8A/wAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wD//wD/AAABAAEAAAABAAAAAAAAAAD///8A/wD/AAIBAgD///8AAAEAAP8A//8BAAEBAP8A/wAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAP8A/wD/AP8A8vLy//Ly8gEAAAD/AAAAAAAAAAEAAAAAAQEBAAD/AP//AP8BAAEAAAAAAAH///8AAQEBAP4A/gABAAEAAAAA/wAAAAEAAAAA////AAD/AP8AAAAAAAEAAAABAAH/////AQEBAQABAAD/////GxwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANbW1gAA/wAAAAAA/wABAAH/////AQEBAQAAAAD/AP8AAQABAP////8AAAAByMnIAHd2dwDk5OT/AAAAAQD/AAAAAAABAAAAAAEBAQH///8AAAEAAP8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wEBAQH///8AAAEAAAAAAAAAAAAAAAEAAQD/AP8AAAABAAAA//8A//////8AAAAAAAEAAQD/Af8BAP8AAAABAAAAAAABAP8AAAAAAAEAAQAA////AAEBAQD///8BAAAA//8A/wAAAAAAAAEAAQAAAP//////AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAQEBAAD/AAAAAAAA/wD//wAAAAAAAAAAAQABAf///wAAAAAAAP8AAAAAAAD///8AAQABAQABAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAABAAEBAAAA//8A//8BAAEBAAAA/wAAAAAAAAD/////AQAAAAH/AP8AAP8A/wAAAAEAAAD/AP8AAQD/AAAAAAAAAAAAAQAAAAABAAEA/wD/AAAAAAEAAQAA/////wEAAQAAAAAA/////wAAAAAAAAABKikqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANbX1v8AAAAB/wD/AQD/AP8BAAEB/////wEBAQEAAAAAAAAA//Pz8wGDg4MAoKGgAP///wABAAEBAAAA/wAAAAEAAAAAAP8AAP8A//8AAAAA////AQEAAQABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//v//AAEAAQD/AAAAAQAAAP8AAAAAAAD/AP//AQABAf8A/wEBAAEAAAAAAQEBAQD///8AAQABAAAAAAAAAAAA/wD/AAH/AQAAAAD/AAEAAQD/AAAAAAAA/wD//wD/AAH/AP8AAQABAQAAAP8A/wD/AAEAAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD//wEBAQEA/wAAAP8AAP8A//8AAAAAAAAAAAEAAQH/AP8AAAAAAAAAAAAAAAAA/wD//wEAAQH/AP8A/wD//wD+AAABAQEBAAAAAf8A/wAA/wD/AAEAAQAAAAAA/wD/AQEBAQEAAQAAAAAAAAAAAQABAAD///8BAAAA/wEAAQEAAAD/AAAAAAEAAQAAAAAB/////wEBAQEAAAAAAAAA/////wD/AP8AAQABAf8A//8A/wAAAAAAAQAAAAAAAAABAAAAAAAAAP8A/wD/bm5uAQAAAAAAAAAAAAAAAAAAAAAAAAAAycnJAOXk5QEAAAAAAAAAAAEBAQH///8AAAAAAf///wABAAEBAAAAALq6uv8BAgEB/////wAAAAH/AP8AAQABAf8A//8BAAEB/wD//wAAAAEAAAD/AAAA/wAAAAAAAAAB/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A//8B/wEB/wD//wAAAAAAAAAB/wD//wEAAQAAAAABAAAAAP////8AAAAA/wD/AQAAAAAB/wH/AQEBAf/+//8BAQEB/////wEAAQEA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD///8AAQABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEA/////wAAAAEAAAABAQABAQABAAABAAEA/wD/AP8A/wAAAAAAAP8AAP8A/wABAAEAAP8AAQAAAAH//////wD/AAEAAQAAAAAAAQEBAAD/AP8AAAAA/////wAAAAD/AP8AAAAAAP///wAAAAD/AP8AAAABAAAAAAABAAAAAf8A/wAAAAAAAAEAAf8A/wD/AP8A////AAAAAAEAAAAB/wD/AAAAAAAAAAABAAAAAP8A/wAAAAD/AQABAAAAAAFTU1MBHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAArK2sAP//////AP8AAP8AAP/+/wAAAAD/AAAAAAD/AAD/AP8A/////wABAAH//v8AAQABAQD/AAAAAAAA////AAAAAAEAAAAAAAAAAQAAAAABAAEBAP8AAP///wH/////AQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAAAAAAH/AP8AAAAAAQAAAAEAAAAAAQABAf7//gD/AP8A/wD/AAD/AAABAQEBAAAAAAAAAAD/AP8B////AAAAAAD/////AP8AAP//////AP8AAP8A//8A/wAAAAAA/////wD/AAEAAQAB////AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AAD/AP8AAAAAAf////8AAAAA////AP/+/wD/////AP8AAAAAAP//AP8AAAEAAQAAAAD/////AAAAAP8A//8AAAABAP8AAP8A/wAAAQABAP8AAP8A/wAAAQABAAAAAf////8AAAAA////AAAAAAAAAAABAAAAAf/+/wAA/wD/AP8AAAD/AP/+//7/AP8AAAD/AAAA/wAAAAEAAQD/AAAAAAAAAP8AAAD/AAEAAAAAAAAAAAD/AAAAAAAB/////xsbGwBvb28AAAAAAAAAAAAAAAAAAAAAAAAAAADW19YArKys/wAAAAEAAAAAAAEAAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAQD/AP8AAQAA/wD/AAABAAAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAABAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wD/AAD/////AAAAAAAAAAAAAAAA////AAEBAQEBAAEAAAAAAAABAAH//v8AAAAA/wD/AAAAAAD/AP8A//8A/wAAAAAAAQEBAQAAAAEBAAEAAAAAAQAAAAAA/wAAAAEAAQABAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAEAAQH//////wD//wAAAAAAAAABAAEAAP///wAA/wAAAP8AAP////8AAAABAQEBAAEAAQEAAAD//wD/AAD/AAD/////////AAEAAQEAAAAA/wD//wAAAAH///8AAAAAAP///wD/////AAAAAAABAAAAAQABAAAAAAABAAEBAAEBAAEAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAABAAAA/wD/AAAAAAAAAAAA/wD/GxwbAaempwAcHBwAAAAAAAAAAAAAAAAAAAAAAOTk5ABoaGgAAQEBAQAAAAD/////AP8AAP8A/wAA/wAAAAAAAAD/AAAA/wAAAAAA//8A/wEA/wAAAP8AAAD/AAD/////AQEBAf////////8AAP8AAP//////////AAAAAQD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAABAAEBAP8AAAD/AAAA/wAA/wD//wD/AAD///8A/////wD/AAD/AP8AAAAAAQAAAP8AAAABAAAAAAEBAQH/AP8A////AAABAAD///8AAAAAAAAAAAD/AP8AAP8AAP////8A/wD/AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAEAAAAAAQABAAAAAAABAAEBAAEAAP////8AAAABAQABAAAAAAD/AP8AAAAA/wEAAQH/AP//////AQAAAP8AAAAAAQABAP8A//8BAAEB/wD//wAAAAEA/wAAAAAAAP8A/wAAAAAA/wD//wAAAAAAAAABAAAAAAAAAAD///8AAAAAAAEAAQD/AP8AAf8B//8A/wEBAAEA/wD//wAAAAABAAEBAAEAAAD/AAD/AP8BAP8A/w8ODwFgYWABYmFiAA4ODgAAAAAAAAAAAAAAAAAAAAAA8vLyAGdoZwDj4+P/AQABAf8A//8AAAAAAAAAAP////8AAAABAP8AAAAAAP8BAAEB/wD/AQAAAP8AAAABAAAAAAAAAP8BAQEBAP8AAAD/AAD/Af//AAAAAAEAAQEAAQAAAP8AAAAAAAD///8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAABAP8AAAAAAP8BAQEB////AAEBAQD///8AAAAAAf8A//8BAAEBAQABAf8A/wAAAAAAAP8AAP8A/wAA/gD/AQEBAf///wAAAAABAAAAAP///wABAAEA/wD/AAD/AAAAAAD/AAEAAQH/AQH/////AQIBAAD/AAD/AP//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAEA/////wABAAEAAAAAAf8BAAAAAAABAAEA////AAAAAAEAAAAAAAAAAf8A/wAA/wABAAEAAAAAAAEBAAEA/wD/AAAAAAH/AP8AAAAAAQEAAQD/AP8AAQABAf8A//8AAAABAAAAAQEAAQD/AP8A/wD/AAD/AAABAAEA/wD/AP////8A/wAA/wD/AAABAAD/////AQEBAf8A/wAAAAAA////AB0cHQApKSkANzg3AVRTVAAODg4AAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQAWlpaAOTk5AAAAAAB/wD/AAAAAAEAAAD/AAAAAAAAAAEAAAAAAP8A/wAAAAAAAQAAAP8A/wABAAH/////AAEAAQEAAQEA/wAA/v/+/wEBAQEAAAAAAAAAAAAAAAD/////AP8AAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8BAQEB/wD/AAD/AAD/AP//AAAAAf///wAAAAAAAP8A/wEBAQH/AP8AAQABAAAAAAAAAAAA/wD/AAEAAQEAAQAAAAAAAAAAAAAA/wAA/wH/AAAAAAD/AP8AAAAAAAAAAAAAAAAB////AAEAAQAAAQAB//7//wABAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAD/AP8AAAAAAQEAAQD/AP8A/v/+/wEAAQD/Af8AAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAD/AP8AAAEAAQD/AP8AAQABAAAAAP8A/wAAAAAA////AAABAAAAAAAAAAAAAP////8AAQABAAAAAAD/AAD/Af8A/////wAAAADEw8QBAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vLyAKChoP+cnJwA8/PzAQD/AAAAAQAAAP8AAAEBAQD///8B/wD//wABAAEAAAAA/wD/AAEAAQD/AP8AAAAAAAAAAAAAAAABAAAAAP////8AAQABAQEBAQEAAQD///8AAAEAAP8A/wD///8AAQEBAQEAAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH/AP8AAAAAAAAAAAEA/wD/AAAA/wAAAAAAAQABAAEAAf8A/wABAAEA/wD/AAAAAAAAAAD/AP8AAf8B/wAA/wAAAQEBAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8AAP8B/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEAAAAAAP///wAAAAAAAQABAQAAAAAAAAAAAAEAAAD/AAD/AP//AQEBAf////8BAAEBAAEAAAD/AAD/AP8AAQABAAABAAEAAAAA/////wIBAgH///8A/wD//wEAAQEA/wAAAAAAAAABAAEAAAAAAP8AAP8A//8B/wEBAQABAQAAAAAcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8gCfn58AnZ6d//Py8wEAAQAAAQABAP8A/wAA/wD/AAAAAf7//v8BAQEBAP8AAf////8BAQEBAQEBAQD/AAAAAAAAAAAAAQD/AAD/AP//Af8BAQABAAAA/wAA/wD//wAAAAAAAAABAAAAAP////8BAAEBAP8A//8A/wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAAEB/wD//wEAAQH/AP8AAQABAQABAAD/////AQABAQAAAAD/AP8A/wD//wEAAQEAAQABAAEA/wD/AAEAAQAA/v/+/wEAAQEAAAAAAAAA/wAAAAD/AP8BAQABAP8A/wAA/wAAAQEBAAD/AAAAAQABAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAEAAAH/Af8AAAABAAAAAAAAAAD/AP//AAAAAQAAAAAB/wEAAAAA//8A/wEBAQEB////AAEAAQEAAAAAAP8AAP8A/wAAAAD/////AAEAAQEAAQAAAQABAf8A/wD/AP//AAAAAP////8BAQEBAAAAAP///wABAAEA/wD//wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQArKysAJ+fnwDx8vEAAAAAAAAAAAAB/wEA/gD+/wAAAAAAAAAAAQAB/wEBAQEA/wAAAAAAAAEAAQH///8AAAAAAAEAAQD/////AAAAAQEAAQAAAAAB/////wEAAQH/AP8AAQEBAQD/AAAAAQAAAP8AAAEAAQEAAAAA/wD/AQAAAP8A/wAB/wD//wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEAAQAAAP8AAAAAAAABAAEB/wD//wD/AAEBAAEBAAAAAAABAAD/////AAAAAQAAAAAA/wAAAAAAAAAAAAD///8AAQABAf8A//8AAAABAP8AAAABAAABAAEAAAEAAAD+AAAAAQAA////AAAAAP8A/wABAQAB/wABAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8A/wD//////wD/AP8A/wAAAAABAAAAAAAAAAD/AP8A////AAAAAAD///8AAAAAAP8A/wD/AP8A/wD//wEBAQAAAAABAAAAAf8A/wD///8A/wD//wD/AAAAAAAAAAAAAQAAAAH/////////AAEBAQD/AP8AAP8AAAAAAAD/AP8A/wD///8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwAcHBwANHR0QC2tbYAjIuMARwbHAD/AP//AAAAAQD/AAAA/wAA/wD/AQD/AAD//////wD///8A/wAAAAAAAAAAAP8A/wAAAAABAAAAAP8A/wABAAEAAAEAAQAAAAAAAAAAAP8AAP///////v///wD/AAAAAAD/////AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8AAP8AAP//////AP//AAAAAQEAAQD/AP8A/wD/AP/+//8AAAABAQABAP8A/wD/AP8A/wD/Af8A/wAAAAAA/wD//wD/AAAAAAD/AAEAAAEAAQH/AP8A////AAABAAEBAQEAAAAAAAEAAQEAAAD/AAAAAf///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP8AAAAAAAEAAAAAAAAA/wD/AP8AAAAAAAAA/wAAAP8AAf///wAA/wD/AP8A/wAAAAAAAAAAAAAAAf////8AAAABAP8A/wD/AP8AAAABAP8A/////wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqKioAVFRUAMTExACop6gBHBwcAAAAAAEAAAABAP8AAAAAAAAAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAA/////wEBAQEAAAABAAAAAP7//v8AAQABAP8A/wD/AAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAAABAAAA/////wAAAAAAAAAAAAAAAAD//////wD/AAD/AP8A/wAAAP8AAAEAAQAA/wD/AAAAAQEBAQEA/wAB////AP8A/wAAAAAAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAf8BAf////8AAAAAAAAAAQABAAAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAD/AAD/AP8AAAAAAAH/AQD/AP//AgECAf8B/wEA/wAAAAAAAQABAAAAAAAAAAEAAQD/AP//AP8AAQABAf////8BAQEB////AAAAAACsrKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHAAODg4AKioqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgAxMPEAJCQkACQkJAAAAEAAP///wAAAQABAP8A/wAAAAEAAAAAAAAAAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAP8A//8AAAAAAQEBAf///wAAAAAAAP8AAAAAAAEAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wD/AAAAAf8A/wAAAAD/AQEBAQAAAAAA/wD//wD/AAEAAQEBAQEAAP8AAAABAAEA/wAAAAEAAP////8AAQABAP8A//8B/wEAAQAAAQABAQD/AAAAAQAAAAAAAAAAAAAAAAAB/////wEBAQH///8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAf8A//8B/wEAAAAAAP8A/wEBAQEAAP8AAAD/AAH/AP//AQEBAQABAAAAAAAB////AAEAAQAA/wAA/wD//wAAAAABAAEBAAEAAP////8BAAEA/wD/AAAAAAAAAQAAAAAAAAD/AAD/AP//AQEBAQAAAAEAAAD/AAAAAAEAAQH///8AAAAAAAAAAABzdHP/AAAAAAAAAAEBAAEAAAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAADg3OP9UVFQBVFRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAAcHBwAc3RzAAEBAQD/////AAAAAAEAAQAAAAAAAP8AAAAAAAAAAAAAAP8AAP8A//8AAAAAAQEBAQH/AQEAAAD/////AAEAAQAAAAD/AAAAAQEAAQAA/wAA/wD/AAEAAQAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAH/AQD/AP8A/////wEAAQD/AP8BAQEBAAD/AAAAAAAAAAEAAAD/AADzNPDnAAAgAElEQVQAAAAAAAAAAP8A/wEBAAEAAAAAAQAAAAD/////AAAAAQEAAQAAAAAAAP8AAAAAAAD/AP8AAQABAQD/AAAAAAAAAQABAf////8BAAEBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAH/AP//AAEAAAAAAAD///8A/wD///////8AAAAAAP8AAAD/AAD///8AAAAA/////wD/////AQABAQAAAAEAAAAA//7//wAAAAEAAAAB////AP///wAAAAAA////AP8A//8AAAAAAP8AAP8A/wAA/wAA/wD///8A/wAAAAAAAAAAAAAAAP8AAAABAAAAAQEAAQD/AP8A/////////wD/AP8A///////+//8A/wAA////AMfIxwFzdHMAPD08AKysrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFQAf35/AP///wAAAAABAQABAf8A/wD/AP8AAAAAAAEAAQH///8A/wD/AAAAAAAA/wAAAP8AAP8A/wD///8AAAAAAP8A/wD/AP8AAAEAAP8A/wD/AP//AP8AAP8A/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//////8A////AP////8AAAABAAAAAf8A/wEAAAD/////AP8A/wAA/wAA////AP8A/wD/AP8A/////wAAAAD//v///wD/AP////8BAAEBAAAAAP8A/wAA/wAA/wD/AAABAAAAAAD//wD/AP8A/wAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wEAAQAAAAAB//7//wEAAQAA/wAAAAAAAf8A/wAAAAABAAEAAAABAAABAAEAAAAAAQAAAAAAAAAA/v/+/wAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AP8AAAAAAAAA/wAAAAEA/wAAAAAAAAAAAAABAQEBAAAAAQD/AP8A/wAAAAAAAAAAAAEAAAAAAAAAAP8A/wAAAAAAAAEAAQEBAQAA/wD/AAEAAQABAAH/AP8AAAAAAAEAAQAAAAAA4+PjAHNzcwCBgoEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmJiADk4OQAAAAD//////wAAAAAA/wAA////AP8A//8AAAD/AAAAAAAAAAEAAQAB////AAAAAAABAQEBAAAAAAAAAAAAAAAB//7/AAAAAAAAAAABAAEAAQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP8A/wABAQEAAAAA/wAAAAAAAAABAAAAAAEAAQD/AP8AAP8A/wD/AAAAAAAAAAAAAQAAAP8BAQEBAAAAAAAAAAD/AP8AAP8A/wAAAP//////AAAAAP///wAA/wAAAP8AAAAAAAD/AP8AAP8AAAABAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8AAAAAAAD/AAAAAQABAQABAf////8A/wAA/wD//wAAAAD///8AAAAAAAABAAH///8AAP8AAQAAAAAAAAAA/wD/AAAAAP////8AAAAAAAABAAEAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAA/////////wD/AP8AAP8AAAAAAAD/////AP8AAP8A/wAAAAAAAAAAAAABAACdnZ3/gYKBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjAAAAAAB/wD/AQAAAAAAAQAAAQEBAAD/AAEA/wABAP8AAAD/AP8AAAAAAAEAAAD/AP//AP8AAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//////AAAAAAEAAQD+/v7/AP8AAQD/AP8AAAAAAAAAAP8A/wAAAAAA/wD/AAABAAAAAAAAAAAAAAAAAAH/AP8AAP8AAP///wAA/wD//wD/AAD/AAABAQEBAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/wD//wD/AAAAAAAAAQABAf8A//8AAAD/////AP8A/wAAAAAAAP8AAAAAAAAA/wAAAAAAAAEBAQEBAQEAAAAAAP////8AAAAAAP8AAAD/AAD///8A/wD/////////AP8BAP8AAP///wEAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP///wAAAQAAAQEBAf///wABAQEBAAEAAP///wABAAEBAAEAAAAAAAAAAAAAAP8AAAAAAAABAQEBnp6eAMjIyAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHABGRkYAAAAA/////wAA/wAA/v/+AAAAAAD/AP8A/wD///8A/wEA/wAAAP8AAP8A/wEA/wAA//////////8AAQAA/////////wAA/wAA//////////8AAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAP8AAP8A/wAAAAABAAAAAP8A/wAA/wAA////AAD/AAD///8AAQABAQD/AAD/////////AAD/AAD///8AAAAA/wEBAQH/AP8AAQEBAf///wD///8AAP8AAAD/AAAAAAABAAAAAP8A/wAA/wAA/////wD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/AP8A/wD/AP///wD/AP/////+//4AAAAAAAAAAAEAAAAA/wD/AP8A/wAA/wD/AQABAQAAAAEAAAD//wD/AAAAAP//AP8AAAAAAf//////AP//AAEAAP8A////AP8A/////wAAAAD/////AP8AAAEAAQAA/wAAAP8AAAEAAQD/AP8AAAAAAP/+/////v///wD/AP///wD///8AAP8AAI6Pjv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiYmIAAAAAAAAAAP//AP8AAAAAAP8A/wAAAAAAAP8AAAEBAQAAAAAA/wD/AAEAAQD/AP//AQABAQAAAAAAAAAAAAAAAQAAAAD/////AQABAQEAAQH/AP8BAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP///wD/AAAAAAEAAAAA/wD//wEBAQH/AP8AAQEBAP8A/wAAAAAA/wD//wAAAAABAQEBAAAAAP8A/wABAAEA/wD/Af////8BAAEB////AAABAAH/AP8A/wD/AP8A/wAAAAAA/////wAAAAAAAQAAAQEBAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD//////wD/AAEAAQEA/wD/AAAAAAAAAAAAAAABAAAAAAD/AAAAAAAAAAAAAQEAAQD/////AQABAAAAAAAAAQAB/wD/AAAAAAAAAAABAP8A/wAAAAEAAAAAAQABAAAAAAEAAAAB////AAEAAQEAAAAAAAEAAQEAAQAAAAAB/wD/AP8A/wD/AP8A/wD/AAAAAAAAAAAAAP8AAAEBAQEBAQEBAAAA/wAAAAAAAAAA/wD/AMjIyAHk5OQAAAAAAAAAAAAAAAAAAAAAAAAAAAArKisAAAAAAQAAAAEAAAAAAAAAAAEAAQAA/wD/AAEAAf///wD/AP8AAAAAAP8A/wAA/wAA/////wEAAQH///8AAP8AAAAAAAAAAQABAAAAAP////8AAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAABAP8AAAAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAAA/wD/AAAAAf////////8AAAAAAAAAAAD/AP8AAQABAAEAAQEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAP8AAQAAAAD//v//////AAABAAH/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAA/wAA////AP8A/wAA/wABAP8AAP////8AAAABAP8AAP///wAAAAAAAAAAAAAAAAD/////AP8A//////8AAAAA/v/+/wAAAAAAAAAAAAAAAAAAAP//////AAEAAQEAAQAAAAAA/////wAAAAAAAAAAAP8AAP///wAAAAAAAP8AAP8A/wAAAAAAAQABAP////8AAAAAAAAAAP7//v8A/wAA/wD/AP8A/wD+//7/AP8AAQD/AAAAAAAAAAAAAAD/AADHx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4AHRwdAAD/AAD/////AAAAAP8A/wD/AP8AAAAAAAD/AP//////AAAA/wAAAAABAQEBAAEAAP8A/wAAAAAA/wD//wAAAAAAAAAA/wD/AP8A/wAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAD/AAEAAAAAAAAAAAAAAAAAAf///wD/////AP8A/wAAAAAAAQABAAAAAAABAAEAAAAAAAAAAAD/AP8A/wAA/wD/AP///wD/AP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAP8AAAD/AP8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAA/wAA/v/+AP////8AAQAA/wD/AAAAAAD/AP8AAAEAAAABAAEAAQAA/wD//wAAAAD///8AAP8AAAAAAAABAQEBAAAAAf8A/wEAAQABAQEBAf///wAAAAAAAP8A/wAAAAEBAAEBAP8A//7//gD///8AAAAAAQAAAAAA/wAA/wD//wAAAAD///8AAAAAAP////8AAAAA/////wEAAQH///8A////AAAAAAH/AP//AAAAAP////8AAAAA/wD//wAAAAD///8AAP8A/wAAAP/k5OQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxwbAP8A//8BAAEB/////wAAAAABAAEAAP8A/wAAAAEBAQEBAP8AAQD/AAD/AP8A////AAAAAAD///8AAQABAQD/AAAAAAAA/////wEAAQH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAB/////////wAA/wAAAAAAAAAAAAABAAEBAAEAAf////8A/wAAAAAAAAD/AAAA/wAA////AAABAAEAAQD/AP8A/wABAAD/////AP8AAAD/AAAA/wD/AP8A/////wAAAAAAAP8AAP////8AAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAQEBAP///wH/////AQABAQD/AAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQD/AP8A/wD//wAAAAEA/wAAAAAAAAD/AP//AP8AAAAAAQAAAAAA/wAA/wD/AQD/AP8AAAABAAAAAQEAAQAAAAAAAAEAAAD/AAD/AP//AAAAAQAAAAAAAAAA/wD/AAEAAQEAAAAA/wD/AQEAAQABAAEA/wD//wAAAAEBAQEBAP8AAAAAAAEBAQEAAAAAAAD/AAAAAAAA/wD/AQEAAQDj5OMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAEAAAAAAAAAAf///wAAAAABAQABAP8A/wAA/wAAAAAAAAAAAAAA/wD/AQABAf///wABAQEA////AAAAAAABAAEAAQABAf8A/wAAAAAB/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQEBAQAAAAD/////AQABAQAAAAH/AP//AP8AAQEAAQEAAAAAAP8AAP8A//8AAAABAQABAP///wABAAEBAAAAAP///wAAAAAB/////wABAAEA/wAAAAEAAQEAAQAAAAAA/////wABAAH/AP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8AAAAA/////wABAQEB/wD/AAAAAAAAAAAAAAEAAP///wABAAEA/wD///8A/wEAAAAAAAAAAQD/AP8AAQABAAAAAP8A/wABAAEBAAAAAAAAAAB/f38AR0dHAAAAAAEAAAAAAAAAAAAAAADJycn/cHFwAQD/AP8AAQABAAAAAP8A/wAAAAAAAAAAAP8A/wABAAEAAAAAAP8A//8AAAABAP8AAAABAAD//v//AQEBAQAAAAD///8AAAAAAAAAAAAAAAAAAP8A//8B/wEPDg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAD///8AAAAAAAD/AP//AP8BAAAAAAD/AP8AAQABAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAB////AAAAAAAA/wAA/wD//wABAAAAAAABAQABAP8A/wAAAAAAAAAAAAAAAAEAAAD//wD/AQAAAAD/AP8AAAAAAAAAAAAAAAD//wD/AAH/Af8AAQAAAQABAP8A/wAA/wAAAAEAAQEBAQAA/wAA/wD/AAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQD/////AQEBAQAAAAAAAAAA//7/AAABAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx8vEAHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAEAAAAAAAEAAQAAAAAAAQAB/wD/AAAAAAAA/wD/AAEAAAAAAAAAAAABAAEAAQAAAAAbHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkAP////8BAAEBAAEAAAD/AAAAAQAAAAAAAAAAAP8AAAABAAAAAAAAAAAA/wD//wH/AQAAAAAA/wD/AQEBAf8A/wEAAAAA/////wEBAQEA/wD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAP8A/wABAAEAAAABAAAAAAAAAAAAAAD/////AQABAAAA/wAAAAAAAAABAAAAAAABAAAAAAD/AAAAAQAAAQEBAP/+//8AAQABAQEBAAD/AAD/////AAEAAAAAAAABAAEA////AP7//v8BAQEBAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP//////////AAEAAAAAAAABAAEBAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAA/////wAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAADW1dYAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwAOTg5AAD/AAAA/wAAAP8AAAAAAAD///8AAP8AAAAAAAAAAAAAAP8AAP///wAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQAAAAH///8A////AAAAAABIR0gAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIA4+LjAAEAAQEAAAAAAAAAAAABAAAAAAAA/////wAAAAEAAAAAAAAAAAD/AAAAAQABAP8AAP////8AAQAB////AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAQD/AAD/AP8AAAAAAP////8AAAABAAAAAP//////AP//AAAAAAD/AAAA/wD/AAAAAAABAAAA/wAA//7//wABAAH/////AAAAAAABAAABAAEBAP8A/wD/AAD/AP8AAAEAAAEAAQEA/wD/AP8AAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQIB8AAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAQAA////AP8A/wD///8AAAAAAf///wD//////wD/AP8A/wD//////wD//wEAAQEAAQAA/wD////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVAP8A/wAAAAAA/wD/AP///wAAAAAA/wD/AP////8AAAAAAAAAAAEBAQD/AP//AP8AAAD/AAD/////AAEAAAAAAAAAAAAB//////////8BAAEAAQEBADg4OAAcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAADV1dUAAAAAAP8A/wD/AP8A////AAD/AAD///8AAAAAAAAAAAAA/wAA/////wABAAAAAAAA/wD/AAD/AAAA/wAAAAAAAP8A//8BAQEAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH///8AAAAAAAABAAAAAAAAAAAAAAAAAAD//////wD//wAAAAEBAAEB/wD//wAAAAAAAQAB////AP///wAAAAAA/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAABAQABAAAAAAAAAAABAAAAAQAAAAD//v//AAAAAQAAAAHx8vEAx8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVADk5OQAAAAAAAAAA/wAAAAAAAAAAAAAAAAEAAQH///8A/wD/AP///wAAAAAA//////8A//8A/wAA/v7+/wD/AAAAAAAAAAAAAQAAAAEAAQAA////AI+OjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqq6oA/wD/AAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAf///wD/AP8AAAAAAP////////8AAAAAAAABAAAAAAAA/wD/AAAAAAH///8AAP8AAP////8A/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAA/wD//////wAAAAAA/v/+/wAAAAEA/wAAAAAAAQAAAP8AAAAAAAAAAf////////8AAAAAAAAAAAD/AP//AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQAAAAAAjo+OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+OjwAbHBsAAAAAAQAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAABAQEBAAEAAQD/AAEAAQABAQEBAf8A/wAA/wAAAAAAAAAAAAD///8AcnFyABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk5ACrqqsAAP8AAAAAAAAA/wD/AAAAAAD/AAD///8AAAAA/wAAAP8AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAAA/wAA/wD/AAEBAQEAAQABAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAQAAAAAAAAAAAQEBAQEAAQD/AP8AAAAAAAAAAAH/AP8AAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////AAAAAAD/AP//AP8AAP///wAAAAAAx8bHAMfHxwAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHACsq6wAHBwcAAAAAAD///8A////AAD/AAAAAAAAAAAAAAD/AAD//v8AAP8AAP8A//8A/wAAAAAAAP////8AAAAAAP8AAAAAAACAf4AAcnJyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmqqQD/AP//AAEAAAD/AP8AAQABAP8AAAABAAABAQEA////AQD/AAEA/wAAAP8A/wAAAAAAAAAAAP8AAAD/AP8AAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEA/wAAAAAAAP////8AAAAAAP8A//7//v8BAAEB/////0pqS2cAACAASURBVAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAAAAAAAAAAAA/wD///8A/wAA/wAAAAAAAH+AfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwAyMfIAI6OjgAdHR0AAQABAAAAAAAA/wAA////AAABAAD/AP8A/wD/AAEBAQEAAAAA/////wEAAQEAAQAAOTk5AKuqqwBkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkAI+OjwAAAAAAAAAAAAABAAEA/wAA/wD/AAD/AAD+//4AAAAAAP8A/wD/AP///wD/AQD/AAD//////wD/AAABAAH/////////AP8A//8BAQEA////AP///wD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A////AAEAAQEA/wAA/wD/AQAAAAH/AP8AAAAAAf8A/wAAAAAA////AP///wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/gD+8P///wD///8AAAAAAAD/AAAAAAAA/////////wD/AP8A////AAAAAAD/////AAAAAAAAAP//AP8A/wD/AP////8AAAAB////AP8A/wAA/wAAAAAAAQAAAAD/AP8A/wD/ANXV1QB/gH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZVVgDIx8gAnZ2dAFVWVQAqKyoAAAAAAP////8BAAEAAAAA/////wD/AP8AKysrAWRkZACrqqsAq6urADk5OQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj5OMAVFVUAP8A//8AAAAB////AP///wD/AP//AAAAAAAAAAAAAAAAAQABAAAAAAAA/wAAAQABAP8A/wAAAAABAQABAP///wAAAAABAAAAAAEBAQH/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAD/AAAA//8A/wD/AP8AAAAAAAAAAP8AAAAAAAAAAAAAAAD/////AP8A/wAAAAD/AP8AAAAAAQAAAAABAAEBAAAAAP///wAAAAAA////AAABAAD///8AAAAAAf8A//8AAAAA/wD/AAEBAQAAAAAAAAAA/wEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD+//7/AQEBAP8A/wAAAAABAAEAAQAAAAABAAEAAAAAAP/+//8AAQAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAEAAP////8BAQEBAQABAP7//v8CAQIB/wD/AAAAAACcnJwADw8P/3JxcgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0dHAEdHRwAAAAAAAAAAAOTk5AEAAAAAAAAAAQAAAAAcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8gBjY2MA4+PjAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAD/AP8AAQABAAAAAAAAAAAAAAAA/wD/AAD/AP//AP8AAQEBAf///wAAAAABAAAAAAAAAAAAAAAA/////wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAB/wEB/wD//wEBAQAAAAAAAAAAAAAAAAEAAAD/AP8AAAABAAEAAAABAAEAAAAAAP8AAAABAAAAAAAAAAD/AP8AAAAAAP////8CAQIB/wD/AP///wAAAAD/AP8AAAABAAEAAAAAAAAAAP///wAA/wAAAAEAAP7+/v8BAAHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAB//8A/wABAAEB/////wEBAQEAAAAAAP8AAAAAAAD/AP8AAAEAAAAAAAH///8AAQABAP8A//8BAQEB////AAEBAQAAAQAAAAAAAAAAAAD/////AAAAAQAAAAD+//7/AQEBAQAAAAAAAAAAjY2NAf/+/wBzc3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjAGNjY//V1tUB////AAEBAQAA/wAA/wD//wAAAAEBAAEAAAAAAP8A//8BAQEB/////wAAAAABAAEA/v/+/wAAAAABAQEAAAAAAQABAAEB/wH/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEAAQAAAQABAQEAAQD/AP8AAAAAAP////8BAAEA/wD/AAEAAQAA/wD/AAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEBAQD+//4BAQABAP////8BAQEBAAAAAAAAAAAAAQAAAAAAAQEAAQACAgLhAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB4f///wD/AP8AAQABAQD/AAD//////wD/AP8A/wD/AP8AAAAAAP8A/wABAQEAAAAAAAEBAQEA/wD/AQABAAD/AAD///8A////AAEAAQEBAAEB/wD/AAEBAQEBAQEB////AAAAAAAA/wD/AAAAAI2OjQBhYmH/5OTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx8cAVFVU/9XW1QH/////AAAAAP///wAAAAAAAQABAQEAAQAAAAD//wD/AAEAAQH///8AAQABAQAAAAD/////AAAAAQEBAQH///8BAAAAAAD/AAD/AP8AAAAAAP///wAA/wAA////AAABAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/////////////////wAAAAAA////AAAAAAD/AP8BAQABAQD/AAAAAAAB//////////8A/wAA/////////wD/////AP8AAQAAAAAAAAAAAAEAAP7//v8AAAD//wD/AAEAAQD/////AP8AAAAAAAD///////////8A/wD8/vzvAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB4AEBAQAAAAAA/wD///8A/wABAAEBAAAAAAAAAP8AAAAA////AAAAAAD///8A/wD/AP///wD/AP8B/wD///8A/wAAAAAAAQABAP8A/wD/AP8AAP8A//////////8AAAAAAP///wD/AP8B//7//wEBAQC5ubkBRUVFAI2NjQDj4+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fHAFRUVABTVFMA4+PjAf///wAAAAAAAAAAAAEAAQD+//7//wD/AP8A////AP8AAAAAAP8A/wABAAEA/wD/AAAAAAEAAAABAAAAAP///wAAAAAA////AP8A//8BAAEB////AAEAAQD/AP8AAAAAAAAAAAAAAAABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAQEBAf8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A//8AAAAAAAAAAQAAAAEAAQAAAAAAAAAAAAAAAAAB/wD/AP///wD///8A/////wEBAQEA/wAAAAAAAP8A/wABAAEB/wD/AAAAAAAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAwMD0Pz9/AD/////AQEBAAAAAAD/AP//AP8AAQABAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP//AAAAAQAAAAAAAAD//wD/AAAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8BAQEB8fLxAI2Njf+qq6oBOTg5/1dXVwE5OTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vLyALi4uACpqqkAx8fHAAAAAAD/////AQEBAQAAAAD///8AAQEBAP7//v8BAQEB/////wEBAQEAAAAAAAAAAAAAAAD/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////wAAAAEAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEB////AP////8AAAABAAAAAP///wAAAAD/AQEBAAAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAf7+/v8BAQEBAP8A/wABAAD/AP8AAAAAAP///wAAAAABAQEBAAD/AAACAwLxAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAIDAgEPnp+e8AAQAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAA/wAAAAEAAAAAAAD/////AQEBAQAAAAAAAAAAAAAA/wAAAAEAAAAA/////wEBAQEAAAAAAAAAAAD/AAD/AP8AAQEBAP///wABAQEAAAAAAAAAAAAAAAAA////AAEBAQAODg4AOjk6ACssKwAsKywADg4OAA4ODgAPDw8AAAAAAAAAAADj4+MA4+PjANXV1QDV1dUA1dbVAPHx8QAA/wD//wD/AQEBAQAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAD///8AAQAB/wABAAEBAQEA////AAAAAAAAAAAA////AAEBAQD/////AQEBAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAD///8AAQEB/wAAAAEAAAAAAAAA/wD/AAEAAAAAAAAAAAABAAAAAAAAAAAAAP///wABAQEA/////wEAAQD/AP8AAQEBAQD/AAAAAAAA/wD//wEBAQEA/wAAAAAAAAABAP8BAAEB/wD/AAD/AAAAAQAAAAAAAAD/AP8AAAABAAEAAAAAAAAA/wAA/wD//wEBAQEHBgcR4ODg8AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABgZGN8BAAEg/wD//wAAAAEAAAD/AQEBAf///wAAAAAAAQABAP8A/wABAQEA/////wEBAQH/////AQEBAQAAAAD///8AAQEBAAAAAAD///8AAAAA/wAAAAEBAAEAAAEAAP////8AAAAAAQEBAP///wEAAAD/AAAAAQEAAQAAAQAA////AAAAAAABAAEA/wD/AAAAAAABAAEA/wD//wEBAQEA/wAA/wD/AAEAAQD/AP8AAAAAAAAAAAABAAEA/wD/AAEBAQAAAAAAAAAAAP///wABAQEAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAA/////wAAAAAAAAABAAAAAAEAAQAAAAAAAAEAAAD/AAD/AP//AQEBAf///wABAQEA////AAEAAQD/AP//AAAAAAEBAQH/////AQABAf8A/wAAAAD/AAAAAQEAAf//AP8BAQABAP8A//8AAAABAAAAAAAAAP8BAAEA/wD/AQEBAQD///8AAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAAAAAAAAAQABAAABAAAAAAAA/////wEBAQH/////AQEBAf////8BAQEBAP8AAAABAAAA/wAAAAAAAAABAAAAAAAAAP8AAAEBAdDm5uYxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD///7+/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAH/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wABXQKsNQAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoQAQEBOP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAQEB4QgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtdS82AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//InU2QZSewIwAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Camera.png b/arma/client/addons/phone/ui/_site/images/dark/Camera.png new file mode 100644 index 0000000..9b52917 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Camera.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Camera.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Camera.png.b64 new file mode 100644 index 0000000..ae9db16 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Camera.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEQMJ73xkkAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0wAAAAIAEBAR8AAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA8AAAAAAAAAAAAAAA4AAAAAACAgLwAAAA4f////ABAQHQAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////QAwMD0AAAALHNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD///8AAQEBAP8A/wAA/wAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAABAAABAAEA/wD/AAEAAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAEBAQD///8AAAEAAAD/AAABAQEA////AAABAAAAAAAAAP8AAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAADgAAMAwAgFCIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///+gCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzUPf3978AAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw/Pz8UBgYGPDo6OjRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCP////kAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAYGBgQ6OjouQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAEAAAEAAQAAAAAA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAABAQEAAAAAAAAAAAAAAAAA/wD/AAAAAAAA/wAAAQEBAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAEAAAEAAQD///8AAAEAAAEAAQAAAAAAAAAAAP8A/wAAAAAAAQABAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAP8A/wAAAAAAAQABAP///wAAAQAAAQABAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP8A/wAAAAAAAQABAP8A/wABAAEA/wD/AAEAAQAAAAAA/wD/AAAAAAABAAEA////AAABAAAA/wAAAAEAAAEAAQD/AP8AAAAAAAEAAQD///8AAQEBAAAAAAD/AP8AAQABAP8A/wABAAEA/wD/AAD/AAAAAQAAAQAB0AgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAABAAABAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAABAQEA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAeAICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD4+Pi//wD/IAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj4+K////8gAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8g8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAFAAAAAA/wD/AAEAAQD/AP8AAAAAAAAAAAAAAAAAAQABAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAP///wAAAQAAAAAAAAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAEAAAD/AAABAQEA/wD/AAEAAQD///8AAAAAAAEBAQAAAAAAAAAAAP8A/wAAAAAAAQABAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQEBAP8A/wABAAEAAAAAAP8A/wAAAAAAAQABAP8A/wABAAEAAAAAAAAAAAD/AP8AAAAAAAEAAQD/AP8AAAAAAAEAAQD/AP8AAQABAP8A/wABAAEA/wD/AAEAAQAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wABAAEAAAAAAP8A/wAAAAAAAAAAAAEAAQAAAAAA/wD/AAAAAAAAAAAAAP8AAAEBAQAAAAAA/wD/AAEAAQD/AP8AAQABAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAAAAAAGBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS1gAQEBiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEBAQAA/wAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAD/AAAAAAAAAQEBAAEAAQD///8AAAAAAAAAAAAAAAAAAQEBAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAAEAAQAA/wAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAADgZGRnR6Ojo2AAAAAAAx7sTbgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHwERERIcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAD///8Q8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t8AAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAD/AP8AAQABAP///wAAAQAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD///8AAQEBAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAAAAAABAAEA/wD/AAEAAQAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wABAAEAAAAAAP8A/wAA/wAAAQEBAAICAiHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWkP///zAAAQAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAABAQEAAP8AAAAAAAAAAQAAAP8AAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAQEBAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAABAAABAAEAAP8AAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAPHp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAEBAQD///8AAAAAAAAAAAAA/wAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQEA////AAAAAAAAAAAAAAAAAP///wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAD///8AAAAAAP///wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAG9AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ/wD/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///xDw8PAwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5QAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAA/v/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD8/PxQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4v////AAAAAAD///8A/wD/AP///wD///8A/wD/AAABAAD///8A////AAAAAAAAAAAA////AP///wD/AP8A/wD/AP8A/wD/AP8A////AP///wD/AP8A/wD/AP8A/wAAAAAA////AP///wD/AP8AAAAAAAAAAAD/AP8A////AP8A/wD///8A/wD/AP8A/wD/AP8A////AP8A/wD///8A/wD/AP8A/wAAAQAA////AP8A/wD///8A////AP8A/wD///8A/wD/AP///wD///8A////AP8A/wD/AP8AAAAAAP///wD/AP8A/wD/AP///wAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAD///8AAAAAAAAAAAAAAAAA////AP8A/wAA/wAA/wD/AAAAAAAAAAAAAP8AAP8A/wD///8AAP8AAP8A/wD///8A////AP///wD/AP8A/wD/AP8A/wD/AP8A////AP///wAAAAAAAAAAAP///wD///8A////AP///wD///8AAQABAAAAAAD///8A/wD/AP///wAA/wAA/wD/AAD/AAD/AP8A/wD/AAAAAAD///8A////AAAAAAD/AP8AAAAAAAAAAAD///8A////AP///wACAgJPAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBAAAAAwAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAD///8AAAAAAAAAAAAA/wAA/wD/AP///wAA/wAAAAAAAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAEBAQAAAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAAEAAP8AAP///wD///8AAAAAAAD/AAAAAAAA/wD/AAD/AAAAAAAAAAAAAAEAAQAAAAAAAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAEAAQAA/wAAAAAAAAAAAAD///8A////AAD/AAAAAAAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAP8AAP///wAAAAAAAAAAAAD/AAAA/wAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAA/wAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7+/jD/AP8AAAAAAAD/AAABAQEA/wD/AAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAAAAAA/wD/AAD/AAAAAAAAAAEAAAD/AAAAAAAAAQEBAP///wAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAP///wAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAf8BAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAQABAP8A/wABAAEA/wD/AAAAAAAAAAAAAAEAAP///wAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAQAA////AAABAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP///wAAAQAAAAAAAAEAAQD/AP8AAAAAAP8A/wAAAAAAAQMBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7+/hAA/wAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AAAAAAABAAEA////AAABAAAA/wAAAAAAAAAAAAABAQEA////AAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQEA/wD/AP///wABAQEA////AAAAAAAHBwgAICAhAAgHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAQEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQAA9/j4AOjo5wDx8fAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAQEBAP///wAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAQAAAP8AAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAA////AAAAAAAA/wAAAQEBAP///wAAAAAAAAAAAAABAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7+/h8BAQEAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAABAQEA////AAAAAAD///8AAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wD///8AAAEAAAD/AAD///8ADw8QAD8/QQAvLjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAEAAQD///8AAAEAAAD/AAABAQEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp6OgAycrHANHS0AAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA////AAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAICAhD///8AAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAEAAQAAAAAA/wD/AAEAAQAAAAAA////AAAAAAAAAAAAAP8AAAAAAAAYFxgAXV1hAAcHBwD//v8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAP8AAP8AAAABAAD/AP8AAP8AAAAAAAD///8AAAAAAAD/AAAAAAAAAQEBAP8A/wAAAAAAAAAAAAAAAAAWFhcATU1QAA8PEADCw8AAAAAAAP8A/wABAAEAAP8AAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAD/AP8AAQABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAQEBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEAAQAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQABAP8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAQAAAQABAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAABgXGABcXF8ABgYGAAD//wAAAAEA/wD/AAD/AAAAAAAAAP8AAAAAAAABAQEA/wD/AP///wAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAA////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAP8AAD09PwD/AP8AwsPAAAAAAAD/AP8AAAAAAAAAAAAA/wAAAAEAAAAAAAD///8AAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAABAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAABAAEA////AAABAAABAAEA/wD/AAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAABJgKX8AAAgAElEQVQAAAABAAEAAAAAAP8A/wAAAAAAAP8AEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7//iAA/wAAAAAAAP8A/wABAQEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAA/wD/AAAAAAAAAAAA/wD/AAEBAQD///8AAQEBAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAQAAAP8AAAAAAAAAAAAAFxcXAFxaXwAGBgcA////AP8AAAAA//8AAAEAAAAAAAAA/wAAAAEAAAAAAAD///8AAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAP8B/wAA//8AAAAAAAABAQD///8AAQEBAAD/AAA9PD8A//8AAMPDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAQEBAP///wAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wH/EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAXFxgAXFteAAYHBwD///8AAAAAAAAAAAABAAAA//7/AAABAQD///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD//wAAAAAA//7+AAABAQAA/wAAPTw+AAD//wDDxMEAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAABcWFwBbWl4ABgUGAP///wAAAAAAAAAAAAD//wD+AAAAAQEBAP/+/gABAQEA////AAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAA//8AAAEBAAAAAAD///8AAQEBAAAAAAAAAAAA////AAEBAQD///8AAQAAAAAAAAAAAAAAAAAAADw8PgD///8AxMXCAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAECARD+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAD///8AAAEAAAEAAQAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAAAEAAQD/AP8AAQABAP8A/wAAAAAAAf8BAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAFxYYAFpZXQAGBgYA/wAAAAD+/gAAAQEAAP//AAABAQAAAAAA////AP///wAAAAAAAP//AAAAAAD/AAAAAQEBAAAAAAD///8AAP8AAAABAAAA//8AAAAAAP///wABAQEA////AAAA/wAA/wAA/wAAAAAAAAAAAP8A/wABAAD//wAAAAAAAAAAAAD//wA8PD4A/wD/AMXFwwAAAAAAAAAAAAAAAAD/AP8AAP8AAAABAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAEAAQD/AP8AAQABAP8A/wABAAEA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQEBEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP79/hAAAAAAAAEAAAD/AAAAAAAAAAAAAAABAAAA/wAA/wD/AAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAEBAQD///8AAAAAAAABAAD/AP8AAP8AAAAAAAAAAAAAAAAAAP8A/wABAQEA////AAAAAAAAAAAA/wD/AAAAAAABAQEA////AAABAAAA/wAA/wD/AAAAAAABAQEA////AAAAAAAeHh8AUlFVAAYHBwD///8AAP//AAABAQAA/v4AAAAAAAD//wAAAAAAAAEBAAD//wD/AAAA////AAEBAQAA//8A/wAAAP///wABAAAAAAEBAAD/AAAAAAAA//7+AAAAAAAAAAAAAP//AAAAAAAAAAAAAAEBAP/+/gD/AAAAAQEAAAAA/wD//wAAAQAAAAAAAAAA//8AOzo9AAAAAADExMIAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAABAAAA/wAAAAAAAP8A/wABAQEA////AP8A/wAAAQAA////AAAAAAD/AP8AAQEBAP///wAAAQAAAQABAP8A/wAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAA////EAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACkpKf8AAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAXFxcAFhUXAA4PDwAPDhAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAA/wAAAAEAAAAAAB4eHgAPDw8AAAAAAAAAAQD///8AAAAAAAEBAQAA//8AAAAAAAAAAAAAAAAAAAEBAAD//wAAAQAAAP8AAAAAAAD/AAAAAQEAAP//AAABAQEAAP//AAABAAD//wAAAAAAAAEBAQD///8AAAAAAAEAAAAAAQEAAAAAAAD//wD/AAAAAQEAAP//AAABAQAA//8AAAAAAAAAAAAAAQAAAP8AAADy8/IA8fDwAPDx8AABAQEA////AAEAAQAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAA8fLwAOrq6QDy8vEA6erpAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAANfX1wEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAHh4eADo5PQAeHh4AAAAAAP//AAABAAAAAAEAAAD/AAAAAQAA//8AAAAAAAABAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQEAAAD/AAAAAQD///8AAAABAP///gAAAP8AAAABAAAAAAD///8AAQEAAAD/AAAAAAAA////AAAAAAABAAAA//8AAAEBAAD//wAAAAAAAP//AAD///8AAQEBAAD+/wAAAQAA//8AAAD//wAAAQEAAAD/AP7/AAABAP8A//8AAAAAAAABAAAA/wAAAAD/AAD/AAAA//8AAAEAAAD/AAAAAAEAAAAAAAANDA0ADgwNABwcHQAAAAAAAQEAAAAAAAD//wAAAQAAAP8AAAAAAAAAAQEAAAAAAAAA/wAA/wAAAAEBAAD//wAAAAAAAAEBAQD///8A8vLxAMXGxADU1NIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAQABAP8A/wBCQUUANDI0AAABAQD+/v8AAQEBAAAAAAD+//8AAf8AAP8AAAABAAAAAAAAAAD/AAD/AAAAAP8AAP8AAAAAAAAAAP8AAAEAAAAAAP8A//8AAAAA/wAAAAAAAAD/AAEAAAD/AAAAAAD/AAAA/wD//wAA//8AAAAAAAABAQAAAAAAAP//AAD//wAAAQEAAP7+AAABAAAA/wAAAAAAAAD//wAA////AAEAAAAAAAAA//8AAP8AAAAA//8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAQAA//4AAAEAAAAAAAAAAAAAAP8AAAAAAAAA//4AAAAAAAD/AAAAAAEAAAAAAAAAAAAA//8AAP//AAAAAAAA/wAAAAEAAAAAAAAA/v8AAAEAAAD/AAAAAAAAAP//AAABAQEAAP//AP///wD/AAAADQ0OAElHSgAWFRUAvb+8AAEAAQD/AP8AAQABAP8A/wABAAEAAAAAAAAAAAD/AP8AAAAAAAEAAQD/AP8AAQABAAAAAAD/AP8AAQABAP8A/wAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAQABAP8A/wAAAAAAAP8AAAAAAAD/AP8AAAEAAAAAAAAAAAAA////AEJBRAAzMjMA/v//AAH//wD/AAAA////AAAAAAABAAAA/gAAAAEAAAD+/wAAAAAAAAEAAAD//wAAAQEAAP//AAAAAAAAAQEAAP7/AAABAAAAAP8AAP8AAAABAAAA/wAAAAABAAAA/wAA/wAAAP//AAABAAAAAAEAAP//AAAAAAEA////AAAAAAAAAAAAAAAAAAAAAAD/AAEAAP//AAD/AAD/AP8AAQEBAP7/AAAB/wAA/wAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAP//AAAAAAAA//8AAP8AAAAB/wAAAAEAAAAAAAD//wAAAAAAAAEAAAAAAAAA/wAAAP//AAABAAAAAAEAAAAAAAD//wAAAQAAAP4AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAABAAD///8AAAAAAAAAAAD//wAAAQAAAP8BAAAyMTQABgcHALe4tQAA/wAA/wH/AAD/AAD/Af8AAP8AAAAAAAAAAAAAAAAAAP8A/wABAQEA/wD/AAD/AAAAAAAA/wH/AAAAAAAA/wAA/wH/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAA/wD/AAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAMzM0ADIxMwD///8AAAAAAP7//wABAQEAAP8AAAAAAAD+AAAAAAAAAAAAAAAAAAAA/wAAAAABAAAA/wAA/v8AAAAAAAAAAAAA//8AAAEBAAD//gAA/wAAAAEAAAD+AAAAAAAAAP//AAAAAAAAAQAAAP8AAAD/AAAAAP8AAAAAAAAAAP8A//8AAAAAAAAAAP8A//8BAAAA/wAAAAEAAAAAAAEBAAD//wAAAAD/AP//AAD/AAAAAAAAAAAAAAAAAAAA////AAAAAQABAQAA//8AAAAA/wAAAAEA//8AAAAAAAAAAAAA//8AAAAAAAABAAAAAAEAAP7/AAAAAAAAAP//AAAAAQAAAAAA//8AAAAAAAABAAAA/gAAAAAA/wAAAAEAAAAAAP4AAAABAAAA/wAAAAH/AAD/AAAAAQEAAP//AAAAAP8A/wABAAD/AAAAAP8AKyosAOnp6QDOzswAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAQAAAQABAP8A/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAODg8AMjEzAP7//gAA/wAAAAAAAAEAAQD///8AAAAAAP8AAAABAAAAAAEAAP8AAAD//wAAAAAAAP///wABAQEA//8AAAAA/wAAAAEAAAD/AP//AQAAAAAAAQEAAP7//wAAAAAAAQEBAP///wAAAAEA/wAAAAAA/wABAAEAAAAAAP8AAAD//wAAAQAAAP8AAAAAAAAAAAD/AAAAAAAAAP8AAAD/AP//AAAAAAEAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAP8AAQEBAP///wD//wAAAAAAAAAAAAAAAP8AAP8AAAABAAD+/wAAAQEAAP//AAAAAAAA//8AAAAAAAABAQAAAP8AAP8A/wAAAQAAAP8AAP8A/wD/AAEAAQAAAAABAAD+//8AAAAAAAEAAAD+AAAAAQAAAP4A/wABAQEA//4AAP8AAAAAAAAAAAD/AAAAAAAAAP8AAAAAADk4OwDV1dQA+fn4AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAA/wD/AAEAAQAdHB0ADQwOAP//AAAAAAAAAAD/AP8AAAAAAP8AAAABAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAABAAAAAAAA//8AAAAAAP8AAAAAAP8AAAAAAAEA/wD/AP8AAAABAP///wAAAAAA//8AAAAA/wAAAAAAAQAAAP8AAAAAAP8A/wD/AAAAAAAAAAEA/wD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP4A//8BAAAAAAABAQAAAP8AAP8A/wABAAEA/v//AAEBAAD///8AAQABAP8AAAD///8AAAAAAAD/AQABAAAA/v8AAAAA/wD/AAEAAAD/AAAAAQD///8AAAAAAAAAAAD//wAAAAABAAAA/wAAAAAA/wD/AAD/AAAAAAEAAAD/AAAAAQD/AP8A/wABAAAA/wAAAAAA//8AAAAAAAAAAP8AAAAAAAEBAQAA/wAA/v//AAYGBQArKisAzc/MAAEAAQAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAAA/wD/AAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wAiIiMA/v//AAAA/wAAAAEAAQAAAP8A/gAAAAAAAQEAAAD/AAD+AP8AAP8AAAAAAQABAAAA/wD+AAAAAQD/AP8AAAABAAAA/wABAAEA/wD/AP8AAQAAAP8A//8AAAAAAAAAAP8AAAAAAAAAAAAAAP4A/wAAAAAAAAAAAQEA////AAAAAQAAAP4AAAAAAAEBAQD///4AAAABAAAA/wAAAP8AAAABAAEAAAD/AAAAAQD/AAABAAD+/v8AAAABAAAA/wD/AP8AAAABAP///wAAAAAAAAEAAP///wAAAAAAAAABAAAA/gD/AAAAAAABAAAA/wABAAAA/wD/AAEBAAD///8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAEAAQD/AP8AAAD/AAABAAD//wAAAAD/AAAAAAD///4AAP8AAAABAAAAAAAAAAAAAAAAAAD//v8AAAEBAAAAAAAUFBUAAAAAAP8A/wAAAAAAAP8AAAABAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAABAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAMDQ4AAP//AP8A/wAAAP8A/wAAAAAAAAAAAAEA///+AAAAAQAAAP8AAAABAAAA/wD/AP8AAAAAAAAA/wAAAAAAAQEAAP//AAD/AP8AAAAAAAAA/wAAAP8AAQEAAP///wAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wD///8AAAAAAAAA/wAAAAAAAAABAP///gAAAAAAAAAAAAAA/wAAAAEAAAD+AP8AAAAAAAAA/wAAAAD/AAAAAAEAAAD+AP//AAABAQEAAAD/AAAAAAAAAP8A//8AAAAA/wAAAAAAAAD/AAAAAAAAAAEAAAD+AAAAAAD/AP8AAAABAP///gAAAAAAAAABAAAAAAABAQAAAP//AP8A/wAAAAAAAAD/AP8A/wABAQEA////AP///wAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAAAAAAAAAAAP///wAAAAAAAP//AAAAAAAUFBUAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAIBwYA/v/+AAAAAAAAAAAAAAAAAAAAAQAAAP4AAAAAAAAA/wAAAAAAAAAAAAAAAAABAAAA/wD/AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAEA///+AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAEBAQD///4A+vr6APn5+QD09PQA8/TyAAcGBwAGBgYABgYHABMTEwD///8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAABAQEA///+AAAAAAAAAAAAAAD/AAAAAQD//wAAAAD/AAAAAAAAAP8AAAAAAAAAAAAGA/UAGQ3bAPr9CQDz+RQA8/gSAAEBAQD/AP8AAQAAAAABAAD///8AAAAAAAAAAAAAAAEAAAD/AAAAAQAGBgcAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAB/wEA/wD/AAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wABAAEAAAAAAAAAAAAMDA0A////AP//AAABAQAAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAD/AAAAAAD/AAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5+fmAOHh4ADn6OYA7e3tAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAATExMAGRkaACAfIQAZGRoAAAAAAAEBAQD+/v8AAQEBAAAA/wAAAAAAAQEBAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAC0YvgAzGrQABwT2AAAAAAAAAAAAzOVMAM3lTAAAAAAA/wD/AAD/AAAAAAAA////AAEBAQAAAP8AAQABAP8A/gANDQwAAAAAAP8A/wABAAEAAAAAAAAAAAAA/wAA/yDrapoAACAASURBVAD/AAEAAQAAAAAAAAAAAP8A/wAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAEAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAD/AP8AAAAAAAD/AAD///8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP///wABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vr5ANPU0wDV1dMA+fn5AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAADt7e0A7e3tANTU0wAMDAwAMzI1ACUlJgAAAAAA////AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///gAAAAAAJxTHADoeqgAAAAAAAAAAAAAAAAAAAAAANBu0APP4EgDY6zkAAQEAAAAAAAAAAAAAAAAAAP///wAAAAAA/v/+AAEBAQD///8A/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAD/AP8AAAEAAAAAAAAAAAAAAP8AAAABAAD///8A//8AAAEBAAD///8AAQEBAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAEBAQD+/v8AAAAAAAEBAAD//wAAAAAAAAAAAQAAAP8AAAAAAAAAAADb29kAyMnHAPj4+AABAQEAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAADz8/MAwMG+AMzNywAzMjQAJSUmAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAD//wAAAAAAAAEBAAD//wAAAQH/AAAAAAAAAAAALRi/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcVxwDX6jcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAD///8AAAAAAP//AAAAAAAA////AAAAAAD///8AAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AP//AAABAQAAAAAAAP///wAAAAAA////AAAAAQAAAAAAAAAAAAAA/wAAAAAA+vr5ALu8ugDn5+YAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAA0NDQAMDA0ADAwMAPr6+gD6+voA+vr6AO3t7AAAAAAA/wD/AAAAAAAAAAAAAAAAAPPz8gDAwr4A5uflADIxMwALCwwAAQEBAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP//AAAAAAAA/v7/AAEBAQAA/wAAFAvjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoO2wAAAAAA////AAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA////AAEAAQAAAAAA/wD/AAEAAQD/AP8AAQABAP8A/wAAAAAAAQABAAAAAAAAAAAA/wD/AAEAAQD///8A////AAEBAQAAAP8AAAABAAAAAAAAAAAA////AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD+/v8AAQEBAAAAAAAAAAAAAAAAAP///wAAAAAA////AAEBAQD09PMAtbazAPPz8wAAAAAAAAAAAAAAAAD///8ABwcHAB4eIAAgHyAAGRkZAAYGBwAAAAAAAAAAAAAAAAAAAAAAAAAAAPn5+QDn6OcA4uLgANvb2gD/AP8AAP8AAAEBAQD//v8A2dnYAObm5QBLSk4ADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA+fwJAAcE9wAAAAAAAAAAAAAAAAAAAAAAAAAAAPL5EgD///8AAAAAAP///wABAQEAAAAAAP//AAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wD///8AAAD/AP//AAAAAAAAAAD/AP///wABAQEAAAAAAAAA/wAAAP8A//8AAAEBAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAAAAAA////AAEBAAD//wAAAQEBAPLy8gC2t7MA9PT0AP8A/wABAAEA/wD/AAgHCAAqKiwAKyssAAYFBgABAQEA////AP7+/gABAQEAAAAAAP///wABAQEAAAAAAAYGBgAfHh8AHh0eADAvMgDb3NoAz8/NAP///wAAAAAA/wD/APPz8wC0tbEASklNAA0NDQAAAAAAAAAAAAAAAAD///8AAQEAAP//AAABAQEAAAAAAAAAAAAAAAAA0edBADYdtgAAAAAAAAAAAAAAAAAAAAAAAAAAAN/uLgD///4A//8AAAEBAQD///8A/wD/AAD/AAAAAAAAAQEBAP///wAAAAAA/wD/AAAAAAAAAAAA/wD/AAEAAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQABAAD/AAAA/wAAAQABAAD/AAAA/wAA////AAAAAAAAAAAAAP8AAAAAAAAA/wAA////AAD/AAD///8A//8AAP///gD+/v4A/v7+AP///wD+/v4A/v7+AP///wD//wAAAAAAAP///gD///8AAAAAAP///gD///8A/v7+AP7+/gD///8A/v/+AP7+/gAAAAAA///+AP///wD///8A////AP//AAAAAAAA8/PyALW2swDz8/MA////AAAAAAD///8AGRgZAE9OUQAxMDEABgUFAAAAAAD///8AAAAAAAAAAAD///8A/v7+AP8A/wD+/v4A////AP///gD///4A////AAsLCwAxMDIAVVRYAAwMDAD/AP8AAP8AAP///wDz8/MAtrezAPPz8gD+//4A////AP///gD///8A//8AAAAAAAD///4A////AP7+/gD///8A0OU/AOv1GwAAAAAAAAAAAAAAAAAAAAAA5PAkAMjgSAD//wAA////AP///wD///8AAP8AAP///wAAAAAA////AP///wD///4AAQABAAD/AAAA/wAAAP8AAP8A/wAA/wAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAA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/AP7+/gD///8A///+AP7+/wD///8A/v7+AP7+/gD///8A////AP///wD+//8A/v7+AP7+/wAA/wAA/v7/ADY1NwALCwwA////AP///wD///8Azs/NAP///gD+//8A//8AAP///wD///8A////AP/+/wD///8AAAD/AP8A/wD///8A////AP8A/wD///8A/v//AAAA/wD/AP8A////AP7//gD///8A//7/AP///wD/AP8A///+AP7+/wD//v8AAAAAAP8A/wAA/wAA/wD/AAAAAAAAAAAA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAQABAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD/AAD///8AAP8AAAD/AAAAAP8A/v7/AP8A/wD+/v8A//7/AP7+/wD///8A////AP///wD//v8A//7/AP///wAAAP8A/v//AP7+/wD///8A////AP7+/wD+/v4A/wD/AP7//wD///8A/v7/AAAA/wD///8A5uflAO3t7AD+//4A////AP8A/wBCQkMABQQFAP///wD///4A//7+AP///wD///8A////AP///wD+//4A////AP///wD///8A/v7+AAAA/wD+//8A////AP8A/wD+/v8A////AP///wD//v8AAAD/AP///wD+//4A///+AAUFBQA8PD0A/wD/AAAAAAAAAAAA5+jmAObm5gAA//8A/v7+AP///wD///8A/wD/AAAAAAD///8A////AP/+/wD///8A////AAD/AAD///8A//7/AP7+/wAA//8A/v7/AP/+/wD///8A////AP///wAA//8A/v7/AP///wD///8AAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A////AP/+/wD/AP8AAAD/AP///wD///8A////AP///wD///8A/wD/AP8A/wD+/v8A//7/AAAA/wD///4A/v7/AP///wD///8AAP//AP/+/gD/AP8A////AP///wD///8A29vaAAAAAAAA/wAA////ACQjJQAREBEA////AP8A/wD//wAA//8AAP///wD///8A/wD/AP///wD///8A////AP///wAAAP8A//8AAP7+/wD//v4A///+AP/+/wD///8A////AP///wD///8A/v7/AP///wD//v8A//8AAP///wAXFhgAGBcZAP///wD+//4AAP8AAM/QzgD+/v8A///+AP///gD///4A//7/AP///gD///8A/v//AP///wD///8A////AP///gAAAP8A/wD/AAAA/wD+/v4A/wD/AP8A/wD///8A/wD/AP8A/wD+/v4A////AAAA/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAD//wAAAAD+AAAAAQAA/wAA/wD/AAABAQAA//8AAAABAAAAAAAAAQAAAP7/AAAAAQAAAAAAAAAAAP//AAAAAAAAAAD+AAAAAQAAAAAA//8AAAAAAAAA//8AAAAAAP8AAAD6+foA29vaAAAAAAAAAAAAAAAAACMjJAD//wAAAAD/AAD/AAAAAP8AAAAAAAAAAAAAAAEAAP//AAAAAQAA//8AAQEBAP///wD/AAEAAP8AAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAEAAAD//wABAQEALy8wAOfn5gAAAQAA////AO3t7AD5+vkABgUGAAAAAAABAQAA///+AP//AQAAAP8AAP8BAAAAAAAAAAAAAAAAAP8AAAAA/wAAAAD/AP8AAQAAAP8AAP8AAAAAAAAAAP8AAP8BAAABAAAA//8AAAAAAP//AAABAQAA/wD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAEAAAEA/wD+//8AAQEBAAD+/wAAAP8AAAAAAAAA/wAA/wEAAAAAAAAA/wAAAQAAAP8AAAEBAAD/AAAAAP8AAAAB/wAAAAAAAP8AAAAAAAAAAAAAAAD/AAD/AADn6OYAAAAAAP///wAAAAAADAwMABcXGAD///8AAAEAAAD/AAAAAP8AAAABAAEBAAD/AP8AAP//AAAAAAAAAP8A////AAAAAQAA//8AAAD/AAABAQAA/wAAAAD/AAAA/wAAAAEAAAAAAAAA/wABAQAA//8AAAAA/wAAAAEAAP//AAAAAAD/AAAAFxYYAAwMDADz8/MAAAAAAPn6+QDn5uYAHh8fAAD//wD//wEAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAABAAD//wAAAQEAAP8AAAAA/wAAAAAAAAD+AAAAAAAAAAEAAAD/AAD/AAAAAAAAAAD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///4A//7+AP7//wAA//8AAP//AP7+/gD///8A/v/+AAAAAAD///8A///+AP///wD//v4A///+AP7+/wD//v8A////AP/+/gD//v4A///+AP///gD///4A//8AAP//AADn5+YA/v/+AP8A/wD/AP8AHR0fAP/+/gD///4AAP//AP///gD///8A///+AP7+/wD//v4A////AP///gD//wAA//8AAP///gD///4A////AP/+/wD///4A////AP8AAAD/AP8A///+AP//AAD+/v4AAAD/AP//AAD/AP8A////AP8AAAD//v8A///+ABwcHQD/AP8A/wD/AP///wDn6OYAAP//AP8AAAD///4A///+AP///wAAAP8A///+AP///wD///8A////AP//AAD//v8A///+AP///wD///4A//8AAP///wD/AP8A////AP///wD///8A////AP///wD//wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAD/AAAA/wAAAQABAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAA/wAAAAEAAAAAAAD//wAAAAD/AAD//wAAAAAA//8AAAAA/wD//wEAAAD/AP7//wAAAAAAAAABAAAA/gAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD+AAAAAADu7u0AAP8AAAAAAAD/AP8AGBcXAP//AAAAAAAA///+AAAAAQABAQAA/v//AAEBAAAA//8AAAAAAAAAAAAAAQAAAP//AP8AAAABAAAAAAAAAAEBAAD///8AAAEAAAD+/wAAAAAAAAABAAAA/wAAAP8A//8AAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAABcXGADW1tUAAAAAAP8A/wDt7e0A/v7+AAEBAQD///8AAAAAAAAA/wD//wAAAAAAAAAA/wAAAAAA////AAEBAAAAAAAAAAABAAAA/gAAAAEAAAD+AAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAEBAQD//wAAAAAAAAAAAAAAmJ9S8QAAIABJREFUAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAP///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQEAAP//AAAAAAAAAQEAAP8AAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAPPz8wD///8AAQEBAAD/AAAKCwsA///+AAAAAAAAAAAAAAD/AP//AAAAAAAA////AAAAAAAAAAAAAAAAAAD//wAAAQEAAP//AP8AAAAAAAAA////AAAAAAAA//8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQAAAP//AAAAAAABAQEA////AAAAAAAAAAAAERARAP///wAAAQAAAP8AAPT18wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAA/wAAAAEAAAAAAAEA///+AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAA//8AAAAAAAAAAAAAAP8AAAEBAP///wABAAAAAAAAAPP08wAAAAAA////AAAAAAAREBEA////AAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAABAQD//v4A/wAAAAEAAAAAAAAABQUFAAAAAAD///8AAAAAAPPz8wD///8AAAAAAAAAAAD///8AAAEBAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AP8AAQAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAP///wAAAAAAAAAAAAAAAAAAAQAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAD/AAAAAQAAAAAAAAAAAAAAAP//AP8A/wAAAAEAAAAAAAD/AAAAAQAAAP8AAP8A/wD///8A/wAAAAEAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAP8AAAAAAAAABQUFAP///wD/AP8AAAAAAAEAAQD///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAA/wAAAAABAAD///8AAQABAP///wAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAP8A/wAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP/+/gAAAgEAAAAAAAD/AAAAAAAAAAAAAAABAAD//v8AAQEBAAAAAAAAAQAAAP8AAAABAAAA/wAAAAD/AAAAAQAAAAAA/wAAAAABAAAAAAAAAP8AAAABAAD/AP8AAP8AAP7//gAA/wAAAQABAP8A/wD///8AAAAAAP8AAAAAAAAAAAAAAP8AAAD/AP8AAQABAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAD//wAAAAAAAAABAAD//wAAAAEAAAD/AAAAAQAAAAAAAP/+/wABAgIAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAP7//wAAAP8AAQABAP8A/wD///8AAAAAAP///wABAQEAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAP8A/wAAAAAAAAAAAQAAAP8AAAAAAAAAAQAA//8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAABAAEA/wD/AAAAAAAAAAAAAQABAAABAAAA/wAA/wD/AAAAAAABAAEAAAAAAP8A/wABAAEA/wD/AP8AAAD//f4AAQEBAAABAAD///8AAgEBAP7+AAABAAAA////AAAAAAAA/wAAAAAAAAD/AAAAAAAA/wD/AAIBAQD///8AAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA/wD/AAwLDQD09fMA/wD/AAAAAADz9PMADAsMAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAABAAAA/gAA////AAEBAQAAAAAAAAAAAP//AAABAAAAAAAAAAD/AAAAAAAAAP8AAP8AAAAB/wAA////AAEBAQD//v4AAAEAAP///wABAAEA/wAAAAEAAAAA/wAA9PX0AAAA/wAAAAAA////AAYGBgD///8AAAAAAAAAAAD///8A/wD/AAEAAQAAAAAA/wAAAAEAAAD/AP8AAQAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAEAAP/+/wABAQEAAP8AAP8AAAABAQAAAP8AAAAAAAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAD/AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAAAAAP7//gAAAAEA////AAH/AAAAAAAA/gD/AP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3//gAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAUFBAAA/wAA/wD/AAAAAAD08/MACwoLAAAAAAAAAAAA/wAAAAEAAAAAAAAA/v//AAEBAAAAAAAA/wAAAP/+/wABAQAA/wAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAD/AAAAAAAAAP///wAAAAAAAP8AAAAAAAD/AP8A//8AAAABAAAAAAAA9PPzAP///wAAAAAAAAAAABEREQD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA////AAABAQAAAAAA/gD/AAAAAAAA//8AAQEBAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAAAAAD+/wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wABAAEA/wD/AAAAAAAA/wAAAAEAAAAAAAD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAQABAP//AAABAP8A////AAABAQD/AP8AAf8BAAAAAAD/AP8A/wAAAAEAAAD/AP8AAQABAP8A/wAAAAAAAQABAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAABEREQDt7u0AAQABAAABAADt7u0AFhYXAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP//AAD/AP8AAAABAAAA/wAA/wEAAAAAAAAAAAD+AP8AAQABAAD/AAD/AAAAAQAAAP8AAAAAAP8AAQABAP8AAAABAAAAAAAAAAAAAAD/AP8AAQABAP7+/wAAAQEA7e7tAAD/AAD/AP8AAQABAAQFBQD///8AAAAAAAABAQD///4AAQABAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP8AAAABAAAA////AAAAAAD/AP8AAP8AAAEBAQAAAAAA////AAEBAQD/AP8AAQABAP4AAAAAAAAAAAAAAAAAAAAA/wAA/wH/AAAAAAD///8AAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAA/wH/AAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAD/AP8AAf8BAAAAAAAA/wAA/wD/AP/+/gD/AAAAAQEBAP7//gABAAEA/gD+AAEAAQD/AAAAAAD/AP8AAAAAAAAA/wD/AAAAAQAAAP8AAAAAAAAAAAD/AP8AAQABAAAAAAD/AP8AAAAAAAEAAQAAAAAA/wD/ABAQEQAAAAAA/wD/AAD/AADi4+EAJycoAAEAAQAAAAAAAAAAAP8AAAD/AP8AAAAAAAD/AAABAQEA/wD+AAEAAQD+AP4AAAAAAAEAAQD///8AAAEAAP///wABAQEA/gD/AAAAAAABAAEA/gD+AAAAAAAAAAEAAAAAAAAAAAAAAQAA////AP///wAAAP8A4uLiAP8A/wAAAAAA/wD/AB0cHQD+//4AAAAAAAD/AAABAAEA/gD+AAEAAQAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wAAAQEA////AAEAAQD/AP8AAAAAAP///wABAAEA/wD/AAD/AAD/AP8AAAAAAP///wAA/wAAAAAAAP8A/wABAAEAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAA/wD/AP///wD/AP8AAP8AAP8A/wAAAAAA////AP8A/wAAAAAA/wD/AP8A/wD/AP8A/wD/AAAAAAAAAAAA/v7+AAD/AAD///8AAP8AAP///wD///4AAP8AAP///wAA/wAAAP8AAAD//wAA/wAA/v/+AP7//gAA/wAA///+AP7//gD///8A//7/AP7//gD+/v4AAP8AABwcHAD///8A////AAD/AADo6OgA+vr6AP7+/gD+//4A/v7+AP///wAA/wAA////AP8A/wD///4AAP8AAP///wAA/wAA////AP7//gAAAP8A////AP8A/wD///8A//7/AP/+/wD///8A////AAD/AAD+//4A/v/+AP///wD//v8A/v7+AP8A/wD08/QA6OnnAAD/AAD///8A//7/ABYWFgAA/wAA////AP///wD+/v4A//7/AP///gD///8A////AP7//gD///4A/v/+AP///wD+/v4A////AP7//gD///8A////AAD/AAD+//4AAP8AAP///wAA/wAA/v7+AAAAAAAAAQAAAAAAAAEAAQD/AP8AAAAAAP8A/wD///8A/wD/AP8A/wD/AP8A////AAAAAAD/AP8A////AP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAEAAQAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7//gD+//4A/wD/AP7//gD+//4A////AP7//gAA/wAA/v7+AP///wD///8A///+AP7+/gD///4AAP8AAP///wD///4A/v7/AP/+/wD///8A/wD/AP///wD///8A////AAoJCwAWFhcAAP8AAP7//gD///8A1tfVAP///wD///8A/wD/AP7//gD+/v4A//7/AP/+/wD+/v8A/v/+AP7+/gD+//4A////AAD/AAD+//8A/v7+AAD/AAD+//4A////AP8A/wD+//4A////AP///wD//v8AAP8AAP7//gD+//4AAAD/AAD/AADR0tAAAP8AAP///wD///8AERERAAsKDAD+/v4A////AP///wD/AP8AAAAAAP7//wD+//4A////AP///wD///8A////AP///wD///8A//7/AP///wAA/wAAAP//AP7//gAA/wAA////AP///gD///4A////AP7//gD///8AAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wD//v8AAP8AAAD/AAD///8A/v79AAD/AAD+//4A////AP///wD+//4A/v7/AAAA/wD+//8A///+AP/+/wD+//8A////AP8A/wAA/wAAAP8AAP///wD/AP8A/v/+AP///wAcGxwA////AAAAAAD///8A2NfXAPn6+QAA/wAA////AAD//wAAAP8A////AP8A/wAAAAAAAP8AAP8A/wD///8A//7/AP7//gAA//8A////AP7+/gAA//8AAAAAAP///wD///8A////AP7//gD+//4A/v/+AAD//wD//v8A/v7/APPz8wDj4+IA////AP7//gAA/wAAJycoAP7//gD/AP8A////AP/+/wD//v8A/v7+AP/+/wD//v8A////AP/+/wD+//8A//7/AP///wD///8AAAD/AAD//wD+//4A/v//AP///wD+//4A/v7+AP7//wD+//8AAAD/AP///wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA/wAAAAAAAP///wAA/wAAAP8AAP///wAAAAAAAP8AAAD/AAAA/wAAAP8AAP7+/wD/AP8A/v7+AP7//gAA/wAA/wAAAP///wD+/v4A////AP/+/wD///8AAAD/AP7+/wAA//8A/v//AP///wAA//8A/wD/AP///wD+/v4A/v/+AP///wD//v8A////AP8A/wAiISIABQUFAP///wAAAAAA+vr6AMfHxQD+//4A////AP7//wD+//8A////AP/+/wD+//4A/v7+AP/+/wD//v8A/wD/AAD/AAD+//8AAAD/AP8A/wD+//8A/v7+AP///wD//v8A//7/AP///wAA/wAA//7/AP///wD/AP8AAAD/ANHT0AD5+vkA/wD/AAAAAAALCwsAISEiAP///wD///8A//7/AP///wD/AP8A////AAAA/wAAAAAAAP//AP8A/wAA//8A////AAD//wD///8A/v7/AP7+/wAA//8A////AAD/AAD//v8A////AP///wAA//8A/v//AP///wAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAAAAAAEAAQD///8A/wD/AAAAAAD/AP8AAAAAAAAA/wD//v8A/wD/AP/+/wD+//4A////AP///gAA/wAA/wD/AP8A/wD//v8A/v7/AAAA/wD+//8A//7/AP8A/wD+//8A//7/AP///wD/AP8A//7/AP///wD/AP8AAP//AP/+/wAEBAUALS0uAP///wD///8A/v/+AOLj4gDY2NcA////AP/+/wD///8AAAD/AP///wD///8A/wD/AP///wD///8A////AP7//gD+/v4A/v7/AP///wD///8A////AP///wD/AP8A/wD/AP///wD/AP8A/wD/AP///wD///8A19fXAN3d3AD///8A////AAD/AAAsLC0A//7/AP///wD///8A///+AP8A/wD//v8A////AP7//wD+/v4A/v7/AP/+/wD+//8A////AP7+/wD///8A/wD/AAAA/wD+//8A////AP7+/gD/AP8AAAD/AP/+/wD+//8A////AP/+/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8A////AAAAAAAAAQAA/wD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AP8A/wAAAAAAAAAAAP8A/wAAAAAA/wD/AP7//wD///4A//7/AP8A/wD///8A////AP7+/wAAAP8A//7/AP/+/wD/AP8A/wD/AP7//wD//v8A////AP///wD///8A/wD/AAD//wAA//8A////AAD/AAD//v4A/v7/AP8A/wD///8AJiYnABYWFgAAAAAA////AAAAAADLzMoA7u7uAP///wD///8A/v//AAAA/wAA//8A////AP///wD///8A//7/AAD//wAA/wAA/wD/AP/+/wD//v4A/wD/AP///wD///8A//7/AAD//wD///8A////AP7//wDu7e4Ay83KAAAAAAD///8A////AAoKCgAhISIA////AP/+/wD///8A/wAAAP///wD/AP8A////AP/+/gD/AP8A/wD/AP///wAA//8A/wD/AP///wD///8A////AP7+/gD///8A////AP///gD//v4A/v//AP///wD///8A//7/AAAAAAD/AP8A/wD/AAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAP8A/wD///8AAAAAAP8A/wAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD//wAA////AP///wD//v4AAP//AP///wD+//8A////AP8A/wD///8A////AP/+/wD///4A////AP/+/gD///8A////AP7//wD+/v4A/wD/AP7+/gD/AAAA///+AAD//wD///8A////ADg3OgAFBAUAAP8AAP///wAAAAAAu7y5AOPk4gAA//8A//7/AP7//wD+/v8A//7+AP///wD/AP8A/wD/AP7+/wD/AP8A//7/AP8A/wD//wAA////AP/+/gD///8A/wD/AP7//wD//v8A//7/AOno6AC7vLkAAAAAAP///wAA/wAABQUFAENCRAAA//8A/wD/AP///wD//v4A////AP/+/wD//v8AAAD/AP///wD//v4A////AP///gD+/v8A//7/AP///wD//v8A////AP///wD//v8A//7+AP8AAAD//wAA////AAAA/wD///8A////AP7+/QAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAP8AAP/+/wD/AP8A/wD/AP/+/gD/AAAA/v//AP8A/wAA//8AAAD/AP/+/wD//v4A////AP///wD///8A/wD/AP8AAAD//v4A//7/AP/+/gD///8A//7+AP///wD///8A/wAAAP7//wD///8A////AAoKCgAyMjMA/wD/AP///wD///8A+vr6AMLCwQDR0tEA/wD/AP/+/wD///8A//8AAP8A/wD///8A//7+AP8A/wD//v4A/v/+AP///wD/AP8A////AP///wD///8A////AP/+/gD///4A2NnXALu9ugD6+/oA////AP///wD/AP8ALSwuAAoLCwD+/v8A//7+AP8A/wD///8A////AP///wD/AP8A/v7/AP///wD/AAAA////AP8AAAD/AP8A/wD/AP8A/wD///4A//7+AP//AAD/AP8A//8AAP///wAAAP8AAP//AP7//wDeUtmDAAAgAElEQVT///8A/wD/AP///wAAAAAAAP8AAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQEBAAD/AAAA/wAAAAAAAP8A/wAB/wEAAAAAAAAAAAD/AP8AAQABAP///wAAAAAAAQABAP///gAAAAEA////AAEBAQAA//8AAP//AAAAAQD/AQAAAP/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//wABAQEAAAAAAAAAAAD/AP8AAAAAAAAAAAAFBQUAIiEjABsbGwAVFRYAAQAAAP///gD/AAAAAAD/AAEAAAAA//8AAAAAAP8AAAAAAAAA/wEAAP/+/wABAAAA/wAAAAD//wABAAAAAAEAAAD+/wAAAAAA/wAAAP8AAAABAAAA/gD/AAEAAAAAAAAA/wAAAAD//wABAAAA//8AAAAAAAAAAAAAAQAAAP4AAAABAP8AAAAAAAAAAAD///8AAQABAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAA////AAABAAAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAP///wD/AP8AAAABAAD/AAAAAP8A//8BAAEBAAAAAAAAAP8AAP8AAAD/AP8AAQABAP8BAAAA/wAA//8AAAEAAAAAAAAA/wAAAP8AAAABAAAAAAAAAAD/AAAAAQAAAAAAAP///wABAAEAAAAAAP///wAAAAEAAQEAAAD/AAD//wAAAAAAAAEAAAAAAAAAAAAAABQUFQAUFBUAAQAAAO7w7wD39vYA7+/uAPX29gAAAAAAAAAAAAD/AAAKCwoADAsMABYWFgAKCgsAAQAAAP8AAAD//v4AAAEBAAAAAAAAAQAA//8AAAAAAAAAAAAA/wAAAAEAAAAAAQAAAP4AAP8A/wAAAAEAAAAAAP8AAAD/AAAAAf8AAAABAAAA/wAAAAAAAAAAAAD/AAAAAAEAAP//AAAAAAAA/wAAAAAAAAD/AAAAAQAAAAABAAAAAAAA/v8AAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAA////AAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAPb19QAKCgoAAAD/AP8A/wABAQEAAAD/AP7+AAABAAAAAAAAAAAAAAAAAAAA/gD/AAD/AAAAAAAAAQAAAP8AAAAAAAAA/wD/AAEAAQD+AAAAAAAAAAAA/wAB/wEA/wAAAAEAAAD+AP8AAQAAAP8AAAAAAP4AAAABAP///wAAAAEAAAD/AAAAAQD/AP8AAAABAAEAAAAAAAAA/wAAABAPEAAQDxAAGRkaAAEAAAAAAAAA/wAAAAAA/wABAAEA/wD/AAEAAQD///8A/wAAAAEAAAAAAAAA/v/+AAEAAQAAAAAA////AAAAAQD/AAAAAAAAAAAAAAAA/wAA/wD/AAAAAQD/AP8AAQAAAP8AAAABAAAA/gD/AAD/AQAAAP8AAAAAAAAAAAABAAEA//8AAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAP//AAABAAAAAAEAAP//AAD/AAAAAAAAAPf39gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAPr7+gAJ/wkA/wD/AAAAAAD///8AAQABAP8A/wD/AAEAAQAAAP8A/wABAAEA/wAAAAEAAAAAAAAA/wAAAAAAAAD/AAAAAAD/AAAAAAD/AP8AAQABAAAAAAD/AP8AAAAAAP8AAAAAAAAA/gD/AAEAAQAAAAAA/v//AAAAAAABAf8AAAAAAP///wD/AAAAAAD+AAAAAQD/AAAAAAD/AAAAAQABAAAA/wD/AP8AAQAAAAAAAAD/AAAAAAAAAAAA/wAAAP8A/wAAAP8AAQABAP4A/wAAAAAAAQABAP4A/gAA/wAAAAABAAAA/wAAAQAA//8AAP8AAAABAQAA//8AAAEA/wAAAAAA/gAAAAAAAAD/AP8AAAABAAEA/wD/AAAAAQAAAAABAAD+//8AAQAAAAAAAAD+AP8AAQABAAAAAAD+AP8AAAAAAAEAAQD/AAAAAP8AAP8A/wAAAAAAAQABAPr6+gAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAA////AAEAAQAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAPHw8QANDQ0AAAABAAAA/wAAAAAA/wD/AAEAAQAAAP8A/gD/AAAAAAD/AP8AAAAAAAAAAQD/AP8AAAABAAAA/wAAAAEAAQAAAP4A/wAAAP8A/wD/AAEAAQAAAQAA//8AAAAAAAAAAAAAAAD/AP8A/wAAAAAAAAABAAEAAAD+/wAAAAAAAAAAAAABAAAA/wD/AAAAAAAAAAAA////AAAB/wD/AAAAAAABAAAA/gAAAAAAAQEBAP//AAD/AP4AAAABAAEAAAD/AP8A/wAAAAAAAAAAAAAAAAD/AP8AAAABAAAAAAD/AP4AAAAA/wAAAAD/AAAAAAD//wAAAQABAP4A/wAAAAAAAAAAAAAAAAAAAAAAAQAAAP4A/wAAAAAA/wABAAD//wAAAAAA/wAAAAAAAAAAAAAA/wD/AAAAAQAAAAAAAQAAAP8A/wAAAAAA/wAAAAAA/wAAAAEA/wD+APb19gD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAA/wAAAQEBAAAAAAAA/wAA/wD/AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAPHz8QAb/xwAAAD+AAD/AAAAAQAAAQABAP4A/gAAAAAAAAAAAAAAAAAA/wAAAQEBAP4A/gAAAAAAAAD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP4A/gAA/wAAAAABAAEAAAD/AAAAAQAAAP8AAAAAAP8AAAD/AAAAAQD/AP8AAAAAAAAAAAD/AAEAAAD/AP8AAAAAAP8AAAAAAAH/AQAAAAAA/wD+AAAAAAAAAAAAAAAAAP///wAAAAAAAAD/AP//AAAAAQEAAAD+AAAAAAAAAAAAAAABAP8A/wD/AAAAAAAAAAAAAAAAAAAAAQABAP8A/wABAAEA/gD+AAAAAAAAAAAAAAAAAAAAAQAAAP8A/wD/AAEAAQD/AP8AAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAAA/wAAAAAAAAAA/wAAAAEAAAAAAAABAAAA/wD/AOjp5wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAAEA////AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk4wAmJCYAAwQDAAAAAAAA/wAA/wD/AAAAAQAAAP8AAAAAAAAAAAAAAAAA////AAD/AAAAAQAAAAAAAAAAAAAAAP8A/wAAAAEAAQD/AP8A/wD/AAAAAAAAAAAAAAD/AP8AAAAAAAAA/wAAAAEAAQD/AP8AAAAAAP8AAAAA//8AAAEBAAEAAAD/AP4AAAAAAAEBAAD///8AAAABAAAA/wD/AAAAAAD/AAAAAAAA/wAA/wH/AAAAAAAAAAAAAQEBAP8AAAAB//8A////AAABAAAAAAEA/wD+AAAAAAAAAAEAAAD/AAD/AAAAAQAA/wD/AAAAAAD/AP8AAP8AAAEBAQD/AP8AAAAAAAAA/wAAAAEAAQAAAP4A/gAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAA/wAAAAAAAAAAAAD/AP8A9/f4AOzt7QAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB8P/+/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv6+wDZ2tkAKSgpAAABAAABAAEA/wD/AAAA/wABAAEA/wD/AAEAAQD/AP8AAAAAAAAAAAAB/wEAAAAAAP8A/wAAAAAAAAAAAP///wAAAQAAAAAAAAD/AAAAAQAAAAAAAAEAAQD/AP8AAAAAAP8A/wAAAAAAAAABAAAA/gAAAAAAAP//AP//AAAAAQAAAQABAP7//gAAAAAAAAD/AP8AAAABAAEAAAAAAP8A/wAA/wAAAAAAAAAAAAAA/wAA/wH/AAAAAAD/AAAAAAAAAAD/AAAAAP8AAP8AAAABAAABAAAA/wD/AAD/AAAAAAAAAAAAAAD/AAAAAQAAAAAAAP///wAA/wAAAAEAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQABAP8A/wAAAAAAAAAAAAD/AAAAAf8AAAAAAAAAAAAAAAAAAP8AAAAAAAABAAEA39/dAPb29QABAAEAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAABAQHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v3+8AABABAAAAAAAAAAAAAAAAABAAEA/wD/AAD/AAABAAEA/wD/AAEAAQD/AP8AAAAAAAAAAAAAAAAAAQABAAAAAADg4N8ADQ0NABsbGwD///8AAAEAAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAP8A/wAA/wAAAAAAAAABAAAA/wAA/wD+AAEBAQAAAAAAAAAAAAAAAAAB/wEA/gD+AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAD/Af8AAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAEAAQD/AP8AAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAA/wD/AAAAAAAAAAAAAP8AAAABAAAA/gAAAAEAAAAAAAAAAAAAAAAAAAD/AADg4t8A3+DfAAAAAAD/AP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD///8AAQEBAP///wABAAEA/wD/AAAAAAD/Af/wAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA09PSAPv7+gAfHh8AAAABAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAD/AP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAQAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAQAAAQAAAP8AAAAAAAAAAAAAAAH/AAD///8AAAABAAAAAAAAAAAAAAAAAOHi4QDX19YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA////AAAAAAD/AP8AAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAA/wD/ANfY1wDy8vIAIyMkAAkICQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAABAAABAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAP///wABAAEA/wAAAAD//wAAAAEAAAEAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAA/v7/AAEBAQAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAA/wAAAAEAAAAAAAAA/wAA/wAAAAD/AAAAAQAAAAAAAP8AAAAAAAAAAP7/AFIha58AACAASURBVAAAAADv8O4A3N3cAO7u7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAEA8AAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AADl5eUA5eXlAA0NDQAJCQkADQ0OAAkICAAAAQAAAP8AAAABAAAAAAAAAP8AAAABAQD///8AAQEBAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAP8AAAABAQAAAAAAAAAAAAAA/wAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA//8AAAEAAAAAAQAAAP8AAAAAAAAAAQAA//8AAAEAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAQAA//8AAAEAAAD/AAAAAQAAAAAAAAAAAQAAAP8AAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39/cA+Pj4APLy8gDz9PMAAP8AAP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAQAAAAAAAAD/AAAAAAAA/wD/AAAAAAACAQLgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAB8P7//gAAAAAAAAAAAAH/AQD/AP8AAAAAAAAAAAABAQEA////AAEBAQD///8AAQABAP8A/wAAAAAAAAAAAAD/AAAAAAAAAf8BAAAAAAD/AP8AAAAAAPLz8gDy8/IA6erpAAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAP///wAAAAAAAAAAAAEAAQAAAQAA////AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQABAP8A/wABAAEAAAEAAP///wAAAAAAAQABAP8A/wABAAEAAAAAAAABAAD///8AAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAEAAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQEBAP///wABAAEA/wD/AAD/AAAAAAAAAQABAAABAAD///8AAAAAAAAAAAAA/wAAAQEBAAABAAAA/wAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v/+4QEAAQD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAAA/wAAAQABAP///wAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAAP///wAAAAAA////AAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAQABAP8A/wD/AP8AAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AP8A/wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAAAAAD/AP8AAf8BAAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wD////xAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgLgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAgIC4AD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAD///8AAAAAAP///wAAAAAA////AAD/AAAA/wAAAP8AAAAAAAAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAP8A/wAAAAAAAAAAAAD/AAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAEAAP///wAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAAAP8AAP///wAAAADwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4AABAAD///8AAAAAAAD/AAABAAEA/wD/AAAAAAD/AP8AAP8AAAEAAQD///8AAAAAAAD/AAAAAAAAAQABAP8A/wAA/wAAAQABAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEBAQD///8AAf8BAP8A/wABAAEAAAEAAAD/AAD/AP8AAP8AAAAAAAABAAEA/wD/AAH/AQD/AP8AAP8AAAAAAAD///8AAAAAAAABAAD///8AAQABAP///wABAAEAAAAAAAAAAAD/AP8AAf8BAP8A/wAAAAAAAP8AAAEAAQD/AP8AAP8AAAAAAAABAAEA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAEAAQD/AP8AAAAAAAEAAQD/AP8AAQABAAAAAAAA/wAAAAEAAP///wAAAAAAAAAAAAAAAAAB/wEAAAEAAP///wABAQEA////AAEAAQD///8AAAAAAAAAAAAB/wEA/wD/AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAD/AAABAAEA/wD/AAEBAQD///8AAAAAAAD/AAABAQEA////AAEAAQD///8AAQABAAAAAAD+Af7PAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAwMD0P///wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wABAQEAAAAAAAEAAQAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAP///wAAAAAA/wD/AAAAAAD/AP8A////AP8A/wAAAAAAAAAAAAAAAAD/AP8AAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA/wD/AAAAAAD/AP8AAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAP8A/wAAAAAAAAAAAP///wAAAAAA/wD/AP///wD/AP8A////AAAAAAAAAAAAAAAAAAAAAAD/AP8A////AAAAAAD///8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAP///wABAQEAAAEAAAEAAQACAwLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAEBAQ4AD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAP8A/wAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP8A/wAEAATQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABkaGd8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAA////AAEAAQAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAdDm5eYxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAIBArEA/wAA////AP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAD///8A////AAD/AAD///8AAP8AAP///wAAAAAA////AP///wAA/wAA////AAAAAAD/AP8A////AAD/AAAA/wAAAAAAAAABAAD///8AAP8AAAAAAAAAAAAA////AAAAAAAAAAAAAP8AAP///wD///8A////AAAAAAD///8AAAAAAP///wAA/wAAAAAAAAAAAAAAAQAAAAAAAP///wAAAAAAAAAAAP///wAAAAAA////AAD/AAD///8A////AP///wAA/wAA////AP///wD///8A////AP8A/wD/AP8AAP8AAAD/AAD/AP8AAP8AAP///wD///8AAQEBAAABAAAA/wAA////AP///wD/AP8A////AAAAAAAAAQAAAP8AAP///wAAAAAA////AP///wAA/wAA////AP///wAA/wAAAP8AAAD/AAAA/wAAAAAAAP///wD///8AAP8AAP///wD///8AAP8AAAD/AAD///8A////AAAAAAD///8AAP8AAP///wD///8AAP8AAP///wD///8AAP8AAP///wD///8AAP8AAAAAAAAA/wAAAP8AAP4A/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAbD/AP8AAAAAAAAAAAD/AP8AAAAAAAEAAQD/AP8A////AP///wAAAAAAAAAAAP8A/wAAAAAA/wD/AAAAAAABAAEAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAQEBAP8A/wD/AP8A////AP///wAAAAAAAAEAAP///wD///8AAAAAAAAAAAD///8A/wD/AAAAAAAAAAAAAAAAAP///wABAQEAAP8AAAAAAAD/AP8A////AP///wD///8A////AAAAAAD///8A////AAEAAQD///8AAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAA/wD/AAAAAAAAAAAA////AP///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AAAAAAD///8AAQEBAAAAAAD/AP8AAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A////AAAAAAAAAAAA/wD/AAAAAAAAAAAA/wD/AP8A/wAAAAAAAAAAAP///wAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAABAQEA/wD/AAAAAAAAAAAAAAAAAP///wAAAQAA/wD/AAL/ArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAQUBNACAgLwAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA/wD/AAAAAAD///8AAAAA4Obm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PAA/wCRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgagAP8AAAD/AAD///8AAAAAAAD/AAD///8AAP8AAP///wAAAAAAAAAAAAEBAQAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAAAQAAAAAAAP///wAAAAAA////AAD/AAD///8A////AAD/AAAA/wAAAP8AAP///wAA/wAAAP8AAAD/AAAAAAAAAP8AAAAAAAAAAAAA////AAD/AAAAAAAAAQEBAAD/AAABAAEAAAAAAAD/AAD///8AAAAAAAAAAAAA/wAAAP8AAP8A/wAA/wAA////AAAAAAAAAAAAAP8AAAAAAAAA/wAA////AAD/AAAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAA/wAAAAEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA////AAAAAAAA/wAA////AAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAD///8A////AAD/AAAA/wAAAP8AAP///wAA/wAAAP8AAAD/AAD///8AAP8AAAD/AAAA/wAA////AAD/AAAA/wAAAAAAAAD/AAD///8AAP8AAAD/AAAA/wAAAP8AAAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDg4OAf7//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAABAQEA/wD/AAAAAAAAAAAAAQABAP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAABAAGg5OTkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAACAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH7yXKwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEAAeAICAiBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Ojw+AsJC9kBAQFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAEAAXDk5OTBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgMCwwRAAEAOAD/AAAAAQAA////AAEAAQAAAQAA////AAEBAQAA/wAAAAEAAAAAAAAA/wAA/wD/AAEBAQD///8AAQABAP8A/wAAAAAAAQEBAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAP///wABAAEAAAEAAAD/AAAAAQAA////AAAAAAABAQEA////AAAAAAAAAAAAAQEBAAD/AAAAAQAAAAAAAAAAAAD///8AAQEBAP///wABAAEAAAEAAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAP///wABAQEAAAAAAP///wABAAEAAAEAAAAAAAAAAAAA////AAEAAQD/AP8AAQABAAAAAAD/AP8AAQEBAAD/AAAAAQAAAP8AAP8A/wABAQEA////AAEBAQAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAAABAAAA/wAA/wD/AAAAAAABAAEAAAEAAAABAAAA/wAAAAEAAAAAAAAA/wAA/wD/AAEBAQAAAAAAAAAAAP///wABAQEA////AAEBAQAA/wAAAAEAAAAAAAABAQEA////AAEAAQD/AP8AAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcWzwAAADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAADQ6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgkKQQEBAeD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAIBAuAKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUECAQLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEC4AgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAP8A0AD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAP8AAAAAAAAAAQAA////AAAAAAAAAQAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD///8AAP8AAP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAADQCAgIMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFZAAAQBvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQAAAAAA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AJHr6+twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29rgLCgvhAQIBMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAADwAQABWevr65AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vbQFRUVsfz7/BEAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAYELCQtZ5eXl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD///v8gAAEAAAD/AAAAAQAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/APABAwGRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAABAQEA////AAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAQEBAP///wAAAAAAAAAAAAEBAQAAAAAA////AAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAuD//v+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////EP///x8AAQAQAAAAAAICAiAA/wAAAAEAAP3+/RABAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPACAgLwAAAAAAAAAAD//v/w/wD/8P8B/+AAAAAAAwID4f/9/+AAAADQCwsL4ODg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8KlBIAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//CiYnG0eFTE4AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Clock.png b/arma/client/addons/phone/ui/_site/images/dark/Clock.png new file mode 100644 index 0000000..8401399 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Clock.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Clock.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Clock.png.b64 new file mode 100644 index 0000000..b021d2a --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Clock.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEHOnuhq8EAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAABQUFAAICAgAEBAQABAQEAAICAgACAgIAAAAA/wAAAAEAAAAA/v7+AP39/QD8/PwAAAAAAPj4+AD+/v4AAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAgICAAcHBwAICAgABgYGAAcHBwAGBgYAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A+/v7APv8+wD39vcA+fn5APb29gAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8fAP8A/wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAAAP////8BAQEB/////wAAAAABAQEB/wD/AAEBAQH///8AAQEBAf////8AAQABAP8A/wAAAAH/////AAAAAQEBAQD///8AAQEBAQAAAAD/AP8AAQABAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP/+/wAAAAAABQUFAA0NDQALCwsACAgIAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIABwcHAAcHBwAMCwwAAAAAAAAAAAD29vYA9fX1APPz8wD7/Pv/AQABAQAAAAAAAAAA/////wEBAQEAAAAA/////wABAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQEAAQAAAAAAAAAAAP8AAAABAP8AAQABAAD+/v4f8PDwvwAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAG8BAQEB////AAAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAA/wABAAEA/wAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEBAQEBABEREQAPDw8ABQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/sA8fLxAPLx8gD8/PwA/wD/AAD/AAAAAAAAAQEBAP////8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEAAAAA/////wABAAEA/wD/AQEBAQAAAAD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wABAQEA/wD/AAD/AJDS0tJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf/v7+oAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQD//////wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAA/wAAAQEBAAkJCQATFBMACgkKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAABAQEA5eblAAD/AP//Af8BAAAAAAD/AP8BAQEB////AP///wAAAAD/AAAAAf///wAAAAD/AQEBAf////8AAAABAAAA/wEBAQH///8AAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQABAP///wAAAAABAAAA//8A/wABAAEA/wD/AAEAAQEAAQAAAP8AAQEAAQD///8A/wD//xwbHAEPDw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb29gAAAAAAAAAAAOvr6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8A////AObm5gEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAD/AP8AAAAB/v/+/wEAAQAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/FhUWAQ8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABUWFQAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAAAVFRUBFRUVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUUFQASEhIAAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAH///8A/wD/AAEBAQEBAAEBAAAAAP8A/wAAAAAA/////wAAAP8A/wAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAAABAAAAAAgICAAVFRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgACgoKAAAAAAABAAEA/////wAAAAAA/wD/AP8AAAD/AP//AP8AAAAAAAD/AP8A/wD/AP8AAABHP8S/AAAgAElEQVQAAP8AAAAAAAAAAAABAAD///8A////EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP////8AAAAAAP8AAAD/AAAAAAAAAAAAAQAAAAEAAAD//////wEAAQAAAAAB/////wAAAP8AAAD/BAUE/x0dHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANbW1gDr6+sAAAAAAAAAAAAAAAAAAAAAANbW1gD19fUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMHBwQDr6+sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1ADU1NQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhsaAAUFBQD///8AAAAAAAAAAAAAAAABAQEBAP8A/wAA/wAAAAEAAAAAAAEAAAAB/wD/AAAAAAH///8AAP8AAP////8AAAAA/wD/EAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACoqKt//AP8fAQABAP8A/wABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKCgBgYGAAQEBAAAAAAACrq6sAq6urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19QDg4OD/AAAAAQAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAA/wD//wD/AAABAQEB/wD/AAD/AP8BAQEBAAAA4NbW1iEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP8SExIADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAICAgABAQEAAAAAAAAAAAAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwASEhIB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAIDAhD/AP8A/wD/AAABAAH///8AAP8A/wABAAEAAAAAAQABAAEBAQAA/wAAAP8AAQEBAQEBAAEBAAAAAAUFBQEXFhcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFRUAi4uLACAgIAAAAAAAAAAAAAAAAADMzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYABgUGAP8A/wEA/wAAAAEAAP8A/wAA/wD//wD/AP////8A/wD/AP8AAQAAAAH/AP8AAP8A/wD/AAH///8AAAAADwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP79/hAA/wAAAP8AAAD/AAAAAAAAAAAAAQAAAAAA/wAA////AP///wAAAAD/AAAA//////////8AAAAA/xYWFgACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFQCAgIAAFRUVAAAAAAAAAAAAAAAAAKurqwCrq6sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAGxsbAAD/AAD/AP//AP8AAAD/AAAAAAABAAAAAAAAAAEAAAABAAAAAAD/AAAA/wAAAAEAAQAAAAAAAAAA////EQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAQAAAQABAf////8BAQEBAAAAAAD/AAAAAQAAAP8AAP8A/wABAAEBAAAA/wAAAAEAAAAAEBEQARAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAH9/fwALCwsAAAAAAAAAAAAAAAAAlpaWAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAAsLCwD09fQAAAAAAAABAAD/////AP8AAAD/AAABAQEB/wD//wEBAQEA/wAAAP8AAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAAEAAAEBAQEAAAAAAAAAAP8A/wAA/wAAAP8A/wAAAAD/Af8BAAAAAQD/AP8BAQEBFhUWAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1AAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA19fXAPr6+v8AAQABAP8A/wAAAAAAAAABAAAAAAABAAAA/wD/AAEAAdrZ2gEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP////////7//v8A/wAAAP8AAAAAAAAAAAAAAAAAAA4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCgoAKysrAAoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUAYGBgAAAAAAAAAAAAAAAAAOrq6gCBgYEA4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OAAAAAAEA/wD/AAAAAQABAAEAAAAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAAAA/wEAAQH/AP//Af8BAQ8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFQCAgIAAFRUVAOvr6wCrq6sAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAQAAAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wABAAAAAAEAAQH/////AAAAAP39/QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGooywAAAAAArOAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD/AP8AAf8BAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAfj5+P/9/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBjgABUI9gDL7BoAwOggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39APz8/AAAAAD/AAEAAAEAAQH///8AAAEAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEA//////8A/wD/AP8AAP8AAAAAAAD5+fkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCPUAVSDVAAAAAACg3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+fn5AAAAAAAAAAAB////AAAAAAAAAQAB//7///8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQAAAAAA/v/+/wD/AAD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLHNsAFQj2AMDoIADr+AsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vr6AAD/AP8AAAAAAP8AAP8A/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEAAAAAAP///wAAAAAAAQABAQAAAAD39/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUI9QBKHNsA6vgLAKvgKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vLyAP8A/wAA/wAAAQEBAAD/AAAAAQABAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wD19fUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUg1gAAAAAArOAqAOv4CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vf2AAD/AAAAAAAA////AP8A//////8AAAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8A/wD//////wD/AP8A/wAAAAABAAAAAAAAAAD19vUA/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBjgAEAY4ADq+AsAwOggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vLyAAABAAEBAQEAAAAAAAEAAQEAAAD/AAAAAf///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP/9/f0A9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSDVAAAAAACh3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8AAQAAAQABAf//////////AAAAAAABAAAAAAAA8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKHNoAFQj2AMDoIADL7BoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+8AAAAAAAAAAAAAAAAB/////wAAAAD///8A/wD/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf8A/wAA/wAAAAAAAP8A/wEAAQABAAAAAAD/AAH/////7/DvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUI9QBLHNsAAAAAAKvgKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXJMHAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+8AAP8AAAD/AAD/AP8AAQABAQD/AAAAAAAAAQABAf////8A/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAH/AP//AQEBAQD/AAD///8AAAAA/wD/AAAAAQAA+fj5APn5+QAHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUVAGpqagAgICAACws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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/ADj4+MA/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAAB+vn6AOTk5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCPUAVSDWAOr4CwCr4CoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPk4wD4+fj/AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AObn5gDx8vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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UAAEAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAA/wAAAAEA/wAAAAH/////AQEBAQAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAP8A/wABAAAAAAEBAeAICAhB4ODg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFlABAQGuAAEAAQAAAAAA/wAAAAAA/wABAAEAAAAA////AAAAAP8BAAEB/wD/AAEBAQD///8AAAAA/wEBAQEA/wAA/wD//wEBAQEA/wAA/wD/AAAAAP8BAQEB/////wIBAgH/AP8A/////wEBAQEAAAAAAAAAAP////8BAQEBAAAAAP///wABAQEAFxcXABcWFwAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8ADh4uEA8fHxAP///wAAAAD/AQEBAQAAAAAAAAAA////AAEBAQD///8AAQABAAABAAAAAAAAAAAAAAD/AAAAAQAA/////wAAAAAAAAAAAQEBAQD/AP8AAQABAAAAAP///wABAQEAAAAAAAAAAAD/////AQEBAQAAAAD///8AAQEBAAD/AAD/AP8AAAAA/wIBAmHo6OihAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFxWPAgECcP///wABAAEA/wD/AAEAAQAAAQAA////AAEBAQAA/wAAAAEAAP////8AAAABAAAAAAEBAQD/////AQABAf8A/wAAAAAAAQEBAP///wABAAEAAAAAAP8A//8BAQEB////AAAAAP8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAAAAAAAAAAAICAgAGBcYABcXFwAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj4+ADp6ekA5OXkAP38/QD/AP8AAAAAAAAAAAAAAAD/AAAAAQEBAQAA/wAA/wD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAD///8AAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAAAAAAA/////wAAAAAAAAABAQABkOnp6XEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAICAgAExMTABQTFAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8APT09ADs7ewA7ezt//j5+AEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEPf498/+/v4fAQEBAAD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAEBAQEAAAAA/////wEBAQEA/wD//wD/AAEBAQEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AAAAAAEBAQEAAAAADw8P/w0MDQEPDw8ACAgIAAgICAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AD4+PgA9PT0APT09AD19fUA9PX0APz7/P8AAQABAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAA/wAA/wD//wEBAQEAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAA/wIBAuEICAhB4ODg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgICD4+Pi//f79HwEBAQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQD/////AQABAQABAAAAAAAA////AAAAAAABAAEA/wD/AAEBAQAA/wAAAAEAAAD/AAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAA/////wEBAQEA/wAAAAEAAAD/AAAAAQAAAAAAAP////8FBAUBDAwMAP8A/wAJCAkAAwQDAAQEBAABAAEA/wD/AAD/AAD8/fz//fz9Afz9/AD49/gA/Pz8APj5+AD/////AQEBAQAAAAAAAAD/AAAAAf///wABAQEAAAAAAAAAAAD/////AQEBAf///wAAAAAAAQEBAAAAAAAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAAAAAD/////AQEBAQD///8AAQEBAAAAAAAAAAAA////AAEBAQD/////AQEBAf////8BAQEB////AAAAAAABAQEAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAQEB4AkICUHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2rwAAADD/AP//AQEBAQD/AAD/AP//AQEBAf////8BAQEBAAAAAP///wABAQEAAAAAAAAAAAD/////AQEBAf///wABAQEA/////wAAAAEBAAH//wD/AQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8BAQEB////AAEBAQAAAAAA////AAAAAAABAQEAAAAAAP////8AAAAAAAAAAQEAAQD/AP8AAAAAAAEBAQAAAAAAAAAAAP////8BAQEBAP8AAAABAAD///8AAAAAAAAAAAAAAAD/AQEBAf////8AAAABAAAAAAAAAP8AAAABAAAA/wEBAQH///8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQABAP8A/wAAAAAAAAAA/wEBAQH///8AAQEBAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQAAAAAAAAAAAP///wABAQHQCgkKQeDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmjnyhAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//+SW11e67THEAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Contacts.png b/arma/client/addons/phone/ui/_site/images/dark/Contacts.png new file mode 100644 index 0000000..53a0894 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Contacts.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Contacts.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Contacts.png.b64 new file mode 100644 index 0000000..e3dff73 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Contacts.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEJD7ORQmwAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRYGBc8Pz8ANBxcXHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABZmReAAABAAACAALQBAME0AAB+7FkZ3GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAZmReAAICAgABAQEAAgICAAECAQADAwPgAQIBwP///4FhYWngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAZ2ZgAAEBAQADAgIAAgICAAICAgADAwMAAgICAAICAQACBAOgB///gVFZYeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwT/Dw8N7///9/AAAA/wAAAAAAAAD/AAAAAP////////8A/////wAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAD+//7/AAAAAAABAAD/////AAAAAAABAAAAAAAA/////wAAAAAAAAAAAQEBAP////8AAAAAAQEBAQAAAAD/////AAAAAP8A/wAAAAAA/////wEBAQD/////AAAA/////wAAAAAAAAAA//////8AAAAB/////////wAAAAABAAAAAf///wD/////AAAAAP////////8AAAAAAAAAAP8AAAAAAAAAAP////////8BAAAAAAAAAAABAQEBAAAAAP////8AAAABAAAAAAAAAAAAAAAB////AAAAAAD/////AAAAAAAAAAD///8A/v7+//////8AAAD/AAAAAP7+/v8AAAAAAAAAAQAAAAH/////AAAAAQAAAAAAAAAAAQAAAAICAQACAgIAAgICAAMEAwAEBAMABQUEAAUFBQAEAgNgAAUHv7GuqV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8AAQEBAAEAAQABAQEAAwMCAAQDAwAEBAQABAQEAAQEBAAEBQQABAUDIAMEAqC4tK+PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/a2ljAQMDAwADAwMABAQDAAQEBQAFBQQAAgMCAAQDBAACAgIAAgICAAEBAQABAQEAAf8A0P0B/1FJSVHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg8PDwz////zAAAAD/AAAAAf///wD/////AAAAAAAAAAAAAAAA////AAABAAAAAAAA////AAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAD/////AAAAAQD/AP8AAQAA/////wAAAP8BAQEAAP8AAP////8AAAAAAAAA/wAAAAAAAAAAAQABAf////8AAAAAAAAAAP///wD///8AAAAAAf////8BAAEA////AAAAAAD///8A////AAAAAP8AAAAAAAEAAQD/AAAAAAAAAAAA/wAAAAAA/wAAAAAAAP///wD/AP8AAQEBAAAAAAEAAAABAAAAAAAAAAEBAQEBAAAA/////wAA/wAAAAAAAf////8AAAAAAAAA/wAAAAAAAAAB////AAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAD///8AAAAAAf8A/wD///8AAAAA/wAAAP8BAQEAAAAAAAAAAAAAAAABAAAAAAEBAQABAQEAAQICAAMDAgACAgIAAwMDAAMDAwADAwMAAwQDAAQEBAAEBAMAAwUDMAcDA7+/v68gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD39/e/////IAAAAAAAAAABAAAAAAAAAP8AAAABAAAAAQAAAAAAAAAAAAAAAP///wD+//4AAAAAAP////8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEBAAAAAAAAAAEA/wAA/wD/AAAAAAH///8AAAAAAAAAAAH+/v7/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQH+//7//wD//wAAAAAAAAD/AAAAAAAAAAH/AP8AAP8A/wABAAD/AP8BAAAAAQAAAAAAAAAAAAAAAAAAAAAA/wAA/v7+/wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAAAAQAAAAAAAAAAAAEAAAAAAAAAAQAAAAD/////AAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEAAAAA/wD/AQAAAAH///8A/wD/AAAAAAD/////AQEBAAAAAAABAQEAAgEBAAEBAQACAgIAAwIDAAMDAgAEBAMAAwICAAMDAgADAwMAAwMDAAEDAyABAAi/v7+vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAABAAABAQAAAQEBAAEBAQACAgIAAgICAAECAgACAgIAAwMDAAICAwACAgIAAgICAAMDAwACAQEgBQEKvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uj////y8BAAEBAAAAAf////////8A////AP///wD///8AAAAAAAAAAAH/////AQEBAQEBAQEAAAAAAQABAP///wAAAAAA////AAAAAAEBAAEAAAAAAQEBAQAAAAABAAAA//8A/wAAAAAA////AP///wABAAEA/////wAAAAD///8A////AP////8AAAAA//7/AAAAAAAAAAD/////AAAAAAEAAAAA/////wEBAQH/AP//////AAAAAAAA/wD/////AP////8AAAABAAAAAP////8AAAD//wD/AP////////8AAAAAAP8A/wAAAAAA////AAAAAAD/////AAAAAP///wD/////AAAAAQAAAAD/////AQEBAQD/AAAA/wAB////AP8A/wABAQEBAAEAAf///wD///8AAQEBAQD/AP////8A/////////////////wD/AP////////8AAAAAAP///wD/AP8A/////wAAAAABAQEAAQEBAAEAAQAAAQEAAAEBAAEBAQABAQEAAQIBAAIBAQABAQEAAQEBAAICAQACAgIAAgICAAICAgACAgIAAAIBMMTCu48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBfAAAAcAAAAAD/////AAAAAAAAAAEAAAAAAAAA/wEBAQAAAAAA////AAAAAAAAAAAB/////////wD///8AAAAAAAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAD//wD/AAD/AP8AAAAAAAAAAAAAAP//////AAAAAf8A/wAAAAAAAQEBAAAAAAH///8AAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAf///wAA/wABAAAAAP///wABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAP8A/wAAAAEAAAAAAAAAAAD/AAAAAAD/AAAAAAAAAP8AAAABAAEAAQAAAAAAAAABAAEAAP///wAAAAAA////AAAAAAAAAAAAAAAAAAD/AAD///8A//7//wAAAAAAAAD//wD/AAAAAAEAAAD/AAAAAQAAAAH///8AAP8AAAEBAQEAAAAAAQEBAAEBAQD//v//AAAAAP//////AP8A/wD/AAABAAAAAAAAAQAAAAABAAAAAAAAAQAAAAECAgABAQEAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3DCv7xQAAAAAAAAAAAA/6244gAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD///+AAAAAAAAAAAEAAAABAQEBAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAP8A//8AAAAAAAAAAf8A//8AAAD/////AP///wAAAAAAAAAA/wAAAAAAAAAAAAAAAP///wAAAAABAQABAQAAAAH/////AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAP///wAAAAAAAAAAAf8A//8AAAAA/v7+/wAAAAAAAAABAAAA/wAAAAEAAAAAAP8A/wAAAAAAAAAAAP8AAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAP8AAAABAP8AAAAAAAAAAAABAAAA/wAAAAABAQEBAAAAAP///wAAAAAA/////////wABAQEBAAAAAQAAAAEA/wAAAP8AAAD/AAAAAAAAAAABAAEAAQAAAAAAAQEBAAD//wD/AAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA/+fv7+vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAAAQEBAAABAAABAAEAAAD/AAAAAAAAAQAA////AAAAAAABAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8QBAIKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIAAAAF////8A/////wAAAAAAAAD/AAAAAAEBAQAAAAABAAAAAAAAAAAAAAAA////AQD/AP////8A/////wD/AAD//////wD/AAAAAAD///8AAAAAAAD/AAAAAAAA//////////8BAAEA/wD/AAAAAAEA/wD/AAAAAQAAAAAA/wD/AP8AAP///wD///8A/////wEAAQH///8A/wD/Af///wAAAAAA/////////wD///8A////AP////8AAAAA/wD/AAAAAAAAAAAA////AAEBAQD///8A////AAAAAAD/AP8AAAAA/////wAAAAAA/wD/Af////8BAAEBAAAAAAEBAQEAAAAAAP8A/wABAAEA/wD//wD/AQEBAQEA/wABAAAAAP///wD/AP8A////AP////8AAAAAAAAA/wD/AP8AAAABAP8AAP///wAAAAD/AAAAAP///wD///8AAP8AAAAAAAD//////wD/AP////8BAAEA////AAAAAAAAAAAA/wD/AAAAAAAAAP8AAAAAAAAAAAAA/wAAAAABAP8AAAAAAAAAAQEBAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBf7+/tyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AQABAAAAAAD/AAAAAAAAAAEBAQABAQAAAAD/AAEAAQAAAAAA/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAm+/v68QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAABAAAAAAABAAABAAAAAAAAAAAAAAD//wAAAAAAAAAA/wAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///hAEAAwwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////////AAD/AAAAAAAAAAAAAP///wAAAQAAAAABAAAAAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+APtQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAAAAAAD/AP8AAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAB////AP///wAAAAD/AP8AAP///wD///8A////AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAAAQEBAP//////AP8AAAAAAAAAAAEAAAAA////AAAAAAABAAEAAAAAAAAAAAEAAAD/AQEBAAAAAP8AAAAA/////wAAAAAAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAA/wAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAAAAAAAA/wAAAAAAAAAAAAEBAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQJPAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQAAAAH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////AAEAAAAAAQD/AAAA//8AAP///wABAAAAAAAAAAAAAQD///8AAAABAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAgv7+vEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQAAAAD///8A/wD/AAEAAQEAAAAA/////wAAAP//////AAAAAP//////AP8AAAAAAP////8AAAAAAAAAAAAAAAD///8AAQABAQAAAAABAAEB/wD/AAAAAAEBAQEB//////8A/wD///////7//wAAAAD/AP8A//////8A//8A/wAAAQABAQAAAAAAAAAAAAAAAAEBAQEAAAAB//////////8AAAAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAABAAAAAP////8A/wAAAAAAAAAAAAH/////AAAAAAAAAAD//////////////wD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA//7/AAAAAAEAAAAAAQEBAQAAAAABAAEBAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAA//8A/wD/AP8AAAAAAP8A/wAAAAAAAAAA/////wD///////////8A/wD/////AAAAAQAAAAAAAAABAAAAAAEAAQAAAQABAAAAAAEBAAAAAAAAAQEAAAEBAQD//wAAAAAAAAEBAAABAQEAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/Q8AAAAAAAAAAAAAAAAA/wAAAQABAP8A//////8AAQEBAf///wAAAAAAAAAAAAEBAQEA/wD/AAAAAAEBAQH/AP8A/wD/AP///wABAAEAAAAAAAABAAH/AP8AAAAAAP8A/wAAAAAAAQEBAQD/AAABAQEBAAAAAP////8A/wAAAAAAAAEAAQEAAQAB////AAAAAAAAAAAA/wD/AAAAAAABAAEAAQEBAQABAAH/////AAAAAAAAAAD/AP8A////AAEAAQD///8A/wD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP///wAAAAABAAAAAQEBAQD/////////AP///wD/AP8A/////wD/AAD/AP8AAAAAAP8A////AP8AAAAAAAAAAAD/////////AAEAAQD/////AAAAAP8A//8AAAAB/wD/AQD/AAAA/wD/AAAAAAD/AP//AP8A////AQAAAAABAQEBAQEBAQEAAQABAQEBAAAAAP///wD///8A////AP////8BAAEAAAAAAP//AAABAAAAAAAAAP///wABAQEAAAABAP7+/wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAD4MAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBATH/////AP8AAP////8BAQEA////AAAAAAEAAAAA////AAAAAAEAAAAA//////////8AAAAB//////////8A/wAAAP8A/wABAAD/AP8A////AAD/AAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAP//AP8AAAEAAQAAAAAAAAD/AAAAAP//////////AAEAAP///wD///8AAP8A//8A/wD///8A/wD/AAD/AP8AAAABAAAAAQEBAQEA/wAAAQEBAP////8AAAAAAP8AAQAAAAD///8AAAAAAP///wAAAAAA/////wABAAAA/wD/AAAAAP///wAAAAABAQEBAAAAAAABAAEAAAAAAQAAAAAA/wAAAAAAAP///wAA/wD/////AP////8AAAABAAAA//////8AAAAA////AAEAAQH///8AAP8AAAABAAAAAAAA/wD/AAAAAAE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A/wABAAEAAAEAAf///wAQEBAAXFtfAA4PDwAAAAAA////AAAAAAABAQEAAAAAAMvLyQDCxMD/+Pj4AQAAAAEAAAAAAAAAAAEAAQAAAAAAAAEAAP/+/wAAAAAAAAAAAAAAAAD/////AQEBAQAAAAEAAAAA/////wAAAAABAQEBAP8AAAABAAD/////AQEBAQD/AAD/Af8AAQEBAP///wABAAEA/////wAAAAEBAQEB////AAD/AP//AP8A2NnXANjY1wA9PUAAPj0/AP///wABAQEA////AAEBAQAWFhcAW1tfAKWloQHw8fD/AAAAAQAAAAD//v//AAEAAQAAAAAA/wAA/wH/AAAAAP////8AAQEBAQEAAQH/AP8AAP8AAAEBAQD/AP//AP8AAQEBAQD/////AAEBAQABAQAAAQEAAAICAAABAgABAgIAAAECAAABAgABAQEAAAEBAAAAAAAAAAEAAQAAAAAAAAAAAAAAAgAAAP8AAAAAAAAAAAAAAAEA/wAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAf8A/wAAAAAA////AAEAAQD///8AAAAAABAQEABaWV4ADg4PAP///wD///8AAAAAAAAAAAD4+PgApKWhALq7uP/4+PgBAP8AAAD/AP//AP8A////AP////////////7/AAABAAAAAAABAAAAAQAAAAAAAAAA//////////8BAAEAAAEAAQAAAAD///8AAQEBAP////8AAQABAAAAAAABAAEA/wD///7/AAD/AAAAAAAAAAAAAAD/AP///v//AP8AAAAAAAAA/wAAAP8AAAABAADDxMAAq6ypAPDx8AD///8AAAAAAP///wAAAAAADw4PAFtaXgAPDhAAAAAA/wABAAEAAQABAAAAAP////8AAAAAAP8A/wD/AAEAAAAB/wD//////wAA/wD/AAEAAf////8BAAEBAAAAAP///wAAAAAB/wAAAAEAAQAAAQEAAAECAAECAgAAAQMAAAIDAAACAwABAwMAAQIDAAEDBAAAAwMAAQMDAAEEAwABAwMAAAMDAAAEAwABAwMAAQMDAAADBAAAAgQAAQMDAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wEAAQAAAQAAAAAAAP8A/wAAAAD/BwcHAFJSVQAPDw8A////AAD/AAD///8A////APDw8ACcnZn/4uLhAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAAABAAAAAAD/AAAAAQAAAAAA/////wAAAQABAAAAAQAAAAEAAAAAAP8A/wAAAAEAAAD//wD/AAEBAQEBAAEA////AAD/AAD/AP8AAQEBAAAAAAD///8AAAAAAAAAAAEAAAAAAAEAAAABAAEBAQEAAQEBAAD/AAAAAAAA2trYAKWlof/w8PAA////AP///wD///8A/v/+AA4ODwBUU1YBCAcIAQD/AP8A/wD/AAAAAAABAAEAAAAAAAAAAQAAAP8AAAAAAP8AAAAAAAAAAAAAAP8AAAABAAH/AP8AAAEAAAAAAAAAAAAAAQABAAABAQAAAQEAAAEBAAABAgAAAgIAAAICAAADAgAAAgMAAAMDAAACAwABAwQAAAMEAAACBAABAwQAAAMEAAECBAAAAwQAAAMEAAEDAwAAAwQAAAIDAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAAD/AAAAAAABSktNABYVFwD///8A////AP8A/wD///8A6enoAKWnogDx8fAB////AAAAAAEAAAD/AP8AAAABAAEAAAAA/wD//wAAAAAAAAD//wD/AAAAAAD///8AAAAAAQAAAAD///8AAAAAAAAAAAD///8A/wD/AAAAAAD///8A//////7//v//////AAAAAAABAAABAAEB////AAAAAAAAAAD/AAAAAAAAAAAAAAAB//7//wD/AAD///8A////AP////8A/wAA/wD///Hx8QGlpqIA6enoAP///wD///8AAAAAAP///wAVFRYAQkJFAAAAAAEAAAABAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAQAAAAAAAAABAAAA/wD/AAAA/wAAAP8AAAAAAAD//////wEAAAAAAQAAAAEAAQEBAP8BAgAAAgIAAAICAAEBAwAAAgIAAQIDAAADAwAAAgIAAAICAAACAgD/AgIAAAICAAACAgABAgIAAQICAAECAwABAgIAAAIDAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAP///////v///////wAAAAA8Oz4AJiQnAP///wAAAAAAAAEAAAD/AADp6ugApaai//Dv7wAAAAAA/wD/////////AP8A////////////////AQABAf//////AP8BAQABAP8A/wABAAEAAAAAAP////8BAAEAAAAAAAAAAAD/AP8AAQABAf8A//8BAQEBAQABAQEAAQEAAAAB/wD/AP/+////AP8AAAAAAAAAAAAAAAABAAAAAQAAAAD/////AQEBAf8A/wD/////AAAAAAABAAEAAQAAAQABAQAAAADx8fAApqejAOnp6QAAAAAA//7/AP8A/wAAAAAALi0vADw7PgAAAAAAAAAAAP//////AP8AAAAAAAEBAQH/AP8A/wD/AAAAAAAAAAAAAAAAAf////8AAAAAAAAAAP8A//8BAQEBAAAAAP8BAAAAAQEAAAEBAAEBAQAAAQEAAAECAAACAQAAAQIA/wECAAABAgABAgMAAAEDAAABAwABAgMAAAEDAAEBAwAAAgMAAAIDAP8BAgAAAQIAAAECAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAAAA//////8A/wD/AP8A/wD/AAD/AP//AP8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAAB/wD/AAABAAEA/wAAAP8AAAEBAQEAAQABAP8AAB0dHgA7Oz0A////AAAAAAD/AP8A//7/APDx8ACtrav/+Pn4AQABAP//AP8AAAAAAQAAAAAAAAABAAEAAAEAAQEAAAAAAAAAAAAAAAAA/wAA/////wD/AAAAAAAA/wD/AAAAAAH/AP8A////AP///wAPDhAAJCQl/y0sLgAsLC0AHR0eAA4OD//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AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AP8A/wD/AP//AAAAAf//////AP//AAAAAP///wABAAEAAP8AAP//////AP8AAP8AAAAAAAEAAAAA//////////9KSEwAAAAAAP///wD///8AAAAAAPLy8QDExcL///////8A/wD/AP///wD/AAAAAP//AP8A/////wAAAAD/AP8A////AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAQgJCAFYV1sAHRweAAD/AAD///8AAAAAAP///wAA/wAA////AP///wAAAAAA/v/+AP/+/wAAAAAA/wD/AP///gD///8AJCQlAFhXWwEHBwcAAP8AAAAAAAAA/wAA//////8A//8AAAAAAAAAAAABAAD/////AAAAAAD/AP////8BAQABAP8A/wD///8AAQABAMXGwwDo6ekAAAAAAP///wD///8AAP8AADs7PQAAAQABAAAAAAAAAAAAAAABAP8AAP////////8AAAAAAP////8AAAAA////AP///wD/////AAAAAAAAAAAAAAAAAAEAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAABAQD/AAAAAMQIJQIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAR4eHwEcHB0A////AP8A/wD///8A////AKeopAAAAQABAAAAAQAAAAAAAAABAAAAAAD/AAAA/wD/AAEAAf///wAA/wAAAAAAAAD/AAAA/wD//////wAAAAAAAAAAAP8AAEFAQwAUFRUA/wD/AP///wD///8A//7/AP8A/wD///8A/wD/AP///wD///8AAP8AAP///wD///8A//7/AP8AAAAAAP8A/wAAABUWFgBBQUQAAAAAAAAAAAEAAAABAAEAAQAAAAAA/wAA/wD/AP/+/wAAAAAA/wD/AAABAAAAAAAA/wD/AAD/AAAA/wD//////wAAAAC+vrsA////AP///wD/AP8AAAAAABwbHQAdHB4AAP8AAAD/AAAA/wD/////AAAAAAEAAQAAAQEBAQAAAAEA/wD/AAAAAAD/AAAAAAABAQAAAAAAAAAA/wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP////////7//v8A/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA////AAAAAAD///8A/////zo5PAD///8A/wD/AP/+/wAAAAAA1NTSAPHx8QAA/wD/AAAAAAD/AAAA/wAAAP8AAP8A/wH/AP8AAP8A/wAAAP//AP8AAAAA//8A//8AAAABAAAAAQEAAQD/////Kyst/ysrLQD///8A//7/AAAAAAD///8A/wD/AP///wD/AP8AAP8AAP///wD///8A/wD/AAAAAAD//v8AAAAAAP/+/wD+//8A//7/AAD/AAAsKy0ANDM1AQD/AP//AP8A/////wAAAAEAAAAAAP8AAP8A/wAAAAABAP8A/wD/AAEAAAAAAP8AAP8A//8AAAABAAEAAQD/AADi4+H/09TR/////wD//v8A////AAAA/wA6OjwAAAAAAAAAAAAAAAABAAAAAAAAAAAA/wAA////AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8AAAABAQAAAQEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEAAQABAQEAAQH/AP8A/wD//wAAAAD/AP//AP8AAAAAAAAAAAAA////AP///wD///8AAQEBAQAAAAABAAEAFhUXABwdHQAAAAAAAP8AAP8AAAD+//4AxcbEAAABAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEBAAAAAAAAAAEBAAEBAAEAAQD/AAD/AP8AAAAAAP///wAPDxABOjo7AQD/AAAA/wAA/wD/AP///wAAAAAAAP8AAP///wAA/wAA////AAAAAAAAAQAAAP8AAP///wD/AP8A////AAAAAAAA/wAAAAAAAP///wD///8AOTk7AAgICAEBAAEAAQEBAQD/AAAAAAAA/wD//wEAAQAAAQAAAAAAAP//////////AAAAAAEBAQH/AP//AP8AAP8A/wABAAEBvr+9APj5+AD/AP8A/v7+AP//AAAcHB0AHB0d//////8AAAAA/wD/AP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD//////wAAAAEAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAB////AP////8A/wAAAAAAAQAAAAAA/wAA/wD///8A/wD/////AP8AAAEAAQAAAAAA////////////////MjI0Af/+/wD///8A////AAD//wDV1dMA8fDw/////wD/AP8A////AAAAAAD/AP8A////AAAAAAD/AP8A////AAAAAAD/////AP8AAAEBAQEA/wD//wD/AAAAAAAeHR4ADg4PAP8A/wD///8AAP8AAP8A/wD///8A////AAD/AAD///8A////AP///wD//v8A////AAAAAAAA/wAA/wD/AP///wD///8A////AP///wD///8ABgYHADEwMwD/////////AAABAAD/AP8AAP8AAAAAAAD//v8A////AQAAAAABAQEBAAAAAP///wAAAAAB////AAAAAAD/AP8A+fn4AdTU0wAA/wAAAAEAAP8A/wAAAAAAJSQmAQAAAAH/AP8AAAAAAAEAAQEAAAAA/wD/AP8A/wAA/wAA/wD/AAD/AP8AAAABAAAAAAAAAAAAAAAAAP8AAAAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAD//wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP////8AAAAA/wABAAEAAQAAAAAAAP///wAAAAAAAQABAQD/AAAAAQABAAAA//8A/wAA/wAAAQEBAQAAAAEHCAgBJCMlAAAAAAAAAAAA/wD/AP///wDFxsT/AAAAAQD/AAAA/wD/AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAEAAf///wABAQEB/wD/AP8A/wAAAAAAAAAAAP8A/wA4ODoA//7/AP/+/wD///8AAAAAAP/+/wD///8AAAAAAP///wD///8A////AAAAAAD/AP8A////AP7+/gAAAAAA//7/AP///wD/AP8AAAAAAP///wAAAAAA/wD/ACQlJQAAAAAAAP8A///+//8AAAAAAAEAAf8A/wAAAAAAAAEAAAABAAH///8A////AAD/AAAAAAAAAAEAAAAAAAAA/wD/AP8A/9TU0v//AP8A////AP/+/wD///8AKiosAAgICAAA/wD/AAAAAP///wD///8AAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAQAAAAAAAAD/AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAQAAAQEBAf///wAA/wAAAP8AAP8A//8AAAAB/////wAAAAAAAAAAAAAAAQD/AAAAAAAA////AAAAAAAkIyQABwcHAP///wD+//4A//7/AOPj4gDy8fEAAAAA/wAAAAAAAAAAAAEAAQAAAP8A/wAAAAEAAQD/AAAA/wD///////8A//8AAAAA/////wD/AAAAAQABAP8AABYVFgAODg8A/wD/AAABAAAAAAAA/v/+AP8A/wD/AP8A/v/+AAAAAAAAAAAA/wD/AP7//gD///8A/wD/AAAAAAD///8AAAAAAAAAAAAA/wAA/v7+AAAAAAD+//4AAP8AABQUFQAODg8A/wD/AP8A/wAA/wAAAP8AAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAQEBAevr6gHj4+IAAP8AAP8A/wAA/wAABwYHACMjJAAAAAAB/////wABAAAAAAD/AP8AAP8A/wAA/wAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA////AAEAAQD/AP8AAAAAAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAAAAAAAAAD//wD/AAAAAAAjIyUA////AP///wD///8AAAAAANTV0/8AAAABAAAAAQAAAAAAAAABAAAAAP8A/wH/AP//AP8AAAAAAAAAAAABAQABAQEAAQH+//7/AQABAAAAAAAA/wAAAAAAABQUFQD//v8AAP8AAP/+/wD///8AAP8AAAD/AAAAAAAAAP8AAP7//gD+//4AAP8AAAAAAAD///8AAP8AAP///gD+//4A////AP8A/wD///8AAQEBAP///wAA/wAA/v/+AAD/AAAdHR0BAAAAAAEAAQH/AP//AAAAAAD/AAAA/wAA/wD//wAAAAD/AP//AAAAAAAAAP8AAAAA/wD//wAAAAAAAAAB/v/+/wAAAADb29oA////AAD/AAD///8A/v/+ABwcHgAAAAAAAAAAAP//////AP8B/wD/AAEAAQEAAAAAAAAAAP8A//8AAAAAAAAAAAAAAAAAAAAA//8AAAD/AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wABAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP8A/wABAAEAAAAAAAEBAQD/AP8BAAAAAAD/AAD/AP//AP8AAP8A/wAAAAABAAAAAP////8cGx0A/wD/AP///wABAAEA////AOPj4gD/AP8AAAAAAP8A/wD/AP8A//7//wAAAP8AAAABAAEAAP8A/wD/AP///wD/AAAAAAAAAAAB////AP8A////////AAAAABUVFwD/AP8A/wD/AP8A/wD/AP8A////AP8A/wD///8A////AAD/AAABAAAAAAAAAP///wD///8A////AP//AAAA/wAA////AP///wD///8A/v7+AP///wD/AP8AAP8AAP///wAVFBYAAQABAf8A/wABAAEB/wD/AAAAAAD/////AAAAAQABAAABAAEB/wD/AAAAAAH/////AAAAAf//////////AAAAAf8A/wDV1dP//wD/AP8A/wD/AP8AAP8AACMiJAAAAAAAAQABAQAAAAEBAAEAAQABAP8A/wD/AP8A/////wAAAAEAAAAA/wAAAAEAAAAAAAAAAQEAAAABAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/////wAAAAD///8A////AP/+//8A/wD//////////wAAAAAB/wD/AAD/AP////8AAP8A/xUVFQEGBwYAAP8AAAAAAAD///8A5OTiAPLz8QEA/wAA/wD/AAAAAAAAAAAAAQEBAQEAAQEAAAAA////AAD/AP8A/wABAP8A//////8AAAD/AAAAAQD/AAEAAQAB////AAcHBwD///8A////AP///wD///8A/wD/AP///wAA/wAA/wD/AAAAAAD+/v8A////AP///wAA/wAA////AAAAAAD/AP8A////AAD/AAD/AP8AAAEAAAAAAAD///8AAAAAAAAAAAAGBwcA/////wAAAAAAAAAAAQABAP8A/wAAAAABAAAAAP///wD///8AAP8AAP8A/wAAAAABAP8A/wEBAQEAAQABAAAAAAD/AP/5+fkB4+LiAP///wD//v8A/wD/AAYHBgAUFBX//v/+//////////8A/wD/AAD/AP8A/wD/AAEAAAEAAQD///8AAQAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAQD/AP//AP//AAAA/wAAAAEAAQAB/wD/AAAAAAAA/wAAAP8AAAAAAAEBAQEAAAEAARwcHf////8A////AP7//gD/AP8A6urqAAAAAAAAAAAAAP8AAAD/AAAA/wAA////AP////8A/wAAAAAAAAABAAEAAAD/AAEAAQAAAAEAAAABAAAA/wABAAAA/wAAAAAAAP///wAA/wAAAAAAAP///wAAAAAAAP8AAP///wD+//8AAP8AAP7//gAAAP8A////AP///wAAAAAA/wD/AP///wAAAAAAAAAAAP7//gAA/wAA//7/AP7//gAA/wAA/v//AP7//gD///8AAAAAAQD/AAD/AP8A////AAD/AP8AAQAAAP8AAP////8AAAD//wD///////8AAAAA/wD/Af8A/wAA/wAAAQABAAAAAAEAAAAA4+TjAAD/AAAAAAAAAP8AAAD/AAAcHB0BAQABAQEAAQEAAAAAAP8AAAAAAAEAAAABAAAAAf8A/wAAAAD//wAAAAAAAAAAAQAAAAAAAAD/AAD/AAAAAAEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAAAAAAEBAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wD////////+//7//////xQUFgEAAAAA////AAAAAAD//v8A3N3bAP///wD/AP//AAAA//8A/wAAAAAA/wD/AP8A/wAAAAAAAP8AAAD/AAAAAAABAP8AAP8A/wAA/wD/AAAAAQD/AAAAAAAA/wD//wAAAAD/AP8A////AAD/AAD///8A////AAD/AAAAAP8A////AAD/AAD+//8A/v/+AAD/AAD///8AAP8AAP///wD//v8A////AAD/AAD///8A/v/+AAAAAAD///8AAP//AAD/AAAA//8A/wD///8A//8A/wD/AAAAAAAAAAEA/wAA/wD//wAAAAH/AP8AAQABAQEAAQEAAAAAAQABAP///wAAAAAA////AAAAAAAAAAAA5OTi/wAAAAD///8A/wD/AP///wAVFBUA/wD//wEBAQD/AP8AAAAAAAAAAAAAAAAA//////////8AAAABAAAAAAAAAAAAAAAA//8AAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wD/AQEAAQAAAAAAAAAAAQAAAAD/////AAEAAf8A/wABAAEBAQABAP8A//8BAAEBAAAAAA4ODwD//v8AAAEAAAD/AAAAAAAA6+vrAAAAAAAAAAAB/////wAAAP8AAQABAQABAAAAAAH/AP8AAQABAAAAAAD/AP8AAAAAAAD/AP//Af8BAQEBAP/+//8BAQEBAAAAAfLx8QD///8AAQABAP///wAAAAAAAP8AAAABAAAA/gAAAAEAAAAAAAAA/wAAAAEAAP///wAAAQAAAQABAP///wABAQEA/wD/AAAAAAABAAEAAAAAAP///wAA/wAAAAAAAAABAADx8vEAAQABAf////8AAQAB/wD/AAAAAAAAAAD/AAAAAQEAAQD/AP8B/wD/AAEAAQD/////AAEAAAEAAQH/AP8AAP8A/wABAAEA/wD/6uvpAP7//gAA/wAAAAAAAAAAAAAUFRYAAP8AAP8A/wABAAEA/wD/AAEAAQD/////AQEBAQAAAAD/AP8AAQAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wD///8A//////////8AAAABAAAA/wAAAAAAAAAA/wD/AAABAAD/AP8A/////xQUFAD/AP8A////AP///wD4+PgA+Pj3/wAAAAAAAAAAAAEAAQABAAH/AP8A/////wAAAAAAAAAA/wD/AP////8AAAAAAP8A/wABAAEAAAAA/////wABAAD/AP8AAAAAAPHy8QAA/wAA////AP8A/wAA/wAAAAAAAAD/AAD/AP8A////AP///wD///8A////AP8A/wAA/wAA/v/+AAAAAAD+//4AAP8AAP///wD///8A////AP///wD/AP8A/wD/AP///wDr6+oA/wD/AAABAAH/AP8AAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAP////8BAQEBAP8AAf8A/wAAAAAAAAEAAQAAAAABAQEB+fj5APLy8QD/AP8AAP8AAP///wANDQ0AAAEAAf8A/wAAAAAAAP8A/////wAAAAAA/wD/AP8A/wAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wD/AAD/AAAAAQAAAAAAAQABAAEAAQAAAP8AAQD/AAD/AP8A/////wD/AAEA/wAAAAEAAQYGBwAA/wAAAP8AAAAAAADx8fEAAAEAAQAAAAD/////AAAAAAD/AAAA/wAAAAEAAf8A/wABAAEAAP8AAAABAAEAAAAAAAEAAQAAAAAAAAAAAAAAAQAAAAEA/wAAAP8AAN3d2/////8A/wD/AAD/AAD///8A/v/+AP8A/wAA/wAAAP8AAAD/AAD/AP8AAP8AAAD/AAD///8A////AP///wAA/wAA///+AAD/AAD///8A////AAAAAAAA/wAAAP8AAAD/AADr6+sAAAAAAP////8AAAAAAAAA/wD/AAAA/wAAAP8A/wAAAAAAAAAAAP8AAAABAAH//////wD//wAAAAD/////AAAAAAD/AP////8AAAAAAfj3+AAA/wAA////AP//AAAGBgYABwYIAAD/AP8AAAAAAAAAAQAAAP8AAAAB//////////8AAAD/AAAAAAAAAAAAAAAAAP//AAD//wD/AP8AAP//AAD/AAABAAAAAP8AAAAAAAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////v///wD/AAD/AAAA/wD/AAAAAAAAAAD/////AQABAQAAAAAAAQAADg4OAAD//wD+//4A////AP///wD5+fgAAQABAP/+//8BAAEA/////wABAAAAAAAA////AAD/AAD//////wD//wD/AAAA/wAAAP8AAP//////////////AP///wAAAAD/AAAAAPn5+QHk5OMA////AP///wD/AP8AAAABAP/+/wD///8AAAAAAP///wAA/wAA////AP8A/wD///8A////AP///wD/AP8A/wAAAP///wD///8AAP8AAP/+/wD///8A/wD/AOvs6gDy8/EA/////wEAAQH/////AAAAAQAAAAAAAQAAAAAAAQAAAAEA/wAAAAAAAP///wAAAAABAAAAAAD/AAABAAEBAAAAAAAAAAH/AP8A/wD//+vs6gAAAAAA////AAAA/wAA/wAABgcGAAAAAAH///8AAAAAAAAAAAH/AP8AAQABAAEAAQAAAAABAAAAAAAA/wAAAAAAAAAAAAAAAAABAAAA/wAAAAAA/wD///8A///+AAD//gD///8AAP//AP///wAA//8AAP//AP///wD///8AAP//AAD//wAB//8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAEBAQEBAAAAAP8A/wD/AP8AAAAAAP8A//8AAAAB/wD/AAAAAAD/////BgYHAP///wAAAAAA/wD/AP///wDy8vEA////AAABAAEAAAABAAAAAf/+////AP8AAQEBAP8A/wD/AP8BAQABAf8A/wD/AP///wD/AAAAAAEAAAABAQABAAAAAAAAAAAB/wD/AP8A/wDc3dsAAP8AAAAAAAD//v8AAP//AP8AAAAAAAAA/v/+AAAAAAAAAAAA////AAD/AAD/AP8AAAAAAP8A/wAA/wAAAP8AAP///wD/AP8A/wD/AAABAAD/AP8AAP8AAM/PzQAA/wAAAQABAQAAAAABAAEBAP8AAAAAAAD//////wD/////////AP8A/wD/AAAAAP8AAAAAAQABAf8A/wD/AP//////AAABAAAAAAD/AAAAAf///wD+/v4A////AP///wD/AP8A////////////AP///wD/AP8A/wAAAAAA/wD/Af8A/wEAAAAA/wD/AAD/AAAAAP8AAP//AAH//wAA//4AAP/+AAD//wAA2q0XmAAAIABJREFU//4AAP//AP///wAB//4A///+AAH//wD///8A////AAD//wAB//8A///+AP///gD///8AAP/+AAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA////AAABAAAAAAAAAQABAP///wAAAAD/AAEAAAAAAAEAAAAAAP8AAAAAAAAAAQAA/wD/AAD/AAEHBgcAAAAAAP///wABAAAAAAABAAD/AP//AP8BAAAAAAAAAAAA/wD/AAEAAQD/AP//AP8BAAAAAAAAAP8AAAABAQABAP8A/wEBAAEAAAAAAP////8AAQABAAAAAP////8AAQABAP8AANfY1QAwMDIADg4OAAAAAAD///8AAAAAAP4A/wABAAEA/wD/AAAA/wAAAAEA/v/+AAAAAAABAAEA/wD/AP8A/wABAQEA/wD/AAH/AQD/AP8AAP8AAAAAAADx8/EA1tfVAAAAAAAA/wD/AAAAAQABAAABAAEA/wD/AAD/AAABAQEB/wD/AAAAAAAA/wD/AAEAAf////8AAQABAAAAAAEAAQH/AP8A//7/AAABAAEBAAEAAAAAAAAAAAAAAAAAAP8AAAAAAAAODg8B8/PyAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8A//8B/wF8yScAAAEAAAEAAAABAQEAAQD/AAABAAABAAEAAQD/AAABAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAApwAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//////wABAAAAAQABAAAAAQAAAAD///8A/wD/AAEBAQAA/wAAAAAAAP8A//8AAP8A////AAD/AAD//wAA////AP8AAAEAAAAAAAAAAP8A/wD/AP8AAP8A/wAAAAEA/wD/AP8A/wD/AAH///8AAAAAAAD/AP////8A/wD/AAAAAAH///8AAQABAP8A/wAAAAAAAAAA//n5+QDDw8AA////AP///wD+//4A/wD/AAD/AAD///8A/wD/AP8AAAD+//4A////AAD/AAD///8AAP8AAAAAAAD//v8AAAAAAP///wAA/wAA////AP8A/wDIycX/AAAAAAAAAAD/AP8AAAAAAAD/AP//////AAAAAAEBAQH/////AAAAAAD/AAAAAAABAAAAAAEBAQEA/wAAAAAAAP8A/wD/////AAAA/wD/AP/+//7//////////wD+//4A////AP///wAA/wAAAP8A/wEBAQAA/wAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQEAAQAAAAEBAAABAf8AAQEAAAMBAAADAv8AAwIAAAMCAAAEAgAABAIAAAMCAAADAgAAAwL/AAMDAQADAgAAAwIAAAMC/wADAgAAAwIAAAQCAAADAf8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAAEAAQD/AAAA/wAA////////////AP//AQABAf///wAAAAAAAP8AAAAAAAD4+PkA/wD/AP8A/wD/AP8A/wD/AAAA/wAA/wAAAP8AAAD/AAA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AAAAAAAAAAAAAAP////8AAAAAAAAAAAD/AAD/AP8A/////////wAAAAABAAEAAQAAAP//AP8A/wD/AAD/AP//AP8AAQABAP8A/wD//////////wAAAAEA/wAAAAAAAf8A/wD//////wD//wD/AAD//////wD/AP///wAAAAAAAP8AAAEAAQAA/wAB/////wAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAABAAAAAP//////AP8AAQEBAQEAAQAA/wAAAAAAAP8A/wD///8AAAEAAQEAAQEA/wAAAAEAAQAAAAEaGhwAAAAAAP///wD///8AAP8AAOXm5AD/AP8AAAAAAAAAAAEA/wAAAP8A/wD/AP8AAAAAAAEAAf8A/wABAAEAAQAAAAEAAAABAAAAAQH/AAEA/wACAf8AAgEAAAIBAAACAgAAAgEAAAMB/wADAQAAAwEBAAMCAQADAf8AAwH/AAMB/wADAgAAAgEAAAIC/wACAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAA/wAAAAAAAP///wAA/wAAAQABAQAAAAEAAAAAAAEAAAD/AAD/////AAAAAP////8AAAAB5ublAAAAAAD///8AAP8AAAAAAAAgICIA/////wEAAQAA/wAA/wD//wAAAAEA/wAAAP8AAAABAAEAAAAAAP8AAP8A//8A/wAAAQABAQEAAQEAAQAAAAAAAAAAAAEBAAEBAP8AAP8A/wD/////////AAAAAAD/AP8AAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAABAAAAAAAAAAEBAQEBAQABAAAAAAAA/wD/AAAAAP7//v8AAQAAAAAAAf////8AAAAAAQEBAQAAAAEAAAAAAAAAAQD/AAD/AP//AP8AAAABAAAA/wAA//////////8AAAAAAAAAAP////8BAAEBAP8A/////wAAAQAAAAAAAP////8ZGRoA////AP///wD///8A/wD/AOzs6/8A/wAA/////wAAAAD/AP8AAAAAAQABAAH/////AP8AAAD/AAAAAP8AAAD/AAEA/wAAAAAAAQABAAEBAAABAQAAAQH/AAIB/wACAAAAAQIBAAEBAQABAQAAAQH/AAEB/wACAQAAAQEAAAEBAAABAQAAAQEAAAIAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wAA/wAAAP8A//8A/wABAQEB////AAEAAQEAAAAA+fn5AOTm4wD/AAAA/v/+AP///wAGBgYAGxocAf8A/wD/AP//AAAAAP////8AAQAAAAEAAP///wAA/wAA/wD//wAAAAEAAAAAAAAAAAAAAAD/////AP8AAAD/AAD/AP8AAAAAAAAAAAABAAEB/wD/AP///wABAAEBAAEAAP8A//8A/wAAAAAAAAD/AAD/AP8AAAAAAP8A/wAA/wAA/v/+//8A////AP8AAAAA/wEBAQEA/wAAAAAAAAEAAQH///8A////AAAAAAD//////wD/AAAAAAAAAAAB/////wD/AAH/AP8AAQEBAQAAAAEAAQAAAP8AAAEAAQEAAAAA/wD/Af8A//////8A/////xoaGwENDA0A////AAABAAAAAAAA5ublAPr5+gEAAQAAAAAAAAAAAAABAAEB/wD//////wABAAEBAAAAAAABAAAAAAAAAAABAAABAQABAQAAAAEAAAEBAAABAAAAAQABAAAAAAAAAAAAAgAAAAEAAAABAAAAAQAAAAEAAQAAAAAAAQAAAAEAAQABAAAAAQEBAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8A/wD//////wD/AP8A/wAAAAABAAAAAAAAAAD/AP8A////AAAAAAD///8AAAAAAP8A/wD/AP8A/wD//+fm5gAAAP8AAAAAAP///wD//v8AICAhAAD/AAAAAAAAAAAAAQAAAAH/////////AAEBAQD/AP8AAP8AAAAAAAD/AP8A/wD///8A/wAAAAAB/wD/AAAAAAAAAAAA/wD/AAAAAAH/AP8AAAAAAAEAAQD/AP8A////AAAAAAH/AP8A/wD/AP////8BAAEAAQABAQD/AP//AP//AAAAAQD/AAAA/wAA/wD/AQD/AAD//////wD///8A/wAAAAAAAAAAAP8A/wAAAAABAAAAAP8A/wABAAEAAAEAAQAAAAAAAAAAAP8AAP///////v///wD/AAAAAAD/////AAAAAAAAAAEAAAAAAP8AACcmKQD///8AAP8AAP/+/wD//v8A39/dAP////////8AAP8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AAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8AAAAAAAD/AAAAAQABAQABAf////8A/wAA09PS//n5+AD+//4AAAAAAAD/AAAFBAUAMjIzAQAAAAAAAAAA/wD/AAAAAP////8AAAAAAAABAAEMDQ0AS0pOAEtKTgAYGBkAAAAAAP8A/wD+//8A/v/+AP/+/wD///8AAP8AAP8A/wD///8A////AP///wAA/wAA////AAD//wD///8AAP8AAP///wD///8A///+AAD/AAD///8A////AAD/AAAA/wAA////AAD/AAAA/wAAAAAAAP///wAA/wAA////AP///wAZGRoATEpPAD8+QQAMDQwAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAACwrLgELCw0AAAAAAP///wAA//8A8/PyAODh4AEA/wAAAAAAAAD/AP//////AAAAAAEAAQD+/v7/AP8AAQD/AP8AAAAAAAAAAP8A/wAA/wAAAAD/AAAAAQAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/wD//wD/AAAAAAAAAQABAf8A//8AAAD/////AP8A/wAAAAAAAP8AAAAAAAAA/wAAAAAAAAEBAQEBAQEA+vr5AM3OzQAA/wAA////AP8A/wD///8ALCouABgYGf//AP8BAP8AAP///wEAAAAA/////ywrLQBSUFQAGRkaAAAAAAAA/wAA////AP/+/wAAAP8AAAAAAP///wAAAAAA/wD/AP/+/wAAAAAAAAAAAP8A/wD/AP8AAAAAAP8AAAAAAAAA/wD/AP8A/wD///8AAAAAAP///wAA/wAA////AP8A/wD/AP8A////AP///wD/AP8A/v7+AAAAAAD///8A////AAD/AAD///8A////ACQkJwBRUFQAJSQnAP////8AAQAA/////////wAA/wAAGRgaACorLAAA//8A////AAAAAAD/AAAAzc7MAPPz8v//AP8AAP8AAAAAAAEBAAEBAP8AAP8A/wAAAAABAAAAAP8A/wAA/wAA////AAD/AAAAAAAAAAABAAAA/wAAAAAAAP//AAABAAAAAAAAAAABAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/AP8A/wD/AP///wD/AP/////+//4AAAAAANTU0QDs7uwA////AP///wD///8A/wD/AD8+QQEGBgf//wD/AAAAAP//AP8AODc7ATc2OgAFBgYAAP8AAP///wD/AP8A//7/AP8A/wD///8A////AP8A/wD///8A////AP8A/wD///8AAAAAAP/+/wD+/v4A////AP///wD///8A////AP/+/wAAAAAA////AP8A/wD/AP8AAAAAAP///wD///8AAAAAAP///wD///8AAAAAAP///wD/AP8AAP8AAP8A/wD///8A/wD/AAAA/wAFBQYAPj5AADIxNAEAAAAAAAAAAQAAAAAMDAz/Pj5AAAEAAQD/AP8A////AP///wDz8vIA2trYAAEAAQEAAAAA/wD///8A/wD/AP///wD/AAAAAAEAAAAA/wD//wEBAQH/AP8AAQEBAP8A/wAAAAAAAAAAAAAAAQAAAQEAAAEAAAD/AAAAAAAAAAD/AAD/AAAAAP8AAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD//////wD/AAEAAQEA/wD/AAAAAAAAAAAAAAABAAAAAAD/AAAAAAAAAAAAAQEAAQDIx8X/AAAAAP///wD/AP8A////AAsLDABFQ0cBAP8A/wAAAAE+PUEALCwtAP8A/wD///8A/v/+AAD/AAAA/wAA/wD/AAAAAAAA/wAA////AAD//wD///8A////AAD/AAAA/wAA////AAAAAAABAAEA////AP///wD///8AAP8AAAAAAAD///8A////AP///wD///8AAAAAAP///wAA/wAAAP8AAAAAAAAA/wAA////AAAAAAD///8A/wD/AP///wD///8A////AP///wD///8A////ADIxNAA9PUAAAP8AAAAAAAA3NzkBDAwNAP7//gD///8A////AP///wC0trIAAQEBAP8A/wAAAAD/AP8AAAD/AP8AAAABAP8AAAAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAAAAAAAAAAAAAAA/wAA//8AAAABAAAAAAAA/wAAAAABAAABAAAAAAEAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQABAP8A/wAA/wAA/wD/AAABAAAA/wABAAAAAP8A//8AAAABAP8AAP8A/wABAQEAAAAAAAAAAAD/////AQABAP8A/wDn5+YA09PR/ywsLgEAAAAAAAAAAAAAAAAXGBgAMjI0AQYGBgAlJSYA//7+AAABAQAAAAAAAAAAAP///wAAAQAAAAAAAP///wAAAAAAAAAAAP7//wABAQEAAAAAAP///gAAAAAAAAABAAAAAAD///8AAQEAAAAAAQAAAAAA/wD/AAAAAAAAAP8AAAABAAD//wAAAQEA//7+AAAAAQD/AP4AAAEAAAD/AQAAAP8AAAEBAP///gAAAAAAAAABAAAA/wD//wAAAQEBAAAAAAAAAAAAAAD/AP8AAAAlJCYA+fn4APr6+wAfHyEA////AP///wABAQEAAAAAAM/PzADz8/IAAQEBAAAAAAAAAAABAAEAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAf////8AAAD/AQABAAABAAEAAQEAAAD/AAAAAQAAAf8AAAAAAAAAAAAAAQAAAAAAAAD//wAAAQEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQAA/wAAAAD/AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAH/AQAAAAAA/gD+AAAAAP8BAQEB////AAEAAQD/AP8AAQEBAAAAAAEAAAAA/////wAAAAH///8AAQABAAAAAAABAQEBAP8AAP8A/wABAQEAycrHABgYGQATExQAAAAAAAAAAAAAAAAAMDAyAAAAAAD///8AAAAAAAH//wD/AAAA////AAEBAQAA/gAAAAEAAP///wACAQEA/wAAAAAAAAD///8AAAAAAAAAAAD///8AAgAAAP7//wABAQEA//4AAAEB/wD//wAAAAEAAAAAAAAAAAAAAAD/AAEAAAD///8AAAAAAAAA/wAAAAAAAP8AAAD//wAAAQAAAP7/AAEBAAD//wAAAAH/AAEAAAABAAAA//7/AAEBAAAAAAAA//8AAAEB/wD//wAAKyotAAAAAAAA//8A/v//AAEBAQD//v8A9PX0AM7PzQABAQEA/////wEAAQH/AP//AAAAAAAAAAABAQEB/////wAAAAEBAAEAAAAAAAAAAAABAAEBAAEAAP////8A//8BAAEAAAAAAAAA/wAAAP//AAABAQAAAP8AAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAQEBAAAAAAH/////AQABAAD/AAAAAAAAAP8AAAD/AAD///8AAAAAAQEAAQAAAAAA/wD///8A/wH///8A/wD/AAD/AP//////////ALy9ugDz8/MA////AP///wD///8A////AP///wAA//8AAAAAAP7//wD///8AAAAAAAD//wD/AP8A////AAEAAAD//wAA////AAD//wD///8A////AP///wABAQEA/v//AAAAAAAAAAAAAAEAAP///wD/AP8A////AAD/AAD///8A////AP7//wAAAAAA//7/AP///wD///8A////AP8A/wD///8A/wD/AP7//wD/AP8A////AP7//wD+//8A/wD/AP7//wD+//8A/wD/AP7//wAAAQAA////AP///wD/AAAAAAAAAP///wDz9PMAtbay/////wD/////AAAAAQAAAAAAAAABAQEBAQEBAQH///8AAQEBAQEBAQD/AP//AAAAAAAAAAH/AP//////AAEAAQEAAAAAAAAAAAD//wAAAAAAAAEBAAD//wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP8AAAAAAAAAAP8A/wAAAAABAAAAAPT08wC9vboA+vn5AP///wAA//8A////AAAAAAD+//8A/v7+AP///wAAAAAAAAAAAP///wD///8A////AP8AAAD/AP8AAP//AP//AAD///8A////AP///wD+/v4AAAAAAAAAAAD///8A//7/AP///wAAAAAA////AP8A/wAAAAAA////AP///wD+/v4AAAD/AP///wAA//8AAAAAAAD//wD///8AAP8AAAAAAAD///8AAP8AAP//AAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD//wD//v8A////AP///wD//v8AAAAAAP///wC8vbkA9PTzAAAAAAAAAAAAAAAAAP8A/wAA/wD/////AP////8AAAAA////AP///wAA/wAA/////wAAAP8AAAABAQABAP8A/wAAAAAAAAAAAAAAAQAAAQAAAAD/AAABAAAAAAAAAAD/AAABAAD/AAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQH/////AAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt7ewAyMnHAAAAAAD+//8AAAAAAP///wAA/wAAAAAAAAD/AAD///8A////AP8AAAAAAAAAAAAAAP///wD//v8A/wAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA////AP///wD//v4A/wD/AP///wD///8AAAAAAP///wD//v8AAAAAAAAAAAAAAAAA/v//AP///wD/AAAAAP//AP7//wAAAAAA////AP7+/gAAAAAA/wD/AAAA/wD///8A////AP8A/wD//v4A////AP8AAAD///4AAAAAAAAAAAD/AP8A/v7+AMPEwQDu7e3/AP8AAQAAAAAAAAABAAAA/wAAAAAAAAABAP8AAAAAAAEAAAAAAP8A/wAAAAAAAAABAAAAAQAAAAEAAAD/////AAAAAAAAAAAAAAAAAAAA/wAAAAEAAP8AAAD/AAAAAAAAAAABAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAP8A//8AAAAAAQEBAQAAAAABAAEBAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAA/////wEBAQEAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAAAAAABAAAAAAAA29zZ/wAA/wE8PD8A////AP//AAABAQAAAP8AAAAAAAAA/wAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/AAAAAAAA//8AAAAAAAEAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD//v8A/wEAAAAAAAD///8AAQEBAAD/AAD///8AAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAP//AAD/AAAAAQAAAP//AAAAAAAAAAAAw8TBAN3d2wAAAAAA/wD/AAD/AP8BAQEBAAAAAf///wABAQEAAP8A/////wABAQEBAAAAAQD/AAD/AP8AAQABAP////8BAQEBAAAAAP////8AAAABAAAAAAAAAQD///8AAAEBAP8AAAD///8A////AAABAQAA/wAA/wD/AAAAAQAAAP8AAQEBAP8A/wAAAAAAAAABAAD//wAAAQEA/wAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQIB8P/+/w8AAAAAAP8AAAAAAAAAAAAA/wD/AAEAAQAAAQAA////AAAAAAAA/wAAAAAAAf///wAAAAD/AAAAAQAAAAAA/wD/AAAAAAEAAQEAAQAA/////wD/AAABAAEBAAAAAdzc2wD/AAD/PDs/AQEAAAAAAAAAAAAAAP//AAABAAAA/wAAAP8A/wAAAAEAAAD/AAAAAAABAQEA//8AAAEBAAD///8AAQABAP8AAAAAAAAAAQEAAAAAAAD/AAAAAP8AAAAA/wABAAEAAAEAAP7//wABAAEA/wD/AAAAAQABAAAAAAEAAAD/AAD/AP8AAf8BAP8A/wAAAAAA////AAEAAQD/AAAAAAD/AAH/AQAAAAAA/wD/AAEAAQAAAQAA//8AAAAA/wAB/wEAAAAAAP8A/wDFxcMA3d3bAP///wAAAAAAAQABAP8A/wEA/wAAAAAAAAAAAAD///8AAAAAAAEAAQH///8AAQABAAABAAAA/wAAAAAAAAAAAAD/////AAAAAAAAAAEAAAEAAAD/AP8AAAAAAAAA//8AAP8A/wD/AAAA/gAAAAH/AAAAAP8AAQAAAAEB/wAB/wAA/gAAAAEAAQD/AAAAAP//AAEAAAD/AP8AAP8AAP7/AAAAAAHwAAD/AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v3+8AABABAAAAAA/wD/AAAAAAABAAEAAAAAAP///wABAAEAAAAAAAEAAQD/////AAEAAQAAAP8AAAABAQABAP8A/wAAAAABAAAAAAAAAAD//v//AAEAAQAAAAD/AP8AAAAAAP8A/wDc3NoB7u3tAEJCRAAMCw0A/wD/AAEAAQD/AQEA///+AAAAAAAAAAAAAAD/AAEBAQD//v8AAAEAAP//AAD///8A/wD/AAAAAAAAAAAA//8AAAEBAQD///8AAQAAAAABAQD/AP8A//7/AAAAAAD/AP8AAQABAAAA/wD/AQAAAP8AAP///wAAAAAA/wD/AAEAAQAAAQAAAP8AAP4A/gABAQEAAAAAAP8A/wAA/wAA/wD/AP8A/wABAAEAAAAAAAD/AAD/Af8A+vr6AL6/uwDo6OcAAQABAP////8BAAEA/wH/AAEBAQD///8AAP8A/wAAAAAAAQAAAAAAAf8A//8AAAAB/wD//wD/AAEAAAAA/v/+/wEBAQEA/wD/AAEAAQAAAP//AAABAAAAAP///wD//wAA//8AAP7/AAD+/gAAAQEBAAEA/wAAAAEAAQD/AAH/AAAAAAAAAP//AAAAAQAAAP8AAAABAAAA/wAA/wEAAAAAAP7/AAD//wDwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8B/wAAAQABAAAAAAAAAAEAAAAA////AAABAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAD/7u/tAbe4tf9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AAAAAAAAAAAAAAAAAABAA4ADpAAABAQEBAAAAAAAAAAAAAAABAAEAAP///wABAQEAAAAAAAAAAAD//v8AAAEAAP8A/wD///8AAQEBAAAAAAAAAAABAAAA/wAAAAAAAAAA/////wEBAQEAAAAAAAAAAAD/AAD/AP8AAQEBAQD/AAAAAAAAAAAAAAABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAEAAf////8BAAEBAAEAAAAAAAHv7+4AAQABAP8A/wEA/wD//wD/AQEBAQAAAAABAAAAAAAAAP8A/wABAAEAAAEBAQH///8AAQABAAAAAAABAQEA////AAAAAAAAAAAA////AQEBAQD/////AQEBAAAAAAEAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAQEB/wAAAAEAAAAAAAAA/wEAAQEA/wAAAAAAAAEBAQEAAAAAAAAAAAAAAAEBAQEA/////wEAAf8AAAABAAAAAAAB/wAAAQAAAAEBAAABAQABAQEAAQIBAAACAQABAgEAAAEBAAAAAAABAAAAAAAAAAEAAQD/AP8AAQAAAAAAAAD/AAAAAAEAAAD/AAAE+QzQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8P8A/+AA/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAQAAAAAAAQAAAAABAQAAAQAAAAEAAAEBAQABAQEAAQEBAAECAQAAAQEAAQEBAAABAAABAQEAAAEBAAABAQABAgEAAQEBAAADA9CwMZDwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQEAAAABAAAAAAD/AAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAQA/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAD/AAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAPv/AbAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAQAAAAAAAAAAAAD/AAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv//4LYonLEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQAA/wAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACf4DgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4ODgAwIDgQAAAAAAAAAA//7//wAAAAAAAAAB/wD/AAAAAP////8AAAAAAP///wABAAEA////AP8A/wD/AP8A////AAAAAAH///8A////AAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAD//wD/AAAAAAH///8AAQEBAAD/AAD///8AAAAAAf8A/wD///8A/////wAAAAAAAAAB////AAAAAAAAAAAA////AP///wD/////AAAAAQAAAAEAAAAAAAAAAP///wAAAAAAAAAAAf///wABAAEAAAAA/wAAAAH///8A////AAAAAAD///8AAAAAAf////8BAAEA/wD/AAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf////8BAAEAAAAAAAAAAAEAAAAB////AP8A//8AAAAA/////wAAAAAAAAAB////AAAAAP8AAAD/AAAAAP8A/wAAAAAB/////wAAAAAAAAAAAAAAAAAAAAD/AP8AAAEAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAGgqCmY4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wABJpBsPAAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAQAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/+AB/gOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAQAAAQAAAAAAAAABAAEAAAEBAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICwKZjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrq6rD+AP6RAAAAAP///wAAAAAA/wD/AQD/AAAAAAAAAAAAAAEBAQEAAAAAAQEBAP////8AAAAAAAAAAQAAAAD/AP//AQABAf///wD/AP8AAQEBAAAAAAEA/wAAAQABAf7//v8AAAAAAAAAAf////////8A////AAAAAAEAAAAA////AAAAAP////8A////AP///wAAAAABAP8A//////8AAAAB////AP///wD/AP8BAAAA/////wD///8AAQEBAP////////8A////AP///wAAAAAAAQABAf////8AAAAAAP8AAP///wAAAAABAAAAAAEAAQAAAAAAAAAAAf///wAAAAABAAAAAP////////8AAQEBAf///wEAAQAA//////////8AAAAA////AAD/AAD///8A////AAAAAAAAAAAA////AAAAAAAA/wAAAAAAAP////8AAAD//wD/////////////AAAAAAABAAD///8AAAAAAQAAAAAAAAAA/wAAAAAAAAD/AAAAAAD/AAAAAQAAAAAAAAD/AP8AAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/v//kbUnnaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6etx//7/0AAAAAAAAQAAAAAAAP8A/wD///8AAAAAAP///wD/AP8A////AAAAAAEBAQEAAAAAAP///wAAAAAB/wD/AAAAAAAAAAD//////wAAAAD/AP8A/wD//wAAAAH///8AAQEBAAAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAEAAAAAAAAAAAEBAQABAQEA/wD/AQAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAAEA////AAAAAAEAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA/wD/AP////8AAAAAAAAA//8A//8AAAAAAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAA////AAAAAAD///8AAAAAAAAAAAH///8AAAAAAP8A/wAAAAAAAQEBAAAAAAAAAAABAAAA////////AP8A/////wAAAAEAAAABAAAAAQAAAAEBAQEB////AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAABAAAAAP8AAAEBAAAAAAAAAAAAAAEAAAD/AAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAQHQtiidcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8B/wEAAAAAAAAAAAD/AAAAAAEAAP//AAAAAAAAAAABAAAAAAABAAEAAAEAAAAAAAAAAAAAAAAAAP8A/+AE/QNRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/AP8AAAAAAAAAAAAAAAAA//8AAAAAAAABAAAAAAAAAAAAAAAAAP8AAAAAAAEAAAAAAAAA/wD/4AX+BUGwKZjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAQAAAQAAAAAAAAAAAAAAAQAAAAEAAAD/AAAAAAD/AAAAAAAAAAAAAP8AAP8AAAAAAQHQBfYNMbApmOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4ODgAAAAMRMVE5ACAQJv////AAAAAAAAAAAB////AAAAAAH///8AAAAA/wAAAAH///8AAAAAAAAAAP8AAAABAAAAAAAAAP////8BAAAAAQAAAAAAAQABAP8AAAAAAP8AAAABAQEBAAAAAAAA/wD/AAEAAP///wEAAAAAAAAAAP7+/v8BAQEAAAAAAAAAAAAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAEAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAEAAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAD/AP8AAAABAQEBAP///wAAAAAA////AAAAAAEAAAD/AAAAAQEBAQH///8AAP8AAAABAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAQEA/v7+AAEAAQAAAAAA/wD/AAEAAAABAAAAAAEAAP8A/wACAAAAAAAAAAAAAAD/AAAAAQAAAAD//5G0J5xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3r7XAA/wBhAQEB4AD/AAAAAAAAAAAAAAAAAP8AAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAEAAAAA/////wAAAAD///8AAAAAAAAAAAEAAAAA/////////wAAAQABAAAAAQAAAAD/////AAAAAAEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAH///8A//7///7+/v////8AAQEBAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA//////////8AAAAA//////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP///wAAAAAAAAEAAf7+/v8AAAD/AAAAAAAAAP//////AAAAAAAAAAH//////////wAAAP////8AAQEBAf8A/wAA/wAAAAABAAAAAAD/AP8AAP8AAAAAAQD/AAAAAAABAAAAAAACAf/wAQECUbQonXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAH+AIED9w4hsyeasAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAtpTwAAQMCAAEDAgABBAIAAgQDAAMFBPACAQKRBAAIoLAxmOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8upj0BAQMCAAMCA+D/BQOxBwIDsAQIBNCwMaDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+AwqkDQCwAL4LBBoPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaGjSVAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//OUnmzCzGNmQAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Mail.png b/arma/client/addons/phone/ui/_site/images/dark/Mail.png new file mode 100644 index 0000000..c7cf6f8 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Mail.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Mail.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Mail.png.b64 new file mode 100644 index 0000000..732df20 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Mail.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEHKmYWu6UAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4f8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf////iAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAD//wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAAAA/wAAAAEAAAAAAQEBAAD/AAAAAAD/AAAAAQAAAP8AAAABAAEAAQAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQAAAAEAAAD/AAAAAQAAAAH///8AAQABAQEBAQEAAAAAAQEBAAEBAQD//v//AQEBAAAAAAAAAQABAQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAf////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAAAADgZGRnR6Ojo2AAAAAAAS4rHFQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAAAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAABAAAA/wAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAADvEhISIsDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAQEB/wD/AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQD/AP8AAP8A/wAAAAEBAQEA/wD/AAD/AP8BAQEBAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQEAAQD///8AAAAA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAAAAAAD/AP8AAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAB////AP///wAAAAD/AP8AAP///wD///8A////AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAAAQEBAP//////AP8AAAAAAAAAAAEAAAAA////AAAAAAABAAEAAAAAAAAAAAEAAAD/AQEBAAAAAP8AAAAA/////wAAAAAAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAA/wAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQAAAAH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQAAAAD///8A/wD/AAEAAQEAAAAA/////wAAAP//////AAAAAP//////AP8AAAAAAP////8AAAAAAAAAAAAAAAD///8AAQABAQAAAAABAAEB/wD/AAAAAAEBAQEB//////8A/wD///////7//wAAAAD/AP8A//////8A//8A/wAAAQABAQAAAAAAAAAAAAAAAAEBAQEAAAAB//////////8AAAAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAABAAAAAP////8A/wAAAAAAAAAAAAH/////AAAAAAAAAAD//////////////wD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA//7/AAAAAAEAAAAAAQEBAQAAAAABAAEBAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAA//8A/wD/AP8AAAAAAP8A/wAAAAAAAAAA/////wD///////////8A/wD/////AAAAAQAAAAAAAAABAAAAAAEAAQAAAQAB/////wAAAP8AAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD/AP////8AAAAA6+vrIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/Q8AAAAAAAAAAAAAAAAA/wAAAQABAP8A//////8AAQEBAf///wAAAAAAAAAAAAEBAQEA/wD/AAAAAAEBAQH/AP8A/wD/AP///wABAAEAAAAAAAABAAH/AP8AAAAAAP8A/wAAAAAAAQEBAQD/AAABAQEBAAAAAP////8A/wAAAAAAAAEAAQEAAQAB////AAAAAAAAAAAA/wD/AAAAAAABAAEAAQEBAQABAAH/////AAAAAAAAAAD/AP8A////AAEAAQD///8A/wD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP///wAAAAABAAAAAQEBAQD/////////AP///wD/AP8A/////wD/AAD/AP8AAAAAAP8A////AP8AAAAAAAAAAAD/////////AAEAAQD/////AAAAAP8A//8AAAAB/wD/AQD/AAAA/wD/AAAAAAD/AP//AP8A////AQAAAAABAQEBAQEBAQEAAQABAQEBAAAAAP///wD///8A////AP////8BAAEAAAEAAf8A/wEAAAAAAAAAAAEAAQD//////////wEBAQH///8A/////wAAAAD/AP8A/wD/AAAAAAEAAAAA////AP///wD/AP8AAP8A/wEBAQH/////AwMDLwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBATH/////AP8AAP////8BAQEA////AAAAAAEAAAAA////AAAAAAEAAAAA//////////8AAAAB//////////8A/wAAAP8A/wABAAD/AP8A////AAD/AAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAP//AP8AAAEAAQAAAAAAAAD/AAAAAP//////////AAEAAP///wD///8AAP8A//8A/wD///8A/wD/AAD/AP8AAAABAAAAAQEBAQEA/wAAAQEBAP////8AAAAAAP8AAQAAAAD///8AAAAAAP///wAAAAAA/////wABAAAA/wD/AAAAAP///wAAAAABAQEBAAAAAAABAAEAAAAAAQAAAAAA/wAAAAAAAP///wAA/wD/////AP////8AAAABAAAA//////8AAAAA////AAEAAQH///8AAP8AAAABAAAAAAAA/wD/AAAAAAEAAAAAAAAAAP///////////wD/AAAAAAD///8A////AAAAAP8AAAD/AAAAAAABAAEAAAAAAAAAAAD/AP//AP8A/wD/AP////8BAQEBAAAAAf///wAAAAD/AAAAAf///wAA/wD/AQABAP////////8AAAAA/wEBAQAA/wAAAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//wAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAEA/wAAAP8A/wABAAEAAAABAAAAAQAAAAECAQIBAP8AAP8A//8AAAD/AAAAAQD/AAD/AP//AP8AAAAAAAEBAQEAAAAAAP7//v8BAQEA////AP///wD/AP//AAAAAP8A/wD/AP//////AP////8AAAD//wD/AAD/AAAAAAABAAEAAAAAAAAAAAAA////AAAAAP//////AAAAAP8A//8BAQEA/wD/AAEAAQEAAAABAAEAAAABAAEAAAD/AAAAAf///wAAAAABAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP////8A/wAA/wD//wAAAAD/AP8AAP8AAAAAAAAAAAAAAQEBAP8A/wAAAAAAAAAAAf/+//////8A//7//wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAAABAAAAAAAAAAAAAAEBAQEBAQEAAAAAAP////8AAAAA/wD/Af////8AAAAA/wD///////////8AAAAAAAEAAQEAAAAB/////wAAAAAA/wAAAQEBAAAAAAD+/v7/AAEAAAEAAQH///8AAAAAAAEBAQEAAAAAAAAAAAEAAQEBAAEBAAAAAAABAAAAAAABAQABAQAAAAD/AP8AAP8AAP////8AAAAAAAAAAP8A/wAAAAAB/////wEAAQH+//7/AAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAB/wD/AAEBAQEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wD/AAEBAQAAAAAAAAAAAf8A/wEBAAEBAAEAAP7//gAAAAAA/v/+AAEBAQEAAAAB/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAAD///8BAP8AAP/+////AP8AAAAAAAAAAAD+/v4A/////wAAAAH/AP8AAQABAAAAAAH///8AAP8AAAEBAQEAAAAA/////wAAAAD/////AAEAAf///wAAAAAB/v/+AAAAAAABAQEB////AAAAAAD/AP//AAAAAP8A/wAAAAAA//////8A/wAAAAAAAAAAAAAAAAH/AP8A/wD/AAAAAAAA/wAAAAAAAAEBAQH///8AAAAAAAAAAAH/////AQEBAQAAAAABAAEBAAAAAAAAAAD//////wD/AP//////AP8AAQABAP8A/wAAAAAAAP8AAAAAAAD/AP8A////AP8A/wAAAAAAAQABAP///wD///8AAQABAAAAAAD///////7//wAAAAD/AP8AAAAAAP////8AAAAAAQEBAf8A//8AAAAAAAAAAP8A/wAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAEAAAEBAQEAAAAA/wD/AP8A/wAAAAAA/////wAAAAAA/wABAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAAAP///wAAAAAAAAEAAQD/AAAA/wD//wD/AAAAAAAAAAABAAAAAQAAAP8A/wAB/wD/AAAAAP8AAQABAP8AAP////8AAAAAAAAAAf///wAAAQABAAAAAAABAAABAAEA////AP8A//8AAAAAAAEAAf///wAAAAAB/wD/AAEBAQAAAAAB/wH/AAD/AAD/Af8AAP8A/wAAAAABAQEB/////wABAAEAAQAA/////wAAAAABAQEB////AAAAAAAAAAAA////AAEBAQD///8AAAAAAP8A/wAAAQABAAAAAAEBAQH///8A/wD//wAAAAH/AP//AAAAAQABAP8A/wABAAAA/wD/AAH/AP8AAAAAAAAAAAAAAQAA/wD/AAD/AP8AAQABAP8AAAD/AAAAAAAAAAAAAAABAAH///8AAAAA/wAAAAAAAQAAAAAAAAD/AAD/Af8AAP8AAAABAAABAAEA/////wAAAAEA/wD/AAAAAQAAAP//Af8BAAAAAAD/AP8AAAAAAAAAAAA8Q/RbAAAgAElEQVQAAP8AAAABAAAAAAABAAD///8AAAAAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP////8AAAAAAP8AAAD/AAAAAAAAAAAAAQAAAAEAAAD//////wEAAQAAAAAB/////wAAAP8AAAD//////wABAAAAAAAAAQABAAAAAAAAAAABAAAAAQAAAAEAAAAAAAAA/wABAAEAAAAAAAAAAAAAAAEA/wAAAAAAAQAAAAAAAAABAAAA/wAAAP8A/wAA/////wD/AAAAAAAAAAAAAP8A/wAAAAAB/////wAAAP8AAAAAAAAAAP////////8AAP8AAAAAAAD/////AAEAAQAAAAH///8AAAAAAf///wAA/wAAAAEAAQAAAAH///8AAAAAAAAAAAAAAAABAAAA/////wAAAAAA/wD//wAAAAD/////AP8AAP///wAAAAAAAAAAAAAAAP8AAAABAAAAAAD/AAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAH//v//AP8AAAAAAAEA/wD/AAAAAAAAAAD/AP//AAAA/wD/AAAAAAAAAAAAAf///wD///8A/wD/AAAAAAAA/wAA/////wD/AAD///8AAAAAAAAAAAAAAAABAQEBAP8A/wAA/wAAAAEAAAAAAAEAAAAB/wD/AAAAAAH///8AAP8AAP////8AAAAA/wD/EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP//AAAA//8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAf///wAAAAAAAAAAAQAAAAEAAAABAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAAAAP//////AP8AAAAAAQD/AAD/AP8AAAEAAAAAAP//////AAAAAP8A/wAAAAAA////AAAAAAH/AP8AAQABAf////////8AAAAAAAEAAQH/////AQABAQAAAAEBAQEAAAAAAAAAAAEAAQAA/////wAAAAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAQAAAQABAQAAAAABAAEB/////wAAAAAAAAAAAAEAAQAAAAEAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD//wAAAAABAQEB/wD/AAAAAAD///8AAAAAAAAAAP8BAAEBAAAAAQAAAAAAAQAAAAAAAAABAAH/////AQABAQAAAAAAAAAAAAEAAQABAAAAAAD/AAAAAQAAAAAAAAAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAP////8AAAAA/wD/AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP//AP8AAAAAAAAAAAD/AP8A/wD/AAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAAAA/wD/AAAAAP///wABAQEB/////wEAAQH/AP//AAEAAQAAAAAA/wD//wD/AAAAAAAAAAAA/////wAAAAABAQEB/wD/AAAAAAD/////AAAAAAAAAAD//v//AAEAAP////8BAQEBAQABAAAAAAD/AP8AAAAAAP//////AP8A/wD/AAAAAAD/AP//AAAAAQAAAAD/////AAAAAAAAAAD///8A/////wAAAAD/////AAAAAAAAAAAAAAAA////AAAAAAD///8A/////////wH/AP8A/wD/AP///wAAAAAAAQABAf//////////AQABAP8A/wAAAQAB/wD/AP8A/wH/AP//AAAAAP8A/wAA/wD//////wD/AP8AAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAAAAAAB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIDAhD+/v4AAAAAAAABAAH///8AAAAA/wABAAEAAAAAAQABAAABAAD///8AAAAAAQEBAQAAAAAA/wD/AP8A/wEBAAEAAAAAAP8A/wABAAEA////AP8A/wAAAQD/AP8AAAABAAEAAAAAAAAAAP8A/wAAAQABAP8AAAAAAAH/////AAAAAf8A/wAA/wAAAQEBAP////8AAAAAAAAA/wAAAAD/////AAAAAP8A//8AAAABAAAAAP///wAAAQABAP8A/wEBAQEAAAABAP8AAAAAAP////8AAAAAAAABAAAA/wD//wH/AQABAAEBAAEA////AAABAAAAAAAB/wD/AAD/AP8AAAAA////AAEBAQAA/wAAAAAAAP8A/wAAAQAAAP8AAf8A/wAAAAAAAP8AAP8A//8AAQABAP8AAAAAAAABAAEAAAAAAAABAAD/////AAAAAQAAAAEBAQEA/v/+/wEAAQAAAAAAAAAAAQEBAQD///8B/wD//wEBAQH///8AAQEBAf8A/wABAAEA/wD/AAD/AP8AAQABAP8A//8B/wAA/wAAAAEAAf8A/wEA/wAAAAEAAP8A/wAA/wD//wH/AQD/AP8AAAAAAAAAAQABAAD/AP8AAP8A/wAAAAH/AP8AAQEBDwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP79/hAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA/wAA/wD/AAAAAAAAAAD/AAAAAP///wAAAAABAAAA/wAAAAH+//7/AQABAAABAAH///8AAAAAAP8EC///CRkB/gQMAP8IGAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAABAAAAAP8A/wABAAEBAAAAAP///wABAQIB/wD/AAAA//8AAAEBAAAAAAEAAAAAAAAA//8AAAEBAAAAAAAA//8AAQEBAAAAAAAAAAAAAP8A/wEAAAEAAP//AAEBAQD/AAABAQAAAP8A/wAAAAEAAQAAAAAAAAAAAAAA/wD/AAD/AAEBAQEA/wAAAAAAAAAAAAAAAQAAAf8A/wABAAEBAAAAAP8AAAABAAAA/wAAAAEAAAH/AAAAAAD//wEAAQH/AAAAAP//AAEBAQAAAAAB/wD//wEAAQH/AAAAAQAAAQAAAAD/AAAAAAAAAAD/AAABAQAA////AQEBAQAAAAABAPz0AAH89AAA/wAABPHQAAAAAAAAAAAAAQEBAf8A/wD/AP//Af8BAAAAAAD/AP//Af8BAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAQD/AAAAAAAA////EQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAQAAAQABAf////8BAQEBAAAAAAD/AAAAAQAAAP8AAP8A/wABAAEBAAAA/wAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAAD/AAD/AP8A+SFgAPodUwH/BAwAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAEAAAAAAAEAAAD/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAEBAQD///8AAAAAAAAAAAABAQEA/wD/AAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAQEA/wD/AP///wACAQIA////AQAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAQEBAAbeoAEI36EA/wD//wEAAQEAAAAA/wD/AAEAAQAAAAAAAAAAAAABAAD/////AP8AAAD/AAABAQEB/wD//wEBAQEA/wAAAP8AAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wABAAAAAAEBAQEAAAAAAAAAAP8A/wD///8A/////wD/AP//AP8A/wD/Af////8AAAAA//////8A/wD/AP////7//wAAAAAA/wAABui5AAH99QAAAgAAAQIBAAACAAAAAQAAAAIAAAACAAAAAgEAAAIAAAACAAAAAgAAAAIAAAACAAAAAQAAAAIAAAACAAAAAgEAAAEAAAEDAQAAAgAAAQIBAAACAAAAAQAAAAIAAP8BAAAAAQAAAAIAAAACAAAAAgAAAAAAAAACAAAAAQEAAAIAAAACAQAAAgAAAAIAAAACAAAAAQAAAQIBAAABAAAAAgAA/wEAAP8B/wABAwEAAAIAAAABAAD/Af8AAAEAAAACAAAAAgAAAQEBAAACAAAAAgAAAAIAAAACAQAAAgAAAAIAAAACAAD/Af8AAAEAAAECAQD/Af8AAAIAAAACAAAAAgAAAAIAAAACAAAAAQAAAAIAAAACAAAAAgAAAAIAAAABAAAAAgAAAAIAAAACAQD/AQAAAvjoAAbnuAAAAAAAAAAAAf8A//8BAAEBAAAAAP8A//8BAAEB/wD//////wABAAEBAAAAAQAAAAH/AP//AQABAf/+////AP8AAAAAAAABAAH/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAfsRLwAAAAAAAfbnAAvOcQAC+ekAAAIAAAECAQAAAQAAAAIBAAABAQAAAgAAAAIBAAACAQAAAgEAAQIBAAABAAAAAQEAAAEAAAABAAAAAv8AAAEAAP8A/wAAAQAA/wH/AAACAQAAAgAAAAEAAAECAAAAAgAAAAEAAAABAAABAgEAAAMAAAABAAAAAf8AAQIBAAAB/wAAAgEAAQIBAAACAAAAAQAA/wH/AAABAQABAgEAAQIAAAABAAD/AP8AAAEAAAACAAAAAQEAAAEAAAABAAAAAgEA/wH/AAACAAABAgEAAAIBAAACAAABAgEAAAEAAAACAAAAAQAAAAIAAAACAQAAAgEAAAIBAAABAAAAAQAAAAEAAAACAAAAAgEAAAIBAAACAAAAAgAAAAIBAAABAAAAAgEAAAEAAAAB/wAD+egACc1w/wH36AD/AP8A/REwAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAA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5APweSQAAAAABAvboAQrEbwAB9+cAAQIBAAABAAABAgEAAQIBAAECAQAAAgAAAAIAAAABAAAAAQAAAQIBAAABAAAAAgAAAAEAAAABAAABAgEAAAEAAAABAAAAAQAAAQIBAP8BAAAAAgEAAQIBAAABAAAAAgEAAAEAAAACAAABAgEAAAEBAAABAAAAAQAAAAEAAAABAAABAgAAAAEAAP8B/wAAAQAAAAEAAAEDAQABAgEAAAEAAAACAAAAAgAAAAEAAAACAAABAwEAAAIAAAECAQAAAQAAAAIAAAABAAABAgEAAQIBAAACAAABAwIAAAIAAAACAAAAAQAAAQIBAP8B/wAAAgAAAAEAAP8BAAAB9+cACcRv/wD25/8AAAD//R9KAfkzeQABAgEAAQIBAP8BAAABAgEAAAEAAP8BAv//AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEB/wAAAAACAAAAAgAAAAEAAAACAQAAAgEAAAIAAPgzeQD7H0kAAAAAAAH26AAKxG8AAffoAAACAAAAAgAA/wH/AAACAAAAAQAAAAEAAAACAAAAAgAA/wH/AAACAAAAAgAAAAIAAAABAAAAAgAAAAIAAP8BAAAAAgAAAAEAAAECAAABAgAAAAIBAAACAAAAAQAAAAIAAAACAQAAAgAAAAIAAAACAAAAAgAA/wEAAAACAAAAAgAAAAIAAAEDAQAAAQAAAAIAAAABAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAQAAAAIAAAACAAABAwEAAAIAAAACAAAAAgAAAAEAAAACAQAAAf8A/wAAAAACAAAAAgAAAAIAAAECAQAAAQAAAQIBAAP36AAJxG8AAfXnAAEAAQH8H0kB+DR6AAECAQAAAgAA/wEAAAACAAAAAgEAAAIAAAEB/gEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQA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CAAAAAgAA/wEAAAACAAAAAQAAAQIBAP8BAAAAAQAA/wEAAAACAAABAgAAAQMCAP8BAAAAAQAAAAEAAAECAQAAAQEAAAEAAAABAAAAAQAA/wEAAAEDAQAAAgAAAAEAAAACAAABAwEAAAIAAAACAQAAAgEA/wH/AAABAAAAAQAAAfbnAAe8bP8B9ecA/wD/APshSgD5OHoAAQMBAAEBAAAAAgEAAQEAAAABAAAAAgAAAAEAAAACAQAAAgEA/wEAAAABAAD/AP//////AAAAAAAAAAAAAAAAAP////8AAAAAAAAAAP8A/wD///8AAAAAAP///wD/AP8AAAAAAP8A//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAB////AP////8A/wAAAAAAAQAAAAAA/wAA/wD///8A/wD/////AP8AAAEAAQAAAAAA////////////////AAH9Af8BAAAAAgAA/wIAAAECAQABAgAAAAIAAP8B/wD/AgAA/wIAAAACAAABAgAA+jp6AfwiSwD/AP8AAPTnAAi8bAAB9ugAAAEAAAECAAAAAQAAAAIAAAABAQAAAwEAAQIBAAECAQABAgAAAAEAAAECAAD/AgAA/wH/AAACAAAAAgAAAQIAAAACAAAAAQEA/wIAAAABAQAAAgAAAQIBAAACAAAAAgAA/wIAAAACAAABAgAAAQIBAAAAAAD/AQAA/wH/AAECAQABAgEAAAEAAAACAAD/Af8AAAEAAAACAAABAgEAAQIBAP8B/wABAgAA/wIAAAECAAD/AQAAAQIBAAECAQABAgAAAQICAAECAQAC9ugACL1tAAL16AH/AP8A/CJLAPs7egABAgEAAAEAAAACAAAAAgAAAAIAAAABAAAAAgAAAAEAAAECAQAAAQAAAAEAAAABAAABAAEBAAAAAAD/AAD/AP8A/wD//wABAAH/AP8A////AAAAAAAAAAAB/////wAAAP8AAAAA/////wAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP////8AAAAA/wABAAEAAQAAAAAAAP///wAAAAAAAQABAQD/AAAAAQABAAAA//8A/wAA/wAAAQEBAQAAAAEAAQABAAEBAAECAQABAgEAAQEBAP8B/wAAAQA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AAQEAAgMBAAACAAAAAQAAAAEAAAABAAAAAQAA/wEAAAECAAAAAQEAAAEAAAEDAQAAAgAAAAIAAAEB/wEA/wAAAAEAAf8A/wABAAEAAAAAAP///////////wD//wEAAQEA/wAA////AQEAAQEAAAABAAAAAf8A/wAA/wAA//7/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/////wAAAAD///8A////AP/+//8A/wD//////////wAAAAAB/wD/AAD/AP////8AAP8A/wAAAAEAAAABAQIAAAACAQAAAQAAAQIBAAACAQAAAQAAAAEAAAACAQAAAgAAAQIBAAECAQAAAgEA/wEAAAACAAAAAgEAAAIAAAAB/wD7QH0A/SdLAQD/AAEB9OcBBrVqAAH16AAAAgEAAAIBAAACAAAAAgAAAAIBAAABAAAAAgEAAAIAAAACAQAAAf8AAAEAAP8BAAABAQAAAAEAAAACAQAAAgAAAAEAAAACAQAAAgEAAQIBAAACAQAAAgEAAQMBAAECAQAAAgEAAAL/AAACAAAAAQAAAQIBAAACAAABAgAAAAIBAP8BAAAAAgAAAAIAAAABAAAAAgAAAAIAAAECAQAAAgEAAfXoAAa2a/8B8+cB//////wmSgD7PnsAAAIAAAECAAAAAv8A/gD/AAABAAAAAgAAAAIBAAACAAAAAQAAAQIBAAECAQAAAv8AAAIBAP8B/wD/AQAAAQIBAAACAAD/AP8AAP8A/wEAAQD//////wD/AAABAAAAAAAAAQABAf8A/wAAAQABAAEA/////wAAAAAAAAAAAAAAAAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAQD/AP//AP//AAAA/wAAAAEAAQAB/wD/AAAAAAAA/wAAAP8AAAAAAAEBAQEAAAEAAf8A//8AAAAA/wAAAAABAAD/AgAAAAIAAAECAAAAAgEAAAEAAAABAAAAAQEAAAIAAP8BAAAAAgAAAQIAAAACAQAAAQAAAAIBAAACAQABAgAA+0B9AP0oSwAA/wAAAfPnAAa0agAB9ecAAQIBAAABAQABAgIAAQIAAAAB/wAAAQAAAQIBAAABAAAAAQAAAAEAAAAB/wAAAgEAAAIAAAABAAABAgEAAAMBAAAB/wAAAQAAAAIAAAABAAAAAgAA/wAAAP8BAAAAAgAAAAEBAAACAAD/AgAA/wEAAAAB/wABAgEAAAEAAAAB/wAAAQEAAAEAAAABAAAAAQEAAAEBAAACAAAB9OcAB7VrAAHz5wEAAAAA/SdLAftAfQAAAgEAAAIBAAABAQAAAQAAAQMBAAADAQAAAgEAAAIAAAACAQAAAgEAAQIAAP8CAAAAAQEAAAEAAAABAAABAwEA/wIAAAAAAv8A/wD/AAAAAf//////AP8BAP8AAP///wAAAAAB////AAD/AP8A/wAA////AAAAAP8A/wAAAP8AAAD/AAD//////////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAAAAAAEBAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wD////////+//7//////wAAAAAAAQAAAAEAAAACAAAAAQAAAAEAAP8BAAAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAABAQAA/wEAAAABAAAAAgAAAQEAAAABAAD/AQAAAQIAAPtBfQD9KEsA/wD//wHz5wAGs2oAAPTmAAACAAD/Af8A/wEAAAACAQABAgAA/wEAAAACAAAAAQAAAAH/AAACAQAAAgAAAAIBAAACAAD/AQAAAAEAAAACAQAAAgAA/wEAAAECAQAAAQAAAAIAAAACAAAAAQAAAAIAAAABAAAAAQAAAQMBAAACAQD/AQAAAAIAAAACAQAAAgAAAAIBAAECAAABAgEAAAIAAAD05wAGs2oAAPLmAAAAAAD9KEsA+0J9AAEDAQAAAgAAAQEAAAACAAAAAgEAAAEAAAECAQAAAQAAAAEAAAABAAABAgAA/wEAAAABAAAAAgAAAAIAAAACAAABAQAAAAEAAAAB/gH/AP8BAAAAAP8A/wEBAAH//wD/AAEAAQEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAEAAAAAAAAAAP8A//8BAAEB/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//////v/+AAAAAAAAAAAAAAAAAQAAAAD/////AAAAAf8A/wAAAAABAQABAQAAAAABAAEBAQABAQEAAQH///8AAAAAAAACAAABAgAAAQIBAAECAAAAAgAAAAEAAAABAAA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AAAAC/wAAAgAAAQEAAAACAAAAAgEA/wH/AAACAAAAAgAAAAIAAAACAQAAAQAAAAIAAAACAQABAgAAAAEAAAABAAACAwEAAfPnAASqaAAA8eb/AAAAAf////8B6toAAfPnAAECAQAAAgEA/wH/AAACAQAAAgEAAAIBAAACAQABAgEAAAIBAAECAAABAgEAAAIAAAACAAAAAgEAAAIBAAACAQAAAgAAAAIAAAAC/wAAAgAAAAEAAAABAAABAgEA/wAAAP8A/wABAAEBAAAAAQD/AAAA/wAA/wD/AP8A//8AAQABAAAAAAD/AAEA/wD/AP8AAf////8BAAEAAP8A//////8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//////wABAAAAAQABAAAAAQAAAAD///8A/wD/AAEBAQAA/wAAAAAAAP8A//8AAAAAAP8A/wAAAAAAAQAAAAH/AAABAAAAAQAAAAEBAP8CAAAAAQAAAAEBAAACAQAAAQAAAAEAAAABAQD/AQAAAQIAAAABAAAAAQAAAAIAAAABAAAAAQAAAQIBAAACAAAAAgAAAAIAAAHz5wAFqmgAAPHmAAD/AP8A/wD/AAAA/wHy5wEDqWf/AfPmAAACAQD/Af8AAAEAAAABAAAAAQEAAAMBAAABAQAAAQAAAAMBAAABAQAAAf8AAAEAAAACAQD/AQAAAAIBAAACAAAAAgAAAAEBAAAB/wD/AQAAAAIAAAEDAgAA8eYABKloAAHx5gAAAAABAAAAAAEBAQEA8eYABKpoAAHy5gAAAf8AAAEAAAAB/wD/Af8AAAH/AAABAAAAAf8AAAH/AAABAAAAAQAAAAEAAAECAgAAAQAAAAIAAAACAAAAAgEAAAEBAAABAAAAAQEAAAIAAAACAAD/Af8AAAH/AAD/AP//AP8AAP8AAAABAAAAAQABAP8AAAD/AAEAAAAA////AAEBAQAAAAABAAAA//8A/wD/AP8AAAEAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAAEAAQD/AAAA/wAA////////////AP//AQABAf///wAAAAAAAP8AAAAAAAD///8AAAAAAQABAAEAAQEAAAIBAAACAAAAAgAAAQIAAAABAAA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AAAEAAAAdKAACcp8BAAoNAP8A/wAA7eYA/pBgAADv5QAAAQAAAQIBAAACAAAAAQAA/wAAAAD/AAD///8AAAAA/wEBAQH/AP8AAQEBAf///wD///8AAP8AAAD/AAAAAAABAAAAAP8A/wAA/wAA/////wD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/AP8A/wD/AP///wD/AP//////AAAAAQIBAAACAQAAAgEAAO/mAP6OYAAA7OX/AQABAQEKDgEBc58AAB0nAAACAAAAAgAAAAIAAAABAAAAAQAAAQIBAAABAAAAAgAAAAEAAAACAAAAAQAAAQEBAAACAQAAAQEA/wH/AAECAQAAAQAAAQIBAAAAAAD/AAAAAAEAAP8B/wAAAQAAAAEBAAACAAAAAgAAAAEAAAACAAAAAgAAAQIBAAABAAD/Af8AAQIBAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAECAQAAAQEAAAIAAAACAQAAAgAAAQIBAAACAAABAgEAAAIAAAACAAAAAQAAAAIAAAACAAAAAgAAAAEAAAABAAAAAgAAAAIAAAECAQAAAgAAAAIAAAACAQAAAgAAAAIAAAACAAAAHigAAXOfAAELDgH/AP8AAe7mAP6OYQAA7uYAAAIAAAEBAQABAgEAAAEAAP8A/wABAAEA/wD/Af////8BAAEB////AAABAAH/AP8A/wD/AP8A/wAAAAAA/////wAAAAAAAQAAAQEBAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD//////wD/AAEAAQEA/wD/AAAAAAAAAAAAAAABAAAAAAD/AAAAAQAAAAIBAAECAQD/7uQA/45gAADt5QAAAQABAAoNAAF0nwABHikAAAEAAAACAQABAgEAAQIBAAACAQAAAgEA/wD/AAECAQAAAgAAAAIAAAECAQAAAgEA/wL/AAAC/wAAAgAAAQIBAAACAAAAAgEAAAEAAAEDAQACAwEAAAIAAAACAQAAAgAAAQIAAAACAQAAAgAAAAIBAAABAAAAAgEAAQIBAAA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AAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP8AAAAAAPbyAP8A/wABCg4BAnmhAAEgKQAAAQAAAAEBAAACAAAAAQAA/wIAAAABAAD/AAAAAAH/AP8B/wAAAgAAAQIAAAABAAABAgAA/wEAAAABAQAAAgAAAAEBAAABAAAAAQAAAAIAAAABAAD/Af8AAAEBAAACAQAAAQAAAAH/AAAB/wABAgEAAAIAAAABAQAAAQAAAAEAAAECAAAAAf8AAQIAAAACAAAAAQEAAAMBAAECAAD/Af8AAAIBAAACAQD/AgAAAAEAAAACAAABAgEAAAEBAAECAQABAgEAAAEBAAECAQAAAQAAAAIAAAACAAAAAf8AAAIBAP8BAAAAAQEAAAIAAAACAAABAgAAAQIAAAABAAD/AgAAAAH/AAAB/wAAAgAAAAH/AAABAAAAAgAA/wEAAAABAQABAgAAAAMBAAEfKQACeqEA/woNAAAAAAEA7OX//wD/AAAAAAD/AP8A/wD/AAAAAAAAAAD//wD/AAD/AP8AAQAAAQABAP8A/wD///8AAAEAAQEBAQABAAEAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQH/////AAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAABPVAAASApAAACAAAAAf8AAAH/AAECAQD/AQAAAQIBAAACAAABAwAAAAIBAAECAAAAAgEAAAIBAAACAQAAAgEAAQIBAAACAAAAAQAAAAIAAAACAQAAAgEAAQIBAAACAQABAgEAAAIAAAACAAD/Af8AAAIBAAACAQAAAgAAAQIBAAACAAD/Af8AAQIAAAACAQAAAgEAAAEAAAEBAAAAAgAAAQEBAP8BAAABAgAAAAIAAAAB/wABAgEAAAIBAAECAQAAAgAAAAIAAAACAAAAAf8AAAIAAAACAAD/Af8AAAIBAAECAAAAAgEA/wH/AAECAQD/Af8AAAEBAAACAQAAAgEAAAIBAAACAQABAQEAAAEBAAACAQAAAQEA/wEAAAACAAABAgEAAQIAAAAC/wAAAQEAAAAAAAACAAAAFRsAAj1RAAAAAAAAAAABAAAAAAD/AAAAAAAAAQEBAAD/AP8AAAABAQEBAQAAAAH///8A/wD/AAAAAAABAAEAAP8AAP7+/v//AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHBwc//8A//8AAAAAAQEBAQAAAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAA/////wEBAQEAAAAAAP8AAAAAAAAAAQAAAP8AAP8A//8BAAEBAAsNAAEfKQAAAAAA/wkN/wELDgEAAAAAAAAA//8A/wABAQEBAAAAAAD/AAAAAAAAAAAAAAABAAD///8AAQABAAABAAAAAAAAAP8AAP8A/wABAAEAAAEAAAAAAAAAAAAAAP8AAAABAAD/////AQEBAQAAAAD///8AAQAAAAABAQAAAAAAAAAAAAAAAAAAAAAA////AAEAAf//AP8AAQAAAQABAQAA/wAAAAEAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAD/AAAAAQAAAAAAAP////8BAQEBAAAAAAAAAAAA//8A/wAAAAEBAQAA/wD/AAD/Af8AAP8BAQEBAAAAAAD//wAAAQEAAAAA/////wEBAQEAAP8AAAAA/wAAAAAAAAEBAP///wABAQEAAOrlAP/28v8A7OUAAPXzAQAAAAAAAAD/AAEAAQAAAAAA/wAAAAAA/wABAAH/////AQEBAQAAAAAA/wAAAAAA/wAAAAEAAQAAAAAAAAD/AAAAAAD/AAAAAQABAAD/////5eTlAgAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQIB8P/+/w8AAAAAAP8AAAAAAAAAAAAA/wD/AAEAAQAAAQAA////AAAAAAAA/wAAAAAAAf///wAAAAD/AAAAAQAAAAAA/wD/AAAAAAEAAQEAAQAA//Xy///WyQABAAEB/wD/AQAAAQD/AP//AAAAAQEAAQD/AQAAAAAAAP///wABAAEA/wD/AAAAAAAAAAAA/wAAAAAAAP8BAQEBAP8AAAABAAD+////AQABAQAAAAD/AP//AQEBAQAAAAD///8B/wAA/wAAAAABAAEB/wEAAP///wABAAEA/wD/AAAAAAABAAEAAAAAAP8AAAH/AP8AAAABAP8A/wAAAAAAAAAAAAEAAQD/AP8AAAAAAAABAQAA/wAA/wD//wEBAQEAAAAA////AAD/AAAAAQEAAAAAAP8A//8BAQEBAAAAAP7//wAAAAAAAQABAP8A/wEAAAEAAAAAAP8A/wAAAAAAAAAAAAEAAQD+AP8AAQABAAABAAD///8AAQABAP8A////AAAAAAAAAAAAAAEBAAEA/wD//wEAAQEAAQAB////AAAAAAABAAEA/wD/AQEAAQAAAAAB////AAAAAP8AAAABAQABAQAAAAAAAAAAAP8AAP8A//8BAAEB/wD/AAD/AAACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAABAQABAAAAAAAAAAABAAAAAQAAAAD//v//AAAAAQAAAAH/AP8AAAAAAP8A/wAAAAABAAAAAP8A/wD///8A////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAEAAQH///8A/wD/AP///wAAAAAA//////8A//8A/wAA/v7+/wD/AAAAAAAAAAAAAQAAAAEAAQAA////AAAAAP//AP//AAAAAAAAAAD/AP///wD/AP8A/wAA/wD//wD/AAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAf///wD/AP8AAAAAAP////////8AAAAAAAABAAAAAAAA/wD/AAAAAAH///8AAP8AAP////8A/wAA/wD/AAEBAQD/AP8A/////wD/AP8AAAD/AAAAAf8A//8AAAAA/wD//////wAAAAAA/v/+/wAAAAEA/wAAAAAAAQAAAP8AAAAAAAAAAf////////8AAAAAAAAAAAD/AP//AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAD/AAAAAP////8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAABAQEBAAEAAQD/AAEAAQABAQEBAf8A/wAA/wAAAAAAAAAAAAD///8AAP8AAP///wAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAABAP8AAAAAAAAA/wD/AAAAAAD/AAD///8AAAAA/wAAAP8AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAAA/wAA/wD/AAEBAQEAAQABAAAA/////wAAAAAAAAEAAQAAAAEAAAABAP8AAP///wAAAAAAAAAAAQAAAAAAAAAAAQEBAQEAAQD/AP8AAAAAAAAAAAH/AP8AAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////AAAAAAD/AP//AP8AAP///wAAAAAAAP8AAAAAAAD///8BAP8AAAEAAQEAAAAAAP8A/wD/AAAAAAAAAAAAAAAAAAD///8A////AAD/AAAAAAAAAAAAAAD/AAD//v8AAP8AAP8A//8A/wAAAAAAAP////8AAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP//////AP//AAEAAAD/AP8AAQABAP8AAAABAAABAQEA////AQD/AAEA/wAAAP8A/wAAAAAAAAAAAP8AAAD/AP8AAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAQD/AAAAAAAA/////wABAAD///8AAAAAAAEAAQEA/wAAAAAAAP////8AAAAAAP8A//7//v8BAAEB/////6JMtV4AACAASURBVAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAAAAAAAAAAAA/wD///8A/wAA/wAAAAAAAP///wAAAAAA/wD///8A/wAA/wAA/wD/AAABAAD/////AAAAAAD/AAABAAEAAQABAAAAAAAA/wAA////AAABAAD/AP8A/wD/AAEBAQEAAAAA/////wEAAQEAAQAAAAEAAP//////////AAAAAAEBAQEAAAAA////AAAAAAD/AP8AAAAAAAEAAQEAAAAAAAAAAAABAAEA/wAA/wD/AAD/AAD+//4AAAAAAP8A/wD/AP///wD/AQD/AAD//////wD/AAABAAH/////////AP8A//8BAQEA////AP///wD/AP////////8A//8A/wAAAQEBAf///wAAAAAA/wD///8A/wD/AP8A////AAEAAQEA/wAA/wD/AQAAAAH/AP8AAAAAAf8A/wAAAAAA////AP///wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/gD+8AH/AQAAAAAAAAAAAAD/AAAAAAAA/////wAAAAEAAAAAAP8AAAEBAQD/////AQABAQAAAP//AP8BAAAAAAD/AP8AAAAB////AAAAAAAA/wAAAAEAAQAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAQAAAAD/AP8AAQABAf///wAAAAAB////AAAAAAABAQEA/////wAAAAEA/wD/AAEAAf////8BAAEB/wD//////wEAAAAAAAAAAf8A/wAA/wAAAAAA/wD/AAAAAQAB////AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP8A//8AAAAB////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAP8A/wAA/wAAAQEBAP8A/wAAAAABAQABAP///wAAAAABAAAAAAEBAQH/////AAAAAQAAAAAAAAABAAAAAAAAAAD/AP//AP8AAQAAAP8AAAABAQABAf////8AAQAAAAAAAP8A/wEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAD/////AP8AAAABAAH/AP8AAAAAAQAAAAABAAEB/wD/AP///wAAAAAA////AAEBAQD///8AAAAAAf8A//8AAAAB/wD/AAEBAQAA/wAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD/////AAAA//8A//8AAAAAAAEAAQAAAAABAAEAAQABAP/+//8AAAAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAAAAP////8AAQABAQABAP////8BAAEAAAAAAAAAAAAAAAAAAAAA/wD/AP8AAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAAAAQABAQABAAAAAAH/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAD/AP8AAQABAAAAAAAAAAAAAAAA/wD/AAD/AP//////AAAAAP///wAAAAABAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wAAAAAAAAAAAAEAAAAA////AP8A/wAA/wAB////AAAAAAAAAAAAAAAAAAAAAAEAAAD/AP8A/wAAAAAAAAABAAEAAQAAAP8AAAAAAAAAAAAAAAD/AP8AAAAAAP////8BAAEAAAAAAP///wAAAAD/AP8A/wAAAAEAAAAAAAAAAP///wD///8AAAAAAP7+/v/+/v7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAB//8A/wABAAEB////AAAAAAEAAAAAAP8AAAD/AAD///8A/wD/AAAAAAH///8AAP8AAP////8AAAAA////AAAAAAAAAQAAAAAAAAAAAAD/////////AAAAAAD+//7/AAAAAAAAAAAAAAAAAAAAAf8A/wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA/wAA/wD/AAAAAAABAAEA////AAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AP////8AAAAA////AAAAAAAA/wAA/////////wAA/wAAAP8AAP////8AAAAA//////8A/wAAAAAA/v/+//////8AAAD/AAAAAAABAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAD///8A/wD/AAAAAAAAAQABAAAAAP///wAAAAAAAAAA/wEAAQEAAQAAAQEBAQEAAQAAAAAAAAAAAP////8A/wAA/wD/AAAAAAAA/wD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEAAQD///8BAAAAAf////8AAAAAAAAAAAAAAAAAAQAAAAAAAQEAAQECAgLhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4f7+/gAAAAAAAQABAQD/AAD/AP//AAAAAQAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQEA/wD/AQABAQD/AAD/AP8AAAAAAAEAAQEAAAAA/wD/AAEBAQEAAAAA////AAEBAQAA/wD/AAEAAQAAAAH/////AAAAAQAAAAAAAAAAAf8BAAAAAAD/AP//AQABAf///wABAAEA/////wEAAQH+AP7/AAAAAf///wAAAAAAAAAAAQAAAP8A/wAA/wD//wAAAAEAAAD/AAAAAQD/AAABAAEAAAAA/wEBAQH/////AAAAAf///wABAAEAAQABAQAAAAAAAAD//wD/AQEAAQH///8AAQABAf8A////////AAAAAQEBAQD///8AAQEBAAD/AAD/AP8AAQABAP///wABAAEA/wD/AAEBAQAA/wD/AAAAAP////8BAQEBAAAAAAEAAQD/////AAAAAAAAAP8A/wAAAAAAAAAAAAEAAQAA////AAAAAAD/AP8BAQABAAD/AAAAAAAB/////wAAAAABAAEB/wD//wAAAAEAAAD/AQABAQABAAAAAAAAAAEAAP7//v8AAAAA/wD/AQEAAQD/////AQABAQABAAD/////AAAAAAAAAAH8/vzvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4AEBAQD///8A/wD//wAAAAEBAAEB/wD/AAAAAP8AAAAB////AAAAAAD///8AAAAAAAD/AAAAAAABAAAA/wAAAAEAAAAAAQABAP8A/wAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAABAP4A/wECAQH///8BAAAAAAAAAAAAAAD/AAEAAf///wAAAAAB/wD//wAAAAH/AP8AAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQABAf8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAAEAAQD+//7/AQEBAQAAAP8AAAAAAAAAAP8A/wABAAEA/wD/AAAAAAEAAAAAAAAAAP///wAAAAAA////AAAAAP8BAAEB////AAEAAQD/AP8AAAAAAAAAAAAAAAABAAAA/wAAAAH/////AQEBAf////8AAQAAAAAAAQAAAAAAAAAAAQEBAP///wABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAP8BAAEBAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAB/wD/AAD/AAAAAAAAAAAA/wEBAQH//v//AAEAAP8A/wABAAEB/wD/AAEAAQAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAwMD0P///wD/////AAAAAAAAAAD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAEAAQAAAAD/AAAAAQAAAAAAAAD//wD//wAAAAAAAAAAAAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAD/AP8AAAAB/v7+/wAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAP8A//8AAAAAAP8A/wD/AP8AAAD/AP8AAP////8AAAAA/wD/AP////8AAAAAAAAAAAAAAAD/////AAAAAAAAAAD///8AAAAAAP7//v8BAQEB/////wAAAAEAAAABAAAAAAAAAAD/AP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////////wAAAAAAAAAAAQAAAAAAAAAA////AAABAAEAAAABAAAAAP////8AAAAA////AP////////8AAAAAAP///wD/////AAAA/wAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAf7+/v8AAQABAP8A/wAAAAD/AP8AAAAAAP///wAAAAABAQEBAAEAAQACAwLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAABAA4AD/AAABAQEBAAAAAQAAAAAAAAABAAEAAP///wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAD/AAD///8AAAEAAQAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAEAAAAAAAEAAf8A/wAAAAABAAEAAAAAAAEAAAAAAQABAAEBAQEA/wD/////AAAAAAABAQEBAAAAAAAAAP8BAAEBAAAAAAEBAQH///8AAQABAAAAAAABAQEAAAAAAAAAAAAAAAAA////AQAAAAD/////AAAA/wAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAAAA/wAAAAAAAAAAAAAA/wEAAQEA/wAAAP8AAAEBAQEAAAAAAAAAAAAAAAEBAQEB////AAD/AP//////AAAAAAD/AAAA/wAB/////wAAAAEA/wAAAP8AAAAAAP8BAAEAAAAAAAEAAQEAAAAAAAEAAQD/AAAA/wAAAAAAAAAAAAAA/wAA/v7+//8A/wAEAATQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8P8A/+AA/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAB////AP8A/wD/AP8AAQABAQAAAAAAAQAA/wD//wAAAAH+//7/AAAAAP8A//8AAAAAAP8AAAABAAEAAAAAAP8AAAAAAAAAAQAAAQABAQEAAdDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD///7+/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAH/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wAB74Pg5gAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoQAQEBOP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAQEB4QgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtdS82AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//SU24ZlLLBAgAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Message.png b/arma/client/addons/phone/ui/_site/images/dark/Message.png new file mode 100644 index 0000000..715f40b Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Message.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Message.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Message.png.b64 new file mode 100644 index 0000000..239b002 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Message.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEHDLQbPlgAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4f8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf////iAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAD//wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAAAA/wAAAAEAAAAAAQEBAAD/AAAAAAD/AAAAAQAAAP8AAAABAAEAAQAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQAAAAEAAAD/AAAAAQAAAAH///8AAQABAQEBAQEAAAAAAQEBAAEBAQD//v//AQEBAAAAAAAAAQABAQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAf////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAAAADgZGRnR6Ojo2AAAAAAAS4rHFQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAAAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAABAAAA/wAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAADvEhISIsDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAQEB/wD/AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQD/AP8AAP8A/wAAAAEBAQEA/wD/AAD/AP8BAQEBAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQEAAQD///8AAAAA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAAAAAAD/AP8AAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAB////AP///wAAAAD/AP8AAP///wD///8A////AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAAAQEBAP//////AP8AAAAAAAAAAAEAAAAA////AAAAAAABAAEAAAAAAAAAAAEAAAD/AQEBAAAAAP8AAAAA/////wAAAAAAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAA/wAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQAAAAH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQEAAQD///8AAAAAAAEAAQEAAAAA/////wEBAQD///8AAQEBAf////8AAQABAQABAP////8BAQEBAAAAAAAAAAD///8AAQABAf8A//8BAAEB/wD/AAEAAQEBAQEA/////wABAAEA/wD/AP8AAAEBAQH/AP8AAP8A/wABAAAA/wAAAQEBAQAAAAAAAAAAAAAAAAEBAQH/AP8A/////wAAAAABAQEBAP8AAP8A/wABAQEAAAAAAAAAAAAAAAABAw4FAAUXCAAKJw4ABRkKAAcaCgECCwMABxsKAAIMBQAAAAAAAAAAAAAAAAAAAAAAAQEAAPrm9wAAAAAA+uf3APnm9gD32vIA/fP7APjb8gH98/wAAQEBAQAAAAABAAEBAAAAAP8A/wAB/wEAAAAAAAAAAAAAAAAAAAAA//8A/wEAAAAAAQABAP8A/wABAAEAAAAA/////wH/////AAAAAAABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wEAAQD/Af8B/////wEBAQAAAAABAAAAAP8A/wABAAEAAAAAAP///wABAQEAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD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BAP///wABAQEA/wAAAAEAAAD///8AAAAAAP///wAAAQAA////AAAAAAAAAAAAAAAAAAABAAD//v8AAAAAAAAAAAAAAAAA////AAEBAQAAAAAA////AAEBAQD///8ABRkJABNWHgATVh4A8LbmAO+05AD1zu8B/wD/AAEBAQAAAAAAAAAAAf8A/wABAAEAAAEAAP7//gABAAEA/v/+AAEBAQEA/wAA/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA/////wAAAAAAAQEBAf////8AAAAAAQABAQAAAAH/AP//AQABAf8A/wAAAAAA////AAEAAQD/AP8AAQABAP////8A/wABAQEBAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAICAg////8BAAAAAP////8AAQAA/wD/AAEAAQD///8AAQEBAf///wAAAAAA////AAABAAAA/wAAAAEAAAD/AP8AAAAAAAAAAQAAAAD///8BAAAA//////8AAQABAQABAAAAAAD+/v4AAAAA/wAAAAH/AP8AAQABAP8A/wH///8AAAAAAAEBAQEAAAAA/////wwzEgEVYyMACzMSAQD/AAD///8A/wD/AAEAAQD/AP8A//7/AAABAAAA/wAAAAAAAP8A/wAA/wAAAP8AAP8B/wABAAEAAAD/AP///wD/AP8AAAAAAAAAAQD/AP8AAP8AAAAAAAD+//4AAQABAP///wAAAAAAAQEBAAD/AAAAAAAA/wD/AAAAAAAA/wAAAAEAAP/+/wAAAQAAAAAAAP///wABAAEAAAAAAP8A/wAAAAAAD0kZAA9KGQD1zu8A65zcAPTN7gAAAAAAAQEBAP8A/wD/////AP8AAAABAAH/AP8AAAAAAP////8BAAEBAQEBAf8A//8BAAEBAAAAAP8A/wABAAEAAAAAAQABAAAAAAAAAAAAAAAAAAEAAQAA/wD/AAAAAAABAAEB////AAABAAAAAAAAAAAA/////wEBAQEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAEAAAEBAQEAAAAA/wD/AP8A/wAAAAAA/////wAAAAAA/wABAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAAAP///wAAAAAAAAEAAQD/AAAA/wD//wD/AAAAAAAAAAABAAAAAQAAAP8A/wAB/wD/AAAAAP8AAQABAP8AAP////8GGQkBGn0sAQsyEQABAAEAAP8AAP8A/wABAAEA////AP///wAAAQAAAAAAAAD/AAAAAAAA////AAEBAQAAAQAA////AAD/AAAAAAAA/wD/AAAAAAAB/wEA/wD/AAAAAAAAAAAA/gD+AAAAAAABAAEA/gD+AAAAAAAAAAAA////AAEBAQD///8AAQABAP8A/wAAAAAAAf8BAAAAAAAA/wAA/wD/AAAAAAD/AP8AAP8AAAEBAQD/AP8AAP8AAAAAAAAKMRAAH5U0APC15gHrnd0A+uf3AAD/AP8AAQABAP8AAAD/AAAAAAAAAAAAAAABAAH///8AAAAA/wAAAAAAAQAAAAAAAAD/AAD/Af8AAP8AAAABAAABAAEA/////wAAAAEA/wD/AAAAAQAAAP//Af8BAAAAAAD/AP8AAAAAAAAAAAAtZLcVAAAgAElEQVQAAP8AAAABAAAAAAABAAD///8AAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP8A//8BAQEBAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAIBAgH/AP8B/////wAAAAAAAAAA////AAABAAEA/wAAAQABAP8A/wAAAAABAAAAAAAAAAAAAAAAAAAA/wABAAEA/wAAAAAAAAAAAAEA/wAAAg0EARNWHwAVZCMAAAD/AP///wD/AP8AAAAAAAEAAQD/Af8A//8AAAAA/wAA/wAAAAAAAAAAAAABAAEAAAAAAP7//gAAAAAAAAAAAAEAAQD+AP4AAQABAAAA/wD+AP8AAAAAAAAAAAD/AP8AAQABAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA/wD/AAAAAQAAAP8AAAAAAP8A/wAAAAAAAAAAAAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAP//AAAAAP8AAAAAAA9KGQAPSRkA653eAOud3QEA/wD/AAAAAQAAAAD/AP//AQABAAD/AAEAAAAAAAAAAf////8AAAAA/wD/AAEAAQAA/wAA/////wEAAQH/AP8AAAAAAAAAAAAAAAABAQEBAP7//gAB/wEAAAEAAAD/AAEAAAAA/wD//wEAAQH///8AAAAAAP8A//8BAAEB/wD/EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP//AQABAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAP///wAAAAAAAAAAAQAAAAAAAAAAAAAAAAD/AAAAAAAA////AAAAAAAAAAAAAAAAAP////8AAQABAQABAQD/AAD/AP8AAQEBAAD/AP8HJAwAHYowAQUYCAAA//8A/wD/AAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAAEBAQD///8AAAAAAAAAAAAAAQAA////AAAAAAABAQEA////AP8A/wAAAAAA/wD/AAEBAQD///8AAAAAAAABAAD/AAAA///+AAABAQABAAAA////AAABAAAA/wAAAAEAAAD/AAABAQEAAAAAAP///gAAAAAA/wD/AAAAAAAAAQAAAQABAP///wD/AP8AAAAAAP8A/wABAQEAAAAAAP///wABAQEA////AAAAAAAAAAAAFGMhAA9LGQDhaswA++j4AAAAAP8BAAEBAAAAAAAAAAAAAQAAAP8AAAABAAH/////AQEBAQAAAAAAAAAAAAEAAQABAAAA/wD/AAAAAQAAAAAAAAAA////AAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAP////8BAQEB/wD/AAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP//AP8AAAAAAAAAAAD/AP8A/wD/AAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAAAA/wD/AAAAABJWHQEiojgBBBcHAAAAAAD+AP4A////AAAAAAD///8A/wD/AP///wAAAAAA////AP///wAAAAAA////AP8A/wD+//8AAAAAAP8A/wD+/v4A/wD/AP///wD/AAAA/wD/AP///wD/AP8A/wD/AP7+/gD///4A/wD/AP///gD+/v4AAAAAAP///wD///8AAP8AAAAAAAD+//4A/v7+AAAAAAD///8A////AAAAAAAA/wAA/v/+AAAAAAD///8A////AP///wD+//4A/v7+AP///wD///8AAAAAAP///wD///8AAAAAAAQYBwAjrjsBFGMhAP8A/wH/AP//AAAAAP8A/wAA/wD//////wD/AP8AAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAAAAAAB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIDAhD+/v4AAAAAAAABAAH///8AAAAA/wABAAEAAAAAAQABAAABAAD///8AAAAAAQEBAQAAAAAA/wD/AP8A/wEBAAEAAAAAAP8A/wABAAEA////AP8A/wAAAQD/AP8AAAABAAEAAAAAAAAAAP8A/wADDQUBF28mAA5JGAD+//4AAAAAAAD/AAD///8AAQIBAP7//gAAAAAAAP8AAAD/AAD/AP8AAP8AAP8A/wAAAAAAAAAAAAD/AAAAAP8A/wAAAAAAAAAAAAAAAP8AAAD/AAAAAP8AAAAAAP8A/wAA/wAAAQEBAP8A/wAB/wEA/wD/AAAAAQAAAP8A////AAD/AAAAAQAA////AAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAP///wABAAEA/wD/AP8A/wAAAAAAAAAAAAAAAAAA/wAAAQABAAABAAD+//4AAAAAAAAAAAABAAEA/v7+AAAAAAAAAAAAE2IhAAMMBQDqnd4B/vP7/wEBAQH///8AAQEBAf8A/wABAAEA/wD/AAD/AP8AAQABAP8A//8B/wAA/wAAAAEAAf8A/wEA/wAAAAEAAP8A/wAA/wD//wH/AQD/AP8AAAAAAAAAAQABAAD/AP8AAP8A/wAAAAH/AP8AAQEBDwAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACkpKf8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wABAAH/////AQABAAABAAEA/wAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQAAAP8AAAUZCAAahy4ACCUNAAAA/wABAAEA/wD/AAAAAAAAAAAAAAAAAAD/AAABAgEA////AAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAEAAQD/AP8AAQABAP8A/wD86PgA4WzOAPzn+AAAAAAAAAAAAAAAAAAAAAD/AAEAAQD/AP8BAQEBAAAAAP8A/wD/////AQABAQAAAAD/AP//AQABAQAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAANfX1wEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQD/AAD/AP8A/wD/AAAAAAH/AP8A/////wAAAP8A/wAABBkIABySMQAHJAsAAAD+AAD//wD+//4AAP//AP///wAAAP8AAP//AP8A/wD//v4AAAAAAP///wAA//8AAAD/AP8AAAD///8A////AAAAAAD///8A////AP///wD///8AAAAAAP///wAAAP8A/wD/AP7//gD///8A////AP///wAAAAAA///+AP8A/wD+//4A////AAAAAAD+//4A////AP///wAAAAAA/wD/AP///wD///8A///+AP///wD//wAA////AP///wD///8AAP//AP7//gAAAAAAAP//AP///wAAAAAA////AAD//wD+//4A////AP7//gAA//8A///+AP///wADFwcAHZMxAAUZCAAAAAAAAAAA//////8AAAABAAAAAAAAAAH///8A/v/+/wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wABAAAAAAEBAQEAAAAAAAAAAP8A/wD///8A/////wD/AP//AP8A/wD/Af////8AAAAA//////8A/wD/AP////7//wAAAAAA/wAAAQABAP8A/wABAAEAAQEBAf///wEEGAgAHZIxAAQZBwD/AP8A/v7/AP7//wD/AP8A/gD/AAAAAAD+/v8A/gD/AP8A/wD/AAAA/v/+AAAAAAD/AAAA//8AAP7+/gD///8A////AP///wD///8AAAD/AP///wD///8A/v7+AP///wD+//8A////AP8A/wD///8AAAAAAP///wD+/v4A/wAAAP7+/gD/AP8A////AP7//gAAAAAA/wD/AP///wD+//4A/v7+AP///wD///8AAAAAAP8A/wD/AP4A////AP8A/wD///8A/gD/AP8A/wD+/v4A/gD/AP///wD+/v4A/wD/AP8AAAD///8A/wD/AP///wD+//8A/gD/AAAA/wD/AP8ABBcHAByTMQAEGAcA////AQEBAQH/////AP8AAP8A/wAAAAAAAAAAAf8A//8BAAEBAAAAAP8A//8BAAEB/wD//////wABAAEBAAAAAQAAAAH/AP//AQABAf/+////AP8AAAAAAAABAAH/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAf8A/wAAAAAA////AAEAAQD///8AAAAAAAYaCQAcki8AAxgGAP///wAA/wAAAAAAAP8A/wAA/wAA////AP7//gD/AP8A//7/AP///wD///8A//7/AP7+/gD+//4A/v/+AP8A/wD///8A////AP///wD///8A/v//AP///wAAAAAA/wD/AP///wD///8AAAD/AP/+/wD/AP8A////AP8A/wD///8A/v7+AP8A/wAA/wAA/wD/AP///wD+//4A////AP8A/wD///8A/wD/AP8A/wAAAAAA/v/+AP///wD///8A/wD/AP///wAAAAAA////AP///wD///8AAP//AP8A/wD/AP8AAP8AAP7+/gD/AP8A//7/AP8A/wD/AP8A////AP7//wD///8A/wD/AAMXBgAckzEABRkIAP///wAAAAAB/////wD/AAD/AP8AAAAAAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAA/wD/AQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wEAAQAAAQAAAAAAAP8A/wAAAAD/AQwDABqRLgADGAcA////AP///wD+//4A/v/+AP///wD+//4AAAAAAP///wD///8AAAAAAP///wD///8A/wD/AP8A/wD///8A////AAD/AAD/AP8A/wD/AP7//gD/AP8A////AP8A/wD/AP8A////AP8A/wD///8A//8AAAABAAAAAAAA////AP///wD///8AAAAAAP///wD+//4A////AP///wD///8AAP8AAAD/AAAA/wAAAAAAAP///wD///4A////AP///wD///8AAP8AAAD/AAD+//4A////AP///wD/AP8A/wAAAP///wD///8A/wD/AAABAAD///8A/wD/AP///wD///8A////AP///wD///8A////AAD/AAAEFwcAGYYsAAIMBAAAAAAAAAAAAQABAAAA/wAAAP8AAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AP///wAAAAABAAAAAP///wABAAEA/////wD/AAD/////////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAAD/AAAAAAABEWAfAAMXBwD///8A////AP///wD///8A////AAAAAAD///8A/v7+AP///wD///8A/v/+AAAAAAD+//4A////AP///wD///8A////AP7//gD///8AAP//AP///wD///8A////AP///wD///8A////AP///wD///8A/v/+AP7+/gD+/v4A/v/+AAAAAAD/AP8A/wD/AP///wD///8A////AP///wD///8A/v/+AP7//gD/AP8A/v7+AP///wD//wAA////AP///wD///8A/v/+AP7//gD///8AAAAAAP///wD///8A/v7+AP///wD///8A/v7+AP7+/gAAAAAA////AP///wD/AP8A////AP///wD///8A////AP7//gD+//4ABiQLABRuIwD/////AAAA/wD/AAD/AP//AAEAAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAP///////v///////wAAAAAPVRsAD1UaAP///wAAAP8AAAAAAAAAAAD///8A////AP7+/gAAAAAA////AP///wD///8A////AP7+/gD///8AAAAAAP///wD///8AAAAAAP///wD/AP8A/v//AP///wAAAAAAAAD/AP8A/wD+//4A/wD/AP///wD/AP8A////AP8A/wD/AP8A////AP7+/gD/AP8A////AAAAAAAAAP8A/wD/AP8A/wD///8AAAAAAP8A/wD+/v4A/wD/AP///wD/AP8AAAAAAAAAAAD///8AAAAAAP8A/wD/AP8A/v7+AP///wAAAAAA/wD/AP8A/wAAAAAAAAAAAP///wD+/v4AAAD/AAAAAAD//v8A/wD/AAAAAAD/AP8AAAAAAP///wAAAAAA/v/+AAxHFgAQVhwB/wD/Af8A//8A/wAAAP8AAAEAAQH/AP8A/wD///8A/wAAAAAB/wD//wAAAAAAAQAB/wD/AAD/AAABAAEBAAAAAQEAAQH///8A////AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wABAAEAAAAAAAAAAAD/AP//Af8BAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAB/wD/AAABAAEA/wD/AAAAAAEBAQH/AP8AAP8A/wQZBwASbCEA////AAAAAAAA/wEAAAD/AAAAAAD///8AAAEAAAAAAAAA/wAAAAD/AP8AAAAAAAAAAAAAAAEAAQD///8AAAAAAP///wAAAQAA////AAD/AAAAAAAAAQAAAP8AAAAA//8A//8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAQAAAAAAAAAAAAAA/gAA/wH/AAAAAAABAAEAAAAAAP8A/wABAAEA/v/+AAEAAQD///8AAQABAP8A/wD//v8AAAEAAAAAAAABAAEA/v/+AAD/AAAAAQAAAAAAAAAAAAD//v8AAAAAAAAAAAD/Af8AAAAAAAD/AAAAAQAA//4AAAAA/wAAAQAAAP8AAAAAAAD///8A/wH/AAD/AAAAAAAA/wD/AAAAAAAQXx0A9MLr//3p+gEAAQAA/wD/AAD/AP8BAQEB////AAEBAQD/AP8AAP8AAAABAAD///8AAAAAAAABAAD///8AAAEAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AP8A/wAAAAD/AP8AAAD/AP8AAAAB////AP///wAAAAAAAAEAARiQLQD///8AAAAAAAD/AAD+//4A/v/+AP7//gAAAAAA////AP///wD+//4A/v//AP///wAA/wAA////AP7//gD/AP8A/v/+AP8A/wD///8AAP8AAP8A/wD///8A/v//AP///wD/AAAA////AP///wD//v8A/wD/AAAAAAD///8A////AP8A/wD///8A////AAD/AAD/AP8AAP8AAAD/AAD+//4A///+AP///wD+//4A////AP7//gD/AP8A/wD/AP///wD/AP8A////AP///wD+//4A////AP8A/wAA/wAA////AAD/AAD/AP8A////AP8A/wD///8A////AP8A/wD///8A/wD/AAAAAAAA/wAA////AP///wD/AP8AAP8AAP8A/wD+//4A//7/AP///wABDAMAFXkmAQAAAAD+//7/AP8AAAAAAAH///8AAAAAAf///wAA/wAAAAAAAf////8A/wAAAP8AAAD/AAEAAAAAAP8AAAD/AP////8AAP8A//8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD+//4A/wD//wD/AAAAAAAAAP8AAP8A//8A/wAAAAAAAAAAAAD/AP//AP8AAP//////AP8AAAEAAP8A/wD/////AAEAAAAAAAAA/wAADEcWAAMXBgAA/wAA/v7+AP8A/wD///8A////AAD/AAD+//4A////AP///wD///8AAAAAAP///wD+//4AAAAAAAD//wD///8AAAAAAP///wD///8A////AP///wD///8AAP8AAP///wD+/v4A/wD/AP///wD/AP8A////AP7//gD///8A////AP///wD///8A////AP7//gD///8A/v/+AP7//gD///8A/v//AP///wD///8A////AAAAAAD///8A/v7+AP///wD///8A////AP///wAAAP8A////AP///wD+//4AAP//AP7//gD///8A/wD/AP///wAAAAAAAAAAAP///wD///8A////AP7//gD/AP8A////AP7//gD///8A/v/+AP///wD///8AAAD/AP///wD///8ABy8OAA1TGQABAAEBAAAAAP8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEBAP8AAAAAAAADGAcAD18dAAAAAAD+AP4A////AP7+/gD///8AAAAAAP8A/wAAAAAA////AP8A/wD/AP8A/v/+AP8A/wD///8A/v/+AP7//wAAAAAA/v/+AP///wD///8A/v/+AP///wD/AP8A/v/+AP///wAAAP8A////AP8A/wD///8A/wD/AP8A/wD///8A////AAAAAAD///8A/wD/AP8A/wD///8A////AP8A/wD/AP8A////AP///wD///8A/wD/AP7+/gD///8A/wD/AP8A/wD///8A/wD/AP///wD+/v8A/wD/AP8A/wAAAAAA/v//AP///wD///8A////AAAAAAD///8A/v7+AP8A/wD///8A////AP///wD+/v4AAAAAAP8A/wAAAAAA////AAAAAAD///8A/wAAAAAAAAD/AP8A////AA9fHAACDAQAAAAAAAEAAQEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AP8A/wD/AP//AAAAAf//////AP//AAAAAP///wABAAEAAP8AAP//////AP8AAP8AAAAAAAEAAAAA//////////8MRxUAAxgGAP7//gD///8AAAAAAAAAAAD///8A/v/+AP7//gD+//4A/wD/AP///wAA/wAA////AAD/AAD///8A////AP8A/wD+//4AAP8AAP8A/wD/AP8A/wD/AAAAAAAA/wAA////AP8A/wD+//8AAAAAAP///wD///8A////AP/+/wD/AP8A////AP7//gAAAAAAAP8AAP/+/wD///8A////AP///wAA/wAA////AP///wD///8A//7/AP8A/wD/AP8A////AAD/AAD///8AAP8AAP///wD///8AAP8AAP///wD+//4A/wD/AP8A/wD/AP8A/wD/AP7+/gD+//4A////AAD/AAD/AP8A/wD/AP8A/wAAAAAA/v/+AP/+/wD+//4A////AP7+/gD/AP8A/v7+AP7//gD//v8A////AAELAwANUxgAAAAAAAAAAAD/AP8AAAAAAP8A/wD/AP8A/wD//wEAAQD//v8A/1KZhScAACAASURBVP//Af8A/wD/AP8BAAAAAP8A//8A/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAQEBAQEKRxUA////AP///wD///8A////AP///wD/AAAA////AAD/AAAA/wAAAP8AAP///wD+//4AAP8AAP7//gD/AP8A////AP///wD//v8A/v/+AP///wD///8A////AP7//gD///8A/wAAAP///wD///8A/v/+AP//AAD/AP8A////AP8A/wD//v8A/wD/AP///wD///8A/v/+AP8A/wAAAAAA/wD/AP//AAD+//4A/wD/AP8AAAD/AP8A/wD/AAD/AAD///8A//8AAP7//gD/AP8A////AP8A/wD/AP8A/v/+AP///wD///8A////AP//AAD///8A////AP///wD//wAAAAEAAP7//gD///8A////AP///wD+//4A////AP8A/wD///8AAAAAAP8A/wD///8A/wAAAP///wD/AP8AAAAAAP8A/wAMUxkAAAsC/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAf///wAAAQAAAAAAAAD/AP8AAAAA/////wD/AAAAAAABAP8AAf8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAP8AAP8A/wABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA//7/AAEBAQD///8AAAAA/wtHFQEDFwYA////AAAAAAABAQEA////AP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAEBAQD///8AAAAAAAAAAAD/AP8AAAAAAAEBAQD///8AAAAAAAAA/wAAAAAAAQEBAP///wAAAAAAAP8AAAAAAAD/AP8AAAAAAAAAAAD/AP8AAAAAAAAA/wABAAEA/wD/AAAA/wAAAAAAAAAAAAABAAD///8AAAD/AAAAAAABAAEA/gD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///gAAAAAAAAAAAAAAAAAA//8AAAABAP///wAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAABAAEA/gD+AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AP8AAAACCwMADEcWAfOt5wAAAAABAAAAAP8A//8B/wEBAAAAAAAAAAAA/wAAAAAAAAAAAAEA/wD/AAAAAQABAAAA/wAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEAAQABAQEAAQH/AP8A/wD//wAAAAD/AP//AP8AAAAAAAAAAAAA////AP///wD///8AAQEBAQAAAAABAAEAAP8AAAxTGAD///8A////AP///wD+/v4A/v/+AAAAAAD///8A/wAAAP8A/wD///8A////AP///wD/AP8A////AAAAAAD/AP8AAAAAAP///wD///4A////AP///wD/AP8A////AP///wD///8A////AP7+/gD/AAAAAAAAAP///wAAAAAA/v7+AP///wAAAAAAAAAAAP8A/wD///8A////AP///wD///8A/wD/AP8A/wD+//4A/wD/AP8AAAD///8AAAAAAP7+/gD/AP8A////AP8AAAD/AP8A////AP///wD///8A////AAAAAAD///8A/v7+AP///wAAAAAA////AP///wD///8A/v7+AP8A/wD///8A////AP7//gD///8A////AP///wD/AP8A/wD/AP8A/wD///8AAAAAAP///wD///8A/v//AP///wD/AP8ACDsQAAAAAAD/AP//////AAAAAAAAAAAAAAAAAP////8AAAAAAAAAAP8A/wD///8AAAAAAP///wD/AP8AAAAAAP8A//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEB////AAAAAP8AAAABAAEAAQAAAAAA/wAA/wH//wAAAAEA/wD/AAAAAQEBAQD/AP8A/////wAAAAAAAAAABSQKAQQjCQD///8AAAAAAAABAAAAAAAAAAAAAP///wAAAAAAAP7/AAEBAQD///8AAAAAAAABAAAA/wAAAP8AAAAAAAD///8A/wEAAAAAAAAA//8AAAEAAAD/AAAAAAAA/wD/AAEAAQD/AP8AAP8AAAABAQAA//4A/wAAAAD/AAD///8AAAEAAAAAAAD///8AAP8AAAEBAQD///8AAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAP8AAAD//wAAAAAA/wD/AAEAAQD///8AAP8AAAEAAAD+//8AAAAAAAAAAAAAAQAAAAAAAP///wAAAAAAAP8AAAABAAD///8AAAAAAAAAAAAAAAAAAQABAAD/AAD/AP8AAAABAAAA/wAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAA/wAA/wD/AAD/AAAAAQAAAP8AAAEBAQD///8ABi4NAAcvDQD50fMB/wD/AAD/AAD/Af8AAAAA/wABAAH/AP8AAP8AAAABAAAAAAAB/////wABAAAAAAAB/////wABAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AP//AP8BAAAA/wABAAEAAAAAAAAAAP///wAAAAAAAQABAf///wAAAQABAP8A//8A/wEA/wAAAQEBAf///wAAAQAACToRAP//AAAAAP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP8AAAAAAAABAAEA/wD/AP///wABAAEA///+AAAAAAAAAAAAAf8BAP4A/wAAAP8AAP8AAP8B/wAAAAAAAQABAP///gAAAAAAAQABAP///wAAAQAAAP4AAAABAAAAAAAAAAAAAP///wABAAEA//7/AAABAAAA/wAAAQABAP8A/wABAAEA/wD/AAEAAQD/AP8AAP4AAP8B/wAAAAEAAQAAAP7//gAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAABAAAA/wAAAAAAAP8AAAEAAQD///8AAAAAAP/+/wAAAQAAAAABAAYvDQD40fIAAP8A/wAAAAAA/wAAAAAAAQEBAQD///8AAQEBAP////8AAAABAAAAAAD/AAEAAQAAAAAAAAD/AP//AP8BAAEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAQEAAQABAf7//gABAAEAAAAAAP8A//8BAAEB/////wAAAAEAAAAAAAAAAQD/AAAAAAAA////AAAAAAAAAAAABjANAP///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQEBAP///wD/AP8AAAAAAAAAAAAAAQAA////AAAAAAABAQEA/v/+AAEBAQAAAAAA/wD/AAEAAQAAAAAA/v/+AAAAAAAAAAAA/wD/AAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAEAAAD+AP8AAQEBAAD//wD/AAAA/wD/AAAAAAD/AP8AAQAAAP4A/wAAAAAAAAAAAAD/AAAAAAAA/wD/AAEAAQAAAQAA////AAEAAAAAAAEAAAD/AP8AAAD/AP8AAQAAAP8AAAAAAAAAAQEBAP///wAAAAAAAQABAP8A/wABAQEA/wD/AP///wAAAAAAAAAAAAEAAQD/AP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEAAP8A/wAA/wAAAQEAAAYvDgAA/+UAAQEBAf7//v8BAAEAAAAA//8A/wEAAAD/////AQAAAAEAAQAAAP8AAQAAAAAA/wD//wD/AAAAAAAAAAD/Af8BAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA/wD/AAEAAQD/AP8AAQABAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAD/AAAAAAD//wD/AQEAAQABCwIABS0MAP///wAAAAAAAQEBAP///wABAQEA////AAEBAQD///8AAAEBAP///wAAAAAA/wD/AAD/AAAAAAAAAQEBAAAAAAD+/v4AAAAAAAAAAAD/AP8AAP8AAP///wAAAQAAAP8AAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAEBAQD///8AAAAAAP8AAAAAAAAA////AAEBAAD/AAAAAQABAP///wAAAAAA/wAAAAABAAAA/wAAAAAAAAEBAQD///4AAAAAAP8A/wAA/wAAAAAAAP8BAAAA//8AAAAAAAAAAAAAAAAA/wAAAAABAAABAAEA/v7+AAAAAAAAAAAA/wD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAABAQAA//7/AAAAAAAAAAAA////AAUtCwABDAMA/vP8/wEBAQH/AP8AAQABAQD/AAAAAAABAAAAAP8A//8A/wAAAQABAP8A/wAAAAAAAAAAAAEAAQEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AAAAAAABAAEAAAAAAAEBAQD///8BAQABAAD/AAD/AP//Af8BAf8A/wABAAEBAAAAAP////8FIgoBAAD/AP//AAABAQEA/v7+AAAAAAD/AP8AAAAAAP///wAAAAAA//7/AAABAAAAAAAAAf8BAP8A/wAA/wAA/wD/AAEAAQD/AP8AAP8AAAAAAAAA/wAAAQEBAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAEAAQD+//4AAAAAAAAAAAABAAEAAAAAAP///wD///8AAAAAAAABAAAAAAAAAP8AAP8AAAAAAAAA////AAABAAAAAAAAAAAAAAD/AAAA/wAAAAEAAP///wABAAEA/wD/AAAAAAAA/wAAAAEAAAH/AQD/AP8AAAAAAAEAAQD///8AAAEAAAD+AAD/AP8AAAEAAAAAAAAA/wAAAQEBAAAAAAD/AP8AAAAAAAD/AAAAAQAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAP4AAAABAAAA/wAA////AAEBAQD/AP8AAAAAAAD/AAAFIwkA+dHzAf8A/wABAAEAAAAAAP////8AAAAAAAEAAAEAAQH//////wD/AQEBAQD/AP8AAAAAAP8A/wAB/wEA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAA/wD//wEBAQH///8AAAAAAAD/AP8AAAAA/wD/AAAAAAEAAQAB/wD/AAD/AP//AP8BAAAA/wAAAAEFIwoA//8AAAAAAAD///8A/wD/AAAAAAAA/wAAAAAAAAEAAQD/AP8AAQABAAD/AAD/AP8AAAAAAP8A/wAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAAEAAQD/AP8AAAAAAAH/AQD/AP8AAQEBAAD/AAD/AP8AAQABAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAAEAAQD/AP8AAP8AAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAA/wAA////AAAAAAAAAQAAAQABAP8A/wAAAAAAAAAAAAH/AQD+AP4AAAAAAP///wAA/wAAAQEBAAAAAAAEIgoA+dDz/wEBAQH/////AAEAAQABAAAA/wAAAQABAf8A/wAAAQABAAAA/////wEAAQAAAAAAAAAAAAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAABAQABAQD/AP//AP8AAQABAAAAAAEAAQAA/////wEAAQAA/wAAAAAAAAAAAAEBAQEA/wD/Af////8CFwUB/v/+AAAAAAABAQEA////AAEBAQD///8AAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAEAAQAAAQAA////AAEAAQD/AP8AAAAAAAAAAAABAQEAAAAAAP///wABAQEAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AP8A/wAAAAAAAP8AAP8A/wAAAAAA/wD/AAAAAAABAAAA/wAAAAAAAAD/AP8AAAAAAAAAAAABAQEA////AP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAABAAD///8AAQEBAP///wAAAAAAAP8AAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAQEBAP7//gAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wACFwUAAAAAAf//////AP8BAf8BAP8A/wABAAEB////AAAAAP8AAAAB/wD/AAEAAf8A/wABAAAAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAP///wEBAAEAAAAA/wAAAAAA/wAAAAAAAAAAAAAAAAD//wD/AAD/AAD/AP8AAAAAAAAAAAACFwYA////AAABAAD//v8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA/wD/AAD/AAAAAAAAAQEBAP7//gAA/wAAAAEAAP///wAAAQAAAP8AAAEBAQD///8AAAAAAP///wAAAP8A/wAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAAAA/wD/AAEBAQD///8AAAAAAAABAAD//wAAAAAAAAAAAAAAAAAAAQEBAP///wD/AP8AAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAP/+/wAAAQAA//7/AAAAAAAAAQAAAAAAAAEAAQD///8AAAAAAP///wAAAAAAAAAAAAEBAQD///8AAAEAAAD/AAABAQEA/v7+AAAAAAAAAQAAAP8AAAAAAAABAQAA/v//AAABAAACFgYAAAAAAP8A/wEBAAH//wD/AQEAAQEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAEAAAAAAAAAAP8A//8BAAEB/wD//wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wD/AQEAAQAAAAAAAAAAAQAAAAD/////AAEAAf8A/wABAAEBAQABAP8A//8BAAEBAAAAAAAAAAABCgIA/wD/AAD/AAAAAAAAAQABAP8A/wAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAEAAQD///8A/wD/AAD/AAAAAAAAAQABAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wD/AAAAAP8AAAABAAAA/gAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD/AAABAAEA/wD/AAAAAAABAAEA/wD/AP///wAA/wAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAA////AAD/AAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAA/wAAAAEAAAEAAQD///8AAP8AAAAAAAAA/wAAAAEAAAAAAAD///8A/wD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA////AAEAAQD+/v4AAAEAAAAAAAAA/wAAAAAAAAAAAAD//gAAAAAAAAEAAQABDAIAAAAAAAEAAQD///8AAQEBAAABAAAA/wAA/wD/AAEBAQAA/wAAAAAAAf8A/wAA/wD/AQEBAQD/AAD/AP//AAEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wAA/wAAAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAA/wD/AAABAAD/AP8AAP8A/wAAAAEADAIA////AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAP4AAAABAAAAAAAA////AAAAAAAA/wAAAAAAAP8A/wAAAAAAAAAAAAAAAAAA/wAAAAAAAAH/AQD/AP8AAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAD///8AAQABAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAQAAAP/+AAABAQEA////AAAAAAABAAEA////AAAAAAD/AP8AAAAAAAAAAAABAQEA////AP8A/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAD/AP8AAP8AAP8B/wAAAAAAAP8AAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAP///wABCwMA////AAABAAD/AP8AAAAAAAD+AAAAAQAAAP8A/////wEAAAAAAAEAAAD/AP8AAQAA/wD//wAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wH/AAD/AAAAAQAAAP8AAQABAAAAAAAAAP8AAQAAAAD/Af8A/////wEAAQEAAAAAAAEAAQD/AAABCwIAAP8AAAABAAD//v8AAQIBAAD//wD/AAAAAAAAAAAAAAAAAAAAAQABAAAA/wAAAQEA////AAEBAQAA/wAA/wD/AAH/AQAAAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAD//wAAAQAAAAAAAQAAAAAA/wD/AAAAAAAAAAAA/wD/AAEAAAD+AP8AAAAAAAEAAQD/AP8AAAAAAAAAAAABAAAAAAAAAP8AAAABAQEA////AAAAAAAAAAAA/wAAAAAAAAAA/wAA/wD/AAEBAQD+//4AAAAAAP8A/wAAAAAAAQABAP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAQEA/wD/AAD/AAABAAAA/wAAAAAAAAAAAAAAAf8AAAAAAAD/AAAAAAAAAAAAAAD/CgEAAAEAAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAQABAAAA/wAAAP8AAAABAAEA/wAAAAAAAAAAAAAAAAD//wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wD/AAAA/wAAAAEAAQH/AQAAAAD/AAAAAQAAAAD/////AQABAQAAAAAAAQAAAAAAAP8A///98vwBARUFAAAAAQAAAP8AAP8AAP7//gABAAEAAAAAAAEBAQAAAAAA/v/+AAABAAAA/v8AAAAAAAAA/wAAAAAA//8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAA/wD/AAD/AAAAAQAAAQABAP7//gAAAAAAAQEBAP///wAAAAAA//8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAAAAAAAAAAAAP8A/wAAAAAAAAEAAAEAAQD/AAAA////AAABAAD//v8AAQEBAP///wABAQEA////AAEBAQD+AP4AAP8AAP///wAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAD///8AAAAAAAAAAAABAQEA////AAABAAAA/wAAAQEAAP8AAAD//v8AAAAAAAEBAAD+/wAAAAAAAAAAAAABAQEA/gD/AAAAAAAAAAAAAAAAAAD/AAD+6foA/////wEAAQH/////AAAAAAEBAQH/////AQABAf////8AAAABAQABAP////8BAAEAAAAAAQAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAABAAEA/wD/AP8A/wAAAAAAAQABAP8A//8AAAAB/wD/AAEAAQD/////AQEBAQD/AAD/9f0A/wD/AAD//wAAAAAAAP8AAAD/AAAAAf8A/wAAAP/+/wAAAQAAAQABAP///wAAAAAAAAAAAP/+AAAAAQAAAP8AAAAAAAAAAAAAAQEBAP8A/wABAAEA//7/AAAAAAAAAQAAAP8AAAEAAQD//v8AAAEAAP8A/wABAAAA/v7/AAABAAABAAEA////AAEBAQD/AP8AAP8AAAAAAAABAQEA////AAD/AAAAAQAAAAAAAAEAAQD/AP8AAP8BAP8A/gAAAAAAAAAAAAD/AAAAAAAA////AAAAAAD//v8AAAAAAP///wAAAQAAAAAAAAD/AAAAAQAAAQAAAP//AAAA/wAA////AAEBAQD///8AAAEAAAD/AAD///8AAAAAAAAAAAAA/wAA/v8AAAEAAAAAAAAAAAEAAP/+AAAAAQAAAAAAAAAAAAAA//8A//8AAAABAAAA/wAAAAEAAAEAAQD///8AAAAAAP8A//8AXxZWTAAAIABJREFUAAABAAAA/wD/AAABAAEB/////wEBAQH/AP///wD/AQAAAAAAAAAB/wD/AAAAAAABAAEA/wD//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA////AAABAAAAAAAAAQABAP///wAAAAD/AAEAAAAAAAEAAAAAAP8AAAAAAAAAAQAA/wD/AAD/AAH/AP8AAAEAAfzo+QADLQoAAAAAAAAAAAD/AP8AAQABAP7/AAAAAP8AAAAAAAD/AAD/AP8AAAAAAAAAAAABAAEA/wD/AAD/AAABAAEAAAAAAP8A/wAA/wAA/wD/AP///wAAAQEAAAD/AAD/AAAAAAAAAAEAAP8A/wAA/wAA/wD/AP8AAAAAAAEAAP8AAP8A/gAAAAEA///+AAAAAAAAAAAAAAAAAP///wABAAEA/wD/AAD/AAAAAAAA/wD/AAAAAAAAAP8AAAABAAAA/wAA/wAAAAEAAAAAAQABAQAA////AAAAAAABAQEA////AAD/AAAAAAAAAAAAAAD/AAD/AAEAAAD/AAEAAQD/AP8A////AAAAAAAA/wEAAAAAAAEAAAD/AP8AAP8BAAAA/wAAAAAA/wAAAAAAAAAA/wAAAAAAAAH/AQD/AP8AAAAAAP8AAAAAAAAAAP4AAAABAAAB/wEA/gD+AP70/AABAAEB/wD/AAD/AAAAAAAA/wH/AAAAAP8AAQABAAAAAAD/AAEAAAD/AAAAAf8A//8BAQEB//////8A/wAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wD//wD/AAABAAEAAAABAAAAAAAAAAD///8A/wD/AAIBAgD///8AAAEAAP8A//8BAAEBAP8A//70/QH///8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQEBAP///wD/AP8AAAAAAAAAAAD/AP8AAQEBAP///wAAAP8AAAAAAAEAAQD/AP8AAP8AAP8A/wD/AP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8A/wAAAAAAAAAAAAEAAQD/AP8AAAD/AAAAAAAAAAAAAP8AAAAA/wD//wAAAAAAAAEBAQD+/v4AAAAAAAAAAAAAAAAAAAAAAAEBAQD///4AAAAAAP8A/wAAAAAAAAAAAAAAAAAA//8AAAEAAP8AAAAA/wAAAAH/AAAAAAAAAAAAAAAAAAEBAQD///8AAQABAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAAAAP3p+v//AP8BAP8AAAABAAAAAAABAP8AAAAAAAEAAQAA////AAEBAQD///8BAAAA//8A/wAAAAAAAAEAAQAAAP//////AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAQEBAAD/AAAAAAAA/wD//wAAAAAAAAAAAQABAf///wAAAAAAAP8AAAAAAAD///8AAQABAf3f+AD///8AAAAAAAEBAQD///8AAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA/wAAAAAAAP8B/wABAAEA/wD/AP///wABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA/v/+AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAQEBAP7+/gAAAQAAAP8AAAAAAAAAAAAAAQEBAP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/Af8AAP8AAAABAQAAAP8AAP8AAAEBAQD///8AAAAAAP///wABAQEA/gD+AAD/AAAAAAAAAAEAAAD/AAAAAAAAAQEBAAAAAAD///8AAAAAAP3p+gEAAAAA/wD/AAH/AQAAAAD/AAEAAQD/AAAAAAAA/wD//wD/AAH/AP8AAQABAQAAAP8A/wD/AAEAAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD//wEBAQEA/wAAAP8AAP8A//8AAAAAAAAAAAEAAQH/AP8AAAAAAAAAAAAAAAAA/wD//wEAAQH/AP8A/wD///zc9gEAAAAAAAAAAP7//gAA/wAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAH/AQD/AP8AAP8AAAABAAAA/wAAAAAAAAEBAQAAAAAA////AAABAAABAAEA/wD/AAD+AAD/AP8AAAEAAAD/AAD///8AAAEAAP///wAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAABAQEA////AP8AAAAA//8AAAEAAAEAAQD/AP8AAP8AAAABAQAA//8AAAAAAP///wABAQEAAAAAAP///wABAQEA/v7+AAABAAAA/wAAAQABAP///wAAAQAA//7/AAAAAAAAAAAAAAAAAAEBAQD/AP8AAP8AAP///wAAAQAAAP8AAAD//wAAAQAAAAAAAP///wAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAAAAAPzd9wAA/wD/AQEBAf/+//8BAQEB/////wEAAQEA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD///8AAQABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEA/////wABAAEAAAAAAQABAAABAAAB/wEA/wD/AAAAAAABAAEAAP8AAP8B/wABAAEA////Af7p+wD98/sAAQwDAAEAAQD/AP8AAQEBAP/+/wAAAQAAAP8AAAEAAQD/AP8AAAAAAP8A/wAAAAAAAP8AAAEBAQD/AP8AAQABAP7//gABAAAA/wAAAAD/AAD/AP8AAP8AAAEBAQD/AP8AAf8BAP8A/wAAAAAAAP8AAAAAAAAAAAAAAf8BAP8A/wAA/wAAAAEAAAEAAQD///8A////AAAA/wAAAAAAAP8AAP///wAAAQAAAAAAAAD+/wAAAQAAAAAAAAD/AAD/AP8AAP8AAAABAAD///8AAQABAP///wAAAAAA////AAABAAAB/wEA/wD/AAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAA/wAAAP8AAAEBAQAA/wAA/wD/AAAAAAAA/wAAAQEBAP8A/wD//wAAAAD/AAAAAAAAAAAAAf8BAP///wAAAQAAAAAAAAAAAAABAAEA/wD/APzT9QAAAAABAP8AAAAAAAD/////AAAAAP8A//8AAQABAP8A//8B/wEAAAAA/////wAAAAEAAQAA////AAABAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAH/Af8AAAAAAf////8BAQEB////AAD/AAAAAAD/AAAAAQABAP//AP8BAAEAAQAAAAD/////AAAAAf71/P/83vgBBC0KAAAAAAAAAP8A/wAAAP8A/wAA/wAAAAAAAP8A/wAAAAAAAAAAAAEAAQAAAAAA/wD/AP/+/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAP7//wABAQEA/v/+AAAAAAABAAAA/wAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAB/wAA/wAAAAEBAQD///8AAQAAAP8AAAAB/wAA/wAAAAD/AAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAQAA////AAAAAAAAAAAAAAAAAAD/AAABAAEAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAP8AAAABAAAAAAAA////AAAAAAAA//8AAAEAAAEAAAD/AAAA/wD/AAEAAQAAAAAA////AAAAAAD/AP8A/dP2AAD/AAAAAQD/AP8AAP8A/wABAAEAAQEBAf///wABAAEA/wD/AQAAAAAA/wAAAAEAAQAAAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wABAAAAAAEAAQH/////AAAAAAEAAQEAAAABAAEAAP///wABAAEAAAAAAP8A//8BAAEBAQEBAAD/AAH7yPMAAywJAP8A/wAAAAAAAP//AAAAAAABAQEA////AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAQAAAP8AAAEBAQD///8AAQEBAP///wAAAAAA/wEAAAD/AAD///8AAAAAAAEBAQD+//8AAQEBAAAAAAD///8AAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA/wAAAAD/AAD/AAAAAAAAAAAAAAD///8AAAEAAP//AAD/AAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQEAAP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEBAQD///8AAAAAAAAAAAAAAQAAAAAAAAEAAQD///8AAAEAAAD/AAAAAAAAAP8AAP8AAAAAAAAAAAAAAAABAAD//v8AAAAAAAAAAAAAAAAA+73xAAAAAP8AAAABAAAA/wEBAQH/////AP8AAAABAAD///8AAAAAAAAAAAD/AP8AAf8BAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAf8A////AP8AAAAAAAAAAAD/AP8A/wD//wEAAQH/AP///v/+AP8A///7vPD/AAAAAP///wAAAAAA////AP///wD+//4A////AP///wD///8A////AP///wD///8A/wD/AP8A/wD//v8A////AP///wD///8A/v/+AP8A/wD/AP8A//7/AP///wAAAAAAAAAAAP///gD/AP8A/v7+AP7//gD///8AAAAAAP///wD///8A////AP///wD/AP8A////AAAAAAD+/v8A////AP8A/wD///8A/wD/AP7+/gD///8A/v7/AP///wD/AP8A////AP///wD/AP8A/wD/AP8A/wAAAAAA//8AAP///wD///8A////AP8A/wAAAAAA/wD/AP8A/wD///8A////AP7+/gD/AP8A////AP8A/wD///8A////AP7//gD/AP8A////AP///wAAAAAA////AAAAAAD///8A////AP7+/gD/AP8A/wD/AP8A/wD///8A/NP1AP8A/wD//v//AAAAAf///wAAAAABAAAAAP///wAAAAAA/wD/AP///wAAAAD/AAEAAAEAAQH///8AAAEAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAEA/////wABAAEAAAAAAf8BAAAAAAABAAEA////AAAAAAEAAAAAAAAAAf8A/wAA/wABAAEAAAAAAAEA9f4A+9L0AAMtCgD///8AAAAAAAAAAAAA/wAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAAEA/wD/AP///wAA/wAAAP8AAAABAAAA/wAAAQEBAP8A/wAA/wAAAAAAAAAAAAD/AP8AAQABAP/+/wAAAQAA//7/AAABAAAAAAAAAP8AAAABAAAA/wAAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAf8BAP8A/wAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAQD///8AAAAAAAEAAQD+AP4AAP8AAAABAAAAAAAAAAAAAAH/AQD+AP4AAP8AAAABAAABAAAA/wAAAAD/AAAA/wAAAAD/AAAAAQABAAEA////AAD/AAAAAQAAAAAAAAAAAAD//v8AAAEAAP///wAAAAAAAP8AAAEBAQD///8AAQAAAP8AAAD91PcA/en6AAEAAQEAAQAAAAAAAAAAAAAA/wAA/wH/AAAAAAD/AP8AAAAAAAAAAAAAAAAB////AAEAAQAAAQAB//7//wABAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAD/AP8AAAAAAQEAAQD/AP8A/v/+/wEAAQD/Af8AAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAD/AP8A+7LuAQIsCQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAD///8AAgACAP8A/wD/AP8AAQABAP8A/wAAAAAA/wD/AAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAAEAAAAAAAAAAAAAAAAAAAEBAQD///8A/wD/AAEAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAEAAQD///8AAQABAP4A/gAA/wAAAAEAAAH/AAD+AAAAAAAAAAAAAAAAAAAAAAAAAAD//wD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQEA/wD/AP///wABAQEA//8AAP8A/wD7vPD/AP8AAf8B/wAA/wAAAQEBAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8AAP8B/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEAAAAAAP///wAAAAAAAQABAQAAAAAAAAAAAAEAAAD/AAD/AP//AQEBAf////8BAAEBAAEAAAD/AAD/AP8A/Mn1AAb1/gAACgEAAAD/AAEBAgD///8AAAAAAAAAAAD/AP8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAA/v/+AAAAAAAAAAAA/wD/AAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAP///wAAAQAAAP8AAP8AAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAD/AP8AAQABAAABAAAA/wAAAAAAAP///wAAAAAA/wD/AAAAAAAAAAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//v8AAAAAAAAAAAD///8AAAAAAP/q+wD8vvIBAAEA/wD/AAEAAQAA/v/+/wEAAQEAAAAAAAAA/wAAAAD/AP8BAQABAP8A/wAA/wAAAQEBAAD/AAAAAQABAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wAA/wAAAP8A//8A/wABAQEB////AAEAAQEAAAAAAP8AAP8A/wAAAAD///////qx7gAAAAAA/wAAAP///wD+//4A////AP///wD/AP8A/wD/AP7+/wD/AP8A////AP///wD/AP8A/wD/AP8A/wD+/v4A/v7+AP8A/wD///8A////AP///wD/AP8A////AP7+/gD/AP8AAAAAAP///wD+//4A/wD/AP8A/wD///8A////AP///wD+//4A/v7+AP///wD///8A/wD/AAAAAAD///8AAAD/AP///wD//v8A/v7+AP8A/wD///8A////AP8A/wAA/wAA////AAD/AAD///8AAAAAAP///wAAAAAA/wD/AP8A/wD/AP8A/wD/AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAP///wAAAAAA////AP8A/wD/AP8A////AP/+/wAAAAAA/wD/AAAAAAD///8A////APun7gAA/wAAAP8AAAAAAAD///8AAQABAf8A////AP8A////AP8A/wABAAEAAAEAAAD/AAAAAAAA////AP8A//////8AAAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA/wD/AAEAAQAAAAAAAAABAAAAAAAAAAD/AP8AAP8AAAABAAD///8AAAAAAP8A/wAAAAAAAAAA/wEBAQH///8BAAAAAPuo7QADQg0AARYEAAAA/wAA/wAA/wH/AAAAAAAA/wAAAAAAAAEAAQD///8AAP8AAAABAAAA/wAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA/wD/AAAAAAAA/wAAAAAAAAD/AAAAAQAAAQABAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wAA//8A/wABAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAD/AP8A////AAD/AAD///8AAAEAAAEAAQD///8AAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAP8A/wAAAAAAAP8AAAAAAAD/AP8AAP8AAAD/AAAAAQAAAAAAAAEAAQD+//4AAAAAAP///wAAAQAAAOr8APu+8QAAAAAAAAAAAQAAAAAAAAAA/wD//wD/AAAAAQD/AAEAAAEAAQH/AP8AAP8AAAABAAEBAQEA////AAEAAQH/AP//AAAAAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP8AAAAAAAEAAAAAAAAA/wD/AP8AAAAAAAAA/wAAAP8AAf///wAA/wD/AP8A/wAAAAD6kukA////AP7//wAAAAAA////AP///wD///8A////AP7//gD///8A/wD/AAD//wD///8AAAAAAAD/AAAA/wAA////AAAAAAD///8A////AP///wD///8A////AP///wAA//8A////AP///wD///8A////AP8A/wD///8A/v/+AAAAAAAA/wAAAP//AP8A/wD/AP8A////AAAAAAD//wAA/wD/AP///wD///8A////AP///wAA//8A////AAD/AAD///8A////AP7//gD///8A////AAABAAD/AP8AAP//AP7+/gAAAP8A////AP///wD///8A/wD/AP///wD/AP8A/wD/AP///wAA//8AAAD/AP8A/wAA/wAA/wD/AP8A/wD///8A////AP7//gD///8A////AP8A/wD//v8A+6juAAD/AP8A/wAAAP8AAAEAAQAA/wD/AAAAAQEBAQEA/wAB////AP8A/wAAAAAAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAf8BAf////8AAAAAAAAAAQABAAAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAD/AAD/AP8AAAAAAAH/AQD90/b//tT3AQErCAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/gD/AAAAAAAAAAAAAAAAAP///wABAQEA////AAEBAQD///8AAQABAAAA/wD/AQEA////AAAAAAAAAAAAAAAAAAAAAAABAQEA////AP8B/wAA/wAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAQAAAP8AAAD/AAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAAAAAQAAAP7//wAAAAAA/wAAAAAAAAAAAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wD/AAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9v/QA/L3yAAABAAEA/wAAAAEAAP////8AAQABAP8A//8B/wEAAQAAAQABAQD/AAAAAQAAAAAAAAAAAAAAAAAB/////wEBAQH///8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf8A/wAA/wAAAAAAAP8A/wEAAQABAAAAAAD/AAH/////AAAAAAABAAAAAQAB/wD/AAAAAAAA/wAA/wD///8A//8BAAEBAQEBAf8A//8BAAEA+5PrAP/1/gAAAAAAAAAAAP///wD///8AAAAAAP8A/wD///8A/wD/AP8A/wD+//8A////AP///wD///8A////AP///wD+/v4A/wD/AP///wD///8A/gD+AP8AAAD///8A/wD/AP///wD///8A/wD/AAAAAAD+/v4A/wD/AP/+/wD/AP8A////AAAAAAD/AP8A////AAAAAAD///8A////AP8A/wD/AP8A/gD/AP///wD/AP8A////AP7+/gD///8AAAAAAP///wD///8A/v//AP///wD///8A////AP8A/wD+/v4A////AP8A/wD///8A////AP8A/wD/AP8A/v7+AP///wD/AP8A////AAAAAAD/AP8AAAAAAP8A/wD///8A////AP///wD///8A/wD/AP7q+wD9qe4AAAEAAAD/AABKzNtnAAAgAElEQVQAAAAAAAAAAP8A/wEAAAAAAAAAAQAAAAD/////////AAAAAAAAAAAAAP8AAAD/AAD/AP8AAQABAQD/AAAAAAAAAQABAf////8A/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAH/AP//AAEAAAAAAAD///8A/wD///////8AAAAAAP8AAAD/AAD///8AAAAA/////wD/////AQABAQAAAAEAAAAA//7//wAAAAEAAAAB/un6APuT6gD///8A/v/+AP///wD/AP8A/v/+AP///wD///8A////AP///wD///8A/wD/AP///wD/AP8A/wD/AAAAAAD/AP8A//7/AP7+/gD/AP8A//7/AP7+/gD+//8A//7/AP8A/wD/AAAAAP8AAP7//gD///8A//7/AP8A/wD///8A/wD/AP7//gD//v8A/wD/AP7+/gD/AAAA/wAAAP///wD///8A//8AAP8A/wD///8A////AP///wD///8A/v//AP8AAAD///8A/wD/AP8A/wD/AP8AAAAAAP//AAD///8A////AP///wAAAAAA/wD/AP/+/wD///8A/wD/AP8AAAD//v8A/wD/AP7+/gD///8A/v/+AP/+/wD///8A/wD/AP8A/wD///8A////APyo7gD/6fwA////AP8A/wD/AP8A/////wAAAAD//v///wD/AP////8BAAEBAAAAAP8A/wAA/wAA/wD/AAABAAAAAAD//wD/AP8A/wAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wEAAQAAAAAB//7//wEAAQAA/wAAAAAAAf8A/wAAAAABAAEAAAABAAABAAEAAAAAAQAAAAAAAAAA/v/+/wAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAP7I9f/8qe8A////AP8A/wD//v8AAP8AAP///wAAAAAA////AP///wD///8AAP8AAP8A/wD///8A////AP///wAA/wAAAAAAAAABAAD///8A/wD/AAAAAAD///4A/wD/AAD/AAD///4A/v/+AP///wD/AP8A/wD/AAD/AAD///8AAP8AAP///wD/AP8A////AP8A/wD///4A//7+AP///wD///8A//7+AP///wD///8A////AP8A/wD/AP8A///+AAD//wAAAQAA////AP///wD///8A/v/+AP///gD/AP8A/wD/AP///wD+//4A////AP8A/wD///8A////AP/+/gD/AP8A////AAAAAAD///8AAP8AAP///wAAAQAA////AP///wD/AP8A/anvAP+/9QD/AP8AAP8A/wD/AAAAAAAAAAAAAQAAAP8BAQEBAAAAAAAAAAD/AP8AAP8A/wAAAP//////AAAAAP///wAA/wAAAP8AAAAAAAD/AP8AAP8AAAABAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/////AQABAf8A/wAAAQAA/////wEAAQEA/wAA/wD/AAD/AAAAAAAAAAEAAAD/AAAAAQABAf8BAP////8BAAEB/wD//wEAAQH///8AAAEAAAABAAH9qe8A/xQCAAJBDAAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQEBAP8A/wD///8AAAAAAAH/AQD/AP8AAAAAAAABAAD///8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAABAP8A/gAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAQAAAP8AAP8A/wAA/wAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAA/wAAAQABAP4A/gAAAAAA/wD/AAAAAAD//v8AAAAAAAAAAAD/y/YA/anwAAAAAAAAAAAA/wD/AAEBAQAAAAAAAAAAAAAAAAH/AP8AAP8AAP8A/wABAAH//wD/AAH/AQABAQEB/wD/AAAAAAAAAAAAAAEAAAD/AAAAAQAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/////wH/AQEAAQAAAQABAf8A//8BAAEA////AQAAAAABAAEAAP8AAAAAAAAA/wAAAAAAAAEBAQEBAAEA////AP////8BAAEBAP8AAAAAAAD/AP8A/Z/u/wAgBQEBIAYAAAAAAAD/AAAAAAAAAAAAAAEBAAD//wAAAAEAAAAAAAAA/wAA/wD/AAD/AAAAAQAAAAAAAP///wABAQEAAAAAAP7+/gAAAAAAAAEAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAAAAAAAP8A/wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAA/wAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAADg+gD+k+0A////AAEAAQD/AP8AAQABAQD/AAD/AP//AAAAAQEAAQD/AP8AAQAB/wEBAQH/////AQEBAf/+//8AAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAB/wEA/wD//wEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/AP8A/wD/AP///wD/AP/////+//4AAAAAAAAAAAEAAAAA/wD/AP8A/wAA/wD/AfX/Af1/6QD/4PoA////AP8A/wD/AP8A/wD/AP7+/wD///8AAP8AAP/+/wD/AP8A//7/AP8A/wD//v8A////AP8A/wD+//4A/v/+AAAAAAD/AP8AAP8AAP/+/wD//v8A/wD/AP7//gD///8A////AP///wD/AP8A/wD/AP8A/wD/AP8A////AP7+/gD+//4A////AP///wD/AP8A/wD/AP8A/wD/AP8A////AP8A/wD+//4A/wD/AP8A/wD/AP8A/wD/AP///wAA/wAA////AP///wD///8A/wD/AAAAAAD/AP8A////AP//AAD/AP8A/wD/AAAAAAD/AP8A////AP8A/wD///8A////AP8A/wD/AP8A/9/5AP1/6gD+9f0AAQEBAP8A/wAAAAAA/wD//wAAAAABAQEBAAAAAP8A/wABAAEA/wD/Af////8BAAEB////AAABAAH/AP8A/wD/AP8A/wAAAAAA/////wAAAAAAAQAAAQEBAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD//////wD/AAEAAQEA/wD/AAAAAAAAAAAAAAABAAAAAAD/AAAAAAAAAAAAAQEAAQD/////AQABAAAAAAAAAQAB/wD/AAD1/gD9f+kA/9/6AP///wD///8AAP8AAP8A/wD/AP8A/v/+AP8A/wD///8A/wD/AAD/AAD/AP8A////AAD//wD///8A////AP///wAA/wAA////AP8A/wAAAAAA////AP///wD///8A////AP8A/wD///8A////AP///wD///8AAAEAAP8A/wAA/wAA/wD/AP8A/wAA//8A////AAD/AAD///8AAAD/AP///wD///8A////AP///wD//v8A//7/AAAA/wD+//4A/wD/AP8A/wD/AP8AAP8AAP7//gD///8A////AP///gD///8AAAAAAP7//gD///8A/wD/AP///wD/AP8A//7/AP///wAA3/oA/X/q///1/f8AAAAA////AAAAAAAA/wD/AAAAAf////////8AAAAAAAAAAAD/AP8AAQABAAEAAQEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAP8AAQAAAAD//v//////AAABAAH/AP//AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHR0d/wABAAAAAAAAAQABAP8A/wAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAP8AAAABAAAAAP8A/wABAQEAAAAAAAD/AP//AP8AAQABAAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAP////8AAQwDAQJgEAD/PwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAQABAP/A9AD/oPAAAPX/AP8A//8AAAAAAQABAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAABAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAQAB4+LjAQAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAH/AQAAAAAA/gD+AAAAAP8BAQEB////AAEAAQD/AP8AAQEBAAAAAAEAAAAA/////wAAAAH///8AAQABAAAAAAABAQEBAP8AAP8A/wABAQEAAQABAP///wABAQEAAP8A/wABAAEBAAEAAPT+//2U7QEB6vsAAFUOAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAD///8AAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAQEA////AAABAAAA/wAA////AAEBAQD///8AAAAAAAAAAAD/Af8AAP8AAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAAA/6vx//+r8gEBAAEAAAAAAAAAAAABAAEBAAEAAP////8BAAEBAAEAAAD/AAAAAAAA/wD/AAEBAQEAAAD/AP8AAAABAAH/////AQABAQAAAAAAAAD/AAAAAP8A/wEBAQEAAP8AAP8A//8BAAEBAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAQEBAP///wH/////AQABAQD/AAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQD/AP8A/wD//wAAAAEA/wAAAAAAAAD/AP//AP8AAAAAAQAAAAAA/wAA/wD/AQD/AP8AAAABAAAAAQEAAQAAqvMAAOD7AP9fDwAAFAMAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAQAAAAAAAP//AAABAQABAAAA/v/+AAAAAAABAAEAAAAAAAAAAAD/AP8AAP8AAAABAAAA/wAAAP8AAAAAAAABAQEA////AAD/AAAAAQAAAP8AAAABAAAAAAEAAAD/AAAAAAAA/wAAAAEAAAD+AAD/AP8AAAEAAAD/AAD///8AAAEAAP///wABAAEA/wD/AAAAAAAB/wEA/wD/AAAAAAAAAAAAAP4AAAABAAAA/gAAAAEAAAAAAQAAAP8AAQABAAD2/wD/i+wAAdb6AQEBAQD/////AQABAQAAAAH/AP//AP8AAQEAAQEAAAAAAP8AAP8A//8AAAABAQABAP///wABAAEBAAAAAP///wAAAAAB/////wABAAEA/wAAAAEAAQEAAQAAAAAA/////wABAAH/AP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8AAAAA/////wABAQEB/wD/AAAAAAAAAAAAAAEAAP///wABAAEA/wD///8A/wEAAAAAAAAAAQD/AP8AAQABAAAAAP8A/wABAAEBAAAAAAAAAAD/AP8AAAAAAAD/AAAAAQAAAAAAAP8A/wD/////Acr3AQDe+v8AVg4B/z8JAAD/AAAAAAAAAP8AAAEAAQAAAAAA/wD/AAAA/wAAAAAAAAAAAAD//wD//wAAAQEAAAAAAQD+AP4AAAAAAAAAAAAAAAAAAP8AAAEAAAAAAAAA//8AAAABAAD///8AAAAAAAAAAAAA/wAAAQABAP///wAA//8AAAEAAAEAAAD/AAAAAf8AAP8AAAAAAAAAAf8AAP8AAAAAAAAAAf8AAP8AAAD/AP8AAAAAAAD/AAD/Af8AAQABAP///wAAAQAAAP8AAAAAAAAAAAAAAf8AAP8A/wAA/wAAANf5AACW7/8A6/0B/wAAAAAAAAAA/wAA/wD//wABAAAAAAABAQABAP8A/wAAAAAAAAAAAAAAAAEAAAD//wD/AQAAAAD/AP8AAAAAAAAAAAAAAAD//wD/AAH/Af8AAQAAAQABAP8A/wAA/wAAAAEAAQEBAQAA/wAA/wD/AAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQD/////AQEBAQAAAAAAAAAA//7/AAABAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAEA/wD/AAEAAQAAAAABAQEAAAAAAADs/QEAlu8AAdX5AP9UDAD/FQMAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAA//8AAAEBAAD///8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAD/AAABAAEA/wD/AAAAAAAAAAAAAAEAAP///wAAAAAAAP8AAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQEBAP8A/wAB/wEA/gD+AAAAAAAA/wAAAAAAAAD/AAAAAAAA/wAAAAH2/wAAofIAAMD2AAABAAEAAAAAAP8A/wABAAEAAAABAAAAAAAAAAAAAAD/////AQABAAAA/wAAAAAAAAABAAAAAAABAAAAAAD/AAAAAQAAAQEBAP/+//8AAQABAQEBAAD/AAD/////AAEAAAAAAAABAAEA////AP7//v8BAQEBAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAP8A//8AAAAAAQEBAQAAAAABAAEBAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAA/////wEBAQEAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAAAAAABAAAAAAAA/wD//wH/AQEAAAABAP8A//8A/wABAAEBAAEAAAD/AAAAAAAAAMD2AAHW+QD/SQsA/0kKAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAABAAAA/wAAAAAAAP///wAAAAAAAAEAAAAAAAAA/wAAAAAAAAEBAQD///8AAAEAAAAAAAD/AP8AAP8AAAAAAAAAAAAA////AAAAAAAAAAAAAQEBAP///wAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAAAAAEBAQD///8AAAAAAAAAAAAA9v8AArf1AAC29QAB9v8AAAAA/////wABAQEBAAAAAQD/AAD/AP8AAQABAP////8BAQEBAAAAAP////8AAAAAAQABAQD/AAAAAAD/AAEAAQABAAAA/wAA/////wABAAH/////AQEBAQABAAAB/wEBAP8A/wAAAAH/Af8AAAEAAAH/AQEA/wD/AAAAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQIB8P/+/w8AAAAAAP8AAAAAAAAAAAAA/wD/AAEAAQAAAQAA////AAAAAAAA/wAAAAAAAf///wAAAAD/AAAAAQAAAAAA/wD/AAAAAAEAAQEAAQAA/////wD/AAABAAEBAAAAAQAAAAD/AP//AAAAAQEAAQAAAQAAAAAAAP8A/wABAAEA/wD/AADq/AABofEAAN/6AP5pDwAAAQAAAAAAAAEAAQD///8AAAEAAAD/AAAA/wAAAQEBAP8A/wAAAAAAAP4AAAAAAAAAAQAAAQABAP7+/gAAAQAAAP4AAAABAAABAAEAAAAAAP8A/wAA/wAAAAEAAAAAAAAA/wAA/wD/AAAAAAAA/wAAAP8AAAABAAAA/wAAAP8AAAABAAABAAEA/wD/AAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAP///wAA/wAAAAEAAALB9wACrPUAAOv9AP8A/wD/AAAAAAAAAAEAAQH///8AAQABAAABAAAA/wAAAAAAAAAAAAD/////AAAAAAAAAAEBAAEA/wD//wEAAQEAAQAB////AAAAAAABAAEA/wD/AQEAAQAAAAAB////AAAAAP8AAAABAQABAQAAAAAAAAAAAP8AAP8A//8BAAEB/wD/AAD/AAACAQLxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v3+8AABABAAAAAA/wD/AAAAAAABAAEAAAAAAP///wABAAEAAAAAAAEAAQD/////AAEAAQAAAP8AAAABAQABAP8A/wAAAAABAAAAAAAAAAD//v//AAEAAQAAAAD/AP8AAAAAAP8A/wAAAAABAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAPb+AP8A/wAA/wAAAAAAAP8A/wAAAAAAAP4AAAABAAAA/wAA/v/+AAEBAQAAAAAAAAAAAAAAAAAB/wEA/gD+AAAAAAAA/wAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAAAA/wAAAAD/AAAAAAAAAAAAAAD/AAAAAP8AAAAAAP8AAAAB/wAA/wAAAAAAAAAA/wAAAQABAP/1/QACt/cAAbf1AAL3AAD///8AAP8A/wAAAAAAAQAAAAAAAf8A//8AAAAB/wD//wD/AAEAAAAA/v/+/wEBAQEA/wD/AAEAAQAAAP8AAAABAAAAAf////8AAAABAAAAAAAAAAD/AP//AAAAAf/+//8AAQABAAAA/wAAAAEAAAAA/wD//wEAAQH///8AAQEBAAD/AAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8B/wAAAQABAAAAAAAAAAEAAAAA////AAABAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAD/AAAAAf////8BAQEBAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAA/jMGAP///wAAAAAAAQABAAAA/wAAAQEA/wD/AAD/AAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAC1/sAAsL4AADL+AAB9v8AAAAA//8AAAEAAAAAAAEAAQD/AAAAAAAAAP8AAP8A/wABAQEAAAAAAQAAAAAAAAAAAQEBAQEAAQD+AP4AAQABAAAAAAH/AP8AAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA/wD/AAD/AAAAAAAAAAEAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AP8BAQEB/////wEBAQAAAAABAP8A/wABAAEA/wD//wD/AQEAAQAA/wAAAAEAAP////8BAQEBAAEAAAD/AAAAAQAA////AAAAAAD/AP//Af8BAf8A/wAAAQAAAP8AAAABAAD///8BAQABAAEAAQEAAAAAAP8A/wAAAAEAAQAAAAAAAAAAAAD/FAIA/jQHAP///wABAQEA/wD/AP///wAA//8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA//7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAABAQAA//8AAAABAAABAAEA////AAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAH2/wAB4fwAAsz5AAHC+AAA9f4AAQEBAAAAAAAA/wAAAAEAAQD/AAAAAQAA/////wEBAQH///8AAQABAAEAAQEA/wAAAAEAAP////8BAQEBAP8A//4A/gABAAEB/////4E/JuYAACAASURBVAEAAQEAAQAAAAAAAAAAAAD///8AAQEBAAD/AAAAAAAAAAEAAQAAAAD///8AAQEBAAD/AAAAAQAAAP8AAAEBAQD/Af8AAAAAAAABAAEAAAAAAP8AAAABAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB8AAAACAAAAAAAAAAAQAAAAD///8AAQABAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAAAAAAABAAD/////AQEBAQD/AAAAAAAA/wD//wAAAAEB/wEAAAAAAP///wAAAAAA/wD//wAAAAEB/wEA/wD/AAEBAQD/////AQEBAQD/AAD9PggA/goAAAD//wD/AP8AAAAAAAAAAQAAAP8AAP8AAAEBAQD/AP8AAP8AAAHs/gACzfoAAAAAAP8eAwD/FQMA/xUDAAAA/wAA/wEAAAD/AAD/AAAAAQAAAAAAAAAAAAAA/wAAAQABAAAAAAD+/v8AAAAAAAAAAQD///4AAAEAAAD/AAAAAAAAAez+AALh/AAB1vr/AeL8AQHh/gAA9f3/AAAAAQAAAP8BAQEB////AAAAAAAAAAD/AP8AAAAAAAAB/wEBAQEBAf///wAAAAAA/wD//wAAAAEAAAAAAP8AAAEAAQEA/wAA/wD/AQAAAAD/AP8AAAAAAf8A/wABAAEA////AAAAAAABAAEA/////wAAAAEAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAD/AP8AAQABAP8A/wABAAEA/wD/AAD/AAACAQLgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/gD+8AH/AQAAAAAAAAAAAAD/AAAAAAAA/////wAAAAEAAAAAAP8AAAEBAQD/////AQABAQAAAP//AP8BAAAAAAD/AP8AAAAB////AAAAAAAA/wAAAAEAAQAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAQAAAAD/AP8AAQABAf///wAAAAAB////AAAVAwD9UgoA//7/AAABAAAA/gAAAAEAAAAA/wABAAAA/wAAAP///wAB9v8AA632AAO49wAAAAAAAAAA/wD/AAAAAQAB/woCAP8fAwABCgEA/R8EAAALAgAACgAA/xUEAAAA/wAAAAAA/wAAAAEAAAAC9f8AAPb+AAD2AAAB6/0AAfcAAAHg+wAA6/7/Avb/Af8A/wAAAAABAQABAP8A/wAAAAABAAAAAAEBAQH/////AAAAAQAAAAAAAAABAAAAAAAAAAD/AP//AP8AAQAAAP8AAAABAQABAf////8AAQAAAAAAAP8A/wEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAD/////AP8AAAABAAH/AP8AAAAAAQAAAAABAAEB/wD/AP///wAAAAAA////AAEBAQD///8AAAAAAf8A//8AAAAB/wD/AAEBAQAA/wAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD+//7/AQEBAP8A/wAAAAABAAEAAQAAAAABAAEAAAAAAP/+//8AAQAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAEAAP////8BAQEBAQABAP7//v8CAQIB/wD/AAAAAAAAAAAAAAAA/wD/AAAAAQAB/wD/AAAAAAAAAAAAAAAAAPpmCwD+//4AAAAAAAD/AAAAAAAAAf8BAP8A/wD/AAAAAAAAAAO5+AAErfYAAfb/AAAAAAAAAAAAAAAAAQABAAAAAAAAAfb+AAHX/gAAAAAABM36AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAABAAAAAAAAAAAA/wD/AAD/AP//AP8AAQEBAf///wAAAAABAAAAAAAAAAAAAAAAAP8A/wABAAEA/wAAAAEAAAAAAAEAAAAA////AP8A/wAB/wEB/wD//wEBAQAAAAAAAAAAAAAAAAEAAAD/AP8AAAABAAEAAAABAAEAAAAAAP8AAAABAAAAAAAAAAD/AP8AAAAAAP////8CAQIB/wD/AP///wAAAAD/AP8AAAABAAEAAAAAAAAAAP///wAA/wAAAAEAAP7+/v8BAAHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAB//8A/wABAAEB/////wEBAQEAAAAAAP8AAAAAAAD/AP8AAAEAAAAAAAH///8AAQABAP8A//8BAQEB////AAEBAQAAAQAAAAAAAAAAAAD/////AAAAAQAAAAD+//7/AQEBAQAAAAAAAAAAAAAAAf8A//8BAAEAAAAAAAAAAAAA/wAA/UgIAP0oBAAA//8AAAAAAAAAAAAAAAAA/wD/AAEBAQAC1/wAA631/wPY/AEAAAAAAAAA/////wABAQEBAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAA////AAAAAP8BAQEB////AAEBAQAA/wAA/wD//wAAAAEBAAEAAAAAAP8A//8BAQEB/////wAAAAABAAEA/v/+/wAAAAABAQEAAAAAAQABAAEB/wH/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAAAAAEAAQAAAQABAAAAAP///wABAQEAAAAA/wEAAQEAAQAAAQABAQEAAQD/AP8AAAAAAP////8BAAEA/wD/AAEAAQAA/wD/AAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEBAQD+//4BAQABAP////8BAQEBAAAAAAAAAAAAAQAAAAAAAQEAAQACAgLhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4f7+/gAAAAAAAQABAQD/AAD/AP//AAAAAQAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQEA/wD/AQABAQD/AAD/AP8AAAAAAAEAAQEAAAAA/wD/AAEBAQEAAAAA////AAEBAQAA/wD/AAEAAQAAAAH/////AAAAAQAAAAD/FQMA+lEIAP///wAAAAAAAAEAAAD/AAAAAQAAAtb7AAav+QAB1/r/AAAAAf8AAAAAAAAAAAAAAQAAAP8A/wAA/wD//wAAAAEAAAD/AAAAAQD/AAABAAEAAAAA/wEBAQH/////AAAAAf///wABAAEAAQABAQAAAAAAAAD//wD/AQEAAQH///8AAQABAf8A////////AAAAAQEBAQD///8AAQEBAAD/AAD/AP8AAQABAP///wABAAEA/wD/AAEBAQAA/wD/AAAAAP////8BAQEBAAAAAAEAAQD/////AAAAAAAAAP8A/wAAAAAAAAAAAAEAAQAA////AAAAAAD/AP8BAQABAAD/AAAAAAAB/////wAAAAABAAEB/wD//wAAAAEAAAD/AQABAQABAAAAAAAAAAEAAP7//v8AAAAA/wD/AQEAAQD/////AQABAQABAAD/////AAAAAAAAAAH8/vzvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4AEBAQD///8A/wD//wAAAAEBAAEB/wD/AAAAAP8AAAAB////AAAAAAD///8AAAAAAAD/AAAAAAABAAAA/wAAAAEAAAAAAQABAP8A/wAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAABAP4A/wECAQH///8BAAAAAP8LAgD5egwA/woBAP8A/wAAAAAAAfT/AALi/QAFr/cAAtf8AAEAAQD/AAABAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQABAf8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAAEAAQD+//7/AQEBAQAAAP8AAAAAAAAAAP8A/wABAAEA/wD/AAAAAAEAAAAAAAAAAP///wAAAAAA////AAAAAP8BAAEB////AAEAAQD/AP8AAAAAAAAAAAAAAAABAAAA/wAAAAH/////AQEBAf////8AAQAAAAAAAQAAAAAAAAAAAQEBAP///wABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAP8BAAEBAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAB/wD/AAD/AAAAAAAAAAAA/wEBAQH//v//AAEAAP8A/wABAAEB/wD/AAEAAQAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAwMD0Pz9/AD/////AQEBAAAAAAD/AP//AP8AAQABAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP//AAAAAQAAAAAAAAD//wD/AAAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8BAQEBAAAAAP0yBP//AAABAsv5AAHt/gAD2PwAAtf8AAH2/wAAAAAAAAAAAP8A//8AAAABAP8A/wAAAAAAAQAAAP8AAf8A//8AAAAB/wD/AP////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAD///8AAQEBAP7//v8BAQEB/////wEBAQEAAAAAAAAAAAAAAAD/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////wAAAAEAAAAAAAAAAQAAAAAAAAAA////AAABAAEAAAAAAAAAAP////8BAQEB////AP////8AAAABAAAAAP///wAAAAD/AQEBAAAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAf7+/v8BAQEBAP8A/wABAAD/AP8AAAAAAP///wAAAAABAQEBAAD/AAACAwLxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABAA4ADpAAABAQEBAAAAAAAAAAAAAAABAAEAAP///wABAQEAAAAAAAAAAAD//v8AAAEAAP8A/wD///8AAQEBAAAAAAAAAAABAAAA/wAAAAAAAAAA/////wEBAQEAAAAAAAAAAAD/AAD/AP8AAQEBAQD/AAAAAAAAAAAAAATD+gEEw/oA////AAEBAQAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAEAAf////8BAAEBAAEAAAAAAAEAAAAAAQABAAABAAEA/wD//wD/AQEBAQABAQEBAAAAAAAAAP8BAAEBAAAAAAEBAQH///8AAQABAAAAAAABAQEA////AAAAAAAAAAAA////AQEBAQD/////AQEBAAAAAAEAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAQEB/wAAAAEAAAAAAAAA/wEAAQEA/wAAAAAAAAEBAQEAAAAAAAAAAAAAAAEBAQEA/////wEAAf//AP8AAQEBAQD/AAAAAAAB/wD//wEBAQEA/wAAAAAAAAABAP8BAAEB/wD/AAEAAQEAAAAAAAEAAQD/AP8AAAAAAAEAAAAAAAAA/wAA/v/+/wEBAQEEAATQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8P8A/+AA/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAB////AP8A/wD/AP8AAQABAQAAAAAAAQAA/wD//wAAAAH+//7/AAAAAP8A//8AAAAAAP8AAAABAAEAAAAAAP8AAAAAAAAAAQAAAQABAQEAAdDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD///7+/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAH/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wAB6wlQIAAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoQAQEBOP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAQEB4QgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtdS82AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//6D6uW7VbVacAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Notes.png b/arma/client/addons/phone/ui/_site/images/dark/Notes.png new file mode 100644 index 0000000..215f149 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Notes.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Notes.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Notes.png.b64 new file mode 100644 index 0000000..198b141 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Notes.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEHGzfIu58AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/33AQAADsQP7+AEACAAEfAAACMAABAAAA//8gAP8AAAABAAAAAP8AAAABAAAAAAAA//8A/wAAAAAAAAABAQEAAP//AAAAAAD/AAAAAQEBAAD//wD/AAAAAAABAAEBAAD///8AAQEBAAAAAAAA//8AAAEBAAD//wAAAQEA////AAEAAQD/AP8AAQEBAAD//wAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAABAQEAAP//AAAAAAD/AAAAAQAAAAABAQAA//8AAAEBAP///wAAAAAAAQEBAAAAAAD///8AAQEBAAAAAAAAAAAA////AAAAAAABAQEAAP8AAAAB/wAA/wAA/wAAAAEAAAD/AAAAAQEAAP//AAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQIB8AD//uAA/wHg/v8B0QIB/tAAAxTAASGQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/32AQAAD8XwD9AFAAAP5AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAP8AAAABAAAAAAAAAAAAAQAAAP8AAAABAAAA/wD/AAAAAQABAAAAAAD/AP8AAQAAAP8AAAAAAAAAAAAAAAEAAQD/AP8AAQAAAAAAAAAAAQEAAP8AAAAA/wD/AAAAAQABAP8A/wABAAAA/wAAAAEAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAD/AAAAAQAAAP//AAAAAQAAAQAAAP8AAAAA/wAAAQEAAP8AAAABAAAAAAABAP8A/wABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAEAAAAAAP///wABAQAA//8AAAEBAAAAAAAAAAD/wAAAAqAAAwXBASGg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/99gIP799XACAQFfAP4BEAABAAD//wAAAQEAAP//AAABAAAAAAEAAP//AAABAQEAAP//AP8AAAAAAAAAAQEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAD/AAAAAQEAAP//AAABAAAAAAAAAP8AAAABAQEAAAD/AP//AAAAAAAAAQEBAP///wABAAAA/wEAAAEAAAD//wAAAAAAAAEAAAD/AAAAAQEAAAD/AAAAAAAAAAEAAP//AAABAAAAAAEBAP///wABAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAEBAAAA/wAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAQAAAAABAAAA/wD//wAAAAAAAAEBAQD///8AAQAAAAABAAAAAAAA//8AAAEAAAD/AAAAAAAAAAAAAAABAAAAAAEBAP///wABAAAAAAAAAP8AAAABAQEAAAEAoAACAIEBIajgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/fYBAA/vRvAP4AgP8AAAABAAAA/wAAAAEAAAAAAAEAAAD/AP8AAAABAAAA/wAAAAD/AAAAAAAAAAEAAAEAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAP8AAAABAAAA////AAAAAQAAAAAAAAD/AAAAAAABAQEA/wAAAAD/AAABAQAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAABAQD//v8AAAAAAAAAAAABAQAAAAAAAAAAAAD/AAAAAQAAAAAAAAD//wAAAQEBAAAA/wD//wAAAQEAAAAAAAD//wAAAQEAAAAAAAD//wAAAQEAAAAAAAD/AAAAAQAAAAAAAAD//wAAAAEAAAEAAAD//wAAAQEAAP//AAABAQAAAAAAAAAAAAAAAAAA/wAAAAD/AAABAQAA//8AAAEBAAAAAAAA//8AAAABAAABAAAA/wAAAAEAAAD//wAAAQEAAAAAAAAAAv+gAPoFgQEpqOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9xTUAAA/p///v8QAAABAAEAAAD/AAAAAQAAAP8A/wABAAEA/wD/AAEAAQD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQEAAAAAAAD///8AAQABAAABAQD///8AAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAP///wAAAQEAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAQABAAAAAAAAAP8A/wAAAAAAAAABAAAAAAAAAP8AAQABAP8A/wAAAAEAAAAAAAD//wAAAQEAAQAAAAAAAAAAAQAAAP8AAP8A/wABAAEAAAAAAP8AAAABAP8A/wABAAAAAAAAAP8AAQABAAAAAAD///8AAAEBAAAA/wAAAAEAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AP8AAQABAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQABAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAA4AACAIABJK+hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/206PAP8AcP///wABAQEA////AAABAQABAAAA////AAAAAQAAAP8AAAEBAAH//wD/AQEAAP//AAABAQABAAAA////AAEBAQAAAAAA////AAEBAQAAAAAA//8AAAEBAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAA//8A/wAAAAEBAQD/AAAAAP8AAAEBAAD///8AAQEBAAD/AAD/AP8AAAABAAEBAAD///8AAQEBAP//AAABAQAA/wAAAAD//wAAAAEAAAAAAAEBAAAAAAAA////AAEBAQD///8AAQEBAP///wAAAAAAAAEBAAH/AAD/AP8AAQEBAP///wAAAQEAAQAAAAAAAAAAAAAA////AAEBAQD///8AAAABAAAAAAAAAP8AAQEBAAAAAAAA/wAAAAEAAP///wAAAAEAAAAAAAEBAAD/AAAAAAAAAAD/AAABAQAA////AAEBAQD//wAAAAEAAAEAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQAAAAAA/wAAAAD//wABAgGQASWycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9dQIAAD+6///wAwAAD/AAEAAQAAAAAA/wD/AAAAAAAAAAAAAQABAAAA/wAAAAEAAAAAAP8A/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAABAAEA////AAEBAQAAAP8AAAABAP8A/wAAAAAAAQABAAAAAAAAAAAA/wAAAAEA/wD/AAAAAP8AAAEBAQD/AP8AAAAAAAEAAQAAAAAA/wD/AAEAAAAAAAEAAAEAAP///wABAAEAAAAAAP8A/wAAAAEAAAD/AAEAAQD///8AAAEAAAEAAQAAAAAA/wD/AAEAAQAAAAAA/wAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAEAAQAAAAAA/wD/AAEAAQAAAP8AAAABAP8AAAAAAP8AAQABAP8AAAAAAP8AAAAAAAAAAAABAAEA////AAABAAABAAEA/wD/AAAAAAABAAEA/wD/AAAAAAAAAAEAAAD/AAAAAAAA/wAAAAEBAAD//wAAAAAAAAEBAAEAAAD///8AAQEAAP8AAAAAAAAAAAAAAAAAAQAA//8AAQIB0AD9BVEBKbDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/11AgAAH4v/8AACAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAAAAAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAQAAAP8AAAABAQAA//8AAAAAAAABAQEA////AAAAAAABAQEA////AAEAAAD/AAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQEAAQAAAP///wABAQEA////AAAAAAAAAAAAAQEBAP///wAAAAAAAQEBAP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAEAAAAAAQEA////AAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAQAAAP8AAAAAAAAAAAABAAAAAAEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAP///gAAAAEAAQAAAP8AAAAAAAAAAQEBAP///wABAAAA/wAAAAAAAAAAAAAAAAAAAAEBAeAA/ghBASmw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/XSCAAAfu/AAABIP8AAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAQEAAP///wAAAQEAAP8AAAABAAAA/wAAAAEAAAAAAAABAQEA////AAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAP8AAAAAAP8AAAAA/wAAAAAAAAABAAAAAAAAAQAAAP8AAAAA/wAAAAAAAAEBAQD///8AAAEAAAEAAAAAAAAAAAAAAAAAAQD/AP8AAP8AAAEBAAD/AAAAAP8AAAEBAAD/AAAAAAAAAAAAAAABAAEAAAD/AP//AAAAAQAAAAAAAAEAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAEA////AAEBAAD/AAAAAAAAAAAAAAABAAEA////AAAAAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAEAAAD/AAAAAQAAAP8AAAAA/wAAAQEAAP8AAAAA/wAAAQEAAP8AAAAAAAAAAP8AAAABAAABAP/gAP8NQQEpsOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+K///gEgAAAAAAEBAAD//wAAAAEBAAEA/wAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAAAAAD/AAAAAAAAAP8AAAAAAAD//wAAAAAAAAEAAAD//wAAAAAAAAAAAAAA/wAAAAAAAAEAAAD/AAAAAf8AAAAAAAABAQAAAAAAAP//AAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAP8AAAABAP//AAAAAAAAAf8AAAABAAD//wAAAQAAAP8AAAAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAABAAAA/wAAAAEBAAD//wAAAAD/AAAAAQAA/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAQEAAP//AAABAAAA/wAAAAAAAAD/AAAAAAAAAAEAAAD//wAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQAA//8AAAEAAAD/AAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAD/AAD/AAAgAQLxrwAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9g+j//+/3ABAQEA//8AAAABAAAA/wAAAAAAAAAAAAAAAP8AAQEBAP8AAAAA/wAAAQEAAP8AAAABAAAAAAAAAP//AAAAAAAAAAEAAAAAAAABAAAA//8AAAEBAAD/AAAAAP8AAAABAAAA/wAAAAD/AAABAQABAAAA////AAABAQAAAAAAAAAAAAD//wAAAQEAAP8AAAAA/wAAAAAAAAABAAAAAAAAAP8AAAAAAAABAQAAAAAAAP8AAAEBAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAQEAAP8AAAAA/wAAAAAAAAABAAAA//8AAAABAAAAAAAAAP8AAAABAAEBAQD///8AAQEAAP//AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAP8AAAEBAAD/AAAAAQAAAAAAAAD/AAAAAQAAAP//AAEBAQAAAAAA//8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAD/AAAAAQAAAQAAAP8AAAABAAAA//8AAQEBAP8AAAABAAAA/wAAAAEDAJABJsJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD81TpgAgEBnwAAAAAA//8AAAEAAAAAAQAAAP8AAP8AAAEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAEAAQD/AP8AAP8AAAABAAAAAAEAAAAAAAAA/wAAAAAAAAABAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAABAAEA/wAAAAAA/wAAAAEAAQAAAAAAAAD///8AAAEBAAAAAAAAAAAAAQAAAP///wAAAQEAAAD/AAD/AAAAAQEAAQAAAP8A/wAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAAAA/wAAAAEBAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAEBAAEAAAD/AAAAAQEAAAD/AAD///8AAAEAAAD/AAABAQEAAAAAAP///wAAAQEAAAAAAAAA/wAAAAAAAAAAAP//AAACAQEA/wD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAP8A/wABA/9RASfHsAAAAAAA6tOqnQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/PQCAACPi///4AIAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAEBAAAAAAAA////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAABAQAA/wAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAQEAAQAAAP//AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAEBAQD//wAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAAABAAEBAAAAAAAA//8AAAAA/wAAAQEAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAA/wD/AAIBAQD//wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAABAP/wAPoJIQExwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4H9oAC/v8gAAD/AAAAAQAAAP8A//8BAAD//wAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQEA///+AAEBAQAAAAAAAAABAAD/AAAAAP8AAAAAAAD/AAAAAAAAAAAAAP//AAABAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD+//8AAAABAAAA/wD//wAAAAAAAAEAAQD/AAAAAAAAAAAA/wD+/gAAAQEAAAD/AAAAAAEAAAD/AAAAAQAAAAAAAP//AAEBAQD///8AAAEAAAEAAQD///8AAAEAAAD/AAABAQEA////AAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAP///wAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAABAAAA/gAAAAEAAAAAAQAA//8AAQEAAP//AAAAAAAAAP8AAAABAQAAAP8AAAAAAAAAAAAAAAAAAQABAP8A/wD//wAQ/wb2cAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/884IP8F+d8AAAAAAAAAAAAAAAD/AP8AAQEBAAD/AAAAAQEAAP//AAAAAAAAAAAAAAAAAP///wABAQEA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAACAQEA////AAEBAQD///8A/wAAAAEAAQAAAP8AAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEA//7+AAABAQABAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQEA//7/AAEBAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAH7ByEBMcjgAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gP2gAD//wABAQEAAP8AAAAAAAABAQAAAP8AAAD/AAAA/wAA/wAAAAAAAAABAQAA////AAAAAQAAAAEAAP/+AAAAAQAAAAAAAAAAAAEBAAAAAAAAAP8AAAABAAAA/wAAAQAAAAAAAAAAAQAAAQAAAP//AAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQAAAQABAP7//wABAQAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAA/wAAAAEBAAD//gAA/wAAAP///wABAQEAAf8AAAAA/wAAAQEAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAQAA////AAEBAQAA/wAAAP8AAAAA/wAAAAAA/wABAAEBAAAA/wAAAAEAAP//AAABAAAAAQEAAAAAAAAA/wAAAAEAAAAAAAD//gAAAQEAAAD//wAAAAEA/wD/AAAAAAABAAEAAAAAAP//AAABAP8AAAABAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAB/wAAAAAAAAABAAAB/wEA/wD/AAAAAAAA/wAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAP8AAP4G9HAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/zzAg/gT73wEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAP8A//8AAAICAQD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAP//AAEBAQD///8AAQEBAAAAAAD///8AAAEBAAEAAAAAAQAA//8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAEA/wAAAAAA/wABAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQD/AAAAAQD///8AAQEBAP8AAAABAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8A/wABAAAAAAABAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAABAAAA/wAAAAAAAAD/APAB/QUhATHQ8AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD9BvtAAv79AAD/AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wAAAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAABAQAA////AAAAAQAAAAAAAQAAAAAAAAD/AP8AAP8AAAAAAQAAAQAAAAD/AP/+AQAAAQAA////AAAAAAABAAEA/wAAAAEAAAAAAQAAAP8AAAAAAAABAQAAAAAAAP//AAABAAAAAP8AAAAAAAABAAAAAAAAAAAAAAAA/gAAAAD/AAAAAQAAAAAA/wD/AAAAAQABAAAAAAAAAAABAAD//wAAAQAAAAAAAAABAQAA////AAEAAQABAAAA/wD/AAEBAQAA/wAAAQAAAAABAAD//wAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAQAA//7/AAABAAAAAAEAAQAAAP8AAAABAAAAAQEAAP///wABAAEA/wD/AAEAAQABAAAA//8AAAAAAAAAAAAAAP8AAP8AAAABAAAAAAAAAP8AAAABAAAA//8AAAAA/wABAAEAAAAAAP8A/wAAAAAAAQABAAAAAAABAAAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAAAAAQEAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABABAAAv5gAAAAkAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vlf//8AAP//AAABAQEAAAAAAAAAAAD///8AAAAAAAABAAAAAAEAAQD/AP8AAAABAAEA/wAAAAEAAAAA/wAAAQAAAAAA/wD//wAAAAEBAAD//wAAAAAAAAAAAAAAAQD//v8AAAEAAAAAAAD//wAAAP8AAAEBAAD//wAAAAAAAAABAQD///8AAQABAP///wABAAEAAAD/AAAAAAD//wAAAQEAAAAAAQD/AP8AAf8BAAAAAAAAAAAAAQAAAAAA/wAAAAEAAQD/AAAAAQAAAP8AAAAAAP/+AAAAAQAAAAAAAAAAAAAA/wEAAP//AP8AAAAAAAAAAQEBAAD/AAAAAP8A//8AAAD/AAAAAQAAAQAAAP8AAAAA/wAAAAEAAAAAAQD//v8AAAEAAAEAAQAAAAAAAAAAAAAA/wAAAAEA/v7/AAEBAQAAAAAAAf//AAABAQAAAP8AAP8AAAEBAAAA/wEA////AAEBAQAAAAAA////AAICAQD///8AAP8AAAEBAAD//wAAAQEBAAEAAAAA//8AAAEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAQD///8AAQABAAD//wD/AAAAAQEAAAD/AAAAAQEAAAAAAAD/AAAAAv9PAAAAkAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP/PMBD+AvHvAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQD/AP8AAAAAAAEAAAAAAQEA//7/AAAAAAABAQAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAAAAABAAAA/wAAAAAA/wAAAAEAAAAAAAAAAAEBAAD//wD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEBAP///wABAAEA/wD/AAEAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAD/AAAAAQABAP8A/wAAAAAAAQAAAP8AAAAAAAAAAQABAAAA/wAAAQEA////AAEAAAAAAAAA/wAAAAEAAQD/AP8AAAAAAAAAAAABAAEA/wD/AAAAAAABAAEA/wD/AAEAAAAAAQEAAAAAAAD//wAAAAAAAAABAP8A/wAAAAAAAQEBAAD//wD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEBAQAA//8A/wAAAAEAAAD/AAAAAQEBAAD/AAD/AP8AAAAAAAEAAAAAAQEAAf0OEQEx0PAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA8EABAP4A//8AAAEBAAAAAAAAAAAAAAD/AAD/AAAAAAAAAAAAAAABAQAAAAAAAAD/AAAAAAEAAAD/AAAAAAD//wAAAAAAAAAAAAAAAQAAAP8AAAAA/wD/AAAAAQABAP8AAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP//AAABAQAA//8AAAEBAAD//wAAAAAAAAEBAAAAAAAA//8AAAAA/wAAAAEAAQAAAAABAAD//wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQABAP8AAAAAAP8AAAABAAAAAP8BAAD//wAAAQAAAf8AAP8AAAABAQEA////AAEAAAAAAQAAAAAAAAD/AAABAQAAAAABAAD//wABAAAA/wAAAAEBAQD///8A/wAAAAAAAAABAAAAAQAAAAAAAAD//wAAAQEAAP//AAAAAAAAAQEAAAD/AAAAAAAAAQAAAAABAQAAAP8AAP8AAP8AAAAA/wAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEAAAD//wAAAQEAAP//AAAAAQAAAP//AP//AQABAAAAAAAAAP8AAAAAAAAA//8AAAEAAAAAAAAAAAEAAP//AAAAAAAAAQbtPwAAALEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/DAB//8AAAAAAAD/AAD/AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAD//wAAAQAAAP8AAAAA/wAAAQAAAP///wABAQEAAAABAP8A/wD//wAAAQAAAP//AAAAAQAA/wAAAAEAAAAAAAAA/wAAAAAAAAAA/wAA//8AAAABAAD//wAAAAAAAP//AAAAAAAAAAAAAAD/AQAAAP8AAAAAAAEAAAD/AAAA////AAD/AAAAAQEAAAAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAABAP///wABAAAA/wAAAAAAAAD//wAAAQEAAAAAAAD//wAAAAAAAAD/AAAAAAAAAQABAAAA/wD//wAAAQABAP8A/wAA/wAAAAAAAAEAAAD/AAAAAAAAAP//AAAAAAAAAAAAAAAAAAAA/wAAAAABAP8A/wAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAABAAAAAAAAAAD/AAD/AAAAAP//AAABAQAA//8AAAEBAAAAAAABAAAA/wAAAAAAAAAAAAAA//8AAAAAAAABAAEA////AAAAAAABAAAA//8AAAD//wAAAAEAAQAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAA////AAD/AQABAAAA/voBQQAAALEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIB+y//AAEAAf8AAAABAAAA/wAAAQAAAP8AAAAAAAAAAQEAAP//AAAAAAAAAAEAAAH/AAD/AP8AAAEBAAEAAAD//wAAAAAAAAAAAAABAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAQAA//8AAAD/AAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAB/wAAAAAAAP8AAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAEBAAD//wAAAAAAAAAA/wD/AAEAAQEAAAAAAAD/AAAAAAAAAAD//wAAAAEAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAABAAD//wAAAAAAAAEBAAD///8AAQABAAAAAAABAQAA//8AAAAAAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAEBAAABAAAAAAEAAP//AAABAQAAAP8AAP8AAAAAAAAAAAAAAAAA/wABAQEA//8AAAAAAAAAAQAAAQAAAAAAAAD//wAAAAAAAAEAAAD//wAAAAD/AAEAAQD/AAAAAAAAAAEBAAAA/wAA/wAAAAAAAAAAAAAAAAD/AAEAAQD///8A/wAAIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA/iD//gAAAAEAAAD/AAABAAAA/wAAAAEAAAD/AAAA//8AAAD//wAAAQEA//7/AAAAAAAAAQEA//8AAAD//wAAAQEAAP//AAEBAQAA/wAA/wD/AAD/AAAAAQEAAQAAAP8A/wAAAAAAAQABAP///wAAAAEAAAAAAAD//wAAAAAAAAAAAP//AAAAAAAAAQEBAP8AAAAA//8AAAAAAP8AAQAAAP8AAQABAAD//wAAAQEAAAD/AAEAAQD/AP8AAQABAP/+/wAAAQEAAAAAAAD//wAAAQEAAP8AAP8AAAAAAAAA//7/AAABAQAA//8AAAEAAP/+AAAAAQEAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAD//wAAAQEA/wAAAAD+/wAAAQEAAAD/AP/+AAAAAAAA/wAAAAEBAQD//wAAAAAAAAEAAAD///8A/wEBAAAAAAABAAAA////AP//AAAAAAAAAQEBAAEAAAD//wAAAAAAAAAAAAAAAAAAAP//AAEBAQAA/wAAAQD/AP//AAD/AAEAAQAAAP///wABAQEA/wAAAP8AAAAA//8AAAEBAP8AAAAAAAAAAQAAAP///wAAAAEAAP//AAEBAQD/AAAAAP//AAABAQABAAAAAQABLwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//CABAAEA//8AAAEAAAAAAAAAAAD/AP8AAAABAAEAAAEAAP8A/wAA/wAAAAAAAAAAAAAB/wAA/wAAAAAAAQAB/wAA/wAAAAAAAAD///8AAAAAAAAAAAAA/wAAAAABAP8A/wACAAEA/wAAAAAA/wAA/wEAAAD/AAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAH/AQD/AP8A/wAAAAAAAAABAAEA////AP8AAAABAQEA////AAAAAAAA/wAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAD/AQAAAAAAAf8AAP8AAAAA/wAA/wD/AAAAAAD/AAAAAAAAAAAAAAABAQEA////AAAAAAAA/wAAAQABAAABAAD///8AAAAAAAAAAAAAAAEAAAAAAP///wAAAAEAAAAAAP8A/wAAAAAAAP8AAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAABAAAA//8AAQEBAP///wAAAAAAAAAAAP/+AAAAAQAAAP8AAAABAQAB/wAA/wD/AAEAAQD//wAAAAD/AAAAAQAAAP8AAf8BAP8AAAABAAAA/wD/AAAAAAAAAAAAAQEBAAD//wAAAAAAAAAAAAD/AQD/AP8AAQEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7//RAA/wAAAAAAAP8AAAAAAAAAAAEBAAD//wD/AQAAAP4AAAAAAAAAAAAAAAAAAAABAAD//wAAAAAAAAAAAAD/AAAAAQEAAP/+AAAAAAAAAAAAAAEBAQD/AP8A/wAAAAH/AAAAAQEAAAD/AAD/AAD/AQEAAP//AP//AAABAQEA////AAAAAAAAAAEAAQAAAP8A/wAA/wAAAAD/AP8BAQAA/wAAAQEBAP///wD//wAAAQEBAAAAAAD//v8AAQEAAAAAAQD///8AAAEAAAAAAQABAP8A/wAAAAD/AAABAQEAAAD/AAAAAAD//wAA/wEAAAD/AAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA/wAAAAEAAAABAAAA//8AAAEBAAD/AAAAAQABAP///wAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAEBAP/+/wABAQEA//7/AAEBAQD/AP8AAP8AAAAAAAAAAAAA/wAAAAIAAQD/AAAAAAD/AP//AAAAAAAAAQEAAP//AAAAAAAAAAEAAAD/AAD/AAAAAAAAAAAAAAAAAAAA//8AAAABAAAA/wAAAAAAAP8AAAAAAAAA//8AIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD+/QAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQAAAP8AAAAA/wAA/wAAAAAAAAAAAAAAAP8AAP7//wABAQEAAQAAAAAAAAD//wAAAAAAAAAAAAAA/wAAAAAAAAAAAAD//wAAAAAAAAEAAAD//wAAAP//AAEBAgD/AP8AAAAAAAD+AAAAAQAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAP4AAAABAAD/AAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAP8AAAEAAAD//wAAAQAAAP8AAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQAAAP8AAAAA/wAAAQAAAP8AAAAAAAAA//7/AAABAQD//wAAAAAAAP//AAAAAAAAAAAAAAAAAAAA/wAAAf//AP8AAQAAAAAAAQAAAP8AAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAD/AAABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA/QAA/wAAAAAAAAABAAABAAAA//8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEAAAD/AAAAAAAAAQAAAP//AAAAAAAAAAAAAAEAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP///gAAAAAAAAEAAAAAAAAAAAAAAP8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAP8A/wAAAAEA/wAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAEAAAD//wAAAAD/AAAAAQAAAAAA/wD/AAAAAQAAAAAAAAAAAAAAAAAAAP8A/wABAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA/wD+AAD/AQAAAAAA/wAAAAABAAABAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAACWo8W1AAAgAElEQVQAAAD/AQAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA//8AAAABAAEBAAD//wAAAP//AAABAQAAAAAA//7/AAABAQAAAAAAAQAAAP8AAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAAA//7/AAEBAQAB/wAA/wAAAP///wABAAAA/wAAAAEAAAAAAQEAAAAAAP//AAAA//8AAAEBAAAAAAD///8AAQEBAAAAAAAA/wAAAAD/AAD/AQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAP//AP8AAQAA//8AAAAAAAABAQD///8AAQABAP8AAAAAAAAAAP//AAAAAAAAAQEAAP//AAABAQAAAAAAAAAAAAAAAAAA/wAAAAEAAAD//wD/AAAAAQEBAAD//wAAAAEAAAEAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAP///wAAAAEAAP//AAABAQAA/wAA/wD/AAEAAQD/AAAAAP//AAAAAQAAAP8AAQEBAP//AAAAAQAAAAAAAAD/AAAAAQAAAP//AAABAAAA/wEAAAAAAP///wABAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//QAAAP8AAAAAAAAAAAD/AAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAP///wAAAAEAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAP8AAP8A/wABAAAAAAABAAAAAAAAAAAAAQEAAP///wD//wAAAQEBAAD//wAAAAEA/wD/AAH/AQAAAAAAAQAAAAD//wD/AAAAAAABAAEAAAAAAP8AAQABAAAAAAABAAAA//8AAAAAAAABAQAA////AAAAAQAAAP8AAP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD//wAAAQEAAP8AAAD/AAABAAAA//7/AAEBAAAAAAEAAQEAAP///wAA/wAAAAABAAD//wAAAQEAAP8AAAAAAAAAAAAAAP//AAAAAQABAP8AAP8AAAAAAQD/AP8AAf8BAAAA/wABAAEAAP8AAAAAAAABAQAA//8AAAEA/wD//wAAAQABAAD/AAAAAAAAAQD/AAH/AQD/AP8AAAABAAAAAAAAAAAA//8AAP8A/wAB/wEAAAAAAAAAAAAA/wAAAAD/AP/+AAABAQEAAAD/AAD/AAAAAQEAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAACFTHAAAAQAAAP8AAAAAAAABAQEA////AP///wABAQEAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAQAAAQABAAAAAAD///8AAAAAAAEBAQAAAAAA////AAEBAQD///8AAAAAAAEBAQD+/v4AAgICAP///wABAQEA////AAEBAQD///8AAAAAAAEBAQD+/v4AAQEBAP///wACAgIA////AAEBAQAAAAAA////AAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAP///wABAQEAAAAAAAEBAQD///8AAAAAAP///wABAQEAAAAAAAEBAQD///8AAQEBAP///wD///8AAQEBAAEBAQD/AP8A//7/AAICAgD///8AAAAAAAABAAABAAEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAA////AAEBAQAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/AP8AAAAAAAEAAQD///8AAAAAAAAAAAABAQEA////AAAAAAABAQEAAAAAAAAA4QAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAMEAwAA/wAAAAEAAAD/AAAAAAAA/wD/AAEAAQAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAABAAABAAEAAAAAAP///wABAQEA////AAABAAAA/wAA/wD/AAIBAgD///8AAQEBAP///wACAgIAAAEAAP///wAA/wAAAgICAAEBAQD+/v4AAgICAP///wACAgIAAAAAAP///wABAQEA////AAEBAQAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAA/wD/AAEAAQAAAAAAAAAAAAAAAAD///8AAgICAP///wABAQEA////AAEBAQD///8AAAAAAP///wABAQEAAAAAAAAAAAAAAAAA/wH/AAECAQAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAQAA//7/AAEBAQAAAAAAAQEBAAEBAQD///8A/wD/AAMBAwD+/v4AAQEBAAAAAAABAQEA////AP///wACAgIA/v7+AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP///wABAQEAAQEBAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAICAgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD///8AAAAAAAICAgAAAAAA/wD/AAD/AAABAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAEAgQAAAAAAP///wACAgIA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAP///wABAQEA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQD///8AAAAAAAEBAQAAAAAA/wD/AAEAAQAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAwMDAP///wD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIBAgABAQEAAAAAAAAAAAAAAAAAAQEBAP8A/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAABAQEA/wD/AAEAAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAEAAAD/AAABAQEA////AAAAAAABAQEA/wD/AAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAEBAQD///8AAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAEBAQD///8AAAAAAAAAAAABAQEA/wD/AAD/AAAAAAAAAAEAAAD/AAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAABAQEA////AP///wACAgIA/v/+AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAP8A/wABAQEAAP8AAAEBAQD///8AAAAAAP///wACAQIAAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAABoaGgAMDAwAAQIBAAICAgABAQEABgcGAB4dHgAMDAwAAQEBAAEBAQABAQEAGBgYABcXFwABAQEAAAAAAAEBAQAAAAAAGBcYAAwMDAABAQEAAgICAAA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AAAAAAAAAAAABAAAA/wAA/wH/AAAAAAABAAEA/wD/AAD/AAABAQEA/wD/AAEAAQD///8AAAEAAAEAAQD//v8AAAEAAAD/AAABAQEA/wD/AAD/AAAAAQAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAABAAAAAAAA////AAABAAAA/wAAAAEAAAAAAAAAAAAA/wD/AAD/AAD/AP8AAAAAAAEBAQAAAQAA/wD/AAD/AAABAQEA////AAABAAD/AP8AAP8AAAABAAD///8AAAAAAAAAAAD///8AAAEAAP8A/wABAAEAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wH/AAAAAAAAAAAAAP8AAAAAAAAAAAAA////AAAAAAAAAQAAAAEAAAD/AAAAAAAAAQEBAP8A/wD///8AAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAP8A/wABAAEAAP8AAP8A/wAAAAAA/wD/AAABAAAA/wAAAAEAAAD/AAD///8AAAAAAAABAAABAAEA/gD+AAH/AQAAAAAAAAAAAAABAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAEAAP///wAAAAAAAAAAAP///wAAAAAAAP8AAAAAAAD///8AAAAAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAQD/AP8AAQABAP8A/wD///8A/wD/AAEAAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD///8A/wD/AAD/AAAAAAAAAP8AAP8A/wAA/wAAAAAAAAAAAAD/AP8AAP8AAAD/AAD/AP8AAAEAAP8A/wD/AP8AAAEAAAAAAAAA/wAA////AAAAAAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAQABAAEBAQAA/wAAAAEAAAAAAAAAAAAAAQABAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAD///8AAQABAP8A/wD/AP8AAAAAAAD/AAAAAAAAAAAAAP8A/wAAAQAAAAAAAAD/AAAAAAAAAP8AAAD/AAAAAAAAAAAAAP8A/wAAAAAAAP8AAAABAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP7//gAAAAAA////AP8A/wAAAAAAAQABAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAQABAAAAAAAAAAAA////AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAEA////AAAAAAABAAEAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD/AP8A/wD/AP8AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAP8AAP8A/wAAAAAA////AP8A/wD/AP8A/wD/AP8A/wAAAAAA/wD/AP///wAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAD///8A/wD/AAEAAQD///8AAAAAAAAAAAD/AP8A////AAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAD/AAD/AP8AAAAAAAEAAQAAAAAAAAAAAP8A/wAA/wAA/wD/AAAAAAABAQEA/wD/AP8A/wD/AP8A////AAABAAAA/wAA//7/AAAAAAD/AP8A/wD/AAAAAAD/AP8AAAEAAAEAAQAAAAAA////AAEAAQD/AP8AAAAAAAABAAAAAAAA////AP8A/wAAAAAAAAAAAAEAAQABAAEA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAB/wEA/wD/AAAAAAAAAAAAAAAAAP///wAAAQAAAQABAP///wABAQEAAP8AAP///wAAAQAAAAAAAAAAAAAAAAAA////AAAAAAAAAQAAAAEAAP8A/wAAAAAAAQABAP8A/wAA/wAA/wD/AAABAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAEBAQD/AP8AAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAEAAQD/AP8AAP8AAAABAAD/AP8AAQABAP8A/wAAAAAA/wD/AAD/AAAAAQAAAP8AAP8B/wABAAEAAAAAAP///wAAAAAAAAAAAP///wABAQEAAP8AAAABAAAA/wAA/wD/AAABAAAAAAAAAAAAAAABAAD//v8AAQEBAAD/AAD/AP8AAQEBAP8A/wAA/wAAAQABAP8A/wAA/wAAAAEAAP/+/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAP8AAP///wAAAQAAAAAAAP///wAAAQAA////AAAAAAAAAAAAAAAAAAD/AAD/Af8AAQABAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAEAAQD//v8AAA1IEnAAACAASURBVAAAAAABAAAAAAAAAQABAP8A/wAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAAAAAEAAAAAAAAA/wAA/wD/AAAAAAAAAAAA////AAABAAAA/wAAAP8AAAD/AAD/AP8AAAEAAAEBAQAA/wAAAP8AAAAAAAAA/wAA/wD/AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEAAP///wAA/wAAAP8AAAD/AAAA/wAA////AAAAAAAAAAAAAP8AAP///wAAAAAAAAAAAAD/AAAA/wAA////AAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD/AAD/AP8A////AAABAAAAAQAAAAAAAAABAAD///8AAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAA/wD/AP/+/wAAAAAA/wD/AAABAAAAAAAA/wD/AAD/AAAA/wAA////AAAAAAAAAAAAAP8AAAAAAAAAAAAAAQEBAP///wAA/wAAAP8AAAD/AAD///8A////AAAAAAAAAAAAAQEBAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAEAAAAAAAAA/wAA/v/+AAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAP///wAAAQAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAP8AAP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD/AP8A////AP7//gAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAD///8AAAEAAAAAAAAAAQAA/wD/AAAAAAAA/wAA////AP///wD/AP8AAAAAAP///wAAAQAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAD/AP8AAP8AAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAEAAQD///8A/wD/AAAAAAAA/wAA/wD/AAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wD/AP8AAAAAAAAAAAAA/wAAAAEAAP///wAA/wAA/wD/AAAAAAAAAAAAAAEAAAD/AAAAAAAA////AAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAD/AP8AAAAAAP8A/wD///8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAQAAAQABAP///wAAAAAAAAAAAP8A/wAA/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQD/AP8A/wD/AAAAAAD/AP8AAP8AAAAAAAAAAAAA////AP///wD///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAABAAEAAAEAAP///wD/AP8AAAAAAP///wABAAEAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAEAAP8A/wAAAAAAAP8AAAAAAAABAAEAAAAAAAAAAAD/AP8AAP8AAAEAAQAAAAAAAQABAAD/AAAAAAAAAP8AAAAAAAAAAAAAAQEBAAD/AAAAAAAA/wD/AAAAAAAAAQAAAAAAAP8A/wD/AP8AAAAAAAABAAD/AP8AAP8AAP8A/wABAAEA/wD/AAAAAAAAAAAA//7/AAAAAAD/AP8A/wD/AP///wAAAAAA/wD/AP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wD/AP8A/wD/AAAAAAAAAAAA/wD/AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP8A/wD/AP8AAAAAAP///wD/AP8AAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA/wD/AAD/AAAAAAAAAAEAAAAAAAAAAAAA/wD/AAAAAAAA/wAAAAEAAAEAAQD/AP8A////AAAAAAAAAAAAAAEAAP8A/wAA/wAA/wD/AAEBAQD/AP8A////AAAAAAAAAAAAAP8AAAEBAQD/AP8AAP8AAAABAAD/AP8AAP8AAAEBAQD///8AAQABAAEBAQD///8A/wH/AAEAAQAAAQAAAf8BAAAAAAD/AP8AAP8AAAABAAD/AP8AAP8AAAD/AAD/AP8AAAEAAAAAAAD/AP8AAP8AAAEBAQAA/wAAAAEAAP///wAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEBAQD///8AAP8AAAABAAD///8AAP8AAAAAAAABAQEAAAAAAP///wAAAAAA////AAABAAD/AP8AAAAAAAEAAQD/AP8AAQEBAAAAAAABAAEA/wD/AAAAAAD/AP8AAAAAAAEAAQAAAAAA/wD/AAAAAAAA/wAA/wH/AAD/AAAAAQAAAP8AAAEBAQAA/wAAAP8AAAABAAABAAEA/wD/AAD/AAD/Af8AAAAAAAABAAD/AP8AAAAAAAAAAAAAAAAA////AAABAAAAAAAA////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAAAAAABAAAAAAAAAAAAAP///wAAAAAAAQEBAP///wAAAQAAAP8AAP8B/wAA/wAAAQEBAP///wAAAQAAAP8AAAEBAQD/Af8AAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wAAAQAAAAAAAAAAAAAAAAAAAAEAAP///wABAQEA/wD/AAAAAAAAAAAAAAAAAP8A/wAA/wAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAQEBAP8A/wAAAAAAAP8AAAABAAAAAAAAAAAAAP///wAAAQAA////AAAAAAAA/wAAAQEBAP///wAAAQAAAP8AAAABAAAA/wAAAP8AAP///wAAAQAAAAEAAP8A/wAA/wAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAAAAAP8A/wAAAQAA/wD/AAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAP///wAAAAAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAAAAP///wAAAAAAAQEBAP///wAAAQAAAP8AAAAAAAAA/wAAAAAAAAEBAQD///8AAQEBAP///wAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAD/AP8AAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAQAAAQEBAAD/AAAA/wAAAAAAAP8A/wAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAAAA////AAAAAAAAAAAAAAEAAP///wAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAA/wAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAQAAAP8AAP8A/wD/AP8A////AAABAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAABAAAA/wAAAAEAAAABAAAAAAAA/v/+AAAAAAAA/wAAAAEAAAD/AAAAAAAA/wD/AP8A/wAA/wAAAP8AAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAQEBAAAAAAAA/wAAAAAAAP8A/wAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAP8A/wAA/wAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAQEBAP8A/wAAAAAAAAAAAP8A/wAAAAAA////AAAAAAAAAQAAAAAAAAAAAAAA/wAA/wD/AP8A/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQAA/wAA////AAAAAAD/AP8AAP8AAAEAAQAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAA/wD/AAAAAAD///8AAP8AAP8A/wD/AP8AAQABAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8AAP8AAAAAAAAAAAAAAAAAAAEAAQD+//4AAAAAAAAAAAAA/wAAAAAAAP/+/wAA/wAAAAAAAAD/AAAA/wAA/wD/AAAAAAABAQEAAAAAAP/+/wD/AP8AAAAAAAAAAAD/AP8AAAAAAP///wD/AP8AAP8AAAD/AAAAAAAAAQEBAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAD/AAAA/wAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA/v/+AAAAAAD///8AAP8AAAAAAAD///8A////AAAAAAAAAAAA/wD/AP///wD/AP8A/wD/AAEAAQAAAAAAAAAAAP8A/wAAAAAAAP8AAP8A/wD/AP8A/v/+AP///wAAAQAA/v/+AAEAAQD/AP8AAAAAAAD/AAAAAAAAAAAAAP8A/wD///8AAAAAAP8A/wD/AP8AAAAAAAEAAQAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP8A/wABAAEAAAAAAAABAAD/AP8AAAAAAAD/AAD/AP8AAP8AAP8A/wAAAAAAAAAAAP///wAA/wAA/wD/AAD/AAABAQEA////AAABAAD/AP8AAAAAAP8A/wD/AP8A//7/AAAAAAAAAAAAAAEAAP8A/wD/AP8A/wD/AAAAAAAAAAAA////AP8A/wD///8AAAAAAAABAAD/AP8A/wD/AP8A/wD/AP8AAAAAAAEAAQD///8A/wD/AAABAAABAAEAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAA////AP8A/wD/AP8A//7/AP8A/wAAAAAAAAAAAP8A/wD/AP8AAQABAAAAAAABAAEA/wD/AAAAAAD///8AAAAAAAABAAABAAEA/wD/AAAAAAD///8AAAAAAP///wD/AP8AAAAAAP8A/wAAAAAAAAAAAAEAAQAAAAAAAAAAAP///wAAAAAAAQABAAAAAAABAAEAAQABAP8A/wD/AP8A////AAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAA/wAAAAAAAP8A/wABAAEAAAAAAP///wD///8A/wD/AAEAAQAA/wAA/wD/AAEAAQAAAAAAAAAAAP8A/wAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAAABAAD///8AAAAAAAD/AAAAAAAA/wD/AAAAAAAAAQAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAQABAP8B/wAA/wAAAQEBAP8A/wAA/wAA/wH/AAAAAAAAAAAAAQEBAAAAAAD/AP8A////AAD/AAAAAAAAAAAAAP8A/wAAAQAAAAAAAAD/AAAAAQAA////AAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAP8B/wAAAAAAAP8AAAABAAD///8AAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAEAAQD///8AAQEBAP8A/wD/AP8AAQABAAAAAAD/AP8A////AAABAAABAAEAAQABAP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAP8B/wAAAAAAAP8AAAEBAQD/AP8AAAAAAAD/AAAAAAAA////AAABAAAA/wAAAAAAAAAAAAD///8AAAAAAAAAAAD/AP8AAAEAAAD/AAAAAAAAAAEAAAEAAQD///8AAAEAAP///wAAAAAAAQEBAP8A/wD/AP8AAP8AAAEBAQD///8AAAEAAAABAAAA/wAAAQABAP8A/wAAAQAAAAAAAP///wAAAQAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAQAA/wD/AAAAAAAA/wAAAP8AAAAAAAABAQEAAAEAAP8A/wAAAAAA////AAD/AAD/AP8A////AAAAAAAAAAAAAP8AAAD/AAAA/wAA////AP///wAA/wAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAA/wAAAAAAAAAAAAAAAAAAAQABAAAAAAABAQEAAAEAAAD/AAAA/wAAAAEAAAD/AAAAAAAAAP8AAP8A/wAAAAAAAAAAAAD/AAAAAQAAAAAAAP7//gAAAAAA/wD/AAD/AAAA/wAA////AP///wAA/wAAAAAAAAD/AAD/AP8A////AAD/AAAAAQAAAP8AAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wAA/wAAAQABAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAAAAAAAAAAAA/wD/AAD/AAAA/wAAAAAAAP///wAAAAAAAP8AAP///wAAAAAA////AAD/AAAA/wAA////AAAAAAAA/wAAAP8AAAD/AAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAABAAEAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA/wD/AP///wD+//4A////AAAAAAAAAQAA/wD/AAAAAAD///8AAAAAAP///wD/AP8AAAAAAP8A/wAAAAAA/wD/AP8A/wAAAAAAAP8AAAD/AAAAAAAAAP8AAP8A/wAA/wAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAAAA////AP8A/wD///8AAP8AAAAAAAAAAAAAAP8AAP8A/wD///8A////AAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wAA/wAAAAEAAAAAAAAA/wAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAQAAAAAAAP///wAAAAAA////AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEBAQD/AP8AAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAP8A/wAAAAAA////AAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/v/+AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAP8A/wAAAAAAAQABAAAAAAABAAEAAQABAAEAAQD///8AAQABAP8A/wABAAEAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAQABAAEAAQD/AP8AAAAAAAAAAAD/AP8A/wD/AAD/AAD/AP8AAAEAAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA////AP8A/wD///8A/wD/AAEAAQAAAAAAAQEBAAAAAAABAAEAAAAAAP8A/wAAAAAAAAAAAAEAAQABAAEAAAAAAP8A/wD///8A/wD/AAAAAAAAAAAAAQABAAAAAAAAAAAAAP8AAP8A/wD/AP8AAAAAAAEAAQAAAAAA/wD/AAAAAAD//v8A/wD/AAEAAQD/AP8A////AP8A/wD///8A/wD/AAD/AAD///8A////AAAAAAD/AP8AAP8AAP///wABAAEA/wD/AAAAAAD///8AAQABAAEAAQD/AP8A/wD/AAEAAQD///8AAAAAAAABAAABAAEAAAAAAAEAAQD///8AAAAAAAABAAAAAAAA/wD/AAABAAAAAAAAAAAAAP8A/wD///8AAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAQAAAQABAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAABAAD/AP8AAP8AAAAAAAAAAQAA////AAAAAAD/Af8AAP8AAAABAAAAAAAAAAEAAAAAAAD/AP8AAP8AAAEBAQAAAAAA/wD/AAD/AAAAAQAAAP8AAAABAAAAAAAA////AAABAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAEAAAAAAAAAAAAAAP8AAP8A/wAAAAAA/wD/AAD/AAD/Af8AAP8AAAABAAD///8AAQEBAP///wAAAQAAAP8AAAAAAAAAAAAAAP8AAP8B/wAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAQAAAAAAAP///wABAQEA////AP8B/wABAAEA/wH/AAAAAAABAQEA////AP8B/wAAAAAAAQABAP8A/wAAAAAAAAEAAP8A/wABAAEAAP8AAP8B/wAAAAAA/wD/AAAAAAAA/wAAAAEAAP8A/wAAAAAAAAAAAP/+/wABAQEA/wD/AAAAAAAAAAAA/wD/AAD+AAAAAQAAAP8AAP///wAAAAAAAAEAAAD/AAAAAQAA/wD/AAAAAAAA/wAAAQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAD/AAAAAQAAAAAAAAABAAAAAQAAAP8AAAD/AAD/AP8A////AAD/AAAA/wAAAAEAAAAAAAAA/wAAAAEAAAABAAD///8AAAEAAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAEAAP8A/wABAAEAAP8AAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAQABAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAEAAAABAAD/AP8AAAAAAAABAAAAAAAA/wD/AAD/AAAAAAAA////AAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAABAAD///8AAAAAAAAAAAD+//4AAAAAAAD/AAD///8AAAAAAAD/AAAAAQAA////AAD/AAD///8AAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAP///wAAAAAAAP8AAAD/AAAAAQAAAP8AAAAAAAD///8AAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAA/wAAAP8AAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wD///8AAAAAAAD/AAAA/wAAAAAAAAAAAAD///8AAQABAAAAAAAAAQAAAAAAAP8A/wD///8AAP8AAAD/AAABAAEAAQABAP///wAAAAAA////AAABAAAAAAAA////AAD/AAD///8A/wD/AAD/AAAA/wAAAP8AAP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAQAAAAEAAP///wD/AP8AAAAAAP///wAAAAAAAP8AAAD/AAD///8AAAAAAP8A/wAAAAAAAAAAAAD/AAD/AP8A/wD/AAD/AAD/AP8AAAAAAAAAAAAAAQAA////AAAAAAD///8AAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAA/wD/AAD/AAABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA/wD/AAABAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAD/AP8AAAAAAAEAAQAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA////AAAAAAD///8A////AAABAAD/AP8AAAAAAP///wD/AP8AAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAC8vLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5tMRbQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3d3QAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAAHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA0NDQAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAEBAQD///8AAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAEAAAD/AAAAAAAAAQEBAP7//gABAQEAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAABAAD///8AAQEBAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAEAAQD///8AAAAAAAABAAAA/wAAAAEAAAEAAQD///8AAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAEBAQD///8AAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA5OTkAAABAAD///8AAQEBAAD/AAAAAAAA/wD/AAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wABAAEAAAAAAAABAAABAAEA/wD/AAD/AAAAAQAA////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAP8A/wABAAEA/wD/AAAAAAABAAEA/wD/AAEBAQD///8AAQABAAAAAAAAAAAAAAEAAP///wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAABAAAAAAAA////AAEBAQAA/wAAAAEAAAAAAAD///8AAAAAAAEAAQAAAQAAAP8AAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAA////AAEAAQAAAAAAAAEAAAD/AAAAAQAA////AAEAAQAAAAAAAAAAAP8A/wABAAEAAAEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAP8AAP8A/wD/AP8AAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8A/wD/AP///wAAAAAAAAAAAP8A/wD///8A////AP8A/wD///8AAAAAAAEAAQAAAAAAAAAAAAABAAD/AP8A/wD/AAAAAAD/AP8AAAAAAAEAAQABAAEA/wD/AAEAAQAAAAAAAAAAAP///wD+//4AAP8AAP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP8A/wAAAAAA/wD/AAD/AAD///8AAAAAAAEAAQAAAAAAAAAAAAEBAQD/AP8AAAAAAP///wABAAEAAAAAAP///wAAAQAA////AAAAAAD/AP8AAAAAAP8A/wAAAAAA/wD/AP8A/wD/AP8AAAAAAAAAAAAAAAAA/wD/AP///wD///8AAAAAAP///wAAAAAAAP8AAAD/AAAA/wAAAAAAAP8A/wAA/wAA/wD/AP8A/wAAAAAA/wD/AAEAAQAAAAAAAAAAAP///wD/AP8A/wD/AP8A/wAA/wAAAQEBAP8A/wAAAAAA////AAAAAAAA/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAAEA////AAAAAAAAAAAAAQABAAABAAABAAEA/wD/AP8A/wAAAAAAAP8AAP8A/wABAAEAAP8AAAAAAAD///8A/wD/AAEAAQAAAAAAAQEBAAD/AAAAAAAA////AAAAAAD/AP8AAAAAAP///wAAAAAAAP8AAAABAAAAAAAAAAAAAP8A/wAAAAAAAAAAAP8A/wD/AP8A////AAEAAQAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAAAAAAAAAAAA/wD/AAEAAQAAAAAAAP8AAP///wAA/wAA/wD/AP///wD/AP8AAAAAAP/+/wAAAAAAAAAAAAD/AAD/AP8A////AAABAAD///8AAQABAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAABAAEAAP8AAP8A/wD///8AAQABAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AP8A/wAAAAAAAQABAAAAAAD/AP8AAAAAAAAAAAAAAAAAAQABAP7//gD/AP8A/wD/AAD/AAABAQEAAAAAAAAAAAD/AP8A////AAD/AAD///8AAP8AAP///wD/AP8AAP8AAP8A/wAAAAAA/wD/AAD/AAABAAEA/wD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAAA////AP/+/wD///8AAAAAAAAAAAD/AP8AAAEAAAAAAAD///8AAAAAAP///wAAAAAAAP8AAP8A/wAAAQAAAP8AAAAAAAAAAQAAAAAAAP///wAAAAAA////AAAAAAAAAAAAAAEAAP/+/wAA/wAAAP8AAAD/AAD///8AAP8AAAD/AAAA/wAAAAEAAP///wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAQAAAP8AAP8A/wD///8AAAAAAP8A/wAAAQAA////AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAQAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AAAAAAAAAAAA////AAD/AAD///8AAAAAAAAAAAAAAAAA////AAEBAQABAAEAAAAAAAABAAD//v8AAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAQEBAAAAAAABAAEAAAEAAAAAAAAA/wAAAAAAAAABAAD/AP8AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAD///8A/wD/AAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP///wAAAAAAAQEBAAEAAQAAAAAA/wD/AAD/AAD///8A////AAAAAAAAAAAA/wD/AAAAAAD///8AAAAAAAD/AAD///8AAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAAAAAD///8AAAEAAAABAAAA/wAAAAAAAAABAAAA/wAA/wD/AAABAAAA/wAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAP8AAP8A/wAA/wAAAAAAAAD/AAAA/wAAAAAAAP8A/wAA/wAAAP8AAAAAAAD///8AAQEBAP///wD///8AAP8AAP///wD///8AAAAAAAD/AAAAAAAAAP8AAAAAAAD///8AAAAAAAD/AAAAAAAAAQABAAAAAAAAAAAAAAEAAAAAAAABAAEAAP8AAAD/AAAA/wAA/wD/AAAAAAD///8A////AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAABAAD/AP8A////AAABAAD///8AAP8AAAAAAAD/AP8AAP8AAP///wAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAAAAAAABAAEAAAEAAP///wAAAAAAAQABAAAAAAD/AP8AAAAAAAEAAQD/AP8A////AAAAAAAAAAAAAQABAP8A/wABAAEA/wD/AAAAAAAA/wAAAAAAAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQD/AP8AAf8BAAAAAAAA/wAA/wD/AAAAAAABAAEAAAAAAAD/AAD/AP8AAP8AAAEAAQD/AP8AAQABAAD/AAD/AP8AAAAAAAD/AAABAQEA/wD/AAEAAQD///8AAQABAP8A/wAAAAAAAAAAAP///wAAAAAAAP8AAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAD/AAABAQEAAAAAAAAAAAD/AP8AAAAAAAEAAQAAAQAAAP8AAAAAAAD///8AAAAAAAD/AAABAAEA/wD/AAEAAQAA/wAA/wD/AAD/AAAAAAAAAP8AAAAAAAABAQEA////AAEBAQD///8AAAAAAP///wABAAEAAQABAP8A/wAAAAAAAP8AAP8A/wAA/gAAAQEBAP///wAAAAAAAAAAAP///wABAAEA/wD/AAD/AAAAAAAAAAEAAAH/AQD///8AAQIBAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AP8A/wD/AP8AAP8AAAAAAAABAAEA////AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAD/AP8AAAAAAAEAAQAAAAAAAQABAAAAAAAAAAAAAAAAAAEAAQAAAAAA/wD/AP///wABAAEAAAAAAP///wAA/wAA////AP8A/wD///8AAQABAAAAAAAAAAAA////AAAAAAABAAEAAQABAP///wAAAAAA/wD/AAAAAAABAAEAAP8AAAABAAAAAAAAAQABAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AAAAAAAA/wAA//7/AAAAAAAAAAAAAAAAAAAAAAD///8A////AP8A/wAAAAAAAAAAAAAAAAD/AP8AAP8AAP8A/wD/AP8AAP8AAAD/AAABAAEAAAAAAAD/AAD///8AAAAAAP///wAAAAAAAP8AAAEAAQD/AP8AAAAAAAAAAAAAAAAA/wD/AAEAAQABAgEAAAAAAAEAAQAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAA////AAAAAAAAAQAA//7/AP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAAEAAQAAAAAA/v/+AAD/AAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAD///8AAAAAAAD/AAAAAAAAAAAAAP8A/wAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAD/AP8AAP8AAAD/AAAAAQAAAAEAAAAAAAD/AP8A/wD/AAD/AAD/AP8AAQABAP8A/wD///8A////AAAAAAAAAAAAAP8AAP8A/wD///8A/wD/AAD/AAD+//4A/wD/AP///wAAAAAAAP8AAAEAAQAA/wAA////AAAAAAAAAAAAAAAAAAD/AAD/AP8AAP8AAAAAAAAA/wAAAAAAAP///wD/AP8AAAEAAAEAAQAAAAAAAAAAAP8A/wD///8AAAEAAAEAAQAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAD/AP8AAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAAEAAP8A/wABAAEA/wD/AAAAAAAAAAAAAP8AAP8A/wD//v8AAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAA/wAAAAAAAP///wAA/wAAAQABAAAAAAAAAAAAAAEAAAD/AAD///8AAAAAAP///wAAAAAAAAEAAAAAAAD/AP8AAAAAAAABAAAAAAAA////AAEAAQAA/wAAAAAAAAAAAAAA/wAAAP8AAAABAAAAAAAAAP8AAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAP8AAP8A/wD///8A/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAQEAAQABAAAAAAAA/wAAAAAAAP7//gAAAQAAAAAAAP///wAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAP8AAAABAAAA/wAA////AP///wAA/wAAAAAAAP///wABAAEAAP8AAP///wAAAQAAAAAAAP///wD///8A////AP///wD///8AAAEAAP///wAA/wAA////AAAAAAD/AP8AAAAAAAABAAAA/wAAAP8AAAD/AAD///8A////AAD/AAAAAAAAAAEAAAD/AAAAAQAA/v/+AAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAP8A/wAA/wAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAEAAAH/AQAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAB/wEAAAAAAP8A/wABAQEA////AAEAAQAAAAAAAP8AAP8A/wAAAAAA////AAEAAQAAAQAAAQABAP8A/wD/AP8AAAAAAAD/AAABAQEAAAAAAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAQABAAAAAAD/AP8AAQABAAAAAAABAAEA////AAAAAAABAAEAAAEAAP///wAB/wEAAAAAAAD/AAD/AP8AAAAAAP///wABAAEA/gD+AAAAAAAAAAAAAQABAAEBAQAA/wAAAAAAAAEAAQD///8AAAAAAAEAAQD///8AAAAAAAEAAQAAAAAA/wD/AAH/AQD/AP8AAQEBAAD/AAAAAQAAAP8AAAEAAQAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAABAAEA/wD/AAEBAQAAAAAAAAAAAAEAAQAAAQAAAP8AAAAAAAABAAEA/wD/AAD/AAABAAEAAAAAAAABAAD///8AAAAAAAAAAAAA/wAAAAAAAAAAAAD///8AAQABAP8A/wAAAAAAAAAAAAAAAAABAAEAAAEAAAD/AAD/AP8AAP8AAAAAAAAA/wAAAQABAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAD///8AAAAAAP8A/wAAAAAAAAAAAAEBAQD///8AAAAAAP8A/wAA/wAAAAAAAAH/AQAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQD///8AAP8AAAABAAD/AP8AAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAAAAAD/AP8AAAAAAAEAAQD/AP8AAP8AAAAAAAD/AP8AAAAAAAD/AAABAQEAAAAAAP8A/wD/AP8AAAAAAAAAAAAAAAAA/wD/AAH/AQD///8AAAEAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAABAAEAAP8AAP///wAA/wAAAAEAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP8A/wAAAQAAAAAAAAEAAQAAAAAA/wD/AAD+AAAAAQAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAAAQAAAAAAAAEAAQD/AP8AAP8AAAAAAAABAQEA////AAEAAQD/AP8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAEAAQABAAEAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAP8AAP///wAA/wAAAP8AAAAAAAAAAAAAAAAAAP///wAAAAAAAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAABAAEAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAD/AP8A/wD/AAAAAAABAAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wD/AP8A////AAEBAQAAAAAAAAAAAP7//gAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD/AAD/AAAAAAAAAP8AAAEAAQAA/wAAAAAAAAEBAQAA/wAA////AP8A/wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wABAAEA////AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAP///wD///8AAAEAAAABAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAQAAAAEAAAD/AAD/AP8A/wD/AAD/AAD///8AAQABAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAD///8AAAAAAP///wAAAAAA/wD/AAD/AAD+//4AAAEAAP8A/wAAAAAAAP8AAAEAAQD/AP8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD///8A////AAAAAAAA/wAAAAAAAP///wAAAQAAAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAD///8AAAEAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAAAAP8A/wD///8AAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAA////AAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAP///wAAAQAAAP8AAP8A/wAAAQAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAQAA////AAAAAAD///8A/wD/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAP8A/wAAAQAAAP8AAAD/AAD///8AAAAAAAABAAAAAQAA/wD/AAAAAAAA/wAA////AP8A/wABAAEAAQEBAP8A/wABAAEA/wD/AAAAAAAAAQAAAAEAAAD/AAD///8AAAAAAAAAAAAAAAAAAAAAAAEAAQD///8A////AP8A/wAAAAAA////AP///wAA/wAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAQEBAP///wD///8AAAAAAAABAAAA/wAAAP8AAP///wAAAAAAAAAAAAABAAAAAAAA////AAABAAD///8A/wD/AAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAP///wD/AP8AAAEAAAAAAAABAAEA////AAAAAAAAAAAAAAAAAAEAAQAA/wAA/wD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA////AAAAAAABAQEAAP8AAAAAAAAAAQAAAAEAAAAAAAD/AP8A////AAAAAAAAAAAAAQEBAAAAAAAAAAAAAAEAAAD/AAApyY4sAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAD/AAAAAAAAAP8AAAD/AAD///8AAQABAAD/AAAAAQAAAQABAP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAQEBAAD/AAD///8AAAAAAAD/AAAAAQAAAP8AAAAAAAD/AP8AAAAAAP///wAA/wAAAQEBAP8A/wAAAQAA////AAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAP8AAP8A/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAP8AAAAAAAAAAAAAAP4AAAAAAAABAQEA/wD/AAAAAAAAAAAAAAEAAP///wAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQABAP8A/wAAAAAAAQABAAEAAQD///8AAAAAAAAAAAAA/wAAAAAAAP8A/wAAAAAAAAAAAP8A/wAAAAAAAQEBAP///wAAAAAAAP8AAP8B/wABAQEA////AAAAAAAAAAAAAAAAAAAAAAD//v8AAAEAAAAAAAAB/wEAAAAAAP///wAAAQAAAAAAAP8A/wAAAAAAAP8AAAAAAAAB/wEA/wD/AAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAABAAEA/wD/AP8A/wAB/wEA/wD/AAEBAQAA/wAA/wD/AAAAAAAB/wEA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAEAAQAAAAAA//7/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAABAAEAAAAAAAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAABAAEAAAAAAAD/AAAAAAAAAQABAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAEAAAEBAQAA/wAAAAEAAAABAAD/AP8AAAAAAAEAAQAAAAAA////AAD/AAAA/wAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAAAAQAA////AAAAAAABAAEAAAAAAAAAAAAAAAAA//7/AAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AP8A/wD/AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAP8AAAD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAD/AP8AAP8AAAAAAAD///8AAAAAAP///wAA/wAAAAAAAAAAAAD/AP8AAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD///8AAAAAAP8A/wAAAAAA////AAAAAAAA/wAA////AP/+/wD/AP8AAAAAAAD/AAAAAQAAAAAAAP///wAA/wAA////AAAAAAD///8AAAAAAAABAAD///8AAP8AAAAAAAAAAAAA/wD/AAAAAAD///8AAAAAAAABAAAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAA/wAA////AP///wD/AP8AAP8AAAAAAAD///8AAP8AAP8A/wAAAAAAAAAAAAABAAD/AP8AAAAAAP8A/wAA/wAAAP8AAAD/AAD///8A////AAAAAAAAAAAA/wD/AAAAAAAAAAAAAQEBAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAEAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAA////AAAAAAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAAD//v8AAP8AAAD/AAAAAAAAAAAAAP8A/wAAAAAA/wD/AAABAAAAAAAAAAAAAAAAAAD/AP8AAP8AAP///wAA/wAA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQABAAD/AAABAQEA/wD/AAD/AAAAAAAAAQABAP8A/wAAAAAA////AP8A/wAA/wAAAP8AAAAAAAAA/wAAAAAAAAEBAQABAQEAAAAAAP///wAAAAAAAP8AAAD/AAD///8A/wD/AP///wD/AP8AAP8AAP///wAAAAAA////AAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAP///wAAAQAAAQEBAP///wABAQEAAAEAAP///wABAAEAAAEAAAAAAAAAAAAAAP8AAAAAAAABAQEAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAA/wAA/v/+AAAAAAD/AP8A/wD/AAAAAAAA/wAAAP8AAP8A/wAA/wAA////AP///wAAAQAA////AP///wAA/wAA////AP///wAAAAAAAP8AAAAAAAAA/wAAAAAAAP8A/wD/AP8AAP8AAAAAAAABAAEAAP8AAP8A/wD/AP8AAAAAAP8A/wAA/wAA////AAD/AAD///8AAQABAAD/AAD///8A////AAD/AAD///8AAAAAAAEBAQD/AP8AAQEBAP8A/wD///8AAP8AAAD/AAAAAAAAAAAAAP8A/wAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAQABAP8A/wAA/wAAAQABAAAAAAAAAQAAAf8BAP8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAA/wD/AAAAAAD/AP8AAAAAAP///wAAAAAAAQABAP8A/wAAAAAAAP8AAAABAAD///8AAQABAAEAAQAA/wAAAAAAAAEAAQD/AP8AAQABAP/+/wAAAAAAAAEAAAD/AAAAAAAAAQABAP///wABAQEA/wD/AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAABAAAA/wAA/wD/AAEAAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAD/AP8AAAAAAAEAAQD/AP8AAAAAAAEAAQD/AP8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEBAQD///8AAQEBAP///wAAAAAA/wD/AAEAAQABAQEA////AP8A/wABAAEA/wD/AAD/AAABAAEA////AAAAAAD/AP8AAAAAAAEAAQAAAAAA////AAAAAAAAAQAAAQABAP/+/wABAQEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAEAAQD///8A/wD/AAEAAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAQD///8AAQABAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAA////AAEAAQAAAAAAAAEAAAEAAQAAAAAA/wD/AP8A/wD/AP8A/wD/AAAAAAAAAAAAAP8AAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAABAAD/AP8AAAAAAAAAAAAAAAAAAQEBAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAEAAQAA/wAAAAAAAP///wD/AP8AAAAAAP8A/wAA/wAA////AAEAAQD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAP8A/wAAAAAAAQEBAP8A/wAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAAAAAAAP8AAP///wAAAAAA////AAAAAAAA/wAAAAAAAP///wD///8AAAAAAAAAAAD/AP8AAQABAAEAAQAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wD/AP8AAAAAAAAAAAD///8A////AAABAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAA/wAA////AP8A/wAA/wAAAP8AAP///wAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAD///8AAP8AAP///wAAAAAA/v/+AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAAA////AAAAAAAAAAAAAP8AAP///wAAAAAAAP8AAP8A/wAAAAAAAQABAP///wAAAAAAAAAAAP7//gAA/wAA/wD/AP8A/wD///8AAP8AAAAAAAAAAAAA/wD/AAD/AAD///8AAAAAAAD/AAAAAAAA//7/AAAAAAD///8AAP8AAAD/AAD///8AAAAAAP8A/wD/AP8AAAAAAAD/AAD///8AAAAAAAAAAAABAQEAAAEAAP8A/wAAAAAAAP8AAAAAAAAAAAAA/wD/AP///wAAAAAAAAEAAAD/AAAA/wAA////AAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP///wD/AP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAA/wAA/v/+AP///wAAAQAA/wD/AAAAAAD/AP8AAAEAAAABAAAAAQAA/wD/AP8A/wAA/wAAAP8AAAAAAAABAQEAAAAAAP8A/wAAAQAAAQEBAP///wAAAAAAAP8AAAAAAAABAAEAAP8AAP7//gD///8AAAAAAAAAAAAA/wAA/wD/AAAAAAAA/wAAAAAAAP///wAAAAAA////AAEAAQD///8AAP8AAAAAAAD/AP8AAAAAAP///wD/AP8A/wD/AAD/AAD///8AAP8AAAAAAAABAQEAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP8A/wABAAEA////AAAAAAABAAEAAP8AAAAAAAABAQEAAP8AAAD/AAD/AP8A////AAAAAAD///8AAAAAAAD/AAAAAAAA////AAEAAQD///8AAAAAAAABAAAAAQAA////AAD/AAD///8A////AP///wAAAAAA////AP///wAA/wAAAAAAAP8A/wAAAAAAAAEAAP///wAA/wAAAAAAAAD/AAAA/wAA////AAABAAAAAAAAAP8AAAABAAD///8AAP8AAAD/AAAA/wAAAP8AAP///wAAAAAAAP8AAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAQEBAP///wD///8AAQABAAD/AAAAAAAAAP8AAAAAAAD/AP8AAAAAAAEAAQD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD///8AAAAAAAAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAAEAAQAAAAAAAAEAAAD/AAD/AP8AAAAAAAAAAAD/AP8AAAAAAAEAAQAAAAAA/wD/AAEAAQABAAEA/wD/AAAAAAABAQEAAP8AAAAAAAABAQEAAAAAAAD/AAAAAAAA/wD/AAEAAQAA/wAA/wD/AAAAAAABAAEA////AAABAAABAAEAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQABAP8A/wAA/wAAAAAAAAAAAAAA/wAAAQABAP///wABAQEA////AAAAAAABAAEAAQABAP8A/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAQEBAAAAAAD///8AAQABAAAAAAD/AP8AAP8AAAEAAQAAAAAAAP8AAP8A/wAAAAAAAQABAP///wABAAEAAAAAAP///wAAAAAA/wD/AAAAAAAA/wAAAAEAAAEAAQAAAAAA////AAABAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAD/AP8AAP8AAAD/AAAAAQAA/wD/AAAAAAAAAAAAAAEAAP///wABAAEA/wD/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AP8AAAAAAAD/AAAAAQAAAAAAAP8A/wAA/wAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD//v8AAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAP8AAP8B/wABAAEAAP8AAAABAAD///8AAAEAAAD/AAD/Af8AAQABAP8A/wD/AP8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAD/AP8AAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAA/wD/AAAAAAAAAAAA////AAAAAAAAAAAA////AAABAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAAABAAAAAQAAAQABAP8A/wAA/wAAAAEAAAEBAQAA/wAA/wD/AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAD///8AAAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA/wD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAA/wAAAQABAAAAAAAAAAAA////AAABAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEAAAAAAAAAAAAA////AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQEBAAD/AAAAAAAAAAEAAAD/AAD///8A/wD/AAAAAAABAAEAAP8AAP7+/gD/AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP///wD///8AAAAAAAAAAAABAAEAAP8AAAAAAAAA/wAAAAEAAAAAAAAAAAAA////AAAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAA/wD/AAD/AAAAAAAAAP8AAP///wAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAD///8AAP8AAAAAAAAAAAAAAP8AAP///wAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAAAAAAD///8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD///8A////AAEAAQAA/wAAAAAAAAABAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAP///wAAAQAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAQAAAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP///wAAAAAAAAAAAP///wD/AP8AAP8AAAD/AAAA/wAAAAAAAAABAAAA/wAA//7/AAABAAD///8AAAAAAAABAAABAAEAAP8AAAD/AAD/AP8AAAEAAAEAAQAA/wAAAP8AAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD/AAEAAQAAAQAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAAEAAQAAAQAA////AAD/AAABAAEAAAAAAAAAAAD/AP8AAAAAAAEAAQAAAQAAAAAAAP8A/wABAAEA/wD/AAD/AAAAAAAA/wD/AAD/AAABAQEAAAAAAAEBAQD///8AAf8BAAAAAAD/AP8AAQEBAAAAAAAAAAAA////AAAAAAABAAEAAAEAAP///wABAAEA////AAAAAAABAAEAAQABAAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAAEAAQD/AP8AAAAAAAAAAAAA/wAA/wD/AAEBAQAAAAAA/wD/AAD/AAAAAAAAAAAAAP8A/wABAQEAAAAAAP///wAAAAAAAQABAAAAAAAA/wAAAAAAAAAAAAD///8AAAAAAAEAAQD///8AAQABAAABAAD///8AAQABAAAAAAD///8AAAAAAAAAAAABAAEA/wD/AAEAAQAAAQAA////AAAAAAABAAEA/wD/AAEAAQAAAAAA////AAAAAAAAAAAAAQABAAAAAAAAAAAAAP8AAP8A/wABAAEA/wD/AAD/AAABAAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAMzMzAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAA5OTkAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAHx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJOsfwAACAASURBVAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA4eLhAAAAAAAAAAAA////AAEBAQD///8AAQABAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAP8A/wABAAEAAAAAAAABAAD///8AAQEBAAD/AAD/AP8AAAAAAAAAAAABAAEAAAAAAP8A/wAAAAAAAAAAAAAAAAABAAEA/wD/AAEBAQD///8AAQEBAAD/AAAAAQAAAP8AAAAAAAAAAAAA/wD/AAEBAQD///8AAAAAAAEBAQAA/wAA/wD/AAEAAQAAAQAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAA////AAAAAAAAAAAAAQABAAAAAAD/AP8AAQEBAAAAAAAA/wAA/wD/AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAAEAAAEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAAD/AAAAAQAA////AAEAAQD/AP8AAQABAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAAAA////AAAAAAABAAEA////AAEBAQD///8AAQABAAAAAAD/AP8AAAAAAAD/AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP///wAAAAAA////AAAAAAABAAEA/wD/AAAAAAAA/wAAAAEAAP///wABAAEA/wD/AP///wAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAP8A/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAQABAP8A/wAAAAAAAQABAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAQABAP8A/wD/AP8AAP8AAAAAAAAAAAAAAQABAP///wAAAQAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/AP8AAAAAAAAAAAABAAEA/wD/AP///wAAAAAA////AAEBAQD///8AAAAAAP8A/wAAAAAA/wD/AAEBAQAA/wAAAAAAAAEBAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD///8AAAAAAP8A/wAAAAAAAAEAAAAAAAAAAAAAAQABAP/+/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAQABAP///wABAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAQAAAQABAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA/wAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wABAAEAAAAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wD///8AAAAAAP7+/gD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////4P8A/wABAAEA////AAAAAAAAAAAAAP8AAAD/AAD///8A/wD/AAAAAAAA/wAAAAAAAP///wAAAAAA////AAAAAAAAAQAAAAAAAAAAAAD///8A////AAAAAAD+//4AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA/wD/AAAAAAABAAEA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AP///wAAAAAA/v/+AAAAAAAA/wAA////AP///wAA/wAAAP8AAP///wAAAAAA////AP8A/wAAAAAA/v/+AP///wAAAAAAAAAAAAABAAABAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAD///8A/wD/AAAAAAAAAQAAAAAAAP///wAAAAAAAP8AAAEAAQAAAAAAAQEBAAEAAQAAAAAAAAAAAP///wAA/wAA/wD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/AP8AAP8AAAEAAQD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAQABAQHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQABAAD/AAD/AP8AAAAAAAAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQAA/wAAAQABAAD/AAD/AP8AAAAAAAEAAQAAAAAA/wD/AAEBAQAAAAAA////AAEBAQAA/wAAAAEAAAAAAAD///8AAAAAAAAAAAAAAAAAAf8BAAAAAAD/AP8AAf8BAP8A/wABAAEA////AAEAAQD+AP4AAAAAAP///wAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAD/AAABAAEAAAAAAAEBAQD///8AAAAAAP///wABAAEAAQABAAAAAAAAAAAA/wD/AAEAAQD///8AAQABAP8A/wD///8AAAAAAAEBAQD///8AAQEBAAD/AAD/AP8AAQABAP///wABAAEA/wD/AAEBAQAA/wAAAAAAAP///wABAQEAAAAAAAEAAQD///8AAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAA////AAAAAAD/AP8AAQABAAD/AAAAAAAA////AAAAAAABAAEA/wD/AAAAAAAAAAAAAQABAAABAAAAAAAAAAEAAP7//gAAAAAA/wD/AAEAAQD///8AAQABAAABAAD///8AAAAAAAAAAAAA/wDgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAB0AEBAQAAAAAA/wD/AP8A/wABAAEAAAAAAAAAAAAAAAAA////AAAAAAD///8A/wD/AP///wD/AP8A/wD/AP8A/wAAAAAAAQABAP8A/wD/AP8AAP8AAP///wD///8AAAAAAP///wD/AP8A////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAEAAP8A/wAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAAAAAAEAAQD///8A/wD/AP8A/wD/AP8AAAAAAP8A/wABAAEA/wD/AAAAAAAAAAAAAAAAAP///wAAAAAA////AP8A/wABAAEA////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAEAAQD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA/wD/AP///wD///8A////AAEBAQAAAAAAAAAAAP8A/wABAQEA/wD/AAAAAAAAAAAAAAAAAAAAAAAA/wDhAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAgIC4f///wAA/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP7+/gAAAAAAAAAAAAD/AAAAAAAA/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAP///wAAAAAA/wD/AP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAP///wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAP8A/wAAAAAA////AP///wAAAAAAAAAAAP8A/wAAAAAA////AAABAAAAAAAAAAAAAP///wAAAAAA////AP///wD///8AAAAAAP///wAA/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+/wAAAAAAAAAAAAAAAAD///8AAAAAAP///wAAAAAAAQEBAAEAAQACAgLQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/gH+vwD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEAAAEAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAEAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAAEBAQAA/wAA////AAAAAAABAQEAAAAAAAAAAAABAQEAAAAAAAABAAD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAEAAQAA/wAAAP8AAAEBAQAAAAAAAAAAAAEAAQAAAQAA////AAD/AAD///8AAAAAAAAAAAAA/wAA////AAAAAAAAAAAAAP8AAAAAAAABAAEAAAAAAAABAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA/wAA/v7+AP8A/wD+/v7PAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAABhMGwf8A/wAA/wAA////AP///wD///8AAAAAAAAAAAAA/wAAAP8AAP///wAAAQAA////AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A/wD/AP8AAAAAAP8A/wD///8A////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQD///8A////AAD/AAAA/wAA/v/+AAAAAAAAAQAAAQEBAP///wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAABAQEA/wD/AP///wD+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAP///wAAAAAA////AAD/AAD///8A////AAAAAAD///8AAAAAAP///wD///8A////AAD/AAD/AP8AAP8AAP///wD///8A////AP8A/wAAAAAA/wD/AAAAAAD///8A////AP8A/wAAAAAAAAAAAAABAAAAAAAA////AP///wD/AP8AAQABAAAAAAAAAAAA/wD/AAAAAAD+//4AAAAAAP///wAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAQABAP///wAGBgbBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8AAAAMAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAEAAAEBAQD///8AAAAAAP///wAAAAAA////AP///wAAAAAA////AP///wAAAAAAAAAAAAEBAQD/AP8A////AAEAAQAAAAAAAAAAAAEBAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAQEBAP8A/wAAAAAAAQEBAAAAAAAAAQAAAQEBAP///wAA/wAAAP8AAAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A////AP8A/wAAAAAA////AAAAAAD///8AAQEBAAABAAAAAAAAAP8AAP///wAAAAAA/wD/AAEBAQABAQEAAQABAP8A/wABAQEA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP///wAAAAAAAQEBAAAAAAD///8AAAAAAP///wAAAAAAAAAAAAEAAQAAAAAA/wD/AAAAAAD///8AAAAAAP///wAAAAAAAP8AAAAAAAD///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD/AAAAAMDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAbD/AP8AAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAP/+/wAAAAAAAQEBAP8A/wAAAAAA////AP///wAAAAAAAQEBAP///wD///8AAAAAAAEAAQD///8AAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AAD/AAAAAAAA////AP8A/wD+/v4A////AAAAAAD/AP8A/wD/AAEAAQD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAD+//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AAAAAAD//v8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAAD/AAAAAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAP///wAAAQAAAAAAAAD/AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAcXB6ECAgLwAP8AAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AAAAAAAAAAAAAAAAAP8A/wAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAABAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAQABAP8A/wD///8A////AAAAAAAAAAAAAAAAAAABAAABAQEAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAAAAAP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAQD///8AAAAAAAEBAQAAAAAAAAAAAAAAAAABAQEAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD///8AAAAAAAgICMEAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAPDo8PgKDgoZAP8AOAEBAQAAAAAAAAAAAP8A/wABAAEAAAEAAAD/AAD/AP8AAQEBAP///wABAQEA////AAEBAQAAAQAA////AAEBAQAA/wAA/wD/AAAAAAABAAEA/wD/AAEBAQAA/wAAAAEAAAAAAAAA/wAAAQABAAABAAAAAAAA////AAEBAQAAAAAA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAEAAAD/AAABAAEAAAAAAAEAAQAAAQAA////AAAAAAABAAEA/wD/AAAAAAABAQEAAAAAAAEBAQAA/wAAAAAAAAEBAQAAAAAAAAAAAP8A/wAAAAAAAQEBAAABAAAA/wAAAAEAAAABAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAD///8AAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAA/wD/AAEBAQAAAAAA////AAEBAQD///8AAAAAAAEBAQAAAAAAAP8AAP8A/wABAAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAQEBAAAAAAAAAAAAAP8AoOTk5KEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQmQAAAAAP///wD///8AAAAAAAAAAAD/AP8AAP8AAP8A/wABAQEAAAAAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAP///wAAAQAAAQEBAAAAAAD/AP8AAAAAAP///wD/AP8A////AP///wD/AP8A/wD/AP///wD///8AAQABAP///wAAAAAAAAAAAAEBAQABAQEAAAAAAAD/AAAAAAAAAQEBAP///wAAAAAAAQEBAAAAAAAAAAAAAQEBAAABAAD/AP8A////AP8A/wD/AP8AAAAAAAABAAAA/wAAAAAAAAEBAQD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAQAA/wD/AP///wD/AP8AAAEAAAAAAAAAAAAA////AP///wD/AP8A////AP///wD///8A////AAAAAAD///8A////AP///wD///8AAAEAAAD/AAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8AAAAAAAD/AAD///8AAAAAAP///wAAAAAAAAAAAAD/AAD///8AAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD/AP8A/wAAAAAA////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wACAQIA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAD/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkP////AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAA/wAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEAAAAAAAAAAAD///8AAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEBAQD/AP8A////AAAAAAAAAAAA////AAAAAAABAAEA////AP///wAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAA/wD/AAAAAAAAAAAAOY6qCQAAIABJREFUAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAA/wAAAP8AAAEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8AD/AGEA/wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAA////AP///wAA/wAA////AAAAAAD///8A////AAAAAAAAAAAA////AAAAAAAA/wAA/wD/AP///wAAAAAA////AAEAAQAAAAAA////AAEBAQAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AAAAAAABAQEAAAAAAAABAAD///8A////AAAAAAD///8AAAAAAAAAAAD///8A////AP8A/wD///8A////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD/AP8AAAAAAAEBAQAAAAAA////AAAAAAD///8AAQABAAAAAAAAAAAAAAAAAAD/AAAAAAAA////AP///wAAAAAAAAAAAAD/AAAAAQAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAAAAAAAAAAD+//4AAAAAAAD/AAD/AP8A/wD/AAAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoRAQEBOP///wABAQEA/wD/AAEAAQAAAQAAAAAAAAEBAQAAAAAAAQEBAP///wAAAAAAAAAAAAEBAQD///8AAQABAP8A/wAAAAAAAQEBAAAAAAABAAEAAQABAP8A/wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAQEA////AAAAAAABAQEA////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAEBAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAABAAD///8AAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAEAAAAAAAABAQEA////AAAAAAAAAAAAAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP/+/wAAAQDQ6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKUQEBAeD+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/v7+AAAAAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAD///8A////AAAAAAAAAAAA/v7+AAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AAAAAAD///8A////AP///wAAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAICAuAKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg4AkICUEDAgPg////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAA////AP///wABAAEAAAAAAAAAAAAA/wAAAQEBAAD/AAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAA/wAAAQEBAAD/AAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAD///8AAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAP///wAAAAAAAP8AAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAQEB4AgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0AD/AAD///8AAAAAAAEBAQD///8AAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAP///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////AP8A/wAAAAAAAAAAAAAAAAAAAAAA////AAD/AAD///8A////AAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAABAAD///8A////AP///wAAAAAAAAAAAP8A/wAAAAAA////AP///wD///8A////AAEBAQAAAAAA////AP///wD///8AAAAAAP///wAAAAAAAP8AAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AAEBAQD///8AAP8AAAAAAAABAQEAAAAAAP///wAAAADQCQgJQeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAAAAAAD//v8AAAEAAAAAAAAAAAAAAAAAAP///wABAQEAAQEBAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA//7/AAEBAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AJHr6+twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8AAQEBAAEBAQAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAEAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAA////AAEBAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEBAQAAAADwAQABWevr65AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEAAaEAAAAAAAAAAP///wAAAAAA////AP///wAAAAAAAAAAAP///wAAAAAAAAAAAP///wD///8AAQEBAAAAAAAAAAAAAAAAAP///wD///8AAAAAAP///wD///8AAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAQEBAAEBAQD///8AAQEBAP8A/wAAAAAA////AAAAAAAA/wAA////AP///wD///8AAAAAAAABAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gP8A/1////8AAQEBAAD/AAD/AP8AAQEBAP///wAAAAAAAQEBAAAAAAD///8AAQEBAP///wABAQEAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAQEBAAAAAAAAAAAA////AAAAAAAAAAAAAQEBAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAP///wAAAAAAAQEBAP///wAAAAAAAQEBAP///wABAQEA////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAPABAgGhCwkLkODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABggGCD99f1A////XwABAEABAQEA//7/AAECAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAABAQEA////AAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAQEBAP///wAAAAAAAAAAAAEBAQAAAAAA////AAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAwIDsAkJCaHg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBDz8/NAAQEBLwAAADABAQEg/v/+HwEBAREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAACAgLgAAAAAP79/tABAQHg/v7+wQ0NDcDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArYWP7AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//zUeU7Ak7oSIAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Phone.png b/arma/client/addons/phone/ui/_site/images/dark/Phone.png new file mode 100644 index 0000000..4bf975e Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Phone.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Phone.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Phone.png.b64 new file mode 100644 index 0000000..7d1f3f0 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Phone.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEGJna7xs8AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+DwICAiEBAQEP/v7+IAAAAAAAAAAgAAAAAAAAAAAAAAAA////IAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADhAQEBAAAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0QP///1D+/v4/AAAAMAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAAwAQEBLHMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8G8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAsAgICJHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAcAAAABAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACA0NDQgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0QPz8/J////8fAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AQEBGHMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDB//v7+oP///xABAQEB////AAEBAQEAAAAB/wD/AAAAAAEAAAD/AAEAAAEAAQEAAAAA/////wEBAQEAAAAA/////wEBAQEBAAEB/////wEAAQEBAQEB/wD/AAEAAQAAAAAAAQEBAf////8BAQEBAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AQEBAQH/////AQEBAQAAAAEAAAAAAAAAAQEBAQD/////AQEBAQAAAAEBAQEAAQEBAf///wAAAAD/AAAAAQEBAQEBAQEB/////wEBAQEAAAD/AQEBAf///wAAAAABAQEBAAEBAQEAAAD/AQEBAf////8AAQABAQABAAEBAQEAAAAA////AAEBAQD/////AAAAAQAAAAAAAAABAQEBAAAAAAABAQEBAQEBAQAAAAAAAAABAQEBAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAEBAQD///8AAAEAAAEAAQABAQEBAAAAAP///wAAAAD/AAAAAAEBAQEAAAAAAAAAEP39/V8XFxcA6enpwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8J////9QAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEBsRAQEGHAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ8PDwv////zAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAdEQEBBBwMDA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBD///+/AAAAMAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHQEBAQQcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ//AP8v/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4v8PDwnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uf////2cBAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/KBcXFwDp6enBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDRA+vr6vwAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQD//////wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAA/wAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAEAAAEAAQD///8AAAAA/wAAAAEAAAAAAQEBAP///wAAAAD/AAAAAQAAAP8AAAABAAEAAAD/AAAAAAAAAAEAAAD/AAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQD/AAAAAAD/AAAAAQAAAAD/////AQEBAQEBAQD///8AAQEBAAAAAAD+/v7/AQEBAAAAAAAAAQABAQABAP7+/v8BAQEBAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAD/AAACAgJB0NDQwAAAAAAAqqboGgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/ufAAAAAAAAAAEAAAABAQEBAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAP8A//8AAAAAAAAAAf8A//8AAAD/////AP///wAAAAAAAAAA/wAAAAAAAAAAAAAAAP///wAAAAABAQABAQAAAAH/////AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAP///wAAAAAAAAAAAf8A//8AAAAA/v7+/wAAAAAAAAABAAAA/wAAAAEAAAAAAP8A/wAAAAAAAAAAAP8AAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAP8AAAABAP8AAAAAAAAAAAABAAAA/wAAAAABAQEBAAAAAP///wAAAAAA/////////wABAQEBAAAAAQAAAAEA/wAA////AAEBAQEAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAH//////////wAAAP8AAAAAAP8AAAAAAAD///+eQEBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLn////8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD+//4h8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAQEB/wD/AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQD/AP8AAP8A/wAAAAEBAQEA/wD/AAD/AP8BAQEBAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQEAAQD///8AAAAA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAQEB8BISEiHAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+b/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAA////EO7u7nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBA////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABExMTE/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PxQ////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAACAgI+/v7+AAAAAAH///8AAAEAAAD/AP8AAAABAAEAAAAAAAD///8AAAAAAAABAAEAAAAAAAAA//7//gABAAEBAAEAAAD/AP8AAQAB/////wAAAAAAAAAAAAAAAP///wAAAQABAP8A/////wEAAQABAQABAP8A/wAAAAABAAAA/wD/AP8AAAAB////AAAAAAD///8AAAAAAAAAAAAAAAAB////AAAAAAAAAAD/AP8AAf8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAQABAP////8AAQABAAAAAAAAAAEAAAAA////AAABAAABAAEA/wD/AAAAAAEAAAD/AQEBAf////8AAAAB/////wAAAAEAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAAAAAAAAAAAAAAAP//AP8BAAAAAP///wABAQEAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAP8A/wAAAAAB////AAAAAAAAAAAAAAAAAQAAAP8AAAABAP8AAAABAAAAAAABAP8A/wABAAEA/wAAAQABAP8B/wD///8AAAAAAAAAAAD///9AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQMOBQH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAAAAAAwQEBAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQEAAQD///8AAAAAAAEAAQEAAAAA/////wEBAQD///8AAQEBAf////8AAQABAQABAP////8BAQEBAAAAAAAAAAD///8AAQABAf8A//8BAAEB/wD/AAEAAQEBAQEA/////wABAAEA/wD/AP8AAA00FAERSxwADz8WAAMNBQDutOQB5o/XAP3z+wAAAAAAAAAAAAEBAQH/AP8A/////wAAAAABAQEBAP8AAP8A/wABAQEAAAAAAAAAAAAAAAABAAAAAP////8BAAEBAAAAAAAAAAH/////AQEBAQAAAAD/////AP8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA//7/AAEBAQEAAAAAAQEBAQAAAAABAAEBAAAAAP8A/wAB/wEAAAAAAAAAAAAAAAAAAAAA//8A/wEAAAAAAQABAP8A/wABAAEAAAAA/////wH/////AAAAAAABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wEAAQD/Af8B/////wEBAQAAAAABAAAAAP8A/wABAAEAAAAAAP///wABAQEAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD/AAD/AP8BAQEB6+vrIAAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP39/Q8AAAAAAAAAAAAAAAAA/wAAAQEBAP8A//8A/wABAQEBAf////8AAAAAAAAAAAEBAQH/////AAEAAQEBAQH/AP8AAAAAAAD/AAABAQEAAAAAAAABAAH/AP8AAAAAAP8A/wABAAEAAQEBAf///wANNBMBFmQkAAwyEgAAAAEAAAAAAP8A/wARSxsA/PP6AOeP2AAAAAAA/wD/AAEAAQABAAEAAAEAAf8A/wD/////AAAAAAAAAAD/AP8AAP8AAAEBAQD///8AAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP///wAAAQABAAAAAAEBAQD/////AAAAAQAAAAAAAQAAAP8A/wAAAAH/Af8AAAAAAP8A//8AAAABAQABAAAAAAD/////AAAAAQEBAQD/////AQEBAf8A//8BAAEB/wD/AAD/AAAAAAD/AAEAAQD/AP//Af8BAP8AAQEBAQABAQEBAAAAAAAAAAAAAQABAAAAAP///wAAAAAAAAAAAAAAAP8BAQEB/wH/Af8A/wABAAEAAAAAAAEAAQD/////AAAAAAEBAQH///8AAAAA/wEBAQH/AP8AAAAAAAEAAQEAAAAA////AAAAAAAAAQAAAP8A/wEBAQH/////AwMDLwAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBATH+/v7/AAAAAf8A//8BAQEB////AAABAAEAAAAA////AAAAAAEAAAD//////wAAAAAAAAAB/////wAAAAAAAAABAAAA/wABAAH/AP8AAP8AAAAAAAAAAAAAAAEAAAD/AAD/AP8ABhoKAB19LQALMxIAAAAAAP7//wABAAAAAAAAAAD/AAD/AP8AFFggAPLB6QD0ze4AAAAA//8B/wEA/wAAAAEAAAD/AP8AAAABAAAAAAEBAQD///8AAQEBAP////8AAAABAP8AAQAAAP////8AAQEBAP///wAAAAAA/////wABAAEA/wD/AAAAAf///wAAAAABAQEBAP///wABAAEA/wD/AQAAAAAA/wAAAAAAAP///wABAAH//wD/AQAAAP8AAAABAAAA/////wAAAAAA////AAEBAQH///8AAAAAAAABAAAA/wAA/wD/AAAAAAEAAAAAAAAAAP////8AAAAAAAEAAQEAAQD///8AAAAAAAAAAP8AAAAAAAAAAAABAAEAAAAAAAAAAAD/AP//Af8BAAAAAAD/AP8BAQEB////AP///wAAAAD/AAAAAf///wAAAAD/AQEBAf////8AAAABAAAA/wEBAQH///8AAAAAAP8A/wAAAQAB/f39EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//wAAAAAAAAAAAP8AAP////8JJg4AIpY1AAoyEQD///8A////AAAAAAD/AP8A/wD/AP8A/wAAAAAA////AB2JMQADDQT/AAAAAQD/AAD/AP//AP8AAAAAAAEBAQEAAAAAAP7//v8BAQEA////AP///wD/AP//AAAAAP8A/wD/AP//////AP////8AAAD//wD/AAD/AAAAAAABAAEAAAAAAAAAAAAA////AAAAAP//////AAAAAP8A//8BAQEA/wD/AAEAAQEAAAABAAEAAAABAAEAAAD/AAAAAf///wAAAAABAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP////8A/wAA/wD//wAAAAD/AP8AAP8AAAAAAAAAAAAAAQEBAP8A/wAAAAAAAAAAAf/+//////8A//7//wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAAAgICHwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAAABAAAAAAAAAAAAAAkmDgEhljUABBgIAP7//gD///8A////AP///wD///8A/v/+AP7//wD///8A/wD/AAMMBAAbfC0B/////wAAAAAA/wAAAQEBAAAAAAD+/v7/AAEAAAEAAQH///8AAAAAAAEBAQEAAAAAAAAAAAEAAQEBAAEBAAAAAAABAAAAAAABAQABAQAAAAD/AP8AAP8AAP////8AAAAAAAAAAP8A/wAAAAAB/////wEAAQH+//7/AAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAB/wD/AAEBAQEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wD/AAEBAQAAAAAAAAAAAf8A/wEBAAEBAAEAAP7//gAAAAAA/v/+AAEBAQEAAAAB/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8A/v7+EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAAD///8BAP8AAP/+////AP8ABRkIAB6KMAABCwMA////AAD/AAD///8A////AP///wD///8AAP8AAAAA/wD/AP8A/v7+AP8A/wANPhUAE1ggAf///wAAAAAB/v/+AAAAAAABAQEB////AAAAAAD/AP//AAAAAP8A/wAAAAAA//////8A/wAAAAAAAAAAAAAAAAH/AP8A/wD/AAAAAAAA/wAAAAAAAAEBAQH///8AAAAAAAAAAAH/////AQEBAQAAAAABAAEBAAAAAAAAAAD//////wD/AP//////AP8AAQABAP8A/wAAAAAAAP8AAAAAAAD/AP8A////AP8A/wAAAAAAAQABAP///wD///8AAQABAAAAAAD///////7//wAAAAD/AP8AAAAAAP////8AAAAAAQEBAf8A//8AAAAAAAAAAP8A/wAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAH///8A/wD/AAEBAQEBAAEBAAAAAP8A/wAAAAAA/////wAAAP8A/wAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAAABAAAAAP///wAAAAAAAAEAAQAAAAEA/wD/FWIiAAQXCAD/AP8A////AP///wD/AP8A/wD/AP7//wD/AP8A////AP/+/wD//v8AAP8AAP///wD/AP8AFWMiAAYaCQABAQEAAP8AAP//////////AAAAAP///wAA/wAB////AAEAAQABAAEBAAEAAQD/AAD/AP8A/////wD/AP8BAAEAAP8A/wAAAAAAAQAA//////////8BAQEA////AAD/AAAAAAAA////AAAAAAD///8AAP8AAP///wAAAQABAAAAAAEBAQEA/wAA/////wD/AAD/////////AP8A//8A/wAAAAAA/wD/AAD///8A////AAAAAAAAAQAA/wD/AAD/AP8AAQABAAAAAQD/AAAA/wAAAP8AAAAAAAH///8A/////wD/AAAAAAAAAAAAAAD/AAD/AP8A////AAAAAAABAAEA/////wAAAAAA/wD/AP8AAAD/AP//AP8AAAAAAAD/AP8A/wD/AP8AAACc+543AAAgAElEQVQAAP8AAAAAAAAAAAABAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//iAAAAAAAP8AAP////8AAAAAAP8AAAD/AAAAAAAAAAAAAQAAAAEAAAD//////wEAAQAAAAAB/////wAAAP8AAAD//////wABAAAAAAAAAQABAAAAAAAQShoBD0saAP8A/wD///8A/wD/AP8A/wD///8A////AAAA/wD///8A/v/+AP8A/wD/AP8A/wD/AP///wD///8AAQsCABp7KwAAAAAAAAAAAP8A/wAAAAAB/////wAAAP8AAAAAAAAAAP////////8AAP8AAAAAAAD/////AAEAAQAAAAH///8AAAAAAf///wAA/wAAAAEAAQAAAAH///8AAAAAAAAAAAAAAAABAAAA/////wAAAAAA/wD//wAAAAD/////AP8AAP///wAAAAAAAAAAAAAAAP8AAAABAAAAAAD/AAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAH//v//AP8AAAAAAAEA/wD/AAAAAAAAAAD/AP//AAAA/wD/AAAAAAAAAAAAAf///wD///8A/wD/AAAAAAAA/wAA/////wD/AAD///8AAAAAAAAAAAAAAAABAQEBAP8A/wAA/wAAAAEAAAAAAAEAAAAB/wD/AAAAAAH///8AAP8AAP////8AAAAA/v/+IAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP//AAAA//8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAf///wAAAAAAAAAAAQAAAAEAAAABAAAAAQD/AAAAAAAA////AAAAAAAOSxkA////AP7//gD///8A////AP///wD///8A/wD/AP///wD+/v4AAAAAAP7+/gD///8A/v7+AP///wD///8AAAAAAAkxEAARVh0AAAAAAAEAAQH/////AQABAQAAAAEBAQEAAAAAAAAAAAEAAQAA/////wAAAAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAQAAAQABAQAAAAABAAEB/////wAAAAAAAAAAAAEAAQAAAAEAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA/wD//wAAAAABAQEB/wD/AAAAAAD///8AAAAAAAAAAP8BAAEBAAAAAQAAAAAAAQAAAAAAAAABAAH/////AQABAQAAAAAAAAAAAAEAAQABAAAAAAD/AAAAAQAAAAAAAAAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAP////8AAAAA/wD/AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP//AP8AAAAAAAAAAAD/AP8A/wD/AAUZCQAKMBAA////AAAAAAD///8A////AP///wD+//4A////AP///wAAAQAA/v/+AAAAAAD///8A/wD/AP///wD+//4A////AP7//gAWbiUAByUM/wAAAAABAQEB/wD/AAAAAAD/////AAAAAAAAAAD//v//AAEAAP////8BAQEBAQABAAAAAAD/AP8AAAAAAP//////AP8A/wD/AAAAAAD/AP//AAAAAQAAAAD/////AAAAAAAAAAD///8A/////wAAAAD/////AAAAAAAAAAAAAAAA////AAAAAAD///8A/////////wH/AP8A/wD/AP///wAAAAAAAQABAf//////////AQABAP8A/wAAAQAB/wD/AP8A/wH/AP//AAAAAP8A/wAA/wD//////wD/AP8AAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAAAAAAB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD/AP8A/wD/AAABAAH///8AAP8A/wABAAEAAAAAAQABAAEBAQAA/wAAAP8AAQEBAQEBAAEBAAAAAP8A/wEBAAEAAAAAAP8A/wABAAEAAP8AAAckCwD/AP8A/v/+AP///wD/AP8A/wD/AP8A/wAAAAAA////AP7//gD//v8AAP8AAP8A/wD+//4AAAAAAP7//gAA/wAA/wD/AP///wD///8AGoctAQEMBP//AP8AAAAAAP///wD/AP8B/////wAAAAAAAAABAP8AAQAAAAD///8A////AP8A/wAA/wD//wD/AAABAAEBAAEAAP8AAAAAAAAAAAAB/wD/AP////8AAAAA////AAAAAAAA/wAAAAAAAP8A/wAAAQAAAAAAAf8A/wD/AP8AAP8AAP////8AAQABAAAAAQAAAAABAAEAAQABAAEBAQD/////////AAAAAAEBAQEB/v/+/wD/AP8A/wD/AP8AAAEAAQAA/wAB/////wEAAQD///8AAQEBAQABAAEBAQEB/wD/AAD/AP8AAAAAAP8A//8A////////AAAAAP8A/wEA/wAAAAEAAP8A/wAA/wD//wD/AP////8A/wD/AP8AAQAAAAH/AP8AAP8A/wD/AAH///8A/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/ACAA/wAAAP8AAAD/AAAAAAAAAAAAAQAAAAAA/wAA////AP///wAAAAD/AAAA//////////8AAAAA/wAAAAD+//7//////wAAAAD///8AAAAAAAYlC/////8AAAAAAP///wD///8A////AP///wD//v8A////AAAAAAD/AP8A///+AP///wAAAAAA////AP///wD/AP8A////AAD//wD/AP8ABRgIABRiIAEAAAAAAP8AAAAAAAAA/wAAAAAAAf///wAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAABAP8A/wD/AP//AP8AAAAAAP8A/wAA/wAAAP8AAP8A/wAAAQABAAAA/////wAAAAAAAAAAAQD/AP8A/wABAAEAAAD/AAAA/wD/AAAAAAAAAAEA/wD//wD//wAAAAD///8A/v7+/////wAAAAABAAAA/wAAAAD///8AAQABAQAAAAEAAAABAAAAAP///wAAAQAAAAAAAf///wAAAAAB////AAD/AAD/////AAAAAAAAAAAAAAAAAQEBAQAAAAH/AP8AAP8AAAD/AAD/AP//AP8AAAD/AAAAAAABAAAAAAAAAAEAAAABAAAAAAD/AAAA/wAAAAEAAQAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQD/AAD/AP8A/wD/AAUYCQH+//4A/v7+AP///wD///8A////AP///wD/AP8A////AP///wD///8A/wAAAP///wD///8A////AAAAAAD///8A////AP8AAAD///8A////ABBVHAAJMBAA/wD//wABAAAAAAAA/wD/AAAAAP//AP8AAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAAAAAAAAf8A/wAA/wAAAAAAAAD/AAAAAAAAAAAAAAEBAQH/////AAAAAP8A//8AAQAAAAEAAAAAAAD/////AP8AAAAAAAAAAAAB//////8A//8AAAABAQABAf8A//8BAQEAAQEBAf////8AAQAA////AAAAAP//AP//AAAA//8A/wAAAAAAAAAAAP8A//8A/wAAAAAA/wAAAAAAAAAAAAAA//////8AAAABAAAAAAAAAAH///8A/v/+/wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wABAAAAAAEBAQEAAAAAAAAAAP8A/wD///8A/////wD/AP//AP8A/wD/Af////8AAAAA//////8A/wD/AP////7//wAAAAAA/wAAAQABAP///gAA/wAAAAEAAP///gD///8A////AP///wD///8A/v/+AP///wD///8A////AP///wD///8A////AP///wD///8A////AP8A/wD///8A/wD/AP///wAWeScAAgsEAAD/AAD/////AQABAAAAAAEAAAAA//////////8AAAAAAP8AAAAAAAD/////AAAAAAD/AAD/AP8AAAEAAP8A/wAAAAAA/////////wABAQEB/wD/AQD/AAD///8A////AP///wEAAQABAAAAAP8A/wD/AP8AAAAAAQEAAQH/AP8A/wD//wAAAAH+//7//wD/AAAAAAD//v//AAEAAQAAAAEA/wAB/wD/AQAAAP//////AAAAAAEAAQH/AP8A////AAAAAAD/AP//////AQEBAQH/////AP8AAP8A/wAAAAAAAAAAAf8A//8BAAEBAAAAAP8A//8BAAEB/wD//////wABAAEBAAAAAQAAAAH/AP//AQABAf/+////AP8AAAAAAAABAAH/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAf8A/wAAAAAA////AAAAAQD///8A////AP8AAAD+//4A////AP///wD/AP8AAAAAAP///wD/AP8A////AP///wD///8A/v/+AP///wD/AP8A/v/+AP7+/gD///4A//7+AP///wAEGAcAF3snAQAAAAAAAAAA//////////8BAAEAAAEAAQAAAAD///8AAQEBAP////8AAQABAAAAAAABAAEA/wD///7/AAD/AAAAAAAAAAAAAAD/AP///v//AP8AAAAAAAAA/wAAAP8AAAABAAAAAAAA////AAD/AAABAAEAAAEAAP8A/wABAAEAAP8AAQD/AAAA/wAAAAAA/wABAAEAAQABAAAAAP////8AAAAAAP8A/wD/AAEAAAAB/wD//////wAA/wD/AAEAAf////8BAAEBAAAAAP///wAAAAAB/////wD/AAD/AP8AAAAAAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAA/wD/AQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wEAAQAAAQAAAAAAAPzz+gD+//4A////AP7+/gAAAAAA////AP8A/wD//v8A/v7+AP///wD+/v8A/wD/AP7//wD+//4AAAAAAP7//gD///8AAAAAAP///wD//wAA/wAAAP8A/wAAAAAACjsTAA9UGgAAAQABAAAAAQAAAAEAAAAAAP8A/wAAAAEAAAD//wD/AAEBAQEBAAEA////AAD/AAD/AP8AAQEBAAAAAAD///8AAAAAAAAAAAEAAAAAAAEAAAABAAEBAQEAAQEBAAD/AAAAAAAAAAAAAAAAAP////8AAP8AAAD/AAD///8AAAAA/wAAAAAAAAABAQABAQD/AP8A/wD/AAAAAAABAAEAAAAAAAAAAQAAAP8AAAAAAP8AAAAAAAAAAAAAAP8AAAABAAH/AP8AAAEAAAAAAAAAAAAAAAAAAQABAAAA/wAAAP8AAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AP///wAAAAABAAAAAP///wABAAEA/////wD/AAD/////////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAPvn+AAAAAAA////AAAAAAD///8A/wD+AP///wD/AP8AAAAAAP8A/wAAAP8A//7+AAAA/wAAAP8A////AAAAAAD///8A/v7+AAAAAAD/AP8A////AP///wD+//4AAAAAABFhHwAEFwcAAAAAAAAAAAD///8A/wD/AAAAAAD///8A//////7//v//////AAAAAAABAAABAAEB////AAAAAAAAAAD/AAAAAAAAAAAAAAAB//7//wD/AAD///8A////AP////8A/wAA/wD//wAAAAEAAAAAAAAA//8A//8AAAAAAAAAAf8A//8AAAAA/v7+/wAAAAEAAAABAP8AAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAQAAAAAAAAABAAAA/wD/AAAA/wAAAP8AAAAAAAD/////AAAA/wD/AAD/AP//AAEAAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAP///////v////////jP8AD///8A////AP7//gD///8A/wAAAP///wD+//4A/v/+AP7//gD///8A/gAAAP7+/gD+//8A/v/+AP///wD+//4AAAEAAP7+/gD+//4A////AP7//gAA/wAA////AAALAgAVeScAAAAAAAAAAAD/AP8AAQABAf8A//8BAQEBAQABAQEAAQEAAAAB/wD/AP/+////AP8AAAAAAAAAAAAAAAABAAAAAQAAAAD/////AQEBAf8A/wD/////AAAAAAABAAEAAQAAAQABAQAAAAAAAAAAAAAAAQEAAQEAAAD//////wAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAP//////AP8AAAAAAAEBAQH/AP8A/wD/AAAAAAAAAAAAAAAAAf////8AAAAAAAAAAP8A//8BAQEB/wD/Af8A//8A/wAAAP8AAAEAAQH/AP8A/wD///8A/wAAAAAB/wD//wAAAAAAAQAB/wD/AAD/AAABAAEBAAAAAQEAAQH///8A////AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wABAAEAAAAAAAAAAAD/AP//Af8BAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAB/wD/AAABAAEA/wD/AAAAAAEBAQH/AP8AAP8A//jc9AD98/sAAgwEAAAAAAD/Af8AAP8AAAAAAAD///8AAQABAAAAAAD/Af8AAP8AAAAAAAAA/wAAAAAAAP8B/wD///8AAAAAAP8A/wAA/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAILw4A////AAAAAAAAAAAA/wD//wAAAAAAAQAAAAAAAP////8AAAABAAAAAAABAAEA/wD//wH/AQAAAAABAAEA/wD/AAD/AAABAQEB/wD/AAAAAAAAAAAAAAAAAAEAAQD//v//AAAAAQAAAAABAQEA/wD/AAD/AP8AAQABAAEA/wAAAAH/////AAAAAQAAAP8AAAAAAAAAAQAAAAAA/wD//wD/AAABAAEAAAAAAP8AAP8B/wAA/wD/AAEAAQAAAAAAAAAA/wD/AAD/AAH/AP8AAAAA/wEBAQEAAQAA/wD/AAD/AP8BAQEB////AAEBAQD/AP8AAP8AAAABAAD///8AAAAAAAABAAD///8AAAEAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AP8A/wAAAAD/AP8AAAD/AP8AAAAB////AP///wAAAAAAAAEAAQD/AAD42/QA/wD/AP8A/wD+/v4A//7/AP///wAAAAAA////AP8A/wD+/v4A/wD/AP7//gD/AP8A/v/+AP///wAAAAAA////AAAAAAD///8A/wAAAAAAAAD+//4A/v/+AP8A/wD99PsA/wD//wAAAAD/AP//AAAAAAABAAH/////////AAAAAAH/AP//AAAA/wAAAAAAAAABAAAAAAAAAAD///8AAP8AAAAAAAD///8AAAAAAAD/AP8AAAAAAAAAAP///wAAAAAAAAAA/wAAAAD/////AP8AAAAAAAAAAAAAAP8AAQEAAQAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAAB/wD/AAAAAAAAAAAAAAAA/wEAAQAAAAABAQABAAAAAAH///8A/////wAAAP8AAAAAAAAAAAAAAAD+//7/AP8AAAAAAAH///8AAAAAAf///wAA/wAAAAAAAf////8A/wAAAP8AAAD/AAEAAAAAAP8AAAD/AP////8AAP8A//8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD+//4A/wD//wD/AAAAAAAAAP8AAP8A//8A/wAAAAAAAAAAAAD/AP//AP8AAP//////AP8AAAEAAP8A/wD/////AAEAAAAAAAAA/wAA/////wAAAAD0uOkA/v/+AP///wAAAP8A/wD/AP///wD+//4A/wD/AP///wAAAAAA////AAAAAAD///8AAAAAAP///wD+/v4A/wD/AP///wAAAAAA////AP///wD///8AAAAAAP///wDxq+YAAQABAf8A//8AAAAAAAAAAQD/AAAAAAABAAAAAP8A//8BAAEBAAAAAQD/AAAAAAAAAP8AAAD/AAAAAAAAAAAAAP////8AAAAAAP8AAAABAAEAAAAB////AP8A//8AAAABAAAAAQAAAAAAAQABAAAA/wAAAAH///8AAAAAAP///wAAAAABAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAQABAf////8A/wAAAAAAAf7//v8AAAAA//////8A//8AAAD/AQABAQAAAAH/AP8AAAAAAf///wABAAEBAAAAAP8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEBAP8AAAAAAAAAAAAAAP8AAAAAAAD2xO4A/vP7AP7+/gD+//8A////AP///wAA/wAA////AP///wD///8A////AP///wD+//4A////AP///wAAAAAA//7/AP7//gD+//4A////AP7+/gAAAAAA///+APvn9wDwoOIA/////wEAAQEAAAABAAAAAAAAAAD//////wD/AAEAAQH/AP8AAAAAAAAAAAD/AP8A/////wAAAP8AAAAA/wD//wABAAD/AP//AAAAAAD/AAD/AP8AAAAAAAEAAQEAAAAAAAAAAP8A/wAA/wD//wD/AQAAAAABAQEA/wD/AP8A////AP8A////AAAAAAAA/wAA//7//wAAAAD//////wD/AAAAAAH/AP//AAEAAAEAAQEAAAAA////AAEAAQH/AP8BAAAAAAABAAABAAEA//////8A//8AAAAAAAAAAAEAAQEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wD/AP8A/wD/AP//AAAAAf//////AP//AAAAAP///wABAAEAAP8AAP//////AP8AAP8AAAAAAAEAAAAA////////////AP//AAEAAf8A/wD99PsA9LjrAAAAAAD///8A////AP///wD///8A////AP///wD///8A/v//AP///wAA/wAA/v//AP7//wD+//8A/wD/AAD/AAAA/wAA////AAABAAD///8A/v//AOhx1QD/AP8AAQEBAf8A/wAAAAAA/wD/AP////8AAQABAP8A//8A/wABAAEAAAAAAP///wAA/wD/AAAAAP///wAAAAAAAP8AAAAAAAAA/wAA//////8A//8AAAAAAAAAAAABAAD/////AAAAAAD/AP////8BAQABAP8A/wD///8AAQABAAAAAAEA/wD/AAEAAf//////AP8AAAAAAQAAAAAAAQABAAAAAAAAAAAAAAABAP8AAP////////8AAAAAAP////8AAAAA////AP///wD/////AAAAAAD/AAD/AP8AAAAAAAAAAAD/AP8AAAAAAP8A/wD/AP8A/wD//wEAAQD//v8A/4LmWVkAACAASURBVP//Af8A/wD/AP8BAAAAAP8A//8A/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAQEBAQEA/wAAAP8A/wAAAAAA/wD/9sTtAP8A/wD//wAA/wD/AP8A/wD/AP8A/wD/AP///wD+//4AAAD/AP8A/wD+//8A///+AAD//wD///4A//7+AP8A/wD/AP8A/v/+AP7+/gD/AP8A9bjrAPzn+P8A/wD/////AAAAAAAA/wD/AAAAAP8A/wAA/wD/AAAAAQD/AP//AP8A/////wABAAAAAQABAAAAAQABAAH///8AAAAAAAAAAAEAAAABAAEAAQAAAAAA/wAA/wD/AP/+/wAAAAAA/wD/AAABAAAAAAAA/wD/AAD/AAAA/wD//////wAAAAAAAAABAP8AAAAAAAAAAAAAAQEBAP////8A/wAAAP8AAAD/AAAA/wD/////AAAAAAEAAQAAAQEBAQAAAAEA/wD/AAAAAAD/AAAAAAABAAEAAQAAAAEA/wAA/v/+/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAf///wAAAQAAAAAAAAD/AP8AAAAA/////wD/AAAAAAABAP8AAf8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP////////7//v8A/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA////AAAAAAD///8A/////////wD/AP8AAAAAAP////8AAQAB+NDyAPfP8QAAAP8A/v7+AP///gD///8A////AP7//gD///8A/v/+AP7+/gD///4AAAAAAP7//gAAAAAA/v//AP///wD+/v4A////AP8AAAD+//4A8KHi/wABAAEAAAABAAAA/wD/AAAAAAABAAAAAAD/AAD/AP8AAAAAAAAAAAH/////AAEAAf////8A/wD//wD//wAAAAAAAAAAAAEAAQD/AP//AP8A/////wAAAAEAAAAAAP8AAP8A/wAAAAABAP8A/wD/AAEAAAAAAP8AAP8A//8AAAABAAEAAQD/AAD/AP///wD///8A/wD//////wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAA/wAA////AAAAAAD/AP8AAAAAAAAAAAAAAAAAAP8AAP8A//8AAQAAAQABAf///wAAAAABAAAAAP8A//8A/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAEA/wD/AAAAAQABAAEAAAAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEAAQABAQEAAQH/AP8A/wD//wAAAAD/AP//AP8AAAAAAAAAAAAA////AP///wD///8AAQEBAQAAAAABAAEAAP8AAAAAAAAAAAABAAAAAQAAAAH//v//AAAAAPKi5AD///8AAAAAAP//AAD///8A////AP8A/wAAAAAA////AAAAAAAAAAAA////AP///wD///8A/wD/AP///wAAAAAA/wD/AAD//wD2uOsA/Oj5Af///wAAAAAAAAEAAf8A//8AAAAAAP8A/wABAAEBAAEBAAAAAAAAAAAA/wAA////AAEAAQEAAAABAQABAQD/AAAAAAD/AP8AAAAAAAEBAAEAAQEBAQD/AAAAAAAA/wD//wEAAQAAAQAAAAAAAP//////////AAAAAAEBAQH/AP//AP8AAP8A/wABAAEBAAAAAAAAAAEAAAAB//7//wAAAAD//////wD///////8AAAAA/wD/AP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD//////wD/AAAAAAAAAAAA/wD/AAAAAAD/AP//////AAAAAAAAAAAAAAAAAP////8AAAAAAAAAAP8A/wD///8AAAAAAP///wD/AP8AAAAAAP8A//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEB////AAAAAP8AAAABAAEAAQAAAAAA/wAA/wH//wAAAAEA/wD/AAAAAQEBAQD/AP8A/////wAAAAAAAAAAAAAAAf8A/wAA/wD//wD/AAEBAQH/Af8B//////jQ8QH86PgAAhcGAAEAAQD/AAAAAAD/AAEAAQD+AP8AAAD/AAABAAD///8AAQABAAAAAAD+//4AAAAAAAAAAAAAAQAAAP8AAP8A/wD2xe4AAP8A/wABAAH///8AAAAAAAD/AAD/AP//AAEAAAAAAAD/AP8AAP8A/wEBAQEAAAABAQABAP////8AAQABAAAAAAAAAAAAAAABAAAAAAD/AP8AAAAAAAAAAQEBAQD///8AAP8AAAABAAD//v8AAAAAAQAAAP8BAQEBAAAAAP///wAAAAAB////AAABAAD/AP8AAAAAAQEAAQD/AP8AAQEBAQAAAAABAQEB/wD/AAAAAAD/AP8AAAAAAAEAAQEAAAAA/wD/AAAAAAAA/wAA/wH/AAD/AP8AAAABAP8AAAEBAQEA/wAAAP8A/wABAAEBAAEB/wD/AAD/AAD/Af8AAAAA/wABAAH/AP8AAP8AAAABAAAAAAAB/////wABAAAAAAAB/////wABAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP////8AAAAA/wABAAEAAQAAAAAAAP///wAAAAAAAQABAQD/AAAAAQABAAAA//8A/wAA/wAAAQEBAQAAAAEAAQABAAAAAAEAAQAAAQABAAEAAf////8A/wD/AAAAAQD/AADzrOcA////AP///wAA//8A////AP8A/wAAAP8AAP8AAP/+/wAAAAAA////AP///wD///8AAAAAAP8A/wD///8A/v/+AP///gD40PL/AAEAAQD/AAAAAAAAAQABAP8A/wAAAAAAAP8AAAAAAAAAAAAAAAAAAP///wAAAQAA/v/+/wAAAAAA/wAAAQABAAD/AP8AAAAAAP8A/wABAAEAAAAAAP8A///+//8AAAAAAAEAAf8A/wAAAAAAAAEAAAABAAH///8A////AAD/AAAAAAAAAAEAAAAAAAAA/wD/AP8A//////8AAAD//wD/AP///wD///8AAAAAAAAAAAAA/wD/AAAAAP///wD///8AAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAAAAAP7//v//////AQEBAf///wD/AP8AAP8A/wAAAAAA/wAAAP8AAQEAAQAA/wAAAQEBAAD/AP8AAAAAAAAAAAD/AAEAAAAAAAAAAAD/AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAQAAAQEBAf///wAA/wAAAP8AAP8A//8AAAAB/////wAAAAAAAAAAAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAEAAP///wAA/wD//////wAAAAEAAAAAAAAA/wAAAAD2uuz///T9AP///wD/AP8AAAAAAP/+/wD///8A/v/+AP7//gD///8A/v/+AP7//gAAAAAA////AP///wD///8A////APnR8wD/9f0BAP8AAP8A////AP//////AAEBAQEAAAABAAAAAQD/AAAA/wD/AAAAAQAAAAAA/wAAAQEBAQAAAAEAAAAA/v/+/wAAAAH/////AAEAAQD/AP8AAAAA/wD/AP8A/wAA/wAAAP8AAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAQEBAQAAAAEA/wAAAAAAAP8A//8AAQAAAAAAAAAAAAAAAAAB/////wABAAAAAAD/AP8AAP8A/wAA/wAAAAAAAQD/AAAAAAAAAAEAAAEAAQEAAAABAAAAAAABAAAA/wAAAQEBAf8A/wAAAAAAAAAA//8A/wAAAAD/////AAAAAAEAAQAAAAAAAQAAAAAA/wD//wD/AP8A/wD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA////AAEAAQD/AP8AAAAAAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAAAAAAAAAD//wD/AAAAAAD///8AAP8AAP8A/wD/AP8BAQABAf////8AAAABAAAAAQAAAAD+9P0B8qLlAP4A/gD+//4A////AP8A/wD+//4AAAAAAAAAAAD+/v4AAAAAAP8A/wD///8A/v/+AP7+/gD///8A/wD/APvo+QAA/wAA/wD/AAAAAAEBAQEBAAAAAP/+////AP8AAAAAAAAAAAD///8AAAAAAP8A////AP//AP8AAAAAAAAAAAAAAQEBAf8A/wABAAEB////AAAAAAEAAAABAAAAAAEAAQH/AP//AAAAAAD/AAAA/wAA/wD//wAAAAD/AP//AAAAAAAAAP8AAAAA/wD//wAAAAAAAAAB/v/+/wAAAAD///8AAP8AAAAAAAH///8A////AAAAAAAAAAAAAAAAAP//////AP8B/wD/AAEAAQEAAAAAAAAAAP8A//8AAAAAAP8AAP8A////AP///v/+AP////8AAQAA/v7+/wEAAQH/AP8AAAAAAQD/AAAAAAABAAAAAP8A////////AAAA//8A////AP8AAAAAAAEAAQEBAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AP8A/wABAAEAAAAAAAEBAQD/AP8BAAAAAAD/AAD/AP//AP8AAP8A/wAAAAABAAAAAP////8A/wD//wD/AAD/AP8BAQEA/////wAAAAD/AP8AAAAAAP8A/wD/AP8A9K3o//3o+QAA/wAA/wD/AP///wD///8A///+AP///wAAAAAA/v/+AP///wD+//4AAAAAAAAAAAD///8AAP8AAP7z+wD/AP8AAAAAAAEAAQD///8A/wD/AAABAAABAAEAAAAAAAAAAAAAAAAA/////wD/AAEAAAAB//////8A/wD/AP8A//7//wAAAP8AAAAAAAAAAP8A/wD/AP//AQABAf8A/wABAAEB/wD/AAAAAAD/////AAAAAQABAAABAAEB/wD/AAAAAAH/////AAAAAf//////////AAAAAf8A/wAAAAAAAAAAAAEAAQAAAAAAAAAAAP////8AAAAAAQABAQAAAAEBAAEAAQABAP8A/wD/AP8A/////wAAAAEAAAAA/////wEAAQEAAAABAAAAAAD/AAAA/wAAAAEAAf8A/wABAAEAAAAAAP///////////wD//wEAAQEA/wAA////AQEAAQEAAAABAAAAAf8A/wAA/wAA//7/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/////wAAAAD///8A////AP/+//8A/wD//////////wAAAAAB/wD/AAD/AP////8AAP8A/wAAAAEAAAABAQABAAABAAEA/wAAAQEBAQABAAEA/wAA/wD/AAAAAAAAAAAAAQEBAfKX4wD///8A////AP7//gD///8A/v//AP7//gD///4A////AP///wD///8A/v7+AP///wD+//4A/v/+AAELAgAA/wD/AP8AAP8A/wAAAAAAAP8AAAAAAAH///8A/wD/AP///wAAAAAAAAAAAAABAAAA/wD//wD/AAEAAQAA/wAAAQEBAQAAAAH/AP8AAQABAAEAAQAAAAAB/////wAAAAAAAAAAAQABAP8A/wAAAAABAAAAAP///wD///8AAP8AAP8A/wAAAAABAP8A/wEBAQEAAQABAAAAAAD/AP8AAAAB//////8A//8A/wD/AP8A/wAAAAD//////v/+//////////8A/wD/AAD/AP8A/wD/AAEAAAEAAQD///8AAAEAAf///wD/////AQABAAABAAH/AP8AAP8A/wEAAQD//////wD/AAABAAAAAAAAAQABAf8A/wAAAQABAAEA/////wAAAAAAAAAAAAAAAAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAQD/AP//AP//AAAA/wAAAAEAAQAB/wD/AAAAAAAA/wAAAP8AAAAAAAEBAQEAAAEAAf8A//8AAAAA////AP//////AP8A////AAAAAAAAAAAAAP8AAAD/AAAA/wAA////APjF8P/50vIA////AAAAAAD///8AAAAAAAAAAAD/AAAA/wD/AAAAAAD/AP8AAAAAAP7//gAAAAAAAAAAAAY6DwABAQEBAAAAAP////8A/wAAAAEAAAD/AAAAAAD/AP8AAP8A//8AAAAB/wD/AAD/AAAAAQABAQABAf7//v8AAAD//wD/AAD/AAAA/wAA////AP///wAA/wAAAAAAAQD/AAD/AP8A////AAD/AP8AAQAAAP8AAP////8AAAD//wD///////8AAAAA/wD/Af8A/wAA/wAAAQABAAAAAAEAAAAAAAAAAQD/AAEAAAABAAEAAQAAAAH/AP8AAQABAQEAAQEAAAAAAP8AAAAAAAEAAAABAAAAAf8A/wAAAAD/////AAAAAP8BAAEB/wD/AAD/AP8A/wD/AAAAAf//////AP8BAP8AAP///wAAAAAB////AAD/AP8A/wAA////AAAAAP8A/wAAAP8AAAD/AAD//////////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEBAAAAAAEBAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wD////////+//7//////wAAAAAAAQAA/wD//wEAAQD/////AAAAAP///wD/AP//AAAA//8A/wAAAAAA/wD/AP8A/wD0oucA////AP7//gD/AP8A////AP7//gD+//4AAP8AAP///wAA/wAA/v7+AAAAAAD///8A////AAAKAgAELgsAAAAAAAEAAQEAAAAAAP8AAP8A//////8A/////wAAAAD/AP8AAQABAQAAAAAA/wAAAAAA/wAAAAD/AP8B/////wAAAAAAAAAAAAAAAAAAAAD/AP8A/wD///8A//8A/wD/AAAAAAAAAAEA/wAA/wD//wAAAAH/AP8AAQABAQEAAQEAAAAAAQABAP///wAAAAAA////AAAAAAAAAAAAAAAA/wABAAD/AP8AAAAAAAAAAAABAAEB/wD//wEBAQD/AP8AAAAAAAAAAAAAAAAA//////////8AAAABAQABAP8A/wAAAAAA/////wAAAAH/AP8BAAAAAP8A/wEBAAH//wD/AAEAAQEAAAAAAAAAAAAAAAH/AP8AAAAAAAAAAAEAAAAAAAAAAP8A//8BAAEB/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//////v/+AAAAAAAAAAAAAAAAAQAAAAD/////AAAAAf8A/wAAAAABAQABAQAAAAABAAEBAQABAQEAAQH///8AAQABAf8A/wEBAAEBAAAAAAAAAAAAAAAB////AAD/AP8AAAAAAQABAAEAAQH60vMA9a/qAAAAAAD///8A/v/+AP///wD///8A/wD/AP7//gD///8A/wD/AP///wD///8A/wD/AP8A/wANch4AAQoC//8A/wD//////wD/AAEAAQEAAAABAQEBAQAAAAEBAAEAAAAAAP////8AAAAAAAAAAQEAAQEBAAEAAAAAAf8A/wD//////////wAAAAAA/wD/AQABAQD/AAAAAAAB/wD/AP8A/wD/AP//AAAAAQEAAQAAAAAB/wD/AAAAAAD//////wD//wEAAQD/AP8A//////8A/wD//////wD/AAD/AAAA/wD/////AAAAAAD/AP8AAP8AAP///wABAAEA/wD/AAAAAAD/////AQABAQEAAQH/AP8A/wD/AAEAAQH/////AP8AAAAAAAABAAEAAAAAAAEAAQD///8AAQABAAABAAAAAAAA/wD/AAABAAAAAAAAAAAAAf8A/wD/////AAAAAAD/AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wD///8A//////////8AAAABAAAA/wAAAAAAAAAA/wD/AAABAAD/AP8A/////////wAAAAAA////AAD/AAD/AP8A/////wAAAAAAAAAAAAEAAQABAAH/AP8A/////wAAAAAAAAAA9aPnAP3z+wAA/wAA////AAD//wAA/wAA//7/AP///wD///4AAP//AP///wD///4A//7/AP///wACFgUAC2gbAQAAAAAAAAAAAP8AAP////8AAAD//wD/AAD/AAD/AP8A////AAABAAH//////wD/AP///wD/AP//AP8AAAD/AP8AAAAAAAAAAP///wAAAQAB/wD/AAABAAH/AP8AAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAP////8BAQEBAP8AAf8A/wAAAAAAAAEAAQAAAAABAQEBAP8AAP8A/wAAAAABAQABAP8A/wAAAAD/AAEAAf8A/wAAAAAAAP8A/////wAAAAAA/wD/AP8A/wAA/wAAAAAAAP8A/wAAAAABAAEAAf///wAAAAAA////AP8A/wD/AP8A/wD/AP/+/wD/AP8AAP8A///+/wAA/wAAAAAAAAD/AP8AAQAA/wD//wAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wD/AAD/AAAAAQAAAAAAAQABAAEAAQAAAP8AAQD/AAD/AP8A/////wD/AAEA/wAAAAEAAQAAAAAA/wAAAAEAAAABAAD/////AAEAAQAAAAD/////AAAAAAD/AAAA/wAAAAEAAf8A/wABAAEA//T9APak6QD/AP8AAAAAAP8AAAD/AP8A/wD/AAAAAAD+AP8A/v//AP7//gD+//8A/wD/AP///wD+AP4ABkQQAAlQFQAAAAABAAEAAAABAAH/AP8AAP8AAAABAAAAAAAA/wD//wD/AP8AAAAB/////wABAAAA/wAB/wD//wABAAEAAAABAAAAAQAAAAAA/wAAAAAAAP////8AAAAAAAAA/wD/AAAA/wAAAP8A/wAAAAAAAAAAAP8AAAABAAH//////wD//wAAAAD/////AAAAAAD/AP////8AAAAAAQD/AAAAAQAA/////wD/AAD///8AAP8AAAD/AP8AAAAAAAAAAQAAAP8AAAAB//////////8AAAD/AP8AAAD/AAAAAAAAAP8AAAAAAAD+//7/AAEAAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAQABAAAAAAAAAP8AAAABAAEA/wABAP8AAQAAAAEAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////v///wD/AAD/AAAA/wD/AAAAAAAAAAD/////AQABAQAAAAAAAQAAAAAAAP8A////////AP8AAAD/AAABAAEAAQABAP/+//8BAAEA/////wABAAAAAAAA////AAD/AAD//////wD///ev6wD60fMA/v/+AP7+/gD+//4A/v/+AP7+/gD///8AAAAAAAAAAAAAAAAA///+AP8A/wAA/wAAAAAAAAhbFQADIwj/AAAAAP///wAAAAAAAAAAAAD/AAD/////AAAAAP8A/wAAAAAAAQABAf///wD/AP8AAAAAAAD/AAD/AP//AAAAAAAAAAAAAQAA/////wEAAQH/////AAAAAQAAAAAAAQAAAAAAAQAAAAEA/wAAAAAAAP///wAAAAABAAAAAAD/AAABAAEBAAAAAAAAAAH/AP8A/wD//wAAAAAAAAAA/wD/AAABAAAAAAAAAAEAAAAAAAH///8AAAAAAAAAAAH/AP8AAQABAAEAAQAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAABAAEB/////wEAAQH//////////wABAAD/AP//AAAAAP//////AP8AAAAAAP////8AAAD/AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAEBAQEBAAAAAP8A/wD/AP8AAAAAAP8A//8AAAAB/wD/AAAAAAD/////AAAAAAD/AAAAAQAB/wD/AP8A/wD/AP8A////AAABAAEAAAABAAAAAf/+////AP8AAQEBAP8A/wD/AP8BAQABAf8A/wD0juP//vT8AP8A/wD//wAAAP8AAAAAAAAA/wAA/v//AP7//gD///8A//8AAAD/AAD+//4A////AAEKAwANfB8BAQoC/wEAAQABAAEB/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAD/AAAAAQABAAAAAAABAAAAAP8A/wAA/wAAAQABAQAAAAABAAEBAP8AAAAAAAD//////wD/////////AP8A/wD/AAAAAP8AAAAAAQABAf8A/wD/AP//////AAABAAAAAAD/AAAAAf8A/wD/////AP8AAAD/AAAAAAAA//7/////////AP///wD/AP8A/wAAAAAA/wD/Af8A/wEAAAAA/wD/AAAAAAD/AP8BAAAAAAABAAAAAAAAAAAAAP8A//8ASDQYQQAAIABJREFUAAABAAAAAAD/AAABAAEB/////wEAAQEAAAD//wD/AAAAAAAAAAAB/wD/AP8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQABAP///wAA/wD/AAAA/wAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AAD/AAH///8AAAEAAQD/AP8A/wAAAAAAAAAAAAD/AP8AAAAAAAAAAAAA/wD/AAEAAQD/AP////8AAAAAAAAAAP8AAAAAAQABAP3p+gH3pesAAAAAAP///gD/AP8A/v/+AP7//gAAAP8A////AP7//gD+//4A/wD/AAD/AAD/AP8A/v/+AAAWBAAMfR8B/wD/AP///wAAAQAB/////wD/AAAAAAABAP8AAP///wAAAAAAAAAAAAAAAAEAAAAA////AAAAAAD/AP8AAAAAAP8A/wD/////////AP8A/wAAAAAA/wD/AAD/AAABAAEBAAAAAQAAAAAA/wD/AAAAAf//////AP8AAAAAAAEAAQEAAAAA//7/AAAAAAEBAAEAAAAAAAEAAQEAAQABAAAAAAAAAAEAAQABAAEAAQD/AAEAAAAAAAAAAAAAAAAAAAAAAP8A//8A/wAA/wD//////wD/AAAAAAAA////AP8A/wABAAEBAAAAAQD/AAAA/wAA/wD/AP8A//8AAQABAAAAAAD/AAEA/wD/AP8AAf////8BAAEAAP8A//////8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//////wABAAAAAQABAAAAAQAAAAD///8A/wD/AAEBAQAA/wAAAAAAAP8A//8AAAAAAP8A/wAAAAAAAAAAAP8A/wD/AAEAAAAAAAAAAP8A/wD/AP8AAP8A/wAAAAEA/wD/AP8A/wD/AAH///8AAAAAAAD/AP/4r+sA+cbxAP///wD+/v4AAAAAAP///wD+//4A////AAAAAAAAAAAA////AP7//gD+/v4A/wD/AP8A/wACLAkACWUYAAABAAD//////wD/AP8A/wAA/wAAAAEAAQABAAD///8AAAEAAQD/AP8A/wAAAP8A/wAAAAD/////AAAAAAAAAAD/AP8AAAAAAAD/AP//////AAAAAAEBAQH/////AAAAAAD/AAAAAAABAAAAAAEBAQEA/wAAAAAAAP8A/wD/////AAAA/wD/AP/+//7/AP8A//8A/////////////wD/AAAA/wAAAP8A/wEBAQAA/wAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAP8A///+//7//////wD/AP//AP8AAP8AAAABAAAAAQABAP8AAAD/AAEAAAAA////AAEBAQAAAAABAAAA//8A/wD/AP8AAAEAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAAEAAQD/AAAA/wAA////////////AP//AQABAf///wAAAAAAAP8AAAAAAAD///8AAAAAAQABAAEAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAABAAEBAAAAAP8A//8AAAABAAAAAAAAAAAAAAD/////AAAAAAH/AP8A9Y7k//3p+gD///8A/v/+AP///wD///8A/wD/AP///wD///8A////AP8A/wAAAAAA//7/AAD/AAD///8ABk4SAAZOEgAAAAABAQABAQEAAQEAAAAAAP8AAAAAAAAAAQAAAP8A//8A/wAAAAAA/wD/Af////8BAAEB/////wAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAP7//gAAAAABAAAA/wAAAAAAAAAAAP8AAP////8AAAD/////AAD/AAABAAEBAAAAAQABAAEBAQEB/wD/AAAAAAEBAAEBAAEAAQABAAD//////wD/Af///wAAAQAAAP8AAAD/AAD/////AP8AAP8A/wEAAAAAAAAAAQEBAQEAAAABAQABAQAAAAEAAAAA/wD/AAD/AAAA/wD/AAEAAAAAAAAAAAAA/wD//////wD/AP8AAAAAAQAAAAAA/wD/AAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD//wABAAAAAAAAAP8AAP8A////AP//AAAAAAEAAQEAAAABAAAAAAAAAAAAAAAA/wD//wEAAQEAAAAA/wD////+//8AAAAAAAAAAf8A/wD//////wD/AP8A/wD/////AAAAAQEAAQEAAAAAAAAAAQABAAD/AP8B/wD//wAAAAAAAAD///X9APaP5QAAAAAA////AAAAAAAA/wAA////AP7//gD+//4A/v/+AP/+/wD+//4A/wD/AP///wD/AP8AAAAAAAhlFwADLAv/AAAAAP8A/wAAAAAA/wD/AAD/AAD///8AAAAAAQEAAQEAAAAAAAAAAAEBAQH/AP8AAAAAAf///wABAAEBAAAAAf////8AAQAA/////wAAAAD/AP8AAAAAAf8A//8AAAAA/wD///8A/wH/AP8AAAAA/wAAAP8AAAAA/wD/AP/+//////8AAAAAAP///wAAAAD/AP8AAAD/AAAAAAAAAAAAAP8A//8A/wAA/wD///8A//8AAAAB/wD//wEAAf8AAAAAAAAAAP////8AAAD//wD/AP8A/wAA/wD/AQEBAP////8AAAAB/////wAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD///8AAP8AAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEA/////wAAAAEAAAABAQABAQABAAABAAEA/wD/AP8A/wAAAAAAAP8AAP8A/wABAAEAAP8AAQAAAAH//////wD/AAEAAQAAAAAAAQEBAAD/AP8AAAAA/////wAAAAD/AP8AAAAAAP///wAAAAD/AP8AAAABAAAAAAABAAAAAfzT9QD3m+cAAP8AAP///gD+//4A////AAAAAAAA/wAAAP8AAAAA/wD///8AAP//AP///wD///8A/wD/AAD/AAAKfBsBARYEAAEAAQAAAAAAAP8A//////8A/wD//wD/AP//////AP8AAP8AAP/+/wAAAAD/AAAAAAD/AAD/AP8A/////wABAAH//v8AAQABAQD/AAAAAAAA////AAAAAAEAAAAAAAAAAQAAAAABAAEBAP8AAP///wH/////AQABAAABAAEAAAAAAP8AAAAAAAAAAAAB//////8A/wAAAAAAAQABAAAAAAH/AP8AAAAAAQAAAAEAAAAAAQABAf7//gD/AP8A/wD/AAD/AAABAQEBAAAAAAAAAAD/AP8B////AAAAAAD/////AP8AAP//////AP8AAP8A//8A/wAAAAAA/////wD/AAEAAQAB////AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AAD/AP8AAAAAAf////8AAAAA////AP/+/wD/////AP8AAAAAAP//AP8AAAEAAQAAAAD/////AAAAAP8A//8AAAABAP8AAP8A/wAAAQABAP8AAP8A/wAAAQABAAAAAf////8AAAAA////AAAAAAAAAAABAAAAAf/+/wAA/wD/AP8AAAD/AP/4sO3/+sjyAP7//wD///8AAAAAAP7+/gD/AP8A/v/+AP7//wAAAAAA/v//AP7//gD///8A/v7+AP7//gABCgMACYYeAAEWBAD/////AAAAAP8A/wAAAQAB/////wAAAAEAAAAAAAEAAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAQD/AP8AAQAA/wD/AAABAAAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAABAAAAAQAB/wD/AAAAAP8AAAAAAAAAAQAAAAD/AP8A/wD/AAAAAAAAAAAA/////wD/AAD/////AAAAAAAAAAAAAAAA////AAEBAQEBAAEAAAAAAAABAAH//v8AAAAA/wD/AAAAAAD/AP8A//8A/wAAAAAAAQEBAQAAAAEBAAEAAAAAAQAAAAAA/wAAAAEAAQABAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAEAAQH//////wD//wAAAAAAAAABAAEAAP///wAA/wAAAP8AAP////8AAAABAQEBAAEAAQEAAAD//wD/AAD/AAD/////////AAEAAQEAAAAA/wD//wAAAAH///8AAAAAAP///wD/////AAAAAAABAAAAAQABAAAAAAABAAEBAAEB+JDnAP7p+wAAAAAA////AP8A/wD+/v4A/wD/AAAAAAD+/v4AAAAAAAAAAAD/AP8A////AP8A/wD+//4AARYEAAmFHQABFwQAAAAAAQAAAAAAAAAAAQEBAQAAAAD/////AP8AAP8A/wAA/wAAAAAAAAD/AAAA/wAAAAAA//8A/wEA/wAAAP8AAAD/AAD/////AQEBAf////////8AAP8AAP//////////AAAAAQD/AAAAAAAAAP8AAAAAAAH/////AAAAAAD/AAAAAAAAAQABAQAAAAAAAAAAAAEAAQAAAAABAAEBAP8AAAD/AAAA/wAA/wD//wD/AAD///8A/////wD/AAD/AP8AAAAAAQAAAP8AAAABAAAAAAEBAQH/AP8A////AAABAAD///8AAAAAAAAAAAD/AP8AAP8AAP////8A/wD/AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAf8A////AP8AAAAAAAAAAAD/AP8A/wD//wEAAQH/AP///v/+AP8A////AP8AAQABAP8A//8BAAEB/wD///8A/wD///8AAAAAAP8A/wAAAAAA/wD//wAAAP8AAAABAAAAAAAAAAD///8A/wD/AAAAAAD/AP8A//T9//Z64gD96foA/v/+AP///wAAAAAAAP8AAP///wD/AP8A/v/+AP///gD///8AAAAAAP///wD/AP8A////AAAVBAAJhR4BAAsB/wEAAQH/////AP8AAP8A//8AAAAAAAAAAP//////AP8A////AP8A//8AAAAA/wD/AQAAAP8AAAAAAAAAAAAAAP8BAQEBAP8AAAD/AAD/AP///wD//wEAAQEBAQEBAAAAAAAAAAD///8A/wD/AP///wABAAEB/wD//wAAAAD///8A/wD/AP///wD/AP8B////AP8A//8AAQAA/wD/AAABAAD/AP8AAAAAAf8A//8AAAAAAQABAf8A/wAAAAAAAP8AAP8A/wD//v//AAAAAf///wAAAAABAAAAAP///wAAAAAA/wD/AP///wAAAAD/AAEAAAEAAQH///8AAAEAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEA//////8A/wD/AP8AAP8AAAAAAAABAAEA////AAAAAAEAAAAAAAAAAf8A/wAA/wABAAAAAAAAAAEBAAEB/wD/AAAAAAH/AP8AAAAAAQEAAQAAAAAAAQABAQAAAP8AAAAAAAAAAQEAAQEAAAAA/wD/AP///wABAAEAAAAAAP////8A/wD/////AP7q+gD3hOT///X+AP///wD/AP8A////AP8A/wAA//8AAAAAAP7//wD///8A/v/+AAD/AAAA/wAA////AP8A/wAAFQMACYUdAQELAgAAAAAB/wD/AAAAAAEAAAAAAAAAAAAAAAEAAAAAAP8A/wD/AAAAAAAAAP8A/wAAAAH//////wD/AAAAAAEA/wAA/v/+/wABAAEAAAABAAAAAQAAAAD///////////8A//8AAAAAAP8A/wAAAP//AP8AAP8AAP8A//8AAAAAAP8A/wD/AP8BAAEAAAAAAAD/AAD/////AAAAAP///wAAAAAAAP8A/wEAAQH/AP8AAAAAAAAAAAAAAAAA/wD/AAEAAQEBAQEBAAAAAAAAAAAA/wAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAAB////AAAAAAAAAQAB//7///8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQAAAAAA/v/+/wD/AAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP//////AAAAAAD/AP8AAAAAAAAAAP8A/wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAD/AAD/AP8A/////////wAAAAABAAEAAQAAAP/93/gA+ZvqAP///wD+/v4A/wD/AP7+/gD+//8A/v7+AP///wD///8A////AP7//gD+//4A////AP///wD///8AACAGAAeEGwACFgUAAP8AAAEAAQAA/wAB/////wAAAAAAAAAA/wD/AAAAAAD/AP8AAAAAAAAAAAAAAAABAAAAAP//////AP8AAQEBAQEAAQAA/wAAAAAAAP8A/wD///8AAAEAAQEAAQEA/wAAAAEAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAAAAAABAAH/AP8AAAAAAAAAAAEA/wAAAP8A/wD/AP8AAAAAAAEAAf8A/wABAAEA/wD/AAAAAAAAAAD/AP8AAP8A/wD///8AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAP8AAP8A/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAA/wAAAAAAAP///wAA/wAAAQABAQAAAAEAAAAAAAEAAAD/AAD/////AAAAAP////8AAAABAAEAAQAAAAH/AP8BAAAAAAABAAEAAAAA/////wEAAQAA/wAA/wD//wAAAAEA/wAAAP8AAAABAAEAAAAAAP8AAP8A//8A/wAAAQABAQEAAQEAAQAAAAAAAAAAAAEBAAEB/L3xAPqn7QD///8A/v/+AAAAAAD///8A////AP///wAAAAAA/wD/AAAAAAAAAP8A////AP8A/wAAAAAAAAAAAAAgBgAGhBsAARYEAP7//v8AAQAAAAAAAf////8AAAAAAQEBAQAAAAEAAAAAAAAAAQD/AAD/AP//AP8AAAABAAAA/wAA//////////8AAAAAAAAAAP////8BAAEBAP8A/////wAAAQAAAAAAAP////////8A////////////////AAEAAf////8A/wAA/////wAAAAD/AP8AAAAAAQABAAH/////AP8AAAD/AAD///8A/////wD/AAAAAAABAAEA/wD/AAAAAQAA/v/+/wD/AAAA/wAAAP8A/wD/AP////8AAP8AAP8A/wD///8AAAEAAAD/AAAAAQABAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wAA/wAAAP8A//8A/wABAQEB////AAEAAQEAAAAAAP8AAP8A/wAAAAD//////wD/AAAAAAAAAQABAf8A/wD/AP//AAAAAP////8AAQAAAAEAAP///wAA/wAA/wD//wAAAAEAAAAAAAAAAAAAAAD/////AP8AAAD/AAD/AP8AAAAAAPuo7f/7qO4A////AP7//gD/AP8AAAEAAP8A/wD///8A////AP///wD+//8A////AP///wD+//4A/v/+AP///wAAFAMAB4QbAAIXBgEA/wAAAAAAAAEAAQH///8A////AAAAAAD//////wD/AAAAAAAAAAAB/////wD/AAH/AP8AAQEBAQAAAAEAAQAAAP8AAAEAAQEAAAAA/wD/Af8A//////8A/////wAAAAABAAH/AAAAAQEBAQEBAQEBAAAAAAEAAQEAAQAAAAAAAAAAAAABAAEB/wD//////wABAAEBAAAAAAABAAD/AP//AAAAAQAAAAAA/wAAAP8AAAAAAAD///8AAQABAf8A////AP8A////AP8A/wABAAEAAAEAAAD/AAAAAAAA////AP8A//////8AAAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAADxAPgAAAAAAA/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAAAAP8AAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQEAAAABAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAAAAAAAQAAAAEAAAD/AAAAAQEBAQD/AP8AAP8AAAABAAEAAAAAAAAA/wAAAAEAAAABAAAAAAEAAQAAAAAAAAAAAAAAAAH+1PcAAQAAAAErCAABAAAA////AAAAAAD/AP8AAQABAP8A/wABAAAAAAEBAP///wAAAAAAAQAAAP8AAAAAAAAAAQsCAAI2CwD91Pb///D9AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAABAAEAAAEAAQEAAQAAAAAAAQABAP////8A/wAAAAEAAQEAAQACTA4ABVIRAANHDgEAAQEA/975AAABAAEAAAABAAAA/wAAAAEAAAAAAAAA/wD/AAAAAAABAP8AAAAAAAAAAQAAAAAAAQEAAQD/AP8AAAAAAAD/AP8AAQABAQABAP8A/wAAAAAAAAAAAQAAAAAAAAAAAAAA/wD/AAAAAQAAAAEAAAEAAQH/AP8AAAAAAAABAAEBAQEAAAAAAAEAAQEAAAD/AQABAf8A/wAAAAAA8fDxgQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHyAf/wAAAAAA/wAA/wD//wIBAgEAAAAA////AAAAAP8AAQABAAAA/wAAAAEA/wD/AAAAAQABAAAA/wAAAAAAAAABAAAA/wD/AAAAAAABAAEAAAAAAAAAAAD/AP8AAQABAP8A/wAAAAAAAQABAP8A/wABAAEAAAAAAP8A/wABAAEAAAAAAQABAP8A/wABAAEA////AAEBAQD/AP8AAAAA/wAAAAEA/wAAAAEAAARXEQAEVxEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQD///8A/Z7tAPy08QAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wEBAQH///8AARcEAARsFQACLAkAAAAAAAAAAAAAAAAA/tT4APyT6gD/6/z/AAAAAQD/AAAAAQAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAD/AP//AP8AAQEBAQD/AP8AAAABAAAAAAEBAQD/////AAEAAQEAAQD///8A/wD//wEBAQEAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAABAAEA/////wEBAQH/AP8A4eDhAQAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAEA8QfwAAAAAAAQABAQABAQAAAP8AAAAAAAAAAQABAAAAAAABAAAAAQD/AAAAAAAAAAAAAQABAAAAAQAAAAAAAAAAAAD/AP8AAAAAAAEAAQH/AP//AgECAQABAAEA/wAAAAAAAQABAAEAAAAAAAEAAQD/AP//AP8AAQABAf8A//8BAQEBAP8AAAAAAAD/AP//AQEBAQAAAAAAAAAAAP8AAQEBAQD/AP//AQEBAf7V+AAAAAAAASsIAAEBAQAAAAAA////AAAAAAABAQEA////AAAA/wD///8A////AAAAAAAAAQAAAAAAAP///wA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AAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8AAAAAAAD/AAAAAQABAQABAf////8A/wAA/wD//wAAAAD///8AAAAAAAABAAH///8AAP8AAQAAAAAAAAAA/wD/AAAAAP////8AAAAAAAABAAEAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAA/////////wD/AP8AAP8AAAAAAAD/////AP8AAP8A/wD+qvAA/ZTtAP///wD///8AAAAAAP7//gD///8A/v/+AP8A/wD///8A////AP///wD/AP8A////AP8A/wD/AP8AAAAAAP///wD///8A////AP///wAAAAAA/wD/AP7//gD+//4A/wD/AAAAAAD///8A/wD/AAAAAAD///8A////AP8AAAD///8AAAAAAP///wD///8A////AP///wD///8AASsIAAKKGAABSgwAAAAAAAEAAQD+/v7/AP8AAQD/AP8AAAAAAAAAAP8A/wAAAAAA/wD/AAABAAAAAAAAAAAAAAAAAAH/AP8AAP8AAP///wAA/wD//wD/AAD/AAABAQEBAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHh4e//8A/wABAQEA/////wEAAQEAAQAAAP8AAP8A//8BAAEA/wD/AQAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAABAAABAAEA/v/+/wAAAAABAAEBAAAAAAAAAAD/AP8AAAAA/wAAAAAAAAABAQABAP8A/wABAAEA/wD//wEBAQEA/wAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAQEAAAAAAP///wABAQEAAAAAAP///wABAAEAAAEAAAAAAAAAAAAAAP8AAAAhBgACdRQAABYEAAAA/wAA/wAAAAEAAAAAAAAAAAAAAP8AAAEBAQAAAAAA////AAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAAABAQEA/wD/AAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAANX5AP6V7f//6vwBAQABAP8A//8BAAEB/wD/AAEAAQD/AP8AAQABAAAAAAD/AP//AAAAAQEAAQD/AP8AAQAB/wABAAH/////AQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAEAAP///wABAAEA/wD//wEAAQEAAAAA4uLiAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHh4e//8A/wAAAAAAAAAAAAD/AP8AAQABAQABAP8A/wABAQEAAP8AAP8A//8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAEBAAEA/wD/AAAAAAAA/wD/AQEBAf8A/wAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf////8AAAABAP8A/wABAAEAAAD/AQABAQAAAAAAAAAAAAAAAAAAAAD/AP8AAQEBAP/+//8AAAAAAAEAAQAAAAABFQQAAoEWAP8UAwAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAEA/wD/AAAAAAAA/wAAAAEAAAEAAQD/AP8AAAAAAAEAAQD/AP8AAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAQAAAP/1/gD/qvIA/7bz/wEBAQH///8AAQEBAP///wAAAAAAAAAA/wEAAQEAAQAA////AAAAAAABAAEA/wD/AAAAAP8BAAEB/wD/AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD//wAAAAEBAQEAAAAAAP/+//8BAQEB4uLiAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHR4d/wAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAD/AP//AAAAAQEAAQD/////AAEAAQAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAEAAQD/////AQEBAf8A/wAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAQABAP8A/wAAAAAAAAAAAAEAAQD/AP8AAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQABAAAAAAAAAAAA/wD//wAAAAEAAAAAAAsCAAFgEAAAPwoAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANX5AP+W7wAA6/wAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQABAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAA/wD/AAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wD/AAEAAQAAAAAAAAD/4+LjAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHR0d/wABAAAAAAAAAQABAP8A/wAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAP8AAAABAAAAAP8A/wABAQEAAAAAAAD/AP//AP8AAQABAAAAAAAAAAAA/wD/AAEBAQEAAAAAAAAAAAAAAP////8AAQEBAQEAAQD/AP8AAP8A/wABAAEAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAQABAP7//v8BAQEBAAAAAP////8BAAEBAAEAAAAAAAD/////AQABAQAAAAAAAQAAAAAAAAD/AAAAVQ0AAFYOAAD/AAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAD/AAD//wAAAQEAAAAAAAABAQEA////AAAAAAAAAQAAAP8AAAABAAABAAEA////AAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAEBAQD/AP8AAP8AAAABAAAAAAAAAQABAP8A/wAAAAAAAP8AAAD1/gD/q/IAAbb1/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAABAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAQAB4+LjAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHB0c/wEAAQAAAAAA/wD/AAAAAP8BAQEB////AAEBAQD///8AAQEBAAAAAAAAAAAA/////wAAAAEAAAAAAQABAAAAAP8AAQABAP8AAP8A/wABAQEAAAAAAP///wABAQEAAP8A/wABAAEA/wAAAAAA//8A/wEAAAAAAQABAAABAAAA/wAA/wD//wEAAQH/AP8AAQABAP8A//8BAQEBAP8A/wAAAAH/AP8AAAAAAAAAAAAAAAD/AQEBAf////8AAAAAAAAAAAEAAQH/AP8AAQAB/wAAAAAAAQABACoGAABpEQD/FgMAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAAAAAAABAAEA////AAABAAABAAEA////AAEBAQD///8AAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEBAAAA/wAAAAAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAANX6AACW7/8B6/0BAAEAAAD/AAAAAAAA/wD/AAEBAQAAAAD/AP8AAAABAAH/////AQABAQAAAAAAAAD/AAAAAP8A/wEBAQEAAP8AAP8A//8BAAEBAAAAAAAAAAD/AP8A5OPkAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHB0c/wD/AP8BAQEBAAEAAP///wAAAAD/AQABAQAAAAD/AP8AAQABAAAAAAD/AP8AAAAAAAEAAQD/AP8AAAAA/wAAAAEAAAAAAAAAAAD/AP8AAQAAAAAAAQAAAAABAAEA/wD/AAAAAP8AAAABAAAAAAEAAQAAAAAAAAEAAAD/AAD/AP//AAAAAQEAAQD/AP8AAAAAAAEAAQAAAQAA////AAEAAQAAAAAA/wD//wAAAAEBAQEAAP8AAP8A/wABAQEAAAAAAAD/AAD/AP8AAAAAAAEAAQD/AP8AAAAA/wAVAwEAahEA/ykGAAABAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAQABAAAAAAD/AP8AAQABAAAAAAD/AP8AAQAAAP8AAAAAAAAAAAAAAAHr/gABbOkAAAAAAP8A//8AAAABAQABAP8A/wABAAEAAAAAAP8A/wAAAAAAAP8A/wABAAEA/wD/AAEAAQEAAQAAAQAA//7//wABAAEAAAAAAAAAAAAAAAAAAAD/5OPkAgAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP8AAAAAAAAAAP8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAAD/AAAAAAAAAAAAAP8A/wD+//7/////AP////8AAAABAAAAAP8A/wAAAAAAAAAAAP8A/wAAAAAAAAAAAP8A////AP8AAP8AAAAAAAD//v//AAAAAAAAAAD///8A////AP8A/wAAAAAAAP8A//8A/wABAAEA////AADr/QAAgewAAKzzAP///wD///8AAAAAAP///wD+//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD+//4A////AP///wD+/v4AAP8AAP///wD///8A////AP///wD/AP8A////AP7//wD///8A/v/+AP7//gD///8A/v/+AP7//gD///8A/v//AP///wD///8AAAAAAP4UAQD/IAQA/wD/AAAAAAEAAAD//wD/AAAAAAD/AP8A/wD/AAAAAAAAAAD//wD/AAD/AP8AAQAAAQABAP8A/wD///8AAAEAAQEBAQABAAEAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQH/////AAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAAEA/wD/AAAAAAAAAAABAQEAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAEAAAAAAAEAAQAAAAAAAQAB/wD/AAAAAAAA/wD/AAAA/wAAAP8AAAAAAAEAAQAAAAD/////AQEBAQAAAAAAAAAAAavzAAJs6gAA6/wA////AP///wD///8A////AP///wD///8A////AP///wD///8A/wD/AP///wD///8A////AP///wD///8AAAAAAP///wAAAAAA/v/+AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/v7+AP///wD///8AAP8AAAAAAAAAAAABAAAAAAD/AAAAAAAAAQEBAAD/AP8AAAABAQEBAQAAAAH///8A/wD/AAAAAAABAAEAAP8AAP7+/v//AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP//////////AAEAAAAAAAABAAEBAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAA/////wAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAA/wD//wD/AAAAAAABAP8A//////8A/wABAAAAAAD/AAAA/wAAAP8AAAAAAAD///8AAP8AAAAAAAAAAAAAAP8AAP///wAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQAAAAH///8A////AAAAAAAAAAABAAAAAAAAAAAAAAAA/wD/AADr/f8BbOr/AKvyAP8A/wD/AP8AAAAAAP8A/wD/AP8A////AP8A/wD/AP8A////AP8A/wD/AP8A/wD/AP///wD/AP8A/v7+AP///wD+/v4A////AAAAAAD/AP8A////AP///wD/AP8A/wD/AP///wD/AP8A////AP///wD///8A/wD/AP///wD///8A/wD/AP///wD/AP8A////AADq/AAA4Pv/AAAAAAD/AAAA/wD/AAAAAAABAAAA/wAA//7//wABAAH/////AAAAAAABAAABAAEBAP8A/wD/AAD/AP8AAAEAAAEAAQEA/wD/AP8AAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAQAA////AP8A/wD///8AAAAAAf///wD//////wD/AP8A/wD//////wD//wEAAQEAAQAA/wD///////8AAAAAAAAAAQAAAAD/AP///wD/AQEAAQEAAQAAAAAAAP8A/wAAAAAA/wD/AP///wAAAAAA/wD/AP////8AAAAAAAAAAAEBAQD/AP//AP8AAAD/AAD/////AAEAAAAAAAAAAAAB//////////8BAAEAAQEBAP///wAAAAAA////AP///wAA/wAAAQABAAAAAAEAAAABAqz1AANt6wAA6vwA/v/+AP///wAA//8A/wD/AAD//wAA//8A//7/AP///wAA/wAA////AP///wD///8A/wD/AP///wD/AP8AAAD/AP7//gD//v8A/wD/AP8A/wD///8A////AAAA/wD///8A////AP8A/wD/AP8AAP//AP8A/wD/AP8AAP//AP///wD//v8A/wD/AADX+gABAAEB/wD//wAAAAAAAQAB////AP///wAAAAAA/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wAA/wDhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAAAAAABAAEAAAAAAP///wABAAEAAAAAAAEAAQD/////AAEAAQAAAP8AAAABAQABAP8A/wAAAAABAAAAAAAAAAD//v//AAEAAQAAAAD/AP8AAAAAAP8A/wAAAAABAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEAAQH///8AAAAAAAD/AAAAAAAA/////wABAAAA/wAA/v/+/wIBAgEAAAAAAAAAAQAAAAAAAQAA////AAAAAP//AP8AAAAAAQAAAAD/AP//AAAAAQAAAAAA/wD//wH/AQDr/QADbuwA/kgKAP5JCgD+FQIAAAAAAP8AAAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAABAP///wAAAQAAAP8AAAEBAQD///8AAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAA//8AAAABAAAAAAAAAP8AAADA9gAAAAAAAAAAAf////8AAAABAAAAAAAAAAD/AP//AAAAAf/+//8AAQABAAAA/wAAAAEAAAAA/wD//wEAAQH///8AAQEBAAD/AAD/AP8AAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8B/wAAAQABAAAAAAAAAAEAAAAA////AAABAAAAAAAAAQABAP///wAAAAABAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAD/AAAAAf////8BAQEBAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAABAQEB/wD/AAD/AAAAAQAAAQABAP8A/wAA/wAAAAEAAAAAAAD///8AAP8AAP8A/wABAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAABAP8AAAABAAAA/wD/Arj2AQHM+QD9UwoA/j4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH/AAAAAAAA/wAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAEAAQD///8AAez+AALX+wD/AAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA/wD/AAD/AAAAAAAAAAEAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////AAAAAAD/AP//AP8AAP///wAAAAAAAP8AAAAAAAD///8BAP8AAAEAAQEAAAAAAP8A/wD/AAAAAAAAAAAAAAAAAAD///8A////AAD/AAAAAAAAAAAAAAD/AAD//v8AAP8AAP8A//8A/wAAAAAAAP////8AAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP//////AP//AAEAAAD/AP8AAQABAP8AAAHs/QAFmfQABG/tAADr/QD///8A////AP8AAAD/AP8A////AP///wD/AP8AAAAAAP///wD///8A////AP///wD///8A/wD/AP///wAAAAAA////AP///wD///8A/wD/AP8A/wD/AP8A/v/+AP///wD/AP8A////AP7+/gD/AP8AAqz0ACM0r5MAACAASURBVAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAgEC4AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAAAAAAAAAAAA/wD///8A/wAA/wAAAAAAAP///wAAAAAA/wD///8A/wAA/wAA/wD/AAABAAD/////AAAAAAD/AAABAAEAAQABAAAAAAAA/wAA////AAABAAD/AP8A/wD/AAEBAQEAAAAA/////wEAAQEAAQAAAAEAAP//////////AAAAAAEBAQEAAAAA////AAAAAAD/AP8AAAAAAAEAAQEAAAAAAAAAAAABAAEA/wAA/wD/AAD/AAD+//4AAev9AAVv7QAEmfMAAOv9AP///gD//v8A/wD/AAAA/wD//v8A/v/+AP///wD/AP8A////AP8A/wD///8A////AP8A/wD+//4AAAD/AP8A/wD/AP8A//7/AP///wD//v8A////AP8A/wAA//8A/wD/AP///wACwfgAAsL4AP8A/wAAAAAA////AP///wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/QD9AAH/AQAAAAAAAAAAAAD/AAAAAAAA/////wAAAAEAAAAAAP8AAAEBAQD/////AQABAQAAAP//AP8BAAAAAAD/AP8AAAAB////AAAAAAAA/wAAAAEAAQAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAQAAAAD/AP8AAQABAf///wAAAAAB////AAAAAAABAQEA/////wAAAAEA/wD/AAEAAf////8BAAEB/wD//////wEAAAAAAAAAAf8A/wAA/wAAAAAA/wD/AAAAAQAB////AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP8A//8AAAAB////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAP8A/wACwfj/B8L5Af0+BgD8UgoA/hQCAP8AAAAAAAAAAP8AAAEAAQD///8AAAAAAAAAAAAAAAAAAf8BAP8A/wAAAAAA/wAAAAAAAAAAAAAAAAAAAAD+AAAAAQAAAP8AAAAAAAD/AAAAAAAAAAHs/gADpPQAAAAAAAAAAAD/////AP8AAAABAAH/AP8AAAAAAQAAAAABAAEB/wD/AP///wAAAAAA////AAEBAQD///8AAAAAAf8A//8AAAAB/wD/AAEBAQAA/wAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD+//7/AQEBAP8A/wAAAAABAAEAAQAAAAABAAEAAAAAAP/+//8AAQAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAEAAP////8BAQEBAQABAP7//v8CAQIB/wD/AAAAAAAAAAAAAAAA/wD/AAAAAQAB/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAAAAQABAQABAP8A/wH/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAD/AP8AAQABAAAAAALC+QAGwvkA/T0HAPtSCQD/FAIAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAP8A/wAB/wEAAAAAAAAAAAAAAAAAAuL9AAaQ9AAB9f//AP8AAAABAAEAAAABAAEAAAAAAP8AAAABAAAAAAAAAAD/AP8AAAAAAP////8CAQIB/wD/AP///wAAAAD/AP8AAAABAAEAAAAAAAAAAP///wAA/wAAAAEAAP7+/v8BAAHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAwID7/3+/QABAAEB/////wEBAQEAAAAAAP8AAAAAAAD/AP8AAAEAAAAAAAH///8AAQABAP8A//8BAQEB////AAEBAQAAAQAAAAAAAAAAAAD/////AAAAAQAAAAD+//7/AQEBAQAAAAAAAAAAAAAAAf8A//8BAAEAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAA/wH/AAAAAAABAAEA/v/+AAEBAQAAAAAAAAAA/////wABAQEBAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAA////AAAAAP8BAQEB////AAEBAQAA/wAA/wD//wAAAAEBAAEAAAAAAP8A//8BAQEB/////wAAAAABAAEA/v/+/wAAAAABAQEAA8P5AQPD+QD9PQYA+1IJAP4UAgAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAA/wD/AAD/AAAAAQAAAP8AAAAAAAD/Af8AAP8AAAEBAQADufgABa73AAD1/v8AAAEA/wD/AAEAAQAA/wD/AAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEBAQD+//4BAQABAP////8BAQEBAAAAAAAAAAAAAQAAAAAAAQEAAQACAgLhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/P784QD/AAAAAAAAAQABAQD/AAD/AP//AAAAAQAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQEA/wD/AQABAQD/AAD/AP8AAAAAAAEAAQEAAAAA/wD/AAEBAQEAAAAA////AAEBAQAA/wD/AAEAAQAAAAH/////AAAAAQAAAAAAAAAAAf8BAAAAAAD/AP//AQABAf///wABAAEA/////wEAAQH+AP7/AAAAAf///wAAAAAAAAAAAQAAAP8A/wAA/wD//wAAAAEAAAD/AAAAAQD/AAABAAEAAAAA/wEBAQH/////AAAAAf///wABAAEAAQABAQAAAAAAAAD//wD/AQEAAQH///8AAQABAf8A////////AAAAAQEBAQD///8AAQEBAAD/AAACwvn/CMP6Afw8BgD9MwUA/SgEAAALAQD///8AAAABAAD/AAABAQEA/wD/AAAAAAAA/gAA/wD/AAEAAQAB9f8AAtj7AAW5+gAD2PwA////AAAAAAD/AP8BAQABAAD/AAAAAAAB/////wAAAAABAAEB/wD//wAAAAEAAAD/AQABAQABAAAAAAAAAAEAAP7//v8AAAAA/wD/AQEAAQD/////AQABAQABAAD/////AAAAAAAAAAH8/vzvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABAIE8P3+/QD///8A/wD//wAAAAEBAAEB/wD/AAAAAP8AAAAB////AAAAAAD///8AAAAAAAD/AAAAAAABAAAA/wAAAAEAAAAAAQABAP8A/wAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAABAP4A/wECAQH///8BAAAAAAAAAAAAAAD/AAEAAf///wAAAAAB/wD//wAAAAH/AP8AAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQABAf8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAAEAAQD+//7/AQEBAQAAAP8AAAAAAAAAAP8A/wABAAEA/wD/AAAAAAEAAAAAAAAAAP///wAAAAAA////AAAAAP8BAAEB////AATD+gADw/kAAAAAAP4pBQD+HgIA/hQCAP4fAwAAAAAAAQABAAD//wAB7P4AAfYAAALX+wAD2f0AAvb/AP///wAAAQEAAAAAAAAAAAAAAAAA/wD/AAAAAP8BAAEBAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAB/wD/AAD/AAAAAAAAAAAA/wEBAQH//v//AAEAAP8A/wABAAEB/wD/AAEAAQAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAwMD0Pz9/AD/////AQEBAAAAAAD/AP//AP8AAQABAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP//AAAAAQAAAAAAAAD//wD/AAAAAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8BAQEBAAAAAAD/AP8AAQAB/v7+/wEBAQAAAAABAAAAAQAAAAAAAAAAAAAAAP8A//8AAAABAP8A/wAAAAAAAQAAAP8AAf8A//8AAAAB/wD/AP////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAD///8AAQEBAP7//v8BAQEB/////wEBAQEAAAAAAAAAAAAAAAD/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////wLX+wEC1wAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAP////8BAQEB/wAAAP////8AAAABAAAAAP///wAAAAD/AQEBAAAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAf7+/v8BAQEBAP8A/wABAAD/AP8AAAAAAP///wAAAAABAQEBAAD/AAACAwLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAABAA4AD/AAABAQEBAAAAAQAAAAAAAAABAAEAAP///wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAD/AAD///8AAAEAAQAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAEAAAAAAAEAAf8A/wAAAAABAAEAAAAAAAEAAAAAAQABAAEBAQEA/wD/////AAAAAAABAQEBAAAAAAAAAP8BAAEBAAAAAAEBAQH///8AAQABAAAAAAABAQEAAAAAAAAAAAAAAAAA////AQAAAAD/////AAAA/wAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAAAA/wAAAAAAAAAAAAAA/wEAAQEA/wAAAP8AAAEBAQEAAAAAAAAAAAAAAAEBAQEB////AAD/AP//////AAAAAAD/AAAA/wAB/////wAAAAEA/wAAAP8AAAAAAP8BAAEAAAAAAAEAAQEAAAAAAAEAAQD/AAAA/wAAAAAAAAAAAAAA/wAA/v7+//8A/wAEAATQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8AECAc8A/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAB////AP8A/wD/AP8AAQABAQAAAAAAAQAA/wD//wAAAAH+//7/AAAAAP8A//8AAAAAAP8AAAABAAEAAAAAAP8AAAAAAAAAAQAAAQABAQEAAdDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAcIAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD//wEBAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAEBAbEAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGxrv/v3+EP8A//8BAQEBAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAP////8BAAEBAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQAB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wD/////AAAAAAEBAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAEAAP////8BAQEBAP8AAP8A//8BAAEAAAEAAQAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAP///wABAAEAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAEBAQD+//4AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP7//gABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA4Ojn6CEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAA//7/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAiRAAIA8f///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACQkJkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD4Dw0PCf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAEBAAGA5OTksQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgEPfo984AAAAhAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AQEBAQAAAAD/////AQEBAQAAAAAAAAAAAAAA/wAAAAH/////AQEBAQD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wEBAQEBAAEA/v/+/wAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8BAQEBAAAAAAAAAAAAAAAA/////wEBAQEA/wAA8OBlGQAAIABJREFUAAEAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAA/wAAAAEA/wAAAAH/////AQEBAQAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAP8A/wABAAAAAAEBAeDo6OghAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8AUEBWIA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wQEBGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8uALDQsAAQABQP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAgECgebm5qEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD19PXBDAsMMAAAACgBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAAAAAAAAAAEBAQABAQEA/wD/AQAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAAEA/wD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAABAAAA/wAAAAAAAAAB/////wEBAQEAAAABAAAAAQAAAAEBAQEB////AAEBAQAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAABAAAAAAEBAQAAAAD/AAAAAQAAAAEAAAAAAAAAAAAAAAAA/wD/AQIBAQD/AAABAQGx6enpaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJYQD/AND+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wABANEJCQlhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AoKCkEBAQHR////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAAAA0QoJCkHg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4PAKCQpB/wH/sQD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wABAAGwCgkKQeDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD49vX2qQ0NDQH///9AAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAAAAAP8AAAABAAAAAQAAAAABAQEBAAAAAAAAAP8AAAABAQEBAAAAAAAA/wD/AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAQAAAAAAAAAAAAAA/wAAAAABAQEBAQEBAAEBAQABAQEA////AAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAABAQEBAAAAAAAAAAAAAAAAAQAAAAEAAAD/AAAAAQEBAQEAAAAAAP8AAAEBAQEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAABAQEA////AAEAAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/4Dr6utp8PDw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBhA/v/+n//+/yAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAP8A//8A/wABAQEBAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQEBAQABAAHgAQEBYejo6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYYFoD//v9/AAAAAP///wABAQEA/////wAAAAEBAQEAAAAAAP///wABAQEAAAAAAP///wABAQEAAAAAAAAAAAAAAAD/AAAAAP///wEAAAD/AQEBAf///wAAAAD/AQEBAQAAAAD///8AAQABAAABAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAQEBAP///wABAQEA/////wEBAQH///8AAAAA/wAAAAAAAAABAQEBAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP///wABAQEAAP8A8AEDAZEKCAqQ4ODg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg8/PzcAMEA0/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKkODg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBhA+/37UAIBAj8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAEAAdAAAADBAwMDsOjo6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAAD/AAD+//4fAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wICAuH9//0AAwEDAAD/AAD+/v7gAAAAAP///+ACAgLxAgIC3/7+/vH7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNRiUSAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//WVDC6Mn8XO8AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Photos.png b/arma/client/addons/phone/ui/_site/images/dark/Photos.png new file mode 100644 index 0000000..f8ad81b Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Photos.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Photos.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Photos.png.b64 new file mode 100644 index 0000000..6a9788b --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Photos.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEGNfIFhxEAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQoFAAAxGv8AKBX/AB8QAAASCv8ACwYAAAAAAAD2+wAA7PUBAOLxAADY6wAAzuQBAPf8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vL8//AP8vAP8AAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wAAAAABAQEB/wD/AAEAAQD///8AAQEBAP////8AAQABAP8A/wAAAAEAAAD/AAAAAQEBAQD///8AAQEBAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP/+//8AAAABAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAAAAAAATC/8ARiT/ADwh/wAKBf8A/wAAAAEAAQAAAAAAAAAAAAEAAAD/AAAAAQAAAP8A/wAAAAAAAAAAAMTgAgCx1gIA6/T//wEBAQEAAAAA/////wEBAQEAAAAA/////wABAAEAAAD/AQABAQAAAAD/////AAAAAAEBAQEAAAAA///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AAAAAAAEBAAEBAAAAAP////8BAQEB////AAABAAEA/wAAAQEBAAAAAAD/AP8AAQABAP////8AAQABAP8A/wAAAAAAAQABAAAAAAEAAQAAAAAAAQEBAf8A//8BAAEBAAAA/wAAAAH/////AAAAAQAAAAAAAAAAFAv/AXRD/gAUC/8AAAEAAAAAAAAAAAAAAQIBAAAA/wABAgAAAAEAAAEBAAAAAQAAAAAAAAECAQD/AP8AAQIBAAABAAAAAf8AAAAAAAABAAABAgEAAAD/AAACAQAKBf8AMh0AAM3kAf/2+wAAAP8AAAEBAQEAAAAAAAAAAAAAAAAAAAAA////AAABAAEA/wD/AAEAAQEAAQD///8AAQEBAQAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAQAAAAD/AP8AAQABAP///wABAQEA////AAABAAAA/wD/AAEAAQEAAQD/////AQEBAQAAAAAAAAAA////AAEBAQABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8J+vn6+ejo6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAjVH9ABQMAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAAD//wAAAAD/AAEAAQD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAO31AAB8tAMA9voA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAABRL/4AFQ3/AAEB/wAAAf8AAAH/AP8B/wD/Af8AAAH/AP8A/wABAQAAAAEAAAAB/wAAAf8AAQH/AAAB/wD/Af8AAAH/AAEB/wAAAf8AAAH/AP8B/wD/Af8AAQH/AAAB/wAAAf8AAQH/ABMM/wBRLv4AAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//xQMAABRMP4AAAEAAP8B/wAAAQAAAQEAAAAB/wABAQAAAAH/AAEBAAAAAf8AAQEAAAABAAAAAf8AAAEAAAEBAAABAQAAAQEAAAABAAAAAQAAAQH/AAABAAABAQAAAAEAAAEBAAABAQAAAAEAAAEBAABHLP4AFAv/AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAVEx/QAAAv8AAAL/AAEBAAAAAf8AAAL/AAEBAAAAAv8AAQIAAAAC/wAAAv8AAAL/AAAB/wABAgAAAAL/AAAB/wAAAv8AAAL/AAACAAAAAv8AAAIAAAECAAAAAv8AAAH/AAAC/wAAAgAAAAL/AAAC/wAAAf8ARyr9////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AAAAAP8BAQEBAAAAAAEAAQH/////AAAA/////wEBAQEBAAEAAAD/AP8BAQEB////AAABAAAAAAAAAQEBAf8A/wAA/wD/AAEAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQETBAQAKAkLAAABAAATBAQA9v/+Ae36+gDs/PwA4vn4AAAAAAH/////AQEBAQEAAQD///8ACgcAAD0l/gAAAAAAAQEAAP//AAAAAAAAAAD/AAA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/AQAAAAAAAP8AAAD/AAEAAAAAAAAAAQD/AAAA/gAAAAAAAQD/AAEAFBL+AHxu7wEUEv0AAAAAAAD/AP//AP8A/wD/AP////8BAQEBAAAAAf///wAAAAD/AAAAAf///wAA/wD/AQABAP////////8AAAAA/wEBAQAA/wAAAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//woCAwB3GyIAFAUFAAAA/wAAAQAA/wH/AP8AAAAAAQAAAQEAAAAAAAAAAQAAAAD/AAAA/wAAAQAAAAH/AAABAAAAAAAAAAH/AAAAAAAAAQAAAAH/AAAB/wABAQAAAAH/AP/8/wD5w+4A/vH7AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAH/AAABAAAAAf8AAQEAAAACAAAAAQAAAQIAAAABAAAAAQAAAAIAAAABAAABAgAAAAH/AAABAAABAgAAAAH/AAAB/wAAAQAAAAEAAP3++gDz9egA/gH+AAABAQAAAAEA/wABAP8AAAD/AAEAAP8AAP8AAAAAAAEAAAABAP8AAAD//wEA/wABAP8AAQD//wAA/wABAAAAAAAAAAEAAAABAP8AAQAAAAAA/wABABQS/QB8bu0ACgf+/wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAFoVGgAUBQUAAAD/AAABAAABAQAAAQEAAAAB/wD/AP4A/wD/AAABAAAAAf8AAAEAAAAB/wAAAf8AAAEAAAAAAAAAAf8AAAAAAAABAAAAAP8AAQEAAAABAAD/Af8AAQIBAAAB/wD++/4A+sPtAP/y/AABAgAAAAIAAAACAAABAgAAAAI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AAP8AAP////8AAAAA/wD/EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP//AAAA//8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAf///wAAAAAAAAAAAQAAAAEAAAABAAAAAQD/AAA8DhEA/wH/AAAB/wAAAQAAAQD/AAAA/wAAAP8AAAEAAP8B/wD/Af8AAQEAAAABAAD/AP8AAQIAAP8B/wAAAAAAAAH/AAAAAAAAAP8AAQEAAP8A/wD/Af8AAAEAAAEAAAAAAQAAAQIAAAEBAAABAQAA/wEAAAEBAAABAQAA//z+APnD7gD+8vwA/wH/AAACAAABAgAAAAIAAAAB/wAAAgAAAAH/AAAC/wAAAv8AAAIAAAECAAABAgAAAQL/AAACAAD8/vsA7/PqAP4A/gD/AQAA/wAAAAACAAAAAQAAAAIBAP8B/wD+//8A//8AAAD/AAAAAAEA/wAAAP//AQD/AAEAAAABAP8AAAAAAAEA//8BAAAAAQD//wAA/wACAP8AAAAA/wAA//8AAAAAAAAAAAEAAAAAAAABAAD+AAAAAAABAP8AAAA+OPkAAAEAAQABAAAAAAD/AAAAAQAAAAAAAAAA////AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAP////8AAAAA/wD/AAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEBAAAAAQD/AAAAAAAA/wD/AP//////AP8A/wD/AP///wD/AP8A/wD/////////AP//////AAAAAP//AP8AAAAAAAAAAAAyDA0A/wH/AAABAAAAAf8A/wH/AAEBAAAAAQAAAQEAAAEAAAAAAQAAAAH/AAAA/wABAgAA////AAEAAAAAAf8AAAD/AAAB/wAAAf8AAAH/AP8B/wAAAP8AAAD/AP8B/wAAAf8A/wEAAAABAAD/AAAAAQEAAAAA/wD+Af8AAQH/AP78/gD7w+0A//H7AAAB/wAAAf8AAAEAAAAB/wAAAf8AAAH/AAAB/wD/Af8AAAEAAAABAAD/AQAAAAIAAPz++gDt8+oA/f/+AAACAAAAAQAAAAIAAAABAAAAAgAA/wH/AAABAQAAAAEA/wAAAP7/AAD//wAA//8AAP//AAAAAAEA/wABAP8AAQD/AAEAAAEAAP//AAAAAQAA/wAAAP8AAAD+AAEAAAABAP7/AQD//wAA/v8AAAD/AQAA/wAA/wABAP8AAQA0LvoAAAAAAAD/AAAAAAAB/wD/AAAAAP//AP8A////AAEBAQH/AP8AAAAAAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAIDAhD/AP8A/wD/AAABAAH///8AAP8A/wABAAEAAAAAAQABAAEBAQAA/wAAAP8AAQEBAQEBAAEBAAAAAP8A/wEBAAEAAAAAAB4HCAAKAwIAAAD/AAAA/wAAAQAA/wAAAAABAAAAAAAAAAH/AP8B/wABAQAAAAH/AP8A/wD///8AAQH/AAAB/wD/AP8AAgIBAAAB/wAAAAAAAAAAAAEBAAAAAP8AAAEAAAAB/wAAAAAAAQAAAP8B/wAAAv8AAAH/AAABAAABAQAAAAEAAAABAAD//f8A+sTuAP7y/AD/AQAAAAH/AAABAAAAAQAAAAEAAAABAAABAQAAAQH/AP8B/wABAf8A+vz6AOzx6gD+//4AAAEAAP8AAAAAAgAA/wAAAP8BAAD/AAAAAAEBAAAB/wD/AAEAAAABAAABAAAAAQEAAAEBAAEBAQD/AAAA/v8AAAAAAQAAAQAA/v8AAP8AAAD//wAAAP8AAAAAAQD//wAA/v8BAAABAQD/AAEAAAEBAP8AAAAAAQEA////AP//AAAJCf8AFBL+//8A////////AAAAAP8A/wEA/wAAAAEAAP8A/wAA/wD//wD/AP////8A/wD/AP8AAQAAAAH/AP8AAP8A/wD/AAH///8AAAAADwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP79/hAA/wAAAP8AAAD/AAAAAAAAAAAAAQAAAAAA/wAA////AP///wAAAAD/AAAA//////////8AAAAA/wAAAAD+//7//////xQFBgD/AQAAAAD/AP8A/wD/AP4AAQH/AP8B/wABAgAAAAD/AAAAAAD///8A/wAAAAABAAABAQAA/wEAAP8A/wABAQAA/wD/AP8AAAABAgAA/wH/AAAA/wAAAQAAAAH/AAAAAAABAf8AAAH/AAIBAAAAAQAAAAEAAAABAAAAAAAAAQIAAAEBAAAAAP8A//z+APvD7gD/8vsAAAEAAAAB/wAAAf8AAAH/AAAB/wAAAQAA/gD/AAEB/wD7/voA7fLqAP0A/wAAAAAA/wEAAAABAAD/AAAAAAEAAP8AAAD/AAAA/wD/AP8AAQD/AAAA//8BAAAAAQD+//8A//8AAP7/AAD//wEAAAABAP8AAQD//wEAAAABAP8AAAD/AAEA/wAAAP//AAABAQEA/wAAAP//AAAAAQAA//8AAP8AAQD//wAAAQEBAAAAAAD/AAEAKyb7AQAAAAH/AP8AAP8AAAD/AAD/AP//AP8AAAD/AAAAAAABAAAAAAAAAAEAAAABAAAAAAD/AAAA/wAAAAEAAQAAAAAAAAAA////EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQkAAAAA//8AAAEAAAEBAAAAAQAAAAD/AAAA/wD/AP8A/wAAAAAB/wAAAf8AAAD/AAEBAAD/Af8AAQEAAAABAAD/AP8A/wD/AAAB/wD+//8AAQD/AP8B/wAAAf8AAAD/AAAB/wD/AP8AAAEAAAACAAAAAAAAAAEAAAABAAAAAgAAAAEAAAABAAAAAQAAAAEAAP78/gD7xO4A//L7AAABAAAAAgAAAAEAAAABAAAAAf8AAQIAAPv++wDp8esA/QD/AP8BAAD/AwAAAAIAAP8CAAAAAQAA/wIAAP8BAAD/AQAA/wEBAP8B/wAA/wAA/wEAAP8AAQABAQEA/wAAAAAAAAAAAQAAAAABAP//AAD//wAA/wABAP8AAQAAAAEAAAABAP8AAAD//wAAAAEBAP8AAAD+/gEA/wABAAAAAQAAAAEA/wABAAAAAQD///8A/v7//wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wABAAAAAAEBAQEAAAAAAAAAAP8A/wD///8A/////wD/AP//AP8A/wD/Af////8AAAAA//////8A/wD/AP////7//xQIBgAAAf8AAQEAAP8B/wABAP8AAAEAAP8BAAAAAAAAAAH/AAABAAAAAQAAAAH/AP8B/wAAAf8A/wD/AAEB/wABAgAAAQEAAAEAAAABAf8AAAEAAAEBAQAAAP8AAAIAAAAA/wAAAQAA/wIAAAABAAAAAQAAAQEAAAAC/wAAAf8A/wD/AAEB/wABAgAAAAAAAAECAAD//P8A+sXuAP7y+wAAAP8AAAIAAAAB/wAAAf8A+v36AOnw6wD/Af8A/wEAAP8BAAD/AAAA/wAAAP//AAD/AQAAAAEAAAABAAD/AgAAAAH/AAACAQD/AAEAAAABAP8AAAD+/wEA//8BAP8AAAD//wAA/wAAAAAAAAD/AAEA//8AAP8AAQD//wAA/wABAAAAAQD/AAAAAP8AAP8AAQD/AAAA/v8AAP8AAAD+AAEA//8AAP8AAAAAAAEAFBP+Af8A//8BAAEBAAAAAP8A//8BAAEB/wD//////wABAAEBAAAAAQAAAAH/AP//AQABAf/+////AP8AAAAAAAABAAH/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAez7+wABAQAAAAEAAAEBAAAAAQAAAAEAAAEBAAAAAf8AAAH/AAAA/wAAAQAAAAEAAAAA/wAAAAAAAQD/AP8AAAD/AAAA/wD/AAABAAD/AQAA/wH/AAAA/wAAAAAAAP//AAABAAAAAQAAAQEAAP8BAAAAAv8A/wH/AAABAAABAgAAAAIAAP8BAAD/AAAAAQMAAAABAAAAAQAA//z/APrF7wD/+P4AAAD/AAACAAD8//0A6/PuAP4B/wD/AAAA/wEAAP8BAAD/AQAA/wEAAAACAAAAAQAA/wAAAAABAAAAAQAA/wIBAP8AAAAAAAEAAP8AAAD/AQD//wAAAAEBAP8AAQD/AAAAAAAAAAAAAQAAAAEA/wABAP//AAD/AAEA/wAAAP//AAD/AAEA/wAAAAD/AAAAAAEAAAABAP//AAAA/wAA/wABAP8AAQD/AAAA9vcCAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAA/wD/AQEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAEA/wAAAAAAAAD/AP8A/wAAAQABAAABAAEAAAAAAAAAAAD/AP/+//7/AAAA/wAAAAAAAAAA/v/+/wAAAAAAAf8A/wD+AAAA/wAAAQAAAAD/AAAA/wAAAAAAAAAAAAAB/wAAAf8AAAD/AAABAAABAP8AAAEAAAAB/wAAAP8AAQEAAP8B/gABAf8AAQAAAP8A/gAAAf8AAAEAAAABAAAAAQAAAAEAAAAA/wAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAABAgAAAAEAAAABAAAAAgAAAAEAAAD8/wD6xe4A//3/APz+/QDn8u0A+//+AP8BAQAAAQAAAAEAAAABAAAAAQAAAAEAAP8BAAD/AQAA/wEAAP8BAAAAAQAAAAAAAP8BAAD//wAA/wABAP8AAQAAAAEAAAAAAAD/AQAAAAEA/wABAP8AAAD/AAAAAAAAAAAAAQAAAAAA//8BAP8BAQAAAAEAAAABAP8AAAAAAAAAAAEBAAAAAgD/AAAA/wAAAAAAAQD/AAEA6+0CAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AP///wAAAAABAAAAAP///wABAAEA/////wD/AAD/////////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAeH39gAAAQAAAQEAAP8BAAAAAAAAAAEAAAAAAAAAAf8AAAH/AAABAAAAAf8AAAEAAAEA/wD/AQAA/wD/AAEBAAAAAf8A/wH+AAEBAAAAAAAAAAH/AAEBAQAAAQAAAAEAAAAA/wAAAP8AAAH/AAABAAAAAQAAAAEAAAABAAD/AAAAAAEAAAABAAAAAQAAAAAAAP8B/wAAAQAA/wD/AAACAAD/9/0A+8/xAO/28wD8/f0AAAEAAP8AAAD/AAAAAAEAAAAAAAD/AQAA/gAAAP8BAAD/AQAAAAIAAAABAAD/AAAAAAIAAAACAAD/AQEA/wAAAAAAAAD//wAA//8AAP8AAAD//wEA//8AAP//AAAAAAAA//8BAAAAAQD/AAEAAAAAAP//AQD//wAA/wABAP//AQD/AAAAAP8AAP8AAAD/AAEA/wABAP7/AAD/AAEA6+4CAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAOH3+P/1/f0AAAEAAAEAAAAAAf8AAAEAAAAB/wAAAf8AAQEAAAAB/wAAAP8AAAD/AP8BAAABAQAAAQEAAAAA/wABAQAAAQEAAAAAAAAAAP8AAAAAAAAB/wAAAAAAAAD/AAABAAAAAf8AAAEAAAABAAABAQAAAQIAAAEBAAAAAQAAAQIAAAEC/wAAAf8AAAL/AAEBAAAAAP8AAQIAAAAB/wAAAQAA8Nv2APHi9QD/AgAA/wEAAP8C/wD/AQAAAAIBAP8BAAAAAQAAAAIAAAABAAAAAgAAAAEAAP8CAAAAAQAA/wEAAAABAAAAAAAA/wABAP8AAQAAAQEAAAABAAAAAQD/AAAAAAEBAP8AAQD/AAAAAAEAAP8AAAAAAAAA/wABAAAAAAD/AAEA/wAAAAABAAAAAAEA/wABAAAAAAAAAAEA//8AAAAAAQD19gEA4uMDAAEAAQH/AP8A/wD///8A/wAAAAAB/wD//wAAAAAAAQAB/wD/AAD/AAABAAEBAAAAAQEAAQH///8A////AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAAAA//////8A/wD/AP8A/wD/AAD/AP//AP8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAAB/wD/AAABAAEA/wAAAP8AAAEBAQHY9fUA/wD/AAAA/wAAAP8AAAD/AAAB/wABAQAA/wH/AAEAAAABAAAAAAEAAAEBAAAAAf8AAAIAAAABAAAAAf8AAAAAAAAA/wAAAf8AAAH/AAABAAAAAf8AAAEAAAAB/wAAAAAAAQEAAAABAAD/AQAA/wEAAAABAAABAgAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAEAAAABAAAAAgAA7O78APrS/QAAAQAAAAEAAAABAQAAAgAA/gD/AAADAAAAAQAAAAIAAP8BAAD/AQAA/gEAAP8BAAD/AgAAAAEAAP8BAAD/AAEAAP8AAP//AAD/AAEA/v8BAAAAAAAAAAEA//8AAP8AAAAAAAEA/wABAP//AAD/AAEAAAAAAP8AAQAAAAAA//8BAP8AAQD/AAEA//8AAP8AAAAAAAAAAAABAAABAQDO0gMA/wD/AP////8BAAEAAP8AAAEAAQD/AP8AAP8AAAAAAAD///8AAAAAAAABAAD///8AAAAAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/AP8A/wAAAAD/AP8AAAD/AP8AAAAB////AP///wC57O4AAQEAAAABAAAAAQAAAAEAAAABAAD/AP8AAAD/AP8A/wD/AQAAAAH/AAAB/wAAAAAAAAD/AAAB/wAAAP8AAAD/AAAB/wAAAQAAAAEAAAABAAAAAQAAAAH/AAAA/wAAAf8A/wEAAAACAAABAQAAAAH/AAACAAAAAf8AAAD/AAABAAAAAgAAAAEAAP8AAAAAAQAAAAIAAAEBAAD39/4A+/z/AP3p/wD96f4A/wH/AP8A/wD/AAAAAAEAAP//AAD/AQAAAAEAAAACAAD/AQAAAAEAAAABAAD/AQAA/wEAAP8B/wD/AAAA/gAAAAABAAD//wAAAAEBAP//AQD/AAAAAAABAAAAAQD+/wAA//8AAAAAAQAAAAAA/wABAAAAAQD/AAEAAAAAAP8AAQD//wAA/wAAAP8AAQD/AAAAAAAAAP8AAADM0QX/AP8AAAAAAAH///8AAAAAAf///wAA/wAAAAAAAf////8A/wAAAP8AAAD/AAEAAAAAAP8AAAD/AP////8AAP8A//8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD+//4A/wD//wD/AAAAAAAAAP8AAP8A//8A/wAAAAAAAAAAAAD/AP//AP8AAP//////AP8AAAEAAP8A/wD/////AAEAAAAAAADX9PUA6/r7AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAAAAAEBAAAAAP8AAQAAAP8A/wAAAf8AAAEAAAAAAAAAAAAAAAH/AAABAAAAAQAAAQEAAAAA/wAAAf8AAQAAAAABAAAAAP8AAQIAAAAB/wAAAf8AAQAAAAEB/wABAQAAAAEAAP8AAAAAAAAAAAEAAAEBAAABAQAAAAAAAAAB/wDw8/0A/wEAAP4BAAD85P8A/wAAAAABAAD/AgAA/wEAAAACAAD/AQAA/wEAAP8AAAAAAAAAAAAAAP8BAAAAAQAAAAEAAAABAAAA/wAAAAABAP//AAAAAAAA/wAAAP8BAQAAAAIAAAAAAAAAAQAAAAEA/wAAAP8AAAD/AAAA//8AAAAAAAAAAAAA/wABAAD/AAD/AQEAAAEBAP//AAD//wAA/wAAAOzsAQDP0QUBAAAAAP8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAH/AP//AAAAAQD/AAAAAAABAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAQABAQAAAAAAAAAA/////wEAAQEAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQEBAAEB////AAAAAAABAQEBAP8AAAAAAAAAAAAApOXo/wAB/wAAAQAAAAD/AAAA/wABAAAAAAEAAP8BAAABAgAAAAH/AAAB/wAAAf8AAAD/AP8A/wAAAf8AAAEAAAABAAAAAQAA/wD/AAAB/wAAAP8A/wH/AAAA/wAAAQAAAAIGAAEBAAAAAgAAAAIAAP8BAAD/AQAAAAIAAAIDAAABAgAAAAEAAAECAAAAAv8AAQIAAAABAAD29/4AAAEAAAECAAD94/4AAQIBAAACAAAAAQAAAAEAAP8BAAAAAQAAAAAAAAACAAAAAQAA/wIAAAABAAAAAQAA/wEAAAEFBQAAAAIAAAABAP8AAQD/AAAA//8AAAAAAAD//wAA/wABAP8AAAAAAAEAAAABAAAAAQD/AAEAAQEBAP//AAD/AAEAAAABAP8AAQD//wAAAP8BAAEBAQAAAQEA/wABAK+2BgAAAAAAAAAAAAEAAQEBAAEBAAAAAQAAAAAAAAAAAAAAAP8A/wAAAQAAAQABAAAAAAAAAAD/AAAAAAAAAAAAAAAA/////wAAAAAAAAAA/wD/AQA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AAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8AAAAAAAD/AAAAAQABAQABAf////8A/wAA/wD//wAAAAA0K0EAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAQAA/wAAAAAAAQD///8AAAAAAP8AAAD/AAAA/gAAAP8BAAD///8A/wAAAAAAAAAA//8A//8AAP///wD/AAAA/wAAAP8AAAD1+vwA/wEBAP8AAAD/AQEA/wEBAP8BAQD/AQEA/gAAAP8BAQD/AAAA/wAAAP8AAQD/AAEA/wEBAA8KDAD/AP8A/wD/AAQODAD/AAAAAAEAAP8AAAD/Af8A/wEAAP8B/wD/AQAAAAEAAP8B/wD+Af8A/wEAAP8B/wD/AQAA+vj7AAAA/gABAP8A////AAAA/wAAAP4AAAAAAP8A/wAAAP8AAAD+AAAA/wD/AP4AAAD+AAAA/gAAAAAAAAD+AAAA/wD///4AAAD/AAAA/wAA//4AAQD/AP8A/wABAP8AHkc0AQABAAAAAAAAAAAAAAAAAAH/AP8AAP8AAP///wAA/wD//wD/AAD/AAABAQEBAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/wD//wD/AAAAAAAAAQABAf8A//8AAAD/////AP8A/wAAAAAAAP8AAAAAAAAA/wAAAAAAAAEBAQEBAQEAAAAAACEbKQAMCxAA/wAAAP8AAAD//wAA//8AAP8AAAD+/wAAAP8AAP8AAAAAAAAAAAAAAAABAQD/AAAAAAAAAAAAAAAAAQEAAAAAAP4AAAAAAQEAAAEBAP8AAAAAAAAAAAEBAP8AAAAAAAEA/wAAAAAAAQAAAQEAAAAAAAABAQAAAAAA/wAAAP8AAAD/AQAA/wEAAP4BAAD/AQAA/wAAABALDQAAAQAAAAD/AAQVEwAAAf8A/wD/AAAB/wAAAAAAAAD/AAAA/wAAAAAAAAD/AAAA/wAAAf8AAAH/AAABAAAAAf8AAAH/AAEA/wAAAP8AAQH/AAAA/gAAAAAAAAD+AAEA/wD/AP4AAAAAAAAA/wABAP4AAAD+AAAA/wAAAP4AAAD/AAAA/wAAAAAAAAD/AAAB/gAAAf8A/wD/AAAA/wD/AP4ABxAMAA0fFwD/////////AAD/AAD///8AAAAA/wEBAQH/AP8AAQEBAf///wD///8AAP8AAAD/AAAAAAABAAAAAP8A/wAA/wAA/////wD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/AP8A/wD/AP///wD/AP/////+//4AAAAAACcgMQAAAAAA/wAAAAAAAAAAAQAAAAEAAP//AAAAAQAA/wAAAAABAAD/AAEA/wAAAAD/AAAAAAEA/wABAP8AAAD+AAAA/gAAAAAAAAD/AAAAAAAAAAABAQD/AQEA////AAABAAD/AQAA/wECAP8BAAD/AAAA/wEBAP8AAAD/AQEAAAEBAP8BAAAAAQAAAAEBAAABAAD/AAEAAAAAAAwICgAMCAkAAggIAAQODAAAAf8AAAD/AAABAAAAAQAAAAEAAAABAQAAAf8AAAEAAAACAAAAAQAAAAEAAAAA/wAAAf8AAAEAAP8A/wD/AP4AAAD+AAAA/wD/AP4AAAD/AAAA/wABAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAQH+AAEA/wAA//8AAQD/AAAA/wAAAAAAAQD/ABk4KAABAQEBAAAAAP8A/wABAAEA/wD/Af////8BAAEB////AAABAAH/AP8A/wD/AP8A/wAAAAAA/////wAAAAAAAQAAAQEBAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD/////AAAAAQEAAQH/////AAEAAQAAAAAAAAABAAAAAAD/AAAAAQAAAAAAARkXIAD/AAAAAQAAAP8AAAAAAAAAAQAAAAABAAAAAAAA/wEAAAAAAAABAQAA/wABAAD//wAAAAAAAQAAAP8AAQABAP8AAAAAAAAAAAD/AAAAAP//AAEBAQAA//8A/wEAAAAAAAAAAAEAAAAAAP8AAQAAAAAAAAAAAAAA/wAAAAAAAAABAAEAAAD/AAEAAP//AAEBAQD/AAAAAQECAP///wAZERYA5AkAAAAAAAAAAAEAAAH/AAAAAAAAAAAAAAAAAAAA/gAAAP8AAAEAAAAAAAAAAP8AAAD/AAABAAAAAAAAAAAAAAEB/wD///8AAAD/AAAA/wAAAP4A/wD/AAAA/wABAP8AAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP4AAAD/AAABAAAAAP4A/wD/AAAAAAAAAf8A/wD/AAAA/gABAQAA///+AA4gFQD///8AAAAAAAAAAAD/AP8AAQABAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AP8AAP8AAQABAAD//v//AAEAAQABAAH/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAA/wAA////AP8A/wAA/wABAP8AAP////8AAAABAP8AAP///wAAAAAAAAAAAAAAAAD/////FBAZAAYFCAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD///8AAAAAAP8AAAD/AP8A////AP8BAQAAAQAA/wAAAAAA/wD/AAAA/wAAAP4AAAAAAAAAAAEBAP4A/wD/AAAAAAABAP8AAAD+AAAA/wEBAP8BAAD/AP8A/wAAAP8AAQD/AAEA/wD/AP4AAQD/AP8AAAEBAP4AAAAAAQEA/gD/AP8BAAAVHBsAGB8eAP8B/wD/Af4A/wEAAP8B/wD/Af8AAAEAAP8BAAD/AQAA/wH/AP8AAAAAAQEA/wEAAP8A/wAAAQAAAAEAAAAA/gABAf8A/wD/AP8A/gABAP8AAQD/AAEA/wD/AP8AAAD+AAAAAAAAAAAAAAD/AAAA/wAAAf8AAAEAAAD//gAAAP8AAAD/AP8A/QAAAP8AAAD/AAEAAAAAAP4AAAD/AAMHBQALGBEAAAAAAAD/AP8A/wAA/wD/AP///wD/AP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAP8AAAD/AP8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAA/wAA/v/+AP////8AAQAA/wD/AAAAAAD/AP8AAAEAAAABAAEAAQAA/wD//wAAAAD///8AAP8AAAAAAAABAQEBDAwQAP4A/wAAAQAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEA/wD/AAD//wD/AAAAAAABAP8A/wD/AAEA/wD/AP8AAAD/AP8A/wAAAAAA/wD/AAAA/gAAAAAAAQD/AAAA/wD/AP//AAD/AQEA/wAAAP4AAAD/AQIA/wEAAP8BAQD/AQAA/wEBAAABAQD/AQIA/gEAAP8BAgD/AQAA/wABAAMHBwAMHBYAIxUWAAcFBQAAAQEAAAH/AAABAAAAAQAA/wH+AAABAAAAAQAAAAAAAAAB/wAAAAAAAAAAAAECAAD/AP8A/wD/AP8A/wAAAP8AAAD+AAAA/wAAAAAAAAD/AAAA/wABAP8A/wD/AAAA/gD/AP4A/wD+AP8A/wAAAAAAAAD+AAAB/wAAAP8AAAD+AAEA/wAAAP8AAAD+AP8A/gD///8AAQH/AAAB/wAKFxAA////AAABAAEAAQD/AP8A/wABAAD/////AP8AAAD/AAAA/wD/AP8A/////wAAAAAAAP8AAP////8AAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAQEBAAAAAAH/////AQABAAD/AAAAAAAAAP8AAAD/AAD///8AAAAAAQEAAQAAAAAA/wD///8A/wH///8ADAoQAAAAAQD//wAAAAEAAP8AAAD/AAAA/wAAAP//AAAAAAAA/wAAAP8BAQD/AAEA/wEAAAAAAQD///8A/wABAAABAAAAAAEAAAAAAP8AAQD/AAAAAAAAAP8AAAAAAQEA//8AAAABAAAAAQIA/wEBAAAAAQAAAQEAAAEDAP8AAQAAAAEA/wAAAP8AAQD/AAEAAAABAP8AAAD/AAIAAgcGABIqHwACCAYABAMDACwYHAAEAwIAAAAAAAAA/wAAAP8AAAEAAAAB/wD/AP8AAAEAAP8A/wD/AP4AAAEAAP8A/wAAAQAAAAH/AAD//wAAAP8AAQD/AAAA/wD/AP4AAAD/AAAA/gD/AP4AAQD/AAAA/wAAAP4AAQD/AAIB/wAA//4AAQD/AAEAAAAAAP8AAAEAAAAA/wD/AP4AAAD/AAAA/wAAAP4A/wD+AAD//gD/AP4AAQABAP///wAA/wABAAAAAf///wAAAAAB//////8A/wD///8A/wD/AQEAAQAAAAAA/////wAAAAH/AP8A/wD/AP8A/wAAAAD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP8AAAAABgYIAP8AAAD/AAAA/v8AAAAAAAD/AAAA/wAAAP8AAAD/AAAA//8AAP8A/wAA//8A////AP///wD/AAAAAAAAAP//AAD/AAAA/wAAAAAAAQAAAQEA/wD/AP8A/wD+//8A/wAAAP//AAD/AP8A/wAAAP8BAQD/AAAA/wD+AP8BAAD+AQEAAAACAP8BAAD/AQAA/wAAAAABAAAABAIAESgdAAIHBgD/AQAA/wEBAAYGBQAqGBwAAwMCAP8BAAD/Af8A/wAAAP8AAAAAAgAAAAH/AAECAAD/AgAAAAH/AAABAAAAAQAA/wEAAAAA/gD/AP4AAAD/AAAA/gAAAP4A/wD+AP8A/wAAAP8AAAD/AP8A/gAAAP8A/wD/AP8A/gD/Af8A/gD+AP4A/QAAAP4A///+AAAAAAABAP8AAAH/AAAA/gAAAf8AAAD/AAAB/wAIEAsA/wD/AAAAAAD/AP8A/wD/AAAAAAAAAAD//wD/AAD/AP8AAQAAAQABAP8A/wD///8AAAEAAQEBAQABAAEAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAQAAAP8AAQEBAQH/////AAAAAAAAAAAAAAAA//7/AAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAABAAEAAAAA8/TwAAD/AAAAAAAAAAAAAP8AAAD//wAAAP//AAABAAD+//8AAAEBAP8AAAD/AAEAAAEAAP8AAAAAAAAAAAEAAP8AAAAAAAAA/wEAAP8A/wD+//4A/wABAAAAAQAAAQAAAAEBAAABAQD/AAAA/wABAAABAQD/AAAA/wECAP8AAAD/AQAA/wIAAP8BAAD/AAAA/wEBAAEFAwATKyAAAwoJAP8BAQD/AAEA/wEBAP8AAQAKBwkAKxkfAAQCAQAAAQAAAAH/AAAB/wAAAP8A/wD/AP8A/wAAAP8A/wD/AP8A/wD/AP4AAQEAAAAA/wABAP8A/wD+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAEBAAAAAP4AAAD/AP///wAAAP4AAQD/AAEA/wD/AP8AAAD/AP8A/QAAAP8A///+AAAB/wD///4AAP//AAAA/gD48PUAAAAAAAD/AAAAAAAAAQEBAAD/AP8AAAABAQEBAQAAAAH///8A/wD/AAAAAAABAAEAAP8AAP7+/v//AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAP//////////AAEAAAAAAAABAAEBAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAA/////wAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AP8BAQD/AAAA/wAAAP8BAAAAAQAAAAEBAP//AAAAAAEA/wAAAP//AAAAAQAA//8AAAAAAAD/AAAA//8AAAAAAAD+AAAAAP8AAP8AAAAAAAEAAP//AP///wAAAAAA/wD/AP8AAAD/AQEA/wH/AP8AAAD/AQEA/wAAAP8BAQD/AAAA/wAAAAAAAQD/AQAAAQUDABIpIAAECgkAAAEAAAABAAD/AQAA/wD/AP8BAAD/AQEACgcJACoaIQAEAgMAAAD/AAAA/wAAAQAAAAD/AAABAAAAAf8AAAEAAAAB/wAAAQAA/wD+AAAA/wD///4AAP//AAEAAAABAP8AAAD+AAAA/gAAAP8AAAD+AP///gABAQAAAAH/AAAB/gAAAP8A/wD/AP8A/wABAP8AAQD/AAEA/wAAAf4AAAD+AAD//wABAAAAAAH+AAAA/wD8+Pr/AAAAAAABAAAA/wAA//7//wABAAH/////AAAAAAABAAABAAEBAP8A/wD/AAD/AP8AAAEAAAEAAQEA/wD/AP8AAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQIB8AAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAQAA////AP8A/wD///8AAAAAAf///wD//////wD/AP8A/wD/////5+nf/wAAAAD/AAEAAAABAP//AAD/AAAA/wAAAAABAAAAAQAA//8AAAABAQD/AAAAAAEBAP8AAQAAAQAA/wAAAP//AAAAAAAA/v8AAP///wD/AQAA/wEBAAABAQD//wAAAAAAAP///wAAAQAA/wEBAP8BAAD/AAAA/wEAAP8BAAAAAQEAAAEBAP4AAAABBAMAEiogAAQLCAAAAQAA/wEBAP8BAQD/AQEAAAEBAP8BAQD/AQAA/gEAAAkHCQApGiEAAwMDAAABAAD/AP8AAAEAAAAB/wAAAQEAAAH/AP8BAAAAAf8AAAEAAAAB/gAAAf8AAAEAAP8A/gD/AP8AAAAAAAAA/wAAAP8A/wD/AAAA/wD///8AAQD+AAEA/wABAP8AAAD/AAEA/wAAAP8AAAD/AP8A/wAA//8AAQEAAAAB/wAAAP4AAAD/AAAA/wD58PUB////AP///wAAAAAA/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAABAQABAAAAAAAAAAAB8/XvAfr7+AAA//8A/wD/AAAAAQD/AAAA/wAAAP8AAAD//wAAAAAAAP8A/wD/AAAA/v8AAP8A/wD/AAEAAAAAAP8AAAAAAAAAAAEAAAABAQD//gAA/wAAAP8AAAD/AAAA//8AAAAAAQD+AAAAAAABAP8AAQD/AQEA//8AAAAAAQD/AAEA/wAAAAIEAwAUKiEABQoJAAAAAgD/AQEAAAEBAP8AAQAAAAEA/wABAAAAAAAAAAEAAAABAAAAAAAKBgoAKhkkAAMDAgABAP8AAAEAAAAAAAAAAP4AAAD/AAEBAAAAAQAAAAEAAAAA/wAAAP8AAAD+AAAA/gAAAP4AAAD+AAEB/wAAAP4AAAH/AAAB/wAAAf8AAAD/AP8A/wD/AP8AAQD/AP8A/gAAAP4AAAD+AAEA/wD/AP8AAP//AAD//wAAAP8AAAD/APz4+gD15/AAAAAAAAAAAAD/AP//AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAQABAN/i1gD/AAAAAAABAP8AAAAAAAAA/wAAAP8AAAAAAAAA/wAAAAD/AQD/AAAAAAAAAAAAAQD///8A/wAAAAABAAD/AAAAAP8AAP8AAAD/AAAA/wAAAP8AAAAAAQEAAAEAAP8A/wAAAAIAAAEBAP8AAQD/AAAAAAICAAAAAQD/AAAAAAQDABMrIAAFCwkAAAEBAAACAQD/AAEA/wABAP8BAQAAAQEA/wEBAP8BAgD/AQEA/wEAAP8BAgD/AQAACQcKACoZJgADAwMA/wD/AP8A/wD/AAAA/wEAAP8A/wD/AP8A/wD/AAD//wAA//8AAAD/AAAA/wAAAQAAAAH/AP8A/wAAAQAAAQD/AAAA/wAAAP4A/wD/AAEA/wAAAP8AAAD+AAEA/wAAAP8AAAD/AAAB/wABAP4AAAH+AAAA/gAAAP8AAAD/AO/Y5QAAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA////AAD/AAAA/wAAAAAAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////ANrfzQAAAQEA/wAAAAD//wD/AAAA//8AAP8AAAD/AQAAAAAAAP8AAAAA/wAA/wAAAP4A/wAAAAEA/wAAAP8AAAD//wAA/wAAAAD/AAAAAQAAAAAAAP///wD///8A//8AAP8AAQD/AQAA/gAAAP8BAAAAAQEA/wAAAP8BAAABBQMAFCshAAQLCQD/AQEA/wIBAP4AAAD/AQAA/wEBAAABAAD/AQEAAAEBAAABAAAAAQAA/wEBAAABAQAAAgIA/wAAAAgHCgApGicABAMDAAABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAB/wAAAf4AAAD+AAAA/wAA//4AAAD/AAAA/wAAAP8A/wD+AAAA/gAAAP8AAAD/AP8A/wABAP4A/wD/AP8A/wAAAP8AAAD/AAD//wAAAP8AAP//AN6dIIAAACAASURBVAAA/wAAAf8AAAD/AOrO4QD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAOfp3wDm6d4AAAAAAP8BAQAAAAEAAAEBAP//AAD//wAA/wEAAAAAAAD/AAAAAAAAAAAAAQD+AAAAAAABAP8AAAAAAQAAAAEAAP8BAAAAAAAA//8AAAABAQD/AQEA/wAAAAABAAAAAAEA/wABAAAAAQD/AAEAAAEBAAAEAwAVKyEABQsKAAABAQD/AQAA/gAAAAABAQAAAQEAAAEAAP8BAgD+AQAA/wEAAP8CAgD/AQIA/wEBAP8BAQD+AAAA/wIBAP8BAQAIBwsAKBopAAMDAwD/Af8AAAH/AAAAAAD/Af8AAAD/AAAA/gAAAP8AAAD/AAAA/wABAf8AAAD/AAEA/wAAAP4AAQD/AAAA/wAAAP8AAAD+AAAA/gD/AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gD/AP8AAAD/AAAB/wAAAP4A+e/0APDf6wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/gD+8P///wD///8AAAAAAAD/AAAAAAAA/////////wD/AP8A////AAAAAAD/////AAAAAAAAAP//AP8A/wD/AP////8AAAAB////AP8A/wDN0r3/AAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAA//8AAP8BAQAAAAAAAAEAAAAAAAAAAP8A/wAAAAAAAQAAAAEA/wABAP//AAD/AAAAAAEAAP8AAAAAAAAA/wEBAP//AAD/AQAAAAEAAP8BAAD/AQAAAQQCABQsIQAECwkA/wEAAP4BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAAAAAQEA/wEBAP8AAAD/AQAAAAEBAP8BAAD/AAEAAAEBAP8BAQAAAQEACQcLACgZKgADAwQA/wEAAP8B/wAAAQAA/wEAAAAA/wAAAP8AAAD/AAAB/wD///8AAQD/AP8A/gAAAP8A/wD/AAAA/wAAAP8AAQD/AAEAAAABAP8AAQD/AAE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AAAAAAAD/AAAAAQABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAADq1sYA/fr3AAAAAAAAAAAAAAAAAQD/AAD/AP8AAAAAAPXn7wH15u//AAEAAQAAAAAAAAD/////AAEBAQEAAAABAAAAAP////8BAQEA////AQAAAAH/////AQEBAQD/AAAAAQAAAP8A//8B/wEAAAABAAAAAP///wAAAAD/AAAAAQAAAAAAAAAB/////wABAAEAAAAA/wD/AAAAAAAAAAD/AAAAAf///wABAQEAAP4AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAA5dC7AQABAQAAAQIA/wEBAP8BAAD/AQEAAAEBAP4BAAD/AAAA/wEBAAABAQD/AQEA/wEBAAABAgAAAgIA/wAAAAABAQD/AQEAAAECAP8BAAD+AAAA/wEBAP4BAAD/AQAA/gEBAAABAQAAAQEA/wEAAP4AAADiybIAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A+PHr/+bPugD+AQAA/wEAAAABAQAAAQAA/wEBAP8BAQAAAgIA/wEBAP8BAAD/AQEA/wEAAP4AAAD/AQEA/wIBAP8BAAD/AQAA/wEBAAAAAQAAAgEAAAAAAAABAgAAAAEAAAAAAP8BAQD/AQAAAAECAOPJsgD48ewAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAeLHsQD58e0A/wACAP8AAgD/AAEA/wAAAAAAAQD/AAAAAAABAP8AAgD/AAEAAAABAAABAgD/AAAAAAABAP4AAAAAAAIA/wAAAP8BAQD/AAEA/wEBAP4A/wD/AQEA/wEBAP8AAAD/AAEA+PHsAOLHsP//AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmPBFVAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//mJTioQsvNoYAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Reminders.png b/arma/client/addons/phone/ui/_site/images/dark/Reminders.png new file mode 100644 index 0000000..aa74405 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Reminders.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Safari.png b/arma/client/addons/phone/ui/_site/images/dark/Safari.png new file mode 100644 index 0000000..f880545 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Safari.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Safari.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Safari.png.b64 new file mode 100644 index 0000000..815ac30 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Safari.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEGEyAIAuwAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAA/hQaAP4ICwD9FBoAAAoNAP8JDQD+CgwAAP8C/wAB/gEAAAAAAfbzAAH39AAE7ecAAAAAAALj2gAC9vMAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAA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AAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB///////////+CQwA90plAPCBsQD2SWUA/wkNAAD//wAA/wAAAP8AAAEAAQAA/wAAAP4AAAD/AAAqCgAAxzQFACwLAQAA/gAA8vwAAPL8/wAqCgEA//7/AAD/AADj+QAADwMAAAH/AQAA/wAAAAAAAAAAAQAA/wAAAP8AAA8DAQDj+AAAAf8AAAD/AAArCwEA8vwAAPL7AAAA/v8AOA0AAMc0BQAdBgAAAP8AAAD+AAAB/wAAAAAAAP/+/wAA/wAAAP8AAP0RGQD0XH8A8IKyAPk3TAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIAAAAF////8A/////wAAAAAAAAD/AAAAAAEBAQAAAAABAAAAAAAAAAAAAAAA////AQD/AP////8A/////wD/AAD//////wD/AAAAAAD///8AAAAAAAD/AAAAAAAA//////////8BAAEA/wD/AAAAAAEA/wD/AAAAAfwlMwHyeKUA9klmAP4IDQAA/wAAAP8AAAH/AQAA/wAAAP8AABwGAADWOQUAOA4AAAD/AADV8/8A8vz/AEYSAQABAAEAAP4AANX0AAAdCAIAAP8AAAH/AADy+/8AHAcAAAD+AAAA/gAAAAAAAAD/AAAB/wAAAP8AABwHAQDy/AAA//8AAAH/AAArCgIA1fT/AAD/AAAA/wAARxMCAOT4AADj9/8AAP8AACsLAgDHNQUAKwkBAAD/AAABAAAAAP//AAD/AAAA/wAA/REZAPRcfwDwgrMA+ThNAP///wD///8AAP8AAAAAAAD//////wD/AP////8BAAEA////AAAAAAAAAAAAAQEBAAD/AAAAAAAAAQABAP///wABAQEB/////wAAAAD/////AAAA/////wD///8A////AP//////AP8A//7///8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UAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFlABAQGuAAEAAQAAAAAA/wAAAAAA/wABAAEAAAAA////AAAAAP8BAAEB/wD/AAEBAQD///8AAAAA/wEBAQEA/wAA/wD//wEBAQEA/wAA/wD/AAAAAP8BAQEB/////wIBAgH/AP8A/////wEBAQEAAAAAAAAAAP////8BAQEBAAAAAP///wABAQEAAyFRAAMhUQACFjYAAQECAAAAAAD+/v4AAgICAP///wAAAAAAAAD/AAAAAQAAAAAAAAD/AA4JAgDz+AAA////AGI+BgDk7/8AutL6AAABAQB+UAgAAAAAAIKw+AD///8ARy4GACoaAgCQufkAAAD/AAAAAQD///8AAQAAAAABAQAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP7qygD81JMA/urKAP///wAAAAD/AQEBAQAAAAAAAAAA////AAEBAQD///8AAQABAAABAAAAAAAAAAAAAAD/AAAAAQAA/////wAAAAAAAAAAAQEBAQD/AP8AAQABAAAAAP///wABAQEAAAAAAAAAAAD/////AQEBAQAAAAD///8AAQEBAAD/AAD/AP8AAAAA/wIBAmHo6OihAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFxWPAgECcP///wABAAEA/wD/AAEAAQAAAQAA////AAEBAQAA/wAAAAEAAP////8AAAABAAAAAAEBAQD/////AQABAf8A/wAAAAAAAQEBAP///wABAAEAAAAAAP8A//8BAQEB////AAAAAP8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAAAAAAAAAAABCxsABCFSAAIhUQACDBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2rwAAADD/AP//AQEBAQD/AAD/AP//AQEBAf////8BAQEBAAAAAP///wABAQEAAAAAAAAAAAD/////AQEBAf///wABAQEA/////wAAAAEBAAH//wD/AQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8BAQEB////AAEBAQAAAAAA////AAAAAAABAQEAAAAAAP////8AAAAAAAAAAQEAAQD/AP8AAAAAAAEBAQAAAAAAAAAAAP////8BAQEBAP8AAAABAAD///8AAAAAAAAAAAAAAAD/AQEBAf////8AAAABAAAAAAAAAP8AAAABAAAA/wEBAQH///8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQABAP8A/wAAAAAAAAAA/wEBAQH///8AAQEBAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQAAAAAAAAAAAP///wABAQHQCgkKQeDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAelJ1GAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//sY2iEf76skQAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Settings.png b/arma/client/addons/phone/ui/_site/images/dark/Settings.png new file mode 100644 index 0000000..1e52fae Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Settings.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Settings.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Settings.png.b64 new file mode 100644 index 0000000..d6676dd --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Settings.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEIIu9VL1gAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAA/P38AP79/gD9/f0A/v7+AP7+/gD+/v4AAAAA/wAAAAEAAAAAAgICAAICAgAEBAQAAAAAAAUFBQACAgIAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAA/v7+APr6+gD7+/sA+vr6APv7+wD8/PwA/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIABAQEAAQEBAAHBwcABgYGAAcHBwAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8fAP8A/wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAAAP////8BAQEB/////wAAAAABAQEB/wD/AAEBAQH///8AAQEBAf////8AAQABAP8A/wAAAAH/////AAAAAQEBAQD///8AAQEBAQAAAAD/AP8AAQABAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP/+/wAAAAAA/f39APb29gD39/cA+/v7AP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A+vr6APr6+gD29vYAAAAAAAAAAAAHBwcACgoKAAkJCQADBAP/AQABAQAAAAAAAAAA/////wEBAQEAAAAA/////wABAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQEAAQAAAAAAAAAAAP8AAAABAP8AAQABAAD+/v4f8PDwvwAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB/v7+APLy8gHv7+8A8fHxAPj4+AD9/f0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0A+Pj4APPz8wD29fYB/f79AAQEBAADAwMBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf/v7+oAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAEBAQD//////wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAA/wAAAQEBAPj4+ADx8vEA+fj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgZAAAAAADo6OcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcACwsL/wsLCwEAAAD/AAEAAQD/AAAAAAD/AAAAAQAAAAD/////AQEBAQEBAQD///8AAQEBAAAAAAD+/v7/AQEBAAAAAAAAAQABAQABAP7+/v8BAQEBAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAD/AAACAgJR0NDQsAAAAAAAAZdhIQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD///+AAAAAAAAAAAEAAAABAQEBAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAP8A//8AAAAAAAAAAf8A//8AAAD/////AP///wAAAAAAAAAA/wAAAAAAAAAAAAAAAP///wAAAAABAQABAQAAAAH/////AAAAAAAAAAEAAAABAAAAAP/+/wDy8vIA5OTkAOrq6gD5+PkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDQAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+foQAAAAAAAAAAAAAAAAAAAAAAPT0+AD4+PgABAQEAAAAAAAAAAAAAAAAAh4eJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5+fkA7u7uAefn5wD19fUBAP8AAAAAAAAAAAABAAAA/wAAAAABAQEBAAAAAP///wAAAAAA/////////wABAQEBAAAAAQAAAAEA/wAA////AAEBAQEAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAH//////////wAAAP8AAAAAAP8AAAAAAAD+/v6eQEBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB///////////+/v4A8fHxAObm5gDx8fEA/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD09PgBWVlgAAAAAAAAAAAAAAAAAAAAAACQkJgAMDAwAAAAAAAAAAAAAAAAAGBgYABcXGQD///8AAAAAAAAAAAAZGRkAPDw+AAAAAAAAAAAAAAAAAAAAAABJSUsASkpLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/ADu7u4A5+fnAPX19QD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIAAAAF////8A/////wAAAAAAAAD/AAAAAAEBAQAAAAABAAAAAAAAAAAAAAAA////AQD/AP////8A/////wD/AAD//////wD/AAAAAAD///8AAAAAAAD/AAAAAAAA//////////8BAAEA/wD/AAAAAAEA/wD/AAAAAfn5+QHp6ekA8vLyAP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT4AAAAAAAAAAAAAAAAAAAAAAP///wA9PT0AAAAAAAAAAAAAAAAA////AAAAAAA9PT4AAAAAAAAAAAAAAAAAJSUmABkZGAAAAAAAAAAAAAAAAAAwMDIAAAAAAP///wAAAAAAAAAAAAAAAABWVlYA8/PyAAEBAQAAAAAAAAAAAAAAAAAwMDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8AO7u7gDo6OgA9fX1AP///wD///8AAP8AAAAAAAD//////wD/AP////8BAAEA////AAAAAAAAAAAAAQEBAAD/AAAAAAAAAQABAP///wABAQEB/////wAAAAD/////AAAA/////wD///8A////AP//////AP8A//7///8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JSwAAAAAAAAAAAP///wABAQEAMTExAAAAAAAZGRgAAAAAAP///wAkJCQAAAAAADExMQAAAAAA////AAAA/wD///8APT0+AAwMDQAAAAAA8/PzAAAAAAAAAAAAYWFiAAEBAQDb29oAAAAAAAAAAAAAAAAAkZGVALa2tAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39wDs7OwA+vr6AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQAB9PT0AOvr6wD8/PwAAAAAAAAAAAAAAAAAAAAAAD09PgAAAAAAAAAAAAEBAQD///8AwcHAABkZGgBiYmIAAAAAAAAAAAD19fQA5+fnAAwMDABVVVYAAAAAAAEBAQDn5+YAAAAAAD09PgD///8ADAwMAAEBAQAAAAAASUlMAGFhYwBWVlgAAAAAAAEBAQBKSkwAYWFjAElJSwAAAAAAAQEBAAAAAQAAAAAAVlZYAAAAAADn5+cAAQEBAAAAAABhYWQAGRkaANra2gD09PQAAAAAAAAAAABtbXAAGRkZAM7OzgAAAAAAAAAAAAAAAAAAAAAAMTEyAAAAAAAAAAAAAAAAAAAAAAD8/PwA6urqAfHx8QAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAA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+vrwA7e3sAB0dHQAWFhcAKioqAM/PzgD8/PwAAgICAAEBAQACAgIAAAAAAAAAAAAAAAAABwgHAAIBAv8AAQABAQEBAQAAAAH/AP8AAAEAAQAAAAABAAEAAP8AAP////8AAQABAAAAAAAAAAAAAAAA8vLygQAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAP8A//8AAAAAAQEBAQAAAAABAAEBAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAA/////wEBAQEDAwMAAwMDAP39/QAAAAAAAAAAAAAAAAAAAAAACQkKAGxsbwAREREAtLSyAL+/vQD39/cAAgICABISEwAcHB0A////AAAAAAAAAAAAAAAAAAAAAAARERIAWlpcAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAANvb2gDV1dQAAwMDAB8fHwDDw8EAw8PBADMzNAAAAAAAr6+tANfX1gBcXF4A19fWAJCQjQCYmJwAAQEBAJCQjQB6en0AKSkqAMPDwQDi4uAAKSkqABQUFADDw8IA19fWAB4eHwAAAAAAw8PBAB8fHwAeHiAA4uLgAPb29gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhMAY2NmABsbGwD///8AAAAAAP7+/gABAQEAJiYnABQUFQDu7u0AycnIAMjIxwBCQkQAQkJDAGtrbgCVlZEA9/f3AAEBAQABAQEA////AAAAAAAEBAQABAME/wABAAH/////AQEBAQABAAAB/wEBAP8A/wAAAAH/Af8AAAEAAAH/AQEA/wD/AAAAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQIB8AAAAAAAAAAAAP8AAAD/AAAAAAAA/wD/AAAAAAAAAQAA////AP8A/wD///8AAAAAAf///wD/////BgcGAAEBAQAAAAAAAAAAAAAAAAAAAAAAWVlcANHRzwB+fnsAtra0APj4+AADAwMADAwMAG9vcQATExMA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAD///8A////AP///wD///8A////ANvb2gABAQEAAAAAABUVFQCurq0AAAAAAAoKCgDr6+sAw8PBAPb29QAAAAAAw8PCAAAAAADs7OsA4eH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CAgAAAAAAAAAAAAEBAQABAQEAAAAAAAEBAQAAAAAAAQEBAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAEBAQADAwMAAwQDAAQDBAAAAQAAAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAD///8A//7/AP///wD+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQACAwIAAQEB/wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAD/AQIB/wMEAwAFBgUAAwQD/wMEAwACAgIAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAABAQEAAQIBAAMDAwAEBAQABAUEAAQEBP8CAgIAAQEBAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgICD4+Pi//f79HwEBAQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQD/////AQABAQABAAAAAAAA////AAAAAAABAAEA/wD/AAEBAQAA/wAAAAEAAAD/AAD/AP8AAQEBAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAA/////wEBAQEA/wAAAAEAAAD/AAAAAQAAAAAAAP////8A/wABAAAAAAAAAAD/AP8AAAAAAP///wABAAEA/wD/AAD/AAABAQH/AAEAAQEBAQAAAAAAAAAAAAEBAQD/////AQEBAQAAAAAAAAD/AAAAAf///wABAQEAAAAAAAAAAAD/////AQEBAf///wAAAAAAAQEBAAAAAAAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAAAAAD/////AQEBAQD///8AAQEBAAAAAAAAAAAA////AAEBAQD/////AQEBAf////8BAQEB////AAAAAAABAQEAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAQEB4AkICUHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAgEAAAEAAAECAQACAgIAAQEBAAICAgACAwIAAwMDAAIDAv8BAgEAAQEBAAEAAQAAAAAAAAAAAAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxzvmJAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//9Yl/hrd4aEcAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Wallet.png b/arma/client/addons/phone/ui/_site/images/dark/Wallet.png new file mode 100644 index 0000000..0d79280 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Wallet.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/Wallet.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/Wallet.png.b64 new file mode 100644 index 0000000..f9ee8e6 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/Wallet.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+oFFAEnOJ+VvTAAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRUVMBBAQDAKurqv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWVlcB////AAMDAgAAAAIA/wD/AKmop/9VVVcB/wD/AP///wAA/wAAAAAAAAEBAQAA/wAA//8AAP8A/gABAgEAAQEBAAEAAQADAwIAAAABAP7+/gD//v0A//8AAAABAAACAgIAAAAAAAAAAAD/AAEA////AKyrqf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaWlwBAAD/AKampf9aWlsBAQICAKWko/9YWFoB/Pz8AKysqv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk5QAQAAAAEA//8D/f7+Avz8/AL9/f0A///+AAEBAgEEBAMBAgICAAEBAQEAAAEAAQEAAAAAAQAAAAAAAAAAAAEBAAAAAAEAAAAAAP8AAAD///4AAP4AAP8A/wABAQAAAAABAAEAAAABAQEAAQEBAP7//wD+/v3/AAAAAAICAgABAQEA//8AAf8A/wD//v//////AP8A/wAA/wAAAAAAAAEBAQEAAAD/AQAAAP8AAAABAAAAAAEAAAEBAgABAQABAAAA///+/wD///8AAAAAAAABAAAAAAAAAAABAAAAAAABAQEA////AQEAAAD///8AAAEAAAEAAQAAAQAAAAAAAAAAAQABAQEAAQEAAf7+//8BAQAAAQEBAP//AAD///8A/v7+//39/f8AAP//BAQFAAcHBv4HBwf+Dg4O/g4ODv+MjIv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkpMAf39/QL///8DAQEBBgAAAAsAAAAN////C/39/Qj+/v0F/v7/AgAAAAMCAgEDAQEBAwAAAQEBAQAAAAABAAEBAQAAAAAAAAAAAAEBAAEAAAEAAAAA//8A/wD//v8B////AAAAAAEBAQD/AAAA/wAAAAEBAAEBAAEBAAAA///+/v/+AQAAAAECAgABAQAA//8AAf///wD//////////wAAAAD///8AAAAAAQICAQH/AAD/AQAA/gAAAf8A//8BAAEBAQEBAQEAAQABAP8A/wD///7//wAAAAD/AQABAAEAAAAAAAABAAAAAAABAQH/AP//AQAAAAL///8BAAAA/wABAQAAAAAAAAAAAQAAAAABAQEBAAAAAP///wABAQAAAAABAAAAAP/////+/////AAA//0AAAH9BQUE+gYFBvkFBgX2BwcH9QgICPT//v74/Pz9/AwNDP2ZmZj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtLSwH9/f8D/v7+CP39/Q/+/v4T////F////xn///8ZAAAAFP7+/hD+/v4K////BAAAAAQBAQAFAAAABAAAAAMAAAEAAAAAAAEBAQAAAAAAAAEAAQEAAQAAAAD/AAAA/////wH///8BAAAAAQAAAAEAAAD/AAD/////AAEBAQEBAQEBAP////7////+AQEB/wEBAQABAQEA////Af///wH/AAD+AP///gAAAAD///8AAAAAAgEBAQEAAQD/AQAA/QAAAf4A//8BAAEBAwAAAAEAAQABAP8A/gD///7/AAAAAAAAAQEAAAIAAQAAAAAA/wAAAQAAAAAAAQAAAf///wP/AAABAAAAAQAAAP8AAAD/AAAAAQAAAAEAAAACAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD8AAAA+gAAAPoCAgL7AwMC9wUEBfMDBAPuAwMD6QMDA+UBAAHnAwMD6woLCvAJCQn2BgUF/ZeYl/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU4B/f3+Av39/Qr9/fwU/P39H/38/Sb+/v4p/v7+I/7+/hj9/f0O/v7+Cf///wf+//4EAP8AAgAAAAIAAAABAAAAAgAAAAEAAAAAAAAAAAAAAAABAQEAAAAAAAABAAAAAAEAAAAAAAD//wAAAP8A//8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP8AAP8A////AAAAAAABAQABAAAAAAAAAf///wAAAP//AAAA////AAAAAAAAAAAAAQEBAAEAAAH/AAEA/wD/AP8AAAABAAAAAAAAAAH/AP8BAAAA/wEAAf8AAAAA/wD/AAD/AAEAAAAAAAAAAAAAAP8AAQABAQABAAD//wH/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQD+AAAA/gAAAP4BAAH9AgIB/QICA/sDAwL4AwMD9AMDA+sEAwTeBQUF1gYHB9kJCAjfDA0M6g8PD/QNDQz8hISE/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTgL9/f0H/v79E/v7/CT8/Ps0+/z8M/z7/CP8/PwX/v7+D////wj+/v4D////Af8A/wEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAD/AAAAAQAAAQABAP8AAAAAAAAAAQAAAP8A/wAAAAAAAP//AAAAAAD/AAAAAAABAAEAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAEAAAAAAAEAAAAAAAAAAAD/AP8AAP//AAAAAQAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAP8AAAAAAAAAAAAAAAAAAAEBAQAAAAAA/wD/AP//AAAAAP8AAP8AAAABAAAAAAAAAQABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAEAAQAA/wABAf8CAgEAAgEB/gECAvkEAgPyBAUF6wcHB+AKCgrQDAwLyw4NDdgMDQ3oDQ0N94aGhf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk5PA/z8/Q37+/sj/Pv7Pvr6+k75+flF+fn5MPr7+h38/PwP/v3+CP39/QX///8C////AgD/AAEA/wABAAAAAQAAAQEAAAABAAAAAQEAAAEAAAAB/wAAAQAA/wEAAAABAAAAAf8AAAEAAP8B/wD/AQD/AAEA/wABAAAAAf8A/wEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAH/AP8BAQAAAf8AAAH/AP8B/wD/Af///wEA/wABAAEAAQEAAQEAAAABAAD/AQAAAAEAAAABAAAAAf8AAAEAAP8BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB/wD/AQD/AAEAAAABAAAAAQAAAAEAAAABAAAAAf8A/wEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB/wAAAQD//wEA/wABAP8AAQD/AAEAAP8B/wD/Af///wL+/v4C/f7+A/39/gX8/f0L/Pz8Evz8/Br+/f0g/v7+HP///wr////7AQIB901NTfq/v77+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJSEoD/Pz9Evz8+y76+vtK+fn5TPn5+Tb6+vod+/z7DP79/gb///8C/wD/AQAAAQAAAP8AAAAAAAEAAQAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP//AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAEBAQAAAP8A/wAAAAEAAQAAAAEAAAAAAAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAP8AAAAAAAAAAAAAAAEAAAABAAAAAQAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAA/wH///8C/v7/BP39/Qf9/PwP/Pz8GP3+/Rr//wAOAgIC+wICAvNLS0v4vr6+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISQP8/P0U+/v7NPr6+036+vlH+Pn4Kvr6+hL9/P0G////AgAAAAABAAEAAAEAAAAAAQAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAD/AP8AAAAA/wAAAAAAAAAAAAABAAEAAAAAAAAAAAABAP8AAAABAAABAAAA//8A/wABAAAAAAAAAAAAAAAAAAEBAAAAAAEAAQAAAAD/AAAAAAAAAAAAAAAA/wD/AAAAAAAAAAEAAQAAAAAAAAEAAAD/AAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAAAAAAD/AP8AAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAP///wH+/f0D/P38CPz8/BL///8XAQEBDgEBAfv////wRkZG9sHBwf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZIAvz8/RL8/Psz+/v6TPn5+UP5+fki+/r7C/7+/gIAAAAAAAAAAAAAAAABAAEAAAEAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAEAAQAAAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAP8A/wAA/wAAAAAAAAABAAABAAEAAAEAAAAAAAAAAP8A/wAAAAAAAAAA/wAAAAAAAAEBAQAAAAAAAAABAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//wAA/v//Af39/QX9/fwN////FAEBAQoDAwP2BgYF7k5NTva8vLz+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFRUYB/f39Dfz8/C37+/pK+vr6Q/n5+iH7+/wJ////AQAAAAAAAQAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAEAAAEAAQAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQABAQAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAAAAAAAAP8A/wH8/f0E/f39C////w8DAwMFBgUF8QUFBexVVVX4tra2/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISEI/Pz8Ivv7+0b6+vpG+fn6Jfz8+wn+//8BAAAAAAEAAQAAAQAAAAAAAAD/AAAAAAAAAQAAAAABAQAAAAAAAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAEBAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAA//8AAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEAAQAAAAAAAQEAAP8AAAAAAAAA////AAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAA/wAAAQABAAABAAD/AP8AAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAAAAAAD/AP8AAAD///8A/fz8A/7+/goBAQENAgMD/QQFBOkCAgLtXFxc+7GxsQAAAAAAAAAAAAAAAAAAcgOsIAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENCRAP8/P0U/Pz8Nfv8+z76+/sk/Pz8Cv7//wEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA/wAAAAEA/wAAAAEAAAAAAAD/AAD/Af8AAP8AAAAAAAAAAAAAAP//AAABAAAAAAAAAAAAAAAAAAAA/wAAAAD/AP8AAAAAAAAAAAAAAAD/AAAAAAAAAAEAAP8AAAABAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP8A/wABAAEA//8AAAABAAD///8AAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAA/wAAAAD/AAAAAAAA/wD/AAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAP8A/wAAAAAAAAAA//8A/v//APb29gYBAQIcBAQEOQQFBOQBAgLoAAAA4QAAAPsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0JEAfz8/Az8/Pwu+/v7Tfv6+jj7+/wT/v7+AgAAAAAAAQAAAAAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAQABAAAAAAAAAP8AAP8AAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAQABAP8A//8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAP8AAAAA/wAAAAAAAAAAAAAAAP8AAAEBAAAAAAAAAAEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAA/wD/AAAAAP8AAAAAAAAAAAAA/wAAAP/+/gD9/f4D////CQIBAv4EBAPnBwYH6F9gYPmysrL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39A/39/RT8/Pw1+/v7MPv7/BP9/f0DAAAAAAAAAAAA/wAAAAAAAP8AAAAAAP8AAAAAAAAAAAAAAQAAAAAAAAEAAQAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AQAAAAAA/wD/AAAAAAAAAP8A//8AAAAAAAAAAAAAAAAAAP8AAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wEAAAAAAAAA/wD/AAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAH/AQAAAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAD//wAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAA/wAAAAAAAAAA/wAAAAAAAP//AP//AAD8/PwC9PT0DgcHBioLCgo3+xL73Pv7+/UAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDQkQB/f7+Cvv8/Cv8+/tL+/r6L/z9/Q0AAP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAD/AAAAAAD///8A////AAD/AAAAAAAAAAAAAP//AAAAAAAAAAD/AAAAAAAAAAAAAP8AAAAAAAABAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAEAAAAAAAAAAAAAAP8AAAAA/wD//wAAAAAAAAAA/wAAAAAA//8AAAAAAAAAAP8A//8AAAAAAAAAAP8A/v7+AgMCAgUICAj9Dw8P4gUFBuVUVVT5tLS0/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwMB/vr6D/79/Sr7/Pwj/P39Df7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD///8AAAAAAAEBAQAAAAAAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAQAAAP//AAAAAAAAAAEAAQAAAAABAQD//wAAAAAAAAEA/wAAAQAA//8BAAAAAAAAAf8AAAAAAAABAQAB/wAAAAD/AAD/AAD/AAAAAAAAAAAA/wABAQAAAAABAP//AAD//wAAAAD/AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAQABAQAAAAD/AAAAAAAAAAAA//8AAAAA/wAAAAAAAP8AAP8B/wAA/wAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAD/AAD/AAAAAQEAAAAAAAAA/wD//wAAAAAAAAEBAAAAAAAA////AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8A/wAAAAD/AAAAAP8A//8AAAAAAAAAAP8A/f7+Afj5+Qr29/gh9PX1L/T19NIUFRTzAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PsE/f39E/3+/Sn9/fwY/v7+Bf8A/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7//wD///4A///+AP///gD///8A////AP///wD///4A////AP7+/gD///4A///+AP7//wD///8A///+AP///gD//v8A////AP/+/gD+//4A/v7/AP7//gD///8A////AP///wD+/v8A/v7+AP///gD///4A////AP///wD///8A////AP///wD+//8A/v//AP7//wD//v4A////AP///wD///8A////AP///wD///8A////AP///wD+/v4A////AP///wD+/v8A////AP///wD+/v8A////AP///wD///8A////AP///wD///8A/v7/AP///wD///8A////AP///wD+/v8A/v7+AP7+/gD///4A////AP7+/wD+/v8A//7/AP/+/wD+/v8A/v7/AP7+/wD///8A////AP///wD//wAAAP//AP8A/wD//wAA////AP///wD//wAA//7/APr6+gP29vYU8vLzKP7+/hkEBAQGt7e4AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7PAH5+PgG+/v8F/z8/R/+/v4O/v/+AgD/AAAAAAAAAAAAAAAAAAD/AAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAP//AAAAAP8A//8AAAAA/wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAEAAP//AAAAAAD/AAAAAP8AAAAA/wABAQEAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAP8AAAAA/wAAAAAAAP//AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAA////AP8AAAAA/wAA/wEAAAH/AAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP8AAAAAAAAAAQAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAP8AAAAAAAD///8AAAAAAAAAAAAAAAAA/wD/APz9/QL29vYJ9vb1G/7+/R/29vXX6+vq9wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QH+/v4L/v79G/39/BT9/v4G////AQD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAP8A/wAAAAD/AAAAAP8AAAAAAAAA/wAAAAAA//8AAAAA/wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAABAAABAAAA/wAAAAD/AAABAAABAAEAAAAAAP///wAAAAEAAAD/AAAAAAD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP///wABAQEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAP///wAAAAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP//AP7+/gD7+/oE+/v7Evj4+SDw8PAN+vr67gAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP79/gL+//8M/v7/HP39/Q/+/v4DAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAA/wD//wAAAAAAAP///wAAAAAAAAD/AAAAAAAAAAAA/wAAAAD/AAAA//8A/wD/AAAAAAAAAAAA////AAAAAAAAAAAAAAEBAAH/AAAAAAAAAAAAAAD/AAD/AP8AAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAEBAAEAAAAAAAAAAAD/AAAAAQABAAAA/wABAP8A/wABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD+/v4C/v7+Dfn5+Rv29vYNAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAH++/sJ///+Fv7+/wv//v8C/wD/AAAAAQABAAAAAAAAAAAA/wAAAAAA/wAAAAD/AAAAAAAA////AP8A/wAA/wAAAAD/AAAAAAAAAAAA////AP7+/wD//v4A/wD/AAAA/wD//wAA////AAAAAAAAAAAAAAD/AAEBAQAAAAAAAAAAAAAAAAAAAAEA////AAAA/wAAAAEA////AP///wAAAAAAAAAAAAAAAAABAQEAAQEAAAAAAAAAAAEAAAAAAAAA/wD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAA/wD///8A//8AAAEBAAABAQEAAAAAAAAAAAAAAAEA/wD/AAD//wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wAAAP8AAAABAP8AAQABAAAAAAAAAAEAAAAAAQAAAAEBAAEAAAAAAQEAAgECAAEBAQABAQAAAAABAAAAAAAAAAAAAAAAAAABAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4B/Pz8Cvn5+RX8/PwKBQUGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIBwH9/fwI////Ev///wj///8BAAAAAAAA/wD/AAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD//wAAAAD/AAD//wD///8AAAAAAP///wAAAAAACAgIAAwMDAAICAkAAgICAAAAAAD//wAAAQEAAAAAAAAAAAAAAAEBAAEAAQAAAQEAAQD/AP//AAAAAAAAAAD/AP///wAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAQABAf8A//8AAAAAAAAAAAAAAAAAAAAAAAABAQAA//8BAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEA/wAAAAAAAAABAAAA//8AAAAAAAABAQAAAAAAAAD/AAAAAP8AAAABAP8AAAAAAP8AAAAAAP8AAAAA//8AAAAAAP8A/wABAAEAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAD///8A//8AAAAA/wD+/v0A+fn5APT09AD5+fkAAAAAAAEBAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wD+/v0C+Pj4BvX19g0DAwQKHR0cA9/f3wEhISH/AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAQIAAAAHAAAADv///wcAAAAB/wD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAP//AP///wD///8A////AAYHBgAPDg8AERERABAREgAKCQoAAgICAP//AQAAAAAAAQEAAAAAAAAAAQEAAQEBAAEAAQABAQEAAAAAAP8A/wAAAAAA////AAD//wAAAAAAAQAAAAABAQAAAAAAAQEBAAAAAAAAAQAA//7/AAEAAQD/AP4AAAAAAAEBAQAAAAAA//8BAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEA////AAAAAAACAgEAAAAAAP//AAAA//8AAAAAAP8AAAD///8AAAAAAAAAAAD///8A/wD/AAAAAAAB/wAA/wAAAAAA/wAAAAAAAAABAAAAAAA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CAAD/Af7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQDAQEBAQEBAQABAAAAAAAA/wD/AAAAAAD/AP8AAQABAAAAAAAAAP8A/wD//wAA////AP///wAAAAAABQUEAAYGBgD+/v4A+ff5APUADgD7GSwAABwxAPgQIAD1Aw0A+P4EAP3/AAD+AAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAP8BAAAB/wAAAAAAAAEAAAAAAQAA/wAAAAAAAAABAP8AAAAAAP8AAQABAQAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD//wAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAH/AAAAAAAAAP8AAAAA/wAAAAAAAAEAAAEAAAABAAEAAAEAAAAAAAD/AAAAAAD/AAD/AAAAAAEAAAAAAAAAAAAA//8AAAAAAAMA/wAGBQwACRELAAf/BgAD+fkAAffyAAL67gACAgEAAwMEAAICAwD+/P4A/wH/AAEAAAAAAAAAAP8AAAAAAQAAAAAAAAAAAAAAAAAA//8A////AAAA/wD///8A////AP39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wD/AAEAAAD/AAD/AAD///8A//8AAP//AAABAQEACAcIAAMCAwD5+fkA9vj7APkTGgD7EyYA+QkcAPP8DQDy+AIA+f79AAAA/wD/AAAAAAAAAAD/AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAQD/AAAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQAAAAAAAAEAAAD/AAAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAAAA//8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAQAAAAD/AAAAAAAAAAAAAAEBAQAEAgEACwMMAA0LHAAIFicA/+zhAAHo6wAEAwAAAgICAAQEBAD8/PsA////AAAAAAAAAQEAAAAAAAAA/wAAAAAAAAAAAAH/AAD/AAAAAAAAAAAAAAAAAAD/AAAAAP39/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAP///////wAA////AAD//wD///8AAQABAAAAAAAAAP8AAAAAAAAA/wAAAP8AAAD/AP///wABAgEABAUFAAECAwD6+/sA+P4GAPoLGAD4BxYA8/0KAPH6/wD6/PwAAP//AAAA/wAAAAAAAAD/AAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAEBAAAAAAAA//8AAAAAAAABAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAP4AAAABAAAAAAEAAAD/AAD/AAAAAAAAAAD//wAAAAEAAP//AAAAAAAAAAAAAAAAAAABAAD/AAAAAP8AAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAD/AAAAAAAAAAABAAABAAD+AQEA/gQBAAECCQAACRcAAAsYAAMBCAAC/vYAAwMDAAQEBAAAAAAAAP//AP8AAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQEBAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/r7/////wD///7////+/////wAA//8A/wEAAAEAAAAAAAAAAAAAAP//AAAAAAAA////AAD//gAA/wEA////AP7//gD9/f8A/AQKAPwHDwD5/wgA9/kAAPr8+wD9/P0AAf//AAAA/wAB//8AAAD/AAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAEAAAAA/wAA/wAAAAAAAAABAAAAAAABAAAAAAAAAP8AAAAAAP8BAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAA/wAAAAD/AAD/AAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAP8A/wAA/wAAAAAAAAD/AAAAAAAAAQD/AAAAAAAAAAAAAAAAAP8BAAAAAAAAAAAAAAAAAAAAAAEAAAAAAP8AAAABAAAA/wEBAAABAgAAAQEA/wQCAPcFAAAE/wgABQUQAP4ECwD++vQAAAAAAAABAAAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAQAA////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fb2AP7+/gD/////////AP///wD//wAAAP//AAABAAAAAAEAAAAAAAAA/wD///8A//8AAP4A/wAA//8A/v7+AP79/QD+/v8A/wYEAAACBgD+/QAA+/n6AP36/gAA+/sACv/7AAwA/QAH//4AAQD/AP///wABAAAAAAABAP8BAAABAAEAAQAAAAEAAAAAAAAA/wAAAAD/AAABAAAAAAEAAAAAAAAAAAAAAAAAAP8AAAAAAAEA/wAAAP8AAAABAP8AAAEAAAAAAAAAAAAAAAABAAEAAQAAAAAAAAAAAP8BAAABAAAAAQD/AAAAAAAAAAAA/wABAP///wAA//8AAAD/AAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAA/wAA/wAAAQAAAAAAAAD/AAAAAAAAAAAA/wD/AP8AAP8AAAEBAAAAAAAAAAAAAP8AAQABAQEA//8AAAAAAAD+AQEA+wEDAPUCBAD1AgQA/QMFAPr9AQD8+/8A/gEEAP4CBQD//v4A/v//AP/+/wD///4A//8AAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAP//AP///wD//v8A//7/AP/+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//7+AP39/f/+/v7/AAAAAAAAAAD/AP8AAP8AAAAAAAABAP8AAAABAP8A/wAAAAAAAAD/AP///wD///8A/v//AP/+/gD///8AAAAAAAEA/wD+/PsAE/72ADgB9wAgDfQAFAf1AAoD+AADAPsAAP/+AAAAAAAAAAAAAAAAAAABAQAAAQEAAQABAAABAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAQAAAQAAAAD/AAD/AAAAAQEA//8AAAAAAAAAAAAAAAD/AAABAAAAAAEAAAAAAAEAAQAAAAAA/wAAAAAAAAABAAAAAP8AAAAA/wAAAAEAAAAAAP8A/wAAAP8AAP//AAAAAAAAAQAAAAABAAABAAAA/wAAAAAAAAD/AAAAAAAAAAH/AAD/AAAAAP8AAAAAAAEAAAD/AAAAAAAAAAAAAAAA//8A/wAAAAEAAAABAP8A//8AAAAAAQAAAQAAAAABAP8AAAAAAAIA/QAFAPf9BwDt+QsA3/oNANr6CQD3+/wA//7/AP//AAD+//8A//7/AP///wD+/v8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD+//4A/v/+AP7//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAAAAAAAAAAAA////AP///wAA//8A//8AAP//AAABAQAAAQD/AP8AAAAAAAAAAAAAAAD/AAAA//8AAP//AP///wD///8A//8AAP37/QAW/fgALwz8ADES6gAkEugAFArsAAkD9AABAPoAAAD+AAAAAQAAAAAAAAEAAAAAAQAAAQEAAAEAAAEAAQD/AP8AAP8AAAAAAAAAAAAAAP8AAAABAQABAP8A/wABAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAQAAAAAA/wAAAAAAAAAA/wAAAAD/AAD/AAAAAAEAAAEAAAEA/wAAAP4A//8AAAABAAAAAAAAAAEBAAAAAAAA/wAAAP8AAAAAAAAAAQAAAAD/AAD/AAAAAP8AAAAAAAEAAAAAAQEA//8AAAAAAAAA//8AAAEAAAD/AAAAAP8AAAAAAAAA/wAAAAEAAAEAAAAAAQAAAAIA/v4EAPn7CADr9BMA3O8cAMzwFwDP+PoA9/z8AP///gD///8A////AP//AAAAAAAA////AAEAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAP///wABAAAA//8AAP///wD///8A/v7+AP7+/gA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA/wABAPQAAgPkAAsBAAAVCvUAGg0GABAG9gDw+wAA/wAAAAD//wAAAP8A/wAAAAH/AAAAAf8AAAAAAAAAAQAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAAAAAAAAAQABAQIBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP7+//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAD+AP///wD/AP8ADQf2AA4G+gAI//gAAvzsAP788wD+/P8A//4AAP7/AAD//wAAAP8AAAABAQAAAAAAAAD/AAAAAAAA/wEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAQABAAAAAAAAAP8AAAAA/wAAAAEAAAAAAAABAQAAAAAAAAD/AAAAAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAP8AAAEBAAAAAAAAAQAAAQD/AAEBAAAAAQAAAwX4AAID8AAJAgEAEAcHAA0H/gDw9QIAAP//AP8AAAAAAAAAAP8AAAABAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAD//wABAAAAAAD/AP//AAAAAP8A//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7/AP7+/gD/////////AP///wAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAP///wAA//8ABQP9AAUA+wAA+/UA/Pn1AP37/gD7/AUA/P4CAPz/AAD+/wAA//8AAAAAAQAAAQAAAQAAAAAAAAD//wEAAP8AAAAAAAD/AAAAAAD/AAAA/wAAAAEAAAEAAAAAAAAAAAEAAAEAAAD/AAAAAP8AAAAAAAAAAAAAAAEAAAEAAAEAAAAAAAEAAAAAAAAA/wAA//8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEA//8AAAAAAAAA/wAAAAD/AAEBAAAAAP8AAP8AAP8BAQAAAAAAAAABAAAAAAD/AAAAAAD/AAEAAQAAAAAAAAD/AAEAAAAAAAAAAAAAAP8AAQAAAAAA/wAAAAEAAAAAAAAAAAD/AAEAAAAAAP8AAAAAAAEBAAABAQAAAQEAAAIA/wAEAv8ABf3/AAAD9gAB+wUABgD9AAYCBAD//wUA////AAAA/wD/AAAAAAAAAAAAAAAA/wAAAAEBAAAAAAD/AP8AAP8AAAAAAAAAAAAA////AP7+/gD+/v4A/f79APr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAP8AAAD//wAAAAAAAAAAAAAA//8AAAAAAP8AAQAAAAAAAQAAAP8AAAAA/wAAAAD/AAAAAAAAAAAA////AP8A/wD/AAAAAQAAAP/+/wD8+v4A9wMAAPn+CgDyAQkA9QYEAPgBAAD8AAAA//8BAAAAAAAAAQAAAQABAAABAQD//wAAAAABAAD/AAD/AAAAAP/+AAABAAAAAAAAAAEBAAAAAAAAAQAAAAABAAAA/wABAP8AAP//AP//AAAAAQEAAQEBAAAAAQAAAAAAAAAAAAAA/wAA//8AAAAAAAABAAAAAAAAAAABAAAAAAAAAAEA/wAAAAAAAAAA//8AAQD/AAAA/wAA/wAAAAAAAAABAQD/AAEAAAEAAAD/AQD/AP8AAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAEAAAAAAP8AAAAAAAEA/wAAAAEA/wAAAP8AAAD/AAD//wAAAAAAAAD/AAEA/wACAQEAAgAAAAf//gAM/PwADfr5AAcB/gD8+fsA/v0GAAAAAwD///8A////AP7+AAAA/wAAAAD/AP///wABAQEA////AAAAAAAAAAAAAAAAAP8AAAAA//8A//8AAP/////+/v7//v7+APz8/P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIBAAEBAQAAAQAAAAABAAAAAAD/AAAAAAAAAAD//wAAAAAA/wAAAAAAAQAAAAAA//8AAP//AAAAAAAA//8AAP//AAAA//8A////AP79/gD3/P8A6/4IAOoFBQDlCAcA6wgDAPIDAAD7AQAA/wAAAP8AAAABAAEAAQEBAAABAQAAAAAAAP8BAAAAAAAA//8AAAD/AP8A/wAAAAEAAAAAAAABAAABAAEAAAH/AAAAAQAAAP8A////AAD//wAAAQIAAQEBAAAAAQAAAAAAAAD/AAAA/wAAAP8AAP8AAP8AAAAAAQEAAQAAAAAAAQAAAQEAAAD/AAAAAAAAAAAAAP//AAAA/wD///8AAAAAAAEAAQAAAAEA/wEAAAAAAQAAAAAAAf//AAABAAD/AAAAAP8AAAAA/wABAAEAAAAAAP8AAAAAAAEAAAAAAP8AAAAAAP4AAAD/AAD/AAD/AP8AAP8AAAD//gABAQAABf8AAA79/wAW+fwAHPgFABT5+wD5+/8A/fz+AP///wD///8A////AAAA/wAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAExXbu0AACAASURBVAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAABAAAAAAD/AAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AP///wD///8AAP79APn9/ADsAAEA9ggKANsKAwDeBf8A6wH6APX//wD8//8AAAAAAAAAAAAAAAEAAQEAAAABAAAAAAEAAP8AAAAAAAABAAAA////AP8A/wAAAAEAAAEAAAD/AAABAAEAAAD/AAABAQAA//8A/wAAAAD/AAABAQAAAQEBAAAAAQAAAAAAAAH/AAD/AAAAAP8A/wAAAAAAAAAA/wAAAAABAAEBAAAA/wAAAAAAAP8AAAAAAAAAAP//AAAAAAAAAAAA////AAEAAAAAAQEAAP8AAP8AAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAD/AAAAAP8A//8AAAAAAAAA//8ABAABAAoCAQAUCAIAJAQIACYCBAAK8/0A+v39AAD+/wD///8A/wD/AP8A/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQEAAAICAQEDAwMBAgMCAAgICAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD//wD///8A////AAAA/wD//wAA////AAEBAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAD///8A//8AAAD//wD///8A/v79APEB/QDfBgIA6ggBANgC/ADk+/sA9/78APwAAAAA/wAA/wD/AAAAAAAAAAEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAB/wAAAAEAAAAAAAAAAAAA/wAAAAAAAAABAQAAAQAAAAABAQAAAAAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAP8AAAAAAP//AAD/AAAAAAEAAAAAAAABAAAAAP8AAP8AAAABAAEAAAAAAAABAAAA/wAAAP//AAAAAAD/AAAAAAAAAAABAAAA/wAAAP8AAAAAAAABAAAAAQAAAAIBAgDrAgIA9QEDAPsGAgAWBgAA8gH/AP7+/gD/AP8A////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAABAAAA/wAAAAAAAAABAAICAgADAwMBBAQEAQMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wAAAAAAAAAAAP//AAD///8AAAAAAP///wABAAEA/wAAAAAAAAAAAAAAAAD/AAAA/wAAAAEAAAAAAP///wD///8A+P7/AOgB/wDrBAAA5//8AOP6+gDy/PwA/v//AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEBAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAABAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAA/wAA//8AAAABAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQEAAAAAAAAAAAAA/wAAAP8AAAAA/wAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAQAAAAEA/gD5AQEA4AP+AP//AwDuAwEA+wEAAPj+/wAA/wAAAAAAAAAAAAAAAAAAAP//AP///wAAAAAAAAABAAAAAAAAAAAAAAD/AP8AAAABAAAAAAEAAAAAAQABAQEBAQEBAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQD/AP8AAAAAAAAAAAD/AAAA//8AAP//AAD//wAA////AP//AAD///8A7/8AAOEBAQAA//0A7vz8APL9/QD7/P8A/v8AAAAA/wAAAAAAAAAAAAAAAAAA/wAAAAEAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEBAAAA/wAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD//wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP8AAAABAAABAP8AAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAA/wAAAAAAAAABAAEBAAAAAAAAAAAAAAEAAAAAAf8A8gMAAOMBAQD1/gMAAP8AAPH+/wD///8AAAEAAAAA/wAA//8A/wD/AAEA/wAAAAEAAAD/AAAAAAAAAAAA/wAAAAEAAAD///8A//7/AP7+/gD8/Pz/+/v7//n4+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAAABAQAAAQAAAAAAAAAAAAAAAAAA/wABAAEAAAAAAAAAAAAAAP8AAAAAAP8AAAAAAAAAAAAAAP8A/wD/AP8A/gD///8A9AMAAP8BAQAB/f8A9/r+APr8/gD8/P8A//7/AP//AAD///8AAAAAAAD/AAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQEA/wAAAAEA/wAAAQAAAAAAAAAAAAD/AAAAAP8AAAD/AAAAAAAAAAEAAAAAAAABAAEAAAH/AAAAAAD/AP8AAAAAAAAAAAABAAAAAQEAAP//AAD//wAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAABAAAAAAEAAAD/AAAA/wAA/wAAAAAAAAAAAAAAAAEAAAAA/wAAAAAAAQABAAAAAAABAQAAAQEBAAABAAABAgAA/wP+APIC/wD6/gEA/wECAPUBAAAAAAAAAP8AAAAAAAD/AAAAAAAAAP//AAAAAf8AAAABAAEAAAAAAAAAAAAAAP///wABAQEAAAAAAP7+/v/9/f3+/f39APv7+/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAA/wAA//8AAP///wAAAAAAAP//AP8AAQABAQAA/wAAAAAAAAAA/wAAAAD/AAAAAAD/AAAAAP8AAAD/AAAAAAAA/AEAAPn/AAAA/P8A+/r/AAz6CQAW+wwAEf0IAAn9AgAC/wIAAf8AAP8AAAAAAAAAAAAAAAEBAAAAAAEA/wAAAAAA/wAAAP8AAAAAAAH/AAAAAAEAAAEBAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAH/AAABAAAAAAAAAAABAAAAAAD/AP8AAP8AAAD/AAAA/wEAAAEAAAAAAAABAAAAAAIAAAAAAQD/AP8AAP//AAAAAAABAAEAAAEAAAD+AAAAAAAAAP8AAAAA/wD/AP8AAAABAAAAAAAAAAEAAAEAAAAAAAAA/wAAAAD/AAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAABAQAAAAAAAAH/AAAAAAD/Af8A/gH/APcC/ADuA/cA6gT0APcE/QD//AAA/gABAPsCAAAD//8AAAEAAP///wAAAAAA//8AAAEBAAAAAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAAAA////AAAAAAD//////////wEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAD/AAAAAAD///8A//8AAAEB/wD/AAEAAQAAAP8AAAAAAAAA//8AAP///wAB/wEA////AP///wD/AP8AAAAAAP3+/wAG+gIAIf4PACX4EgAj+xIAGPwJAAv9AgAD/gMAAAABAAABAAAAAP8AAAAAAAEBAQAAAAEAAAD/AP8A/wAA/wAAAAD/AAEAAAAAAAEAAAECAAAAAAD/AAAAAAAAAAAAAAAAAP8AAQAAAAABAAAAAAEAAAAAAP8BAAAA//8AAAAAAAD/AQAA/wEAAAEAAAAA/wAAAAEAAAIAAAEBAQD///8AAP/+AAAAAQABAAEAAAAAAAD/AAAAAAAAAAD/AAD//wD/AP8AAAAAAAAAAQABAQEAAAAAAAD/AAAAAAAAAAAAAAAA/wD///8AAAAAAAABAAAAAAEAAAAAAAD/AAAAAf8AAAABAAABAQAAAP8AAAEAAAAAAAD///4A/QH9APUD/ADnAvQA3QXtANkH8QDo+vwA+P0AAAAAAAD/AP8AAP8AAP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAD///8AAAAAAAAA/wD//wAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAABAAAAAQABAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/v7/AAP7AgAh9wsANQATAC32EgAc9wgAD/kAAAb8AAAB/wEAAAABAAABAAABAP8AAAEAAAABAgAAAAEAAAD/AP///wAAAAAAAP//AAEAAAAAAQEAAAEBAAAAAQAAAAAAAAD/AAD/AAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAQAAAAAA/wAAAAAAAAABAAEA/wAAAAAA/wAAAAAAAQEBAAABAQAAAP8A//7/AAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAD//gD//wAAAAAAAAEAAAAAAQAAAAAAAAD/AAAAAAAAAAABAAD//wAAAP8AAAAAAAABAAAAAAEAAAAAAP8A/wAAAAAAAAEBAAAAAAAAAAAAAAD/AAEAAAAA/wIA/gACAPoDBADwBQMAIggGABYKCgDK/ewA2/r4AP79/wAB//8AAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAEBAAAAAP8A///+AP///wD+//8A/fz+ABX3BwAx8xMANv4SACPyBgAQ8/oABPf5AAH9/gABAAEAAAAAAAAAAAAAAQAAAAEAAAAAAQAAAQEAAAAAAAD/AAAAAP8AAAAAAAAAAAABAQAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAQAAAQEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEBAAAAAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAAAAAAA//8AAAD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAQAAAP8AAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAP8AAAABAP4CAQAQBwMADwwKAAf6AgD7/fsA8fb6AN/9/gAC//8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQADAgMBAgICAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//7+AAAAAAH/AP8A////AP///wAAAAAAAP//AAABAQAA//8A/wAAAAAAAAAA/wAAAAD/AP//AAABAQAA/wAAAP///gD///4AA/n/ACD0BgArBggAIfwAABPw9gAF9fgAAPz7AP///wAAAAAAAQABAAAAAAD/AQAAAAEBAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAEAAAABAAAAAAEAAQAAAAAAAAD/AAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAQEAAAEAAAD/AAAAAP8AAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAQAAAAAAAAAAAP//AAABAP8AAAAAAAD//wAAAP8AAAAAAAD/AAAAAAAAAAAAAAEAAAAAAAAAAP8AAAAAAAD/AAAAAAD/AAEBAAAAAAAAAAAAAAAAAAAA/wAAAP//AAAAAAD/AAAAAAABAAMBAQADBQMAFPoIAP75AwDx/woA4PUHAOL89wD///8AAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAEAAAD/AAAAAAD/AAAAAAAAAAAAAAABAQAAAQAAAAAAAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAEBAAABAAABAAAAAAAAAAD///8AAAAAAAD//wD/AQEAAQAAAAD//wD/AAAAAAAAAAAA/wD//wEA//7/AP7+/wD//f8AEPoAAB3xAgAa/v0AD/v2AAP2+QD//PwAAP//AP8AAAABAAAA/wABAAAAAAAAAAAAAAAAAAABAAAAAAAA/wAAAAAAAAAA/wAAAQEBAAABAAAAAQAAAAABAAAAAAAAAAAAAAEBAP8BAAABAAEAAAEBAAAA/wAAAAAAAAABAAAAAAAAAQEAAP8AAAAAAAAAAP8AAAAAAAABAAD/AAEAAQAAAAAAAAAAAAEAAAD/AAAA/wAA/wAAAAAAAAAAAQAAAAAA/wAAAAAA/wAA//8AAAAAAAD//wAAAAAAAP8AAAAA/wAA/wAAAAEAAAAAAAD/AAAAAP//AAAAAAAA/wAAAAD/AP8AAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAD//wAAAAAAAAABAAAAAAAB+wAABfv8ABD5BQAcAgIAHfUFAA769wDz/v4A/wEAAP///wAAAP8AAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/QD9/v3//f79AP3+/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wD/AAAAAAD//wAAAAAAAAAAAAAAAAAA//8A/wAAAAAAAAD/AP8A//8AAP//AAAAAP8A/v7+AP79/QD+/v0AD/gBABLx/wAL/fkAA/4AAP/7+wD+/v4AAAABAAAB/wAB/wEAAAAAAP8AAAAAAAAAAQAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAQAAAAABAAEAAAD/AQEAAQEBAAABAAAAAQIAAAEBAAAAAAAA/wAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAEAAAD/AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAEA/wAA//8AAP8AAAD//wAAAP8A/wAAAAD//wAA//8AAAAAAP8AAAD/AAAAAP8AAAAAAAAAAP8AAP8AAAAA/wAAAAAAAAEBAAD/AAAAAP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAP8AAfz8AAT9/AAMAP8AFPMBABL4AADy//8AAAAAAP///wD//wAAAAAAAAEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39AP7+/wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA///+AAAAAAACAgIACQIDAAb+BAD/+v4A+f//APz9/gAA//8AAAH/AAD/AAAA//8AAAAAAAAAAAABAAAAAAEBAAD+/wD/AAAAAAEAAAAAAAABAAAAAAEAAAD/AAABAAEAAQD/AAABAAACAAAAAgAAAAIBAAACAQIAAAIBAAAAAAAB/wEAAAAAAAAAAAD/AAAAAAEAAAEAAAD/AAEAAAAAAAAAAAAAAQAAAP8AAAABAAD/AAEAAQD/AAAAAQAAAAAA/wD/AAD/AAAA/wAAAAD/AAAAAAAA//8A/wD/AAD+/wD/AP8A/wAAAP7//wD+AAAA/wEBAP4AAAD//wAAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAAAAAAD/AAD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+AP36/AAA/wAABvwCAAkCBQAC//8A/v//AAD/AAABAAAAAAAAAAEAAAD//wAAAQH/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAA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/AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAP8A//8AAAD//wD/AP8A/wD/AP7+/gAA//8AAP8AAAD//wD//wAAAQEAAAAAAAAAAP8A/wAAAAEAAAAAAAAAAAAAAP8AAAAAAP8AAQABAAEAAQEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA////AAD/AAAA/wAAAAAAAP//AAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8A/wD/AP///wD///8AAP//AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAA//8AAAAA/wAAAAAAAAABAAD/AAAAAP4A/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn7+wDnAQEACQkIAAgGCAABAQAA/fn3AA/9/AAIAf0ABAEAAAEBAgABAAAAAAAAAAAAAAD+//8A/f//APkAAQDxBQgA6AoNAN0HCgDc/P0A5fb2APb4+AD+/v4AAAAAAAD//wAAAAAAAAD/AAAAAAAAAAAAAQAAAAABAAAAAAAA////AAD/AAAAAAAAAAABAAAAAAAAAAAAAP8AAP8AAAAAAAAAAP8AAAAAAAD/AP8AAAAAAAAAAAAAAAAA////AAD//wAAAAAA/wD/AP8A/wD///8A////AP///wAAAP8AAP//AAABAQAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAAEAAQABAAEAAAAAAAAAAAD/AAAAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD//wD///8A/wAAAAAAAAAB/wAAAAAAAAAAAAAAAP8AAAEAAAAAAAAAAAEAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA////AAAAAAAAAAAAAQH/AP//AAAAAP8AAAAAAP8AAAAAAAAAAAABAAABAAABAAAAAAD/AP7//wD2+voA4wEBAAQJCAD8BgkA+AMEABn6+AAP/PsAB//+AAT+/gAC//8A/wD/AP8BAgD+AgMA+QICAPIGCADpCQwA4AUHANr8/QDd9PUA8ff3AP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAAH/AAD/AP8A//8AAAAAAAAAAAAAAP//AAEBAQD///8AAAAAAAAA/wAA/wAAAAAAAP8AAAAAAP8AAP8AAP8AAAAAAP8A////AAAAAAAAAAAAAAAAAP///wD///4AAAD/AAABAAD//wAA/wAAAAEAAAAA/wAAAAEAAAAAAAAAAAEAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAP8AAAD/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAQAAAAEBAP8AAAD///8AAAD+AAAAAAD/AAEAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAA//8AAP///wD/AAAAAAD/AAEAAAABAQEAAAD+AAD/AQD/AAAAAAAAAAAAAAD9//4A8fn5AN3//wD5CgkA9QYHAPEEBgAV/fwADf37AAj7+gAD/PwA/wD/AP4FBwD6CAgA9AQGAO0DBQDjBAQA3/r7AOHz9ADw9vYA/Pz8AAAA/wAAAAEAAAAAAAAAAAAAAAAA/wD/AAD/AAAAAAAA/wD/AP8AAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAD//wAAAAAA////AAAA/wD/AAAAAQAAAAAAAAD//wAAAAD/AP///wAAAAAAAAAAAAAAAAAA/wAAAAD/AAD//wD//wAA//8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAP8A/wAAAAEA/wD/AP8AAAAAAAEBAQABAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA/wD/AAAA/wAA/wAA////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABAQEAAAABAAEBAAAAAP8A/v4AAAAAAAAAAP8AAQAAAP8AAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAQAAAQAAAAAAAQAAAAAA/wD/AAAAAAAA//8A/wAAAAAAAAAAAP8AAAAAAP8AAQAAAAAAAAAAAAAA/gABAAAA/wAAAP8AAAAAAAAA/Pz+APH+/gD7//4A8/4IAOkGBwAWBQcAEgUGAAsHCQAF/v8AAAAAAPsDAwD4BAUA7wIBAOv9/wDo9fYA6/b2APP39wD9/P0AAQAAAP8BAAAA//8AAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wAA/wAAAAAA/wAAAAAAAAAAAP8AAAAA/wAAAAAAAP8AAAAAAQAA//8AAAAA/wAA//8A/gAAAAAAAQAAAP8AAP8AAP8A/wAA//8A/wAAAAAAAAAAAAAAAgACAP//AAD///8A////AAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP8AAAAAAAEAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAP//AP///wD/AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wD//v8A///+AP///gD///8A////AAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAABAAAB/wAA/wABAAAA/wAAAAAAAAAAAAAAAAAAAP8A/wAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAABAP7+/gD1+PgA+Pz8AOwF+QANBAUADwcFAA0HBwAFBQQAAAAAAPv+/gD2+PkA8vv7APP7+wD2+foA/Pv6AP7//wAAAAAA/wAAAAD/AAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAQAAAAAAAAD/AAD/AAAA/wAA/wD/AAAAAAAA/wAAAAAAAP8A/wAAAAAAAP//AP8A/wD///8AAAAAAAAAAAAAAAAA/wH/AP8A/wD///8AAAAAAAAAAAD/AP8AAQABAP//AAABAQAAAAAAAAAAAAAAAAAA/wAAAAH/AAAAAAAA/////////wD+/v4A/v3+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A////AAAAAAD///8A//8AAP//AAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD///4A/v3+AP7+/gD//v4A///+AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAA/wAAAAEAAAH/AAAAAAD//gAA/vr7APv6+wD1AwIA7fgEAAUFBgADAwIAAAAAAP7+/gD6+vsA/Pz8AP7//gAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAP///wAAAAAAAAAAAAAAAAAAAP8AAAAAAP//AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAD/AP///wAAAAAAAP//AP8AAAAAAAAA////AP///wD/AP8AAAD/AAD//wAAAAAAAAEAAAAA/wAA/wEAAAEAAAAAAAAAAAAAAAD/AAAAAQAAAP8A////Af//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAQEAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD//wAA//8AAAAA/wD+/v8A/v7+AP7+/wD//wAA////AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAABAAAAAAD/AP//AAAAAP8AAAABAAEBAAD//wAAAAAAAP8AAAABAf8AAP8AAP8AAAAA/wAAAAAAAAAAAAD9/P0A/v39APn5+gAAAQAAAAAAAAD/AAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAA//8AAAAA/wAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAD//wAAAAD/AAAAAAAAAAAA/wAAAAD/AAAAAQAAAP//AAD//wAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAD/AP8AAf8BAAABAAAAAAAAAP8AAAABAAAAAAAAAQEBAAEBAQEBAAEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgMAAgICAAICAQEBAQEAAAAAAAD/AAAAAAAA/wAAAAABAAAAAAAAAP8AAAAA/wAAAP8AAAD/AAD/AAAA//8A////AP/+/wD///8AAP8AAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAAA/wD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAABAP///wABAQEA/wAAAAAA/wAA/v8AAAEAAAD/AQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wAA/wD/AAAAAAD//wAAAAD/AAD/AAAAAAAAAAEAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A////AAAAAAAAAAEAAAD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wAB/wAA/wEBAAAAAAAA/wAAAP8AAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wD/AAH/AQD/Af8AAAAAAAAAAAD//wAAAAAAAP//AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgIDAQEAAQAAAAAA////AAAA/wAAAAAAAQEBAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A////AP8A/wD/AP8A////AAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAEAAAD/AAEAAAAAAAH/AAAAAAAA/wD/AAABAAD//wAAAQAAAAAB/wAAAAAAAAAAAAAAAAD//wAA/wAAAAAAAAAA//8AAQAAAP8AAAAAAAAAAAAAAAAAAQAA/wAAAQEAAAAAAAAAAAAAAAD/AAABAAD/AP8AAP8AAAEAAAAAAAAAAP8AAAAA/wAAAAAA//8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wD//wAAAAD/AAAAAAD//wAAAAD/AAAAAAAAAAAAAf8BAP8AAAAA//8AAAAAAAAAAAD/AQAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAP8A//8AAAAA/wAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAf//AP8AAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAAAQAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAA////AAAA/wD//v4A/v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+//4A////AAAAAQAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD//wAA/wAAAAD//wD///8A/wD/AAAAAAAA/wAAAAAAAAAAAAABAAAAAAAAAP8AAQAAAf8AAP8AAP8AAAAAAQAAAAAAAAD/AAAA/wAA/wEAAAD/AAABAQEAAAAAAAD/AAD///8A/wAAAAAAAAABAAAA/wH/AAD/AAABAAEAAAEAAAD//wAAAAAA/wAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAABAAEAAAAAAAD/AAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wD//wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8AAAAAAAD/AAAAAAAAAAAAAP8A/wAAAAAA/wEAAP///wB+eV4vAAAgAElEQVT/AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAP8A//8A/wAAAAAAAQABAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AP//AAAA//8A////AAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAA/wAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAQD///8AAAAAAAAA/wAA/wAAAAAAAP8AAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQD/AP8AAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAAAAAP//AAAAAP8AAP8AAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AP8AAAAAAAAAAAAAAP///wAAAAAA//8BAAD//wAA/wAA//8AAP//AAAAAAAAAQEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAP8AAAD/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wD/AAD/AP8AAAAAAAD/AAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP///wD///8A////AP8A/wD//wAA////AAAAAAAAAAEAAAEAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAQAAAP8AAAAAAAEAAAAAAAAA/wAAAAAA/wAAAAAAAP8AAP8AAAAAAQAAAf8BAAAB/wD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAEBAAD/AAEAAAAAAAAAAAD///8AAAAAAAD/AAD/AP8AAAAAAAD/AAD/AP8AAQEBAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAAA/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAP///wD/AAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8A/wD/AP8AAAAAAAAA/wD//wAAAQEAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAP8A////AP///wD///8AAP8AAAABAAAAAP8AAP8AAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAEBAAEA/wAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAA/wAA/wEAAAD/AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAABAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAA/wD///8AAAAAAAAAAAD///8AAAAAAAAAAAAA/wAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAD/AAH/AAAAAAAAAAAAAP//AAD/AP8AAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAP//AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAQEBAQEBAQABAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAABAQAAAAAA/wAAAAD/AAAAAAAA//8AAAEBAAAAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAAD//wAA/wD/AAD//wAAAP8AAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP//AP8BAQABAAAA//8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD//wAAAAD/AAAAAAD///8AAAAAAAAAAAAAAAAAAP8BAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP8AAP8A/wAAAAAA////AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wD///8A////AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAICAgICAgIAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAEBAAEAAAEAAAEAAAAAAP8AAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAD/AAAAAAEAAAABAP///wAAAP8AAP//AP8A/wD/AAAA/wAAAAAAAAAAAAAA//8AAAAA/wABAAAA/wAAAAEAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAD//wD/AAAAAP8AAP8A/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAP8AAAAA/wEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQEAAAAAAAD//wAAAAAAAAEAAAD/AAAAAP8A////AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wD/AAEAAQAAAAAAAAEAAAAAAAAAAAAA/wD/AAAAAAAA//8AAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAEAAAEAAAAAAAAAAAAAAAAAAP///wAAAAAAAQAAAAD/AAD//wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP8AAAABAAABAAAAAAAAAAAAAAABAQEAAQEBAQICAgACAgIBAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP//AP///wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAQD//wAA//8AAAD/AAAA//8AAAD/AAAAAAD//wAAAAAAAAAA/wD/AAAAAf8AAP8BAQAAAAAAAAAAAAD//wABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/AAAAAQAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAD///8A/wAAAAAAAAAB/wAA/wD/AAAAAAAAAAAAAQABAAAAAAD/AP8AAAAAAP8A/wAAAAEAAP8AAAABAAAA//8AAAAAAAD//wAAAAAAAAAAAAAAAAAAAP8AAP8AAAAAAAD/AP8AAP8AAAAAAAABAAAA/wAAAAAAAAAAAAAA/wD/AAAA/wAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAABAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v4A////AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAP8AAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wD/AAH/AAAAAQAAAAABAAAAAAD/AP8AAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAB/wAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAP8A/wD//wAAAAD/AAAAAAD/AAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AAAAAP8AAP8AAAAAAAD/AAAAAAAAAAAA/wAA/wAAAAAAAP8A/wD/AAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAEAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD//wAA////AAD//wD///8A/wD/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAABAQAA/wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AQEAAP//AAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAP8A/wABAAEAAAEAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP//AP8AAAAAAAAAAAAAAAEBAAAAAAEA////AAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAD/AP8AAP8AAP8A/wAAAAAAAAAAAAAAAAD/AAAAAQEAAP///wAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAP8AAP8BAAABAAAA/wAAAAAAAP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAH/AP8A/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAP///wAA//8A//8AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAQAA/wAAAQD/AAAAAAD/AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAABAQAAAAAAAP//AAEAAAAAAAAAAAAAAAAAAAD/Af8AAAABAAAAAAD/AP8AAP8AAAAAAAD//wAAAAD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAAAAAAAAAP//AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAA/wAA/wAAAAAA/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAAAAAP8AAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAf8AAAABAAAAAAAAAAD/AAEAAQAAAAAAAAABAQAAAAAAAAEA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAP//AAAAAAAAAAAAAAAA/wAAAAAAAAEAAAAAAAAB/wEA/wAAAAAAAAAAAP8AAQAAAAAAAAD/AP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAQAAAP8AAAAAAQAAAAAAAAAAAAD//gAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/AP8AAAAAAAAAAQAAAP8AAAAAAAAAAAD/AAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAQEAAAAAAAD///8AAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP8AAAD///8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAH/AAAAAQAAAAEAAP8AAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgECAAEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAD//wAAAAAAAP8AAAAAAAAA////AAAAAAAAAP8AAAABAAAAAAAAAP8A/wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA//8AAAAAAAD/AP8AAAAAAAAA/wAAAAEAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA/wAAAAEAAQEBAAAAAAAAAP8AAAD/AAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAA/wAAAAAA/wAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAP//AAAA/wAAAAAA/wAAAAAAAAABAQEA//8AAAAA/wABAQAA/wABAAD//wD/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/wAA/wEAAAEAAAD/AAAAAQEA/wEBAgECAgEAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAQEBAAEBAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA//8A//8AAAAA/wAAAP8AAP8AAP8A/wAAAAAAAQAAAAAAAAAAAAAAAQAAAP8A/wAAAAAA//8BAAEAAAD/AP8AAAAAAAABAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAf8AAP8AAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQAA/wAAAAAAAAAAAAAAAAAA////AAAA/wAAAAAA////AAEBAQAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAA/wEAAAAAAAAAAAAAAP8AAP8AAAAAAAD/AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8AAP8AAAAAAAAAAQAA//8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD///8AAAAAAAAA/wD//wAAAQEAAP8AAAD///4AAP//AAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAD/AAAAAP8AAAAB/wAAAAAAAQECAQMDAwEEBAQBBwcGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEBAQEAAAAAAAD/AAAAAAD///8AAAEBAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD//wD///8A/v7+AP/+/wAA//8A///+AP8AAQAAAAAAAAH/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA//8BAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAP8AAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wD//v8A/v7/AP///wABAQEAAP8AAP8B/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP//AAAAAAAAAAAAAAEBAAABAQEABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIBAQAA/wEAAP8B//8AAAAA/wAAAAAAAP//AP8BAQAAAAAAAAAAAAD/AAAAAAAAAAEAAP8AAAD8/fwA/f38AP///wAAAAAA/wAAAAAA/wAAAAAA//8AAAEAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAABAAEAAAEAAAAAAAAAAAAAAP//AAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAAA/wAAAAAAAQD/AAAAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AP8AAAAAAP8AAP8AAP8AAAAAAAAAAAAAAAAAAQABAP8A/wAAAAABAAAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD//wAAAAAAAAAAAP8AAAABAQEAAAAAAP///wD+/v4A/v79AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAA/wD/AAEAAQAAAAAAAAD/AP7+///+/v7//fz9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//AAD//wAAAAAAAP//AAD//wAAAAAAAAEA/wAAAAEAAAAAAAAA/wABAQEAAQABAP8A/wD7+/sA+/v6AAQEBQACAgIAAP39AP///wAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAQAAAAABAQD///8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAQEBAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAAAAAQAAAAAAAAD//wAAAAAAAP8AAAAAAAAAAAAAAAEAAAAA/wD/AAAAAAAAAAD/AAAAAAAAAAAAAAD//wD/AAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAA/wAA/wAAAAAAAAD///8AAAAAAAEAAAAAAQEA//8AAAAA/wAAAAAAAAAAAAAAAAAA//8A/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQIBAAEBAQD9/f0A/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEAAAAAAAAAAP8A/////////////v8A+/r7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/v7+//7//v7///////8AAAAAAAAAAP8AAAABAP8AAAABAP8AAAAAAAAAAAD/AAAAAAAAAP///wD6+voA+vr6AAMDAwABAQEAAQAAAP///wAAAAAAAAAAAP8AAAAAAQAAAAAAAAAAAAD///8AAAD/AAEAAQD/AQAAAP8BAAAA/wAAAAAA////AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAP8BAAAAAAEAAP8AAAAAAAAAAAAAAAAAAP///wAA/wAAAAAAAP8BAAAA//8AAAAAAAD//wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAADxVvE0AACAASURBVAAAAAABAQEAAQABAP///wD9/f0A/v7+AAAAAAABAQAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAAEAAAAAAAAAAAD//wAA/////wD///4AAQD/AgMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/v4A/P39//39/f3+/v/+////AP//AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQABAP///wD8/PwA+fn6AAUFBgABAQEAAQECAAAA/wD/AP8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAP4A/wABAAAAAAEAAAD/AAAAAAAAAAAAAP///wAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEBAP///wAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAD/AAD/AP8AAAAAAAEAAAAAAAAA/wAAAAD//wD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAAAAAAAAABAAAAAAEA/wAAAAEBAQABAQEAAAEBAP38/AD9/fwA////AAEBAQAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAABAQAAAgID/wQFBf4ICAn/CQkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmpaX/+fj5/vv6+/z///7+AAD//wAA/wAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+vr5APn5+QD///8AAgMBAAECAQAAAAAAAP//AAD//wAA//8AAP//AP/+/wD/AAAA/wAAAAAAAAD///8A////AP///wD///8A///+AAAA/wAAAP8A//8AAP///wAA//8AAP//AP///gD///4A/wD+AP8A/gD///4AAAAAAAAAAAD/AAAA/wD/AP8A/wAA//8AAAD/AP8A/wD/AAAA/wD/AP///wAA//8AAP//AP7//wD/AAAA////AAAAAAAAAP8AAAD/AP8A/wD/AP8A////AP7//wD///8A//7/AP/+/wD+//8A////AP///wD///8A////AP7//wD+//8AAP//AP8AAAD///8AAP7+AAD+/wD//v8A//7/AP/+/gD/AP8A/wD/AP8AAAD/AAAA/wAAAP//AAD///8AAAD/AAEBAQACAgIA//7+APv7+wD7+/wAAAAAAAAAAAAAAAEAAAAAAAAAAAAA/wAAAP//AAAA/wAAAP8AAAD/AAAAAAACAgIABgYFAAwMDP8QEBAAEhMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f79//7+/fz////7AAAA/gAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A//8AAAEAAAD/AP8A+/v7APj49wACAgIABAQEAAMDAgAA//8A/v//AP8AAAAA//8AAAABAAAA/wAA/wAAAAEBAAAAAAAAAAAA////AAABAQAAAP8AAQAAAAD/AAAAAAAA/wH/AAEAAQD/AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAQD///8AAAAAAAAAAAAAAAAAAP8AAAAAAAABAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAD///8AAQEAAAAAAAD//wAAAAAAAAEAAAAAAAAA/wAAAAD/AAAAAAAAAAD/AAAAAAAA/wEA/wEAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wD/AP//AAAA//8A/wAAAAAA/wAAAAAAAAAAAAAAAAAA//8A/wEBAAEAAAAAAP8AAAAAAAAAAAAAAAEAAQEBAAECAQAAAP8A+/z7APn5+QD9/fwAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAQADBAQABgYH/gsLCv0QEA/+FBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAID/wICA/oAAAD3AAAA/QAAAAAAAAAAAAD/AP//AQAAAP8AAAABAAAA/wD/AAAAAAD/AAABAAAA/wEA////APn5+QACAgIACAgJAAMDAgACAwIAAAEAAP7+/wD/AAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAP8A/wABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAEAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAAAAAP8AAP8AAAAAAAAAAAAA/wABAAAAAQAAAP8AAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AP8AAAABAQAAAQAAAAAAAQABAgEAAgECAAEAAAD8+/sA+fj4APv7+QD///8AAQEBAAABAAD///8AAQEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAICAgAJCAn/CAgI/AAAAPcDAwP8CwsL/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39/gAAAPoBAQHzAAAA+QAAAAz///8BAQEBAAAA/wAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAQABAf8A//8AAP39/QD39/cA////AAcHBwACBAQAAgIDAAEA/gD///8A////AP///wAAAAAAAAAAAP///wABAAAAAAABAAAAAAAAAAAA/wAAAAABAAABAAAAAAAAAAAAAAAAAAEAAAD/AAEAAAAAAAAAAP8AAP8AAAAAAAAAAP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQD/AAAAAf8AAAAB/wAAAAEA/wD/AAH/AAAAAAEA/wD/AAAAAAABAAAAAAAAAAAA/wAAAAAAAAABAAAB/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wABAAEAAQIBAAEBAgAAAAAA/wD/APz7+wD5+fkA+vn5AP7+/gABAQIAAAAAAAEAAAAAAAAA////AAABAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAUEAwANDQz+CwoK+Pf39/Py8vL7+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PX1//7+/vkDAwPxAgIC+QAAAP8AAAAA////AAABAQAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAEAAQH/AAAAAAD9/fwA9/f2APz9/AAHBggABAUEAAIBAQAAAAAAAQEBAAE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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAQEAAAAAAAEAAAAAAAAA/wAAAAAA/wAAAAAAAQABAP///wD///8AAAAAAAAAAAAAAQEAAAAAAAEAAAAAAAAAAAEBAAAAAAD///8AAAAAAAEBAAD//wAAAP8AAAEBAQABAQAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAAEBAQD//wAAAAD/AAEBAQAAAAAAAQEBAAAAAAAAAAAA////AP8AAAAAAAAAAQAAAAAAAAAAAAAA/wD/AAD/AAABAQEAAQEBAAMEAwAEBAQAAQEB/woJCv8ODg7/BwcH/vT09AA3Nzf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyO0CKAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//f1+4GsGa6XwAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/dark/Weather.png b/arma/client/addons/phone/ui/_site/images/dark/Weather.png new file mode 100644 index 0000000..207b259 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/Weather.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/iCloud.png b/arma/client/addons/phone/ui/_site/images/dark/iCloud.png new file mode 100644 index 0000000..de1795b Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/dark/iCloud.png differ diff --git a/arma/client/addons/phone/ui/_site/images/dark/iCloud.png.b64 b/arma/client/addons/phone/ui/_site/images/dark/iCloud.png.b64 new file mode 100644 index 0000000..ee9c704 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/dark/iCloud.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEQHzUm+xAAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMCD///+/AAAAIAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAQABAP////8BAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAQAB/wABAAH///8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAf////8AAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAA/wD/AAEAAQD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAP////8AAQEBAQAAAAAAAAAA/wD//wEAAQEBAQHgEBAQMcDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6//AP8f/////wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP////8AAAAA/////wD/AP8BAAEA/wD/AAEBAQH///8AAAAAAf//////AP8A/////////wD+/v7/////AAAAAAD///8AAQABAQAAAAD/AP8AAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAEAAP///wD///8AAAAAAP//////////AAAAAP////8BAAEBAQABAQAAAAD/AP8BAAAAAAAAAAAA/wD/////AQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAf///wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/wAA//////8A/wD/AP//AAAAAAAAAAAAAAAA/////wEBAQEBAQEB//////8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAEAAQABAAAAAAAAAP8AAAAAAP8AAQAAAAD+/v4f8PDwvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4ujwAAAE8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAAAAAAEAAAD/AQEBAQEBAQEAAAAAAQABAP///wAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAAAA/wABAAEAAAAAAAAAAAAAAAABAQEA/////wEBAQH///8AAAAAAAAAAP8BAQEB////AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAEBAQH/AP//AP8AAQEBAQAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAQAAAAAAAQD/AP8AAAABAQEBAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQEBAQD/////AQEBAQD/AAAAAAABAAAAAAABAAABAQEBAAEAAQD/AAAAAAAAAQEBAQD/AP8AAAABAAAA/wAAAAAAAAAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAQAAAP8A/wEBAQEBAQEA/////wABAAEA/wD/AQEBAQAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AQEBAf///wABAQEB/wD/GBcXFxDp6em5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBf////iAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAD//wD/AAEAAQAAAAABAAAAAAAAAP8AAAAAAAAAAQABAAAAAAAAAQEBAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAABAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAEAAAEBAQEA/wABAAAA/wAAAAEAAAAAAQEBAAD/AAAAAAD/AAAAAQAAAP8AAAABAAEAAQAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAD/AAEAAQAAAAEAAAD/AAAAAQAAAAH///8AAQABAQEBAQEAAAAAAQEBAAEBAQD//v//AQEBAAAAAAAAAQABAQEBAf/+//8BAQEBAAAAAAAAAAAAAAAAAAAAAf////8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEAAAAAADgZGRnR6Ojo2AAAAAAAS4rHFQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OCD39/e/////IAAAAAAAAAAAAQEBAP///wD/AP8AAQABAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAAAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAABAAAA/wAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEB/////wEBAQEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAD/////AAAAAAEBAQAAAAABAAAAAAAAAAAAAADvEhISIsDAwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29oD///8gAAAAAAAAAAD///8A////AP///wABAAH/AAAAAP///wD///8AAAAA/wAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAP////8AAAAA////AP8A/wD///8AAAAAAAAAAAD/AP8AAAAAAP////8AAQAB////////////AP8A/wD/AAD/AAAAAAAAAQEBAf8A//8AAAAAAAAA/wAAAAD/////////AAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD//v//AAAA/////wAAAAAAAAAAAAAAAAAAAAAA////AAEAAQEAAAAAAQEBAAAAAAD/AP//AAAAAf////8AAAAA/wD/Af//////AP8AAAAA////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wH//////wD/AAAAAAD///8AAAAAAQAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAQAAAAD/AP8AAAAAAP///wAAAAAA////AP8A/wD//////wD/AAAAAAD/////AQEBAQAAAAAAAAAA////AAAAAAABAQEBAQEBAQAAAAEAAAAAAAEAAAAAAAD/AP8R8PDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwIP7+/t////8AAAAA/wEBAQH/////AQEBAQAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAEAAQD/AP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAABAQEB/wD/AAD/AAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEBAQH///8AAAEAAAD/AAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAQEB/wD/AAEAAQD/////AAAAAAEBAQH///8AAAAAAAEBAQD/AP8AAP8A/wAAAAEBAQEA/wD/AAD/AP8BAQEBAAAAAAAAAAAAAAAA/////wABAAEA/wD/AAEAAQEAAQD///8AAAAA/wAAAAEAAQAAAP8AAAAAAP8BAQEB/////wAAAAAAAAABAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD/////AAEAAQD/AP8BAQEB////AAAAAAABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wEBAQH/////AAAAAAAAAAEAAAAAAAAAAAAAAP8AAQABAP8A/wABAAEA/wAAAAAAAAMDAyHQ0NDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f/////8AAAAAAAAAAf///wAAAAAB/wD/AP////////8A//////////8AAAAAAAAA//8A/wABAQEA////AAAAAAAAAAAAAP8A/wAAAAEBAQEA/wD/AAAAAAAAAAAAAAAAAQAAAAD///8AAQABAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAQEBAf////8BAQEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAA/wEBAQH///////////////8AAAABAAAAAf///wABAQEAAAAAAP///wAA/wAAAAAAAAAAAAD///8AAP8A/wEBAQH///8A////AP////////8AAAAAAAD/AAAAAAABAAAAAP////8AAAAAAQEBAQAAAAAA/wAAAAAAAAEBAQH///8AAAAAAQAAAAEAAAAA/wD///8A//8AAAAB/wD/AP8A//8AAAAAAAAAAP///wAAAAABAP8AAAAAAAH/////AAAA/wAAAAAAAAAA////AAAAAAAAAAAB////AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAP7+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////QAAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEAAQH/////AQEBAQAAAAAAAAABAAAAAQAAAP////8AAQABAAAAAAAAAAD//////wEBAQEAAAAA////AAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAA/v7+/wAAAAH+//4AAAAA/wAAAAD/AP8A/wD//wAAAAAAAQABAAAAAP///wAAAAABAQABAAAAAAEAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD/////AAAAAQAAAAAAAAAAAAAAAf///wAAAAAA/wD//wAAAAEAAAAAAAAAAQAAAP8AAAAA/////////wAAAAAA////AAAAAAAAAAAAAAAAAP////8AAAAAAAAA////////AP8AAQABAQEAAQH/AP//AP8AAAD/AAABAQEAAQEBAAAAAAAAAAD/AAAAAAAAAAD///8AAAAAAQAAAAD/////AAAAAAAAAAAAAAAAAAAAAAD/AAD+//7/AAAAAf7//v8AAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAA/wEBAQAAAAAAAAAAAP///25AQEAQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBQ////IAAAAAAAAAAAAAAAAP8A////AP//////AAAAAAEAAAD//////////wH//////wD/AAAAAAAAAAAB////////////AP//AAAAAAAAAAH///8A////AAAAAAAAAAABAAAAAP7//gAAAAAA//////////8AAAD/////AP8A/wAAAAAAAAAA//8A/wEAAAAAAQEBAf////8BAAEAAAAAAf8A/wABAAEBAQABAQAAAAAA/wAA////AAAAAAAAAAAA////AP8A//8AAAAAAAAA/wAAAAD/////AAAAAP8A/wABAQEB/////wAAAAAAAAAA/////wAAAAAAAAAAAQABAQAAAAD//////wD/AP8A/wAAAAAAAQABAQEBAQEAAAAA////////////AP8AAAAA//8A/wEAAAAAAQEBAQAAAAABAAEA/////wAAAP8AAAAB////AAAAAAD///8A////AP////8AAAABAAAA//////8BAQEB////AP////8AAAAB/wD///8A/wD/AP8AAAAAAAAAAAABAAEBAAAAAAD/AAEAAAABAP8AAP8A//8AAAABAAAAAAAAAAAAAAAAAAAAAf///wAAAAD/AAAAAAAAABHx8fEvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5Q////AP////8AAAAAAAAAAAEAAQEA/wAAAAAA/////wAAAAABAAEAAQAAAP8BAQEBAP8AAAAAAAAAAAAAAQEBAQABAAEA/wAAAAAAAP///wAAAAD/AAAAAQAAAAD/////AAAAAQEAAQD/////AAAAAAEBAQH///8AAAAA/wAAAAD///8AAAAAAQD/AP8AAAAA/wD/AAAAAAH/////AAAAAAEAAQD///8A/wD/AAAAAAAAAAAAAQEBAf8A////AP8AAAEAAQD/AAH/AP8A/wD/Af////8AAAAB////AAEAAQAAAAAAAAAAAP////////8AAQEBAf8A/wD/AP8A//////////8AAAABAP8AAAD/AAH///8AAAAAAP///wD///8AAAAAAAABAAEBAAEA/wD/AQD/AAAAAAAA/v7+/wABAAH/AP8AAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAA////AAEBAQEAAAAA////AAECAQH///8AAAAA/wAAAAH/////AAAAAQAAAAAA/wD/AAAAAAAAAAD///8A/////wAAAP///////wD//wEAAQH//////wD/AP///wD//////wD/AP///wAAAAABAAAAAAAAAAD9/f1QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAH///8A/wD/AP////8AAAABAAEAAQABAAD///8AAP8AAAABAAEAAAAAAAAA//7//v////8A/wD/AAD/AP8AAQAB/////wAAAP8AAAAAAAAAAP///wAAAQABAAAA/////wAAAQABAQEBAf8A/wAAAAABAAAAAAD/AP8AAAAA////AAAAAAD///8AAP8AAAAAAAAAAAAB////AP///wAAAAD/AP8AAP///wD///8A////AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAQAAAQEBAP//////AP8AAAAAAAAAAAEAAAAA////AAAAAAABAAEAAAAAAAAAAAEAAAD/AQEBAAAAAP8AAAAA/////wAAAAAAAAD/AAEAAQAAAAAAAAAAAP8AAAABAAD///8AAAAAAQAAAAAA/wAAAAAAAP///wAA/wAAAAAAAAAAAP//AP8AAAAAAP///wAAAAAAAQEBAf/+/wAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAB////AP///wAAAAAAAAAAAQAAAAAAAAABAP8AAQAAAAAAAAABAP8A/wABAAAAAAAAAQABAAABAAD///8A////AP///wAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEBAQBD+/v4xAAAA/wAAAAAAAQAAAP8AAP8A/wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAD///8AAAAAAQEAAQEAAAAAAP8AAAAAAAEAAAAA/wD/AP///wD/AP8AAAAAAAAAAP///v//AAAAAQAAAAAA/wAA/wD/AAD/AAAAAAAAAAAAAQAAAAH/AP///wD//wAAAAEAAAAAAAAAAP//////AP//AAAAAAAAAAAAAAAB/wD//wAAAP8AAAAAAAAAAP8A/wEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAA////AAAAAAEAAAAAAAAAAQAAAAABAQEAAAAAAAD/AAD///8AAAAAAQAAAAAAAAAB/wD/AAAAAAAAAAAA////AAAAAAD/AP8AAP8AAAD/AAD/AP8AAAAAAAD/AAAAAAD/AAAAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEA/wAAAAAAAAAAAAD///8A/////wAAAAAAAAD/AAAA//8A/wD/////////AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAAAAAAAAAAAAD/AAAAAAAA////AAD/AAAAAAAAAAAAAAAAAAD+/v4gQEBAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPDw8DAAAAAA/wD/AQAAAAD///8A/wD/AAEAAQEAAAAA/////wAAAP//////AAAAAP//////AP8AAAAAAP////8AAAAAAAAAAAAAAAD///8AAQABAQAAAAABAAEB/wD/AAAAAAEBAQEB//////8A/wD///////7//wAAAAD/AP8A//////8A//8A/wAAAQABAQAAAAAAAAAAAAAAAAEBAQEAAAAB//////////8AAAAAAP8AAP///wAAAAAAAAAAAAAAAAAAAAABAAAAAP////8A/wAAAAAAAAAAAAH/////AAAAAAAAAAD//////////////wD///8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA//7/AAAAAAEAAAAAAQEBAQAAAAABAAEBAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAA//8A/wD/AP8AAAAAAP8A/wAAAAAAAAAA/////wD///////////8A/wD/////AAAAAQAAAAAAAAABAAAAAAEAAQAAAQAB/////wAAAP8AAAAAAAAAAP8A/wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAA/wD/AP////8AAAAA6+vrIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/Q8AAAAAAAAAAAAAAAAA/wAAAQABAP8A//////8AAQEBAf///wAAAAAAAAAAAAEBAQEA/wD/AAAAAAEBAQH/AP8A/wD/AP///wABAAEAAAAAAAABAAH/AP8AAAAAAP8A/wAAAAAAAQEBAQD/AAABAQEBAAAAAP////8A/wAAAAAAAAEAAQEAAQAB////AAAAAAAAAAAA/wD/AAAAAAABAAEAAQEBAQABAAH/////AAAAAAAAAAD/AP8A////AAEAAQD///8A/wD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP///wAAAAABAAAAAQEBAQD/////////AP///wD/AP8A/////wD/AAD/AP8AAAAAAP8A////AP8AAAAAAAAAAAD/////////AAEAAQD/////AAAAAP8A//8AAAAB/wD/AQD/AAAA/wD/AAAAAAD/AP//AP8A////AQAAAAABAQEBAQEBAQEAAQABAQEBAAAAAP///wD///8A////AP////8BAAEAAAEAAf8A/wEAAAAAAAAAAAEAAQD//////////wEBAQH///8A/////wAAAAD/AP8A/wD/AAAAAAEAAAAA////AP///wD/AP8AAP8A/wEBAQH/////AwMDLwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBATH/////AP8AAP////8BAQEA////AAAAAAEAAAAA////AAAAAAEAAAAA//////////8AAAAB//////////8A/wAAAP8A/wABAAD/AP8A////AAD/AAAA/wAAAAAAAAD/AAD///8AAAAAAAAAAP//AP8AAAEAAQAAAAAAAAD/AAAAAP//////////AAEAAP///wD///8AAP8A//8A/wD///8A/wD/AAD/AP8AAAABAAAAAQEBAQEA/wAAAQEBAP////8AAAAAAP8AAQAAAAD///8AAAAAAP///wAAAAAA/////wABAAAA/wD/AAAAAP///wAAAAABAQEBAAAAAAABAAEAAAAAAQAAAAAA/wAAAAAAAP///wAA/wD/////AP////8AAAABAAAA//////8AAAAA////AAEAAQH///8AAP8AAAABAAAAAAAA/wD/AAAAAAEAAAAAAAAAAP///////////wD/AAAAAAD///8A////AAAAAP8AAAD/AAAAAAABAAEAAAAAAAAAAAD/AP//AP8A/wD/AP////8BAQEBAAAAAf///wAAAAD/AAAAAf///wAA/wD/AQABAP////////8AAAAA/wEBAQAA/wAAAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQEBAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAAAAAEAAQAAAAAAAQEAAQAA/wAA/wD//wAAAAAAAAAAAP8AAP////8AAAAA////AAAAAAEA/wAAAP8A/wABAAEAAAABAAAAAQAAAAECAQIBAP8AAP8A//8AAAD/AAAAAQD/AAD/AP//AP8AAAAAAAEBAQEAAAAAAP7//v8BAQEA////AP///wD/AP//AAAAAP8A/wD/AP//////AP////8AAAD//wD/AAD/AAAAAAABAAEAAAAAAAAAAAAA////AAAAAP//////AAAAAP8A//8BAQEA/wD/AAEAAQEAAAABAAEAAAABAAEAAAD/AAAAAf///wAAAAABAAAAAP///wAAAAAAAAAAAAD/AAAAAAAAAP8AAP////8A/wAA/wD//wAAAAD/AP8AAP8AAAAAAAAAAAAAAQEBAP8A/wAAAAAAAAAAAf/+//////8A//7//wAAAAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAAAAP8AAAAB/v/+/wAAAAAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/AAAAAAABAAAAAAAAAAAAAAEBAQEBAQEAAAAAAP////8AAAAA/wD/Af////8AAAAA/wD///////////8AAAAAAAEAAQEAAAAB/////wAAAAAA/wAAAQEBAAAAAAD+/v7/AAEAAAEAAQH///8AAAAAAAEBAQEAAAAAAAAAAAEAAQEBAAEBAAAAAAABAAAAAAABAQABAQAAAAD/AP8AAP8AAP////8AAAAAAAAAAP8A/wAAAAAB/////wEAAQH+//7/AAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAB/wD/AAEBAQEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wD/AAEBAQAAAAAAAAAAAf8A/wEBAAEBAAEAAP7//gAAAAAA/v/+AAEBAQEAAAAB/////wEBAQEAAAAAAAAAAAAAAAAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAICAg////8BAAAAAP////8AAQAA/wD/AAEAAQD///8AAQEBAf///wAAAAAA////AAABAAAA/wAAAAEAAAD/AP8AAAAAAAAAAQAAAAD///8BAAAA//////8AAQABAQABAAAAAAD+/v4AAAAA/wAAAAH/AP8AAQABAP8A/wH///8AAAAAAAEBAQEAAAAA/////wEBAQH/////AAEAAf///wAAAAAB/v/+AAEAAQABAQEB////AAEAAQD/AP//AQABAf8A/wAAAAAA/////wABAAEBAAEAAAAAAAAAAAH/AP8AAAAAAAEAAQAA/wAAAAEAAAccLQEEFSMABhUjAAMVIgEBBwwABQ4YAQAAAAD/AAABAP8AAP3y6AD88ukA//jzAPnk0v/87N4B++bUAP8A/wABAAEAAP8AAAAAAAD/AP8AAP8AAAABAAABAAEAAQABAP///wAAAAAAAQEBAP8A/wD/////AP8AAAABAAH/AP8AAAAAAP////8BAAEBAQEBAf8A//8BAAEBAAAAAP8A/wABAAEAAAAAAQABAAAAAAAAAAAAAAAAAAEAAQAA/wD/AAAAAAABAAEB////AAABAAAAAAAAAAAA/////wEBAQEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAEAAAEBAQEAAAAA/wD/AP8A/wAAAAAA/////wAAAAAA/wABAAEAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAAAP///wAAAAAAAAEAAQD/AAA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///8AAAAAAQEBAf8A/wAAAQAB/wD/AAAAAAEAAAD/AQABAf8A/wAB/wH/////AAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAD/AAAAAAAB/wD/AAEAAf//AP8BAP8AAAEBAQH/AP8AAQABAAAAAAD/AP8AAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIDAhD+/v4AAAAAAAABAAH///8AAAAA/wABAAEAAAAAAQABAAABAAD///8AAAAAAQEBAQAAAAAA/wD/AP8A/wEBAAEAAAAAAP8A/wABAAEA////AP8A/wAAAQD/AP8AAAABAAEAAAAAAAAAAP8A/wAAAQABAP8AAAAAAAH/////AAAAAf8A/wAA/wAAAQEBAP////8AAAAAAAAA/wAAAAD/////AAAAAP8A//8AAAABAAAAAP///wAAAQABAP8A/wEBAQEAAAABDi5GAA81UwADCQ4A/wEBAAEBAQD/AQEAAQIBAAIAAQABAgIA/gABAAEBAAD/AAEAAAEAAAD/AQACAQAA//8BAAAAAAD/AAAAAQEBAAH/AAAAAAAAAP8AAAABAAAA//8AAAEBAAD//wAAAQEAAAEBAAABAQAAAAEAAQICAAQOFwARTYMA9tCuAPbWugEBAQEA/v/+/wEAAQAAAAAAAAAAAQEBAQD///8B/wD//wEBAQH///8AAQEBAf8A/wABAAEA/wD/AAD/AP8AAQABAP8A//8B/wAA/wAAAAEAAf8A/wEA/wAAAAEAAP8A/wAA/wD//wH/AQD/AP8AAAAAAAAAAQABAAD/AP8AAP8A/wAAAAH/AP8AAQEBDwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP79/hAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA/wAA/wD/AAAAAAAAAAD/AAAAAP///wAAAAABAAAA/wAAAAH+//7/AQABAAABAAH///8AAAAAAAAAAP8A/wABAAAAAP///wAAAQAA////AAAAAAAAAAAA/wD/AAAAAAAAAAABAAAAAAD/AAAAAAAB//////8A/wACAQIB////AAAAAP8AAAABAAAAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAAAAf///wARNVAAEDdSAAABAwD/AQEAAQEBAAECAgAAAQIAAQEBAAABAQAAAQAAAgEBAAAAAgAAAQEAAP8BAAABAQABAQEAAAAAAAAAAAAAAAAAAQAAAP4A/wAAAAEAAQEAAP/+AAAAAQEAAQACAAABAAAAAP8AAAEBAAECAgD//f8A//8AAAAAAAABBwsACjVaAAAFCQD20bEAAQABAQAAAAAAAAAAAAAAAP///wAAAQAAAP8AAf///wAAAAAB////AAAAAAD/AP//AAEAAQAAAAAAAAAAAQEBAf8A/wD/AP//Af8BAAAAAAD/AP//Af8BAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAQD/AAAAAAAA////EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//////AP//AAAAAP////8AAAAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAABAAEBAAEAAQD/AAD/AP8A/wD/AAAAAAH/AP8A/////wAAAP8A/wAA/wD///8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAQAAAAD///8AAAAAAP8A/wEAAAAAAAAAAAAAAAD//////wD//wABAAAAAAAA/wD/ABVDYwARN1EAAQICAAECAgACAgIAAQMCAAABAQABAgEAAQIBAAEBAQABAQIAAQEBAAECAQABAAEAAQIBAAICAQAAAQAAAAEBAAABAQACAgEAAQIBAAIBAQABAQAAAQEBAAEBAAABAQEAAAAAAAABAAAAAAEAAQEBAP8AAQABAgIAAQICAP8AAQACAgIAAQECAAovUAAMOmEAAAAA//8A/wAAAAAAAAAAAP8A//8A/wAAAAAA/wAAAAAAAAAAAAAA//////8AAAABAAAAAAAAAAH///8A/v/+/wD/AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAD/AP////////////8AAAAA/wD//wABAAAAAAAAAP8AAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAAEAAAEBAQEAAAAAAAAAAP8A/wAA/wAAAP8A/wAAAAD/Af8BAAAAAQD/AP8BAQEB/////wABAAEAAAD/AP4AAAEBAQEA/wAAAQEBAP8A/wABAAEAAAEAAf///wABAQEAAQABAf8A/wAAAAAA/wD/AAAAAP8AAAABAQABAAEAAQH/AP//AAAAAQAAAAEAAAAAAAAAAAEAAQAAAAAAAAEAAP/+/wAAAAAAAAAAAAAAAAD/////F0RjAQ0pPAAAAgEAAAEBAAACAQAAAQEAAAECAAEBAQD/AQEAAQICAAAAAgAAAQAAAQECAP4AAAABAQEA/wAAAAAAAAACAQIA/v//AP//AAAAAAAAAP8AAAECAQAA/gAAAAD/AAACAQAA/gAAAAEBAAAAAQD/AQEAAAABAAEBAQAAAAAAAAEBAAECAgD//v8AAAEBAAEBAgAIIzwAAP8AAfPHnv////8AAQEBAQEAAQH/AP8AAP8AAAEBAQD/AP//AP8AAQEBAQD/////AQABAf8A/wABAAEAAAAAAf8A//8BAAEB/wD/AP8A//8BAAEB/wD//wD/AAEBAAEB/wD/AAAAAAD/AP//AQABAf/+//8AAQABAQABAAABAAH/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8BAQEA////////////AP8A/wD/AAAAAAAAAAAAAAEAAQAAAAAA/wAAAP8AAAABAAEAAAAAAAAAAQAAAAAA/wABAQEBAf8A/wAAAAAA////AAEAAQD///8AAAAAAAEBAQD//////wD/AAD/AAAAAAAAAAAAAAAAAAEAAAAA/wD/AP////8AAAABAP8AAAD/AP//AP8A////AP////////////7/AAABAAAAAAABAAAAAQAAAAATN08BDio8AAECAgACAgMAAgICAAABAgAAAQEAAgIBAAACAQACAgIAAQEBAAECAQAAAQEA/wAAAAEBAQABAgEAAQEBAAEBAQD/AAAAAQEBAAEBAQAAAQEAAQEBAAAAAAABAgEAAAEBAAABAQABAQEAAgIBAAECAQACAgEAAQEBAAABAQD/AAEAAAEBAAEBAgAAAQIAAQECAAABAAAAAQIAByM6AAotTQEAAAAB/wD//////wAA/wD/AAEAAf////8BAAEBAAAAAP///wAAAAAB/////wD/AAD/AP8AAAAAAAEAAQH/AP8AAP8AAAD/AAH/AP8AAQABAQEAAQD/////AP8AAAEBAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAA/wD/AQEBAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQH/////AAAAAQABAAAA/wAAAAEAAAD/AP8AAAABAQEBAP8B/wEA/wAAAAAAAAD/AP/+AP4AAQABAAAAAAEAAAAA/v/+/wIBAgH/Af8AAP8AAP8A/wAAAAD/////AQAAAP8AAQABAP8AAAAAAP////8BAAAA/wAAAAEAAAD/AQEBAf8A/wAA/wAAAAEAAAD/AAAA/wAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAP8A/xAvQwEUOFAAAAIDAAABAwABAgIA/gACAAICAgD/AQIAAQECAAEBAgAAAQEA/wEBAAAAAQAB/wEAAQIBAP8AAQAAAAAAAAEBAAAAAQAAAAAAAAABAAEAAAAAAAAA/wEAAAD/AQAA//8AAAAAAAD/AAAAAv8A//4BAAEAAQD/AQEAAAEBAAECAQABAAIA//4AAP8A/gAAAQEAAQEBAAABAgAAAf8AAAECAAotTgD/+vYA99i9AAAAAAAAAAAAAP8AAAABAAH/AP8AAAEAAAD/AAAAAAAAAAAAAQABAAAA/wAAAAAAAP8B/wAA/wAAAAAAAAAAAAAAAAAA////AAAAAAAAAAABAAAAAP///wABAQEA/////wAAAAD/AP//AAAAAQAAAAD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAB/wD//wD/AAD/AP//AP8A/wABAAH/AP//////AAD/AAAAAQAA/wD//wAAAAEBAAEBAAAAAQAAAAAAAAAAAQEBAf///wAAAAAAAAEAAAD/AAAAAAABAAAAAAAAAAEA/wAA/wD//wAAAAEAAAAAAAAAAAABAAAAAAAB////AAAAAAEAAAD/AP8AAAABAAEAAAAA/wD//wAAAAAAAAD//wD/AAAAAAD///8ABQ4UARU5UAABAgIAAQECAAECAgABAQIAAQICAAECAgABAQIAAAEBAAABAQAAAQEAAAABAAICAQABAgEAAAEBAAEBAQAAAQEAAQEBAAABAQABAQEAAAEBAAABAQAAAQEAAAAAAAAA/wABAQAAAQEAAAECAQABAQEAAAEAAAAAAQABAQEAAgIBAAEAAAAAAAAAAAAAAAECAQABAQEA/wEBAP8BAQABAQEAAAEBAAABAQAKLUwAAgwTAQAAAAAAAAABAAAA/wD/AAAA/wAAAP8AAAAAAAD/////AAAA/wD/AAD/AP//AAEAAP////8AAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAP8A///+//7//wD/AP8A/wABAQEBAQEBAAAAAAABAAEB/////wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAABAAEBAAAAAf///wABAAEB/wD/AAAAAAAA/wAAAQABAQAAAAD/////AAAAAP/+////AP//AAAAAP///////v///////wAAAAAAAAAAAAAAAP8A//8AAAAAAQEBAQAAAAD/AP8A////AP/+/wAAAAAA/wD/////////AP8A////////////////AQABAf//////AP8BAQABAP8A/wABAAEAIFV1AAMJDAACAwMAAgMCAAICAgAAAgEAAgMCAAEBAQACAwIAAgICAAECAgABAgIAAQIBAAAAAQABAgEAAgEBAAABAQABAQEAAQEBAAECAQAAAQEAAgIBAAEBAAAAAQAAAQEBAAICAgABAgIAAAICAAICAAAAAQEAAgICAAECAQABAQEAAAEBAAABAgABAgEAAgIBAAABAQABAQEAAQECAAABAQD/AQIAAQECAAECAgABBgwADTdfAAAAAAAAAAAAAAAAAf////8AAAAAAAAAAP8A//8BAQEB/wD/Af8A//8A/wAAAP8AAAEAAQH/AP8A/wD///8A/wAAAAAB/wD//wAAAAAAAQAB/wD/AAD/AAABAAEBAAAAAQEAAQH///8A////AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8BAQEB/////wABAAEAAAAAAAAAAAD/AP//Af8BAAAAAP8A/wAA/wAAAQEBAAAAAAAAAAAB/wD/AAABAAEA/wD/AAAAAAEBAQH/AP8AAP8A//8B/wAA/wAAAAEAAAAAAAEAAAAAAP8AAP8A/wAA/wD/AAEAAQAAAP//AP8BBAcIARMjLf8OGh8BCRQZAAgPEwD/AQMAAgIEAPXu6AH68/EA797W//Hl3AELHSoABxAXAAABAgD/AgIAAAEDAAACAgABAQMA/gACAAEBAgAAAQIAAAECAAABAQAAAAEAAQECAAAAAQD/AAEAAAABAAIBAQD/AAEAAAABAAD/AAABAgEAAP8AAAACAgAA//8AAAEAAAD/AAD+//4AAQAAAAAAAQABAQAA////AAABAAABAgEAAP4BAAACAQD//gEA/wEBAAEBAQD/AQEAAQEAAAEAAQAAAQEA/wABAAAAAQABAQEABRcnAAkmPwD22cD/AAEAAQAAAAAAAAAA/wD/AAD/AAH/AP8AAAAA/wEBAQEAAQAA/wD/AAD/AP8BAQEB////AAEBAQD/AP8AAP8AAAABAAD///8AAAAAAAABAAD///8AAAEAAP8A/wABAAEA/wD/AAEBAQH/////AAAAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA/wAAAAEAAAAAAAEAAAAAAP8AAAAAAAAAAAAA/wD/AAAAAAAAAAD/AP8AAQAAAP8AAAAB////AAAAAAAAAQAAAAEAAQD/AAAAAAAAAQABAP8A/wD/////AAAAAAAAAAEAAQABAP8A/wcNDwEaMDsAFScuAAABAgEBAgUAAAIDAAECAwAAAgIAAAIDAAwYHgD/GQMAEig0Af8BAgD4/AMAAAQDAP8AAwABAgIA/wABAAACAgD/AAEAAgECAAABAgD/AQEAAAEBAAAAAgAAAAEA/wEBAAEAAQAAAAEAAAEBAAAAAQAAAAEAAAAAAP8BAQAAAAAAAAABAAAA/wABAAEAAAAAAAAA/wABAAEAAAAAAP8A/wABAAAAAAIBAAD+AQAAAAAA/wEAAAICAQD+/wEAAAEAAAABAQAAAQEA/wEBAAECAQAA/gEA/wIAAAIAAgD+AP8AAP//AAsuUAD438oB//v3AP8A/wH///8A/wD//wEAAQAAAAABAAAAAAAAAAD+//7/AQABAQAAAAH///8AAAAAAf///wAAAAAAAAAAAf////8AAAABAAAAAAAAAAEAAAAAAP8AAAAAAP//AP8BAAAA//8B/wEAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAABAAD+//4AAAAA/wH/AQEAAAAAAP8AAP8A//8B/wEBAAAAAAAAAAD/AP//Af8BAf8A//8AAAAAAQEBAP///wAA/wD/AQIBAQD/AAAA/wAA/wD//wEAAQEAAAAA////AAAAAAAAAAABAAAAAAAAAAAA/wAAFyszAR84RAABAgIAAgMEAP8BAwABAgMAAAIDAAECAwD/AQIAAgMEAP4BAgABAQMAAAIDAAADCAAGCQoAAQIDAPz9/wD+/wEA/wECAP8BAgABAAMAAAICAP4AAgABAQIAAAACAAAAAQAAAQIAAAABAAABAQABAAEA/wAAAAAAAQAAAAAAAAABAAD/AAABAQEAAAABAAEAAQD/AP8AAAABAP4A/wABAAEAAAD/AAAAAQAAAQAAAP7/AAACAQD//f8AAgECAP///QABAQEAAAICAAAA/wAAAAEAAAABAAD/AQAAAgEAAf8CAP8A/QABAQEAAAEBAP8GCgAIJ0IA9tO0//8A/wABAAEAAQABAQAAAAD/AP8AAQABAf///wABAAEBAAAAAP8A//8AAAAAAAAAAAEAAQEAAAAAAAAAAAAAAAEAAAAA/wD//wEAAQEAAAAAAAAAAAAAAAH/AP//AQABAQD/AAAAAAABAQAB/wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAABAAEAAAAAAQAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAABAAEAAAH/AQEAAAAA////AAAAAAABAQEBAP8AAAAAAAAAAAAAAP8AAAABAAAAAAAA/wD/AAD/AP8AAQAAAQABAQQHBwAmRFMADhofAAECAwAAAgMAAQIDAAICAwD/AQIAAQMEAAABAgACAwMAAAEDAAIBAwAAAgIAAAEEAPwFCQACAwMA/wACAAMDAgADAAIA+/3/AAEBAwD/AAEAAAEDAAIAAgD/AAEAAAEBAAEBAwD/AAEAAQABAP8BAQAA/wEAAAAAAAABAQAA/wEAAAAAAAIBAQD/AAAAAQEBAP//AAAAAQAAAP8BAAIAAgD/AP8A/wAAAAEAAAD//wAAAAECAAEA/gABAwIA/v7+AAAAAgABAP8AAP0BAAABAgAAAf8A/wABAAECAgD//f8AAQIBAAD/AgD//v8AAgICAP4A/wAKJkAA9dKzAAEBAQH/AP8AAQABAAABAAAB/wEA/////wABAAABAAEBAAAAAAEAAQEAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wABAQEAAf8BAAAAAAAAAAD/AAAAAQAAAAAAAAAA/////wEBAQEAAAAA/wD/AQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAAAAAD/AAAAAf////8AAQAAAQABAf///wABAQEAAP8AAP////8AAQABAP8AAAABAAEAAAAA/////wAAAAAAAQAAAAEAAf8A/wAAAAAAAQABAP8B/wEA/wD//wD//ytMWwELFBkAAQIDAAACAwABAgMAAAIDAAECAwAAAQIAAAIDAAEDAwAAAgMAAAIEAP8BAgAAAQMA/wMGAAMEBgD/AQIA/wABAAABAgD/AAMABgIBAPv+/wABAQIAAAEDAP4AAQABAQIA//8AAAAAAgABAQEA/wECAAD+AAD/AQEAAQEBAP8AAQABAQAA//8BAAEAAAABAAAA/wAAAAEAAQABAAEAAAEAAP//AAD//gAAAgIBAP7+/gAB/gEAAQH/AP/+AAD/AP4AAQIBAAEAAgD/AP8AAAAAAP/9/wAAAgIAAf//AAD+/wAAAgEAAP4BAAABAAABAQEA/wEAAAAAAAACCA4ABhcmAPrp2v8AAQAB////AAAAAAAA/wD/AAAAAAD/AAD/Af8AAQABAAAAAAD/AP8AAAAAAP8A/wAAAAAAAAAA/wEAAQH//v8AAI8Hl1wAACAASURBVAAAAQABAAAAAAABAQABAP8A//8A/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAQAAAAABAAEAAAAAAAEA/wAB/wD/AAAAAAD/AP8A////AAABAAEA/wAAAAAA/wD/AAD/AP8AAAEAAQEBAQEA/wAAAP8A/wAAAAAA/wD//wD/AAAAAAAAAQABIjtGAQwWGwACBAUAAgQEAAIDBAABAwQAAgQDAAEDAwACBAQAAgQEAAEDBAABAwQAAQMDAAIDBAACAwMAAAQFAAABAQABAQIAAgIDAAEBAgABAgIAAQMDAAQFBAAAAQIAAAEBAAEBAgAAAAEAAQECAAABAAAAAQEAAAAAAAECAQACAgEAAQEAAAIBAAAAAAAAAgEBAAEBAQAAAQEAAQEBAAEBAAAAAQAAAAAAAAAAAAABAQEAAAAAAAIBAQABAgAAAAAAAAABAAAAAQAAAQABAAABAAAAAQEAAAAAAAABAQABAQAAAgIBAAABAQABAQEAAQABAAECAQAAAQEAAAEBAAECAgAAAgEACSM7AQAAAAEA/wD/AAAAAAD/AAAAAAABAAEAAQAAAAEA/wAA/v/+/wAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAf///wAAAQAAAAAAAAD/AP8AAAAA/////wD/AAAAAAABAP8AAf8A/wD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAP8AAP8A/wABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQAA//7/AAEBAQD///8AAAAA/wAAAAH/AP8AAQABAP////8BAQEBAP8AAAAAAAAWKC4AGi84AAICAwAAAwMAAQIDAAABAgABAgIAAAIDAAEBAwD/AgMAAQMDAAABAwABAwMA/wEDAAECAwD+AAEA/wEFAAICAgD+AAAA/wEBAAEBAgD/AAEAAAEAAAL/AgACAgAA/wEBAP///wABAAEAAAABAAEBAQD+AAAAAQAAAP//AAAAAAAA/wAAAAEAAAACAgEA//8AAAEAAAD//wAAAAD/AAABAQAB/wAA/wEAAAEAAAAAAAAA//8AAAAAAAABAAAAAAEAAAAAAAAA/wEAAAH/AAD/AAD/AAAAAQEBAAABAAD//wEAAAEBAAEBAQAAAQIAAAL/AAD+/wAAAf8AAAIBAAD/AQABAQIABx0wAAAAAAD/AP8AAQABAAAAAAAAAAAAAP8AAP8A//8BAQEBAf8BAf///wAAAAABAAAAAP8A//8B/wEBAAAAAAAAAAAA/wAAAAAAAAAAAAEA/wD/AAAAAQABAAAA/wAAAAAAAAD/AAAAAAABAP8A/wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAQEAAAD/AAAAAQAAAAD/AP8AAAAA/wEAAQH/AP//Af8BAQAAAAAAAAAA////AAAAAAAAAAAAAQEBAQAAAAABAAEA////AAABAAAAAAABAAAAAAAAAAD//v//AQEBAQABAAAhN0IAAwUGAAECAgABAgMAAAECAAACAgABAgMAAAIDAAECAwAAAgMAAQIDAP8BAwAAAgMAAQECAAACAwABAQQAAgIDAAACAwACAAEA/wEDAP8AAQACAAIAAAEDAP3/AAAEAwEA+/0AAAIBAQAAAQIA/wABAAAAAQAB/wAAAAACAAABAAAAAAEAAgABAAAAAQD/AAAAAAAAAAEAAQACAQAAAAABAP//AAAAAQAAAP//AAAAAQAAAQAAAP4AAP8AAAD/AAAAAAAAAAEAAgAAAv4AAP4BAP8BAQACAgIA/gD/AAEAAgAAAP8A//0AAAECAQD//wAAAAEBAP8AAAABAgEAAP4BAP8BAQAAAgEAAwcLAAUXJAD66dsAAAAAAP8A/wAA/wD/AAEAAQAAAAAAAAAA/wD/AAEAAQD/AP//AP8AAQAAAAAAAAAAAAAAAP////8BAQEBAAAAAP8A/wAA/wAAAQEBAP///wAAAAAAAQABAP8A//8BAAEB////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEB////AAAAAP8AAAABAAEAAQAAAAAA/wAA/wH//wAAAAEA/wD/AAAAAQEBAQD/AP8A/////wAAAAAAAAAAAAAAAf8A/wAA/wD//wD/AAEBAQH/Af8B/////xgqMQEJERUAAAICAAIDAwAAAQIAAQIDAAADAwABAQMAAAICAAECAwD/AQMAAQIDAAECAwD/AAIAAAEDAAEDAwAAAgUAAAEEAP8BAgD/AAIA/gAAAAEBAwD//wEA/gIBAAIAAQD+/wEAAwIAAP4AAgD/AQAAAP8BAAEBAgAB/wAA/wABAAEAAAAAAAIAAP8AAP8BAAAA/wEAAgEAAP7+AAD/AAAAAAABAAICAAD+/wAAAAAAAAEAAAD+//8AAAEAAAEAAQABAQAA//8AAP/+AAABAAEA/wEBAAEBAQD/AAAAAgIBAP8AAQAA/wIAAQIAAP//AAAA/wAAAAD/AAL/AgD//gAAAAH/AAECAAAA/v8A/wIBAAUSHwD66NsA/wH/AAD/AP8AAAABAP8AAAEBAQEA/wAAAP8A/wABAAEBAAEB/wD/AAD/AAD/Af8AAAAA/wABAAH/AP8AAP8AAAABAAAAAAAB/////wABAAAAAAAB/////wABAAEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AP//AP8BAAAA/wABAAEAAAAAAAAAAP///wAAAAAAAQABAf///wAAAQABAP8A//8A/wEA/wAAAQEBAf///wAAAQAAAP8AAAEAAQD/Af8BAAAAAP////8AAAAAAAAAARosNQABAwQAAQMCAAECAwABAgIAAAIDAAECAwAAAgMAAQEDAAACAgACAgQA/wECAAEBAwD+AQIAAQMDAAABAgAAAQUA/wECAAABAgAAAAEAAgECAP4AAQAAAAIAAgECAP3+AAABAgIAAQEAAAEAAQAB/wEA/gABAP8AAAABAgEAAP8AAP//AgAAAQAAAAABAAAAAAABAQAA//8BAAECAAAB/wAA/wAAAP7/AAABAAAAAAEBAAAAAAACAAAA/wAAAAABAAD//v8AAAAAAAEBAAAAAAEA/wEBAAECAgAA/v0A//8BAAAAAQAAAgEAAAABAAD9AQAAAQEAAQECAAAC/wAA//8AAAICAAEA/wD+/wEAAQECAAUSHgAAAQABAP8A/wABAAEA/wAAAAAAAP7//v8BAAEAAQEBAf///wAAAQAAAP8A/wAAAAAA/wAAAAAAAQEBAQD///8AAQEBAP////8AAAABAAAAAAD/AAEAAQAAAAAAAAD/AP//AP8BAAEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAQEAAQABAf7//gABAAEAAAAAAP8A//8BAAEB/////wAAAAEAAAAAAAAAAQD/AAAAAAAA////AAAAAAAAAAAAAAEAAP///wAAAAD//wD/AAEAAQEAAAD/BAcJ/xIgJgEAAgIAAgIDAAABAgABAwMAAQIDAAABAgAAAQMAAAICAAABAwABAwQAAQACAP8DAgADAQMA/wECAAABAwACAwQA//8CAAABAgD/AQEA/wABAAH/AQAAAAIAAAABAAIDAgD/AAAAAv8BAP/+AAD+AQEAAQEBAAEAAAD/AAEAAAABAAABAQD/AP8AAAAAAAEAAAD/AAEAAQEBAAD//wD/AAAAAAAAAAEAAAAAAAAAAP8AAAABAAABAAEAAAAAAP8A/wABAQEAAAAAAP8AAAAA/wAAAgEBAP4A/wAAAQIAAQIAAAAAAAAA/gAAAAEAAP8C/wACAAAA/gD/AAD//wABAv8A//7/AAABAgABAf8A/wH/AAQTHwAA/wAAAAAAAQD/AAAAAAAAAAEAAAH/AQEAAAAAAAAAAAABAAAA/wAAAQEBAf7//v8BAAEAAAAA//8A/wEAAAD/////AQAAAAEAAQAAAP8AAQAAAAAA/wD//wD/AAAAAAAAAAD/Af8BAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEBAQEA/wAA/wD/AAEAAQD/AP8AAQABAAAAAAEAAAD/AAAAAQABAAAA/wAAAAEAAAD/AAAAAAD//wD/AQEAAQD///8AAQABAP8A/wAAAAABAQABAP////8BAQEBDRcaAAIEBQD1BAkA+QMIAPUDCAD4AgcA/wIEAP8CAgACAAEABAEAAAgBAAADAP4ACQH/AAkB/gAIAf8AAAACAP4BAgAAAQEAAAICAAEBAgD//wEAAQEBAAIAAgD/AAIA/gAAAAD/AAAB/wIAAAIBAAIAAQD///8AAAABAP4AAAAA/wEAAAEBAAEAAAAAAAIAAQEBAP7//wABAAEA//8AAAABAQAAAQAAAP8AAAEBAQD///4AAQAAAP8AAAAAAAAA/wABAAEAAAD/AQAAAAAAAAEAAAAAAgAA/v4BAAEAAgAAAv4A//4BAAECAQD+/wEAAQEBAAEBAQD/AQEAAAEBAAECAgD/AP8AAf//AP8B/wABAgIAAAD/AAQIDAAAAAAAAAAAAP8A//8BAAEBAP8AAP8A//8AAAAA////AQAAAP8BAQEB/v7+/wEBAQH/AP8AAQABAQD/AAAAAAABAAAAAP8A//8A/wAAAQABAP8A/wAAAAAAAAAAAAEAAQEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wD/AAAAAAABAAEAAAAAAAEBAQD///8BAQABAAD/AAD/AP//Af8BAf8A/wABAAEBAAAAAP////8AAAAA/wH/AQD/AP8BAgEB//7//wgOEAEbMz0ACDVHANcLHgD+AQIAAAEBAAIBAgABAQEAAwICAAIBAQABAQAAAAEBAPoBAgABAQEA+QEBAPIBAgAFAP8ACQH/AA0B/AABAQQAAwACAP8AAQABAgIA//8BAAEBAQD//wEAAQABAAIBAQD/AAEAAAABAAEAAAAA/gAAAAEBAAH/AQAAAQEAAP8AAP8AAAAA/wAA/wAAAAABAQABAAAAAAEAAAD/AAAAAAAAAQABAP8AAAACAAIA/gD/AAEAAAD/AP8AAQEAAAH/AQAAAQAAAQAAAP8BAAD+/gAAAQEBAP4AAAAAAAEAAQEBAP//AgACAgAAAAAAAAAAAAAAAAAAAAD/AP///wA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CAQEAAQEBAAIBAQACAQEAAgEBAAICAQABAAEAAQIBAAEAAQABAQEAAwICAP8AAAACAQIAAAABAAEAAQAAAQEAAQABAP8BAQD6AAAA/P8AAAsA/gD+AAAAAAABAAIBAQD//gAAAQEAAP/+AAAAAgAA//4AAAABAAAAAAEAAP8AAAEBAAAAAQAAAP8AAP7/AAAAAAAA/wAAAAEBAAD+/wEAAQEAAP//AQABAAAA/wAAAP8BAAAA/wAAAAEBAAD/AAAAAAAAAAH/AAABAQD+/f8AAQABAAABAAD+AQEA/QD/AAAAAAD/AP8AAAEAAAD//wABAQEA/wD/AP8BAAAAAQEAAQH/AAAAAAACAgEA//8AAP/9/gD/Af8AAAEBAAD/AAAA/wAA/wAAAA4tUwAKIDwA7sCJAPnn0QABAAEAAAAAAAEAAQD///8AAQEBAAABAAAA/wAA/wD/AAEBAQAA/wAAAAAAAf8A/wAA/wD/AQEBAQD/AAD/AP//AAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP////8AAQABAQABAP8A/wD///8A//////////8AAAABAAAA/wAAAAAAAAAA/wD/AAABAAD/AP8A/////wwXGgAITWoA9gUMAAICBAACAgQAAQIDAAEDBAABAgMAAgECAAICAgADAgMAAgICAAMDAgACAgIAAgICAAEBAgACAwIAAQACAAMCAgADAgIAAQABAAMBAgACAQIAAgIBAAICAQABAQIAAAEBAAEBAQABAgEA/wIBAPcCAwABAQEA/wABAP7/AAAAAAAA/wABAP8BAQAAAQEAAAEBAAEBAQD/AAAAAAEBAP4AAAD/AAEA/wABAAEBAAAAAQAAAAAAAP8AAQABAQEA/wABAAEBAQAAAAEAAAAAAAEBAQABAQAAAQIBAAABAQABAgEAAQEBAP8AAAACAgIAAAEAAP//AgAAAAEAAgIBAAEBAAADAwEAAAEBAAABAQAAAQAAAQEBAAEBAQAAAQAAAAIAAAABAAD/AAAA/wD/AAAA/wAAAQEAAAAAAAAAAAAAAAAAAAD/AP8A/wADDRcAFk2QAQ4zXwAAAAAA////AP8A/wD/AP8A/wD/AP/+/wD/AP8AAP8A///+/wAA/wAAAAAAAAD/AP8AAQAA/wD//wAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAA/wH/AAD/AAAAAQAAAP8AAQABAAAAAAAAAP8AAQAAAAD/Af8A/////wEAAQEAAAAACRETARpceAD2DRMAAgECAAEBAgAAAAAAAAICAAIBAgAAAQAAAwIBAAIBAQACAgEAAgEBAAECAQACAQEAAQABAAICAQABAAEAAQIBAAIBAQABAQEAAQACAAEBAAAAAAEAAAEBAAAAAAABAQEAAQABAP///wAAAAAA/wEBAP4AAQD7AAEABQH/AP7/AQD+/v8AAAABAAEAAAD+/wAA/wEAAAD/AAAAAQAA//8AAAEBAQD//wAAAAAAAAABAQAAAAAAAQEAAP//AAAAAAAAAAAAAP///wABAgEAAP8BAAD/AAD/AP8AAAAAAAEBAQAAAAAAAAAAAAEAAAD///8A/wEBAAECAAD+/gAAAQABAP8BAAD///8AAQEAAP8BAQABAAAA////AAAAAAAAAQAAAAABAP///gABAgEAAP4AAP8BAAABAQAA/v8AAAAAAAABAQAAAP8AAAABAAAA/wAA/wD/AA8zYAAAAAAA8c2gAP////8BAQEBAAAAAAAAAAAA/wAAAAAAAQABAAAA/wAAAP8AAAABAAEA/wAAAAAAAAAAAAAAAAD//wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wD/AAAA/wAAAAEAAQH/AQAAAAD/AAAAAQAAAAD/////AQABAQAAAAAAAQAAFURXAPcWIwACAQEAAAECAAABAgABAQEAAQICAAAA/wADAgIAAgEBAAMCAgADAwMAAQAAAAECAQACAAEAAQEBAAIBAQABAQAAAQEBAAEAAQABAQEAAAEAAAAAAQABAQEAAAABAAEAAQD/AAEAAAD/AAEBAQABAAEAAAAAAP3+AAD7AAEAAQEBAAH//wAAAQEA//8BAP8AAAAAAP8AAAEAAP8AAAAAAAEAAAAAAAD//wAAAQEAAAD/AAAAAQAAAP8AAAABAAEBAAD//wAAAAEAAAEAAQD///8AAQEAAP8AAAABAAEA//8AAAABAAD/AP8AAAAAAAD/AAABAQEAAAAAAP8A/wACAgEAAP//AAEAAQD//QAAAAEAAAEC/wAA/wEA////AAECAQAA/gAAAAD/AAABAgD///8AAAEBAAD//gD/AAEAAQEAAAAA/wAA/wAAAAEAAAD/AAAAAP8AAAAAAP8AAAAPM2EA/fn0APTTrAH/////AAAAAAEBAQH/////AQABAf////8AAAABAQABAP////8BAAEAAAAAAQAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAQABAAEBAQEBAAAAAP8A/wD/AP8AAAAAAP8A//8AAAAB/wD/AAAAAAAWMj0ABzZLAAECAwABAwMAAQMDAAIDAgABAwIAAgMCAAMDAwADAwIAAwMCAAAAAAABAQEAAgICAAMBAgACAgIAAgIBAAEBAQACAQIAAQACAAEBAgABAQIAAgECAAECAgACAgIAAQEBAAABAQACAQAAAgEBAAIBAQD/AAAAAAEBAAMCAQABAgEA+gABAAABAQABAgIA/gAAAAABAQD/AQEAAAABAAEBAgAAAQEAAAEAAP8AAQAAAQAAAAIBAAECAQAAAQEAAAEAAP8AAAAAAQAAAQEAAAABAAAAAQEAAAABAAABAQD/AAAAAAEAAP8A/wAAAAAA/wAAAAABAAAAAQAAAQEBAAEBAQABAQAA/wABAAICAQABAgAAAgIBAAEBAQD/AP8AAAEBAAABAAAAAQAA/wAAAAABAAABAQAAAQAAAP8AAAAAAQAA/wEAAP8BAQAAAQAA/wAAAAABAAD/AAAAAAEAAAAAAAD/AP8AETptAAcZL/8ACT+3FAAAIABJREFUAAABAAAAAAD/AAABAAEB/////wEAAQEAAAD//wD/AAAAAAAAAAAB/wD/AP8A/wAAAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQABAP///wAA/wD/AAAA/wAAAAEAAAAAAP8AAAD/AAAAAAAA/wD/ABFIXwD7AwYAAQMDAAECAwABAgMAAQIDAAICAwADAgIABAMDAAMCAwACAgIAAwMDAAEAAAACAgEAAQEBAAEBAQACAgIAAgICAAEBAQADAwIAAgICAAEBAQABAQEAAQABAP//AQABAAEAAQAAAAABAQAAAAEAAQEBAAEBAQAAAAAAAAABAP8AAAABAQEA/AECAP7/AAAAAQEA/v//AAAAAQAAAQEA/gAAAP8AAAAAAQEA/wIAAP8AAQD/AAAA/gD/AAABAAD/AQAAAAEAAAABAAD+AAAA/wAAAAECAAD/AQEA/wAAAAABAAABAgEAAAEBAAABAAAAAQEAAAEBAAABAQD/AQEAAAEBAAABAQABAgAA/wD/AAICAQABAAAAAQEAAAECAgACAgAAAQIBAAECAQACAgEAAAEAAAABAQAAAf8AAP/+AAECAgABAQEAAAEBAP8AAAAAAQAA/gD/AAABAAAAAAAA/wD/AAAA/wAAAP8AEkF6AQIGDAAA/wAA/wD/AP8A//8AAQABAAAAAAD/AAEA/wD/AP8AAf////8BAAEAAP8A//////8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wD//////wABAAAAAQABAAAAAQAAAAD///8A/wD/AAEBAQAA/wAAGDVBAPoUHwACAwIAAgIDAAECAwACAgIAAgMCAAMDAgACAgIAAgIBAAICAgACAQIAAgEBAAICAQABAAEAAgIBAAICAQABAAEAAgICAAECAQAAAQAAAQEAAAEBAQAAAQEAAgIBAAABAAABAQEAAAEBAAEBAQABAQEA/wEBAAAAAAD/AAAA/wAAAAIBAQD/AAAA/QAAAP8AAQD+/wAA/wABAP4BAAD/AAAAAQEBAAAAAAD/AAAAAQECAAABAAAAAAEA/wAAAAABAQD//wAAAAEBAP8BAQABAQAAAAEAAP8AAAD/AP8AAQEAAAECAgD/AAAAAAEAAAABAQAAAQEAAAEBAAABAQAAAAAA/wEAAAABAQAAAAEAAAAAAP8AAAD+AAAA/wAAAAAAAAD/AAEAAAD/AAABAAAAAQEAAAEAAAIBAQD//wAAAAEBAAAAAAAAAQEAAAAAAAABAQAAAAEAAQEBAP8BAAD+AAAAAAAAAP8AAAAAAAAABA0YAA0tVQAAAQABAP8AAAD/AAEAAAAA////AAEBAQAAAAABAAAA//8A/wD/AP8AAAEAAQABAAD/////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAD/AP8BAAEAAQD/AAAA/wAA////////////AP//AQABAf///wAAAAAACDdMAAECAwAAAQIAAAICAAEDAgACAgIAAwECAAMCAgACAQIAAwIDAAICAQADAwIAAgICAAEBAgABAQEAAQEBAAIBAgABAgEAAQEAAAIBAgAAAAIAAAABAAEBAQABAAEAAAAAAAEAAAAAAQEAAQEBAAAAAAAAAQEAAQABAAABAQABAQIA/wAAAAAAAAD/AAAA/v8AAPwAAAAAAQAAAAIBAAAAAQAAAQEA/wAAAAABAQAAAQEA/wAAAP8AAAAAAQAAAAABAP4AAAAAAQEA/gAAAAAAAAD/AAEAAAEBAAAAAQAAAQEA/wEBAP4A/wAAAAAAAAABAAAAAQABAAEAAAEBAP8AAAD/AQAAAAAAAAABAAAAAQEAAQICAAICAQACBAEAAQECAAECAQABAgEAAQICAAIBAQD/AP8AAQEBAP8BAAAAAP8AAAEBAP8BAQD/AAAAAAEBAAABAAAAAgEAAAABAAEBAQAAAQAAAAEAAAABAAD/Af8A/wD/AA0uVQABBgz/AAEAAAAAAAAAAAAA/wD//////wD/AP8AAAAAAQAAAAAA/wD/AAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD//wABAAAAAAAAAP8AAP8A////AP//AAAAAAEAAQEAAAABAAAAAAAAAAANGBoACiYyAAADAwABAgMAAgICAAEAAQACAwIAAgMCAAIBAgACAgEAAQEBAAMBAgABAAEAAgIBAAICAQACAQEAAQABAAEBAQACAQEAAAABAAEBAQABAQAAAQEBAAEBAQABAgAAAAAAAAICAgAAAAAAAAEAAP8AAAD//wAA/wAAAAAAAAD///8AAQEBAP8AAQAA/wEAAQEBAP8BAAD//wAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//wAA/wAAAAABAQD/AAEA/wEBAAEBAQAAAQAAAAEAAP8AAAAAAQAAAAEAAP4AAAABAQEA////AAAAAQD/AQEAAQIBAAAAAAAAAQAAAAAAAAABAQAAAAEAAAECAAABAgAAAQEAAAABAP8AAAABAQEAAAEAAAAAAAABAQAAAAAAAP8AAAAAAgEAAQEBAP8AAAD+//8A/wAAAP8BAQABAgEAAAEBAAABAQAAAAEAAAEAAP8AAAAAAAAA/wAAAAAA/wAAAAAAAAEAAAEGCwAOLVQB/////wAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAD///8AAP8AAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wABAAEA/////wAAAAEAAAABAQABAQABAAABAAEA/wD/AP8A/wANKjcA+wIEAAIBAgABAgIAAQEBAAMCAgABAAEAAgEBAAMCAQACAQEAAwICAAACAQACAgEAAgECAAIBAQABAgEAAQIBAAAA/wAAAAAAAQABAAEBAQACAQEAAQEBAAABAAABAAEAAAECAP8AAAAAAQAA//8AAAEBAQAAAQEAAP8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAEAAAEBAQD+AQEA//8BAAABAQD/AAEA/gAAAP4AAAD+AP8AAAAAAP7/AAD/AAAA/wAAAP7/AAD/AAEAAAABAP8AAAD/AAEA/v8AAAEBAQD+AP8AAQICAP8BAAAAAQAA/gAAAP8BAQD/AQEA/wAAAAABAQABAgEA/wAAAP8AAAD/AAAAAAIBAAABAgAAAAEAAAMBAAECAQABAQEAAAEAAAABAAABAAEAAQIAAP/+/gABAAEAAQECAAEAAQAAAAIAAQIBAP4AAQD/AQAAAAEBAP8AAAABAQAAAAEAAP8BAAD/AP8A/wD/AP8A/wAMLVUAAP8AAP//////AP8AAP8A//8A/wAAAAAA/////wD/AAEAAQAB////AAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AAD/AP8AAAAAAf////8AAAAA////AP/+/wD/////AP8AAAAAAP8FHigAAAEBAAABAQABAQAAAwIBAAICAQADAgEAAgEBAAEBAQADAgEAAgIBAAIAAQACAgIAAQEAAAEBAQABAQEAAQEBAAEBAgAAAAEA/wAAAP//AAD/AAEAAAAAAAD/AAD//wAAAP8AAAAAAAAAAAEAAQACAP//AAAAAQAA/wAAAP//AQAAAAEA/v8AAP7/AAD/AAAA////AP7/AAABAQEA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQIA/gAAAP8BAAAAAQEAAAAAAAECAQD/AAAAAAAAAAABAQAAAAAAAAEBAP8AAAAAAQEAAAAAAAEBAQAAAAEA/wAAAAABAAAAAAAAAAEBAAAAAAD/AAEAAAEAAAAAAQABAgEAAAAAAAABAAAAAQAAAQABAAAAAAD/AQEA/wABAAEBAQABAgEA/v8AAP///wD+AP8A/wEAAAECAQAAAQAA//8BAAIBAQABAQEA/wAAAAEBAAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wABBwsACBsxAQAAAAEBAAEAAAAAAQAAAAAA/wAAAAEAAQABAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAEAAQH//////wD//wAAAAAAAAABAAEAAP///wAJHygAAQEBAAEBAAADAgIAAwICAAIBAQACAQEAAQEBAAIBAAABAQEAAQAAAAICAQACAQEAAQEBAAEBAQABAAAAAQAAAAAAAAAAAAEAAQEAAAAAAAAAAAAAAAAAAAEBAgAAAAEAAQEAAAAAAAAAAAAA/wAAAP8AAQD+/v8A/gAAAAABAAD+AAAAAQABAAAAAQAAAAAA/wABAAABAAD+AAAA/wAAAP3/AAD+//8A/wEBAP8AAAAAAAAAAAEBAAAAAQD+//8A/wAAAP//AAD/AQAA/wABAP8AAAD/AAAAAAAAAP8BAAD/AAAA/gAAAP8AAAD+AP8AAQEBAP8AAAD/AAAAAAABAP4AAAD/AP8AAAECAP8BAAAAAAEA/wAAAAEBAQD+AAEAAAEAAAABAQABAQAAAgIBAAABAQD/AAAA////AAAAAAACAgIAAQEBAP8AAAD/AAAA/wAAAAABAAD///8A////AAAAAQAAAAAAAAEAAP8AAAAAAQAAAAD/AAABAAD/AP8ACB85AAABAAD///8AAAAAAAAAAAD/AP8AAP8AAP////8A/wD/AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAf8A////AP8AAAAAAAAAAAAGFhwAAQEBAAMBAQABAAAAAAAAAAIBAQABAQAAAwEBAAEBAQACAQEAAQAAAAEAAAAAAAAAAQABAAEAAAAAAQEAAP8AAAAAAAABAQAAAQABAAAAAAAA/wAA/wAAAP7/AAD/AP8A/f8AAP7/AQD+/wEA/gD/AP7+/wAAAAEAAAABAP//AAD//wAA/f//AAAAAAD+AAAAAAABAP//AAD/AAAA/gAAAP7//wAAAQEA/v//AAAAAQD9//8A/gAAAP8AAAD/AAAAAAABAP3//wAAAAEA/gAAAP//AAD/AQAA/wAAAP8AAAAAAAAAAAEAAAAAAAABAQEA/wAAAP8AAAD/AAAA/gAAAAEBAQABAgIAAAEAAAABAQD/AAAA/wEBAP4AAAABAQEA/wABAAABAQAAAAAAAAAAAAABAAABAAAA/v4AAP8BAgAAAQEA/wABAAEBAQAAAQEAAQEAAP8AAAAAAQEAAQIBAP8B/wD/AP8A/wAAAP8A/wD+//8AAAAAAP///wAAAP8ABA4aAP///wAAAAAA/wD/AP///wAAAAD/AAEAAAEAAQH///8AAAEAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEA//////8A/wD/AP8AAP8AAAAAAAABAAEA////AAAAAAEJFhwAAgIAAAIBAQACAQAAAgEAAAIBAAADAQEAAQAAAAIBAQABAQAAAQEBAAEBAQABAAAAAgEAAAEAAQACAAAAAQEBAAEBAQABAAAAAP8AAAAAAAAAAQAAAAAAAP///wD//wAA//8AAAAAAAD+//8AAQAAAAEBAQAAAAAA////AP8AAAAAAAAAAQEBAP7//wD//wAA/v//AAAAAQABAQEA/wAAAAAAAQD+/wAAAAEBAP4AAAAAAQEA//8AAP8AAAD/AQEA/wEAAAABAQD/AAAA/wD/AP8BAQAAAAEA/gAAAAEBAQD+AAAA/wAAAAAAAAD/AAEA/gD/AAAAAAAAAQAAAAEAAP8BAAD+AAAA/gAAAP8AAAAAAQEA/wAAAP8AAQD/AAAA/wAAAP8BAQD/AQEA/wABAP//AAD9/f4AAAAAAAAAAAD+/wAAAAAAAP4AAAAAAAAA/wAAAAEBAQAAAAAAAAAAAAEAAAAAAQEAAAD/AAEBAAABAQAA/wAAAAAA/wAAAP8ABRMjAAAAAAD/AP8AAAAAAAAAAAAAAAAB////AAAAAAAAAQAB//7///8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAD/AP8AAAAAAQEAAQD/AP8A/v/+/wEAAQD/Af8AAP8AAAABAAD+/wAAAgABAAIBAAABAAEAAgAAAAEAAAABAAAAAQEAAAD//wABAQEAAgEAAAAA/wABAAEA/wAAAAIBAAABAAAAAAEAAP///wAAAQEAAAEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAQEAAP//AAAA/wAA/wAAAP4A/wAA/wEAAAABAP///wD+/wAAAAAAAP8BAQAA/wAA/wAAAP7/AAD///8A/v8AAAAAAAD+/wAAAQEAAAD/AAD/AQAAAAAAAAEAAAD/AAAA/v//AAIAAQD/AAAA/wAAAAAA/wD/AAEAAAEBAP8AAAAAAAAA/wABAP7//wABAQAAAQABAAABAAD//wAAAAEAAP///wD///8AAQABAAABAAD///4AAQEBAAAAAAD/AAAAAQIAAP/+/wAA/wEAAAH/AP//AQD/AAAAAAABAAAA/wAAAQAAAAEAAAD/AAABAQEAAAEAAP///wAAAQAA//8AAAAAAAAAAP8A/wAAAAD//wAB/wAAAAAAAP8A/wAA/wAAAQYLAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8AAP8B/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAA/wAAAAAAAP///wAA/wAAAQABAQAAAAEAAAAAAAEAAAD/AAABAP8AAgEAAAAA/wACAQAAAQEBAAIBAQABAAAAAgEAAAIBAQACAAEA//8AAAIBAQABAQAAAQD/AAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP//AAD//wAAAAAAAAAAAAABAQEAAAABAAEAAAAAAQAA/wAAAAD/AAD///8A/v//AP8AAAD/AAAAAAAAAP//AAD/AAEAAAAAAAEAAAABAAEA/v8AAP8AAAABAQEAAAABAP8AAAD//wAA/gAAAP3//wAAAAAAAAABAP3//wAAAAAAAAEBAAAAAQD/AAAA/wAAAP4AAAD+AAAA/wAAAAABAQD+AP8A/gAAAP4AAAD/AQEA/wAAAP7/AAAAAQEA/wAAAP//AAAAAAEA/wAAAP4A/wAA/wAA//8AAP8AAAD/AQAA/v4AAP3+/gD/AAAA/wH/AAEBAQAA/wAAAQABAAAAAQD+//8A/wAAAAAA/wD/AP8A/wD/AAAAAAAAAAEAAQD/AAAAAAD/Af8A///+AAAAAAAAAP8AAQYLAAD/AP////8AAP8AAP8A/wD///8AAAEAAAD/AAAAAQABAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wAA/wAAAP8A//8A/wD77OYAAf//AAMBAQABAQAAAgD/AAEA/wABAAAAAP//AAEA/wABAQAAAwEAAAEAAAAA/wAAAQAAAAD//wABAAAAAgEBAAD//wABAAAAAAD/AAEBAAABAAAAAAABAAAA/wD+//8A////AP8AAAD//wAA//8AAP8AAAAAAAEA//8AAP7/AAAAAAAA/wAAAP8AAAD/AP8A/v8AAP7/AAD+AP8AAAAAAP7/AAD+/wAA/f7/AP7//wD///8A//8AAAEBAQD+/wAAAAAAAAABAQD+AAAA/gAAAP8AAAD///8A/wAAAP8AAAD/AAEA/gD/AAABAAAAAAEAAAEBAAAAAQABAAAAAAEAAAABAQAAAQEAAAEAAP8BAAD/AQEA/wAAAAD/AAD/AQAAAAAAAAEAAQD/AAAA/v4AAAABAQABAQIAAQABAAAAAAAAAQEA/gD/AAABAAABAQEAAAD/AAEBAQAA/wAAAAAAAAAAAAAAAP8A/wD/AAAA/wD///8AAAAAAP///gD/AP8A/wD+AP8A/wABAAEAAAEAAAD/AAAAAAAA////AP8A//////8AAAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8A/wD//////wD/AP8A/wAAAAABAAAAAAAAAAD/AP8A////AAAAAAD99PEAAQEAAAEA/wAB//8AAQAAAAIBAAABAf8AAgEAAAEAAAAA//8A////AAD/AAABAP8AAQABAAEAAAD/AP8A////AAEBAAD//wAAAP8AAAAAAAD/AAAAAP//AP//AAABAAAA//8AAP8AAAAAAQAAAAAAAP//AAD+/wAAAAEAAAABAAAAAAAA/v//AP8AAAD//wAA/wAAAP4A/wAA/wAAAAEBAP4AAAD+//8A/wAAAP8AAAD+AAAAAAAAAP0AAAD+//8A/gAAAP8AAAD/AAAAAAAAAP8AAAD/AQEAAAAAAAAAAAABAQAAAQABAP8AAAD/AAAA/wAAAP4A/wD9//8A/v4AAAEBAAD+//8A/wAAAAAAAAD/AP8AAAAAAAECAQAAAAAA/wEBAP3/AAD9/QAA/wAAAP8AAAD/AAAA/wEAAP8AAAABAAAAAQEAAAEAAAAAAP8AAAEAAP7+/wABAQAAAgEAAP8A/gD/AP8AAP8AAP///wAB/wAA/wD/AP///wAA//8A/vjzAAEAAQH/AP8A////AAABAAEBAQEAAAAAAAEAAQEAAAD/AAAAAf///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP8AAAAAAAEAAAAAAADy1skAAf//AAH//wABAP8AAQAAAAD//wABAAAAAP8AAAEA/wAAAAAAAgEBAAAA/wACAQEAAAD/AAAAAAABAAEAAQAAAAD/AAAAAAAAAAAAAAAAAAAA//8AAAEAAAEBAQAAAAEAAAAAAAAAAAD//wAA//8AAAAAAQAAAP8A/wAAAP//AAD/AAAAAAABAAD/AAD/AAAA//8AAAAAAQD9AAAA/f8AAAAAAQAAAQEAAAABAP4AAQD/AAEA/gAAAAAAAQD/AAAA/wAAAP8AAAD+AAAA//8AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEAAP8AAAD/AAAA////AAEBAQAAAAAAAAEAAP7+/wAAAQEA/wAAAP8AAAAAAAEAAAEBAP4AAQAAAAEA/v8AAP7+/wAAAQAAAAEAAAAAAAAAAAAAAAABAAABAAD/AP8A//8AAP7//gD/AP8AAAD/AAAA/wD+//8A////AP///wAAAP8A/wD/AAIBAAD+AP4AAP/+AAEB/wD///4A+u3bAP8A/wAAAAAAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8AAQAAAQABAf//////////AAAAAAABAAAAAAAAAAAAAQD/AAD139cAAgAAAAEAAAABAP8AAQD+AAEAAAAB//8AAQD/AAEAAAAB//8AAQD/AAH//wD///8AAf//AAEA/wAAAP8AAAAAAAAA/wAAAP8AAAD/AP/+/wAAAAAAAP8AAP///wD+//8AAAAAAP///wABAAAA/wAAAAABAAD/AAAAAP8AAAAAAAD//wAA////AP8AAAD/AAAA/wAAAP//AAD/AAEA/wD/AP8AAAD+//8A/f//AAAAAAAAAAAA/wAAAP3+/wABAQEA/v8AAP8AAAAA/wAA/wEAAP7//wAAAAAA/wAAAP8AAAD/AAAA//8AAP4A/wD/AP8AAAEBAP7/AAD/AAAA/wAAAAAAAQABAQAAAQABAAAAAAAAAAAAAAAAAP///wD+AAAA/v8AAP8AAAD/AAAAAAABAAAAAQD/AAAAAAD/AP8AAAAAAAAAAAAAAAEAAAAA/wAA////AAAB/wAAAP8A////AAEBAAD//v4AAAD/AP3+/QABAP8A////AAD//gABAP8A/fLoAAD/AAAAAAAAAAAAAAAAAAAAAAAB/////wAAAAD///8A/wD/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf8A/wAA/wAAAAAAAP8A/wEAAQABAAAAAAD/AAH/////AAAAAAABAADsyrwAAAD+AAEA/wAC/wAAAP//AAH//gABAP8AAQD/AAAA/wAAAP8AAP//AAEBAAABAAAAAAAAAAAAAAAA//8AAf//AAD//wAA//8AAP8AAAEAAAD///8A/wD/AP///wD///8A////AP//AAD///8AAAAAAP///wAAAAAA/wAAAAAAAAAAAAAAAAABAP///wD//v8AAAAAAAABAAD+/v8A/wAAAP///wD/AAAAAAAAAP8AAAD/AAAA//8AAAAAAAD+/v8A////AP//AAD/AAAA//4AAP8AAAD/AAAA/wAAAP7//wD+//8AAAEBAAAAAQAAAAEA/gAAAAAAAAAAAQAAAAAAAAABAAD//wAA/gD/AAABAAD/AP8A/v8AAP3+AQD+/gAAAP8AAAAAAAAAAAAA/wD/AAAAAAAAAQAAAAABAAAAAAD/AAAA/wD/AP8AAAAAAf8AAAD/AAAA/wABAAAAAAD/AAD//gBXLIlOAAAgAElEQVQBAf8AAf//AAAA/wAA//8AAAD+AP///wD+/v0A+ObRAAAAAAAAAAAAAP8AAAD/AAD/AP8AAQABAQD/AAAAAAAAAQABAf////8A/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAH/AP//AAEAAAAAAAD///8A/wD///////8AAAAAAP8AAAD/AAD79PEA9NjNAAD+/gD///0AAgD/AAD//wAB//8AAP7/AAH//wABAP8A////AP/+/wAA//8AAP//AAD+/gAA/wAAAAD/AAD/AAAA/wAAAQAAAAAA/wAAAAAAAAAAAAAAAAABAAEAAAAAAAEAAAD/AAAA////AP///wD//wAA/v/+AP3+/gD//wAA/v//AP8AAAAAAQAAAAD/AP7//wD+AAAA//8AAP8AAAD/AAAA/wAAAP//AAD+/wAAAAAAAP8AAAD/AQEAAQEBAP8AAAD/AAAA/wAAAAAAAQD/AAAA//8AAAABAQAAAAAA/wD/AP8AAAD/AP8AAQAAAAAAAAAAAAEAAAAAAP8AAAD+/wAA//8AAP3+AAD//wEA/f4AAAAA/wD/AAAA/wAAAAABAAD///8AAAAAAP8A/wAA/wAA/wD/AP//AAAAAAAAAAAAAAAAAAD///8AAAD/AP///wD///4AAP/+AP///wD//v4A/v/9AAD//gD+/v0AAP/+AP///QAA//4A+ufSAP8A/wAA/wAA/wD/AAABAAAAAAD//wD/AP8A/wAAAAAA/wD/AAD/AAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wEAAQAAAAAB//7//wEAAQAA/wAAAAAAAf8A/wAAAAABAAEAAAABAAABAAEA5LGdAAIA/wAB//8A//7+AAEA/gAA//4AAQD/AP///wAB//8AAQD/AAAA/gABAP8AAAD/AAAAAAAA//4AAP8AAP8A/wABAQAA/wD/AP7//wAA//8AAP8AAP///wD///8AAAAAAP8AAAAA/wAAAAAAAAAAAQD/AP8AAQABAAEAAQD/AP8AAAD/AAAAAAD//wAA/f8AAP3/AAD///8A/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAA/gAAAP8AAAD/AAAA/f//AP//AAD+/wAA/gAAAP8AAAD//wAA/wAAAP8AAAD/AQEA/v8AAAAAAAAAAQEA/wAAAP8AAAD///8A/wAAAP8AAAAAAAAA/wAAAP//AAD9/wAAAAEAAAAAAAD/AP8AAAEAAP///wAAAQEAAAAAAAEAAAAAAP8AAAAAAAAA/wABAQAAAAD/AAAA/wAAAAAAAP//AAH//wAAAP4A///+AP///QAA//8AAP//AAD//wABAP4A//7+AP/+/QD55dAA/PLp/wAAAP//////AAAAAP///wAA/wAAAP8AAAAAAAD/AP8AAP8AAAABAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/////AAAAAf8A/wAAAQAA/////wEAAQEA/wAA////AP/+/wD///8A8trPAPjr5QAA//8AAf//AAD+/wAA//8A///+AAD//gD//v4AAf//AAH//wD///8AAP//AAAA/wAA//8AAP//AAH//wD///4AAP7/AAH/AAAA/wAA//7/AAAAAAAAAP8AAAAAAP8A/wD/AP8A/v//AP///wD//wAA/v8AAP8AAAD+//8A/wABAP//AAAAAAAAAAAAAP7/AAD/AAAA//8AAP//AAD//wAA//8AAP8AAAD+//8A////AAAAAAD//wAAAAAAAAAAAAAAAAAAAQEBAP8AAAD/AAAA/wAAAP//AAAAAAAAAAAAAP//AAAA/wAAAAAAAAABAAD/AAAA//8AAP//AAD9//8A/v8AAP8AAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAQAAAP8A/wAAAP4A/wD///8AAAD/AAAA/wD+//4AAAAAAP///wAA//8AAAAAAP///gD//v4A//79AAH//wD///0AAf/+AP/+/QD//v0A///9AAD+/gD127z//wD/AAD/AAABAQEBAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQABAf///wABAQEB/wD//wD/AAAAAAAAAQABAf8A//8AAAD/////AP8A/wAAAAAAAP8AANyehgAB//4AAP/+AAEA/gABAP8AAf7+AAH+/gAB//8A//7+AAD//wAA/v4A//7+AAD+/wAA//8A////AP///wAA//8A/v//AAAA/wAAAP8AAAD/AAD/AAD/AAAA/v//AP/+AAAA/wAAAAAAAP//AAABAAEAAAAAAP7/AAAAAAEAAP8AAAAAAAD+AAAA/v8AAP//AAD//wEAAAAAAP8AAAD///8AAAAAAP8AAAAAAAAAAAAAAP8AAAABAQEAAP8AAP8AAAAAAAAA////AAAAAAD/AAAA////AAD/AAAA/wAA////AP7//wD+AP8A/f7/AP3+/wD+AAAA/f//AP4A/wAAAAAA/wAAAP8A/wD/AP8AAAD/AP8A/wAAAP8AAAAAAP8A/wD///8AAP//AAAAAAAAAAAA////AP8A/wAA//8AAP//AAAA/wAAAP8A///+AAD//wAA//4AAQD/AP/9/gD//v0A/v38AAD+/QD//v0AAP79AP7z5wD22r4AAQEBAf///wD///8AAP8AAAD/AAAAAAABAAAAAP8A/wAA/wAA/////wD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAf////////8AAAAAAAAAAAEAAQABAQABAAAAAP//AP8A/wD/APHazwDx2M0AAf7+AP/9/QD//f0AAP/+AAD//wAAAP8AAP/+AAD//gAA//4AAQAAAAD//wAA//8AAP/+AAAA/wD///8AAQD/AP///wD///8AAP8AAP///wAA/v8A////AAAA/wD+//8AAP8AAAD//wD///8AAP//AAEAAAAA/wAA/wEAAP7//wD+/v8A/v4AAP///wD/AP8A/wAAAP///wD/AAAA////AAD//wAAAAAAAAAAAAD//wD///8A/wAAAP///wD/AAAA////AP///wAA//8A//8AAAAAAAD+/wAA/wAAAAAAAAD+/wAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAEAAAAA//8A//8AAAABAQAA/wAAAAD/AAEAAAAA/wAA/wD/AAD//wD/AP8AAAAAAAD/AAAAAAAA/wD/AAEA/wD///4AAAD/AP8A/gAA//8A///+AAAA/QAA//4AAP/+AP/+/QAA//4A//78APDHnf8BAAEB////AAABAAH/AP8A/wD/AP8A/wAAAAAA/////wAAAAAAAQAAAQEBAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAEAAQD//////wD/AAEAAQEA/wD/AAAAAAAAAADboIgA+OzlAAD+/gAA//4AAP//AAAA/wD//v0AAf//AAD//wAA//8AAP/+AAD//gAAAP8A///+AAD+/wAA//8AAP//AAD//wAA//8A///+AAD/AAD/AP8AAP//AAD/AAAAAAAA/v//AP8AAAD/AP8A/gAAAP///wD/AP8A////AP8AAAD+AAAA/gD/AP8AAAD/AAAA/wD/AAAAAAAAAAAA/wAAAP8AAAD/AAAAAAEBAP7/AAAAAP8AAAEAAAABAAAAAP8A/wAAAAAAAAD///8AAAEAAP4A/wD/AP8A/wAAAP8AAAAA//8A/wD/AAABAQD/AAAA/wD/AAAAAAAAAQAAAAEAAP8AAAAAAAAA/wD/AP///gD/AAAAAP8AAP8A/wAAAf8AAAD/AP8A/wAAAAAA///+AAAA/gAAAP8AAP/+AP7//gAAAP8A//7+AP///wD/AP4AAP//AP/+/gAA/v4AAP78AAD//AD+/fsA9tW0APjiywEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AP8AAP8AAQAAAAD//v//////AAABAAH/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQABAAAAAAAA/wAA////AP8A/wAA/wABAP8AAP////8AAAABAP8AAP///wD47egA1ZZ8APz18gAA/f0AAP79AP/9/AAA/v4A/v79AAD+/gAA//4AAP/+AAD//gD+/v4AAQAAAAAA/wAA//8A//7/AP///wAA//8A//8AAP///gD//v8A////AP///wAA/wAAAQABAP7//wD//wAAAP//AP7//wD+/wAA//8AAP7+AAD9/v8A//8AAAAAAAAA/wAA//8AAP8A/wD///8AAAAAAP8AAAAAAAAA/v7+AAAAAAD+/wAA//8AAP//AAD//v8AAAAAAP8AAAAAAQEAAAAAAP///wD///8AAAAAAAAAAAAAAQEA/wABAAAAAAAAAAAAAAAAAP8AAAAAAAAAAP//AP///wD/AAAAAAEAAAD/AAD/AP8A/wD/AAAAAAD//wAAAAD/AAAA/wAA//4AAAAAAAD/AAD///4A////AAD//wD///8AAP//AAEA/wAA//8A///9AAAA/gD///0A///9AP/9/AD+8ucA8c+qAP///wD/AP8AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAP8AAAD/AP8AAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAA/wAA/v/+AP////8AAQAA/wD/AAAAAAD/AP8AAAEAAAABAAEAAQAA/wD//wAAAAD///8A9ePdAN2qlP8AAP4AAP/+AAD//gAB//8AAf//AP/+/gAA/v8AAP7+AP///wAB//8A/v7+AP/+/gAA//8AAAH/AAAAAAD///8A///+AP8AAAD/AP8A//8AAP7//wD/AP8A/v/+AAD//wD///8A//8AAAAAAAD///8A/wD/APz+/gAAAAAA////AP//AAD///8A//8AAAD/AQD/AAEA//8AAAD/AAD///8AAAAAAAAA/wAAAP8AAAD/AP///wAAAQEA////AAAAAAD/AP8A/wD/AAEBAAABAQEAAP//AAAA/wAAAAAAAP//AAAAAAD//v8AAP8AAAAA/wAA/wAA////AAAAAAAAAP8AAP8AAAAAAAABAP8A////AP///wAA//4A////AP///wD/AP8AAP/+AP8A/gAA//8AAP//AP///gAAAP4A/wD+AP7+/QD///0AAAD/AP/+/QAA//0A//79AP306ADsuIP///n2/wABAAD/////AP8AAAD/AAAA/wD/AP8A/////wAAAAAAAP8AAP////8AAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAQEBAP///wH/////AQABAQD/AAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQD/AP8A/wD//+jHuQH89vQAKF52AAQLDgD+Af8AAQICAAABAQAAAP8AAP8CAP8B/gAAAQEAAAABAAAAAgD///4A/wEBAAAAAAD/AAEA/wAAAAAA/wAAAAAAAAD/AAAAAAD/AAEAAP8AAAAAAQD/AAAA/v//AAABAQAAAAAA/P0AAAAAAQD/AAEAAAEAAAD//wAAAAAAAP//AP8BAAAAAAAA//8AAAEBAAAAAAEA///+AAAAAQABAAAA/wAAAAEAAAAA//8AAAAAAP///wAAAAAAAAAAAP8A/wAAAAAAAAAAAAD/AAAA//4AAAABAP///wAAAQAAAAAAAP///wABAQEAAP8AAAAAAAAAAAAAAP//AP8A/wD///8AAAD/AAAA/wD/AAAAAAAAAAEAAAD///8AAAD/AAH//wD+//4AAAD+AAAA/wD//v4AAP7+AAH//wD///4AAP79AAD//QD//v0A/fPpAOu3hAD+9OwBAAAAAP///wAAAAAB/////wABAAEA/wAAAAEAAQEAAQAAAAAA/////wABAAH/AP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAH///8A//////////8AAAAB/wD/AP8A/wAAAAAAAAEAAP8A/wABAAEAAAAA//8A/wAAAAAAAAAAAQD/AP/s0cUAzIZnAPjr5QAA//4A//79AAD+/gAA/v4A///+AAD+/gAA/v4A//7/AP///gD+/v4A//7/AP7+/gD///4AAAD/AP///wD//wAA////AAAA/wAA//8A////AP///gD//v8AAAD/AP3+/wD7/f8A/v//AP8A/wAA/v4A//7+AP7//wD/AP8A/wD/AP///wD/AAAAAP/+AP///wD///4AAAAAAAD//wD/AP8AAQAAAP8A/wD///8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAQAAAAD/AP///wD///8A////AP///wD///4AAAAAAP///gD///8A/wD/AAD//wAA/wAAAAAAAAD//gD///4A/wD+AP///gD///4A///+AP7//gAA//8A//7+AAD//gAA//4AAAD/AP///QAA//0A//79AP///gD559UA6rF5AP306wD/AP8A/wD/AAAAAAAAAAD//wD/AAD/AP8AAQAAAQABAP8A/wD///8AAAEAAQEBAQABAAEAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAHB0c/wAAAAAAAAAAAP8AAAABAAD/////AQEBAQAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8hTF8BIUxfAAEBAgD/AQEAAAACAAABAgAAAQEAAAICAAAAAgD/AAEA/wEBAP4AAgAAAQIA/wABAP4BAgAAAAEA/wEBAP8AAQD+/wIAAAABAP8AAAD9AAAA/gABAP3+AAD//wAA/wABAP8AAQD+//8AAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAABAQAAAAAA////AAAAAAABAAAAAAEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAD///8AAAAAAAD/AAAA/wAAAQEBAP7+/gABAAAA//7/AAD/AAD//v8AAP//AAH//wD//v8AAP7+AAD+/wD//f0A///+AAD9/QD//v4A//39AAD9/wA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BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAD/AAAAAQAAAAAAAQAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAP8A//8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAA/wAAAAAAAAABAAAA/wD/AAEAAQD/AAAAAAAAAAEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAD/AAEAAQAAAP8AAP8A//8BAQEBAAAAAAAAAAAAAAAAAAAAAQEAAQD/AP8AAQABAAAAAAH/AP8AAAAAAAABAAEAAAAAAAAAAAAAAAAAAAABAAAA/wABAAEAAAAAAAAAAQAAAAAAAAAAAAAAAP8A/wAA/wAA/wD/AAD/AAAAAAAAAAEAAAAAAAAC/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP////8BAQEB/////wAAAP8AAAAAAP8A/wAAAAAA/wD//wD/AAAAAAAA/wAAAAAAAP////8AAAAAAAEAAAD/AAAAAAAA////AAAAAAD/AP//AP8AAP///wAAAAAAAP8AAAAAAAD///8BAP8AAAEAAQEAAAAAAP8A/wD/AAAAAAAAAAAAAAAAAAD///8A////AAD/AAAAAAAAAAAAAAD/AAD//v8AAP8AAP8A//8A/wAAAAAAAP////8AAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP///wAA/wAAAP8AAP//////AP//AAEAAAD/AP8AAQABAP8AAAABAAABAQEA////AQD/AAEA/wAAAP8A/wAAAAAAAAAAAP8AAAD/AP8AAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAA/wAAAAAAAQD/AAAAAAAA/////wABAAD///8AAAAAAAEAAQEA/wAAAAAAAP////8AAAAAAP8A//7//v8BAAEB/////woS6V0AACAASURBVAD/AAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAA/wAAAAAAAQAAAAD///8AAAAAAAD/AAAAAAAAAP8AAAEAAQAAAQAAAAAAAAABAAEAAQAAAP8AAAAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AEBAQEAAAAAAAAAAQAAAAH///8AAAAAAQAAAAAAAAABAQEBAAAAAAAAAQAAAP8AAAAAAAEA/wAAAP8AAAABAAD/////AAEAAAAAAAAAAAAA/wD///8A/wAA/wAAAAAAAP///wAAAAAA/wD///8A/wAA/wAA/wD/AAABAAD/////AAAAAAD/AAABAAEAAQABAAAAAAAA/wAA////AAABAAD/AP8A/wD/AAEBAQEAAAAA/////wEAAQEAAQAAAAEAAP//////////AAAAAAEBAQEAAAAA////AAAAAAD/AP8AAAAAAAEAAQEAAAAAAAAAAAABAAEA/wAA/wD/AAD/AAD+//4AAAAAAP8A/wD/AP///wD/AQD/AAD//////wD/AAABAAH/////////AP8A//8BAQEA////AP///wD/AP////////8A//8A/wAAAQEBAf///wAAAAAA/wD///8A/wD/AP8A////AAEAAQEA/wAA/wD/AQAAAAH/AP8AAAAAAf8A/wAAAAAA////AP///wABAAEA//////8A/wD/AP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD///8AAP8AAP///wAA/wAA/wD/AP///wABAQHgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/gD+8AH/AQAAAAAAAAAAAAD/AAAAAAAA/////wAAAAEAAAAAAP8AAAEBAQD/////AQABAQAAAP//AP8BAAAAAAD/AP8AAAAB////AAAAAAAA/wAAAAEAAQAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAQAAAAD/AP8AAQABAf///wAAAAAB////AAAAAAABAQEA/////wAAAAEA/wD/AAEAAf////8BAAEB/wD//////wEAAAAAAAAAAf8A/wAA/wAAAAAA/wD/AAAAAQAB////AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAP8A//8AAAAB////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAP8A/wAA/wAAAQEBAP8A/wAAAAABAQABAP///wAAAAABAAAAAAEBAQH/////AAAAAQAAAAAAAAABAAAAAAAAAAD/AP//AP8AAQAAAP8AAAABAQABAf////8AAQAAAAAAAP8A/wEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAD/////AP8AAAABAAH/AP8AAAAAAQAAAAABAAEB/wD/AP///wAAAAAA////AAEBAQD///8AAAAAAf8A//8AAAAB/wD/AAEBAQAA/wAAAAAA/wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf8B4QEAAQD/////AAAA//8A//8AAAAAAAEAAQAAAAABAAEAAQABAP/+//8AAAAB/wD/AAAAAAEAAAAAAAAAAAAAAAEA/wAAAAAAAP////8AAQABAQABAP////8BAAEAAAAAAAAAAAAAAAAAAAAA/wD/AP8AAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAAAAQABAQABAAAAAAH/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAP8A/wAAAAAA/wD/AAD/AP8AAQABAAAAAAAAAAAAAAAA/wD/AAD/AP//////AAAAAP///wAAAAABAAAAAAAAAAAAAAAAAP8A/wAAAAAA/wAAAAAAAAAAAAEAAAAA////AP8A/wAA/wAB////AAAAAAAAAAAAAAAAAAAAAAEAAAD/AP8A/wAAAAAAAAABAAEAAQAAAP8AAAAAAAAAAAAAAAD/AP8AAAAAAP////8BAAEAAAAAAP///wAAAAD/AP8A/wAAAAEAAAAAAAAAAP///wD///8AAAAAAP7+/v/+/v7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAB//8A/wABAAEB////AAAAAAEAAAAAAP8AAAD/AAD///8A/wD/AAAAAAH///8AAP8AAP////8AAAAA////AAAAAAAAAQAAAAAAAAAAAAD/////////AAAAAAD+//7/AAAAAAAAAAAAAAAAAAAAAf8A/wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA/wAA/wD/AAAAAAABAAEA////AAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA////AP////8AAAAA////AAAAAAAA/wAA/////////wAA/wAAAP8AAP////8AAAAA//////8A/wAAAAAA/v/+//////8AAAD/AAAAAAABAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAD///8A/wD/AAAAAAAAAQABAAAAAP///wAAAAAAAAAA/wEAAQEAAQAAAQEBAQEAAQAAAAAAAAAAAP////8A/wAA/wD/AAAAAAAA/wD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wEBAQH/AP8AAP8AAAEAAQD///8BAAAAAf////8AAAAAAAAAAAAAAAAAAQAAAAAAAQEAAQECAgLhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4f7+/gAAAAAAAQABAQD/AAD/AP//AAAAAQAAAAAAAAAAAQABAP8A/wABAQEAAP8AAAEBAQEA/wD/AQABAQD/AAD/AP8AAAAAAAEAAQEAAAAA/wD/AAEBAQEAAAAA////AAEBAQAA/wD/AAEAAQAAAAH/////AAAAAQAAAAAAAAAAAf8BAAAAAAD/AP//AQABAf///wABAAEA/////wEAAQH+AP7/AAAAAf///wAAAAAAAAAAAQAAAP8A/wAA/wD//wAAAAEAAAD/AAAAAQD/AAABAAEAAAAA/wEBAQH/////AAAAAf///wABAAEAAQABAQAAAAAAAAD//wD/AQEAAQH///8AAQABAf8A////////AAAAAQEBAQD///8AAQEBAAD/AAD/AP8AAQABAP///wABAAEA/wD/AAEBAQAA/wD/AAAAAP////8BAQEBAAAAAAEAAQD/////AAAAAAAAAP8A/wAAAAAAAAAAAAEAAQAA////AAAAAAD/AP8BAQABAAD/AAAAAAAB/////wAAAAABAAEB/wD//wAAAAEAAAD/AQABAQABAAAAAAAAAAEAAP7//v8AAAAA/wD/AQEAAQD/////AQABAQABAAD/////AAAAAAAAAAH8/vzvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEB4AEBAQD///8A/wD//wAAAAEBAAEB/wD/AAAAAP8AAAAB////AAAAAAD///8AAAAAAAD/AAAAAAABAAAA/wAAAAEAAAAAAQABAP8A/wAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAABAP4A/wECAQH///8BAAAAAAAAAAAAAAD/AAEAAf///wAAAAAB/wD//wAAAAH/AP8AAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEBAQH///8AAQABAf8A/wAAAAABAAAAAAAAAAD/AP8AAAAAAf///wAAAAAAAAAAAAEAAQD+//7/AQEBAQAAAP8AAAAAAAAAAP8A/wABAAEA/wD/AAAAAAEAAAAAAAAAAP///wAAAAAA////AAAAAP8BAAEB////AAEAAQD/AP8AAAAAAAAAAAAAAAABAAAA/wAAAAH/////AQEBAf////8AAQAAAAAAAQAAAAAAAAAAAQEBAP///wABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAP8BAAEBAAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAB/wD/AAD/AAAAAAAAAAAA/wEBAQH//v//AAEAAP8A/wABAAEB/wD/AAEAAQAAAAAAAAAAAQAAAAACAwLQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAwMD0P///wD/////AAAAAAAAAAD/AP//AP8AAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAEAAQAAAAD/AAAAAQAAAAAAAAD//wD//wAAAAAAAAAAAAEAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAD/AP8AAAAB/v7+/wAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAP8A//8AAAAAAP8A/wD/AP8AAAD/AP8AAP////8AAAAA/wD/AP////8AAAAAAAAAAAAAAAD/////AAAAAAAAAAD///8AAAAAAP7//v8BAQEB/////wAAAAEAAAABAAAAAAAAAAD/AP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQH/AP8AAAAAAP8A/wAAAAAA/////////wAAAAAAAAAAAQAAAAAAAAAA////AAABAAEAAAABAAAAAP////8AAAAA////AP////////8AAAAAAP///wD/////AAAA/wAAAAH/AP8AAAAAAAAAAAD/////AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAf7+/v8AAQABAP8A/wAAAAD/AP8AAAAAAP///wAAAAABAQEBAAEAAQACAwLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAABAA4AD/AAABAQEBAAAAAQAAAAAAAAABAAEAAP///wAAAAAAAAAAAAAAAAD//v8AAAAAAP8A/wD///8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAD/AAD///8AAAEAAQAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAEAAAAAAAEAAf8A/wAAAAABAAEAAAAAAAEAAAAAAQABAAEBAQEA/wD/////AAAAAAABAQEBAAAAAAAAAP8BAAEBAAAAAAEBAQH///8AAQABAAAAAAABAQEAAAAAAAAAAAAAAAAA////AQAAAAD/////AAAA/wAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAAAAAAAAAAAAAAAAD///8BAAAA/wAAAAAAAAAAAAAA/wEAAQEA/wAAAP8AAAEBAQEAAAAAAAAAAAAAAAEBAQEB////AAD/AP//////AAAAAAD/AAAA/wAB/////wAAAAEA/wAAAP8AAAAAAP8BAAEAAAAAAAEAAQEAAAAAAAEAAQD/AAAA/wAAAAAAAAAAAAAA/wAA/v7+//8A/wAEAATQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA4NDg8P8A/+AA/wAA/////////wD/////AAAAAAAAAAH///8AAP8AAP///wAAAQAA/////wAAAAAAAAAAAAAAAAAAAAD///8AAAAAAQAAAAD///8AAAAAAP///wAA/wAAAAAAAP8A//8AAAD/AAAA/wAAAAD/////////AAD/AAAAAAAAAAAAAP///wAA/wAA////AP///wAA/wAAAAAAAAAAAAAA/wAA////AAEAAQH///8A////AP///wAA/wAA/v/+AAAAAAAAAQABAQEBAP///wAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAABAQEA/wD/AP/////+/v4A////AAD/AAAA/wAAAQEBAAD/AAAAAAAAAAAAAf///wAAAAAA////AAD/AAD//////////wAAAAD/////AAAAAP///wD/////////AAD/AP8AAAAAAP8AAf////////8A////Af8A//8AAAD//wD/AAAAAAD///8A////AAAAAAAAAAAAAAAAAAABAAEAAAAB////AP8A/wD/AP8AAQABAQAAAAAAAQAA/wD//wAAAAH+//7/AAAAAP8A//8AAAAAAP8AAAABAAEAAAAAAP8AAAAAAAAAAQAAAQABAQEAAdDg4ODwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMCA7EAAAAAAAAAAAAAAAAAAAAB////AAAAAP8AAAAAAAEAAAEBAQD///8AAAAAAf///wAAAAAB////AP////8AAAD/////AP////8AAAD/AAAAAQEBAQD/AP///////wEAAQEAAAAAAAAAAQEBAQAAAAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAD/AP//AAAAAAAAAAD/AP8AAQEBAP8A//8AAAD/AQEBAAAAAAAAAQAAAQEBAP///wAA/wAA////AAAAAAAAAAAA////AP8A/wD///8A////AP///wAA/wAAAAAAAQAAAAEAAAAAAAAAAP//////AP8A////AP8A/wAAAAAA////AAAAAAD/////AQEBAAABAAAAAAAB////AP///wAAAAAB/wD//wEBAQABAQEBAQABAP8A/wABAQEA/wD/AAAAAAEAAAAAAAAAAAAAAAH/AP8AAAAAAP///wAAAAAAAQEBAAAAAP////8AAAAAAf////8AAAAAAAAAAAEAAQAAAAD//wD/AAAAAAD///8AAAAAAf///wAAAAAAAP8AAAAAAAH///8AAAAAAP///wD/AP8AAAAAAAAAAAAA/wAA/wD///7+/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/a//AP8AAAAAAQAAAAAAAAAAAAAA/wEAAQEAAAAA////AP///wAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEBAAEBAAAAAAAAAAEAAAABAAAAAP/+//8AAAABAQABAf///wAAAAAB////AP///wAAAAABAQEBAP///wD///8AAAAAAQEAAQD///8AAP8AAAAAAAAAAAABAAAAAf///wABAQEA////AP///wAAAAAB/////wAAAP/+/v7/////AAAAAAD/AP//AAAAAAEAAQD///8AAAAA/wAAAAAAAAAAAAAAAP/////+//7/AAAAAAAAAAAA/wD/AAAAAAABAAEAAAAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAA/////////wAAAAAAAQEBAAAAAAAAAAAAAAAAAQD/AAD///8A/wD/AAAAAAH//v//AAAAAAAAAAAAAAD//////wAAAAAAAAABAAAAAP////8AAAD/////AAAAAAH/////AAAAAAD/AAAAAAAAAP8A//8A/wAAAAABAAAAAP///wAAAAD/AAAAAAAAAAAAAAAB/////wAAAAAAAAAA/wD/AAAAAAAAAAD/AAAAAP///wAAAQAAAP8AAAICArAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgYCNECAgLwAP8AAP////8AAAAAAAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wD/AAABAAAAAAAAAAAAAAD/AP8AAAAA/v7+/wAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD///8AAAAAAAEBAQEAAAAAAAAAAQAAAAEBAQEBAAAAAAAAAAAAAAABAQABAP8A/wD/////////AAAAAAAAAAAAAAAA/wEBAQEBAQEBAAAAAAAAAAAAAAABAAAAAP////8AAAAAAAAAAf////8A/wD/AAAAAAAAAAAAAAABAAAAAQD/AAAAAAAAAAAAAQD/AAAAAAAAAAAAAP7//gAA/wAAAAAAAAAAAAAAAAABAAAAAAD/AAAAAAABAQABAQEAAQD///8AAAAAAAEBAQEAAAABAAAAAAAAAAABAQEBAQABAP8A/wEAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAAA/wD/AAAAAAD///8AAAEA4ebm5rEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAODQ4PD+/f6Q/wD//wEBAQEAAAAAAAAAAP8A/wEA/wD/AP8AAAD/AAD///8AAP8AAP///wAAAQAA/////wEBAQEAAQAA/////wAAAAAA/wAA//////8A//8A/wAA/////wAAAAAA/wAAAAAAAAABAAEA/wAAAQABAQAAAAAA/wD/////AQAAAAAAAAAA/wD//////wD///8A/wD/AAAAAAAAAAAA////AAAAAAD///8A/////////wD///8A////AAD/AP8A/wAA/wD/AAD/AAABAAEBAAAAAAD/AAAAAAAA////Af///wAA/wAA//////////8AAQAAAAAAAAEBAQEA/wAAAAAAAAEBAQEAAAABAP8AAP///wD/////AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAQAAAAAAAAAAAAAAAQAAAP8AAAABAAD//////wD/AP7//gABAAEAAP8AAAD/AAAA/wAA/////wAAAAAAAAAA/v/+/wEBAQD/////////AAAAAAAAAAAAAP8AAP///wAA/wAAAP8AAAD/AAAA/wABAAAAAAAAAAAAAAAAAP8AAAD/AAH///8BAAAAAAAAAAAAAAAAAP8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAihAAAAAf///wD///8AAAAAAAAAAAD/AP8AAAAAAP8A/wABAQEAAAEAAAEBAQD///8AAAAAAAD/AAAA/wAAAQEBAf////8AAQAAAQEBAQAAAAD/AP//AAAAAf//////AP8A////AP///wD/AP///wD/AP///wD/AP8BAQABAP////8AAAAAAAAAAQEBAQABAQEAAAAA/wD/AAAAAAAAAQEBAP///wAAAAD/AQEBAQAAAAAAAAD/AQEBAAABAAH/AP8A//////8A////AP8AAAAAAQABAAD///8AAAAA/wEBAQD/AP8AAAAAAQAAAAAAAAAAAAAAAP////8AAQAA/wD//////wD/AP8AAAAAAAAAAP8AAAAB////AP//////AP8A////AP////////8A/////wAAAAD///8A////AP//////////AAEAAAD/AAAAAAABAAAAAAAAAAD/AP///wD///8A/wD/AP8AAAAAAQD/AAD/////AAAAAf///wAAAAABAAAAAAD/AAD///8AAAAAAAAAAAD/AP///wD/AP8A/wD/AP8AAAAAAP///wD///8A/wD///8A/wAAAAD/////AAAAAAAA/wAACAgIgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDwDw4PAf///0AAAAAAAP8A/wABAAEAAAABAAAAAAAAAP8AAAABAQEBAP///wABAAEA////AAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAEAAAAAAQEBAAD/AAD/AP8AAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAD/////AQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAEAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAf////8CAQIB/wD/AAD/AAAAAQAAAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAAAAQABAf8A//8BAAEBAAAAAAAAAAEAAAABAAAAAAAAAP8AAAAB/////wEBAQEAAAAB////AAEBAQAAAAAAAAAAAQAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAP8A/wAAAAEAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQABAQAAAAAAAAABAAAA/wAAAAH/AP+g5eTloQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYGkAABAO8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/AP8AAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAf////8AAAABAAAAAAAAAAAAAAAA////AP8A/wAAAAAAAAAAAAAAAAD/////AAAAAQAAAAD/////AAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAA/wAAAAD/////AAAAAAD/AP8AAAAAAAAAAAAAAAD/AP8AAAAAAQAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAEBAQH/AP8A/////wABAAEAAAAB/////wAAAAABAAEA//////////8AAAAA/wD/AAAAAAH/AP8AAAAAAAAAAAD/////AAAAAP///wAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAEA/wAB74Pg5gAAIABJREFUAAAAAAAAAAAAAAAAAQEBAQAAAAD/////AAAAAAAAAAEAAAABAAAA/wAAAAD/////AAAAAAAAAAAAAAABAAAAAAAAAAABAAEA/wD/AAAAAP8A/wAAAP8AAQEAAeAKCAqBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NDg8P/9/2IA/wD/AAAAAQAAAAAA/wAAAP8A/wAAAAEAAAAA////AP////8A/wAA////AAAAAAD///8A/////wAAAAAA/wAA/////wAAAAAA/wAAAAAAAP////8AAAAA/////wEAAQAAAAAB/////wEBAQEAAAAAAAAAAP////8AAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA////AAAAAAAAAAAA////AQAAAAABAQEBAAAAAAABAAH//////////wAAAAD///8AAAAAAAAAAAD/////////AP8A/wD///8A/////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAP////8AAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQEAAAAA////AAAAAAD///8AAQABAQAAAAAAAQAAAAAAAAD/AAAAAAAA//////////8AAAAAAAAAAAD/AP8AAQAAAAAAAf///wABAQEBAAAAAAAAAAD/////AAAAAAAAAAD+//4AAAAAAAD/AAH/AP8A/wD//wAAAIDg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX19dgKDAoQAQEBOP///wABAAEA/wD/AQEAAQAAAQAAAAAAAAEBAQEAAAAAAQEBAP////8AAAABAAAAAQEBAQD/AP//AQABAf8A/wAAAAAAAQEBAAAAAAEBAAEAAQABAf8A//8BAQEBAAAAAQAAAP8AAAABAAAAAAAAAAEBAQEA////AAAAAP8AAAABAAAAAAAAAAAAAAABAQAB//8A/wAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAAAAAQABAf8A//8AAAABAQABAP8A/wAAAAABAAAAAAEAAQAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAQEBAf///wEBAQEA/////wAAAAABAQEB////AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAQEBAQAA/wAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQEBAQABAAD///8AAAAAAQAAAAAAAAABAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAEAAAAAAAABAQEA/////wAAAAAAAAABAQABkenp6YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWzwABADABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEBAP///wAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAP////8BAQEBAAAA/wAAAAAAAAABAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAA/wAAAAAAAAAB/////wEBAQEAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEBAQD/////AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AQIBAf/+//8AAQDR6unqMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKQQEBAeD+/v7/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD//////v7+/wAAAAAAAAAA/////wAAAAD//////////wAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAD//////////wAAAAAAAAAA/v7+/wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP////8AAAABAAAAAAAAAAEAAAAAAAAAAAEBAQH/////AAAAAQAAAAEAAAAAAP8AAP///wAAAAD/AAAAAAAAAAAA/wAAAAAAAAD/AP8AAAAAAAAAAQD/AP8AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAQEBAQAAAAAA/wAA/////wAAAAD///8A/////////wAAAAAA//////////8AAAAAAAAAAQAAAAAAAAAAAAAAAP////8AAAABAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAB/////wICAuEKCQpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg8AkICUEDAgPh////AAABAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/////AP8AAAAAAAAAAAAA////AP///wABAAEBAAAAAQAAAAAA/wAAAQEBAQD/AAD/AP8BAQEBAQAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEBAAAAAAAAAAAA/wAAAQEBAQD/AAAAAAAAAAAAAP////////8AAAAAAAAAAAEAAAAAAAAA/wD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD///8AAAAAAAAAAAAAAQD/AAAAAP8A/wEAAAAAAAAAAAABAAH/////AAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wH/////AAAAAAAAAAAAAQD/AAAAAQAAAAD///8AAQEBAQAAAAAAAAAAAAAAAQEBAQH/////AAAAAP////8AAAAA////AP///wEAAAAAAAAAAQAAAAD///8BAAAAAAAAAAAAAAAAAQEB4QgICEHg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4OAICAhBAQAB0QD/AAD/////AAAAAAEAAQD/////AAAAAP////8AAAAAAAAAAP///wAAAAABAQEBAAAAAAAAAAAAAAEAAP///wAAAAAAAAAA/wAAAAAAAAD/AAAAAP///wD/AP8A////AAABAAAAAAAA////AAAAAAD///8A////AAAAAAAAAAAAAAAAAP///wD///8AAAAAAf///wD/AP8A////AP8A/wD///8AAAAAAAAAAAABAQEA////AAEBAQAAAAAA////Af8A/wAAAAAAAAAAAAAAAP8AAAAA////AAD/AAD///8A////AAAAAAABAQEBAAAAAP////8AAAABAP8AAAEBAQD///8A////AP///wAAAAAAAAAAAAAAAP8AAAAA////AP////////8A/////wEBAQAAAAAB/////////wD///8BAAAAAP////8AAAAAAP8AAP///wD///8AAAAA/wAAAAAAAAABAAAAAAAAAAH///8AAAAAAAEBAQD///8A////AAAAAAABAQEAAAAAAP///wAAAADQCQgJMeDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtdS82AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//dXMWcXWUnysAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/iPhoneIcons.xcf b/arma/client/addons/phone/ui/_site/images/iPhoneIcons.xcf new file mode 100644 index 0000000..d30e24b Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/iPhoneIcons.xcf differ diff --git a/arma/client/addons/phone/ui/_site/images/light/AppStore.png b/arma/client/addons/phone/ui/_site/images/light/AppStore.png new file mode 100644 index 0000000..98c47d3 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/AppStore.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/AppStore.png.b64 b/arma/client/addons/phone/ui/_site/images/light/AppStore.png.b64 new file mode 100644 index 0000000..c3491f7 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/AppStore.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxETEmC61G4AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIM//EPX2ACAAAP0w/wQBHwL//SAAAAMA/wD+IAEAABAB//4QAAAAAAABAAD+/QIQAAH/EAACAv8A/v4BAAAAAAAAAAD/AgH/Af//AQD//wAAAgP/AAAAAAD+/gEAAP8AAAEBAAAAAAAA/wAAAAAAAAAAAAABAQEA/gEA/wH+/wH/AgH/Af//AQD/AAAAAAAA/wIB/wEAAQAA/v4B/wIB/wEAAQAA//4BAP8AAAAAAAD/AgH/Af7/AQABAAAA/wAAAAAAAP8CAf8AAAAAAf//AQAAAAAAAQL/AP/+AQAAAAAAAAAAAAEB//8AAAAB//8BAP8AAAAAAAAAAAAA/wIB/wH+/wH/AgH/Af7/Af8CAf8A/gDwAwH+8QAAAAAAAQH//gAB4f/+AAADAQHv/v//4v8DAu//AALRBfr88Aj8BNDgQQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgv/8Q+AT8MP0DAFACAf5P/v8BIAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAD/AAAAAAAAAAEAAP8BAf8B//8BAAAAAAACAv8A/v4BAAAAAAAAAAAAAAAAAQAAAP//AAAAAgH/Af//AQAAAAD/AQH/AP//AQABAf8AAAAAAAAAAAD//wEAAQH/AP//AQAAAAABAAEA/wD/AAD/AAAAAgH/AP//AQD//wAAAQEAAAEB/wD//wEAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAD/AP8BAv8B/v4BAAEBAAABAf8AAAAAAP//AQD//wABAQEA/wAAAAAAAAAAAAAAAAAAAAABAf8AAAAAAP//Af8BAf8B//8BAAAAAP8BAf8B/v8BAAIB/wD//wEB/wDQAAAA0AAEBbHqNwGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGL/3IPwIBl8B/f1wAAEAEAEAAAD/AQH/AP//AQAAAAAAAAAAAAAAAAABAf8B//8B/wAAAAAA/wAAAgL/AP7/AQEAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAABAQAAAP8AAP8CAv8AAP8AAf7/Af8A/wAAAAAAAAABAAAAAAAAAQH/AAEAAAD+/wEAAP8AAAABAAAA/wAAAAEAAQAAAP8CAf8A/v8BAQEBAP///wAAAAAAAAAAAAAA/wAAAAAAAAAAAP8BAv8B//8BAAEB/wH//wH/AAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAA/wAAAAEBAAAA/wABAAEAAAAAAP8AAAAAAgL/////AAH//wEAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAABAf8A//8BAAD/AAAAAAACAgHg//4AwAL6/YHoQQngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC//xD2CP5vAP39gP8A/wAAAAEAAAD/AAABAQABAAAA////AAAAAQAAAAAAAAIB/wAAAAAAAAAAAP7+AQEAAQAAAQAA////AAAAAQABAQAA//8AAAEBAAD///8AAAABAAAA/wABAQEA/wAB/wD//gEAAAAA/wEC/wEBAAAB/v8B/wD/AAACAv8B//8BAAAAAP4BAf8B//8BAP//AAEBAQD//wAAAAAAAAAAAAAAAgH/AP7/AQEBAAD/AQH/AAAAAAAAAAAB//8B//8AAAAAAAAAAAAAAAD/AAEAAQD/AP8AAQEBAP//AAAAAgH/Af//AQD/AAD/AgH/Af7/Af8AAAAAAgH/AP7/AQAAAAAAAgL/Af/+AQD/AAD/AP8AAAAAAAAAAQAAAgH/Af//Af///wABAAEA/wAAAAEBAAD//wAAAAIB/wAAAAAA/v8BAAIB/wD+/wEAAAAAAAIB/wD+/wEAAAAAAAAAAAAAAAAAAgH/AP7/AQAAAAABAQCgAvr9gehBCeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGsj/T/v8/J8AAQAQAAAAAAH//wH/AgL/Af7+Af8BAf8A//8BAAEB/wD//wEA//8AAAAAAAEBAQAAAAAA////AAEBAQD/AQH/Af//AQAAAAD/AQH/Af7/AQABAAD///8AAAIC/wD+/gEBAQEA/wEC/wAA/wAA/v4BAQEBAP8BAf8AAAAAAf//Af8BAf8A/v4BAAIC/wAAAAAAAAAAAAEBAAH9/gH/AP8AAAIC/wAAAAAA/v8BAAIB/wD+/gEBAQEA//8AAAACAf8AAAAAAP//AQABAf8A/v4BAQEBAP8BAf8A/v4BAAEBAAABAf8A/v4BAAABAAABAAABAAAA//8AAAACAf8A//8BAQAAAP//AAAAAP8AAAAAAAAAAAAAAgL/Af//Af8AAAAAAQH/AAAAAAAAAAAAAAAAAf//Af8BAf8A/v4BAAABAAEBAAD/AQH/AP7+AQEAAQD/Af8AAP8AAAAAAAAAAgL/Af//Af///wAAAAAAAAIC/wD+/gEAAAAAAgEB4P4DAoDrOQShAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwvuPAQH/cP///wABAQEA/wEB/wD//gEBAAEA/wD/AAAAAAAAAgL/AAAAAAH+/gH/AAAAAAEC/wH//gEAAAEA/wEB/wH//wEAAAAA/wEB/wH//wEAAAAA/wD/AAEAAQAAAAAAAAAAAP8BAf8B//8BAAAAAAAAAAAAAAAA/wEB/wH//wEAAgH///7+AQEAAQD/AQH/Af//Af8A/wAAAQL/AP/+AQEAAQD/AQH/Af//Af8A/wABAAEAAAD/AP//AAAAAgL/AP7+AQEBAQAAAAAA/wEB/wH//wH/AQH/AP/+AQABAv8A/v4BAAEAAAEAAQD/AQH/Af//Af8BAf8A//4BAQABAAAAAAAAAAAA////AAEBAQD/AQH/AP/+AQAAAAAAAAAAAQAAAAAAAQAAAP8AAAABAP8BAf8A//4BAQAAAAAAAQAAAP8A/wAAAAAAAAABAAEA/wD/AAEAAQD/AP8AAAAAAAEAAQAAAAAAAAAAAP///wAAAgL/AAAAAAH//gEAAAAAAAABAP8BAf8A/gCR6z4FcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIL//EPYF+7///v8wAAIC/wH+/wEAAAAA/wIB/wD+/gEBAAAAAAABAAAA/wAAAAEAAAAAAP8CAf8A/v4BAAEC/wH//gH/AAAAAAIC/wD+/gEBAAEA/wEB/wH//wEAAP8AAAABAP8A/wABAAAAAAABAAAAAAAAAAAAAAD/AAAAAAD/AAAAAAEB/wH/AAEAAP8A/wAAAAEAAQAAAAAA/wIB/wH+/gEAAAEAAQEAAP///wAAAAEAAAAAAAAA/wD/AAAAAAIC/wH+/gH/AQL/AP/+AQEAAAAAAAAA/wAAAAEAAQAAAAAA/wD/AAACAv8BAAAAAP7+Af8CAv8AAAAAAP7+AQEAAQAAAAAA/wIB/wH+/wEAAP8AAAAAAAAAAAD/AgL/Af7/AQAA/wD/AAAAAAAAAAACAv8B/v8B/wD/AAAAAAABAAEA/wIB/wAAAAAB/v8B/wD/AAAAAAABAAAA/wAAAAAAAAAAAQL/AP/+AQABAv8A/v4BAQEAAAAAAAD//wAAAQEBAP8CAf8AAAAAAP7+AQEAAAD/AQL/AQH/0QL7/VHoQQngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYv/cg/wICv/8AACD/AgL/Af7+AQAAAAAAAgL//wAAAAD+/gEBAAEA/wD/AAEAAQAAAQAA////AAEAAAD/AgL/Af7+Af8AAAABAAAAAAIC/wD//wEAAQH/AP7+Af8CAv8B/v8B/wIB/wAAAAAB//8BAP//AP8CAv8B//8BAAEB/wD+/gEAAAAAAAAAAP8CAv8A/v4BAQAAAAAAAAAAAAAAAAEBAP8BAf8B//8BAP//AAAAAAD/AAAAAQABAP8CAf8B/v4BAAABAAAA/wD/AgL/AAAAAAD+/gEBAAAA/wAAAAEAAAAAAQEAAAAAAP///wAAAAAAAAAAAAEAAAAAAQEAAAEB///+/gEBAAAAAAAAAAACAv8A/v4B/wIC/wH+/gEAAQEA////AAEAAAAAAAAA/wAAAAAAAAABAAEAAAD/AAAAAAAAAAAAAAAAAP8CAv8A/v4BAAIC/wAAAAAB//8B////AAEAAAD/AAAAAQEBAP8AAf8B//4BAAABAP8CAf8A/v4BAQEBAAD//wAAAAAAAAAAAP8CAv8A/v4BAQIC/wL//+EA/f1B6EEJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABi/9yD/AQK//wEBIAAA/wAAAAAAAAABAAABAf8A/v4BAAEAAAAAAQAAAP8AAP8AAAAAAAD/AAAAAQEAAP8BAv8B//4B/wEC/wH+/gEAAAAAAAAAAAAAAAABAQEA/wD/AAD/AAAAAAAA/wIC/wH+/gEAAAAAAAAAAAABAAD/AQL/Af/+AQAAAAAAAAAAAAAAAAABAv8A/v4BAAEAAAAAAQAAAP8AAAAAAAD/AAAAAgL//wAAAAH//gEAAQL/AP//AQAA/wD//wAAAAIC/wH//wH///8AAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAA/wEC/wH//wH///8AAQAAAAABAAAA/wAAAAEAAAAAAAAAAAEAAAD/AAD/AAAAAAAAAAEAAAAAAQD/AQH/Af7+Af8CAf8AAAEAAf7+AQAAAAAAAQEAAP//AAABAQAAAP8AAAAAAAAAAAAAAAAA//8AAAEAAAAAAAAA/wAAAAEAAAD/AgL/Af7+AQABAAAAAAAAAAABAAD//wD/AgL/Af//AQABAf//AP8AAf8AAQD//wAAAAAA/wIC/wH//gEB/wDgCf8GMeBBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4BA6//AgIf/wAB/wH/AQAA/wAAAP//AAD+/gEAAAEAAP8AAP8AAf8A/wAAAAEC//8BAf8BAAAAAP8AAAL+/wH//wAAAf7+Af8BAv8AAAAAAAIC/wD/AAD/AAH/AP8AAAAAAAAAAAAAAf7+AQAAAAAAAAAAAAAAAAD/AQAB/v4BAP8AAAD/AAAB/wEAAf8BAP///wAA/wAAAP8AAP8AAf//AAL/AP8AAAABAv8A/v4BAf7+AQD/AAAA/v4BAP//AAD/AAAAAQL/Af7+AQD//wABAAAAAP8AAAH/AQAAAAAAAP8AAAD/AAAA/wAAAf7+AQD//wABAAAA/wEC/wD/AAAAAAAA/wAC/wD/AQAA//8A/wAC/wAAAAAAAQL/AP8AAAD//wAB/wAAAAEC/wH+/wEB/v4B/wEC/wAAAAAA//8AAQABAAD//wAA/wAAAP8AAAD/AAAA/wAAAf8AAAAAAAAAAAAAAQAAAAAAAAAB/v4BAAAAAAD/AAAA/wAAAP//AAAAAQAA/wAA//7/AAD+/gEB/v8BAP//AAACAv8AAAAAAP7+AQD/AAD/AgIf9gH7vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcH7jwABAS8B/v8BAf7+Af8BAf8A/wAAAP8AAAD/AAAA//8AAP8AAAH+/gH/AQH/AP7+AQH+/wEA/wAAAQABAP///wAB/wAAAP8AAAH+/gEAAAAAAP3+AQEAAQAA/v4BAAEC/wD/AAAA/wAAAP8AAAD/AAAA/wAA/wAB/wD//wAA/wAAAP8AAAABAv////8A////AAD/AAD/AQH/AP8AAAH+/gEBAAAA/wAB/wD+/gEAAQL/AP8AAAD/AAAAAQL/AP8AAAABAv8B/v4BAP8AAP8BAv8AAQL/AP8AAP8BAf8A/wAAAQABAAD/AAAA/wAAAP8AAAD/AAD/AQH/AQAAAAD/AAD/AQH/Af7+AQEAAAAAAQL/Af7+AQD/AAAA/v4BAP8AAAD/AAAA/v4BAP7+AQD/AAAA/wAAAf7/AQABAv8A/wAA/gEA/wABAv//AQH/AP8AAP8BAf8A/wAAAAAAAAD/AAAA/wAA/wAB/wD/AAAA/wAAAAEC/wD/AAD/AQL/AP8AAAD//wAB/v4BAAIB/wD/AAAA/wAAAP8AAAD9/gH/AAH/AQAAAAD/AAAA/f4BAP//MBXB+48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwfxfAf79oAABAf8AAAAAAP7/AQAAAAAAAAAA/wIB/wL/AAH///8AAAAAAAAAAAAAAAAAAAIB/wD+/wEAAAAAAQEBAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAEBAAD/AQL//wD/AAEAAAAA/v8BAAAAAAACAv8AAP8AAP//AQAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAgL/AP7+AQACAf8A//8BAAAAAAD/AAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAQEAAAAAAAD//wAAAAIC/wD+/gEAAAAAAQEAAP//AAAAAgL/AP7+Af8CAf8B//8BAAAAAAD/AAAAAAAAAAEAAAD/AAAAAgH/AP7/AQABAAAA/wAAAAAAAAABAAAA/wAA/wIB/wH+/wH/AgH/Af//AQD/AAAAAgH/AP7/AQAAAAD/AgH/Af7/AQEBAQD/AP8AAQABAAAA/wD+AQH/AQABAAAA/wAA//8BAAAAAP8BAf8B/v8BAAAAAAAAAAAAAAAAAAAAAP8CAf8B/v8BAAAAAAACAv8A/v4BAAAAAAAAAAAAAAAAAQEAAP//AAAA/gNR6kQEsAAAAAAAfUemQAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC/9yD3AAK///8AIAAAAAAAAAAAAQABAP8A/wAA//8AAAEBAAAAAAAAAAAAAAAAAAABAf8A//8BAAAAAAABAf8AAAEAAP/+AQAAAAAAAAAAAAEC/wD//gEA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAgH/AP//AQEAAAD//wAAAAAAAAEBAAAAAAAA/wEB/wD//wEAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wEC/wH//gH/AAAAAAAAAAD/AAABAQAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAABAf8A//8B/wEB/wH//wEAAAAAAAEC/wD//gEA/wAAAAIC/wD+/gEAAQAAAQAAAP//AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAEBAAD/AAAAAAAAAAACAv8A/v4BAAAAAAAAAAAA/wAAAAMC/wD+/gEA/wAAAAEAAAAAAAAA/wAAAAMC/wH+/gEAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAA/wEB/wL//wH/AAAAAAAAAAD/AAAAAgH//wAAAAEAAQAA//4BAAAAAAAAAAABAQLvCQAEIuBBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb9A4AA/wAgAP8AAAD/AAAA//8A////AAD/AAAAAgP/AP8AAAD//wAA//8AAAEC/wD+/wEA/wAAAP8AAAD+/wEA/v4BAP8AAAAAAf8A/wAA////AAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAACAf8A/v8BAAAB//8AAf8AAAAAAAAAAP//AAAA/wAAAP7/AQABAv8A/wAAAAEC/wEAAAAAAAH/AP8AAAD/AAD//wAAAP7+AQD/AQAA/wAAAP8AAAAAAAD/AAH//wEC/wD//wAB/wAAAP8AAAH/AAAB/wAAAP//AAH//wEA/wAAAQABAAEAAAAAAQL/Af7+AQAAAf8BAAAAAP7+AQACAf8A/wAA/wEC/wACAf8AAQL/AAEB/wD/AAABAAAAAQAAAP//AAAA/wAAAP//AAD9/gEAAAH/AP8AAAD/AAAAAP8AAP3+AQD/AAABAAAAAP8AAAD/AAAAAAAAAP3+Af//AAD//wAAAP8AAAD+/wAA/wAAAP//AAD/AAD/AQH/AP8AAAH/AAAAAAH/Af7/Af//AAAA/wAAAP//AAAAAAAA/v8BAv7/AQD+/gEA/wAAAQABAAD/AAD//v4R+P76cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIL/3IPf+At////8AAAIC/wD+/wEAAgH/Af//AQD/AAAAAQAAAP8AAP8AAAAAAAAAAAAAAAABAf8A//4BAAIC/wD+/gEAAgL/Af7/Af8CAf8A/v8BAAIB/wD+/gEAAAAAAAIC/wAAAAAB/v8B/wAAAAAAAAAAAgL/AP7+AQACAv8AAP8AAP7+AQAAAQAAAP8AAAID/wH//gH//wAAAQAAAP8A/wAAAgL/AAABAAD+/gEAAAAAAAD/AAACAv8B//8B//8AAAEBAAD/AQH/AAAAAAD+/wEAAP8AAAAAAAEBAQD//wAAAAIC/wD+/gEBAAAA/wAAAAACAf8B//8B//8AAAEAAAAAAAAA/wIC/wD+/gEAAgH/AP7/AQAAAAAAAAAAAAIB/wD+/wEAAAAAAAD/AAACA/8B//4B/wAB/wABAAAA/v8BAAD/AAAAAAAAAgL/Af//Af//AAAAAP8AAAABAAEAAAD/AgH/Af7/Af8CAf8B/v8B/wD/AAAAAQABAQAAAP8AAP8A/wAAAgL/Af7/Af8A/wABAQEA/wAB/wEA/wH/AQH/AAAAAAD+/gEAAAAAAAABAAACAf8B/v8B/wIB/wD+/wEAAAAAAAAAAAoD/iHgQQngAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9v4Df/8AAf8BAAEAAf3/AQD//wAA/f8BAP8AAP8BAf////8A/wEB/wABAf8BAAAAAAEB/wAAAAABAAEAAP8AAAD/AAAA/wAA/wEB/wH+/wEBAAAAAP8AAAEAAQAA/wAAAP3/AQD/AAAA/wAAAQAAAAD/AAAA//8AAAEB/wD//wAA/f8BAP8AAAD//wAAAAEAAf7+Af8AAf8BAAAA////AAEAAQAA/wAAAf7+AQEAAAAAAQH/AAEC/wH+/wH/AAL/AAEB//8AAf8B/v8BAP3+AQD//wABAAEAAP8BAAD+AAAA/wAAAP//AAH/AAD/AAAAAAEB/wH+/wEA/gAAAP//AP8BAf////8AAP//AAAAAAAA/f4BAQAAAAABAf8B/wAAAf7/AQEAAAAA//8AAAABAAH+/gH//v8AAP//AQD9/gEA//8AAAEC/wABAv8A/f4BAP8AAAABAf8A/wAAAf8AAP///wAB/v8B////AAD9/gH/AQH/AAEC/wD/AAAA/wAA////AAEAAQAB/f8BAP8AAAEAAQAA/wAAAAAAAAD/AAAA/wAAAP3+AQD/AAAB/wEAAQEC/wD/AAAAAAAAAf7/AQAAAAAB/wAAAP//APj6AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf3+QAH+/wEA/wAAAAAAAAEAAQABAAAA//7/AAD/AAAB/wEAAf7+AQEAAAD///8AAf7/AQH+/wH/AAH/Af7+AQAAAAAB/v8BAf7/Af8BAf////8AAP8AAAD//wAAAQL/AAEB/wH//wEAAAAAAP8AAAEAAAAB/v8BAf7/AQH+/wEA//8AAQAAAAABAv8A//8A/wAB/wH+/wH//v8AAQEC/wD//wAA/wAA/wAB/wD/AAAB/v8BAAAAAP///wAB/v4BAAAAAAD9/gEA//8AAAAAAAEAAQAA/wAAAAD/AAAAAAAAAQH/AP7+AQAAAAAA//8AAf7+AQD//wAAAAAAAAEC/wH+/gEBAAEAAf7/AQAAAf8BAAEA/wAB/wD/AAAAAAAAAP8AAP/+/wABAAEAAf//AAAAAf8BAAEAAAEB/wABAv8A/wAAAP7+AQD+/gEAAQL/AP8AAAD/AAABAAEAAAAAAAEAAQD/AQH/AAAAAAEAAQAA/wAAAf7/AQEAAAAAAQH/AQABAAD/AAAAAAAA/wD/AAD/AAD/AAH/Af7/Af8AAf8AAAAAAQABAAEAAQAAAgH///39AQH+/wH///8AAAAB/wH/AAAAAAAAAAAAAP8DA24gr/8QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAWvPxQAAABIAD/AAAA/wAAAP8AAAABAf8AAQH/AAAAAAD+/gH/AQH//wEC///9/gEAAQL/////AAD//wAB/v8B/wAC/wABAv//AQH/AP//AAH9/gEA/wAAAP8AAAD/AAAB/v8BAAAAAAD+/wAA/wAA/wAB//8AAf8AAQH/////AP///wABAAEAAAEC/wD+/gEB/wEAAf7+Af8BAf8BAAAAAP7/AQD/AAAB/v4BAf7/AQD/AAAA/wAAAP8AAAH/AAAA/wAAAP4AAAACAv8A/wEAAQEC/wD/AAD/AQH/Af8AAAD//wAB/v8BAAEC/wD//wAB/wEA/wEC/wAAAQAA//8AAf7+AQAAAQD/AAH/////AAAAAAAA//8AAf7+AQH+/wEA/wAA/wAB/wACAv////8AAAEC///+/gEA/wAAAv7/AQD/AAABAAAAAAEC/wEBAv8B/v4B////AAD/AAAA/wAAAP//AP8BAf8B/f4BAQEC//8BAf8B/v4B////AP8BAf8A/f8BAAEB/////wD///8AAf8BAAD/AAAB/v8BAP//AAD+/gEB/f8BAP8AAP8BAf8A/f4BAQABAAD//wAB/wAAAP7/AQD//wAAAQH/Af8AAAD+/xH0DwAvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vtQAP//AP8BAf8AAAAAAAAAAAD+/wEA/wAAAAAC/wH/AAAB/f4BAf3+AQEBAv8B/f8BAf8AAAAAAQAA//8AAf7/AQH9/gEA/wAAAP8AAAD/AAAAAQL/Af7+AQAAAQD/AQH/AP3+AQD/AQAAAQH/AAAAAAH+/gH//wAAAAEC/wH/AAAA//8AAP3+AQABAv8AAAAAAP8AAAD9/gH/AQL/AP8AAAD/AQAA/wAAAP//AAD/AAAA/wAAAf7/AQABAv8A//8AAf7+AQH9/gEA//8AAP3+Af8BAf8B/f4BAP8AAAD/AAAAAAAAAP8AAP8BAv////8AAf3/AQD+/wAA/wAA/wEC////Af8A/v4BAf8AAAH9/gEA/wAAAP8BAAD//wD///8AAAAAAAH9/gEBAAEAAP3+AQH/AAAAAAAA/gAB/wH+/gEA/wAAAf8AAAD9/gEA/wAAAAEC/wH+/gEAAP8A//8AAAH+/wEA/wEA//8AAAL+/wEA/wAAAAEC/wH9/gEAAQH/AP3+AQH/AAABAQL/AAAAAAAAAAD///8A/wEC/wABAv8AAQH/AAEB/wH+/wH/AQL/AP//AAD/AAD/AQL/AP//AAD/AAAA/v8BAP8AAAAAAAAD+/xQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMuAAAAAAH9/gEA//8AAP8AAP8AAf8A/f4BAf/+AQAAAAD//wAAAP8AAAD+/wEAAAAA/wEC//8AAf8A/wAAAAAAAAABAv8B/v8B/wEC//8BAv8BAAAAAAAAAAD+/wAB/v8BAAEC/wAA/wAA/v8BAf7/AQAAAQAB/f4BAP8AAAABAv8AAAAAAP8AAAH/AAAA//8AAP8AAAEAAAAB/v4BAAD/AAAA/wAAAgL/AAAAAAD//wAA//8AAP//AAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAEAAAAAAAEAAAABAP8BAv8A//8AAP8AAAH9/gEBAAAAAP//AAAAAAAAAAEAAf8AAAH+/gEAAQL/AAABAAACAv8AAAAAAAIB/wD/AAAAAQL/Af7+AQAAAQAB/wAAAP8AAAAAAAAA//8AAf3+AQAAAQAA/wAA//8AAAD/AAAAAAAAAf8AAAABAv8A/wAAAQAAAAD+/wABAAAAAf7/Af/+/wAA/wAAAf7+AQAAAAAA/f4BAAABAAAAAQAA/f4BAP//AAD+/wAB/wAAAf3+AQD/AAAA/f4BAP3+AQD/AAAB/f4B/wEC/wAAAAAA/wAAAQABAAAAAQAA/v8AAP8AAAD+/wABAP5QAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAACCv7xD3CQnvAAIC/wD+/gEBAAEA/wD/AP8BAv8B//4BAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAE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AAAAAAP8AAP8AAf8AAAH/Af8AAAEAAQD//v8AAAAAAAACAv8AAgL/AP//AAD+/gEA/wEAAQAAAAABAf8A/wAAAf8AAP8AAf8B/v8BAP7+AQAAAAAAAQL/AP7/AQAAAAAAAgL/AQAAAAAAAv8A/gAAAAEB/wEAAAAA/wAAAf8AAAAAAAAB/v4BA/77IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP3/Aw8B/v4BAf8AAAH9/gEA/wAAAP8AAP//AAAB/wAAAf8AAAAAAAAA/f4BAAABAAD/AAAB/wAAAP7/AAD+/gEB/wAAAf7/AQD/AQD//wAAAAEB/wAAAAAAAAAAAf8AAAABAf8BAAAAAP8AAAD+/wEA/wAAAAEC/wH+/wEA/v8BAP7+AQD+/gEC/v8B//8AAAAAAf8AAgH/AP7/AQH/AAAAAAH/AP8AAAH+/gEB/wAAAP4AAP8AAf8B/wAA////AHQlAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEuBAAOAv8BAQAAAAAAAAAA/wAAgikDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdCQEAA8DAAEAAQL/Af7+AQD/AAAB/v8BAAAAAP///wAB/wAAAP8AAP//AAAAAAEAAP8AAAAAAf8B/wAAAAEB/wD/AAAA/wAAAP8AAAD//wABAAAAAf8BAAD+/wAA//8AAP3+AQAAAf///v8A/wAB/wH+/wEB/wAA//8AAAH+/wH//wAAAP8AAAD/AAAA/v4BAf8AAAABAv8B/f4B/wAB/wD//wAAAgH/Af8AAQD/AAAAAAAAAP7/AQH/AAD//wAA/gADHwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAC/yD/AQH/////AAD/AAD/AQH/Af8AAAD//wD//wAA/wEB/wABAf8A//8AAP3+AQH+/wH///8AAf7/AQD/AAD///8AAP8AAP///wAAAQL/AAAAAAEAAAAB/wAA//8AAAH+/wEAAAEAAP8AAAABAf8A/wAAAP3+Af8BAv8B/wAAAAEB/wABAf8A/wAAAQAAAAD+/wEB/f8BAAAB////AAAAAAAAAQABAAD/AAD/AQH/AQEAAAH+/wH//wAAOhICAB0JAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0JAQBmIAIAAP8AAAABAf90JQQAHQkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgUAACwNAAAB/f4B////AAH+/wEA/wAAAQABAAD/AAD//wAAAf8AAAD/AAAB/f4BAP//AAAAAQD//wAAAP7+AQD+/gEA/v8BAAAAAP///wAAAAAA///+AAH//wEB/f8BAAEC/wD+/wEBAAAAAP8AAAAAAAD//wAAAAEC//8AAf8AAQH/Af8AAAABAf8AAAH/AP8AAAH9/gH/AQH/Af7/AQD+/wEA/f4B//7/AAD/AAAA//8AAP8AAP8BAf8A//8AAgAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH/Ag8B/v8BAQABAP8BAf8A/wAAAP8AAAEAAQAA//8AAf7/AQD9/gEB/wEAAP//AAD/AAAA/wAAAAAAAAABAf8AAQL/AAAAAAH/AAAA/f0BAP8AAP8AAf///wAAAQAAAAAAAAD//v4A/wEB/wD9/gEA/wAAAf8AAAH9/gH//wAAAP8AAAH+/wEAAAAA/wAB/wEAAAD/AQH/Af7/AQD//wAA/f4B//7+AAD/AAAB/f8BAP4AAAD/AAABAQL/HgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlIQMADgQBAB4HAAFXHAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwJAQAA/wAAAf8BAP///wAAAAAAAP//AAH/AAAB/wAA////AAH/AAAA/wAAAQABAAD//wAA//8AAQABAAH/AQAAAQH//wAB/wD/AQD//v8AAP8BAP8AAv8AAAAAAf//AQABAv8AAAAAAAAAAP/+AAABAAAAAf7+AQH+/wEB/f8BAP8AAAD9/gEB/v8BAP8AAP///wAB/v8B////AAH/AAAA/wEAAAEC/////wAB/wEAAP8AAAD9/gEBAAEAAP/+IAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//QEA/v8AAAEBAAH//wEAAAAAAAAAAAD/AAAA/wAA/wEB/wABAQAA//8BAQABAAAAAAAAAQL/AP//AQH//gEAAAAAAAABAAAAAAAA/wAAAf7/AQAAAAD/AQH//wAAAAAAAAABAAABAP3+Af8CAv8A/v4BAAEBAP8BAf8B//8B//8AAP8BAf8A/wAAAf3/AQABAAAB//8BAAAAAAEAAQAAAAAA////AP8CAf8BAQAAAP7/Af8A/wAA/f0B8fsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPBQEAgioDAAAAAAAdCQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL6/wAAAAAAAAEB/wH+/wEAAgH///3+AQEDA/8A/f4BAAIC/wD//wEA//8AAAABAAAAAAABAAEAAP8AAAACAv8B/v4BAP8AAP8A/wAAAAAAAQEAAAD+/gEA/wAA/wIB/wD//wAA/wAAAAAAAAH/AAAAAAAAAAD/AAAAAQAAAAAA/wEB/wH/AAH/AQH/AP7+AQACAv8A//8BAf8BAAADAv8A//8AAP//AAA3gv8nAAAgAElEQVQBAv8A//8BAQAAAAAAAQD//v8AAAICEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD+ACAAAAEAAP//AAACA/8A//4BAP//AAAAAQABAAAAAP7/AQAA/wAAAQL//wAAAAL//wH///4B/wIC/wEAAQAAAAAAAAAAAAD+/wEBAAEAAAAAAAD/AAAA//4BAQABAAAAAAD/AP8AAQIC/wH+/wEAAAEAAP//AAH/AAEAAP8AAf7/AQADAv8A/v8B/wIB/wEAAAAA/v8B/wEB/wH//wEBAQAAAAAAAP//AAD//v4BAAEC/wAAAQABAP8Bxuz+APL7/wAOBQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVx0DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMXs/wAA/wAA/wAAAAECAv8A/f8BAQAAAAD/AAAAAP8AAf4AAQAA/wAAAAAAAP//AAH//wH/AQL/Af/+AQD9/QEAAgP/AP/9AQEAAAD/AQL//wEAAAH+/wEAAP8AAf7/Af8BAv8A//8AAAABAAAAAAAA//8A/wEC/wH//wEAAP8AAAABAP///wAB/v8BAAEBAP//AAAA/wAAAAAAAAD9/QEAAAAAAAEC/wH//gEAAAAAAAAAAP8BAv8BAP8BAP7/EAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQH/AAEC/wD//wAA/v8AAP8AAAD//wAA/wAAAP//AAD/AAAA/v4BAf7+Af///wAB/wAAAf3/AQD9/gEA/f8BAP3+AQD//wAA/wAAAP4AAAD//wAB/wAAAP8AAP8BAf8B/wAAAP3+AQD//wAA//8AAQABAAABAf//AAL/AAABAP//AAAA//8AAP8AAAD9/gEA//8AAf7/Af8BAf///v8AAP8AAAH+/wEAAQL/Af7+AQH+/gEBAAAA8vr/AJve/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjNn8APP7/wAA//8AAf//AQD9/gEAAQH/AP8AAAD//wAAAAEAAP//AAD/AAAA/wEAAAEC/wD/AAAB/v4B//8AAAD/AQD///8AAP8BAAABAv8B/v8BAf3+AQAAAAABAAEAAP8AAAH+/gH/AQL/Af7/AQD//wAA/wAAAf7+AQAAAAAAAQL/Af7+AQH/AAAAAAAAAP//AAAAAAAA//8AAP8AAAD/AAAB/wAAAQAAAP8AAv8A/wEAAP8AAAD/AAAA/wEAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAA/f8BAP3/Af//AAAAAAEAAP8AAAABAv8A/wAAAP8AAAD/AAAA/wAAAAEC//8BAv8AAQL/AP//AAABAv8A//8AAAABAAAAAAAA//8AAP//AAAAAQAAAAAAAP//AAH+/wEA/wAAAP8BAAAAAQD/AQL/AP8AAAD/AAAC//8BAAEB/wH+/wEAAQL/Af3+AQAAAAAAAQL/AP//AAD/AAAAAAEAAAEC/wAAAAAB/v4BAP8AAAD/AAD/AQH/AAABAJrd/ADy+/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj9v8AquT//wAAAAAAAAEAAP7/AAAAAQAA/wAAAAEC/wD9/gEA/v8AAP8AAAD/AAABAAAAAP7+Af8BAv8AAQL/AQABAAD//wAB/f4BAP//AAD9/gEAAQH/AAABAAD+/wD/AQH//wEC/wABAv8A/wAAAQAAAAD/AAAAAAEAAP8AAAD+/wAA/f4BAP8AAAABAv8A/wAAAP8AAAH+/wEA/wAAAAAAAAAAAQAA/wAAAP8AAAEAAAAAAAAAAP8AAAEAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8AARAAAP8AAAD/AAH+/gEA//8AAAEC/wD+/gEAAAAAAQABAAEAAQAAAAAAAP7+AQH+/wEA/v8BAP8AAAD+/gEBAAEAAP8AAAD/AAABAAEAAP8AAAD//wAAAQL//wEC/wH/AAAAAAAAAAAAAAD//wAB/v4BAP8AAAD9/gH/AAH/AP3+AQD/AAD//wAAAQABAAAAAv8A/wAAAAIC/wD/AAAAAAH/AP8AAAABAf8A/wAAAAAAAAAAAAAA/f4BAAEB//L7AQCM2f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM2fwA4/T9AQD/AAAA//8AAAAAAAAAAf8A/v4BAP3+AQAAAAAAAAEAAAABAAEAAQD/AAH/AP8AAAH+/gEB/v8B/wAA//8BAv//AQL/AP8AAAEAAQAA/f4B/wAB/wEAAQAA/gAAAf7+AQD+/gEC/v8B////AP8BAf8B/wAA/wEC/wACAv8AAgL/AAAAAAD+/gEAAAAAAAAAAAD//wAAAQL/AP//AP8AAf8AAQL/AP3+AQD+/gEA//8A/wEC/wD+/gEA/v8AAQICDwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH//hAA/wAAAP8AAAD/AAAA/wAAAP3+AQD/AAAA/wAA////AP///wAAAQL/AAEC/wABAf8A//8AAAEC/wH/AQD/AAH/AAEB/wH/AQD///8AAP8AAAAAAv8A/f4BAf7+Af///wAA/wAAAP//AAD/AAAA/wAA////AAAAAAAA/v4BAAAAAAD//wAB/v4B/wEB/////wAB//8BAP3+AQEAAAAA/v4BAP7+AQD9/gEA/wAAAP8AAAD/AAAA/wAAAP3+AQD//wCb3PwAxuz+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOP2/wCq4f0AAf8BAAD/AAAAAQL/AP8AAAD+/gEAAQL//wEB/wD/AAAA//8A/wAA/////wAA/v4BAAEC/wD/AAD///8AAf7/AQH+/gEB/v4BAAAAAP///wABAAAAAf7+Af///wAA/v4BAP8AAAD/AAD/AQH/AP8AAAEAAQAAAAAAAv//AQH9/wH//v8AAP8AAAD/AAAAAQL/AP8AAAD/AAAA/v4BAP8AAAH+/gEA/v4BAAAAAAD/AAAA/wAAAf7+AQD/AAAA/wAA//39EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAf8AAQL/AP8AAAABAv8A/wAAAAAAAAD/AAABAAEAAP8AAAD/AAAA/f4BAP8AAAD9/gEB/wAAAP7+Af///wAB//4BAf7/Af///wAA/wAAAAAAAAH+/gEA/wAAAAEC/wABAv8B/wAAAAEC/wD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAABAv8A/wAAAP3+AQEAAQD//v8AAAAAAAD9/gEA/wAAAP8AAAH/AAAAAQL/AAEC/wEAAQAA/wAAAP8AAAABAv8A/wAAjdj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGLK/P8AAQL/////AAD/AAAA/f4BAAEC/wABAv8A/f4BAf7/AQABAv8BAAEAAv7/Af8AAf8BAAEAAP8AAAABAv8AAQL/AAEC/wD/AAAA/wAAAP8AAAABAv///wAAAAEC/wEAAAAA/wAAAAEC/wABAv8A/f4BAQABAAD9/gH//v8A/wAB/////wABAAEAAP8AAAD/AAAA/wAAAP8AAAEAAQAAAQL/AAEC/wABAf8A/wAAAAEC/wEAAQAA/wAAAP8AAAABAf8AAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+/wEA/f4BAf8AAAH+/gEA/wAAAQAAAAAAAAD//v8AAAEC/wABAf8A/wAAAP3+AQABAf//AAAAAAEB/wD/AAD/AAL//wAB/wEAAAAA/wAAAQAAAP//AAAAAAAAAf7/AQD9/gH//wAAAP7+AQD/AAAAAAAAAP8AAAABAv8A/wAAAAAAAAD+/gEAAQL/AP8AAAD9/gEBAAAAAP8AAAEAAQAAAAAAAQABAP//AAAA//8AAP//AAD//wAAAQH/AAAAAAD9/gEA/wAAxuz//7jm/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqeH9ANTu/QEA/f4BAQABAAD/AAAA/wAAAP3+AQH9/gEA/wAAAAEC/wD9/gH/AAH///8AAAEAAQD/AAH/AP3+AQD+/gEA/f4BAP3+AQABAv8AAQL/AAAAAAD+/gEA/wAAAP//AP//AAAAAQL/AP3+AQH+/gEAAQH/AP//AAD/AAAAAAAAAP3+AQABAv8A/v4BAP8AAAABAv8B/v8BAAEC///+/wAA/f4BAP3+AQD9/wEAAQL/Af3+Af8AAP8A/wAAAQAAAAD9/wEA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAf8BAAEA/wEB//8AAf8BAAAA//8AAAH/AAABAAAAAf7+AQD/AAAA/wAAAAAAAAH+/wEB/wAAAP3/AQAAAAAA/f4BAf7+Af//AAAAAAAA//8AAAEAAQAA/gAAAP//AAEAAQAAAQH/AP8AAAAAAAAB/wAAAQAAAAD+/gEBAAAAAf8AAAABAv8B/v4BAP8AAAACAv///wAAAP4AAP8AAP8AAAH///7/AAEAAAAA/f8BAP3/AQD/AAAA/wAAAAAB/wABAf8BAAAAAP7/AX7T/f/y+/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjdf8AAAAAAABAAAA//7/AAAAAAABAAAAAQAAAAAAAAABAAAAAP7+AQAAAAAA//8AAAIC/wH+/gEA/v4BAQAAAAAAAf8AAAAAAAEB/wD+/gEA/v4BAAAC/wD/AAAAAgL/Af7/AQAAAv8B/v4BAAAAAP//AAAA/f8B/wAB/wD/AAAA/wAAAQAAAAH+/gEB/wAAAAAAAAD9/gEA//8AAf7+AQEAAAAAAQL/AP8AAAEAAQAA/v4BAAAAAAEAAQABAAAAAP8AAAD/AAAAAQH/AQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+AAH/AQH/Af7/AQH+/wH//wAAAf8AAP8BAf8A/wAAAAABAAH+/wEAAAAAAf8AAP8BAf//AAH/AAEB/wH/AAABAAAA/wAB/wEAAQAB/wAAAP8AAAD//wAAAQH///8AAP8BAP8B/v8BAP8AAAABAv8A/wAA/wEC/wH/AAD/AQH/AAAAAAD//wD///8AAQAAAAD+/wAB/wAAAQAAAAD+/wEB/v8BAQAAAAD/AAABAAAAAAIB/wD/AAAB/v8BAf7/AQH+/wEAAAAAAQEC/+T0/gGb3f7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACN1/wA5PYAAAH/AAAA/wAAAQAAAAABAv8A/wAAAP8AAAD/AAD//wAAAAAB/wH/AAAA/v8BAf7/Af8BAv8BAQL/AAAAAAH+/wEA/wAAAf7/AQABAf8A/wAAAAD/AAD/AAAA/wAA//8AAAH+/gEA/wAAAf8AAAH/AAAAAP8AAf7/AQEAAAAB/wAAAP8AAAD/AAD//wAAAP8AAAAA/wAA/wAA//8AAP//AAAB/v4BAAAAAP///wAB/wAA/wEC///+/wD/AAH/AP8AAAEAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD//wAB/f4B/wEB/wD/AAAAAQH//wEB/wH9/wH/AQH///7+AAD/AAABAAAA/wEB/wH9/wEB/v8BAf7/AQAAAAAA/wAAAf//AQD+/wAAAAAAAQAAAP///wAB//8BAf8AAAH9/wH//wAAAAEB/wH9/gEA/wAAAf8AAAAAAAAB/f8BAP4AAAH9/wEBAQP/AP8AAAH//wEA/wAA/wEB/wH/AAD/AQL/////AP///wD///8AAf3/AQD/AAD///8A//8AAP//AAAA/wAA////AAD/AACa2/0A4/X/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOP2/wCN1vwAAP7/AP8BAf8A/wAA/wEB/wD9/gEA/wAAAAEC//8BAf8B/wAAAf7/Af8BAf8A/wAA/wAA/wH9/gEA/f4B//7/AP///wABAAAAAP8AAAD/AAAB/wAAAf3/AQH/AAAB/f4BAQEC/wD/AAAA/wAAAAAAAAD/AAAAAQL//wEC/wD/AAD/AQH/AAAAAP8BAf8B/wAAAf8AAAH/AQD/AQH/Af8AAAH/AAAAAQL/Af8AAAABAf//AQH/AP//AAAAAAAB//8BAQABAAD/AAAB/v8B/wEB/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAf7/AQD/AAAB/v8BAf3/AQD/AAAB/f8BAf8BAAAAAAAA/gAAAf7/AQAAAAD/AQH/AAAAAP8AAf//AQH/AP8AAP8BAf//AAH/AAAB/wEAAQAA/wAAAAAAAAABAf8BAAAAAv7/AQAAAAD///8A////AP/+/wAAAAAA/wEB//8BAf8A/wAA/wEB/wAAAf//AQH/Af7/Af8BAf8B/f0BAQABAAH/AQABAAEAAP8AAP8BAf8BAAEAAQAAAAEAAAD//v8AAf7/Af8BAf/z+f4Bjtb8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI3V/AD/AAH/AAAAAAH9/wEAAAAAAf7/AQEAAAAA/wAAAP7+AQH+/wEAAgL//wEB/wD/AAABAAAAAf7/AQD/AAAAAAAAAQABAAABAv8A/gAAAAAAAAH+/wH///8AAAAAAAAAAAAAAAAAAP7+Af8BAf8AAAAAAP8AAP8BAf8B/f8BAf3+AQACAv8A/wAAAP8AAAH9/wEA/wAAAAEB/wD/AAAB/v8B/wEB/wAAAAAB/v4B////AAD/AAAB/v8BAf3+AQH+/wEA/v8A////AP8BAf8A/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8AAf8AAAAA/wAB/wAAAAAA/wAAAAAAAP8BAf8AAAAAAAAAAAD//wAAAP8AAP8AAAD/AAAB/f4BAP//AAH+/gEA/wAAAP8AAAH+/wEB/v8B//8AAAD/AAAA//8AAP//AAD+/wEB/wAA//8AAAD/AAAAAQL/Af7/AQECAv8A/wAAAf7/AQH/AAAA/v4BAQABAAD+/wEA/wAAAP8AAAD/AAAA/wAAAAAB/wD//wAA/wAAAAAAAAH+/gEA/wAAAP7/AAD//wABAAAA/wAB/wD/AAAA/wAAKg8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1e//AKrg/QAA/wAAAP8AAAAAAAD/AAH/AP7/AAD//wAAAAAAAP8AAP8AAf8A/f0BAQAAAAH+/gEAAAH/AP7/AP8BAf8AAAH/AP//AAD/AAAAAgH//wAB/wD+/wABAAAA//7/AAD/AAD/AAH/AP8AAAD/AAAA/wAAAP//AAH+/gH///8A/wEB/wD9/gEB/v8BAP8AAAABAf8AAAAA//8AAAAAAAAA//8AAP8AAAD/AAD//wAAAQABAAEAAQAA/v8AAAAAAAD//wAAAAEAAP8AAAH+/wH/AQH/AP7+AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+/gEB/wAAAf7+AQD/AAAA/wAAAP8AAAH+/gEA/wAAAP//AAD/AAAA/wAAAP8AAAD/AAD/AgL/AP8AAP8BAv8B/v4BAP//AAD//wAA/wAAAf7/AQD//wAA/wAAAQABAAD/AAD/AQH/AAEB/wD//wAB/v8BAAEB/wD9/wH/AAH/AP8AAP8AAAAA/wAAAP3+AQD//wAB/v4BAP8AAAH+/wEAAAAAAP7/AQAAAAD/AQH/AP//AAD/AQABAAAA/wEC/wD/AAD/AAL/AAAAAAH+/wEdCgAAZSYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYsb6AP8BAf8BAAAAAAAAAAD//wABAAAAAAIC/wD/AAAAAQH/AP//AAD/AAAA/wEAAP3+AQH/AQAAAAAA/wEC/wH+/gEAAAAAAP8BAAH+/gEA/f4BAP8AAAAAAQAA/wEAAQID/wH/AAAB/v8BAP8AAAH+/gEA//8A/wAC//8AAv8BAAAAAQAAAAEAAAD/AAH/AP8AAAD+/wEA//8AAf7+AQD/AAAA/wEAAf7+AQABAf8A//8AAP//AAD9/QEAAAAAAP8AAAABAv8A//8A/wAB/wD/AAABAAAAAAAC/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAQD///8AAAEC/wD//wAA//8AAP//AP8BAv8A//8AAP8BAAD/AAAAAQL/AP//AAABAf8A/wAAAQABAAH/AAD/AQL/AAABAAD/AAAA//8AAAEB/wD/AAAAAAAA//7/AAAAAAAA/f4BAP3/AQAAAAAA//8AAP3+AQD/AAAB/v4BAQAAAAH+/wEA/wAAAQAAAAD/AAAAAQL/AQAAAAD//wAAAQL/AP//AAD/AAAB/f4BAP8BAAD//wD//gAAAf7+AQABAv8BAAAAAf3+AQD//wBzKwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq3/0A4/T+AAL+/wEA/f4BAP7/AAABAv8A/f4BAP3+AQD/AQAA/v8BAAEC/wH+/gEA//8AAP8AAP///wAA/f4BAQAAAAD/AAAB/v8BAQAAAAD/AAAA/wAAAf7+Af8BAf8AAAAAAP39Af8BAf8A//8AAAEB//8BAv8AAQL/Af7+AQH+/gEA/wAAAP3+Af/+AAAB/v8BAP//AAABAf8AAQL/AAEC/wD//wAA//8AAP8BAAD9/gEA/wAAAAEC/wD/AAAA/wAAAP8AAAD+/wEAAQL/Af7+AQD//wAA/f4BAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wABAAEAAP7+AQAAAQAAAAEA/wEB/wH9/gEAAAAAAAD/AAAAAQAA/f4BAQABAAD+/gEC/v8B//7/AAD/AAAB/v8BAP7/AAAAAAAA/wAA//8AAAEAAQAA/wEAAP8AAAAAAf8AAQL/AAAAAAD/AQABAAEAAAAAAAD//wAAAAAA////AAD//wAAAQH///8AAAD/AAAA/v8B////AAD/AAAA/f4BAAEC/wABAv8AAAEAAP//AAABAv8AAP8AAAEC/wD+/wEA/f4BAQABAFchBABWIAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOP1/wCM1v3/AAAAAP/+/wBWIAMAOhUCAAD+/gEA/wAAAAAAAAD//wAAAAH/AP3+AQAAAQABAAEAAP8AAAABAv8A/wAAAP8AAAEAAQD///8A/wAB/wAAAAAAAQL/AAAAAAH9/gEAAAH/AQABAAD+/gEBAAEA//8AAAH+/wEA/f4BAAABAAEAAQAAAAAA/wEC/wABAf8AAAAAAAAAAAD+/gEA/f4BAP3+AQAAAAAA/wAAAAD/AAAAAAABAAEAAP8AAAEAAQAAAQL/AP8AAAD//wAA/wAAAAEC/wAAAAAA/wAAAP3+AQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAgL/Af3+AQACAv8AAQAAAf7/Af8A/wABAAEAAP8AAAABAv////4BAAAAAAD+/gEBAAEA/wEC/wAA/wAAAQEAAf7+Af8AAAAAAAAAAAAAAAD+/gEAAQL/AAAB/wD//gH/AgL/AP7/AQACAv8A/v4BAAIC/wD+/gEAAQAAAP//AAAAAAAA//8AAQABAP8A/wAAAAAAAP7+AQEAAQD/AP8AAAEC/wD+/gEAAAAAAf//Af8A/wAAAAAA////AHMrBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrf/QDk9P8AAAAC/x0L/wF0LAUA/wAAADiz+QD+AQD/Av8AAf8BAf8A/f4BAQEBAP///wD/AAAAAAAAAAD+/gEAAgL/AP7+Af8BAv8A//8BAP7+AQEBAQD///4BAAAAAAAAAAAA/v4BAAABAAABAv////4BAQABAAAAAf8AAP8BAP7/AP8BAAAAAQL/Af8AAAAAAAAA//8AAQABAAAAAAD/AP8AAAAAAAD/AAAAAAAAAAEC/wD+/gH/AP8AAOJExAEAACAASURBVP7/Af8BAAAA//8BAQABAP8BAf8A/wAAAAEAAAH/AQAAAAAA/wIB/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH/AAD///8AAP8AAAH/AQAA/f4BAAAAAAD+/gEA/f4BAP//AAD/AAAA//8A////AAD+/gEA/wAAAAEC/wD/AAAA//8AAf7+AQH/AAEAAAAAAAEC/wD/AAAAAAL/AP8AAAD/AAAA/v4BAP7+AQD/AAAB/f4BAf8AAAD/AAAAAQL/AP3+AQD/AAAA/wAAAP8AAAD/AAAAAQL//wEB/wH/AAAA/wAAAP8AAP///wAA/wAAAP7+AQABAv8AAQL/////AAD/AAAAAQL/VyEEABwLAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4/X/AI7T+wAA/v4BAf7+AXMrBAAcCwEAHQsBAGQmAwABAAEA////AAAAAAAAAAAA////AAD/AAAAAQL/AAEC/wD/AAAA/f4BAP8AAAAAAAAB/wAAAQEBAP8BAf8A/wAAAP8AAAD/AAAAAQL/////AAD+/gEA/wAAAf//AQD+/gEAAQL/AAAAAAD/AAAA/v4BAP7+AQD+/gEA/wAA/wAA/wD/AAAAAAL/Af8AAAD/AAAA/wAAAP3+AQD/AAAB/wAAAAAAAAABAv8A/wAA/wEB/wD/AAAA/v4BAP3+AQD//wD/AQH/Af3+AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAv8AAQH/AAEB//8BAP8B/wAAAQAAAAD/AAAA/wAAAAABAAH/AAAA/wAAAQAAAAEAAQABAAAAAP//AAD/AAD//wAA/wEB/wD+/wAA//8AAP8AAAABAv8B//8BAQAAAAD/AAAAAQL/AP8AAAD/AAAA/wAA//8AAAD9/gEA/wAAAAEC/wABAv8A//8AAAEC/wABAv8B/v4BAP3+AQAAAQAAAQH/AAEC/wABAv8AAQL/AAEB/wH+/wEA/f4BAAEC/wD/AAAdCf8BcywEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjtP7AAABAv8A/wAAViEDAFYiBAAAAAAAAAAAAHMsBAAPA/8BAAEC/wD9/gEA/wAAAf8AAAABAv8A/f4BAf7/AQD/AAAAAQH/AAEC/wD//wD/AQH/AP//AAD9/gEA/wAAAP8AAAEAAAAA/f4BAf8AAAH/AAABAAAA//7/AAD/AAAA/wAAAP8AAAH/AAAA/wAAAQAAAAABAv8BAAEAAf7/Af///wAB/v4BAAABAAABAv8BAAAAAP8AAAEAAAD//wAAAf8AAAD9/gEAAQL/Af3+AQH+/gEA/wAAAQAAAAD/AAAA/f4B/wEC/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+/gEBAAEAAf7/AQD+/wH//wAA/wAC/wEAAAAAAQL/AP//AAAAAAAAAAAA//4AAP///wD//gAAAP3/AQAAAAAAAAAAAP8AAAAAAAAA/f8BAf7+AQD9/gH/AAD/AP4AAAEAAQAB/v4BAQAAAAEAAAAAAAAAAQEC/wD/AAAA/v4BAP8AAAH+/gEB/v8BAf7+AQD//wD//wAAAP8AAAD//wAB/v8BAP3+AQH+/gEB/v4BAP3/Af/+/wABAAAAAf7/AQABAf9zLAUAHAsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC55P0Aqt79AAD+/gEBAAAAcy0FAAAAAAAAAAAAAAAAAA4GAQBzLQQAAf8AAAABAf8AAQH/AAAAAAH+/wEAAQL/AP//AAD/AAAB/v8BAP8AAAD9/wEA/f8B/wAB/wEAAAAAAQH/AAEC//8AAf8B/wAA//8AAP8BAv8A/wAAAQAAAAEAAAAAAAAAAQAAAP//AAAAAQH///4AAAD/AAAA/wAA//8AAAEAAAD/AQL///7/AAD/AAAA/wAAAQAAAP8AAf8BAAAA/wAAAAD/AAAA//8AAAAAAAD+AAAA/wAAAP8AAP8BAv8BAAAAAP//AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAA/f4B//8AAAABAf8AAAAAAf7+AQD/AAAA/wAA/wEC/wD/AAD/AAH/AAAAAAH/AAABAAAAAAEB/wABAv8AAAH/AP7/Af//AAAAAQL//wEC/wEAAAAB/v8B/wIB/////wD//wAA//4AAAD/AAAA/wAA/wAAAAEAAAAB/wAAAAAAAAD/AAD/AAH/AP8AAAH+/wEAAAH/AAAAAAD/AAABAAEAAQAAAAD/AAAA/wAAAAEB/wEAAAD//wAA////AB0JAAFWIgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+zPsAAP8AAP8AAf85FgIAHAsBAAAAAAAAAAAAAAAAAAAAAABkJwQAKg7/AQAAAAAB/v8BAP8AAAD//wAB/v4B//8AAAEAAAAA/wAAAf7+AQEAAAABAAAAAf7/AQD/AAAB/v8BAf7+AQD+/wH/AAAAAAAAAAH+/gEA/wAAAP8AAAD/AAAA/wAAAP8AAAABAf8A/f8BAP//AAH+/gEA//8AAAEC/wD/AAAB/v4BAQAAAAAA/wAA/wAAAAEC/wD+/wEA/wAAAP4AAAEAAAAA/v8B/wAB/wACAv8BAAAA/wAB/wD+/gEA/wAAAP7/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAf///wAAAAEB/wH9/wEB/wAAAP8AAAD/AAAAAP8AAf7+AQD/AAAB/v8BAAEB/wD/AAAA/wAAAf7/AQH9/gEB/v8BAP//AAH/AAAB/v4BAf3+Af8BAf8AAQL/Af3/AQH/AAAAAQH/AAIB/wD/AAAA/wAAAf8AAAD/AAAA/wAAAf3+AQD/AAAB/wABAP8AAAD/AAAAAAAAAf8AAAD/AAD//v8A/wEB//8BAf//AQH/Af7/Af///wAB/wAAAQAAAI85BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzf/v/k9P8A/wEC/wH+/wFWIgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgjQGAAH9/wH//wAAAP8AAAD/AAAAAAAAAf8AAAD/AAD/AQH/AAEC//8BAf8AAQL/AP8AAAD/AAAA/wAAAP8AAAH/AAAAAQH/Af8AAAD/AAAA/wAAAP8AAAABAv8B/f4B/wEB/wH//wEBAAAAAQABAP8BAf//AQH/Af7+AQD/AAAA/wAA/wEB/wH/AQAA/wAAAP3+AQEAAAAA/wAAAgEBAP8BAf8B/wAAAQABAAD9/gEA/wAAAAAAAAABAf8A/wAAAf8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAACAAAAAv4AAQD//wAAAAAAAAAAAP8BAf8A/f4B/wAB/wD/AAAAAAAAAf3/AQD/AAAAAAAAAP8AAAD/AAAA/wAAAQABAAD/AAD/AQH//wEB/wH9/wH///8AAAEB/wD/AAAB/wEAAf7/AQABAv8A/wAAAP7+AQD/AAAAAQL//wEB//8BAf8A//8A/wEB/wD/AAAB/v8BAP8AAAAAAAAAAAAAAf3/AQH+/wEB/v8BAP8AAAABAv//AQH/ViEDADoXAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4/X/AIvQ+gEAAQH/Af3+AQABAf9IHAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAORcCADkWAgABAAAAAAAAAAD/AAAA/v8AAAAAAAD/AAAB/wEAAP7+AQH9/wEA/wAAAP8AAP8BAf8AAAAAAAAAAAD//wAB/f8B/wEB/wAAAAAAAQL/AP//AP///wAA/wAAAf3+AQD+AAAAAAAAAAAAAAH9/wEB/f8BAQAAAAAAAAAA//8AAf7/Af///wAA/wAA/wEB/wD/AAAAAQL/////AAH9/wEAAAAAAP39AQAAAAAAAQL/AP8AAAD/AAD/AQH/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+/wH//wAA////AAAAAQAA/v8AAP8AAAH+/gEBAgP/Af7/AQAAAAAA/wAAAAAAAAAAAAAAAAL/AP//AAAAAAAAAP8AAP8AAAAA/wAB/f4BAf7/Af8BAf8B/v8BAP7/AQAAAAAA/v4BAP8AAAD9/QEAAQH/AP8AAAAAAAAA/v4BAf7/AQH+/wH/AAH/AQABAAAAAAAA/wAAAP8AAP8AAf8A/wAAAAEC/wD/AAAA/wAAAAD/AAH+/gEC/v8Bcy4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjtH7AOTz/wAA/f8BAP//ADoVAQEOBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6BgAOBgL/AP//AAACAv8A/wEAAAAB/wAAAAAA/v4BAAAB/wAAAAD///8AAAAAAAH+/wEA/v8AAP7/AAAAAQAAAAAAAf8AAAAAAf8A/f0BAP8AAAH+/wEAAAAAAAABAP8BAf8A/wAAAP8AAAABAf8AAQH///7/AP8AAf8AAAEA/wAB/wH+/wEAAP8AAf7/AQD/AAAA/v4BAP8AAP8BAf8AAAH/AAID//8AAf8A//8AAP8AAAH+/wEC/v8BAf8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAB/wAAAP//AAD//wABAAEAAP8AAAEAAQAA/f4BAP8AAAD/AAAAAQH/AP8AAAD/AAAB/v4BAAABAAAAAf8AAAL/AP8AAAABAv8BAQEA/wAB/wEAAAAA/wAAAf8AAAD/AAAA/wAA/wAB/wACA/8A/v4BAQAAAAD/AAAAAAH/AP//AAH/AAAB/v8B//7/AAABAf8AAAH/AAAAAAH+/wEA/wAAAP7+AQD//wAA//8AAP8AAAD/AQBxLgQAHAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj9P8Aqt3+/wACAf8AAAAAAAABACsRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwMAQBkJwIBAP8BAAD9/gEAAgH/AP7/Af8AAf8AAQH/AP7+AQD/AAAA/wAAAP8AAAD/AAAAAAEAAAAAAP8BAf8A/wAAAf7/AQD+/gEAAAEAAAABAAD/AAAA//8A/wAB/wH+/wEA/wAAAAEB/wH+/wEA/v8BAAAAAAEAAAAA/wAAAf7+AQD/AAAA/wEAAP8AAAABAf//AAH/AAEB/wH+/wEA/wAAAP39AQH+/wEA/v4BAf7/AQD//wD//wAA//7/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD///8A/wAC/wD/AQD///8AAP//AP8AAf8AAQH/AAEB/wD//wAA/f8BAP8AAAABAf////8AAAEB/wD+/gEA/v4BAf8AAAD9/wEA/wAAAf7/AQD9/gEA//8A//8AAAD/AAAA//8AAf//AQH+/gEA/wEA//8AAAABAf8A/v4BAAEC//8BAf8AAQL/Af7+AQD9/gEA/v8BAP//AAD//wAA/wAAAP8AAAD/AAAAAQL/AP8AABwLAQBlKQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/y/sAAf//AQD9/wEA//8AAQAAAA4GAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlKQQADgUAAAAAAAAA/f4BAAEB/wL+/wEA/f4BAP8BAAABAf8B/v4BAAEB/wABAf//AQH/AAEC/wH/AAAAAQH//gEB//8AAv8A//8AAP8AAAABAf8AAQL/AQAAAAH/AAAA//8AAP3/Af///wD/AAH/AQABAAD9/wEA/wAAAAEC/wEAAAAAAAH/AP8AAAD/AAABAAAAAf7/AQD/AAAB//8BAAEC/wD//wAA/wEAAP8AAAD/AQAA/wAAAQABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAf8A/wAAAf/+AQABAf8AAQL/AAEC/wD9/gEB/v8BAP8AAAD/AAAA//8AAP//AAD+/gEBAAEAAP7/AQABAv8A/wAA////AAABAf8A/wAAAAD/AAEAAQAA/wAAAP//AAD//wAA/wAAAP7/AP8AAf8A/wAAAf8AAAH+/wEAAQL/Af7/AQD+/gEB/v4BAAEC/wEAAQAA//8AAP8AAAD/AAABAAAAAQAAAAABAv8B/v8BAAABAHMvBAAOBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrc/AC54/7/AP8AAAD//wAAAAAA//7/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBgEAgTUFAAAAAf8A/wAAAP3+AQAAAAAA/wAAAQAAAAD9/gEA/wAAAP3+AQD9/gEB/f4BAP7/AQD9/gEA/wAAAf3+AQH+/gEA/wAAAP//AAD+/gEA/f4BAf7/Af8AAAAAAQL/AP//AAABAv8B/v4B//8AAAABAf8AAQH/AP3+Af8AAf8A/v4BAP//AAD/AAAA/f4B//7/AAABAf///v8AAP8AAAACAv8A//8AAAD/AAD//wAAAQH//wEB/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+/wEAAAAAAQABAAH+/wEA/v4BAAAAAAAAAAAA/wAAAP8AAAAAAAAAAgL/AAIC/wAAAf//AAH/AAAB/wD/AAABAAEAAAEC/wAAAAD/AQH/AP8AAP///wAAAQL/AAEC/wAAAAAAAAAAAAAAAAD/AAABAAAA////AP///wAA/v4BAP8AAAD/AAD/AQH/AP7+Af///wABAAEAAAEC/wAAAAAA/wAA////AAD/AAD///8AHQsAAFYkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI7R/v8A/f4B/wAB/wEAAQAA/wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAViQEADoWAQEBAAEAAAAAAP///wAAAAAA////AAAAAAABAAEAAAIC/wEAAQAAAAAAAf8AAAAAAAAA/v4BAAEC/wEAAQAAAAAAAAAAAAD/AAAAAAAA/wEB/wAAAf8A/v4BAAAAAAD/AAABAAEAAAAB/wD+/gEA/v4BAAAAAAD+/gEAAgL/AAAAAAD+/gEBAAEAAQAAAAD+/gEAAAAAAP8AAAD9/gEBAAAAAf8BAAABAv8A/v4BAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAH///7/AAD//wAB/wAAAf3+AQH/AQD/AAH/Af7+AQH/AAAA/f4BAf3+AQD/AAAB/v4BAf7+AQH+/wH///8AAf7+AQD9/gEB/f4BAf8BAAH/AAAA/v4BAAAAAAABAv8A/wAAAf8BAAH+/wH///8AAf8AAAEAAQAA/wAA////AAABAv8A/f4BAQABAAAAAv8A//8AAP7+AQH/AQAA//8AAQABAAD+/gEB/wEArEgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjs/7AOPy/AEBAQEAAP7+Af///wAAAAH//wEC/+T0/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIwBAD/AAH/AAEC/wH/AAAA/wAAAAEC/wD/AAD/AAH/AP8AAAD//wAAAQL/////AAH/AQAA/wAAAAAAAAD//wABAAEAAf8AAAH/AAAAAQL/Af3+AQD+/gEA/wAAAf8AAAH+/gH/AQH/AAAAAAEAAQAB/wEAAf8AAAEAAQAA/wAAAf8AAAEAAQAA//8A//8AAAEAAQAA/wAAAP7+AQD/AAD/AQL/AP//AAAAAAAAAQL/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAf8A/v8BAQABAAD/AAD//wAA/wEC//8BAf8A/v4BAAEC/wD/AAABAAEAAP8AAAEAAQAA/wAA/wEC/////wAB/wAA//8AAAD/AAD//wAA/wEB/wAAAAAA/wAAAf3+AQH9/gEBAAAA/wEB/wAAAAAA/wAAAP8AAP8AAf8B/wAAAAEB/wH9/gEBAAAAAAAB/wEAAAAA/wAAAf8AAAD//wAA/wAAAP7/AAD/AABVJgT/HAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj8/8AnNb8AAD/AAAAAQH/AP8AAAABAv8AAAEAAP8AALjg/QDy+v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkYAwBWJAIBAP3+AQAAAAABAAAAAf3+AQH/AAAB//8BAP8AAAD/AAAA/f4BAQAAAAD//wAAAQL/Af3+AQAAAAAA/wAA/wEC////AAAA/wAAAP8AAAH/AAAA/wAA//8AAAAAAAAA/f4BAf7+Af/+/wAAAP8A//8AAAD+/wAA//8A//8AAP/+/wAA/wAAAAEC///+/wAA/wAAAP8AAAABAv8A/wAA/wEC/wD/AAAA/wAAAf7/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+/gEAAAAAAP//AAAAAAABAAAAAf7+AQH+/gEBAAAAAP7+AQAAAAAA/wAA/wEB/wD+/gEA/wAAAf7+AQH/AAAAAAAAAQAAAAEAAAAAAQH/Af7+AQD/AAAAAQL/AAAAAAD/AAAA/gAAAf7+AQD//wABAAEAAAAAAAH+/gEAAAAAAf7/AQAAAAAA/wEAAP7+AQD+/gEAAAAAAP8AAP8BAv8AAQL/AAABAA8GAQBzLwQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOz/sA8foB/wEAAAAA/f4BAAEC/wH+/gEB/v4BAf7+AfP5/wB/yfsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByMAUADgcD/wD/AAD/AAH/AAAAAP8BAv8A//8AAP3+AQD/AAABAAAAAAAC////AAAA//8AAAAAAP8AAv8A/wAAAf3+AQECAv8B/v4B/wEC//8BAf8BAgL/AQAAAAD/AAABAAAAAP8AAAEAAAD/AAL/AQABAP8BAf8B/v8BAQAAAAH/AAAAAAAAAf7+AQEAAQAB/wAAAQAAAAH+/gEB/v4BAf3+AQH9/gEA/wAAAP//AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH/AAAB/wAA/wEC//8AAf//AAH/AP8AAAD/AAAAAQL/AP8AAAD/AAD/AAH/Af7/AQD/AAAAAAAAAP8AAP8CAv//AAH/AP8AAAD/AAABAAEAAQABAP8AAf8BAAAA/wAB/wAAAQAAAAAA//8AAAD/AAAAAQH//wEC/wD/AAAA/wAAAP8AAP8AAv//AQH///8AAP/+AAAAAQL/AAAAAAH+/gEA/v4BAP//AGQqBAAcDAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPz/wCr2/wAAf7+Af//AAAA/wAAAP8AAAD/AAD/AAH/AP8AAAAAAACr2vwAx+f+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdDAEAZSkCAQD/AAAB/v8BAP8AAAH+/gH//wAAAAEB/wAAAAAA/wEA////AAEAAAAA/wEAAP8AAAH+/gEA//8AAAAAAAD9/gH//wAAAQAAAAEAAQAA/f4BAP8AAAD/AAAAAQL/AP8AAAD/AAAB/v4B/wAA/wH+/wEAAAL//wAB/wAAAAD/AQL/AP8AAP8AAP///wAAAP8AAP8BAv8AAQL/AAAAAAAAAAAB/v4BAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAf3+AQH+/wEB/v8B//8AAAD/AAD///8AAP8AAP8BAf8B/v4BAP8AAAD/AAAAAQL/AQABAAD//wAB/v8BAP8AAAD/AAAA/wAA//7/AAH+/wEA/f4BAf7/Af8BAP8A/wAAAQAAAAD/AAAA/f4BAf3+AQD/AAAAAQL/AP8AAAH+/gEB/f4BAf8AAAEAAAAA/v4BAP8AAAD/AAAA/wAAHQwBAHIyBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFW4+v8A/wAAAP8AAAABAf8AAQL/Af7+AQEAAQAB/v8BAP8AAAD/AAAA/wAAjs76AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCwEAB0MAgD/AQH/AP8AAAEAAQAAAQH/Af7/AQD/AAAAAQH/AAAAAAD/AAAAAP8A/wAB//8BAf8AAQL/AP8AAAD/AAAB/wAAAP3+AQD9/gEA/wAAAP8AAAD/AAD//f0BAP8AAAAAAQAA/wAAAQABAP8BAf8A0hhbigAAIABJREFU/v4BAAAAAAD/AAAB/f4B/wAB/wH+/wEAAgL/AP8AAAH/AAAA/f4BAP8AAAD/AAAA/wAAAAEC/wAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAQH/AAEC/wH9/wEBAAAAAf8AAAD/AAAAAAAAAP8AAAD9/QH//v8AAf3/Af8BAf8A/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAQH/Af3/AQABAf8A/gAAAP8AAAABAv8BAAAAAAAAAAD9/gEAAAAAAAAAAAABAf8AAAAAAP8AAAAAAf8AAAAAAP//AAD/AABxMQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq2vwA5PL+AAD/AAAAAAAAAf8AAAD9/gEA/wAA////AAD/AAAA/wAAAP8AAAD/AADG6P//q9r8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBgEAjj4FAAH+/wEA/wAA//7+AAH9/wEAAAAAAP8AAAD+/gEB/v8BAAAAAAH+/wEB/v8BAf3/AQD9/gEAAAAAAP8AAAAAAAAA/wAAAAEB/wD/AAAAAQH/AAEB/wH/AAABAAAAAP7/AAD/AAAA/v4BAf7/AQD/AAAB/wAAAAAAAAABAv8B/v8BAQAAAAH9/gH/AQH/AP3+AQABAf8AAAAAAAEB//8BAf8A/f4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEB/wD/AAAAAAH/AAAB/wAAAAAB/v8BAP7+AQEAAAD//wAAAP8AAAEAAAAA/wAAAAAAAP8BAv8AAAAAAAEB/wH/AAAAAAAAAAIB/wD+/gEA/wAAAP8AAAD/AAD//wAAAAIC/wD+/wEAAQH/AAEB/wD9/QH//v8AAf8AAAABAf8A/gAAAP8AAAD+/gEA/gAAAQAAAP//AAAA/wAAAAEC/zkZAwBWJgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPzvsAAP7/AQAAAAAA/wAAAP7/AQABAv8AAAAAAAAB/wAAAAD/AQH/AAAAAAAAAAAB/wAAjs77APL5/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAORkDADkYAgAAAQH/AAEC/wABAf//AAH/AAEB/wABAv//AAH/AAAB/wD//wAAAAAAAAEB/wEAAQAA/wAAAAAAAAD/AAAAAAAAAP7/AQABAf8A/f8BAP8AAAABAv//AAH/AAEB/wABAf8A/wAAAP8AAAAAAAAA/v8BAP8AAAD9/gEAAAAA//7/AAEAAAAB/v8BAAIC////AAAA/wAAAP7/AQEAAQAAAQH/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP7/AQD/AAAA/v4BAf//AQD/AAAA/wAAAAAB//8BAf8AAQH/AP7/Af///wAA/wAAAP8AAAH/AAAA//8AAP7/AQH+/wEA//8AAP8BAAD/AAAA/wAAAP8AAAD/AAAB/v4BAP8AAAABAf8A/v8BAAAAAAAAAQAAAgP///8AAAD+/gEAAP8AAAAB/wD/AAAAAgH///8AAAD/AAAA/wAAAP7/AY8/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI7N+wDj8v4AAP8AAAD/AAAB/wAAAAEC/wD//wAA/wAAAP3+AQAAAf8B/v8BAAAB/wH/AAAAAAAA4/QA/5zU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIyBQAA/v8BAP7/AQH+/wEC/v8BAAAAAAH9/gEB/v8BAf7/AQH/AQD/AAH/AP7+Af///wAB/wAAAP8AAAD/AAAAAAH/AP8AAAD+/gEAAAAAAP7/AQH+/wEA/v4BAP7/AQD+/wEBAAAAAP7/AAD/AAAAAQH/Af8AAAAAAAAA/wAAAAIC////AAAA//8AAP39AQD/AAAAAQL/AP8AAAD+/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEB/wEAAAAA/wAAAP4AAAABAv8AAQH/AAAAAAH9/wEA/f4BAP8AAAD/AQAB/wAAAAEB/wH//wEA/wAAAAEC//8BAf8AAAEAAf3+AQD/AAAAAQH/AP//AAD/AAD/AAL/AP3+AQD9/wEA/wAAAP3/AQEAAAAA/f0BAAEB/wD/AQAAAQL/AAAAAAEAAQAB/v8BAAEB/wL+/wEA/wAAVSYDABwNAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5PP/AI7M+gAAAAEAAP//AAD/AAD///8AAP3+AQH+/wEA/wAAAAAAAAH//wEA//8AAP7/Af///wAB/v8BAP7/AZzU/f/k8/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkaAwBkLAQAAP//AP8AAf///wAAAP8AAP///wAAAQL///8AAP//AAABAAAAAP8AAAABAf8AAAAAAAEB/wABAf8A/v4BAAEB/wABA/8A/wAAAP8AAP8BAf8AAQL/AP//AAD//wD/AAL/AQEBAAABAf8A/f8B/wEB/wD/AAAA/wAAAP3+AQD/AAAA/wAAAP8BAAEAAQAA//8AAP8AAAD+/wEA/v8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP3+Af/+/wABAAEA/wEB/wD9/QEA/f4BAf7/AQAAAAABAAEAAQAAAAEAAAAAAAAAAP8AAP//AAABAAEAAP39AQD9/gEAAAH/////AAEAAAAA/wAAAQABAAABAf8BAAAAAAEB/wEAAAAA/wAAAQAAAP/+/wAAAQL/AP8AAAEAAAAA/f8BAP7/AQD/AAAA/wAAAf7/Af//AAAdDAEAczMGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjc78/wEAAQAB/wAAAAEC/wABAf8AAQL/AP//AP8BAf8A//8AAP8AAP/+/wAAAQL/AAAAAAD/AAD//v8AAAAB//P3/gF/xvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByMwUADwYCAAH+/wEAAP8AAP8AAAAAAQAB/v4BAAEB/wD//wAA/wAAAQABAAD9/gH//wAAAP3/AQD9/wEA/wAAAf7/Af///wAA/wAAAQAAAAD/AAAB/v8BAP8BAAD/AAAA/f0B//7/AAD/AAAAAQH/AP8AAAABAf8AAAAAAAEC/wD/AAABAAEAAAEB/wD9/QEB/v8BAP//AAD//wAAAQH/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEC/wAAAAAA//8AAP3+AQABAv8AAAAA//7/AP/+/wD/AAH/////AP8BAf////8AAf7+AQD//wD/AAH/AP8AAAABAv8A/f4BAP8AAAD/AAAB/v8BAP8AAAD/AAAB/v4BAP3+Af8BAf8BAP8A////AAEAAQAB/v8BAf7+Af/+/wAAAQH/AP//AP8AAf//AAH/////AAAA/wBjLgQAHA0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV7f8Aq9b6AQD//wD/AQH/AP8AAAD/AAAB/v4BAAEC/wD9/gEBAAEAAAAAAAEAAQAA/v4BAf8AAAAAAAAAAAAAAP7+Af8CAf+63/wAx+b9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBwEAYy0EAAACAf8A/wAAAP7+AQH/AAAA//8AAP8AAAEAAAAAAAAA/wAB/wD/AAAAAAH/AAD/AAEA/wABAAEA////AAL+/wEBAAAA////AAH+/wH///8AAAIB/wAAAAAAAgL/AAEC/wD/AAAA/wAAAf7/AQD+/gEB/wAAAP7+AQEAAAD///8AAP7+AQAAAAAA//8AAQAAAAAAAAAB/v8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP7+AQABAv8A/wAAAQAAAAD+/gEAAAL/AAEC/wEAAAAA/v4BAf8BAAD+AAAA/wAAAP8AAAAAAv8B/v4BAQEBAAH+/gEBAgL/AP8AAP///wD/AQH/AP//AAH+/gEAAAEAAAIC/wH9/gH//wAAAf8AAP///wD/AQH/AP8AAAEAAQAB/v8BAf8AAAH+/wEB/v4BAf8BAB0MAQBkLQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkt/gAAQIC////AAAA/wAAAP7+AQAAAAAA/wEAAf7+AQEAAAD/AQH/AP8AAAD/AAAB/wAAAP8AAAH/AAAA/wAAAQEC/wD9/gEA/wAAjsv7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcjQFAB0LAAEAAQL/AP8AAP///wAA/wEAAP7+AQD/AAAB/wAAAf7/AQEAAAAA/v4BAf8AAP//AAAA//8AAAEC/wD//wAA//8AAAAC/////wAA/wAAAf7/AQEBAv8B/f8BAAAAAAH+/wEA/wAAAP//AAH/AQAA//8AAf8AAAD/AAAA/wAAAf8AAAAAAv8AAQL/AP8AAAD/AAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAH9/gEA/wAAAP8AAAH/AAAB/v4BAf//AQABAv8B/wAAAAAAAAAAAAAB/wAA/wEC/wH+/gH/AQL/AP7/AP8BAv///wAAAQEBAAABAv8B/v4B/wEC////AAAA/v8AAP8AAP//AAAA/wAA/wEC/wABAv8B/f4BAP8AAAAAAAAA//8AAP8AAAAAAAD//wAAAAEB/3E0BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKvZ/ADj9AD/AP8AAAABAf8B/f4BAAEC/wH9/gH/AQH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AAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAACAv8A/wAAAP8AAAD/AAD/AQH/AP8AAAD/AAD//v8AAAEC/wD/AAAB/v8BAP//AAH+/wEA/wAAAP8AAAD/AAAcEAP/cTYFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBwEAqlEIAB0MAAEA/wAAcrz5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAPAYADgcBAAD/AAAA/wAAAf7/AQABAf8A/wAA////AAD/AAAA/wAAAQAAAP///wAA/wAAAP8AAAABAv8A/wAAAAEC/wEAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//7/AAD/AAD/AQH/AAAAAAD//wAB/f8BAAAAAAD/AAAA/wAAAP//AAD/AAD//v4AAP8AAAD/AAAA/wAAAAEC/wEAAQA5GQEBDgcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgcBAI1DBgAA/wAAx+T9AMfk/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBwEAViUBAQD/AAAAAAAAAAEC/wD/AAAAAQH/AQABAAH+/gEAAAAA//4AAAH+/wEBAAAAAAAAAAH+/gEAAgL/AP7+Af//AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAABAAD+/QEB/v8BAAAB/wEAAQABAAAAAP//AAABAf8AAAAAAAABAAEAAAAAAQL/AAAAAAAAAAAA//8AAP79Af///wA5GwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkbAwA5GwMAAAAB/3O8+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKhQDAAEBAAAAAQH/AP7+AQH+/wEA/v4B//7/AP//AAAA/wAAAQAAAAD/AAD/AAH/AP8AAP//AAAB/f4BAAEB/wH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEB/wABA/8B/wAAAP7/Af8BAf//AQH/AP8BAAAAAQABAAAAAf3+Af//AAAAAAAAAP8AAAH/AAAAAAEAAP8BAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVKQQAAP7/AePx/gCdz/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAf8B/f8BAAEB/wAAAAAB/wEAAf7/AQD/AAAA/wAA//8AAAEAAAAA/v8BAAEB/wD/AAD///8AAP8AAAD/AAAB/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf7/AQD//wAAAAAAAf8AAAD9/gEB/v8BAP8AAAH9/gH/AAH/AP8AAAEAAAAB/v8BAP//AAAAAAAB/wAAAAEB/wABAf/W6/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5HAMAAP//AAD/AACPyv3/8vn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdjtF2AAAgAElEQVQAAAAAyOX9AAD9/gEAAAAAAP3+AQD/AAD/AQH/AP//AAEAAAABAAAAAQAAAAD+AAAA//8AAf7/AQAAAAAB/wEAAf3/Af8BAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAH9/gH//wH/AAAAAAD/AAD//v8AAQIB//8AAf8A/gAAAAAAAAD/AAAA/wAAAAIC///+/wD/AAH/Af7/AQH9/wGr1v0A8vn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDgEAAQAAAAEAAADy+f8Aj8j6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy+f8Ax+T//wEAAQD//wH/AQAAAAABAv8B/v8BAAAAAAD/AAAA/wAAAP//AAAAAAAAAAL/AP8AAAD+/wAAAAAAAAD/AAD+AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8C/wAAAQAB//4B//8B/wEAAQAAAAAAAP3/AQD/AAAB//8BAAAAAAAAAAAA/wAAAf3/AQEAAQAAAAAA//8B/wAAAADx+P4AgMD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy+f8AAP8AAAD/AAAA/f0BnM77ANXr/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPyPoA5PD9AQAAAf8B//8BAP8AAAD+/wAA//8AAP8C/wAAAf///wH///8AAAD/AAAAAAAA////AAAAAAD///8A//8AAAEAAAD//wH/AAAAAAA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BDgcBAHE6BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHA8CAI1JCABwOQYA//8B/wH+/wEA/wAAAP8AAAD+/wEAAAH/AP8AAP8AAf8A/wAAAAAB/wAAAAAA/wAAAAAC/wAAAv8B//4BAP8AAAD+/gEA/gAAAP7+AQAAAAAAAAAAAP8AAAAAAf8A/v4BAAAB/wEAAAAA/wAA//8C/wD//gECAP8BAP7+AQAAAAAA//8AAP//AAEAAAAA/wAAAP7/AQAAAAAB/wAA8vkA/4G++QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9CBgAOBwEAAP8AAAD//wAA//8BAP/+Af//Af///wAAAQAAAAAAAAAA/wAAAP8AAAH//gEAAQL/AAAC/wAAAAD//wH/AP8AAAD/AAAAAAL//wAC/wD/AAAA/wAAAP8AAAAAAf8AAAAAAP8AAAD//gEA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Af8BAAAAAQABAAD//gEA/wH/AQABAP//AAAAAAAAAAAAAAH/AAD//v8AAP7/AQEAAAAA/wAAAAAB/wD//gEA/wAAAP7/AAAAAf///wD/AP8AAAD/AAAB/wAAAf7+AQD/Af8AAAAAYzMFABwPAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxOwYAjUkGAQAAAAABAAAAAAAB/wAAAAAB//8BAP8AAAD//wEB//4BAf8AAQH/AAAAAAAAAP79AQH//gH//wAAAAAB/wAAAAABAAAAAAAB/wAAAv8B/wAAAAEC/wD//wEBAAAAAP//Af//AAAA/v4BAf/+AQD+/wD//v8AAAAAAAD/AAD//wH/Af//Af//AAABAAAAAAAAAAD/AAAAAAAAAP//AavU/ADI4v0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4HAQBkNAb/AAAAAAD//wEA/wH/AP4AAAH//wEA/wAA//8AAAD/Av8A//8AAAAAAP/+/wAB/v4BAP/+AQD//wAA//8BAAAB/wD/AAAA//8AAP/+AQAAAAAA/wAA/wAB/wD//wEA/wAAAAAAAAD+/wAAAQL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8B/wH//wH///8A/wAC/wD/Af8B//8B////AAD/AAAA//8AAAAAAP//AAABAQEAAAEC/wD/AAABAAAAAP//AQAAAf8B/wAAAAABAAD/AAAA//8BAP8AAAEAAAD//wAAAP8AAAAAAAAdDgEAcTsGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkMT5AAAAAv////8AAAAAAAD/AAD/AAH/AP8AAAH/AAAA/wAA////AAD/AAAB/wAAAAAC/wD/AAAB/wAAAP8AAAD/AAD//wAAAP//AQD//wAA/wAAAf7+AQD/AAD//v8AAf8AAAH/AAAAAP8A//8AAAAAAAABAAEAAf8AAAH/AAAA//8BAP8AAAH/AAAA/wAAAP//AAAAAf///gAAAf8AAAD/Af+PxfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiMwQBHA8D/wAAAv8A//8BAQEAAAD/AAAB/wAAAf8AAAD//gEBAQP/AP//AAAAAQD///8AAP//AAD/AQABAAL/AP8AAAABAf8AAAEAAf8AAAD/AAD///8AAv//AQH/AAAB/wAAAf8AAAAAAAAB//4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf//AQAAAAAB/wEAAP79AQH//wH/AAH/Af8BAAH/AAAB/wEA//7/AAD//wAA/gAAAP7+AQD/AAAAAAAAAQAAAAH+/wEA/wAAAf8AAAAAAAAB/wAAAf8AAAD/AAAA//8A////AAH+/wFwOwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACs0/sA5PD/AAH+/gEA/wEAAf//AQH/AAAB/v8BAP8AAAAAAAD/AAH/AAAB/wAAAv8A/wAAAf//AQD/AAD/AAH/AP/+AQEAAAABAAAAAP//AAD+/gH//wAAAAAAAAAAAf8AAAAAAP8AAP///wAA/wEAAf8AAAAAAv///wAAAAAAAAD/AAAAAAH/AP8AAAD/AAD/AAH/AQABAAD+/gEBAAAA/wAB/wH//wHH4v7/q9P7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBwEAjUkGAQD+/QEAAAL///7/AAD/AAD///8A////AAH/AAAA//4BAP8AAAD//wAB/wEAAQABAAAAAf8A/v4BAP//AQD+/gEA//8AAP8AAAH/AAABAAEA////AP8AAf////8AAP8AAAEAAQAA/gAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP//Af//AAH/AQABAAEAAAAB/v4BAP//AAAAAAD/AP8AAQABAAH/AQAAAAAAAAAB/wAAAAAA/wAAAP7/AAD/AAAAAAAA/wD/AAD/AAD///8AAP8AAAAAAAAB/wEAAAAC/0YlAwBVLQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL4/wCPxPoAAP8AAP///wAB/wAAAP8AAAAAAAAAAAAAAP//AAD/AAAA/wAAAf//AQD//gH///8AAP//AAAAAAAB/v8BAQABAAD/AAAA/wAAAP8AAAEAAv8AAAH/AP7/AAH//wEBAAEAAAAAAAEAAQABAAAA/wAB/wH//wEBAAAAAP8AAAAA/wAB//8BAP8AAP8AAf8B//8BAP4AAAH/AQD//v8AAP7+AQAAAAABAAEAgrz5APL4/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOR4DADkfBf8B//4BAP8AAP8AAf8AAAL/AQABAAD/AAAAAAH/AQABAAEAAQAA/wAA//8B/wH//wH/AAH/AQAAAAEAAQAB//8BAAAC/wAAAAAB/wAAAQABAAH//gEBAAL/AP8AAAD/AAD/AAH/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf8A8AH/AAABAAAAAP8AAP//AAAAAAEAAAAAAAD/AAAB/wEA//7/AAAA/wAA//8AAf7+AQD//wD/AAH/AAAAAP8A/wD//wH/AP8C/wH//wEBAAEA/wAB//8AAf8AAAAAAf/+AX9ECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ3L+gDk8P8AAAAAAAIAAQAAAQH/AP8AAAD/AAAAAAH/AAABAAD/AAAB//4B//8B////Af8BAAEAAAABAAD//wAAAAAA////AAD//wAA/wAAAQABAAD//gEA/v4BAAABAP///wD//v8AAP//AAD/AAAA//8AAAAAAAD/AAAA//8A//8B/wD/AQAB/wAAAAD/AAD/AAAA/wAAAAAAAP8AAf8BAAEAAQABAAD//wD//v8A8vgAAJ3L+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5CBgH//wH/AQEC/wH//gEB//8B//8B/wAAAAAA/v8BAP8AAAD//wAAAAAAAP7+AQD/AAAB//4BAP//AP//Af///v8AAP/+AQD/AAD//wAAAP8AAP//Av8A//4BAP//AAD//wAC///xAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD/8AD//gEA/v8BAP//AAD//wAA/wAAAP8AAAD//wAA/wAAAQAAAAD/AQD/AAL/AAABAAAAAv8B/v4BAP8BAAH/AQAB//4BAf/+AQD/AAD//wH/Af/+AQH+/wEA//8ARyYFABwPAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5PD+AJDD+wAA//8AAP8AAP//AAD//wAA/wAB//8AAf///wAA//8A/wD/AAAA/wAAAP/+AQH//gEB/wAAAP//AAAAAv8AAAH/Af8AAAD/AAAAAAH/AP//AAD/AAAAAQL/AP//AAH/AAABAAAAAP8AAAD//wAA/wEAAf7/AQD//wAA/wAAAQAAAAAAAf////8AAP8BAAEAAAAA/wAAAP//AAH//gEA//8AAAAAAP//Av8A/wAA////AJ7L+wDk8P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsXAgA4HwMAAP7+AQAAAv8A/wAAAf/+Af8AAf8A//8AAP//AAD/AAAAAAH/AQAAAP8AAf8A/wAAAAAC/wH+/gEBAAEA/wAB/wAAAAAA//8AAQAAAAAAAAAA/wEAAAABAAD/AQAAAP/wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAH/AAAAAAAAAAAA//8AAAABAAD/AAAAAAAAAP8AAAD//wAB//4BAP//AAD+/wEA/wAAAP//AAD//wAA/wEAAQABAAD//wAB//4BAP8BAAEAAAAA/wAANx4DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj8P6AAD//wAA/wAAAAAAAAAA/wAC//8BAf7+AQH+/gEB/v4BAQAAAQAAAAAA/wAAAf8AAAD/AAD///8AAP8AAP//AAAA/v8BAAABAAAAAv8A/v4BAAABAAD/AAAB/v4BAP8AAAD/AAAAAAL/AP8AAAD/AAAA//8AAAAB/wAAAv8A/wAAAP7+AQD+/gEA/wAAAP//AAD+/wEA//8AAP8AAAD/AAAA/wAAAP8AAAH//gEB//4BAQAC//L3/gBztPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHJAIBAAAAAAD+/gEA//8AAP8AAAH+/gEA/wAAAP8AAAD/AAAA/v4BAAAC/wH+/gEA/wAAAP7+AQAAAAAA//8AAf8AAAD+/wAA/wAA//7/AAD/AAAA//8AAP//AAAA/wAA/wL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAP8AAv8B//4B//8C/wAAAv8AAAAAAP8B/wAAAAAA/wH/AP8AAAAAAAAA/gAAAQABAAAAAf8AAAAAAAAAAAAAAAAAAP8A//7/AAD/AAD/AAH/AP//AP/+/wAAAAAADgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADI4f0ArNH7AAD/AAAAAAEAAf8AAAD/AAD//v8AAAAAAAAAAv8AAAAAAP//AP//Af8A/wAAAAAAAAAAAAAA/wAAAP8AAAH/AAAAAP8AAP//AP//AAAA/wAAAP7/AAAAAv8AAAL/AAAAAAAAAv8A//4BAAAAAAAAAAABAAEAAP7+AQD//gEA/wAAAAAC/wEAAQAAAAAAAP8AAAAAAf8BAAEAAAABAAD/AAAA/wAAAP//AAAAAAAA/wAAAP/+AQAAAADI4f4Ax+H9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCAEAAP8C/7k9CYAAACAASURBVAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP7+AQAAAQAA/wAAAAAAAAAAAAAAAAAAAP8AAAEAAQAAAAEAAAAAAAH//gEAAAAAAP8AAAD/AAAA//4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8C8AH//gEB/wAAAf/+AQH+/wEA/wAAAP/+AQD/AAAA//4BAQAAAAH/AAABAAEA////AAD//gEA/wAAAP8AAAD/AAAA/wH/AAAAAAAAAAAA/wAAAAAC/wAAAAAA/wAA1+r+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzsvgAAAAAAAAAAAAA//8A////AAD/AAAAAAAAAP8AAAEA/wEA/wAAAP8C/wH//gEBAAAAAf8AAAD/Av8AAAL/AQABAAD//gEB/wEAAP8AAAH/AAAAAAAAAAAAAAD//gEA/wAAAP8AAAEA/wEA/wAAAP8AAAD/AAD//v8AAAAAAAD/AAAAAAL/AP/+Af///wD//wH/AAAAAAH//wH+/wD/AP//AAAAAf8BAAEAAP8AAAD/AAAAAAL/AAAC/wAAAv8A//8Ag7r4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV6P0AAP/+AQAAAAAB/wAAAP8AAAD/AAAAAAAAAP8C/wD+AAAAAAL/AAAAAAH/AAAAAAAAAf8BAAD/AAAA/wAAAAAAAP///wAA//8AAP8AAAD/AAAA/wAAAAAAAAD/AAD+AAHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v//8AD/AAD//wAAAP8AAAD//wAA/wAAAAAB/wD/AAAB/wAA//8AAAAAAQD/AAH/Af8AAAAAAv8A/wAAAP8AAAAAAv8A//8BAP8AAAD/AAAB/wAAAP/+AQH/AAAA/wAAudj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzR+wDl8f8AAAAC/wD/AAAAAAH/AP8AAAAAAv8B/wAAAAAC/wD+/wAA/wAAAP/+AQD/AAD//wAA/wAC/wAA/wAA//4B////AAD/AAAA//8AAP8AAAD//gEA/wAAAQAAAAAAAv8A//4BAP8AAP/+/wAAAAL/AP8AAAH/AAAAAAAAAf8BAAD/AAAAAAAAAf8AAAD/AAAB//8BAP8AAAD//wAB//8BAP8AAAEA/wH/AAH/AP8AAAD/AAAA//4BAP7+AQD+/gEAAAL/1ej+AJ/L/P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC62f0AAf8AAAD/AAD/AAL/AAAB/wD/AAAA/wAAAf/+AQEAAAAB/v4BAP8AAP///wAA/wAA////AAEAAAAB/wAAAP7+AQAAAv8A/wAAAP8AAAEAAQAB/wAAAAAC/wH/AQADAAEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf//4QEAAAAAAAH/AAAC//8AAv8A/wAAAf//AQD/AAAAAAEAAQABAP//Af8A//4BAP8AAAD+/gEB/wAAAf8AAAD+/gEA/wAAAP8AAAAAAf8AAP8BAQAAAP8AAf8BAAEA5O/+AI/B+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5PD+AI/B+QD//v8AAf/+AQAAAAAA/v8BAQABAAD+/gH//wAAAP8AAP//AAABAAAAAQAAAAAAAAABAAAAAP7+AQH+/wEBAAAAAP8AAAD/AAAAAAAAAQAAAAD/AAAA/wAAAP8AAAD+/gEAAAAAAP8AAAEAAAAA/v4BAQAAAP//AAAB/wAA////AAAAAf8B//4BAAABAAD/AAAB/wAAAP8AAP8AAf8AAAH/AAAAAP/+AAAA/v4BAP8AAAD/AAAAAAAAAAAC/wD/AAAA//8AAP8AAI6/+AHk8P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJDC+QDk8AD//wAC/wD/AAAA/v4BAP7/AQAAAv8AAAAA//8AAAAAAAD//wAAAQAAAAAAAf8BAAEAAP8AAP/+AAD/AAL/AAAB/wD+/gEBAAAAAQAAAP/+/wD//wAAAP8AAP8AAP8A///wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A////AAAA/v8BAP8AAAH//gEBAAAA//8AAAAAAAD///8AAP//AAD+/gEA/gAA//8AAAAAAf8AAAAA////AAEAAAABAAAAAP8AAAD/AAAA/wL///8AAAD/AAD//wD/AQAAAJHB+gCQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAADW6P4AWKL3AOTw/wAA/wAA//8AAAH/AAAA/wAAAP//AAEAAAABAAEAAP//AAEAAAAA/wAA/wAC/wD/Av8A/wAAAQAAAAAAAAAA/wAAAAAAAAEAAAD//wAA//4AAAAAAf8AAAAA//4AAAEAAAAA/wAAAAAB///+AAAA/wAA//4AAAAAAv8AAAAAAAAB/wD/AAAA/wAA//8A/wAAAf8AAAL/AQAAAAH//wEAAAEAAP8AAAEAAAABAAAAAQAAAAD/AAAA/gAAAP//AAEAAAAB//8BAQAAAPL3/gBYovYA5PD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAkML6AI/A+/8A/wAAAP8AAAEAAAAAAQL/AQAAAAH//gEB/wAAAQAAAAD/AAAAAAAA/wAC/wH//wEA//8AAAAAAAEAAQAA/v0BAP7/AQAAAv8A/wAAAP8AAAEAAAABAAAAAf/+AQD//wH+/gDhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAgH/4f7/AAAAAAEAAf/+AQAAAAD/AQH/AP//AQEAAAD/AP8AAAABAAAA/wABAAEAAAAAAAD//wEAAQL/AQD+AQD/AAAAAAAAAQAAAAD//wEAAP8A/wAAAAEAAAEAAP8A/wAAAAEAAACPwfv/rND7AUUoAwArFwMA8vgAALnZ+wDI4P0AAQAAAAEAAAD/AQH/Af//Af8AAAABAAAA/wAB/wH//wH/AQH/Af/+Af8AAAAAAAAAAP/+AQABAf8A/wAA/wEB/wD//wEAAQH/AP//Af8A/wABAAEA/wEC/wH//gH/AQH/AQD/Af//AAABAAAAAAD/AQAAAAAAAQL////+AQH//gH/AP8AAQAAAf8BAf//AAL/AP/+AQEAAAD/AP8AAQAAAAAAAAAAAP8AAf8AAP8AAAABAAAA/wAAAAEAAQD/AQD/AAABAP8AAf8B//4BAAAAAAEAAQDj8P//O5L2AEYoBAA5HgIBDggBANbp/gCs0PsA8fj/AAABAgAA//4BAQAAAAAAAAAB//4B/wEC/wEAAAAA//4B/wEC/wD//gEAAQH/Af7+AQAAAAAAAAAAAQAAAP8BAP8AAQIAAP//AQEAAAD/AAL/Af/+AQAAAAD/AQH/AAAAAAD//wEAAQLvAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/f8D4AIA/gD//wAA/wIB/wD+/gEBAAAB////AP8CAv8B/wABAAAAAAAAAAAAAAAAAAAAAP///wABAP4B/wEB/wD+/gEBAAEAAAEAAP///wABAAEAAAIB//8AAAAB/wABAf8AAAABAAAB//4B4/EB/5/I+wEAAPsAAP8AAAABAAABAQL/AP/+AQAAAAAB/v8B/wIB/wH+/wH/Af8AAf8AAQAAAAAB//4BAAAAAAEAAAD///8AAQEBAAH/AAH+//8AAQAAAQAAAAAA//8BAAAAAAD/AQD/AP8AAQD+AQD/AAABAQEA///+AAEBAQD/AQH/AP7+AQACAv8BAAAAAf8AAAAAAAABAQEAAAAAAAD+/gEBAQEAAP8AAP8A/wABAAEA/wD/AAECA/8B/v4B/wD/AAEBAQAA/wAAAAD/AAABAAAB/wAB/wEA/wH//wEAAQL/AP/+Af8BAf8AAAAAAf//AbrW+gC71wEAAAAAAAD/AAAAAQAAAQAAAAAAAAD/AP8AAAABAP8BAf8B//8BAf/+AQD/AAAAAQAAAAD/AAD//wAB/wAB/wD/AAEAAQAAAAAA/wIB/wL/AAH+AQD/AQAAAP8A/wAB//8BAAAAAAAAAAAAAAAAAf/+AQAAAQABAP3QAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAACAX70Pr6AwAA/wH/Af0AAAABAQAA/gH/AAD/AQEAAQAA//8AAAAAAAD/AAAAAQAAAAD/AAEAAQAA/gH/AQH/AQAAAQAA/wL/AP//AAEAAAEAAQAAAf7/AQAAAAAA//8AAAEBAAD/AAAAAAAAAP4AAP8AAf8BAf4BAP8BAP//Af8BAf4B//8B/wEAAAAAAP4BAP3/AQAAAAABAAEAAAAAAAD/Af8AAP8B/wAB/wAAAAABAAEA///+AQADAv8B/wEBAP8AAP//Af8BAf8BAAAAAAD/AAAAAAL/AAD/AQAAAAD//f8AAQABAP//Af8BAf8B//8C/wH9/wEAAf8AAP8AAAAA/wAAAAEAAAIC/wH+/gEA//8A/wAAAAEBAQAAAAAAAQABAAD+/gEAAAAAAQABAAD/AAAAAAAAAP8C/wAA/wEAAAAAAf7+AQAAAQAAAP8AAAD/AAEBAAEAAAAA////AAAAAv8AAP8BAAAAAP//Af8BAP8BAP//AP8A/wAAAAL/AAABAAEB/gEAAAAAAAAAAAAAAAAAAQH/Af3+AQADA/8A/f0BAQEBAAD//wAAAAAAAf4AAf7/Af8BAP8B/wAB/wAAAAAAAQAAAAAAAP///wABAQABAQABAP8AAAAEAwHxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACwoA4AD//wABAP8BAAD/AQD/AAAAAP8BAQABAP/8/wAA/wAAAP8AAAEAAQAA//8AAP8AAAD/AAD//wAAAP8AAAD/AAAAAP4BAAABAAAAAAAA/wAA//4B/wD/AAAAAAEAAP8AAAD//wAA/v8AAQD/AQH//gEB/wEAAAD/AAEA/wEA//8AAf/+AQAA/wEAAAEAAQABAAAAAQAA/wAA//4B/wAA/wEAAAAAAQD/AQD/AAAAAP8BAQABAAD9/gEA//8AAf8AAAEA/wEA/wH/AP7/AAAA/wABAP8BAP8AAAD/Av8BAP4BAAAAAAEA/wEA/v8AAQAAAAAA/wABAAAAAAAAAAAAAQAA/wAAAP39AQAAAAD//wL/AQAC/wD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD/AAAA/wAAAQD+AQD/AAAA/wAAAAABAAAAAAAAAP4BAAAC/wD/AAAA/wAAAQAC/wEA/gEA/v8AAP7/AAEA/wEA/wAAAAABAAH//gEBAP8B////AAD/Af///gH/AP8AAAD+/wAA/f4B//8C/wD9/gEAAAAAAP//AAAAA/8BAAEAAP8AAAEA/gEAAP8AAQD+AQH/AAAA//8AAP//AAIAAQAA//8A/v4B/wD/AAAM/fzQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAACB+8d///wAg//8C/wEB/gEAAAL/AQH/Af///wAAAAAAAAABAAAA/wAAAAEAAAAB/wEB/wH+/wH/AQD/AQAAAAAAAP8AAAABAAAAAAAAAP8A/wAC/wEA/gEAAAAAAAABAP//Af8AAQAAAQABAAAA/QH//wL/AQH+AQAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/wAA/wEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAQEAAP///wAAAAEAAAAAAAAAAAAAAAAAAAAB//8AAAABAP4BAAAAAAAAAAAAAAEAAAAAAAAA/wD/AAL/AQD/AQAA/wAAAAEAAAD/AAAAAQD/AAH/AP8AAAEB/wH/AAH/AQD/AQAA/wD/AAL/AQD+AQAAAv8AAP4BAAAAAAAAAv8AAP4BAAAAAAAAAv8AAAAAAAD+AQAAAQAAAP8AAAAAAAAAAAABAQEA//8B/wAA/wEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAB/wAA/wEAAAH/AAD/AQAAAf8AAP8BAAAAAAAAAAAAAP8AAAABAAEBAAD//wAAAAAAAAH//9DghA8xAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP4A/rEAAAEAAQAAAAD/AAAAAP4B//7/AAD/Av8A/wAAAQAAAAEAAQAA//8AAP/+Af/+/wAB//4BAP//AAD/Af8A/wL/AP//AP//Af///wL/Af/+AQEAAQAA/wL/AP8B/wEB/wEB/wAAAQD+AQEAAQABAAAAAP8AAAEAAQAAAAAAAP8C/wD/AAAAAAEAAP8AAAD/AAAA/wL///8AAAEAAAAA/wEAAQABAAD/Av8A/wL/AAABAAD/AQAAAAAAAQABAAD//wAA/wAAAP8AAAAAAAABAAAA//7/AAD/AAAA//8AAP//AAD//wAA/wAAAP/+AQH//gEAAAAAAP8AAP//Av8A//8AAAD/AAD/AAAB/wAAAP//AAD/AAAA/wH/AAABAAEAAAAB//4BAAAAAAD//wABAP4BAP8B/wEAAQACAP8BAP8BAAD/AAABAAEAAP8AAAD//gEA/wEAAP8AAAD//gH//wAAAP8AAAD//wAA/wAAAAABAAD/Av///wAAAP/+AQD/Af8A/wAAAP8AAAAAAQAA/wL/AP8BAAAAAAAA//8AAP/+AQD//wAA/wAAAAAAAAD//gEA//8AAP8AAAD//wAAAAEAAP8AAAD/AAAAAAAAAP8B//4BAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAL/CK8A/v8AAAD+AQAAAAAA/wAAAAAC/wEA/wEA/wAA////AP//AAAA/wAAAQABAAD/AAAA/wL/AP8C/wD//gEBAP8BAAAAAAH//gEB//4BAP8AAP/+Af8AAP8BAQD/AQD+/wAAAP4B////AP///wAAAP4BAQABAP///wAA//8AAP/+AQEAAQAA/v8AAP8AAAAAAAAA//4BAQD+Af/+/wABAAAA////AP//AAAA//4BAP4B/wD/Af///gD///8AAAAAAAAA/wH/AAD/AAH/AQD//v8AAP8C/wD/AAAAAAAAAAAAAAD/Av///wH/AP8AAAD/AAAA/gL/AAAAAAEA/gEAAAAAAP4C/wAAAAAA//4BAAAAAAAAAAAA/wAAAP4B/////wABAAEAAQAAAAEAAQAA/gAAAAD+AQD/AAD///8AAAD/AAAA/gH//gH/AQABAAD/AAAAAAH/AP8C/wAAAAACAP8BAP8AAP//Av8AAAL/AP//AAAA/gH//gH/AAAAAAD/AAAA/wAAAP8C/wH/AAAA//4BAAD/AAD//wAA/wL/AP8AAAAAAAAAAP4BAP4B/wAAAAAAAAAAAAD/AAAAAQAA/gH/AQAAAP///wAB/wAAAP8AAAIBALAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAABAS+NEBAgDwAP8AAAD+Av8A/wAAAP/+Af/+Af8AAAAAAP8AAAH/AAABAAEA////AAAAAAAAAP4BAAD+AQD/Av///v8AAP8AAAEAAAAAAAAAAAAAAAAA/gEA//8A////AAAAAAAA/wAAAP8AAAD/Av8A/wAA/v4A/wH/AQAA/wAAAAAC/////wAAAAAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAIA/wEAAAAAAAD+AQAA/gEBAP8BAf8AAAD/AAAAAP4BAf8BAP///wAA/wL/AP8AAAAAAAAB/wEAAP8C/wEA/wEBAP4BAAAAAAEAAQAAAP4BAP8AAAD+Av8A/wAAAAD+AQD+Av8A/wL/AP8AAAD/AAAAAP4BAAD+AQD+AAD///8AAf/+Af///wAAAAAAAP8AAP///wAA/gAAAP8AAAH/AQAAAP4BAP8AAAAAAAAB//8BAAD+AQEAAQD//v8AAAAAAAEA/gEB//8BAP8AAAH/AQABAP4BAQABAAD//gEAAAAAAAD+Af///wAAAAAAAP8AAAH/AAAAAP4BAAAAAAD/AAAA/wL/AAD+AQD/AAAA/wAAAP8AAAD/Af8AAAAA////AAD/AAAA/wAAAQD+4eCCDrEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAANBxEfAA/QKQAP8C/wAA/gEB/wAAAQABAAAA/gEA/wL/AP8AAP///wD///8AAP8AAAD/AAAB/wEAAP4C/wEA/gEBAAAAAP8B/wD/AAAA/wAAAP8C/wD/Af8A/wAAAP8C/wH/AAAA/wAAAP8AAAD//gEA/wAAAQD/AQD//wAA/wL/AP/+AQD/AAAA/wAAAAAC/wD/AAAA/wAAAP8AAAH/AAAAAAAAAP8AAP///wAA/wAAAP8C/wD/AAAA/wAA////AAD/Av8A/wAA////AAD/AAAAAP4BAP8AAAD/AAD///8AAP/+Af///wAA/wAAAP8B////Af8A/wAAAP8AAAAA/gEA/wAAAP8AAAEB/wEAAP4BAP8AAAD/AAAA/wL/Af8BAAEAAQAA/wAAAAAAAAH/AAAB/wAAAf8AAAD/AAABAAAAAf8AAAD//wAB/wAA////AAEAAAD//gD/AP8AAP/+/wAAAAAAAP8AAAD/AAD///8AAP8B/wD//wAB/wEA//4B/wEBAQAA/wL/AP8AAAD/AAAA/wAAAP8AAP//AAAA/wAAAP8AAAD/AAAA//4BAQAAAAH/AAAA/wAAAP8AAAD//gEA//4BAP8AAAH/AAD///8AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/vyhAf/+AQEAAAD//wAAAP8AAAD/AAAA/wAAAQAAAAH/AAABAAAAAQABAAEAAAD/AP8AAAD/AAAAAAAAAAAAAQD/Af//Af8BAAAAAQD+AQD/AQAA/wL/Af/+Af//Av8A/wAAAP8AAAD/AAAA/wL/AP8AAAD/AAAA//4BAQAAAAD/Av8BAAAAAf/+AQEAAQABAAAAAP8B/wAAAAAA/wAAAQABAAD/AAAA/wL/AQD/AQAAAAAA/wL/AQABAAEA/gEAAAAAAP8C/wD/Af8AAAAAAAD+AQEAAQAB/wAAAP8B/wEAAQAA/wAAAf//AQD//wABAAEAAQABAAD/Av8BAAAAAAAC///+/wAA/wAAAf8AAAD/Av8A//4BAP//AP//AP8A/wAAAP4AAP//Af///wAA//8B/wEAAAAA/wAA//8AAP//Av///wL/AQAAAAD/AAAAAf8BAP8AAAD/AAAA/wH/AP8C/wD/AAAA/wAAAAD/AQAAAAD//wH/AP/+Af/+/wAA//4BAf8AAAH/AAAB/wAAAQAAAAH/AAAA/wL/AP8AAAD/AAAA/wAAAP8AAP//AAABAAAAAP8C/wD/AAAA/wL/Af8AAAAAAAAB/wAACP39gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYiBHgAv8AgQD+AAABAAAA//4A/wEAAAAA//4BAP8AAAAAAv8A/wAAAP8AAAD/AAAB/wAAAP8AAP//AAAA/wAAAP8AAAEA/wH//wAA//4AAAD/AAABAP4BAAAAAAEA/gEBAAAAAAAAAAEAAAAAAP4BAAAC//8AAAABAAL///8AAAEA/gEA/wAAAAAAAAD//wD//gAAAQD/AQD/AAD///8AAP8B/wEAAAABAP4BAP//AAH/AAAA/wAA////AAD/AAAA/gH/AP/+AQEA/wEB/wAAAQAAAAD//wAA/wAAAQD/AQD//wABAAAA//8C/wD//wEA/v8A////AAD/AAD//wAAAf/+AQD/Af8BAAAAAAAAAAD//wAA/wL/AAAAAAEA/wEBAAAAAAAAAAEA/wEA/wAAAQD/Af/+Af8AAAAAAAAAAAEA/gEBAP4BAP8AAP/+Av8B/wAAAP8B/wEAAAABAP8BAP//AAD/Af8A/wL/AP4AAP//AAAAAP4BAP8B/wD/AAABAAAA//8AAP//Av///wH///8AAP//AAABAP4BAQAAAAEAAAABAAL/AP8AAAD/AAAA/wAAAQD+AQEAAAAB//4B//8B///+AAAA/wGg2IgR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhf+kP8AAO8A/wAAAQABAAD/AAABAAAAAP8AAP//AAAA/wAA////AAD/AAAA/wAAAQD/AQH/AAAA/wAAAP8AAAD/AAAB/wAAAQAAAAEA/gEA/wAA//4AAAD/AAAA/wAAAf8AAP//AAAB/wL/Af/+AQD+Af8A//4BAP8AAAD/AAAA/wAAAP8AAAD/AAABAAAAAP8AAAD/AAAA/wH/AP/+AQD/AAD//wH/AP8AAAD/AAAA//8AAf8AAAD/AAABAP8BAQAC////AAD//gH/AP8AAP//Av8AAAAA//8AAAD/AAAA/wAAAQD+AQEAAAD/AAAAAf8AAAAA/gEB/wAAAP8AAAEA/wH//wAA//4B/wEA/wEBAP4B//4B/wD/AAAA/wAA//8B///+Af8BAAAAAP8AAAEA/wEA/wAAAf8AAAD/AAD//wH///8AAAD//wAA/wAAAQD/AQD/AAD//wAAAP8AAAEA/wEAAP4BAqVEygAAIABJREFUAQAAAAH/AAAB/wAAAQD/AQAAAAD//gH/AQAAAAAA/gEA//8BAP8C/wEAAAD//gH/AP8AAAD/AAAA//4BAP8AAAEAAAAA/wEAAP8AAP//Av//AAAAAAD/AQEAAOAIAP2BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0HER8AQB/mIA/wL/AP/+AQD/AAAA/wAAAP8C/wH//gEA/wAAAP//AP//Af8A/wAAAP8AAAD/AAD///8A//8B/wD/AAAA/wAA//4B/wD/AAAA/wAAAAD/AAD/Av8AAAAA//8B/wIAAQAA//4B//8B/wEA/wEA/wAAAf8AAP//Af8A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAEAAQAA/wAAAQABAAAAAAABAAEA////AAAAAAAAAAAA///9AQH/AAACAQABAAAAAAH//gEA/wL/AP8B/wAAAAAA//8AAP8AAAD/AAAA/gH/AP8AAAH/AAD//wAA//8B/wD/AAAA/wH/AAAAAAAAAAAA/wAAAAAAAAD/Av8A/wAAAf//AQEA/wEA/wAAAP8AAAAAAAAA/wAAAP8AAAD//wAA/wAAAf8AAAEB/wEA/wAA////AAD/AAAB/wAAAQD/AQD/AAAB/wAAAAAAAAD/AAAAAAAA//8B/wH/Av8AAAAAAAAAAAH/Av8BAQAAAQD+Af///wABAf8BAP8AAAD/AAD//wL/AP8AAAD/AAAA//8AAAABAAH//gEB/wAAAP8B/wADA4DYiBHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgd/OPAAD+cAD//wAAAAEAAAAAAAABAAAAAAAAAP//AAABAQAAAAAAAAAAAP//Af8BAf8BAP//AAABAQAA/wL/AAH+AQAAAAD///8AAgECAP///wAAAAAAAAEAAP/+Af8BAv8BAP8AAAAAAf8AAP4BAAAAAAAAAQAAAQAAAP8AAP8AAf8BAf8BAP8AAAABAAAA//8AAAAD//8A/wABAP8BAAAAAAAAAAAAAP8AAAAD/wAA/gEAAAAAAAEAAP//Af8BAP4BAAAAAAAAAQAAAAL/AAH+Af//Af8BAP8BAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD//wAAAAEA/wAB/wEAAQAAAP0BAAEBAAD/AAAAAQAAAP8C//8A/wABAf8BAP8AAAAAAAAAAP8AAAEBAAD//wD/AAL/AQD/AQABAAAA/wAAAAAAAP8AAf8AAAAAAAAAAAAAAAAAAAAAAQH/AQAAAAAAAAAAAAAAAAD/Af8AAP8BAAAAAAABAAAA/wL/AAD+AQABAAAAAAAAAP8AAP8AAf8BAf8BAAAAAAAAAAAAAAAA//8B/wAAAAABAP8BAAECkOCJDXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHXwzwAAATABAQAA////AAAAAQAAAf8AAAAAAAAAAQAAAAAAAP//AAABAQAAAAAAAP//AAAAAAAAAQEAAAAAAAD//wAAAAL/AAAAAAAB/gEA/wEAAAAB/wAB/wEAAP8AAQABAP8A/wAA/wAAAAEBAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAEAAAAAAAAA/wD/AAAAAQAAAAAAAAAAAAD//wAAAQEAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAL/AAH+AQAAA/8A//0BAAEBAP//Af8BAf4BAP8C/wABAQAAAP4BAAAAAAEAAAD///8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAP8AAP8C/wAB/wEA//8AAAEBAAAAAAAAAP8AAQABAP8AAAAAAAAAAAAC/wD//wAAAf8B//8B/wEB/wEAAAAAAP//AAABAQABAAAA/wAAAAEAAAD/AAAAAAAAAAD//wAAAQEAAAAB/wAA/wEAAAAAAAAAAAEAAAD/AAH/AP/+AQABAQAA//8AAAEBAAAAAAD//wH/AgH/Af7/Af8BAf/R4IoPMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAv/QQAB/+D//gH/AAAD/wD//wAA/wAAAP8AAAD/AAAA//8AAQEBAAD/Af8A/wAAAAABAAAAAQAA/wH/AP8AAAAAAQAAAP4BAAD/AQD/AAAAAAAAAAD/AQD//wAA/wL//v4B/wD/AAAAAAEA//8B/wD//wAA/wH/AP4B/wD//wAAAAAAAP//AP///wD//wL/AP8BAAD/AAD//gH/AP8B/wEAAQAA//8A//8A/wD/AAAB/wAAAP8AAAD/AAAA/wAAAP8AAP//Av8AAP8BAf8BAAD//gEAAAAAAP//AAEA/gEA/wL/AAD/AQD//gEA/wAAAP7/AP//AAAAAAP/AAAAAAD//wAA//8AAP8AAAD/Af8BAAEAAQD/AQD/Af8AAAEAAP8AAAD//wAA/wAA//8AAAD/AAAA//8AAP/+AQAAAAAA//8AAQD/AQD/AAAA//8A//8C/wD//wD//wAAAP4B////AAAA/wAAAP4B/wD/Av8AAAAAAP//AQD/AAAA//8AAP8AAP//Af8A//4BAAAC/wD//wAAAAL/AP//AAD+/wABAP8B//8B/wEC/uEIAv5RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACh47yD4/gG/AP4CHwAA/gEBAQEA//8AAAAA/wABAQEA////AAAAAAABAQEAAP8AAAAAAAD/AAL/AAD9AQAAAQAAAAH/AAD+AQAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP8AAAAAAAAAAAH/AAD+AQEAAQD/AAAAAAAB/wEB/wH///8AAAABAAAA/wAAAAEAAQEAAP7/Af8BAP4BAAAAAAAAAAAAAAEAAAAB/wAA/gEAAAAAAQABAP8A/wAAAAL/AAD+AQEBAQD//wAAAAEAAAD/AAAAAAH/AQH/Af///wAAAAL/AAD+AQAAAAAAAAEAAAD/AAAAAQD/AAH/AQD+AQAAAAAAAAAAAQEBAAAAAAD///8AAAABAAAA/wAAAAL/AAD/AQAAAAAAAAH/AAD+AQAAAQAAAP8AAAAAAAEBAQD///8AAAAAAAAAAQAAAAH/AQH/Af7/Af8BAP8BAAD/AAAAAAAAAAEAAQEAAP///wAAAAAAAAABAAEBAAD//wAAAAL/4AgC/0HYiBHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiIEeAIAv9BAAD+0QAAAQD//gH/AQAAAAAAAAD//gH/AQABAAD/Av////8A/wAAAP///wAAAP4BAQABAAAAAAAA/wAAAQABAAD//wABAAAAAAAC/wD/AAAAAAL/AP8AAAD+/wAA/wAAAP8AAAAAAQAA/wAAAP8AAAEAAQAA/v8AAP//AAEAAAAA/wAAAQABAP///wAA//8AAP/+Af/+/wAA/wAAAP//AAD/AAAA//8AAP8AAAEAAAABAAEAAP8AAAAAAQABAAAAAP/+AQD/AAAAAAEAAAAAAAD/Av8A/wAAAP8AAP///wAA//8AAP7/AAEAAAAAAP8BAP8AAAD/Av8AAP8BAP8AAAAAAQAA//8AAP8AAAD//wAB/wAAAQABAAD/Av8A/wAA//7/AP/+Af8A/wAAAAAB/wEAAQAAAP4BAP8B/wD//wAA//4BAP8AAAD/Af8A/wAAAP8BAP/+/wAA/wAAAP8C/wEAAAAA//4BAP8AAAEA/gEA//8AAP8AAAEAAQAA//8A////AAEAAQAAAAEAAAAAAP/+/wAAAf/QEAr/MdiIEeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJz75D+AAFvAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAP8C/wEB/gH/AAAAAP8AAAAAAv8AAf4BAQABAP//Af8AAf4BAQABAP8A/wABAAEA/wD/AAD/Av8AAf4BAQABAAAAAAD//wH/AAEAAAAA/gEAAAAAAAAAAAD/Af8AAAEAAQH/AQAAAAD/AP8AAAAC/wD/AAABAf8BAAAAAAAAAAAAAAAA////AAEBAQAAAAAA/wD/AAEAAAD/AAAAAP8AAAABAAAAAAAAAAAAAAAAAAABAAEA////AAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/Av8AAf4BAAAAAAAAAv8AAP4BAQABAP8A/wAA/wL/AAH+AQAAAAAAAAL/AQD/AQAAAAAAAAAA//8B/wEB/wH/AP8AAAAAAAEAAQD/AP8AAAAAAAD/Av8AAf4BAAAAAAAAAAABAAEA//8B/wEB/wH/AP8AAP8C/wAB/gEAAAAAAQABAP//Af8BAf4BAAAAAP8AAAAAAAAAAQAAAP8DA5Dgig1xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjcu9g/QABfwAAACAAAAAAAQAAAP8AAv8AAAAAAAD+AQEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAEA//8B/wEB/gEAAAAAAAAAAAAAAAAAAAEA/wAB/wAA/gEAAAAAAQABAP8A/wAA/wL/AQH+Af8AAAABAAAAAAAAAAABAQAA//8A/wAAAAAAAAABAAAA/wAC/wD//wAAAf8BAQABAAAAAf//AP4BAAAAAAAAAAAAAAAAAAAAAAAAAv8AAP4BAP8C/wAA/wAAAf8BAAAC/wAAAAAA//4BAAEAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAv8AAAAAAAD+AQAAAAAAAAL/AAD+AQAAAAABAAAA/wAAAAAAAAAA/wAAAQEAAP//Av8AAQAAAAD+AQAAAv8A/wAAAQH+AQAAAQD/AAH/AP8AAAABAAAAAP4BAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQABAP8A/wAAAAL/AAD+AQEAAQD/AP/wAwT/Yd2KEbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKHjvIPn5AIAAAAFfAAAAAP8AAAABAAAA/wAC/wAA/gEBAAAAAAAAAP8AAAABAQAA//8AAAAAAAABAAAA/wAAAAEBAAAA/wL//wAAAAAA/gEAAAH/AQD/Af8AAAAAAAL/AAD+AQEAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAABAAD//wL/AQH+AQD/AAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAQEA////AAAAAAAAAAH/AQH/AQD/AAAAAAAAAAEBAAD//wD/AAAAAQEBAP///wABAQAA//8C/wAA/gEAAAAAAAAC/wAAAAAAAP4BAAAAAAEAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAQAA//8AAAAAAAABAAAA/wAAAAEAAAAAAQEA////AAEBAQD///8AAQEBAP///wAAAAAAAQAAAAAAAAAAAAAAAAABAAAA/wAAAQEA////AAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAEB/4EODgCQ0IAR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoeO8g+fkAgAAAAT///wIfAQH+AQAAAAAA/wAAAAEAAP//AAAAAAL/AQH+AQAAAAD//wL/AQH+AQD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAP//Av8AAP4BAQEAAAAAAv8AAP4B//8AAAAAAAAAAAL/AQH+AQD/AAD/AAAAAQEAAP//AAAAAAAAAAEAAAD/AAAAAAH/AQABAP8A/gEBAQAA//8AAAEAAAD/AAH/AQH/AQAAAAAA/wAAAAAAAP8AAAAAAAH/AAD/AQEBAAAAAAL/AAD+Af//AAABAQAAAAABAP///wABAQAAAAAAAP//Av8BAf4BAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAA//8AAAEBAAAA/wAAAAEAAAAAAAD//wAAAQEAAP//Af8BAP8B/wAAAAABAAAA/wAAAQEAAAAAAQAAAP8AAAAAAAAAAAD//wL/AAD+AQAAAv8AAP4BAQEAAAAAAPABAf+RBgYAoNiIEeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjc+9Q/v4AUAD/AS8AAAAw//8B/wEB/wEAAAAA/wAC/wD//wABAf8B/wAC/wEA/gEAAAAA/wAAAAAAAv8BAP4BAAAAAP//AAABAQAA/wAC/wEA/gEAAAAAAAAAAAEAAQD+AAD/AQD/AQAAAQAAAP8AAAAAAAAAAv8AAf8BAP//AAAAAv8BAP8B/wD/AAAAAAD/AAL/AQD+Af8AAAABAAAAAAABAAAA/wD//wH/AQH/AQAAAAAAAAAA//8B/wEB/wEBAAEA/wAB/wAA/gEAAAL////+AQEBAAAAAAAA//8B/wEB/wEAAAAA//8B/wAB/wEBAAAA//8AAAEBAAD//wH/AQH/AQAAAAAAAAAA/wAC/wEA/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wL/AAH+AQEAAAAAAAAAAAAAAP8AAv8BAP4BAAAAAP8AAOADAf+xAQMAsAwMANDQgBHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwgO8Q9PQAMP//ABD//wAw/v4EDwIA/SD+AAAQAAAAAAEAACD/AAAAAQAAAAAAABAA/wIPAAD+AQAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAv8AAP4BAAAAAP8AAf8BAP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAD//gH/AQH/AQAAAAAAAAAAAAAAAAAAAAAAAQAA//8B/wEA/wEAAAAAAAAAAAAAAv8AAP4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA//8B/wEA/wEAAAAAAAAAAAAAAAAAAAAAAAAC/wAB/vH/AADwAQAAAAAAAAD/AADwAAAA8AAAAeAAAAEABAL94f8AAOADBQXPCgn74dCAEfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5nRWwAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//M7OxajFn7UgAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Calendar.png b/arma/client/addons/phone/ui/_site/images/light/Calendar.png new file mode 100644 index 0000000..ccf74df Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Calendar.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Calendar.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Calendar.png.b64 new file mode 100644 index 0000000..34b68ff --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Calendar.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxETNly5ML8AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAACAAAAAwAAAAIAAAAB8AAAAAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA8AAAAAAAAAAAAAAA4AAAAAAAAADwAAAA4QAAAPAAAADQAAAA8AAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAAFAAAABPAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAA0AAAALEBAQGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAF8AAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAwAAAAIEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAABvAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////UAAAAJ8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAIABAQGhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+PAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQEBcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAL8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAvwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///88AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AEBATEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////jwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMP///48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRAQEBsAAAAAAAzm5irgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAN8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPT0AADz8wAAAAAAAAAAAAANDQAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5+cAAAAAAAAAAAAAAAAAABkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PQAANvbAADo6AAAAAAAAAwMAAAlJQAAGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD09AAA8/MAAAAAAAANDQAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfnAAAAAAAAAAAAAA0NAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6qqAACfngAAAAAAAAAAAAAxMQABkpMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+3tgAAhoYAAAAAAAAAAAAAGBgAAausAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjoAP+qqQAAt7cAAPT0AAAAAAAAAAAAAAAAAAAAAAAAJSUAAFVVAAFJSgAAAAAAAAAAAAAAAAAAAAAAAAAAAP+qqgAAn54AAAAAAAAYGAABn6AAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAA/1ZVAAAAAAAAAAAAAGFiAAFiYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPzwAA9PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NwA/2FgAACrqwAA9PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA29sAAIaGAP+fngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6AD/kpEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG////8QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjoAADPzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6AD/bWwAAPT0AAAAAAAAAAAAAAwNAABVVQAAYWIAADAxAAAAAAAAAAAAAAAAAACengD/q6oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt7cAAMPDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/56dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAASUoAAAAAAAD09AAAz88AAAAAAAC3tgAAAAAAAAwMAAA9PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgZAAAAAAAAAAAAAPTzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfnAAAAAAAAAAAAAAAAAAANDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMAAF6egAAAAAAAAAAAACrqwAAz88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPT0AAAAAAAAAAAD/n54AAM/PAADo6AAAAAAAAD09AAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkAAAAAAAAAAAAAOjoAAD09AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzbAAAAAAAAAAAAABgZAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMQAAVVYAAAAAAAAAAAD/hoUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTEAADExAAAAAAAAz88A/6uqAAAAAAAAAAAAAVVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUlAAAAAAAAAAAAAAAAAP+qqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OgAAMPDAAAAAAAAAAAAADEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYmIAABgZAAAAAAAA6OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///+8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzbAADb3AAAAAAAABgYAAAxMQAAAAAAAAAAAAAAAAAAw8MAAPT0AAAxMAAAGBkAAAAAAAAAAAAA9PQAAMPDAAAAAAAADAwAAD09AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz88A/8/PAADn5wAAAAAAAA0MAAElJgAAPTwAAAwNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc2wAA29wAAAAAAAAAAAAASUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDPAADn6AAAAAAAACUkAAAkJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AEBAREAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANWdhzIAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MA5OTkANfX1wDz8/MA8vLyAAAAAAAODg4AGxsbAA0NDQAqKioADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJyckAvb29ALy8vADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSkpACgoKABRUVEANzc3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTkwDl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAACIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycnJAJSUlADKysoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAGxsbABSUlIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAeHh4AMrKygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ2dkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANfX1wDl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAABfX18AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9fXwCxsbEAKSkpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAiIiIADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANfX1wAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERACxsbEANjY2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAljA3mgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAFJSUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQBtbW0AX19fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2AIiIiAAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA19fXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgB6enoAX19fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJSUAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2ABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACurq4A5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAUlJSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QCUlJQAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkAUVFRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXlAF1dXQDl5eUAAAAAAAAAAAAAAAAAAAAAABsbGwCVlZUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz8wCgoKAAoaGhAPPz8wAAAAAAAAAAAAAAAAAAAAAADQ0NAJWVlQAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk5ADY2NgAysrKAK6urgDz8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAo6OjABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAGBgYABfX18ADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQBgYGAAX19fAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAUVFRAGBgYAANDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAlJSUADQ0NABQUFAAeHh4AOXl5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX19cAr6+vAEJCQgBdXV0A5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRUVEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QDz8/MA19fXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKysoAQkJCAGxsbABtbW0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMrKygCurq4Ar6+vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUlADl5eUAiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOj3ZlAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgCIiIgAvr6+AFFRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvr68AhoaGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAIiIiAB6enoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGhAMrKygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfX18Aenp6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX19fADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QC8vLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1tbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChoaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIA5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFhYUAvb29AAAAAAAAAAAAAAAAAAAAAAA2NjYAiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4A5eXlAAAAAAAAAAAAAAAAAAAAAADKysoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAysrKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4AGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArq6uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMnJyQDl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ANjY2AAAAAAAAAAAAAAAAAAAAAAAAAAAAr6+vAMrKygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHl5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSUlIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbW1tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk5OTAOXl5QAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGwBRUVEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2ADY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QBdXV0A5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhoYAlJSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJSUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9XWJ0AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHp6egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl5eUAQkJCAHh4eADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycnJAF1dXQChoaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQB6enoAhoaGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+vrwCvr68AREREAENDQwApKSkAKSkpAAAAAAAAAAAAAAAAAAAAAAAAAAAA19fXAMrKygC8vLwAysrKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAo6OjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfX18A8/PzAJOTkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8ALy8vAAAAAAAAAAAABsbGwAAAAAAAAAAAAAAAADl5eUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQCVlZUAGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGxsAAAAAACTk5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAJWVlQApKSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbACVlZUAGxsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYAo6OjACkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQANjY2AKKiogCurq4A5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2AG1tbQA2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OAGxsbABRUVEAysrKAK6urgDKysoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAERERABSUlIANjY2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////EAAAAO8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MAycnJANfX1wDY2NgA8vLyAPPz8wDy8vIAAAAAAAAAAAAbGxsAGxsbACkpKQApKSkAKSkpAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAQEB8AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///98AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANABAQExAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAADfAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBASEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAfAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAA3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAN8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANxEmQgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAbAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQEBAaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////zwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAQEBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAEEAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAEEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAeAAAABBAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAMQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAQEBMQAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEBAQExAQEB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAfwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAYQEBAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQGgAAAAQQAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAhAQEBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAgAAAAD8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAACRAAAAoAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAUAAAAC8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAACxAAAAsAAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAABAAAAAwAAAAEAAAAB8AAAAQAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAADwAAAAAAAAAAAAAADwAAAA8AAAAOAAAAAAAAAA4QAAAOAAAADQAAAA4AEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzSdObAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//KoOV9alFf74AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Call.png b/arma/client/addons/phone/ui/_site/images/light/Call.png new file mode 100644 index 0000000..ca0062d Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Call.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Call.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Call.png.b64 new file mode 100644 index 0000000..1eab42d --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Call.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEeA7+kitEAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAktiQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/30//7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP99f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz/fT//v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsBCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/30/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkJBQAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL89P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0/vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0/vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9P71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJpBedYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9P71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL88/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP+9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPH88/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0CCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE7+8nwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx/PP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8fvz//7+/v8AAAAAAAAAAAAAAAAAAAAA/v7+//H78/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADG2hkgAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7//v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx+/P//v7+//7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+//H78v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+//H78v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+//H78v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+//D78v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAd8FhocAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgECAgIB8vzzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy/PMAAgICAQICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtwjyZgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//vtFY3Mi5wvwAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Camera.png b/arma/client/addons/phone/ui/_site/images/light/Camera.png new file mode 100644 index 0000000..da03328 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Camera.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Camera.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Camera.png.b64 new file mode 100644 index 0000000..2742099 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Camera.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxERNm6PUj0AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/vEAUFACAAAP0w//39IAIEAR8AAAAAAv8CIP4B/xAB/wEQAAAAAAAAAAD//wAQAAH/EAAAAAAAAAAA////AAAAAAABAQEAAAAAAP///wABAQEAAAAAAP///wABAQEA//8AAAEBAAD///8AAQEBAP///wABAQEA////AAEBAQD///8AAQEBAAAAAAAAAAAA////AAEBAQAAAAAA////AAEBAQAAAAAA////AAEBAQD///8AAAAAAAEBAQAAAAAA////AAEBAQD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAP///wABAALwAQEA8AAAAAAAAP4A/gAC4AAAAAAC/wDw/gEA4f///fD//wPQAf3/8PwA9NAhISHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf398QBAAMMAEFAVACAP5P/v8AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDQAQEA0P36ArEeIRSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/nIAYGBl/+/f5wAAD+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAADgAQABwAL9/YEZIRngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/f3xAGBgxv/fz9gAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAQEBAP///wABAQEA////AAAAAAABAQEA////AAEBAQD///8AAQEAAP//AAABAQEA////AAEBAAD//wAAAAAAAAAAAAABAQEA////AAEBAAAAAAEAAAAAAP///wABAQEA////AAEBAQAAAP8AAAAAAP//AAAAAAAAAQEBAAAAAAD///8AAQEAAP//AAABAQEAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAQEBAAAA/wD//wAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAQEAAAAAAAD//wAAAQEBAP///wAAAAAAAQEBAAAAAAD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAABAQAAAAABAAAAAAACAACg+v3+gSEhGeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4t/mUAACBJ8AAP4QAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQAAAAABAAAAAAD///8AAQEAAAAAAQD///8AAQEBAAAAAAAAAAAAAAAAAAAA/wAAAAEA////AAEBAQAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAP///wABAQAAAP8AAAABAQAAAAAAAP//AAABAAAAAAEAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAD///8AAQEAAP//AAABAQEAAAAAAP///wABAQEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAP///wABAAAAAAEBAAAAAAD///8AAQEAAAAAAQAAAP8AAAAB4AIAAoAcHxahAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADi4uqP//79cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgOQHh4WcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/fEAEBB78A/wAwAAAAAAEBAAAAAAEA////AAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA0P//AVEhIRngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf3+cgAQEAvwD//iAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAEA////AAEBAAAAAAEAAAD/AAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAQAAAP8AAAAAAP//AAABAQAA//8AAAAAAAABAQEAAAD/AAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP//AAABAQAAAAABAAAA/wAAAAEAAAAAAP///wABAQEAAAD/AP//AAAAAAAAAQEBAP///wABAQAAAAABAAAA/wAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAEAAAAAAP///wABAQEA////AAEBAAAAAAEAAAAAAP///wABAQAA/wAAAAEAAQD///8AAQEAAP//AAABAQAA/wAAAAEAAQAAAP8A//8AAAAAAAABAQAAAAAAAP//AAABAQAA//8AAAAAAAABAQEA/wD/AAEAAAAAAAEA/wD/AAEAAAD//wAAAQEBAP///wAAAQAAAQAAAAAAAAD//wAAAQEAAP//AAAAAAAAAQEAAP//AAAAAAAAAQEAAAABAuD//wBBISEZ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/f5yABAP+/////IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAA////AAEBAQAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAQAAAP8AAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAABAQHg//D5MSExIfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/q/+AP8gAAAAAAEBAAD//wAAAQEAAAAAAAD//wAAAAAAAAAA/wAAAAAAAAAAAP///wAAAAAAAAAAAAEBAAD///8AAAAAAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAABAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQH/AAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wABAQAA////AAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAQEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAABAf8A//8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAD///8gAhAGvwAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4d3kj/8A/jAAAP8A////AP///wD///8A////AP7+/wD///8AAAD/AP///wD///8AAAD/AAAA/wAAAP8AAAAAAP7+/wD///8A////AP///wAAAP8AAAD/AAAA/wD///8AAAD/AP///wD///8A////AP///wAAAP8A////AAAA/wD///8A////AAAA/wD///8A////AP///wD///8A////AAAA/wAAAP8A////AAAA/wAAAP8A////AAAAAAAAAP8A////AAAA/wD///8A////AP///wAAAP8A////AP7+/wD///8AAAAAAAD//wAAAP8AAAD/AAAA/wD///8A////AP///wD+/v8AAAD/AAAAAAAAAP8AAAAAAP///wAAAP8AAAD/AAAA/wAAAP8A////AAAA/wAAAAAAAAD/AAAA/wD///8A/v7/AP///wD///8A////AP///wAAAP8A////AAAA/wAAAP8A////AAAA/wAAAP8A////AAAA/wD+/v8A////AP///wAAAP8A////AAAA/wAAAP8AAAD/AP///wD///8AAAD/AAAA/wAAAP8A/f3+MN3d4o8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3ORgAQD/nwAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD///8AAQEBAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAA//8AAAEBAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAP//AAABAQEAAAAAAAAA/wAAAAAAAAABAP///wABAQAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wACAP1RISQhsAAAAAAAx3oQPgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/f3yD//gO//v4AIAAAAAAAAAAAAQEAAP///wAAAAAAAAABAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEBAQD//wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQABAQDw8vP9ITExIfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7A4ACAf8g//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAEAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAEBAAD//wAAAAAAAP//AAAAAAAAAAAAAAEBAAD//wAAAQAAAP8AAAAAAP8AAAAAAAAAAAABAf8AAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAAAAAAA/wD//wAAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP///wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAEB/wD//wAAAQEAAP///gD//wEQDAoCcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39ffIPwDAd///wAAAQEAAAAAAAD//wAAAQEAAAAAAAAAAAEAAAD/AAAAAAAAAAAA//8AAAAAAAABAQAA//8AAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAD//wAAAQEAAAAAAAD//wAAAQEAAP//AAAAAAAAAAAAAAEBAAAAAAEAAAD/AAAAAQD///8AAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAQD///8AAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAA//8AAAAAAAABAQAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAAAAAEBAAD//wAAAQEAAP//AAABAQAAAAAAAP//AAAAAAAAAQEAAAT9/yEhKSHgAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+wMAgAD//wAAAAAA//8AAAAAAAAAAAEA//8AAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAD//wEAAAD/AAAAAAAAAAEA//8AAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD/AAAAAAD//wAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8BAAAA/wAAAAEA////AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAP8AAAAAAAAA/wAAAAAA//8AAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAP///wAAAAAA//8BAAAA/wAAAAAAAAAAAP//AQAAAP8AAAAAAAAAAAD//wAAAAAAAP//AAAAAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD//wAAAAAAAAAA/wD//wAAAAAAAAAAAAAAAAEAAAAAAP//AAAAAP8AAAAAAP//AAAAAAEA////AAAAAAD//wAAAAAAAAAAAQAAAP8A//8AAPoA/mAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2djg3wAA/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAABAQAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAECAfD19f8hMTEh8AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAADc2d9Q/f/+IAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAQEAAAAAAAAAAAAA//8AAP//AAABAQAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAAAAAAAAAABAQAA//8AAP//AAABAQAA//8AAAEBAAAAAAAA//8AAAEBAAAAAAAA//8AAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAEBAAD//wAAAQEAAAAAAAD+/gAAAAAAAAEBAAAAAAAA//8AAAAAAAAAAAAAAAAAAAEBAAD//wAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAA//8AAAEBAQAAAP8AAAAAAAAAAAAAAAAA//8AAAAAAAABAQAA//8AAAAAAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAAABAP///wAAAAAAAAAAAAEB/wD//wAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAAAAAAAAQEAAP//AAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAD//wAAAQEBAAAA/wD//wAAAAAAAAAAAAD//wAAAQEAAP/+/xAICP0wAAAAwAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD7/v9QAQD/AAD/AAAAAQAAAAAAAAAAAQAAAP8AAAAAAP//AAABAQAA//8AAAAAAAAAAAEAAAD/AAAAAAD//wAAAAAAAAAAAAAAAAAAAAABAP///wAAAAAAAAAAAAAAAQD///8AAAAAAAAAAAD//wAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAABAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAEAAAD/AP//AAAAAAAAAAABAP///gAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAD+/gAAAQEAAAAAAAD+/gAAAQEAAAAAAAD//wEAAAD/AAAAAAAAAAEA///+AAEBAQAAAP8AAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAP//AAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA//8BAAAAAAD///8AAQEAAAD/AAD/AAAAAAAAAAAAAAAAAAAA////AP//AAABAQAAAAAAAP7+AAABAQEA////AAAAAAD//wJQAAAAwAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD//v8vAAH/AAAAAQAA//8AAAABAAAA/gAAAAEAAAD/AAAAAQD//wAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD+AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAA////AAAAAQAAAP8AAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wD//wEAAAAAAAAAAAAAAP8A//8BAAAAAAAAAP8A//8BAAAA/wABAQAA//8AAAAA/wAAAP8AAAAAAP//AAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAQEBAP//AAAAAP8AAAAAAAAA/wAAAAEA//8AAAAA/wAA/wEAAAAAAAAAAAAAAP8AAAAAAAAAAQD//wAAAQEAAAAAAAD///4AAAABAAAAAAACAQFPAAAAcAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAM/P3xAHBv3vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAA//8AAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAABAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+frzETExMfAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQE/DAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAP//AAABAf8AAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAP//AAABAQAAAAAAAP7+AAABAQAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAABAAAA/wAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAP7+AAABAQAA//8AAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAP//AAABAQAAAAAAAP//AAD//wAAAAAAAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAYQIAAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP//BBD///sAAAABAAAAAAD///8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAD//wEAAAD/AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAQD///8AAAAAAAAAAAD//wAAAAABAAAAAAAAAP8A//8BAAAA/wAAAAAAAAAAAAAAAQD///8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAQD///8AAAAAAP//AQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAAQAAAAAAAAD/AP//AAAAAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9gH9MAAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEB+jD//wEAAAD/AAAAAAABAQAA///+AAAAAQAAAAAAAAD/AAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAEBAQD///8AAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAQEAAP///wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/gAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAA/gAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAABAAEBAAD///8AAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//39IAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIAAxD+//0AAAAAAAEBAAD//wAA//8AAAAA/wABAQAAAAAAAAAAAAD///8AAAAAAAAAAAABAf8A//8AAAAAAAAAAAAAAAAAAAAA/wD//wAAAAAAAAEBAAD///8AAQEAAP//AAAAAP8AAAAAAAEBAAAAAP8A//8AAAEBAAD//wAAAAD/AAAAAAABAQAA////AAAAAAAAAAAAAAAAAAEBAAD//wAAAAD/AAAAAAABAQAA//8AAAAA/wABAQAA/v4AAAAAAAD29vUA19fWAPX19QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEACgsJACAfIAAVFRYAAAAAAAAAAAD//wAAAAAAAAAAAAABAQAAAAD/AAAAAAAAAAAAAAAAAP//AAABAQAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQH/AP//AAD//wAAAQEAAP//AAAAAAAAAQEAAP///wAAAAAAAAAAAAEBAAAAAAAA//8AAAEBAAD///8AAQEAAP//AAAAAAAAAQH/AP//AAAAAAAAAAAAAAEBAAD//wAAAQEAAAAAAAD//wAAAAAAAAEBAAAAAAAAAgEAHwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/R8AAP8AAAAAAP//AAD//wAAAQEAAP//AAAAAAAA//8AAAEBAAD//wAAAQEAAAAAAAD//wAAAAAAAAAAAAD//wAAAQEAAP//AAAAAAAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAEAAAD/AP7+AAABAQAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAABAAAA/wAAAAAA//8AAAAAAAD//wAAAQEBAAAA/wD+/gAAAQEBAAAA/wD+/gAA7OzrAK6vqwDBwb8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHyAASUhLAD4+QAAAAAAAAAAAAAAAAAD//wAAAAABAP///wABAQAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAEBAAAA/wAA/wABAP///wABAQAA//8AAAAAAAAAAAAA//8AAP//AAABAQAAAAAAAP//AQAAAP8AAAAAAP7+AAABAQAA//8AAP//AAABAQAA//8AAP//AAABAQAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAP7+AAABAQAA/gABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEA/xD+//8AAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAABAAAA/wAAAAAA//8AAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAP8AAAAAAAAAAAD//wEAAAD/AAAAAAAAAAAAAAAAAAAAAQD//wAAAAD+AAAAAQAAAP8AAAAAAP//AAAAAAAA////AAAAAAAAAAAA////AAAAAADh4uAAhYWBAPX19QAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAQABAP8A/wAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAADh4eAAmJmVAOrr6wBTUlQAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAP//AAAAAAD//wAAAAAAAAAAAAAAAAAAAAABAAAA/wD//wAAAAAAAAAA/wAAAAAAAAABAAAA/wD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAgIAIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP/9AAD/AAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAEBAQD///8AAAAAAAAAAAAAAAAAAQEAAP///wAAAAAAAAD/AAAAAAAAAAEAAAD/AAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAABAQAA////AAAAAAAAAAEAAAAAAOLi4ACEhYAA9vb2AAAAAQABAQAA////AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AP///wAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAK+vqwAAAP8AUlFVAAAA/wAAAAEAAAD+AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAA///+AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAD/AAAAAAABAQAA////AAAAAQABAQAA///+AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAABnRHwEAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAP8A/f0CEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/yD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP///wD//wAAAAD/AAEBAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD///8AAQEAAAAAAAD///8AAQEAAAAA/wD//wAAAQEAAAAAAAD///8AAAAAAAEB/wD//wAAAQEAAP//AAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAP8A4eHgAIaGggD29vYAAQEBAP///wD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCurqsAAP//AFJSVQAAAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wD//wAAAQH/AP//AAAAAAAAAQEAAP///wABAQAA//8AAAEBAAD///8AAQEAAAAA/wD//wAAAQEAAP//AAD//wAAAAAAAAEB/wD//wAA//8AAAAA/wABAQAAAAAAAP//AAAAAP8AAQEAAP//AAABAf8AAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAD+EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8BAAAA/wAAAAAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAADi4uEAhYaCAPb29QABAQEA////AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArq+tAP8AAABSUVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA////AAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAEA////AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//wD///8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAQEAAP///wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLi4gCGh4IA9vb1AAAAAAD///8AAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AK+vrAAA/wAAUVFUAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///hD//wAAAAD/AAAAAQAAAP8AAAD/AAAAAQAAAAAAAQEAAP//AAAAAP8AAAAAAAEBAAAAAAAA//8AAAAAAAABAQAA//8AAAAAAAABAf8A//8AAAAA/wAAAAAAAAD/AAEBAAD//wAAAQEAAAAAAAD//wAA////AAAA/wAAAAAAAQEAAAAAAAD///8AAQEBAP//AAAAAAAAAAAAAAAA/wAAAAEA4uPhAIeHgwD29vUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvsKwAAAAAAFBQUwAAAAAAAAAAAAEBAAD///8AAAD/AAEBAQAAAAAA////AAAA/wAAAAAAAAAAAAEBAQD///4AAAAAAAEBAQD//wAAAQEAAP//AAABAQAA////AAAA/wABAQAA////AAEBAQD//wAAAAD/AAAAAQAAAAAAAAD/AAAA/wAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEBAQD///8AAAD+EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7+/xABAQAAAAAAAAAA/wD//wAAAAAAAAEB/wD//wAAAAAAAAAAAAAA/wAAAAH/AP//AAAAAAAAAAAAAAAAAAD+/gAAAAAAAAEBAAD//wAA//8AAAAAAAABAQAAAAAAAP///wAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAABAf8A/v4AAAEBAAAAAAAA////AP//AAABAQAAAAAAAAAAAADY2NYAkZKOAPb29QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr7CsAP8A/wBQT1MAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA//8AAAEBAAD//wAAAQEAAP///wAAAAAAAAAAAP///wAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAP8AAAAAAP///wD//wAAAQEAAAAA/wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAP///wD//wAAAAD/EAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAM3M0v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADi4uEA4uLhAOzt7ADs7OwAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABANjY1QDs7OwAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFBYAExQUABQUFAABAQEA////AAAAAAAAAAAAAAABAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAAAAAAAP8AFBQVAB4dHwAUFRQAHh0fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM0LgEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnYALCxrQDY2NcAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQEBAP///wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr7OoA6+zqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQVAFBPUgA7Oz0AAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AAAA/wAAAAEAAQEAAAAAAAAAAAAA//8AAAAA/wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AACoqKQAuru4AAEBAQAAAAAAAAD/AAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzrAJydmQDi4uEAWVlcAAAAAAAAAAAAAAAAAP///gAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAA////AP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKiopQC6u7kAAAAAAP///wAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAEAAQAAAQAA////AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAC6u7gA9vb1AGJiZgAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAD//wAAAQEAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8Au7u5ALq7uAABAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wD///8AAAAAAAEBAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8A/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAxMXEALq7uQD///8A////AAAA/wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8A//8AAAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wAAAAAA//8AAP///wAAAAAA////AP//AAD///8A//8AAP///wD///8A////AP///wDs7OsAu7y5AAAAAAD/AP8A/wD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAQAAAP8AAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKyrgD19fUA////AP///wD///8A////AP///wAAAAAA////AP///wD///8A//8AAP//AAD///8A///+AP7+/gD///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAD/AP///wD///8AAAAAAP///gD///8AAAD/AAAAAAAAAAAA////AAAAAADY2dcA7OzrAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAABAAEA/wD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAABAAAAAAD/AP8AAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/APb29gDGxsQA////AAAAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAD///8A///+AAAA/wAAAAAAAAAAAAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wDPz84AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAEAAQD/AP8AAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAQD/AP8AAAABAAAA/wAA//8AAAEAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAADi4+IAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAQAAAAAAAAAAAAAA/wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8A/wAAAAAAAAAAAAABAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAD/AAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAP8A/wAAAAAAAAAAAAAAAADj4+EA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAAAAAAEA////AAEBAAAAAAAAAAABAAAAAAD///8AAQEBAAAA/wD//wAAAAAAAAAAAAD49/YAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAEAAAD/AP8AAAAAAAAAAQAAAP8ACgoKAAkJCgATEhMAEhMSAPj3+AD19vYA+Pf2AOPk4wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wAAAAAA/wABAAEA/wD/AAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAANCv4ANCj0APL1AwDn7AYA5u0FAAAAAAAAAAAAAAAAAAEBAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD29vYA////AAEBAAAAAAAA//8AAAEBAAAAAAEAAAAAAAAAAAD///8AAQEAAAAAAAD//wAAAAAAAAEBAQAAAP8A//8AAAA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AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wABAQEA/wD/AAAAAAAAAAAAAAABAAAA/wD/AP8AAP8AAAABAAAA/wAAAAEBABISEQBvbnEAEhITAP///wABAQAA//8AAPb29wC9vrsAvr69APb29QABAQEAAAAAAAEBAQABAAEAAQEAAAABAAAAAAAA//8AAPf39wDQ0c8A0NDPALSzsgA5OToATExPAP///wAAAP8AAAAAABISEgBubnAAkpKQAO3u7gABAQAA////AAAAAAAA/wAAAAEAAAAAAAAAAQAAAAD/AAAAAAAAAAAAprsUAGdP6QAAAAAAAAAAAAAAAAAAAAAAAAAAAMDPDwAAAAAAAAAAAAABAQAA//8AAAEAAAAA/wAAAAAAAAEBAAAA/wAAAAAA////AAAAAAAAAAAAAAD/AAAAAAAAAAAAAQEAAP//AAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///wD///8AAAD/AP///wD///8A////AAAA/wAAAP8A////AAAA/wD///8A////AP///wAAAAAAAAABAAAA/wAA//8AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABAAD/AAAA/wAAAQABAAAAAAAAAAAAAP//AAD/AAD/AAAAAP8AAAAAAAAAAAEAAAD/AAAAAQAAAAEAAAAAAAAAAQAAAQEAExISAG5tcQAREREA////AAEBAAD//wAA2drZAIWFgQC1tbMA9/f2AAICAwACAQIAAwIDAAMCAwACAgIAAQIBAAEBAQACAgIAAgIBAAIBAgACAQIAAQEBAO3u7QC0tbMAent3AO3t7AAAAAAA//8AAP//AAARERMAbW1wABMSEgD///8AAAAAAAAAAAAAAQAAAAABAAAAAAAA/wAAAAABAAD/AAAAAAEApbwUANnjCAAAAAAAAAAAAAAAAAAAAAAAzNgLAJixFgAAAAAAAAAAAAAA/wAAAQAAAAABAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAD/AP///wD///8A////AP///wD///8A/v7/AP///wAAAAAA////AAAA/wAAAP8A////AP///wD///8AAAD/AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAMHAxv8AAAAAAAD/AAAAAQAAAAAAAAD/AP//AAABAQEAAAAAAAAAAAAAAP8AAAABAP///wABAQEA////AAEBAQBsbGcAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAEAAQAJCQkAdnZ4ABESEwABAAEAAAD/AP//AAC+v70ArKypAAAAAQABAAAAAAEBAAEBAAABAQEAAQEBAAAAAQAAAP8AAQABAP8AAAABAAAA/wD/AAD/AAD/AP8A////AAAAAAD///8A////AP//AABMTE0AS0pNAAEBAAD//wAAAQEAAO7u7gCJioYA9/f4AAAAAAAAAP8AAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAABOO+8AMyb1AAABAQDM2QoAs8URAAAAAQAAAAAAAAD/AAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQEAk5KXAAEBAAAAAAEA////AAEBAAAAAAEAAAAAAP///wABAQEAAAAAAP///wABAQEA////AAEBAQAAAAAAAAAAAD9AOgEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA/gAAAAEAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAD/AAAAAAD///8AAAAAAP///gAAAQAAAAAAAAD/AAABAQEA////AAABAAAAAAAAAAEBAAAA/wAAAAAAAP//AAAAAAAAAQAAAQABAP8A/wAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAQEBAP8B/wAAAAAAAAAAAP8A/wBISEoAERETAAD/AAD/AP8AAAAAALW2swC1tbQAAQABAAECAQABAAEAAAEAAAEAAQABAQEAAAAAAAABAAAAAAEAAAABAAIAAAD/AP8AAQABAAABAAABAAEA//8AAAD//wD/Af8A//7/AP4A/wC1tLMAAP8AAExMTQAAAAAA//8AABEREgBJR0sArrCsAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAf8AAAAAAAD/AACyxREAs8USAP8A/wAAAAAAAAAAAAAA/wAAAAAAAP8AAAABAAAAAAAAAAAAAAEAAQD/Af8AAAAAAAAAAAAAAP8AAAD/AP//AAAAAAAAAAAAAP//AAAAAP4AAAABAAAAAAD///4AAAABAAAAAAD///8AAAAAAP///gAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP//AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//AAAA/wAAAAABAAABAQAAAAAAAAEBAAAAAAAA/wAAAAAAAAAAAQAAAAAAAAEBAAEBAQAAAAEA/wAAAAAAAAAAAAAAAAEAAAAA/wAAAAAAAAAAAAABAAAAAQAA////AAD/AAAAAAAAAAABABsaHAA+PkAA////AP///wAAAP8Avb68ALa1tAABAQAAAgICAAIBAgABAgIAAgECAAECAgABAQEAAAEBAAAAAQAAAAAAAAAAAP8A/wAAAAAAAQABAAEAAQABAAEAAQEAAAEBAQACAQIAAgICAAICAgABAgEAtbazAMbGxQD///8A////AAAA/wA+P0AAJCQmAAEAAQAAAQEAAAABAAD/AAAAAQAAAP8AAAD//wAA/wAAAP8AAAAAAAAA/wAA////AAD/AAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQAAAAAAAAABAP///wAA/wAAAAABAAABAQAAAAAA//8AAAAAAAD///8AAAD/AP8A/wD//wAA/wD/AP///wD//wAA/wD/AP///wD///8A////AP//AAD/AP8A//8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAAAP8AAAD/AAAA/wD///8AAAD/AAAA/wAAAP8A////AP///wD///8A////AAAA/wAAAAAAAAD/AAAA/wAAAQAAAAD/AAD//wD/AAAAAAD/AAAAAQAAAQAAAP//AAAA/wAAAAAAAP//AP///wAAAP8AAAAAAAAAAQAA/wAAAAABAAAAAAAAAAEAAAEAAAAAAQAAAAAAAAEAAAAAAAAAAAEAAQAAAFpaWwAAAAAAAAAAAP///wDt7e0At7a1AAABAQACAgIAAQIBAAEBAQABAQAAAQEBAAAA/wD/AAAAAP//AAD//wAA/wAAAAAAAAAAAAAAAAAA/wD/AP///wD/AP8AAAAAAAEBAQAAAQEAAQEBAAIBAQACAgIAAQECAKysqgDt7ewA////AP7+/wAAAP8AR0ZIAP8AAAAAAP8AAQAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAA/wAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAA/wAAAAD/AP///wD///8A////AP/+/wAAAP8AAP//AP///wAAAP8AAP//AAAA/wAAAP8AAAD/AAAA/wD//v8AAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD//wD//wAAAAAAAP//AAAAAAAA//8AAP//AAD///8AAAD/AAAA/wAAAAAAAAAAAP///wD///8A////AP///wAAAAEAAP8AAAABAAAAAP8AAAAAAAAA/wAA/wAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAEAAAD/AAAA/wAAAQAAAAAAAAAAAAAA//8AAAABAAAA/wAAAAEAAP8AAAABAAABAAAAIyMkABoaGwD///8A////AAAAAACZmpcA9/j3AAEBAQABAAEAAQABAAEBAQAAAAAA/wD/AAAAAAAA//8AAAAAAAAAAAAAAQAAAP//AAAAAQAA/wAAAAAAAAAAAAAA/wAAAP8AAP///wABAAAAAQEBAAECAQABAAEAAgEBAPj5+QCkpKIAAAAAAAAAAAD//wAAJCQlACQjJAAAAAAA/wD/AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAD/AAAAAQAAAP8AAAEAAQAAAAAAAAAAAAD/AAAAAAEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAABAQAAAQAA////AP//AAAAAAAA//8AAAAA/wD//wAA////AAAAAAD//wAA////AP//AAD//wAA//8AAP//AAAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//AAD///8A/v7/AP///wD///8A////AP///wD//wAA//8AAP//AAD///8A////AP///wD///8A//8AAP//AAAAAP8AAAEBAAD/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAABAAABAQAA//8AAAAAAAEAAQAA/wAAAAD/AAD/AAAAAQAAAQAAAAD/AAAAAAAAAAEAAAAAAQD///8ANTU3AP//AAAAAAAA////AMjIxwDl5OQAAQEBAAICAQABAQEAAQEBAP8AAAAAAAEAAAABAAD/AAAAAQEAAAEBAAABAAAAAAEAAAAAAAD//wAAAAAAAP8AAAABAQAAAAAAAAEBAAAAAAD/AAAA/wAAAAAAAQABAQEAAQEBAAEBAADb29oA29vaAAAA/wD///8A////AEdHSQAA/wAAAP8AAAAAAAAA//8AAAAAAAAA/wAA/wAAAP//AAABAQAAAAAAAAAAAP8AAAAAAAEAAAAAAAABAQAA//8AAAEBAAD/AAAA/wAAAAEAAAABAQAA//8AAAAAAAAAAAAAAAEA//8AAP///wD///4A////AAAAAAD///8A//8AAAAA/wD///8A//8AAP///gD///8A////AP///wD//wAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wD///8A////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8A////AP///wAAAAEAAP//AAAAAAAAAAAAAP//AAAAAQAAAAAAAAEBAAABAQAAAAEAAP//AAAAAAAAAQAAAAABAP///wAAAQAAAP8AAAAAAAAAAAEA////AAAAAAAAAP8AAP8AAAAAAAAICQkANTU2AAAAAAD///8AAAAAAMnJxwABAQEAAgEBAAEAAQABAQEA/wD/AAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAD/AAABAAAAAP8AAP//AAAAAAAAAQEAAQEBAAIBAgABAQEAtra0AP7+/wAAAAAAAAAAABoaGwAJCgoAAQEBAAEAAQAAAQEAAAAAAAAAAAAAAQAAAAEBAAD//wAA/wAAAAAAAAAA/wAAAAAAAP8AAAD//wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA/wAAAAAAAAEBAAAA/wAAAAAAAAD/AP///wD//wAAAAD/AP///wD///8AAAD/AP7+/wD///8A////AP//AAAAAP8AAAD/AP///wD///8AAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wAAAP8AAAD/AP//AAD///8A////AP///wD///8A////AP///wD///8AAAD/AAAA/wAA//8AAAEBAAABAQAA/wAAAAEBAAD//wAAAAAAAAAAAAD//wAA//8AAAEAAAD//wABAAEAAP//AAABAQAAAAEAAAEBAAEBAQAAAAAAAAEBAAABAQAAAAEAAAEBAAEAAAAkIyQAAAAAAP///wD///8A7e3tANzd3AABAQEAAQEBAAABAQAAAAAAAAABAAABAQAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAA/wAAAAAAAAABAQAAAAAAAAAAAAABAAAAAAAAAAABAAD/AAAAAAEAAAEAAAD//wAA//8AAAEAAAEBAQABAQEA3d3cAO/v7gD///8A////AAgICAAjIiMA/wAAAP///wAA//8AAAAAAAAAAQAAAAEAAP//AAAAAAAAAAAAAAAAAAD/AAABAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP//AAD/AAAA//8A//8AAAD//wAAAP8A////AP///wAAAP8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AAAA/wAAAP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///gD//wAA////AP//AAD///8A////AP///wD//wAA//8AAP//AAAAAAAAAP//AAAAAAAAAAAAAQAAAAAAAAAAAAAAAP//AAABAQAAAQEAAP8AAAABAQD///8AAAAAAAAAAAAA//8AAP//AP///wAA//8AAP//AAD//wAA//8AAQAAAP///wAiIyQA////AP//AAAAAAAA0tPRAAEAAAABAQEAAAAAAAD//wD///8AAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAQAAAAAAAP//AAABAQAA//8AAAABAAABAQAAAQEAAP8AAAAAAAABAQEA/wAAANHR0AD//wAA////AAAAAAAjIyQAAAAAAAABAQAAAAAAAAAAAAD//wABAAAAAAAAAAABAQAAAAAAAAEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAEBAAAAAQAA/wAAAAEBAAAAAAAAAQEA///+AP8A/wD//wAA////AP//AAD///8A//8AAP///wD///8AAAAAAP//AAD//wAA////AP///wD//wAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAA//8AAP//AAD///8A//8AAP///wD//wAA//8AAP//AAD///8AAAD/AP///wAAAQEAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAD//wAA//8AAAEBAAD/AAAAAAAAAAABAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAQEA/wAAAAAAAAAbGhsA////AAAA/wD+/v8A3NzbAAEBAQAAAQEAAAEBAAABAQAAAQEAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAD//wAA/wAAAAABAAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAABAQAAAQEAAgEBANzc3AAAAP8AAAAAAP///wAaGhsA////AAEAAAAAAAAAAAAAAAAAAAD///8AAAAAAAD/AAAAAAAAAP//AAAAAAAAAAAAAAEBAAAAAAAAAQEAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP8AAAEBAQAAAAAA//8AAP//AAD/RHfwSgAAIABJREFU//8A//8AAP///wD//wAA////AP//AAD//wAA/v7/AP///wD///8A//8AAP//AAD///8A//8AAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAD//wAAAAAAAAEAAAD/AAAAAAAAAAABAAEBAAD///8AAAABAAAA/wAA//8AAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAD//wAAAAAAAAABAAD//wAAAQEA////ABEREQD///8AAQEBAAAAAADv7u4AAQEBAAEAAAAA//8AAAEBAAD//wAAAAAAAP//AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAEA////AAAAAAAA//8AAAEBAAD/AAAAAP8AAP8AAAAAAQABAQAA//8AAAAAAAABAQEA////AAEAAAAAAQEA5ebkAP///wABAQEA////ABEREgAAAAAA/wAAAAABAQAAAAAAAP//AAABAQAA/wAAAAEAAAD/AAAAAQEAAP//AAAAAAAAAAAAAAABAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP//AAAAAAAAAQAA//8AAAAAAAAAAP8AAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAAAAAAAAAAAAAAAAP//AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAEAAAEAAAAAAQAA/wAAAQEAAP//AQAAAAAAAAAAABEREgAAAAAA////AP//AADl5uUAAgICAAAAAAAAAQEAAP8AAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAEAAAD/AAAA//8AAAEBAAD//wAAAAAAAAAAAAABAQAA//8AAAAAAAAA/wAAAAAAAAABAAAA/wD//wAAAAEBAAEAAQD///8AAAAAAAABAQAA//8A+Pf4AAAAAAD+/v8AAQEAABEREQAA//8AAAAAAAAAAQAAAP8AAAAAAAD//wAAAAAAAP8AAAAAAAAA/wAAAAAAAAEBAQD//wAAAAEAAAD/AAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAAA//8AAAAAAAAAAAD//wAAAAD/AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAQAAAP8A//8BAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD///8AAQEBAP///wAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAEAAAAAAAABAQAA//8AAAAAAAABAQAA/wAAAAEAAAD/AAAAAAEAAAAAAAAA/wAAAQEAAP//AAAAAQAAAP8AAP8AAAAAAAAAAAAAAP//AAAAAAAAAAAA//8AAAAAAAAA/wAA/wAAAP//AAABAQAA//8AAAAA/wABAQEAAAAAAAEBAQD///8AAAAAAAAAAQAAAAAAAAABAAAAAAAAAP8AAP8BAAABAAAAAAEAAP//AAAAAAAAAP8AAAAAAAD//wAAAAEAAP//AAABAQAA//8AAAD/AAAAAQAAAAAAAAAAAP//AAAAAAEAAQEAAP8AAAAAAQEA+Pj3AP///wAAAAAA//8AAAAAAQD/AAAAAQAAAAEBAAD/AAEAAP//AAABAQAA/wAAAAEAAAAAAAAA//8AAAABAP//AAAAAQAAAP8AAAAAAAAAAP8AAAEBAAD/AQAAAAAAAAABAAABAAAA/wAAAAEAAAD/AAAAAP8A////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAD//wAAAAD/AAAAAAAAAP8A//8AAAEBAAD///8AAAAAAAEBAAAAAAAA//8AAAEBAAD///8AAQEAAAD//wAAAAEAAAEAAAD//wAAAAAAAP8BAAAAAAAAAP8AAAABAAAAAQAA/wAAAAABAAABAAAA/wAAAAD/AAAAAQAAAP8AAAAAAAABAQAAAAAAAP//AAABAQAA//8AAQAAAP///gD//wEAAAAAAAAA/wAAAP8AAQABAP//AAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAQEAAP8AAAD/AAAAAAAAAAAAAAABAQAA/wAAAAD/AAABAQAA/wAAAAABAAD/AAAAAQEAAAAAAAD//wAAAQEAAP//AAAAAQAAAP8AAAABAAD/AAABAAAA/wABAP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAD/AAAAAP8AAAABAAD/AAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAP//AAAAAAAAAAEAAAAAAAD//wAAAAEAAP//AAAAAQD///8AAAAAAP///wAAAAAAAQEAAP//AAAAAAAAAAAAAAEBAAD//wAAAAD/AAEBAAD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD/AP///wAAAP8A////AP///wD+/v8AAAD/AP//AAAAAAAAAAD/AP///wD///8AAAD/AP///wAAAP8A////AAAAAAAAAP8AAP8AAAABAQAAAAAAAQEAAAAA/wAAAAAAAAD/AAABAAAAAAAAAAEAAAD/AAAAAAAAAAABAAEBAAAAAAEAAAABAAD/AAAAAAAAAAABAAD/AAAAAAAA//8AAO/v7wAAAP8AAAD/AAAAAAAREBMAAAAAAAEBAAAAAP8AAAEAAAAAAQAAAAAAAAD/AAEBAAAAAAAAAAD/AAAA/wAAAP8AAAABAAD//wAAAAAAAAAAAAD/AAAAAP8AAAAAAAAA/wAA/wAAAP//AAABAQAA/wAAAAEBAAAAAAAAAAEA////AAEBAAAAAQAAERIRAAAA/wAAAAEA//8AAPb29gAA/wAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAEAAAAAAQAA/wAAAAABAAAAAQAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAABAQAAAAABAAAAAAD///8A////AP///wAA//8A////AAAA/wAAAP8AAAD/AP///wAAAP8AAAD/AP///wAAAP8AAAD/AP7+/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD//wAA//8AAP///wAAAP8A////AP///gD///4A////AP///wD///8A////AP//AAD///8A////AAAAAAAAAAEAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAEAAAABAAD/AAAAAAAAAP8AAAABAAAAAAEAAAAAAP//AAAAAAAAAAD/AAAAAAAA//8AAAAAAAAA/wD/AAAAAQEAAPb29QD//wAA////AP//AAASExIAAAAAAP//AAAAAAEAAP//AAAA/wAAAAEAAAAAAP//AAAA//8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAQAAAAABAAEBAAAAAAEAAAAAAAAAAQAAAAAAAAABAAD//wAAAAAAAAAAAAABAAAAAQAAAAAAAP//AAAA/wEAEhERAP//AAD///8A////AOfn5QAAAQAAAAABAAABAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAP8AAAAAAAAAAAAAAQEAAP8AAAABAQABAQAAAAAAAAAAAQD//wAAAAAAAAAA/wD///8A//8AAAAA/wD/AP8AAAAAAP///wD//wAA////AP///wD///8A////AP//AAD///8A//8AAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD///8A////AP//AAD//wAA////AP//AAD//wAAAAAAAP///wD///8A//8AAP///wD//wAAAAAAAAAAAQAAAAAAAAAAAAD/AAAA//8A//8AAAAAAQABAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAABAAAAAQAAAAABAAEBAAAAAAEAAAEAAAAAAQABAAAA//8AAOXl5gD///8A//8AAAAAAAAZGRoAAAABAAEBAAAAAAAAAAABAAABAQAAAAAAAAABAAAAAAAAAAEAAAABAAAAAAAAAQAAAAABAAAAAQAA//8AAAAAAP//AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAP8AAAAAAAAA//8AAAEBAAAA/wAAAP8AGRocAP///wD///8AAAAAAPX19gAAAAAA/wD/AAEAAQAAAAAAAAAAAAD//wAAAAAAAAABAAAAAAAAAAEAAAEBAAAAAAAAAAEAAAAAAAAAAAAA/wAAAAD/AAAAAAD//wAAAAD/AAAAAAAAAP8AAQEAAAAAAQAAAAAA////AAAAAAD//wAA/v7/AP//AAD///8A//8AAAAAAAD///8A////AP///wD//wAA////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wD///8AAAD/AAAA/wD///8AAAAAAAAA/wAAAP8A////AAAAAAD//wAAAAD/AAAA/wAAAP8A////AAAAAAAAAP8AAAEAAAAA/wAAAAEAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAA/wAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAAEAAQEAAObm5AAAAAAAAAAAAP///wArKisA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAD/AAAAAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABAQIAAQAAAAAAAQD/AAAAKikrAAAAAAAAAAAAAAAAANXW1AABAAAAAQAAAP///wAAAAAAAAAAAAAAAQAA/wAAAAAAAAAAAAAAAP8AAP8AAAAAAAABAQAAAAAAAAABAAAAAAAAAAABAAD/AAAAAAAAAAABAAAAAAAAAAAA/wAAAAAAAAD///8AAAD/AP7+/wD///8A////AAAA/wAAAP8AAAD/AP///wAAAAAAAAAAAAAA/wD///8AAAD/AP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wAAAP8A////AP///wAAAP8A////AP///wD///8A////AP///wAAAP8A////AP///wD///8A////AAAAAAAAAQEAAP8AAAAAAQAAAAAAAAAAAAABAAAAAP8AAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAP8AAAD/AAABAQAAAAAAAAD//wAAAP8AAAD/AAEBAAAAAP8AAAAAANXV1AD///8A////AP///wAhISMACQgJAP//AAAAAAAAAAD/AAAAAAAAAQAAAAAAAAAAAQAAAQAAAAEBAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAEAAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAD/AAAAAAAAAAAAAAAAAAAAAAD/AP8A////AAAA/wAREREAIiIjAAAA/wD///8A/v7+AN7d3AAAAAEAAAABAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAD/AAAA/wAAAQEAAAAAAAAAAAD///8AAAAAAAD/AAAAAAAAAAD/AAABAAAAAAAAAAAAAAAAAAAAAAEAAP8AAAABAAD///8A////AAAA/wAAAP8AAAD/AP///wD///8A////AP///wD///8A////AP///wAAAP8A////AAAA/wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP//AAD///8A////AP//AAD//wAA////AP///wD//wAA////AP///wD///8A////AP///wD//wAA////AAAAAAAA//8AAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAEAAP8AAAAAAAAAAQAAAP8AAAD/AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAEAAAABAAAAAAABAQEAAAEBAO/v7wDd3dwAAAAAAP///wD///8AOjo8AAAAAAABAQAAAAABAAD/AAAA/wAAAAAAAAAA/wAA//8AAP8AAAAAAAAAAAAAAAAAAAABAAAAAAEAAP8AAAABAQAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEBAQBDQkYAAAAAAP7+/wD///8A5+fmAO/w7wAAAP8AAAEAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAABAQAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAD/AAABAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAD//wAA//8AAP///wD///8A//8AAP///wD///8A//8AAP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//8AAP///gD//wAAAAAAAP///wAAAP8A////AP//AAAAAP8AAAAAAP//AAAAAAAAAAAAAP///wD///8A//8AAAAAAAAAAAEAAQEAAAABAAAAAQAAAP//AAEBAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQABAQAAAAEAAP8AAAD//wAAAP8AAAAAAADV1tMA////AAAAAAD///8AOzs8AAgIBwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQABAQEAAQEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAABAQEQAqKisA////AP///wAAAAAAw8PCAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAEAAAD/AAAAAAAAAP//AAAAAAAAAAEAAAAAAAAAAAAA/wAAAAAAAAAAAAD//wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8A////AP//AAD///8AAAD/AP//AAD///8A////AAAAAAD//wAA//8AAP///wAAAAAA//8AAP///wD//wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8A////AAAA/wD+/v8A//8AAP///wD///8A////AP///wD///8A////AAAAAAAAAP8AAAD/AAAAAAAAAP8A//8AAAD/AAAAAAAAAAABAAAAAQAAAP8AAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAQAAAAAAAAAAAAAAAAD//wAAAP8AAAD/AAAAAAAAAQEBAAEBAQDNzMwA9/f2AP///wAAAAAACAgJAFNTVwAAAAEAAAEAAAAAAAAAAP8AAAAAAAAAAAD//wAA//8AAAAAAAAAAAAAAAD/AAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAEAAEJCRAAHBwgA////AAAAAADu7u4Azs7LAAABAQABAQEAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD///8AAAD/AP///wD//wAA//7/AAAA/wAAAAAAAAD/AP7+/wAAAP8A////AAAAAAD///8AAAD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wD///8A////AAAA/wD///8A////AP///wD///8A////AAEBAAAAAAEAAAAAAAAA/wAA/wAAAAAAAP///wAAAAEAAAAAAAAAAAAA/wAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAQEAAAAAAAEBAAD4+PgAu7u6AAAAAAAAAAAA/v7+ACgoKgA4ODoAAP8AAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAQAAOjk8ADAwMgD///4A//8AAAAAAAC7u7kAAAAAAAEAAQAAAAAAAP8AAAAA/wAAAAAAAAAAAAD/AAD//wAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//AAAAAAEAAQEBAAAAAAAAAAAAAAAAAAAAAAD///8A////AAAA/wAAAP8A/wD/AP///wD///8A////AAAA/wD//wAAAAD/AP///wD///8A////AP///wAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD///8A////AP//AAD//wAA////AP///wD///8A////AP//AAD//wAA////AP///wD///8A////AP//AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAAAAAEAAAD///8AAQEBAAEBAQABAQEAxcXDAN3d3AD///8AAAAAAAAA/wBKSkwAGRkaAAAA/wAAAAAAAP8AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAZGBoASEhLAAAAAQAAAAAAAAD/AO3t7QDOzssAAQECAAAAAAAAAQAAAAEAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAEBAAD///8A////AAAAAAD///8A////AP//AAD///8A//8AAP///wD///8A////AP//AAD//wAA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAA//8AAP///wD///8AAP8AAAAAAAAAAAAAAAAAAP///wAAAP8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAP//AAAAAQAA////AAEBAQABAQAAAQEBAKurqAD39/cA////AP//AAD//wAAYWFkACgoKgABAQAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAP//AAA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//wABAQEAAAAAAP///wABAQEA////AAEBAQD3+PcAz87MANjY1gDe3t4AAQIBAAEBAQABAQEAAQIBAAEBAQAAAQAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD+/v4AAQEBAAAAAAAAAP8A//8AAAAAAAABAQEAAAAAAP7+/gABAQAA//8AAAEBAQAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA///+AAAAAQAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAEAAAH/AQAAAQEAAgD/AP8C/wD///8A/wD+AOjn5wCvr6wAAAAAABgYGgAQERAAGRgZABAQEQAAAAAAAQEAAP//AADv7+8A8fHwAN/f3QDw8O8A/wAAAAEAAQACAgIAAQEBAAEBAQABAQEAAQEBAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD//wAAAAAAAP///wAAAAAAAAD/AAAAAQD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEADw8PAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAQEAAAAAAAEBAAD+/gAAAQEDAP8A/wD//v8AAAAAAOjo5gDo6OUA19bVAAABAAAAAAAAAP8AAAAAAAAAAAAAAQEBAAAAAAABAQIAAQEAAAEAAQABAQAAAAABAAEBAQABAQEAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHCAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAQEBAP//AAACAgEA////AAEAAAD/AgEAAAD/AP7/AAABAAEA//8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQEAAAAAAQAAAQAAAQABAAAAAAABAQEAAQEAAAAAAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAQEAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A////AP///wAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAP///wD///8AAAAAABcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAD///8A////AAAAAAABAQEAAQEBAAEBAgABAgEAAQECAAMCAwABAQIAAgICAAICAgABAgEAAgICAAICAgACAgIAAgICAAICAgACAQIAAgICAAICAgABAQEAAAABAAABAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA//8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAA////AAAAAAAAAAAA////AAAA/wAAAP8AAAD/AAAAAAD+/v4AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAD/AAAAAAD///8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAQAAAAAA////ABcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAACAQEA/wAAAAAAAAABAQEAAAAAAP8A/wABAAEAAQABAP///wAAAQAAAQABAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAD/AAD/AP8AAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AACUmJwD///8AAQEAAP///wAAAAAAAAAAAP//AAAAAP8AAAABAAAA/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAD/AAAA/wD///8A////AP///wD///8A////AP///wD///8A//8AAP///wD///8A////ACwsLgAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAEBAAD//wAAAQEBAAAAAAABAQEAAQEBAAIBAgABAAEAAAAAAAEBAQACAQIAAQEBAAAAAAABAQEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAEBAQAB4dHwD///8A/v7/AP///wD///8A////AP///wD//wAA////AP///wAAAP8AAAD/AP///wD///8A////AAAA/wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//8B8AAA/wAA//8A////AP7+/wAAAP8AAAD/AAAA/wAAAAAA////AP///wAAAP8A////AP///wD///8A////AAcHBwA7PD0AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAA////AAAAAAD///8A////AP///wAAAAAAAAAAAAAAAAD///8A////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ2AA4ODgD///8A////AP///wD///8AAAD/AP///wD///8A////AP///wD///8A/v7/AAAA/wAAAP8A////AP7+/wAAAAHwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD98P//AAD/AP8A////AAAA/wD//wAA////AP///wD///8A////AAAAAAD///8AAAD/AAAAAAAAAAAAAAAAAAAAAAA1NDYALS0uAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDYANDQ0AP///wAAAAAAAAAAAAAA/wAAAAAA//8AAAAA/wAAAP8AAAD/AAAAAAD///8AAAAAAP//AAD//wAAAAAAAAAAAAAAAf7wAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAP///wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAEASkpMAAcHBwDMzMsAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAADQ0NgBDQ0QA//8AAAAAAAD///8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v4AAP8A/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAEJCRAAVFRcAxcXDAPLy8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAMtesjQAACAASURBVAAAAAAeHh8AOzs8AB0dHgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQH+8P//AAAAAAAA//8AAAEBAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAQAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAsLCwALS0sAOrq6gDy8vEA6enpAPHx8QABAQAA//8AAAAAAAABAQAA//8AAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAP//AAAAAAAAAQEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAD//wAAAQEAAAAAAQAAAP8A//8AAAEBAAD//wAAAAAAAAEBAAAAAAAA//8AAAAAAAAAAAAAAQEAAAAAAQD///8AAAAAAAAAAAAAAAAAAQEAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAQEAAP//AAABAQAAAAAAAP//AAAPDw8ADg4PABcXFwAWFhYA//8AAP///wAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAA//8AAP//AAABAQAAAAAAAAAAAAAAAAAA//8AAAAAAAABAQHgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//0A8P8B/wAAAAAAAAABAP//AAAAAAAAAAD/AP//AAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAA//8BABUVFgAVFRYAIyMkAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAD//wAAAAD/AAAAAQAAAP8AAAABAAAA/wD//wEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AP4AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA///+4QABAQD//wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQH/AP///wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAABAf8A//8AAAAA/wAAAP8AAQEBAP//AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAQEAAP//AAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gDxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/AD/AAH+AAAAAAAAAQEAAP//AAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAABAQAA/v4AAAAAAAAAAP8AAQEAAP//AAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAEA////AAAAAAABAQAA//8AAAAAAAABAQAA//8AAAEBAAD//wAAAQEAAAAAAAD+/gAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAABAQAA/v4AAAAAAAABAQAA//8AAAAAAAABAQAA//8AAAEBAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAABAQAA//8AAAEBAAAAAAAA//8AAAEBAAD//wAAAQEAAP//AAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEAAAD/AAAAAAAAAAEBAAAAAAAA//8AAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAEBAAD9AALgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP4A4P8C/wABAAAA//8AAAAAAAD+/wAAAQAAAP8AAAAAAAAAAQABAP8A/wABAAAAAAAAAAAAAQAAAP8AAAAAAP//AAAAAAAAAAAAAAAAAAD//wAA/wAAAAEAAQAAAP8A//8AAAAAAAAAAAAA//8AAP8AAAABAAAAAAAAAAAAAAD+/wAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAA/v8AAAEAAAAAAP8AAAAAAP8AAAAA/wAA/wAAAAAAAAD//wAAAQAAAP//AAD/AAAA//4AAAABAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQAAAP8AAAAA/wAAAAAAAAAAAQD///8AAAABAAAA/wD+/wAAAQABAP///wAAAAAA/wAAAAEAAQD/AP8AAQAAAAAAAAD//wEAAAD/AAAAAAD//wAAAAAAAP7/AAABAAAA/wAAAAD/AAAAAAAA//8AAAAAAAAAAAAA//8AAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAQAAAP//AAAAAAAAAAAAAP///wD/AAAAAAAAAAEAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAP//AAAA/vvwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAL/4AD/AQD/AAAAAAAAAAAA/wAAAAEA/wAAAAAA/wAAAAAA/wAAAAAAAAD/AAAAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD/AP8A/wAAAAEAAAD/AAAAAAAAAAEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8A/wAAAAAAAQD/AAAAAAAAAP8AAAAAAP8AAAABAAAAAAD/AAAAAAD/AAABAQAA//8A/wABAAAAAAAAAAAAAAAAAAD/AAD/AP8AAAABAAAAAAAAAAAA/wD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAA/wAAAAAA/wD/AAEAAAD/AAAA/wAAAAEAAAD+AAAAAQAAAAAA/wD/AAAAAAAAAAAAAAAAAAAB/wAA//8A/wABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wD//wAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEA/wD/AAAAAQAAAAAAAAD/AAEBAQAA//8AAAABAP8A/wAAAAEAAAAAAP8AAAAAAAAAAAAAAAAA/wACAQfPAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAPv90P8DAwAAAAAAAQEAAP//AAABAf8A//8AAAAAAAABAQAA////AAAAAAABAQAA//8AAAEB/wD//wAAAAD/AAAAAAABAQAA////AAAAAAAAAP8AAAAAAAAAAAAAAP8AAQEAAP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAABAQAAAP8AAP8A/wAAAAAAAQEAAP//AAAAAAAAAAD/AAAAAAABAAAA/wAAAAD//wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wABAQAA////AAEBAAAAAAAA//8AAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAEB/wD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAD/AAAAAAABAQAA//8AAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQH/AP//AAABAQAA////AAAAAAAAAAAAAAAAAAAAAAAAAP4AAAABAAAA/wAAAAAAAQEAAP7+/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAABAQAAAAAAAAAAAAD+AfvxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAUA4P/9/wABAQAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAP7+AAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAQAAAP8A//8AAAEBAAAAAAAA//8AAP//AAAAAAAAAQEAAP//AAABAQAA//8AAAEBAAD+/gAAAQEAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAQEAAP7+AAABAQEAAAD/AAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAQEAAAAAAAAAAAEAAAAAAP///wABAQAA//8AAAEBAAAAAAAAAAAAAAAAAAD//wAA//8AAAEBAAD+/gAAAQEAAP//AAABAQAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAD//wAA//8AAAEBAAABAf3QAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAJ+eod/+/v8gAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAIAANBhZGAxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP/8/rH/AQFvAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAEAAAAAAAEBAAD//wAAAAD/AAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQEAAAAAAAD//wAAAAAAAAEBAAD///8AAAD/AAAAAQABAQAA//8AAAAA/wAAAAEAAAD/AAEBAQD//wAAAAAAAAAAAAAAAAAAAQEAAAAAAAD//wAAAAAAAAAA/wAAAAEAAAAAAAAAAAABAQAA////AAAAAAAAAP8AAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAEBAAD//wAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAP4CANAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP0BALD///8AAAD/AAAA/wAAAP8AAAAAAAAAAAD///8A////AP///wD///8A//8AAP///wD//wAAAAD/AP///wAAAP8AAAAAAAAAAAAAAP8AAAD/AP///wAAAAAAAAD/AP///wD///8A////AP///wAAAP8AAAD/AP7+/wAAAP8A//8AAAAA/wD///8A////AAAAAAD///8A//8AAP///wAAAP8AAAD/AP///wD///8A////AP///wD///8AAAD/AAAAAAAAAP8AAAD/AAAA/wD+/v8AAAD/AP///wAAAP8AAAAAAP///wD///8A////AAAAAAAAAP8A//8AAP//AAAAAAAA////AP///wD//wAA////AAAA/wAAAP8AAAD/AP7+/wAAAP8A//8AAAAAAAD///8AAAD/AAAA/wD///8AAAD/AAAAAAD///8AAAAAAAAA/wAAAP8A////AP//AAAAAP8A////AP///wD///8A////AAAAAAD///8AAAD/AP///wAAAP8A////AAAA/wD//wAAAAAAAP///wD///8A////AAAAAAAAAAAA////AAAA/wAAAAAAAAAAAP//AAD///8AAAD/AP///wAAAP8AAAD/AAEB/rAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAND9/ADw////EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAA//8BAAAA/wAAAAAAAAABAAAA/wAAAAAA//8AAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AQAAAP8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAP8AAAABAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAEAAAD/AAAAAQD///8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAA//8BAAAA/wD//wAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAP7+AAABAQAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAA//4AAAABAAD//wAAAgAC4GJiYbEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAGFhYfD9/P6R////AP///wD///8A//8AAP///wD//wAA//8AAP//AAD///8A//8AAP///wD//wAA////AP//AAD///8A////AP//AAD///8A//8AAP///wD///8A////AP//AAD//wAA//8AAP///wD///8A////AP//AAD///8A////AP///wD//wAA//8AAP///wD//wAA////AP//AAAAAAAA////AP//AAD///8A////AP///wD///8A///+AP//AAD//wAA////AP///wD///8A////AP///wD//wAA////AP///wD///8A////AP///wD///8A//8AAP//AAD///8A//8AAAAAAAD///8A////AP//AAD//wAA/wAAAP//AAD//wAA//8AAP///wD//wAA//8AAP///wD///8A//8AAP///wD///8A////AP//AAD///4A//8AAP///wD//wAA//8AAP//AAD//wAA////AP//AAAAAAAA////AP//AAD//wAA////AP//AAD///8A////AP//AAD///8A//8AAAAAAAD///8A//8AAP//AAD//wAA//8AAP//AAD//wAA/wAAAP///wD///8AAAL9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAKgAv/9fwAAAQAAAP8AAQEAAP//AAAAAP4AAQEBAP///wAAAAEAAQH/AAAAAAD///8AAAAAAAAA/wAAAAAAAQEAAP///gABAQEA////AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAEBAQD///8AAAD/AAAAAAAAAAAAAAAAAP///wAAAAAAAQEAAAD/AAD/AP8AAQEBAP///wAAAAAAAAAAAAAA/wAAAAEAAAD/AAEBAQAAAP8A//8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAQH/AP//AAABAQAA////AP///wAAAAEAAQEAAP///wAAAP8AAAABAAAA/wAAAAEAAQAAAP8A/wAAAAAAAAD/AAAAAQABAAAA/wD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAA/wD//wAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAP8AAAABAAAA/wAAAAAAAAD+AAAAAQAAAAAAAQH/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEBAQD//wAA+vv6gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpaWHg/v//gQAA/wAAAAAA////AAAA/wD//wAA////AAAAAAAAAP8A////AP///wAAAP8A////AP///wAAAP8A////AP//AAD///8AAAD/AP///wAAAP8AAAAAAAAA/wD///8A////AAAA/wD///8AAAD/AAAA/wAAAP8A////AAAA/wAAAP8AAAAAAP///wD///8A//8AAAAA/wD///8A////AAAA/wAAAP8A/v7/AP8A/wAAAAAA////AAAA/wAAAP8A////AAAAAAAAAP8A//8AAP///wD+/v8AAAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8A////AAAA/wD///8AAAD/AP//AAAAAP8A////AAAA/wAAAAAAAAD/AP//AAAAAP8A/wD/AAAAAAAAAP8AAAAAAAAA/wD/AP8AAAD/AAAA/wAAAP8AAAD/AP///wAAAP8AAAD/AAAA/wAAAAAAAAD/AP///wAAAAAA////AAAA/wAAAP8A////AP//AAAAAP8A////AAAA/wD//wAA////AP///wAAAP8AAAAAAAAA/wAAAP8A////AAAA/wAAAP8AAAD/AAAA/wD///8AAAAAAP///wD/AACgaWlp4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgEkPkH/W8AAf8QAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wEAAAD/AAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AQAAAP8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAABAAAA/wAAAAAAAAAAAP//AAAAAAAAAAABAAAA/wAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wEAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAxPYaYwAAIABJREFUAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAA//8AAAABAuD///qBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZnFD+/f+vAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAEBAQD///8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAEBAAD///8AAQEBAP//AAAAAAAAAAD/AAAAAQABAQAA////AAAAAAABAQEA//8AAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAEBAAD//wAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAQEBAP///wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAQEA//8AAAAA/wAAAAAAAAABAAAAAAAAAP8AAQEBAP///wAAAAAAAAABAAIAA2BnamKhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXl5qQAP8Ab///AAABAQAA////AAAAAQABAQAA////AAAAAQABAAAAAAEAAP//AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAQEBAAAAAAD//wAAAAAAAAAAAAABAQAA//8AAAAAAAABAQAA//8AAAAA/wABAQEA//8AAAAA/wABAQEA//8AAAAAAAAAAP8AAAABAAAAAAABAAAAAAEAAAAAAAD///8AAAABAAAA/wAAAAEAAQEAAP///wAAAAEAAAD/AAAAAQABAQAAAAAAAP///wABAQEAAAAAAP///wABAQEA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAQEAAP//AAABAQAAAAAAAP///wABAQEA////AAEBAQD//wAAAQEAAP//AAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAQEBAP//AAABAQAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAgIAkWhpZnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlZWbzwEA/jAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQamtlMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+voEQQgH+c/+/gAgAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAOAA+fxRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJePlyD/BQG//v//IAAAAAABAQEA////AAAAAQABAQAA////AAAAAAABAQEAAAAAAP//AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAEBAQD///8AAAABAAAA/wAAAAEAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAAABAAEBAAD///8AAAABAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD/AAEBAQD//wAAAQEAAP//AAAAAP8AAQEBAP//AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAEBAAD///8AAAABAAAA/wAAAAAAAAABAAEBAAD//wAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAP///wAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAAAAAABAAEBAAD//wAAAgEA4AH7/0FpcWngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj5cgBgX/r///ATD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAP//AAABAQAAAAAAAP//AAABAQAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAAA//8AAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAA/wABAQEAAAAAAAAAAAAAAAAA//8AAAAA/wAAAAEAAQEAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAQEAAAAAAAD///8AAAABAAAA/wAAAAEAAAAAAAEBAAAAAAAAAAAAAP//AAAAAAAAAAD/AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgHQ+voHQXFxYfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJWRl5D+Af9vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/AZFrb2lwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSj5dgAAIAfwAA/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP/wBP4EYWpxZ7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABucWmg/f4AQf/+/6H//wAA////AP///wAAAAAA//8AAP///wD///8A////AP///wAAAAAA////AP///wAA//8AAAAAAAAAAAAAAAAA////AP//AAD//wAAAAAAAP//AAD//wAA//8AAP///wD///8AAAAAAAAAAAAAAAAA////AP///wD+/v8AAAAAAP//AAD///8AAP8AAAAAAAAAAAAA///+AAAAAAAAAAAA////AP///wD///8AAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAD//wAAAAAAAP///wAAAAAA//8AAP//AAD//wAAAAAAAP///wD///8A////AP//AAAAAAAAAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAP///wAAAAAA//8AAP7+/wAAAAAA////AP//AAD///8A////AP///wAAAAAAAAAAAP/+/YH9/gohanFnsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48gAAAFgAIBAj////0gAQEBAAAAAAD//wAAAQEAAP///wABAQEAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8AAQEBAAAAAAD//wAAAQEAAP///wAAAAAAAQEBAP///wAAAAEAAQEAAP//AAABAQAA//8AAAEBAAD///8AAQEBAAAAAAD//wAAAAAAAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAPAA//+R/gD8oHFxceAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj5ZQAAD+UAEBAC8A//8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+D//wOxAAD+sAAA/NBxcXHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48QAAAEMAAAAxD+/vswAgIAEAEBAh8AAAEQAAAAAAAA/iAAAAAAAAAAAAD/ABD//wAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAPAAAADwAAAAAAAAAAAAAALwAAAA8AAAAeAAAAAA//384QACAeAAAAjQAAD14HFxcfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9SsspAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//88yNiCVw1ogAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Clock.png b/arma/client/addons/phone/ui/_site/images/light/Clock.png new file mode 100644 index 0000000..359049a Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Clock.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Clock.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Clock.png.b64 new file mode 100644 index 0000000..184b79e --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Clock.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEUB0ImpkIAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPX19SD9/f0w/v7+HwMDAyAAAAAA/v7+IAAAABAAAAAQAAAAAAAAAAAAAAAQ////EAEBAf8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAD/AQEBAAAAAAH///8AAQEBAAAAAAD///8AAQEBAAAAAAABAQEA/v7+/wEBAQH/////AQEBAf///wABAQEA/////wEBAQAAAAAB/////wAAAAABAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAP////8AAAAAAQEBAQAAAAD/////AQEBAQAAAAAAAAAA/////wAAAAABAQEBAAAAAAAAAAAAAAAA/////wEBAQH/////AQEBAf////8AAADwAQEB8QAAAAD/////AAEA4QD/AAAAAADvAgIC4v7+/u8DAwPRAQEB8AwMDNDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ9PT0MP///1D+/v5PAAAAIAAAAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8BAQEB////AAEBAQAAAAAAAAAAAP///wAAAAD/AQEBAQAAAAD/////AAAAAQAAAP8AAAAAAAAAAAEBAQH/////AQEBAf///wABAQEAAAAAAP///wAAAAD/AQEBAf///wABAQEA/////wABAAEBAAEA/wD/AAD/AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAAAAQEBAf////8BAQEBAAAAAP////8AAAABAAAA/wEBAQH////QAAAA0AMDA7HNzc2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4IPj4+F8AAABwAAAAEAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAABAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP////8AAAAAAQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAQEBAAAA/wEBAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAD/AAAAAAEBAQH///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8AAAABAAAAAAAAAAAAAADgAAAAwAgICIHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQBDw8PBvAAAAgAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAA/////wAAAAABAQEBAAAAAAAAAP8AAAABAAAAAP////8BAQEBAAAAAAEBAQD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAD/////AQEBAQAAAAAAAAD/AAAAAQAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAEBAQD///8AAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAACgCAgIgcjIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwTwAAAJ////8QAQEBAAAAAAEAAAD/AAAAAf////8BAQEB/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AQABAQABAAD//v//AQEBAQABAAAA/wAA/////wEBAQEAAAAAAAAA/////wABAQEBAAAAAP////8AAAAAAQEBAf8A//8BAAEB/////wEBAQD///8AAQEBAAAAAAEAAAAAAAAA/////wABAQEB/////wEBAQEAAAAAAAAAAP////8AAAAAAQEBAf////8AAAABAQEBAAAAAP8AAAABAAAAAP////8AAAABAQEBAAAAAAAAAAAAAAAAAP////8BAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD/////AAAAAAAAAAABAQEAAAAAAf////8BAQEBAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAD///8AAAAA/wEBAQEAAAAAAAAA4AAAAIDQ0NChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCPAAAAsP///xEBAQEB////AAAAAAAAAAAB/wD/AAAAAAH/////AAEAAAAAAAAAAAAA/////wAAAAAAAAAA/////wAAAAABAAEB/////wD/AAABAQEB/wD/AAD/AAAAAAAAAQEBAf////8AAAAAAAAAAQEBAQEAAAAA/////wEBAQEBAQEA////AAEAAQH/////AQEBAQAAAAEAAAAA////AQAAAAD/////AAAAAQAAAAEAAAAAAQEBAf///wD/////////AAEBAQEBAQEB/////wEBAQEAAAD/AAAAAP///wD///8AAAAAAAEBAQEAAAD/AAAAAP//////AP8AAAAAAAEBAQEAAAAA////AAAAAAD/////////AP///wAAAAABAAAAAAAAAAABAQEBAQEBAQAAAAD///8BAAAAAAEBAQEAAAAAAAAAAP8A/wABAQEB////AAAAAAD///8A/wD/AAAAAAABAQEBAAAAAP///wAAAAD/AAAAAAAAAAAAAAAAAAAAIP///58uLi6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEPDw8L////8wAAAA/wEBAQEAAAAA/////wAAAAEAAAAAAQEBAP///wABAQEAAAAAAP////8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAQEA/////wABAAEA/wAAAQEBAP///wAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAAAA/wD//wIBAgH///8AAAAAAAEBAQAAAAAA/////wAAAAEAAQAAAQABAP///wABAQEAAAAAAP///wAAAAAAAAAA/wABAAEA/wD/AAAAAQAAAAAAAQAAAP8AAAEBAQAAAAAA////AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQEBAQD/AP8AAP8A/wEBAQH///8AAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAAAAAAAP8BAQEB////AAAAAAABAQEA/////wAAAAABAQEB////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAQEBAP////8AAAAAAAAAAQAAAAAAAAD/AQEB0QgICFHIyMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgg+Pj4v////yAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAABAAABAAEA////AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAP8AAQABAP8A/wAAAAABAQEB////AAAAAP8BAQEB/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAP////8CAgIB////AAAAAAAAAAAAGhoaAA0NDQAaGhoADQ0NAA0NDQANDQ0AAgIC//7+/gEAAAAA8/PzAPPz8wDm5uYAAAAAANnZ2QDz8/MAAAAAAAAAAAABAQEA/////wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAAAA/wAAAAABAQEB////AAAAAAAAAAAAAQEBAP7+/v8BAQEBAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wEBAeEICAhByMjI4AAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9PTwAAAAAAe3x7AAD/AP//Af8BAAAAAAD/AP8BAQEB////AP///wAAAAD/AAAAAf///wAAAAD/AQEBAf////8AAAABAAAA/wEBAQH///8AAAAAAP8A/wAAAQAB/gD+IQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///w8AAAABAAAAAAAAAAH/AP8AAAAAAAD/AAAAAQAAAQABAP///wAAAAABAAAA//8A/wABAAEA/wD/AAEAAQEAAQAAAP8AAQEAAQD///8A/wD//4aFhgFPT08AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAA0NDQAAAAAAAAAAABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPT08A/wD/AHx7fAEAAAAAAP8AAAAAAAH///8AAAAAAAAAAAAAAAABAAEAAAD/AP8AAAAB/v/+/wEAAQAAAAD/AQEBAf///wAAAAAAAAAAAQAAAAAA/wAA//3/HwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/SD/AP///wD/AAAAAAD//v//AAAAAP8A/wAA/wAA/v7+////////AP8AAAAAAQEAAQH/AP8AAQABAf8A/wD//v8AAAAAAP///wAAAAD/a2prAU9PTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE9QAGpqagAA/wAAAAAA////////////AAAAAP//////////AP8AAAAAAAH/AP//AQABAf8A/wH/AP8B/v/+AAAAAAD/AP8AAAAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAICAg8BAAEBAQABAP////8AAQAA/wD/AAEAAQD///8AAQEBAQAAAAEAAAAA////AP8A/wAA/wAAAAAAAAD/AP8AAAD/AAAAAAAAAABqamoBampqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpqagBdXV0AAAAAAQABAAEAAQABAAAAAAAAAAEAAQAB/wD/AP8A/wABAAEB////AAAAAAAAAAAAAAAA/////wABAAEA/wD/AAD/AAEBAQEAAQEBIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAH///8A/wD/AAEBAQEBAAEBAAAAAP8A/wAAAAAA/////wAAAP8A/wAAAAEAAAAAAAAAAAD/AAAAAAAAAAEAAAABAAAAACcnJwBqamoAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAFFRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAQAAAAAAAAAAAAEAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wABAAAAAAEAAQH/////AAAAAPPy8wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWtcwAAAAAACDxmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANbW1gD/AP8AAf8BAP8A//8BAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wH/AP8AAAAAAAAAAAABAAEBAQEBAePk4//z8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+tOzAP7x5gAFJUAABi1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vLyAPHy8QAAAAD/AAEAAAEAAQH///8AAAEAAAAAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAEA//////8A/wD/AP8AAP8AAAAAAADj4+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+8eYA+MSaAAAAAAAJRHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkAAAAAAAAAAAB////AAAAAAAAAQAB//7///8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AP8AAAAAAQEAAQAAAAAA/v/+/wD/AADW19YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5y6YA/vHmAAYtTQACDxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OXkAAD/AP8AAAAAAP8AAP8A/wAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAA/wAAAAAAAP///wAA/wAAAQABAQAAAAHX1tcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7x5gD5zKcAAg8aAAg8ZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMfIAP8A/wD///8AAAEAAAD/AAAAAQABAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAf8AAAAAAAAAAAAAAAD/AP///wD/AP8A/wDW1tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPjEmgAAAAAACDxmAAIPGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1tfWAAD/AAAAAAAA////AP8A//////8AAAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8A/wD//////wD/AP8A/wAAAAABAAAAAAAAAADV1tUA8vLyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+tOzAPrTswACDxoABi1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjIAAABAAEBAQEAAAAAAAEAAQEAAAD/AAAAAf///wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB/////wEAAQABAAEAAP8AAAD/AP/y8vIA1tbWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+MSaAAAAAAAJQ3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMgAAAAAAAAAAAD//v//AAAAAP8A/wABAAEB/////wEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8AAQAAAQABAf//////////AAAAAAABAAAAAAAAuru6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5zKYA/vHmAAYtTQAFJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8gCOj44A/wD/AQAAAAAAAAAB////AP//////AP8AAAAAAQAAAAAAAAAAAP8AAP8A//8AAAAB/wD/AP///wACAQLxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v3+8AAAAAEAAAAB/wD/AP8A/wAAAAAAAAAAAP///wAA/wAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAAAB5OTkAI6PjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+8eYA+MSaAAIPGgAIPGcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6PjgDj4+P/AAAAAP/+//8AAAAAAAAA/wAAAAEAAAAA/wD//wAAAAD///8AAAEAAAAAAAD/AP8AAAAAAAAAAAD+Af7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8AAP8AAP8A/wAAAQABAAAAAAAAAAEAAAAA////AJycnADHx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2rwAAADD/AP//AQEBAQD/AAD/AP//AQEBAf////8BAQEBAAAAAP///wABAQEAAAAAAAAAAAD/////AQEBAf///wABAQEA/////wAAAAEBAAH//wD/AQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAEBAQD/////AQEBAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP////8BAQEB////AAEBAQAAAAAA////AAAAAAABAQEAAAAAAP////8AAAAAAAAAAQEAAQD/AP8AAAAAAAEBAQAAAAAAAAAAAP////8BAQEBAP8AAAABAAD///8AAAAAAAAAAAAAAAD/AQEBAf////8AAAABAAAAAAAAAP8AAAABAAAA/wEBAQH///8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQABAP8A/wAAAAAAAAAA/wEBAQH///8AAQEBAP///wAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQAAAAAAAAAAAP///wABAQHQCgkKQeDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMVE5ACAQJvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAQEBAP////8AAAABAAAAAAAAAAABAQEA////AAAAAP8AAAABAQEBAAAAAAD//v//AAEAAAAAAAEAAAAAAAAAAP////8BAQEAAQEBAf///wAAAAAAAAAA/wAAAAABAQEBAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAQEBAP///wAAAAD/AAAAAQAAAAAAAAD/AAAAAQEBAQD///8AAP8A/wECAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAABAQEA/v7+/wIBAgH/AP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAD/AJDr6+txAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf297gLCgvhAQIBMAD/ABAAAQAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA/////wEBAQEAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAQABAAAAAQAAAAD/////AQEBAQEBAQEAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAAAAP8A/////wAAAAABAQEBAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAB/////wAAAAABAQEB/////wAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAf////8BAQEAAAAAAQAAAP////8AAQEBAQAAAAH/////AAAAAAEBAQAAAAABAQEBAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAQEBAQAAAADwAQABWevr65EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+ugCgkKQQEBAaEAAAAAAAAAAP///wEAAAAB/////////wAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAQEBAQAAAAAAAAD/AAAA/////wD/////AAAAAf///wD/////AAAAAAAAAAAAAAABAP8AAAAAAAAAAAAAAAAAAP///wD/////AAAAAAAAAAAAAAAAAAEAAQEBAQEAAAAA////AAAAAAEAAAAAAAAAAP///wD/////AAAAAAAAAAEAAAAAAQEBAQEBAQH///8AAQEBAQAAAAEBAQEA/////wAAAAD///8A//////////////8AAAAAAAABAAEAAAAB////AAAAAAAAAAABAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAEBAQEAAAAB////AAAAAAEAAAABAAAAAP///wABAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAQABAAAAAAABAIELCgsh6urqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAg9vb2gAABAD/+/v4fAQEBAQD/AAD/AP8AAQEBAP///wAAAAD/AQEBAQAAAAD/////AQEBAf///wABAQEAAAAAAP///wAAAAAAAQEBAP////8AAAABAQEBAAAAAP8AAAAB////AAAAAAAAAAD/AQEBAf///wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQEA////AAAAAAAAAAD/AQEBAQAAAAD///8AAAAAAAAAAAAAAAD/AAAAAQEBAQD/////AQEBAf///wAAAAAAAQEBAP///wAAAAAAAQEBAP////8BAQEB////AAAAAAABAQEAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAP////8AAAABAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD/////AAAAAQAAAP8AAAABAAAAAAAAAPACAwKRCggKoODg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNQAwMDUP8A/y8AAAAw/v7+/wIBAgEAAQAA/////wAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAQEBAAAAAAD/////AAAAAQEBAQAAAAAA////AAAAAP8BAQEB////AAAAAP8BAQEBAAAAAP///wAAAAD/AAAAAQAAAAAAAAAAAQEBAAAAAAD/////AQEBAf///wAAAAAAAAAA/wEBAQEAAAAA/////wEBAQH/////AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wABAAEAAAAAAAAAAAAAAAAAAAD/AQEBAf///wAAAAAAAAAA/wAAAAEBAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAIBAuD///+xAwMDsAgICNDg4ODwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAQ+Pj4MPv7+xADAwMw////D////yAAAQAQAAAAAAIBAiAAAAAAAAEAAP3+/RABAAEPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAPH/Af/wAwEDAAD/AAD////w////8P///+AAAwAAAwID4f/9/+D7BvvPEAUQ4eDg4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoAE8AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//1uAiqeY9hngAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Contact.png b/arma/client/addons/phone/ui/_site/images/light/Contact.png new file mode 100644 index 0000000..52827b1 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Contact.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Contact.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Contact.png.b64 new file mode 100644 index 0000000..08380d2 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Contact.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEzBAHqRZ0AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg3/jLQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQux1AAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrH2fwAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoDO/LgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgO3iIAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAGJAoCoAACAASURBVAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdeZgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqaKa/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARxt90QAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmimv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXXmYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpopr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV15mAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTZeIZAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//exGcD6jJ26wAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Contacts.png b/arma/client/addons/phone/ui/_site/images/light/Contacts.png new file mode 100644 index 0000000..89e75ef Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Contacts.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Contacts.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Contacts.png.b64 new file mode 100644 index 0000000..0269283 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Contacts.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxETAn0NxAoAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz8/PEBAGACD4AP4wAAD+IAIAAh8AAAAA/wL/IAH/ABD/AQIQAAAAAAAAAAAA/v8QAAH/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wHwAAIB8AAAAAAAAAAAAAD+4AAAAAAB/wDw/f8B4QEA/vACBAHQurrD8Pz8ANBxcXHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPz88QCAT8MP8CAlACAgFPAP/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvr7CAAABAAACAALQBAME0AAB+7FkZ3GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA18/HIAQKCF/9/P5wAAH/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvr7CAAICAgABAQEAAgICAAECAQADAwPgAQIBwP///4FhYWngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/PzxAMCgBv/f39gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv8DEAAEBAQADAgIAAgICAAICAgADAwMAAgICAAICAQACBAOgB///gVFZYeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnMUAkG/t/9/f2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAICAQACAgIAAgICAAMEAwAEBAMABQUEAAUFBQAEAgNgAAUHv7GuqV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADb2M2P//0ArwAB/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEAAQABAQEAAwMCAAQDAwAEBAQABAQEAAQEBAAEBQQABAUDIAMEAqC4tK+PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz8/PEAoH/b//AAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwsLGAAMDAwADAwMABAQDAAQEBQAFBQQAAgMCAAQDBAACAgIAAgICAAEBAQABAQEAAf8A0P0B/1FJSVHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXz8cgCQj/z/8AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAQEAAQICAAMDAgACAgIAAwMDAAMDAwADAwMAAwQDAAQEBAAEBAMAAwUDMAcDA7+/v68gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANfPxyABCAe/AP/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAABAQEAAgEBAAEBAQACAgIAAwIDAAMDAgAEBAMAAwICAAMDAgADAwMAAwMDAAEDAyABAAi/v7+vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHBa8A//4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAQAAAQEBAAEBAQACAgIAAgICAAECAgACAgIAAwMDAAICAwACAgIAAgICAAMDAwACAQEgBQEKvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA29jNj/8AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEAAQAAAQEAAAEBAAEBAQABAQEAAQIBAAIBAQABAQEAAQEBAAICAQACAgIAAgICAAICAgACAgIAAAIBMMTCu48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX1c1g/f7/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAABAAAAAAAAAQAAAAABAAAAAAAAAQAAAAECAgABAQEAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3DCv7xQAAAAAAAAAAAAy5jyUAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANfPxyABAgF/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAABAAEAAQAAAAAAAQEBAAD//wD/AAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA/+fv7+vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHA4AA//4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAABAAABAAEAAAD/AAAAAAAAAQAA////AAAAAAABAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8QBAIKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA18/HIAEAAl8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAP8AAAAAAAAAAAAA/wAAAAABAP8AAAAAAAAAAQEBAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBf7+/tyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEEPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAD/AAAAAAAAAAEBAQABAQAAAAD/AAEAAQAAAAAA/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAm+/v68QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAADZ0sxQAP/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAD//wAAAAAAAAAA/wAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///hAEAAwwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+BP5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAD/AAAAAAAAAAAAAP///wAAAQAAAAABAAAAAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+APtQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAC/wIvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAEBAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQJPAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAM/PzxD/AQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQD/AAAA//8AAP///wABAAAAAAAAAAAAAQD///8AAAABAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAgv7+vEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAgE/DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAQEAAAEBAQD//wAAAAAAAAEBAAABAQEAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAL/ARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAAAAAAAAAP///wABAQEAAAABAP7+/wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAD4MAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP4D/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAAAAAAEBAQD///8AAAD/AAEBAAAAAAEA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAP7+IAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAhAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/PwA9/f3APf29wD49vYA+vr6APr6+gD9/P0A/f39AAAAAAAAAAAAAAAAAAMDAwAGBwYAAwMDAAYGBgAICgoACQoJAAkJCQADBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAAAAAAAAAP///wAAAAAAAAABAP8AAAD/AP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAQMDHwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEB/x//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/MA9fP0APTz8wD08/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QD39vcAAAAAAAAAAAAA7e4AAAAAAAAAAAAMDQwACQkJABEUEwAJCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAABAAICAgABAQAA////AAEAAQABAAEAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8BABAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/PwA7OrrAO7t7QD6+foAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/QA9PP0AOvq6wAGBgYAEhQTABETEgAGBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AP///wD//wAAAAEAAAAA/wAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6ebnAP39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cAAMDAwAAAAAAAAAAAAAAAAD08/QA9PPzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OnqAAAAAAAAAAAAAAAAAAAAAAARExMABgcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/QA+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39AOvp6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDABEUEwAAAAAAAAAAAAAAAAAAAAAA8fDxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAD//wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0A8fDxAAAAAAAAAAAAAAAAAAAAAAAYGhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp5ucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABITEwAAAAAAAAAAAAAAAAAAAAAA7+ztAP39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx7/AA/f39AAAAAAAAAAAAAAAAAAsNDAAGBwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf29gD6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39wD6+foAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkKCQAMDQwAAAAAAAAAAAAAAAAA/f39APHv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8PAAAAAAAAAAAAAAAAAAAAAAABITEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf29wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOEBAAAAAAAAAAAAAAAAAAAAAAAPTz9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAD/AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wABAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/QAAAAAAAAAAAAAAAAAAAAAAAwNDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASFBMAAAAAAAAAAAAAAAAAAAAAAPLw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAQEAAAABAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf29gD9/f0AAAAAAAAAAAAAAAAACw0MAAYHBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/P0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMADA0MAAAAAAAAAAAAAAAAAP39/QD39vcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPTz9AAAAAAAAAAAAAAAAAAAAAAACQoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw0NAAAAAAAAAAAAAAAAAAAAAAD08/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAQAAAAAAAAD/AAD/AAAAAAEAAP8AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj29gAAAAAAAAAAAAAAAAAAAAAADxAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA0MAAAAAAAAAAAAAAAAAAAAAAD39vcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr6+gAAAAAAAAAAAAAAAAAAAAAACQoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQoKAAAAAAAAAAAAAAAAAAAAAAD49vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf29wAAAAAAAAAAAAAAAAADAwMAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYHBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAYHBgAAAAAAAAAAAAAAAAD6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QAAAAAAAAAAAAAAAAAGBgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAD9/f0A/f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wD/AP8AAP//AAD/AAABAAAAAP8AAAAAAAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vn6AAAAAAAAAAAAAAAAAAAAAAACBAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAMDQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQAGBwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgKCgAAAAAAAAAAAAAAAAAAAAAA/fz9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAABAAAA/wAAAAAA/wD///8A///+AAD//gD///8AAP//AP///wAA//8AAP//AP///wD///8AAP//AAD//wAB//8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f38AAAAAAAAAAAAAAAAAAAAAAAGBgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQXFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAD/AAAAAP8AAP//AAH//wAA//4AAP/+AAD//wAAUokm4QAAIABJREFU//4AAP//AP///wAB//4A///+AAH//wD///8A////AAD//wAB//8A///+AP///gD///8AAP/+AAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIUEwDs6eoA+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYAEhQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6+vkABgcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8yScAAAEAAAEAAAABAQEAAQD/AAABAAABAAEAAQD/AAABAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAApwAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAaHhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXGhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQAAAAEBAAABAf8AAQEAAAMBAAADAv8AAwIAAAMCAAAEAgAABAIAAAMCAAADAgAAAwL/AAMDAQADAgAAAwIAAAMC/wADAgAAAwIAAAQCAAADAf8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBAAFBcWAOzp6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQXFgASFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQEBAAIBAAABAf8AAgEAAAIBAAABAQAAAQD/AAEBAQABAP8AAAEBAAEAAAAAAAAAAP//AAABAAAAAP8AAAAAAAD/AAAAAP8A/wABAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx0cAPj29gD08/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJABgZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAQEAAAEB/wACAQAAAwEAAAIC/wACAQAAAQEBAAIA/wABAQAAAAD/AAEAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD//wA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39vYAAAAAAAAAAAAAAAAAAAAAAAUHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAQABAAEAAAACAQAAAgH/AAMC/wADAQAAAwEAAAICAAACAQEAAgEAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAP//AAD+/wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQcHAAAAAAAAAAAAAAAAAAAAAAD08/MACQoJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39vcAAAAAAAAAAAAAAAAAAAAAAAkKCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEBAAABAQAAAgEAAAIBAQACAgAAAwL/AAIBAAACAf8AAgEAAAABAQAAAP8AAAAAAAD/AAAAAQEAAAAAAAAAAAAA/wAAAAD/AP4AAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA0MAAAAAAAAAAAAAAAAAAAAAAD39vcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD18/MAAAAAAAAAAAAAAAAAAAAAAAwNDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQAAAAEAAAABAAAAAQH/AAEA/wACAf8AAgEAAAIBAAACAgAAAgEAAAMB/wADAQAAAwEBAAMCAQADAf8AAwH/AAMB/wADAgAAAgEAAAIC/wACAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA0NAAAAAAAAAAAAAAAAAAAAAADy8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08/QAAAAAAAAAAAAAAAAAAAAAAAkKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAEA/wAAAAAAAQABAAEBAAABAQAAAQH/AAIB/wACAAAAAQIBAAEBAQABAQAAAQH/AAEB/wACAQAAAQEAAAEBAAABAQAAAQEAAAIAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAwNDAAAAAAAAAAAAAAAAAD9/f0A9PPzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPTz8wD6+voAAAAAAAAAAAAAAAAACw0MAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAQABAQAAAAEAAAEBAAABAAAAAQABAAAAAAAAAAAAAgAAAAEAAAABAAAAAQAAAAEAAQAAAAAAAQAAAAEAAQABAAAAAQEBAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsNDQAAAAAAAAAAAAAAAAAAAAAA8fDxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/s7QAAAAAAAAAAAAAAAAAAAAAADxAQAAAAAAAAAAAAAAA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A6ObnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+rrAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGABgaGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEAAAAAAAAA/wAAAP//AAABAQAAAP8AAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAjIwAGBgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYAIycmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAD//wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYHBgAgJCIAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJCMABgcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAD/AAABAAAAAAAAAAD/AAABAAD/AAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCgoAGh4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0gHwAJCgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAP8AAAD/AAAAAAAAAAABAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhMTAAAAAADj3+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHSAfABIUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD///8AAAEBAP8AAAD///8A////AAABAQAA/wAA/wD/AAAAAQAAAP8AAQEBAP8A/wAAAAAAAAABAAD//wAAAQEA/wAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP8B8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABITEwAdIR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdIB8AEhQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAP8AAAAAAAAA//8AAP8A/wD/AAAA/gAAAP7/AAD+//8A/v8AAP4A/wD//wAA/f8AAP//AQD+/wAA/v7/AP//AAD+//8A////AP7//wAAAAHwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAIB8AD//xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASExMACQkJAODc3gD6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDACAkIgAMDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP///wD//wAA//8AAP7/AAD+/gAAAQEBAAEA/wAAAAEAAQD/AAH/AAAAAAAAAP//AAAAAQAAAP8AAAABAAAA/wAA/wEAAAAAAP7/AAD//wDwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQoKACMnJgD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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEBAAABAQABAgEAAQECAAACAQABAgAAAAEBAAABAQAAAAAAAAEAAAIAAQAAAAAAAAD/AP8AAAABAAAAAAABAAAAAAAAAAAAAAD/AAH/AAD/AAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD+4QEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBoZABITEwDo5ucA7+3tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAUFxYAFRYWAAMEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAEBAQABAQEAAAMBAAECAQABAgEAAAEBAAABAQABAQEAAAEAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAD/AAAAAAAAAAAAAQAAAP///wAD/v/xAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYHBgAeIR8AGBoZAPHw8ADs6eoA+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAFBcWABUWFgADBAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAQEBAAACAQAAAgEAAQIBAAECAgABAwEAAAEBAAECAgAAAQAAAAEAAAEAAQD/AP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAH//wACAf7gAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP4B4AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgcGABUXFgAVFxYA9PPzAO7s7gD18/MA+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAERMTAA8RDwAMDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAAAAgEAAAIBAAADAQAAAgEAAQICAAECAQAAAQEAAQEBAP8A/wABAAIAAAAAAAABAAAAAAAAAP8AAAEBAAD//wAAAAD/AAD/AQAA/gTwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAC4AAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA0NAAwNDQAAAAAA9PPzAPf29wD08/MA+vr6APj29wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHBgAMDAwACQoKAAkKCQAMDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEAAAABAQABAQEAAQEBAAECAQABAgIAAAIBAAACAgABAgEAAAEAAAIAAgD/AAAAAAD/AAAAAQAAAAAAAAAAAAAAAAABAAAAAAD/AAD/AAD9BgTPAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/voC0AMH/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA0NAAwNDQAVFxYAAAAAAAAAAAD39vYA/f39APr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAGBgYAAwMEAAMEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEAAQAAAQEAAAIBAAEBAQAAAgEAAQICAAECAQAAAgEAAQEBAAABAAABAAAA/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAD//wAF/gDxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA+gAA4AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAQAAAAEBAAABAQABAQEAAQIBAAACAQABAgEAAAEBAAAAAAABAAAAAAAAAAEAAQD/AP8AAQAAAAAAAAD/AAAAAAEAAAD/AAAE+QzQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAMTEx8AABAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAABAQAAAQAAAAEAAAEBAQABAQEAAQEBAAECAQAAAQEAAQEBAAABAAABAQEAAAEBAAABAQABAgEAAQEBAAADA9CwMZDwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/7EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQEAAAABAAAAAAD/AAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAQA/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP/+/rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAD/AAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAPv/AbAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAPj8BNAA/wHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAD/AAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv//4LYonLEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAADExMfD/AP6RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACf4DgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKTng////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAEAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAGgqCmY4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+PoEkAD/AfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/lpfmQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAQAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/+AB/gOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTEx8AH9/2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAABAAEAAAEBAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICwKZjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcuNLAA/wGRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAD/AAAAAQAAAAAAAAD/AP8AAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/v//kbUnnaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKzNwAf8A0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP8AAAEBAAAAAAAAAAAAAAEAAAD/AAAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAQHQtiidcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9voDQQABAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wEAAAAAAAAAAAD/AAAAAAEAAP//AAAAAAAAAAABAAAAAAABAAEAAAEAAAAAAAAAAAAAAAAAAP8A/+AE/QNRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTEx8P8A+UEAAQLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA//8AAAAAAAABAAAAAAAAAAAAAAAAAP8AAAAAAAEAAAAAAAAA/wD/4AX+BUGwKZjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpOeD/APlBAf8A0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAQAAAAEAAAD/AAAAAAD/AAAAAAAAAAAAAP8AAP8AAAAAAQHQBfYNMbApmOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKTngAAAAMdjVzZAAAf9vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAAABAAAAAAEAAP8A/wACAAAAAAAAAAAAAAD/AAAAAQAAAAD//5G0J5xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgrM3D//wFhAAEC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAAAAAD/AP8AAP8AAAAAAQD/AAAAAAABAAAAAAACAf/wAQECUbQonXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKzOg/wD5Qf8B/qEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAH+AIED9w4hsyeasAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX18cgAAADgAEABD8A//4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABq5YUAAQMCAAEDAgABBAIAAgQDAAMFBPACAQKRBAAIoLAxmOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKTngAAAAYAAAAADZ0sxQ/gX+UAL+Ai//AQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/AeD/AAKxBf4CsAQBAtCwMaDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPz88QCAT8MAL/ARD+A/8w/wACEAMB/x//AQAQAAAAAAAAAiAAAAAAAAAAAAD+/xAAAf8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AfAAAgHwAAAAAAAAAAAB/v7w/wIA8AH+AeAAAAAA/gD+4QAAAuBu6ojQCwAL4LBBoPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADqFTu6AAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//+tWMyVNPQboAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/HangUp.png b/arma/client/addons/phone/ui/_site/images/light/HangUp.png new file mode 100644 index 0000000..3d62102 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/HangUp.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/HangUp.png.b64 b/arma/client/addons/phone/ui/_site/images/light/HangUp.png.b64 new file mode 100644 index 0000000..b34078d --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/HangUp.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEgGpoKOWwAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAktiQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BAAAAAAAAAAA/v7+BAAAAAAAAAAA/v7+Av7+/gIAAAAAAAAAAP7+/gQAAAAAAAAAAP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+DwAAAAEAAAD1AAAABAAAAAoAAAD+AAAAhgAAAPAAAAAEAAAAEQAAAPIAAAD3AAAAEgAAAAAAAADuAAAACQAAAA4AAADvAAAA/AAAABP1/vb6AQECtQsBCMD/AAD8AAAACwAAAP8AAAD1AAAACwICAvEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AQICAv8AAAAA/v7+DAAAAC4AAAD9AAAA8AAAAAsAAABCAAAAYQAAAAIAAADwAAAABwAAAA0AAADwAAAANAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAH9AP4AAgAB7AEAAeIAAAD6AAAAEAAAAP4AAADxAAAA9gAAAG0AAAAOAAAAAvf/+O/8//0FDwQN0wAAAADs/O8BFAQR/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gsCAgL1/v7+cAAAAPYAAAAPAAAALQAAAFgAAAD/AAAA9QAAAAcAAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAOAAAAAfz//fX+AP7zBgEFhP8A/xD0/vYHAwEDpAsBCeUBAgH6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+DwAAAA8AAAAJAAAA/QAAAJcAAADyAAAAUgAAAPwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAT8//wAAwEDzwEAAe4AAACmAAAAuwAAAPICAgLxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4DAgIC/f7+/j8AAAAQAAAAXwAAADsAAAAJAAAA7wAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAA8gAAAMYAAACg/gD+APX+9hIGAQWmCQMJ+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+FwAAAPIAAACAAAAABwAAAFkAAAASAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/wD///z//AUFAQWPAAAAewAAAA4CAgLpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4DAgIC/f7+/kYAAADyAAAAmAAAAPwAAAAzAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAAQAAABoAAAADgICArry/PMDDgQN/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBqwA0AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6/ntDRQGEgf///92AAAA9wAAAHoAAAD0AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAADP4A/4b2/vYJBgEFjwgDCOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4/PhT+v/7eQsDCvsBAAE4AAAA/gAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP78//0CBAEDuf0A/mj2/vcPDwQN0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/lIAAACb/gD+EgIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4A/uX7//wKBgEFZAMCA64AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+UgAAAJsAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAOAAAABAAAAPMAAAADAAAACwAAAPcAAAD5AAAADQAAAAAAAADw/wD/IAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7gAAAGUCAgKuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5SAAAAmwAAABIAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAs0AAACrAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzAAAA8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgcUDQsDCgMCAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/APb++PPs/O/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAlf7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4C////ZwEAAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB/AMAAqoGAgX0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCOAAAAeQAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+wICAvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgL+AAAA8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAhQkECIUPBA3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQL/AAAAugAAAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC//+/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9gAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA+v7+/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6wAAAM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/H/b/9ycAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9//7/9v747gICAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIC5gAAAKUAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/QD+Kv4A/kvz/fQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0/v/+7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzI6+JQAAIABJREFUAAAABAADsP0A/o0NAwz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBArcOBQysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICrAAAALcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDgEMBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj+/v4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av8A/wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2AAAA+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgKcAAAArgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAApAAAAG0CAgL6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P3yCfb++Az+AP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPoAAAC4AgIC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4JAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAA/gAAAAL9//74/gD+/QUBBJcAAAAKAAAAeQICAvIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQQP9fn9+oACAAJg/wD/C/z//FQFAQX+AAAA+gAAAAgAAAD+AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsAAACqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP99AINAwz+AAAAAPP99SIBAAEGCgEIDwAAAPcAAAD1AAAAEgICAssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA70pVfAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0Pt08AACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQ+3TwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D7dPAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//+PRzw7M4sYoAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Mail.png b/arma/client/addons/phone/ui/_site/images/light/Mail.png new file mode 100644 index 0000000..dc434c5 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Mail.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Mail.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Mail.png.b64 new file mode 100644 index 0000000..61caf56 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Mail.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEUFbGf1woAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIDfEPXqBSAGAAMw/wACHwEBACAAAAAA/gH/IAL//hD+/wIQAAAAAAAAAAACAQAQ////EAAAAv8AAf4BAP8AAAAAAAD/AAH/AQD/AQAAAAAAAAL/AAEAAAD//gEAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAABAQEA/v8A/wEA/wH/AAH/AQD/AQAAAAAAAAAA/wAB/wEAAQAAAP4B/wAB/wEAAQAAAf4BAP8AAAAAAAD/AAH/AQD/AQABAAAA/wAAAAAAAP8AAf8AAAAAAQH/AQAAAAAA/wL/AAH+AQAAAAAAAAAAAP8B//8AAAABAf8BAP8AAAAAAAAAAAAA/wAB/wEA/wH//wH/AQL/Af//Af8CAP/w/v8B8QEBAAD/AgD/AAAA4QD9AAABAQDvAQD84v8ABe8A//nRAgMB8AQU/NDggCHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAggN8Q/PAIMAD8/1D9/gJPAQH/IAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAf8BAP8BAAAAAAAAAv8AAP4BAAAAAAAAAAAAAAAAAQEBAP///wAAAAL/AQD/AQABAAD//wD/AAD/AQAAAv8AAAAA/wD/AAEA/wH//wH/AQH/AQAAAAABAQEA/wD/AAD/AAAAAAL/AAD+AQAAAAAAAAAAAAAC/wAA/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAf8BAP8BAAAAAAAAAv8AAAAAAAD+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv8AAAAAAAD+Af8AAf8BAP8BAAAAAP8AAf8BAP8B/wAB/wEA/wEBAP/QAAAD0P8B/bHmlBqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHDnIPr8Al8BAP9w/wD/EAEAAQD/AAH/AAD+AQAAAAAAAAAAAAAAAP//Af8CAQAB/wD/AAAAAAAAAAL/AAD+AQAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wAAAAAAAf8A/wAAAQL/Af/+/wAAAQAAAAAAAAAAAAAA/wL/AAEAAAAA/gEAAAAAAAAAAAD/AAAAAQAAAAABAP//Af8BAf4BAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//Af8BAf8B//8C/wIB/wH/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAABAAEAAAAAAP8A/wAAAAL/////AAEB/wEA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/Av8AAf4BAAAAAAAAAAAAAgHgAf0BwAUF/oHgkBngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCA3xD67AxvAAH8gAAAAAAAAAAAAP8AAAABAAABAAEA////AAABAAAAAAAAAP8C/wAAAAAAAAAAAAD+AQABAQABAAAA////AAABAAAAAAAAAAAAAAEAAQD/AP8AAP8AAAABAAABAAEA//8B/wAA/gEAAAAA/wAB/wAAAQACAf8B////AAAAAv8BAf8B/wAAAP//AP8BAf8BAP8AAAEBAQD/AP8AAAAAAAAAAAAA/wL/AAH+AQEAAQD//wH/AAAAAAAAAAAAAf8BAAD/AAAAAAAAAAAAAP8AAAABAAAA/wAAAAEBAAD//wAAAAL/AAH+AQEAAQD+/wH/AgH/Af8A/wD//wL/AQH+AQD/AAAAAAL/AQH/AQAAAAD///8AAAAAAAABAAAA/wL/AQH/Af///wAAAQAAAAAAAAEAAQD/AP8AAP8C/wAAAAAAAf4BAP8C/wAA/gEAAQAAAP8C/wAB/gEA/wAAAAAAAAABAAAA/wL/AAH+AQAAAAABAAKgBQP+geCQGeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHXHoT/78AZ//AAAQAAAAAAAA/gEAAAL/AAH/AQD/Af8AAP4BAAAC/wAA/gEAAAAAAAAAAAABAQAAAAAAAP//AAEBAQD//wH/AQH/AQAAAAD//wH/AAD/AQEBAAD///8AAAAC/wAA/gEAAQEAAP8B/wAAAAAAAP4BAAAAAP8AAv8BAAAAAAH+AQD/Av8AAP4BAAAC/wAAAAAAAAAAAAAAAAAA/wEAAP8AAAAC/wAAAAAAAP4B/wAC/wEA/gEBAQEA/wD/AAD/Av8AAAAAAAD+AQAAAv8AAP4BAAEBAAD/Af8AAP4BAAAAAAAAAv8AAP4BAAAAAAAAAAABAQEA////AAAAAv8AAP4BAAEAAAD/AAAAAAAAAAAAAAAAAAD//wL/AgL/Af///wD//wL/AQEAAAAAAAAAAAAAAAD/AQAAAf8AAP4BAAAAAAEAAQD/AAH/AAD+AQABAQAA//8AAAAAAAAAAAD/AAL/AQH/AQD//wAAAAAAAAAC/wAA/gEAAAAAAAIB4AT/AoDikhahAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdcOqP/f7+cAAA/wAAAAEAAAAB/wAA/gEAAAEAAAD/AAAAAAAAAAL/AAAAAAAA/wEAAP8AAP8C/wAB/wEAAAAAAAAB/wEB/wH//wAAAAAB/wEB/wH//wAAAAD/AAEAAQD/AAAAAQAAAP8AAf8BAf8B//8AAAAAAAAAAAAAAAAB/wAA/wEAAAL/AAD9AQAAAQAAAAH/AQD/Af8A/wAAAAL/AAD+AQAAAQAAAAH/AQD/Af8A/wABAQEA//8AAAAA/wAAAAL/AAD+AQEBAQD//wAAAP8B/wAB/wEAAAH/AAD+AQAAAv8AAP4BAAAAAAAAAQAAAAH/AAD/AQAAAf8AAP4BAAABAAAAAAAAAAAAAAD/AAAAAQD//wH/AQH+AQAAAAAAAAAAAAABAAAAAAAAAP8AAQEBAP//Af8AAP4BAAABAAEAAAD/AAAAAAD/AAAAAAABAAEA/wD/AAAAAQAAAP8AAAAAAAEBAQAAAAAAAAAAAP///wD//wL/AAAAAAEB/wEAAP8AAAAAAAAAAv8BAgGR5ZAWcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIDfEPvwB7///wEwAP8C/wEB/wH/AAAAAAAB/wD//gEAAQAAAQABAP8AAAAAAAAAAQAAAP//Af8AAf4BAP8C/wAB/gEAAAAAAP8C/wAB/gEBAAEA/wAB/wAA/wEAAAAAAQAAAP8A/wAAAAEAAQAAAP8AAAABAAAA/wAAAAAAAAAA//8A/wAC/wIB/wH/AAAAAP//AAEBAQAAAAAA/wAB/wAA/wEAAAAAAQEBAP///gABAAEA/wAAAAAAAAAAAP8AAAAC/wAA/wEA/wH/AAH+AQAAAQAAAAAAAAD/AAEAAQD/AAAAAP//AAABAv8AAAEAAAD+AQD/Af8AAAAAAAH+AQEAAQD/AAAAAP8B/wEB/wH/AAAAAAAAAAAAAAAA/wH/AAH/AQAAAAAAAP8AAAAAAAD/Av8AAf8BAP//AAAAAAAAAQEAAP8B/wAAAAABAf8B/wD/AAAAAAAAAAEAAAD/AAAAAAAA/wL/AAH+AQD/Av8AAP4BAAEBAAAAAAAA//8AAQEBAP//Af8AAAAAAAD+AQABAQAA/wH/AQIA0QUI/lHgiBngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgeOcg+vgBvwAAACAA/wH/AAD/AQAAAAAAAQL/AP//AAAA/gEBAQEA////AAEBAQAAAAAA////AAAAAQAAAAH/AAH/AQD//wAAAQEAAP8C/wEB/gH//wL/AQH+Af//Af8BAf8B//8B/wAAAAABAf8B//8AAAAAAf8BAf8B//8C/wAB/gEAAAAAAP//AAAAAv8AAP4BAAEBAAD/AAAAAQAAAQAAAP//Af8BAf8B/wAAAAD/AAAAAP8AAQEBAP//Af8AAP8BAQEAAP8AAAAA/wH/AAAAAAAA/gEAAQEAAP//AAAAAQABAQAAAAAAAP///wAAAAAAAAAAAAAAAQABAQAA/wAC/wD//QEAAAAAAAEBAAD/Av8AAf4BAP8B/wAA/gEBAQEA////AAABAQAA//8AAAAAAAAAAAABAQEA/wAAAAAAAAAA//8AAAEBAAD/Af8AAP4BAAAC/wAAAAABAf8B////AAAAAQAAAP8AAQEBAP//Af8AAP8BAQEAAP//Af8AAP4BAQEBAP//AAAAAQAAAP//AAAAAv8AAP4BAAAD/wEB/uEFCP9B4IgZ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACB45yD6+AG/AQAAIP8AAAAAAAAAAQEAAP//Av8AAP4BAQAAAAABAAAA/wAA/wAAAAAAAAAAAP8AAQABAP8AAf8AAP8BAAAB/wAA/wEAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAB/wAA/wEAAAAAAAAAAAAAAAAAAAH/AAD/AQEAAAD/AAAAAAAAAAAAAv8AAP4BAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAL/AAD/AAAA/wEAAAL/AQH+Af//AAAAAP8AAAAC/wEB/wH///8AAAABAAEAAAD/AAAAAQEAAAD/AAD/AAAAAAAB/wEA/wH/AP8AAAABAAEAAAD/AAAAAAAAAAAAAAABAQAAAP8AAP8AAAAAAAAAAAAAAAEBAAD//wH/AAD/AQAAAf8AAAAAAAD/AQAAAAABAQAA//8AAAEBAAAA/wAA/wAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAH/AAD/AQEAAAD/AAAAAQEAAP//AAAAAAH/AQH/Af//Av8AAP8AAQH/Af//AAAAAAAAAAAB/wAA/wEAAADgBhD3MeCAIfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv4/68AAQIf/wAB/wEBAQAAAQAAAAAAAAEB/gEBAQAA/wEAAP8AAf//AQAAAAEC/wAAAf8AAQEA/wEAAAECAAEAAP8AAAH/AQAAAf8AAQAAAAEC/wABAAD/AAH/AAEAAAEBAAAAAQAAAQH/AQABAAAAAQAAAAEAAAEBAAAAAf8BAQEAAAABAAABAQEAAQIBAAAA/wAAAQAAAQEAAP8BAf//AAH/AAEAAAABAv8BAf4BAAH/AQABAAAAAf4B/wAAAAEBAAAAAQL/AAH/Af8AAAAAAQEAAQEAAAACAQAAAQAAAAAAAP8BAAAAAQAAAAH/Af8BAAABAQEAAAAB//8BAAABAQAAAAAB/wEBAAAAAAAA/wEB/wABAAAAAQL/AQEAAP8AAAAAAQEAAAAC/wAB/wEBAf8BAAEB/wABAAD/AAAAAQIBAP8AAAAAAQAAAAEAAAABAAAAAQAAAAEBAAEBAAAAAQAAAQEBAAABAAAAAP8BAAEAAAABAAABAQAA/wAAAAECAAAAAAAA/wD/AAEB/gEAAf8B/wAAAAABAv8BAQAAAAH+AQABAAAAAQIf+/EKvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHXLqj/8BBC8BAf8BAAH/Af8BAf8AAQAA/wAAAP8BAAD/AAAAAQEAAAAA/wEAAAH/AQH+AQEC/wEBAQAAAQEBAP8A/wABAgEAAAEAAAEC/wEBAQAAAQH+AQEBAQABAf4BAAAC/wABAAAAAQAA/wAAAAABAAABAQAAAAAB/wABAAAAAQAA/wEAAP8AAv8AAf8A/wD/AAABAAAAAAH/AAEAAAAB/wEAAQEA/wAB/wEB/gH/AQL/AAAAAAEBAAAAAAL/AQEAAP8AAv8AAf8BAAEAAAAAAf8AAQL//wEAAP//Af8AAAAAAAEBAAABAAABAQAAAAEAAAABAAD/AAH/AAEBAAEBAAD/AAH/AAL/AQABAQD/AAL/AQH/AQABAAAAAf4BAAEAAAABAAABAf4BAQL+AQEBAAAAAQAAAQH/AQAAAv8AAAAA//8A/wAAAv//AAH/AQEAAAAAAf8AAQAAAAEAAAABAAABAQAA/wAB/wEBAAABAgAAAAAC//8BAAD/AAH/AQEAAAAAAAAAAv8BAAAC//8AAAAAAQAAAAEAAAAB/gH/AAH/AQEBAAEBAAABAf4BAAH/MBty648AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAec+pf/f/+oP8AAv8AAAAAAQD+AQABAAD//wAAAAAB/wEBAAH///8AAQEAAP//AAAAAAAAAAAC/wAA/gEAAQAAAQABAAAA/wD//wAAAAAAAAEBAAAA/wAAAAAAAAABAQD//wH/AAD/AAAAAQAAAP4BAQEAAP//Av8AAAAAAQH+AQAAAAAA/wAAAAEAAAAAAAAAAAAA//8AAAAAAAAAAAL/AAD+AQAAAv8BAP4BAAEAAAD/AAD/AAAAAQAAAP8AAAABAQEAAAD/AP//AAAAAAAAAQEBAAAAAAD///8AAQAC//8A/gEBAAAAAAEBAP///wAAAAL/AQD+Af8AAf8BAf8BAAAAAP//AAABAAAAAAEAAAD/AAD/AAL/AQD+AQABAAAAAAAA//8AAAEAAAAAAAAA/wAB/wAA/wEAAAH/AQH/Af8AAAAA/wL/AAD+AQEAAAD/AAH/AQH/AQAAAQAA//8AAAEBAAAAAAD//wD/AAABAAAAAAABAP4BAAEAAP//Af8AAP8BAAAAAAAAAAAAAAAAAAAAAAD/Af8BAv8BAP8AAP8AAv8AAP4BAQEAAP//AAABAAAAAAEBAP///wAABP5R5ooasAAAAAAAmuHqcwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACB45yD7+wG/AAAAIAAAAAD/AAAAAQEBAAD//wD/AAAAAQAAAAAAAAAAAAAAAAAAAP//Av8BAf4BAAEAAP//Av8AAAAAAAD+AQAAAAABAAAA/wAC/wEA/gH/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAL/AAD+AQEAAQAAAP8A/wAAAAEBAQAAAAAA//8B/wEA/gEAAAAAAAAAAP8AAAAAAAAAAQEBAAD//wAAAQEA//8B/wEA/wEAAP8A/wAAAAAAAAABAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAA/wAAAAAAAv8BAP4B/wAC/wEA/gH/AAAAAQAC/wAA/gEAAAAA/wAC/wAA/gEBAAAAAAEBAP///wABAQEAAP//AAAAAAD/AAAAAAAAAAEAAQAAAP8AAAAAAP8AAv8AAP4BAQAAAP8AAAAAAAAAAAAC/wEA/gH/AAAAAQAAAAAAAAD/AAAAAQAC/wAB/wEAAAAAAP//AP8AAAABAAAAAAAAAAAAAAAAAQEA////AAAAAAABAAAA/wAB/wEAAAEAAP8AAAAAAP8AAAAAAAL/AAAAAAAAAAABAP4B/wAAAAEAAAAAAgHvBQv2IuCAIfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv8AIAAAQEgAAEBAAABAAAAAQAAAAD/AP8BAAABAQL/AAEAAP8AAAD/AAAAAAEC/wAC/gEAAQAAAAAAAAAB/gEBAf4BAQEAAAAAAv8AAQAAAAAAAP8AAAAAAQAAAAEAAAABAAD/AQAAAAEAAAAAAv8BAf4BAAAC//8AAf//AQAAAQEAAAAA/wAAAAAAAQH+Af8BAv8AAQAAAAEC/wECAQAAAAL/AAAAAP8BAAAAAP8AAQH+AQACAAAAAQAAAQEAAAEBAAD/AAH/AAEB//8BAAAAAQEAAAEAAAACAQAAAQEAAAEAAAEB/wEAAQAAAQEAAAABAQAAAQL/AAH/Af8BAv8AAQEAAQH+AQABAv//AAAAAAAB/wAAAv//AAH//wEC//8BAAABAQEAAQEBAAAB/wAAAQAA/wEAAAAB/gEAAAL//wEAAAEBAAAAAQAAAQH+AQABAAABAQEA/wEAAAABAAABAQEAAAH+Af8A/wD/AP8AAAEAAAAAAAAAAQAA/wAAAP8BAAD/AAH/AAEAAAEBAQD/AQL/AQH/AQAB/wAAAQAA/wEAAAEBAAABAf4BAQH/AQEB/gEAAQAAAQIBAP8BAAAA//8R/PQIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHjnIPv9At////8AAAAC/wEB/wH//wH/AQH/AQAAAAAAAAAAAAAAAAD//wD/AQAAAP8AAAAAAv8AAP4BAAAC/wAA/gEAAAL/AQH/Af//Af8BAP4B/wAC/wAA/gEAAAAAAAAC/wAAAAABAf8BAAD/AAAAAAAAAAL////+AQEBAv///wAAAAD+AQAAAAAAAAAAAQEC/wAA/wEAAP8AAAABAP///wAAAAL/AQEBAP///QEAAAAAAAAAAAAAAv8BAf8BAAD/AAAAAQD//wH/AAAAAAEB/wH///8AAAAAAAEBAQAAAP8AAAAC/////gEBAQEAAAD/AP//Av8BAf8BAAD/AAAAAQAAAAAAAAAB/wAA/wH/AAH/AQD+AQAAAAAA/wAA/wAC/wEB/gEAAAAA//8AAAEBAv8AAP8B//8B/wAAAAAAAP4BAQEAAP8AAAAA/wL/AQH/AQAA/wD//wAAAQEAAAAAAQD/AAH/AQD/Af//Af8BAf8B////AAEBAAAAAAEAAAAAAP///wAAAAL/AQH/Af///wABAQEA//8B/wEB/wH//wH/AAAAAAAB/gEA/wAAAQEAAP//Av8BAf8B//8B/wEB/gEAAAAAAP8AAAUE/yHgiBngAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/0Cf/8AAf8BAQEAAQH/AQAA/wABAf8BAAEAAP8AAf8AAP8A/wAB//8BAv8BAAEAAAEC/wABAAABAgEAAAEAAAEBAAAAAQAAAAAB/wEB/wEAAgEAAAEAAAECAQABAQAAAQH/AQABAAAAAQAAAAEBAAAAAAD/AAAAAAEC//8AAAABAf4BAQEAAAABAAABAQAAAQH/Af8AAf8AAQEA/wD/AAECAQAAAQAAAAD+AQEBAQABAQL/AAEC/wEC/wEAAAL//wAC//8AAf8BAf8BAQH+Af8A/wABAgEAAQEBAAABAAAAAAEA/wAAAAEBAQAAAAAA/wAC/wEC/wEAAAAA/wAAAP8AAf//AP8A/wAAAAAAAAAAAP4BAAEBAP8AAv8AAQEAAQL/AQABAQD/AAAAAQEBAAAB/wH/AP8AAQH+AQAB/gEBAQAA/wAC/wAAAv8AAf4BAAAAAP8AAv8AAQAAAAABAP8A/wABAf8B/wD/AAAB/gH/AAH/AAEC/wAAAQAAAQAA/wD/AAECAQABAf8BAAEAAAECAQABAQAAAAEAAAABAAAAAQAAAAH+AQEAAAABAgEAAAAD/wABAAAAAAAAAQH/AQAAAAAAAAEAAAEAAPz8AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wL/QAEB/wEAAQAAAAEAAAABAQAAAQAA/wD/AAEBAQAAAQEAAQH/AQEBAQD/Af8AAQH/AQEB/wH/AAH/AQH/AQABAQABAf8BAAH/AQABAf8AAAAAAAAAAAAAAAAAAQL//wEB/wIC/wEAAAAAAAAAAAABAQABAf8BAQH/AQEB/wH/AQAAAAEBAAEBA///AQAA/gAB/wEB/wH/AP8AAQED/wAAAAAAAQAA/wEB/wABAAAAAf8BAAEAAAAAAAAAAf4BAAEAAAEB/gEAAQAAAAEAAAEBAQAAAAAAAAEAAAAAAAD/AQH/AQH/AQABAAD/Af8AAQH/AQAAAAAAAQAAAAAC/wEB/wEBAQEAAQH/AQABAf8BAQEA/wAB/wABAAAAAQAAAAAAAAAA/wABAQEAAAEAAAAAAv8BAQEAAAEC/wAAAv//AQAAAQH/AQEB/wEAAQL/AAEAAAABAAABAgEAAAIAAAEBAQAAAAH/AQEBAAEBAQAAAQAAAQH/AQABAAAAAAL/AQEBAAAAAAAAAQAAAAAAAAAAAAD+AAH/AQH/Af//Af8BAQAAAQIBAAABAQAAAAL//wH9AQEB/wH/Af8AAAEC/wACAQAAAQAAAAEBAP8DA24ggN8QAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAgeexQAQABIAABAAAAAQAAAAEAAAABAv8AAQL/AAEAAAAA/gEAAAL//wEB/wAB/gEBAQP/AAEAAAABAAABAf8B/wAB//8BAf8AAAH/AAEAAAAB/wH/Af8AAAEAAAABAAAAAf8BAAAAAP8AAAAAAQAA/wAB//8AAf8AAQL/AAH/AAABAAABAQEAAAEC/wAA/QEBAQEAAQH/Af8BAf8BAQEAAAH+AQABAAABAf8BAQH/AQABAAAAAQAAAAAAAAABAAAAAQAAAAAAAP8AAv8AAQAAAAED/wABAAD/AQH/AAEAAAABAAABAf8B/wAB/wABAAABAQEA/wAB/wACAAAAAQAAAQL/AQABAAD/AAH/AAEAAP8BAAAAAQAAAQH/AQEB/wEAAQAA/wAB//8AAv8AAQAAAAEC//8B/QEAAQAAAQIAAQABAAABAQEA/wAB/wABAv8BAf8B/wH/AAAAAAAAAAAAAAAAAAABAv8AAf8BAAEC//8BAf8BAf8BAAEAAP8AAf8AAf4BAAEC//8A/wD/AP8AAAEAAAABAAABAf8BAAEAAAEC/wEAAf8BAAAAAAABAv8AAf4BAgEBAAABAAABAQEAAAH+AQAAAAAAAQL/AAEAAAAA/xH49RAvAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD7AP5QAAAAAP8AAf8AAQAAAAEAAAAB/gEAAAAAAAAC/wABAAAAAf4BAQH/AQAAAv8AAf4BAAAAAAABAAAAAQAAAQL/AQEB/wH/AQAAAAEAAAAAAAAAAAL/AQH/AQABAAAAAAL/AQH/AQABAAAAAAL/AAEAAAEC/wH/AP8A/wAC/wABAAAAAAAAAAH+Af8BAv8AAQAAAAEAAAAA/gH/AAH/AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAQIAAQAAAv8AAQAAAQL/AQEC/wEAAQAAAAH+Af8AAf8BAf8BAAAAAAABAAAAAQAAAAEAAP8AAf//AP8AAQL/AQAAAAAAAAAA/wAB//8AAf8BAf8BAAAAAAEA/wEAAAAAAAEAAAABAAD/AP8AAAEAAAEC/wEAAQAAAAH+AQEBAQAAAQAA/v8A/wEC/wEAAQAAAQEBAAAB/gEAAAAAAAAC/wEB/wEAAQAA/wD/AAAB/gEAAQAA/wD/AAIBAAEAAQAA/wAB/wEC/wEAAAL/AAH+AQECAQABAQP/AAEAAAABAAD/AP8A/wAB//8AAf8AAAL/AAAC/wAB/gH/AAH//wAAAAAAAAD/AAH/AAEAAAAAAAAAAf4BAAAAAAABAAAFAvxQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEuAAEAAAEB/wEAAQAAAAEAAP8AAv8AAf4BAQH/AQABAAD/AQAAAAAAAAAB/gEAAQAA/wEB//8AAf8AAAAAAAEAAAAAAv8BAv8B/wAB//8BAf8BAQEAAAIAAAABAAAAAf4B/wEC/wAAAAAAAf4BAQL/AQAAAAABAf8BAAEAAAAAAv8AAgAAAAAAAAEBAQAAAAAAAAAAAAEBAQABAf8BAAAAAAAAAAAAAAL/AAEAAAAAAAAAAAAAAAH/AAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEBAQAAAAAAAAIAAP8AAf8AAAAAAAEAAAEC/wEBAQEAAAAAAAAAAAAAAgEAAQEBAAEB/wH/AQL/AAIBAAABAv8AAQAAAAAC/wAAAAAAAQL/AQH/AQAAAAABAQEAAAAAAAAAAAAAAAAAAQH/AQABAAAAAAAA/wH/AAAAAAAAAQAAAQEBAAABAv8AAAAAAQEBAAAAAAABAQEAAQL/Af8A/wAAAAAAAQL/AQAAAAAAAf4BAAEAAAABAAAAAf4BAAAAAAAAAAABAQEAAQH/AQAAAAAAAv4BAAH+AQAAAAABAf8B/wEB/wABAAAAAQAAAQEBAAABAAAAAAAAAAEAAAAAAAD+Av5QAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAADCA3xDr+QrvAAAC/wAA/gEAAQEAAP//AP//Af8BAf8BAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAC/wAAAAAAAAAAAQD+AQAAAv////8AAQH/AQAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAQAAAAH/AAAAAAAA/gEAAAAAAAAAAP8AAf8AAAEAAQD+AQAAAAAAAAAA//8B/wEBAQAAAP4BAAAAAAAAAAAAAAL/AAD+AQAAAAAAAAEAAAD/AAAAAv8AAP4BAAAAAAAAAAAAAQEAAP//AAAAAAABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD/Af8AAP4B//8B/wEB/wH//wH/AQH/AQAAAAAAAAEAAAD/AAABAAD//wL/AQD+AQAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAC/wAA/gEAAAL/AAAAAAAA/gH//wH/AQH/AQAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAv8AAP4B/wAC/wEA/gEAAAAAAAAC/wAA/gEAAAL/AAD+AQAAAAAAAAAAAAAAAAAAAAAAAAAABQf2EeCAIfAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAPD4CDAAAQAAAAH+AQABAAAA//8AAAAAAAEC/wEAAQAAAAAC/wABAv//AAH/AAEAAAABAv8AAQAAAAEBAP8AAv8AAQEAAQEBAAABAAAAAQAAAQH+AQAA/wABAf4BAAEAAAAB/gEBAv8BAAAC/wABAAD/AAL//wAC/wABAAAAAAAA/wAC/wABAf8AAAAAAAH+AQABAQAAAQAAAAEAAAICAAEBAf4B/wAB//8AAf8AAQAAAAEBAP8AAAAAAQAAAAEAAAAAAAAAAf4BAAEAAP8AAv8AAf8AAAEAAAAB/gH/AAH/AAEAAAABAAAAAAH/AAAC/wABAAD/Af8AAQEBAAABAAAAAQAAAAEBAAABAAAAAQAAAAD/AAAB/gEAAQAAAQL/AQABAAABAv8BAAEAAAABAAAAAf8AAAEBAAAAAAABAQAAAAEC/wABAAAAAgAAAAAAAAABAAAAAQAAAAEC/wAB/wAAAAL//wAC/wABAAD/AAL/AAH+AQABAAAAAf4BAAEAAAABAAABAv8BAAAC/wAAAv8BAQEAAAAAAAABAAAAAgEAAAEAAP8A/wAAAQAAAQH+AQEBAQAAAQEAAAH+AQAAAv8AAf4BAAEAAAABAAAAAQEAAAEAAAABAv8AAQAAAPoQIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP0JCA8AAQEAAAEAAAABAAAAAQAAAAIAAAAAAv8AAAAAAQL/AQAAAAABAQAAAQEBAAAB/gEAAAL/AAH/AAEC/gEAAP8A/wH/AAAAAAABAQEAAQEBAAEC/wEAAQAAAAEAAAABAAAAAQAAAAL+AQAAAAACAv8BAAEAAP8AAv8AAQAAAQEAAAAB/gEAAf4BAAAAAAABAAAAAAAAAAAAAP8AAAAAAAAAAQIAAQEC/wEAAAL/AQEAAAEBAAAAAAAAAAAAAAECAQAAAQAAAAEC/wEBAAAAAAAAAAEBAAABAQABAv8BAAEBAAAAAAAAAf4BAAH+AQABAAAAAAL//wD/AAAAAAAAAQAAAAAB/wAAAAAAAQAAAAAAAAAAAv8AAAAAAAEAAAABAQD/AAL/AAAAAAEBAQD/AAL/AAEAAAABAv8BAf8BAAD+AQAAAAD/AAL/AAIAAP8AAv8AAAAAAAD+AQABAQAAAf4BAQL/AQAAAAACAv8BAAEBAAAAAAAAAAAAAAAAAAAAAv8BAQEAAAL+AQAC/gH/Af8AAAIBAAABAQAAAAH/AAAC/wEC/wEAAQAA/wAC//8A/wAAAf8AAAEAAAAC/wEAAQAAAAAAAAAAAAAAAP8A/wAC/wAB/wEAAAL//gH9LwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH7+jEAAAH/AAAAAAAAAv8BAgEAAAAAAAAC/wEAAQAA/wD/AAAB/gEAAQAA/gAB/wAAAv8AAf4BAAAC/wAAAv8AAQAAAAAC/wABAQD/AAAA/wD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAQEBAAABAv//AQAAAQH/AQABAAAAAAL/AAEAAAAAAv//AQL/AAEBAAAA/wAAAQAAAAEC/wAA/wAAAQAAAAAAAAAAAv8AAf4BAAH/AQEC/wEAAQAAAQIBAP8AAf8AAAAAAAD+AQABAAAAAQAAAQEAAAAA/wAAAAAAAAAB/wABAAAAAAL/AAEAAAAAAAAAAf4BAQIBAAABAAAAAAEAAAH+AQABAAAAAAAAAAEAAP8BAAAAAQL/AAAAAAAAAf8BAf4BAAEC//4AAf8BAQAAAAD/AAEB/wH/AP8AAAEBAAABAQABAQAAAAAAAAEB/gEAAQEAAAEAAAAAAf8AAQL/AAEAAAECAQD/AP8AAAD/AAABAv8AAQL/AAEAAAAC/wEAAQAAAAABAAAAAv8AAAAAAAAAAAAAAf8BAv8BAAH+AQAAAQAAAAL/AQH+AQABAAAAAAL/AQEBAAAAAf8AAAAA/wEC/wABAQAAAQAAAQEAAAAA/wAAAv8B/v/9IQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8DAg8A/f8BAAABAAAA/wEAAAAAAAEAAAAA/wABAQEAAAAAAP8A/wAAAP8BAQAC/wAA/wAAAAEAAAAAAAAA/gEBAAEA/wD/AQEAAAD/AP8A//8C/wEB/wEAAP8AAAAAAP//Av8BAf8B/wAAAAAB/wEAAAAAAAEB/wIA/wH/AP8AAAABAAAA/wACAAEA/wD/AAD/Av8AAQAAAAD+AQAAAQAAAAH/AAD/AQAA/wEBAAEA/wD/AP//Av8BAQAB/wD/AP8AAQABAAL/AAH+AQD/AAAAAAL//wD+AQABAv8AAAAAAAAAAAAAAAAAAP8BAQEBAP///wAAAAEA/wD/AAABAv8AAAEAAAD9AQAAAv8BAf8B////AAEA/gEAAAAAAQEBAAD//wH/AAL/AAD/AQD/Af8AAf8BAAABAP8AAAAAAQEAAAD/AAAAAAAAAAIAAAAAAP//Av8BAf8BAAAC/wAAAAAA/wAAAAAAAAABAAAAAAEAAQAAAP8AAAAAAAAAAAD+Af//Av8AAf4BAAEC/wAA/wEBAAEA/wD/AAEAAAH/AAAAAAEBAAAAAAAAAP8BAQABAP8AAf8AAP8B/wAB/wABAAAAAAL/AgH/Af//AAAAAAAAAAD+AQAAAQAAAP8A/wEAHwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD+/iAAAAL/AAH+AQAAAQD//wH/AAEAAQD//wD/AQAAAP8B/wAAAQAAAP4BAAH9AQAAAQAA//8AAAEAAQAAAAD/AP8AAQABAP8AAAAA/wL/AQEAAAEBAAD/AAEAAAAAAAEB/wEBAAAA/wAAAAD/Af8AAf8BAAD+Af8AAv8BAAAB//8B/wAAAQAAAf8BAQABAP8B/wEAAAAAAP8C/wAB/wEA/wAAAQEAAP8AAAD//wH/AQEAAQAB/wH/AAAAAQABAAEB/wH/AAH/AAABAAAB/wEBAAAA/wABAAD/AAABAf8B/wAAAAEAAQD/AP8A/wABAAAAAv8AAf8BAP8AAAAAAAAAAf0BAP8C/wAA/gH//wL/AAD/AQABAQAAAAAA/wAAAAABAAABAP8B////AAICAAH/AAAAAQAAAP8A/wAAAAEAAAABAAAAAAAAAP4BAP8AAAECAQAAAP8AAAD+AQD/AAAAAQAAAQEBAP///wAAAQEA////AAEBAAH/AAAA//8C/wEB/gEAAQEA//8AAAIBAAD/AAAAAAAD//7//wABAAAAAQH/Af7/Af8BAAAAAAH/AQAA/wEAAAH/AAD/AQAA/wAA/wAA/wAAAAABAQAA/wAAAAEBAAD/Af8AAf8BAAEBAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAw8AAv8BAAEBAAAAAf8AAQAAAAEAAAACAQAAAP8AAAH/AQAB/gEAAgEAAAABAAAAAAAAAQAAAQEAAAAAAv8AAAL//wEAAAABAAAAAf4BAAEAAP4AAf8AAAAAAQEAAAEBAAD/AAAAAAAB/wAB/gEAAQAAAAABAAAA/wH/AQAAAAEAAAEC/wH/AAAA/wAB/wEBAQAAAAH/AAL/AQAA/wAAAf4B/wAAAAABAAAAAv8B/wEAAP8AAAAAAAL/AAEAAP8BAAAAAAEAAAAB/wABAAD/AQAAAAAAAAAB/gH/AQAAAAD/AP8BAAAAAAEAAAEAAAEC/wEAAP8AAQIBAAAB/wEAAAL/AAL/AQECAQABAv8BAAIBAAAAAAAAAAH/AAEAAAAAAf//AAAAAAEBAP8AAAABAQAAAAEAAAEBAQAAAQAAAAD/AAABAAAAAQAAAQIBAAAA/wAAAP8AAQEBAAABAQAAAQL//wAB/wABAQAAAAAAAAEBAP8AAv8AAAAAAgL/AQABA/8BAQAAAQEAAP8AAAAAAQAAAQH+AQEB/wEAAf8BAAEAAAEB/gEAAv8B/wAAAAAA/wABAf8BAAAAAAAAAQAAAQEAAAAD/wAA/wABAgEAAAAAAAAB/gEAAQEAAQACIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAC/wEA/gAAAQEAAAAA/wEAAQAA//8AAAAAAAAAAQAAAAAB/wAAAQAAAP8BAQEAAAAAAAD/AAL/AAH/AQAA/wEAAAAAAQEBAP///wAAAQEAAQD/AQAAAAAAAAH//wAAAAAAAAAAAf8BAAD/AQAAAv8AAP8BAAEAAAAAAf8AAP8BAAEAAP8AAv8AAf8AAAD/Af8AAAABAQAB/wAAAAABAQABAAAA/wAAAAAAAf8AAAEAAAD+AQABAAAAAP4B/wAAAAEBAAAAAf8B////AAAAAAAAAAAAAAEB/wAAAQABAP8B/wED/wEB/gH/AAAAAAAB//8AAAABAQAB/wAAAAABAAAAAAEAAAD/AAABAAD//wAAAAAAAAABAAAAAP8BAAAAAAECAAH//wAAAAAC/wAA/gH/AAL/AAD9AQAAA/8AAP4BAAEC/wAA/wEAAAAA/wAAAAABAAAAAAEA/wAAAAABAv8AAP4BAAAAAAAAAAAAAAAAAAAAAAAA/gEAAAAA/wAB/wAB/wAAAQEAAAAAAAAAAAABAAAA/wAAAAABAAABAQAA//8B/wABAAEAAAL/AAH+AQAAAv//AP8BAAEAAAAAAv8AAP8AAAD/AADqPooyAAAgAElEQVQAA/8AAf4BAAAAAAAAAQAAAP8A/wP+EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/yAAAQAA/wAAAAADAv8B//4BAAAAAAAAAAAAAAEAAAD/AQAAAAAAAgL///3/AAECAAEA//8B//8B/wADAQAAAAAA/wAAAAH+/wH/AAAAAAEAAAD/AAAAAP8BAAEAAAD/AAAAAAAAAAIC/wH+/gH/AAAAAAAAAAEA/wH/AAAAAAD/AQACAf8A/v8BAAIC/wAAAAAA/v4BAP8B/wAB/wEAAQEAAP//AAD/AAAAAf4BAAIB/wAAAQAA/v4BAAAAAP8CAv8A/v4BAAEAAAAAAAAA/wH/AQH/Af8AAAD/AAAAAAD+AQABAAAAAAAAAQD/Af8AAAAAAAAAAAAAAAAAAAAAAP4BAAIC///+/gEAAQAAAAIC/wD9/gEAAAH/AAH/Af///wAAAQAAAP//AAADAv8B/v4B/wABAAACAAAA/gAAAQD/Af8AAAAAAAAAAAAAAAAA/wEA/wH/AAH/AQAA/gEAAgL/AP7+AQAAAAAA/wH/AAMBAAD+/gEAAAAAAAD/AQD/Af//AP8AAAACAAAC/wD//wAAAP8B/wAB/wH/AAAAAAMBAAD+/wAAAP4BAQABAP//AAABAQAAAAAAAP8A/gEAAAAAAAIB/wD+/gH/AAAAAAEAAAD/Af8AAQABAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgL/AAAAAAAAAAD//wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA//4BAAIAAP8AAAAAAQAAAQH/Af///wABAAAA/wAAAP8BAAABAAEAAAD/AAABAAAA/wAAAQAAAP8CAf8A/v8BAP/+Af8BAAAAAAAAAQABAP8BAf8AAP8AAf//Af8AAAABAQAA/wAAAAD//gH/AQAAAQH/Af8BAf8A//8BAAEAAAEB/wH/AQL/AP/+AQAA/wABAQEA/wD/AAD//gEBAQEA/wEA/wD//wEAAgEA////AAEAAQD/AP8AAAAAAP8AAAAAAQAAAAAAAAAAAAAAAAAAAAEC/wH//gH//wAAAf/+Af8BAAABAAEAAP/+Af8CAAAAAP8BAAEB/wD//wEAAAAAAQEAAf///gD/AgL/AP/+AQAAAAABAQAA/wAAAAAAAAABAAAA/wEC/wD//gEAAf8BAAAAAAEAAAD/AP8AAQEAAP8BAv8B//4B////AAEBAAAAAAEA/wD/AAAA/wEAAgL/Af/+Af8AAAAAAQAAAAH/AQEAAQD/AQH/AP/+AQABAAAAAAAA/wD/AAACAQD//wAAAAAAAAAAAAAAAAAAAAABAAACAP8B//8B/wAAAAACAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAB//4BAf/+AQAAAAABAgAAAAAAAAABAv8AAAAAAAAAAAAAAAAAAAAAAAEC/wABAf8AAQL//wAAAAABAv//AAAAAQEBAAABAAD/AP8A/wAAAAEBAAAAAQAA/wAAAAEA/wEAAQAAAQAAAAEAAAAAAQL/AAEAAAAAAAABAAAB/wEC/wEA/wH/AQL/AP/+AQEAAAAAAQL//wAAAAAAAQAAAQAAAAEC/wABAQABAP4BAAAAAAEAAAD/AQH/AQAAAAEAAAD/AQH/AAABAAABAv8A//4BAAAAAAAB/wABAAAAAQAAAAABAv8AAAAA/wAAAAEAAAD/AQL/AQD+AQABAAAAAgL/AAEAAAEBAQD/AP8A/wEC/wEAAAAAAQL/AAABAAAAAAABAQEA/wD/AAEAAAAAAAAAAAEC/wD//gH/AAAAAAAAAAAAAAAAAQEAAP/+AQABAv8AAQL/AQEAAP8AAAAA//8B/wAAAAD//gH/AQL/AQAAAP8AAAD/AQH/AAEB/wACAv8AAP8AAAEBAAAAAAABAAAAAAAAAP8A/wAB//4BAAAAAAABAv8AAAAAAAAAAAH//wEBAQAAAQAAAAEBAQAAAAAAAAAAAAAAAQAAAQEAAAAAAAAAAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIBAhD/AP4AAAAAAAEA/gH/AAAAAAEC/wEA/gH/AQAAAQABAAAAAAAAAP8A/wD+AQEBAQAA//8A/wEAAAEA/gEAAQEAAAAAAAEAAAAAAgEA////AAAAAAAAAgL/AAAAAAAA/wEBAP8AAAABAAAA/wABAP4BAAABAAAA/gH/AAL/AAD+AQAAAQAAAAAAAQIBAP8AAf8AAAAAAQEC//8AAAD/AAL/AAAAAP8AAf8B//8BAAEAAP8AAAABAP4B/wIC/wH//wEAAP4BAAAAAAAAAv8BAQAA/wAAAP8AAAAAAQL/AQD/AQEA/gEAAgEAAP//AAAAAAABAP4BAAABAP8AAf8AAQAA//8AAAEA/wAAAQAAAAAAAAABAAAAAQAAAf/+AQABAAD/AP8AAAEAAP8BAv8B//4B/wAAAAABAAABAAAAAAEBAAD/AAD/AQH/AAD/AQAA/gEBAAEA/wAB/wABAQAAAAAAAAD+AQEBAQD///4B/wEC/wEB/wH//wAAAQD/AQAA/wAAAAEA/wD/AAABAf8AAAABAAAB/wABAAD/AAAAAf/+AQAA/gH/AQAAAQAAAAAAAQD/AAH/AQH+Af8BAf8AAQEAAP/+AQEAAAAAAAAAAAEC/wAA/gH/AAAAAQMCDwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/hAAAQAAAAAAAAEAAAABAAEA///+AQABAQAA//8A/wH/AAAAAAAAAQL/AP8AAP8AAAAAAf4BAAAC/wAA/wH/AAH/AAAAAAEAAAH/AP8AAAAAAAwIA/8cDwABDgcAABsPAwABAAEA/wD/AAAAAAAAAAAAAAAAAAAAAAABAAEB/wD/AAAAAAAAAAABAAAAAAABAgABAP8B////AAACAv8A/v4BAAAAAAAAAAABAAMA/wAAAAEAAAD/AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAMAAAAAAAEAAAD/AAABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAEBAAAA/wADAAAAAAAAAAAAAAAAAQAAAwAAAAABAAADAAEAAAD/AAAAAAAAAAAAAAEAAAMAAAEC/wH//gH/AAAAAAAAAAAAAAAAAAABAAIF/wD+/gEAAAAAAAAAAQEAAAD/AAAAAAADAAAAAAAAAAEAAAD/AQAAAAABAAEB8vj/APP5/wD/AP8A1+r/APL5AAAAAP8AAQD/AQAAAAD/AAH/AAEAAAAAAQAAAAH//wD+AQEA/wAAAP8BAAABAAEA/wH/AP8AAAEAAAAAAQAAAAAAAQD/AQAAAAD//wAAAP//EQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACAv8AAAAAAQD/Af8AAf8B//8BAQIBAAD/AAABAgEAAP//AP8AAAAA//4BAAEC/wEA/gEAAAEAAP/+AQABAAABAAABAAAAAAAAAAAA/wAAbjwHAGEzBQENBwEA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAEBAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD+//8AAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAQAAAAABAQEA////AP8AAAACAQEA/v//AQEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAQEBAJHF+QGTxvoA/wAB/wH//gEAAQEA//8AAAEBAAAAAAAAAQABAAAAAAAAAAH//wAAAAAAAAABAAAB/wAB/wAA/wEA//8AAAEBAP8AAv8BAf8BAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEA/wEAAP4BAAAAAAEA/wEAAQAAAAEAAAAB/wAAAAAA/wIC/wABAv8BAQAAAQD/Af8BAv8AAAAA/wIC//8AAAAAAQL//wEB/wAAAAAAAQAArtX8APH4/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEBAQAAAAAAAQEBAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAA/wAAAP///wACAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQEBAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAAD///8AAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAA5PH+AK7U+wAAAAAAAQD/Af8CAv8BAP8BAQEBAP8BAf8BAf8B/wEB//8A/wABAP8BAAD+AQAA/gEAAQH/AQH/Af8BAf//AQAAAAAAAAAA/gH/AP8A/wAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAf8BAQEA/wIB//8BAf8AAQAAAAAAAAABAQAAAQAAAQD/AQABAAAAAQEAAAEAAAEA/wEAAQAAAAD+AQEBAQD/AP0BAQD/ATYdAwAAAQAA5fL+AF2r+ADk8v8AAAAAAAEBAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7//wD/AAAA////AAAAAAABAAAAAQAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAP8AAAABAAAAAQEBAAEAAAD/AAAA////AAAAAAAAAAAAAQAAAAAAAAD+//8AAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAADl8f4AWqv4/+Xz/wAAAQAAOB4DAAEA/wEAAQAAAAEAAAAA/gEAAAAAAQD/AQEBAQD/AgH/AAEAAAEBAQAAAP8BAAAAAAEBAQABAQEAAAEAAAABAAA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AAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAABAAAAAP//AAABAQAAAAAAAQEBAAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AOXy/gBcrPcA5PL+AAEA/gFSKwQAiEcIAAEBAQAAAAAA////AAICAf8AAQEA/wAAAAABAQAAAAAAAAEAAAABAQD/AP8AAQEAAAEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAEB/wH/AQL/AAD/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEB/gEAAQEAAQD/AQABAAAAAQAAAAEAAAEB/wEAAQAAAAEAAAABAAAAAAAAAAH/AAABAAD/AQL/AAEAAP8BAv8B//4BAAAAAAAAAAABAQEAAQEBAAAAAACJRggAUysFAAABAADk8wD/W674/+Xy/wAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAABAQAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA5fP/AFys+ADk8/4A/wEB/1IqBACJRggAAQAAAAAAAAAAAAAAAAAAAP7+/wEAAf8AAQD+AQAB/wAAAQAAAQD+AQABAf8AAAAAAAAAAAD//gEAAQAAAAEAAP8BAv8AAAAA/wEC/wABAAABAQAAAAIC/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAQAAAP8A/wIC/wAAAAAAAQAAAAAAAP8BAv8AAAAAAAAAAAAAAAD/AgL/AAAAAAABAv8AAQAAAQEBAAEBAAD/AgL/AAEAAAAAAAD///8A////AAAAAAAAAAAAiEU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BAQAAAAAA//8AAAAAAAAAAAAAAAABAP//AAAAAAAA////AAAAAAAAAAAAAQEBAP//AAAAAAAA////AAEBAQAAAAAAAAAAAAAA/wAAAAAA//8AAAEBAQAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA////AAAAAQAAAAAA5fP+AFuw+P/k8/8AAAAAAFIpBACIQwgAAQEBAAEBAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAA////AAEBAAAAAgH//wAAAAABAAAAAQAAAAEAAAABAf8AAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAACAv8AAQAAAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BAAABAP4BAAEAAAABAf8AAQAAAAD+AQABAAAAAQEAAAIC//8BAAAAAQL/AAAAAAEBAAAAAQAAAAEB/wABAv8AAQH//f7+Af//AAAAAP8AAAAAAAEBAQAAAAEAAAD/AP//AAAAAAEA//8AAAAAAAAAAAEAiEEFAVIpBAAAAQAA5fL/AFyw+ADk8v4AAAAAAAEBAQAAAAAAAAABAAAAAAAAAAAAAQEBAAEBAQAAAAEAAAD/AAAAAAD///8A//8AAAAAAAAAAAAAAAABAAAA/wAAAAAA////AAAAAAAAAAAAAQEAAAAAAQAAAAEAAAD/AAAA/wAAAQEAAQEBAAAAAAAAAAAA//8AAAEBAAABAQAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEAAQEAAP//AAABAQEA//8AAAAA/wD///8AAQEBAAEBAQAAAAAAAQEBAAEBAADl9P8AXLD4AOXz/gEAAQAAUikEAIpECAABAQAAAAAAAP//AAAAAAEA////AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAP8BAAAAAP8BAAEAAAAAAQAAAQAAAAIC/wAB/wEAAQAAAAAAAAABAAAAAP8BAAEB/wACAv8AAQAAAAEB/wAA/gEBAQAAAAH/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAv//AAAAAAEC/wEB/wEBAQAAAQEAAAAAAAAAAQAAAQD/AQAAAAAAAP4BAAIC//8BAAAAAAAAAQEAAQAB/gEAAf8BAQAAAAEBAAABAQEAAAEBAP///wAAAAA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AAP//AAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAEAAAAAAAAAAAAA/wAAAP//AAABAAAA/wAAAP//AAAAAAAAAP8AAP8AAAABAAAAAAEAAAAAAADk8/4AXbT4AOXy/AEAAQEAUyYDAYhBBwAAAQAAAQEAAAEAAAAA/wAAAQEAAAEBAAABAAAA/wAAAAEAAAABAQAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAQAAAAAAAAEBAv//AwH/Af//Af8CAf8A//4BAAAAAP8B/wAA//8B/wD/AP8DAf//AP8AAAEAAAEDA/8AAQAAAAAAAP8AAAD/AgH//wIB/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH//wEAAQAAAgIBAAH//wEB//8BAAEAAAABAAAAAAAAAAAAAAEBAQABAwP/AAMC//8CAf//AgL//wMB/wABAAABAQEAAAEBAAEAAAD/AAAAAAAAAP8AAAAA/wAAAAAAAAEAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAIlABwBSJwQA/wIB/+X0/wBdtPkA5fT/AAAAAAD///8AAAAAAAEBAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAAD/AAAAAQEAAAAAAAAAAAAAAQEAAAAAAAABAQAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAAAQAAAAEBAAAAAAAAAAAAAAABAAAAAAAAAQEAAAEAAAAAAAAAAQAAAOTz/wBctPkA5PP+AAEBAQBTJwQAiUAHAAEAAAABAAAAAAAAAAAAAAABAQAA/wAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAP8AAAABAAAAAQAAAAAAAAAAAAAA/wAAAP///gEA//4BAAEAAAD//gEBAwP//wEAAAH//wEBAQAAAQEBAAH//wEAAQEAAAEAAAD//gEAAQAAAAEAAAADAf8A//8BAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAD/AgH//wD/AAABAAAAAQAAAP/+AQABAAD/AgL/AQD/AQABAAAA//4BAf//AQABAAAB//4BAf//AQH//wH/AAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAQAA/wAAAP8AAAAAAAAAAQAAAAEBAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP//AACJQAcAUyYDAQABAADk9P4AXLT4AOXz/gAAAAAA//8AAP8AAAD/AAAA/wAAAAEAAAAAAQAAAQEAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAQAAAAAAAAD//wAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAA5PP/AF21+ADl9P4A/wIB/1InBACIQAcAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAEAAAAAAAAAAAAAAAEBAAD/AAAAAAAAAAABAAABAQEAAAEAAAEBAQD/AP8AAQEAAAABAQAAAQAAAAEAAAEBAQABAAAAAP//Af8A/wD/AgH/AAEAAAAAAAAAAgH/AAABAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8CAv8B//8BAAEBAAAAAAD/AAAA/wIB//8CAv8A//4BAAIC/wABAAAAAQAAAAEAAAEBAQAAAQAA/wIB//8AAAABAQAAAAD/AP8AAAAAAAAA/wAAAAAAAAABAAAAAQAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAA//8AAAEAAAABAAAAAAAAAAEBAAAAAAAAiT8HAFInBAAAAAAA5PT+AFy1+ADk9P8AAQEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAQAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAP8AAADm9P8AXLX3AOTz/gAAAQAAUyYDAYk/BwABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAQAA/wAAAAAAAAAAAQAAAAAAAP8A/wAAAQAA/wIC//4A/wD/AQAAAQAAAAADAv8BAQEAAAIC/wABAQAAAQAAAQD+AQAAAAAAAAA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BAQEAAAAAAAEBAAAAAQEAAQEBAAAAAAABAQAAAQEAAAAAAAD//wAAAAD/AP///wAAAP8AAAAAAP//AAAAAAAAAAABAAAAAAABAQEAAAABAAABAQAAAAAA//8AAAAAAAAAAAAAAQEBAAAAAAApEQEApEMHAA4DAAH/AgL/5PX/AFu9+QDl9f4AAQEBAAAAAQD///8AAAAAAAAAAQABAQEA//8AAAEBAQAAAAEAAQEAAP8CAf8BAP8B/wMC/wAB/wABAQAAAQD/AQAAAAAAAQAAAAEAAAABAAAB//8BAAIB/wAAAAD/AQAAAAEAAAAB/wABAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf/+Af8A/wAAAQAAAAAAAAD//gEBAP8BAAEAAAD//gH/AgL/AAEAAAABAQAB//4B/wAAAAABAQAAAAAA/wIC/wADAv8AAQEAAQEBAAAAAQAAAAAAAAAAAAAAAAABAQAAAQEAAAAAAADk9P4AXL75AOX0/QEAAQEADgcBAKRBBgEoEAIAAAAAAAAA/wAAAAAA//8AAP//AAD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAP8AAQEAAAEAAAD//wAAAAAAAP///wAAAAAAAAABAAEBAQABAQEAAAD/AAEBAQD//wAAAAABAP//AAABAAAA//8AAAAAAQAAAAAA//8AAP//AAAAAAAAAQEBAAAAAQAAAAEAAAABAAAA/wABAQEAAQEAAAEBAQD///8AAAD/AAEAAAAAAAAAAQEAAAEBAQABAQEA//8AAAAAAAABAQEAKRACAKRDBwAOBf8BAQIAAOb2/wBbwfv/5PX+AAAA/wAAAAEAAQEBAAAA/wAAAAAAAQEAAAAAAADvMYVXAAAgAElEQVQAAAAAAAABAAH//gEAAQAAAf7+AQABAAD/AgH//wAAAAACAAAAAQAAAAEAAAAAAAD/AAAAAf//AQABAAABAAAAAf//Af8CAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAH//wH/AgL/AAEBAAEBAAD/AP8AAAMC//8CAf8AAQAAAAEBAAAA/wAAAQAAAQMC//8A/wD/AgH/Af//AQH//gEAAQAA////AAEBAAABAQEA////AP//AAAAAAAA//8AAOP0/wBcwvv/5fb/AAABAAAOBgAApEEIACoRAgAAAAAAAQEAAAAAAQABAQEAAQEAAAEBAAAAAAEAAAAAAP//AAAAAAAA//8AAP//AAAAAAAA//8AAAAA/wAAAAEAAAAAAP//AAAAAAAAAAAAAAEBAQAAAQEAAAEAAAAAAAD/AAAAAQEBAP//AAAAAAAAAQEAAAEBAAD/AAAAAQEAAAEBAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAEBAQAAAAAAAAAAAP//AAAAAQEAAAAAAP//AAABAQAA//8AAP//AAAAAAAAAAAAAAABAQD//wAAAAAAACkQAQCkQQcADQUBAP8CAv/m9P0BXL/5AOX2/wAAAAAA/wAAAAABAQAAAAAA////AP//AAAAAAAA/wD/AAABAAD/AgL/AAEAAAACAv8B//8BAQEAAAAAAAAAAAAAAAAAAAACAQAAAwL/AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAIC/wABAQAB//4B/wIB/wABAQAAAQAAAP/+AQABAAAB//4BAQAAAAABAQAAAQEAAP//AQEBAQABAgEA/wIB/wABAAAA/wAAAAABAP//AAAAAAAAAQEBAAAAAAAAAAAA5fb/AF3A+QDk9f8AAAEAAA0GAQClPwcBKREBAP//AAAAAP8AAAAAAAABAAAAAAAAAAAAAAAAAAABAQAAAQEAAAEBAAD//wAAAAD/AAEBAAAAAAAAAAEAAAEBAQAAAQAA////AAABAAAAAAAAAQEAAAAAAAABAAAAAQAAAP8AAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAP//AAAAAAAA/wAAAAEBAAABAQAA/wAAAAEBAAABAQEAAAEAAAAAAAD/AAAA//8AAAAA/wAAAAAAAAEBAAAAAAD/AAAAAAEAAAABAAD//wAAAQEAAAD/AAABAQAAAQEAAAEBAQAqEQIApUEHAA4GAQABAQEA5fgB/1zA+QDl9v4AAAAAAAEAAAAAAAAAAAABAAAAAAABAQAAAQABAAADAv8B//8BAAEAAAABAAAAAQAA/wIC/wADAv//AgL//wAAAAAAAAAAAAAA/wEAAAAAAAAAAQAA/wEAAAEBAAD/AgL/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wEAAAAA/wD/AgL/Af/+AQAB/wABAQEA/wIC/wH//wEAAAAA/wH/AAAA/wAAAP8AAAH/AAAA/wAA/v4BAf/+Af8CAv8AAQAAAAAAAAABAAD/AAAAAAAAAAEBAADl9f8AXMD5AOX3/gABAQAADgYBAKVACAAoEQEAAAAAAAEBAAABAQEA/wAAAAAAAAD/AAAAAAAAAAAAAAD///8A//8AAAAAAAAAAAAAAAABAAAAAAD//wAAAAAAAAAAAAABAAAAAQEBAAEAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEAAAAAAAAAAAAAAAEBAAABAQAAAAAAAAAAAAABAAAAAQEAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEAAAEBAQABAAAAAQAAAAEBAAAA/wAAAQAAAAAAAAABAQAA//8AAAABAAD/AAAAAAAAAP//AAD//wAAKRECAKQ/BQEMBwL/AP7+AeX3Af9cwPkA5vb/AAAAAAAAAAAAAAAAAAEBAAAAAAAAAAEAAAD+/gEAAP8AAAAAAP8AAAAAAgL/AAEAAAAAAAABAP8BAQIBAAAA/wABAQAAAQEBAAABAAAAAQAAAQEAAAD//wEBAP8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAf//AQABAAABAP8BAAMC/wAAAAAAAAAAAf/+Af8DAv8AAwL/AAAAAAABAAAAAQAAAAAAAAABAAAAAgEAAAEBAAIA/wEBAQEAAAAAAAD/AAAAAAAAAAAAAOT1/wBbwPkA5PgA//8CAv8OBP8BpEAHACgRAQABAAAA/wAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAAAAAP//AAABAQEAAQEAAAAAAAABAQAAAQEAAP//AAABAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAP8AAAAA/wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA//8AAAAA/wD//wAA//8AAAEAAAAAAAAAAAAAAP8AAAAAAAAA//8AAP8AAAABAAAA//8AAP8AAAAAAAAA/wAAAP8AAAAAAQAAAAAAAAEAAAD/AAAAAAEAAAD/AAAAAAAAAAAAAAEBAAAAAQA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AAAIAAAAAAAAAAAAAAAAAAAAAAAIC/wEA/wEAAAAA/wMB//8CAf8A//4BAAEAAAAAAAAAAAAAAQEBAAABAAABAQEAAAMC/wABAAAAAgAAAAD/AQACAv8AAQAA8/3/AAABAAANA/8BpD0HACkPAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA////AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAACkPAQCkPQcADQYBAAAA/gHl+gH/AAEAAAAAAAAAAQAAAAEAAAABAAAAAwL//wAAAAACAv8BAQEAAQEBAAABAAD/AP8AAQD/AQEBAQABAQEAAAEAAAABAAAB//8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD/AQEBAQAAAQAAAP7+AQEA/wEAAgL/AQEBAAACAAABAgEA/wD/AAAAAAAAAQAAAP7+AQABAAABAQEAAQEBAAD//gEAAAAAAAAAAAABAABTHwMAKQ8BAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAD//wD///8AAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQEBAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAbCgAAUh4DAAAAAAAB//8BAAAAAAABAAAAAAAAAQEBAAACAv8A/v4BAf//AQD//gH/Af8A/wH/AAABAAABAgEAAAAAAP8CAf//AP8AAAAAAAECAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AAACAv8AAAEAAf7/AQABAAD///4B/wAAAAAAAAD/AP8AAQEBAP8A/wAAAQAAAAIC/wD+/gEAAQAA////AAABAAABAQEA////AAEBAQCg3vwAruP9ACkPAgAAAP8ADgcD/w0D/gEA/wAAAAMC/wD/AAAA//4BAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAD/AAAAAQAAAAABAAEAAAD//wAAAAD/AAABAQAAAgH/AP7+AQAAAAAA/wAAAAAAAAEBAQD/AP8AAAABAAAAAAAAAP8AAAAAAAACAv8AAAAAAP7+AQAAAQAAAP8AAAABAAAA/wABAAEA/wEB/wD//wEAAAAAAAAAAAAA/wAAAAEAAP//AAACAv8A//8BAAD/AAAAAAAA/wAAAAAAAAEBAQD/AgH/AP3+AQACAv8A//4BAAAAAAAAAAAAAAAAAAEC/wD//gEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEA5fb+APL9Af/k9gAA8/n9AQABAAD/AgH/Af8AAQD/AAD/AP8A/wIB/wH+/wH/AwL/Af7/AQABAAAA//8BAAIC/wD+/gEAAQAAAAABAAD//gEAAwL/AP7+AQABAAAAAQL/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAgMB8P4AAA8AAAAA/wH/AAAAAAAAAQEAAAD/AAEAAQAAAAAA/wD/AAAAAAD/AP8AAP//AQABAAD/AgH/AP7/AQD/AAD/AQH/AAEBAAD//wEBAQEA8v0B/8nu/wAB//8B/wD7AQAAAQAAAgH/AP77AQAAAQABAAAAAAAAAP8A/wAAAAEAAAD/AAAAAAAAAAAAAP8AAAACAv8B//8BAAAAAAABAAD/AQH/AP79AQEAAQD/AgH/Af7/AQAAAAD/AP8BAAIC/wD/AAAA//8BAQEAAP///wAAAAAAAP8AAAABAAABAAEAAAAAAP8A/QEA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAECAAH//wD/AP8AAAEC/wH//wEAAQAA////AP8B/wAB//4AAAABAAABAf8B//8BAAAAAP8A/wAAAgIAAf7/AP8A/QEAAAEAAAAAAAAAAAAAAP8AAAH/AAH//wD/AAAAAQAAAAAAAAD/AAAAAAAAAAACAf8A//8AAAEAAAD+/QEBAAEAAAMC/wH+/wEA//8B/wAAAAAB/wAAAAEAAP/+AQABAQAA//4B/wEAAAABAv8A//8BAf//Af8BAQAAAAAAAQEAAP8CAv8A/v4BAAEAAP8A/wACAQDxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////8AD+/gEB//8BAAEBAAABAAABAQAAAAEAAP8A/wAAAQAAAQEBAAEBAQAAAgL/AQEBAAACAv8A/v8BAQEBAAECAQABAP8BAAD/AQEBAAD/AgH/AAD/AQEA/wH/AQAAAQEBAAABAAAB//8BAAAAAAAB/wD/AQAA/wD/AAABAQABAQAAAAMC/wAAAAAAAQEAAAIBAAEA/wH/AAAAAAEAAAAAAAAAAAAAAAIC//8CAf8AAAAA/wIB/wABAAAAAAAAAP7+AQD//gEBAQAA////AAACAv8AAwL/AAEAAAABAAD/AgH//wEAAAABAAAAAwL/AAAAAAAAAAAAAQEAAAABAAAB/wABAQEAAQD/Af8BAAAAAQEAAAEAAP8CAv//AAAAAAEBAAEBAAABAQEAAAEAAAAA/wH/Af8AAAEAAAACAv8AAAAA/wD/AAEBAQAAAP8AAAIB/wACAf8AAgL/AAD/Af8CAf8AAP8A/wIB//8A/wAAAQAAAAIB/wD//wEAAQAAAP//AQACAv8AAQAAAP//Af8CAf//Af8AAAD/AAAAAAAAAwH/AAEAAP8CAf8AAQEAAAMC/wD//gEBAgEA/wIB/wEBAAD/AP8AAAEAAAAAAAABAQEAAQEBAAEBAQD/AgDwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQIBAAABAQD/AgH/AQAAAAEBAQD/AAAAAQABAAEBAQAAAQAA/wD/AAAAAAABAP8B/wD/AAH//wEBAQAA/wD/AP8AAAAAAQAAAQEAAP8A/wAA//4BAQEAAAABAAAAAAAAAAEAAAAAAAD/AgH/AAEAAAACAv8AAAAAAQIBAAAAAAD/AAAAAf7/AQABAAAAAAAAAAAAAP8AAAAAAQAAAAEAAAAAAAABAAABAQD/AQD//gEB//8BAQD/AQABAAAAAQAAAQIBAAABAQD/AAAAAAEAAAABAAAB/v8BAQIBAAACA/8A//8BAQAAAAAAAQAA//4BAAEAAAEBAQAAAgH/AAEAAAAAAAD/AP8A/wIC/wACAv8AAAAAAf//AQD//gEAAP8AAQAAAAEA/wH/AP8AAQAAAAAAAAAAAAAAAAAAAAD//gEA//8BAAMD//8AAAAAAQAAAP//AQD//gEBAP8BAAD/AAABAAAAAQEAAQD/AQEBAQABAQAAAQD/AQEBAAAAAQAAAAAAAAEA/wH/AAAAAAAAAAEA/wEBAAEAAAEBAAACAQAB/v8BAAID/wH//wEAAAAAAP//AQABAQAAAAAAAAEBAP8A/wAAAQAA/wAAAAABAAD/AP8A/wAAAP8AAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wAAAAACAf8B//8B/wIB/wABAQAB/v4B/wIB/wD+/wEAAgL/AP7+AQAAAAD/AAAAAQEBAP8CAf8B/v8BAQABAP8AAAAAAAAA/wAAAAABAQAAAQH/////AQAA/wABAQEA/wAAAAEBAAD///4BAQEBAP///wEBAQAA/wIC/wD+/gEBAAAAAAAAAAEAAQD/AP8AAAABAAAAAAABAAAAAAAAAP8BAAAAAP8AAAAAAAADAv///v8BAQAAAP8BAf8AAAAB/wAAAAEBAAAAAAAAAAABAP8BAAAAAQAAAAAAAAAA/wAAAf8A/wABAAACAf8AAAEAAf7/Af8CAv8B/v4B/wEAAAEAAQAAAQEA///9AQEAAQD/AQAA/wIC/wH//gEA/wEAAAAAAP8CAv8B/v4BAAAAAAAAAAAAAAAAAAAAAAEAAQD/AAAAAf/+Af8BAAABAAEA/wIB/wH+AAH/AP8AAAEBAAD//wEAAQAAAAAAAP8DAf8B/v8B/wIC/wAAAAAA/v4BAAMB/6x0xeMAACAASURBVP/+/wEBAQAAAAAAAAAAAAD/AQAAAQAAAP8AAAAAAQAAAf/+AQACAAAA/wAAAQAAAP8BAAAAAAAAAAEAAAECAgAA//8AAAAAAAD//wEAAgEA//8AAAEAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQEA8AD//yAAAQAAAAD/AQH/AAD/AQAAAP//AQEBAAAA//4BAAEAAAAAAAABAAEAAAD/AAD//wEAAQAAAAAAAAEAAAD/AQH/Af//AQAAAAD/AQAAAAEB/wD/AAEAAAAAAAAAAP8AAAAAAAEA/wEB/wD//wEAAAAAAAH/AAEBAAD/AQH/Af//AQAAAAABAAEA/wAAAAEAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAH//wEAAQAA/wEB/wH//wEAAQAAAAAAAP8CAf8AAAAAAf7/AQH//wEAAQAA/wAAAAABAAABAAEAAAAAAAD//wH/AQH/AAEAAAEA/wEAAQAAAAAAAAAAAAD/AP8AAAEBAP8AAAAAAQL/AP/+AQAAAAD/AgH/AP//AQH//wH/AgH/AP//AQABAf8B/wABAAAAAP8AAAAAAgH//wABAAEAAAAA/v4BAf//Af8AAAAAAQEAAAEB/wD//wEA/wAA/wEAAAH//wEAAQAAAP/+AQAAAAAAAQAAAP7+AQEBAQAAAAAA/wAAAAAAAAABAAAA/wEB/wD+/wH/AwL/AP7+AQEBAQAAAP8AAAAAAAEAAAAAAAAAAAAAAAAA/wD/AQAAAQAAAP8AAAABAAAAAAEAAAAAAAABAP/gAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/f8C8AABAAAAAQAAAQEAAAAB/wABAQAAAAIB//8AAAAAAQAAAAEAAAABAQD/AgH/AAEAAAACAv//AQAAAAEAAP8CAv8BAP8B/wEAAP8AAAAAAQAAAQD/AQEBAAD/AAAAAQEAAAAAAAABAQAAAP//AQEBAAAAAAAAAf//AQABAAAA//8BAAEAAAABAAAAAQEAAAIC/wABAAD/AgH/AAAAAP8CAv8BAQAAAAIC/wABAAAAAQAAAAD/Af8AAAAAAQAA/wIC/wAAAAAB//8B/wAAAAABAAAAAQAAAAAAAAEA/wEAAQAAAAEAAP8CAv8A//8B/wAAAP///wAAAwL/AAEAAAABAAAAAAAAAQEAAAEAAAAAAQAAAQEAAAABAAAAAP8BAQEAAAAB/wAB//8BAAAAAAEA/wH/AgH//wEAAAABAAAB//8BAf/+Af/+/gH/AgL/AAEAAAEEAv8BAQAAAQD/AQACAf8AAwH/AQMC//8BAAD/AAAAAAAAAAACAf8AAAAAAQIBAP8AAAD/AgL/AAIB/wAAAAD/AAAAAQD/AQECAAAB//4BAQAAAAAA/wAAAAAAAAAAAAABAAAAAQAAAQD+Af8CAv8AAAAAAAEAAAEBAAAAAQAAAQIC/wABAAAAAgMAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABAH/4f4BAQD/AQD/AAABAAEAAAAA//4BAQD/Af8BAAAAAQEAAAAAAP8BAf8B/v4BAAEAAAH//gEAAAAAAAEAAAH//gH/AAAAAQAAAP8DAf8B/v8BAAEBAP8BAf8B//8BAP//AAABAAAAAAAAAQMC//8AAAAB/v4BAAEBAAAA/wABAQAAAP8AAAABAAAA//8AAQAAAQAAAAAB//8BAAIBAAH//gH/AAAAAAEAAAD/AAAAAAAAAQAAAAABAAAAAAAAAf/+AQAAAAAAAQAAAQAAAAAAAAAAAQEAAQH/AP//AAABAAAAAAAAAAH//gEAAQAA/wAAAAEBAQAA/v4BAQEAAAD/AAABAQAAAAAAAP8DAv8B//4BAAEBAAD//wABAQAAAP8AAP8CAv8A//8AAf//AQAAAAAA//8BAAAAAAAAAAAAAAAA/wIC/wH+/gH/AQAA//8AAAH+/gH/AAAAAAAAAAAAAAAA//8B/wEA/wEAAAAAAQAAAAAAAAAAAAH/AwL//wAAAAH+/gH///4BAAAAAAEDAv8A/v4B/wAAAAEBAQAAAP8AAAEBAP8BAP8B/wABAP//AAAAAAD/AgL/AAAAAAD+/gEBAgAAAAAAAAD/AAD/AAAAAQEAAP8BAf8B/wDwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/QEA/wEA/wAB/wAB/wIB/wD+/gEAAAEAAAD/AAEBAAAAAP8AAAAAAAD//wH/AQAAAQAAAP8DAv8B/v4B/wAAAAEBAAABAAAAAAAAAAABAQD/AwH/AP7+AQAAAQD/AgH/Af8AAQH//wAAAAAAAP/+AQACAv8AAQAAAAD/AAAAAAAAAAAAAAIBAAD//wD/AQAAAQD/AAABAAD/AAAAAQD/AAACAQABAAAA/wEAAAABAAAAAQEAAAEB//8AAAAB/v8BAAAAAAAA/wAAAAAAAAEAAAAAAQAAAP8A/wAAAAADAv8A/v4B/wAAAAEAAAAAAAAAAAEC/////gEBAQAA/wAAAAACAv8B//4B/wIC/wAAAAAA/wEA/wEB/wABAAABAQEAAP7+AQH//gEAAgL/AP7/AAAAAAABAAEAAAD/AAAAAAD/AAAAAAEAAAABAAABAP8BAAEAAP8AAAABAAAAAAIC/wD+/gEAAQEAAP//AQACAQAA/wAAAAAAAP8CAf8BAAAA/wAAAAABAQABAgH/AP//AQD//wEAAQAAAQAAAAAA/wAAAAAAAAIB/wH//wEAAP8AAAEAAAEBAQD///4BAAAAAAADAv8A/v4BAAAAAAABAQABAP8AAP//AQEA/wD+/wHhAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAv//4f8AAAAAAQAAAf/+AQABAAD/AgH/AAEAAAABAAD/AQAAAAEBAAAAAAABAQEAAAEAAAH//wEAAwL/AQEAAAABAAAAAQAAAAEAAAH//gEB//8BAAEAAAIA/wEB//8BAAD/AAABAAAAAwL/AAEAAAH//gH/AgL/AAAAAAABAAAAAAAAAAD/AAABAAAAAgL/AAEAAAABAAABAQAA/wIB/wAAAAAAAQH/Af/+AQABAAAAAP8AAP/+AQAA/wAAAf8A/wIB/wABAAD/AgL/AAEAAP8B/wAAAQAAAQMC/wH//wH/AgL/AQEAAP8BAAAAAQAAAQD+AQEBAAAAAwL/AQEAAAEA/wH/AAAAAf/+AQAAAAAAAgH/AQD+AQEAAAEA//4BAAEBAAABAAD/AAAAAAEBAAAAAAAAAf8AAAAAAAABAQAAAgL/AQEAAAADAv8AAAAAAAEBAAEBAAD/AgL//wAAAP8CAv//AgH//wIC/wAA/wAAAQAAAAH/AAEAAAAA//4BAf/+AQAB/wAA//4BAAIB/wADAf8AAQAAAAIC/wAAAAD/AgL/AP/+AQAAAAAAAQEAAAEBAP4BAf8AAgL/AQAAAAEBAAAAAgL/AAEAAAABAAD/AwL//wMB/wABAAAABADvAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/QAD4AECAQAAAAAA/wIC/wAAAAABAP8B/wAAAP8CAv8BAQEAAAAAAAEBAAAAAQAAAAEBAP8A/wAA//8BAAIC//8AAAAAAAAAAAEBAAAAAAAAAP8AAAIC//4CAf8AAP8AAAAAAAABAQAA//8B/wIC/wABAQABAP4BAAIBAAABAQAABAL/AAEBAAABAQABAP8B/wIC/wAAAAAAAAAAAf8AAQABAAAAAP8BAAEBAAABAQD/AAAAAAEBAAIAAAH/AAAAAQD/AQABAAABAP4BAAAAAAEAAAAAAAAAAP//AQAB/wABAQAAAAAAAAEBAQD/AgL/AAAAAP8CAv8AAQAAAAEBAAAA/wABAgEAAAEAAAD//gEAAP8BAAAAAP8A/wAAAAAA/wD/AAACAv8BAP8BAAD/AAACAQAAAAAAAAEAAAABAAAB//8B/wAAAAD//wEAAwH/AAEAAP8CAv8AAQAAAQD/AQH//gEB//4BAgD/AQAAAAAAAQAAAAABAAABAAAAAAAAAAAAAP8CAv8AAQEAAP/+AQD+/gEAAQEAAAEAAP8BAAABAP4B/wAAAAABAAAAAP8A/wIB/wIA/wEAAQAAAAIBAP8AAAAAAP8BAAAAAAABAAAAAAAAAf/+AQABAQAC///QAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACAD70AAAAAD/AwL/AQEAAAABAQAAAgH/AQEAAAEBAQAAAAAAAAH/AAABAAABAQAAAAD/AAECAQAAAgH/AAD/AQEBAQAAAwL/AAIB/wABAQAAAQAAAf/+AQH//wEAAQAAAAIBAAAAAAAAAAAAAAEAAP8CAf8AAAAAAAAAAP8CAf8A/v8B/wIB/wACAf8AAP8AAf/+AQABAAAAAQAAAAIAAAACAf8AAAAA/wIB//8CAf8BAwL/AAD/AP8CAf8BAQEAAAEAAP8CAv8AAAEAAAEBAAABAQD/AwL/AAAAAAAAAQD/AQAAAAEAAP8CAf8B//8B/wMC/wH//wEA//8BAAAAAAABAAAAAAAAAAID/wEBAAAAAP8AAAEAAAEBAQAAAQEAAQIBAAAA/wEAAP8AAAIBAAAAAAAAAQAA/wMC/wABAAAAAQAAAf/+AQAAAAAAAAAAAAD/AAH//wEB//4B/wD/AP8DAv8AAQEA/wD/AP8CAv8AAP8AAAH/AP8BAAD/AwL/AAMD/wH//wEAAQAAAAABAAABAQAAAgH/AP/+AQEDA/8AAAAAAQEBAAAA/wAAAQAAAQD/Af4CAf8B//4B/wIB/wABAAAAAQAAAAEAAP8A/wABAP8BAQEBAAABAAAEAQHxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACwAA4AABAAAB//8BAP//AQABAAAA//8BAAEBAP8A/wAAAQAAAAEBAAABAQD/AAAAAAEAAAAAAAD/AAAAAAAAAAABAAAA//8BAAEBAAABAAAAAQEA/wIC/wABAAAAAQEAAAAAAAAB/wAAAP8AAf//AQH//gEBAgEAAAEAAAH//wEAAQAAAf/+AQD//wEAAQEAAAEBAAABAQAAAQEA/wEB/wD//wEAAQAAAf//AQABAAAAAP8BAAEBAAD//wEAAQAAAQEBAAH//wEAAwH/AAH/AAAB/wAB//8BAAEAAAADAv8B//4BAAEBAAH//wEAAf8AAQEAAAABAAABAQEAAAEAAAABAQAAAQAAAP/9AQABAQD/AwL/AAMC/wABAAAAAQAAAAAAAAAAAAAAAQEAAAAAAAABAAAAAgEAAf/+AQAAAAAAAQAAAAEBAAABAAAA//4BAAMD/wABAAAAAQEAAQMD/wH//wEAAf8AAAEBAAEA/wEAAQEAAAEBAAH//gEB//8B/wH/AAADAv//AQH/AAEAAAAB/wAA//4B/wMC/wD//gEAAQAAAAH/AAADA/8BAgEAAAAAAAH//gEAAQEAAf/+AQEBAQAAAAAAAAEBAAICAQAAAP8A/gIB/wAAAAAM/PzQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAACC08t//AAAg/wEB/wH+/gEAAwP/Af7/Af8A/wAA/wAAAAEAAAAAAAAAAAAA/wEB/wH//wH/AQH/Af//AQAAAAAAAAAAAAAAAAAAAAAAAAAA/wEB/wH//wEAAAAAAAAAAP8BAf8AAAAAAQEBAAD9/gH/AgH/Af7+AQABAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAIC/wD+/gEA/wAAAAEAAAAAAAAAAAAAAP//AAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEC//8A/wAB//8BAP//AAABAQAAAAAAAAAAAAAAAAD/AQH/Af//AQAA/wAAAAEAAAAAAAAAAAD/AQH/AAAAAAH//wH/AQH/Af//AQAA/wD/AQL/Af//AQACAv8A/v4BAAAAAAABAf8A//8BAP//AAACA/8AAQAAAP39AQABAQAA//8AAAEBAAD//wABAQEA/wEB/wD//wEAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAIB/wD+/wEAAQL/AP/+AQACAv8A/v4BAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAEB/9DgSw8xAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP4BAbEAAQAAAQEBAAABAQAA/v4B/wD/AAACAf8AAQAAAAEAAAEBAQAAAAAAAf//AQABAAAB//8BAAEAAAACAv8AAgL/AAAAAP8CAf//AgH/Af//AQEBAAAAAgH/AAIC/wEA/wEBAQEAAf//AQECAAABAQEAAAIBAAEBAAAAAQAAAAIB/wAAAQAAAQAAAAAAAAAAAQAAAgH//wD/AAEBAQAAAgAAAQEAAAACAv8AAgL/AAIBAAACAAAAAQAAAQEAAAAAAAAAAQAAAAEAAAAAAAAAAQAA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP/+AQH//wEAAAAAAAEBAP8CAf8AAQAAAAEAAAAAAAABAQAAAAAAAAAAAQAAAgH/AAEAAAEBAQABAP8BAAEAAAABAAAB//8BAAIC/wEBAQABAP8BAAEAAP8A/wABAQEAAAEAAAAA/wEAAAAAAAEBAAD//gH/AP8AAAEBAAABAAAAAgEAAAEAAP8DAv//AAAAAP//Af8CAf8AAAAAAAEAAAABAQAAAgH/AAEAAAABAAAAAQAAAP7/AQABAAD/Af8AAAEAAAD//gEAAAAAAAEAAAAAAAAAAQAAAAEAAAAB/wAAAQAAAAIC//4AAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBK8AAAAAAP/+AQABAAAAAQAAAAMC/wEAAAEAAQAAAAAAAP8A/wAAAQAAAAIAAAAAAAAAAwL/AAIC/wD//gEBAP8BAAEAAAH//wEB//8BAAEAAP4BAf8A//8BAQD+AQAAAAAA//4B/wD/AP8AAAAAAP4BAQEBAP8AAAAAAAAAAP//AQABAAAAAAAAAAEAAAABAAAA//8BAf//Af8A/wABAQEA/wAAAP8B/wAA//4BAAIC/wACAf//AQH//wAAAAABAAAAAgL/AAAAAAECAQAAAAAAAAIC/wABAAAAAQAAAAEAAP8DAf//AgH/AAEAAAABAAAAAwH/AAEAAAH//wEAAAAA/wIB/wABAAAA//8BAAEAAAABAAAAAQEAAAIC//8A/wABAQAAAQEBAAEBAAAAAQAAAP/+Af8AAAAAAAAAAAAAAAH//wH/AgD/AAEAAAAAAAAAAwL//wMB/wABAAACAP8BAAEAAP8CAf8AAgL/AAAAAAH//wH/AwH/AAEAAAEBAQAAAQAA/wIB/wAAAAAA//8BAAAAAAAAAAAAAgL/AAEAAAAAAAAB//8B/wIB/wAAAAAAAgAAAAAAAAABAAAAAgH/AQAAAP8AAAABAQEAAAEAAAIGA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAADCv7xDwBwPf/wAAEAABAf8A//8BAAAAAAACAv8A/v4BAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAACAv8A/v4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAv8A//4B/wEB/wL/AAH/AP8AAAIC/wD+/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAQABAP8A/wAAAQL//wD/AAH//wEAAAAAAAIC/wH+/wH/AP8AAAAAAAEAAQD/AP8AAAAAAAABAv8A//4BAAAAAAACAv8AAAAAAP7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAABAAEA/wD/AAEAAQD/AP8AAAAAAAAAAAABAAEA/wD/AAEAAQD/AP8AAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgL/AP7+AQAAAAAAAAAAAAAAAAACAv8AAAAAAP7+AQAAAAAAAAAAAQEA4OBJDiEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAANBREfAAAwOQAAIC/wAA/wEAAQAAAQEBAAD+/gEAAwL/AAEAAAABAAAAAf8AAAEAAAAAAAABAQEAAAIC/wD//gEBAQEA/wIC/wABAAAAAAAAAAIC//8CAv8AAQAAAAIC/wABAAAAAQAAAAEAAAAA/gEAAQAAAf//Af8B/wAAAgL/AP/+AQABAAAAAQAAAAIC/wAAAAAAAQAAAAAAAAABAQABAQEAAAEAAAABAAAAAQAAAAIC/wAAAAAAAQAA/wD/AAADAv8AAQAA/wH/AAABAAAAAP4BAQEBAAABAAAAAQAAAP/+Af8B/wAAAQAA/wIB//8CAf8AAQAAAAEAAAAA/gEAAQAAAAEAAAH//wEA/v4BAAEAAAABAAAAAwL/AQEBAAEBAQAAAQAAAQEBAAEBAQABAQEAAAEAAAABAAAAAQAAAAEAAP8B/wAAAQAAAAAAAAABAQD+AgD/AAEAAP8B/wAAAAAAAAEAAAABAAD/Af8AAAIC//8BAAABAQEA/wIB/wEBAQAAAgL/AAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAABAAAA//4BAAEBAAABAAAAAQAAAAEAAAD//gEA//4BAAEAAAABAAAAAQAAAAEAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/vqhAP/+AQAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAABAQEAAQEBAAECAQD/AP8A/wEAAAAAAAD/Af8AAgD/Af8BAf8AAQEAAQD/AQEBAAAAAgL/AP/+AQACAv8AAAAAAAAAAAAAAAAAAgL/AAEAAAAAAAAA//4BAQEBAAACAv8BAQEAAP/+AQECAQABAQEAAAMC/wABAAAAAQAAAQEBAAAAAAAAAgL/AQD/AQACAAAAAgL/AQEBAAH//wEAAAAAAAIC/wACAv8AAAAAAP/+AQEBAQAAAQAA/wIC/wEBAQAAAAAAAf//AQABAAABAQEAAQEBAAACAv8BAQEAAAIC//8A/wAAAQAAAAEBAAACAv8A/v4B/wD/AP4CAf8AAAAA/wH/AP4CAP//AP8AAAIC/wEBAQAAAAAAAAEAAAACAv8AAgL/AAIBAAAA/wAB//8BAAAAAAAAAAAAAwL/AAIC/wAAAAAAAAAAAP/+AQAA/wD/AgH/AP/+Af8A/wAA//4BAAIAAAEBAQAAAQAAAAEAAAABAAAAAgL/AAAAAAAAAAAAAAAAAQEAAAAAAAAAAQAAAAIC/wAAAAAAAgL/AAAAAAEBAQAAAAAACP/9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYSRHgAwD/gQABAAAAAQEA/wIB/wABAAAA//4BAAEAAAADAv//AP8AAAEAAP8AAAABAgEAAQEAAAABAAAAAAEAAAAAAAEA/wEAAf8A/wD/AAABAAAA//4BAAEAAAD//wEAAQAAAAEAAAABAQAA//4BAAMC/wABAAAAAwL//wD/AAD//gH/AP8AAQEBAAAAAAD/AP8AAP/+AQAAAAD/AP8A/wIB/wEBAQAA//8BAAAAAAAAAAAAAQAA/wD/AP8AAAAAAwL/AP/+AQD//wEBAQEAAAEBAP8AAAAAAAAAAf//Af8A/wABAQEAAAMC/wD//gH/AP8A/wD/AAABAAD/AP8AAf//AQACAv8BAQEAAAAAAAABAAAAAwL/AAEBAAH//gEAAQEAAAAAAAH//wEAAQAAAf//Af8CAf8BAgEAAAAAAAD//gEA//4BAAD/AAADAv8AAQEA/wMC/wABAQAA//8BAAEAAAADAv8AAwL/AAEAAAABAAAA//4BAAIC/wABAAABAQEAAAAAAP8CAf8AAQL/AAEAAAABAAAA//8BAAEAAAEBAQAAAwL//wD/AAABAAAAAAAAAf//AQEBAQAA//4BAAMC//8A/wD/AQCg2EkR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgj+kAABAe8AAQAAAAEAAAABAQAAAQEAAAEBAAABAAAAAQAA/wD/AAABAAAAAAAAAP//AQABAAABAQAA/wH/AAABAQAAAQEAAAEBAAD//wEAAQAAAAEAAAABAAAAAQAAAAEAAAAB/wAAAwL/Af//AQACAv8B//8BAAEAAAECAQAAAQAA/wEAAP8BAAABAQEAAAEBAAAB/wAAAwL/Af//Af8B/wAAAgH//wEAAAEBAQAAAQAAAQEBAAAB/wAA//4BAAMC/wAB/wD/AgH/AQEAAAADAf8AAQEAAAH/AAABAAD/AQAAAP/+AQEBAQAAAQAAAQEBAAD//gEAAQEA/wH/AAAA/wH/Af8AAAIB/wD//gEA//4BAAIB/wEBAQABAQAAAAIC/wACAv8BAQEA/wEAAAD//wH/AAAAAQEBAAABAQAAAgL/AAEAAAAAAAAAAQAAAf//AQAB/wAAAf8AAAEAAAH//wEA/v4BGhV/cQAAIABJREFUAAEBAAABAQAAAQAAAQD/AQABAAD/AwH/AAEBAAD//gEA//4BAAMC/wABAQAAAgH/AQEBAAABAAAB//8BAAEAAAEBAQABAQEAAAEAAP8CAf8AAQAAAP/+AQEBAOAK//2BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0EER8AQD/2IAAgL/Af//AQEBAAAAAQAAAAIB/wD//wEAAAEAAAAAAAACAf//AAAAAAD/AAABAQD/AP8AAAIC/wABAAAAAAAAAAIB/wEBAAAAAQEAAAAAAAADAf8BAQEAAAIC/wEBAQAB//8B/wIB/wEA/wH/AQAAAAABAP8BAf8BAQEAAQEAAAAA/wD/AQAAAAEAAAEBAQAAAAAAAAEAAAEBAQAAAQAAAQEAAAABAAAAAAEA/wD/AAEBAQABAQEAAP7+AQABAQABAP8BAAEAAAD+/wEAAwH/AAIC/wEBAQAAAP8AAAEBAP8A/wAAAgL//wD/AAABAAAAAP8AAAIC/wABAAAAAgL/AAEAAAEBAQABAQEAAAEAAP8DAv//Af8AAAD/AQAA/wH/AQAAAAEAAAEBAAABAQAA/wEAAAAA/wAAAQAAAAEBAAEA/wEAAQAAAAD/AAABAQAAAQEAAP//AQABAAAAAgEAAQEAAAABAAABAQEA/wIB/wACA/8AAAAAAQEAAAADA/8BAgEAAf//AQAA/wABAP8B/wEAAP8AAAD/AgH/AQEBAAABAAD/AQAAAAEAAAD//gEAAAAAAAIC/wAAAoDYSRHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN1EDrD/AP6RAAEAAP8A/wABAAAAAP//AQAAAAABAgAAAAEAAAEA/wEBAgAAAQIBAAACAf8BAgEAAP/+AQEBAAAAAwL/AQD/AQABAAAAAP8AAQICAAD+/wH/AAAAAAD/Af8CAf8AAAAAAP//Af8CAf8AAAAAAAH/AAD//wEAAQAAAAAAAAADAv8AAAAAAAAAAAABAAAA//4B/wIC//8CAf8A//8B/wAAAP8AAAAA//4BAAMD//8AAAD/AAAAAQIBAAACAf//AAAA/wD/AAEBAAAAAAEAAP//Af8CAf8AAQEAAQAAAAABAQAA//8BAAEBAAEAAQAAAQEAAQD/AQAA/wAAAP8BAAEAAP8CAf//AAAAAQD/AQD+/gEBAQEAAAIC/wACAf8BAQAAAAAAAP8AAAD/AAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAAAAAEBAAACAf8AAgH/AAIB//8CAf8AAgH/AAEAAAEBAAD/AAAAAAD/AQAB/wAA//8B/wAAAAD+/gH/AgL//wAAAAACAQD/AAAAAQAAAAADAf8A//8BAAEAAAABAAABAQAA/wIB/wADAv8BAQEAAQAAkeBHDKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAILv0z/8A/zABAQAA//8AAAAAAAAAAAAAAAD/AAEAAQAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAgP/AAD/AAD+/wEAAAAAAAIB/wD+/wEAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEBAQAAAP8A//8AAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQEBAAD//wAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAgH/AP7/AQACAv8A/v4BAQAAAP8BAf8A//8BAAIC/wAAAAAB/v4B/wAAAAEBAQD///8AAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAIC/wH+/gH/AAAAAQAAAP8AAAAAAAAAAQEAAAD/AAD/AAAAAAIC/wAAAAAB/v4B/wIB/wD+/wEBAAAA/wAAAAAAAAABAQEA////AAEBAQAA//8AAAAAAP8AAAAAAAAAAAIC/wH+/gH/AAAAAAAAAAEBAQD/AQH/AP79AQAAAQAAAAAAAAAAAAAAAAAAAQH/AQAAAf8BAP8B/gHR4EULMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAT7QQEC/+D/AQH/AQMC/wAAAAAAAQAAAAEBAAABAAD/AQAAAQEAAAADAv8AAQAAAQEAAAABAAAAAgL/AQEAAAEBAQAA//4BAf//AQABAAABAQAAAP//AQAAAAAAAgH//wEB/wAAAAABAQAAAAIB/wABAAD/AwL//wMB/wABAAAAAAAAAAEAAP8A/wAAAgL/AQEAAAABAAD/AgH//wIC/wEBAAAAAAAA/wIB/wABAAAAAQEAAQEAAAEBAAAAAQAAAAEAAAACAf8B//8BAQEAAAD//gEAAQAA/wEAAAAA/wEAAgH/Af/+AQH//gEAAQAAAAAAAAAA/wABAwL/AAAAAP8BAAAAAQAAAAEAAAACAv8BAQAAAf//Af8DAv8BAQAAAAEAAAABAAAAAAAAAAAAAAABAAAAAAAAAf/+AQABAAD/AQAAAP//AQEBAAD/AAAAAAIB/wABAAD/AP8AAAMC/wAA/wAAAQAA/wIC/wADAv8BAQAAAf/+AQABAAAAAQAAAQEAAP8BAf8A//4BAAMD/wABAAAAAwL/AAEAAAABAAABAP8B/wIB/wEAAeEI/PpRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACi/7yD4/wa//wD/HwD//wEBAAEAAAD/AP8AAAABAAEAAAD/AP//AAABAQEAAAAAAAAA/wAAAgL///3+AQEBAAD/AQL/AP7+AQEBAAAAAAAA//8AAAAAAAAAAQAAAP8AAAEBAAD//wAAAQEAAP//AAAAAAAAAQEAAAD/AAAAAQAAAAAAAAD/AAD/AgL/AP7+AQEBAAAAAAAA/wEC/wH//gH//wAAAQEAAP8AAAABAAAAAAAAAP8BAf8A/v8BAAEAAAD/AAABAQAAAAIC///9/gEBAQAAAAAAAP//AAAAAgL/AP/+AQEAAQAA//8AAAEAAAD/AAD/AgL/Af//AQAA/wD/AQL/AP7+AQAAAAABAQAAAAAAAAD/AAD/AgH/AP7/AQABAAAA/wAAAQEBAAAAAAAAAP8AAAAAAP//AAAAAgL/Af/+AQAAAAD/AgL/AP3+AQEAAAD/AAAAAQAAAAABAAAAAAAA/wAAAAEAAAD/AQL/Af//Af8BAP8B//8B//8AAAAAAAABAQAAAAABAAAA/wD//wAAAQEAAAAAAAAAAAAAAAH/4AgB/UHYQRHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANhBEeAIAfpBAQEA0QEBAAD/AgH/AAEBAAEAAAD/AgH/AAEBAAADAv8AAP8AAAD/AAAAAAAA/v4BAQIBAAAAAAAAAQAAAQEAAAAAAAAAAQAAAAMC/wABAAABAgL/AAEAAP8AAAAAAQAAAAAAAAECAAAAAQAAAAAAAAACAQD/AAAA/wAAAAACAQABAQAAAQEAAAAAAAD/AAAAAP/+Af8AAAAAAQAA/wAAAAAAAAAAAAAAAAEAAAABAQABAgEAAAAAAAEBAAAAAQEAAP7+AQABAAAAAQAAAAEBAAADAv8AAQAAAQAAAAAB/wD/AQAAAAAAAAACAAAB//4BAAH/AP8CAv8B//4BAQEAAAECAAD/AAAAAAEAAAABAAAAAQEAAQIBAAACAv8BAQAA/wD/AP8CAf8AAAAAAAIC/wECAQAA//4B/wIC/wAAAAAA/v4BAAEAAAADAv8AAQAAAAEAAAAAAAAAAAAAAAIC/wABAQAA//4BAAD/AAH//wEAAAAAAAEAAAECAQAAAAAAAAD/AAABAQABAQAAAAAAAAAAAAAAAgLQEAH9MdhBEeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACK99JD+Af9v/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wIC/wH+/wH/AP8AAQAAAP8BAv8B//4BAAABAP8CAf8B/v4BAAABAAAA/wAAAQEA////AAACAv8A/v4BAQABAAABAAD/AAH/AQEAAAD+/gEAAAAAAAAAAP8BAf8AAAEAAQD/AQD//wD/AAAAAAIC/wEAAAAA/v8BAAAAAAAAAAAAAQAAAP//AAAAAQAAAAAAAAD/AAAAAQAAAP8A/wAAAAAAAAABAAAAAAAAAAAAAAAAAAEA/wD/AAEAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8BAv8B//4BAAAAAAACAv8A/v4BAAABAAAA/wD/AQL/Af/+Af8AAAAAAgL/Af7/AQABAAAA/wAA/wEB/wEA/wEA//8AAAAAAAAAAQD/AP8AAAAAAAACAv8A/v4BAQAAAAAAAAAAAQEA/wAB/wH//wEAAP8A/wEC/wD//gEBAAAAAAABAP8CAf8B/v8BAAAAAAAA/wAAAAAAAAABAAADAJDgPwxxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjv/Rg/QEBf////iAA/wAAAQEBAP8BAf8AAQAAAf7+AQAAAQAAAP8AAAAAAP8AAAABAAAA/wAAAAEAAQAAAAAA/wEB/wH//wEAAAAAAAAAAAAAAAAAAAAA/wEB/wH//gEAAAAAAAABAAAA/wD/AQL/Af/+AQAAAAAAAAEAAAD/AAAAAQAAAAAA////AAABAAABAAEA/wEB/wAAAAAB//4BAAABAAACAf///v4BAQAAAP8AAAABAAAA/wAAAAABAv8A//4BAAEC/wAAAAAB//4B/wEC/wAAAAAA/v4BAQEAAAAAAAAA/wAAAAEBAAAA/wAAAAAAAAAAAP8BAv8AAAAAAf/+AQAAAAD/AQL/Af/+AQAAAAAAAAAA/wAAAAEAAAD//wAAAQEAAP8BAv8BAAAA//7+AQADAv8A/wAAAf/+AQAAAQD/AQH/AAAAAAEAAAAA//4BAAAAAAAAAQAAAP8AAAAAAAAAAQD///8AAQEBAAAA/wD/AgL/Af7+AQAAAQAAAf/wA///Yd1BDrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL/vIPkAA4D/AAJfAAEAAP///wABAQEA/wEB/wD+/gEBAQEAAAAAAP///wABAQEAAP//AP8AAAABAQEAAP//AAAAAQAAAwL/AP//AP/+/gEAAgL/Af7/Af8A/wAAAgL/Af7+AQAAAQD/AP8AAQAAAAAAAQAAAP8AAAEBAAAAAAD/AQH/Af//AQD/AAAAAP8AAAAAAAAAAQAAAf8AAP8AAAABAQAAAAAAAP//AP8AAAAAAgL/Af//AQAAAAAAAAAAAAAAAAD/AAD/AP8AAQEBAP///wABAQEA/wEB/wH+/gEAAAAA/wIC/wEAAAD//v4BAQAAAAAAAQAAAP8A/wAAAAEBAQAA//8AAAEBAAAAAAAAAAAA////AAEAAAAAAAEAAAD/AAABAQAAAAAA////AAEBAQAA//8AAAEBAP///wABAAAAAAEBAAD/AAAAAAAAAAEAAAD/AAAAAQAA////AAEBAQAA/wAAAAD/AAAAAAAAAQEAAAAAAAL//4EOAPyQ0EER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAov+8g+QADgP8BAz//AgAfAf7/AQAAAAAAAP8AAAABAAAA/wAAAgL/AP7/AQAAAAD/AQH/Af//AQAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAP8CAf8B/v4BAAABAAACAv8A/v4B/wD/AAEAAAD/AgL/Af7/AQAAAAAAAP8AAAABAAAA/wAAAAAAAAAAAP8AAAAAAQL/AQEBAP/+/QEBAAEAAAD/AAAAAQD/AgH/Af7/AQABAAAA/wAAAAAAAAAA/wD/AQL/Af/+AQABAQAAAQL/AP7+AQAA/wAAAAEAAQEAAP7//wABAAEAAAAAAAACAf8A/v8BAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAP8AAAABAP8CAf8B/v8B/wD/AAEAAAAAAAAAAAABAAABAAAA/wAAAAAAAAABAAAAAQH/AP7+Af8CAv8A/v4BAQABAAAA//AC/wCRBgD8oNhBEeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjv/JQ/gAAUP8BAy8AAf8w/wEB/wH//wEAAAAA/wEB/wAAAAAB//8B/wEB/wH//gEAAAEAAAD/AP8BAv8B//8BAAAAAAD//wAAAQEA/wEB/wH//gEAAAEAAAAAAAEBAQD+AAD/Af//AQAAAAAAAAAAAAAAAAACAv8A/v4BAAAAAAACAv8B//8B////AAAAAAD/AgH/Af7/AQAA/wAAAAEAAAEAAAD/AAD/AQH/Af//AQD/AAAAAQAA/wEB/wH//wEBAQEA/wEA/wD+/wEAAgL///79AQEAAQAAAAAA/wEB/wH//wEAAAAA/wEB/wD//gEBAAEAAAD/AAAAAQD/AQH/Af//AQAAAAAAAAAA/wIB/wH+/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AgH/Af3+AQABAQAAAAAAAAAAAP8BAf8B//8BAAAAAAD/AeAC//+xAgD/sAwA/NDQQRHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwv+8Q9AAEMP8A/xD/AgEw/gEBDwABAiAA//4QAAAAAAD/ASAAAAAAAAAAAAAA/hAAAwMPAP7+AQD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAv8A/v4BAAEAAP8BAf8B//8BAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAD/AQH/Af//AQAAAAAA/wAAAAAAAAABAAAAAAAA/wEB/wH//wEA/wAAAAEAAAABAv8A//4BAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAA/wEB/wH//wEAAAAAAP8AAAABAAAA/wAAAAIC/wD+/vEAAAHwAAAAAAAAAAAAAADwAAH/8AAAAeAAAAAAAv/+4QH+AeADBAvPCvzw4dBBEfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZEWJtAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//qGf2TLyTSj4AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Message.png b/arma/client/addons/phone/ui/_site/images/light/Message.png new file mode 100644 index 0000000..d2a321c Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Message.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Message.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Message.png.b64 new file mode 100644 index 0000000..304b5f4 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Message.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEULgCUPi4AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcP+AEOX1+iALAAAw+gX8HwEBAiAAAAAAAf4AIAAB/hD//wIQAAAAAAMAAAD//f4Q/gEAEAACAP8B/wEB////AAAAAAAAAgD/Af8BAf///wAAAgD/AAAAAAH/AQH///8AAQEBAAAAAAD///8AAQEBAP///wABAQEA/wH//wD+AAEAAgD/Af8BAf///wAAAAAAAAIA/wAAAAAA/wABAAEA/wAAAAAB/wEB////AAABAAAAAQD/AP4AAQEBAQD///8AAQEBAP8B//8AAAAAAf8BAQAAAAD/Af//Af8BAQAAAAAAAAAA/wH//wAAAAAB/wEB/wD/AAEAAQD///8AAAIA/wD+AAEAAgD/Af8BAf8B//8B/gLw/wIA8QD/AAACAf7//wAC4QAAAAAAAQDv/v0A4gID/u/9/APRA/7/8BT8CNCQEYDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg74AQ/AT4MP4DAFABAf9PAP//IAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8B/wEBAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAEAAAD/AAAAAgD/AP8AAQAAAAAAAf//AP4BAQAC//8AAAEA/wD/AAH/AQH/Af//Af4BAQAAAAAAAQAAAP8AAAAAAAAAAgD/AP8AAQD/AAAAAAAAAAL//wD+AQEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8A/wABAQABAAACAP////8AAf8BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8C//8BAAEAAP4AAf8C//8B/gEBAAAAAP8B//8B/wEB/wL//wH+AQEAAADQAP//0AEABLGkC4ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYO94IPoK/F8C/AFw/gEAEAEAAQD/Af//Af8BAf///wAAAQAAAAAAAAABAP8B/wEB/wD/AAD/AAAAAgD/AP8AAQEAAQD///8AAAEAAAAAAAAAAAAAAQABAP8A/wAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAABAP8AAAAAAf8BAf///wAAAAAAAAEAAAAAAAAAAQD/AAAAAAD/AAEA/wAAAAEAAAD/AAAAAQAAAAAAAAABAP8A/wABAQABAP8A/wAA/wAAAAEAAAD/AAAAAAAAAAAAAP8C//8B/gEBAAIA/wH/AQH/AP8AAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAQABAP8A/wAAAQD/AAAAAAH/AQH///8AAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAQEBAP8B//8A/wABAP8AAAAAAAAAAgLgAf7+wAX6A4GgEYjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDvgBD6CvRvAPwBgP8A/wABAAEA/wD/AAEAAQAAAQAAAP8AAAAAAAAAAAAA/wL//wAAAAAAAAAAAP4AAQEAAQAAAQAA////AAEAAAAAAAEAAAAAAAAAAAD/AP8AAQABAAAAAAAAAQAA/wD//wD/AAEAAAAAAAEA/wAAAAAB/wEBAAAAAP8C//8B/wEBAP8AAP8B//8B/wEB/wD/AAEBAQAA/wAAAAAAAAAAAAD/Av//Af4BAQABAAD/Af//AAAAAAAAAAAB/wEB////AAEAAQAAAAAAAAAAAAAAAAD/AP8AAQEBAAD/AAD/Av//Af8BAQD/AAD/Av//Af4BAQAAAAD/Av//Af4BAQAAAAAAAgD/AP8AAQD/AAD/AP8AAAAAAAEAAQD/Av//Af8BAf///wABAAEAAAAAAAABAAD///8AAAIA/wAAAAAA/gABAAIA/wH+AQEAAAAA/wL//wH+AQEAAAAA/wD/AAEAAQD/Av//Af4BAQAAAAABAACgBfoDgaARiOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV/V0TwMAAZ/+Af4QAQABAAD/AAEAAgD/AP4AAf8B//8B/wEB/wH//wH/AQEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAD/Af//Af8BAQAAAAD/Af//Af8BAQEAAQD///8A/wL//wH/AQEAAAAAAAIA/wD//wAA/gEBAAEAAP8B//8AAAAAAf8BAQABAP8A/gABAAIA/wAAAAD/AP8AAQEBAAD+AAEAAAAAAAEA/wAAAAAA/wAB/wH//wH+AQEAAQAAAAAAAP8B//8AAAAAAf8BAQABAP8A/gABAAEAAAABAP8A/gABAAEAAP8B//8B/gEBAAEAAAAAAAAAAAAAAAAAAAABAP8A/wABAAAAAAAAAAAA/wAAAAAAAAAAAAD/Av//Af8BAQAAAAD/Af//AQABAP8A/wABAAEAAP8AAQABAP8A/gABAAEAAAAAAAD/Af//Af8BAQAAAAAAAAAAAP8AAAAAAAD/Av//Af8BAQD/AAAAAAAAAAIA/wD+AAEAAAAAAAIC4AL+AIClDIqhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX9HKPAgACcP8A/wAAAAAAAAIA/wD+AAEAAAAAAAAAAAAAAAAAAgD/AAAAAAD+AAEAAAAAAAIA/wD+AAEAAAAAAAIA/wH+AQEAAAAA/wL//wH/AQH///8AAAAAAAEBAQD///8AAQAAAP8CAP8B/wEB////AAAAAAAAAAAAAAIA/wD+AAEAAgD/AP4AAQAAAAAAAgD/Af4BAf8A/wAAAgD/AP4AAQEAAQD/Av//Af8BAf///wABAAEA/wD/AAAAAAAAAgD/AP4AAQEBAQAA/wAA/wL//wD+AAEAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAEAAQD/Af//AP8AAQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP8AAAAAAAEBAQAAAAAAAAAAAP///wAAAQD//wD/AAH/AQEAAAAAAAAAAAACAP///gORqQyKcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYO+AEPcG9L8B//8w/wH//wH/AQEAAAAA/wH//wD+AAEAAAAAAQEBAP8A/wABAAEAAAAAAP8B//8A/gABAAIA/wH/AQH///8AAAIA/wD+AAEBAQEA/wH//wH/AQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wH//wH/AQEAAAAA////AAEBAQAAAAAA/wH//wH/AQEAAAAAAAEAAP/+/wABAQEAAAAAAP8A/wABAAEA/wH//wH/AQH/Af//AP4AAQEBAQAAAAAA////AAEBAQAAAAAAAAAAAP8B//8BAQEAAP4AAf8B//8AAAAAAP4AAQEBAQAAAAAA/wH//wH/AQEAAAAAAAAAAAAAAAD/Af//Af8BAQAAAAAAAP8AAAABAP8B//8B/wEB////AAAAAAABAQEA/wH//wAAAAAB/wEB////AAEBAQAAAAAA////AAAAAAAAAgD/Af8BAf8B//8A/gABAAAAAAEBAQD///8AAQEBAP8B//8AAAAAAP4AAQEBAQD/Af//AAAD0Qn6A1GgEYjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg73gg+Ab6v//+ACAAAv//AP4BAQAAAAAAAgD//wD/AAD+AAEBAAEAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAgD/AP4AAf8A/wABAAEAAAIA/wD/AAEAAQD/AP4AAf8C//8B/gEB/wL//wEAAQAA/wABAP8AAP8C//8B/wEBAAEA/wD+AAEAAAAAAAAAAP8C//8B/gEBAAAAAAAAAAAAAAAAAAAAAP8B//8BAAEBAP8AAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAgD//wD/AAH+AQEAAAAA/wD/AAEAAQAAAQAAAAAAAAD//wAAAAEAAAAAAAAAAAAAAQAAAAEA/wD+AAEAAAAAAAAAAAACAP8A/gABAAIA/wD+AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8C//8B/gEBAAIA/wAAAAAA/wABAP8AAAAAAAAAAAAAAQEBAP4A/v8B/wEBAAAAAAACAP///v8BAQABAAAAAAAAAAAAAAAAAP8C//8B/gEBAAIA/wEAAeEI+gVBoBGI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDveCD3A/m/AAEBIP8A/wAAAAAAAQABAP8B//8A/wABAAAAAAEAAQD/AP8AAP8AAAAAAAAAAAAAAAEAAAABAP8A/wABAAEA/wD/AAEA/wAAAAAAAAABAAABAQEA////AAD/AAAAAQAAAAEA/wD+AAEAAQAAAAAAAAAAAAAAAQD/AP8AAQEAAAD/AAAAAAAAAAABAP8A/wABAAAAAAEAAQAAAAAA/wD/AAAAAAAAAQD/AAAAAAH/AQH/Af//Af8BAf8A/wAA/wAAAAIA/wH/AQH///8AAAEAAAEAAQD/AP8AAAAAAAEAAQAAAP8A/wEA/wD/AAEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAABAAEA/wD/AAD/AAAAAQAAAAAAAAEAAQD/Af//AP4AAQACAP8AAAAAAP4AAQAAAAABAQEA////AAEBAQD/AP8AAAAAAAAAAAABAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAgD/AP8AAQAAAAAAAAAAAAAAAAAAAAAAAQD/Af8BAf8B//8AAAAAAf8BAf8A/wAA/wAAAAIA/wH/AQEBAv/gCPoPMaARgPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUC+K//AgAf/gH+/wAAAAAA/wAA/wD/AAD/AAEA/wAAAP8AAP4B/v8A/wAA/wL///8C//8AAAAAAP8AAAD/AAH///8AAP4AAf8B//8AAAAA/wL//////wD+AP7/////AAAAAAAA/wAAAP4AAQAAAAAA/wAAAP8AAAAAAAD//v8BAP8AAP//AAAAAAAAAAAAAP8A/wD///8AAP8AAP4B/v/+Af7/AP8AAP8B//8A/gAB//7/Af///wAA/gAB////AAD/AAD/Av//AP7/Af///wD/AP8AAP8AAP8A/wAA/wAAAP8AAP///wD///8AAP4AAf///wAAAAAA/wL//wD/AAAA/wAA/wH//wAAAAD///8A/wH//wAAAAD/Af//AP8AAP///wD/AP8A/wL//wD+AAEA/gAB/wL//wAA/wD///8AAAEAAP///wAA/wAAAP8AAAD/AAD///8A/wD/AAAAAAAAAAAAAAAAAAAAAAD//v8BAP8AAAD/AAAAAAAAAP8AAAAAAAD/AP8A/v/+AAD+AAEA/gAB////AAABAP8AAAAA//7/Af///wD+/wAf9QXxvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV/NwjwACAC8A/v8B//0AAf8B////AP8A//7/AP/+/wD///8A/wD/AAD+AAH/Af//AP4AAQD+AAH/AP8AAAAAAP///wAAAAAA/wD/AAD+AAH/AP8AAP4AAQAAAAAA/gABAAEA//8A/wD/AP8A////AP8A/wD/AP8A/gH+/////wAAAAAA/wD/AP8B//////8A////AP//AAD/AQD//wD/AAD+AAEA/wAA/gH+/wD+AAH/Av//AAAAAP8A/wD/Av///wD/AP8B//8A/QAB/wAAAP8B//8AAgD//wD/AP8A//////8AAAAAAP8A/wD/AAAA/wD/AAAAAAD+Af//AAAAAP8A/wD+Af//AP4AAQAAAAD/Av//AP4AAf///wAA/gAB/wD/AP8A/wAA/gABAP4AAf8A/wD/AP8AAP4AAf8BAP//AP8A/wD///8B///+Af7//wD/AP8B////AP8AAAAAAP8A/wD/AP8A/gH+//8A/wAAAAAA/wL///8A/wD/AP///wD/AP///wAA/gAB/wH//////wD/AP8A/wD/AP/+/wH+Af7/AAAAAP8A/wD//v8BAP7/MFfzcI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZ9HNf/P39oP8C//8AAAAAAP4AAQAAAQAAAP8AAAIA/wH/AQH///8AAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAEAAQEAAAAAAAD///8AAAAAAAAAAQAAAP8AAAAAAAEAAQD/Av//AAAAAAAAAAAA/gABAAABAAAC//8AAAAAAP4BAQEBAAD///8AAQEBAAD/AAAAAAAA/wD/AAAAAAAAAgD/AP4AAQACAP8A/gEBAQAAAAAA/wD/AAAAAAAAAAAAAAABAAEA/wAAAAAA/wAAAAAAAQABAAABAAD///8AAAIA/wD+AAEAAAAAAQEBAP///wAAAgD/AP4AAQACAP8B/gEBAAAAAP8A/wAAAAEAAQEAAP///wAAAgD/AP4AAQEAAQD/AP8AAAAAAAEAAQD/AAAAAAH//wD/AAEAAgD/Af8BAf///wAAAgD/AP4AAQAAAAAAAgD/AP4AAQEBAQAA/wAAAAEAAAAAAAD/AP//AAEAAAAAAAAB/gEBAAEAAP8A//8A/wABAAAAAAAAAAAAAAAAAAAAAAABAP8A/wEBAAD/AAACAP8A/gABAAAAAAAAAQAAAP8AAQABAP8A/wAC/gRRqhGNsAAAAAAA9Vee6AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDveCD2Avi//gD/IP8AAAABAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAP8B//8B/wEBAAAAAP8B//8AAAAAAf8BAQAAAAAAAAAA/wH//wH/AQH///8AAQEBAAAAAAAAAAAAAAAAAP///wAAAgD/Af8BAQAAAAD/AAAAAAAAAAEAAAAAAAAA/wH//wH/AQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH//wH/AQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8B/wEB/wH//wH/AQEAAAAA/wIA/wH+AAH//wAAAAL//wH/AQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAAAAAAEBAQAAAAAAAAAAAAACAP8A/gABAAAAAAAAAAD//wAAAQMA/wD+AAH///8AAQEBAAAAAAD///8AAQMB/wD+AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH//wH/AQEAAAAAAAAAAP8AAAAAAf//AAAAAAAAAAAB/wEBAAAAAAAAAAABAADvC/4RIqARgPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQA+IAAAP8g////AAAAAAD/AAAAAAAAAAAAAAAAAgD///7/AQAAAAAAAAAAAAIA/wD+AAH/AP8AAAAAAAD/AAEAAAAA/wD/AP8C//8B/gEB/wD/AAD/AAAAAAAA////AAAAAAAAAAAAAAAAAAACAP8A/gAB/gL+/wAAAAAB/gEBAAAAAP8AAAAAAAAAAP8AAf8C//8A/gABAAIA/wH/AQH+AP7/AQABAQD/AAAAAAAAAP8AAQABAAD///8AAAAAAAAAAAD/Af//AAAAAAD+AAEAAQAAAP8AAAABAAAAAAAAAP8AAAEAAQH///8AAAEAAAAAAAD/Af//AP0AAf8CAP8BAAEB//4AAf8C//8A/gABAAIA/wABAAD/AP8AAAAAAAD+AAEAAAAAAAEBAP///wAAAAAAAAAAAAD9AAEAAgD/AP4AAQAAAAAAAAAA//0AAQAAAAAAAAAA////AAAAAAAAAAAA//3/AQAAAAAAAAAAAAAAAP8A/wABAAEAAAAAAAAAAAAAAgD/AP4AAQAAAAAAAgD/AP4AAf8A/wAAAAAAAAAAAAAAAAAA/wABAAAAAAAAAAD/AP8AAQEBAP///wD/AAAR9gDwcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWO94IPsB9t////8AAAIA/wH/AQH/Af//Af8BAQAAAAAAAAAAAAAAAP///wAAAQAAAAAAAAABAP8A/gABAAIA/wD+AAEAAgD/AP8AAQABAP8A/wABAAEA/wD+AAEAAAAAAAIA/wAAAAAA/wEBAQAAAP8A/wAAAQD/AP8AAQABAP8AAAAAAP8AAQD/AAAAAAAAAAMA/wH+AQH///8AAAEAAAD/AAAAAgD/AAEAAAD+AAEAAAAAAP8AAAACAP8B/wEB/wD/AAEAAQD/Af//AAAAAAH/AQH///8AAAAAAAEBAQD/AP8AAAEA/wD/AAEBAAEAAAAAAP8B//8B/wEBAAAAAAAAAAAAAAAA/wL//wD+AAEAAQD/AP8AAQEAAQD///8AAAIA/wD/AAEBAAEA////AAADAP8B/gEB/wH//wAAAAAA/wABAP8AAAABAAAAAQD/Af8BAf8A/wAA/wAAAAAAAAEBAQD/Af//Af8BAf8B//8B/wEB////AAAAAAABAQEA/wAAAAD//wAAAgD/Af8BAf///wABAQEA/wH//wH/AQH/Af//AAAAAAD+AAEAAAAAAAEAAAABAP8A/wABAAEA/wD/AAEAAAAAAAAAAAb/AyGoEZDgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+wL1f/4B/v8AAAAAAP4AAf///wAA/gAB////AP8B//////8A/gH+//8B//8A/wAA/wH///8A/wAAAQAA////AAAAAAD/AP8A/wH//wD+AAEAAAAA/wD/AAAAAAD/AP8AAP4AAf8A/wAA//8A/wD/AAD/AAD/AP8AAAEA//8A/wAA/gABAP8AAAAAAAAAAAAAAf4BAf4B/v8AAQAA////AAAAAAD/AP8AAP0AAQD/AAAAAQD//wL//wD/AAH/Af///wH///4B/v8A/gABAP4AAf7//gAAAQAAAAAAAP///wD//wAAAAAAAAD/AAD///8A/gH+/wD/AAH///8A/v/+AP4B/v/+//4A////AAD/AAD//v8BAP8AAP4B/v8AAAAAAP8AAQD/AAD+//8AAAAAAAD+AAH+//4AAP4AAf/+/wH///8A/wH///8A/////v8B////AP8B////AP8AAAAAAP///wAA/gAB////AAD+AAH+Af7/AAIA/wAAAAD/AP8AAP//AAAAAAAA/gAB////AAAAAAD/AP8A/wD/AP8A/wAAAAAA//7/AQAAAAAAAAAAAAEA//8A/wAA/wAAAP4AAQD/AAAA/wAAAP8AAPz+/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v4BQAD+AAH/AP8A/wD/AP8A/wD/AP8A////AP///wD/AP8AAP4AAQABAAD///8AAP4AAQD+AAH/AP//AP8AAf8A/wAA/gABAP4AAf8C//////8AAP8AAP8A/wAAAQD//gH+/wH/AQH/AP8A////AP8A/wAA/gAB//7/AQD+AAH/AP8A/wD/AP8B//////8A/gD+/wD+AAH+/v8AAAIA//8A/wAA/wAA/wH///8A/wAA/gABAP8AAP///wD//v8BAP8AAAD9AAH///8A/wD/AAAAAAD///8A/wD/AP8A/wD/Af7///7/Af8A/wD///8AAP4AAf///wD/AP8AAAEA/wD+AAEAAAAAAP4AAf8B//8AAAAA/wH//wD/AAAAAAAA////AP///wAAAP8A/wD/AP8A//8AAAAA/wL//wABAP8A/wAAAP4AAQD/AAEAAQD//wD/AAD/AAABAAEAAAAAAP8A/wD/Av///wD/AP8A/wAA/wAA//7/Af8AAAD/Af///wD/AP8A/wD/AP8A/wD/AP8A/wD/AP//AP4AAf8A////AP8AAAAAAP8A/wD/Av////3/AQD+AAH///8A/wH//wAAAAD/AP8A/wD/APwD/W5g74AQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAABT72xQAP/+IAD/AAD//wAA////AP8B////Af///wD/AP/+/wH/Af///wH////9/wH/Av//////AAD/AAAA/gAB/wH///8B////Af//AP8AAP/9/wH///8A////AAD/AAAA/wABAAAAAP7+/gAAAAAA/wH///8B//8AAQD/////AP///wAAAAAAAAEA///+/wEAAQAA//7/Af8B//8AAP8A//3/Af///wD//v8BAP4AAQAAAAD///8A/wD/AP///wD///8A/wD/AP8C//8AAAAA/wEA/wD/AAD/Af//////AP///wAB/wEB/wH//wD/AAAAAP8A/wH//wAAAAD///8A//7/AQAAAAD/Af//////AP8A/wAA/wAAAP4AAQD+AAH/AP8A/wD///8C//////8AAAEA///+/wEA/wAAAP4AAf8A/wD/AP8A/wL//wABAP///v8B////AP8A/wD/AP8A/v/+AP8B/////f8BAAEA//8B/////v8B////AP8B/v///QAB/wH//////wD///8A////AAD/AAD//v8B//8AAP/+/wEA/f8BAAAAAP8B//8A/QABAAEAAAD/AAD/AP8A//7/Af7//gD/Af//////AAH+ARH1BO0vAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gBQ/wD/AP4B/v8AAP8AAAAAAAD+AAEA//8A/wH//wAAAAAA/gABAP4AAQACAP8A/gABAAAAAP8A/wD/AP8AAP4AAQD+AAH///8A/wD/AAD/AAD/Af////7/Af8A/wD+AP7/AP4AAQAAAAD/Af//////AAD+AAH+//4A/wH//wAAAAD//v8A//7/Af8B//////8AAAAAAAD9AAH/Af//AAAAAAAAAAAAAAAA/wD/AP///wD/AP8AAP4AAQACAP8AAAAAAP4AAQD+AAH/AP8AAP7/Af4B/v8A/QABAAAAAAAAAAD///8A////AP4B/v///wAAAP4AAf///wAAAAAA/wH///4A/v8A/QABAAAAAAD+AAH///4A/wD/AP8A/wD+/v4AAAAAAAD+AAEAAAAA//7/AQAAAAAAAAAA/wD+/wD+AAEAAAAA//8AAP/+/wEAAAAA/wH//wD+AAH///8A////AAD+AAEAAAAA///+AAH/AQEAAAAA/wH//wD+AAEAAf7/AP4AAQAAAAAAAQD/AAAAAP8A/wD///8A/wH+/wAB///+Af///wH//wD+AAH+Af7/////AP8A/wD/Af//AAAAAAD/AAAA/gABAAAAAP8A/wD7/gBQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+Av4u////AAD+AAH///8A////AP8B/////gABAP4AAf///wD///8A////AP/9/wEAAAAA/gH+//4B/v////8A////AP8B//8A/gAB/wH///8C//8AAAAAAAAAAP///wAA/gAB/wH//////wAA/gABAf8BAf///wAA/gABAAAAAP8B////AP8A////AAAAAAD///8A////AP8A/wAA/gAB////AP///wD/Af//////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAD/AP8AAAAAAP8B//////8AAAAAAAD+AAH/AP8A////AP///wAAAP8AAAAAAAD+AAH/Av//AAAAAP8B////AAAA/wH//////wAAAgD/AP8AAf///wAAAAAA////AP///wD+//4A//4AAQD//wD///8A/wD+AP///wD///8AAAAAAP8B//////8AAAAAAP///wAAAAAAAP8BAf7+/gD///8AAP4AAf///wD//gABAAAAAP///wD//v8B////AP///wAAAAAAAP4AAf8AAAAA/gAB//3/AQAAAAAA/gAB/wH//////wAAAAAAAAAAAAABAAD///8A////AP///wAA/v5QAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAGDvgBDv/urv/wH//wH/AQEAAAAAAAAAAP8B//8A/wABAP8AAAAAAAABAQEAAAAAAP8A/wABAAEA/wD/AAD/AAAAAAAAAAEAAAD/AAABAQEA/wH//wAAAAAAAAAAAP8AAQABAP8AAAAAAP4AAQABAAAAAAAAAQABAP8A/wABAAEAAAAAAAAAAAD/Af//AAAAAAH/AQEAAAAA////AAACAP8AAAAAAf8BAQAAAAD///8AAAIA/wABAAAA/gABAQABAP///wAAAwD/Af4BAQAAAAAAAAAAAAAAAP8C//8B/gEBAAAAAP8A/wABAAEAAAAAAP///wABAQEA////AAABAAABAAEAAAAAAP8A/wABAAEAAAAAAP8B//8A/wABAAEA/wH/AQH/Af//AP8AAQEAAQAAAAAAAAAAAAAAAAD/Af//Af8BAf///wAAAAAAAQEBAP8A/wAAAAAAAAAAAAEAAQAAAAAA////AAAAAAAAAAAAAAIA/wD/AAEAAQD/AAAAAAD+AAEAAgD/Af8BAQAAAAD/AP8AAQABAAAAAAD///8AAQEBAP8B//8B/wEB/wH//wD/AAEBAAEA/wH//wD/AAEBAgH///7/AQAAAAAA/wAAAQEBAP8A/wABAAEAAQIWEbARgPAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPT87DD/Af8AAP8AAf8A/wAAAAAAAAAAAAD/AAEAAAAAAAL//wAAAQD+AP4AAf4BAf8C//8A/gABAAEAAP8B//8B/wEBAAAAAAAAAAD///8AAP8AAf8C//8B/gEBAAAAAAD/AAEAAAAAAAIA/wD+/wH/AgD//wD/AAH+AQH/AP8A/wL//wEAAQAAAAAAAP4AAf8B/wAA/wAAAAAAAAD/AAEA/wAA/gH+/wABAAAB/wEB/wD/AAD/AAABAAEA////AAAA/wAA/QEBCgIJABYBEgAiBRwAFQITABcCEwELAQkAFgMTAAsBCQAAAAAAAAAAAAAAAAAAAAAAAAAAAOr97gAAAP8A6v7uAOn+7QDf/OQA9f/3AN/95AH1//YAAP8AAf8A/wAA/wABAAAAAP8A/wAAAAAAAAAAAAAAAAAAAQAA/wH//wD/AAH/AP8AAP8AAAAAAAAAAAAAAAIA///+/wEAAgD//wH/AAH+AQH/Av//Af4BAQAAAAAA/wABAAIA/wAAAAAA/gAB/wL//wAAAAAA/wAB////AAAAAAAAAQAA////AP8A/wAA/wAAAP8AAQABAAD/AP8AAP4AAQACAP///f8BAAAAAAAAAAAAAQAA/v/+AAACAP8A/wABBgDqIAAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPkH/w8A+v8AAAAAAAAAAAAA/wAAAAEAAAACAP8A/QABAf4BAf8B//8AAQAAAAAAAAD+AAH/Af//Af8BAQAAAAH/AP8AAP8AAAAAAAABAAEAAAAAAAD+AAH/AP8AAAAAAAAAAAAAAAAAAP4AAQD/AAAB/gEB/wH///8B//8A/wABAP8AAAD/AAH/AP8AAP8AAAAAAAAAAAAAAAAAAAH/AQD/AP8AAP8AAQD/AAD/Af//AP8AAAAAAAAWARIANwcvACIEHQArBSUAFwITAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYCEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf/eQA6v3tAMn60QDd/OMA3/zkAAEBAQD/Af//AP8AAQACAP8B/gEB/wD/AAAAAAAAAQD/////AQABAP8A/wABAP4AAQEAAQD//v8BAQABAP8A/wAB/gEB/wD/AAD/AAAAAQAAAP8AAAABAP8A/wABAP4AAQAAAAABAAEAAAAAAAAAAAD/AP//AAEAAAD/AAH/AP8A/wH//wH/AQEAAAAAAAAAAAH+AAH/AAAAAP8AAAABAAAA/wAAAAEA/wD+AAH/Af///AMCLwAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAH5/zH+Av//AP4AAQACAP8BAAEBAP8AAAD9AAEAAAAA////AP///wEBAgH//gH+/wAAAAAB/gEB/wL///8A/wAB/gEB/wL//wH+AQH/AP8A/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAAAQEBAP8C//8A/gABAP8AAf8C//8AAQD/AAAAAP8B//8AAAAAAf8BAQD/AAD/AP8AAAIA/wD+AAEAAAAAAAAAAP8C//8tAyYBOAcwADcGLwAXAhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAxwAIQMcADcGLwAAAAAA6v3tANP82gC9+McB0/vaAAH+AQH///8AAAAAAAAAAAD/Af8AAf8BAAD/AAEAAQAA////AP8C//8AAAAAAP4AAQABAAD+//4AAQABAAACAP8AAAAA/wD/AAH+AQEAAQAAAP8AAP8C//8A/gABAAAAAP8C//8B/wEB////AAEAAQD/Av//Af4BAQAAAAAAAgD/AP8AAf4B//8A/gABAAIA/wH/AQH///8AAAEAAAH/AQAA/wAB/ff/IQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA/Q8A/gABAAAAAAD+AAH/AP8AAAAAAAAAAAAAAAAAAAAAAAD/AAD//v8BAAIA/////wAAAAAA////AAH/AQH/AP8AAP4AAf8A/wAAAAAA/wH//wH/AQEAAAAA/wD/AP8B//8B/wEB////AAD/AAH/AP8AAAIA/wD+AAEAAAAAAAAAAAAAAAAAAAAA/wD/AP8B//8BAAEAAP4AAf8A/wAKAwn/TwdDAU8JQgELAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgMTAEMDOQBDBzkA6v3tAMj60QCy+L0A6f3tAAAAAAAAAAAA/wD/AP8B//8B/wEB/wH//wH/AQD/AP8AAAAAAAD/AAAAAAAA/wD/AAD//wAAAAEAAP4AAf4C/v8A/gABAAIA/wH+AQH/AP8AAAAAAAD+AAH/AP8AAAAAAP8A/wAA/gAB/wD/AAACAP8A/gAB/wH//wD/AAABAQH/Af8BAf///wAAAAAAAP4AAf8A/wAA/wAAAgH+HwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8BACD/AP//AP4AAQAAAAAAAgD/AP4AAQAAAAAAAAAAAAIA/wABAAAA/gABAP0AAQAAAAD/AP8AAP8AAf8A/wAAAAAAAQEBAP///wAAAgD/AAAAAAAAAAAA//8A/wAAAAD/AAEAAQAA////AAACAP8A/gABAP0AAQACAP8A/gABAAIA/wAAAAAB/wEBAAAAAAD+AAH/AP8ALQcn/1oJTAEtBSYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgMTAE4JQgBOCUIAvfnHALz3xwDT+9kBAAAAAAABAAD///8AAP8AAf8A/wAAAAAAAAEAAP///wABAQEA////AAEAAQH///8AAAIA/wD+AAEAAAAAAP8AAAAAAAD///8AAAIA/wD/AAAAAQAAAf8BAf8B//8AAAAAAf8BAf/9/wEAAgD/AP4AAQAAAAD/AP8A/wD/AAAAAAAAAAAAAAAAAAACAP8A/wAB/AABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/w8A/gABAAAAAP8B//8AAAAAAQABAAAAAAD/AP8AAf4BAf///wABAQEA/wD/AAEAAQD///8AAQEBAP8B//8AAAAAAP8AAQAAAAD//f8BAAIA//8A//8AAAABAQABAAAAAAD+//4AAAEA/wD9AAEBAQEAAAAAAAD+AAH/AP8AAP8AAAH/AQH/AP8A/wH//y4GKAFaCkwALQUmAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwc5AEMHOQDT+9oApvWzANL82QAAAAAAAQABAP8A/wAAAQD//wD/AAEAAQH///8AAAD/AP8BAP8A/wABAP4AAQACAP8A/gAB/wD/AAD/AAAAAAAAAP4AAQAAAAAA/wAA/wD/AP/+/wEBAQEA/gD+AAEAAQAA/gAB////AAEBAAAAAAEAAAIA///9/wEBAQEAAAAAAP/+/wEBAAEAAQIAIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAH//wH+/wAAAAAAAAAAAAEA/wAA////AAAAAAAAAAAA/wL//wAB/wD//gABAAAAAP8A/wAAAgD/////AQD+AAEAAAAA/wH/AAD/AAAAAP8AAP4BAQAAAAD/Av///wD/AAEAAAAA/gEBAP8AAQACAP///v8BAAAAAAACAP8A/gAB/wH/AAABAP8XARMBcQ5gAS0FJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtBSYAhxBzALz4xgGm9bQA6f3sAAACAP8A/gABAAAAAP8A/wAAAAAAAAAAAAD9/wEAAAAAAAIA/wD/AAABAAEA/wD/AAD/AAAAAAAAAAAAAAABAAAAAAAA/wH//wH/AQH/Af//AP4AAf8C//8A/gABAAAAAP8BAP8AAP8AAP//AP9XONUCAAAgAElEQVQCAP8A/wABAP8AAAAAAAD/AP8AAP79EAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7+ASD/AP4AAAAAAAABAP8B/gEB/wD/AAEAAAD/AAAAAP4AAQAAAAAAAf//AAAAAAH/AQH//v8BAAEA/wACAAAA/wAAAAEAAAH/AQH/AAAAAQAAAP8A/wAA/gABAQABAAAAAAD///8AAAMA/wH+AQH/AP8AAP8AAAD+AAEAAAAAC/8KAVAKRABbC00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQIOgBECDoApfWzAKX0sgEAAwD/AP4AAQAAAAAAAQD/AAEAAAD+AAEAAAAAAP4AAQABAP////8AAAAAAP8A/wAAAAAAAAEA/wD/AAEAAAAAAAAAAP8A/wAA/QABAQEBAP///wAAAAAAAQABAP/+/wEAAAAAAAEA/wD/AAH/AP8AAAAAAAABAP8A/wAB//8CEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///QD/AgD/AAAAAAD/AAD///8AAQABAP8AAAAAAAAAAAAAAAAA/wAA/wEBAAAAAP4A/gABAAEAAP8AAQAA/wAAAAEAAAAAAP8A/wAAAQAA/wD/AAD/AAAAAAAA/wH/AP8B//8A/wABAf0BAf8A/wD/AP8AAQEBAP8B//8jBB4AfQ5qARcDFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWwtNAEQIOgB38YsA6v3tAP8C//8B/wEBAP4AAAABAAAAAAAAAP8AAP///wEAAgD/Af4BAQAAAAAAAAAA////AQEBAQD/Af//Af4BAQAAAAAAAAAA////AP8B/wAA/wAAAAAAAAAAAAAAAAAA/wH/AAABAP8B/wEB////AAAAAAAB/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAA/gABAP4AAf///wAAAAAA/wD/AP8B////AP8A/wD/AP//AAD/AP8A/wH///8B////Av//////AP8CAP//AP8A/wD/AP8A/wD///8A//7/AP8A/wD/AP8A////AAD+AAEAAAAA/wD/AP8A/wAAAQD/AAAAAFAHRAGUEX4BFwMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcDEwCgEogBWgtNAAD+AAH/Af///wD/AP///wD/Af///gH+/wABAP////8A/wD/AP8A/wD/AP8AAAAAAP///wAA/gAB/wD/AP8C////AP8A////AAD+AAEAAAAA/wD/AP8A/wD/AP8AAAAAAAAAAAD///8AAAAAAAABAAD/AP8A/wD9AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8AABAA//8AAAAAAAH/AQH/AP8AAAIA/wD+AAEAAAAAAQEBAAABAAD///8AAP8AAQEAAQAAAQAA/wD/AAD9AAEBAQEAAAAAAAD/AAAAAQAA/wD/AAD/AAAAAgD/AAAAAAH/AQH///8AAQEBAP///wAMAgsBZwxXAEUJOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAxOAAwCCgCj9LEB9QH2/wH/AQH///8AAf8BAf///wABAQEA////AAACAP8B/wEB/wH//wAAAAAAAAAAAP4AAQD9AAEAAAAAAAAAAAD/AAAAAgD/AP4AAQACAP8AAAAAAP0AAQAAAAAAAAAAAAIA/wD9AAEAAAAAAgICDwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/ABAAAAAA/wD/AP8A/wAAAAAA//3/AQAAAAD/AP8A/v/+AP7+/gD/Af///wL///4B/v/+/v4A/wH//wAAAAD+AP7//gD+//8A/wD///8A////AP8B//8A/gABAP4AAf///wAAAAAA////ABcDFACJEHQARQk7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAKRACWE38AFwETAf7//gAA/gAB/v7+AAAAAAD+Af7/AAAAAP///wD///8AAf8AAQD+AAH///8AAAAAAAAAAAD/Af///wD/AAAAAAD//v8BAAAAAAD+AAH//f8BAAAAAAAAAAAAAAAAAP4AAQAAAAD///8A/v7+EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP4B/v//Af//AP8AAP8B//////8AAAAAAP///wAAAAAAAP8AAAAAAAAA/gABAP8AAAD+AAEAAAAAAP4AAf///wAA/wABAf8BAf8A/wD///8AAAAAAAD/AAH///8A/gH+//8B//////8AFgMTAIoSdQAjBR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAxQAihJ2ABgDFAD///8AAAIA//8B//8A/QABAAAAAAD+AAH///8A/gD//////wAAAAAA////AP///wAAAAAAAP8AAAAAAAAAAQD//wH///4B/v8AAAAA/wH///8A/wD///8A////AP4B/v8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+AAH//f8B/wD/AAD+AAH/AP8AAAAAAP8A/wD///8A/wH///8B////AP8A//7/Af8B//8AAP8A/wH///8A/wD/Af///gD+/////wD/AP8AAAAAAP///wD/AP8AAf4BAf/9/wEXAxQAixJ2ABcDFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwMUAIoSdgAXAxMA//7/AQD+AAH+Af//////AP8A/wAAAAAA//7/Af8C/////v8B/wD/AP8B//8A/gAB/wL///7//gD//v8B//7/AQD9AAH/Af////7/Af8A////AP8AAAAAAAD+AAH///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B//8AAQAA/wH///4B/v8A/wAA////AAD/AAAA/wAAAP4AAf8A/wD//wAAAP8AAAD/AAH/AAAA//4AAQD/AAD//QABAP4AAQD/AAAA/wAA////AAAAAAD//wAA/wD/ABgEFQCLE3YAFwMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcDFACLE3cAFwMUAP///wAB/gAB/gH+////AAD///8AAP8AAAD+AAEAAAAAAP8AAP/+AAH///8AAP4AAQAAAAD/Af////8AAAABAAAA/gABAAAAAAAAAAAA/wAA/wD/AP///wD/Av//AAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+AQH/AP//AP4AAQD+AAH/AP8A/wD/AP8B////AP8AAAAAAAD+AAEAAP8A/wD/AP8A///+AP7/AAH///8A/wAAAP8A/wH//wABAAD/AP8A/wD/AP///wD/Af//CwEJAIsTdgAXAxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAxQAgBFtAAsCCQD///8AAP4AAQAA/wD/AP8A/wD/AP///wD///8A/wD/AAD//wD/AP8A////AP///wAA/gABAAD/AP/+/wD/AAAA/wH///7//gD+Af//////AAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//gD//v8B/wH//wD/AAD/Af///wH//wD/AAH/Af///v/+AAD/AAAAAAAA/wH////+/wEA/gABAP8AAQAAAAD///8AAP8AAf/+/wAAAAAAAAAAAP///wAB/wABXQ1QABcDFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwUeAGkOWgD/Av///wH//////wD/Af//AAAAAP8B//////8A////AAAAAAD/Af//AP8AAAD/AAD/Af//AP8AAP8C////Af7/////AAAAAAAB/wABAAAAAAAAAAAB/gEB/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAf8A/wAA/gABAP4AAf7//wAA/gABAAAAAP8A/wD///8AAP4AAQAAAAD/Af//////AP4A/v8AAgD//wD/AP4B/v/+AP7//gD+/wAAAABRC0UAUgtGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEYKPABSCUYBAP4AAQACAP////8A////AAD+AAEAAAAA/wH///8A/wAA/gAB/wL///8A/wAA/gAB/v/+AP///wAA/gABAP4AAQD+AAH+//4A////AP4A/v//AP8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B////AP8A/gH+/////wD///8A////AP8A/v////8A////AP///wD///8AAAAAAAAAAAAA/gAB////AAD+AAH///8A////AAD/AAEA/gABAAAAABcDFABqD1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeDlEAFgUT/wD+AAEA/wAB////AP8B//8AAAAA/wAAAP8AAAD///8A////AP8AAAD///8AAAAAAAAAAAD///8A////AP///wAAAAAA////AAD/AAH+Af7/AP4AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP/+/wEA/wAAAP4AAQAAAAD/AP8AAAAAAAD/AQEAAAAA/wD/AP8A/wD/AP8A////AP///wD/Af///wAAAP8B/////v8BAP8AAP///wAAAAAAAP4AAY0UeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgoAdg9lAf8A/wD/AP///wD/AP/+/wH+//8AAP3/Af///gD/AP8AAP4AAf8A/v////8A/wD/AP/9/wEAAAAAAAAAAP8B//8A/wAA/wH//wD/AAAA/wAA/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wH//////wAA/wAA////AP8B/v////8AAP8AAAD/AAD/Af//////AP4B/v//AP8AAAD/AP8A/wD/Af///wD/AAD/AAD///8ARgo8ABgEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAcpAFILRgAA/gABAP8AAP8B////Af7//wL//wD/AAAA/wAA////AAD+AAEAAAAA/wH//wAAAAD///8A////AAD/AAH+Af7/AP4AAf///wAA/gABAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP4AAf8A/wAAAAAA/gH+/wD+AAH/AP8A/wD/AAAAAAAA/QABAAAAAAD+AAEA/gAB//7/AAD/AAAA/gAB////AP8A/wAXBBQAXw5RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8OUgALAgoA/wD/AAD+AAEA/gABAP0AAf8A/wD/AP8A/wD/AP8A/wAAAQAAAAAAAAAAAAD/Av///wD/AP///wAA/wAA/wH///8A/wD/AP8A//3/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAP//AAD/AAD+Af7/AP4AAf8B////Af//AAAAAP7//gAAAQAA/wD/AP8B//8A/wAA/wD/AP/+/wEAAAAA/wH///8B//9HCj0AGAQVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCCgBTDEcAAAAAAAAAAAAA//8A/wD/AAD/AAAA//8A/wH//wAAAAD+/v4A/1yWnxoAACAASURBVP3/Af///gAA/f8BAAAAAP8B////AP8A/wD/AAAAAAAAAAAA/wL//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/wAAAP8A/wAA/gABAAAAAAD+AAEA/gAB////AAAAAAD///8A////AAD+AAH/AP8AAAEA/wAAAAD///8AAP4AAQH+AAFICz0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUDUgACgII/////wD+Af//AAAAAP8A/wD/AAAAAP4AAf///wAAAAAAAAAAAP8CAP//AAAA/wH//////wAA/gABAP4AAf///wD+AP7/AP4AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B////Af///wH///8B//////8A/wD/AP///wD///8AAAAAAP///wD///8A/wD/AAAAAAD/AP8A/gD+AP///wD///8A/wH//0cLPgAYBBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgoASQo/Af///wAA/wABAAD/AP8B//8AAAAA////AAAAAAD///8A////AP/9/wH/Af////3/AQH/AQH///8A/wD/AP///wAA/gAB/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+AAEAAAAAAP7/AQD+AAH/AP8A/wH//wAAAAD/Af//////AAAAAAAAAAAA//7/AP///wD///8AAP4AAQAAAAD/AP8A////AFQNRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAkzAAAAAAD/AP///v//AP///wD///8AAAAAAP4A/v8AAAAAAAAAAP8A/wD///8AAAAAAP7//gD/AP8AAP8AAP8C//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD//v8B//8AAP8B//8A/wAAAP4AAf8A/wD/AP8A/wH//////wD+Af7/AAAAAP8A/wAAAAAA/wH///8B//8AAQD/JAQfASQGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgqADAHKQAA/wABAP8AAAAAAAD///8A/wH//wD+AAH///8A////AAD/AAAA/gAB/gH+/wABAP8A/wAA/gH+/wD9AAH/AP8AAP4AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8C//////8A/wL////+/wH/AP8AAP8AAP///wAA/wAAAP4AAf8A/wAA/gAB/wH//////wD///8AAf4BAf/+/wEA/gABPQo0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8IKQD///8A/wL///8A/wD/AP8A//7/AQAAAAD/AP8AAAEAAP8B////AP8AAAAAAP/+/wH/AP8AAAAAAP8B//////8A/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP4AAf///wAAAAAA/wD/AP8B/////v8B/gH+/wD/AAAAAAAA//7/Af///wAAAAAA////AAD/AAD/AP8AMAgqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEIKgD///8AAP4AAf///wAAAAAA/wH///8A/wAAAQD///7/AAD/AAEAAAAA//3/AQAAAAD/Af//////AP8A/wD/Af//AP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD+AAH/AP8AAAAAAAAAAAD///8AAAAAAAD/AAEAAgD/AP4AAf8A/wAA/wAAAAAAAAAAAAD/Af//////AQEAAQAMAQsAMQgqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEIKgANAgsA8v/0/wH+AQH/AP8AAP8AAf8A/wAA/wABAAAAAAABAP8AAP8AAAEBAP8A/wAAAAAAAAAAAAD+AAEBAQEAAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAA/wD/AAAAAAD//v8B/wD/AP8A/wD/Af//AAAAAP///wAA/gABAAAAAP8B//8kBh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBh8AAP4AAf///wD/AP8A/wD/AP8B////Af///wH//wD+AAH//wAA//3/Af/+/wH//v8B//7/Af///wD+//4A/v7+AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD+//4A/wH//wAAAAD+/v4A////AP4B/v//AP///wH//wD/AAAA/gAB////AP8C//////8A/wH////+/wElBh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBh8A/wH//wABAAD/AP//AP8AAP8A/wD/AP8AAP4AAf///wAA/gABAAIA/////wAA/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8B//8A/gABAAAAAf8B/v8AAQEAAAAAAAD9AAEAAQAA/wD//wD/AAAAAAAAAAAAAAD+AAEAAAAAAP4AAQABAP8YBBUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAxUAAP4AAf8C//8A/gAB/wD/AAD/AAAA/gAB/wD/AAAC//8A/gEBAP//AAACAf///f8BAAEAAAD/AAAAAgD/AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP/+/wEBAAAAAAABAAD+AQEAAAAA/wL//wAAAAAB/wEAAAEAAP8A/wAAAgD/AAAAAAD/AAD/Af8AAAAAAAD/AAAZBBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZBRUA/wD/AAD+AAEAAgD/AP4AAQD+AAEAAAAAAAAAAAD+AAEAAP8AAAAAAAH9/wH/AAAAAf8BAP8B//8A/gABAAIA/wAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD+Af//Af4AAQABAAAAAAAAAP4AAQAAAAD+Af7/Af0BAQABAAAA/gABAAAAAP8B//8B/gEBAAAAAAAAAAAMAgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgsAAAAAAAAAAAD///8AAQABAAAAAAAAAAAAAP8AAAEBAAD//wAAAP0AAf4A/wAAAgD/AP8AAf8A/wAAAQD/Af8BAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8B//8A/gABAAH/AP//AAAAAAAAAAIA/wAAAAAA/gAB/wL//wD+AAEAAAAAAAAAAAABAAD///8A/wH//wH/AQENAgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgoA////AAAAAAD/AP8AAP8AAAAAAAAAAAAAAAIA///+AAEAAAAAAAAAAAAB//8AAAEA/wH//wAAAAD///8AAQABAQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP/9/wEAAAAAAAABAP8A/wABAAAA//4AAQEAAQAAAP8A//4AAQD/AAABAQEA/wH//wH+AAH//wAAAQABAf///wAMAwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAgsAAAAAAP8B//8A/wABAAAAAP///wAAAQAAAP4AAQEAAQD///8AAAAAAAEAAQH//v8AAAAAAAAAAAAAAgD/////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gH+//8A///+AP//////AP///wD/AQD/AP8AAAAAAAD+Af7/AP4AAf//AAAAAAAA////AAACAP/0/PUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn/OsA/gD+/wD+AAH/Af///gD+/wAAAAD/Af//AP8AAP4B/v//AP8AAAAAAP4B/v8AAv//AAAAAAAAAAAA/gAB////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wAA/wAAAP0AAQAAAAAAAQAAAP8AAP8A/wAA/wAAAAAAAAABAP8A/gAB////AAABAAAAAQD/Af8BAf///wDy//UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEAAP8A//8ArpqZCAAAIABJREFU/QABAAIA//8A/wAA/gAB/gH//wH+AAEAAQD///7/AQAAAAD//gABAP//AAAAAAAAAQAAAAEA/wAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA////AAEAAQAAAAAAAAEAAP///wAAAgD/AQABAAD+AAEAAQAA/wD/AAD/AAABAAEA////AAD/AAEAAAAA////Aef76gAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL99QAA/QABAAAAAP8A/wAAAAAAAf8BAP8C//8A/gABAAABAP///wEAAgD/AP0AAQACAP8B/wEB/wL//wAAAAAA/gABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH///8A/wD+Af7//wD//wAAAAAA/gAB//7/Af8A/wD//v8A////AAAAAAD///8AAAAAAP8B////AP8A/wEA//P99QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOn86///AP8A////AAAAAAAA/gAB////AAD9AAEAAAAA////AAEAAQAA/QABAAEA/////wD/AP8AAP4AAQAAAAD/Af//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP4AAf8A/wAA/wABAAEAAP///wAAAAAAAAIA/wAAAAAAAQAAAP4AAf8A/wAAAAAAAP8AAP8A/wAA/wAAAP8AAdr53wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT76QEAAAAA/wD/AAD/AAAAAgD/AP8AAQAAAAAA/wAAAAIA///+/wEAAAAAAP4AAQABAP//Af//AP4AAQD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//wAAAAD///8A////AP8B////Af//////AAD+AAH//f8BAAAAAAAAAAAAAAAA/wH//wH/AQH///8A/wH//9j33gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANn33gD+Af7/AAAAAP8B//8A/gAB/wH///8A/wAAAAAA//3/AQAAAAD///8AAAAAAP8A/wD///8AAAAAAP/9/wH//v8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf///wAAAAAA/gH//wD+AAEA/gABAP4AAQAAAAABAQEA////AP///wD///8AAAAAAP///wAAAAAAAP4AAef76QDz/vUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM320wAA/QAB////AP///wD+Af7/////AP8A//////8AAAIA/////wAAAAAA/wH//wD+AAEA/gAB////AAAAAAD/Av//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//////wD/AP8AAP3/Af8B////AP8A////AP7+/gD+AP7/////AP8C////AP8A//7/Af8A/wD/Af//////APL/9P/Z+N4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzfbTAP///wD/Av///wH//wAAAAAA/wAAAf8BAQD/AAEAAAAA//7/Af8A/wD///8A//7/Af8A/wD/AP8A/wD/AP8A/wAA/gABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAQACAP8A/wAAAAAAAAD+AAH/Af///wH///8A/wD//v8BAAEAAP/+/wD///8AAP8AAP8A//8A/gABAAEAAP/+/wHA88gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsvG9AAACAP8A/QAB/wD/AAD+AAH/AP8A////AAD/AAD+//4AAP8AAAD/AAD/AP8AAP8AAP8B//8AAQD///8AAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP/+/wH///8A/wD/AP8A/wAA/gABAP8AAQABAP8AAAAA////AAAAAAAAAAAA/wH//wD/AAH/Af////7/AP8B//+x8rv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzPXTAP///gD+Af7/AP4AAf///wAA/QAB/wD/AP///wAAAAAA////AP///wAAAgD//wD/AAD+AAH+//4AAQAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wL//////wAAAQAA/wD//////wD///8AAP8AAP8A/wAA/wAA////AP/+/wH///8A//7/Af///wD//v8B/wD/AAD+AAH0/PYBzPXTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM9tMA5froAAD/AQEB/wEBAP8AAP8A/wD/AP8A////AAAA/wAA//8A/wD/AP8A/wD//f8B////AP///wAA/gAB/gH+/wD//wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8A//7/AQAAAAAAAAAA/gH+/////wD/AP8AAP//AP8A/wAAAAAAAAAAAAAAAAD/Af//AAIA//8B///+AP7/pe6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACy8bz/////AP///wD+/v4A/wD/AAAA/wD///8AAAAAAP8AAAD/AAAAAAAAAP8B//8AAAAAAP8AAAAAAAD/Af//AP//AP4A/wD//f8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf7//gD///8AAAAAAP///wD///8AAP4AAQD+AAEAAAAA/wAAAAD/AAD/Af///wD/AP4A/v8A/gAB//3/AQD+AAH//v8BvvPHAPP99QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOb66QCx7rsBAAIA/////wAAAAAA/gH+////AAAAAAAA/wH///8B///+//4A////AAAAAAD///8A/wD/AP///wAA/wAB//4AAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP//AP8AAAAAAP8A/wD/Af//////AP///wD+//4A/wL///8A/wAA/gAB//7/AAD/AAH/AP8A/wD/AP///wAAAQD//wD//6TtrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJfrpQAAAAAAAAD/AP8A/wD///8AAP4AAf8B//////8A////AP///wAAAAAAAAAAAP///wD///8A////AP8B/////v8A/wL//wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v/+AAD//wD/AP//////AP///wD//v8BAAAAAP8A/wAA/wAA////AP///wD+//4A/wD/AP///wAA/wAAAAH//wABAAAA/gABAP4AAZbqpADm+ukAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5vrpALDvugD///8A/v3/Af///wAAAAAA/wH///8A/wD/Av//AAAAAAD+AAEA/wAA////AAD+AAEAAQAAAAAAAAD/AAEAAgD/AP0AAf///wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAEA/gAB/gH+/wAAAAAAAAAA////AP8B////AP8AAAAAAAAAAAAAAQD/AP8AAAAAAAD///8A//0AAf///wD/Af7//wH//wAAAAB85Y0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAluqkAP8B////AP8AAP//AAEAAQD/Af//AP4AAQH+AQEA/QAB/v/+AP8A/wD/AP8A/wD/AP8A/wD/AP///wD/AP///wD//v8B/wH//wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH///8B//8AAAAAAP4AAf8B////Af///wD/AAEAAQAAAAAAAP4AAf///wD/AP8A/wD/AAD//wD/AP8A/wD/AP///wD/AAAA/wD/AP///wDK9tH/y/XSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACx77sAsO+6AAH/AQH///8A/wAAAP4B/v8A/gAB/wH///8A/wAAAQAAAP4AAf///wD///8AAP//AAAAAAD//v8B/wH//////wD///8A////AP7//gAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf///wD/AP8AAAAAAP/9/wEA/gABAAAAAP/+/wH+AP7/////AAAAAAAA/gAB////AP8AAAAAAAAA/wH//wAB//8A/gABAP4AAf8B//8AAAAAfOSMAPP99QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOb66ACW6qMAAAAAAP///wA9p224AAAgAElEQVQAAAAAAAAAAP/9/wH/AP8AAP4AAf///wD+AP7/////AAAAAAAAAAAA/wAAAP///wAA//8AAP4AAQAAAAAAAAAAAP8AAf8B////AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAD+AAH/Af///wD/AAAAAAD///8A/wH///4A/v8AAAAA////AP///wD///8AAAIA/////wD+Af7/Af8BAf/+AAH/AP8A/gH+/wD+AAH//f8B5PnoAHrjiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXpowDk+egA////AP///wD///8A/wH//wAAAAD/Af//////AP8B//8A/gABAAAAAP///wD///8A////AAAAAAD/AgD/////AP///wD///8A////AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//wAAAAD//v8B/wD//wAAAAD///8A//7/AQAAAAD//v8BAAEAAAAAAAAAAAAAAP4AAQAAAAAA/wAA/gD+//8A/wD///8AAP0AAf8A/wAAAAAA/wD/AL3zxf+V6aMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlemiALDvuwAAAAAA/wH//////wD/AP8A//7/AQACAP8A/gAB/wD/AP///wD/AP8A/wH///8C////Af//////AP///wD///8A////AP8A/wD/AP8A////AP8A/wD/Af//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP///wD/Af//AP4AAf///wAAAAAA/wD//wD+AAEA/wAA//7/AP///wD///8A////AP///wAA/gABAP4AAf8B//////8A/wL//wD/AAD+//4AAAAAAAD+AAGV6KIAr+66AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC98cYAlemjAP///wD///8A/wD/AAAAAAAA/wAAAAAAAP/9/wH///8A////AP8A/wAAAf///wD/AP///wAB/wEBAAAAAP///wAAAAAAAAAAAAD/AAAA/wAAAAAAAAD9AAEA/gABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf///wAA/gAB/wH///8A/wD/AP8AAP8AAf8B////Av//////AP///wD/AP8A/wD/AP8A/wD/AP8A/wD/AAH+AQEBAQEAAP//AP8B//8AAAAA////AP8A/wD///8Ah+eW/9j33QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANj33AB644oA//7/AP8A/wD///8AAP4AAf8A/wD/Af////7/AP8A/wD/AP8AAAIA/wD+AAH//wAAAP4AAf///wD+//4A////AP8A/wD//v8B/wD/AP8A/wD/AP8A/wH///8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA//8AAP7/Af8B//////8AAP8AAAD+AAEA/gABAAEAAP8C//////8A////AP///wD/Af//AP//AP4B/v/+/v4A/wAAAP/+/wEA/wAA////AAD//wD/Av//8/v0AV7ccgDY990AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2PfcAF/ddADx/PMAAAEAAP///wD/AP8A/wH//wD//wAA/wABAAD/AP///wAA/wAA//3/Af8B//8A/wABAP//AAD+AAEA/wAA/wD/AAD//wAAAAAA/wH//wD//wAAAAAAAP8AAf8B//8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8AAAD/AAAA/wAAAAD+AAH///8A/wD/AP8A/wD/AP//////AAD+AAH/Af//AAAAAAAAAAAA/gAB////AP///wAA/wAAAP4AAQAAAAD+Af7/AAAAAP8AAAAA/f8B////APL99ABe3HIA2PfdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY99wAXd1y//H98v8AAAAA//7/AP///wD/Af//AP4AAf4B//////8A/wAAAAAAAAD///4AAQAAAAD+AAH///8A/wAAAP///wD/AP8AAAAAAP8AAAD///8A//3/Af8AAAD/AP//////AAD+AAH/Af//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAAAAP///wAAAAAA////AP///wD//v8B////AP8B//8A/gAB////AP///wAAAAAA/wAAAAAAAAD/Av7//wH///8B//8AAAAA/wH//wAAAAAAAQEA/wD/AP8B///x/vP/XdtxAK/uuQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK7tuQBd23IA8vv0Af8AAAD/Af///wL//wEBAQAB/wEB////AAD+AAH///8A////AP8B////AAAA/v//AP///wD/AP8A////AAAAAAD///8A/wD/AP///wAAAAAAAAAAAP///wD//v8B////AP8B/////f8BAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAEBAAD/AAAA//7/AAADAP8B/gEB////AAEBAQD///8AAQEBAAD+AAEAAAAA/wH//wD+AAH/AP8AAP8AAAAAAAAB/gEBAAAAAP///wABAQEAAAAAAP7//gABAQEAAAIA/wD+AAEAAP8A8QLz/3fgiAHk+egAbRlfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlemj/5HlngEBAQEA/wD/AAD/AAAB/wEBAAAAAP4B/v8B/wEBAAAAAAAA/wD/AAAAAP8AAAH+AQEAAgD//wD/AAH+AQH/AP//AAAAAQAAAAAAAgD/AAAAAAD+AAEAAAAA/wD/AAABAP8B/wEB/wD/AAH+AQH/AP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP4B//8B/gEBAQEAAP/9AAH/Av//AP8AAf///wAAAAAA////AAAAAAD/AAAAAf8AAQAAAAD///8AAAIA/wH9AQH/AP8A/wAAAAAC//8AAAAAAP4AAQAAAAD///8AAP0AAf8CAP8B/gABAP0AAQAAAACT56AA1/fcAHscawAbBhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP99ABq3n0AyfTQAQABAAD/Af//AP4AAQD/AAH/Av//AP4AAQD/AAH/AP8AAAAAAP8C//8A/gEBAQAAAP7//wAB/QABAAAAAP8A/wAA/wAB/wL//wD+AQEA/v8AAf8BAQAAAAD/AP8A/wD//wH+AQH/AP8AAAAAAP8A/wAAAgD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//wD+AAH///8A/gD///8B/////v8B/wD/AP8A/wD///8AAAAAAP8A/wABAAAA/wH///8A/wAAAAAAAP4AAf8B////AP8AAAD/AAD/AAD//v8B////AP8A/wD/AP8A/wD/AAD//wD/AP8A////AP8A/wD/Af//u/DDAFvccP+u7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyfPQAE7ZZP/I8s8A////AP///wD///8A/wH///8C/////v8BAAAAAP8A/wD/AP8A/wD/AAD+AAEAAv//////AAAA/wD///8A////AP8A/wD/Av//AP8AAAAB//8AAQAA/wAAAP8A/wD//v8AAf8BAQAAAAAAAAAA/wD/AP8A/wAA/gABAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAP4AAQABAAAAAAAA//7/AQEAAQD/Av//Af4BAQAAAAAAAAAA/v/+AAEAAQD/AP8A////AQEAAQAAAQAAAAAAAAD+AAEAAAAAAAAAAP8A/wAA/wAAAQABAAD/AAD/AP8AAAAAAAD/AAEAAgD/AQABAQD/AAD/Af8AAP8AAOT35wF24IcAyfPQAG4ZYAAbBxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP89ACE5JQAre23AAEAAQEAAAAA/wH//wH+AQH///8BAAAAAAAAAAAAAgD///7/AQEAAQD/AP8AAAAAAAEAAQAA/gAB/wD/AAD/AAABAAEAAAEAAP8B//8B/QEBAAAAAP8A/wAAAQD/Af8AAAAAAAAAAQAA/v/+AAACAP8A/gABAQABAAABAAD+//4AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD/AP8A//8AAQAAAf8BAQAAAAAA/gAB/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAA/wH//wD/AAEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wH/AAAAAAAAAAAA/wH//wH/AQEA/gAB/wL///8A/wAB/gEBAAAAAAAAAAAAAAAAre23AMnzzwBgFlQAYBdVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz/PQAn+qrAJ/qrADz/fQAAAIA/////wAA/wABAP4AAf///wAAAQAAAAAAAAABAP8A/gABAAAAAP8B////AP8AAf8BAf8A/wAAAQD/Af8BAf8A/wD/AP8AAAEA/wD+AAH/Af//AP8AAQAAAAAA/wAB/wL//wD+AAEB/wEAAAAAAAD+AAEAAgD///7/AQD/AAD/Af//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAB8AAA/w8AAAAA////AP8A/wAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAP8AAf8A/wAAAgD/AP4AAQAAAAAAAgD/AAAAAAD+AAEBAQEA/wH//wAAAAAA/gEBAP8AAf8A/wAAAgD/AP0AAQAAAAAAAQAAAAAAAP///wAAAAAAAAAAAOP55wCD45MA1fbcAIsheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3stwCS5p8A5ProAAAAAAAAAAAAAP8AAAD+AAEAAAAAAQEBAP8B/wAA/wAAAAAAAAABAAAAAQD/AAAAAAD+AAEAAAAA/wL//wD+AAEB/gEB/v/+AAAAAAAAAAAAAP0AAQAAAAAA/wABAAAAAAACAP8A/gABAP0AAQAAAAAAAQAA////AAACAP8A/QABAAAAAAAAAAAAAAHxAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/v7/8AEBABAAAAAA/wD/AAAAAAABAAEA/wD/AAD/AAAAAAAAAAAAAAAAAAD/Af//Af8BAf8C//8A/gABAQABAAAAAAAA/gAB/wD/AAEAAQD+AP7/Af4BAQAAAAAAAP8AAAAAAAAAAAAA/gAB/wD/AAEAAQD///8A////AAEBAQAAAAAA/wH//wD+AAEAAQAA8/3zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL89ACf6asAn+qrAPP99AD/AP8AAAEA/wAAAAAAAAAAAf4BAf8B//8B/wEB/wH//wD+AAEAAAAA/wH//wH+AQH/Af//AP8AAQECAf8A/gABAP4AAf8B//8A/wAB/wD/AAAAAAAAAQD/Af8BAf8B//8B/wEB/wL//wD9AAEBAQEA/wH//wH/AQH+/v4AAQEBAP///wABAAEAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAgD/AP4AAQAAAAD/AP8AAAEAAP///wAAAQAA////AAEAAQAA/wAB/wD/AAD9AAEAAAAA/gD+AAEAAQAAAAAAAAEAAP///wAA/wAB/wD/AAABAAAA/wAAAAAAAAAAAAAAAgD/AP4AAf4C/v8B/gEBAAAAAP///wAAAAAAAP8AAQAAAAAA/wAARBA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADI888Arey3ALvwwwDy/PQAAAIA/wD/AAEAAAAAAP8AAQAAAAAAAAAA/wD/AP8B/wAA/wAAAP4AAQD/AAAAAQAAAP4AAQABAAD///8AAf8BAP/9/wEAAAAAAAAAAAD/AAH/AP8AAAAAAAAAAAAA/wAB/wL//wD+AAH/AP8AAP0AAQAAAAD///8AAAEAAP///wAAAAAA////AAABAAD///8AAAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/wD9AAABAP8A/gABAAEA/wABAAAA/gABAAEA/wD/AAEAAQD/AP4AAQABAAD///8AAQEBAP8B//8B/wEBAAAAAP8A/wAAAAAAAP8AAAD/AAAAAgD/AP8AAQD+AAAAAQAAAAAAAAAAAAAA/QABAAEAAAD+AAEAAAAA/wL//wD+AAEAAAAAAAAAAAEAAQAbBhgARhE9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPL89ADW9tsAu/DDAKzstwDy/PMAAQEBAP8A/wAAAAAAAP4AAQAAAAABAAEA/wH//wD/AAEA/wAAAAEAAAD+AAH/AP8AAP8AAAABAP8B/wEB/wL//////wAA/wAB/wH//z0BKdsAACAASURBVAD/AAEAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP4AAQEAAQD///8AAQEBAP8A/wAAAAAAAP8AAAEAAQD/AP8AAAAAAAD+AAEAAAAAAAAAAAAAAAAA/v8BAAAAAAAAAAAAAAA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A/wH//////wEA/wAAAQEBAP8B//8B/wEB/wH//wD/AAAAAAAA/wD//wABAAABAQEAAP4AAQD+AAEAAgD//wAAAAAAAAAAAAAAAAAAAP8A/wD///8AAP8AAAEAAQAA/gABAAAAAP///wABAQEA/wL//wD+AAEBAAEAAP4AAQAAAAAAAAAA/wD/AP8A//8AAAAAAP8AAAEAAQAAAgD/AP4AAQD+AAH/AP8AAAAAAP///wAAAAAA/wH//wD+AAH/AP8AAAAAAAABAAD//f8BAQEBAP8B//8A/wABAAAAAAAAAAAAAAAAAP4AAQAAAAD+AADhAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAv8C4f0A/gAAAAAAAP8AAf8A/wD/AgD/Af4AAQAAAAAAAAAAAAEAAAD/AAAAAAAA////AAAAAAH/Af//AP8AAf///wAAAAAAAAAAAAD/AAEAAAAA/wD/AAEAAQH/AP8A////AAAAAAAAAgD/AP8AAQD+AAH/Av//AP4AAQAAAAAcBxgAcBtiAAAAAAAAAAAAAAAAAAAAAAAAAAAAyPLOAI/knQDH9M7/AP4AAQAAAAAAAAAAAP0AAf8CAP8A//8AAAIA/wD+AAEAAgD/AP4AAQAAAAAAAAAAAAIA/wD+AAH/Av//AP8AAf///wAAAAAAAP8AAQAAAAAAAgD///7/AQD/AAH/AP8AAP8AAf8B//8AAQD/AP4AAQEBAQD//v8AAQEBAP///wAA/wAAAQABAP///wAAAAAAAAAAAAEBAQD+Av7/AQABAP8B//8A/wABAP8AAAAAAAD/Af////8AAAEBAP//AP8A/wD/AAH+AQEAAAAAAAAAAAABAAAA/QABAAAAAP8A/wAA/QABAAIA/wAAAAAA/gABAAIA/wD+AAH/Av//Af0BAQAAAAAAAQAAAAAAAAAAAP8AAgAA//7/AQABAAD/Af//AP4AAQAAAAAAAgD/AAAAAAD+AAH/Av/vAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/f4A4AACAAD/AP8AAAEA/wD/AAEB/gEB/wD/AAABAP8A/wABAP8AAAAAAAABAAEA/wD/AAD+AAAAAQABAAEA/wD/AAEAAAAAAQABAP8A/wABAAAA/wEA//8A/wAA/wABAAAAAAAAAAAB/gEB/wH//wEAAQH//v8BAAABAA8EDQCqKpYADgQNAAAAAAAAAAAA8vzzANX12wCP5ZwAyPLPAAAAAAAAAAABAAAAAAAAAAD/AP8AAQABAAH/AAH/AP8AAf4BAQAAAAAA/gAB/wAAAAEAAAD///8AAP4AAQAAAAAAAAAAAP8AAAABAQAAAf//AP8AAQABAP8BAAAA/wABAAAAAAABAAAA/wD/AAD+AAEAAQAA/wD/AP///wAAAAEA///+AAACAP8B/gEB/v/+AAEBAQD/AP8AAAAAAAAAAAAA/gAB/wH//wH/AQH/Av//Af8BAf8B//8A/wAAAf8BAf8A/wABAAEAAQABAP8A/wABAAEAAAAAAP8A/wAA/wAAAQEBAP8B//8A/wEBAf4AAf8A/wABAAEA/wD/AAD/AAAA/gAB////AAEBAQD///8AAAEA/wH/AQH/AP//AQABAP///wAB/wEB////AAEBAQD///8AAP8AAQAAAQAB/wLQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAwoA0Pz3/wD/Av//AQAAAAD/AQD/Av7///4AAQEBAQAA/wAAAAAAAAAAAAD/Af8AAP8AAAABAAAAAf//AP4BAQAAAAAAAgD//wD/AAD+AAH/AAAAAP8AAQAAAAD/AP8AAQABAAAAAAD/AP8A/wH/AP8B//8B/gEBAAD/AEYSPf8AAAABue3BAOP76ADH8c0AyPLPAPL88wAAAAAAAAAAAAACAP8A/gAB/wL//wAAAAABAAAA/v7/AQEBAf8AAAAB////AP8C//8B/gEBAAAAAP8AAAD/Av//Af4BAQABAAD///8AAQAAAP8B//8B/gEB/wL//wH+AQH/AQAAAP//AAAAAAD/AAAAAAIA/wD/AAH///8AAAD/AAAAAQAAAP8AAAAAAAD+AAH///8AAAAAAP///wAAAAAA/wL//wD+AAEAAAAAAP8AAf8A/wD///8AAP8AAAD/AAEAAAAA/gD+AAACAP8A/gABAAAAAP8C//8A/gAB/wD/AAD/AAAAAgD/AAAAAAD+AAEAAf8A//8AAAAAAAD/Av//AP0AAQACAP8A/gABAAAAAP///gD/AAAAAQABAf4B/v8B/gEB/wL+/wAAAQD/AP8AAAAAAP///wAA/wABAAEBAAAA/wAD/wLxAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAML9AEOsH9u8AAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8B/wEBAAAAAAAAAAAAAAAAAAAAAAAAAAD/Af//Av8CAf8A/wAAAAAAAAIA/wH+AAH/AAAA/wH//wH/AQEAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAABAQEA/wD/AAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAAAAAAAAAAABAP8B/wEB/wD/AAAAAAAAAAAAAQABAAAAAAD/Av//AP0AAQABAAAAAAAAAAAAAAACAP8A/gABAAAAAAEAAAD//wAAAAMA/wD+AAEBAQEA////AAEAAQD/AP8AAP8AAAEBAQD/Af//AAEAAAD+AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAQD/AP8AAAAAAAAAAAAA/wAAAAMA/wD+AAEAAAAAAAIA/wD+AAEA/wAAAAEAAAAAAAAAAAAAAQABAP///wAAAQAA/wH//wEBAQD///8AAf8BAQAAAAAAAAAAAAEA/wH/AQH/AP8AAAAAAAACAP8B/gEB/wD/AAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAEAAQD/AP8AAAEA/wD/AAEF+QoR4EHA8AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABrGNt8B/wAg/wL//wD+AAEAAgD/Af8BAf///wAAAAAAAQABAP8A/wABAQEA/wH//wH/AQH/Af//Af4BAQABAAD///8AAQEBAAD/AAD/AP8AAAIA/wD+AAEAAAAAAQEBAP8B//8AAAAAAAAAAAD+AAEAAgD/AP4AAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAAEA/wL//wH/AQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAEAAQAAAQAAAP8AAP8A/wABAQEAAAAAAP///wABAQEAAP8AAAAAAAAAAAAA/wL//wAAAAAA/gABAAAAAAAAAAABAAEAAAAAAAAAAAD/Av//Af4BAf8A/wABAQEA////AAAAAAAAAgD/AAAAAAH/AQH/Af//AP4AAQAAAAAAAgD/AP4AAQECAf///v8BAQABAP8C//8A/gABAAAAAAACAP8AAAAAAP4AAQAAAAAAAAAAAAAAAAAAAAABAQEA/wH//wH+AQH/AP8AAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA/wH//wH/AQH/Af//Af8BAf8B//8B/wEBAP8AAAABAAD///8AAAAAAAEBAQAA/wAAAAAAAAAAANDlO8oxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAL//bH/AP8AAAAAAAAAAAAA/gAB////AP8B//8AAAAA/wD/AAAAAAD///8AAP4AAf///wD//f8B/wD/AP8B//8AAgD/////AP4B/v//Af//AP4AAQAAAAD/Af///wH//wD+AAEAAAAAAf8BAQAAAAD///8AAAAAAAAAAAD///8A/wH//wAAAAAAAAAAAAAAAAAAAAD+Af7/////AAAAAAAAAAAAAAAAAAACAP//Af//AAAAAAAAAAD/AP8AAAAAAP8A/wD///8A/wD/AAAAAAD///8A////AP///wD///8A/wD/AP8A/wD/AP8AAP4AAf/9/wEAAAAAAP8AAP8B////AP8A/wD/AP8A/wAA/wAA/wD/AAAAAAD+AP7/AAAAAAAAAAAA/gAB////AP///wAA/gABAAIA/wAAAAAA/gABAAAAAP7//gAAAAAA/wD/AAD+AAEAAAAAAAAAAAD+AAH///8AAAAAAAAAAAAAAAAAAAAAAP8B//////8AAP4AAf4B/v8AAAAAAAAAAAAAAAD/Af//AAAAAP///wD///8AAP4AAf///wD///8A////AAD+AAH+/v4A/wD/AP7+/gAAAAAAAAAAAP///wD/AP8A/gH+/wAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAPwBBq////8A//3/Af///wD///8A/wH//wH/AQH///8A////AAAAAAD///8A/wD/AP///wAAAgD//wH////9/wEA/gAB////AAD+AAEA/gAB////AP8B//8A/wABAP4AAf///wD//f8B/v7+AP///wAA/gABAAAAAP///wD///8AAP4AAQAAAAD///8A////AP///wAA/gABAP4AAf7+/gAAAAAA////AP///wAA/gAB/wH///8B///+AP7/////AP///wD/Af//////AAAAAAD///8A/wH//wAAAAD///8A////AP8B///+Af7/////AAAAAAD/Af///wD/AAD+AAH///8A/wH//////wD//v8B////AP///wAAAAAA/wH//////wD/AP8AAAAAAP8A/wD///8A//3/AQAAAAD///8A////AAD+AAH+Af7/////AP///wD/Af///wH//////wAA/wAB////AP4B/v//Af//////AAD+AAH+Af7//wD/AAAAAAD///8A/wH///8A/wAA/gAB/wD/AP///wD/Af//////AP///wAA/gAB/wH//////wAAAAAA////AAAAAAD/Af//AAAAAP///wAAAAAAAAAAAP8DALAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAABj5B9ECAADw////AP8B//8AAAAAAP4AAf4B/v8AAAAAAAAAAP///wAAAAAA////AAAAAAD//v8BAP4AAf8B///+/v4AAAAAAAAAAAD/AP8AAAAAAP/+/wH///8A////AP8A/wAAAAAAAAAAAP8C////AP8A/gD+/wAAAAD/AP8AAAIA//7//gAAAP8A////AP8A/wD/AP8A/wD/AAAAAAD///8AAAAAAAD+AAEAAAAA//7/AQD+AAEB/wEBAAAAAP8A/wD//v8BAAAAAP7//gD/Af//////AAAAAAAAAAAA/wL//wD+AAEB/gEB/wD/AAAAAAD//v8BAAAAAP8B////AP8A//7/Af8B////Af///wD/AAAAAAAA/gAB//7/Af///wAA/wAAAP4AAf///wD/AP8A/wD/AP7+/gD/AP8AAAAAAAAAAAAA/gABAAAAAP///wAA/gAB//3/AQABAAD//v8A/wD/AAH+AQEA/gAB/wD/AAAAAAAB/gEBAAAAAP/9/wEAAAAA//7/Af///wD/AP8AAP8AAAAAAAD//v8B/wD/AP8A/wAAAgD///7/Af8A/wD/AP8A/wD/AAACAP//AP8A/v/+AP8A/wD///8AAAAC4eY4ybEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAANBBwPD9Af6QAAL//wD+AAH///8A/wD/AAD9AAH/Af//////AP///wD///8AAP8AAP///gAAAAAA/gH+/wD/AAEAAQAA/gH+//8A/wAA/wAA/wH+//8B//8A/wAA/wH//wAAAAD///8A////AAD9AAEA/wAAAP4AAf///wAAAQD///3/AQD/AAD//wAA/wL//wD//wAA/wAAAP//AP8A/wAAAAAA////AP///wD///8A/wH//////wD///8A///+AAABAP8A/wAA/wD/AAD/AAAA/gAB/wD/AP///wD///8AAP0AAf///wD///8A/wH///8B/v8A/wAA////AAD+AAEA/wAAAP8AAAH/AQEA/gABAP8AAP///wD/Af//AAAAAAABAAD///8A/wD/AAAAAAAAAAAAAAAAAAABAAAA/wAA////AP///wAA/wAA////AAABAAD+Af7/AAAAAP/+/wAAAAAAAP8AAP///wD///8A/wH///8A/wD/AP8A/wD//wABAAD/Af7/AP8AAAD/AAAA/wAA////AP///gAA/wAAAP8AAAD/AAD//f8BAAAAAAAAAAAAAAAAAP8AAP/9/wEA/QABAAAAAAAAAAD/AP8A///9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+gah//4AAf8A/wD/AP8AAP8AAP8A/wD///8AAAD/AP8A/wD/AP8AAAEAAAAAAQAA//8AAP8AAAD//wAA//8AAf4AAf4A/v8AAAAA//4AAQAAAAD/Af////7/Af8B////AP8A/wD/AP8A/wD/Af///wD/AP8A/wD//f8B/wD/AP8C////AP8AAP4AAQAAAQAAAP8A/wEA/wD//wD///8AAAAAAP8A/wD/Av//Af8BAf8A/wD/Af//AAABAP/+/wH/AP8A/wD///8B////AP8AAP4AAQAAAAD/AP8A/wH+/wAAAAD/AP8AAP4AAf7//wAAAAAAAAEAAP8C//8AAAAA/wL///7//gD/AP8A/wD/AP8C/////v8B////AP8A////AP8A////AP8A//////8A/wD//////wD/AP8A/wD/AP8C////Av///wD/AP///wAA/gAB/wD/AP8A/wD/Af///wH///8A/wD/AP8AAP4AAf///wD/Af////3/Af///wD//gAB/wD/AP8A/wD/AP8A/wD/AP8AAAD/Af///wD/AP8A/wD/AP8AAP8AAP///wD///8A/wH///8A/wD/Av//////AAD/AAD///8ACPoFgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgQcjgAf4Cgf///wAAAAAA/gH+/wAAAAD//v8B/v//AAABAP8A/wAA////AP7//gD/AAAA/wD/AP7//wD//wAA/wAAAAD+AAH///8A////AP///wAA/gABAAAAAP/9/wH///8A////AAD/AAD//v8B/wH//wD/AAAAAgD/AP8AAAD9AAEA/wAAAAAAAP8A/wD+//8A//7/Af8AAAD///8A/wH//wAAAAAA/QAB//7/AAAAAAD/AP8A////AAD/AAD/Af////7/AQD+AAEAAAAA////AP///wD///8AAP8BAf///wAAAAAA/wH//wD+AAH+//4A/v7+AP///wD+//4AAP4AAf8B//8AAAAAAP8AAP///wD/Af//AP8AAAD+AAEAAAAAAP8AAAD+AAH///8AAP8AAf8B//8AAAAA////AAD9AAEA/QABAP8AAP8B//8AAAAA/wH//wAAAAAA/wAB/wD/AP8B////Af//////AAD//wAA/f8B/wL//////wAA/wAA////AP8B////Af//AP8AAP///wAA/gABAP8AAAAAAAD/Af///v/+AP///wAAAAAAAP8AAQD/AAD//f8B/wH///7//gD//wGg4EHI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP4MkP8B/+////8AAAAAAP///wAAAAAAAAAAAP8A/wD/AP8A////AAAAAAD///8AAP4AAQAAAAD/AP8A////AAAAAAD/AP8AAAAAAAD+AAH/AP8A/v7+AAAAAAAAAAAAAAAAAP8A/wAAAgD/AP4AAf4B/v///v8B/wD/AP8A/wD/AP8A////AP///wAAAAAAAAAAAP///wD/Af////7/Af///wD/Av///wD/AP///wD///8A/wD/AP8A/wAA/gABAAIA//8A/wD+AP7/AAAAAP8C//8AAAAA////AP8A/wD///8AAP4AAQAAAAAAAAAAAAAAAAD+AAEAAAAA////AAD+AAH///8A/gH+/wD+AAEA/gAB/gH+//8A/wD///8A/wH///4B/v8AAAAA////AAD+AAH///8AAAAAAP8A/wD/Af///wD/AP///wD///8AAP4AAf///wD///8A////AAD+AAEA/gABzxnXeQAAIABJREFUAAAAAP8AAAD/AAAAAP4AAQAAAAD+Af7/AAAAAAD+AAH//f8B/wL//wAAAAD+Af7//wD/AP///wAA/gABAAAAAAAAAAD///8A////AP8C//8A/wAAAP0AAQIAAOAK/QWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO/M1ACBP2uAP4AAQAAAAAAAAAAAAIA/wD+AAEAAAAAAAAAAAACAP8A/gABAAAAAAABAAAA/wAAAAIA/wD+AAEAAAAAAAIA/wD+AAEAAAAAAAAAAAACAP8B/wEB/wH//wH/AQH///8AAAIA/wD/AAEAAAAAAP8AAAACAP8A/wABAAAAAAD/AAAAAAAAAAEAAAAAAAAAAQD/Af8BAQAAAAD/Af//Af8BAQAAAAD/Af//AP4AAQEBAQAAAAAA////AAABAAABAAEAAAAAAP///wAAAgD/AAAAAAH/AQH///8AAAAAAAAAAAD/AgD/Af4AAQAAAAAAAAAAAAIA/wD+AAEAAgD/AAAAAAH/AQH///8AAAIA/wAAAAAA/gABAAAAAAAAAAAAAAAAAAEAAAEAAQAAAAAA////AAAAAAAAAgD/AP4AAQEBAQD/AP8AAP8AAAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAP///wABAQEA/wH//wAAAAAAAAAAAf8BAf8B//8B/wEBAAAAAP///wABAQEA////AAAAAAAAAgD/Af8BAf///wAAAAAAAQEBAP///wAAAAAAAAIA/wD+AGHrP9ChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwS6PAAACcP8A/wABAAEAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAP8CAP8B/gAB/wD/AAEAAQD/Av//Af4BAQAAAAD/AP8AAQEBAAD/AAAAAAAAAAAAAP8B//8B/wEB/wD/AAACAP8A/gABAAAAAAAAAAABAAEAAAAAAP8B//8B/wEBAAAAAAAAAAD/AP8AAQIB/////wAB/wEB/wD/AAEAAQD/AAAAAAL//wD+AQEAAP8AAQABAP8B//8A/wABAAAAAAEAAQD/AgD/Af4AAf8B//8A/wABAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEA/wH//wEBAQD//v8BAQABAP8A/wABAAEAAAIA/////wAB/wEBAAAAAAAAAAD/AP8AAQABAP8AAAAAAf//Af8BAQAAAAAAAAAA/wD/AAABAP8AAAAAAAAAAAAAAAAAAAAAAf8BAQAAAAAAAAAAAAAAAP8C//8B/gEB/wD/AAEAAQD/AgD/Af4AAQAAAAAAAAAAAAAAAP8B//8B/wEBAAAAAAAAAAAAAAAA/wH//wAAAAAB/wEBAAAAkOs/0HEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAwz/8A/zABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAgH/AAAAAAD+AAEAAAAAAAIA/wD+AAEAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAD/AP8AAQABAAABAAABAAEA////AAAAAAAAAQAAAAAAAAD/AAAAAAAAAQEBAP///wAAAQAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAgD/AP4AAQACAP8A/gABAAAAAP8C//8B/gEBAAIA/wAAAAAA/wABAP8AAAEBAQD///8AAAD/AAAAAQAAAAAAAAEAAAD/AAAAAAAAAAIA/wD/AAEA/wAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAIA/wAAAAAA/gAB/wL//wH+AQEAAQAAAP8AAAABAAABAAEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAAAAAAAAAABAAAAAQD/AP4AAQAAAAAAAAAAAAAAAAAAAAD/Av//Av8CAf4B/v8D/wLR6j/QMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/8QQfMB8M//AP4fAAIAAAD9AAEAAQAAAAAAAAAAAAAA/wAAAQABAP8C//8A/gABAAAAAAAAAAAAAgD/AP4AAQAAAAAA/v8BAQAAAP8AAAAAAAAAAf4AAf8AAAAAAQD/AAAAAAAAAAEAAAAAAAEA/wD/AAEAAQD/AP8AAAAAAAEAAAAA/wD/AAD/AAD/Av//AP8AAQAAAAAAAAD/AAAAAAEAAQH/AP8A/wD//wEAAQEA/wAA/wD/AAEAAAD//wAAAAAAAAABAP8A/gABAQABAP/+/wEAAAAAAAAAAAD+AAH/Af//AP4AAQEAAQAAAAAA////AAAAAAAAAv////4AAQAA/wAAAAAAAP8AAAACAP8B/gEBAP4AAf8C//8A/wABAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAP4AAQABAP8AAAAAAf4AAQAAAAD///8AAAEA/wD/AAH/AP8AAAEA/wD//wH/AAAAAAEA/wAAAAAB/wEBAP7/AQAAAQD/AP8AAQABAP8B//8A/gABAAEA/wD/AAEAAgD/AP4AAQD/AAAA/gAB/gL+/wD+AuEC/whRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EHA8AX/CEEA/wLh////AAAAAAAAAAAAAAAAAAD/AAAAAAAA////AP/9/wEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/Af///v//AAAAAAAA/wAA//8AAP///wAA/gAB//7/AQAAAAD///8AAP4AAf///wD//f8BAP4AAQD/AAAAAAAAAP8AAAAAAAD///8AAP8AAAAAAAAA/gAB/wD/AP8A/wD///8AAP4AAf///wD/AP8AAAAAAP4B//////8AAP8AAP/+/wEAAAAA/gH+/wD/AAAA/wAAAAAAAP///wD/AP8AAP8AAP8A/wD/AP8AAAEAAP///wD+//8AAAAAAP///wAAAQD/AP8AAP/9/wH/AP8A/v/+AAD+AAH/Af//AP8AAAD/AAD///8A/wD/AAAAAAAA/wAAAP8AAP/+/wH/Af////8AAP///wAAAQD///7/AQAAAAD///8AAP4AAf8AAAAA/wAA//7/AQD+AAH+Af7//wAAAP4B/v8AAAAA/v/+AP/9/wEAAAAAAP8AAQD/AAD//f8BAAAAAAABAAAA/wAA//4B4QX/CEHoQcjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYvzgg+QH3rwH//jD/Af//Af8BAQAAAAAAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD/AP4AAQAAAAAAAAAAAAIA/wD+AAEAAgD/AP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/Af//AP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8B/gEB/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8BAQEAAP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAD/Af//Af8BAQABAP8A/wABAAAAAAACAP8A/gABAAIA/wH/AQH///8AAAIA/wD+AAEAAAAAAAAAAAACAP///f8BAQEBAAAAAAAAAAAAAAIA/wH/AQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLQDv8RQeBBwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO9LJD+AQBvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/wD/AAEA/wAAAAAAAAACAP8A/wABAQABAP8B//8A/gABAAEAAAD/AAABAQEA////AAACAP8A/gABAQEBAAAAAAD/Af//AAAAAAD+AAEAAAAAAAAAAAACAP8AAAAAAf8BAf8A/wAA/wAAAAIA/wAAAAAB/wEBAAAAAAAAAAAAAAAA////AAABAAABAAEAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAABAAABAAEA////AAACAP8A/gABAAEAAAACAP8A/QABAQEBAP8A/wAAAQD/Af8BAf///wAAAgD/Af8BAQAAAAAAAAAA/wH//wH/AQH///8AAAAAAAEBAQD///8AAAAAAAACAP8A/gABAAAAAAAAAAABAQEA/wH//wH/AQH///8AAAIA/wD+AAEAAAAAAQEBAP8B//8A/wABAAAAAAAAAAAA/wAAAQEBAAICAZDsP9JxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATvy1g/QD+fwD/ACABAAEAAAAAAP8C//8AAAAAAf4BAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAQAA/wD//wH/AQEAAAAAAAAAAAAAAAAAAAAA/wL//wH+AQEAAAAAAAAAAP8A/wAAAQD/Af8BAf8A/wABAAEAAAAAAAABAAAA/wAA/wD/AAAAAAABAAEA/wL//wD/AAAB/wEBAAEAAAABAP8A/gABAAAAAP8A/wABAAEA/wD/AAACAP8B/gEB/wH//wAAAAAA/wABAAEA/wABAAAA/gABAQABAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAP8C//8AAAAAAf4BAQAAAAAAAgD/AP4AAQAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8B//8BAQEA//7/AQECAf////8AAf8BAQAAAAD/Av//AP8AAAEBAQAA/gABAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQABAAAAAAD/Av//Af4BAQABAAD/AAHwAwD8Ye1B17AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGL8wIPoA+4D+/gBfAAEAAAD/AAAAAQAAAAEA/wD+AAEAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAgD/AP8AAAD+AAH/Av//Af8BAQD/AAAAAgD/AP4AAQABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQD/Af8BAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAEA////AAAAAAD/Av//Af8BAQAAAAAA/wAAAAEAAAAAAAAA/wAAAQEBAP///wAAAQAAAAEA/wD+AAEAAAAAAAIA/wAAAAAA/gABAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAEBAQD///8AAQEBAP///wAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAL/A4EOAgKQ4EHQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYvzAg+v37gP4D/z///wAfAf8BAQAAAAD/AP8AAAAAAAAAAAAAAgD/AP4AAQEAAQD/Av//Af4BAf8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAACAP8A/gABAAAAAAECAP8A/gEB/wD/AAAAAAAAAgD/Af4BAf8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAQD/AAEAAAD+AAEBAAEA/wD/AAAAAAAAAQD/Af8BAQABAAD///8AAAAAAAAAAAAAAQD/AP8AAQEAAQD/Av//Af4BAf8A/wAAAAAAAQEBAP///wAAAAAAAQABAP8C//8B/gEB/wD/AAAAAAABAQEAAP8AAAAAAAAAAAAA/wD/AAEBAQD///8AAQAAAP8AAAAAAAAAAQABAP8B//8A/wABAAAAAAAAAAAAAAAAAAAAAAEBAQAA/wAAAAAAAAAAAAD/Av//AP4AAQABAP8A/wABAQABAAABAfAC/wKRBgICoOhB0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATvClQ+wAAUAIAAi//Af8w/wH//wH/AQEAAAAAAAH///8AAAAB/gEB/wL//wD+AAEBAQEA////AAACAP8B/gEBAAEAAP///wABAQEA/wH//wH+AQEAAAAAAAEAAAAAAAD/Af//Af8BAQAAAAAAAAAA////AAACAP8B/wEBAAAAAAABAP8A/wABAAAAAAAAAAD/Af//Af4BAf8A/wABAAEAAAEAAAAAAAD/Af//Af8BAQD/AAAAAAAA/wL//wH/AQEAAAAAAAEA/wD/AAEAAgD///3/AQAAAAABAQEA/wH//wH+AQEAAQAA/wH//wD+AAEBAQEA////AAEAAAD/AgD/Af8BAQD/AAAAAAAA/wL//wH/AQEAAAAAAAAAAAAAAAAA/wAAAAEAAP///wAAAgD/AP4AAQEAAQAAAQAA////AAECAP///gABAQABAAECAOAC/wGxAv4FsAwEANDgQdDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgrzAQ8Az8MAMB/RD9/wEw/gD/DwICASAA//8QAAAAAAACACD/AAAAAQABAP8AARD/AP4PAP4AAQAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD+AP7/Af8BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wIA/wD+AAEAAAAAAAAAAAAAAAAAAAAAAAIA/wEAAvEA//3wAQEBAAAAAAAA/gHwAAD/8P4B/+AAAAMAAv4B4f0E/+ADBADPEPwF4eBB0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoC3pWAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//rqKZxXidDaUAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Notes.png b/arma/client/addons/phone/ui/_site/images/light/Notes.png new file mode 100644 index 0000000..1f1287d Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Notes.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Notes.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Notes.png.b64 new file mode 100644 index 0000000..3cba036 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Notes.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEUIZArI78AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/33AQAADsQAD+AEAAAAEfAAECMAAAAAAA//8gAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAD/AAAAAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAP//AAABAQAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAP8AAP8AAAABAQAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAA/wAA/wAAAAEBAAAAAAAAAP8AAAAAAAD/AAAAAQAAAAEC8AD/AOAAAP7gAP4B0QAE/tAAABTAASGQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/32AQAAD8XwD9AFAAAP5AAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAQEAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAqAAAwXBASGg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/99gIAD99XAAAQJfAP4AEAABAAAA/wAAAAEBAAAAAAAAAP8AAAAAAAD/AAAAAQEAAP//AAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAAAAAAD/AAAAAAAAAAAAAAABAQAAAAAAAAD/AAAAAQAA//8AAAEBAAD//wAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAD/AAD/AAAAAAAAAAEBAAAA/wAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAABAAAA/wAAAAAAAP8AAAABAQAA//8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAAD//wAAAQEAAAD/AAD/AAAAAQEAAAEAoAACAIEBIajgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/fYBAA/vRvAP4AgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+gAAIFgQEhqOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9xTUAAA/p8A/gAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAQD///8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AACAIABJK+hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/206PAP8AcAD//wAAAQEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A/wEBAAH/AAAAAf8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAD//wAAAgGQASWycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9dQIAAD+6///wAwAQD/AAAAAQAAAQAAAP//AP8AAAABAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAABAP8AAAABAP8AAAAAAAAAAQAAAQAAAP//AAAAAQAAAP8AAAABAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQD/AP8AAQAAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQD/AAAAAQAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAABAAAA//8AAAAAAAAAAQAAAAAAAAD/AP8AAQABAP8AAAEB0AD9BVEBKbDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/11AgAAH4v/8AACABAQAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAP//AAABAAAAAAEAAAAAAAD//wAAAQAAAAABAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQAAAP8AAAAAAAAAAQEAAAAAAAAA/wAAAAEAAAAAAAD//wAAAAEAAAH/AAD/AAAAAQEAAAAAAAAA/wAAAAEAAAAAAAD//wAAAQEAAAAAAAD//wAAAAAAAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQAAAAABAQAAAAAAAAAAAAD//wAAAQEAAP//AAAAAQAAAQAAAAAAAAD//wAAAAAAAAAAAAABAQD///8AAQEAAP//AAABAQAAAP8AAAABAQAAAAAAAP//AAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAQEAAP//AAABAAAAAAEAAP//AAABAQAA//8AAAEBAAD//wAAAAAAAAEAAAAAAQAA//8AAAEBAAD//wAAAAAAAAAAAAAAAAD/AAAAAQEBAAAAAOAA/ghBASmw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/XUCAAAfO/AAACIP8A/wAAAAEAAQD/AP8AAAABAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAQAAAP8AAAAAAP8AAAAAAAAAAAAAAAEAAQAAAAAAAAD/AP8AAQAAAP8AAQAAAAAAAQD/AP8AAQABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAD/AAAAAQAAAP8AAAABAAEAAAAAAP8A/wAAAAAAAQABAAAA/wD/AAEAAAD/AAAAAAAAAAAAAQAAAAAAAAAAAAEA/wD/AAEAAAAAAAAA/wAAAAEAAAAAAAEA/wD/AAAAAAABAAAAAAAAAP8AAAABAAAAAAABAAAA/wD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAABAALgAP8KQQEpsOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8K///gEgAAD+AAEBAAD//wAAAAEBAAEA/wAA/wAA/wAAAAAAAAAAAAAAAAAAAP//AAAAAAAA/wAAAAEBAAD//wAAAAAAAAAAAAAAAAAA/wAAAAAAAAD//wAAAAAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAQAAAQAAAP//AAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAEBAAAA/wD//wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAEBAAD//wAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQEAAP//AAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAEAAAABAQAA//8AAAEAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AP0gAQLxrwAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9o+j//9AHABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP//AAAAAQAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAA/wAAAAAAAAABAAABAAAA//8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEBAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAQEAAAAAAAAAAAAA/wAAAAEDAJABJsJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD81TpgAgEBnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAQAAAP8AAAAAAAAAAAAAAAEBAAD//wAAAAD/AAEBAQD//wAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AP8AAAABAAAAAAAAAAAAAQEAAP///wAAAAEAAAD/AAAAAAAAAAEAAQAAAP8A/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAEAAAD/AAAAAQEAAAD/AAD/AP8AAAABAAAA/wABAAEAAAAAAP8A/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAABAQEA//8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAQEAAP//AAABA/5RASfHsAAAAAAAjhtz5AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/PQCAACPi///4AIAABAAAAAAAAAQAAAP//AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAQAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAQEAAP//AAABAQAA/wAAAAD/AAAAAAAAAAEAAAD/AAABAQAA/wAAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAEBAAD/AAAAAAAAAAAAAAAA/wAAAAEAAAD//wAAAQEAAQAAAP8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAEBAAD/AAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEBAAD//wAAAAEAAAD/AAAAAQAAAP8AAAABAAAA//8AAAABAAAAAAABAf/wAPkZIQExsPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4H9oAC/v8gAAD/AAD/AQAAAP8A/wABAAAA/wAAAAEAAP8AAAAA/wAAAAAAAP8BAAAA/wAA/wAA/wAAAAAAAQAAAP8AAAAAAAAAAAABAAEA////AAAAAAAAAAAAAAABAAD/AAAAAAAAAAD/AAAAAQAA/v8AAAEAAAAAAAAAAAAAAAABAP///wAAAAEAAAD/AAD/AAAAAAEAAAAAAAEAAAD/AP8A//8BAAAA/wD//wEAAAD/AAEAAQD/AAAAAP8AAAAA/wD//wAAAAABAAAA/wAB/wEA/wAAAAD/AAAAAAAAAP//AAEAAQD/AP8AAAABAAD/AAAAAAAAAAD/AAAAAQABAAAA////AAAAAAAA/wAA/wABAAAA/wAAAAAAAP8AAAAAAQAAAAAAAAAAAP///wAAAAAAAAAAAAD/AQAAAP8AAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAABAP///wAAAAAAAAAAAAAAAAAA/wEAAAD/AAD/AQAAAAAAAAD/AAAAAQAAAP8AAAABAP//AAAAAP8AAP8AAAAAAQAA/wAAAAD/AAH/AQD/AAAAAQAAAP8A/wD//wEQ/wbmcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/884IP8F+d8AAAAAAAABAAAAAAAAAP8AAAEAAAD/AAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAABAQEA//8AAAEBAAD///8AAAAAAAEBAQD///8AAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH7ByEBMcjgAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gP2gAH/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAA/gAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAEAAP//AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP//AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAP/+AAAAAQAAAP8AAP//AAAAAQAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAD//wAAAP8AAAABAAAA//8AAAEBAAAAAAAA/wAAAAEAAP/+AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wEA/wD/AAEAAAD//wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4G9nAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/zzAg/wT73wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAEAAfAA/AQhATHQ8AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD9BvtAAv79AAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAP//AAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/gAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAD/AAAAAP8AAAAAAAAAAQAAAP8AAAABAAAA/wAAAQEAAP//AAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAQEAAP8AAAAA/wAAAAAAAAD/AAAAAAAAAAEAAP8AABABAv1gAAAAkAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vlf//8BAAAA/wAA/wEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAP8AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAA/wAAAAD/AAAAAQAA/wAAAAAAAAD//wAAAAAAAAAAAAAAAQAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAD/AQD/AP8AAf8BAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAP8BAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAABAAD/AAAAAAAAAP8AAAAA/wAAAAEAAAAAAAAAAAAA/v8AAAEAAAAAAQAA//8AAAABAAAAAAAA/wAAAAAAAAD//wAAAAEA////AAAAAQAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAQAA/wAAAAAAAAD/AAAAAQAAAP8AAAEBAAD//wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAA/wEAAAAAAAAAAAAAAP8A//8BAAAA/wAAAAAAAAAAAAAAAAAAAAEAAP8AAAAAAAAAAv9PAAAAkAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP/PMBD/AvHvAAAAAAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAABAAAAAAAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAEBAAAAAAAA//8AAAAAAAAAAQAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAEAAAD/AAAAAAD/AAAAAQAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAEAAAD/AAAAAQAAAAAAAAD/AAABAQAA/wAAAAAAAAAA/wAAAAAAAAABAAAA/wD/AAAAAQAAAAAAAQAAAP8AAAABAAAA/wAAAQEAAP//AAAAAAAAAAAA/wAAAAEAAQAAAAAAAAD/AP8AAAABAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAQEAAAAAAAD/AAAAAAAAAAAAAP8A/wABAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAABAAAA//8AAAAAAAAAAQAAAAAAAAEAAAD/AAD/AP8AAQAAAAAAAQAAAQAAAf0OEQEx0PAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA8EAAAP8AAP//AAABAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wEA////AAEBAAAA/wAAAAEBAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAAEAAP//AAAAAAAAAQAAAAAAAAAAAAAA//8AAAEBAAAA/wAAAAEBAAAAAAAAAP8AAP8AAAAAAAAAAQAAAP8AAAABAQAA//8AAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAP8BAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAD/AAD/AAAAAAAAAAABAAD//wAAAQAAAAABAAAAAAAB//8AAAAAAAABAQAAAP8AAAAAAAAAAAAA/wAAAAABAAAA/wAAAAAAAQAAAAD/AAAAAAAAAAEBAAEA/wAAAAAAAAAAAAAAAQAAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAH/AAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAA/wAAAAEBAAAAAAAAAP8AAP8AAAD/AAAAAQAAAAABAAD//wAAAQAAAP8AAAAAAAAB/wAA/wEAAAEAAAAA/wAAAAbtPwAAALEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP4A/DAB//8AAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAEAAQAAAAD//wAAAAEAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAP8AAP8AAAEAAAAAAAAAAP8AAP8AAAABAAAAAQAAAAD/AAAAAAAAAP8AAAAAAQAAAP8AAAAAAAAAAAAA/wAAAAAAAAD/AAD/AAAAAQAAAAD/AAABAAAAAP8BAAAA/wAA/wAAAAABAAAA/wAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAABAAAA/wAA/wAAAAAAAAAAAAD/AAAAAQABAP///wABAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAEAAP//AAAAAAAAAAAAAP8AAAAAAAABAAEAAP//AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAQAA//8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAA/voBQQAAALEAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIB+y//AAEAAAAAAAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAD/AAAAAQAAAAAAAAAAAQAAAP8AAAEAAAAAAQAAAAAAAAAAAAAA/wAA/wAAAAEAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAD/AAAAAQEAAAEAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wAAAP8AAP8AAAABAAAAAAEAAAD/AAAAAQAA//8AAAEBAAAB/wAAAAEAAAEAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAD/AAD/AAAAAQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQAAAgD/IAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA/yD///4AAQAAAP8AAAABAAAAAP8AAAAAAAD/AAAAAP8AAAAA/wAAAAEAAAAAAAEAAAD/AAAAAf8AAP8AAAAAAAAAAAD/AAH/AQAAAAAAAAAAAP8A/wAA/wEAAQAAAP8A/wAAAAEAAAAAAP8A/wAB/wEA/wAAAAAA/wAB/wAA/wABAAAAAAAAAP8AAQABAP8AAAAAAAAAAf8AAP8AAAAAAP8AAQABAP8AAAABAAAA/wD/AAEAAQD/AAAAAQAAAP//AAAAAAAAAAAAAAAAAAABAAAAAP8AAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAD//wAAAAEAAQAAAAEAAAAAAAAA//8AAAAAAAAA/wAAAAAAAP///wABAAEAAP8AAAAAAAD/AAAAAAAAAAH//wD/AAAAAAABAAH/AAAAAAAA/wAAAAEAAAAAAP8A/wABAAAAAAABAAAA/wAAAAD//wABAAAAAAABAAAAAAD//wAAAAAAAAEAAAAAAAAA/wD/AAEAAQAA/wAAAAAAAP8AAAAAAAAAAQAAAP8A/wABAAEAAAAAAAAAAAD/AP8AAAABAAAAAAAA/wAAAQAAAP//AAABAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAA/wAA/wEBLwAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD/+yAB/wEA/wAAAAEAAAAAAAAA/wAAAAAA/wABAAEAAAEAAP//AAAAAP8AAAABAP8AAAABAAAA/wD/AAAAAQABAAAA/wAAAAABAAD//wAAAAD/AAAAAQAAAP8AAAABAAAA/wABAAEA/wAAAAAAAAAAAQAAAP8AAAEBAAD//wAAAAD/AAAAAQABAQAA////AAAAAAAAAAEA/wAAAAEAAAD/AP8A/wAAAAAAAAAAAQEAAP//AP8AAQABAQAA////AAAAAAAAAAAAAAABAAAA/wD/AAAAAAAAAAAAAAD/AAEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wABAQEA////AAAAAAD/AAEAAQAAAAABAAAA/wAAAAAAAP8A/wAAAAEAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAA/wD/AAAAAQABAAABAAAA/wAAAQEAAP//AAAAAP8AAAABAP8A/wAAAAAAAAAAAAAAAQABAAAA/wD/AAEAAQD/AAAAAAAAAAAAAAAAAP8AAQABAP8AAAABAAAA/wD/AAAAAQD/AP8AAQEBAAD/AAD/AP8AAAAAAAEAAQD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP7//RAAAAEAAAD/AP8AAAAA/wAAAAEBAAD//wD/AQAAAP4AAAABAAAA/wAAAAEAAAAAAAD/AAAAAAABAAD//wD/AAAAAQEBAP///wAAAAAAAAAAAAEAAQD/AP8A/wABAAAAAAAAAAAAAAD/AAD/AAD/AAEAAAD/AP//AQABAAAA/wD/AAD/AAAAAAEAAQAAAP8A/wAAAAAAAP8AAP8BAQAA//8AAQEBAP8AAAD//v8AAQEBAAAAAAD//v8AAQEAAAAAAQD/AAAAAAD/AAAAAQABAP8A/wAAAAAAAAABAAEAAAAAAAAA/wD//wAA/wEAAAD/AAAAAQEAAAD/AAAAAAAAAAEAAP//AAABAAD//wAAAP8AAAABAQAA//8A/wEAAAH/AAABAAAA/wAAAAEAAQD/AP8AAQABAP///wAAAAAAAAEBAAAAAAAAAAAAAP//AAABAQD/AP8AAP8AAAABAAAA/wAAAAEBAP/+/wABAQEA////AAEAAQD/AAAAAP//AAAAAAABAQEA////AAEBAQD/AAAAAAAAAP///wAAAQAAAQAAAP//AAAAAQAAAAABAAD//wD/AQEAAAD/AAAAAQAA//8A/wABAAAA/wAAAAAAAAAAAP//AAAAAQAA//4AIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//QAAAAAAAAABAAAA/wAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAQAAAP8AAAAAAAEA////AAAAAQAAAP8AAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAB/wEA/wD/AAAAAAD/AAEAAAD/AAEAAQAA//8A/wAAAAEAAQD/AP8AAAAAAAD/AAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAQAAAP8AAP8AAAEAAAD//wAAAQAAAP8AAAAAAAAAAAABAAEAAAD///8AAAABAAD//wAAAAAAAP8AAP8AAAAAAAAAAAAAAP8AAAAAAAEAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAAAAAQAAAP//AAAAAAAAAQEBAP///wAAAAAA//8AAAAAAAD//wAAAAAAAP8AAAAAAAAAAAAAAAAAAAD//wAAAAAAAP//AAAAAAAAAQAAAP8AAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAAAAAB/wAA/wAAAAAAAAAAAAAAAP8AAAAAAAABAAAA/wAAAAAAAAAA/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//QAAAQAAAAAAAAAAAAABAAAA//8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAP8AAAABAQAA//8A/wEAAAD/AAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAQAAAP8AAP8AAAAAAQAAAQAAAP//AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAEA////AAAAAAD/AAAAAAAAAAABAAAAAAAAAP8AAP8AAAABAAAA//8AAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAEAAAD/AAAAAP8AAAAAAAAAAQAA//8AAAABAAAA/wAAAAAAAAAAAAAAAP8A/wABAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAABAQEA////AAABAAABAAAA//8AAAABAAABAAAA//8AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAQAAAAAAAAAQWBv9AAAgAElEQVT/AAD/AQAAAP8AAAAAAAAAAAAA/wEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEA/QD//wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAH/AAD/AAAAAP8AAAAAAAAAAAAA//8AAAEAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAA/wAAAAAAAAAB/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAH/AQD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAP8AAAAAAAAA/wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAD//wAAAAAAAAD/AAD/AAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///QAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAP8A/wAAAAEAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAD/AAAAAQAAAAAAAQEAAP///wAAAAEAAAAAAAAAAAABAQAA//8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAEAAQD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAANQFzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAoLCwABAAEAAAEAAAAAAAAA/wAAAAAAAAABAAD///8AAQAAAAABAQAA/wAA/wD/AAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAEBAQAAAAAAAP//AAAAAAAAAAAAAAABAP8A/wABAQEAAAAAAAD/AAD/AP8AAAAAAAEBAQD///8AAAAAAAAAAAABAQEA////AAAAAAABAQEAAAAAAP///wAAAAAAAQAAAP8AAAAAAAAAAQEBAP///wABAAEA/wD/AAEBAQD///8AAQEBAAAAAAAA/wAA/wD/AAAAAAAAAAAAAQEBAP///wABAQEAAAAAAAAAAAAAAAAA////AAAAAAABAQEA////AAEBAQAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAABAAAAAAEBAP///wABAQEAAP//AAABAQD///8AAQAAAAAAAAAAAQEAAAAAAP///wABAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAD///8AAQABAAABAAD///8AAAAAAAEAAQAAAQAAAAAAAP///wABAQEAAAAAAP///wABAQEAAP//AP8AAAABAQEAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPr6+wAGBgYABwcGAAAAAAAAAAAA/Pz9APT09AAJCQkABwcGAAAAAAAAAAAA8/P0AAAAAAANDQwAAAAAAAAAAAAAAAAA8/P0AAYGBgAHBwYAAAAAAAA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bAAkJCQAAAAAABwcHAAQFBAAFBQQAGxwZAAQEBAAAAAAACwsKAAAAAAATFBMAFBQSAAAAAAAAAAAACAkJAAICAQAgIR8ABQUFAAAAAAAJCQgABAUEAAgJCAAZGhcABAQEAAAAAAANDQwAAAAAABMUEwAUFBIAAAAAAAICAgAKCwsAAgIBAJKTkoEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEqcvsAAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAN3d3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgxeUgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwQAAAAAAAAAAAAAAAAAAAAA7OvtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAIiMhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7b70mAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA3d3fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA7OvtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAIiMhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALotMWYAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////EAAAAO8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAQEB8AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMABAQHwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAADfAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBAQHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAfAAAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAA3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAN8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU5DKxQAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAbAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQEBAaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////zwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAQEBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUQAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAEEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAeAAAABBAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAQQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAQEBMQAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEBAQExAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAfwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAYQEBAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQGgAAAAQQAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAhAQEBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAgAAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAChAAAAkAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAABAAAAAXwAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAsAAAAKEBAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAABAAAAAMAAAAC8AAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAANAAAADhAAAAwAAAAMABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+wUsyAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//Kb8sPq8wwm0AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Phone.png b/arma/client/addons/phone/ui/_site/images/light/Phone.png new file mode 100644 index 0000000..6083255 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Phone.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Phone.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Phone.png.b64 new file mode 100644 index 0000000..8b1c6ec --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Phone.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEVDbvofh0AACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcP+AEOX1+iALAAAw/gT7D/z+AyEBBAAPAf4AIAAAAAD/AAAgAAAAAAMAAAD9/wAAAP/+IAACAP8B/wEB////AAAAAAAAAgD/Af8BAf///wAAAgD/AAAAAAH/AQH///8AAQEBAAAAAAD///8AAQEBAP///wABAQEA/wH//wD+AAEAAgD/Af8BAf///wAAAAAAAAIA/wAAAAAA/wABAAEA/wAAAAAB/wEB////AAABAAAAAQD/AP4AAQEBAQD///8AAQEBAP8B//8AAAAAAf8BAQAAAAD/Af//Af8BAQAAAAAAAAAA/wH//wAAAAAB/wEB/wD/AAEAAQD///8AAAIA/wD+AAEAAgD/Af8BAf8B//8A/wHhAAEBAAD/AAACAf7//wAC4QAAAAAAAQDv/v0A4gID/u/9/APRA/7/8BT8CNCQEYDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXPN4QP4DAFABAP4/AAAAMAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8B/wEBAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAEAAAD/AAAAAgD/AP8AAQAAAAAAAf//AP4BAQAC//8AAAEA/wD/AAH/AQH/Af//Af4BAQAAAAAAAQAAAP8AAAAAAAAAAgD/AP8AAQD/AAAAAAAAAAL//wD+AQEAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8A/wABAQABAAACAP////8AAf8BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8C//8BAAEAAP4AAf8C//8B/gEBAAAAAP8B//8B/wEB/wL//wH+AQEAAADQ/gABwAf9AbGgDYjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYO+AEPoK9G8C/AFw/gEAEAEAAQD/Af//Af8BAf///wAAAQAAAAAAAAABAP8B/wEB/wD/AAD/AAAAAgD/AP8AAQEAAQD///8AAAEAAAAAAAAAAAAAAQABAP8A/wAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAABAP8AAAAAAf8BAf///wAAAAAAAAEAAAAAAAAAAQD/AAAAAAD/AAEA/wAAAAEAAAD/AAAAAQAAAAAAAAABAP8A/wABAQABAP8A/wAA/wAAAAEAAAD/AAAAAAAAAAAAAP8C//8B/gEBAAIA/wH/AQH/AP8AAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAQABAP8A/wAAAQD/AAAAAAH/AQH///8AAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAABAAAA/wAAAQEBAP8B//8A/wABAP8AAAAAAAAAAgLgA/8AsAP5AZGgEYjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDvgBD6CvRvAvwAcP0AABABAAEA/wD/AAEAAQAAAQAAAP8AAAAAAAAAAAAA/wL//wAAAAAAAAAAAP4AAQEAAQAAAQAA////AAEAAAAAAAEAAAAAAAAAAAD/AP8AAQABAAAAAAAAAQAA/wD//wD/AAEAAAAAAAEA/wAAAAAB/wEBAAAAAP8C//8B/wEBAP8AAP8B//8B/wEB/wD/AAEBAQAA/wAAAAAAAAAAAAD/Av//Af4BAQABAAD/Af//AAAAAAAAAAAB/wEB////AAEAAQAAAAAAAAAAAAAAAAD/AP8AAQEBAAD/AAD/Av//Af8BAQD/AAD/Av//Af4BAQAAAAD/Av//Af4BAQAAAAAAAgD/AP8AAQD/AAD/AP8AAAAAAAEAAQD/Av//Af8BAf///wABAAEAAAAAAAABAAD///8AAAIA/wAAAAAA/gABAAIA/wH+AQEAAAAA/wL//wH+AQEAAAAA/wD/AAEAAQD/Av//Af4BAQAAAAAABP+ApgeMgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXPN0QP0D/5//AAAfAQABAAD/AAEAAgD/AP4AAf8B//8B/wEB/wH//wH/AQEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAD/Af//Af8BAQAAAAD/Af//Af8BAQEAAQD///8A/wL//wH/AQEAAAAAAAIA/wD//wAA/gEBAAEAAP8B//8AAAAAAf8BAQABAP8A/gABAAIA/wAAAAD/AP8AAQEBAAD+AAEAAAAAAAEA/wAAAAAA/wAB/wH//wH+AQEAAQAAAAAAAP8B//8AAAAAAf8BAQABAP8A/gABAAEAAAABAP8A/gABAAEAAP8B//8B/gEBAAEAAAAAAAAAAAAAAAAAAAABAP8A/wABAAAAAAAAAAAA/wAAAAAAAAAAAAD/Av//Af8BAQAAAAD/Af//AQABAP8A/wABAAEAAP8AAQABAP8A/gABAAEAAAAAAAD/Af//Af8BAQAAAAAAAAAAAP8AAAAAAAD/Av//Af8BAQD/AAAAAAAAAAIA/wD+AAEAAAAAAAIC4AP9/mGkDYzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY93R/Af0AgP8A/wAAAAAAAAIA/wD+AAEAAAAAAAAAAAAAAAAAAgD/AAAAAAD+AAEAAAAAAAIA/wD+AAEAAAAAAAIA/wH+AQEAAAAA/wL//wH/AQH///8AAAAAAAEBAQD///8AAQAAAP8CAP8B/wEB////AAAAAAAAAAAAAAIA/wD+AAEAAgD/AP4AAQAAAAAAAgD/Af4BAf8A/wAAAgD/AP4AAQEAAQD/Av//Af8BAf///wABAAEA/wD/AAAAAAAAAgD/AP4AAQEBAQAA/wAA/wL//wD+AAEAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAEAAQD/Af//AP8AAQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEAAQD/AP8AAAAAAAEBAQAAAAAAAAAAAP///wAAAQD//wD/AAH/AQEAAAAAAAAAAAACAP/+//+BqguOgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYO+AEPcE858BAQBQ/wH//wH/AQEAAAAA/wH//wD+AAEAAAAAAQEBAP8A/wABAAEAAAAAAP8B//8A/gABAAIA/wH/AQH///8AAAIA/wD+AAEBAQEA/wH//wH/AQEAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEA/wH//wH/AQEAAAAA////AAEBAQAAAAAA/wH//wH/AQEAAAAAAAEAAP/+/wABAQEAAAAAAP8A/wABAAEA/wH//wH/AQH/Af//AP4AAQEBAQAAAAAA////AAEBAQAAAAAAAAAAAP8B//8BAQEAAP4AAf8B//8AAAAAAP4AAQEBAQAAAAAA/wH//wH/AQEAAAAAAAAAAAAAAAD/Af//Af8BAQAAAAAAAP8AAAABAP8B//8B/wEB////AAAAAAABAQEA/wH//wAAAAAB/wEB////AAEBAQAAAAAA////AAAAAAAAAgD/Af8BAf8B//8A/gABAAAAAAEBAQD///8AAQEBAP8B//8AAAAAAP4AAQEBAQD/Af//AAEBsQn5DWGgEYDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg74AQ9gb0vwH+/jAAAv//AP4BAQAAAAAAAgD//wD/AAD+AAEBAAEAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAgD/AP4AAf8A/wABAAEAAAIA/wD/AAEAAQD/AP4AAf8C//8B/gEB/wL//wEAAQAA/wABAP8AAP8C//8B/wEBAAEA/wD+AAEAAAAAAAAAAP8C//8B/gEBAAAAAAAAAAAAAAAAAAAAAP8B//8BAAEBAP8AAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAgD//wD/AAH+AQEAAAAA/wD/AAEAAQAAAQAAAAAAAAD//wAAAAEAAAAAAAAAAAAAAQAAAAEA/wD+AAEAAAAAAAAAAAACAP8A/gABAAIA/wD+AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8C//8B/gEBAAIA/wAAAAAA/wABAP8AAAAAAAAAAAAAAQEBAP4A/v8B/wEBAAAAAAACAP///v8BAQABAAAAAAAAAAAAAAAAAP8C//8B/gEBAAIA/wAAA9EJ+gtBoBGA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDvgBD1BfG/Av8BMP8A/wAAAAAAAQABAP8B//8A/wABAAAAAAEAAQD/AP8AAP8AAAAAAAAAAAAAAAEAAAABAP8A/wABAAEA/wD/AAEA/wAAAAAAAAABAAABAQEA////AAD/AAAAAQAAAAEA/wD+AAEAAQAAAAAAAAAAAAAAAQD/AP8AAQEAAAD/AAAAAAAAAAABAP8A/wABAAAAAAEAAQAAAAAA/wD/AAAAAAAAAQD/AAAAAAH/AQH/Af//Af8BAf8A/wAA/wAAAAIA/wH/AQH///8AAAEAAAEAAQD/AP8AAAAAAAEAAQAAAP8A/wEA/wD/AAEA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAABAAEA/wD/AAD/AAAAAQAAAAAAAAEAAQD/Af//AP4AAQACAP8AAAAAAP4AAQAAAAABAQEA////AAEBAQD/AP8AAAAAAAAAAAABAAEA////AAAAAAAAAAAAAAAAAAAAAAAAAgD/AP8AAQAAAAAAAAAAAAAAAAAAAAAAAQD/Af8BAf8B//8AAAAAAf8BAf8A/wAA/wAAAAIA/wH/AQH/AQLQCvsMQaARgPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcE8J8BAAAv/gH+/wAAAAAA/wAA/wD/AAD/AAEA/wAAAP8AAP4B/v8A/wAA/wL///8C//8AAAAAAP8AAAD/AAH///8AAP4AAf8B//8AAAAA/wL//////wD+AP7/////AAAAAAAA/wAAAP4AAQAAAAAA/wAAAP8AAAAAAAD//v8BAP8AAP//AAAAAAAAAAAAAP8A/wD///8AAP8AAP4B/v/+Af7/AP8AAP8B//8A/gAB//7/Af///wAA/gAB////AAD/AAD/Av//AP7/Af///wD/AP8AAP8AAP8A/wAA/wAAAP8AAP///wD///8AAP4AAf///wAAAAAA/wL//wD/AAAA/wAA/wH//wAAAAD///8A/wH//wAAAAD/Af//AP8AAP///wD/AP8A/wL//wD+AAEA/gAB/wL//wAA/wD///8AAAEAAP///wAA/wAAAP8AAAD/AAD///8A/wD/AAAAAAAAAAAAAAAAAAAAAAD//v8BAP8AAAD/AAAAAAAAAP8AAAAAAAD/AP8A/v/+AAD+AAEA/gAB////AAABAP8AAAAA//7/Af///wAAAP0v9wTwnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVvVwf//+AH8B/wAB/v8AAAEDAP8A/gABAP8AAAAAAAAAAAAAAAEAAAAAAAAAAQD/AP8AAQAAAAAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wD/AAEAAAAAAP8AAAABAAAAAAAA/wH//wH/AQEAAAAAAAAAAAABAP8A/wABAAAAAP8BAP8AAAAAAf8AAQAAAAAAAQD//wD/AAH/AQEAAgD/AP4AAQAAAAAAAgD/AP4AAQABAP8A/gABAAEAAAABAP8AAQAAAP4AAQABAP8A/gABAQEBAP8A/wAAAAAAAAAAAAAAAAD/AQD/AQEAAAD+AAH/AQD/Af8AAQEBAQD/Af//AP4AAQD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAP8A/wABAAEA/wAAAAD/AP8AAf8BAQABAP8A/wABAAAAAAAAAAAAAAAA/wH//wH/AQEAAAAAAAIA/wD+AAEAAQD/AP8AAQAAAAAAAAAA/wH//wH+AQEAAQAAAAAAAAAAAAD/Af//Af8BAQAAAAAAAAAAAAAAAP8DAICsC5CBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY73RA/QL8v/8C//8AAAAAAP4AAQAAAQAAAP8AAAIA/wH/AQH///8AAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAEAAQEAAAAAAAD///8AAAAAAAAAAQAAAP8AAAAAAAEAAQD/Av//AAAAAAAAAAAA/gABAAABAAAC//8AAAAAAP4BAQEBAAD///8AAQEBAAD/AAAAAAAA/wD/AAAAAAAAAgD/AP4AAQACAP8A/gEBAQAAAAAA/wD/AAAAAAAAAAAAAAABAAEA/wAAAAAA/wAAAAAAAQABAAABAAD///8AAAIA/wD+AAEAAAAAAQEBAP///wAAAgD/AP4AAQACAP8B/gEBAAAAAP8A/wAAAAEAAQEAAP///wAAAgD/AP4AAQEAAQD/AP8AAAAAAAEAAQD/AAAAAAH//wD/AAEAAgD/Af8BAf///wAAAgD/AP4AAQAAAAAAAgD/AP4AAQEBAQAA/wAAAAEAAAAAAAD/AP//AAEAAAAAAAAB/gEBAAEAAP8A//8A/wABAAAAAAAAAAAAAAAAAAAAAAABAP8A/wEBAAD/AAACAP8A/gABAAAAAAAAAQAAAP8AAQABAP8A/wAE/gVBqBGMwAAAAAAAk82j1AAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+Avyf/wD/AP/+AAEA/gABAAAAAAAA/wD///8AAP4AAf///wAAAAAAAAAAAP8B//8AAAAAAP4AAf8B////Af7/////AP///wAAAAAA/wH//wAA/wD///8AAAAAAP8A/wAA/gABAP4AAf/9/wH/Af//AAD/AAD+AAH//gAB/wD/AP///wAAAAAA/gD+//8A/wD/AP8AAAAAAAAAAAAA/gABAAAAAAD+AAEAAP8A/gH+//8AAAAAAAAAAAAAAP///wD/AP8AAAD/AAAAAAAAAAAA/wD/AP///wAAAAAAAP4AAf8B//8AAAAA/gD+/wAAAAAA/gAB/wIA/wD+AAH+//8A/gH+/wAAAAAAAP8A////AP///wAA/gABAAAAAP8A/wD///8A////AP8A/wAAAP8AAP8AAQACAP8A/gAB////AAAAAAD//QABAAIA/wAAAAD//f8BAAAAAP///wD+//4A/wH//////wAA/wABAP4AAQD+AAH/AP8A////AAD/AAEAAAAAAAAAAAAAAAAAAAAA/wH//wD/AAEAAP8AAAAAAP/+AAH/Af///wH///8B/v8AAAAA/wD/AAAAAAD9AvueYO+AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFTzbn/+AP8g////AAD//wD///8A////AP///wAAAgD/////AP///wD///8A/wH//wD+AAH///8A////AAD+AAEA/gAB////AP4B/v////8A////AP///wAAAAAA////AP///wD///8A////AAACAP8A/gAB/gH+//4B/v8A//8AAP//AP///wD///8AAP4AAf8B//////8A/wH//wAAAAD+AP7//wD/AP///wD///8AAP4AAQAAAAD///8A////AAAAAAD/Af///wH//////wD/AP8A////AP8A/wD/AP8A////AAH/AQH///8AAAAAAAAAAAD/Af//AP3/Af8B//8BAQAAAP4AAf8B//////8A/wH//wACAP//Af///wH//////wAAAAAAAAEBAP///wD///8A////AP/9/wH/Af//////AP///wAAAP8A//3/Af///wAAAAAA////AP///wAAAAAA//3/Af///wD///8A////AP7//gD///8A////AP///wD/Af//////AP///wD/Af//AP4AAf///wD///8A////AAD//wAA/gABAP4AAQD+AAH///8AAAAAAP///wD+//8h9gDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWO94IPsB9t////8AAAIA/wH/AQH/Af//Af8BAQAAAAAAAAAAAAAAAP///wAAAQAAAAAAAAABAP8A/gABAAIA/wD+AAEAAgD/AP8AAQABAP8A/wABAAEA/wD+AAEAAAAAAAIA/wAAAAAA/wEBAQAAAP8A/wAAAQD/AP8AAQABAP8AAAAAAP8AAQD/AAAAAAAAAAMA/wH+AQH///8AAAEAAAD/AAAAAgD/AAEAAAD+AAEAAAAAAP8AAAACAP8B/wEB/wD/AAEAAQD/Af//AAAAAAH/AQH///8AAAAAAAEBAQD/AP8AAAEA/wD/AAEBAAEAAAAAAP8B//8B/wEBAAAAAAAAAAAAAAAA/wL//wD+AAEAAQD/AP8AAQEAAQD///8AAAIA/wD/AAEBAAEA////AAADAP8B/gEB/wH//wAAAAAA/wABAP8AAAABAAAAAQD/Af8BAf8A/wAA/wAAAAAAAAEBAQD/Af//Af8BAf8B//8B/wEB////AAAAAAABAQEA/wAAAAD//wAAAgD/Af8BAf///wABAQEA/wH//wH/AQH/Af//AAAAAAD+AAEAAAAAAAEAAAABAP8A/wABAAEA/wD/AAEAAAAAAAAB8A7/EiGgEYDwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gL3b/4B/v8AAAAAAP4AAf///wAA/gAB////AP8B//////8A/gH+//8B//8A/wAA/wH///8A/wAAAQAA////AAAAAAD/AP8A/wH//wD+AAEAAAAA/wD/AAAAAAD/AP8AAP4AAf8A/wAA//8A/wD/AAD/AAD/AP8AAAEA//8A/wAA/gABAP8AAAAAAAAAAAAAAf4BAf4B/v8AAQAA////AAAAAAD/AP8AAP0AAQD/AAAAAQD//wL//wD/AAH/Af///wH///4B/v8A/gABAP4AAf7//gAAAQAAAAAAAP///wD//wAAAAAAAAD/AAD///8A/gH+/wD/AAH///8A/v/+AP4B/v/+//4A////AAD/AAD//v8BAP8AAP4B/v8AAAAAAP8AAQD/AAD+//8AAAAAAAD+AAH+//4AAP4AAf/+/wH///8A/wH///8A/////v8B////AP8B////AP8AAAAAAP///wAA/gAB////AAD+AAH+Af7/AAIA/wAAAAD/AP8AAP//AAAAAAAA/gAB////AAAAAAD/AP8A/wD/AP8A/wAAAAAA//7/AQAAAAAAAAAAAAEA//8A/wAA/wAAAP4AAQD/AAAA/wAAAP//EPT+7nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//7/UAD+AAH/AP8A/wD/AP8A/wD/AP8A////AP///wD/AP8AAP4AAQABAAD///8AAP4AAQD+AAH/AP//AP8AAf8A/wAA/gABAP4AAf8C//////8AAP8AAP8A/wAAAQD//gH+/wH/AQH/AP8A////AP8A/wAA/gAB//7/AQD+AAH/AP8A/wD/AP8B//////8A/gD+/wD+AAH+/v8AAAIA//8A/wAA/wAA/wH///8A/wAA/gABAP8AAP///wD//v8BAP8AAAD9AAH///8A/wD/AAAAAAD///8A/wD/AP8A/wD/Af7///7/Af8A/wD///8AAP4AAf///wD/AP8AAAEA/wD+AAEAAAAAAP4AAf8B//8AAAAA/wH//wD/AAAAAAAA////AP///wAAAP8A/wD/AP8A//8AAAAA/wL//wABAP8A/wAAAP4AAQD/AAEAAQD//wD/AAD/AAABAAEAAAAAAP8A/wD/Av///wD/AP8A/wAA/wAA//7/Af8AAAD/Af///wD/AP8A/wD/AP8A/wD/AP8A/wD/AP//AP4AAf8A////AP8AAAAAAP8A/wD/Av////3/AQD+AAH///8A/wH//wAAAAD/AP8A/wD/APwD/W4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAABU73BAAP/+IAD/AAD//wAA////AP8B////Af///wD/AP/+/wH/Af///wH////9/wH/Av//////AAD/AAAA/gAB/wH///8B////Af//AP8AAP/9/wH///8A////AAD/AAAA/wABAAAAAP7+/gAAAAAA/wH///8B//8AAQD/////AP///wAAAAAAAAEA///+/wEAAQAA//7/Af8B//8AAP8A//3/Af///wD//v8BAP4AAQAAAAD///8A/wD/AP///wD///8A/wD/AP8C//8AAAAA/wEA/wD/AAD/Af//////AP///wAB/wEB/wH//wD/AAAAAP8A/wH//wAAAAD///8A//7/AQAAAAD/Af//////AP8A/wAA/wAAAP4AAQD+AAH/AP8A/wD///8C//////8AAAEA///+/wEA/wAAAP4AAf8A/wD/AP8A/wL//wABAP///v8B////AP8A/wD/AP8A/v/+AP8B/////f8BAAEA//8B/////v8B////AP8B/v///QAB/wH//////wD///8A////AAD/AAD//v8B//8AAP/+/wEA/f8BAAAAAP8B//8A/QABAAEAAAD/AAD/AP8A//7/Af7//gD/Af//////AAH+ARFV820/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD9/vpQ/wD/AP4B/v8AAP8AAAAAAAD+AAEA//8A/wH//wAAAAAA/gABAP4AAQACAP8A/gABAAAAAP8A/wD/AP8AAP4AAQD+AAH///8A/wD/AAD/AAD/Af////7/Af8A/wD+AP7/AP4AAQAAAAD/Af//////AAD+AAH+//4A/wH//wAAAAD//v8A//7/Af8B//////8AAAAAAAD9AAH/Af//AAAAAAAAAAAAAAAA/wD/AP///wD/AP8AAP4AAQACAP8AAAAAAP4AAQD+AAH/AP8AAP7/Af4B/v8A/QABAAAAAAAAAAD///8A////AP4B/v///wAAAP4AAf///wAAAAAA/wH///4A/v8A/QABAAAAAAD+AAH///4A/wD/AP8A/wD+/v4AAAAAAAD+AAEAAAAA//7/AQAAAAAAAAAA/wD+/wD+AAEAAAAA//8AAP/+/wEAAAAA/wH//wD+AAH///8A////AAD+AAEAAAAA///+AAH/AQEAAAAA/wH//wD+AAEAAf7/AP4AAQAAAAAAAQD/AAAAAP8A/wD///8A/wH+/wAB///+Af///wH//wD+AAH+Af7/////AP8A/wD/Af//AAAAAAD/AAAA/gABAAAAAP8A/wD7/gBQAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD+AgA+AP7/AAD/AAH/AP8AAAAAAAACAP8A/gABAAAAAP8A/wAAAAAAAAAAAAD9AAEBAQEA/gH+/wAAAAAB/gEBAAAAAAACAP8A/gAB/wL//wABAAAAAAAAAAAAAP///wAA/wAB/wL//wD+AAEB/gEBAQABAP///wAA/wABAAIA//8B//8A/wABAP8AAAABAAD///8AAAAAAAAAAAAA/gAB/wD/AAAAAAAAAgD/AP4AAQAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AP8AAQABAP8B//8A/gABAAEAAAD+AAH/AP8AAP8AAAAAAAABAQAAAAAAAAD+AAH/Av//Af8BAf8B//8A/wABAAH//wD+AAEAAgD/AP8AAf///wABAQEA////AAAAAAD/AP8AAP8AAQEA/wD/AAAA/wH/AAD/AQAAAAAAAAEAAP8B//8A/gABAAAAAP///wABAQEAAP8BAf7//gAAAAAAAP8AAf8A/wAA/wABAQEAAP///wAA/wABAAAAAAAAAAAAAAAAAP4AAf8CAP8A/gAB/wD/AAEBAQAA/gAB/wL//wD+AAEAAQAAAAAAAAABAAD///8AAAAAAAAAAAAB/v5AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAGDvgBDv/urv/wH//wH/AQEAAAAAAAAAAP8B//8A/wABAP8AAAAAAAABAQEAAAAAAP8A/wABAAEA/wD/AAD/AAAAAAAAAAEAAAD/AAABAQEA/wH//wAAAAAAAAAAAP8AAQABAP8AAAAAAP4AAQABAAAAAAAAAQABAP8A/wABAAEAAAAAAAsBCQD0APb/AAAAAAH/AQEAAAAA////AAACAP8AAAAAAf8BAQAAAAD///8AAAIA/wABAAAA/gABAQABAP///wAAAwD/Af4BAQAAAAAAAAAAAAAAAP8C//8B/gEBAAAAAP8A/wABAAEAAAAAAP///wABAQEA////AAABAAABAAEAAAAAAP8A/wABAAEAAAAAAP8B//8A/wABAAEA/wH/AQH/Af//AP8AAQEAAQAAAAAAAAAAAAAAAAD/Af//Af8BAf///wAAAAAAAQEBAP8A/wAAAAAAAAAAAAEAAQAAAAAA////AAAAAAAAAAAAAAIA/wD/AAEAAQD/AAAAAAD+AAEAAgD/Af8BAQAAAAD/AP8AAQABAAAAAAD///8AAQEBAP8B//8B/wEB/wH//wD/AAEBAAEA/wH//wD/AAEBAgH///7/AQAAAAAA/wAAAQEBAP8A/wABAAEAAQIWEbARgPAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPT87DD/Af8AAP8AAf8A/wAAAAAAAAAAAAD/AAEAAAAAAAL//wAAAQD+AP4AAf4BAf8C//8A/gABAAEAAP8B//8B/wEBAAAAAAAAAAD///8AAP8AAf8C//8B/gEBAAAAAAD/AAEAAAAAAAIA/wD+/wH/AgD//wD/AC0DJgFCBjgANwYuAAsBCgC++sgBnfWsAPUA9wAA/wAAAAAAAAD/AAEA/wAA/gH+/wABAAAB/wEB/wD/AAD/AAABAAEA////AAAA/wAA/QEB/wD/AP8C//8B/gEBAAAAAAD9AAH+Av7/Af8BAQD/AAD/Av//AAAAAAD/AAH///8AAAEAAAAAAAD///8AAAEAAAD/AAD/AP8AAAAAAAAAAAEA/wAAAP8AAf8A/wAA/wABAAAAAP8A/wAAAAAAAAAAAAAAAAAAAQAA/wH//wD/AAH/AP8AAP8AAAAAAAAAAAAAAAIA///+/wEAAgD//wH/AAH+AQH/Av//Af4BAQAAAAAA/wABAAIA/wAAAAAA/gAB/wL//wAAAAAA/wAB////AAAAAAAAAQAA////AP8A/wAA/wAAAP8AAQABAAD/AP8AAP4AAQACAP///f8BAAAAAAAAAAAAAQAA/v/+AAACAP8A/wABBgDqIAAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAPkH/w8A+v8AAAAAAAAAAAAA/wAAAAEAAAACAP8A/QABAf4BAf8B//8AAQAAAAAAAAD+AAH/Af//Af8BAQAAAAH/AP8AAP8AAAAAAAABAAEAAAAAAAD+AAH/AP8AAAAAAAAAAAAAAAAAAP4AAQD/AAAtAyYBWAhLACwFJQAAAAAAAAAAAAAAAABCBjgA9f72AJz2rAAAAAAAAAAAAAH/AQD/AP8AAP8AAQD/AAD/Af//AP8AAAAAAAD///8AAAAAAAEAAQD/AP8AAAIA/wD/AAD/AP8AAQABAAAAAAAA/gABAAAAAP///wAA/gABAP8AAAEBAQD/Af//AP4AAQAAAAAAAQAAAAAA/wAAAAEAAAAAAAAAAAABAP8A/wABAAAAAAEAAQD+Af7/Af4BAQEBAQD/Af//AP8AAQACAP8B/gEB/wD/AAAAAAAAAQD/////AQABAP8A/wABAP4AAQEAAQD//v8BAQABAP8A/wAB/gEB/wD/AAD/AAAAAQAAAP8AAAABAP8A/wABAP4AAQAAAAABAAEAAAAAAAAAAAD/AP//AAEAAAD/AAH/AP8A/wH//wH/AQEAAAAAAAAAAAH+AAH/AAAAAP8AAAABAAAA/wAAAAEA/wD+AAH/Af///AMCLwAAANAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAH5/zH+Av//AP4AAQACAP8BAAEBAP8AAAD9AAEAAAAA////AP///wEBAgH//gH+/wAAAAAB/gEB/wL///8A/wAB/gEB/wL//wH+AQH/AP8A/wD/AAAAAAAAAAAAAQABAP8A/wAAAAAAFwMUAG8LXQAsBSYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATQhCAMj60QDT+9oAAAIA/wD+AAEAAAAAAAAAAP8C//8B/gEB/wD/AAEBAQAA/wAAAAEAAP4B/v8A/gABAf0BAf8C//8B/wEA/wH/AP///wAAAAAA/wL//wH/AQH/Af//AP8AAf///wAB/wEBAAEAAAD/AAAAAAAAAP4AAf8A/wAAAAAAAQABAP///wAAAQD/Af4AAf4C//8B/gEB/wL///8A/wAAAAAAAP8AAAH+AQH///8AAAAAAAAAAAD/Af8AAf8BAAD/AAEAAQAA////AP8C//8AAAAAAP4AAQABAAD+//4AAQABAAACAP8AAAAA/wD/AAH+AQEAAQAAAP8AAP8C//8A/gABAAAAAP8C//8B/wEB////AAEAAQD/Av//Af4BAQAAAAAAAgD/AP8AAf4B//8A/gABAAIA/wH/AQH///8AAAEAAAH/AQAA/wAB+vb7EQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAA/Q8A/gABAAAAAAD+AAH///8A/wD/AP8A/wD/AP8A/wD/AAD/AAD//v8BAAAAAP///wD/AP8A/v/+AAD+AAH/AP8AAP4AAf8A/wD/AP8A/wH//wAAAAAAAAAA/wD/AP8B//8iBBwAhA5wACwFJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHoNaAALAwn/AP4AAf8A/wD+Af7//wD/AAD+AAEAAAAAAP8AAP4A/v8AAAAA//7/AP///wD/Af//////AP///wD+Af7/////AP8B//8AAgD/////AP8A/wAA/gABAAAAAAAAAAD/AP8A////AP8B////Af///wD/AAAB//8BAAAA/v/+AAD+AAEA/gAB/wAAAAD+AAH/Av//AP4AAf///wAA/gABAAAAAP///wD/AP8A/wD/AP8A/wAAAAAA/wD/AP4B/v////8A/wH//wD/AAD///8A/wD/AP///wAAAAAA/wD/AP///gD///8AAP0AAf4B/v/+/v4A/gH+/wD+AAH/AP8A/wD/AAD+AAH///8AAAAAAP8A/wAA/gAB/wD/AP8C/////v8B/gD+/////wAAAQD/Af8BAf///wAAAAAAAP4AAf8A/wD///8AAgMBHwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8BACD/Af//////AP///wD/Af//////AP///wD///8A/wH///8C//////8A//3/AQD+AAH///8AAP4AAf///wD///8AAAAAAP///wD/Af//AAAAAAAAAAAA//8A////ACICHAGFDnEAFwITAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsBCQBvCl8B/gH+/////wAAAAAAAAAAAP///wD+Af7/AAEAAAH/AQH+//4AAAEAAAH/AQEAAAAA/wD/AAD+AAEB/wAB////AAAAAAAA/gABAP4AAQAAAAD///8A////AP8B//8AAAAA////AP8A/wD//f8B/wH////+AAH+Af//AAAAAP///wD///8A////AAAA/wAA/QAB////AAD+AAH///8AAAAAAP///wD///8A////AP///wD//f8B////AAAAAAD///8AAP4AAf/+/wEA/gABAAAAAP///wAAAAAA////AAD/AQH//v8B/wL//wD+AAEAAAAAAP8AAAAAAAD///8A/wH///8A////Af//AAAAAP8B////Af//AAAAAP/9/wH/Af//AP4AAQD+AAH//v8B/v7+AP///wD///8A////AP8B////AP8A/v8BEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP4A/w8A/gABAAAAAP8B////AP8AAAAAAAAAAAD/AP8AAP4AAf/9/wEAAAAA/wD/AAAAAAD///8AAAAAAP8B////Af//////AAAAAAD//f8B////AP4A/v/+AP8AFgMTAHoOaQALAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Bi8ATwdDAf///wD//f8B////AAAAAAAA/gAB/v/+AP///wD/Av//////AP///wD/AP8A/wH///8A/wD//wAAAAAAAP/+/wH///8A/wD/AP///wD///8AAAAAAAD+AAH+//4AAAAAAP/9/wH/Af//AP4AAQAAAAAA/gABAAAAAAAAAAD/Af///wD/AP4A///+AP4AAAAAAP8A/wAAAAAA////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAP///wD/AP8AAAAAAP8A/wD/Af///gD+/wAAAAD///8AAAD/AP8B//8AAAAAAP4AAQACAP8AAAAA/wD/AP///wAAAAAAAP4AAQD/AAEA/gAB////AP/9/wEA/gAB/v/+AAAAAAAA/gAB////AAAA/wAAAAAAAAIA/////wAAAAAAAAAAAP/+/wEAAAAAAQIAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH//wH///8A////AAD/AAEA/gAB////AP///wAA/wAA/wH//wAC//////8AAP8AAP///wAAAgD//wD/AAD+AAEA/gAB/wD/AP///wAAAP8AAP4AAQD+AAH/Af//WQlLABcCEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWgpMABYDEwAAAQAA////AP4B/v//Af//AP8AAP///wAA/QAB////AAAAAAAB/gEBAP4AAQD/AAD///8A/gH+/wABAP//AP8AAAEA//8A/wAAAAAA/wH///8B//8A/wAA////AAAAAAAAAAAA////AAAAAAD///8A////AP///wAA/gABAAAAAAH/AQEA/wAA/wH//wD/AAD/Af///v/+AP8B//8A/wAA/wL//////wD///8A////AP8A/wAA/wAA////AAABAP8A/gABAP4AAf///wD///8A//8AAP/9/wH///8A/wH//////wAAAAAA/wD/AP///wD///8A////AP8A/wD/AP8A/gH+/wAAAAD/Af//AP8AAP8B//////8AAAAAAP8BAP//Af/////+AP+zhthOAAAgAElEQVQC////AP8A////AAD/AAD///8AAP/9AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7+ASD/AP8A/wD/AP8B//8A/wAA/wD/AAAA/wD/AP8A//7/Af/+AAH/Af///wH//wAAAAD//v8B/wD///8C////Af///wH//wAAAAD/AAAAAAAAAP8A/wBEBToBRAg6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwEKAHEMXwAAAAAA/wD/AAD/AAD//f8B/wH///8B////AP8A/wD/AP4B/v/+//4A/wD/AP8A/wD/Af//Af4BAf/+/wH///8A//7/AQD//wD/AP8A//7/Af/+/wH/AP8A/wD/AP8A/wD//v8B/wH///7//gD///8A/wH///8A/wD/Af//////AP7//gD/AP8A////AP8C/////v8BAP8AAP8A/wD/AP8AAf4BAf8A/wD///8A/wD/AAD+AAH/Af///wD/AP/9/wH/Av///wD/AP8A/wD/Af///wL///8A/wD/AP8A//7/Af///wD+//4AAP8AAP8A/wD/AP8A/wH//////wD///8AAP8AAP8A/wD//f8BAAAAAP///wD/AP8AAAAAAP/+/wH//v8B//8AAAD+AAH///8A/wD/AP8B////AP8A/f4BIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///QD/Af///wH//////wD+//4AAP8AAP//AAAA/wAAAP8AAAD//wAA/gABAP4AAf7//gAA/wAAAP4AAQD9/wEA/gABAP0AAf///wAAAAAA/wD/AAD/AABECDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0GJwBPCEIAAP8AAAD+AAH/Av//AP4AAQD+AAEAAAAAAP8AAAD9AAEAAAAA/wH//wD/AAD/AP8A/v/+AAAAAAAA/wAA////AP//AAAA/wAAAP8AAAD/AAAA/wAA/wH//wD/AAAA/wAAAP4AAf///wAAAQAAAP4AAQD/AAAA/gAB/wH//////wAA/wAAAP8AAf/9/wH/Af//AAD/AP///wAAAAAA////AAD/AAAAAAAA/wH//wD/AAD//v8B////AAAAAAD///8AAP8AAP8B//8A/wABAP0AAQAAAAAAAAAAAP8AAP/+/wH/Af//AP4AAQD/AAAA/wAA//7/AQAAAAD/Af//AP4AAQD/AAAAAAAA////AP8A/wD///8A////AAD/AAAA/wAA/wD/AP8B//8AAAAA////AP///wAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wAA/gABAP4AAf///wAAAAAA/wD/AP8B////AP8A/wD/AP//AAD/AP8A/wH///8B////Av//////AP8CAP//AP8A/wD/AP8A/wD///8A//7/ABYDEwAtBicAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDFcAIQYd//8A/wAA/gAB/wD/AP8A/wD/Af///wD/AP8A/wD+AP7/AAAAAP4B/v8A/gABAAAAAP///wD/AP8AAAAAAP4B/v//AP8A/wD/AP8A/wD/Av//AP4AAf8A/wD+Af7//wD/AAAAAAD///8A/gH+//8A/wD+Af7/AP8AAAAAAAD/AP8A////AAAAAAAA/wAA/gH//wD9AAH///8A/wD/AP///wD/AP8AAP4AAf4B/v8AAgD/AAAAAP8A/wAA/gAB/wD/AAD+AAH/Af///wD/AP///wD/Af///gH+/wABAP////8A/wD/AP8A/wD/AP8AAAAAAP///wAA/gAB/wD/AP8C////AP8A////AAD+AAEAAAAA/wD/AP8A/wD/AP8AAAAAAAAAAAD///8AAAAAAAABAAD/AP8A/wD9AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAH+AQH///8A/wH////+/wH///8AAAAAAAABAAD///8A//7/AQH+AQEA/gAB/wD/AP/9/wEAAAAAAAAAAAD/AAAAAAAA/wD/ACIDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQ1qAQoDCf////8A////AP///wD//f8B/wH//wD//wAA/gAB//3/AQAAAAD///8A////AP///wD/Af//AAAAAAD+AAEAAAAA////AAAAAAD//f8B////AP8B//8AAAAA////AP///wD///8AAAAAAAAAAAAAAAAA//7/Af///wD///8A////AP8B//8A/v8BAP4AAf8A/wAA//8AAAAAAAABAAD/Af//////AAD+AAEA/gAB/wH///8B////Af//////AAAAAAD//f8B/wH//wAAAAD///8AAf8BAf/+/wEB/wEB////AP8B//8AAAAA/wH///8B////Af//////AP/9/wH///8A/wD/AP///wD/Af//////AP8B////Af////3/Af/9/wH///8A/wH////9/wH///8A/wAB/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//ACAAAAAA/wD/AP8A/wAAAAAA//3/AQAAAAD/AP8A/v/+AP7+/gD/Af///wL///4B/v/+/v4A/wH//wAAAAD+AP7//gD+//8A/wD///8A////ACMGHf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwMTAFwJTgEAAAAA/wD/AAAAAAAAAAAAAP7/Af8AAAD/AP8AAAAAAAD+AAEAAAAA/wH//wAAAAAA/gAB/wH///8B//////8AAAAAAP///wAAAAAA////AP///wAA/gABAAL//wAAAAD///8AAP4AAf4A/v///v8BAAAAAAAAAAD/Af//AAAAAAD+/wH+Af///wH//wAAAAD+AP8A/gD+//7+/gAA/gAB/wH//wAAAAD///8AAP4AAQD+AAEA/gABAAAAAP7//gAAAAAA//3/Af7//gAA/gAB/v7+AAAAAAD+Af7/AAAAAP///wD///8AAf8AAQD+AAH///8AAAAAAAAAAAD/Af///wD/AAAAAAD//v8BAAAAAAD+AAH//f8BAAAAAAAAAAAAAAAAAP4AAQAAAAD///8AAP/+IQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP4B/v//Af//AP8AAP8B//////8AAAAAAP///wAAAAAAAP8AAAAAAAAA/gABAP8AAAD+AAEAAAAAAP4AAf///wAA/wABAf8BAf8A/wD///8AAAAAABUBEgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAKRAAtBSYAAAEA//8A/wD///8A//8AAP8B//8A/wAA////AP///wD/AP8AAP4AAf///wD///8A//3/AQAAAAD/AP8A////AP///wD///8AAAAAAAD/AAH/Af////8AAP8B//8AAQAA/wD/AAAAAAAAAQD/////AP///wAA/gAB/wH///8BAP8A/gABAP4AAf8B//8BAAEAAP4AAf8B//8AAAAAAAAAAP8B////Af///wH//////wD///8A////AAABAP////8AAAIA/wAAAAD///8AAAIA//8B//8A/QABAAAAAAD+AAH///8A/gD//////wAAAAAA////AP///wAAAAAAAP8AAAAAAAAAAQD//wH///4B/v8AAAAA/wH///8A/wD///8A////AP4B/v8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+AAH//f8B/wD/AAD+AAH/AP8AAAAAAP8A/wD///8A/wH///8B////AP8A//7/Af8B//8AAP8A/wH///8A/wD/Af///gD+/////wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzD2IACgEJAAD/AAD/Af///wD/AP/+/wH/AP8A/wH///8C//////8A////AP8A/wD/Af///wD/AP///wD///8AAAAAAP8A/wD/AP8A/wH//////wAA/wAB//7/Af///wD///8A////AP/+/wH//f8BAAAAAP8A/wD/AP8A//3/Af/+/wH/AP8A/wL////+/wH+Af7//wD/AAAAAAD+AP7///7/AQD+/wH//f8B//7/Af8C////Af//AAAAAAD+AAH/AP8A////AAD//wD/Av////7/AQD+AAH+Af//////AP8A/wAAAAAA//7/Af8C/////v8B/wD/AP8B//8A/gAB/wL///7//gD//v8B//7/AQD9AAH/Af////7/Af8A////AP8AAAAAAAD+AAH///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B//8AAQAA/wH///4B/v8A/wAA////AAD/AAAA/wAAAP4AAf8A/wD//wAAAP8AAAD/AAH/AAAA//4AAQD/AAD//QABAP4AAQD/AAAA/wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAxQAdA1iAf8A/wD/AP8A/wEA//8B//8AAAAAAP4AAf///wD//wAAAAEAAP8B//8A/gABAAAAAAD+AAH/Af///v/+AAD/AAAAAAAA/wAAAP8B///+AP7///8AAP8A/wD///8AAP8AAAD/AAAAAAAA/v/+AAD/AAAA/wAAAAAAAAD/AAAAAAAAAP0AAQD/AAD///8AAAEA/wD+AAEA/gABAAAAAP4B//8AAAAA/wH//wD9AAEA/gAB/wH//////wAAAQD/AP4AAf4BAP8A/gABAP8AAP///wAB/gAB/gH+////AAD///8AAP8AAAD+AAEAAAAAAP8AAP/+AAH///8AAP4AAQAAAAD/Af////8AAAABAAAA/gABAAAAAAAAAAAA/wAA/wD/AP///wD/Av//AAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAH+AQH/AP//AP4AAQD+AAH/AP8A/wD/AP8B////AP8AAAAAAAD+AAEAAP8A/wD/AP8A///+AP7/AAH///8A/wAAAP8A/wH//wABAAD/AP8A/wD/APT+9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOggyAFAKRQAA/gABAP7/AQD+AAEA/wAA/wL//wD+AAEAAv//////AAH+AQEAAAAA////AP8A/wD///8AAAABAP8A/wD///8AAP//AAD+AAEA/wAAAAD/AAD+AAEAAAEAAAAAAP8A/wD/AP8AAAAAAP8B////AP8A/wD/AP8A/wD///8A/gH+//8A/wAA/gABAP4AAf8B////Av//AP8AAAH+AQH/AP8AAP4AAf8B////AP8A////AP8A/wD/AP8A/wD/AAD+/wH///8A/wD/AP8A/wD///8AAP4AAQAA/wD/AP8A/wD/AP///wD///8A/wD/AAD//wD/AP8A////AP///wAA/gABAAD/AP/+/wD/AAAA/wH///7//gD+Af//////AAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP7//gD//v8B/wH//wD/AAD/Af///wH//wD/AAH/Af///v/+AAD/AAAAAAAA/wH////+/wEA/gABAP8AAQAAAAD///8AAP8AAf/+/wAAAAAAAAAAAOj86wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF0MTwAXAxMA////AP///wD/AP8A////AP///wD///8A/wH///4B/v/+Af7/////AAAAAAAA/gABAAD/AP///wD/Af///wD/AP///wD//v8B/wH//////wAAAP8A/v/+AP8B//8A/wAA/wH////+/wH///8A/wH///8B//////8AAf4BAf8B//////8A/gH+///+AAH//f8B/v/+AP7//gAAAAAA////AP8A/wAA/wAAAP4AAf///wAA/QAB/wH//////wD///8AAAAAAP///wD/Av///wH//////wD/Af//AAAAAP8B//////8A////AAAAAAD/Af//AP8AAAD/AAD/Af//AP8AAP8C////Af7/////AAAAAAAB/wABAAAAAAAAAAAB/gEB/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAf8A/wAA/gABAP4AAf7//wAA/gABAAAAAP8A/wD///8AAP4AAQAAAAD/Af//////AP4A/v8AAgD//wD/AP4B/v/+AP7//gD+/9H62AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCCgB0D2QAAAAAAAAAAAD///8AAP4AAQACAP8A/gABAP4AAQD+AAEA/gABAAAAAP4A/v8AAAAA////AAAAAAAA/gABAP4AAQAAAAD/Af//AP4AAQAAAAD+AP7/AAAAAP/+AAH/AP8AAP4AAQAAAAAAAAAAAP4AAQD+AAEAAgD//gH+/wAAAAAAAAAAAP4AAQAA/wAAAAAAAAAAAP8B//////8AAAAAAAD+AAH+//4A/wD/AAAAAAD/AP8AAP4AAf8B//8AAAAA////AP8BAP8A/gABAP4AAQACAP////8A////AAD+AAEAAAAA/wH///8A/wAA/gAB/wL///8A/wAA/gAB/v/+AP///wAA/gABAP4AAQD+AAH+//4A////AP4A/v//AP8A////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8B//8A/wAB/wH//wH+AQEAAAAAAAAAAP8B//8A/wEBAAAAAAAAAAAAAAAAAQEBAAAAAAAA/gAB/wD/AAD/AAH/Av//AP8AAAAAAAEA/wAAAAIA/9z64QD0/vYADAIKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvBygA////AAAAAAAAAAAAAAIA////AAABAAAAAP8AAAACAP8A/gABAAAAAAD/AAH/Av//AP4AAQAAAAABAQEA////AAAAAAAAAAAB////AAAAAAAAAQAA/wD/AAAAAAD/AQD/AP4AAQAAAAAAAQAAAP8AAAACAP8A/QABAAIA///9/wEAAgD/AP4AAQACAP8AAAAAAP4AAQABAAD/Af//AAAAAAD+AAEAAAAA////AAAAAAD/Av//Af4BAQABAAD/AP8AAP8AAAD/AAH/AAAA/wL//wL+AgEAAAAA////AAACAP8B/wEB/wAAAAAAAAAA//8AAP8AAAAAAQAA//8AAAAAAAAAAAD///8AAAAAAAAAAAAAAQAA////AAAAAAH+Af7/Af4BAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP/+/wEA/wAAAP4AAQAAAAD/AP8AAAAAAAD/AQEAAAAA/wD/AP8A/wD/AP8A////AP///wD/Af///wAAAP8B/////v8BAP8AAP///wAAAAAAAP4AAf8A/wDd++EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0/vYA/wH///8A/wD/Af//////AAH+AAH/Af///wD/AP/+/wH/Af///wL//wAAAAD//v8BAAAAAAAAAAD+//4AAAAAAP8A/wD///8AAAAAAP8B////AP8AAP8AAP///wD///8A/wL//////wD/AP///wD/AP///wAAAAAA//7/AQAAAAD///8A/wH////+/wH/AP8A/wD/AP/+/wH//v8B////AAAAAAD/AAAA/wL//wAAAAAA/gEBAAAAAP/+AAH///8A/wH///8B////AP8AAP8AAP8A/wD/AP///wD/AP/+/wH+//8AAP3/Af///gD/AP8AAP4AAf8A/v////8A/wD/AP/9/wEAAAAAAAAAAP8B//8A/wAA/wH//wD/AAAA/wAA/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wH//////wAA/wAA////AP8B/v////8AAP8AAAD/AAD/Af//////AP4B/v//AP8AAAD/AP8A/wD/Af///wD/AAD/AAD///8A/wH//wD/AAC69sQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACt9LkAAP4AAf8B////AP8AAP4AAf7//gAA/QABAP8AAP8B//8A/wABAP0AAf///wAA/wAA////AP///wAA/wAA////AP8B//8A/wAA////AAD/AAEA/QAB////AP8B//8A/gABAP0AAQAAAAAA/wABAAEA/wD+AAH+//4AAP8AAP///wAA/gABAAAAAAD/AAAB/gEBAAAAAAD/AAAA/wAAAP4AAf4B/v8AAP8A//3/Af8B//8A//8A/gH+//8B/v8AAQD/AP4AAQD+AAH///8AAP4AAf/+/wAA/gABAP8AAP8B////Af7//wL//wD/AAAA/wAA////AAD+AAEAAAAA/wH//wAAAAD///8A////AAD/AAH+Af7/AP4AAf///wAA/gABAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP4AAf8A/wAAAAAA/gH+/wD+AAH/AP8A/wD/AAAAAAAA/QABAAAAAAD+AAEA/gAB//7/AAD/AAAA/gAB////AP8A/wD/AP8A////AP8A/wDD98wA9P71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOj86wCh8q4A/wH//wD+AAEA/QAB/wD/AAAAAAD/Af///wD/AAH+AQH///8A/wD/AP8A/wD/AP8A/wH///8C////AP8A/wL//wAAAAD/Af///wD/AP///wD/AP8A/wD/AAD+AAH/AP8A/wD/AP8A/wD/Af////7/Af8A/wABAAEA/wD/AP8C////AP8A////AAAAAAD+//4A/wD///8A/wD/Af///wD/AAD+AAH/Af//AQABAP/+/wH/AP8AAP8AAAD+AQH//v8B/wAAAAAAAAAAAAAA/wH///8B////AP8A/wD/AAD+AAEA/gABAP0AAf8A/wD/AP8A/wD/AP8A/wAAAQAAAAAAAAAAAAD/Av///wD/AP///wAA/wAA/wH///8A/wD/AP8A//3/AQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD/AAD/AP8AAP//AAD/AAD+Af7/AP4AAf8B////Af//AAAAAP7//gAAAQAA/wD/AP8B//8A/wAA/wD/AP/+/wEAAAAA/wH///8B////Af////7/AQD//wDz/fUAufbDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHrhgD///8AAP8AAf///wD/AP8AAP8AAP8B//8A/gAB/wH//////wAAAAAAAAAAAP///wD/Af///wD/AP///wAAAAAA////AP///wD/AP8A/wH///8B//8A/wAAAAAAAAAAAAD/Af//AAAAAP8B/////f8BAAAAAAD//wD///8AAAAAAAD9AAH/Af//AP4AAf4B/v////8A//7/AQAAAAAA/gABAP//AAD//wAA/gAB/wD/AP8B//////8A/wD/AP8B/v8A//8A///+AP///wD/Af//////AP8A/wD///8AAAAAAAAAAAAA//8A/wD/AAD/AAAA//8A/wH//wAAAAD+/v4A/9lOUDQAACAASURBVP3/Af///gAA/f8BAAAAAP8B////AP8A/wD/AAAAAAAAAAAA/wL//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8A/wAAAP8A/wAA/gABAAAAAAD+AAEA/gAB////AAAAAAD///8A////AAD+AAH/AP8AAAEA/wAAAAD///8AAP4AAQH+AAH///8AAAIA//8AAAD/Af//xPbNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuPXCAOj+6/8AAgD/////AAAAAAAAAQD//wD/AP///wD+Af7///3/Af8B/v////8A/wH//wAAAAAA/gABAP4AAQD+AAH///8AAAAAAAD+AAEA/gABAP4AAQAAAAD+//4A////AP///wD///8A////AAAAAAAAAAAA////AP8AAAD/Af///wH///8A/wAA/gAB/wD/AP///wAAAAAAAQEBAP8B///+//4A/wAAAP8AAAD/AP//////AAD+AAEAAAAAAf4AAQD9/wH+Af//AAAAAP8A/wAA/gABAP8AAQD+AAEAAAAA/gD+/////wD+Af//AAAAAP8A/wD/AAAAAP4AAf///wAAAAAAAAAAAP8CAP//AAAA/wH//////wAA/gABAP4AAf///wD+AP7/AP4AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B////Af///wH///8B//////8A/wD/AP///wD///8AAAAAAP///wD///8A/wD/AAAAAAD/AP8A/gD+AP///wD///8A/wH///4A/wAAAAAA////AP8B//8B/wEBz/nWAND41wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoPOu/wD+AAH//f8B/wH//////wD//v8BAAD/AAAA/wAAAAAAAAAAAP/+AAH/Af////7/Af8B////Af///wH///8A/wAAAAAA//7/Af8B//////8A/wH//wD+/wEAAAAA////AP///wAB/wAB/wH////9/wH///8A////AP8B/////v8BAP4AAf///wD/Af///wH//wAAAAD/Af//////AP/9/wEAAAAA////AP8A/wD//v8B////AP///wAAAP8A/v//AP8AAAAAAAAA////AP///wD///8A////AP8B//8AAAAAAP4AAf///wAA/wABAAD/AP8B//8AAAAA////AAAAAAD///8A////AP/9/wH/Af////3/AQH/AQH///8A/wD/AP///wAA/gAB/wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+AAEAAAAAAP7/AQD+AAH/AP8A/wH//wAAAAD/Af//////AAAAAAAAAAAA//7/AP///wD///8AAP4AAQAAAAD/AP8A////AAD/AAD//v8BAP4AAf/+/wH+AP7/////AKDyrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC49cIA5/nqAf7//gAAAAAAAP4AAf8B//8AAAAA/wEA///+AAEA/gABAAAAAAAAAAD///8A////AAD+AAEA/gABAP4AAQD/AAD/Af//AP8AAAD+AAEAAAAAAP4AAf//AAAAAAAA/wL//wAAAAD//wAA/wD/AP8B////Af//AAAAAAD+AAH/Av//////AP8A/wAA/gAB////AP/+/wH//f8B/gD+/wAAAAD/Af///wH///8A////AP8A/wD/AP8C/////wAAAAAAAAAAAAD/AP8AAAAAAP8A/wD/Af//////AP8A/wD/AP8A////AAAAAAD/AP///v//AP///wD///8AAAAAAP4A/v8AAAAAAAAAAP8A/wD///8AAAAAAP7//gD/AP8AAP8AAP8C//8AAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD//v8B//8AAP8B//8A/wAAAP4AAf8A/wD/AP8A/wH//////wD+Af7/AAAAAP8A/wAAAAAA/wH///8B//8AAQD/AP4AAf///wAAAQD//wH//wD/AAAA/gABAAEA/8/31gDo/OsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADE9s0A/wL//wD/AAD///8A////AP8A/wD/Af//////AAD/AAD///8A/wH///8A/wAA/gABAAAAAP8B//////8A////AP///wD//f8B////AP4B/v/+Af7/////AAAAAAD///8A////AP8A/wD///8A//3/AQAAAAAA/wAB/wD/AP///wAA/QAB////AAD/AAD///8AAP4AAQAAAAAAAAAAAP8AAf8A/wAA/wABAP4AAQD+AAEA/wAAAP8AAAD+AAH/AP8A/wD/AP///wAA/wAA////AP8B//8A/gAB/wD/AAD+AAH///8A/wL///8A/wAA/wABAP8AAAAAAAD///8A/wH//wD+AAH///8A////AAD/AAAA/gAB/gH+/wABAP8A/wAA/gH+/wD9AAH/AP8AAP4AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8C//////8A/wL////+/wH/AP8AAP8AAP///wAA/wAAAP4AAf8A/wAA/gAB/wH//////wD///8AAf4BAf/+/wEA/gAB/wD/AAAAAAD//v8B//7/Af8C////Av////7/Af8A/wCr8rcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO+dX/Af4BAf8A/wD/AP8AAAAAAAD/AAD/AP8A////AP8A/wD/AP8A/wD/AP///wAAAAAA/wD///8A/wD/AP8AAAAAAP8C//8AAAAA/wL//wD+AAEAAAAA/wH///4B/v//AP8AAf4AAf///wD/AP8AAAAAAP/+/wH///8A////AP8A/wAAAAAA/wD/AP8A/wD/Av///wL///8A////Av//////AP///wD///8A/wD/AP8A/wD/Af///wD/AP///wD///8A////AP8C/////v8B/wL//wH+AQH/AP8AAAAAAP8A////Af//Af4BAf///wD///8A/wL///8A/wD/AP8A//7/AQAAAAD/AP8AAAEAAP8B////AP8AAAAAAP/+/wH/AP8AAAAAAP8B//////8A/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP4AAf///wAAAAAA/wD/AP8B/////v8B/gH+/wD/AAAAAAAA//7/Af///wAAAAAA////AAD/AAD/AP8AAAAAAP///wD/Af///wH////9/wH///8A/wH//////wC29sH/9P71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/41gD0/fUB/v/+AP8B////Af///v/+AAD/AAEA/gABAP7/AQD//wD/Af////3/AQAAAAD///8AAP8AAQD+AAEA/wAA/gH+/wD9AAH+Af7/AP4AAf8B//8A/wAA/wD/AP///wAAAAAA/v//AAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD//wD+//4AAAAAAAAAAAD///8AAP4AAQD+AAH///8AAAAAAP8B//8AAAAAAAAAAP///wAA/wAB/wH//wAAAAAAAgD/////AP///wAA/wAA//3/Af8A/wAAAAAAAAAAAP/+/wEA/gAB/wD/AAAAAAD///8AAP4AAf///wAAAAAA/wH///8A/wAAAQD///7/AAD/AAEAAAAA//3/AQAAAAD/Af//////AP8A/wD/Af//AP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAD+AAH///8A////AAAAAAD///8A////AAD+AAEAAgD/AP4AAf8A/wD///8AAAAAAAAAAAD/Af///gD+AP8A/wD///8A////AP8A/wAA/gABAP4AAf8B//8A/gABAP4AAQAAAAD0/PUBnvCsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOj86wD///8AAAAAAAD+AAEA/gABAAAAAP4A/v////8A/wAAAP8AAAD///8AAAAAAP8B////Av//////AP///wD/AP8AAf8BAf8A/wAA/gAB/v7+AAD+AAH//v8BAAAAAAD+AAH+AP7/AAAAAP///wD///8A/gH+/////wD/Af///wD/AP8CAP8AAAAA/wH//////wAA/gAB/gD+//8A/wD///8A////AAD+AAH///8A////AAAAAAD///8AAAAAAP8B/////f8BAAAAAAD+AAH/AP8AAAAAAP4A/v////8A////AP8B////Af//////AP4A/v8AAAAA/gD+/wD+AAH///8AAP4AAf///wD//v8B/wD/AP8B////Af7/AAIA//8B//8AAAAAAAAAAAD+AAEB/wEBAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAA/wD/AAAAAAD//v8B/wD/AP8A/wD/Af//AAAAAP///wAA/gABAAAAAP8B////Af///wD/AP8B//8AAAAA/wH//wAAAAD/AP8AAAAAAP///wD/AP8AqvO2/+f86gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP+9QD///8A////AAAAAAD/AP8A////AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wH////9/wH//f8B/wH///8A/wD///8A/gD+//8B////AP8AAAEAAP///wD/Af////7/Af///wAB/wEB////AP8A/wD/Af//AP4AAQAAAAD//v8B/wD/AAD+AAH/Af////3/Af8B////Af//AP4AAf///wAAAAAAAAAAAAAAAAD/AP8A////AP8B////AP8AAP4AAf/9/wH/AP8A/wD/AP///wD///8A/wH//wD/AAEAAAAA/wH//wH/AQH//f8B////AAAAAAD/AP8AAP4AAf///wD/AP8A/wD/AP8B////Af///wH//wD+AAH//wAA//3/Af/+/wH//v8B//7/Af///wD+//4A/v7+AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///wD+//4A/wH//wAAAAD+/v4A////AP4B/v//AP///wH//wD/AAAA/gAB////AP8C//////8A/wH////+/wEA/gABAP8AAAD+AAH///8AAP4AAQD+AAH///8A////AAAAAAAA/wAAAP4AAZLtogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0CCgD/Av///wD/AP///wAA/wAA/wD/AAD+AAH+//4A////AP///wD/AAAA////AAAAAAD/Av//////AAD/AAD/AP8AAP8AAQD+AAEA/wAAAAAAAAAAAAAA/gAB/wH//wAAAAD///8AAAAAAAD/AAD//v8BAAAAAP///wD///8AAP//AP///wD//v8B/wL//wD+AAEA/gABAAAAAP8C/////v8B/gD+//8B////AP//AAIA/wAAAAD/Af///gD+//8B//////8AAP8AAP8C////Af//AAAAAAD/AAD+//4AAP4AAf7//gD/Af//AAAAAAD+AAEA/wAA/wH//wABAAD/AP//AP8AAP8A/wD/AP8AAP4AAf///wAA/gABAAIA/////wAA/wAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B//8A/wAAAP8AAf8B/v8AAgD/AAEA/wD9AAEA/wAB////AP///wD///8A////AAD+AAEAAAAAAP4AAQABAP////8A/wD/AP8B////AP8A////AP8A/wAA/wAA////AP///wD///8A/wD/AML3yv/O+NUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0KNQAB/gEBAAAAAP8B//////8AAAAAAP///wAAAQD/////AP8B//8A/QABAAAAAP///wAB/gEBAP4AAf8B//8AAQD/////AP///wD/AP8A//7/AP///wD/AP8AAP0AAf///wD/AP8A////AP8B//8AAAAA////AP4B/v8AAQD//wEA//8B//8A/wAAAP0AAf8A/wD///8AAAAAAAD9AAEAAAAAAP4AAf/9/wEA/gAB//7/Af/9/wEA/wAAAP8AAQD/AAEAAAAA////AAD+AAEA/gAB//7/Af8A/wAAAQD/////AAABAP8A/wAB/wD/AP4B/v//Af//AP4AAf8A//8A/gAB////AAD/AAAA/QAB////AP8B/v////8A///+AAACAP////8A/wD/AP///wD/Af///wH//wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP/+/wEAAP8AAAAAAAD+AQEA/gAB/wD/AP8A/wAA/wAAAAAAAP8A/wD/Av///wL///8A///+Af7//wH//////wAAAAAA/wH//wAA/wD/Af///wD/AP///wD/Av///wL///8A/wD/AP8A////AP///wCe7qsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCCwAwCCkA////AP/+/wEAAAAA////AP8C//////4A/wH///8A/wD/AP8A//7/Af8A/wD+//4A/wL///8A/wD//v8B/wD//wAAAAD///8A/wD/AP8A/wD///8A/wL///8C////Af//AAAAAP/+/wH///8A/wH//wD+AAH/AP8A//7/AQD+AAEAAAAAAAAAAP///wAAAP8A/v/+AP8A/wD///8A/wL//wABAAD/AP8AAAAAAP8A/wD//v8B/wD//wAAAAD///8A/wD/AP///wAAAAAA/wH///8A/////v8B/wD/AP8A/wAA/wAA/wH//wH+AQH//v8B/wD/AP/+/wH/Av///wD/AP/+/wH/AP8A/wD/AP/+AAH/AP8A/wAAAAD9/wH/AP8AAP8AAP8B/////v8B/wD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD+Af////7/AP8A/wD/AP8AAP4AAQAAAAD+Af7/AP0AAQAAAAAA/gABAP4AAf8A/wAA/gABAP4AAQD/AAH+//4AAP4AAf/+AAEA/gABAAAAAAD/AAAA/f8B////AP8B//8AAAAAAAAAAAD/AAHO99QAqfG1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7FWoADAMK/wD/AAD+Af7/AP8AAAD+AAH//gABAP8AAQD9/wEAAAAAAAAAAAAB//8AAAAAAP4AAQD+AAEAAAAAAP8AAf///wD/Af///wH//wAAAAD/Af//AP4AAf///wAA/gAB////AAD//wAAAQD///7/AQAAAAAA/f8BAP8AAP8A/wD+Af7//wH//wAAAAD//wAA/wH//////wD/Af//AP8AAP///wD/Af//////AAAAAAAA/wAAAAD/AP///wAAAAAAAAAAAAAAAAD+Af7/AP4AAQD/AAEAAAAAAAAAAAD+AAH+Af7/////AP8A/wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAP8AAAEAAAAA/wAAAP0AAf7//wD/Af///wD/AP8A/wD/Af//AP8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8B//8A/gABAAH/AP///wD///8A/wH///8B//8A/gAB/wL//////wD///8A////AAAAAAD///8A/gD+/////wAAAAAA////AP///wD///8A/wH///8A/wD/AAAAAP4AAQD+AAH///8A/wH//////wD/AAAAnO6qAPP+9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZBBYAbxJgAf8A/wAAAAAA/wD/AP8B////Af//////AP8AAAD///8A////AP/+AAH/Af//////AP///wD/Af//////AP8C//8A/wAAAAAAAP///wAA/gAB////AAD+AAH///8A/wD/AP8AAAD//v8BAAAAAP8A/v//AAAA/wD/AP8B//8A/gAB//7/Af///wD/AP8AAP4AAQAAAAAB/wEB///+AP///wAA/gAB////AP///wD/Av////4AAf///wD///8A/wH//////wAA/wAA////AP///wD///8A////AP///wAA/gABAP4AAf///wD///8A////AP///wD///8A////AP///wD///8A/wL///7//wD/AP8A/wD/AAAB//8AAAAA/wH//wAAAAD///8AAP8AAQAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP/9/wH///8A//8AAP8A/wAAAP8A//7/AQD+AAEAAP8A//7/Af///wAAAAAA/wH//wD+/wH///8AAf8BAf///wAAAAAAAAAAAAAAAAD/Af//AP4AAQAA/wD/Af//AAD/AP///wD///8AAP4AAQAAAAAAAAAA8/30AJ7vqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASw1BAFcPSwD//f8BAAAAAAD+AAEAAAAA/wD/AAAAAAAAAAAA/wH///8B/////f8B/wH//wAAAAD//f8B/wH//wD+AAH///8B//7/Af///wD/AP8AAAD/AP8B//8AAAAAAAIA/////wD///8A/wH///8AAAAAAP8AAAD/AAD+AAH/Af///wH//wAAAAD/Af//AAAAAP8B///+//4A//4AAf///wAAAAAA/wH//////wD///8A////AP8B//8AAAAA//3/Af8B/////v8B/wH///8B//8AAv//AAD/AAAA/wAAAAAA////AP8A/wD/Af//AAAAAP8B//8A/wABAAAAAP///wD/AP8A//7/AQAAAAD///8A////AAD/AQH//f8B//3/Af/9/wEAAAAA////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gH+//8A///+AP//////AP///wD/AQD/AP8AAAAAAAD+Af7/AP4AAf//AAAAAAAA////AAACAP/+AP7/////AP///wAAAP8AAAAAAP4A//8AAAAA/gD//wABAAAAAAAA/v/+AP///wD/Af7/AAL//6fvswDO99QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMSVgAlCSD/////AP///wD/AP8AAP8AAP///wD+Af7/////AP8A/wAAAAAAAP4AAf///wAAAAAA////AP///wD/Af//AP8AAAAAAAAAAAAA/gH//wD+AAH+AP7///3/AQAAAAAAAAAAAP7/AQD+AAH//wAA//8AAP///wAA/gAB/wD/AP///wAA/gAB/wD/AAD+AAEA//8A/wH//wAAAAD/AP8A/wD/AAAAAAD/AP8AAAAAAAD+AAH///8A/wD/AAD+AAH/AP8AAAAAAAAAAAD//QAB//8AAP//AAD/Af//AAAAAAD/AAAA/gAB/gD+/wD+AAH/Af///gD+/wAAAAD/Af//AP8AAP4B/v//AP8AAAAAAP4B/v8AAv//AAAAAAAAAAAA/gAB////AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP8A/wD///8AAP0AAQD+AAEA/wABAP8AAP///wD///8A/wD/AP8B//8A/gAB////AP8A/wD/Af//AAAAAP///wAA/gAB/wD/AP8A/wD//wAA/v/+AAD+AAH//v8BAP4AAf8A//////8AAQAAAP8A/wD//QAB//4AAf///wCC65T/8/71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0CCwCKFncBDAMK//8A/wAB/gAB/gH///8A/wAA/wAAAAAAAAD/AAD/AP8A/wD/AP8B////Af//AP8AAQAAAAAA/QAB/wD/AP8A/wD///8AAP4AAf8A/wAA/wAB/wD/AP8A/wD/Af///wEA//8B////AP8A/wD/AP8B////AP8AAP4AAf///wD/Af////7/AAAAAAD/AQD/AP4AAf///wD/AP//AP8AAP8A/wAA/wAA/gH///4B////Af//AP8AAP///wAA/wAA//3/Af/9/wH/AP8A////AP8A/wD//f8B/wD/AAAAAAD/AP8AAAEAAP8B//8AIRI0bAAAIABJREFU/QABAAAAAP8A/wAA/gAB/gH//wD+AAEAAQD/////AAAAAAD//gAB////AP///wD/AP8A/wH//wAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAEAAP///wD/Av//AAIA/wD+AAEAAAAA/wD/AP///wAAAAAA////AP/+/wH///8A//7/Af8B//////8AAP8AAP8AAAAA/wAAAAAAAAD/AAD/Av////4AAf8C///+//8A////AP8C//8AAAAAAAAAAOb56QGc7qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkFFgCJGHcBAP8AAP7//wAB/gAB/wH///8A/wD//v8B/wD/AP///wAAAAAA/wD/AP/+/wH///8A////AAAAAAD///8AAP8AAP///wD/Af//////AAD/AAAAAAAA//8AAP8A/wAA/wAB//7/Af///wD/Af////7/Af8B//8A/wAA/wAAAAD/AAH/AAAA/v/+AP/+AAEAAAAAAAAAAAD/AAEA/gABAP8AAAD+AAEB/gABAP7/Af/+/wEAAAAA/wD/AAAAAAD/AP8A/wL//////wD/Av///wH///8A/wAA/wAA////AP///wAA/QABAP4AAf8A/wD/AP8AAP8AAP8B//8A/v8BAP8AAP/+/wH/Av////3/Af8B//8AAAAA/wL///8B/////v8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH///8A/wD+Af7//wD//wAAAAAA/gAB//7/Af8A/wD//v8A////AAAAAAD///8AAAAAAP8B////AP8A/wEA//8A/wAA/wAA/wH//wD+/wH/AP8A/wD/AP8A/wD///8AAAL//wD+AAEAAQD//wH////9/wH+/v4A/wD/AP8B//+n7rIAwPXJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzCSwAcRVhAAAAAAD+Af7/////AP///wAAAAAAAP4AAQAAAAD//v8AAP4AAQABAP8A/wAA/gH///8A/wD/Af///wD/AAAAAAD///8AAP8AAP4B/v//AP//AAD/AAD+AAH/Af//////AAD/AAAA/gABAAAAAAD+AAH///8AAAD/AP///wD/Af7/AAEA//8B/v/+Af7//gH+//8B///+Af7//wH//////wD/AP8A/wH//wEAAQD///8AAAAAAP8A/wAAAAAAAP4AAf8B//8A/QABAP8AAP8B///+Af7//gH+//8B////AP8A////AAAAAAAA/gAB////AAD9AAEAAAAA////AAEAAQAA/QABAAEA/////wD/AP8AAP4AAQAAAAD/Af//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf///wAA/gABAP8AAf///wD///8A/wH///8B////Av//AP4AAf///wD/AP8A////AP///wD///8AAP7/AQD+AQH/AP8A/wD/AP///wD///8A////AP///wAA/gAB////AP8B/////v8BAAAAAAAAAAAAAgD/////AAD+AAH/AP8AgumS/+b76gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBBNAFgQTAAA/gABAP4AAQD+AAH///8A////AAD/AAAAAQAA/wH///8A/wD/AP8AAP7/Af4A/v8A/gAB/wH//wAAAAAAAAAA/wL//wD+AAH//v8BAP8AAP///wD//f8BAAIA//8A/wD///8A////AP8B////Av//////AP///wAA/gAB//7/AQH/AQEA/gABAAAAAAD9AAEA/gAB//7/AQABAAD+AP7/AP4AAf7//gD/AP8A////AP///wD/AP//////AAD+AAH/AP8A//7/AQH/AQEA/gABAP4AAQD+AAEAAAAA/wD/AP///wD/Af///wD/AP8A/wD///8A/wL///7//gD/AP8A//7/AQD/AAD/Af//////AP///wAA/wAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//wAAAAD///8A////AP8B////Af//////AAD+AAH//f8BAAAAAAAAAAAAAAAA/wH//wH/AQH///8A/wH///8B/v8AAAAAAP4AAf///wD/Af//////AAAAAAD/Af//AP4AAf/+AAH/AP8A//4AAQAAAAD//f8B/wH//wAAAAD/Af//8v30AILokgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIVYwAyCyv//wD/AP///wAAAAAA////AP8A/wD+/v4AAP4AAQD+AAEAAAAA////AAH/AQH///8A//3/Af7+/gAA/gABAP4AAf8B//8AAAAA/gH+/wAAAAAAAAAAAP4AAf8B//8AAAAA/wH////9/wH///8A/wH//wACAP8AAAAA////AP4A/v8AAAAA////AP7//gD/Av///wD/AP///wAAAAAA////AP8B//8AAAAA/wH///8B/////v8BAAIA/wACAP8AAAAAAAAAAP4A/v//Af//////AP///wD+Af7/AAAAAP8B//8A/gAB/wH///8A/wAAAAAA//3/AQAAAAD///8AAAAAAP8A/wD///8AAAAAAP/9/wH//v8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf///wAAAAAA/gH//wD+AAEA/gABAP4AAQAAAAABAQEA////AP///wD///8AAAAAAP///wAAAAAAAP4AAQD+AAH+AP7/////AAABAAAAAAAAAQEBAP4A/v8AAAAA/wH//wD//wAA/wAAAP//AP///wAAAgD//wD/AAAAAAAA/gABAP4AAcz20wCN6pwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMGXoBGgQWAAABAAD///8A/wH///8B////Av//////AP4B/v////8AAAAAAP7//gAAAgD/AAAAAP8A/wD///8A/gD+/wD+AAH///8AAP8AAf///wD///8A/v/+AAD+AAH///8AAP4AAQAAAAAA/gAB/wD/AP/9/wH+Af7/AAAAAAD+AAH///8A/wD/AAAAAAAA/gABAAEA/////wD/AP8AAAAAAAD+AAH///8AAP4AAQD+AAEAAAAA//7/Af7+/gD///8A////AP8A/wAA/wABAAAAAAAAAAAA/QAB////AP///wD+Af7/////AP8A//////8AAAIA/////wAAAAAA/wH//wD+AAEA/gAB////AAAAAAD/Av//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//////wD/AP8AAP3/Af8B////AP8A////AP7+/gD+AP7/////AP8C////AP8A//7/Af8A/wD/Af//////AP8B//8A/gAB////AP///wD//v8B////AAAAAAD//f8B//3/Af8B////AP8A////AAAAAAAA/gABAP0AAf7+/gD/Af//////AP8B//+m8LL/v/TIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAgsAmB2FABkDFgD/Af//AAAAAP///wAA/gAB/wH//wD9AAH/AP8A/wD/AAEAAQD//v8B/wD/AAAAAAD/AP8AAP4AAf8B////AP8AAP8AAAAAAAD/AP8AAAEA//8A/wAAAAAA/wD/AP8A/wD/AP8AAP8AAP8A/wAA/gAB/wD/AP8B////AP8AAP0AAf8A/wD///8A/v/+AP8A/wAA/wAA/wH//////wD+Af7//wD/AP8A/wD/AP8A//7/AAH/AQEAAAAA/wD/AAD+AAH//v8A/wL//////wD/Av///wH//wAAAAAA/wAAAf8BAQD/AAEAAAAA//7/Af8A/wD///8A//7/Af8A/wD/AP8A/wD/AP8A/wAA/gABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAQACAP8A/wAAAAAAAAD+AAH/Af///wH///8A/wD//v8BAAEAAP/+/wD///8AAP8AAP8A//8A/gABAAEAAP/+/wEAAgD//wD/AAD/AAD/Af//////AP/+AAEAAQAA/wL////+/wH///8AAAAAAP7//gD+Af7/AAAAAAAAAAAA/gAB/wD/AAD/AAEA/gABgeeRAOb76QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgUWAJkehQAZBRYA//7/Af8A/wAAAAAAAP4AAf8A/wD/Af//////AP///wD///8AAP8AAP///wD///8AAAIA///+/wH///8A/v/+AP///wD/Af//AP4AAf8B///+//4A////AP8B////Af//AP4AAf///wAA/wAA////AAD/AAH/Af//AAAAAP///wAA/wAAAf4BAQD/AAD/AP8AAP4AAf8A/wAB/gEBAP8AAP///wD///8A/wL//////wD///8A/wD/////AAD/AP8AAP4AAQACAP8A/QAB/wD/AAD+AAH/AP8A////AAD/AAD+//4AAP8AAAD/AAD/AP8AAP8AAP8B//8AAQD///8AAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP/+/wH///8A/wD/AP8A/wAA/gABAP8AAQABAP8AAAAA////AAAAAAAAAAAA/wH//wD/AAH/Af////7/AP8B///+//4AAAAAAP8B//8A/gAB/wH//wD//wD//v8AAP8AAAD/AAAA/wAA/wH+/wABAP8A/QAB/wD/AP8A/wD///8AAP8AAP///wD///8A8v/0/2biegDm++kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoFFgCaHIYBDQML/wD+AAH/AP///wD/AAABAP////8AAAAAAP4B/v8A/wAA/wD/AAABAP8AAAAA//3/AQAB//8AAAAAAAAAAP8C//8B/gEB/wD/AP///wAAAQD/AAH//wD+AAEB/gEB/wD/AAAAAAD///8AAP8AAP/+/wAA/gAB/wH//wAAAAD/AP8A////AP8A/wAA/gAB/wD/AAABAP8AAAAA////AAAAAAAA/wAAAP0AAf8B////AP8AAP8AAQAA/wAA/wAA////AP///gD+Af7/AP4AAf///wAA/QAB/wD/AP///wAAAAAA////AP///wAAAgD//wD/AAD+AAH+//4AAQAAAAAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wL//////wAAAQAA/wD//////wD///8AAP8AAP8A/wAA/wAA////AP/+/wH///8A//7/Af///wD//v8B/wD/AAD+AAEB/wEB////AAD+/wH///8A//7/AQAAAAD/AP8AAP8AAf8C////AP8A//4AAQD+AAH/AP8A////AP///wAAAQAA/wD/AP8B////Av////7/AOX66QBy5oX/8/71AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaBRYAmh2GAQ0CCgD//v8B////AP/+/wEAAAAAAAAAAAD+AAH/AP8A/wH///8A/wAA//8A/wL//wD+AQH/Af//////AAD9AAH///8A/gD+/wD+AAH//v8B//4AAQAAAAD+Af7//gD+//8B////AP8A/wL///8C//////8A////AP8B//8A//8A/wL///8B//////8A////AP8A/wD+Af7//wD/AP///wD/AP8A/wL//wD+AAH///8AAP//AAD//wAAAAAA////AAD/AQEB/wEBAP8AAP8A/wD/AP8A////AAAA/wAA//8A/wD/AP8A/wD//f8B////AP///wAA/gAB/gH+/wD//wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAAAAAD///8A//7/AQAAAAAAAAAA/gH+/////wD/AP8AAP//AP8A/wAAAAAAAAAAAAAAAAD/Af//AAIA//8B///+AP7/AAAAAP4B//8AAAAAAAAAAP8A/wAAAAAA/v7+AAAA/wAAAAAAAAAAAP4B/v8AAAAAAAAAAAD/AAD///4A/wH//////wD//f8BAP8AAQACAP/Y990AjOiaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwgiAJoehwAaBRcA////AAAAAAD//f8B/gD+/wAAAAD///8A////AP///wD/AAAAAP//AP8A/wD//f8BAAAAAP4B/v//AP8AAf8BAQAAAAD///8AAAAAAP///wD///8AAf8BAQD+AAH///8AAP4AAQD+AAEAAAAAAP8AAf/+/wH/AAAA////AAD+AAEAAAAAAAAAAP/9/wH///8A/wH///8B//8AAAAAAP3/Af8A/wAAAAAA/wAAAP8AAAD/Av//////AP///wD+/v4A/wD/AAAA/wD///8AAAAAAP8AAAD/AAAAAAAAAP8B//8AAAAAAP8AAAAAAAD/Af//AP//AP4A/wD//f8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAf7//gD///8AAAAAAP///wD///8AAP4AAQD+AAEAAAAA/wAAAAD/AAD/Af///wD/AP4A/v8A/gAB//3/AQD+AAH//v8B/wD/AAD+AAH///8A/gD+/wAAAAD///8AAAIA///9AAH///8A////AAD+AAH///8A////AP4B/v///wAAAP4AAQD+AAEBAQEAAAAAAP/9/wEA/gABsfC8AJjrpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcIIgCbH4YAGgYWAP8B//8AAAAAAP4AAf4B/v8AAAAAAP8AAQD+AAH///8A//4AAf///wD/Af//////AAAAAAD///8A/wH///8B//8AAAAA////AP4A/v8A/gAB/wH//////wAAAAAA////AP4B/v/+//4A/wH///8B///+Af7/AP4AAf4A/v////8A/gD+/wAAAAAAAAAAAP4AAQD+AAH/Af///wAAAP///wD///8A/gD+/////wD//f8BAAIA/////wAAAAAA/gH+////AAAAAAAA/wH///8B///+//4A////AAAAAAD///8A/wD/AP///wAA/wAB//4AAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP//AP8AAAAAAP8A/wD/Af//////AP///wD+//4A/wL///8A/wAA/gAB//7/AAD/AAH/AP8A/wD/AP///wAAAQD//wD///8A/wAAAAAAAP8AAf///wD+Af7/////AP8B//8AAAAAAAAAAP///wD/AP8A/wH//wD+AAEAAAAA/wD/AP8A/wD+AP7//v/+AAAA/wD///8A/wD/AJfspf+X66UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaBRcAnB+IABoEFgH/AP8AAAD/AAD+AAH///8A//7/AP8A/wD/Af//////AP8A/wAA/gAB/wH//wD+AAH///8AAP4AAf/+/wEAAAAA/wD/AAD/AAH/AP8A//7/Af8B//////8A/wH//wD/AAAAAgD///3/AQH+AQEB/gEBAAAAAAD/AAEAAAAAAAAAAP8A/wD//v8B/wH//////wAA/gAB/wD/AAAAAAD/Af//AP4AAf8A/wAAAAAAAAD/AP8A/wD///8AAP4AAf8B//////8A////AP///wAAAAAAAAAAAP///wD///8A////AP8B/////v8A/wL//wAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v/+AAD//wD/AP//////AP///wD//v8BAAAAAP8A/wAA/wAA////AP///wD+//4A/wD/AP///wAA/wAAAAH//wABAAAA/gABAP4AAf///wD///8A/wH//////wAAAAAAAP4AAQD+AAH+Af7//v/+AAABAAAA/wAA/wD/AAAAAAD///8A/wH//////wAA/gAB////AP//AAAAAAAAAP8AAAD+AAGX6qQAl+ulAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgUXAJwfiAAmCCL//gH//wD/AAAAAAAA/wD/AAD/AAAA/gABAAAAAAD/AAAAAAAAAP4AAf///wAAAAAA////AP8B///+Af7/AP8AAAD/AABbElAAkBx+AJ0eiAFOEEQA/wD/AAD+AAH//f8B/wL//////wD+//4A/gH+//8B//////8A/wD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AnyKLABoFFwAA/QAB/wD/AAD/AAD/AP8A//7/AP8A/wD///8AAP4AAf8A/wD/Af////7/AP8A/wD/AP8AAAIA/wD+AAH//wAAAP4AAf///wD+//4A////AP8A/wD//v8B/wD/AP8A/wD/AP8A/wH///8A/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA//8AAP7/Af8B//////8AAP8AAAD+AAEA/gABAAEAAP8C//////8A////AP///wD/Af//AP//AP4B/v/+/v4A/wAAAP/+/wEA/wAA////AAD//wD/Av//AP4AAf/+/wH/Av//AP8AAAACAP8A//8A//7/Af8B////Af//AAAAAP8B//////8A/wH//wAA/wD/Af//AP8AAAAA/wAA//8AAP8AAAAAAAAA/wAAAAAAAP8B////AP//AP8AANf32wBf3XQA5froAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgwvAK4klwFeFVEA/wH//wD/AAH///8AAAEAAP///wD/AP8A/wH//wD//wAA/wABAAD/AP///wAA/wAA//3/Af8B//8A/wABAP//AAD+AAEA/wAA/wD/AAD//wAAAAAA/wH//wD//wAAAAAAAP8AAf8B//8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP8AAAD/AAAA/wAAAAD+AAH///8A/wD/AP8A/wD/AP//////AAD+AAH/Af//AAAAAAAAAAAA/gAB////AP///wAA/wAAAP4AAQAAAAD+Af7/AAAAAP8AAAAA/f8B////AAAAAAAA/gAB/wH+///+/wH/AAAAAAAAAAD+AAEA/gAB////AAD+AAEAAAAAAP4AAf8AAAAA/gAB/wD/AP8AAAD/AAAA/wD/AP8A/wD/AP8A////AAD+AAEA/wAB/wL//wAAAADl+ugAUdpoAK/uuQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0DDAB4GmoAoSGNARoEFgAAAAAA//7/AP///wD/Af//AP4AAf4B//////8A/wAAAAAAAAD///4AAQAAAAD+AAH///8A/wAAAP///wD/AP8AAAAAAP8AAAD///8A//3/Af8AAAD/AP//////AAD+AAH/Af//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAAAAP///wAAAAAA////AP///wD//v8B////AP8B//8A/gAB////AP///wAAAAAA/wAAAAAAAAD/Av7//wH///8B//8AAAAA/wH//wAAAAAAAQEA/wD/AP8B////Af////4AAQAAAAD///8A/wH//////wD///8A////AP///wD///8A////AP///wAAAP8AAAAAAP8B/v////8A////AP8B/v////8AAAD/AP///wD/Af////3/Af///wD///8A8vzzAHniigCU6KIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgwvAK4nmQBeFFIA/wL//wEBAQAB/wEB////AAD+AAH///8A////AP8B////AAAA/v//AP///wD/AP8A////AAAAAAD///8A/wD/AP///wAAAAAAAAAAAP///wD//v8B////AP8B/////f8BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAAA/wD/AP8A/v7+AP8C//8AAAAA////AAAAAAD///8AAAAAAAD+AAEAAAAA/wH//////wD+//4A////AP8A/wAA/gEBAP4AAf/9/wEA/gABAP4AAf7+/gD///8AAAIA/wD+AAEA/v8B/wL///7+/gD///8AAP4AAQAAAAD/AP8A/wH//wAAAAD///8A/wD/AP8B/////wAA/gH+/wD+AAH///8A/wD/AP/+AAH/Af////8AAP8B//////8A/wH//wAAAAD///8AAAL///8C//+U6KEAXdxyAOX66AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4DDAB5G2oAoiKOARkGFv////8AAAAAAAAA/wD/AP8A////AAD+AAEAAgD//wL//wAAAAD/AP///wD/AP8A/wD/Av///wH//////wD///8A/wD/AP8B//8AAAAA/wD/AAD+AAH/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP4B//8A/wAAAQEAAAD9AAH/Af//AAAAAP///wAAAAAA////AP///wD+//8AAP4AAQAAAAD///8A/wL//wD9AAH///8A/v//AP8C////Af//////AAAAAAD///8A//3/Af4B/////wAAAP0AAQAAAAAAAAAA/wD/AP///wAAAQD/AP4AAf///wD/AP8AAP8AAAD+AAH/AP8AAP0AAf//AAAAAAAAAAEA/wD/AAAA/wAB////AAD+AAEB/wEBAf8BAf///wAAAAAA/v0AAQD+AAH///8AyfXP/13bcQDK9NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgwvAKMjjgH///8A////AP4B/////wAAAAAAAP7//wD//f8BAP0AAf///wAA/gAB/wH/////AAD//v8AAP0AAQAAAAD/AP8A/wD//wD+AAH///8AAP8AAP///wAAAQD/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wH//wD+AAH///8A/gD///8B/////v8B/wD/AP8A/wD///8AAAAAAP8A/wABAAAA/wH///8A/wAAAAAAAP4AAf8B////AP8AAAD/AAD/AAD//v8B////AP8A/wD/AP8A/wD/AAD//wD/AP8A////AP8A/wD/Af//////AP8B/////v8B/wD/AP8A/wAAAAAA////AP8AAAAA/wAA/wD/AP8C////AP8A////AP8A/wD/AP///wD/AP8AAAD+//4A/v/+AP8A/wD/AP8AAAH/////AAD/AAAA////AOT56ABc2nEAk+ehAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsGGAAoCSMA/wD/AAD+AAEAAv//////AAAA/wD///8A////AP8A/wD/Av//AP8AAAAB//8AAQAA/wAAAP8A/wD//v8AAf8BAQAAAAAAAAAA/wD/AP8A/wAA/gABAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP4AAQAAAAAAAAAA//7/AQD+AAH/Af//AP8AAAD/AAAAAAAA/v/+AAD/AAD///8A//7/AQD/AAAAAAAAAAAAAAD+AAEA/wAAAP8AAP///wD///8AAAAAAAD/AAD///8A////AP/+/wH/Af//AAEAAAD/AAD/AP8A////AP/+/wH///8AAP8AAAD/AAAA/wAAAAEAAAD//wD+//4AAP8AAAD+AAEA/wAAAP8AAQD/AAAA/gAB////AAAA/wD/Af///wH///8B//8A/wAAAP4AAQD//wD/Af7/AP4AAQABAAAAAAAAkuefAEHUWADk+ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAD/AAAA/gAB/wD/AP///wAAAAAAAAEAAP8B//8A/QABAP4AAf/+/wH//v8AAP//AAD/AAAAAQAA/v/+AP4B/v/+//4AAP8AAAAAAAD+//4AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD/AP4A/v/+Af7/AAAAAAAAAAAA/gAB/wD/AP8A/wD/AP8AAAAAAP8A/wD/AP8A/wH///8A/wD///8A////AP8A/wD/AP8A/wD/AAAAAAAA/wAA/wD/AP8A/wAAAAAA/wH//wAAAAAA/gAB/wH///4B/v8A/gABAAAAAAAAAAAAAAAA/wD/AP8A/wD///8A////AP8A/wAAAAAA/wD/AP/+/wD/AP8A////AP8A/wD/AP8AAAAAAP///wD///8AAP4AAQD+AAH///8A////AP8A/wAA/gABAAAAAP///wD/AP8AAP8AAOT76P9A1Vf/k+egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT56ADW+Nv/AAAAAP8A/wD/Af//AQABAAAAAAD/AP8A/wH//wD+AAH/Af///wD/AAAAAAAA/wAB/wL///8A/wAA/wAAAAAAAAD+AAEAAgD//wD/AP///wD/Af//AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wAB4AAAAAAAAAAA////AP7//gD///8A////AAAAAAAAAAAA////AP///wD///8AAP4AAf///wD/Af//////AP///wD/Af///wH////+/wEAAQAA/wH///8B/////wAAAP4AAf///wD/Af////3/AQD+AAEAAAAAAAAAAP///wD///8A////AP///wD/AP8A////AP8B////AAAA////AAABAAD/Af//////AP///wD/Af//AAAAAAAAAAAA/gAB/wH///8B////AP8AAAEAAP///wD///8A////AP///wD///8AAAAAAP/+/wEA/gABkeafAEDTVwDk+ecAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMn00AAA/gAB/wH//////wAA/gAB/v/+AP///wD///8A//3/Af///wD//v8B////AP8B//////8A//3/Af///wD/AP8A////AP8B/////f8B////AP///wAA/wHhAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//7/AAD+AAEA/gAB/wD/AP8A/wAAAAAA/wD/AP///wD///8AAAAAAAAAAAD/Af//AAAAAP8C/////v8BAAAAAAAAAAAA/gAB//7/AQAAAAD+AP7/AP4AAQD+AAEAAP8AAAAAAAAAAAAA/gAB/wD/AAAAAAD///8A/v7+AAAAAAAAAAAA/wH//////wD/AP8A/wD/AAD+AAH///4AAAAAAP///wD///8A/wH///8B//////8A/gD+/////wD///8A//3/AQD+AAEAAAAA/v7+AP8B////Af///wD/AAAAAAAAAgD//wD/AP///wD/Af///wD/AOT66ABA1FgAhOOTAOT55wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK7ttwAAAAAAAP4AAf8B//////8A/wD/AP8A/wD/Af//AAAAAP8B//8AAAAA/wL////9/wEAAAAA/wH//wAAAAD+/v4AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD/Af//AP8AAAD/AAD///8AAAAAAP///wD/AP8A/v/+AP///wAA/gAB////AAD9AAEA/wAA/v/+AP///wD///8AAAAAAP///wAA/gAB////AP8A/wD///8A////AP///wD/Af//AP8AAP4B/v////8AAAAAAP///wD///8AAP4AAQAAAAAA/wAAAP8AAP///wAA/wAA/wD/AP///wAB/wEBAP4AAQD+AAEA/gABAP8AAf///wAAAAAAAAAAAP///wD///8A/wD/AP8A/wAA/gABAAAAAP8B/////f8B/wD/AAAAAAAA/gABAP8AAP///wD/Af//n+mrAFvabwCt7LcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5PnnAMjyzwD///8A////AAD+AAH///8AAP8AAAD/AAAA/gAB/wH//wD+AAH///8AAP0AAQAAAAD///8AAAAAAP///wAAAAAA////AAAAAAD///8A////AP///wD+////AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/wD9AP8B/////v8B/wH///8C////AP8A/wH///8A/wD/Af//AP8AAAAAAAD///8AAAAAAP8B//8AAAAAAAAAAP8A/wD/AP8A////AP///wD/Af///wD/AP/+/wD/AP8A/wD/AP8A/wD//f8B/wD/AAD+AAEAAAAA/wL///8A/wD/AP8A/wD/AAAAAAD///8A////AP8A/wAAAAAAAP8AAP8A/wD+//4A/wD/AP8C////AP8A////AP8B////AP8A/wD/AP8A/wD/AP8AAAAAAAD/AAAAAAAA////AP///wD/AP8A////AP8B////Af///wD/AP8C//8A/gAB/wD/AOT56AB24IcAPtJVAOT55wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkeafAGZx2VQAACAASURBVP8A/wD/AP8A/wD/AP8A/wD///8A/wD/AP8A/wD/AP8A//7/AQAAAAD///8AAAAAAP8A/wD/AP8A////AAAAAAD/AP8A/wD/AP/+/wH/AP8A/wD/AP8A/wAA/v4BAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAEB4AD/AAEA/wAAAP7/AQD+AAEA/wAAAP0AAQD/AAAA/QABAAAAAP///wAAAQAA////AAD+AAH///8AAP8AAAAAAAD/Af//AAAAAAAAAAD/AP8A/wH//wAAAAAA/wAAAP8AAP///wAAAP8A/wH//wD//wD///8A////AAD/AAD/Af//AAAAAP///wAAAAAAAAAAAAD/AAD///8A////AAAAAAAA/wAAAP//AAD+AAEA/wAA/wH//wD+AAEA/wAAAAAAAP8B////Af//AAAAAAD+AAH/AP8AAP8AAP8A/wAA/wAAAP8AAAD+AAH/AP8AAAAAAAD+AAH///8AAP8AAP///wD+//4A5PnoAD3SVQB134YA5PnnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACt7LYArey2AAD/AAAA/wAA////AP///wAAAAAA/wH//////wAAAQD/AP8AAP8A/wAAAAAA/wD/AAD/AAAA/wAAAAD/AP///wAA/wAAAP8AAAD//wAA/wAAAP8AAAD/AAAA/wHgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAP0AAP///wD/AP8A/wAAAP///wD/AP8A/gH+/////wD/AP8A/wD/AAAAAAD/Af///wD/AP8B////AP8A/wD/AP8B//8A/gAB//7/AP///wD///8AAP4AAf8A/wD/AP8A/wD/AAAAAAD/AAAAAP4AAf8AAAD/AP8AAP4AAf8A/wAA/QAB////AP8A/wAAAAAA/wH///8A/wD/Af7//wD/AP8B////AP8A/wEA/////wD/AP8AAP4AAf8A/wD/AP8A/wD//wD/AAAA/gAB////AP8A/wD///8A/v/+AAD+AAH/AP8AAAAAAP8C//8A/gAB////AP///wD/Av///wD/AP8A/wAAAAAA/wD/AAAAAACr7bX/PdJVAHXfhQDk+ecAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT55wCC4pIA/wAAAP8A/wD/Af///wH//wAAAAD/AP8AAP4AAQAAAAD//v8B/wD/AP///wD///8A////AAAA/wD/AP8A//4AAf8B//////8A/wD/AAAAAQD/AP8A/wL///8A/wAAAwAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA/v/94QAAAAD/Af///wH///8B//////8AAf4BAf8A/wAAAAAAAAAAAP4B/v8A/QAB////AP/+/wH///8A////AP/9/wH///8A/wD/AP8C//8B/gEBAAAAAP8B//8AAAAA////AP///wD///8A/wH///8B//8A/wAAAP8AAAAAAAD/AP8A////AP///wD+//4AAP8AAf///wD//gABAAAAAP/9/wH///8A/wD/AP///wAA/wAAAAAAAAD/AAAAAAAA//7/Af/+/wEA/wAA////AP///wAA/wAAAQEBAP///wD///8A/wD/AP/9/wEAAAAA////AAAAAAD//f8B////AP///wD///8A////AP8B//8B/gEBAAAAAKvrtgA80VQAdN+FAOT55wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1vbbAFnYbQDx/vP//wH//////wD//v8BAP4AAf8B//8A/wAA////AAAAAAD///8AAAAAAP8B//8AAQAA////AP7//wD/Af///wH////+/wEAAAAAAP8AAP7//gD///8A////AP8B//8A/v7wAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMA7////wD//v8B////AAD+AAEAAAAA/wD/AAAAAAD///8A////AAD+AAH+//4AAAAAAP8B//8AAAAA////AAAAAAAAAAAAAAAAAP///wD+Af7/////AP///wD+AP7/AAAAAAAAAAAAAAAAAP4AAf///wD/AP8A/wD/AP///wAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AAAAAAAAAQAA////AAAAAAD/AP8A/wH///4B/v////8AAAAAAAAAAAD/AP8AAAAAAAAAAAD/AP8A/v7+AP8B//8AAAAA/v7+AAAAAAD///8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AAAAAAAAAAAAAAAAAEPAG4OsH9gAA/gAB/wAAAAAA/wAA/gABAAAAAP7//gABAAEAAAAAAAAAAAAA/wAAAAAAAAD/AAD/AP8AAgABAP8A/wAA/gABAAIA/wEAAAD/AAAA/wH//wH/AQEAAAAA/wD/AAAAAAAA/wAAAP4AAQD/AAAAAQAA/wD/AAD+AAH/AP8AAP4AAQABAAD/AAAAAAD/AAAAAAAAAAAAAAEA/wD+AAEAAAAAAP4AAQABAP8A/wEBAAD/AP/+/wEAAAAAAQABAAH+AQH/Av//AP0AAQABAAAA/gAB/wD/AAABAP8A/gAB/wAAAAH+AAH///8AAAAAAP8A/wABAAEA/wD/AAEAAQD/AP8AAP0AAQEBAQD/Af//AAEAAAD+/wEAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAABAAAAAP4AAQAAAAD/AP8AAAAAAAAAAAAA/QAB/wP//wD+AAEAAAAAAAIA/wD+AAH///8AAAEAAAD+AAH/AP8AAQABAP/9/wEAAQAA/gH+/wECAf////8AAQABAQAAAAAA/gABAAEA/wH+AQH/AP8AAAAAAAACAP8B/gEB////AAD/AAH/AP8AAP4AAQAC//8A/wAAAAAAAAEAAQD/AP8AAAD//wD/AAEA+QTQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABvGNc4A/wEx/wL//wD+AAEAAgD/Af8BAf///wAAAAAAAQABAP8A/wABAQEA/wH//wH/AQH/Af//Af4BAQABAAD///8AAQEBAAD/AAD/AP8AAAIA/wD+AAEAAAAAAQEBAP8B//8AAAAAAAAAAAD+AAEAAgD/AP4AAQAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAAEA/wL//wH/AQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEA/wD/AAEAAQAAAQAAAP8AAP8A/wABAQEAAAAAAP///wABAQEAAP8AAAAAAAAAAAAA/wL//wAAAAAA/gABAAAAAAAAAAABAAEAAAAAAAAAAAD/Av//Af4BAf8A/wABAQEA////AAAAAAAAAgD/AAAAAAH/AQH/Af//AP4AAQAAAAAAAgD/AP4AAQECAf///v8BAQABAP8C//8A/gABAAAAAAACAP8AAAAAAP4AAQAAAAAAAAAAAAAAAAAAAAABAQEA/wH//wH+AQH/AP8AAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA/wH//wH/AQH/Af//Af8BAf8B//8B/wEBAP8AAAABAAD///8AAAAAAAEBAQAA/wAAAAAAAAAAANDlO8oxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAH//sL/AP8AAAAAAAAAAAAA/gAB////AP8B//8AAAAA/wD/AAAAAAD///8AAP4AAf///wD//f8B/wD/AP8B//8AAgD/////AP4B/v//Af//AP4AAQAAAAD/Af///wH//wD+AAEAAAAAAf8BAQAAAAD///8AAAAAAAAAAAD///8A/wH//wAAAAAAAAAAAAAAAAAAAAD+Af7/////AAAAAAAAAAAAAAAAAAACAP//Af//AAAAAAAAAAD/AP8AAAAAAP8A/wD///8A/wD/AAAAAAD///8A////AP///wD///8A/wD/AP8A/wD/AP8AAP4AAf/9/wEAAAAAAP8AAP8B////AP8A/wD/AP8A/wAA/wAA/wD/AAAAAAD+AP7/AAAAAAAAAAAA/gAB////AP///wAA/gABAAIA/wAAAAAA/gABAAAAAP7//gAAAAAA/wD/AAD+AAEAAAAAAAAAAAD+AAH///8AAAAAAAAAAAAAAAAAAAAAAP8B//////8AAP4AAf4B/v8AAAAAAAAAAAAAAAD/Af//AAAAAP///wD///8AAP4AAf///wD///8A////AAD+AAH+/v4A/wD/AP7+/gAAAAAAAAAAAP///wD/AP8A/gH+/wAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAPwBBq////8A//3/Af///wD///8A/wH//wH/AQH///8A////AAAAAAD///8A/wD/AP///wAAAgD//wH////9/wEA/gAB////AAD+AAEA/gAB////AP8B//8A/wABAP4AAf///wD//f8B/v7+AP///wAA/gABAAAAAP///wD///8AAP4AAQAAAAD///8A////AP///wAA/gABAP4AAf7+/gAAAAAA////AP///wAA/gAB/wH///8B///+AP7/////AP///wD/Af//////AAAAAAD///8A/wH//wAAAAD///8A////AP8B///+Af7/////AAAAAAD/Af///wD/AAD+AAH///8A/wH//////wD//v8B////AP///wAAAAAA/wH//////wD/AP8AAAAAAP8A/wD///8A//3/AQAAAAD///8A////AAD+AAH+Af7/////AP///wD/Af///wH//////wAA/wAB////AP4B/v//Af//////AAD+AAH+Af7//wD/AAAAAAD///8A/wH///8A/wAA/gAB/wD/AP///wD/Af//////AP///wAA/gAB/wH//////wAAAAAA////AAAAAAD/Af//AAAAAP///wAAAAAAAAAAAAH7A7EAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbxDTv/f//EAACAP8B/wEBAAAAAP8C//8B/gEBAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQABAP8B//8A/gABAQEBAAAAAAD/AP8AAQABAP8A/wAAAAAAAQABAP8A/wABAAEAAAAAAP8C//8A/gABAAEA/wH/AQH/AP8AAQIB///+/wEBAAAA//8AAAABAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAAAAAAAAAP8A/wAAAAAAAQABAP8A/wAAAQD/AAAAAAH/AQEAAAAA/wL//wH+AQEAAAAA/wD/AAEAAQD/AP8AAQABAP8B//8A/wABAAAAAAABAP8AAAAAAP8AAQEAAQAAAAAA/wD/AAD/AAABAQEAAAAAAP8A/wAAAAAAAAAAAAD/AAAAAQAAAQABAAAAAAD/AP8AAQABAP///wABAQEA////AAECAQD//v8AAAEAAAEAAQAAAAAA/wD/AAEAAQAAAAAAAAEAAP/+/wABAQEA/wD/AAAAAAAAAAAAAQABAAAAAAD/AP8AAAAAAAAAAAABAgH///7/AQAAAAAAAAAAAAAAAAECAf//AP8AAP4AAQAAAAABAAEAAAIC4Oc6yiEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9Af6QAAL//wD+AAH///8A/wD/AAD9AAH/Af//////AP///wD///8AAP8AAP///gAAAAAA/gH+/wD/AAEAAQAA/gH+//8A/wAA/wAA/wH+//8B//8A/wAA/wH//wAAAAD///8A////AAD9AAEA/wAAAP4AAf///wAAAQD///3/AQD/AAD//wAA/wL//wD//wAA/wAAAP//AP8A/wAAAAAA////AP///wD///8A/wH//////wD///8A///+AAABAP8A/wAA/wD/AAD/AAAA/gAB/wD/AP///wD///8AAP0AAf///wD///8A/wH///8B/v8A/wAA////AAD+AAEA/wAAAP8AAAH/AQEA/gABAP8AAP///wD/Af//AAAAAAABAAD///8A/wD/AAAAAAAAAAAAAAAAAAABAAAA/wAA////AP///wAA/wAA////AAABAAD+Af7/AAAAAP/+/wAAAAAAAP8AAP///wD///8A/wH///8A/wD/AP8A/wD//wABAAD/Af7/AP8AAAD/AAAA/wAA////AP///gAA/wAAAP8AAAD/AAD//f8BAAAAAAAAAAAAAAAAAP8AAP/9/wEA/QABAAAAAAAAAAD/AP8A/v7/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+g6R//4A8f8A/wD/AP8AAP8AAP8A/wD///8AAAD/AP8A/wD/AP8AAAEAAAAAAQAA//8AAP8AAAD//wAA//8AAf4AAf4A/v8AAAAA//4AAQAAAAD/Af////7/Af8B////AP8A/wD/AP8A/wD/Af///wD/AP8A/wD//f8B/wD/AP8C////AP8AAP4AAQAAAQAAAP8A/wEA/wD//wD///8AAAAAAP8A/wD/Av//Af8BAf8A/wD/Af//AAABAP/+/wH/AP8A/wD///8B////AP8AAP4AAQAAAAD/AP8A/wH+/wAAAAD/AP8AAP4AAf7//wAAAAAAAAEAAP8C//8AAAAA/wL///7//gD/AP8A/wD/AP8C/////v8B////AP8A////AP8A////AP8A//////8A/wD//////wD/AP8A/wD/AP8C////Av///wD/AP///wAA/gAB/wD/AP8A/wD/Af///wH///8A/wD/AP8AAP4AAf///wD/Af////3/Af///wD//gAB/wD/AP8A/wD/AP8A/wD/AP8AAAD/Af///wD/AP8A/wD/AP8AAP8AAP///wD///8A/wH///8A/wD/Av//////AAD/AAD///8ACfsDkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgQcDwAf4Ckf///wAAAAAA/gH+/wAAAAD//v8B/v//AAABAP8A/wAA////AP7//gD/AAAA/wD/AP7//wD//wAA/wAAAAD+AAH///8A////AP///wAA/gABAAAAAP/9/wH///8A////AAD/AAD//v8B/wH//wD/AAAAAgD/AP8AAAD9AAEA/wAAAAAAAP8A/wD+//8A//7/Af8AAAD///8A/wH//wAAAAAA/QAB//7/AAAAAAD/AP8A////AAD/AAD/Af////7/AQD+AAEAAAAA////AP///wD///8AAP8BAf///wAAAAAA/wH//wD+AAH+//4A/v7+AP///wD+//4AAP4AAf8B//8AAAAAAP8AAP///wD/Af//AP8AAAD+AAEAAAAAAP8AAAD+AAH///8AAP8AAf8B//8AAAAA////AAD9AAEA/QABAP8AAP8B//8AAAAA/wH//wAAAAAA/wAB/wD/AP8B////Af//////AAD//wAA/f8B/wL//////wAA/wAA////AP8B////Af//AP8AAP///wAA/gABAP8AAAAAAAD/Af///v/+AP///wAAAAAAAP8AAQD/AAD//f8B/wH///7//gABAgCA4EHI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIL9AEPcD8M7/AAEhAAIA/wD+AAEAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAgD/AP4AAf8B//8B/wEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AP8AAQAAAAAAAgD/AP4AAQAAAAD/Af//Af8BAQAAAAAAAAAAAAIA/wD+AAH/Af//Af8BAQACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH//wH/AQEAAAAA/wH//wH/AQEAAAAAAAEA//8A/wAB/wEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AP8AAf8B//8B/wEBAAAAAAAAAAAAAAAA/wH//wH/AQEAAAAAYcpRiwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAD/Af//Af8BAQAAAAD///8AAQMB/wD+AAH/Af//Af8BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8A/QABAAAAAAIBAODoPs8hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EHA8AH9BGL/Af////3/Af///wD///8A/wH////9/wH///8A////AP8B//////8A////AP8A/wD///8A/wH//////wD///8A/wH//////wD///8AAAAAAP8B//8AAAAA/wH//wAAAAD//f8B/wH//wD/AAH/AP8A////AP8B////AP8A/wD/AP///wD///8A/wD/AP8A/wD/AP8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAA//3/Af8A/wAB/wEBAAAAAP/9/wH/Af///wH//wAAAAD///8A////AP///wD+Af//////AP///wD///8A/wH//////wD/Af//AAAAAAAAAAD///8AAAAAAP8B//////8A//7/AQD+AAH///8A/wD/AAAAAAAAAAAA////AP///wD/AP8A////AAH/AQH/AP8A////AP///wD///8AAP4AAQAAAAD///8AAAAAAP///wAAAAAA/wH///8B//8AAAAAAAAAAP8B//8BAQEAAP4AAf///wAB/wEB////AP///wD/Af//AAAAAP///wD///8AAAAAAP/9/wH/AP8A/wL//wD9A2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhBzMD/AACBAAAAAP8A/wAAAAAAAP4AAQAAAAAAAAAA/wD/AAD+AAEAAAAAAAAAAP8BAP8AAAAA//7/AQAAAAD/Av//AP4AAQAAAAD/AP8AAAEAAAD+AAH///8AAP4AAf4A/v8AAAAA//7/Af8B//////8A/wD/AP/+/wEA/wAAAP8AAP8B//8AAAAAAP8AAAD/AAD//v8B/wH///4A/v8A/gAB/v/+AP///wD//gAB/wL///7//wD+//4AAAAAAP8A///+//4A/v/+AAAAAAD/AAAAAP4AAf4A/v//AP8AAAAAAAAAAAAB/gABAAAAAAAAAAAAAAAAAP4AAf///wAA/gAB////AP8B////AP8AAP4AAf/+/wEAAAAAAAIA//8B//8AAAAAAP8AAP///wD+//4AAAAAAP8AAAD///8AAAAAAP///wAA/wAA/wD/AP8B////Af///wH///4A/v//Af//////AAAAAAD///8AAP4AAf8A/wAA/gAB/v/+AAD+AAH+Af//////AAAAAAD///8AAAAAAP8B//8A/gAB////AAAAAAAAAAAA/gD+//8B//8AAAAA/wAAgehBzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAwrwAA/1ABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAgH/AAAAAAD+AAEAAAAAAAIA/wD+AAEAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAD/AP8AAQABAAABAAABAAEA////AAAAAAAAAQAAAAAAAAD/AAAAAAAAAQEBAP///wAAAQAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAgD/AP4AAQACAP8A/gABAAAAAP8C//8B/gEBAAIA/wAAAAAA/wABAP8AAAEBAQD///8AAAD/AAAAAQAAAAAAAAEAAAD/AAAAAAAAAAIA/wD/AAEA/wAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAIA/wAAAAAA/gAB/wL//wH+AQEAAQAAAP8AAAABAAABAAEA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAAAAAAAAAABAAAAAQD/AP4AAQAAAAAAAAAAAAAAAAAAAAD/Av//Av8CAf4B/v8B/gKx7EDQUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8QYfIB8CABAP4vAAIAAAD9AAEAAQAAAAAAAAAAAAAA/wAAAQABAP8C//8A/gABAAAAAAAAAAAAAgD/AP4AAQAAAAAA/v8BAQAAAP8AAAAAAAAAAf4AAf8AAAAAAQD/AAAAAAAAAAEAAAAAAAEA/wD/AAEAAQD/AP8AAAAAAAEAAAAA/wD/AAD/AAD/Av//AP8AAQAAAAAAAAD/AAAAAAEAAQH/AP8A/wD//wEAAQEA/wAA/wD/AAEAAAD//wAAAAAAAAABAP8A/gABAQABAP/+/wEAAAAAAAAAAAD+AAH/Af//AP4AAQEAAQAAAAAA////AAAAAAAAAv////4AAQAA/wAAAAAAAP8AAAACAP8B/gEBAP4AAf8C//8A/wABAAAAAAAAAAAAAAAAAP8AAP8A/wAAAAAAAP4AAQABAP8AAAAAAf4AAQAAAAD///8AAAEA/wD/AAH/AP8AAAEA/wD//wH/AAAAAAEA/wAAAAAB/wEBAP7/AQAAAQD/AP8AAQABAP8B//8A/gABAAEA/wD/AAEAAgD/AP4AAQD/AAAA/gAB/gL+/wL+AtEL/xBh7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EHA8A7/EEH//wLR////AAAAAAAAAAAAAAAAAAD/AAAAAAAA////AP/9/wEAAAAAAAAAAAAAAAAAAAAA////AAAAAAD/Af///v//AAAAAAAA/wAA//8AAP///wAA/gAB//7/AQAAAAD///8AAP4AAf///wD//f8BAP4AAQD/AAAAAAAAAP8AAAAAAAD///8AAP8AAAAAAAAA/gAB/wD/AP8A/wD///8AAP4AAf///wD/AP8AAAAAAP4B//////8AAP8AAP/+/wEAAAAA/gH+/wD/AAAA/wAAAAAAAP///wD/AP8AAP8AAP8A/wD/AP8AAAEAAP///wD+//8AAAAAAP///wAAAQD/AP8AAP/9/wH/AP8A/v/+AAD+AAH/Af//AP8AAAD/AAD///8A/wD/AAAAAAAA/wAAAP8AAP/+/wH/Af////8AAP///wAAAQD///7/AQAAAAD///8AAP4AAf8AAAAA/wAA//7/AQD+AAH+Af7//wAAAP4B/v8AAAAA/v/+AP/9/wEAAAAAAP8AAQD/AAD//f8BAAAAAAABAAAA/wAA//4B0Qv/EEHgQcDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgv0AQ8QHtnwH/AFD/Af//Af8BAQAAAAAAAgD/AP4AAQACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD/AP4AAQAAAAAAAAAAAAIA/wD+AAEAAgD/AP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD/Af//AP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8B/gEB/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B//8BAQEAAP4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAD/Af//Af8BAQABAP8A/wABAAAAAAACAP8A/gABAAIA/wH/AQH///8AAAIA/wD+AAEAAAAAAAAAAAACAP///f8BAQEBAAAAAAAAAAAAAAIA/wH/AQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQCwD/8TYeBBwPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABS9LoD9Af5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/wD/AAEA/wAAAAAAAAACAP8A/wABAQABAP8B//8A/gABAAEAAAD/AAABAQEA////AAACAP8A/gABAQEBAAAAAAD/Af//AAAAAAD+AAEAAAAAAAAAAAACAP8AAAAAAf8BAf8A/wAA/wAAAAIA/wAAAAAB/wEBAAAAAAAAAAAAAAAA////AAABAAABAAEAAAAAAP8A/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wAAAAAAAAABAAABAAEA////AAACAP8A/gABAAEAAAACAP8A/QABAQEBAP8A/wAAAQD/Af8BAf///wAAAgD/Af8BAQAAAAAAAAAA/wH//wH/AQH///8AAAAAAAEBAQD///8AAAAAAAACAP8A/gABAAAAAAAAAAABAQEA/wH//wH/AQH///8AAAIA/wD+AAEAAAAAAQEBAP8B//8A/wABAAAAAAAAAAAA/wAAAQEBAAAC/4DuP9SBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUuzBA/AT7nwD/ACABAAEAAAAAAP8C//8AAAAAAf4BAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAEAAQAAAQAA/wD//wH/AQEAAAAAAAAAAAAAAAAAAAAA/wL//wH+AQEAAAAAAAAAAP8A/wAAAQD/Af8BAf8A/wABAAEAAAAAAAABAAAA/wAA/wD/AAAAAAABAAEA/wL//wD/AAAB/wEBAAEAAAABAP8A/gABAAAAAP8A/wABAAEA/wD/AAACAP8B/gEB/wH//wAAAAAA/wABAAEA/wABAAAA/gABAQABAAAAAAD/AP8AAQABAP8A/wABAAEAAAAAAP8C//8AAAAAAf4BAQAAAAAAAgD/AP4AAQAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAP8B//8BAQEA//7/AQECAf////8AAf8BAQAAAAD/Av//AP8AAAEBAQAA/gABAAAAAAAAAAAAAAAA/wD/AAEAAQD/AP8AAQABAAAAAAD/Av//Af4BAQABAAD/AP/gBAAFYexB0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABK9LoD+AP1/AAEAAAD/AAAAAQAAAAEA/wD+AAEAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAgD/AP8AAAD+AAH/Av//Af8BAQD/AAAAAgD/AP4AAQABAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQD/Af8BAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAEA////AAAAAAD/Av//Af8BAQAAAAAA/wAAAAEAAAAAAAAA/wAAAQEBAP///wAAAQAAAAEA/wD+AAEAAAAAAAIA/wAAAAAA/gABAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAEBAQD///8AAQEBAP///wAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAQAAAAEC8AL+AZEOAgKQ4EHQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYvzAg+v77cP4C/0///wAfAf8BAQAAAAD/AP8AAAAAAAAAAAAAAgD/AP4AAQEAAQD/Av//Af4BAf8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAACAP8A/gABAAAAAAECAP8A/gEB/wD/AAAAAAAAAgD/Af4BAf8A/wAAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAAAAQD/AAEAAAD+AAEBAAEA/wD/AAAAAAAAAQD/Af8BAQABAAD///8AAAAAAAAAAAAAAQD/AP8AAQEAAQD/Av//Af4BAf8A/wAAAAAAAQEBAP///wAAAAAAAQABAP8C//8B/gEB/wD/AAAAAAABAQEAAP8AAAAAAAAAAAAA/wD/AAEBAQD///8AAQAAAP8AAAAAAAAAAQABAP8B//8A/wABAAAAAAAAAAAAAAAAAAAAAAEBAQAA/wAAAAAAAAAAAAD/Av//AP4AAQABAP8A/wABAQABAAABAfAC/wKRDgICkOBB0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUuyxA+gL/UAL/AD//Af8w/wH//wH/AQEAAAAAAAH///8AAAAB/gEB/wL//wD+AAEBAQEA////AAACAP8B/gEBAAEAAP///wABAQEA/wH//wH+AQEAAAAAAAEAAAAAAAD/Af//Af8BAQAAAAAAAAAA////AAACAP8B/wEBAAAAAAABAP8A/wABAAAAAAAAAAD/Af//Af4BAf8A/wABAAEAAAEAAAAAAAD/Af//Af8BAQD/AAAAAAAA/wL//wH/AQEAAAAAAAEA/wD/AAEAAgD///3/AQAAAAABAQEA/wH//wH+AQEAAQAA/wH//wD+AAEBAQEA////AAEAAAD/AgD/Af8BAQD/AAAAAAAA/wL//wH/AQEAAAAAAAAAAAAAAAAA/wAAAAEAAP///wAAAgD/AP4AAQEAAQAAAQAA////AAECAP///gABAQABAAEAAdACAQDBAv4FsOxF0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgrzAQ8Az8MAMB/RD9/wEw/gD/DwICASAA//8QAAAAAAACACD/AAAAAQABAAAA/wD+AAAfAP4AAQAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAP8A/gABAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD+AP7/Af8BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/wD+AAEAAAAAAAAAAAACAP8A/gABAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wIA/wD+AAEAAAAAAAAAAAAAAAAAAAAAAAIA/wIAAOH///8AAQEBAAAAAAAA/gDgAAAAAP4B/+AAAAPxAgT+3/3+AvEDBADPEPwF4eBB0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADd7O1vAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//GeXoueJ6lWMAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Photos.png b/arma/client/addons/phone/ui/_site/images/light/Photos.png new file mode 100644 index 0000000..7c8034c Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Photos.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Photos.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Photos.png.b64 new file mode 100644 index 0000000..8355561 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Photos.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEUO21J2sUAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAACAAAAAwAAAAIAAAAB8AAAAAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA8AAAAAAAAAAAAAAA4AAAAAAAAADwAAAA4QAAAPAAAADQAAAA8AAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAAFAAAABPAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAA0AAAALEBAQGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAF8AAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAwAAAAIEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAABvAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////UAAAAJ8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAIABAQGhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+PAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQEBcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAL8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAvwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/58wD+4sEA/efNAP/u2wD/8+YA//r0AAAAAAABBg0AAA0YAAMSJwACGTIAAh4/AAEHDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///88AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9OcA/NWnAP3ctQD/+fIAAAAAAAAAAAABAQEAAAAAAAAAAAD/AP8AAQAAAP//AAAAAAAAAAEAAAQkTAAEMWYAAQwZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AEBATEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////jwAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//rzAPzQmwD91qcAAAAAAAAAAAD/AP8AAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAD/AAEAAQAAAAAABDBmAAQwZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJABAQFxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9OYA+rloAP705gABAQAAAAAAAAD/AAAAAQAAAAABAAAA/wD//wAAAQAAAAAAAAAAAAAAAAEBAP///wABAQAAAP8AAAAAAAAAAQAAAP8AAAEMGgAGR5kAAQwZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRAQEBsAAAAAAA46OwWwAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v2gD6v3QA//XmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAD//wABDRoABkCNAAERJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//XmAPvBdAD/9uUAAAL/AAAB/wAAAf8AAAIAAAAB/wABAv8AAAL/AAAC/wAAAv8AAAH/AAECAAAAAf8AAAIAAAACAAAAAv8AAAH/AAABAAAAAgEAAAH/AAADAQD/9eYA+sFzAP/15wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAN8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+bBMAP/25wABAAAA/wAAAAEAAAAAAAAA/wAAAAEBAAD//wAAAAD/AAEAAQD/AAAAAAAAAAAAAAABAAAA/wAAAAAAAAABAAAA/wAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAILGgAFSaYAAQYNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD81JkAAPjmAAEC/wAAAv8AAAH/AP8B/wD/Af8AAAH/AP8A/wABAgAAAAIAAAAC/wAAAv8AAQH/AAAB/wD/Af8AAAH/AAEC/wAAAv8AAAH/AP8C/wD/Af8AAQH/AAAC/wAAAf8AAQL/AP725QD91JkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////3wAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/15gD6tEwAAAAAAP8A/wABAAEAAAAAAP8A/wABAAEA/wD/AAEAAQAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8AAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAABku0AAELGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAhAQEB8AAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3VmAAAAv8AAAL/AAEBAAAAAf8AAAL/AAEBAAAAAv8AAQIAAAAC/wAAAv8AAAL/AAAB/wABAgAAAAL/AAAB/wAAAv8AAAL/AAACAAAAAv8AAAIAAAECAAAAAv8AAAH/AAAC/wAAAgAAAAL/AAAC/wAAAf8A/dulAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7O0A/NjaAAAB/wD/7e0AAQoKAAETEgACFBQAAh0dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvzAP3iswAAAQAAAQEAAP//AAAAAAAAAAD/AAA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AAAAC/wABAv8A/wL/AAEB/wAAAv8A/wH/AAAC/wAAAv8AAAH/AAAC/wD/Af8AAAIAAAAC/wAAAf8AAAEAAAACAAAAAv8A+/34AO7x5AD+//4AAAEAAAACAAD/AAEAAAEBAP//AQD/AAAA/wAAAP8AAQD/AAAAAAAAAAAAAQD/AAAA//8BAAAAAAD/AAAAAAAAAP//AAAAAAEA//8AAAAAAQD//wEA//8AAP//AQD//eQA/PB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+8PHAPvExwAAAf8AAQEAAAEB/wD/AP4AAAD/AAAB/wABAQAAAQEAAAABAAAAAP8AAAEAAAABAAAAAf8AAAAAAAEB/wAAAQAAAAEAAAAA/wAAAf8A/wD/AAAB/wABAQAAAAD/AAAA/wABAgAA//z+APe26gD+7voAAQEAAAEBAAAAAgAAAAEAAAAB/wD/Af8AAAH/AAACAAABAQAAAAEAAAECAAAAAQAAAQIAAAABAAABAf8AAQIAAAECAAAAAf8AAQMAAAEBAAD8/fkA7vHkAP8B/gD+AQAA/wEAAP8A/wAAAAEA//8AAAAAAAD/AAAA/wABAAD/AQD/AAEAAAACAP8AAQD/AAEAAAEBAP//AQAAAQEA/v8AAP8BAQD//wAAAAABAP7/AAD/AAEAAAEBAAABAQD/AAEA/vaqAP/5xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+rC1AAAB/wAAAQAA/wH/AP8A/wABAgAA/wH/AAEBAAAAAf8AAAH/AAAA/wAAAf8AAAH+AAAB/wAAAQAAAAH/AP8B/wAAAf4AAQH/AAAB/wAAAQAAAAH/AAAB/wAAAf8AAAIAAAACAAAAAQAAAAAAAAD8/gD4uOsA/u/6AAAC/wAAAf8AAQL/AAECAAABAgAAAQIAAAAB/wAAAv8AAQL/AAAB/wABAv8AAAH/AAEC/wAAAgAAAAH/AAAB/wAAAgAAAAH/APr9+ADs8eQA/gH+AP8BAAABAgAAAAIAAP4BAAD/AAAA/wAAAP8AAQD/AAEA/wABAP8BAAD//wAA/gAAAP8AAAAAAAEA//8AAAAAAQD//wEAAAABAP//AAD/AAEA/wAAAAAAAQD/AAAA//8BAP8AAAAAAAEA//8AAP3zjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUQOPUAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD92NoA/+3tAAEBAAAAAP8AAAEAAAABAAAAAP8AAQEAAAAB/wAAAP8AAAEAAAAB/wAAAQAAAAAAAAAAAAAAAP8AAAH/AAABAAAAAQAA/wD/AAEBAAABAQAAAAH/AAEAAAD/AP8AAQEAAAEB/wABAgAAAQMAAAABAAD/+v0A+LfqAP7v+gAAAf8AAAIAAAAB/wAAAf8AAAH/AAACAAAAAf8AAAIAAAABAAAAAgAAAAH/AAAB/wD/Af8AAAEAAAAB/wD/Af8A+/35AOzx5QD+//4A/wEAAP4AAAD/AQAA/wEAAAECAQD/AAEAAAABAP8AAQAAAAEAAAABAP8AAQAAAAEAAP8AAP8AAQD/AAAA/wAAAP4AAAAAAAEA/wAAAAABAgD/AQEA/wABAP8AAQD/AAAA/wAAAP//AAD//wAA/wABAP35xwD/+cYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7xMcA/wH/AP8B/wAAAQAAAQH/AAAB/wD/Af8AAAH/AAAB/wAAAQAAAAEAAAABAAAAAf8AAAIAAAAB/wAAAf8AAAEAAAAA/wAAAAAAAAEAAP8B/wAAAf8AAAEAAAABAAABAQAAAAL/AAABAAABAQAAAAD/AAAB/wABAgAA//v+APi26wD+7/sAAAH/AAACAAAAAgAAAAIAAAAB/wAAAgAAAAH/AAAC/wAAAf8AAAIAAAACAAABAgAAAAL/AAACAAD8/voA6vDlAP7//gAAAgAAAAEAAAACAAD/AQAAAAIAAP8BAAD//wAA/wAAAP8AAAAAAAEA/wAAAAD/AQAAAQEA/wEBAAD/AAAAAAEA/wABAAAAAQD+AAAA/wACAP//AAAAAAAA//8AAAAAAAAAAAIAAAABAP8AAQD/AQEAAAABAP//AAD89qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8z9EAAAH/AAEBAAAAAf8A/wD/AAEBAAABAQAAAAEAAAAAAAAAAf8AAAH/AAAB/wAAAQAAAAD/AAABAAAAAQAAAAD/AAAB/wAAAf8AAQH/AAAA/wAAAf8AAQD/AAAB/wAAAf8AAAEAAAABAAAAAf8AAQIAAAABAAD/AAAAAQEAAP/8/QD5t+oA/+/6AAAB/wAAAv8AAAIAAAAB/wAAAf8AAAH/AAAB/wAAAf8AAQIAAAABAAAAAQAAAQIAAPv9+QDp7+UA/f/+AP8CAAD/AQAAAAEAAAECAAAAAgAA/wAAAAACAAAAAQEA/wABAP//AAD+/wAA/wAAAP8AAAD//wEA//8BAP8AAQD//wEAAAABAP8AAAAAAAAAAAAAAP8AAAD//wEAAAABAP8AAQAAAAAA/wAAAP8AAQD//wAA/wEBAAAAAQD++LkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7i4wAA9/UAAAD/AP8A/wABAgAAAAEAAAABAAAAAAAAAAH/AAAB/wAAAQAAAAH/AAAA/wAAAP8AAAH/AAAB/wAAAP8AAQIAAAABAAABAf8AAAEAAAECAAAAAAAAAAEAAAAB/wAAAQAAAQEAAAABAAAAAQAAAAEAAAEBAAABAgAA/wH/AAABAAD//P4A+LfrAP7w+wAAAQAAAQH/AAECAAABAgAAAAIAAAECAAAAAgAAAAH/AAAC/wABAv8A+fz4AOjv5wD9AP4AAAIAAAACAAD/AgAA/wEAAP8BAAD/AQAAAAIAAP8BAAD//wEA//8BAAAAAQAAAQEAAAABAAAAAQD/AAAA/wAAAP8AAQD/AQAA/wAAAAAAAQD/AAEA/wAAAAAAAQD/AAAA/wABAP8AAQD+AAEA/wABAAAAAAAAAAEA//8AAP8AAAD//vIA//zkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7t7QD/AQAAAAH/AAAB/wD/AP4AAQH/AAAB/wAAAv8AAAD/AAABAAAAAP8AAAAAAAABAAABAQAAAAH/AAAA/wABAf8AAAD/AAAB/wAAAQAA/wH/AAAA/wAAAf8AAAH/AAABAAAAAf8AAAH/AAEC/wAAAv8AAAH/AP8B/wAAAf8AAQIAAAEBAAAAAQAA//v+APq36wD/7/oAAAIAAAAB/wAAAf8AAQL/AAAB/wABAgAA/wH/AAEB/wD6/fkA6PDoAP0A/gAAAQAA/wEAAP8BAAAAAQAA/wIAAP8BAAAAAQAA/wEAAAABAAD/AAAAAAABAP8AAQD//wAA/wABAP4AAAD/AAEAAAABAAAAAQAAAAEA//8BAP//AAD/AAEA/wABAP8AAAAAAAEA/wAAAP//AAAAAAAAAAAAAP8AAQD/AAAAAAABAP8AAQD/AAEA/vnHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7s7QAAAP8AAAEAAAEBAAAAAAAAAAD/AAAA/wAAAP8AAAEAAAAA/wAAAf8AAAH/AAABAAD/Af8AAAEAAAACAAD/AQAA/wH/AAAB/wD/AP8AAQD/AP8B/wD/Af8AAAH/AAAB/wAAAP8AAAIAAAECAAAAAQAAAAEAAAECAAAAAgAAAQEAAAACAAAAAQAAAAL/AP78/QD5uOsA/u/6AAACAAAAAgAAAAEAAAACAAAAAf8AAQIAAPn9+gDl7+gA/gD+AAACAAD/AgEAAAIAAAABAAD/AQAAAAEAAP8BAAD/AQAAAAEAAAABAAD/AAAA/wAAAAABAQAAAQEA/wAAAAAAAQAAAAEA/wABAP8AAAD//wAAAAABAP8AAQAAAAEA/wABAP8AAQD/AAAAAAABAP8AAAD//wEA/wABAAAAAQD/AAEA/wABAAAAAQD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD39gAAAf8AAQEAAP8A/wABAf8AAAEAAP8B/wAAAQAAAAH/AAABAAAAAQAAAAH/AAAB/wAAAf8AAAEAAAAA/wABAf8AAQEAAAAAAAABAf8AAAEAAAEBAQABAf8AAAEAAAAA/wAAAQAA/wEAAAABAAAAAQAAAQIAAAACAAABAQAA/wH/AAEBAAABAgAAAAEAAAEBAAD/+/4A+bjrAP7v+wAAAf8AAAIAAAAB/wAAAf8A+Pz5AOXv6AD/AP4A/wD/AP8A/wAAAP8A/wAAAP8AAAD/AAAA/wEAAP8BAAAAAQAA/wAAAP8CAAD/AAEA/wABAP//AAD/AAEA//8BAP8AAAD/AAAA/wAAAP8AAAD/AAEA/wAAAP8AAQD//wAAAAABAAAAAQD/AAEA/wABAAAAAQD/AAAA/v8AAP8AAAD/AAEA/wAAAP8AAAAAAAEA//3jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAETEwABAQAAAAEAAAECAAAAAQAAAAEAAAEBAAAAAf8AAAD/AAAB/wAAAQAAAAEAAAAA/wAAAQAAAQD/AAAB/wD/AQAA/wD/AAEBAAD/AQAA/wH/AAAB/wAAAAAAAAD/AAABAAAAAf8AAQEAAAABAAAAAQAA/wEAAAEBAAAAAgAAAQIAAAAC/wD/Af8AAQIAAAABAAAAAgAA//z+APm56wD/9v0AAAD+AAACAAD8//wA6PDrAP7//gD+AAAA/wEAAP8CAAD/AgAAAAIAAP8CAAAAAgAA/wEAAAABAAD/AgAAAAMAAP8AAAAAAAEAAAAAAP8AAQD//wAAAAEBAP//AQD//wAAAAABAAAAAQD/AAEA/wABAP8AAAD/AAEA/wAAAP//AAD/AAEA/wAAAP8AAAAAAAEAAAABAP//AAAA/wAAAAABAP8AAQD/AAAAAAIOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAf8A/wD+AAAA/wAAAf8AAAH+AAAB/wAAAAAAAAEAAAAB/wAAAf8AAAD/AAABAAABAP8AAAEAAAAB/wAAAP8AAQEAAP8B/gABAf8AAQEAAP8A/gAAAf8AAAEAAAAB/wAAAQAAAQIAAP8B/wABAgAAAQH/AAAB/wABAf8AAAEAAAABAAABAgAAAAIAAAECAAABAgAAAAH/AP/7/QD4ueoAAP3/APv+/ADi7ukA+v/8AP8CAAAAAQAAAAIBAAACAQAAAgEAAAEAAAACAAAAAgAA/wEAAP8CAAAAAQAA/wEAAAACAAD//wAA/wABAP8AAQD/AAEA/wAAAAAAAQAAAQEA/wABAP8AAQD/AAAA/wAAAAAAAQAAAAAA//8BAP8BAQAAAAEAAAABAP8AAQD/AAEAAAEBAAAAAgD/AAAA/wAAAAAAAQD/AAEAAQQdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMdHQAAAQAAAQAAAP8B/wABAQAAAAEAAAAAAAAAAf8AAAH/AAABAAAAAf8AAAEAAAEA/wD/Af8AAAD/AAEBAAD/AP8A/wH/AAEBAAAAAQAAAAD/AAEBAQAAAf8AAAH/AAAA/wAAAAAAAAH/AAEBAAAAAP8A/wAAAAEBAAD/AQAAAAAAAP8B/wABAQEAAAAAAP8B/wABAQAA/wAAAAIBAAD/9f0A+sXvAO0x/wD7/vwAAQEAAP8AAAAAAQAAAAAAAAAA/wAAAQAA/wAAAAEBAAAAAAAAAQIAAAD/AAD/AAAAAQEAAP8AAAD/AQEAAAD/AAEAAAD//wAAAAAAAAAAAAAA/wEAAAD/AAAAAAABAQEA//8AAAABAAAAAAAAAQD/AP//AQAAAP8AAAEBAAD/AAAAAf8AAP8BAAAA/wAAAAEAAAAAAP///wABAQEAAgMdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIdHQAACgkAAPf1AAEBAAAAAf8AAAEAAAAA/wAAAf8AAQEAAP8B/wAAAP8AAAAAAP8B/wABAQAAAAAAAAAA/wABAQAAAAEAAAABAAAAAP8AAAEAAAAB/gAAAAAAAAD/AAABAAAAAf8AAAEAAAABAAABAQAAAQEAAAAAAAD/AP8AAQIAAAEAAAD/AP8AAQEAAAABAAAAAAAAAQAAAAABAAABAQAA7NPzAO8N/wADHAIAAAEAAAD/AAAAAAAAAQEAAP//AAAAAQAAAQEAAAAAAAAAAQAAAAAAAAABAAAA/wAA/wEAAAEAAAAAAAEA/wAAAAAAAAABAQAAAAAAAP8AAAAAAP8AAQEBAP//AAAAAP8AAQEBAP8A/wAAAAAAAAABAAEA/wD/AAEAAAD/AAEBAAAAAAEA/wAAAAAAAAABAAAA////AAEAAQAAAQ0AAgUqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJicA/wD/AAAA/wAAAP8AAAD/AAAB/wABAQAA/wH/AAEBAAABAQAAAAH/AAEBAAAAAf8AAAIAAAABAAAAAf8AAAEAAAAA/wAAAf8AAAH/AAABAAAAAf8AAAEAAAAB/wAAAQAAAQIAAAAB/wD/AQAA/wAAAP8B/wABAgAAAAEAAAABAAABAgAAAAEAAAABAAAAAQAAAQIAAAACAAAAAQAA6er7APnI/QAAAgAAAAEAAAABAAAAAgAA/gEAAAECAQAAAQAA/wEAAP8BAAD/AAAA/gAAAP8AAAD/AQAAAAAAAP8AAAD/AAEAAP8BAP//AAD/AAEA/v8BAAAAAAD/AAEA//8AAP8AAAAAAAEA/wABAP//AAD/AAEA/wAAAP8AAQAAAAAA//8BAP8AAQD/AAEA//8AAP8AAAD/AAAAAAABAAABAQADCDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQ0QAAQIAAAABAAAAAQAAAAEAAAABAAD/AP8AAAD/AP8A/wD/Af8AAAEAAAAB/wAAAAAAAAD/AAAB/wAAAf8AAAD/AAAB/wAAAQAAAAH/AAABAAAAAQAAAAH/AAAB/wAAAf8A/wD/AAABAAABAQAAAAL/AAECAAAAAgAAAAEAAAACAAAAAQAAAAEAAP8AAAAAAgAAAAL/AAEB/wD19v0A+fz/APzl/gD75P4A/wEAAP8BAAD/Af8AAAH/AP4B/wD/AQAAAAIAAAACAAD/AQAAAAIAAAACAAD/AgAA/wEAAP8B/wD/AAAA/gAAAAABAQD//wAAAAEBAP//AQD/AAAA/wABAAAAAQD+/wAA//8AAAAAAgAAAAEAAAABAP8AAQD/AAEAAAAAAP8AAQD//wAA/wAAAP8AAQD/AAEA/wABAP8AAAAFClQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJigAARMTAAAB/wAAAf8AAAH/AAAB/wAAAf8AAAEAAAEB/wAAAP8AAQD/AP8A/wAAAf8AAAEAAAABAAAAAAAAAAH/AAABAAAAAf8AAQEAAAAA/wAAAf8AAQEAAAABAAAAAP8AAQIAAAACAAAAAv8AAQEAAAEBAAABAQAAAAEAAP8A/wAAAf8AAAIAAAECAAABAf8AAAEAAAACAADt8PwA/wEAAP4BAAD83f4A/wAAAP8CAAD/AQEA/wEAAAACAAD/AQAA/wEAAP8AAAD/AQAAAAEAAP8BAAAAAQAAAAIAAAACAAD//wAAAAABAP//AAAAAAEA/wAAAP8BAQAAAAIAAAAAAP8AAQAAAAEA/wAAAP8AAAD/AAAA/v8BAAAAAAD/AAAA/wABAAD/AAD/AQEAAAEBAP//AAD//wAA/wAAAAEDHAAFCUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1VaAAAB/wAAAQAAAAD/AAAA/wABAQAAAAH/AP8BAAABAgAAAAH/AAAB/wAAAf8AAAH/AP8A/wAAAf8AAAEAAAAB/wAAAQAA/wD/AAAB/wAAAf8A/wH/AAAA/wAAAQAAAAQIAAEBAAAAAgAAAAIAAP8BAAD/AQAAAAL/AAIDAAABAgAAAAH/AAECAAAAAgAAAQIAAAABAADz9v4AAAEAAAEBAAD83v4AAAIAAAABAAAAAf8AAAEAAP8AAAAAAQAAAAEAAP8CAAAAAQAA/wEAAAABAAAAAgAA/wEAAAEHBgAAAAIA/wABAP8AAQD/AAAA//8BAAAAAQD//wAA/wABAP8AAAD/AAEAAAABAAAAAQD/AAEAAQEBAP//AQD/AAEA/wABAP8AAQD//wAAAP8BAAEBAQAAAQEA/wABAAgOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSyOEA/wABAAAAAAD/AP8A/wAAAP8AAAAAAQAA/wAAAAAAAQD///8AAAAAAP8AAAD/AAAA/gAAAP8BAAD///8A/wAAAAAAAAD///8A//8AAP///wD/AAAA/wAAAP8AAADz+fwA/gEBAP8BAQD/AQEA/wEBAP8CAQD/AAEA/wAAAP8BAAD+AAAA/wAAAP8AAQD/AQEA/wIBABMNDwD/AP8A/wAAAAUREQD/AQAAAAIAAP8BAAD/Af8A/wEAAP8B/wD/AQAAAAEAAP8A/wD/AQAA/wEAAP8BAAD/Af8A+Pf6AAAA/gABAP8A///+AAAA/wAAAP4AAAD/AP8A/gAAAP8AAAD+AAAA/wD/AP4AAAH+AAAA/gAAAP8AAAD+AAAA/wD///4AAAD+AAAA/wAA//4AAQD/AP8A/gABAP4Aq9zFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPd7QD08vgA/wD/AP8AAAD+/wAA//8AAP8AAAD+/wAAAP8AAP8AAAD/AAAA/wAAAAABAQD/AAAAAAAAAAAAAAAAAQEAAAAAAP4AAAAAAQEA/wEBAP8AAAAAAAAAAAEBAP8AAAAAAAEAAAAAAAAAAQAAAQEA/wABAAABAgAAAQEA/wABAP8AAQD/AQEA/gEBAP8BAQD/AQEA/wABABMNDwAAAQEAAAAAAAUYFgAAAf8A/v//AAAB/wAAAQAAAAH/AAAB/wAAAQAAAAH/AAAB/wAAAP8AAAH/AAAA/wAAAQAAAAD/AAEA/wAAAP4AAQH/AAAA/gAAAP8AAAD+AAEA/wD/AP4AAAD/AAAA/gABAP4AAP/+AAAA/wAAAP4AAAD/AAAA/wAAAP8AAAD/AAAB/gAAAf8A/wD+AAAA/wD/AP4A7fjyANrw5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN7W6gAAAAEA/wABAP8AAAAAAQAAAAEAAP//AAAAAQAA/wAAAAABAAD/AAEA/wAAAP//AAAAAAEA/wABAP8AAAD+AAAA/gAAAAAAAAD/AAAAAAAAAP8BAQD/AQEA////AAABAAD+AQEA/wICAP4BAAD+AAAAAAECAP4AAAD+AQEA/wEBAP8BAAAAAQAA/wEBAP8BAAD/AAEA/wAAAA4KDQAOCgoAAgkJAAQRDwD/AAAAAAH/AAABAAD/Af8A/wH/AP8BAAD/Af8A/wEAAAACAAAAAQAAAAEAAP8B/wAAAP8AAAEAAP8A/gD/AP4AAAD+AAAA/wD/AP4AAAD/AAAA/wABAP8AAAD/AAAB/wAAAf8AAAH/AAAA/gAAAP8AAAD/AAAA/gAAAP8AAQH+AAEA/wAA//4AAQD/AAAA/wAAAP8AAQD/AL7k0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnk8QD/AP8AAQABAAAAAAD/AAAAAAAAAAEBAAAAAAAA/wEAAAAAAAABAQAA/wABAAD//wAAAAAAAAAAAAAAAQABAP8AAAAAAAAAAAD/AAAAAP//AAEBAQD///8AAAEAAAAAAAAAAAAA//8AAAAAAQABAQAA//8AAAAAAAAAAAEAAAAAAAAAAAAAAAEA/wD/AAAAAQAAAQAAAQECAP///wAfFRsA3QoAAAABAAAAAAAAAAAAAP8BAAAA/wEAAAD/AAABAAAA/wAAAAEAAP8A/wAAAQAAAAD/AAEAAAD/AAAAAAD/AAEB/wD///8AAAD/AAAA/gABAP8AAAD+AAAB/wAA//4AAAH/AAD//gAAAf8AAAD/AAAA/wAAAP4AAAD/AAAB/wAAAP4A/wD/AAAA/wAAAf8A/wD/AAAA/gABAf8A///+ANrx4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7uv1APn5/AAAAAEAAAAAAAAAAQABAAAA/wD/AAAAAQAA//8AAQEAAP8AAQAAAP8AAf8AAP8BAQAAAAAAAP//AAAA/wAAAAAAAAAAAAAAAAABAAAAAAEBAP8AAAAAAAAAAAABAAAAAAD+AQAAAQABAAAAAAD/AP8AAQEBAAAAAQABAAAA/gD/AAEAAQD/AAAAAQABAP8AAAABAAAA/gAAAAAAAQAZIiAA+g0DAOr18gAAAP8AAAABAAAA/gAAAf8AAAD/AAAAAAAAAgAAAAD/AAAAAAAAAP8AAAD/AP8A/wAAAP8AAAABAAAA/gABAf8AAAD+AAAA/wAAAP4AAAH/AAD//gAAAf8AAP/+AAAB/wAAAP8AAAD+AAAA/wAAAf8AAAD/AAD//gAAAf8AAAD+AAAA/wABAP8AAAD/AAAA/wAAAP4AAQD/APb79wDk9OsAHAwVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9fL4AP4A/wAAAQAA/wAAAP8AAAD/AAAAAAABAP8A/wD/AQAA/wAAAAD//wD/AAAA/wAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP///wD/AAEA/wEBAP4AAAD/AQEA/wAAAP8AAAD+AP8AAAABAP8AAQAAAAEA/wABAP8AAQD/AAEA/gAAAAMJBwAOIhsALBobAAkGBgAAAQAAAAH/AAABAAAAAf8AAAEAAAAB/wAAAP8A/wD/AAAA/wAAAQAAAAEAAAABAAAAAQAAAAH+AAAA/wAAAP4A/wD+AAAA/gAAAP8AAP/+AAAB/wAAAP8AAAH/AAAA/wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAB/wAAAP8AAAD/AAAA/gD/AP4AAAD+AAAA/gD///8AAAH+AAEB/wDj9OoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8/L5AAAAAQD//wAAAAEAAP8AAAD/AAAA/wAAAAAAAQD/AAEA/wAAAP8BAAD/AAAA/wEAAP8AAAAA/wAA/wABAP8BAQAAAAAAAAABAP8AAAD/AAAA/wAAAP8AAAD/AQEA//8AAAABAQAAAgIA/wAAAAABAQAAAAEA/wICAP8BAQAAAQEA/gEAAP8BAQD/AQEA/wEBAP4AAAD/AQEAAwkHABYzJwADCQgABAQFADQeIQAEAwIA/wH/AP8B/wD/AQAA/wH/AP8B/wD/Af8AAAEAAP8A/wD/AP8AAAEAAP8A/wAAAQAA/wAAAAAA/gAAAP8AAQD/AAAB/wAAAf4AAAH/AAAA/gAAAP4AAAD+AAAA/gAAAP4AAAD/AAEB/wAA//4AAQD/AAEA/wAAAP4AAQH/AAAA/wAAAP4A/wD+AAAA/wAAAP4AAAD/AAAA/gD2/PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vn8AP8AAAD/AAAA/v8AAAABAAD/AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAA//8AAP//AAD/AAAA/wAAAP///wD/AAAA/wD/AAABAQAAAQEA/wAAAAAAAAD/AAAA/wEAAP8AAAD/AAAA/wEBAP8BAQD/AQEA////AP8AAAD+AAIAAAABAP8BAQD/AAAA/wAAAAABAQAABQMAFS8lAAMJBwD/AQAA/wEBAAgGBwAzHiQABQMCAAABAAD/AP8AAAEAAAABAAAAAQAAAAH/AAACAQAAAf8A/wD/AAABAAD/AP8AAAH/AAAA/wD/AP4AAAD/AAD//gAAAP8AAAD/AAD//wAAAP8AAAD/AAAA/gAAAP8AAAD/AAAA/wAAAf8A/wD+AP8A/gABAP4A///+AAEB/wABAf8AAQH/AP8A/gABAf8AAAD+AAAA/wD3/PkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA4IAAAAAAD/AAAAAAAAAP//AAD/AAAA/wD/AP8AAAD+AP8AAAABAP8AAAD/AAEAAAEAAP8AAAD/AQAAAAEAAAABAQAAAQEA/wEBAP///wD+//8A/wABAP8AAAAAAAAAAAAAAP8AAAD+AAAA/wABAP8AAQD+AAAA/wECAP8BAQD/AQAA/wEBAP8AAAD+AQEA/wEBAAEFBAAXMygABAwKAP8BAQD/AQEA/wIBAP8BAQANCQoAMx4mAAMBAQABAgAA/wEAAP8BAAD/Af8A/wEAAP8B/wAAAQAAAAH/AAAB/wAAAf8AAAIAAAAA/gABAf8AAAD+AAAA/wAAAP4AAAD+AAAB/wAAAP4AAAD/AAEBAAAAAP4AAAD+AP///gAAAP4AAQD/AAAA/gD/AP8AAAD+AP///gAAAP8A///+AAEB/wD///4A/wD/AAAA/gAKBQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8BAQAAAAAA/wEAAP8BAAAAAAAAAAABAP8AAAAAAAEA/wAAAP8AAAAAAAAA/wAAAAABAAD/AAAA/wAAAP8AAAD+AAAA//8AAP8AAQAAAQEAAAD/AP8AAAD/AAAA/gAAAAAAAAD/AQEA/wAAAP8BAAD/AQEA/wEAAP8BAQD/AAEA/wABAP8BAQD/AAEAAQUEABczJwAFDQoAAAIBAAABAQD/AQEA/wAAAP8BAQD/AQEADQkLADQgKQAEAgMAAAD/AAAA/wAAAQAAAAD/AAAB/wD/Af8A/wEAAP8B/wD/AQAA/wD/AAAA/wD///4A/wD+AAAB/wAAAP8AAAD+AAAA/gAAAP8AAAD+AP///QAAAQAAAAH/AAAB/gAAAP4A/wD+AAAA/wAAAP8AAQH/AAEB/wAAAP4AAAD+AAAA/gABAf8AAQD+AAAA/wATBw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRwPAAAAAAD/AQEAAAABAP8AAAD/AQAA/wAAAAABAAAAAAAA/wAAAAAAAQD/AAAAAAABAP8AAQAAAAAA/wAAAP//AAAA/wAA/wAAAP8A/wD/AAAA/wABAAABAQD/AAAAAAAAAP8AAAAAAQEA/wIBAP8BAQD/AAEA/wEBAP8BAAAAAgEA/wIBAP8AAAABBQMAFzMnAAUOCgD/AQEA/wEBAP4BAQD/AQEA/wEBAP8BAQD/AQEA/gEBAAwJCwAzHyoABAMEAAAB/wAAAP8AAAH/AAABAAAAAQEAAAH/AAABAAAAAf8AAAEAAAAB/gABAf8AAQEAAAAA/gAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA/wAA//4AAQD+AAEA/wABAAAAAAD/AAEA/wABAf4AAAD/AP///gAAAP8AAQH/AAAA/wAAAP4AAAH/AAAA/gATCA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA4HAAUHBAD///8A/wD/AAAAAQD//wAA/wAAAP8AAAD+AAAA/wAAAP8A/wD/AAAA/gAAAP8A/wD/AAEAAAAAAP8AAAD/AQAAAAEAAAABAQD//wAA/wAAAP8AAAD/AAAA/wAAAP8AAQD+AAAA/wABAP8AAQD/AQAA/wAAAP8AAQD/AAEA/wAAAAIGBAAYNCgABQ4LAP8BAgD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAAD/AQEA/wEBAP8BAAALCQsAMx8rAAQDBAAAAf8AAAEBAAAA/wAAAP4AAAH/AAAB/wAAAf8AAAH/AAAA/wAAAP4AAAD+AAAA/gAAAP4AAAD+AAEB/gAAAP4AAAH+AAAB/wAAAf8AAAD/AP8A/gD/AP4AAQH/AP8A/gAAAP8AAAD+AAEB/wD/AP4AAAD/AAAA/wAAAP8AAP//AAkFBwAcDBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iEgD/AAAA/wABAP8AAAAAAAAA/wEAAP8AAAAAAAAA/wAAAP8AAQD/AAAAAAAAAAAAAQD/AP8A/wAAAAABAAD/AAAA//8AAP//AAD/AAAA/wEAAP//AAAAAQEAAAAAAP8A/wD/AQIAAAEBAP8BAQD/AAEA/wECAAABAQD+AAAAAQUEABczKAAGDgsAAAEBAAABAQD/AQEA/wEBAP8BAQAAAQEA/wEBAP8BAgD/AQEA/wEAAP8BAgD/AQAACwkMADMfLQAEAgQA/wH+AP8B/wD/Af8A/wAAAP8AAAD/AP8A/wD/AAD//wAA//8AAAD/AAAA/wAAAf8AAAH/AP8A/wAAAf8AAQD/AAAA/wAAAP4A/wD+AAEA/wAAAP8AAAD+AAEB/wAAAP4AAAD/AAAA/wABAP4AAAD+AAAA/gAAAP4AAAH+ADATJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUqFgAAAQEA/wAAAP///wD/AQAA//8AAP//AAD/AQAAAAAAAAAAAAD/AAAA/wAAAP4A/wAAAAEA/wAAAP8AAAD//wAA/wAAAP8AAAAAAQAAAAAAAP8A/wD///8A/wAAAP8AAQD/AAAA/gAAAP8AAAAAAQEA/wAAAP4AAQABBQQAGDQoAAUOCgD/AQEA/wEBAP4BAAD/AQAAAAEBAAABAAD/AQEAAAEBAAABAAAAAQAAAAEBAAABAQAAAQIA/wAAAAoJDAAxIC8ABAMEAAABAAAAAQAAAAH/AAABAAAAAQAAAAEAAAAB/gAAAf4AAAD+AAAA/wAA//4AAAD/AAAA/gAAAP8A/wD+AAAA/gAAAP4AAAD/AP8A/wABAP4A////AP8A/gAAAP8AAAD+AAAA/gAAAP8AAAD/AKBeYyAAACAASURBVAAA/gAAAf8AAAD/ADkXLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkcDwAYHA8AAAAAAP8BAQD/AAEAAAEBAP8AAAD//wAA/wEAAP8AAAD/AAAA/wAAAAAAAQD+AAAAAAABAP8AAAAAAQAAAAEAAP8BAAAAAAAA//8AAAABAQD/AQEA/wAAAAABAAAAAQEA/wEBAAABAQD/AQEAAAEBAAIFBAAZNSgABg4LAAABAQD/AQAA/gEAAAABAQAAAQEA/wEAAP8BAgD+AQAA/wEAAP8CAgD/AQIA/gEBAP8BAQD+AQAA/wIBAP8BAQALCQ0AMh8yAAQDAwD/Af8AAAEAAAAB/wD/Af8AAAH/AAAA/gAAAP8AAAD/AAAA/gABAf8AAAD+AAEA/wAAAP4AAQD/AAAA/gAAAP8AAAD+AAAA/gD/AP4AAAD+AAAA/wAAAP4AAAD/AAAA/gD/AP8AAAD+AAAB/wAAAP4AEwgOACUQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyNx0A/wAAAAAAAAD/AAAA/wD/AAAAAAAAAAAA//8AAP8BAQAAAAAAAAEAAP8AAAAAAP8A/wAAAAAAAQAAAAEA/wABAP//AAD+AAAA/wEAAP8AAAAAAAAA/wEBAP//AAD/AQEA/wABAP4AAAD/AAEAAAQDABg1JwAGDgoA/wEAAP4BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAAAAAQEA/wEBAP8AAAD/AQEAAAEBAP8BAAD/AAEAAAECAP8BAQAAAQEACwkNADEfNAAEAgQA/wEAAP8B/wAAAQAA/wEAAAAA/wAAAP8AAAD+AAAB/wD///4AAQD/AP8A/gAAAP8A/wD/AAAA/wAAAP8AAQD/AAEB/wABAf8AAQH/AAEA/gD/AP8AAAD+AAAA/wAAAP4AAAH/AAD//gAAAP8ASx89AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZHA8AJikWAP8AAAAAAAAAAAABAP8AAAD/AQEAAAAAAAAA/wD/AQAA/wAAAAAAAAD/AAEA/wAAAP8AAAD+AP8A/wAAAAABAAAAAAAAAAABAP8AAAD+/wAAAP8AAP8AAAD/AAAA/wEBAAABAgABBgQAGTYpAAYOCwD/AQEA/wEBAAABAQD/AQEAAAEBAP8BAQD/AQEA/wEBAP8BAQD/AQIA/wEBAP8BAQD/AQAA/wEBAP8BAQAAAgEA/wEAAAABAQD/AQEA/wEBAAsJDgAxIDYABAMDAAAB/wAAAf8AAAH/AAAA/wAAAf4AAAD/AAD//gAAAP8A/wD+AAAA/wAAAP4AAQD+AAEA/wABAf4A/wD/AAAA/gAAAP8AAAD+AAAA/wABAP4AAAD/AAAB/wABAf8AAAD+AAAB/wA5Fy4AORcvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOD8hAAwOBwD/AAAA/wAAAAABAQD/AP8A/wEBAP8AAAD//wAA//8AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wD/AAAAAAABAQEA/wEAAAABAAD/AQIA/wEAAAEFAwAZNScABg4KAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQAA/wAAAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQALCQ4AMB84AAQDBAAAAf8AAAD/AAAA/gABAP8AAAH+AAAB/wAAAf4AAAD/AAAA/wABAf8A/wD+AAAA/gD///4AAQH/AP8A/wAAAP4AAAD/AAAB/wAAAP8AAAH/AAAA/gAAAP8AAAD/ABMIDwBUI0YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgcEAEtTLQAMDggA/wAAAP8AAAAAAAEA/wAAAP8AAAD/AQAA/wAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD+AP8A//8AAP7/AAD/AQAAAQQEABk1KAAGDgsA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/wICAP8BAQD/AQEA/wEBAP8BAQD/AAAA/wEBAP8BAQD/AQEA/wEBAP8BAQD/AQEACwkPAC8fOgADAgQA/wL/AAAA/wD/AP4AAP/+AAEA/gAAAP8AAQD/AAAA/gAAAP8AAQD/AAAB/wABAf8AAAD9AAEA/gAAAP8AAAD+AAD//gAAAf4AAAD+AAAA/wAAAP4AEwgPAHEuXQAKBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OBwBLUywADA4HAP8AAAD/AAAA/wAAAAA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/AAAAAAAAAAAAAAABAAAA/wAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA5IQ0AYDgVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFABAQGxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQycPAAABAQAAAQEA/wEBAP4BAQD/AQEAAAEBAP4BAQD/AAEA/wEBAAABAQD/AQEA/wEBAAABAQAAAgEA/wAAAP8BAQD/AQEAAAEBAAABAQD+AAAAAAEBAP8BAQD/AQEA/wEBAP8BAQD/AQEA/gEBAP4AAABMLREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBAbEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAfAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwsEAEInDwD+AQEA/wEBAAABAQD/AQEA/wEBAP8BAQAAAgEA/wEBAP8BAQD/AQEA/gEBAP4AAAD/AQEA/wICAP8BAQD/AQAA/wEBAP8BAAAAAgIA/wEAAP8BAQAAAAAA/wEBAP8BAQD/AQEAAAEBAE4tEgAUCwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4sEAAUCwQA/wEBAP8BAQD/AQEA/wEBAAABAQD/AQEAAAEAAP8BAQD/AQEAAAEBAAACAgD/AQEAAAEAAP4AAAAAAQIA/wEBAP8BAgD/AQAA/wECAP4AAAD/AgEA/wEBAP8BAQD/AQAAEgwEAE0sEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoFAgB0QRgAEwsEAP8BAQD/AAAA/wEAAP8BAAD/AQEA/wEBAP8BAQD/AQAA/wEAAP8BAAD/AQAA/wEBAAACAQD/AQAA/wEAAP8BAAD/AQEA/wEAAAACAQD/AQIA/wEBAP8BAAATCwUAdUAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAN8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4vD6AJPG7ADt9vwAAAAAAAD/AAAAAQAAAAAAAAAAAQAAAP8AAAAAAAD/AAAAAQAAAAAAAAAAAQAA//8AAAEBAAD//wAAAQAAAAAAAAAAAAAAAAAAAAAAABQKBABsOhQAHhAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0rWihgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///1AAAACvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOz2/ACJwesA7PX8AAABAAAAAAEAAAAAAAD//wAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAFAoEAHc+FQAUCwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGABAQGhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+QAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsNfyALDX8gAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA//8AAAABAAAAAAAAAAAAAAD/AABGJQwAUCkOAAoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQEBAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////zwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOz2/QCw1/IAw+L2AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAKBQEAPB4LAEYjCwAUCwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAQEBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAM8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vv/AM7n9wDX7PoA4vH6AOz1/QD2/P8A////AAsGAgAUCgMAHg4FACgVBwAzGQkACgUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAEEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAeAAAABBAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAMQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAQEBMQAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEBAQExAQEB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAfwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAYQEBAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQGgAAAAQQAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAhAQEBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAgAAAAD8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAACRAAAAoAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAUAAAAC8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAACxAAAAsAAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAABAAAAAwAAAAEAAAAB8AAAAQAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAADwAAAAAAAAAAAAAADwAAAA8AAAAOAAAAAAAAAA4QAAAOAAAADQAAAA4AEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACo6R4kAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//xhWH5N42FV0AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Reminders.png b/arma/client/addons/phone/ui/_site/images/light/Reminders.png new file mode 100644 index 0000000..5f25f0a Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Reminders.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Safari.png b/arma/client/addons/phone/ui/_site/images/light/Safari.png new file mode 100644 index 0000000..1932ccf Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Safari.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Safari.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Safari.png.b64 new file mode 100644 index 0000000..dad2a53 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Safari.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxEVJPla5nEAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAACAAAAAwAAAAIAAAAB8AAAAAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA8AAAAAAAAAAAAAAA4AAAAAAAAADwAAAA4QAAAPAAAADQAAAA8AAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAAFAAAABPAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAA0AAAALEBAQGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAF8AAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAwAAAAIEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAABvAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////UAAAAJ8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAIABAQGhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+PAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQEBcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAL8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAvwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5Pn/APH8AADk+v8A8v0BAPH9/wDy/AAAAAAAAAAA/wAAAAAADgQBAA8DAQAcBwAAAAAAACsJAQAOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vwAANX2/wDV9v8A1vX+ANX2AADj+gAA8/z/AP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBAEAHQYAABwHAAA5DgIAKwoBADkOAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///88AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5Pn/ALjv/wC57v4A1fYAAPL8/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA4DgEARxICAEgRAgAcBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AEBATEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////jwAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8vwAAJzn/QCq6/8A5Pn/AAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAEAAAEAAAD/AAAAAQAAAP8AAAAdBwEAVRUBAFYWAwAcBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJABAQFxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfx/wCO4/0Ax/L+AAD/AQAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAA//8AAAEBAAAAAAA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GAAAAAAAAAAAAAAAAAAAAAAAAYmgAAQAAAP+fmQAAAAAAAAAAAAAAAACbFj0Ajh9QAAIJEQACBw8AAAIEAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8A/wD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAADgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD//wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA//8AAP8AAAABAQCBv/kAAP8AAAAAAAAAAQEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAEAAP8AAAAB/gAAAAAAAAABAAAA//8AAAEBAAAAAAAAAP8AAAAAAAAAAAAA//8AAAEBAAD+/wAAAQAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wAAAQEAAEUjAwBwOQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJoAAEAAAD/n5kAAAAAANQJGwCAH1YAAggQAAIHDwABAgUA//8AAAEAAQD/AP8AAP8AAAABAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAEAAAAA/wAA/wAAAAH/AAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA5PL/AFeq9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4HAQAA/wAAAP8AAAAA/wAA/wAAAAEAAAD/AAAAAP8AAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwRAQBUNgYAYj8HAA4JAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQEBAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////zwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk7v4AutP8ALrU+wDI3PwAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAADgkBACobAwBGLAQARi0FABwSAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAQEBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAM8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyNz8ANbl/gDI3fwA5O7+AOTu/gDy9/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4JAQAcEgIAKhoCACobBAAqGwIAKhsDAA4JAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy9/8A1uX9AAAAAADk7v4A8vf/APL3/wAAAAAAAAEBAAD//wAOCQIADgkAAA4JAQAcEgIADgkBABwSAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAEEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAArwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAQQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAQEBMQAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEBAQExAQEB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAfwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAYQEBAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQGgAAAAQQAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAhAQEBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAgAAAAD8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAACRAAAAoAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAUAAAAC8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAACxAAAAsAAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAABAAAAAwAAAAEAAAAB8AAAAQAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAADwAAAAAAAAAAAAAADwAAAA8AAAAOAAAAAAAAAA4QAAAOAAAADQAAAA4AEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWIpbUAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//KmXSUWqpbZ8AAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Settings.png b/arma/client/addons/phone/ui/_site/images/light/Settings.png new file mode 100644 index 0000000..8fa5c89 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Settings.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Settings.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Settings.png.b64 new file mode 100644 index 0000000..2129a0c --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Settings.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxETHx4LqNMAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/fEBAQECD9/f0w/v7+D/z8/CEEBAQPAQEBIAAAAAD+/v4gAAAAAAAAAAAAAAAAAAAAIAICAv/+/v4BAAAAAAAAAAACAgL//v7+AQAAAAACAgL/AAAAAP7+/gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAQEB//7+/gECAgL//v7+AQAAAAAAAAAAAgIC/wAAAAD+/v4BAQEC/wEBAAD+/v8BAAD/AAAAAAACAgL//v7+AQAAAAAAAAAAAAAAAAICAv////8A////AQAAAQACAgH/////Af///wAAAAAAAQEB/wAAAAD///8BAAAAAAAAAAAAAAAAAgIC//7+/gEBAQH/////AQICAv/+/v7hAAAAAAAAAAABAQH/AQEB4QAAAAD////vAAAA4gEBAe/7+/vRAQEB8Pj4+NAhISHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5+fnQP///1AEBAQ/////MAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAv/+/v4BAAAAAAICAv/+/v4BAAAAAAEBAQAAAAAAAAAAAP///wACAgL/////AQAAAAABAQH//v7+AQICAv8AAAAAAAAAAP///wEBAQH//v7+AQAAAAABAQEAAAAAAP///wACAgL/////Af///wAAAAEAAgIB//7+/gEAAAAAAAABAAAA/wABAQEAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAICAv/+/v4BAAAAAAICAv8AAAAA////Af///wABAQEAAAAAAP///wAAAAAAAAAAAAICAv8AAAAA////AQEBAf////8BAAAAAAEBAf/+/v4BAgIC//7+/wEBAQDQAQEBwP39/bEZGRnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/fEAwMDG/9/f9wAAD+EAAAAAABAQH/////Af//AAABAQAAAAAAAAEBAf////8BAAAAAP///wADAwP//v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAf8AAAAA////Af//AAAAAP8AAQEBAAAAAAABAQH/AAAAAP///wH///8AAQEBAP///wABAQEAAAAAAAEBAf////8BAAAAAAAAAAD///8AAQEBAP///wABAQEAAAAAAAEBAf/+/v8BAgIB/////wEAAAAAAAAAAP///wABAQEAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAABAQH/AAAAAP///wH///8AAQEBAAAAAAAAAAAA////AAEBAQD//wAAAQEAAAAAAAD///8AAQEBAAEBAf////8B////AAAAAAABAQHgAgICsP39/ZEZGRngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/f3xAMDAxv/f39cP///xAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAgIC/////wAAAAEA///+AQAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEA/////wH//wAAAgIB/wAAAAD///8BAAAAAAEBAv////4BAAAAAAEBAf////8BAAAAAAAAAAAAAAAAAAAAAAAAAAACAgL//v7+AQEBAQAAAAD/AAABAAAA/wD///8BAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAABAQL////+AQAAAAABAQH/////AQAAAAABAQL////+AQAAAAACAgL//v7/AQAA/wAAAAAAAAAAAAAAAAABAQH/////AQAAAAAAAAAAAAAAAAAAAQAAAP8AAgIC/wAAAAD+/v4BAgIC//7+/gEAAAAAAQEB/////wEAAAAAAAAAAAAAAAABAQL////+AQAAAAACAgKAFxcXgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjQAUFBZ8AAAAfAAAAAP7+/gECAgL//v7+AQEBAv////4BAgIC//7+/wEAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAAACAgL//v7/AQEBAAABAQH//v7+AQEBAQD///8AAgIC//7+/gEAAAAAAgIC/wAAAAD+/v4BAAAAAAEBAv8BAQAA/v7/AQICAf/+/v4BAgIC/wAAAAAAAAAAAAAAAP7+/gEAAAAAAgIC/wAAAAD+/v4BAQEC/////gEAAAEAAAD/AAICAv8AAAAA/v7+AQICAv/+/v4BAAAAAAICAv/+/v4BAAAAAAEBAf////8BAAAAAAAAAAABAQEA////AAICAv/+/v8BAAD/AAAAAAAAAAAAAAAAAAAAAAACAgL//v7/AQAA/wABAQH/AQEBAP///wABAQEA/v7+AQICAv/+/v4BAAAAAAAAAQABAQH////+AQAAAAAAAAAAAAAAAAAAAAACAgL//v7/AQAA/wAAAAAAAgIC//7+/gEAAAAAAQEB4Pz8/GEdHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp6el//f39gP///wAAAAEAAgIB//7+/gEAAAEAAAD/AAAAAQACAgH/AAABAP7+/QEAAAAAAgIC//7+/wEAAAAAAgIB/////wEAAAAAAQEB/////wH//wAAAAD/AAEBAQD//wAAAQEAAAEBAf////8B//8AAAAAAAAAAP8AAgIC/////wEBAQH//v7+AQAAAAACAgL/////Af//AAACAgH//v7/AQEBAAABAQH/////Af///wABAQEA//8AAAAA/wACAgL//v7+AQEBAQAAAAAAAQEB/////wEBAQH//v7/AQICAf/+/v4BAAABAAAA/wACAgL//v7/AQICAf/+/v8BAAAAAAAA/wABAQEA////AAEBAQABAQH//v7+AQAAAAAAAAAAAQEBAAAAAAD//wAAAQEAAAEBAf/+/v4BAAAAAAEBAQD//wAAAQEAAP///wABAQEA////AAEBAQD///8AAAABAAEBAAAAAAAAAAAAAP///wACAgL/AAAAAP7+/wEAAAAAAAAAAAICAf8AAAKBGRkXgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/fEAcHB5////9QAQEB/////wEAAAAAAQEB//7+/wEAAAAAAQEAAP//AAABAQAAAAAAAAEBAv/+/v4BAgIB/////wH//wAAAgIB//7+/wEBAQAAAQEB/////wEAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAgIB/////wEAAAAA//8AAAEBAAAAAAAAAQEB/////wEAAAAAAAABAP///wABAQAAAAAAAP//AAABAQAAAQEC/////gEBAQH//v7/AQEBAAAAAAAA//8AAAEBAAAAAAAAAAAAAAEBAf8BAQEA/v7+AQEBAf8AAAEA/v7+AQEBAAAAAAAAAQEB/////wEAAAAAAAAAAAAAAAABAQL////+AQAAAAD//wAAAQEAAAEBAf////8B////AAAAAQABAQAAAQEC/wAA/wD///8B//8AAAEBAAAAAAAA//8AAAAAAAACAgH/////AQEBAf/+/v4BAAABAAEBAAD///8AAQEBAAEBAf8AAAAA/v7+AQEBAQABAQH/AAAAsfn5+WEhISHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf398QBgYGv////zABAQL////+AQAAAAACAgL/////AP7+/wEBAQAA//8AAAEBAAAAAAAAAAAAAAAAAAABAQL////+Af//AAABAQAAAgIC//7+/wECAgH//v7+AQEBAf////8BAQEB/wAAAQD///8BAAD/AAEBAv////4BAgIC//7+/gEAAAAAAAAAAAEBAv////4BAAAAAAAAAAAAAAAAAAAAAAEBAf////8BAAAAAP//AAAAAAAA6+vqAPPz9ADr6+oA9PT1APT09AD19fQAAQEB/////wEAAAAACwsLAAwMDAAXFxcAAAAAACEhIgAMDAsAAAAAAAAAAAAAAAAAAgIC//7+/gEAAAAAAAAAAAICAv/+/v4BAQEC/////gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAICAv////4BAgIC////AAD///8BAAD/AAAAAAAAAAAAAAABAAEBAP////8BAAAAAAICAv/9/f4BAQEAAAAAAAAAAAAAAAAAAAEBAv////4BAgIC/////9H6+vpBISEh8AAAAAA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AAAAAAAAAAwMBb9/f3xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICbwAAAf8AAAAA/v79Af///wD+/v4B////AAEBAf////4AAAAB/wEBAf////8AAAAB////AAAAAAAA////AAAA/wAAAP8AAQEB//7+/QH//wAA////AAAA/wAAAP8A/v79Af///wD///8A//8AAP///wDo6OcBfHx8AHx8fADq6uoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzQAKSkqAAAAAAAAAAAA////AOnp6gApKSoAKCgqAAAAAAAAAAAA/v7/AAAAAAApKSoA////AAAAAAD///4ACwsLAB8fIAD///8AAAAAAP///wA0NDUAAAAAAP//AAAAAAAAAAAAAB8fIAAgICAA8/PzAP///wAAAAAAAAAAAD4+PwBJSUoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uoAkZGSAJKSkgDq6ukAAAD/AP///wD+/v4B////AP7+/QEBAQH/AgIB/wAA/wD//wAA////AAAA/wD+/v0B////AAAA/wAAAP8A//8AAP//AAAAAP8A/f3+AQAA/wAAAP8AAgIB/////wD//wAA/v7+Af///wD///8A/v7+EP7+/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+UP7+/gH///8A//8AAP///wD//wAA////AP///wD//wAA/v7+AQAAAAD///8A/v7+Af7+/gEBAQD//v79Af//AAD9/f4B/f3+AQEBAv////8AAAD/AP//AAABAQH/AAAB/////gH//wAA////ALOzswBxcXIA1NTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUVAAAAAAAAAAAAAAAAAP///wDf394AaGhqAP///wAAAAAAAAAAAOnp6AAAAAAANTU1AAAAAAAAAAAAAAAAAAAAAAA1NTYA////AAAAAAAAAP8AICAhABYWFgALCwsAAAAAAP///wAgICAA////AAoKCQD///8AAAAAAElJSgAAAAAA6urqAAAAAAABAQEA////AFNTVQDU1NMA////AAAAAAAAAAAAAAAAAB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vgBxcXIAs7OzAP//AAABAQH///8AAP//AAD///8A/f3+Af//AAABAQH///8AAP//AAD//wAA//8AAP//AAAAAAD//v7+AQEBAP////8AAAAAAP//AAABAQL//f39Af7+/gH///4AAQEA/wAAAAD//wAA//8AAAEBAm4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAADb29tA/v7+IAAA/wD///8A////AAEBAv8BAQH///8AAP39/gEBAQH/AQEB//39/QEBAQL/////AP///wD+/v4BAQEB/wEBAf8BAQH/AAD/AP39/QH///8A/v7/AAAA/wD+/v4BAAAAAP7+/wDq6uoAfX18AJ2dngD19fUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2dpAB8fHwAAAAAAAAAAAP///wDe3t4AFRUVAEpKSgAAAAAAAAAAAPX19QAAAAAAPj4/AAoKCgAAAAAAFRUWAAAAAAALCwoAHx8fAAAA/wAfHyAA////AAAAAAAJCQoAAAAAAB8fIAAVFRYAAQEBAAwMDAABAQEACAgJADQ0NQAAAAAA9fX0AAAAAAD///8APj4/ABUVFQDe3t4A////AAAAAAAAAAAAFRUVAF1dXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD19fUAnZ2eAIeHhwDo6OcBAQEB/wEBAf/9/f4B////AAEBAf/9/f0BAQEB/////wD///8A////AP///wD9/f4B////AP39/QH9/f4BAAD/AAEBAf/9/f0BAAAAAAAA/wD//wAA/f3+Af7+/wABAQH/////AP///hHj4+M/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAACAgJQ/v7/AAAAAf8AAAAAAAAAAP7+/gH///8AAQEA/////wD+/v0B/f39AQICAf/+/v0BAAD/AAAA/wD///8A/v7+Af7+/QH///8A////AP///wABAQH//v7+Af//AAAAAAH//f39AdXV1AB9fX0A1NTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4Ay8vKAHJydAALCwsAAAAAAAEBAQDf398AAAAAAFNTVQAKCgoAAQEBAPb29gAAAAAACwsMAD0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AAAAAAAICAv/+/v4BAgIB4CoqKiEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP//AAABAQH/AQEB/////wD+/v4A////AP///wD///8A////AP///wD9/f0B/f3+Af///wD///8A/f39Af39/QH9/f0BoaGhAevr6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADS0tEAnJybAD4+PwB9fX8APz9BAAUFBQD6+vkAsbGwAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wD///8AAAAAAAEBAQD///8AAQEBAAAAAAABAQEA1tbVAAYGBgADAwQAAQEBAAAAAAApKSoACAgIAAAAAAAAAAAAVFRWAAAAAAAAAAAAKiorADMzNAAAAAAAAAAAAFNTVgAAAAAAAAAAABEREQAhISIAAAAAAAAAAAAAAAAAAgICAAMDAwAEBAUABwcHAAgICAAICAkA7+/vAJCQjQBfX1sA6enpAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAALGxsADt7e0AAwMEACoqKwCGhokANDQ1AKiopgDd3dwA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrAJiYmAABAQH//v7+Af///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAEBAf8AAAAA////AP///gD///8A//8AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP39/wD+/v4B/f39Af///wAAAAAA////AAEBAf////8AAAAAAP///wD///8AAQEB/wEBAf8BAQH/////AAEBAf+4uLgAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQACAgEAs7OwAL29vAAUFBQAaWlqAF9fYAAZGRoAODg6AAEBAQAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAD///8A7OzsAAICAgApKSoAAAAAAAAAAAASEhIAOzs9AAAAAAAAAAAAKiorAAgICAAAAAAAEBARABAQEQAAAAAAERERACIiIgAAAAAAAAAAACEhIgAaGhoAAAAAAAAAAAAyMjMAAAAAAAAAAAABAQEAAgICAAQEBAAGBgYACAgIAAgICQDu7u8AX19cAKOjoQAAAAAAAAAAAP///wAAAAAAAAAAAERERQAaGhoAYGBiAH19fwAVFRUAsbGwAKenpgADAwMAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANfX1wC1tbUB////AAEBAf////8A////AP7+/gH///8AAAAAAAAAAAAAAAAA////AP///wD///8A//8AAP//AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAP7+/gH///8AAQEB//7+/gEAAAAA////AAAAAAAAAAAA/v7+Af7+/gH+/v4BAAAAAOrq6gGtra0AAAAAAAAAAAAAAAAAAAAAAHFxdABTU1QAFRUVAAICAgAEBAUAAwMEAJqamADq6ukA////AEhISgCVlZgAISEhAAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAP///wD///8A////AP///wD///8ADg4OAAEBAQBEREUAERERAAAAAAD39/cAOzs7AAAAAAAICAkAAAAAADMzNAAAAAAAGRkZACIiIwAAAAAAISEiAAAAAAAICAgAAAAAAENDRQD39/cAAAAAABEREQA7Oz0AAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIABAQEAAYGBgAICAgABwcHAKenpgBqamgA6OjoAAAAAAAAAAAA////ACEhIgCVlZgASEhJAAAAAADo6OgApqakAAMDAwADAwMAAQEBAAsLCwBTU1QAcnJ0AAEBAQAAAAAAAAAAAAAAAACurq4A6+vrAP7+/gEAAAAAAAAAAP///wABAQH/////AAAAAP8AAAD//f3+Af7+/gH///8AAQEA//7+/gH+/v8A/v4A/wAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP///SD///8A////AP///wD///8A/f3+Af///wD///8A////AP///wABAQH/AQEB/wEBAf////8AAAAB/62trQD29vYAAAAAAAAAAAAAAAAA////AJaWlAAyMjMAe3t+AEdHSQACAgIABQUFAPn5+QB4eHYA9PTzAP//AAAAAAAA////AP7+/gAAAAAA/v7+AP///wDp6ekA0tLRAN3d3AD///8AAAAAAAAAAAAAAAAA////AP//AAD///8AICAhAAAAAADn5+YAU1NWAAAAAAAAAAA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FxcQA8PDvABkZGQAUFBQAISEjANra2QD+/v4AAwMDAAICAgACAgIAAgICAAAAAAAAAAAARkZHABgYGf/+/v4B////Af///wEAAAAA////AQAAAAAAAAAAAAAAAAICAv////8BAAAAAAAAAAAAAAAArKyrgQAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAICAf8AAAEA/v7+AQEBAQD+/v4BAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAQEB//7+/gEeHh8AHh4fAOLi4QAAAAAAAgIDAAAAAAAAAAAABwcHAFdXWgANDQ0Avr68AMXFxAD6+vkACAgHAA8PEAAZGRoA////AAAAAAAAAAAAAAAAAAAAAAANDQ4AR0dKAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAODg3wDZ2dcABwcIABoaGwDNzcwAzs7NACoqKwAAAAAAvb27AN/f3gBMTE4A3t7eAKSkogB+foEAAAD/AKSkogBkZGYAIiIjAM7OzQDn5+cAIiIjABAQEQDOzs0A3t7dABgYGQAAAAAAzs7NABkZGgAZGRkA5+fnAPj49wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8AT09RABUVFgD///8AAAAAAP7+/gABAQEAISEhABcXFgDw8PEA0dHQAM/PzgA7OzwAOTk6AFVVVwCrq6kA+Pj4AAMDAwAAAAAAAAAAAAAAAAAtLS4ALi4v//39/QECAgL//v7+AQEBAQD+/v4BAgIC//7+/gEBAQEA////AP39/QECAgL//v7+AQEBAQABAQH/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEA4P//AAD///8AAAAAAP///wAAAAAA////AAAAAAAAAAAA////AP///wD+/v4A/f39Af///wAAAAD/S0tMAAcHBwAAAAAAAAAAAAAAAAAAAAAAR0dJANfX1gCQkI0AwMC+AP7+/gAICAkADw8QAF9fYgAQEBAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAD///8A////AP///wD///8A////AODg4AADAwQAAgICABAQEQC+vrwAAAAAAAgICADv7+8Azs7NAPf3+AAAAAAAzs7MAAAAAADu7u4A5ubnAAAAAADX19YAAAAAAPf39wDW1tUA+Pj4AAAAAAAAAAAAra2rABoaGwAAAAAAAAAAALW1swDn5+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHQBVVVcAFBQVAP///wD///8A////AAAAAAD///8ABwcIAF9fYwAQEA8ACQkIAAYGBgDJycgAoaGfANjY1wBGRkkAAAAAAAAAAAAAAAAAAAAAAAcHBwA9PT4A/f39AQAAAAD+/v0BAAAAAAAAAP////8A/v7+Af///wD///8AAAAAAAEBAf/+/v4B////AP7+/gD+/v3hAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA///+AP7+/gH+/v4B////AP///wD///8AAAAAAP///wD///8AAAAAAAAAAAABAQH/AAAAAAEBAv/+/v4BDw8PADw8PQAAAAAAAAAAAAAAAAD///8ArKyrAMHBvwD6+voABwcIAAgIBwAFBQUAOzs9AA4ODgD+/v4AxcXDAIuLiADn5+cA////AP///wD///8A////AAAAAAD///8A////AP7+/gD///8A////AP///wD///8A/v7+AAEBAAADAwMAAAAAAMbGxADv7+8AAAAAAAkJCQC9vbsAAAAAAPj49wAAAAAA39/eAAAAAADf394A5+fmAAAAAADNzc0AAAAAAPj4+AAAAAAAxcXDAAkJCQAAAAAA7+/vAL29uwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTEyAFVVVwANDQ4A/v7/AP7+/gD///8A5ublAIuLiADFxcQA////AA4ODgBCQkUABQUGAAgICAAGBgYA8vLxAMHBwACtraoA////AAAAAAAAAAAAAAAAADw8PgAQEBD/AAAAAAAAAP///wAAAQEB//39/QEAAAAAAAAA/wAAAAD+/v4A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wACAgL//v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQD///8BAAAAAP///QEAAAAAAAAAADQ0NQDb29oA4uLiAAAAAAAAAAAAAgIAAAQEBAACAgIAAgICAAICAgA4ODkAMTEyAO/v7wC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39gDR0dAA9fX1AAUFBgAEBAUAAgICAD8/QQAWFhYAwMC/AMvLygAHBwcAExMUAEBAQQAAAAAAz8/OAKampAD5+fgAISEiAAICAgAAAAAAAAABAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAGBgYACAgIAAYGBgABAQEAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAz8/OAKKinwAVFRYAFRUVABEREADX19YA/Pz9AObm5gD///4AICAhAPz8/ADm5uUAAwMDAAEBAQD39/gA2NjXAPv7+gACAgIAAAAAAAAAAAAAAAAAKiorAElJS/////8B////Af///wEAAAAAAQEBAP7+/gEAAAAB//8AAAAAAAD//wAAAQEB////AAEAAAAAAAD/AQAAAQD///4B//8AAAAAAAAAAAAA////AQAAAAAAAASQsLCs2QAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAD90P///wABAQH/AAAAAP///wABAQH/////AAAA/wD///8A////AAAA/wD//wAA////AAEBAAABAQH//v79AQAA/wACAgH/AQEB/wAA/wD///8A/v7+Af7+/QFHR0gAKioqAAAAAAAAAAAAAAAAAAEBAQD8/PwABgYGAAUFBQACAgIADQ0OACMjIwDBwb8Aw8PBAAcHBwAFBQUAJycnAAAAAADw8O8AwsK/APX19AD5+foAAAAAAP///wDv7+8A8PDwAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAP///wABAQEA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PgA39/fAAAAAAAAAAAA6enoAPz8/ACxsa4A8PDvAP//AAAuLi8ABQUFAAYGBgDExMIAwcHAADIyMwAGBgcAAQEBAAQEBQAGBgYA/Pz7AAEBAQAAAAAAAAAAAAAAAAAqKisASUlK//7+/QH//wAA////AP///wABAQH//f39AQICAv////8AAAD/AP///wAAAP8A/v7/AQEBAP/+/v4BAQEB/wAA/wD///8AAAD/AP///wD+/v4BAAAAAP//AAD+/vvxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4P///wD9/f4B/v7+Af//AAD9/f4BAAAAAP///wD//wAAAAAAAP//AAD///4A////AP7+/gD///8AAAAAAAAAAAD+/v4B////AP//AAD///8AAQEB/////wAAAAAARkZIADg4OQAAAAAAAAAAAAEBAQADAwMAAwMDAAEBAQAAAAAAKioqANHR0QDExMMABwcHAAUFBQACAgIAKiorAAAAAAC5ubcA9vb3AAgICAAjIyIAAAAAAPDw7wCgoJ0Ajo6LAPDw8AAAAAAAAAAAAPDw7wABAQEAAAAAAAAAAAABAQEAAAAAAAEBAQAAAAAAAQEAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAPDw8AD///8AAAAAAOfn5wCGhoIAp6ekAPj4+AAAAAAAGhocAAkJCAD///4AsbGvAAAAAAAcHB0AAAAAAAYGBgAFBQYAw8PBANjY1wAxMTEAAAAAAAEBAQAEBAQAAwMEAAEBAQAAAAAAAAAAADg4OQBGRkcA////AAEBAf8BAQD///8AAP///wD9/f0BAQEB//7+/gH///8A////AAEBAf8AAAAA////AP39/QH//wAA/f39Af///wD///8A//8AAAAAAAD///8AAAAA/////wAAAPzQAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAYWFh8AAAAc8AAP8AAAAA/////wABAQH/AAD/AP39/gH///8A////AP///wAAAAAAAQEB/wAAAAD///8A////AP///wD+/v8A/v7+AQAA/wD//wAA////AP//AAD+/v8AAAAAADk5Ov84ODkAAAAAAAEBAQACAgIAAQEBAAAAAAD///8A4ODgAL29uwAFBQUABQUFAAICAgAODg4AFhYXAMjIxwDc3NsABgYGAAQEBAAPDxEAAAAAANDQzwD19fUABgYGAAEBAAAAAAAA5+fnAI6OjACOjosAAQEAAAAAAADn5+YAvr69ANfX1wAAAAAAAAABAN/f3gC9vbwA5+fmAAAAAAAAAAAAlpaTAI6OiwDg4OAAAAAAAAkJCQAGBgYA/f39AMnJxgD///8AHh4eAAQEBQAGBgcA5OTjAMnJxwAcHB0ADg4OAAICAgAGBgYABgYGALW1swDo6OgA////AAAAAAAAAAAAAgICAAEBAQAAAAAAPj5AADc3OAAAAAAA////AP7+/gH+/v4B////AP///wD//wAA/f3+Af///wAAAAAAAQEB//7+/gEAAAD/AAD/AAEBAf8AAP8AAAAAAP7+/gH//wAAAAD/AP///wAAAAAA/v7+AQEB/tBhYWHwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/cL///8AAAAAAAAA/wD+/v0B////AAEBAf8AAP8A////AAAAAAD+/v8A/v7+Af///wD9/f4B////AAEBAf8CAgH/////AAAAAP8BAQD//v7+AQAA/wABAQH/AQEB//7+/gE5OTr/W1tdAA4ODgAAAAAAAAAAAAAAAAD///8A4+PiAAMDAwAEBAQAAgICAP///wAbGxwA8PDvALu7uQAGBgYAAwMDAAcHBwAWFhYA8PDwAMTEwwAHBwcABgYGABAQEQAAAAAAycnIAAUFBQAEBAQA//8AAAAAAADR0dAAwcG/ANjY1wAAAAAAAAAAAMnJxwDCwr8A0dHPAP///wAAAAAA/Pz8AAYGBQDZ2dcAAAAAABAQEAAHBwcACAgHAMvLywD6+vkADw8PAAcHCAADAwMABQUGAMLCwQDy8vEAIyMlAAAAAAACAgIABQUFAAUFBADb29oA////AAAAAAAAAAAAAAAAAA4ODgBTU1UAMTExAAEBAv////8A/v7+AQAAAf////8AAAD/AAAAAAABAQH/AAD/AP///wD///8A/v7+Af///wD///8A////AP7+/gH+/v8A////AP7+/wAAAP8A////AP///wD///8AAAAB/wAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB6////8A/f39Af///wD///8AAQEB//7+/gH///8A////AP///wAAAP8A////AP///wACAgH/AQEB//39/QH9/f4B////AP7+/gH+/v4B////AAEBAf/+/v4B/f3+Af///wD9/f0BExMTAFJSVAAiIiMAAAAAAAAAAAACAgIABAQEAAQEBAADAwMAAAAAAAAAAAAqKiwApKSiAAUFBQAEBAUAAQEBABUVFgAAAAAAwcG/AAUFBQAFBQQACQkJAAAAAAD4+PgA3d3bAAgICAAGBgYAAAAAAAAAAADj4+IACQkIAOXl4wD///8AAAAAAPT09QAHBwgA4+PjAAEBAQAAAAAABQUFAAYGBwDV1dQA+Pj4AAAAAAAJCQoABAQFAP39/ADBwcAAAQEBABUVFQABAQEABQUFAP7+/QCrq6kAIyMjAP///wAAAAAAAgICAAQEBQAEBAQAAgICAAAAAAAAAAAAGxscAFNTVv8dHR3/////AP7+/QEAAAH///8AAAAA/wD///8AAQEB////AAD+/v0B//8AAP///wABAQH/////AP///wD+/v4BAAAB/////wAAAP8A////AAAA/wABAQH/AAAAAP///wD//wAAAAD/APz8/7EAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAF5eWsEBAQHw////AAEBAf8AAAAA/f3+AQEBAP///wAA//8AAAAA/wD//wAA//8AAP//AAD9/f0B/f3+AQEBAf////4A//8AAP//AAD//wAA//8AAP39/gH///4A////AP//AAD//wAA//8AAA8PEP9LS0wAPj4+/wcHBwAAAAAAAgICAAMDAwAAAAAAAAAAAP///wC8vLoA9PT0AAUFBQACAgIAAAAAABUVFQDx8fAA1NTTAAQEBAAAAAEACAgIAAAAAADZ2dcA/Pz8AAMDAwD6+voA////APHx8ADt7ewABgYHAPz8/QABAQEAAAAAAO3t7AAGBgYA7e3sAPj49wAAAAAA8/PzAAUFBQD8/PwA0dHQAAAAAAAHBwcAAQEBAAQEBQDMzMoA8fHwABYWFgD///8AAgICAAUFBgDs7OwAtbW0AP///wAAAAAAAAAAAAICAgACAgIAAAAAAAcHBwA+Pj8AUlJTAAwMDAH+/v4B//8AAP//AAD+/v4BAAD/AP39/QH//wAA/f3+Af///gD//wAA////AP//AAD9/f4B//8AAP//AAABAQL//v79Af///wD//wAA//8AAAEBAv////8A/v7+AP//AAAAAP8A////4WVlYcAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAQEC//7+/gH+/v8AAAAAAP39/gECAgH/AAD/AP///wD///8AAAD/AP///wAAAAAAAQEA//7+/gEAAAAAAQEA/wAA/wD///8AAQEB/wEBAP///wAAAQEB/wAA/wD///8AAAD/AP7+/QH//wAALy8xAVhYWgAoKCn/AAAAAAAAAAAAAAAAAAAAAAAAAADt7ewABQUFAAMDAwAAAAAA////AB0dHgDBwcEABAQEAAMDAwAAAAAADg4PAAAAAADLy8oAAwMDAAEBAQD5+fkAAAAAAOjo6AADAwMAAQEBAPr6+QDx8fAA6OjoAAICAgACAgIAAgIDANra2gAAAAAAAQEBAAEBAQAEBAMA29vZAAAAAAAPDw8AAAAAAAMDAwAEBAUAsrKxABUVFQAAAAAAAAAAAAICAgAFBQUA8/PzAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbAFhYWgAuLjAAAAAAAAAA/wD///8AAQEA/wAA/wAAAP8AAAAB/wAAAAABAQD/////AAAAAAAAAP8A////AP///wD///8A////AP///wD9/f0BAAAAAAAAAAAAAP8A////AP7+/QH9/f4BAAAAAAAA/wD///8A/v4AsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAv6R///+8f///wAAAP8A////AAAA/wD+/v8A////AP///wAAAP8AAAAAAAAAAAD///8A//8AAP//AAD///8A/v7+AQAAAf8AAAAA/v79Af//AAABAQH//v79AQEBAf8AAP8A////AP7+/wABAQH/////AA0NDQBDQ0UBRERFAA0NDQAAAAAAAAAAAAEBAQADAwMAAwMDAAEBAQAAAAAA////AMvLygDV1dMABAQEAAEBAQAAAAAACAgHAOnp6ADs7OwAAwMDAAICAgAAAAAAAQEBANvb2gACAgMAAgICAAEBAQDp6ekA+fn5AAEBAQABAQEAAwMDAOLi4QAAAAAAAQEBAAAAAAACAgMA5OTkAODg4AAODg4AAAAAAAEBAQADAwMA5eXjANra2gD///8AAAAAAAEBAQADAwMABAQDAAICAQAAAAAAAAAAAA0NDgBRUVMAUVFTAA0NDQABAQH/AAAB//7+/wD+/v8A/v7+Af///wAAAAH//f39Af///wD9/f4BAAD/AP///wD///8AAAAAAAAA/wABAQH/////AAAA/wAAAP8A//8AAP///wD///8AAQEB/////wACAgH/////AP//AAD///8A/Pz/kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYWHw/v79kf///wD//wAAAAAA////AAD+/v0B////AAEBAv///wAA////AP///gAAAAAA////AP///gD//wAA//8AAP7+/QH///8A////AP///wD+/v4B//8AAP39/QH///8A////AAAAAAD+/v0BAQEB////AAACAgL/JycpAF5eYQBDQ0QADg4OAAEBAQACAgIAAQEBAAAAAAAAAAAAAQEBAOTk4wAFBQUAAwMDAAAAAAAAAAAABwcIAMvLygADAwMAAQEBAAAAAAABAQEAAAAAAOPj4gABAQEAAAAAAAICAgDx8fEA6+vpAAEBAQABAQEAAgICANra2gAAAAAA////AAEBAQABAQEAAwMDANvb2QAAAAAAAAAAAAAAAAADAwMABAQFANzc2wAAAAAAAAAAAAAAAAABAQEAAgICAAAAAQAHBwcANTU3AFlZWv8aGhsAAAAB////AAD+/v4B////AAICAf8CAgH/////AP///wD+/v0BAQEB/////wAAAAAA////AAEBAf8AAAH/////AP///wD+/v4BAAAAAP//AAABAQH////+AP///wD//wAA/v7+Af//AAD9/f0BAQEB/////gABAQKAaWlh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYEkPv7/V7+/v8hAQEBAP///wAAAAAAAAAAAP///wD///8A//8AAAAAAAD///8AAAD/AQAAAAAAAP8AAAAAAAEBAAD///8AAAAAAP///gEAAAAAAAD/AAAAAQAAAAAAAAAAAAAA/wACAgH//f3+AQICAf/+/v0B//8AAAEBAAAnJykAJycpANnZ1wDKyskA8/PzAAAAAAAAAAAAAQEBAAQEBAABAQEAAQEBAAAAAAAAAAAA09PSAP7+/QAFBQYAAQEBAAAAAAAAAAAA2trZAPLy8gAHBwYAAAAAAAEBAQDx8fEAAQEAAAEBAQAAAAAAAQEBAPr6+QDq6ukAAQEBAP///wABAQEAAwMDAM7OzQAKCgoAAAAAAAAAAAABAQEABAQEAP///wABAQEAAAAAAAAAAAAAAAAABwcHAC4uLwAwMDH/BQUGAQICAQD+/v8A////AQAAAAAAAP8AAQECAP39/wEAAAAA/70ImwAAIABJREFUAAAAAAAAAAAAAAAA///+AQAAAAACAgD//v4AAf39/gEAAP8AAgID//7+/wECAgD/////Af//AAD9/f8BAAD/AAAAAQABAf8A//8AAAICAv/+/v8B/f39AQEBA+BlZWGBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeXm0ACAgK+/v7+AQEBAAD//wAAAgIC/////gH//wAAAAAAAAICAv/+/v4BAAAAAAEBAAD//wAAAgIB//7+/wEAAAAAAgIB/////wH//wAAAAAAAAICAv////4BAQEB////AAH///8AAgIC/////gEAAAAAAAAAAAEBAv////4BAAAAAP//AAABAQAA2NjYANjY1wDm5uUAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/f39AP///wAEBAQAAQEBAAAAAAD8/PwA/Pz8AAMDAwAFBQUAAAAAAP7+/gAJCQkA//8AAPj49gACAgMAAAAAAPv7+wD9/f0ABAQEAAQEBAAAAAAA////AP39/QABAQAAAwMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGwA1NTYAGhobAAAAAAACAgL//v7+AQEBAAAAAAAA//8AAAAAAAAAAAAAAAAAAAEBAAD//wAAAQEBAP///wABAQEAAQEB/wAAAAAAAAAA///+AQEBAv////4BAAABAP///wABAQEA////AAAAAAACAgL////+Af//AAAAAAAAAQEBAP///wAAAAAAAgIC//7+/kJpaWXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZ1//v79gAAAAAAAAAAAAAAAAAAAAAAAAAEA////AAEBAQAAAAAAAAAAAAEBAf////4BAAAAAAAAAAABAQL/////AQAAAAD///8AAQEBAAAA/wAAAAAAAAAAAAEBAf///wAB////AAMDAv/9/f4BAAAAAAAAAAABAQEAAAD/AAEBAv////4BAAAAAAAAAQDz8/IA2NjYANnZ1wDz8/MAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAD+/v4A/f39AAICAgADAwMAAAAAAP///wD8/PwAAAAAAAQ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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48QBAQHnwEBAlABAQH/////AQAAAAABAQH/////AQEBAf////8BAAAAAAAA/wAAAAEAAAAAAAAA/wABAQL/////AQAA/wAAAAEAAgIB//39/gEDAwL//f3+AQAAAAAAAAAAAAAAAAEBAQAAAP8AAAAAAAAAAQAAAP8A//8AAAEBAQABAQH/////Af///wAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAD//wAAAQEBAAICAv/+/v4B////AAEBAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAEBAf8AAAAA/v7+AQEBAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAEBAf////8BAAD/AAAAAQAAAP8AAAAAAP//AAACAgL/////AQEBAf////4BAAAAAAEBAv/+/v4BAwMD//7+/gEAAP8AAQEC//7+/gEAAAAAAAAAAAICAv/+/v4BAQEAAAAAAAAAAAAAAQEC/////wH///8AAQEBAAAA/wD//wAAAAAAAAEBAQD///8AAQEBAAAAAAAAAAAAAAAAAAAA/wACAgKwCQkGYWFhYfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTl4AAAAB/AAAAAAAA/wAAAAEAAAAAAAAA/wAAAAEAAgIB//7+/wEAAAAAAAD/AAEBAv////8BAAAAAAEBAf////8BAAAAAAAAAAABAQAA//8AAAEBAf////8BAAAAAAAAAAABAQH/AQEBAP7+/gEAAAAAAAAAAAEBAf8AAAAA////AQAAAAAAAAAAAgIC/wAA/wD+/v8BAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAAAAAA////AAEBAQAAAP8A//8AAAEBAQAAAAAAAAAAAAICAf/+/v8BAAAAAAICAv/+/v4BAAAAAAAAAAABAQH/////AQAAAAACAgL//v7+AQAAAAAAAAAAAQEB/////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAf////8BAAAAAAAAAAAAAAAAAQEB/////wEAAAAAAQEB/////wEAAAAAAAAAAAICAf/+/v8BAAAAAAAAAAAAAAAAAAAAAAICAoBra2eBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTk5dA//8AnwAA/yAAAAAAAAAAAAICAv8AAAAA/v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAB/////wEAAAAAAAAAAAAAAAAAAAAAAgIC//7+/gEAAAAAAAAAAAAAAAACAgH//v7/AQAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAgIC/////wD///8BAQEAAAEBAv/+/v4BAAAAAAAAAAAAAAAAAAAAAAICAv/+/v4BAgIB////AAD///8BAgIB/wAAAQD+/v0BAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAv8AAAAA/v7+AQAAAAACAgL//v7+AQAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAEBAf8BAQEA/v7+AQICAv8AAP8A/v7/AQAAAAACAgL/////AAEBAQD+/v4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgL//v7+AQEBAAD//wHgAQEAYW1tacAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGRlYAAAAB/AAAAAAAAAAAAAAAAAgIC//7+/gEAAAAAAAAAAAAAAAABAQEA////AAAAAAABAQAA//8AAAEBAQABAQH/AAAAAP7+/gECAgL////+Af//AAACAgL//v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAQH/////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAACAgL/////AQAA/wD//wAAAQEBAAAA/wD//wAAAQEBAP///wABAQEAAQEB//7+/gEAAAAAAgIC/wAAAAD+/v4BAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAABAQEA////AAAAAAABAQAA//8AAAAAAAABAQEA////AAEBAQD///8AAQEBAP///wAAAAAAAQEAAAAAAAD//wAAAQEAAP//AAABAQEA////AAEBAAD//wAAAAAAAAAAAAABAQAA//8A8AAA/pH+/gyQcXFh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj5cgAAD+cAICAU8BAQAf////AQAAAAD///8AAQEBAAAA/wABAQL/////AQAAAAABAQH/////AQAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAEBAv////4BAAABAAICAv/+/v4B////AAEBAAABAQL/////AQAA/wAAAAAAAAABAP///wAAAAAAAQEAAP//AAACAgL/AAAAAP7+/gEBAQEA////AAEBAAABAQL/////AQAAAAD///8AAAAAAAAAAAACAgL//v7+AQEBAQACAgL//v7+Af///wABAQEAAAAAAP///wABAQEAAAAAAAEBAf////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQD///8AAQEBAAAAAAD///8AAQEBAAEBAf/+/v4BAAAAAAEBAQD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAABAQH//v7+AQICAv/+/v4BAQEBAP////ABAQGR/v4KkHFxYfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj5NAAAACUAEBAD8AAP8wAQEB/////wEAAAAAAgIC/////wD///8BAgIC//7+/QEAAAEAAAAAAAEBAf////8BAAAAAP///wABAQEAAgIC//7+/gEAAAAAAAAAAAAAAAABAQH/////AQAAAAAAAAAA////AAMDA/////8B////AAICAv/+/v4BAAAAAAAAAAABAQH/////AQAA/wAAAAEAAAAAAAAAAAABAQH/////AQAAAAAAAAAAAQEB/////wEAAAAAAgIC//7+/gECAgL//f39AQAAAAABAQEAAQEB/////wEAAAAAAQEB/////wEAAAAA////AAEBAQABAQH/////AQAAAAAAAAAAAQEB/////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQH//v7+AQEBAQAAAAAA////AAMDA//+/v4BAAAAAAAAAdD//wLBAAD8sHFxbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48QAAAEMAAAAxAAAP0wAQEBDwAAAiAAAP4QAAAAAAAA/iAAAAAAAAACAAAA/gABAQMf/v7+AQAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAv/+/v4BAAAAAAICAv/+/v4BAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD//wD/AAD/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAgIC//7+/gEAAAAAAAAAAAICAv/+/v4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIC//7+/gEAAAAAAAAAAAAAAAAAAAAAAgIC/////eEAAAAAAAACAAAA/gAAAALgAAAAAAAAAeD//wDxBAT+3/z8//EDAwvP/f3y4XFxcfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2PAvAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//LJQdcPvP8HsAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Wallet.png b/arma/client/addons/phone/ui/_site/images/light/Wallet.png new file mode 100644 index 0000000..66bf53c Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Wallet.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/Wallet.png.b64 b/arma/client/addons/phone/ui/_site/images/light/Wallet.png.b64 new file mode 100644 index 0000000..4a7fe1d --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/Wallet.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+oFFAAzMycr2doAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/33AQ1ftaqAD/FUEGBQkGBAIBAAUEAgAAAAAABAICAAABAAAB/wAAAAAAAAAAAAD+/gAA/wD+AAAAAAAAAAAA////AAAAAAABAQEAAAAAAP///wABAQEAAAAAAP///wABAQEA//8AAAEBAAD///8AAQEBAP///wABAQEA////AAEBAQD///8AAQEBAAAAAAAAAAAA////AAEBAQAAAAAA////AAEBAQAAAAAA////AAEBAQD///8AAAAAAAEBAQAAAAAA////AAEBAQD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAP///wACAQMAAgIAAAAAAAAAAP8A/QABAAAAAAAA/gAA/P7/AP3//QD4+/0A+fn5/gH/5bsvC6xYASGQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJ1tmRCwMKaw0JCQMHBAAA/P3+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwIA/f7/AO/z+f8tCHwiASGg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy9bc2BQMECcFAgAA//79AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAgIA/f4AAOXy7t44LCcjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfY2J8YChNgA//9AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAQEBAP///wABAQEA////AAAAAAABAQEA////AAEBAQD///8AAQEAAP//AAABAQEA////AAEBAAD//wAAAAAAAAAAAAABAQEA////AAEBAAAAAAEAAAAAAP///wABAQEA////AAEBAQAAAP8AAAAAAP//AAAAAAAAAQEBAAAAAAD///8AAQEAAP//AAABAQEAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAQEBAAAA/wD//wAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAQEAAAAAAAD//wAAAQEBAP///wAAAAAAAQEBAAAAAAD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAABAQAAAAABAAAAAAAAAAEA5fDw0zguJi4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1tvl/g0IBgH//v0AAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQAAAAABAAAAAAD///8AAQEAAAAAAQD///8AAQEBAAAAAAAAAAAAAAAAAAAA/wAAAAEA////AAEBAQAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAP///wABAQAAAP8AAAABAQAAAAAAAP//AAABAAAAAAEAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAQEBAAAAAAD///8AAQEAAP//AAABAQEAAAAAAP///wABAQEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAP///wABAAAAAAEBAAAAAAD///8AAQEAAAAAAQAAAP8AAgIDAPP4/AApJRoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4ev/Af/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AQMAIR8WAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy9fTpRgMFlr9/P0AAAAAAAEBAAAAAAEA////AAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwQDAOXx8dk4LCYoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADL1tzYFw0NJ/78/AAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAEA////AAEBAAAAAAEAAAD/AAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAQAAAP8AAAAAAP//AAABAQAA//8AAAAAAAABAQEAAAD/AAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP//AAABAQAAAAABAAAA/wAAAAEAAAAAAP///wABAQEAAAD/AP//AAAAAAAAAQEBAP///wABAQAAAAABAAAA/wAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAEAAAAAAP///wABAQEA////AAEBAAAAAAEAAAAAAP///wABAQAA/wAAAAEAAQD///8AAQEAAP//AAABAQAA/wAAAAEAAQAAAP8A//8AAAAAAAABAQAAAAAAAP//AAABAQAA//8AAAAAAAABAQEA/wD/AAEAAAAAAAEA/wD/AAEAAAD//wAAAQEBAP///wAAAQAAAQAAAAAAAAD//wAAAQEAAP//AAAAAAAAAQEAAP//AAAAAAAAAQEAAAIEBADn8vHZNysmKAAAAAA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A////AAAAAAAAAAEAAP//AP///wAA//8AAAAAAAAAAAD///8A////AP8A/wABAQEAAAEAAAEBAAAAAAAAAAAAAAEAAAD//wAA/Pz8AJ+gnADR0c8A////AP///wD//wAA//8AAP//AAD///8A//8AAP//AAD//wAA//8AAAAA/wD//wAA//8AAAMC/wDG0teRAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAADVCbPe/fz7AAAA/wAAAP8AAAD/AAAA/wAAAP8A////AP///wD///8AAAD/AAAA/wAAAP8A////AP39/gC9vboAycnGAP7+/gAAAAAAAAABAAAAAQAAAAAA/wAAAP7//wD+/wAA//8AAAAAAAAAAAAAAAAAAAAA/wAA//8AAP//AP7+AAAAAAAAAAAAAAEAAAAAAAAAAAD/AAAA/wD/AP8AAP//AAAAAAD//wAA/wAAAAAAAAD//wAA//8AAAABAAABAQAAAAAAAAD/AAD///8AAAAAAP8AAAD///8A/v7+AP8A/wD/AAAAAAAAAP8AAAAAAAAAAQAAAP///wAAAAAAAAABAAAAAQABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8A////AP///gAAAP8A//8AAP8A/wAAAAAA//8AAP///wAAAAAAAAAAAP///wD///8A/wEAAP8AAAD//wAA////AP8AAAAAAAEAAQAAAAEAAQAAAAAAAQABAAAAAAAAAAAAAAAAAAABAAABAP8A//8AAPn5+gCXl5MA7u7tAP///wAAAP8AAAD/AAAA/wD///8AAAAAAAAA/wD///8A////AP///wD///8AAAD/AP38/AAJAwhrAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAHBAEB////AP/+/wD///8A////AP//AAD///8AAAD/AP///wAAAP8A////AP///wD//wAAAAD/AODg3gCpqqYA/f39AAAAAAAAAAEAAQEBAAAAAAAA//8A////AAAAAAAAAP8A////AP//AAAAAAAAAP8AAP//AAAAAAAA/wAAAAAA/wD///8A/wD/AP///wABAAAAAAABAP//AAAB/wAAAQEBAP8A/wAAAP8AAP8AAP///wAAAP8AAAD/AAAAAAD//wAA///+AAAAAAAAAAAAAAAAAAEAAQABAQEAAAABAAD/AAAB/wAAAP8AAAD/AAAAAAAA/wAAAAAAAAD/AAEAAAAAAAAA/wD//wAA////AAAAAAAA//8A////AP///wD/AAAAAAAAAP//AAAA/wAAAAAAAAAAAQAAAAAAAAD/AP8A/wAA//8A//8AAAAAAAABAAAAAQAAAAD//wD/AP8A//8AAAD//wAAAAAAAAEBAAABAQAAAAAA/wAAAAAAAQAAAAEAAAAAAAAAAQAAAQIAAQAAAP///gDy8/IAqqqnAP/+/gD///8A////AP///wAAAP8A///+AP7+/wAAAP8AAAD/AP7+/wAAAAAA////AP///wAKBQUDAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP/PMBAA/v4A////AP8AAAD///8A//8AAP///gD//wAA////AAAAAAD//wAA//8AAP//AAD///8A+fn6AKqqpwD5+fkA////AAAAAQABAQAAAAAAAAEBAQAAAQAAAAAAAP//AAD///8AAQEAAAAAAAD//v8A/wD/AAAA/wAAAAEAAAAAAAEAAAAAAAAAAP8AAAAAAAD/AP8AAAD/AAEBAAD/AP8A////AAD/AAAA//8AAAD/AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAD/AAAAAAAAAAEB/wAAAAAAAQEAAAABAAAAAQAAAAD/AAAA/wAAAP8AAP8AAAAAAQABAAAA////AP7+/wD+/v0A////AAAAAAD///8A////AP///wD///8A////AP///wAAAQAAAAD/AAAA/wD///8A//7/AP///wD+/wAA////AAAAAAAAAQAAAAABAAAAAAD//wAAAAAAAAAAAAAAAAAAAQEAAAEBAAAAAAAAAQD/AAAAAAAAAAAAAQEBAAEBAQAAAAAAAAEBAAAAAQD8/f0AwsPBANrb2AD//wAA//8AAP//AAD///8A////AAAAAAD//wAAAAAAAAAAAAD///4A//8AAP//AAADAf4A/88wEAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAANMDlKj7+/oA//8AAP///wD//wAA////AP//AAD///8A//8AAP///wD///8A////AP///wD///8Az8/MANLT0gD///4AAAAAAAAAAAAAAAEAAQEBAAEBAAAAAAEAAAEAAAAAAAABAQEAAAAAAAEA/wD/AP8A////AAABAQAAAQAAAP//AAAAAAABAQEAAQEBAAAAAAAAAAAA//8AAAD//wAAAAAAAAAAAAAAAQAAAQEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP8AAP///gAA//8AAAAAAP//AAAAAP4AAAAAAP8AAAD//wAA//8AAP//AAD///8AAAEAAAEBAAAAAQAAAAAAAAAA/wD///8AAAD/AP///wAAAQEAAQEBAAAAAAAAAAAAAAAAAAEAAQD///8A////AP///wABAQAAAQIBAAAAAAAAAP8AAAAAAP///wD//wAAAAD/AAAAAQABAQEAAAD/AAAAAAAAAAAAAAAAAP//AAD//wAA/v8AAAAAAAABAQEAAQEAAAEBAAABAQAAAAAAAAAAAAAA/wAA////ALW2tAD///8A////AP///wD//wAA//8AAP///wD///8A/v7/AP///wD//wAA////AP///wD6+voA0AORqAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAP0DG0UAAP8A////AP///wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wD8/PsAuLm3AP7+/QAAAAEAAAAAAAEBAAAAAAAAAAEAAAAAAQAAAAAAAQAAAAEBAQAAAAEAAAAAAAABAQACAgIAAgEBAAD/AAD///8A/wAAAP///wD///8AAAAAAAEBAQD///8AAAD/AP8AAAAA/wAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AP8A/wAAAAAAAAAAAAAA////AAD//wAA/wAAAAAAAAD//wD///8AAAD/AAAA/wAAAAAAAAAAAP//AAD//wAAAQEAAAAAAAABAQEAAAABAAD//wD///8A////AP8A/wAAAAAAAAAAAP8A/wD//wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAP8AAAD///8AAAAAAAAAAAAAAAAA////AAAA/wAAAAAAAQEAAAAAAAD/AP8AAAAAAAAAAAAAAAEAAQAAAAAAAAABAQAA/v7+AMzMywDm5uQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAEaQQAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAIBBAL//vsAAAABAAAAAAD///8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAADg4N8A3NzbAAAAAAAAAAAAAAABAP//AAABAf8AAP8BAAAB/wAAAAAA/wAAAAD//wAAAAAAAQEAAAEAAAAAAQEAAAAAAAD//wD//wAAAAAAAP8AAAABAP8A//8AAAEBAQAAAAAAAAAAAP///wAAAAEAAAAAAAEAAAD///8AAAAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAEAAAAAAQABAQEA//8AAP8A/wABAQEA////AAAA/wAAAAAA//8AAAEBAAABAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAD//wAAAAD/AAAAAQAA/wAAAAAAAAAAAQAAAAAA/wD/AP//AAABAf8AAAABAAAAAAD//v8AAAEAAAAAAAAAAAEAAAABAAAAAAAAAAAAAQAAAAAAAAD/AQAAAAAAAAAAAAAA//8A/wAAAAEBAAAAAP8AAP//AP8AAAAAAAAA/wAAAAAA/wD//wAAAAD/AAEBAAD//wEAAAD/AP///wDX19YAGRkaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBgAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAUD/wD//wAA////AP///wAAAAAA///+AP//AAD//wAA////AP///wD//wAA//8AAP///wDb29sA//7+AAAAAAAAAAAAAAD/AAICAQABAQEAAAD/AP///wAAAP8AAP8AAAAA/wD/AP8A//8AAP8AAAD///8A////AP///wAAAAAA////AAAA/wD//wAAAAD/AP///gAAAAEAAAAAAAAAAAAAAAAAAP//AAAAAAD///8A////AP///wD/AAAAAAD/AP///wD///8AAP8AAAAAAAD///8AAQD/AAAAAAD///8AAAAAAP//AAD///8AAAAAAAEBAQAAAAAA//8AAP//AAAA//8A////AAAAAQAAAP8AAP8AAAAA/wAAAAAAAAAAAAEBAAAAAQAAAAABAAAAAAD//wAA///+AP7//gD/AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAA////AP///gAA//8AAAD/AP///wD/AP8AAQEAAAAAAAABAQEA/wABAAEAAAAAAAAAAAD/AP///wAAAAAAAP8AAP//AAD/AAAAAAAAAAABAADFxsMAAAABAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAAgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAMAAgD9//8AAAAAAAEBAAD//wAA//8AAAAA/wABAQAAAAAAAAAAAAD///8AAAAAAP///wDPz80A/wD/AAAAAQAAAP8AAAABAAAAAAAAAAAAAQAAAP8A/wAAAAAAAAABAP//AAAAAP8A/wAAAP///wAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAP8AAP8AAAD/AAAAAP//AAAAAQAAAP8AAP8AAP8A/wAAAAAA/wAAAAEAAAAAAAAAAAEBAAAAAAD//wAAAAD/AAD/AAAAAAAAAAAAAP///wABAQEAAAD/AAAAAAD/AAAAAP8BAAAA/wD/AAAAAAD/AAD/AQAAAP4AAAABAAAAAQAAAP8AAAAAAAAA/wD//wAA/wAAAAEA/wAAAQAA//8BAAAA/wAAAAAAAAAAAAAAAAD///8AAAAAAAABAAAA//8AAAABAAAA/wAAAAAAAAABAAAA/wAAAAAAAQEAAP//AAAAAP8AAAABAAEBAAAAAAAA/wAAAAD//wAA/wAAAAAAAAD/AADd3d0A8fHuAA0NEAAAAAAAAAAAAAEBAAD//wAAAQEAAAAAAAD//wAAAAAAAAEBAAAAAAAABAL/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAB/QAAAP8AAAAAAP//AAD//wAAAQEAAP//AAAAAAAA//8AAAEBAAD//wAAAQEAAPPz8gDe394A////AP///wAAAQEAAgEAAP//AAABAQEAAAEAAAD/AAD///8AAQH/AAAAAQD//wAAAAD+AAAAAAD//wAAAAAAAAABAAABAAAAAAAAAP//AAAAAAAA/wAAAAD/AAABAf8AAAAAAAEBAQD///8A//8AAAEA/wD//wAAAQAAAAAA/wD/AAAAAAAAAP//AAAAAAAAAAD+AP//AAABAQEA////AAD/AAD/AP8AAAAAAAAAAAAAAAAAAQEAAP//AAD+/v8AAAAAAAEBAAAAAAAAAAD/AAAAAAAAAAAA//8AAP8A/gAA/wAAAQD/AAABAQAAAQAAAAAAAP///wD/AAAAAAAAAAAAAQD///8AAAD/AAD/AAAAAf8A//8BAAAA/wD//wAAAQEBAAD/AAAAAP8A//8AAAEBAAABAQEA////AAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAABAAEBAAAAAAAA////AP///gD///8A6uvrAAwMDwABAQAAAAAAAP//AAAAAAAA//8AAAAAAAAAAAAAAAAAAP7+AAABAQAA/gAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//gD///8AAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAPHx8QD7+vkA//8AAAAAAQABAAAAAAEBAAEAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAA/wAAAP8AAAABAAAA/wAAAP8AAAABAAD+/wD+AAAAAAAAAAAAAAABAf8AAP8BAP///wABAQAAAAABAAEB/wD//wAA/wD/AAD/AAABAAAA/v8AAAEBAAAB/wEAAAAAAP8AAAAAAAAAAAD/AAAAAAD+//8AAP8AAAAA/wAA/wAAAAAAAAECAQAAAAEA////AAAAAAD/AP8AAQAAAAD/AQAAAQEA////AAAA/wAAAAAAAP8AAP8AAAAAAQAA//8AAAD//wAAAAAAAQEBAP///wAAAAAAAQEAAP8A/wD/AAAAAP8AAAAAAAAA/wAAAQH/AP//AAAAAAAA/wD/AAD/AAAAAAAAAQEAAAAAAAAAAAEAAAD/AAEAAAAAAAAAAAAAAAAB/wAAAAAA//8AAAEB/wD//wAAAAAAAAAAAAAAAP8AAAD/AAAAAQAAAP8A8fDwAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAgD+AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD+AAD//wAAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAD/AO3t6wD/AP8AAQEAAAABAQABAAAAAP8AAP8AAAABAQAA/wD/AAAAAAABAQEA//8AAAAA/wD//wAAAAH/AAH/AAAAAAEA////AP///wD/AP8AAAAAAAEAAAD//wEAAAH/AAD/AAD//wAAAAD/AAAAAAABAQAA//8AAAAAAAD+//8AAQEBAP//AAABAQAAAQAAAP8AAAAAAAAA////AAAAAAD//wAAAAH/AAD/AAAAAP8AAAABAAH+AAABAQAAAAAAAAAA/wAAAAEA/v//AAAA/wACAQEA/wD/AAAAAAD///8A/wAAAAIBAgD//v8A////AAAA/wABAQEA//8BAAAAAAAAAAAA//8AAAAAAAAAAP8AAAABAP8A/wAAAAEAAf8AAAAAAAAAAAAA////AAAAAAABAQEAAP8AAAAAAQAA//0AAAEBAAAAAQAAAQAAAQAAAAD/AQAAAAAAAQEBAAAA/wAAAP8A//8AAAEAAAAAAAEAAAAAAAAAAAD///8A7e7sAP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAt5gDEAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAP8A/v0AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP3+/QD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAPn5+gD///8AAQEBAAEBAQD//wAAAAAAAAAAAAAAAP8AAQAAAP8AAQD///4AAAAAAP//AAAAAAAA////AAAAAQALCgkAVlZWACUjIAARExUABAUGAAAAAAAAAP8AAAAAAAEAAQAAAAAAAAEAAAAAAQABAAAA/wAAAAD//wAAAQAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAAAAAAEBAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAA/wAAAAEBAAD//wAAAAAAAAEBAAD//wD/AAAAAQAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAQEBAAAA/wAAAAEAAP//AAAAAAAAAQEAAAD/AAAAAAAAAAAAAAAAAP//AAD+/fwA8PDvANvb2wCsrK0A7/DyAAICAQAA/wAAAAEAAAAA/wAAAAEAAP//AAAAAAAAAAEAAQH/AP//AAABAAAAAAEAAAAAAAAAAAAA8vLyAAAAAAAAAP8AAAAAAP//AAABAQAAAAAAAP//AAABAQAAAAAAAP//AAABAQAA///9AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHx8AAAAAEAAP//AP8AAAABAQAAAP8AAP8A/wD//wEAAQEAAAAAAAAAAAEA////AAAAAAD/AAAA//7+AG9tawBOT1AADw8PAP/+/AD+/v4AAAAAAAABAQABAQEA////AAEAAAAAAQEAAAABAAAAAAAAAAAAAAAAAAEAAAD///8AAAD/AAAAAQAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAQEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAP//AP8AAAABAQAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEAAAAAAQAAAP8A////AAAAAAABAAEAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAgECAEJBQQBaWVgAuLm8AIuMjAD//wAA/v//AAIBAgABAQAAAAD/AAAAAAAAAAEAAAABAAAA/wD/AP8AAAAAAAAAAQAAAAEA9PTzAAAAAAD///8AAAAAAAAAAAD//wAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAA/wD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//wD///8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAPLy8gAAAP8A/wD/AAEAAAAA/wEA/gD/AAD/AAABAf8A//8AAP//AAD///8AAAD/AP//AAACAgEAlJaVADUzMAD8/f0A+Pf0AAABAgD///8A////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAP//AAAAAAAAAAAA/wD/AAEAAQAAAAAAAQAAAAABAAAAAAAA/wABAAEAAAAA/wAA/wD/AP8AAAAAAAAAAAAAAAAAAAABAAEAAAEAAAAAAAAA//8A/wAAAAAAAAAAAAAAAQAAAP8AAAAA//8AAAAAAAAAAAAAAAEAAAEAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAQEBAAAAAAAAAP8A//8AAAABAQABAAAAAAAAAAA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AAAABAP8A/wD/ACUmJgD+/v4A/f3+AL7rCQDU6AEA8/j/AAAA/wD/AAAAAAEAAAAA/wAAAQEAAAEBAP8A/wD/AAAAAP//AP8AAAAAAAAAAP8AAAABAAABAP8A/wAAAAEBAAD/AAAA/wAAAAAAAQABAP8AAAAAAAAA/wABAP8A/gABAP8AAAABAP8AAQEBAAAA/wAAAAAAAQAAAAAAAAAAAAAA/wEAAAD+AAD///8AAQAAAP8AAQD/AP4AAf8AAAAAAAAAAP8AAAAAAAABAAAAAQAA//8AAAEA/wAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEBAP4AAAAB//8AAAAAAAAA/wAAAAAA/wABAPf+AQDf8gEAv/AKAFUJ9QAA/wEAIB8dAP7+/wABAQEAAAAAAP8AAAABAAAAAQABAP8A/wAAAP8A//8AAAEAAAAAAQAABQQCAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AAAA/wAAAAEAAQEAAAAAAAAAAAAA//8AAAAA/wAAAAAAAQEBAP8A/wABAAAAAQEAAP8AAAAA/wAAAAD/AAAAAAD//wAAAAEAAAAAAAD//wAA/v7/AA8PDgD///4A+/39ANT3BADv9gAA/v/+AAD/AAAAAP8A/wAAAAEAAAAAAQAAAAH/AAAAAAAAAAAA//8AAAAAAAD/AAAAAQAAAAAAAAAAAP8AAAAAAAEAAAABAAAAAAEBAP8A/wABAAAA/wD/AAAAAAABAAAAAP//AP8A/wAAAQEA/wD/AP8AAAAAAAAAAQAAAAAAAAABAQAA/wEAAAD/AAD//wAAAP//AAAAAQD/AAAAAQAAAAAA/wAAAAAAAAABAAABAAAAAP8AAAAAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAD/AAAAAQEAAAD/AAEAAAAAAP8AAQABAAEAAAD/AAAAAQH/AAH/AQD49wEAzfEEAFIW/QAEAgQAEBERAAAAAAAAAP8A/wABAAH/AAD/AQAAAAD/AAAAAAAAAAAAAAD/AAAAAQAA//8A/v//AAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAA////AP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAD//wAAAQAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP//AP8AAAAAAAAAAAAAAAMCAgD///8A/v39AO/8AQD+/f8A//3+AAD9/gD//v0AAP//AP8AAQAAAQAAAAEBAAABAAAA/wAA/wAAAAABAAAA/wAA/wAAAAAAAAAA//8AAAD/AAEAAQAAAAAAAAEAAAAAAAAAAAEA/wAAAAD//wABAQAAAQAAAAAAAAD/AQAA//8BAAABAAAA/wAAAQEAAAAAAAAAAQEAAAEAAAD/AAD//v8AAP8AAAEA/wD/AQEA/wAAAP//AAABAAAAAAEAAAAAAAAAAQAAAP8AAAAAAAAAAP8AAP8AAAACAQAA//8AAP8AAAD//wAAAAAAAAEAAAEAAAAAAAAAAQEBAAD/AAAAAQEAAgICAAAEAwD+/AIA6/0BAAEAAAAAAQAAAwIBAP7+/gACAgIAAQD/AP8BAAAB/wAAAAAAAAAA/wAAAAAAAAABAP8A/wAA/wEA/f3+AP///wD///8AAAAAAAAAAAAAAAAA////AAAAAAD//wAAAQEAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA//8AAAEB/wAAAAAA/wAAAAAAAAAAAP8A//8AAAAA/wD+//8A/f39AAEBAAAAAAAAAwIBAP0BAQD8+/wA/fj4AFgE6AAvEOkACAL+AAAAAAABAAEAAAECAAAA/wACAAAA/wAAAP///wABAQEA/v/+AAEAAQAAAQEAAQD/AP8AAAABAgEAAQABAP///wD///0AAgECAAD/AAD+/wAAAAH/AAEAAAABAAAA/v//AAEAAQAAAQAAAAABAAACAgAA/wAAAAABAAEA/wD+//4AAwEBAP7//gACAgIA/v7+APz+/wAFAgEA/wAAAAEBAgD/AQEAAP//AAH//wD+//8AAQD+AAMDAwD+AAIA//39AAAAAAAAAQAAAgAAAP8BAQAA//8AAQAAAAABAQD5/gIA2fISAKLzGQAEDQoAAAICAP///gD//v4AAQEBAP///wD///8AAAAAAAEBAAAAAAAA//8AAAEBAAD//wAA/wAAAAD/AAABAgAA/Pz8AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8BAAEBAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAABAQEA//8AAAAA/wABAQEA////AAAAAQAAAP8AAAABAAD//wD///8AAAD/AP//AQAAAP8AAAABAAAAAAAAAAAAAAD/AP8AAAAA/wAAAAD/AAECAgAAAAAA/v38AP77/gBUA+sAfTmtACAO0gAC+fIAAP37AP8AAAAAAP8AAQICAAABAAAAAP4AAP//AAD/AAD/AAAAAQECAP//AAAAAP8AAQD/AAACAwAAAAAA///9AAEA/wAAAP8A/wAAAAH/AgAAAQIAAAEBAAABAAAA/v8A/wABAAEA/QAAAQEAAP//AP///wABAQIAAAECAAAAAQAAAAIAAAAAAP/++wAAAf0AAP8AAAABAQABAP8A/wABAAEAAgAAAAEA/wABAAAA/QAA//8AAAEBAAEAAQD/AAEAAP/+AAH/AAD/AQIAAAEAAAAAAAABAP8A////AAD/AAABAgMA/wUIAHP0LgCG2F0A5/cVAP39/QAABQQAAAAAAP///wD///4AAQEDAAD/AAD/AAAAAAAAAP7/AAAA//4AAAABAAAAAAD/AAAABQQEAP///wAAAAAA////AAAAAAAAAAAAAAABAAAAAAAAAP8AAAD/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///gAAAAAAAQEAAP8AAAD//wAA/wAAAAEA/wD/AAAAAAD/AAAAAAABAAAAAAABAAD//wAAAAAA////AAIBAQAAAQEA/fz7AAvx7wCONZcAD/OzAADi2AAA/v8AAP//AAABAAABAAEAAAEAAAABAQAAAf8AAP8AAP//AAAAAAAA/wAAAAEAAAD/AAEAAAAAAAAB/wAAAQEAAQEAAAD/AAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAA//7/AAEBAAAAAQEAAAH/AAAAAAAA/wAAAAAAAAEAAQAAAAAAAP//AAAAAQAAAQEAAAAAAP///wAAAAAAAAEAAAH//wAAAQAAAAAAAAD+AAAA/wAAAAABAP8B/wAAAAAAAAAAAAEBAAAAAAAAAP8AAAD/AAD/AAAAAAICAB4L3gCJLOsAbM1yAP8p/QABAQAAAAAAAP///wABAQIAAQAAAAAA/wABAQEA////AAD/AAAAAAEAAAD/AP//AAAA/gAAAgMDAAAAAAD///8AAAAAAAAAAAD///8AAAD/AAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD/AAAAAAD/AAAAAAAAAP8A//8AAP7+/gD//v4AAAICAGERugAP8rcAAfTXAAD//wAA/wAA/wAAAAAAAAD/AP8AAAIAAAEAAAAAAP8AAP8AAAAAAQABAAAA////AAABAQABAP8A/wAAAAABAAABAf8AAAAAAP8AAAAAAAAAAP8AAAEAAAAAAP8AAAAAAAABAQD/AAAAAQD+AAAAAAAAAAEAAP//AP8BAAABAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAEA/wD///8AAAAAAAAAAAAAAAAAAQEAAAAAAAD/AAAAAAAAAAD/AAAA//8AAP//AAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAP/9AADzzwAO+u4AZBczAAQEPwD//wAAAQECAAEBAQAAAAEAAAEAAAAAAAAAAAAAAQABAAAB/wAAAAAA/v4AAP///wABAQEA+Pj4AP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAP8AAP8AAAAAAAAAAAAAAAAAAAAA/wAA/wAA/wAAAAAA/wD//wAAAAD/AP//AAD///8AAQD/ACkM0wAA894A//3/AAAAAAAB/wAAAP8AAAABAQAAAQAAAP4AAP8AAAAA/wAAAQABAAAAAAD/AAAAAAABAP8A/wAAAQEAAP8AAAABAAD/AQAAAQEAAAH/AAD/AP8AAAABAP8AAAABAAEA/wAAAAABAAABAAAA/wABAAAAAAABAAAAAQABAP//AAD/AQAAAAAAAAD/AAABAAAA/wEAAAD//wABAAAAAQEBAAD/AAAAAAAAAP8AAAABAAAAAP8A/wAAAAABAQAAAQEAAP//AAAAAAAA/gEAAAAAAAD+AAAAAAAAAAEAAP//AAABAf8AAP8BAAAAAAABAAEA/wD/AP8A/gAA/+cAKhPUAP/+PQD///8AAAD/AAAAAAABAAAA////AAAAAQAAAAAAAAAAAAAAAAD//wAA////AAAAAAAAAAAAAQABAAAA/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAAAAAAEA////AAEBAAAAAAAAAAABAAAAAAD///8AAQEBAAAAAAD/AAAA////AAAAAAABAQEAAAD/AP//AAAAAAAA////AAAA/wD///4AAAABAP///wAAAP8A/v38AA/94gAA/fwAAPsAAP/+AAD+/QAA//8AAAABAAAAAf8AAQEBAP/+AAAAAAEAAP8AAAAAAAD/AAAAAAEAAAEAAAAAAQAA//8AAAABAQABAQAAAQD/AAAAAAD//wEAAAAAAAABAAABAAAAAAIBAAAAAAAA/wAAAP//AP8AAAABAAEA/wAAAAEAAAD/AAAAAAEAAAD/AAAAAAAAAAAAAAD/AAAAAQAAAAAAAAEAAAAAAAEA/wD/AAAAAQAAAQEAAP8AAAABAAAAAAAAAAABAP8AAAAA/gAAAAD/AAEBAAABAAAA/wAAAAD+AAAAAAEAAQEAAP8BAAABAQAAAAABAAIC/wABAgEAD//dAO38/QAGBv8AAAAAAP8A/wD+//8AAQEBAAEAAAAAAAAA////AAAAAAD///8AAAAAAAAAAAAA//8ABgYFAP///wAAAAAAAAAAAAAAAAD///8AAQEAAAAAAAD//wAAAAAAAAEBAQAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP//AAAAAP8AAAD/AP//AQAAAAAAAAD/AAAA/wAAAAEA////AAAAAAABAAAAAAAAAAAAAAAAAAAA//8AAP///wAAAAEAAAAAAP8AAAAAAAAA///+AAAA/wD//wAA/fz7AP/9+gAA+v4A/fgBAPb4AQDyAAsA/AECAAAB/wACAgAAAQECAP7+AAD//v4AAP8AAAAA/wAAAQAAAAEBAAIBAAAAAQEAAAABAP8A/wAAAAAAAP//AAAAAAABAAIAAAD/AAECAgABAP4A////AP//AAAAAQAAAP8AAP//AAD/Af8AAQECAAEAAQAAAgAAAQD/AP//AAD///4AAAABAAEAAQAAAAEA/wD/AAAAAAABAAAA/wAAAAEBAAD/AP8AAQACAAAAAQAAAAAA////AAD//wABAQEA//7+AAEBAAAAAQIAAQEAAP/+/gD+/wAAAQIBAAMCAQAB/v8ADf/2AAsF/gAC//0A/wf8AP79/AAAAAAAAAAAAP/+/wD/Af8AAf8BAAABAAD/AP8AAAAAAP8A/wAAAAAAAAAAAAD//wAAAgEA/wD/AP//AAD///8A/0Cgwi4AACAASURBVP//AAEBAQAAAAAA//8AAAAAAAAAAP8AAAABAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAABAQAA////AP8AAAAA/wAAAAEAAAH/AAAAAP8AAP//AAAAAAABAP8A/wEAAAH/AAD+AAAA/wAAAAAAAAD///0A////AP/9/wD2+AUAyhY2AM0TEAD4Av8A+/78AP8A/gADAQIAAQEAAAD/AQD+AP4AAP//AP8A/wD+//4AAQECAAEBAAAAAQEAAgABAP///wACAQEAAAABAP///wD///8AAAD/AAICAwABAQEA/v7+AP8B/wAAAAEAAAAAAAD//wAAAf8A//8BAAIBAgABAQEAAQAAAP7+/QAAAQAAAQEBAP3//wD/AAAAAQAAAAEAAAD/AP8AAQABAP8AAAAA//4AAQEBAAEAAgAAAAEAAAD/AP///wABAAEA/wAAAP4A/gACAQIAAAAAAP//AAAAAAAAAQEDAAD//wD//v8ABwEEADHw7AA549QACQv/AAAAAAD///4A////AAD/AAAAAP8A/wD/AAD/AAABAAEAAAAAAAD/AAD/AP8AAAAAAP8BAAD///8A+fn7AP///wD///8AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAD//wD/AP8AAQAAAAABAAD//wAAAAEAAAEAAQD///8AAP//AP//AAAB/wAAAP8AAAAA/wD///8AAQICAP38+QCtJDUA0wH4APH24AD7/vwA/wD/AAAAAAAAAAAAAQAAAAABAAD/AAAAAP8AAP//AAAAAP8A/wEAAAAAAAAAAAAAAQAAAAAAAQABAAAAAQEAAAAAAQAAAAAAAAH/AAAAAAAA/wAA//8AAP8BAAABAAEAAP8AAAAAAAD/Af8AAAAAAAEAAAABAAEAAQEAAAD/AAAAAQAAAQABAP8A/wD//wAA/wAAAP//AAAAAP8AAAEBAAEA/wAAAAAAAQAAAAAAAQAAAAAAAAD/AP8AAQAAAP8A//8AAAAAAAD/Af8AAQABAAAAAAAA/wEAAQEAAAAAAAABAAAAAwEDAOkLCgDlKTgAWO79AAAA/wD/AP8AAAAAAP8A/wD//wAAAf8AAAACAAAAAP8A/wAAAAAAAAAAAAAAAQEAAP/+AAD/AP8AAAD/AAAA/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQD///8AAAAAAAEBAQD///8AAQEBAP8AAAABAQEA//7/AP8AAAAAAP8AAAAAAAAAAAAAAAAAAP8AAP///wD+//8A/v7+AAAAAAAAAAAA///9AM0HBwDTA/UA6/XwAP7//gD+/wAAAAEAAAEA/wAAAAEAAAEAAAD+AAD/AP8AAP8BAP8AAAAAAf8AAP8AAAAAAQAA//8AAAABAAAB/gABAAEAAQABAAAA/wABAAAAAAEAAP8A/wAAAAAAAAAAAAD+AAD/AP8AAP8AAAABAAAAAAAA/wAAAAEAAQABAQAAAAEAAAEAAAAA/gAAAgAAAAAAAAD+AP8A//8AAAAAAQAAAQEAAP7/AAABAAAA//8AAQECAP8A/wAAAAAAAAAAAAAA/gD//wAA/wAAAAAAAAAAAAAAAAD/AAABAAAB/wAAAAH/AAD//wAAAP8A/AD9APv+/ADTCQQAIwYKACX+/QAA//8AAAD/AAAAAQABAQAAAAAAAAD/AAD/AAAAAAAAAAAAAAABAAEA/wD/AAAAAAAAAAAABQUFAP7+/wAAAP8AAAABAP///wABAQAA//8AAAEBAQD///8AAQEBAAAA/wD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAAAAAAAAP///wAAAP8A////AAD/AAD//wAA/wD/AAAAAAAAAAAAAAEBAAD/AAABAQAA/v//AAD//wD/AP8AAAAAAP///wAA//8A/P7+ANMFAQDt9/EA+/3+AP8A/wD+/wAAAQEAAAAAAQD/AAAAAQD/AAAAAAAAAAEAAP8AAAAA/wAAAAEAAAEAAAD/AAD/AAEAAAH/AAD+AAABAAAAAAEAAAEAAAAAAQAAAf8BAAAAAAD/AAAAAAAAAP/+/wD/AP8A/wAAAAEBAAAAAAEAAQAAAAEAAQAAAQAAAAH/AAAAAQAB/wAA/gD/AAAAAAD+/v8A/wABAAAB/wACAAAAAAAAAP4AAAD/AAAAAQD/AAAAAAAB/wAAAAEAAP//AQD///8A/wEAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAEAAAABAQEAAAAAAP///wDx+vMA0ggZACUBAQD///8AAQABAAABAAAAAAAAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAEAAQABAAAAAAD//wAAAAD+AAAAAAD//wEAAAD/AP//AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///4A/v//AAEAAAABAQEAAP8AAAAAAAAA/wAAAAAAAP8BAQAB/wAAAAD/AAIBAgD/AP8AAAAAAO0FCAD7+P0A/P0AAP39AAD+/wAA//8AAAAA/wAAAQAAAQAAAAEAAQABAQAA//8AAAAAAAAAAP8AAAABAAAB/wD//wAAAQEAAAAA/wABAAAAAP8BAAAB/wAAAAEAAAD/AAAAAAAAAAAAAAEAAP//AAD//wAAAAAAAAD/AAAAAP8AAAEBAAAA/wABAQAAAQH/AAAAAAABAAAAAP8AAAAAAAD+/wAA////AAEBAAABAAAAAAIBAP8A/wD/AAAAAf8AAAD//wAAAP8AAAABAP//AAAAAAEAAAH/AP//AAAAAAAAAAD+AAEBAQAAAAAAAAAAAAECAQACAAAAAgIBAP8DAAD8//4A8AgGAP7+/gD///8AAAAAAAD//wAAAAAAAAD/AAAAAQAAAAAA/wD/AAAAAAAAAAAAAAD/AAAAAAAAAAAA+vv5AP///wD///8AAQEAAP//AAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAP///wAAAAAAAQEAAP//AAAAAAAAAAAAAAEBAAAAAAAA//8AAAAA/wD//wAAAP8AAP8BAAAA/wAAAAD/AAEAAAD/AAAAAAAAAAD//wD//wAA/wAAAP8AAAD///8A///+AP3/AQD6+gEA+vsAAPv5AAD++gAAAf4AAAEBAAAAAQAAAQABAP8AAQABAAAAAQEAAP8B/wD//gAA/v//AAIBAAAAAAAAAAAAAAD/AQABAQAAAAH/AAAAAAD///8AAAEAAAEAAQABAAAA/wH/AP/+AAD//gAAAAEAAAAAAAABAf8A/wD/AAAAAQD/AQAAAv8AAAEAAAACAgIA/gD/AAD+/wD///8AAAEAAP8BAQABAQAAAQEAAP/+AAABAQAAAP8AAP8AAQAA/wAA/v7+AAAAAQABAQEAAgECAP8A/wD9/f4AAAEAAAIB/wABAQAAAP8BAAIDAQAAAAEABAoCAAIF/wACAwEAAAoFAP7+/QAAAP8A/v/+AAAAAAD+//8AAwECAAAAAAAAAAAAAP8AAAAAAAD/AP8AAP//AAAAAQAAAAAAAQEBAP8A/wD///8A//8AAAAAAAABAQEA////AAEBAAAAAAAA//8AAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAD/AAAAAQAAAAAA////AP//AAABAQEAAAAAAP//AAAAAP8AAAABAP//AAAAAAAAAQEBAAAAAAAAAAAA/wAAAP///wAAAAAA//8AAAAAAAAAAP8AAQAAAAAAAAD//v8A/wD/AAD9BAD89AAAZfZFADT5GQAQ7vgAAgMGAAD//gABAwQAAAD/AAEAAAD/AP8AAAEBAAD//wAA/f0AAP7/AP///wAAAQEAAAICAAD/AAAAAgEAAP/+AAECAwD/AQAAAQAAAP/9/gAAAAAAAP7+AP/+/gABAwQAAAMCAAEBAAD//f0AAQEBAP8BAQAAAAEAAP39AAEBAQAAAwMA////AAH//wAAAQEAAP39AAD//wAAAgIA//8AAAECAgAAAgEAAP7+AAAAAAAAAAAAAP39AAACAgAAAwMA//7+AAAAAQAB//8AAAEAAAAAAAD/AQEAAAABAAD//gD+/PoA8BQJAM781gCiFdQA/Q3/AP39/AD+/v8AAP//AAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAABAAAAAAAAAAAABQUGAAD//wAAAAAAAAAAAP///wAAAAAAAAAAAP7+/wABAQEA////AAEBAQAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA/gAAAAEAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8A////AAEBAQAAAAAAAQD/AAABAQD///8AAQAAAP8AAAAAAAEAAQECAP///gAAAP8A//z/APTw9gCF30AAKfQLAADq3AAA+voA//8AAAECAAAAAgEAAAABAAAAAAAAAQEAAP//AAD/AAAAAAAAAP/+AAAAAQAAAAAA/wAAAAAAAAABAAEAAAEBAAEBAAD///4AAAABAAABAQAAAAAA////AAEAAAAAAQEAAAEBAAAAAAAA/v4AAAEBAAACAQAA/wAA////AAAAAAAAAAAAAQEAAAEBAQAAAQAA//7/AAAAAAAAAAEAAP8AAAAB/wAA/wAAAAAAAAAAAAAA//8AAAEBAAABAQAAAQAAAAABAAD+/gAAAAAAAAEAAAAAAQAAAAAAAAD/AAD+/wAAAgEAF+IDAEgSHAAk/hoAlgveAP8U/wAAAP8A////AAAAAQAAAAAA/wAAAAEAAAAAAAAAAAAAAAABAAAB/wAAAAEBAP///wAAAP8AAQEAAP//AAD///4AAAABAAAAAAD///4AAAABAAAAAAD///8AAAAAAP///gAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQAAAAD//wD/AAAAAAABAAEB/wABAAAA/gAAAAAAAAAAAP8A/wD/AP7//wD///8A/v7+ADzlEAAq6gQA/+rfAAD/AAAAAQEAAP7/AP8BAQAAAQEAAQIAAAAAAQAA//8AAAABAAD//wAAAAEAAAD/AAAAAAD/AAAAAAAAAAEBAAAA/wAAAAIBAP4AAAABAAAAAAAAAAD/AAD/AP8AAAAAAAAAAQAAAgAA//8AAAD//wABAQEAAAEAAAAAAQAAAAAAAQAAAP/+/wABAQAAAQEAAAAAAAD//gAA/wAAAAEBAAD+AAEAAQD/AAEA/wAAAAEAAAAAAP//AAAAAAAAAQEBAAABAAAAAAAAAP8AAAAA/wD//wAAAQIBAAD/AAAAAQAAAP8AAP8A/wAA//8AAQEAAAHn4wAl8xAASgwaAAMXAwD+/f0A////AAAA/wAAAAAAAQD/AAAAAQAAAAAAAAAAAAAAAQD/AP8AAP//AAAAAAAAAAAA/Pv9AAAB/wD//gAAAAH/AAD/AAAAAAAAAAH/AAD/AAAAAAAAAAAAAAAAAAAAAf8AAP8AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP8A/wABAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAABAAAAAAAA/wAAAAAAAAAA/wAAAAH/AP//AAAAAAAAAAAAAAAA/wAAAAEAAQAAAAEAAQD9/PsA/v79ADP4GgD/6NsAAP39AAAAAQD/AQAAAQICAP//AAAA//8A//4AAAEA/gAAAAEAAAD/AP8A/wABAAAAAAEBAAAAAAAB/wAAAAAAAAAAAAD/AAAAAP8AAAAA/wAAAQEAAAD/AP//AAABAAAAAAABAAAB/wD//P8AAAEAAAAAAAAAAAAAAP8AAP8A/wABAQEAAP8AAAD//gAA/wAA/wAAAAAAAQD//wAAAAD/AAAAAAABAAAAAAAAAAAAAAAAAP8A/wEAAAEAAQD/AAAAAP//AAD/AAAAAAAAAP8AAAABAAABAQAAAPz+AP8AAQAAAAAAAAEAAAD/AAAAAP8A/wAAAAD8/AAB9/UALPEhAPX6+QD/CgoAAAAAAP///wAA//8A//8BAAEBAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA///+AP/+/wAAAP8AAP8AAP//AAABAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAD//gAAAQEAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAD//wD/AAEAAQEAAP//AAAAAAAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAD//wAA/wAA////AAAAAAAAAAAAAP8BAAEBAAAAAP8A////AP///wAAAP8AAAABAP39/AD8/AIA+fb2ABfo9AAAAf8A/vz9AP//AAACAgEA/QD/AAACAQAAAAAAAAAAAAAAAAABAP8A//8AAAAAAAABAQEAAAEAAAAAAAAA//8AAP//AAAAAAABAwIAAQABAAABAAAAAAEA////AAEAAAAAAAAAAAEBAP8AAQAAAP8AAQEAAAABAAD//v8AAAAAAAAAAAAAAQEAAAD/AAH/AAAAAAAA////AAAAAAD/AAEAAQAAAP///wABAQEA////AAAAAAAAAP8A//8AAP8BAQABAAAA/v//AP//AAAA//8AAgIBAP//AQD/AP8A/wAAAAD//wABAQEAAAEAAAIAAQD/AP8AAQD/AAAAAAAA+/kACuDtAO4v+QD+/v8A////AAABAQD/AAAAAQAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAABAAAB/wD/AAAABQYFAAAA/wD//wAAAAD/AAAAAQD//wAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8A//8BAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8A//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP///wD+//8AAAD/AAAAAAAAAAAAAAAAAP//AAAAAP8AAAAAAAAAAAD///8A/v79AP38/AD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BAAAAAAEAAAAAAP///wAAAAAAAgMDAP///gD//wEA/wEDAAEAAAAAAAAAAAAAAP//AAAAAAEAAAAAAAEB/wABAQEABwYGAP///wD///8AAAABAAAA/wAAAAAAAQEBAP//AAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAA//8AAP//AAD///8A//8AAP///wD//wAA//8AAAD/AAABAAAAAQEBAAAAAQABAAEAAAABAAEAAAD//wAAAAAAAAEBAAAAAAAA//8AAP7+/wD///8AAAEBAAAAAAAA/wAAAP8AAAAAAAAA//8A/wD/AAD//wD///8AAP8AAAD//wD///8AAP/+AAAAAAAA//4A////AP///wAAAAAAAQAAAAAA/wD/AP8A/v/+APv6+QD5Af4ABmpuAPkjKQD8/f0A/fz9AAD9/gAA/v8AAP//AAD//wD///8AAP3/AAD/AAD//v8A////AAD/AAABAAAAAAD/AP7+/wD6/PwA+A8SAAVydwD+Dw4A+ff0AP7+/gD///8A////AP///wD///4A/v7+AP7+/gAA/wAA//8AAP/+/gD+/v8A/wD/AP///wD///8AAAD+AP///wAA//8AAAD/AP///wD///4A///+AAEAAAABAQEAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAA/wD/AAAAAAAAAAAAAQEAAAAAAQAAdlAGAgAAIABJREFUAAEA/v/+AP7+/wD//wAA////AP//AAD//wAA/v7/AP///wD///8A//8AAP//AAD///8A//8AAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAA////AAAA/wAAAP8AAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8A///+AAABAQABAQAAAQEBAP8AAAAAAAAA//8AAAAA/wD///8A//8AAP///wD///8AAQEAAAAAAAAAAAAA////AP8A/wAAAP8AAP//AP8A/wAAAAAA/wAAAP8A/wD/AP8A/wAAAAAAAAAAAAAA////AP8AAAAA/wAAAP8AAP///wD///4A////AP///wAA//4A///+APz8+wD6AP8ABmZpAPkGCQD7/P0A/v7/AAAA/wAA/wAA////AAD//wABAAAA/wAAAAABAAD+//8AAP7+AAH//wAB//8A/P3+APv/AAAEam4A/QkIAPv69wD///8A///+AP8A/wAAAP8AAAD/AAAAAAABAAAAAAD/AP///gD///4A/wD/AAEA/wAA/wAA////AP///wD//wAA/wD/AP8AAAD///8A////AP///wAAAAEAAAEAAP8AAAD/AP8AAAABAAD/AAD//wAA////AP7//wD///8A////AAD//wAAAAAAAAAAAAD//wD8/PwAAQEAAAAA/wAAAP8AAAD/AAAA/wD///8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A///+AP///wD//wAA////AP///wD///4A////AP//AAD///8AAAAAAAAA/wAAAAEAAAAAAAEBAQABAQEAAAAAAP//AAAAAAAA/wD/AP8AAAAAAAAAAQEBAAAA/wD//v4AAAD/AAAAAAD/AAAA/wD/AAD//wAAAP8AAP//AAAA/wAA//8AAP//AAAA/wD/AP8AAP//AAD//wAAAf8AAAD/AP///wD+//8A////AAAAAAD//wAA////AP///gD9+/kA/g0MAAJnbQD7/wAA/P//AP//AAAAAAAAAf8AAAH/AAAA//8AAf//AAH//wAC//8AAP//AP/+/gD8/f8A/AAAAABYXQAEIB8A+/r3AP//AAD///8AAAAAAAAAAQAAAAAAAQAAAAAAAAAAAQEAAAAAAP///wAAAP8AAQAAAP8AAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAA//8AAAD/AAABAAEAAAAAAAECAQABAQEAAQEAAAH//wAA/wAAAAAAAAAAAAD//wAA////AP8AAAABAQEA////AP///wD///8A////AP//AAAAAP8A//8AAP///wD///8A//8AAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAD///8AAAAAAP///wD///8A//8AAP///wD//wAA//8AAP///wD//wAAAAAAAAAAAQD///8AAAAAAAEBAQAAAAAAAAAAAAAAAAD/AP8AAP//AAEAAAAAAAAAAAABAAD//wD///8AAP//AAAA/wAAAP8AAAAAAAAAAAAA/wAAAAAAAP//AAAAAAAAAAAAAAD/AAD//wAA/wD/AAAAAAD//v8A////AAD//wAAAAAAAAAAAP///wAAAP8AAAD/AAD//wD+/v4A+vn4AAUuLgABWmAA/P//APr9/wD9/v4AAAD/AAAA/wD//wAAAQAAAAH/AAAA/v8A/wAAAPz+/gD6/PwA+jU6AAdCRAD5+PYAAAAAAAAA/wAAAP8AAAAAAAAA/wAAAAAA/wAAAP8AAAD///8A//8AAAAAAAAA/wAA////AAD//wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD//wAA//8AAP8AAAAAAAD///8AAAD/AAAB/wAAAAAAAAAAAAAAAAABAQAAAAAAAP8A/wAAAAAAAAAAAP4AAAD///8AAAAAAAEAAAADAwMA////AP//AAD//wAA//8AAP///wD///8A////AP///wD//wAA////AP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAD//wAAAAD/AAAAAAAAAP8A//8AAAEBAAD///8AAAAAAAEBAAAAAAAA//8AAAAAAAABAQAAAAAAAAAA/wAAAAAAAAAAAAEBAAAA/wAA/wAAAAAAAQAAAQAAAAD/AP8AAAAAAP8A/wABAAD//wABAAEAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAABAP8AAAAAAAAAAAD/AAAAAQABAAAA/wAAAAAAAAD//wAAAQEAAAD//wAAAQAAAP79APj28wAKR0gA+P7+APylnwD+BAQABAECAAD+/wACAQEA////AAAAAAD9/v0A//8BAPoAAQD9Q0oACldYAPj59gD+/fwAAAAAAP///wAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAD+//8AAAAAAAEBAQAA//8AAAAAAP///wABAAEAAP//AAABAAAAAAAAAAABAAD//wABAf8A//8BAAEAAQAAAAAAAAAAAAD/AQD//wAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAEAAAH/AP8BAQD//v8AAAD/AP///wAAAAAAAAAAAAEBAAD//wAAAAD/AAEBAAD///8AAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAAA//8AAAAAAAD//wAAAQEAAP//AQAAAAAAAAD/AP//AAAAAAAAAAD/AAEBAAD//wEAAAAAAP//AAAAAAAAAAAAAP//AAD//wAA//8AAAAA/wAAAAAAAAAAAAAA/wAAAAAAAP8AAAAA/wD/AAAAAAEAAAEAAAAAAAEAAAD/AAD/AAAAAAAAAAAAAAABAAAA/wAAAAD/AAAAAAAAAAAAAAABAAABAAD/AP8AAAAAAAAAAQABAf8AAP8AAAABAAAAAP8A/wD/AP/9/wD19PAAB0VFAP8nKAD7q6cA+tTPAAMBAwACAwMA/v7/AAAA/wABAQAA/BIVAAVfZAAFKysA+Pj1AP79/AAA//8AAAEBAAAAAAAA//8AAAEBAAAAAAAA//8AAAAAAAEBAAD//wAAAAAAAAD//wAAAAAAAAAAAAD//wAAAQEAAP//AAAA/wD//wAAAQAAAAAAAAAA/wAAAAD/AAABAAD//wAAAQAAAP8B/wD/AP8AAQAAAP8A/wAA/wAAAQAAAP8BAQABAAAAAAAAAAEBAQD/AP8AAP8AAAAA/wD5+voA//8AAAAA/wAAAAAAAAAAAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAP7+AAABAQAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAEAAAAAAAAA/wAAAAAA//8AAAAA/wAAAAAAAAAAAAAAAAAAAAAA////AP//AAD/AP8AAQAAAAAAAQAAAAAAAQEAAP//AAD/AP8AAAD/AAAAAAAA/wAAAAAAAAAAAQAAAAAAAAD/AP8AAAAAAP8AAf8BAP8AAAAAAf8AAP//AP//AAAAAQAAAQAAAAD/AQAAAAAA/wD/AAEAAAAAAAAAAAABAAD//wD/AAAAAAABAAEA/wD/AAEAAAAAAAD//wAAAAAAAAAAAAD//wD///8A+Pb0AAUaGAAIdXgA++PkAAHm6AD87ekA/fn5AAMREgAHJCYABBkYAPz9+wD49fIA/wD/AAAAAAAAAAEAAP//AAAAAAAAAAAAAP//AP8AAAAAAQEAAQEAAAD/AAAA//8A/wAAAAEAAAABAAEAAAH/AP///wAA//8AAP8AAAAAAAAAAf8AAAABAAAAAAD/AAAAAAAAAAD//wABAAEA/wD/AAH//wAA//8A////AP///wAAAAAAAAEAAAD/AAAAAQEA/wAAAAD//wAAAAAA/wAAAAD//wAAAAAAAAAAAP///wAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAA/wD//wEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAQEAAP///wAAAAAA/wAAAP///gD//v8AAAEBAAEB/wAAAAEA//8AAAAAAAAAAAAA//8AAP///wAAAAAAAQECAAAAAAAAAAAA//8AAAAA/wAAAQEA////AAABAAAA/wAAAP8AAP8A/wAB/wAA/wEBAAEA/wD/AAAAAAD/AP//AQAAAQAAAP/+AP8AAAAAAAAAAQD/AP8AAQAAAP8AAAAAAAAAAAABAAEA/wD/AAAAAAAA/wAAAP/9APr59gD6+fcABBQRAAQZGAAFAQAABgABAP8A/wD7/PsA/vn2AP79/AD/AAAAAAD/AAAAAQAAAAAAAP//AP8AAAAAAAAAAAD/AAAAAQAAAP8A//8AAP//AAAAAAAAAAAAAP8AAAAAAP8AAP//AAD//wAAAAAAAAAAAAEBAQD/AAAA/wD/AAD/AAABAAAA/wAAAAEAAQAAAQAAAP8AAAAA/wD///8A/wD/AAAA/wAAAAEAAAABAAABAAAA//8AAAAAAP8AAAAA//8AAAAAAAABAQAICAgA/v7/AP//AAAAAP8AAAAAAAEBAAD///8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAD//wAAAQEAAAAAAAD//wAAAQEAAAAA/wAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAP8A//8AAP//AAAAAP8AAAAAAAAAAAAAAAAAAAEAAP//AAAAAP8AAAD/AAAAAAD///8AAAAAAAAAAAAA//4A/wABAAD//wAA/wAAAAABAAEBAAAAAAAAAP//AP8AAQAAAP8A/wAAAAEAAAAA//8A/wAAAAD//wAAAAEA/wAAAAEB/wAA/wAAAAAAAAAAAQD/AP4A/wD/AAEAAQAAAQAA/wAAAAD/AAAAAP8A/Pz6APz7+gAAAQAAAQECAAAAAAD///4AAAAAAAAAAQAA//8AAAD/AAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD//gAAAAAAAAAAAAAAAAAAAAAAAAAA/wD//wAAAAEAAAD//wAAAQEAAQABAP8A/wAA/wAAAAAAAAAAAAD/AAAAAAABAP8A/wABAAEAAAEAAP//AAD///8A////AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD//wAAAAAAAAAAAAAA/wABAQAA////AAAA/wAAAAAAAAAAAP//AAAAAAAAAAAAAAAA/wD//wAAAQEAAP//AAABAf8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA/wD//wAAAAD/AAAAAAAAAQEAAAAAAAEAAAABAAEAAQEBAAEAAQD//wAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAD/AP8A/wAA/wAAAAD/AP8AAAAAAAAAAQABAAAA/wAAAAAA/wAAAAAA/wABAQEAAP//AAAAAAAAAP8AAAAAAP//AAABAQEAAAAAAP8A/wAAAAAAAP8AAP8BAAAA//8AAAAAAAAAAAABAQEA/v7/AAAA/wABAAEA///9AAD/AAAAAAAAAAEAAAAA/wAA/wAAAAD/AP8AAAABAAAAAAEBAAD//wD/AAAAAQABAAAA/wAAAAAA/wAAAAD//wABAQEAAAAAAP//AAAAAP8AAP8AAAABAQAA/wAA/wD+AAAAAQAAAP8AAP8AAAAAAAAAAAAAAAD/AAABAQAAAAAAAP8AAAEBAQD/AP8AAAAAAAAAAAAAAAAAAAD/AAD/AQAAAAAAAAAAAAEBAAD//wAA////AAAAAQD39vcAAAD/AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8AAAAAAP8AAP8AAAAA/wAAAQEA////AAEAAAAAAAAA/wD/AP8AAAAAAAAAAP//AAAAAAAAAAAA/wD/AAH/AQAAAAAA/wD/AAABAAAA/wAAAAAAAP8AAAAAAP8A//8AAAAAAAAAAP8AAAABAAEBAQD///4AAAAAAAAAAQAAAAAAAAAAAAD//wAAAAAA/wAAAAEAAAAAAAAA////AAEBAQD///8AAP8AAAAA/wAAAQEAAP8BAAD//wAAAP8AAAAAAAAAAAD/AAAAAP//AAAAAAAAAAEA/wH/AAD//wAAAAAAAAAAAAAAAAD/AAAAAAD/AP8AAAAAAAAAAAAAAAH//wAAAAAAAAD/AP/+/wAAAAAAAAAAAAAAAAAAAQEAAAAAAAEAAAD///8AAQEBAP///wABAAEAAAABAAAAAAAAAAAA/wAAAAEAAAAAAP8A/wAAAAEAAQAAAP8AAAD/AAAAAQABAgEA//8AAP///wAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8AAAAA/gAAAAEAAQEAAP///wABAQAA////AAAAAQABAf8AAAAAAP//AAABAQAAAAEBAP///wD/AP8A//8AAAEAAAAAAAAAAQABAAAAAAD///8A////AAAAAAAA//4A////AP///wD///8AAAAAAAAA/wAA/gAA/wH/AAD/AAAAAAAAAAAAAAABAAAA//8AAAEAAAD/AAAAAAAA////AAEBAQD//wAA/wAAAAD/AAAAAAAAAAD/AAAA/wAAAAAAAQAAAP8AAAAAAAAAAAD/AAAAAAAAAAEAAAAAAP8AAAD///8AAAD/AP8AAQAA/wAAAAAAAAABAQAA//8AAAD/AAD//wAAAAAAAQEBAAAAAAAAAAAAAAAAAP8A/wAAAP8AAP4AAAEBAAD/AAEAAAD/AAD/AAAA//8AAAAAAAAAAAD/AAAAAQAAAAABAQD///8AAAAAAP///wAAAAAAAAAAAAABAAAA//8AAQABAAAAAAAAAQEAAP//AAEBAQAAAAAAAAAAAAAAAAAAAAAAAP8AAP8A/wAAAQAAAAAAAAD//wAAAAAAAAABAAAAAAADAwQAAAD/AP//AAAAAP8AAAAAAAEBAAD//wAAAAAAAAAA/wABAQEA//8AAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAP8A//8AAAAAAAD+/gAAAAAAAAAA/wAAAAAAAAAAAP//AAAAAAAAAP//AAAAAAAA/wAAAAD/AAAAAQABAAEAAAD/AAAAAQD/AAAAAAEAAP/+AAAAAAAA////AP8A/wD///8AAAAAAP8A/wAAAQAAAP8AAAAA/wAAAAEA////AAAA/wAAAAAAAf8AAAAAAQD/AAAAAAABAAAAAAD//wAAAAD/AAAAAAAAAAAAAAAAAP//AAAAAP8A/wAAAAAAAQAAAAEAAQEAAP8AAQABAP8A//8AAP8A/wABAAAAAAAAAAD/AAAAAP8AAAAAAAD/AQAAAQEAAAAAAAEAAAAAAP8A////AAAAAQAAAAAAAAD/AAAAAAAAAAAAAAABAP//AAAAAP4AAAAAAP8AAAAAAAAAAAABAAD//wAAAAAA/wAAAAAAAAAAAAAA////AAAA/wAAAAAAAAABAAD/AAABAQAAAAAAAP///wABAAAA/wEAAAAAAAAAAAAAAAEBAAAAAQAAAAAAAAD/AAAAAQAAAAAAAP8AAP8A/wD//wAAAAAAAAAAAAABAAEA//7/AAAA/wAAAAAAAAD/AP7+AAABAQAA//8AAAEBAAD///8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAD//wAA/v//AP//AAAAAAAAAQABAAABAAAAAP8AAAABAAAA/wAAAAAAAP//AAEBAAAAAAEA///+AP///wAA//8AAAAAAAAA/wABAQEA/wAAAAAAAAAA//8AAAAAAAD//wAAAAAA/wEBAAAA/wAAAAAAAAAAAP//AAAA/wAA/wAAAAAA/wABAAAAAAAAAAAAAAAAAAAA/wAAAAEB/wD///8AAAABAAEBAAD///8AAAAAAAD/AAAAAQAAAAAAAP///wAAAAAAAQEAAAD//wAAAAAAAAD/AP8AAAAAAAEAAAAAAAAA/wAAAAAAAQAAAP8AAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAP8A////AP8AAQABAAEAAAAAAAAAAQD/AP8AAf//AAABAAAA/wEAAAH/AAAAAAD///8AAAACAAEA/wAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AP8AAQAAAf8AAP8AAAAA/wD7/PoA/wD/AP///wAAAAAAAAAAAAAAAAD//wEAAAD/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAAAAP//AAAA/wAAAP8AAAABAAD/AAD/AQAAAAD/AAAAAQAAAP8AAAEBAP///wD/AP8AAQABAAEAAAAAAAAA/wAAAAAAAAD///8AAAAAAAAAAAAAAP8AAAAAAP8AAAAAAAAAAP//AAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAP//AAABAAAAAP8AAP8AAAD///8AAAAAAAAAAAD//wAAAAAAAAAAAAABAAAA//8AAAAAAAAA//8AAQAAAP8AAAAAAP8AAAAAAAAAAQABAAAA/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAD/AP///wAAAAAAAAAAAP///wAAAP8AAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8BAAAA/wABAQEAAP//AP8B/wD//wAAAAAAAAAA/wAAAAEAAAAAAAAAAAAA/wAA//8AAAABAAABAAEA/wD/AP//AAAAAAAA////AP//AAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAAAAAAD/AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA//8AAAAA/wAAAAAAAQAAAAABAAAAAAAAAAAAAP///wABAQAAAAEAAP//AAD//wAAAAH/AAEAAQAA/wAAAAEAAAEA/wAAAAEA////AAD/AAABAAAA////AAAAAAAAAQAAAP//AAD//wAAAQEAAAAAAP///wAA/wAAAAD/AAAAAAD/AAAAAAAAAAEBAAAA/wAAAAEBAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAD/AQAAAAAAAAD//wAAAAAAAAAAAAAA/wAAAAEAAP//AAAAAAD/AP8AAAABAAAAAQAAAP8A/wEBAAAAAAAA/wAA/wD+AAEAAQD/AQAAAAABAAD//wAAAAAAAAAAAP8AAAABAQEAAAAAAAAAAAD///8AAP8AAP8A/wAAAAAAAAAAAP///wAAAQEAAAEBAAAA/wAA/wAAAAAAAAAAAQD/AAAAAAD+AAEAAAAAAQEAAAAAAAAA/wAAAQAAAQAAAP//AAABAf8A/wAAAAEAAQAAAAAAAAEAAAD//wD/AAAA/wAAAAEAAAAHBwcA//8AAP///gABAQEAAAD/AAAAAAAAAP8AAAAAAAD//wAAAQAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAD//wAA//7/AAAAAAAAAQAAAQAAAP///wAAAAAAAQAAAP8AAAD///8AAAAAAAAAAAAAAAAA////AP///gD//v4A/wAAAAEAAAD///8AAAD/AP//AAAAAAAAAQAAAAAA/wAAAAAAAAAAAP//AQAAAAAAAP//AAAA/wD/AAAAAQABAP8A/wAA/wAAAAAAAAEAAAAAAAEAAAAAAP8A/wAA/wEAAAD/AAAAAAAAAAAAAAAAAAEA/wAAAQAA/wAAAAAAAAAAAAAAAQAAAP8A/wAAAAAAAP//AAAAAAAAAP8AAAAAAAAAAAD//wAAAP/+AAEBAQAAAP8AAAAAAAAAAAAA/wAA/wAAAAEBAAAA/wAA/wD/AAD/AAD/AAAAAAAAAAAAAAAA//8A/wAAAAAAAAAAAP8AAQABAP///wAAAP8AAAAAAAAAAAAA/v4AAQEBAAD/AwAA/wAA////AAAAAAD/AAAAAQAAAAAAAACyk0JhAAAgAElEQVQAAAAAAQABAP8A/wAAAAAAAAAAAAAAAAACAgMAAAD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAAAA/wAA//8AAAAAAAAAAAAA/wD/AAD/AQAAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAD/AP8AAAABAP///wD/AP8A////AAEAAQAAAQAA//8AAAAAAAAAAQAAAQABAAAAAAAAAAAA////AP8A/wABAAEA/gD+AAD/AAAAAAAAAQEAAP//AQABAf8AAAAAAAH/AAD/AP8AAAEAAAEBAQD//wAAAAD/AAAAAQAA/wAAAAAAAAD//wAAAAAA/wD/AAAAAAAAAAAAAAAAAP8A/wABAAEAAAEAAAAAAAAA//8AAAAAAP///wAAAAAAAAD/AAAAAQD/AP4AAAABAP//AAAAAAAA/wD/AAAAAAABAAAAAAAAAAAAAAAAAAEAAAD/AAEAAAD/AAAA/wD/AP//AAAAAAAAAAD/AAABAQAAAAEAAAAAAAEA/wD//v4A///+AP//AgAB/wAAAAEBAAAA/wAAAAEAAAD/AAAAAAAAAP8AAQAAAAABAQD6+voA////AP///wABAQEA////AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAAAAAAEBAAD//wAAAAAAAAAA/wAAAAEAAQEAAAAAAAAAAAAAAQAAAAAAAQD///8A/wD/AAEAAQAAAAAAAP8BAAEBAAD//wAA////AP///wAAAAAAAAABAAAA/wABAAEA/v//AAD//wAAAP8AAQAAAAAA/wABAAEA/wAAAAAA/wAAAAEAAAEAAAAAAAD///8AAAD/AAD//wD/AQAAAP//AAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAP8AAAAAAP8AAAABAP///wABAAAAAAABAP8AAAAAAP8AAP8AAAABAAAA/wAAAAD/AAAAAQAAAAAAAAAAAAEAAQAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAD///8AAAAAAAEB/wAAAQAAAP//AAAAAAAAAAEAAQABAP///wAAAQAAAAAAAAAAAAAAAAAAAQABAP8AAAAAAP8AAP8AAAEAAAAAAP8A//8AAAD//wAAAwAAAQEBAP//AAD+//4AAAAAAAAAAAAAAAEAAAABAAABAAAA/wAA//8AAP///wAAAAAAAAAAAAEBAAAAAP8AAAD/AAD/AAD+//4AAAAAAAEBAAD///8AAAABAAAA/wABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAD//wAAAAD/AAAAAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAD///8A/wAAAP///wD/AAAAAAAAAAAA/wAAAAEAAAAAAP///wAAAAAAAAD/AAAAAAD///8AAAD/AAEBAQAAAAAAAQAAAP8BAAAA/wEAAAEAAAD//wD///8AAAABAAEAAQD/AAAAAP//AAEAAQD/AAAA/wAAAAEBAQD//wAAAAAAAAABAQABAAAAAP//AAABAQAAAAAA////AAAAAAABAAEA/wAAAAD/AAD/AAAAAAH/AAD/AAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAEBAQD///8AAAEAAAD/AAAAAQAAAP8AAAAA/wABAQAAAAABAAAAAAABAAAA/wEAAAH/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAEAAAAAAAAA/wAAAAAA/wD/AAAAAQEAAAAAAAAAAAAA////AAEBAQAAAQAAAAABAAAAAAABAAAAAAAAAAD/AAD/AP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAIBwgA/v7/AP8A/wAAAAAAAAAAAP///wAAAAAAAAD/AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/AP//AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8A//8AAAAAAAAAAAAAAP//AAABAAAA//8AAQABAAABAAAAAAAAAAAAAAD/AQAAAP8AAAABAAAA/gD//wAA//8AAAD/AAAAAP8AAAAAAAEAAAAAAQAA//8AAAAAAAAAAAEAAAAAAP8AAAAA//8A/wABAAABAAAAAAAAAQAAAAAAAAABAQAAAAABAAAAAAD//wAAAQAAAAAAAAD///8AAAAAAAAAAAD/AAAAAQAAAAABAQAAAP8A//8AAAAA/wAAAAAAAAAAAAD//wAAAAEAAAEBAAD//wD/AAAAAgEAAAAA/wABAQAAAAAAAAABAQD/AAAAAAD+AAAAAQAAAP8AAAD/AAAAAQD///8AAAABAP8BAAABAAAA//8AAAAAAAD///8AAQABAAECAQD/AAAAAQD/AAAAAAAAAAAAAAD/AAAAAAABAAAAAAABAAEBAQAAAP8AAAAAAAAA/wAB/wAAAAEAAAEBAAD/AP8AAQAAAAAAAAAA/wAAAAD/AAAA/wD/AAEAAQAAAAEBAQD+//4AAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wABAQEA////AAAAAAAAAAAA/wAAAAD/AAAAAAAAAAAAAAEAAQAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAQADAwMA+/r5AP8JBQD//wAAAAEAAAAAAQAA//8AAAAAAAAAAQAAAAAAAAAAAAABAAABAAEA/wAAAP8A/wAA//8AAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD//wAAAAAAAAABAQAA/wAAAAAAAAABAQABAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD//wAAAQEAAAAA/wABAAAA/wEBAAD/AAAAAAAAAAAAAAABAAAA/wAAAAD/AAD/AQAAAQAAAAEAAP//AAAAAAAA/wD/AAD/AAABAQEAAAAAAAD/AAD/AAAAAAABAAAA/wAAAAAAAQEAAAAAAAABAAEAAP8AAP8AAAD7/PwAAQABAP///wAAAAEAAAAAAAEBAAABAQAAAQABAP4AAAABAAAAAP8AAP///wD5+foA////AP///wAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AP///wD///8A////AAAAAAD///8AAAAAAAAAAAD///8A////AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAEBAQAAAAAAAQEAAAEBAQAAAQEA7u/uAAABAgAAAQAAAAAAAAAAAAD//wAAAAAAAP8A/wAAAP8AAAD/AAD//wD///8AAP//AAD/AAD//wAA////AAD//wAAAP8AAP//AAAAAAABAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAP///wAAAP8AAAEAAAD/AAAAAAAAAQEAAAD/AAD//wAAAQAAAAAAAAAAAAAAAf8AAP///wAAAAAAAAAAAP8AAAD//wAAAAAAAAAB/wAAAAEAAAABAAD/AAAAAAAAAAABAAAAAAD//wAAAf8AAAEAAAAAAAAAAAABAAAAAAD//wAAAAAAAAABAAAAAQAAAAD/AAAAAAAAAAEA//8AAAAA/wAAAP8AAAAAAAEBAQDv7/AA////AP8AAAAAAP8AAAD/AP///wD/AAAA/wAAAAEBAQAA/wAAAAD/AAAA/wD//v4AAAD/AP///wAAAAAAAAAAAP7+/gD///4A////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAAAAAAAAAAAA///+AP///wD///8A////AP///wAAAAAAAAAAAP///wAA//8AAAD/AP//AAAAAAAAAAABAAAA/wAAAAEAAAABAAEBAAABAAAA5OPkAAAA/wAA/wAAAP8AAAD/AAAAAAAAAAD/AAD/AAAAAAEAAAABAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAAD/AAEAAAEBAAAAAAD//wAAAAD/AAAAAAAAAAAAAAABAAABAQD///8A////AAAAAQAAAAEAAP//AAD//gAAAP8A////AAEA/wAAAP8A////AAAAAAAAAAAAAAEAAAEBAQABAQAAAAABAAEAAQAAAQEAAP//AAD/AAAAAP8AAAD/AAEAAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAAEAAQAAAP8AAAAAAAAA/wAAAP//AAAAAAAAAAEBAAAAAAAAAP8AAAAAAAAAAAD//wAA/wD/AP7//wDi4uMAAQEAAAD//wD//wAAAAAAAAAAAQAA//8AAP8AAAD/AAAAAAAA////AP///wAHCAcA//8AAAAAAAD///8A////AAAAAAD//wAAAAAAAP///wD///8A///+AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A//8AAP///wD///8A////AP///wD///8AAP//AAAAAAAAAAEAAAAAAAAA/wD///4AAAD/AAAAAAABAQAAAQEAAAAAAAAAAAAAwMLDAP/+/gD///8A////AAAA/wAAAAAAAAABAAEBAQAAAQAAAAAAAAABAQAAAAEAAAAAAAAAAAABAQAAAAD/AAEAAAAAAP8A////AP///wAAAAAAAQABAAAAAQAAAAEAAAAAAAD//wAAAAAAAAAAAAAA/wAA//8AAAAAAAABAQAAAAAAAQEBAP8AAAAAAAAAAAAAAAEBAQABAQEAAAAAAP8AAAAAAAEAAAD/AAAAAAABAQAAAQEBAAAAAAAAAAAAAAABAAAAAAABAQEAAQECAAAAAAAAAP8AAAD/AAAAAAABAQEA/wEAAAH/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAAAAAQEAAAAAAAAAAAAA////AP39/QC9v8IAAAAAAAAAAAAAAAAA//8AAAAA/wAAAAAAAAD/AP8AAAAAAAAAAAEBAAABAQD+/v4A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AAEBAQAAAAAA////AP7+/wD///8A/v7/AP//AAD/AAAA/wABAAAAAQAAAAAAsra7ANfX1gAAAQEA/wD/AP//AAAAAP8AAAD/AAABAAAB/wAAAQEBAAEBAAABAAAAAQABAAEBAQAAAAAAAAABAP8AAQAAAAEAAP8AAAD/AAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAQAAAAEAAAAAAP//AAAAAf8AAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAEAAAAAAAEAAQD///8AAAAAAAAA/wAA//8AAAAAAAAAAAAAAAAAAQEAAP8AAAAAAAAAAAD/AAAA/wD//wAA//8AAAAAAQAAAP8AAQAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEA//8AAP///wD9/v0AAAECANfY2QC8wMMAAAABAAEBAQAAAQAAAAAAAP//AAAAAAAA/wAAAAD//wAAAAAAAQABAAEAAAD8/PwA////AP///wD///8A////AP///wAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A////AP///wAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAwMDAP///wD///8A////AAAAAAD/AAAA////AP7+/gD+/v8AAP//AAAAAAABAQAAAAAAAI+SmQD39/kAAQEDAP39/AD+/v4A//7/AAD+/wD/AP8A/v/+AP7+/wD+//8A/wD/AP7+/wD///8AAAAAAP///gD+/v0A/wD/AP8AAAAAAP8AAP//AP///wAA//8A///+AP8A/wD///8A////AAD//gD//wEA//8AAP8AAAD///8A/v7+AP///wD///8A/wD+AP///wD///4A/v7/AP///gD///4A////AP7+/gD///8A////AP///wD//wAA/v7+AP///gD+/v8A/v7+AP7+/gD///8A/wD/AP7+/QD+/v4A////AP8A/wD///8A////AP///gD/AP8AAAAAAP//AAD+//4A/v79AP3+/gABAQIA7e3uAIuNkwABAQIAAQEBAAABAQABAAEAAAAAAAEAAAD//wAAAP8AAAAAAAAAAAAA////AAAAAQAFBAUA////AAAA/wAAAP8AAAD/AAAAAAD+/v4AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAD/AAAAAAD///8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8ABAQEAAAAAAD///8AAAAAAAAA/wAAAAAAAAAAAAEAAAAA/wAA/wEAAP8A/wAAAAEAAQICAM3R1AB8gIMAcm5pABoZGQD+/v4A/v/9AP///wAAAQEAAQAAAAAAAQAAAP8AAAAAAP///wAAAQAAAf8BAP8A/wD///8AAQEBAAAAAAAAAAAAAQEAAP//AAABAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAf8AAAAAAAD//wAAAQEA////AAD/AAABAf8AAP8AAAABAQAAAP8AAAABAAAAAAAAAAAA//8AAAEBAAAAAAEAAAD/AP///wABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAQEBAP///wAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAD//wAAAAEAAAICAwDj5ecAiIuQANnd3wADAwMAAAD/AAAAAQAAAP8AAAABAP8A/wD/AAAAAP8AAAAAAAAAAP8A//8AAAEBAAALDAsAAAAAAP//AAAAAP8AAAABAAAA/wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAQEAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwgIAP///wAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAD/AAAAAf8AAAD/AAAAAQEAAgECAP4CAgDCxcoAycvPAGtoYgA3NTQAGRcVAAICAQACBAUAAAABAAABAAAA//8AAAAAAAEBAAAAAAAAAAD/AAEBAQABAQEA//7/AAD//wAAAQEAAAD/AAEBAQD/AAAAAQEBAAEBAAAAAAAAAAABAAAAAQAA//4A/wAAAAECAgD+/v4AAAABAAAB/wAAAQIAAAEBAP///gABAAIAAAEAAAAAAQAAAAAAAAD/AAABAQAAAAAA//8AAAACAgAAAAAAAAD+AAAAAQABAQAA//8AAAD//wD/AAAAAQEBAAICAwAAAAAA//7/AAAB/wAAAAAAAAAAAP8AAAD///4AAAAAAAD/AAD5+fkA6uztAMDBxACdoqgA/v7/AAMDAwABAAEAAAABAAD/AAD/AP8AAAD/AAAAAAD/AAAAAP8AAP8A/wAA/wAAAAAAAP//AAAGBQYA////AP///wAAAAAAAAD/AAAAAAABAQAAAAAAAP//AAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABgYIAPr69wAA/wAA/wAAAP//AAABAQAAAAAAAAAAAAAAAAEA////AAAAAAABAQAACgoKAAAAAAD/AAAAAAAAAAD/AAABAQAAAAEBAP///wAAAP8A/wAAAAAAAAAA//4AAAD/AAMBAgAAAwQA+fv8AIyQmAD9/v4ADQsJACIgHQAMCwoA/v7+AAAAAAAAAAAAAAEBAAD//wAAAAAAAAAAAAEBAgD///4AAAAAAP3+/gADAwMAAQAAAP///wD///8AAQEBAAAAAAABAQIAAAEAAAEBAQD+/v4AAAAAAAEAAAD+//8A/v39AAICAwABAQAAAQEBAAEAAAD+/wAAAQEBAAEBAAD///8AAQEBAP//AAD+/v4A/wAAAAD//wAAAP8AAQECAAAAAAD///8AAAD/AAEBAQAAAAAAAQEBAAEBAgAAAAAA////AAAAAAABAQEA/v//AP7+/QABAAAABAQEAPHy8wDe4OMA+Pr6AAMCBAADAwIAAwMDAAECAQABAQEAAAEAAAAA/wD/AAAA//8AAAAAAAAAAAAAAAD/AAD/AAD///8AAQEBAP///gAHBwcAAAD/AP///wAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAA//8AAP//AAAICAkAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABgYDAPn5AAAAAP8AAP8AAAAAAAD//wEAAAD/AAAAAAAAAAAA////AAEBAQD///8ABAQEAAAAAAD///8AAQAAAAAAAAD//wAAAQAAAAAAAAAAAQAAAP8AAAABAAABAAEAAAABAAAC/gACAAIAAAAAAAEBAQAB/gEA9vj5ANTX2wD//wAAAQEAAP8AAAAAAP8AAP8AAP8AAAABAAAAAAEBAAD//wAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQAAAAAAAAD/AP8AAAABAQEAAP//AAABAQABAAAAAAAAAP8AAAD///8AAP//AAAAAAAAAQEAAQAAAAAAAQAAAQAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAQEAAAAAAP///wABAAAAAAEBAAAAAAAAAAAAAP//AAABAQAAAAAAAQAAAP8AAAAAAAAAAP//AAAAAAAAAAAAAAAAAAEBAQD/AAAAAQAAAAEBAQABAQEABAQFAAMCAwADAwIAAQECAAEBAQAAAQAAAP8AAP8AAAAAAQAAAQAAAP8A/wAA/wAAAAAAAAAAAAABAQEA/wD/AAAAAAAGBwcA/f3+AAAA/wAAAAAAAAAAAAAAAQD///8AAAABAP//AAAAAAAAAAAAAAAAAAAFBwQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAP///wAAAAAADAsMAP///wAAAP8AAAAAAAAAAQAAAAAA////AAICAgAAAAAA/wD/AAD/AAAAAQEAAQAAAAAAAQABAgAAAgACAAEAAQACAgIA//7/AP8A/wAA/wAAAQAAAAABAAAAAAAA//8AAAAAAAABAQAAAAAAAAAAAAD/AAAAAQAAAP//AAAAAAAAAAAAAAABAAABAAAAAAAAAP8AAAAA/wAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAD/AAAAAQD/AP8AAQEBAAEAAQAAAAAAAAD/AAAAAAD//wAAAAD/AAAAAQAAAAAAAAD/AP8AAAABAAAAAAEBAAEAAAD/AAAAAAD/AAAAAQABAAEAAAD/AAAAAAD/AAAAAP8AAAABAAAA//8AAAAAAAEBAQAAAAAAAAEBAAIBAQABAQEAAQECAAEBAAABAQIAAQEBAAEBAAAAAAEAAAAAAAAAAAABAAEA/wH/AAH/AQAAAQAA/wD/AAAAAAAA/wAAAQABAAEBAQAPDxEA////AAAAAAAAAAAAAAAAAAAA/gAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAA/v8AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA//8BAP///wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8ADAwMAAMDAwD+/v0AAAAAAAAAAAAAAQAAAQAAAP///wAAAAAAAAEAAAD/AAAAAAAAAAAAAAEBAQACAAEA/wL/AP8A/wAAAP8A/wIAAAD/AAD///8AAAAAAAICAAAAAAEA/wAAAAD//wAAAAEAAAAAAAABAAABAAAAAAAAAP//AAD/AP8AAP8AAAAAAAABAQAAAAEBAAD//wD/AAAAAQAAAAABAQAA/wAAAAAAAAAA/wAAAAAAAAABAP8A/wAAAAAAAQABAAABAAABAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP//AAAAAAAAAQEAAAAAAQAAAQAAAP//AAAAAAAAAAAAAAABAAAAAAAAAP8AAAABAAABAAABAAAA////AP//AAABAQAAAQEBAAAAAgABAQAAAQEBAAEAAAD/AAAAAAAAAAEBAQAAAAAAAP8AAC0xy3wAACAASURBVAABAAD/AP8AAP8AAAABAAD//wAAAP8AAAAAAAD/AP8AAQEBAP//AAAMCwsA////AAAAAAAAAAAAAAAAAAEBAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD+/gAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABQUEAAAA/wAAAAAA//8AAAEBAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAQAAAAEADg4OAAsLCwDw8PsAAAAAAP///wABAAAA/wABAAEBAAAAAAAAAQAAAAABAAAAAAAA/wAAAAAAAQABAf8AAAAAAAEAAQAAAAIAAAH/AP//AAD/AAAAAQAAAAEBAAAAAAAAAAAAAAAAAQD///8AAAAAAAEBAAAAAAAAAAAAAP//AAAAAAAA////AAAAAAABAQAAAAABAAABAAAAAP8AAAABAAAAAAAAAgAAAP8AAP///wABAQAAAAAAAAAAAgABAQAAAAABAAAAAAAAAAAA////AAEBAAABAQEA/wAAAP///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAABAQAA//8AAAEBAAAAAAAA/wAAAAEAAQABAAAA/wD/AP///wAAAAAAAAABAAEBAQABAQAAAAABAAAA/wAAAAAAAAAAAP//AAABAQAAAAEAAAAAAAAAAAAAAAAAAP//AAAA//8AAAAAAAAAAAAAAAEAAP8AAAAAAAAQEBAA+fn6AAAAAAAAAAAA//8AAP//AAABAQAAAAAAAAAAAAAAAAAA//8AAAAAAAAICgwAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAwMGAP///wD///8AAAAAAP//AAD//wAAAAD/AP///wD//wAA//8AAP///wD///8AAAABACoqKwABAQAA////AAAA/wD//wAAAAD/AAEBAAABAQAAAAAAAAAAAQAAAAEAAQEAAAEBAAAAAAEAAAEBAAABAgAAAQEAAQEBAAICAgADAgIAAgIBAAEAAQABAQEAAQEBAAEBAAABAgEAAgIBAAEAAgAAAAEAAQEBAAEBAQABAQAAAgIBAAECAQABAQIAAQEAAAEBAAABAQIAAQEBAAECAgACAQEAAQEBAAICAgABAQEAAQECAAECAQAAAQEAAQEBAAEBAQABAQAAAgIBAAEBAgABAQIAAgECAAMCAgACAQEAAQEBAAICAgACAgEAAgIBAAEBAQABAQAAAgICAAIDAgABAQIAAgICAAECAgACAgIAAgEBAAEBAQABAQEAAAABAAEBAgABAQEAAQEBAAEBAQAAAAEAAAAAAAAAAAABAAEAAAAAAAAA/wD/AAAA//8AAAAAAAABAAAAAAAAAAAA/wAAAAAAAAAAAAABAAAAAP8AAAAAADQzMwABAgMA//8AAP//AAD//wAAAAD/AAAAAAD//wAA//8AAP//AAD//wAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAABAcIAAAAAAD//wAA////AP///wD///8A//8AAP//AAD///8A////AP///wD///8A////ACIhIwD//wEAAAAAAAAAAQAAAAAA/wABAP//AAAAAAAA/wAAAAAA/wD/AP8AAAAAAAAAAQABAAAAAQABAAEBAAABAAAAAQAAAAABAAABAQAAAQEBAAABAQABAQIAAAAAAAAAAQABAAEAAQEBAAECAAABAQAAAAAAAAEBAAAAAAEAAAEBAAEAAAABAQAAAQEBAAAAAQAAAAAAAQEBAAIBAAAAAAEAAQEBAAECAQABAgIAAQIBAAEAAQABAAEAAAEAAAEBAAABAQEAAAEBAAEBAQAAAQAAAAAAAAAAAQABAQEAAQEBAAEBAAAAAQEAAAEBAAEBAQABAQIAAQEBAAEBAQABAgEAAQEAAAEAAAAAAAAAAQEBAAEBAAAAAQAAAQEBAAIBAQABAQIAAQEBAAEAAAABAQAAAQEAAAEBAQABAQAAAQEAAAAAAAAA//8AAAAAAP8AAAAAAAAAAQEAAAEAAQAAAAAA////AP///wAA/wAAAAEBAC8vMAD29fYA////AP///wD///8A//8AAP///wD///8A////AP///wD///8A////AP///wADAgQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/gAAAP7+/wAAAAAAAQEAAP//AAABAQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGwAJCQgA+Pj3AP//AAAAAAAAAAAAAP///wAAAAAAAAEBAP8AAAABAAAAAP8AAAABAAAAAQAAAQABAAAA/wAAAQAAAAABAAEAAAAAAAAAAAAAAAABAAAAAP8AAAABAAAAAAABAQAAAQEBAP//AAAAAAAAAQEAAP//AAABAQAAAAEAAAAAAQD///8AAQEAAAEBAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAD/AP8AAAAAAAABAAABAAEAAAD/AAAAAAAAAAAAAQEBAAD/AAAAAAAAAQAAAAAAAAD/AAEAAQEBAAEB/wAA//8AAAAAAAAA/wAAAAEAAQAAAAAAAAAAAAAAAAEBAP//AAAAAP8AAAAAAAAAAQAAAP8AAQEAAAAAAQACAQAA//8AAAAAAAAAAAAAAQAAAAABAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAABAAAA/wAAAAAAAAD/AAAAAAAAAP//AB4eHgD6+vwA//8AAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAEBAAD//wAAAAAAAAEBAAABBggAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAABAQJAP8A/wAAAP8A////AAAA/wD+//8AAAD/AP8A/wD/AP8AAAAAAP8A/wAAAP8AAAD/AAgICAA6OTsAAAABAAAA/wD/AP8A/wD/AP8A/wD/AAAAAP//AAAAAAAAAAAAAAEBAAAA/wAAAAAAAAD/AAAAAQD/AAAA/wD/AAD/AAD//wAAAAAAAAD/AAAAAAAAAQEAAAEBAAAAAAAA////AAAA/wACAQEAAQEBAAEBAAABAQEAAQABAAEBAAABAQAAAAABAAEAAQABAQEAAQEAAAAAAAABAAAAAAEAAP8AAAAA/wAAAP8AAAEAAQAAAAAAAQEBAAEBAQAAAAAAAP8AAAAAAAAAAAAAAAEAAP8AAAAAAP8AAQEAAAAAAQABAQEAAAAAAAAAAAAAAAAA/wAAAP//AAAAAAAA/wAAAAABAAAAAAEAAAABAAABAAAAAAEAAAABAAABAAD/AAAAAAD/AAAA/wAAAAAA/wEAAP//AAAAAAEAAAAAAAAAAAAAAAEA/wAAAP/+/wD//v8A////AP///wAAAP8AAAAAAAAAAAAAAAAAUVBQAAEBAwD///8AAAD/AP///gD/AP8A/wD/AAAA/wAAAP8A/wD/AP///wAAAP8AAAD/AP///wABAwIAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAgUGAAD/AAD//wAA//8AAP///wAA/wAA//8AAAD//wAA//8A////AAD/AAD//wAA////AP///wAtLS4ABAQFAAAAAQAA/wAAAP8AAAD/AAAA/wAAAAABAAAAAAAAAAEAAAAAAAAAAQD/AAAAAAAAAP8A/wAA/wAAAP8BAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAQAAAQEAAAABAAAAAQAAAQAAAAAAAAEBAQABAQAAAQEAAAEBAQABAQEAAQEAAP8AAAAAAAAAAAABAAEBAQD/AQAAAP8AAAEAAAABAQEAAQEAAAAA/wAAAAAA////AP///wAAAAAAAAAAAAEBAAABAAAAAAAAAAABAQAAAQEAAAAAAAAAAAD//wAAAAAAAAAAAQAAAAAAAAD/AAAAAAD+/v8AAP//AAD/AAABAQAAAQEAAAAAAAAAAAAAAQEBAAAAAAAA/wAAAAABAAAAAAAAAP8AAP8AAAAAAAAAAP8AAAABAAAAAAAA//8AAAD/AAAAAAAAAAAA/wAAAAD/AAAAAAAAAAD/AP///wABAgEANTY2APf3+AD//wAA////AAAAAAAA//8AAP8AAP///wD//wAAAP8AAP//AAD//wAA//8AAP///wD/BQoAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQMF+v///wD///8AAAD/AP//AAAAAP8A////AP//AAAAAAAA////AP///wAAAP8A//8AAAAA/wAMDA0ARkVHAAICAgAAAAAAAAEAAAABAQAAAAAAAAEAAAEAAQAAAAAAAAAAAAAAAAABAAEAAAABAAEAAQABAQAAAQEBAAEBAAABAQAAAQABAAEBAQABAAAAAAABAAAAAAABAAAAAQEAAAAAAAD//wAAAAAAAAAAAQAAAAAAAQABAAAAAAAAAQEAAAAAAAAAAAD//wAAAAD/AAAAAAABAAAAAAEAAAEBAQAAAQEAAQABAAAAAQAAAAAAAAAAAAEAAQAAAQEAAQEAAAAAAQABAQEAAAABAAD//wAA/wAA////AP///wAAAAAAAAABAAAAAAABAQAAAAAAAAAAAAAAAAAA//8AAAAAAAD//wAAAP8AAAAAAAAAAP8AAAD/AAEAAAABAQAAAQEAAAEBAQAAAAEAAAEAAAAAAAAAAAEAAAD/AP//AAD/AAAAAP8AAAAAAAAAAAAAAP8AAAAA/wD///8A/wAAAAEBAABSUVEA/Pv+AP///wD///8AAAAAAP7+/wD//wAA////AP//AAD///8A////AP///wAAAP8AAAD/AAAAAAD+Af7+AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACQsDv////wAAAP8A////AAAA/wD///8AAAD/AP///wD///8AAAD/AAAA/wD///8AAAD/AP7+/wD///8ALi4vACAgIQABAQEAAAAAAAAA/wAAAQAAAAAAAAAA/wD/AP8A/wD/AAAA/wAAAP8A/wD/AAABAAABAQEAAAAAAAAAAAAAAAEAAAAAAAEBAAAAAQEAAAEAAAAAAAD/AAAA//8AAAAA/wAAAP8AAAAAAAAA/wAAAAEAAAEAAAAAAAABAAAAAAAAAAABAAAAAAAA/wAAAAAAAAAAAAEAAQABAAAAAAABAAAAAAEBAAAAAAAAAP8AAAEAAAABAAABAAAAAAAAAAABAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAQAAAQEAAAEBAQAAAAAAAAEBAAEB/wAAAQAAAAEAAAAAAAAAAAAA/wEAAAD//wAAAAAAAAAAAAAAAQAAAAAA/wAAAP8AAAAAAP8AAP//AAAA/wAAAAAAAAABAAABAAAAAQAAAAD/AP8A/wD/AP8AAAAAAAAAAAD/AAAAAQABACMjIwAwLzIA+fn5AAAA/wAAAP8A////AAAA/wAAAP8A////AAAA/wAAAP8AAAD/AAAA/wD///8A/v7/AP///wAMCwW7AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAANCkgWBAQDwD///8A////AP///wD///8A//8AAAAA/wD///8A////AP///wD///8A////AAAAAAAAAP8AAgIBAExLTQASEhMAAQABAAEAAAABAAAAAAAAAP8AAAABAAAAAQAAAAAAAAAAAAAAAQAAAAD/AAD/AAEAAAEAAAAAAQAAAQAAAQEAAAABAQABAAAAAP8AAAEBAAABAAAAAAAAAAAAAQD/AAAA/wAAAAABAQAAAAAA////AP8AAAD///8AAAAAAAEAAAABAQAAAQABAP8AAAAAAQAAAAEAAAAA/wAAAP8AAAD/AAEBAAABAQEAAQABAAAAAQAAAAEAAAABAAAAAAD//wAAAAAAAAABAQAAAAAAAAEAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AQABAAAAAQAAAAAAAAAAAAAAAP//AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAAAAAAAQEAAAABAAAAAQAAAAAAAQEAAAEAAQAA/wAAAAAAAAEAAAAAAAAA/wD/AP//AAABAAEAAwMDAFhYWQD4+PkA////AP///wD///8A////AP///wD///8AAAD/AP///wD///8A////AP//AAD//wAAAAD/ABMUFQA6KiRYAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8BAUHAD//wAA//8AAP//AAD//wAA///+AP///wD//wAA//8AAAAAAAD//wAA////AP///wD///8A//8AAAwMDQBTU1QABQUFAAABAQD///8A////AAD/AAD//wAA/wAAAP8AAAD//wAAAAAAAAABAAAAAP8AAQAAAAAAAAABAAAAAAAAAAAAAAABAQEAAQIBAAAAAQAAAAAAAQEAAP8A/wAA/wAAAQAAAAEAAQAAAAAAAAEBAAEAAAAAAAEAAAABAAAAAQAAAAEAAAAAAAEAAAAA/wAAAP8AAP8AAAAAAAAAAAABAAAAAAAAAAAAAAEAAAEBAAAAAQAAAAAAAAD/AAAAAAAA/wAAAAEAAQABAQAAAP8AAP//AAABAAAAAAEBAAEBAAAAAAEAAP8AAP8A/wD///8AAAAAAAEBAQAAAQAAAAAAAAAAAAAAAP8A//8AAP8AAAD//wAAAP//AAAAAAABAAAAAQEAAAAAAAAAAAAA////AAAAAAAAAQEA/wAAAP//AAD///8A//8AAAABAAACAgIAbGxtAAEABAD//wAA//8AAP///wD///8A//8AAP//AAD///8A////AP///wD//wAA//8AAP///wD///8A//8AAAgNEAABAQHwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAQKEP3///8AAAD/AAAA/wAAAP8AAAAAAAAAAAD///8A////AP///wD///8A//8AAP///wD//wAAAAD/AP///wAVFBUAYF9hAAoJCwABAQIAAAAAAP///wD///8AAP8AAAD/AAAAAAAA/wABAAD/AAAAAAAA/wAAAAAA/wD///8A/wAAAAD//wD///8AAP//AP8A/wD/AAAA//8AAAEAAQABAQAA/wAAAP///gAAAAAAAAAAAAAAAQABAQAAAQEAAAABAAAAAQAAAAEAAAAAAQAAAP8AAAD/AAAAAAD/AAAAAAD/AP///wD/AAAA//8AAP//AAAA/wAAAAD/AAAA/wAAAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAP//AP//AAAAAAAAAAEAAAEAAQABAQIAAAABAP///gAA//8AAAAAAAAA/wAAAAAAAQEAAAEAAAAAAAAAAAD/AAAAAAD///8A//8AAAAAAAAAAAAAAAABAP8A/wAAAP8AAAAAAAAAAAAA/wAAAQAAAAQDAwBxcHEAEBARAP39/QD///8A////AAAAAAAAAAAA////AAAA/wAAAAAAAAAAAP//AAD///8AAAD/AP///wAAAP8AAAD/AAEMD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEHA5UJCQgA////AP///wD///8A////AP///wAAAP8AAAD/AP///wAAAP8AAAD/AAAA/wAAAP8A////AAAA/wD///8AFBQVAGBfYAAZGRoAAQABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AP///wD//v8AAP8AAAABAQAAAAAAAP//AP///wD///8A////AAD//wAA/wAAAAAAAAAA/wAAAAAAAP//AP//AAD///8AAP8AAAAA/wAAAAAA/wAAAAD/AAAAAAAAAP//AAAA/wAAAAAAAAAAAAAA/wAA/wAA////AP8AAAAA/wAAAP8AAP8A/wAAAP8A/wAAAP//AAD//wAAAAABAAAAAAAA/wAAAAAAAAAAAAD///8A////AP8A/wD/AP8AAP8AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAP8AAAAAAAAA//8AAAD//wD/AAAA/wD/AP///wD+//8A////AP//AAD//v8AAP8BAAEBAQABAgIAGBkYAHRzdgAICAoA+vn6AAAA/wAAAP8AAAD/AP7+/wD///8AAAD/AP///wD///8A////AAAA/wAAAP8A//7/AAAA/wD///8ADw4QAEU1KiIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9wtD/3dfNAAAAAAAAAAAAAAABAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAD/AAAAAQAAAP8AAAAAAAAAAQD8/PoAxcbFAMrKyQD+/v0A/wAAAAEAAAD//wEAAAD/AAABAAABAAAAAAEBAAAAAAAAAP8AAP8AAP8AAAABAAEAAAEAAAD/AAABAQAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAEBAAD/AAAAAAAAAAEAAAAA/wAA/wAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wAAAAEAAQAAAAAAAAAAAAAAAAD/AP8AAAAAAAEAAAD//wAAAAD/AAAAAQAAAQAAAAD/AAAAAQABAAAA//8AAAAAAAAAAAAAAAD/AP//AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAEBAgA+PD0AQ0REAPf2+QD///4AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAHyUoAEdCOwEAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgrZ////JwAAAQAAAP8AAQEAAP//AAAAAP4AAQEBAP///wAAAAEAAQH/AAAAAAD///8AAAAAAAAA/wAAAAAAAQEAAP///gAEBAUAQD9BACopKwC+v7wA4+PjAP7+/QD/AP8AAP8AAAD/AAAAAQAA//8AAAD//wAAAQAAAAAAAAD/AAD/Af8AAf8BAAABAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAA//8AAAEBAP//AAAAAAAAAAAAAAAAAAD/AAAA/wD/AAEAAQD//wAAAQD/AP8AAAAA/wAAAAEBAAEAAAAAAAAAAAAAAAAAAAAA/wAA/wEAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAQAAAAAA/wAAAAEAAAAAAAAA/wABAAAAAAAAAP//AAAAAP8A//8AAAEB/wAA/wAA/wAAAAEA/wD/AAAA/wAAAAEAAQAAAAAA//8AAAAAAAABAAEA/wD/AAEBAQAAAAEAKSknAEhHSQALDA4A9fT3AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD+AAAAAQAAAAAAAQH/AP//AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEBAQD//wAA+wwO3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAA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//wABAQEA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAQEAAP//AAABAQAAAAAAAP///wABAQEA////AAEBAQD//wAAAQEAAP//AAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAQEBAP//AAABAQAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAA//8AAAAAAAAAAAAAIiovAEhBNwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6yz/+vp5gAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFxoAVVRNAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyInpvv69lrv7u8AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABESEQALHyLZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7M2tjo2c8n7u7uAAAAAAABAQEA////AAAAAQABAQAA////AAAAAAABAQEAAAAAAP//AAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAEBAQD///8AAAABAAAA/wAAAAEAAAAAAAAAAAABAQAA//8AAAAAAAAAAP8AAAABAAEBAAD///8AAAABAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAAABAAAA/wAAAAEAAAD/AAEBAQD//wAAAQEAAP//AAAAAP8AAQEBAP//AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAEBAAD///8AAAABAAAA/wAAAAAAAAABAAEBAAD//wAAAAD/AAAAAQAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEBAP///wAAAAEAAAD/AAAAAQAAAP8AAAABAAAA/wAAAAAAAAABAAEBAAD//wAAEhIRABAnLNlKNCsoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+zNrY7d/WJ+no5wD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAP//AAABAQAAAAAAAP//AAABAQAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAAA//8AAAEBAAD//wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAA/wABAQEAAAAAAAAAAAAAAAAA//8AAAAA/wAAAAEAAQEAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAA//8AAAEBAAD//wAAAQEAAAAAAAD///8AAAABAAAA/wAAAAEAAAAAAAEBAAAAAAAAAAAAAP//AAAAAAAAAAD/AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGRoADiMkpkgxK1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm9yv/a1cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQrMgBJQzgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9xdb/5t7TAO/u7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAJCggAHCw2/0k5LAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwM7e0vTq5S3d2NIAAAD/AAAAAAABAQEA//8AAAAA/wAAAAAAAAAAAAAAAAABAQEA////AAAAAAABAAEAAAEAAAAAAAAAAAAA////AAAAAQAAAAAAAQEAAP//AAAAAAAAAAAAAAAA/wAAAAAAAQEBAAAAAAAAAAAA////AAEBAQD//wAAAQEAAP//AAAAAP8AAQABAAABAAAAAAAA////AAEBAQAAAAAA////AAAAAAAAAAAAAQEBAP//AAABAQAA//8AAAEBAAD//wAAAQE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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHgSZDAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//c5QYE8FtKygAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/images/light/Weather.png b/arma/client/addons/phone/ui/_site/images/light/Weather.png new file mode 100644 index 0000000..ed52344 Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/Weather.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/iCloud.png b/arma/client/addons/phone/ui/_site/images/light/iCloud.png new file mode 100644 index 0000000..54add2f Binary files /dev/null and b/arma/client/addons/phone/ui/_site/images/light/iCloud.png differ diff --git a/arma/client/addons/phone/ui/_site/images/light/iCloud.png.b64 b/arma/client/addons/phone/ui/_site/images/light/iCloud.png.b64 new file mode 100644 index 0000000..fd1e8b8 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/images/light/iCloud.png.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kGBxESDIOu2EwAACAASURBVHgBAECAv38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAACAAAAAwAAAAIAAAAB8AAAAAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAA8AAAAAAAAAAAAAAA4AAAAAAAAADwAAAA4QAAAPAAAADQAAAA8AAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAAFAAAABPAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAA0AAAALEBAQGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAF8AAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAwAAAAIEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAABvAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////UAAAAJ8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAIABAQGhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+PAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQEBcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAL8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAvwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAMQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///88AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AEBATEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////jwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMP///48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRAQEBsAAAAAAAzm5irgAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yAAAAC/AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIQEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IAAAAN8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////3wAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAhAQEB8AAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///xAAAADvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQEBAfAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjs/QDe7/4A3/D9AODw/QD1+QAA6vX9AP8AAQAAAP8AAQABABULAQAWCwIACwUBACwWAwAgEAMAKhYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjt/QDD4fwAy+b8APT6/gD+/gAA/v8AAP//AAD/AAAA/wABAAAAAAAAAAEA/wAAAOr1/wDr9f0AAQAAAMzm/AABAQAADgcBADMZBAA/IAUAKRUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKhsZZAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///98AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb8/wC93/wAvN76APL6AAD9/v8A/v8AAP7+/wD+/wAA/v4AAP//AAD+/wAA/wAAAAD//wD/AAAAAQABAAAAAAABAQAAAQAAAAEAAAABAQAAAgEAAAIBAAACAQAAFgsCAFEpBgA9HwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBASEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///98AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAweL8ALLa+gDz+v8A/f7/AP7/AQD9/v8A/v8AAP7/AAD+/gAA/wAAAP7+/wD//wAA//8AAP4AAAAA/wAAAQAAAP8A/wABAAEAAQEAAAEAAAABAf8AAgABAAEBAAACAQAAAgEAAAMBAQAWCwEAUCkGADseBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBASEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///98AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO74/wCm1PkA2O7+AP3+/wD9/gAA/v8AAP3+AAD9//8A/v4AAP7/AAD+/wAA//8AAP7//wD//wAA//8AAP//AAD/AAAAAP8AAAAAAAAAAAAAAQAAAAIBAAABAAAAAQEAAAIBAAACAQAAAgEAAAEAAAADAQAAAgEAABYLAgB0PAoAFAoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBASEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP///+8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw+T8ALje+wD0+v8A/f4AAP3+AAD9/v8A/v8AAP3/AAD+/gAA/f//AP7/AAD+/gAA//8AAP7//wD//wEA/v//AAAAAAAA/wAA/wAAAAAAAAAB/wAAAAAAAAEAAAABAQAAAQAAAAICAAACAAAAAgEAAAIBAAACAQEAAgEAAAMBAAANBgEATSgGAEIiBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AEBAREAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC84PsAuuD8APz+/wD9/QAA/f8AAP3+AAD9//8A/f8AAP7+AAD9/v8A/v8AAP7/AAD+/wAA/v8AAP/+/wD/AAAA//8AAP//AAD/AAAAAP8AAAAAAAAAAAAAAQAAAAD/AAABAQAAAQD/AAIBAQACAQAAAgEAAAIBAAACAAAAAwEBAAEBAAADAgAAAwEAAE0nBgBLJwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3a+wC84fwA/wAAAAAAAQD/AQAA/wAAAP8AAAAAAAAAAAAAAP8AAAAAAQEAAAEBAAAAAAAAAAAAAAAAAAECAQAAAQAAAAEBAAEBAQABAAAAAQEAAAEBAAAAAAAAAAAAAAABAAAAAAAA/wABAP8AAAD+/wAA//8AAP//AAD/AAEA/gD/AAAAAAD/AAAA/wAAALXa+gCj0PkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr9v7AM7q/AAAAQAA/wAAAP8A/wAAAAAAAAAAAAABAAD/AQAAAAAAAAABAAAAAP8AAAAAAAABAAAAAQAAAAAAAP8A/wABAAEAAAD/AP8A/wAAAQAA/wEAAP8AAAAAAQAAAAEAAAABAAAAAQAAAQEAAAAAAAAAAAAA/wABAP7/AAD/AP8A//8AAP8AAAD//wAA/v8AAP7/AADI4/sApNH5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA4/wAz+v9AP8AAAD/AAAA/wAAAP8AAQD/AQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQEA/wD/AAAAAAABAAAAAAEBAAAAAQD/AAAAAAAAAAABAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAABAAABAQAAAAD/AAABAQD//wAA/wAAAP7/AAD//wAA//8AAP8AAAD/AAAAyeP8ALfb+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMno/QDB5fwA////AP8AAAAAAAEAAAAAAAABAAAAAAEA/wAAAAABAAAAAQEA/wEAAAAAAAAAAAAAAQEBAAABAQD/AAEAAAH/AAABAAABAQAAAQEBAAEBAQABAQEAAAEBAAEBAAAAAQAAAAEAAAEBAQABAQEAAAAAAAAAAAD/AAAA/wEAAAAA/wAAAQEAAAABAP8AAAD/AAAA/wAAAP//AAD//wAA/v8AALfa+wDB4PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Pn/AMHl/AD+/wAA/wAAAP8AAAD+AP8A/wAAAP///wD/AAAA/wAAAP//AAAAAAAAAAABAAABAAD/AAAAAAAAAAAAAAAAAQAAAQABAAAAAAD/AAAA/wEAAAAAAAD/AQAAAAAAAAABAQAAAAAAAQEBAAAA/wAAAP8AAQABAAAAAAABAQAAAQAAAAAAAAD/AP8A/wD/AAAAAAD/AAAA//8AAP7/AAD+AAAA/wD/AP//AAC42/oA7vf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApdn6APj8/wAAAQAA/wEBAAAAAAD/AAAA/wEAAAAAAQAAAP8AAAEAAAABAAD/AAAAAAAAAP8AAAABAQAAAAEAAAABAAAAAQAAAAEAAAEBAAABAQAAAQEAAAAAAAAAAAAAAQEAAAAAAAABAQEAAAAAAAABAAD/AQAAAAH/AAABAAAAAQEAAAEBAAABAQABAAAAAAEAAAAA/wAAAAAAAAEAAAAAAAD//wAA/v8AAP4A/wD1+v4AptL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/P8AAOX2/wDs+f4A8foAAPP7/wD9/gAA/f8AAA0FAAAJAwAAGwoCABcJAQDf8v4A7/n/AP8AAQD///8A//8AAP8AAQD/AQAAAP//AP8BAAD//wEAAAD/AP8AAAD/AAAA/wEAAAAAAAD//wAA/wEAAAD/AAABAAAA/wAAAAAAAAAAAQAAAP8AAAEBAAAA/wAA/wAAAAABAAAAAAAAAP8AAAAAAQABAP8A/wAAAAEAAAAAAP8AAAABAAABAAAAAAEAAAD/AAABAQAAAQAA/wAAAP8BAAAAAQAAAAEAAP7/AAACAAEA2+39AMXh/AA7HwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj9AADd9P4A5Pb+AP7/AAD+/wAA/f4AAP3/AAD9//8A/v8AAO35AAD9/gAA3vL8APz+AAD0+QAA/wABAP4A/wD+AQAA/wAAAP8AAAAA//8A/wAAAAAAAAAAAf8A//8AAP8AAAAAAAAAAAEAAAH/AAAAAQAAAf8AAP8BAQD///4AAAEBAP8AAAAA/wAAAAAAAP8BAAAAAAAAAQAAAAD/AAAAAAAAAAEAAAAAAAAAAAEAAQAAAAAA/wAAAAEA/wD/AAIAAQD/AQAAAQABAP8AAAAAAAAAAAEAAAAAAAD/AAAAAAABAAEA/wD/AAAA//8BALXa+gAyGwMACQQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4/b/AMTr/ADk9v8A/wABAP7/AAD9/gAA/QAAAP7/AAD+/wAA/QABAP3+AAD+/wAA/v8BAPj8AAD1/P8A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP4AAAD//wAAAAAAAAABAAAAAQAAAAAAAP8AAAAAAAAA/wAAAAAA/wABAQEAAAD/AAEAAQAAAQAAAAEBAAEAAAAAAAAAAAAAAP8BAAD/AP8AAAAAAAAAAAAAAAAAAAEAAAAAAQD/AAAAAQEAAP8AAAAAAAAAAAAAAAEBAAAAAQAAAAAAAAABAAAAAAAA////AP8AAAAAAAAA/wAAAPb7/wDC3/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz/AADO7/4A2PL9AP3/AAD+//8A/f7/AP3/AAD9AAAA/f4AAP3//wD9AAAA/f7/AP7//wD8/v8A/f//APX8/wD/AAAA/gD/AP8AAAD/AAAA/gAAAP8AAAD/AAAA/v8AAAAAAAD/AQEA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAABAAABAQD/AAAAAAEBAAABAAAAAAAAAAD/AAABAAAAAQAAAAEAAAEAAAABAQEAAAEAAAAAAAAAAQAA/wAAAAEBAAABAQAA/wABAP8AAAAAAAAA/wAAAP8AAAD//wAAAAABAAD/AAAAAAEAAAEAAAABAQAAAQAAAQAAAP8AAADE4vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3u/QDt+f8A/v8AAP0AAAD9/wAA/f8AAP3/AAD9/wAA/P//AP3/AAD9/wAA/v8AAP3/AQD9/wAA+f0AAP3+AAD+//8A/gAAAP4AAAD+AAAAAAEAAP7//wD+AAAA/wEAAP4AAAD/AP8A/gAAAP4AAQAAAAAA/wAAAP8AAAD/AAAA/wH/AP///wAAAAAA/wAAAAAAAAAAAAAAAAEAAP8AAQAAAQAAAAAAAAABAQD/AAAAAAAAAAABAAD//wAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAD/AAAAAAD/AAABAQAAAP8AAAAAAAAAAAD/AAAA/wEAAAAAAAD0+f8A3e79AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe14oAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2vP/APL7AAD+AAAA/QAAAP7/AAD+/wAA/f8AAP3/AAD9//8A/v8AAP7/AAD+/wAA/f8AAP7//wD/AAAA+P3/AP4A/wAAAQAAAAAAAP8AAAAAAAAA/wD/AAACAAAAAAAA//8AAP8AAAD/AAAAAAAAAAAA/wD/AAAA/wAAAAABAAABAgAAAAAAAAEBAAAAAQAAAQEBAAABAAAAAQEAAAAAAAEBAAAAAAAAAAEAAAAA/wABAQEAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAEAAAAAAQAAAAEBAAAAAAD/AQAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAQAAy+X8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn9/8A4fX+AP4A/wD+//8A/v8AAP7+AAD9/wAA/gAAAP7/AAD+/wAA/wAAAP4AAAD//wAA/gD/AP4AAQD9/wAA/P8AAAAAAQD/AAAA/wAAAAEBAAD/AAAAAAEBAAEAAAAAAQAAAQIAAAEBAAABAAEAAQEAAAEBAAABAQAAAQEAAAEBAQAAAAEAAQABAAAAAAABAQEAAQD/AAEAAQAAAAAAAQEBAAEAAAABAAAAAAAAAAABAAABAf8AAAEBAAEBAAAAAQAAAQEAAAABAAAAAQAAAQEAAAAAAAABAQEAAAAAAAAAAAAAAAAA/wD/AP8AAAAAAAEAAAEBAAAAAAD/AAAA/wAAAP8BAAD/AAAA0+n9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADb9P4A/QD/AP3/AAD9/wAA/v8AAP3/AAD9AAAA/f8AAP7/AAD+/wAA/f8AAP3/AAD8/wAA/f4AAP3//wD7/wAA/f4AAP4AAAD//wAA/wAAAP7/AAAAAAAAAAAAAP4AAAAAAQAA/v8BAP8AAAD/AQAA/wEBAP8AAQD/AAAA/wAAAAAAAAD/AAAAAAEAAP8BAQAAAQAA/wAAAAAB/wABAQAAAQEAAP8BAAAAAgEAAQEBAAEAAAAAAAAAAQEAAAABAAAAAAEAAAAAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEBAP8AAAAAAAAA//8BAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAD/AAAAAAAA9/z/AN/v/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOX3/wD1/P8A/f8AAP3/AAD9/gAA/f8AAP0AAAD+/gAA/v8AAP0AAAD9/wAA/v8AAP7/AAD+/wAA/f8AAP7/AAD9/gAAAAEAAAAAAAD/AAEA//8BAP8AAAD+AAAA/gAAAAAAAQAAAAEAAAEAAP8AAAD//wAA//8AAAAAAAAAAAAAAAEBAP8AAQAAAAAAAAAAAAAAAAD/AAAAAAEBAP8AAAD/AAAA/wAAAAEBAAAAAAAA/wAAAAABAQD/AAEA/wD/AAAAAQAAAf8AAAEAAAD/AAAAAQAA/wAAAAAAAAD/AAAAAAAAAAABAQD/AAAAAQEAAAABAAAAAAAA//8AAAAAAAD/AAAAAAAAAP8AAAD/AAEA/wAAAOPx/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT2/gD+AAAA/v8AAP3+AAD9/wAA/f8AAP7/AAD9AAAA/f//AP3+/wD+AAEA/f8AAP3/AAD9//8A/wAAAP0AAAD7/wAA/v8BAP8AAAD+AAAA/wEAAP8AAQD/AAAAAAAAAP4AAAD/AAAAAAAAAAAAAQD/AQAAAAEAAP8BAAAAAQEA/wAAAAEBAAAAAAAAAAAAAAABAAABAAAAAQAAAAEBAQABAQEAAAABAAAAAAAAAAAAAQEAAAABAAAAAQAAAAEBAAABAAAAAAAA/wAAAAABAAAAAAAAAAAAAAABAQAAAQAA/wAAAAAAAAAAAQEA/wAAAP///wD/AAAA/wEAAP8AAAD/AAAA//8AAP8AAAD/AAAA/wABAOXz/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/4AAOv5/wD+AAAA/v8AAPD8AQDx/P8A+/8BAPr+/wAA/wAAAwABAAUC/wAGAQAABgAAAP3//wD+/wAA/P8AAP7/AAD+/wAA/wD/AP8AAAD/AAAA/wAAAP8AAAD//wEA/v//AAEBAAD+/wAAAAEAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAQAAAP4AAAAAAQEAAAD/AAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAQABAP8A//8AAAAAAAABAQAAAP8AAAAAAAAAAQEAAQAAAAAAAAD/AP8AAQAAAP//AAABAQAAAAEAAP8AAAAAAAAA/wAAAAAAAQAAAAAA//8AAP8BAAD/AAAA/wABAP8A/wD//wAA/wAAAOXy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7fr/AN33AQDn+QEA8fwAAPv+AAAAAAEAAQD/AAEAAQAAAAAAAQAAAAAAAQAAAAAAAP8AAAwCAQAPA/8ACAH/AAIAAAD+/wAA/wABAP7//wD/AAAA//8AAP8AAAAAAQAAAAABAP7+/wD/AAAA/wAAAAEBAAD//wEA/wD/AP8AAAAAAAAA/wEAAAAAAAD/AAAAAAABAAH//wD+AAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQEAAQAAAP8A/wAA/wAAAAEAAAD/AAAAAAAA/wAAAAEAAAAAAAEA/wAAAAEBAAD/AAAA//8AAAIAAAAAAQAA/gAAAAMBAAD+AAAAAQAAAAEAAAD//wAA/wEAAP8AAQD/AP8A/gABAPb7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO76AAC+7f4Axu4AAPP8AQAA/wAA/gAAAAEBAAAB/wAAAQAAAAAAAAABAAAAAAAAAAEAAAD///8AAAAAAPT9AADz/QEAAQABAAwC/wAK//8AAQAAAP4AAAD/AAAA/gAAAP8AAAD/AAAA/v8AAP8AAAAAAQAAAP8AAP8BAAD/AAAAAAEBAP///wD/AQAA//8AAAAAAAAAAAAAAAAAAAAAAQAAAf8AAQAAAP//AAAAAAAAAAEAAAD/AAABAAAA/gAAAAAAAQAAAf8AAAAAAAEBAAD//wAAAQAAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAABAAAAAAAAAP//AAAAAQAAAQAAAP8AAAD/AAAA/wAAAP7/AAAAAQEAAv8AAOz3/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3/QAAv+3/AL/r/wD1/QAA/gAAAAAAAAD+AQAAAP//AAEAAQAAAP8AAAAAAAAAAAD/AAAAAQAAAP///wAAAAAAAP8AAP8AAAABAAAA////APP9AADv/gEADQH/AAoAAAD+/wAA/gAAAP7/AAD+/wAA/v//AP8AAQD9/v8A/wAAAP4AAAAAAQAA//4AAAABAQAA/wAAAAD/AP8AAAAAAAAAAAEAAAAAAAAA/wEAAAEAAAAAAAABAP8A/wAAAAAAAAD//wAAAgEAAP4AAAAA/wEAAAAAAP8AAAAAAP8A/wAAAAEBAAD//wAAAAABAAEBAAAA//8AAAEAAAD/AAD+/wAAAgEAAP4AAQD+/QAA//0CAP7+AAD/AAEA/v0BAAD/AAAA/wAABAMAAAIAAACv1f4AKRUBACgWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO76AACQ3/4A7PkAAP8BAAD//wAA/f//AP3/AQABAP8AAQAAAAEAAAABAAAAAAAAAAAAAAABAAAAAAD/AAAAAAAB/wAA/wAAAAD/AAD/AP8AAP8AAP//AAD+/wAAAP8AAAEAAAAQAf8AAP8AAP3+/wD+/wAA/v8AAP7+AAD+AAAA////APz+AAD+/wAA//4AAP4AAAAA/wAA/v//AP//AAD/AAAA//8AAP//AAD/AAAAAP8AAP///wAAAAEA////AAAAAAD//wAA/wAAAAD/AAAAAAAAAP8AAP8AAAABAAAAAP//AAAAAQAAAP8AAf8AAAEBAAAA/wAAAgEBAAAA/wAA/gEA/P0BAP//AQAA/wAAAQABAAAAAAAA/wAAAP8BAAH/AAD//wAAAAAAAAH/AQAJBAEAAf8AABMKAQAoFQEAUS0CABULAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/UAAJrh/gD1/AAA/gAAAP///wD/AAEA/v//AP4AAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAP8AAQAAAAD/AAAAAAAAAAAAAP///wAAAAEA////AAEAAQD9/gAA////AAD/AAAAAP8ACwD/AAP/AAD+/wAA/f8AAP//AAD+/wAA/v8AAP7+/wD9/wAA//8AAP//AAD/AAAA//8AAP//AAD///8A//8AAP8AAAD//wAA/wAAAAD/AAD/AAAAAP8AAP8AAAAAAAAAAP8AAP///wAAAAAA//8AAAD/AAABAAAA/wAAAAH/AAABAAAA/wD/AAEAAAABAAAAAP8BAP3+AQAA/wAAAP8BAAAAAAAA/wAAAQABAAD/AAAA/wAAAAAAAAEAAQAA/gAA/wAAAAH/AAAJAwIAAP8AAAD/AAD/AAEAAP4AAEYnAQBIKAIAFQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH7/8AouT/AP//AAD/AAAA/wAAAP///wD//wAA/wAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAD/AAEAAQD///8AAQEBAAD//wAA/wAAAAEAAP//AAAAAP8A//8AAAH/AAD9/wAAAAAAAP7+AAAAAP8A//8AAAkA/wAD/wAA/v4AAP8AAAD+/gAA/wAAAP3+/wD+/wAA/wAAAP7/AAAA/wAA//8AAP8AAAD//wAA//8AAP7//wAAAAAA//8AAAEAAAD+/wAAAAAAAP//AAAAAAAAAP8AAP8AAAAAAAAA////AAEAAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAEAAAD//wAA/f4AAAEAAAAA/wEAAQABAAD/AAAAAAAAAf8AAAAAAQAA/wAAAAAAAAH/AQAA/wAAAAAAAAH/AQAIAgAAAAABAAD/AAD//wAAAP8BAAD/AAATCgAAZzkCACkXAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT3AACE2/4A/wAAAAAAAAD+//8AAAAAAP4AAQAA//8AAQAAAP8AAAABAAAAAQEAAAH/AAAAAP8AAAAAAAAAAQABAAAAAP8AAAD//gAAAQAAAAABAP//AAAA//8A/wAAAAD/AAD+/wAA//8AAP///wABAAEA////AAH/AAAHAP8AAP4AAP8AAAD+/wAA//8AAPz+AAAA/wAA/v//AP8AAAD//wAAAAAAAP7/AAAA/wAA/v8AAAAAAAD//wAA/wD/AAD/AAAA/wEA/wD/AAD/AAD/AAAAAAAAAP//AAAAAAAAAAAAAP//AAABAP8AAP8AAP8AAAABAAAAAP8AAP/+AQAAAAAAAP8AAP8AAAAB/wAA//8BAAEAAAAA/wAAAQAAAAD/AAAA/wEAAAAAAAD/AAABAAAAAP8BAAEAAAAHAgEAAP8BAAD/AAAAAAAAAP8BAAD/AAD//gAA//8AAFIuAgBTLgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7foAAJbh/gD+AP8A/v//AP7//wAAAAEA/f8AAAAA/wAAAAAAAAAAAAEAAAAAAAAAAP8AAAAAAAABAAEAAAABAAEA/wAA//8AAAD/AAABAQAAAAAAAP//AAAA/wAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAQD/AAAA/wAAAP8BAQD5AAIA/wIBAP8BAAD/AAAA/wAAAAAAAAD/AAAA/wEBAAABAQD/AAEA/gAAAAAAAAD/AQAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAQAAAAABAP8BAAABAQEAAAAAAAABAAAAAAAAAAAAAAEBAAAAAAEAAAEBAAEAAQAAAAEA/wAAAAEB/wD/AQAAAAEBAAAAAAD/AAAAAAH/AAAA/wAAAQAA/wAAAAABAAAAAQAAAAAAAAABAQAAAAEAAAH/AAEBAQAAAAEA/wD/AP8A/wAAAAAAAAD/AAAA/wAAAQAAAAEAAK7S/gCt0f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsun+AOz5AAD//wEA/wAAAP3/AAD9/wAAAAABAAD/AAABAAAAAQEAAAEBAAABAAAAAAAAAAAA/wD/AAAAAf//AAD/AAAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wEAAAABAAABAQAAAQEBAP8AAAD9AAAA+wABAP7/AAD/AAAA/v8AAAAAAAD/AQAAAAAAAP//AAAAAQAAAAABAP8AAQD//wAA/wEAAP8BAAAAAQAAAAAAAAABAAD/AAAAAAEAAAABAQD/AAAAAAEBAAAAAAAAAQAA/wAAAAAAAAAAAQAA/wAAAP8AAAAAAAAAAAEBAP8BAAABAP8AAAH/AAEBAAAAAQAAAAAAAAABAAAAAQAAAAEAAAABAQAAAQAAAQEAAAAB/wD/Af8A/wAAAAEB/wD/AP8AAAEBAAABAAAAAAAA/wAAAP8BAAAAAf8AAAEAAAABAACu0/4At9f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADG7/8Axe4AAP0A/wD+//8A/f8AAP4AAAD/AP8AAAD/AAAAAAAAAAAA//8AAAAAAAAAAQAAAQH/AAAAAAAAAP8AAAAAAAAAAAABAQAAAP8AAP//AQD/AAAAAQABAAAAAAAAAAAA//8AAP//AAABAAAAAf8AAAAAAAD//wAAAP8AAAEAAAABAAAA/AAAAP8AAQAAAQEA/wABAP8AAAD/AAAA/wAAAAABAAAAAAAAAAAAAAAAAAABAgEAAAEBAAEBAQD/AQAAAAEAAP8BAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAEBAQAAAAEAAAEBAP8AAAD/AAAAAAAAAAABAAD/AQAAAQAAAAAAAQAAAQEA/wD/AAEBAAAAAQEAAAEAAAABAAD/AP8A/wAAAP8A/wAAAAAA/wEAAAAAAAAAAAAAAQEAAAAAAAD/AQAA/wD/AAAAAAD/AAAA/wEAAP8AAAD/AAAAAAD/AAABAAD/AQAAo8z+ANbp/wAAfMyxTAAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIC/fwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALHo/wD//wAA//8AAP4AAAD/AAAAAQAAAAEAAAABAAAAAAAAAAABAAABAQAAAP8AAAD//wAA/wAAAAAAAAAAAQABAQAAAAAAAP//AAAAAQAAAAEAAAAAAQD/AAAA//8AAP8AAAABAAAAAAAAAP8AAAAAAAAAAQAAAAEAAAAAAQAAAAAAAP8AAAAAAP8A+wEAAP7+AAAAAAAA/wEBAAAAAQAAAAAA/gAAAP8AAAAAAQAA/wEAAP7/AAAAAAAA/gAAAAAAAQD/AQAAAAEBAAABAQD/AAAA/wAAAAABAQD/AQEA/wEAAAABAAABAQAAAAEBAAAAAAAAAQEA/wAAAAAAAAD/AQAAAAEAAAEAAAABAQEA/gD/AAEA/wAAAAAAAAAAAAEBAQABAQAAAAAAAP8B/wAAAAAAAAAAAAABAAAAAAAAAgAAAP//AAD//wAA/wAAAP8A/wAAAP8A/wD/AP8AAAAAAQAA/wAAAAAAAAAAAQAAmcb+APX6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxO7/AOv6AAD+AAAA/wABAP8AAAD//wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEA/wD//wAAAQAAAAAAAAD/AAAAAQAAAAD/AAAAAAAAAQEBAAAAAAAAAAEAAAEBAAAAAAAAAQAAAAAAAP8AAAD/AAAA/wAAAAAA/wD/AAAA/wABAP4BAAD+AAAA/v8AAP8AAAD/AQEAAAABAP8BAQD/AAEAAAEBAAABAAD/AQAAAAAAAAABAAAAAAEAAAAAAP8BAAAAAQEAAQIBAP8AAAAAAf8AAAEBAAACAQD/AQAAAAAAAAABAQAAAQAAAQEBAAABAQD/AAAAAAEAAP4BAAAAAQAAAQECAP8BAAAAAQAA/wABAP//AAD/AAAA/wAAAAAAAAD/AQAA/wEAAAABAAAAAAAA/wEAAP8AAAD/AAAA/wAAAP8BAAD/AAAAAAABAAAA/wD//wAAAAD/AP8A/wD/AQAA6vUAALjX/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxe7/AP//AAD///8A/v//AP//AAABAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAAA//8AAQEAAAAAAQAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP//AQAAAAAAAP//AAAAAAAAAAEA/wAAAAAAAAABAAAA//8AAAAAAQD//wAA/v//AP0AAAD/AAAAAAEAAP8AAAD/AAAAAAEAAAAAAAD/AQAAAAAAAAAAAQAAAAEA/wAAAP4AAAAAAQAA/wAAAAAAAAAAAQEA/wAAAAABAAAAAAEAAAAAAP//AAAAAAEAAAIBAAABAAD/AQAAAAEAAP8AAAAAAQEA/gAAAAAAAAD/AAAA/wH/AAEBAAABAQAAAAEAAAACAAAAAQAAAQEAAAABAAAAAP8AAAD/AP8AAAABAQEA/gAAAP8AAAD/AQAA/wAAAP//AAD/AAAA/wEAAAABAQD/AQAA/wAAAAABAAAAAAAA/wAAALfY/wD1+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq+QAA1vT/AP7//wD+AAAAAAEAAAAAAAABAQAAAQAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP//AAAA/wAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP8AAAEAAAABAAAA/wAAAAEBAAD/AAAA/wABAP8AAAD+/wAA/wAAAP8AAAD//wAAAAEAAAAAAAAAAAEAAQABAP8BAQD/AAEA/wABAP8AAAD/AAAA/wAAAP8BAAD/AAAA/wEBAP8BAAAAAQAAAAEBAAEBAQD/AAEA/wEBAP8AAAD/AAAAAAEBAP8AAAAAAQEA/wAAAAABAAD/AAAAAAAAAP8AAQABAAEA/wABAP8AAAD/AAAAAAECAAABAQAAAQEAAAABAP8AAQD/AAAA/wD/AP8A/wAAAAAA/wAAAP8AAAAAAAAAAAEAAAAAAAAAAAAA/wAAAP8A/wD/AAAA/wAAAP8BAAD/AAAA////AP4AAAD/AP8A/wAAAP8AAAAAAP8AAQEAAPT7/wC42P4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV9P4A//8BAP8AAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAABAP8AAQEAAAABAQABAAAAAAAAAAEAAAAA/wAAAQAAAP//AAAAAAAAAAAAAAEAAQAAAAAAAAAAAP8AAAD/AAAAAAAAAP///wAAAP8AAAD/AAEAAQAAAP8AAP8AAAEAAAD/AAAAAP8AAP7/AAAAAAAAAAEAAAAAAAD+AQAA/gAAAP8BAQD/AAEA/gABAP8AAAD/AAAA/wAAAP8AAAD+/wAA/wAAAP8AAAD/AQAAAAAAAAABAQD/AAAA/wAAAAABAQD/AAAAAAEBAP4AAAAAAQAA/gAAAAABAAD/AQAA/wEAAAABAQAAAAEAAAAAAP8AAAD//wAAAAAAAP8AAAAAAAEAAQEBAAEAAQABAAAAAAEAAAAAAQD/AAEAAAABAAEAAQD/AAAAAP8AAAAAAAD///8A/wD/AP//AAD/AAAAAAAAAAAA/wAAAAEAAAH/AAAAAAD/AAAA/wD/AAD/AAC21/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg9gAA/wD/AAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAQEAAQAAAAH/AAAAAAAAAAAAAAAAAAABAQAA/wAAAAEBAAD/AAAAAAAAAP8A/wAAAAAA/wAAAAAAAAD//wAAAAD/AAAAAAD//wAAAAEBAP7//wAAAAEA/wAAAP4AAAD/AAAA/gABAP8AAQD//wAA/wAAAP//AAAAAQAAAAAAAAAAAAD/AAAA/wAAAP8AAQD/AAEA/wAAAP8AAQAAAQEAAAABAAABAQAAAAEAAAABAAAAAQAAAQAAAAAAAAAAAAAAAQAAAAAAAAIBAQAAAAEAAAEBAAAAAAAAAAAAAAAAAAABAAD/AQAA/wAAAAAAAQAAAQAA/wAAAAABAQD/AQAA/wAAAAABAAD/AQAA/wAAAAAB/wABAQAA/v8AAP//AAD+/wAA/wAAAP4AAAAAAAAA/wAAAAAAAAAAAAAA/wAAAP//AAD/AP8AAAABAAAAAAAAAAAAAAAAAAABAAD1+wAA1+n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg9v8AAQAAAAEBAAABAAAAAgAAAAEAAAABAAAAAAD/AAEA/wABAAAAAAD/AAEBAAABAQEAAQAAAAAAAAAAAAAAAQAAAAD/AAABAAAAAAAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAP8AAQAAAQEA//8AAAAAAQD+//8A//8BAP//AQD/AAEAAAEBAAAAAQD/AQEA/v8BAP8BAQD/AAAA/wABAP4AAAD/AAAAAAABAP8AAQAAAAAA/wAAAAABAAD/AAAA/wEAAP8AAAD/AAAA/wEAAP8BAAD/AAAAAAEBAP8AAAD/AQEA/gEAAP8AAAD/AQAAAQAAAP8BAQD/AAEAAAEAAP8AAAAAAAEAAAAAAP8AAAD/AAEA/wAAAAABAAD/AAEAAAEBAP8AAAAAAQAAAQEAAAEAAAAAAQAAAgEAAAAAAAABAQAA/wAAAP//AAD/AAAA/wAAAP8B/wD/AP8A/wAAAAABAAAAAAAAAAAAAAEBAAABAQAAAAAAAAEBAAAAAAAAzeT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs+gAAAQEAAAEAAAABAQAAAAAAAAEAAAABAf8AAQAAAAAAAAAA//8AAQEBAP///wABAAAAAQAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAD/AAAAAP8AAAAAAAD/AAAA//8BAP//AAD/AAAAAAAAAP7/AAAAAAEA/wEBAAD//wD//wAAAAD/AAAAAAD/AAAAAAEAAAD/AAD/AAEA/gAAAP//AQABAQAA/v8AAAEAAAD+AQEAAP8AAAAAAAD/AAAAAAD/AP8AAAAAAQEAAP//AAAAAAAAAAEA/gAAAAABAQABAAAAAAEBAP8AAAAAAAAA/wAAAP///wAAAQAAAP8BAAAAAAAAAQAAAAAAAAAAAAD//wAAAAEBAP//AAABAQAA//8AAAEBAQAA/wAAAAEAAP8AAAAA/v8AAP8BAAABAAAAAAAAAP4AAAEBAAD//wAAAP8AAAAAAAABAAEAAAD/AP8AAQABAQAAAP//AP8AAQAAAAAAAQEAAAD/AAABAQAA6fT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs+v8AAQAAAAEAAAABAAAAAQAAAAIBAAABAAAAAP8AAAIAAQABAQEAAQD/AAIBAAABAAAAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAD//wAA/wAAAAAAAAD//wAAAP8AAAAAAAAAAAAAAP//AP8AAAAAAAAAAP8BAP4AAQD//wAA/wABAAAAAQAAAAEA//8AAAABAAD9/wAAAAAAAP4AAAAAAAAA/wAAAP8AAAAAAQAAAAABAAAAAQAAAAAA/wABAAAAAQAAAQEAAAEBAAAAAAD+AAAAAAABAAAAAAD/AAAA/gAAAP8AAQAAAAEA/wAAAP8BAAD/AQAA/wABAP8BAQAAAQAAAAAAAAABAQD/AAAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wIA/wABAAD/AAD//wAA/wEAAP7/AAD/AAEAAAEBAAAAAQD/AP8AAAEBAAEAAAD/AAAA/wAAAAAAAAABAQAAAAAAAAABAAAAAAAA4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQAAAgAAAAEBAAABAAAAAQAAAAEAAAAAAAAAAQEAAAAAAAABAP8AAAAAAAEAAAAAAQAA/wAAAAEAAAAA/wAA/wAAAAEAAAD/AAAAAAEAAAD/AAD//wAAAAAAAAAAAAD/AAAAAAAAAP8AAAAAAQAA//8AAP8AAAAAAAAA/wABAP8AAAD/AP8A/wAAAP8AAAAAAAEAAP8AAP4AAAD/AAAA/gAAAAD/AAD//wAA/wEAAP//AAAAAQAAAAAAAAEAAAD+AAAAAAEAAAD/AAAAAAAAAAEAAP4AAAAA/wAAAQAAAP8BAQD///8AAAAAAAAAAQAAAAAAAQD/AAACAAD//wAAAAABAP///wAA/wEAAAD/AAEBAAD//wEAAAEAAAD//wABAQAAAAABAP///wAAAAAAAQAAAAAAAQAAAAAAAAEAAP//AAABAAAAAAAAAAEBAAAAAP8AAP8BAP8B/wAB/wEA/wAAAAAAAAABAQAAAAAAAAD//wD/AAEAAgEAAP//AAABAAAA9fr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQEAAAEAAAABAAAAAQD/AAEA/wABAAAAAQEBAAIA/wABAAAAAQAAAAEAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAD/AAABAAAAAAAAAAD/AAABAQAA/wAAAAAAAAABAQEAAAAAAAAAAAAA/wEA/wABAAAAAQD/AAEA/wAAAAD/AAD/AAEAAAAAAAAAAAAAAQEA/wAAAAAAAAABAAAA/wABAP8AAQAAAQEAAAABAAAAAQAA/wEA/wABAP4AAQAAAAEAAP8AAP4AAAAAAAAA/wAAAAAAAAD/AAAA/wEBAP8AAAAAAQEAAAEAAP8BAAD/AAAA/wEBAP8AAQAAAAAAAAAAAAAAAQAAAQAAAAIBAP8AAQAAAQAAAAAAAAABAQD//wEAAAAAAAAAAQAAAAAA/v8BAP7/AAD/AAAAAP8AAAEBAAD/AAAAAAEAAP8AAAAAAAAA/wAAAAD/AQAAAAAAAAAAAP8BAAAA/wAAAQAAAAABAAABAAAA/wAAAAEAAAAAAgAA9/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBwAAAgAAAAIBAAACAP8AAQAAAAEAAAACAQEAAQD/AAABAAABAQAAAQEAAAEBAAABAAAAAQAAAAH/AAABAAAAAQAAAP8BAAAAAAAAAAAAAAABAAAAAAAAAQAAAAD/AAAA//8AAP8AAP8AAAD/AP8AAP8AAP8AAAAAAAAA//8AAP7/AAAA/wAAAAEBAP8AAAD///8A/wAAAP7/AAD+AAAA/wAAAP8AAAD+AAAA/v8AAP8AAAD+AAAAAAAAAAAAAAD/AAAA/wEBAAAAAQD+AAEA/wABAAAAAQAAAQEA////AAABAQD/AAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQEA/wEAAP8BAAAAAQAAAAAAAAAAAAAAAQEA/wEAAP8AAAAAAQEA/wAAAAABAAD/AAIA//8BAP8AAQAAAQAAAAEAAP8AAAABAAAA//8AAAD/AAAAAAAAAAD/AAABAAD/AAAA/wAAAAEAAAAAAQAAAAAAAAAAAAAAAf8AAQEAAAABAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAwAA9vwAAAIA/wABAQAAAAEBAAH/AAAAAP8AAQAAAP8AAAABAAAAAAAAAAAA/wABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAAA/wAA/wAAAAAAAAAAAAEA/wAAAAEAAAD/AAAA/wAAAAAAAAD//gAAAQEAAP8AAAD//wAA//8AAP8AAAAAAAAA/wABAP8B/wAA/gAAAAAAAP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAP8AAAAA/wAAAAAAAAABAAAAAAAA//8AAP8AAAAAAAAAAQEBAAAAAAAAAQEA//8AAAEBAAAAAAAA/wAAAAD/AAD+AP8AAAABAAAAAAD/AAAAAP//AAAAAAAAAAAAAAABAAAAAAD///8AAQABAP7+AAD//wAAAQAAAAEAAAD/AAEAAAAAAAAA/wABAQAAAQAAAAEBAAAA/wAAAQAAAAAA/wABAQEAAQAAAAD/AAAAAAAA/wD/AAIBAQABAAAAAf8AAAABAAAB/wAACgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqDQIAAgH/AAEBAAABAAAAAgD/AAEAAAABAAAAAAAAAAIAAAABAAAAAgAAAAEAAAABAAAAAQAAAAEBAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAQABAAAAAQAAAAAAAAAAAAAAAQD/AAAAAAEAAAAAAAAAAQAA//8AAAAAAAAAAQAAAAAAAAD/AQAAAAEA//8AAAD/AQD+/wEA/wABAAAAAQAAAAEAAAEBAP4AAAD/AAAA/gAAAAABAQD/AAAA/wAAAP8AAAD+/wAAAAEAAAABAAAAAAAA/wAAAP8AAAAAAAAAAAEAAP8AAAD/AQAA/wAAAAABAAAAAAEAAAABAP8BAAAAAAAAAAEBAP8AAQAAAAEAAAAAAAEBAAABAgIA/v8AAP4AAAAAAAAA/wAAAAABAAAAAAAAAAAAAAAAAAD/AAAAAAEAAP//AAABAAAAAAAAAAAAAAAAAP8AAAD/AAABAAAAAAAAAQEBAAEBAQAAAAAAAAH/AAEAAAAAAf8AIBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCQEAAgAAAAIAAAAAAQAAAAAAAAEA/wAAAQAAAP8AAAAAAAABAQAA/wABAAH//wAAAQAAAAAAAAD/AAAAAQAA/wAAAAH/AAD/AAAAAP8AAAAAAAAAAQEAAP8AAAAAAAAAAAAAAAAAAP///wABAAAA/v8AAAAAAQD///8A/wABAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAD/AQEA/v//AAEAAAD/AAAA/wAAAAAAAQAAAAAAAAAAAP7/AAABAQEA/wAAAAAAAAAAAf8AAAABAP///wABAQAA/wABAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEAAP//AAD/AAAAAQEAAAD/AAAAAQEAAAD/AAAAAAD//wAAAQEBAP7+AAAA/gAA/wECAAD//wAAAf8AAQAAAP//AAAAAAAAAAEAAAEAAQAA/wAAAAAAAAAB/wAAAAEAAAD/AAEAAAAB/wAAAQEAAAEA/wAAAAEAAf8AAAAA/wABAAAAAQAAAAEB/wAAAAAAFQoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyDwEAAgEAAAIBAAACAAAAAgEAAAEBAAACAAAAAgEAAAEBAAABAAAAAgD/AAEBAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQEAAAEAAAAA//8AAP8AAAAAAAAAAAAAAAAAAAAAAAD/AAEAAAABAP//AAD/AQAAAAAAAP8AAAD//wAAAAAAAAAAAAD+AAAAAAEAAAAAAAD//v8AAAAAAP8AAAD/AAAA//8AAAAAAAAAAAAA/gAAAAAAAAD/AAAA//8AAP//AAAA/wEA/wAAAP8AAQD/AAEAAAAAAAABAQD/AAEAAAEBAAABAQAAAAEA/wAAAAAAAAABAQAAAAAAAAAAAQD//wAA/gABAAAAAQAAAAAA/wAAAP7/AAD+AQAA////AAABAAAAAAEAAAABAAEBAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAAAAAQEAAAEBAAACAQAAAQABAAEAAACyjhKhAAAgAElEQVQCAQAAAgIAAAEAAAACAgAAAQEAAAEBAAABAQAAKBYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAwAAJwsBAAEAAAABAQAAAgAAAAIBAAACAQAAAQAAAAMBAAABAAAAAAD/AAIAAAACAQAAAQAAAAEBAAABAQAAAQAAAAEAAAAAAAAAAAABAAAAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA/wAAAP8AAAAA/wEA/wAAAP7/AAAAAAAA/wAAAP8AAAAAAAAA/wAAAP4AAAD+AAAA/wAAAP8AAAD/AAAAAAEAAP8AAAD+AAAAAAAAAP8AAAAAAAAAAAEAAAABAAD/AAAA//8AAAAAAAD/AAAA//8AAP8AAAAAAAAA/wAAAP8AAAD/AQAAAAABAAABAQAAAAEAAAAAAAABAAD/AQAAAAAAAP8AAAD+AAEA/f4AAP8BAAAAAAAAAAEAAAAAAAD/AAAA/wAAAP8AAAABAAAAAQAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAgABAAEAAAAAAQAAAQH/AAEAAAABAP8AAQAAAAIBAAABAAAAAgEAAAIBAAACAQAAKRYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAShcCAAMBAAADAQAAAgEAAAIBAAAAAAAAAgEAAAEAAAACAQAAAgABAAEAAAABAAAAAQEAAAIAAAABAAAAAQAAAAEAAAACAQEAAQAAAAAAAAAAAAAAAQEBAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAEBAAD/AAAAAAAAAAAAAAAAAAAA//8BAP3+AAD/AAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AQAA/wAAAP8AAAD//wAA/wAAAAD/AAD/AAAA//8AAAAAAAAAAAAAAAAAAP8AAAD/AQAA/wEAAP8AAAAAAAAAAAABAP4AAAD/AAAAAAEBAAAAAQAAAAEAAAEBAAAAAAABAQAAAQEAAAEBAAAAAQEAAAEBAAEAAAABAQEAAQEAAAEBAAAAAQAA/wAAAAIBAQACAQEAAgABAAIBAAACAQAAAgH/AAIBAAACAQAAAQEAAAEBAAApFgEAFAsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwsBABMFAADv+wAAAAAAAAAAAAAAAQAA/wAAAAD/AAAAAAAAAQEAAP8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAQABAAEAAAAAAAAA/wD/AAAAAAAA/wAAAAEBAAD+AAAA/wAA//8AAP//AAD//wAA/wEAAAAAAAD/AAAA/wAAAP8AAAAAAAEA/wAAAP8AAQAAAAAA/wAAAAAAAAD/AAAAAP//AAABAQD//wAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAQEAAP///wAAAAAAAAAAAP8AAAAAAQAAAP8AAP8AAAABAAAAAAEAAAD/AAD//wAAAP8BAP//AAD/AAAAAAAAAAAAAQAAAQAAAP//AAAAAAAAAQAAAP4AAAABAAAA/wAAAAEAAAD/AAAAAAAAAQAAAAABAAAA//8AAAEAAAH/AAABAAAAAgEAAAAAAAACAAAAAAEAAAIAAQAB/wAAAQEAAAH//wABAQEAAQAAAAEAAAA9IAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgbAwACAQAAAgEAAAMBAQACAAAAAwAAAAIBAAACAAAAAQABAAL/AAABAAAAAQAAAAEBAAABAAAAAQAAAAAAAAABAQEAAAAAAAEAAAAAAQAAAQAAAAEAAAABAAAAAf8AAP8AAAAAAAAAAAAAAAAAAAABAgAAAQAAAP7/AAAAAAAAAAAAAAAAAQAAAAAA/v8AAP8AAQAAAAAAAAAAAP8AAAAAAAAA/wEBAP//AAAAAAAAAAABAAAAAQAAAAEA/wABAP8AAAAAAAAA/gAAAP8BAQD/AQEA/wEBAP8BAQAA/wEA/wAAAP//AAD+/wAA/v8AAP7/AAD/AAEA/gAAAP8BAAAAAAAAAAEAAAABAAAAAAAAAAEBAAEBAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAQAAAQAAAAABAAABAQAAAAEAAAIBAAAAAQAAAwAAAAIBAAABAQAAAgAAAAICAQACAQAAAgIAABYNAQA6HwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMLAQAlCwEAAwAAAAEA/wACAQAAAQAAAAIAAAACAQAAAgD/AAEBAAACAQAAAgAAAAD/AAABAAAAAAEAAAEBAQAAAAAAAQAAAAAAAAAAAAAAAAEBAAAAAQAAAAAA/wAAAAEAAAD/AAAAAAAAAAAAAAD//wAA/wAAAAEBAAAAAAAAAAABAP//AAD9/gAA/v8AAP8A/wD/AAAA/wAAAP8AAAAAAAAAAAAAAAABAAAAAQAAAAAAAP8AAAAAAP8AAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAAABAAABAQAAAQEAAAABAP8BAQAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAABAQAAAAEAAAEBAAABAQEAAQABAAEBAAABAQAAAAEAAAEBAAABAQEAAQEBAAIBAQABAAAAAgEAAAEBAAACAQAAAQIAAAIBAAAEAwAAAwIAAAIBAAADAgAAAwEAAFctAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUGgIAEgYAAAIBAAACAQAAAgEAAAIBAAABAAAAAgEAAAIBAAABAAAAAQAAAAIBAAABAQAAAgAAAAEAAAABAQAAAQEAAAABAAAAAAAAAP8AAAAAAAAAAQEAAAAAAAAAAAABAAAA/wAAAAABAAAAAAAA/wAAAAAAAAD/AAAA//8AAAABAAD+AAAAAAAAAAAAAAD/AAAAAAABAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP8AAAD/AAAA/wAAAAEAAAD/AQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQABAAAAAAAAAQAAAAEAAAEBAQABAQAAAQEAAAEBAAACAQAAAQAAAAEAAAACAgAAAQEAAAEBAAACAQAAAgEAAAIBAAACAQAAAwMAAAMCAAACAQAARCQDAC8ZAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBQEAXBwDAAsDAAACAAAAAwEAAAIAAAACAQAAAgEAAAEBAAACAAAAAgEAAAIAAAAAAAAAAQABAAIBAQABAAAAAAAAAAIAAAACAAEAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAQEAAP//AAD//wAAAP8AAP//AQAA/wEAAAAAAP3+AAD//wAA/wAAAAAAAAAAAAAA/wD/AP8AAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQEAAAAAAAABAAAAAQABAAAAAAAAAQAAAAAAAAABAAAAAAAAAQEAAAAA/wAAAAAA/wD/AAEBAAABAAAAAQAAAAAAAAABAQEAAgEAAAEAAAABAAAAAQEAAAEBAAABAQEAAgEBAAIBAAABAQAAAQEAAAEBAAACAQAAAgAAAAQCAAAXDAAASycBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQgBAEsXAwADAQAAAgEAAAIAAAADAQEAAQAAAAL/AAABAQAAAQEAAAEAAAACAAEAAQAAAAAA/wABAAAAAQAAAAAAAAAAAP8AAQAAAAEAAAAAAAAAAf8AAP8AAAABAAEAAP8BAAAAAAAAAAAAAAABAP8AAAD/AAAA/v8AAP7/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAAAAAAABAAAAAQAAAAAAAAEAAAABAQAAAAEAAAEBAQABAQEAAQEAAAAAAAABAQAAAQEAAAEAAAABAQAAAAEAAAEBAAABAQAAAQEAAAEBAAABAQAAAQEAAAEBAAACAQEAAgIAAAICAAACAQAAAgIAABYLAQBuOQQACQUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAPAQAIAgMAr+f9APgAAAD///8AAgEAAP//AAD+AAAAAQAAAP4BAQACAAAA/v8AAAEAAAABAAAAAQAAAAEAAAABAAEAAAAAAAABAAAB/wAA/wEAAAH/AAD+AP8AAAAAAAEAAAABAQEA/v8AAAEAAAD9/wEA/v8AAAEAAAD/AAAAAAEAAP//AAABAP8A/wAAAAAAAQAAAAAAAAAAAP8A/wABAAEA/wD/AAAAAQAAAQAAAAD/AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAABAQAAAAAAAAD/AQABAAAA/wH/AAAAAQAAAAAAAf//AAEAAAAAAAAAAQEBAAEAAAAA//8AAQEAAAEBAQAA//8AAgEBAAEAAAABAP8AAgAAAAIAAAACAAAAAgAAAAIBAQAB//8AAgEBAAMAAAACAf8AFQsBAGw3AwASCQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Pv/AKHi/QDv+gAA/wAAAP8AAAD+/wAA//8BAP4AAAD//wAA/v8AAP7/AAD9/wAA/v8AAP7/AAD+/wEA/v8AAP4AAAD+/wAA/f4AAP8AAAD+/wEA/f//AP7/AQD+/wAA/gAAAP3/AAD+/wAA//8BAP//AAD/AAAA/wAAAP8AAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAP8AAAABAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAD/AAAAAP8AAP8BAAAAAAAAAP8AAP8AAAD/AAD/AAAAAf8AAAAAAAAB/wAAAAAAAAD+/wACAAAAAP8AAAH/AAACAP8AAQAAAAL/AAACAAAAAv8AAAEA/wACAAAAAf8AAAMBAAAB/wAAAwEAAAL/AAADAQAAAgAAAAMBAAAnEwEAZDMCAAkEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA7P4Awev+AP4AAAD//wAA/v8BAP8AAAD+/wAA/wAAAP3/AAD+/gEA/gAAAP3//wD+/gEA/gAAAP0AAAD+/gAA/v8AAP7/AAD9/wAA//8BAP3/AAD+/wAA/f8AAP0AAAD//wAA/wABAP//AAD/AAAA//8AAAAAAAD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAABAAABAAAAAAEAAP//AAAAAAAAAQAAAP//AAABAQAAAAAAAAAAAAAAAAAA/wAAAAD/AAABAAAAAAAAAAD/AAD/AAAAAQD/AP//AAABAAAAAP8AAAD/AAAA/wAAAQAAAAH//wAAAAAAAv8AAAEAAAAB/v8AAgAAAAEAAAACAAAAAv8AAAIAAAAB//8AAgAAAAIAAAACAQAAAv8AAAMBAAACAAAADAUBAEwlAQBAIAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Pv/AMHs/wDP8P8A/v8AAP7/AAD//wAA/gAAAP3/AAD//wEA/f8AAP3/AAD+/gAA/QAAAP8AAAD9/gAA/v8AAP3/AAD9/wEA/f8AAP3+AAD+AAAA/v8AAP8AAAD+/wAA/wABAP//AAD/AAAA/wAAAAD/AAD//wAA/wAAAAEBAAD//wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAD/AAD/AAD/AAAAAf8AAAEAAAAA/wAAAP8AAAH//wABAAAAAv8AAAEAAAACAAAAAf8AAAIA/wACAAAAAf8AAAMAAAAB/wAAAgAAAAIB/wADAAAAAf8AAAwFAQBEIAEAQSEBAAoEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////7wAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw+wAA4PX/AM/w/wDd9f8A/v8AAP7/AAD+/wEA/QAAAP3+AAD+/wAA/f8AAP3/AAD+/wAA/P8AAP3+AQD+/wAA/v8AAP0AAQD+/v8A/wAAAP4AAAD//wAA/wABAP8AAAD+/wAA/wAAAAAAAAAA/wAA/wAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAD/AAABAAAAAP//AP//AAAAAAAAAQAAAAD/AAAB/wAAAAAAAAH//wABAAAAAf8AAAIAAAAB/wAAAgAAAAIAAAACAP8AAv8AAAIAAAACAAAAAgAAAAL//wApEwEAMRYCADkcAAAKBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQEBEQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////3wAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5/j/AO76AADv+gAA9vwAAP8AAAD/AAAA/v8AAP7/AAD/AAAA/v8AAP8AAAD//wEA/wAAAP//AAD/AP8A//8AAP8AAAD/AAEAAAAAAP8AAAD//wAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAABAAD//wABAAAAAAAAAAEAAAAA/wAAAQAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAsDAAALBQAAHg0AABQKAAAKBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAQEBIQAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQgBABkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO06ZRcAACAASURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA////EAAAAO8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAQEB8AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAP///xAAAADfAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AEBASEAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAfAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAA3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EAAAAN8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfrMn9gAAIABJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABBAQEB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAbAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQEBAaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////zwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAQEBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB8AAAAEEAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAEEBAQHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAeAAAABBAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAMQEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQHgAQEBMQAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEBAQExAQEB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9gAAAAfwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAYQEBAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQGgAAAAQQAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAhAQEBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8gAAAAgAAAAD8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAACRAAAAoAEBAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9QAAAAUAAAAC8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAACxAAAAsAAAANABAQHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8QAAAAMAAAABAAAAAwAAAAEAAAAB8AAAAQAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAADwAAAAAAAAAAAAAADwAAAA8AAAAOAAAAAAAAAA4QAAAOAAAADQAAAA4AEBAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzSdObAAAAlUlEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//lYjK0eEha9kAAAAASUVORK5CYII= \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/index.html b/arma/client/addons/phone/ui/_site/index.html new file mode 100644 index 0000000..0e2a7dd --- /dev/null +++ b/arma/client/addons/phone/ui/_site/index.html @@ -0,0 +1,29 @@ + + + + + + +
+ + diff --git a/arma/client/addons/phone/ui/_site/js/app.js b/arma/client/addons/phone/ui/_site/js/app.js new file mode 100644 index 0000000..7973aa4 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/app.js @@ -0,0 +1,328 @@ +/** + * @fileoverview Root application component and integration logic. + * + * The App class manages: + * - Switching between different app modules (home, phone, messages, contacts, settings) + * - Rendering the correct app UI based on global state + * - Handling global modals (e.g., call confirmation) + * - Integrating shared UI elements (status bar, home indicator, dynamic island) + * + * Each app module is initialized via its global function (e.g., window.initializePhoneApp) and mounted into the app container. + * The placeholder app view is shown for unimplemented apps. + * + * This is the main entry point for the phone UI framework. + */ + +/** + * @class App + * @extends Component + * @description The root component that manages app switching and integration + */ +class App extends Component { + /** + * @constructor + * Initializes state and subscribes to global state changes. + */ + constructor(props = {}) { + super(props); + this.state = { + ...globalState.getState(), + currentApp: 'home', + showAddContactForm: false + }; + + this.unsubscribe = null; + } + + /** + * Subscribe to global state changes after mounting + * @lifecycle + */ + componentDidMount() { + this.unsubscribe = globalState.subscribe((newState) => { + this.setState(newState); + }); + } + + /** + * Clean up subscriptions before unmounting + * @lifecycle + */ + componentWillUnmount() { + if (this.unsubscribe) { + this.unsubscribe(); + } + } + + /** + * Render the current app based on app state + * @returns {HTMLElement} Current app view + * @private + */ + renderCurrentApp() { + const { currentApp } = this.state; + const appContainer = this.createElement('div', { className: 'app-container' }); + + switch (currentApp) { + case 'clock': + window.initializeClockApp(appContainer); + break; + case 'calendar': + window.initializeCalendarApp(appContainer); + break; + case 'home': + return new HomeScreen(); + case 'phone': + window.initializePhoneApp(appContainer); + break; + case 'messages': + window.initializeMessagesApp(appContainer); + break; + case 'mail': + window.initializeMailApp(appContainer); + break; + case 'notes': + window.initializeNotesApp(appContainer); + break; + case 'contacts': + window.initializeContactsApp(appContainer); + break; + case 'settings': + window.initializeSettingsApp(appContainer); + break; + case 'wallet': + window.initializeMobileBankApp(appContainer); + break; + default: + return this.renderPlaceholderApp(currentApp); + } + + return appContainer; + } + + /** + * Render a placeholder for unimplemented apps + * @param {string} appName - App name + * @returns {HTMLElement} Placeholder app view + * @private + */ + renderPlaceholderApp(appName) { + const appIcons = { + calendar: '', + camera: '', + store: '', + mail: '', + icloud: '', + photos: '', + safari: '', + wallet: '' + }; + + return this.createElement( + 'div', + { className: 'app-container' }, + new NavigationBar({ title: appName }), + this.createElement( + 'div', + { className: 'content' }, + this.createElement( + 'div', + { + style: { + textAlign: 'center', + padding: '50px 20px', + color: '#6c757d', + }, + }, + this.createElement('h2', { role: 'img', 'aria-label': appName }, appIcons[appName] || ''), + this.createElement('p', {}, `${appName} app coming soon!`) + ) + ) + ); + } + + /** + * Render the phone app UI, including status bar, main content, home indicator, and modals. + * @returns {HTMLElement} The rendered phone app + */ + render() { + const { currentApp, selectedContact, showModal, showDeleteModal, noteToDelete, eventToDelete } = this.state; + const openMessageThread = (contact) => { + if (!contact || contact.canMessage === false) return; + + const contactId = contact.contactId || contact.uid || contact.id; + if (!contactId) return; + + const { messages = [], rawMessages = [], currentUid = window.__playerUid } = globalState.getState(); + const existingConversation = messages.find((message) => (message.contactId || message.id) === contactId); + const selectedRawMessages = rawMessages.filter((message) => + message && + ( + (message.from === currentUid && message.to === contactId) || + (message.from === contactId && message.to === currentUid) + ) + ); + const conversation = existingConversation || { + ...contact, + id: contactId, + contactId, + contactName: contact.fullName || contact.name || contactId, + conversation: [], + hasConversation: false + }; + + globalState.setState({ + currentApp: 'messages', + selectedContact: null, + showModal: false, + showMessageContactPicker: false, + selectedConversation: { + ...conversation, + id: contactId, + contactId, + contactName: conversation.contactName || contact.fullName || contact.name || contactId, + conversation: conversation.conversation || [] + }, + selectedConversationRaw: { + otherUid: contactId, + messages: selectedRawMessages + } + }); + }; + + return this.createElement( + 'div', + { + className: 'phone-container', + role: 'application', + 'aria-label': 'Phone interface', + }, + this.createElement( + 'div', + { + className: 'phone-screen dynamic-island', + role: 'main', + }, + // Dynamic Island content + this.createElement( + 'div', + { + className: 'dynamic-island-content', + 'aria-hidden': 'true', + }, + this.createElement('div', { className: 'speaker' }), + this.createElement('div', { className: 'camera' }) + ), + + // Status bar + new StatusBar(), + + // Main app content + this.renderCurrentApp(), + + // Home indicator (except on home screen) + currentApp !== 'home' && new HomeIndicator(), + + // Call modal + showModal && selectedContact && new Modal({ + show: showModal, + title: selectedContact.canCall === false ? (selectedContact.fullName || selectedContact.name) : `Call ${selectedContact.fullName || selectedContact.name}?`, + confirmText: selectedContact.canCall === false ? 'Close' : 'Call', + cancelText: selectedContact.canCall === false ? 'Back' : 'Cancel', + hideCancel: true, + hideConfirm: selectedContact.canCall === false, + extraActions: selectedContact.canMessage === false || !(selectedContact.contactId || selectedContact.uid || selectedContact.id) ? [] : [{ + text: 'Text', + ariaLabel: `Text ${selectedContact.fullName || selectedContact.name}`, + className: 'button secondary', + onClick: () => openMessageThread(selectedContact) + }], + onClose: () => globalState.setState({ showModal: false, selectedContact: null }), + onConfirm: () => { + if (selectedContact.canCall === false) { + globalState.setState({ showModal: false, selectedContact: null }); + return; + } + + globalState.setState({ + phoneNumber: selectedContact.phone, + showModal: false, + selectedContact: null, + currentApp: 'phone' + }); + }, + children: [ + this.createElement( + 'p', + { role: 'alert' }, + selectedContact.canCall === false + ? `${selectedContact.fullName || selectedContact.name} is a command broadcast contact. Incoming messages and email are available, but direct calls are disabled.` + : `Do you want to call ${selectedContact.fullName || selectedContact.name} at ${selectedContact.phone}?` + ) + ] + }), + + // Delete note confirmation modal + showDeleteModal && noteToDelete && new Modal({ + show: showDeleteModal, + title: `Delete "${noteToDelete.title}"?`, + confirmText: 'Delete', + cancelText: 'Cancel', + onClose: () => globalState.setState({ showDeleteModal: false, noteToDelete: null }), + onConfirm: () => { + // Find the onDelete handler from the notes editor and call it + const currentState = globalState.getState(); + const currentNotes = currentState.notes || []; + const updatedNotes = currentNotes.filter(n => n.id !== noteToDelete.id); + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false, + showDeleteModal: false, + noteToDelete: null + }); + + // Delete from server + if (typeof deleteNote === 'function') { + deleteNote(noteToDelete.id); + } + + console.log('Note deleted:', noteToDelete.id); + }, + children: [this.createElement('p', { role: 'alert' }, `Are you sure you want to delete this note? This action cannot be undone.`)] + }), + + showDeleteModal && eventToDelete && new Modal({ + show: showDeleteModal, + title: `Delete "${eventToDelete.title}"?`, + confirmText: 'Delete', + cancelText: 'Cancel', + onClose: () => globalState.setState({ showDeleteModal: false, eventToDelete: null }), + onConfirm: () => { + // Find the onDelete handler from the events editor and call it + const currentState = globalState.getState(); + const currentEvents = currentState.events || []; + const updatedEvents = currentEvents.filter(n => n.id !== eventToDelete.id); + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false, + showDeleteModal: false, + eventToDelete: null + }); + + // Delete from server + if (typeof deleteCalendarEvent === 'function') { + deleteCalendarEvent(eventToDelete.id); + } + + console.log('Event deleted:', eventToDelete.id); + }, + children: [this.createElement('p', { role: 'alert' }, `Are you sure you want to delete this event? This action cannot be undone.`)] + }) + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/calendar/components/Calendar.js b/arma/client/addons/phone/ui/_site/js/apps/calendar/components/Calendar.js new file mode 100644 index 0000000..c18ce4d --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/calendar/components/Calendar.js @@ -0,0 +1,191 @@ +/** + * @format + * @fileoverview Calendar component for displaying and managing calendar events + */ + +class Calendar extends Component { + constructor(props = {}) { + super(props); + + let selectedDate = props.selectedDate; + if (!(selectedDate instanceof Date) || isNaN(selectedDate.getTime())) { + selectedDate = new Date(); + } + + this.state = { + currentDate: props.selectedDate || new Date(), + selectedDate: props.selectedDate || new Date(), + events: props.events || [], + }; + + this.onEventClick = props.onEventClick; + this.onDayClick = props.onDayClick; + + this.handleDayClick = this.handleDayClick.bind(this); + this.handleEventClick = this.handleEventClick.bind(this); + } + + /** + * Called when the component is first mounted to the DOM. + * Ensures the initial view is rendered. + */ + componentDidMount() { + this.render(); // Initial render after component is mounted + } + + /** + * Called when the component's state or props change. + * Updates the component if necessary. + */ + componentDidUpdate(prevProps, prevState) { + // Re-render if selectedDate or events have changed significantly + if ( + prevState.selectedDate.toDateString() !== this.state.selectedDate.toDateString() || + JSON.stringify(prevState.events) !== JSON.stringify(this.state.events) || + prevState.currentDate.toDateString() !== this.state.currentDate.toDateString() + ) { + this.render(); + } + } + + render() { + const { currentDate } = this.state; + const year = currentDate.getFullYear(); + const month = currentDate.getMonth(); + + return this.createElement( + 'div', + { className: 'calendar-container' }, + + this.createElement('div', { className: 'calendar-header' }, this.createElement('div', { className: 'calendar-title' }, `${this.getMonthName(month)} ${year}`)), + + this.createElement('div', { className: 'calendar-grid' }, this.renderWeekdays(), this.renderDays(year, month)), + + this.createElement('div', { className: 'calendar-events' }, this.renderEvents()) + ); + } + + renderWeekdays() { + const weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + return weekdays.map((day) => this.createElement('div', { className: 'calendar-weekday' }, day)); + } + + renderDays(year, month) { + const firstDay = new Date(year, month, 1); + const lastDay = new Date(year, month + 1, 0); + const startingDay = firstDay.getDay(); + const totalDays = lastDay.getDate(); + + let days = []; + + // Previous month's days (empty placeholders or actual days if needed, currently empty for visual alignment) + for (let i = 0; i < startingDay; i++) { + days.push(this.createElement('div', { className: 'calendar-day other-month' })); + } + + // Current month's days + for (let day = 1; day <= totalDays; day++) { + const date = new Date(year, month, day); + const isToday = this.isToday(date); + const isSelected = this.isSelected(date); + const hasEvents = this.hasEvents(date); + + let classes = ['calendar-day']; + if (isToday) classes.push('today'); + if (isSelected) classes.push('selected'); + if (hasEvents) classes.push('has-events'); + + days.push( + this.createElement( + 'div', + { + className: classes.join(' '), + 'data-date': date.toISOString(), + onClick: () => this.handleDayClick(date), + }, + day + ) + ); + } + + // Next month's days (empty placeholders for visual alignment) + const remainingCells = 42 - days.length; // 42 = 6 rows * 7 days + for (let i = 0; i < remainingCells; i++) { + days.push(this.createElement('div', { className: 'calendar-day other-month' })); + } + + return days; + } + + renderEvents() { + const events = this.getEventsForDate(this.state.selectedDate); + if (!events || events.length === 0) { + return this.createElement('div', { className: 'no-events' }, 'No events for this day'); + } + + return events.map((event) => + this.createElement( + 'div', + { + className: 'event-item', + 'data-event-id': event.id, + onClick: () => this.handleEventClick(event), + }, + this.createElement('div', { className: 'event-dot' }), + this.createElement('div', { className: 'event-time' }, this.formatTime(event.startTime)), + this.createElement('div', { className: 'event-title' }, event.title) + ) + ); + } + + handleDayClick(date) { + this.setState({ selectedDate: date }); + + if (this.onDayClick) { + this.onDayClick(date); + } + } + + handleEventClick(event) { + if (this.onEventClick) { + this.onEventClick(event); + } + } + + getEventsForDate(date) { + const dateKey = this.getDateKey(date); + return this.state.events.filter((event) => { + const eventStartDate = new Date(event.startTime); + return this.getDateKey(eventStartDate) === dateKey; + }); + } + + hasEvents(date) { + return this.getEventsForDate(date).length > 0; + } + + getDateKey(date) { + return date.toISOString().split('T')[0]; + } + + isToday(date) { + const today = new Date(); + return date.toDateString() === today.toDateString(); + } + + isSelected(date) { + return date.toDateString() === this.state.selectedDate.toDateString(); + } + + getMonthName(month) { + return new Date(2000, month, 1).toLocaleString('default', { month: 'long' }); + } + + formatTime(time) { + return new Date(time).toLocaleTimeString('default', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/calendar/components/EventEditor.js b/arma/client/addons/phone/ui/_site/js/apps/calendar/components/EventEditor.js new file mode 100644 index 0000000..4d76187 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/calendar/components/EventEditor.js @@ -0,0 +1,290 @@ +/** + * @format + * @class EventEditor + * @extends Component + * @description A component for creating and editing calendar events. + */ + +class EventEditor extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.event] - Existing event to edit + * @param {Function} props.onSave - Callback when event is saved + * @param {Function} props.onCancel - Callback when editing is cancelled + * @param {Function} [props.onDelete] - Callback when event is deleted + */ + constructor(props = {}) { + super(props); + + const existingEvent = props.event || { + title: '', + startTime: new Date(), + endTime: new Date(new Date().getTime() + 60 * 60 * 1000), + description: '', + }; + + this.state = { + title: existingEvent.title || '', + startTime: this.formatDateTimeForInput(existingEvent.startTime), + endTime: this.formatDateTimeForInput(existingEvent.endTime), + description: existingEvent.description || '', + id: existingEvent.id || null, + isModified: false, + }; + + // References for DOM elements + this.titleInputRef = null; + this.startTimeInputRef = null; + this.endTimeInputRef = null; + this.descriptionInputRef = null; + + // Bind methods + this.handleTitleChange = this.handleTitleChange.bind(this); + this.handleStartTimeChange = this.handleStartTimeChange.bind(this); + this.handleEndTimeChange = this.handleEndTimeChange.bind(this); + this.handleDescriptionChange = this.handleDescriptionChange.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.setTitleInputRef = this.setTitleInputRef.bind(this); + this.setStartTimeInputRef = this.setStartTimeInputRef.bind(this); + this.setEndTimeInputRef = this.setEndTimeInputRef.bind(this); + this.setDescriptionInputRef = this.setDescriptionInputRef.bind(this); + } + + /** + * Component mounted - focus on title if new event + */ + componentDidMount() { + if (!this.state.id && this.titleInputRef) { + this.titleInputRef.focus(); + } + } + + // Ref setter methods + setTitleInputRef(element) { + if (element) { + this.titleInputRef = element; + if (this.state.title && element.value !== this.state.title) { + element.value = this.state.title; + } + } + } + + setStartTimeInputRef(element) { + if (element) { + this.startTimeInputRef = element; + if (this.state.startTime && element.value !== this.state.startTime) { + element.value = this.state.startTime; + } + } + } + + setEndTimeInputRef(element) { + if (element) { + this.endTimeInputRef = element; + if (this.state.endTime && element.value !== this.state.endTime) { + element.value = this.state.endTime; + } + } + } + + setDescriptionInputRef(element) { + if (element) { + this.descriptionInputRef = element; + if (this.state.description && element.value !== this.state.description) { + element.value = this.state.description; + } + } + } + + // Input change handlers + handleTitleChange(e) { + this.state.title = e.target.value; + this.state.isModified = true; + } + + handleStartTimeChange(e) { + this.state.startTime = e.target.value; + this.state.isModified = true; + } + + handleEndTimeChange(e) { + this.state.endTime = e.target.value; + this.state.isModified = true; + } + + handleDescriptionChange(e) { + this.state.description = e.target.value; + this.state.isModified = true; + } + + handleSave() { + const { title, startTime, endTime, description, id } = this.state; + + // if (!title.trim() || !startTime || !endTime) { + // alert('Please fill in all required fields.'); + // return; + // } + + const savedEvent = { + id: id || generateId(), + title: title.trim(), + startTime: new Date(startTime), + endTime: new Date(endTime), + description: description.trim(), + }; + + this.setState({ + isModified: false, + id: savedEvent.id, + }); + + if (this.props.onSave) { + this.props.onSave(savedEvent); + } + } + + handleCancel() { + if (this.props.onCancel) { + this.props.onCancel(); + } + } + + handleDelete() { + if (!this.state.id) { + console.warn('Cannot delete event: no ID present'); + return; + } + + if (!this.props.onDelete) { + console.warn('Cannot delete event: no onDelete callback provided'); + return; + } + + try { + // Show delete confirmation modal using global state + globalState.setState({ + showDeleteModal: true, + eventToDelete: { + id: this.state.id, + title: this.state.title || 'Untitled', + }, + }); + } catch (error) { + console.error('Error showing delete confirmation:', error); + } + } + + formatDateTimeForInput(date) { + // Make sure date is a valid Date object + if (!(date instanceof Date) || isNaN(date.getTime())) { + // If it's a string that looks like a date, try to parse it + if (typeof date === 'string') { + date = new Date(date); + } + // If still not valid, return current time + if (!(date instanceof Date) || isNaN(date.getTime())) { + date = new Date(); + } + } + return date.toISOString().slice(0, 16); // Format: YYYY-MM-DDTHH:mm + } + + render() { + const { title, startTime, endTime, description, id } = this.state; + + return this.createElement( + 'div', + { className: 'event-editor' }, + + // Navigation bar + new NavigationBar({ + title: id ? 'Edit Event' : 'New Event', + leftButton: { + element: 'button', + props: { + className: 'nav-button cancel-button', + onClick: this.handleCancel, + 'aria-label': 'Cancel', + }, + content: 'Cancel', + }, + rightButton: { + element: 'button', + props: { + className: 'nav-button save-button', + onClick: this.handleSave, + 'aria-label': 'Save event', + }, + content: 'Save', + }, + }), + + // Editor content + this.createElement( + 'div', + { className: 'event-form' }, + + // Title input + this.createElement('input', { + type: 'text', + className: 'event-title-input', + placeholder: 'Event title...', + value: title, + onInput: this.handleTitleChange, + ref: this.setTitleInputRef, + required: true, + }), + + // Time inputs container + this.createElement( + 'div', + { className: 'time-container' }, + + // Start time input + this.createElement('input', { + type: 'datetime-local', + className: 'time-input', + value: startTime, + onInput: this.handleStartTimeChange, + ref: this.setStartTimeInputRef, + required: true, + }), + + // End time input + this.createElement('input', { + type: 'datetime-local', + className: 'time-input', + value: endTime, + onInput: this.handleEndTimeChange, + ref: this.setEndTimeInputRef, + required: true, + }) + ), + + // Description textarea + this.createElement('textarea', { + className: 'event-description-input', + placeholder: 'Add description...', + value: description, + onInput: this.handleDescriptionChange, + ref: this.setDescriptionInputRef, + }), + + // Delete button (only for existing events) + id && + this.createElement( + 'button', + { + type: 'button', + className: 'delete-event-button', + onClick: this.handleDelete, + }, + 'Delete Event' + ) + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/calendar/index.js b/arma/client/addons/phone/ui/_site/js/apps/calendar/index.js new file mode 100644 index 0000000..2336a18 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/calendar/index.js @@ -0,0 +1,118 @@ +/** + * @fileoverview Main entry point for the Calendar application + * + * This module initializes the Calendar app UI, including: + * - Displaying the calendar view + * - Handling event creation, editing, and deletion via EventEditor + * - Managing event persistence via A3API + */ + +/** + * Initializes and mounts the Calendar application. + * @param {HTMLElement} container - The DOM element to mount the app into. + */ +function initializeCalendarApp(container) { + const { events = [], selectedDate = new Date(), showEventEditor = false, currentEvent = null } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Calendar'); + + // Check if we're viewing/editing a specific event + if (showEventEditor || currentEvent) { + // Show event editor + const eventEditor = new EventEditor({ + event: currentEvent, + onSave: (savedEvent) => { + const currentEvents = globalState.getState().events || []; + let updatedEvents; + + if (savedEvent.id && currentEvents.find(e => e.id === savedEvent.id)) { + // Update existing event + updatedEvents = currentEvents.map(e => e.id === savedEvent.id ? savedEvent : e); + } else { + // Add new event + updatedEvents = [savedEvent, ...currentEvents]; + } + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false + }); + + // Save to server + if (typeof saveCalendarEvent === 'function') { + saveCalendarEvent(savedEvent); + } + }, + onCancel: () => { + globalState.setState({ + currentEvent: null, + showEventEditor: false + }); + }, + onDelete: (eventId) => { + const currentEvents = globalState.getState().events || []; + const updatedEvents = currentEvents.filter(e => e.id !== eventId); + + globalState.setState({ + events: updatedEvents, + currentEvent: null, + showEventEditor: false + }); + + // Delete from server + if (typeof deleteCalendarEvent === 'function') { + deleteCalendarEvent(eventId); + } + } + }); + eventEditor.mount(appContainer); + } else { + // Show calendar view + const navBar = new NavigationBar({ + title: 'Calendar', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-event-button', + onClick: () => { + globalState.setState({ + showEventEditor: true, + currentEvent: null + }); + }, + 'aria-label': 'Add Event' + }, + content: '+' + } + }); + navBar.mount(appContainer); + + const calendar = new Calendar({ + selectedDate: selectedDate, + events: events, + onDayClick: (date) => { + globalState.setState({ + selectedDate: date, + currentEvent: null, + showEventEditor: false + }); + }, + onEventClick: (event) => { + globalState.setState({ + currentEvent: event, + showEventEditor: true + }); + } + }); + calendar.mount(appContainer); + } + + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeCalendarApp = initializeCalendarApp; \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/clock/components/AlarmClock.js b/arma/client/addons/phone/ui/_site/js/apps/clock/components/AlarmClock.js new file mode 100644 index 0000000..6085e7e --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/clock/components/AlarmClock.js @@ -0,0 +1,218 @@ +/** + * @format + * @class AlarmClock + * @extends Component + * @description A component for managing alarms. + */ + +class AlarmClock extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + this.state = { + showAddForm: false, + newAlarmTime: '07:00', + newAlarmLabel: '' + }; + + // Bind methods + this.toggleAddForm = this.toggleAddForm.bind(this); + this.handleAddAlarm = this.handleAddAlarm.bind(this); + this.formatTime = this.formatTime.bind(this); + } + + /** + * Toggle add alarm form + */ + toggleAddForm() { + // Use setState for form visibility changes as they need re-render + this.setState({ + showAddForm: !this.state.showAddForm, + newAlarmTime: '07:00', + newAlarmLabel: '' + }); + } + + /** + * Handle adding a new alarm + */ + handleAddAlarm() { + const newAlarmTime = this.state.newAlarmTime; + const newAlarmLabel = this.state.newAlarmLabel; + if (newAlarmTime && this.props.onAddAlarm) { + this.props.onAddAlarm({ + time: newAlarmTime, + label: newAlarmLabel || 'Alarm', + enabled: true, + days: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] // Default to weekdays + }); + // Use setState to hide form and reset state + this.setState({ + showAddForm: false, + newAlarmTime: '07:00', + newAlarmLabel: '' + }); + } + } + + /** + * Format time for display + */ + formatTime(timeString) { + const [hours, minutes] = timeString.split(':'); + if (this.props.format24h) { + return `${hours}:${minutes}`; + } else { + const hour = parseInt(hours); + const ampm = hour >= 12 ? 'PM' : 'AM'; + const displayHour = hour % 12 || 12; + return `${displayHour}:${minutes} ${ampm}`; + } + } + + /** + * Render add alarm form + */ + renderAddForm() { + if (!this.state.showAddForm) return null; + + return this.createElement( + 'div', + { className: 'add-alarm-form' }, + this.createElement('h3', {}, 'Add Alarm'), + + this.createElement('input', { + type: 'time', + value: this.state.newAlarmTime, + onChange: (e) => { + // Update state directly to avoid re-render during input + this.state.newAlarmTime = e.target.value; + } + }), + + this.createElement('input', { + type: 'text', + placeholder: 'Alarm label (optional)', + value: this.state.newAlarmLabel, + onChange: (e) => { + // Update state directly to avoid re-render during input + this.state.newAlarmLabel = e.target.value; + } + }), + + this.createElement( + 'div', + { className: 'form-buttons' }, + this.createElement( + 'button', + { onClick: this.toggleAddForm }, + 'Cancel' + ), + this.createElement( + 'button', + { onClick: this.handleAddAlarm }, + 'Add Alarm' + ) + ) + ); + } + + /** + * Render alarms list + */ + renderAlarms() { + const { alarms } = this.props; + + if (!alarms || alarms.length === 0) { + return this.createElement( + 'div', + { className: 'empty-state' }, + this.createElement('p', {}, 'No alarms set. Tap + to add one.') + ); + } + + return this.createElement( + 'div', + { className: 'alarms-list' }, + ...alarms.map(alarm => + this.createElement( + 'div', + { + className: `alarm-item ${alarm.enabled ? 'enabled' : 'disabled'}`, + key: alarm.id + }, + this.createElement( + 'div', + { className: 'alarm-info' }, + this.createElement( + 'div', + { className: 'alarm-time' }, + this.formatTime(alarm.time) + ), + this.createElement( + 'div', + { className: 'alarm-label' }, + alarm.label + ), + alarm.days && this.createElement( + 'div', + { className: 'alarm-days' }, + alarm.days.join(', ') + ) + ), + this.createElement( + 'div', + { className: 'alarm-controls' }, + this.createElement( + 'button', + { + className: 'toggle-alarm', + onClick: () => this.props.onToggleAlarm(alarm.id) + }, + alarm.enabled ? 'On' : 'Off' + ), + this.createElement( + 'button', + { + className: 'remove-alarm', + onClick: () => this.props.onRemoveAlarm(alarm.id), + 'aria-label': 'Delete alarm' + }, + 'Delete' + ) + ) + ) + ) + ); + } + + /** + * Render the alarm clock component + */ + render() { + return this.createElement( + 'div', + { className: 'alarm-clock' }, + + // Add alarm button + !this.state.showAddForm && this.createElement( + 'button', + { + className: 'add-alarm-button', + onClick: this.toggleAddForm + }, + '+ Add Alarm' + ), + + // Add alarm form + this.renderAddForm(), + + // Alarms list + this.renderAlarms() + ); + } +} + diff --git a/arma/client/addons/phone/ui/_site/js/apps/clock/components/Stopwatch.js b/arma/client/addons/phone/ui/_site/js/apps/clock/components/Stopwatch.js new file mode 100644 index 0000000..770a2f3 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/clock/components/Stopwatch.js @@ -0,0 +1,311 @@ +/** + * @format + * @class Stopwatch + * @extends Component + * @description A component that provides stopwatch functionality with lap timing. + */ + +class Stopwatch extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} props.format24h - Whether to use 24-hour format + */ + constructor(props = {}) { + super(props); + this.state = { + time: 0, // Time in milliseconds + isRunning: false, + lapTimes: [], + startTime: null + }; + + // Bind methods + this.start = this.start.bind(this); + this.stop = this.stop.bind(this); + this.reset = this.reset.bind(this); + this.lap = this.lap.bind(this); + this.updateTime = this.updateTime.bind(this); + this.formatTime = this.formatTime.bind(this); + + // Timer for updates + this.interval = null; + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + /** + * Start the stopwatch + */ + start() { + if (!this.state.isRunning) { + const startTime = Date.now() - this.state.time; + this.setState({ + isRunning: true, + startTime: startTime + }); + + this.interval = setInterval(this.updateTime, 10); // Update every 10ms for precision + } + } + + /** + * Stop the stopwatch + */ + stop() { + if (this.state.isRunning) { + this.setState({ isRunning: false }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + } + + /** + * Reset the stopwatch + */ + reset() { + this.setState({ + time: 0, + isRunning: false, + lapTimes: [], + startTime: null + }); + + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Record a lap time + */ + lap() { + if (this.state.isRunning) { + const currentTime = this.state.time; + const previousLapTime = this.state.lapTimes.length > 0 + ? this.state.lapTimes[this.state.lapTimes.length - 1].totalTime + : 0; + + const lapTime = { + id: generateId(), + lapNumber: this.state.lapTimes.length + 1, + lapTime: currentTime - previousLapTime, + totalTime: currentTime, + timestamp: new Date().toISOString() + }; + + this.setState({ + lapTimes: [...this.state.lapTimes, lapTime] + }); + } + } + + /** + * Update the current time + */ + updateTime() { + if (this.state.isRunning && this.state.startTime) { + const currentTime = Date.now() - this.state.startTime; + // Update state directly to avoid re-render during stopwatch running + this.state.time = currentTime; + + // Update only the stopwatch time display element + const stopwatchDisplay = document.querySelector('.stopwatch-time'); + if (stopwatchDisplay) { + stopwatchDisplay.textContent = this.formatTime(currentTime); + } + } + } + + /** + * Format time for display (HH:MM:SS.mmm) + */ + formatTime(milliseconds) { + const totalSeconds = Math.floor(milliseconds / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + const ms = Math.floor((milliseconds % 1000) / 10); // Show centiseconds + + return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(2, '0')}`; + } + + /** + * Get the fastest and slowest lap times + */ + getLapStats() { + if (this.state.lapTimes.length === 0) return null; + + const lapTimes = this.state.lapTimes.map(lap => lap.lapTime); + const fastest = Math.min(...lapTimes); + const slowest = Math.max(...lapTimes); + + return { + fastest: this.state.lapTimes.find(lap => lap.lapTime === fastest), + slowest: this.state.lapTimes.find(lap => lap.lapTime === slowest) + }; + } + + /** + * Render the main stopwatch display + */ + renderStopwatchDisplay() { + const { time, isRunning } = this.state; + + return this.createElement( + 'div', + { className: 'stopwatch-display' }, + this.createElement( + 'div', + { + className: `stopwatch-time ${isRunning ? 'running' : 'stopped'}`, + 'aria-live': 'polite', + 'aria-label': 'Stopwatch time' + }, + this.formatTime(time) + ), + this.createElement( + 'div', + { className: 'stopwatch-status' }, + isRunning ? 'Running' : (time > 0 ? 'Stopped' : 'Ready') + ) + ); + } + + /** + * Render control buttons + */ + renderControls() { + const { isRunning, time } = this.state; + + return this.createElement( + 'div', + { className: 'stopwatch-controls' }, + + // Start/Stop button + this.createElement( + 'button', + { + className: `control-button ${isRunning ? 'stop-button' : 'start-button'}`, + onClick: isRunning ? this.stop : this.start, + 'aria-label': isRunning ? 'Stop stopwatch' : 'Start stopwatch' + }, + isRunning ? 'Stop' : 'Start' + ), + + // Lap button (only when running) + isRunning && this.createElement( + 'button', + { + className: 'control-button lap-button', + onClick: this.lap, + 'aria-label': 'Record lap time' + }, + 'Lap' + ), + + // Reset button (only when stopped and time > 0) + !isRunning && time > 0 && this.createElement( + 'button', + { + className: 'control-button reset-button', + onClick: this.reset, + 'aria-label': 'Reset stopwatch' + }, + 'Reset' + ) + ); + } + + /** + * Render lap times list + */ + renderLapTimes() { + const { lapTimes } = this.state; + + if (lapTimes.length === 0) { + return null; + } + + const stats = this.getLapStats(); + + return this.createElement( + 'div', + { className: 'lap-times-section' }, + this.createElement( + 'h3', + { className: 'lap-times-title' }, + 'Lap Times' + ), + + // Lap times list + this.createElement( + 'div', + { className: 'lap-times-list' }, + ...lapTimes.slice().reverse().map(lap => { + const isFastest = stats && lap.id === stats.fastest.id; + const isSlowest = stats && lap.id === stats.slowest.id && lapTimes.length > 1; + + return this.createElement( + 'div', + { + className: `lap-time-item ${ + isFastest ? 'fastest' : isSlowest ? 'slowest' : '' + }`, + key: lap.id + }, + this.createElement( + 'div', + { className: 'lap-number' }, + `Lap ${lap.lapNumber}` + ), + this.createElement( + 'div', + { className: 'lap-time' }, + this.formatTime(lap.lapTime) + ), + this.createElement( + 'div', + { className: 'total-time' }, + this.formatTime(lap.totalTime) + ), + (isFastest || isSlowest) && this.createElement( + 'div', + { className: 'lap-indicator' }, + isFastest ? 'Fastest' : 'Slowest' + ) + ); + }) + ) + ); + } + + /** + * Render the stopwatch component + */ + render() { + return this.createElement( + 'div', + { className: 'stopwatch' }, + + // Main stopwatch display + this.renderStopwatchDisplay(), + + // Control buttons + this.renderControls(), + + // Lap times + this.renderLapTimes() + ); + } +} + diff --git a/arma/client/addons/phone/ui/_site/js/apps/clock/components/Timer.js b/arma/client/addons/phone/ui/_site/js/apps/clock/components/Timer.js new file mode 100644 index 0000000..ed3c937 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/clock/components/Timer.js @@ -0,0 +1,245 @@ +/** + * @format + * @class Timer + * @extends Component + * @description A countdown timer component. + */ + +class Timer extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + this.state = { + minutes: 5, + seconds: 0, + totalTime: 0, + timeLeft: 0, + isRunning: false, + isFinished: false + }; + + // Bind methods + this.start = this.start.bind(this); + this.pause = this.pause.bind(this); + this.reset = this.reset.bind(this); + this.setTime = this.setTime.bind(this); + this.updateTimer = this.updateTimer.bind(this); + this.formatTime = this.formatTime.bind(this); + + // Timer interval + this.interval = null; + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + /** + * Set timer duration + */ + setTime(minutes, seconds) { + const totalSeconds = minutes * 60 + seconds; + this.setState({ + minutes, + seconds, + totalTime: totalSeconds, + timeLeft: totalSeconds, + isFinished: false + }); + } + + /** + * Start the timer + */ + start() { + if (this.state.timeLeft > 0 && !this.state.isRunning) { + this.setState({ isRunning: true }); + this.interval = setInterval(this.updateTimer, 1000); + } + } + + /** + * Pause the timer + */ + pause() { + this.setState({ isRunning: false }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Reset the timer + */ + reset() { + this.setState({ + timeLeft: this.state.totalTime, + isRunning: false, + isFinished: false + }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + + /** + * Update timer countdown + */ + updateTimer() { + if (this.state.timeLeft > 0) { + // Update state directly to avoid re-render during countdown + this.state.timeLeft = this.state.timeLeft - 1; + + // Update only the timer display element + const timerDisplay = document.querySelector('.timer-time'); + if (timerDisplay) { + timerDisplay.textContent = this.formatTime(this.state.timeLeft); + } + } else { + // Timer finished - this needs a full re-render + this.setState({ + isRunning: false, + isFinished: true + }); + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } + } + + /** + * Format time for display + */ + formatTime(totalSeconds) { + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; + } + + /** + * Render timer controls + */ + renderControls() { + const { isRunning, timeLeft, isFinished } = this.state; + + return this.createElement( + 'div', + { className: 'timer-controls' }, + + // Start/Pause button + timeLeft > 0 && !isFinished && this.createElement( + 'button', + { + className: `control-button ${isRunning ? 'pause-button' : 'start-button'}`, + onClick: isRunning ? this.pause : this.start + }, + isRunning ? 'Pause' : 'Start' + ), + + // Reset button + (timeLeft !== this.state.totalTime || isFinished) && this.createElement( + 'button', + { + className: 'control-button reset-button', + onClick: this.reset + }, + 'Reset' + ) + ); + } + + /** + * Render time setters + */ + renderTimeSetters() { + if (this.state.isRunning) return null; + + return this.createElement( + 'div', + { className: 'time-setters' }, + this.createElement( + 'div', + { className: 'time-setter' }, + this.createElement('label', {}, 'Minutes'), + this.createElement('input', { + type: 'number', + min: '0', + max: '59', + value: this.state.minutes, + onChange: (e) => { + // Update state directly to avoid re-render during input + const minutes = parseInt(e.target.value) || 0; + this.state.minutes = minutes; + this.setTime(minutes, this.state.seconds); + } + }) + ), + this.createElement( + 'div', + { className: 'time-setter' }, + this.createElement('label', {}, 'Seconds'), + this.createElement('input', { + type: 'number', + min: '0', + max: '59', + value: this.state.seconds, + onChange: (e) => { + // Update state directly to avoid re-render during input + const seconds = parseInt(e.target.value) || 0; + this.state.seconds = seconds; + this.setTime(this.state.minutes, seconds); + } + }) + ) + ); + } + + /** + * Render the timer component + */ + render() { + const { timeLeft, isFinished } = this.state; + + return this.createElement( + 'div', + { className: 'timer' }, + + // Timer display + this.createElement( + 'div', + { className: 'timer-display' }, + this.createElement( + 'div', + { + className: `timer-time ${isFinished ? 'finished' : ''}`, + 'aria-live': 'polite' + }, + this.formatTime(timeLeft) + ), + this.createElement( + 'div', + { className: 'timer-status' }, + isFinished ? 'Time\'s up!' : 'Timer' + ) + ), + + // Time setters + this.renderTimeSetters(), + + // Controls + this.renderControls() + ); + } +} + diff --git a/arma/client/addons/phone/ui/_site/js/apps/clock/components/WorldClock.js b/arma/client/addons/phone/ui/_site/js/apps/clock/components/WorldClock.js new file mode 100644 index 0000000..16e12ab --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/clock/components/WorldClock.js @@ -0,0 +1,433 @@ +/** + * @format + * @class WorldClock + * @extends Component + * @description A component that displays multiple world clocks for different time zones. + */ + +class WorldClock extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} props.clocks - Array of world clock objects + * @param {boolean} props.format24h - Whether to use 24-hour format + * @param {Function} props.onAddClock - Callback when adding a new clock + * @param {Function} props.onRemoveClock - Callback when removing a clock + */ + constructor(props = {}) { + super(props); + this.state = { + currentTime: new Date(), + showAddForm: false, + selectedTimezone: '' + }; + + // Bind methods + this.updateTime = this.updateTime.bind(this); + this.toggleAddForm = this.toggleAddForm.bind(this); + this.handleAddClock = this.handleAddClock.bind(this); + this.handleRemoveClock = this.handleRemoveClock.bind(this); + this.formatTime = this.formatTime.bind(this); + this.getTimezoneTime = this.getTimezoneTime.bind(this); + + // Timer for real-time updates + this.timeUpdateInterval = null; + + // Popular time zones + this.popularTimezones = [ + 'America/New_York', + 'America/Los_Angeles', + 'America/Chicago', + 'Europe/London', + 'Europe/Paris', + 'Europe/Berlin', + 'Asia/Tokyo', + 'Asia/Shanghai', + 'Asia/Kolkata', + 'Australia/Sydney', + 'Pacific/Auckland', + 'Africa/Cairo', + 'America/Sao_Paulo', + 'Asia/Dubai', + 'Europe/Moscow' + ]; + } + + /** + * Component mounted - start time updates + */ + componentDidMount() { + this.timeUpdateInterval = setInterval(this.updateTime, 1000); + } + + /** + * Component will unmount - clear intervals + */ + componentWillUnmount() { + if (this.timeUpdateInterval) { + clearInterval(this.timeUpdateInterval); + } + } + + /** + * Update current time + */ + updateTime() { + // Update state directly to avoid re-render during time updates + this.state.currentTime = new Date(); + const currentTime = this.state.currentTime; + + // Update local time display + const localTimeElement = document.querySelector('.local-time'); + if (localTimeElement) { + const timeOptions = { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + localTimeElement.textContent = currentTime.toLocaleTimeString('en-US', timeOptions); + } + + // Update all world clock time displays + const worldClockItems = document.querySelectorAll('.world-clock-item'); + worldClockItems.forEach((clockItem, index) => { + const clockTimeElement = clockItem.querySelector('.clock-time'); + const clockDateElement = clockItem.querySelector('.clock-date'); + + if (clockTimeElement && this.props.clocks && this.props.clocks[index]) { + const timezone = this.props.clocks[index].timezone; + + // Update time + try { + const timeOptions = { + timeZone: timezone, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + clockTimeElement.textContent = currentTime.toLocaleTimeString('en-US', timeOptions); + } catch (error) { + clockTimeElement.textContent = '--:--:--'; + } + + // Update date + if (clockDateElement) { + try { + const dateOptions = { + timeZone: timezone, + weekday: 'short', + month: 'short', + day: 'numeric' + }; + clockDateElement.textContent = currentTime.toLocaleDateString('en-US', dateOptions); + } catch (error) { + clockDateElement.textContent = 'Invalid date'; + } + } + } + }); + } + + /** + * Toggle add clock form + */ + toggleAddForm() { + // Use setState for form visibility changes as they need re-render + this.setState({ + showAddForm: !this.state.showAddForm, + selectedTimezone: '' // Reset selection when toggling + }); + } + + /** + * Handle adding a new clock + */ + handleAddClock() { + const selectedTimezone = this.state.selectedTimezone; + if (selectedTimezone && this.props.onAddClock) { + this.props.onAddClock(selectedTimezone); + // Use setState to hide form and reset state + this.setState({ + showAddForm: false, + selectedTimezone: '' + }); + } + } + + /** + * Handle removing a clock + */ + handleRemoveClock(clockId) { + if (this.props.onRemoveClock) { + this.props.onRemoveClock(clockId); + } + } + + /** + * Get time for a specific timezone + */ + getTimezoneTime(timezone) { + try { + return new Date().toLocaleString('en-US', { + timeZone: timezone, + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }); + } catch (error) { + return 'Invalid timezone'; + } + } + + /** + * Format time for display + */ + formatTime(date, timezone) { + try { + const options = { + timeZone: timezone, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !this.props.format24h + }; + return date.toLocaleTimeString('en-US', options); + } catch (error) { + return '--:--:--'; + } + } + + /** + * Get date for timezone + */ + getTimezoneDate(timezone) { + try { + return new Date().toLocaleDateString('en-US', { + timeZone: timezone, + weekday: 'short', + month: 'short', + day: 'numeric' + }); + } catch (error) { + return 'Invalid date'; + } + } + + /** + * Render local time section + */ + renderLocalTime() { + const { currentTime } = this.state; + const { format24h } = this.props; + + const timeOptions = { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: !format24h + }; + + const dateOptions = { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }; + + return this.createElement( + 'div', + { className: 'local-time-section' }, + this.createElement( + 'h2', + { className: 'local-time-label' }, + 'Local Time' + ), + this.createElement( + 'div', + { className: 'local-time-display' }, + this.createElement( + 'div', + { className: 'local-time' }, + currentTime.toLocaleTimeString('en-US', timeOptions) + ), + this.createElement( + 'div', + { className: 'local-date' }, + currentTime.toLocaleDateString('en-US', dateOptions) + ) + ) + ); + } + + /** + * Render add clock form + */ + renderAddForm() { + if (!this.state.showAddForm) return null; + + return this.createElement( + 'div', + { className: 'add-clock-form' }, + this.createElement( + 'h3', + {}, + 'Add World Clock' + ), + this.createElement( + 'select', + { + className: 'timezone-select', + value: this.state.selectedTimezone, + onChange: (e) => { + // Update state directly to avoid re-render during selection + this.state.selectedTimezone = e.target.value; + + // Update button disabled state directly + const addButton = document.querySelector('.add-button'); + if (addButton) { + addButton.disabled = !e.target.value; + } + } + }, + this.createElement('option', { value: '' }, 'Select a timezone...'), + ...this.popularTimezones.map(tz => + this.createElement( + 'option', + { value: tz, key: tz }, + tz.replace('_', ' ').split('/').join(' - ') + ) + ) + ), + this.createElement( + 'div', + { className: 'form-buttons' }, + this.createElement( + 'button', + { + type: 'button', + onClick: this.toggleAddForm, + className: 'cancel-button' + }, + 'Cancel' + ), + this.createElement( + 'button', + { + type: 'button', + onClick: this.handleAddClock, + className: 'add-button', + disabled: !this.state.selectedTimezone + }, + 'Add Clock' + ) + ) + ); + } + + /** + * Render world clocks list + */ + renderWorldClocks() { + const { clocks } = this.props; + const { currentTime } = this.state; + + if (!clocks || clocks.length === 0) { + return this.createElement( + 'div', + { className: 'empty-state' }, + this.createElement( + 'p', + {}, + 'No world clocks added yet. Tap + to add one.' + ) + ); + } + + return this.createElement( + 'div', + { className: 'world-clocks-list' }, + ...clocks.map(clock => + this.createElement( + 'div', + { + className: 'world-clock-item', + key: clock.id + }, + this.createElement( + 'div', + { className: 'clock-info' }, + this.createElement( + 'div', + { className: 'clock-city' }, + clock.city + ), + this.createElement( + 'div', + { className: 'clock-timezone' }, + clock.timezone.split('/').join(' / ') + ) + ), + this.createElement( + 'div', + { className: 'clock-time-info' }, + this.createElement( + 'div', + { className: 'clock-time' }, + this.formatTime(currentTime, clock.timezone) + ), + this.createElement( + 'div', + { className: 'clock-date' }, + this.getTimezoneDate(clock.timezone) + ) + ), + this.createElement( + 'button', + { + className: 'remove-clock-button', + onClick: () => this.handleRemoveClock(clock.id), + 'aria-label': `Remove ${clock.city} clock` + }, + 'Remove' + ) + ) + ) + ); + } + + /** + * Render the world clock component + */ + render() { + return this.createElement( + 'div', + { className: 'world-clock' }, + + // Local time section + this.renderLocalTime(), + + // Add clock button + !this.state.showAddForm && this.createElement( + 'button', + { + className: 'add-world-clock-button', + onClick: this.toggleAddForm + }, + '+ Add World Clock' + ), + + // Add clock form + this.renderAddForm(), + + // World clocks list + this.renderWorldClocks() + ); + } +} + diff --git a/arma/client/addons/phone/ui/_site/js/apps/clock/index.js b/arma/client/addons/phone/ui/_site/js/apps/clock/index.js new file mode 100644 index 0000000..2cf9e91 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/clock/index.js @@ -0,0 +1,202 @@ +/** + * @fileoverview Main entry point for the Clock application + * + * This module initializes the Clock app UI, including: + * - Multiple clock modes (World Clock, Stopwatch, Timer, Alarm) + * - Tab-based navigation between different clock features + * - Real-time updates and time synchronization + * - Persistent settings and preferences + * + * The clock app supports: + * - World clocks for different time zones + * - Stopwatch with lap times + * - Countdown timers + * - Alarm management + * - 12/24 hour format switching + */ + +// Initialize the clock app +function initializeClockApp(container) { + // Get current clock state from global state + const { + clockMode = 'world', + worldClocks = [], + timers = [], + alarms = [], + clockSettings = { format24h: true } + } = globalState.getState(); + + const appContainer = document.createElement('div'); + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Clock'); + + // Navigation bar with mode switching + const navBar = new NavigationBar({ + title: 'Clock', + leftButton: { + element: 'button', + props: { + className: 'nav-button settings-button', + onClick: () => { + // Toggle 12/24 hour format + const newFormat = !clockSettings.format24h; + globalState.setState({ + clockSettings: { ...clockSettings, format24h: newFormat } + }); + }, + 'aria-label': 'Toggle time format' + }, + content: clockSettings.format24h ? '24h' : '12h' + } + }); + navBar.mount(appContainer); + + // Tab navigation + const tabContainer = document.createElement('div'); + tabContainer.className = 'clock-tabs'; + + const tabs = [ + { id: 'world', label: 'World Clock' }, + { id: 'stopwatch', label: 'Stopwatch' }, + { id: 'timer', label: 'Timer' }, + { id: 'alarm', label: 'Alarm' } + ]; + + tabs.forEach(tab => { + const tabButton = document.createElement('button'); + tabButton.className = `clock-tab ${clockMode === tab.id ? 'active' : ''}`; + tabButton.textContent = tab.label; + tabButton.setAttribute('aria-label', tab.label); + tabButton.onclick = () => { + globalState.setState({ clockMode: tab.id }); + }; + tabContainer.appendChild(tabButton); + }); + + appContainer.appendChild(tabContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'clock-content'; + appContainer.appendChild(contentContainer); + + // Render appropriate clock mode + switch (clockMode) { + case 'world': + const worldClock = new WorldClock({ + clocks: worldClocks, + format24h: clockSettings.format24h, + onAddClock: (timezone) => { + const newClock = { + id: generateId(), + timezone: timezone, + city: timezone.split('/').pop().replace('_', ' '), + addedAt: new Date().toISOString() + }; + + // Save to server + if (typeof saveWorldClock === 'function') { + saveWorldClock(newClock); + } + + globalState.setState({ + worldClocks: [...worldClocks, newClock] + }); + }, + onRemoveClock: (clockId) => { + // Delete from server + if (typeof deleteWorldClock === 'function') { + deleteWorldClock(clockId); + } + + globalState.setState({ + worldClocks: worldClocks.filter(c => c.id !== clockId) + }); + } + }); + worldClock.mount(contentContainer); + break; + + case 'stopwatch': + const stopwatch = new Stopwatch({ + format24h: clockSettings.format24h + }); + stopwatch.mount(contentContainer); + break; + + case 'timer': + const timer = new Timer({ + timers: timers, + onAddTimer: (timerData) => { + const newTimer = { + id: generateId(), + ...timerData, + createdAt: new Date().toISOString() + }; + globalState.setState({ + timers: [...timers, newTimer] + }); + }, + onRemoveTimer: (timerId) => { + globalState.setState({ + timers: timers.filter(t => t.id !== timerId) + }); + } + }); + timer.mount(contentContainer); + break; + + case 'alarm': + const alarm = new AlarmClock({ + alarms: alarms, + format24h: clockSettings.format24h, + onAddAlarm: (alarmData) => { + const newAlarm = { + id: generateId(), + ...alarmData, + createdAt: new Date().toISOString() + }; + + // Save to server + if (typeof saveAlarm === 'function') { + saveAlarm(newAlarm); + } + + globalState.setState({ + alarms: [...alarms, newAlarm] + }); + }, + onRemoveAlarm: (alarmId) => { + // Delete from server + if (typeof deleteAlarm === 'function') { + deleteAlarm(alarmId); + } + + globalState.setState({ + alarms: alarms.filter(a => a.id !== alarmId) + }); + }, + onToggleAlarm: (alarmId) => { + // Toggle on server + if (typeof toggleAlarm === 'function') { + toggleAlarm(alarmId); + } + + globalState.setState({ + alarms: alarms.map(a => + a.id === alarmId ? { ...a, enabled: !a.enabled } : a + ) + }); + } + }); + alarm.mount(contentContainer); + break; + } + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeClockApp = initializeClockApp; \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/contacts/components/AddContactForm.js b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/AddContactForm.js new file mode 100644 index 0000000..2ce76df --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/AddContactForm.js @@ -0,0 +1,170 @@ +/** @format */ + +/** + * @class AddContactForm + * @extends Component + * @description A form component for adding new contacts to the phone app. + * Manages its own state for form inputs and handles contact creation. + */ +class AddContactForm extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Function} [props.onAdd] - Callback function called when a new contact is added + */ + constructor(props) { + super(props); + + // Initialize form state + this.state = { + name: '', + phone: '', + }; + + // Create refs for input elements + this.nameInputRef = null; + this.phoneInputRef = null; + + // Bind methods + this.handleAddContact = this.handleAddContact.bind(this); + this.handleNameChange = this.handleNameChange.bind(this); + this.handlePhoneChange = this.handlePhoneChange.bind(this); + this.setNameInputRef = this.setNameInputRef.bind(this); + this.setPhoneInputRef = this.setPhoneInputRef.bind(this); + } + + /** + * Store reference to the name input element + * @param {HTMLInputElement} element - The input DOM element + */ + setNameInputRef(element) { + if (element) { + this.nameInputRef = element; + } + } + + /** + * Store reference to the phone input element + * @param {HTMLInputElement} element - The input DOM element + */ + setPhoneInputRef(element) { + if (element) { + this.phoneInputRef = element; + } + } + + /** + * Handle changes to the name input + * @param {Event} e - Input change event + */ + handleNameChange(e) { + // Update state directly to avoid re-render + this.state.name = e.target.value; + } + + /** + * Handle changes to the phone input + * @param {Event} e - Input change event + */ + handlePhoneChange(e) { + // Update state directly to avoid re-render + this.state.phone = e.target.value; + } + + /** + * Handle add contact button click + */ + handleAddContact() { + const { name, phone } = this.state; + + if (name.trim() && phone.trim()) { + const currentState = globalState.getState(); + const trimmedName = name.trim(); + const trimmedPhone = phone.trim(); + + // Check if contact already exists (by name or phone) + const contactExists = currentState.contacts.some(contact => + contact.name.toLowerCase() === trimmedName.toLowerCase() || + contact.phone === trimmedPhone + ); + + if (contactExists) { + console.warn('Contact already exists with this name or phone number'); + // You could show a user-friendly message here + return; + } + + // Server owns the actual contact entry; name is only used for local duplicate checks. + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: "phone::add::contact::by::phone", + data: { + name: trimmedName, + phone: trimmedPhone + } + })); + } + + // Reset form state and input values + this.state.name = ''; + this.state.phone = ''; + + if (this.nameInputRef) { + this.nameInputRef.value = ''; + } + if (this.phoneInputRef) { + this.phoneInputRef.value = ''; + } + + // Focus back on name input for quick consecutive entries + if (this.nameInputRef) { + this.nameInputRef.focus(); + } + + // Notify parent component if callback provided + if (this.props.onAdd) { + this.props.onAdd({ name: trimmedName, phone: trimmedPhone }); + } + } + } + + /** + * Render the form + * @returns {HTMLElement} The rendered form element + */ + render() { + return this.createElement( + 'div', + { + className: 'add-contact-form', + }, + this.createElement( + 'h3', + { + style: { marginBottom: '15px' }, + }, + 'Add New Contact' + ), + this.createElement('input', { + type: 'text', + placeholder: 'Name', + ref: this.setNameInputRef, + onInput: this.handleNameChange + }), + this.createElement('input', { + type: 'tel', + placeholder: 'Phone Number', + ref: this.setPhoneInputRef, + onInput: this.handlePhoneChange + }), + this.createElement( + 'button', + { + type: 'button', + onClick: this.handleAddContact + }, + 'Add Contact' + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactItem.js b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactItem.js new file mode 100644 index 0000000..6e47572 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactItem.js @@ -0,0 +1,75 @@ +/** @format */ + +/** + * @class ContactItem + * @extends Component + * @description A component that renders a single contact item in the contacts list. + * Displays the contact's avatar, name, and phone number, and handles click interactions. + */ +class ContactItem extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} props.contact - The contact data to display + * @param {string} props.contact.name - Contact's full name + * @param {string} props.contact.phone - Contact's phone number + * @param {string} props.contact.avatar - Contact's avatar text (usually initials) + * @param {Function} [props.onClick] - Callback function when contact is clicked + */ + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + } + + /** + * Handle click events on the contact item + * @param {Event} e - Click event object + * @private + */ + handleClick(e) { + const { onClick, contact } = this.props; + + if (onClick) { + onClick(contact); + } else { + console.warn('ContactItem: No onClick handler provided'); + } + } + + /** + * Render the contact item + * @returns {HTMLElement} The rendered contact item element + */ + render() { + const { contact } = this.props; + const displayName = contact.fullName || contact.name; + const subtitleParts = [contact.phone]; + if (contact.system) subtitleParts.push('system contact'); + + return this.createElement( + 'li', + { + className: `contact-item${contact.system ? ' system-contact' : ''}`, + onClick: this.handleClick, + role: 'button', + 'aria-label': `Contact ${displayName}`, + }, + // Avatar section + this.createElement( + 'div', + { + className: 'contact-avatar', + 'aria-hidden': 'true', + }, + contact.avatar + ), + // Contact information section + this.createElement( + 'div', + { className: 'contact-info' }, + this.createElement('h3', {}, displayName), + this.createElement('p', { 'aria-label': 'Phone number' }, subtitleParts.filter(Boolean).join(' - ')) + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactList.js b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactList.js new file mode 100644 index 0000000..bff09c1 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/contacts/components/ContactList.js @@ -0,0 +1,114 @@ +/** @format */ + +/** + * @class ContactList + * @extends Component + * @description A component that renders a list of contacts. + * Manages the display of multiple ContactItem components and handles contact selection. + */ +class ContactList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} [props.contacts=[]] - Array of contact objects to display + * @param {Function} [props.onContactClick] - Callback function when a contact is clicked + */ + constructor(props) { + super(props); + this.state = { + filteredContacts: props.contacts || [], + searchTerm: '' + }; + } + + /** + * Update filtered contacts when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if (nextProps.contacts !== this.props.contacts) { + // Re-apply current search filter to new contacts + this.handleSearch(this.state.searchTerm); + } + } + + /** + * Filter contacts based on search term + * @param {string} searchTerm - The search term to filter contacts + * @private + */ + handleSearch(searchTerm) { + const { contacts = [] } = this.props; + const searchTermLower = searchTerm.toLowerCase(); + + const filtered = contacts.filter(contact => + contact.name.toLowerCase().includes(searchTermLower) || + contact.phone.toLowerCase().includes(searchTermLower) + ); + + this.setState({ + filteredContacts: filtered, + searchTerm + }); + } + + /** + * Creates ContactItem components from the filtered contacts array + * @private + * @returns {Array} Array of ContactItem components + */ + renderContactItems() { + const { onContactClick } = this.props; + const { filteredContacts } = this.state; + + return filteredContacts.map( + (contact) => + new ContactItem({ + contact, + onClick: onContactClick, + key: contact.id, + }) + ); + } + + /** + * Render the contact list with search bar + * @returns {HTMLElement} The rendered contact list element + */ + render() { + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'contacts-container', + style: { + display: 'flex', + flexDirection: 'column', + height: '100%' + } + }, + new SearchBar({ + placeholder: 'Search contacts...', + onSearch: this.handleSearch.bind(this), + value: searchTerm + }), + this.createElement( + 'ul', + { + className: 'contact-list', + role: 'list', + 'aria-label': 'Contacts list', + style: { + flex: 1, + overflowY: 'auto', + padding: '10px', + margin: 0, + listStyle: 'none' + } + }, + ...this.renderContactItems() + ) + ); + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/contacts/index.js b/arma/client/addons/phone/ui/_site/js/apps/contacts/index.js new file mode 100644 index 0000000..396d551 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/contacts/index.js @@ -0,0 +1,94 @@ +/** + * @fileoverview Main entry point for the Contacts application + * + * This module initializes the Contacts app UI, including: + * - Rendering the navigation bar with a toggle button for the add contact form + * - Displaying the contact list + * - Handling the add contact form visibility and submission + * + * The add contact button toggles the form and switches between '+' and '-' icons. + * The contact list is always shown; the form appears above it when toggled. + */ + +// Initialize the contacts app +function initializeContactsApp(container) { + // Get current contacts and form visibility from global state + const { contacts, showAddContactForm } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Contacts'); + + /** + * Navigation bar with toggle button + * - Button toggles add contact form visibility + * - Icon switches between '+' (show form) and '-' (hide form) + */ + const navBar = new NavigationBar({ + title: 'Contacts', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-button', + onClick: () => globalState.setState({ showAddContactForm: !showAddContactForm }), + 'aria-label': showAddContactForm ? 'Close Form' : 'Add Contact', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: showAddContactForm ? '-' : '+' + } + }); + navBar.mount(appContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + /** + * Add contact form + * - Only shown if showAddContactForm is true + * - On submit, adds contact and hides form + */ + if (showAddContactForm) { + const addContactForm = new AddContactForm({ + onAdd: (newContact) => { + // Hide form after adding contact + globalState.setState({ + showAddContactForm: false + }); + console.log('New contact added:', newContact); + } + }); + addContactForm.mount(contentContainer); + } + + /** + * Contact list + * - Always shown + * - Clicking a contact opens a modal to call + */ + const contactList = new ContactList({ + contacts, + onContactClick: (contact) => { + globalState.setState({ + selectedContact: contact, + showModal: true + }); + } + }); + contactList.mount(contentContainer); + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeContactsApp = initializeContactsApp; diff --git a/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailComposer.js b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailComposer.js new file mode 100644 index 0000000..0eafca7 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailComposer.js @@ -0,0 +1,172 @@ +/** @format */ + +class MailComposer extends Component { + constructor(props = {}) { + super(props); + const contacts = this.emailableContacts(props.contacts || []); + const defaultRecipient = contacts.length === 1 ? (contacts[0].uid || contacts[0].id || '') : ''; + this.state = { + toUid: defaultRecipient, + subject: '', + body: '' + }; + + this.toRef = null; + this.subjectRef = null; + this.bodyRef = null; + this.lastSendAt = 0; + + this.handleSend = this.handleSend.bind(this); + this.syncSubject = this.syncSubject.bind(this); + this.syncBody = this.syncBody.bind(this); + } + + emailableContacts(contacts = []) { + return contacts.filter((contact) => contact && contact.canEmail !== false && (contact.uid || contact.id)); + } + + readField(id, ref, fallback = '') { + const scopedElement = this.element ? this.element.querySelector(`#${id}`) : null; + const documentElement = typeof document !== 'undefined' ? document.getElementById(id) : null; + const element = scopedElement || documentElement || ref; + if (!element) return fallback; + + if (typeof element.value === 'string' && element.value.length > 0) { + return element.value; + } + + if (typeof element.textContent === 'string' && element.textContent.length > 0) { + return element.textContent; + } + + return fallback; + } + + syncSubject(event) { + this.state.subject = event?.target?.value || ''; + } + + syncBody(event) { + this.state.body = event?.target?.value || ''; + } + + handleSend(event) { + event?.preventDefault?.(); + event?.stopPropagation?.(); + + const now = Date.now(); + if (now - this.lastSendAt < 500) return; + + const toUid = this.readField('phone-mail-recipient', this.toRef, this.state.toUid).trim(); + const subject = this.readField('phone-mail-subject', this.subjectRef, this.state.subject).trim() || 'No subject'; + const body = this.readField('phone-mail-body', this.bodyRef, this.state.body).trim(); + + if (!toUid || !body) { + console.warn('MailComposer: missing required email fields', { + hasRecipient: !!toUid, + hasSubject: subject !== 'No subject', + hasBody: !!body, + toUid, + subjectLength: subject.length, + bodyLength: body.length + }); + return; + } + + this.lastSendAt = now; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + console.log('MailComposer: sending email', { toUid, subjectLength: subject.length, bodyLength: body.length }); + A3API.SendAlert(JSON.stringify({ + event: 'phone::send::email', + data: { toUid, subject, body } + })); + } else { + console.warn('MailComposer: A3API.SendAlert unavailable'); + } + + globalState.setState({ + showEmailComposer: false, + selectedEmail: null + }); + } + + renderContactOptions() { + const contacts = this.emailableContacts(this.props.contacts || []); + + return [ + this.createElement('option', { value: '' }, 'Select recipient'), + ...contacts.map((contact) => this.createElement( + 'option', + { value: contact.uid || contact.id }, + `${contact.fullName || contact.name || 'Unknown'}${contact.email ? ` (${contact.email})` : ''}` + )) + ]; + } + + render() { + return this.createElement( + 'div', + { className: 'mail-composer' }, + this.createElement('label', {}, + 'To', + this.createElement( + 'select', + { + id: 'phone-mail-recipient', + name: 'phone-mail-recipient', + value: this.state.toUid, + onInput: (event) => { this.state.toUid = event.target.value; }, + onChange: (event) => { this.state.toUid = event.target.value; }, + ref: (element) => { + this.toRef = element; + if (element && this.state.toUid && !element.value) { + element.value = this.state.toUid; + } + }, + 'aria-label': 'Email recipient' + }, + ...this.renderContactOptions() + ) + ), + this.createElement('label', {}, + 'Subject', + this.createElement('input', { + id: 'phone-mail-subject', + name: 'phone-mail-subject', + type: 'text', + value: this.state.subject, + onInput: this.syncSubject, + onChange: this.syncSubject, + onKeyUp: this.syncSubject, + ref: (element) => { this.subjectRef = element; }, + placeholder: 'Subject' + }) + ), + this.createElement('label', {}, + 'Message', + this.createElement('textarea', { + id: 'phone-mail-body', + name: 'phone-mail-body', + value: this.state.body, + onInput: this.syncBody, + onChange: this.syncBody, + onKeyUp: this.syncBody, + ref: (element) => { this.bodyRef = element; }, + placeholder: 'Write email body...', + rows: 8 + }) + ), + this.createElement( + 'button', + { + type: 'button', + className: 'mail-send-button', + onClick: this.handleSend, + onMouseDown: this.handleSend + }, + 'Send' + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailDetail.js b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailDetail.js new file mode 100644 index 0000000..ccaed67 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailDetail.js @@ -0,0 +1,72 @@ +/** @format */ + +class MailDetail extends Component { + resolveContactName(uid) { + const contact = (this.props.contacts || []).find((entry) => entry.uid === uid || entry.id === uid); + return contact ? contact.name : uid; + } + + formatEmailTime(timestamp) { + const parsed = new Date(timestamp); + if (Number.isNaN(parsed.getTime())) return ''; + + return parsed.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }); + } + + componentDidMount() { + const { email } = this.props; + if (!email || email.read) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: 'phone::mark::email::read', + data: { emailId: email.id } + })); + } + } + + handleDeleteEmail(emailId) { + if (!emailId) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: 'phone::delete::email', + data: { emailId } + })); + } + } + + render() { + const { email } = this.props; + + if (!email) { + return this.createElement('div', { className: 'mail-empty' }, 'No email selected.'); + } + + return this.createElement( + 'article', + { className: 'mail-detail' }, + this.createElement('h2', {}, email.subject || 'No subject'), + this.createElement('div', { className: 'mail-meta' }, + this.createElement('span', {}, `From: ${this.resolveContactName(email.from) || 'Unknown'}`), + this.createElement('span', {}, `To: ${this.resolveContactName(email.to) || 'Unknown'}`), + this.createElement('span', {}, this.formatEmailTime(email.timestamp)) + ), + this.createElement('p', { className: 'mail-body' }, email.body || ''), + this.createElement( + 'button', + { + type: 'button', + className: 'mail-delete-button', + onClick: () => this.handleDeleteEmail(email.id) + }, + 'Delete Email' + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailList.js b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailList.js new file mode 100644 index 0000000..9a2554c --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/mail/components/MailList.js @@ -0,0 +1,96 @@ +/** @format */ + +class MailList extends Component { + constructor(props = {}) { + super(props); + this.state = { + searchTerm: '' + }; + + this.handleSearch = this.handleSearch.bind(this); + this.renderEmailItem = this.renderEmailItem.bind(this); + } + + handleSearch(searchTerm) { + this.setState({ searchTerm }); + } + + formatEmailTime(timestamp) { + const parsed = new Date(timestamp); + if (Number.isNaN(parsed.getTime())) return ''; + + return parsed.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }); + } + + resolveContactName(uid) { + const contact = (this.props.contacts || []).find((entry) => entry.uid === uid || entry.id === uid); + return contact ? contact.name : uid; + } + + getFilteredEmails() { + const { emails = [] } = this.props; + const searchTerm = (this.state.searchTerm || '').toLowerCase(); + + if (!searchTerm) return emails; + + return emails.filter((email) => { + const senderName = this.resolveContactName(email.from || '').toLowerCase(); + const recipientName = this.resolveContactName(email.to || '').toLowerCase(); + return ( + (email.subject || '').toLowerCase().includes(searchTerm) || + (email.body || '').toLowerCase().includes(searchTerm) || + senderName.includes(searchTerm) || + recipientName.includes(searchTerm) + ); + }); + } + + renderEmailItem(email) { + const { currentUid, onEmailClick } = this.props; + const isSent = email.from === currentUid; + const actorName = this.resolveContactName(isSent ? email.to : email.from); + const bodyPreview = email.body || ''; + + return this.createElement( + 'button', + { + className: `mail-item ${email.read ? 'read' : 'unread'}`, + type: 'button', + onClick: () => onEmailClick && onEmailClick(email), + 'aria-label': `Open email ${email.subject || 'No subject'}` + }, + this.createElement('div', { className: 'mail-item-header' }, + this.createElement('strong', {}, `${isSent ? 'To' : 'From'}: ${actorName || 'Unknown'}`), + this.createElement('span', {}, this.formatEmailTime(email.timestamp)) + ), + this.createElement('div', { className: 'mail-item-subject' }, email.subject || 'No subject'), + this.createElement('div', { className: 'mail-item-preview' }, bodyPreview) + ); + } + + render() { + const filteredEmails = this.getFilteredEmails(); + + return this.createElement( + 'div', + { className: 'mail-list-container' }, + new SearchBar({ + placeholder: 'Search mail...', + onSearch: this.handleSearch, + value: this.state.searchTerm + }), + this.createElement( + 'div', + { className: 'mail-list', role: 'list', 'aria-label': 'Email list' }, + filteredEmails.length > 0 + ? filteredEmails.map(this.renderEmailItem) + : this.createElement('div', { className: 'mail-empty' }, 'No email yet.') + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/mail/index.js b/arma/client/addons/phone/ui/_site/js/apps/mail/index.js new file mode 100644 index 0000000..b4d92da --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/mail/index.js @@ -0,0 +1,58 @@ +/** @format */ + +function initializeMailApp(container) { + const { emails, contacts, currentUid, selectedEmail, showEmailComposer } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Mail'); + + if (typeof requestEmails === 'function') requestEmails(); + if (typeof requestContacts === 'function') requestContacts(); + + const navBar = new NavigationBar({ + title: selectedEmail ? 'Email' : (showEmailComposer ? 'New Email' : 'Mail'), + showBackButton: !!selectedEmail || !!showEmailComposer, + rightButton: (!selectedEmail && !showEmailComposer) ? { + element: 'button', + props: { + type: 'button', + className: 'nav-button add-button', + onClick: () => globalState.setState({ showEmailComposer: true, selectedEmail: null }), + 'aria-label': 'Compose email', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } : null + }); + navBar.mount(appContainer); + + const contentContainer = document.createElement('div'); + contentContainer.className = 'content mail-content'; + appContainer.appendChild(contentContainer); + + if (showEmailComposer) { + new MailComposer({ contacts }).mount(contentContainer); + } else if (selectedEmail) { + new MailDetail({ email: selectedEmail, contacts }).mount(contentContainer); + } else { + new MailList({ + emails, + contacts, + currentUid, + onEmailClick: (email) => globalState.setState({ selectedEmail: email, showEmailComposer: false }) + }).mount(contentContainer); + } + + container.appendChild(appContainer); +} + +window.initializeMailApp = initializeMailApp; diff --git a/arma/client/addons/phone/ui/_site/js/apps/messages/components/ConversationView.js b/arma/client/addons/phone/ui/_site/js/apps/messages/components/ConversationView.js new file mode 100644 index 0000000..86db68a --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/messages/components/ConversationView.js @@ -0,0 +1,335 @@ +/** @format */ + +/** + * @class ConversationView + * @extends Component + * @description A component that displays and manages a messaging conversation. + * Handles message display, input management, and message sending functionality. + */ +class ConversationView extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.conversation] - The conversation data to display + * @param {string} props.conversation.contactName - Name of the contact + * @param {Array} props.conversation.conversation - Array of message objects + */ + constructor(props = {}) { + super(props); + this.state = { + newMessage: '', + }; + + this.inputRef = null; + this.messagesContainerRef = null; + + // Bind methods + this.handleInputChange = this.handleInputChange.bind(this); + this.handleSendMessage = this.handleSendMessage.bind(this); + this.setInputRef = this.setInputRef.bind(this); + this.setMessagesContainerRef = this.setMessagesContainerRef.bind(this); + this.renderMessageBubble = this.renderMessageBubble.bind(this); + this.scrollToBottom = this.scrollToBottom.bind(this); + this.updateScrollbar = this.updateScrollbar.bind(this); + } + + /** + * Component lifecycle - after component mounts + */ + componentDidMount() { + this.scrollToBottom(); + this.updateScrollbar(); + // Add resize listener to update scrollbar + window.addEventListener('resize', this.updateScrollbar); + } + + /** + * Component lifecycle - after component updates + */ + componentDidUpdate(prevProps) { + // If conversation changed or new messages added, scroll to bottom + if (prevProps.conversation !== this.props.conversation || + (prevProps.conversation && this.props.conversation && + prevProps.conversation.conversation.length !== this.props.conversation.conversation.length)) { + this.scrollToBottom(); + this.updateScrollbar(); + } + } + + /** + * Component lifecycle - before component unmounts + */ + componentWillUnmount() { + window.removeEventListener('resize', this.updateScrollbar); + } + + /** + * Stores reference to the messages container element + * @param {HTMLElement} element - The messages container DOM element + * @private + */ + setMessagesContainerRef(element) { + if (element) { + this.messagesContainerRef = element; + this.updateScrollbar(); + } + } + + /** + * Stores reference to the input element and manages focus + * @param {HTMLInputElement} element - The input DOM element + * @private + */ + setInputRef(element) { + if (element) { + this.inputRef = element; + if (document.activeElement !== element) { + element.focus(); + } + } + } + + /** + * Scrolls the messages container to the bottom + * @private + */ + scrollToBottom() { + if (this.messagesContainerRef) { + requestAnimationFrame(() => { + this.messagesContainerRef.scrollTop = this.messagesContainerRef.scrollHeight; + }); + } + } + + /** + * Forces scrollbar update by triggering reflow + * @private + */ + updateScrollbar() { + if (this.messagesContainerRef) { + requestAnimationFrame(() => { + // Force reflow to update scrollbar + const container = this.messagesContainerRef; + const currentScrollTop = container.scrollTop; + + // Temporarily change overflow to force scrollbar recalculation + const originalOverflow = container.style.overflow; + container.style.overflow = 'hidden'; + + // Force reflow + container.offsetHeight; + + // Restore overflow + container.style.overflow = originalOverflow || 'auto'; + + // Restore scroll position + container.scrollTop = currentScrollTop; + }); + } + } + + /** + * Handles changes to the message input + * @param {Event} e - Input change event + * @private + */ + handleInputChange(e) { + // Update state without triggering a re-render + this.state.newMessage = e.target.value; + } + + /** + * Handles message sending when button is clicked + * @private + */ + handleSendMessage() { + const { newMessage } = this.state; + const { conversation } = this.props; + + if (conversation && conversation.canMessage === false) { + return; + } + + if (newMessage.trim()) { + // Create new message object + const newMessageObj = { + id: generateId(), + text: newMessage.trim(), + sender: 'user', + timestamp: new Date(), + }; + + // Send alert to Arma 3 via A3API + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ + event: "phone::send::message", + data: { + conversationId: conversation.id, + contactName: conversation.contactName, + toUid: conversation.contactId || conversation.id, + message: newMessageObj + } + })); + } + + // Reset input + this.state.newMessage = ''; + if (this.inputRef) { + this.inputRef.value = ''; + this.inputRef.focus(); + } + + // Scroll to bottom after sending message + setTimeout(() => { + this.scrollToBottom(); + this.updateScrollbar(); + }, 50); + } + } + + /** + * Formats message timestamp for display + * @param {Date} timestamp - Message timestamp + * @returns {string} Formatted time string + * @private + */ + formatMessageTime(timestamp) { + return new Date(timestamp).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + }); + } + + /** + * Renders a single message bubble + * @param {Object} msg - Message object + * @returns {HTMLElement} Message bubble element + * @private + */ + renderMessageBubble(msg) { + return this.createElement( + 'div', + { + className: `message-bubble ${msg.sender}`, + key: msg.id, + role: 'article', + 'aria-label': `${msg.sender === 'user' ? 'Sent' : 'Received'} message`, + }, + this.createElement('p', { role: 'text' }, msg.text), + this.createElement( + 'span', + { + className: 'message-timestamp', + 'aria-label': 'Message time', + }, + this.formatMessageTime(msg.timestamp) + ) + ); + } + + /** + * Renders the message input container + * @returns {HTMLElement} Container element + * @private + */ + renderMessageForm() { + const { conversation } = this.props; + const canMessage = !conversation || conversation.canMessage !== false; + + return this.createElement( + 'div', + { + className: 'message-input-form', + role: 'form', + 'aria-label': 'Message input form', + }, + this.createElement('textarea', { + className: 'message-input', + placeholder: canMessage ? 'Type a message...' : 'Replies disabled for this contact', + value: this.state.newMessage, + disabled: !canMessage, + onInput: (e) => { + if (!canMessage) return; + this.handleInputChange(e); + // Auto-grow logic + if (e.target) { + e.target.style.height = 'auto'; + e.target.style.height = e.target.scrollHeight + 'px'; + } + }, + onKeyDown: (e) => { + // Send message on Enter key (but not Shift+Enter) + if (canMessage && e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + this.handleSendMessage(); + } + }, + ref: (el) => { + this.setInputRef(el); + if (el) { + el.style.height = 'auto'; + el.style.height = el.scrollHeight + 'px'; + } + }, + rows: 1, + 'aria-label': 'Message input', + style: 'resize: none; overflow: hidden;' + }), + this.createElement( + 'button', + { + type: 'button', + className: 'send-button', + onClick: this.handleSendMessage, + disabled: !canMessage, + 'aria-label': canMessage ? 'Send message' : 'Replies disabled' + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Send', + style: 'width:22px;height:22px;padding:0;margin:4px 4px 0 0;display:block;pointer-events:none;' + }) + ) + ); + } + + /** + * Render the conversation view + * @returns {HTMLElement} The rendered conversation view + */ + render() { + const { conversation } = this.props; + + if (!conversation) { + return this.createElement('div', { role: 'alert' }, 'No conversation selected'); + } + + return this.createElement( + 'div', + { + className: 'conversation-view', + role: 'main', + 'aria-label': `Conversation with ${conversation.contactName}`, + style: 'display: flex; flex-direction: column; height: 100%; overflow: hidden;' + }, + // Messages container + this.createElement( + 'div', + { + className: 'messages-container', + role: 'log', + 'aria-label': 'Message history', + ref: this.setMessagesContainerRef, + style: 'flex: 1; overflow-y: auto; overflow-x: hidden; padding: 10px; box-sizing: border-box;', + onScroll: () => { + // Update scrollbar on scroll + requestAnimationFrame(this.updateScrollbar); + } + }, + ...conversation.conversation.map(this.renderMessageBubble) + ), + // Message input form + this.renderMessageForm() + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessageItem.js b/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessageItem.js new file mode 100644 index 0000000..5bdd0c8 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessageItem.js @@ -0,0 +1,201 @@ +/** @format */ + +/** + * @class MessageItem + * @extends Component + * @description A component that renders a single message preview item in the messages list. + * Displays contact information, last message, timestamp, and unread count. + */ +class MessageItem extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} props.message - Message data object + * @param {string} props.message.contactName - Name of the contact + * @param {string} props.message.lastMessage - Most recent message text + * @param {Date} props.message.timestamp - Timestamp of the last message + * @param {number} props.message.unread - Number of unread messages + * @param {Function} [props.onClick] - Callback function when message is clicked + */ + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + this.handleDeleteClick = this.handleDeleteClick.bind(this); + } + + /** + * Handles click events on the message item + * @private + */ + handleClick() { + const { onClick, message } = this.props; + if (onClick) { + onClick(message); + } + } + + /** + * Handles delete clicks without opening the conversation. + * @param {Event} event - Click event + * @private + */ + handleDeleteClick(event) { + event.stopPropagation(); + const { onDelete, message } = this.props; + if (onDelete) { + onDelete(message); + } + } + + /** + * Formats the timestamp into a relative time string + * @param {Date} timestamp - The timestamp to format + * @returns {string} Formatted relative time (e.g., "5m ago", "2h ago", "3d ago") + * @private + */ + formatTime(timestamp) { + if (!timestamp) return ''; + + const now = new Date(); + const messageTime = new Date(timestamp); + if (Number.isNaN(messageTime.getTime())) return ''; + + const diffInHours = (now - messageTime) / (1000 * 60 * 60); + + if (diffInHours < 1) { + const minutes = Math.floor(diffInHours * 60); + return `${minutes}m ago`; + } else if (diffInHours < 24) { + return `${Math.floor(diffInHours)}h ago`; + } else { + const days = Math.floor(diffInHours / 24); + return `${days}d ago`; + } + } + + /** + * Gets contact initials from the full name + * @param {string} fullName - Full name of the contact + * @returns {string} Contact's initials + * @private + */ + getContactInitials(fullName) { + return fullName + .split(' ') + .map((n) => n[0]) + .join(''); + } + + /** + * Renders the message header with contact name and timestamp + * @param {Object} message - Message data object + * @returns {HTMLElement} The rendered message header + * @private + */ + renderMessageHeader(message) { + return this.createElement( + 'div', + { className: 'message-header' }, + this.createElement( + 'h3', + { + className: 'contact-name', + role: 'heading', + 'aria-level': '3', + }, + message.contactName + ), + this.createElement( + 'span', + { + className: 'message-time', + 'aria-label': message.timestamp ? `Sent ${this.formatTime(message.timestamp)}` : '', + }, + this.formatTime(message.timestamp) + ) + ); + } + + /** + * Renders the message preview with last message and unread count + * @param {Object} message - Message data object + * @returns {HTMLElement} The rendered message preview + * @private + */ + renderMessagePreview(message) { + const preview = message.hasConversation ? message.lastMessage : 'Start conversation'; + + return this.createElement( + 'div', + { className: 'message-preview' }, + this.createElement( + 'p', + { + role: 'text', + 'aria-label': 'Last message', + }, + preview + ), + message.unread > 0 && + this.createElement( + 'span', + { + className: 'unread-badge', + role: 'status', + 'aria-label': `${message.unread} unread messages`, + }, + message.unread.toString() + ) + ); + } + + /** + * Render the message item + * @returns {HTMLElement} The rendered message item element + */ + render() { + const { message } = this.props; + const initials = this.getContactInitials(message.contactName); + const canDelete = Array.isArray(message.conversation) && message.conversation.length > 0; + + return this.createElement( + 'div', + { + className: 'message-item', + onClick: this.handleClick, + role: 'button', + tabIndex: 0, + 'aria-label': `Conversation with ${message.contactName}`, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleClick(); + } + }, + }, + this.createElement( + 'div', + { + className: 'message-avatar', + 'aria-hidden': 'true', + }, + initials + ), + this.createElement( + 'div', + { className: 'message-content' }, + this.renderMessageHeader(message), + this.renderMessagePreview(message) + ), + canDelete ? this.createElement( + 'button', + { + type: 'button', + className: 'message-thread-delete-button', + 'aria-label': `Delete conversation with ${message.contactName}`, + onClick: this.handleDeleteClick + }, + 'Delete' + ) : null + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessagesList.js b/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessagesList.js new file mode 100644 index 0000000..0173045 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/messages/components/MessagesList.js @@ -0,0 +1,193 @@ +/** @format */ + +/** + * @class MessagesList + * @extends Component + * @description A component that renders a list of message items. + * Manages the display of MessageItem components and handles message selection. + */ +class MessagesList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} [props.messages=[]] - Array of message objects to display + * @param {Function} [props.onMessageClick] - Callback function when a message is clicked + */ + constructor(props) { + super(props); + this.state = { + filteredMessages: this.buildRows(props.messages || [], props.contacts || [], ''), + searchTerm: '' + }; + } + + /** + * Update filtered messages when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if ( + nextProps.messages !== this.props.messages || + nextProps.contacts !== this.props.contacts || + nextProps.includeContacts !== this.props.includeContacts || + nextProps.includeContactsOnSearch !== this.props.includeContactsOnSearch + ) { + // Re-apply current search filter to new messages + this.handleSearch(this.state.searchTerm); + } + } + + buildRows(messages = [], contacts = [], searchTerm = '') { + const searchTermLower = searchTerm.toLowerCase(); + const includeContacts = this.props.includeContacts === true || (this.props.includeContactsOnSearch === true && searchTermLower.length > 0); + const byContactId = new Map(); + const contactByUid = new Map(); + + contacts + .filter((contact) => contact && contact.uid) + .forEach((contact) => contactByUid.set(contact.uid, contact)); + + messages.forEach((message) => { + if (!message) return; + const contactId = message.contactId || message.id; + const contact = contactByUid.get(contactId) || {}; + + byContactId.set(contactId, { + ...contact, + ...message, + id: contactId, + contactId, + contactName: message.contactName || contact.fullName || contact.name || contactId, + phone: contact.phone || message.phone || '', + email: contact.email || message.email || '', + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + hasConversation: Array.isArray(message.conversation) && message.conversation.length > 0 + }); + }); + + if (includeContacts) { + contacts + .filter((contact) => contact && contact.uid && contact.canMessage !== false) + .forEach((contact) => { + if (byContactId.has(contact.uid)) return; + + byContactId.set(contact.uid, { + id: contact.uid, + contactId: contact.uid, + contactName: contact.fullName || contact.name || contact.uid, + fullName: contact.fullName || contact.name || contact.uid, + name: contact.name || contact.fullName || contact.uid, + phone: contact.phone || '', + email: contact.email || '', + avatar: contact.avatar, + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + lastMessage: 'Start conversation', + timestamp: null, + unread: 0, + conversation: [], + hasConversation: false + }); + }); + } + + return Array.from(byContactId.values()).filter((message) => { + if (!searchTermLower) return true; + + return [ + message.contactName, + message.lastMessage, + message.contactId, + message.id, + message.phone, + message.email + ].some((value) => (value || '').toString().toLowerCase().includes(searchTermLower)); + }); + } + + /** + * Filter messages based on search term + * @param {string} searchTerm - The search term to filter messages + * @private + */ + handleSearch(searchTerm) { + const { messages = [], contacts = [] } = this.props; + const filtered = this.buildRows(messages, contacts, searchTerm); + + this.setState({ + filteredMessages: filtered, + searchTerm + }); + } + + /** + * Creates MessageItem components from the filtered messages array + * @private + * @returns {Array} Array of MessageItem components + */ + renderMessageItems() { + const { onMessageClick, onMessageDelete } = this.props; + const { filteredMessages } = this.state; + + if (!filteredMessages.length) { + return [ + this.createElement( + 'div', + { className: 'messages-empty-state' }, + this.createElement('strong', {}, this.props.emptyTitle || 'No conversations'), + this.createElement('span', {}, this.props.emptySubtitle || 'Tap + to start a new conversation.') + ) + ]; + } + + return filteredMessages.map( + (message) => + new MessageItem({ + message, + onClick: onMessageClick, + onDelete: onMessageDelete, + key: message.id, + }) + ); + } + + /** + * Render the messages list with search bar + * @returns {HTMLElement} The rendered messages list element + */ + render() { + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'messages-container', + style: { + display: 'flex', + flexDirection: 'column', + height: '100%' + } + }, + new SearchBar({ + placeholder: this.props.searchPlaceholder || 'Search by contact name...', + onSearch: this.handleSearch.bind(this), + value: searchTerm + }), + this.createElement( + 'div', + { + className: 'messages-list', + role: 'list', + 'aria-label': 'Messages list', + style: { + flex: 1, + overflowY: 'auto', + padding: '10px' + } + }, + ...this.renderMessageItems() + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/messages/index.js b/arma/client/addons/phone/ui/_site/js/apps/messages/index.js new file mode 100644 index 0000000..1523cd2 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/messages/index.js @@ -0,0 +1,119 @@ +/** + * @fileoverview Main entry point for the Messages application. + */ + +function initializeMessagesApp(container) { + const { messages = [], contacts = [], selectedConversation, showMessageContactPicker } = globalState.getState(); + const appContainer = document.createElement('div'); + + const openConversation = (conversation) => { + if (!conversation) return; + + const contactId = conversation.contactId || conversation.uid || conversation.id; + const { rawMessages = [], currentUid = window.__playerUid } = globalState.getState(); + const selectedRawMessages = rawMessages.filter((message) => + message && + ( + (message.from === currentUid && message.to === contactId) || + (message.from === contactId && message.to === currentUid) + ) + ); + + globalState.setState({ + selectedConversation: { + ...conversation, + id: contactId, + contactId, + contactName: conversation.contactName || conversation.fullName || conversation.name || contactId, + conversation: conversation.conversation || [] + }, + selectedConversationRaw: { + otherUid: contactId, + messages: selectedRawMessages + }, + showMessageContactPicker: false + }); + }; + + const deleteConversationMessages = (conversation) => { + const messageIds = ((conversation && conversation.conversation) || []) + .map((message) => message && message.id) + .filter(Boolean); + + if (!messageIds.length) return; + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + messageIds.forEach((messageId) => { + A3API.SendAlert(JSON.stringify({ + event: 'phone::delete::message', + data: { messageId } + })); + }); + } + }; + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Messages'); + + const navBar = new NavigationBar({ + title: selectedConversation ? selectedConversation.contactName : (showMessageContactPicker ? 'New Conversation' : 'Messages'), + showBackButton: !!selectedConversation || showMessageContactPicker, + rightButton: selectedConversation && selectedConversation.conversation && selectedConversation.conversation.length ? { + element: 'button', + props: { + type: 'button', + className: 'message-nav-delete-button', + onClick: () => { + deleteConversationMessages(selectedConversation); + globalState.setState({ selectedConversation: null, selectedConversationRaw: null }); + } + }, + content: 'Delete' + } : (!selectedConversation && !showMessageContactPicker) ? { + element: 'button', + props: { + type: 'button', + className: 'nav-button add-button', + onClick: () => globalState.setState({ showMessageContactPicker: true }), + 'aria-label': 'Start conversation', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } : null + }); + navBar.mount(appContainer); + + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + if (selectedConversation) { + const conversationView = new ConversationView({ conversation: selectedConversation }); + conversationView.mount(contentContainer); + } else { + const messagesList = new MessagesList({ + messages, + contacts, + includeContacts: showMessageContactPicker, + includeContactsOnSearch: true, + searchPlaceholder: 'Search contacts or conversations...', + emptyTitle: showMessageContactPicker ? 'No contacts found' : 'No conversations', + emptySubtitle: showMessageContactPicker ? 'Try another search.' : 'Search for a contact to start texting.', + onMessageClick: openConversation, + onMessageDelete: deleteConversationMessages + }); + messagesList.mount(contentContainer); + } + + container.appendChild(appContainer); +} + +window.initializeMessagesApp = initializeMessagesApp; diff --git a/arma/client/addons/phone/ui/_site/js/apps/notes/components/NoteEditor.js b/arma/client/addons/phone/ui/_site/js/apps/notes/components/NoteEditor.js new file mode 100644 index 0000000..afffd22 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/notes/components/NoteEditor.js @@ -0,0 +1,336 @@ +/** + * @format + * @class NoteEditor + * @extends Component + * @description A component for creating and editing notes. + */ + +class NoteEditor extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Object} [props.note] - Existing note to edit + * @param {Function} props.onSave - Callback when note is saved + * @param {Function} props.onCancel - Callback when editing is cancelled + * @param {Function} [props.onDelete] - Callback when note is deleted + */ + constructor(props = {}) { + super(props); + + const existingNote = props.note || {}; + this.state = { + title: existingNote.title || '', + content: existingNote.content || '', + id: existingNote.id || null, + createdAt: existingNote.createdAt || new Date().toISOString(), + updatedAt: existingNote.updatedAt || new Date().toISOString(), + isModified: false + }; + + // References for DOM elements + this.titleInputRef = null; + this.contentTextareaRef = null; + + // Bind methods + this.handleTitleChange = this.handleTitleChange.bind(this); + this.handleContentChange = this.handleContentChange.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.setTitleInputRef = this.setTitleInputRef.bind(this); + this.setContentTextareaRef = this.setContentTextareaRef.bind(this); + this.autoSave = this.autoSave.bind(this); + + // Auto-save timer + this.autoSaveTimer = null; + } + + /** + * Component mounted - focus on title if new note + */ + componentDidMount() { + if (!this.state.id && this.titleInputRef) { + this.titleInputRef.focus(); + } else if (this.contentTextareaRef) { + this.contentTextareaRef.focus(); + // Move cursor to end + const length = this.contentTextareaRef.value.length; + this.contentTextareaRef.setSelectionRange(length, length); + } + } + + /** + * Component will unmount - clear auto-save timer + */ + componentWillUnmount() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + } + + /** + * Set title input reference and manage focus + */ + setTitleInputRef(element) { + if (element) { + this.titleInputRef = element; + + // Ensure input displays the correct content + if (this.state.title && element.value !== this.state.title) { + element.value = this.state.title; + } + + // Maintain focus if this element was previously focused + if (document.activeElement !== element && !this.state.id) { + element.focus(); + } + } + } + + /** + * Set content textarea reference and manage focus + */ + setContentTextareaRef(element) { + if (element) { + this.contentTextareaRef = element; + + // Ensure textarea displays the correct content + if (this.state.content && element.value !== this.state.content) { + element.value = this.state.content; + element.textContent = this.state.content; + } + + // Maintain focus if this element was previously focused + if (document.activeElement !== element && this.state.id) { + element.focus(); + // Move cursor to end + const length = element.value.length; + element.setSelectionRange(length, length); + } + } + } + + /** + * Handle title input change + */ + handleTitleChange(e) { + // Update state directly to avoid re-render during typing + this.state.title = e.target.value; + this.state.isModified = true; + this.scheduleAutoSave(); + } + + /** + * Handle content textarea change + */ + handleContentChange(e) { + // Update state directly to avoid re-render during typing + this.state.content = e.target.value; + this.state.isModified = true; + this.scheduleAutoSave(); + } + + /** + * Schedule auto-save (debounced) + */ + scheduleAutoSave() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + + this.autoSaveTimer = setTimeout(() => { + this.autoSave(); + }, 30000); // Auto-save after 30 seconds of inactivity + } + + /** + * Auto-save the note + */ + autoSave() { + if (this.state.isModified && (this.state.title.trim() || this.state.content.trim())) { + this.handleSave(false); // Save without closing editor + } + } + + /** + * Handle save button click + */ + handleSave(shouldClose = true) { + const { title, content, id, createdAt } = this.state; + + // Don't save empty notes + if (!title.trim() && !content.trim()) { + if (shouldClose) { + this.handleCancel(); + } + return; + } + + const savedNote = { + id: id || generateId(), + title: title.trim() || 'Untitled', + content: content.trim(), + createdAt: createdAt, + updatedAt: new Date().toISOString() + }; + + this.setState({ + isModified: false, + id: savedNote.id, + updatedAt: savedNote.updatedAt + }); + + if (this.props.onSave) { + this.props.onSave(savedNote); + } + + if (shouldClose) { + // Note: The parent component will handle navigation + } + } + + /** + * Handle cancel button click + */ + handleCancel() { + if (this.autoSaveTimer) { + clearTimeout(this.autoSaveTimer); + } + + if (this.props.onCancel) { + this.props.onCancel(); + } + } + + /** + * Handle delete button click + */ + handleDelete() { + if (!this.state.id) { + console.warn('Cannot delete note: no ID present'); + return; + } + + if (!this.props.onDelete) { + console.warn('Cannot delete note: no onDelete callback provided'); + return; + } + + try { + // Show delete confirmation modal using global state + globalState.setState({ + showDeleteModal: true, + noteToDelete: { + id: this.state.id, + title: this.state.title || 'Untitled' + } + }); + } catch (error) { + console.error('Error showing delete confirmation:', error); + } + } + + + /** + * Get the word count for the note + */ + getWordCount() { + const { content } = this.state; + if (!content.trim()) return 0; + return content.trim().split(/\s+/).length; + } + + /** + * Render the editor + */ + render() { + const { title, content, id, isModified } = this.state; + const wordCount = this.getWordCount(); + + return this.createElement( + 'div', + { className: 'note-editor' }, + + // Navigation bar + new NavigationBar({ + title: id ? 'Edit Note' : 'New Note', + leftButton: { + element: 'button', + props: { + className: 'nav-button cancel-button', + onClick: this.handleCancel, + 'aria-label': 'Cancel' + }, + content: 'Cancel' + }, + rightButton: { + element: 'button', + props: { + className: 'nav-button save-button', + onClick: () => this.handleSave(true), + 'aria-label': 'Save note' + }, + content: 'Save' + } + }), + + // Editor content + this.createElement( + 'div', + { className: 'editor-content' }, + + // Title input + this.createElement('input', { + type: 'text', + className: 'note-title-input', + placeholder: 'Note title...', + value: title, + onInput: this.handleTitleChange, + ref: this.setTitleInputRef + }), + + // Content textarea + this.createElement('textarea', { + className: 'note-content-input', + placeholder: 'Start writing...', + value: content, + onInput: this.handleContentChange, + ref: this.setContentTextareaRef + }), + + // Editor footer + this.createElement( + 'div', + { className: 'editor-footer' }, + + // Word count and status + this.createElement( + 'div', + { className: 'editor-status' }, + this.createElement( + 'span', + { className: 'word-count' }, + `${wordCount} word${wordCount !== 1 ? 's' : ''}` + ), + isModified && this.createElement( + 'span', + { className: 'modified-indicator' }, + ' * Modified' + ) + ), + + // Delete button (only for existing notes) + id && this.createElement( + 'button', + { + className: 'delete-button', + onClick: this.handleDelete, + 'aria-label': 'Delete note' + }, + 'Delete' + ) + ) + ) + ); + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/notes/components/NotesList.js b/arma/client/addons/phone/ui/_site/js/apps/notes/components/NotesList.js new file mode 100644 index 0000000..a20d28a --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/notes/components/NotesList.js @@ -0,0 +1,183 @@ +/** + * @format + * @class NotesList + * @extends Component + * @description A component that displays a list of notes with preview content. + */ + +class NotesList extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {Array} props.notes - Array of note objects + * @param {Function} props.onNoteClick - Callback when a note is clicked + */ + constructor(props = {}) { + super(props); + this.state = { + notes: props.notes || [] + }; + + // Bind methods + this.handleNoteClick = this.handleNoteClick.bind(this); + this.formatDate = this.formatDate.bind(this); + this.truncateText = this.truncateText.bind(this); + } + + /** + * Handle note click + * @param {Object} note - The clicked note + */ + handleNoteClick(note) { + if (this.props.onNoteClick) { + this.props.onNoteClick(note); + } + } + + /** + * Format date for display + * @param {Date|string} date - Date to format + * @returns {string} Formatted date string + */ + formatDate(date) { + if (!date) return ''; + + const noteDate = new Date(date); + const now = new Date(); + const diffTime = Math.abs(now - noteDate); + const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); + + if (diffDays === 0) { + return noteDate.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit' + }); + } else if (diffDays === 1) { + return 'Yesterday'; + } else if (diffDays < 7) { + return noteDate.toLocaleDateString('en-US', { weekday: 'long' }); + } else { + return noteDate.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric' + }); + } + } + + /** + * Truncate text for preview + * @param {string} text - Text to truncate + * @param {number} maxLength - Maximum length + * @returns {string} Truncated text + */ + truncateText(text, maxLength = 100) { + if (!text) return ''; + if (text.length <= maxLength) return text; + return text.substring(0, maxLength).trim() + '...'; + } + + /** + * Render a single note item + * @param {Object} note - Note object + * @returns {HTMLElement} Note item element + */ + renderNoteItem(note) { + return this.createElement( + 'div', + { + className: 'note-item', + onClick: () => this.handleNoteClick(note), + role: 'button', + tabIndex: 0, + 'aria-label': `Open note: ${note.title || 'Untitled'}`, + onKeyDown: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + this.handleNoteClick(note); + } + } + }, + this.createElement( + 'div', + { className: 'note-header' }, + this.createElement( + 'h3', + { className: 'note-title' }, + note.title || 'Untitled' + ), + this.createElement( + 'span', + { className: 'note-date' }, + this.formatDate(note.updatedAt || note.createdAt) + ) + ), + this.createElement( + 'p', + { className: 'note-preview' }, + this.truncateText(note.content) + ) + ); + } + + /** + * Render empty state + * @returns {HTMLElement} Empty state element + */ + renderEmptyState() { + return this.createElement( + 'div', + { className: 'notes-empty-state' }, + this.createElement( + 'div', + { className: 'empty-icon' }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Notes', + style: 'width:64px;height:64px;opacity:0.5;display:block;' + }) + ), + this.createElement( + 'h3', + {}, + 'No Notes Yet' + ), + this.createElement( + 'p', + {}, + 'Tap the + button to create your first note' + ) + ); + } + + /** + * Render the notes list + * @returns {HTMLElement} The rendered notes list + */ + render() { + const { notes } = this.props; + + if (!notes || notes.length === 0) { + return this.createElement( + 'div', + { className: 'notes-list empty' }, + this.renderEmptyState() + ); + } + + return this.createElement( + 'div', + { + className: 'notes-list', + role: 'list', + 'aria-label': `${notes.length} notes` + }, + ...notes.map((note, index) => { + const noteElement = this.renderNoteItem(note); + noteElement.setAttribute('role', 'listitem'); + noteElement.setAttribute('key', note.id || index); + return noteElement; + }) + ); + } +} + diff --git a/arma/client/addons/phone/ui/_site/js/apps/notes/index.js b/arma/client/addons/phone/ui/_site/js/apps/notes/index.js new file mode 100644 index 0000000..54c78ea --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/notes/index.js @@ -0,0 +1,161 @@ +/** + * @fileoverview Main entry point for the Notes application + * + * This module initializes the Notes app UI, including: + * - Rendering the navigation bar with add note and search functionality + * - Displaying the notes list + * - Handling note creation, editing, and deletion + * - Managing note persistence via A3API + * + * The notes app supports: + * - Creating new notes + * - Editing existing notes + * - Deleting notes + * - Searching through notes + * - Auto-saving to Arma 3 profile + */ + +// Initialize the notes app +function initializeNotesApp(container) { + // Get current notes and view state from global state + const { notes = [], currentNote = null, showNoteEditor = false } = globalState.getState(); + const appContainer = document.createElement('div'); + + appContainer.className = 'app-container'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Notes'); + + // Check if we're viewing/editing a specific note + if (showNoteEditor || currentNote) { + // Show note editor + const noteEditor = new NoteEditor({ + note: currentNote, + onSave: (savedNote) => { + const currentNotes = globalState.getState().notes || []; + let updatedNotes; + + if (savedNote.id && currentNotes.find(n => n.id === savedNote.id)) { + // Update existing note + updatedNotes = currentNotes.map(n => n.id === savedNote.id ? savedNote : n); + } else { + // Add new note + updatedNotes = [savedNote, ...currentNotes]; + } + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false + }); + + // Save to server + if (typeof saveNote === 'function') { + saveNote(savedNote); + } + }, + onCancel: () => { + globalState.setState({ + currentNote: null, + showNoteEditor: false + }); + }, + onDelete: (noteId) => { + const currentNotes = globalState.getState().notes || []; + const updatedNotes = currentNotes.filter(n => n.id !== noteId); + + globalState.setState({ + notes: updatedNotes, + currentNote: null, + showNoteEditor: false + }); + + // Delete from server + if (typeof deleteNote === 'function') { + deleteNote(noteId); + } + } + }); + noteEditor.mount(appContainer); + } else { + // Show notes list + const navBar = new NavigationBar({ + title: 'Notes', + rightButton: { + element: 'button', + props: { + className: 'nav-button add-button', + onClick: () => { + globalState.setState({ + showNoteEditor: true, + currentNote: null + }); + }, + 'aria-label': 'Add Note', + style: { + fontSize: '24px', + padding: '0 15px', + background: 'none', + border: 'none', + color: 'var(--accent-color)', + cursor: 'pointer' + } + }, + content: '+' + } + }); + navBar.mount(appContainer); + + // Main content container + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + appContainer.appendChild(contentContainer); + + // Search bar + const searchBar = new SearchBar({ + placeholder: 'Search notes...', + onSearch: (query) => { + // Filter notes based on search query + const filteredNotes = notes.filter(note => + note.title.toLowerCase().includes(query.toLowerCase()) || + note.content.toLowerCase().includes(query.toLowerCase()) + ); + + // Update the notes list + const existingList = contentContainer.querySelector('.notes-list'); + if (existingList) { + existingList.remove(); + } + + const notesList = new NotesList({ + notes: filteredNotes, + onNoteClick: (note) => { + globalState.setState({ + currentNote: note, + showNoteEditor: true + }); + } + }); + notesList.mount(contentContainer); + } + }); + searchBar.mount(contentContainer); + + // Notes list + const notesList = new NotesList({ + notes, + onNoteClick: (note) => { + globalState.setState({ + currentNote: note, + showNoteEditor: true + }); + } + }); + notesList.mount(contentContainer); + } + + // Mount the app container + container.appendChild(appContainer); +} + +// Make initialization function globally available +window.initializeNotesApp = initializeNotesApp; \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/phone/components/Dialpad.js b/arma/client/addons/phone/ui/_site/js/apps/phone/components/Dialpad.js new file mode 100644 index 0000000..6116d0f --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/phone/components/Dialpad.js @@ -0,0 +1,416 @@ +/** + * @format + * @class Dialpad + * @extends Component + * @description A phone dialpad component providing a touch-tone keypad interface for making calls. Manages phone number input, formatting, call state, and integration with contacts. + */ + +class Dialpad extends Component { + static fieldCommanderPhoneNumber = '0160000000'; + + static assetPath(...parts) { + return PhoneMedia.base64Path('images', ...parts); + } + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props = {}) { + super(props); + + this.state = { + phoneNumber: '', // Current phone number in the dialpad + isCallActive: false, // Whether a call is currently in progress + callDuration: 0, // Duration of active call in seconds + }; + + // Bind event handlers + this.handleNumberClick = this.handleNumberClick.bind(this); + this.handleCall = this.handleCall.bind(this); + this.handleEndCall = this.handleEndCall.bind(this); + this.handleDelete = this.handleDelete.bind(this); + this.handleOpenContacts = this.handleOpenContacts.bind(this); + this.handleGlobalStateChange = this.handleGlobalStateChange.bind(this); + + this.callTimer = null; + + // Subscribe to global state changes + globalState.subscribe(this.handleGlobalStateChange); + } + + // ------------------------------------------------------------------------- + // Lifecycle Methods + // ------------------------------------------------------------------------- + + /** + * @method componentDidMount + * @description Initializes component after mounting, handling any existing phone number in global state + */ + componentDidMount() { + const state = globalState.getState(); + if (state.phoneNumber) { + this.setState( + { + phoneNumber: this.cleanPhoneNumber(state.phoneNumber), + }, + () => { + globalState.setState({ phoneNumber: '' }); + } + ); + } + } + + /** + * @method componentWillUnmount + * @description Cleanup resources and subscriptions when component unmounts + */ + componentWillUnmount() { + if (this.callTimer) { + clearInterval(this.callTimer); + } + globalState.unsubscribe(this.handleGlobalStateChange); + } + + // ------------------------------------------------------------------------- + // Phone Number Utilities + // ------------------------------------------------------------------------- + + /** + * @method cleanPhoneNumber + * @description Removes all non-digit characters from a phone number + * @param {string} number - The phone number to clean + * @returns {string} The cleaned phone number containing only digits + */ + cleanPhoneNumber(number) { + if (!number) return ''; + return number.replace(/\D/g, ''); + } + + /** + * @method formatPhoneNumber + * @description Formats a phone number into a readable format + * @param {string} number - The phone number to format + * @returns {string} Formatted phone number as (XXX) XXX-XXXX + */ + formatPhoneNumber(number) { + if (!number || number.length === 0) return ''; + + const cleaned = number.replace(/[^\d]/g, ''); + + if (cleaned.length <= 3) { + return cleaned; + } else if (cleaned.length <= 6) { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3)}`; + } else if (cleaned.length <= 10) { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6)}`; + } else { + return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6, 10)}`; + } + } + + /** + * @method formatTime + * @description Formats seconds into MM:SS format + * @param {number} seconds - Number of seconds to format + * @returns {string} Time formatted as MM:SS + */ + formatTime(seconds) { + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } + + // ------------------------------------------------------------------------- + // Event Handlers + // ------------------------------------------------------------------------- + + /** + * @method handleGlobalStateChange + * @description Handles changes in the global state, specifically phone number updates + * @param {Object} newState - The new global state + */ + handleGlobalStateChange(newState) { + if (newState.phoneNumber) { + const cleaned = this.cleanPhoneNumber(newState.phoneNumber); + if (cleaned && cleaned !== this.state.phoneNumber) { + this.setState( + { + phoneNumber: cleaned, + }, + () => { + globalState.setState({ phoneNumber: '' }); + } + ); + } + } + } + + /** + * @method handleNumberClick + * @description Handles digit button clicks on the dialpad + * @param {string} number - The digit that was clicked + */ + handleNumberClick(number) { + if (!this.state.isCallActive) { + this.setState({ + phoneNumber: this.state.phoneNumber + number, + }); + } + } + + /** + * @method handleDelete + * @description Handles the delete button click, removing the last digit + */ + handleDelete() { + if (!this.state.isCallActive) { + this.setState({ + phoneNumber: this.state.phoneNumber.slice(0, -1), + }); + } + } + + /** + * @method handleCall + * @description Initiates a phone call and starts the call timer + */ + handleCall() { + if ( + this.state.phoneNumber && + !this.state.isCallActive && + this.cleanPhoneNumber(this.state.phoneNumber) !== Dialpad.fieldCommanderPhoneNumber + ) { + this.setState({ + isCallActive: true, + callDuration: 0, + }); + + this.callTimer = setInterval(() => { + // Update state directly to avoid re-render during call + this.state.callDuration = this.state.callDuration + 1; + + // Update only the call duration display element + const durationElement = document.querySelector('.call-duration'); + if (durationElement) { + durationElement.textContent = this.formatTime(this.state.callDuration); + } + }, 1000); + } + } + + /** + * @method handleEndCall + * @description Ends the current call and resets the dialpad state + */ + handleEndCall() { + if (this.callTimer) { + clearInterval(this.callTimer); + this.callTimer = null; + } + + this.setState({ + isCallActive: false, + callDuration: 0, + phoneNumber: '', + }); + } + + /** + * @method handleOpenContacts + * @description Navigates to the contacts view + */ + handleOpenContacts() { + globalState.setState({ + currentApp: 'contacts', + previousApp: 'phone', + }); + } + + // ------------------------------------------------------------------------- + // Render Methods + // ------------------------------------------------------------------------- + + /** + * @method render + * @description Renders the phone dialpad interface + * @returns {Object} Virtual DOM representation of the component + */ + render() { + const { phoneNumber, isCallActive, callDuration } = this.state; + const isPhoneNumberEmpty = phoneNumber.length === 0; + + const dialpadNumbers = [ + ['1', ''], + ['2', 'ABC'], + ['3', 'DEF'], + ['4', 'GHI'], + ['5', 'JKL'], + ['6', 'MNO'], + ['7', 'PQRS'], + ['8', 'TUV'], + ['9', 'WXYZ'], + ['*', ''], + ['0', '+'], + ['#', ''], + ]; + + if (isCallActive) { + return this.createElement( + 'div', + { + className: 'phone-dialpad call-active', + role: 'region', + 'aria-label': 'Active call interface', + }, + this.createElement( + 'div', + { + className: 'call-info', + role: 'status', + 'aria-live': 'polite', + }, + this.createElement('div', { className: 'call-status' }, 'Calling...'), + this.createElement('div', { className: 'call-number' }, this.formatPhoneNumber(phoneNumber)), + this.createElement('div', { className: 'call-duration' }, this.formatTime(callDuration)) + ), + this.createElement( + 'div', + { className: 'call-actions' }, + this.createElement( + 'button', + { + className: 'end-call-btn', + onClick: this.handleEndCall, + 'aria-label': 'End call', + }, + (() => { + const imgElement = this.createElement('img', { + alt: 'End call', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'HangUp.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load hang up icon:', error); + }); + + return imgElement; + })() + ) + ) + ); + } + + const callButtonProps = { + className: 'action-btn call-btn', + onClick: this.handleCall, + 'aria-label': 'Make call', + }; + + if (isPhoneNumberEmpty || this.cleanPhoneNumber(phoneNumber) === Dialpad.fieldCommanderPhoneNumber) { + callButtonProps.disabled = true; + } + + return this.createElement( + 'div', + { + className: 'phone-dialpad', + role: 'region', + 'aria-label': 'Phone dialer', + }, + this.createElement( + 'div', + { + className: 'phone-display', + role: 'textbox', + 'aria-label': 'Phone number display', + }, + this.createElement('div', { className: 'phone-number' }, this.formatPhoneNumber(phoneNumber) || 'Enter a number') + ), + this.createElement( + 'div', + { + className: 'dialpad', + role: 'grid', + 'aria-label': 'Dial pad', + }, + ...dialpadNumbers.map(([number, letters]) => + this.createElement( + 'button', + { + className: 'dialpad-btn', + onClick: () => this.handleNumberClick(number), + 'aria-label': `Dial ${number}${letters ? ` (${letters})` : ''}`, + }, + this.createElement('span', { className: 'number' }, number), + letters && this.createElement('span', { className: 'letters' }, letters) + ) + ) + ), + this.createElement( + 'div', + { + className: 'phone-actions', + role: 'toolbar', + 'aria-label': 'Phone actions', + }, + this.createElement( + 'button', + { + className: 'action-btn delete-btn', + onClick: this.handleDelete, + 'aria-label': 'Delete last digit', + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: 'Delete', + style: 'width:28px;height:28px;padding:0;margin:4px 4px 0 0;display:block;pointer-events:none;' + }) + ), + this.createElement('button', callButtonProps, + (() => { + const imgElement = this.createElement('img', { + alt: 'Make call', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'Call.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load call icon:', error); + }); + + return imgElement; + })() + ), + this.createElement( + 'button', + { + className: 'action-btn contact-btn', + onClick: this.handleOpenContacts, + 'aria-label': 'Open contacts', + }, + (() => { + const imgElement = this.createElement('img', { + alt: 'Open contacts', + style: { display: 'none' } + }); + + PhoneMedia.loadImage(Dialpad.assetPath('light', 'Contact.png')).then(imageContent => { + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error('Failed to load contact icon:', error); + }); + + return imgElement; + })() + ) + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/apps/phone/index.js b/arma/client/addons/phone/ui/_site/js/apps/phone/index.js new file mode 100644 index 0000000..2574229 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/phone/index.js @@ -0,0 +1,19 @@ +/** + * @fileoverview Main entry point for the Phone application + * + * This module initializes the Phone app UI, including: + * - Rendering the dialpad component + * - Mounting the dialpad into the provided container + * + * The initializePhoneApp function is exposed globally for use by the main app. + */ + +// Initialize the phone app +function initializePhoneApp(container) { + // Create and mount the dialpad component + const phoneDialpad = new Dialpad(); + phoneDialpad.mount(container); +} + +// Make initialization function globally available +window.initializePhoneApp = initializePhoneApp; \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/settings/components/Settings.js b/arma/client/addons/phone/ui/_site/js/apps/settings/components/Settings.js new file mode 100644 index 0000000..cf26c1b --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/settings/components/Settings.js @@ -0,0 +1,114 @@ +/** + * @format + * @class Settings + * @extends Component + * @description A settings component for the phone app. + */ + +class Settings extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor() { + super(); + // Get current theme from document attribute + const currentTheme = document.documentElement.getAttribute('data-theme'); + this.state = { isDarkTheme: currentTheme === 'dark' }; + } + + /** + * @method componentDidMount + * @description Sets the initial theme when the component mounts + */ + componentDidMount() { + // Get current theme from game + const alert = { + "event": "phone::get::theme", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + /** + * @method updateTheme + * @param {boolean} isDark - Whether the theme is dark + * @description Updates the theme and phone screen background + */ + updateTheme(isDark) { + const theme = isDark ? 'dark' : 'light'; + + // Update document theme + document.documentElement.setAttribute('data-theme', theme); + + // Update phone screen background + const phoneScreen = document.querySelector('.phone-screen'); + if (phoneScreen) { + phoneScreen.style.background = isDark ? '#000000' : '#ffffff'; + } + + // Save theme preference to game + const alert = { + "event": "phone::set::theme", + "data": { + "isDark": isDark + } + }; + A3API.SendAlert(JSON.stringify(alert)); + + // Update state + this.setState({ isDarkTheme: isDark }); + + // Dispatch theme change event + const themeEvent = new CustomEvent('themeChanged', { + detail: { theme } + }); + document.dispatchEvent(themeEvent); + } + + /** + * @method handleThemeToggle + * @description Handles the theme toggle click + */ + handleThemeToggle = () => { + const newTheme = !this.state.isDarkTheme; + this.updateTheme(newTheme); + } + + /** + * @method render + * @description Renders the settings component + */ + render() { + return this.createElement('div', { className: 'settings-list' }, + this.createElement('div', { className: 'theme-toggle' }, + this.createElement('span', {}, 'Dark Mode'), + this.createElement('div', { + className: this.state.isDarkTheme ? 'custom-toggle active' : 'custom-toggle', + onClick: this.handleThemeToggle, + style: { + width: '50px', + height: '25px', + backgroundColor: this.state.isDarkTheme ? '#0a84ff' : '#e9ecef', + borderRadius: '34px', + position: 'relative', + cursor: 'pointer', + transition: 'background-color 0.2s' + } + }, + this.createElement('div', { + style: { + width: '25px', + height: '25px', + backgroundColor: '#fff', + borderRadius: '50%', + position: 'absolute', + left: this.state.isDarkTheme ? '25px' : '0px', + transition: 'left 0.2s' + } + }) + ) + ) + ); + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/settings/index.js b/arma/client/addons/phone/ui/_site/js/apps/settings/index.js new file mode 100644 index 0000000..ecef933 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/settings/index.js @@ -0,0 +1,29 @@ +/** + * @fileoverview Main entry point for the Settings application + * + * This module initializes the Settings app UI, including: + * - Rendering the Settings component + * - Mounting the Settings component into the provided container + * + * The initializeSettingsApp function is exposed globally for use by the main app. + */ + +// Initialize the settings app +function initializeSettingsApp(container) { + /** + * Navigation bar with toggle button + * - Button toggles add contact form visibility + * - Icon switches between '+' (show form) and '-' (hide form) + */ + const navBar = new NavigationBar({ + title: 'Settings' + }); + navBar.mount(container); + + // Create and mount the Settings component + const settings = new Settings(); + settings.mount(container); +} + +// Make initialization function globally available +window.initializeSettingsApp = initializeSettingsApp; \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/js/apps/wallet/index.js b/arma/client/addons/phone/ui/_site/js/apps/wallet/index.js new file mode 100644 index 0000000..4b3247e --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/apps/wallet/index.js @@ -0,0 +1,436 @@ +/** @format */ + +let lastMobileBankRequest = 0; +let mobileBankNoticeTimer = null; +const MOBILE_BANK_REQUEST_COOLDOWN = 1000; + +function defaultMobileBankState() { + return { + account: { + bank: 0, + cash: 0, + earnings: 0, + transactions: [], + }, + session: { + creditLine: { + amountDue: 0, + approvedAmount: 0, + availableAmount: 0, + outstandingPrincipal: 0, + }, + orgName: '', + playerName: '', + transferTargets: [], + uid: '', + }, + notice: null, + pendingAction: '', + }; +} + +function getMobileBankState() { + return { + ...defaultMobileBankState(), + ...(globalState.getState().mobileBank || {}), + }; +} + +function setMobileBankState(patch) { + globalState.setState({ + mobileBank: { + ...getMobileBankState(), + ...patch, + }, + }); +} + +function formatMobileBankCurrency(value) { + const amount = Math.floor(Number(value || 0)); + return `$${Math.max(0, amount).toLocaleString()}`; +} + +function normalizeMobileBankAmount(value) { + const amount = Math.floor(Number(value || 0)); + return Number.isFinite(amount) ? amount : 0; +} + +function sendMobileBankEvent(event, data = {}) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + A3API.SendAlert(JSON.stringify({ event, data })); + return true; + } + + showMobileBankNotice('error', 'Bank bridge is unavailable.'); + return false; +} + +function requestMobileBankRefresh(force = false) { + const now = Date.now(); + if (!force && now - lastMobileBankRequest < MOBILE_BANK_REQUEST_COOLDOWN) { + return false; + } + + lastMobileBankRequest = now; + return sendMobileBankEvent('phone::bank::refresh', {}); +} + +function requestMobileBankTransfer(target, amountValue) { + const targetUid = String(target || '').trim(); + const amount = normalizeMobileBankAmount(amountValue); + + if (!targetUid) { + showMobileBankNotice('error', 'Choose a recipient.'); + return false; + } + + if (amount <= 0) { + showMobileBankNotice('error', 'Enter a valid transfer amount.'); + return false; + } + + setMobileBankState({ pendingAction: 'transfer' }); + const sent = sendMobileBankEvent('phone::bank::transfer::request', { + amount, + from: 'bank', + target: targetUid, + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function requestMobileBankDepositEarnings() { + const state = getMobileBankState(); + const availableEarnings = normalizeMobileBankAmount(state.account.earnings); + + if (availableEarnings <= 0) { + showMobileBankNotice('error', 'No earnings are available to deposit.'); + return false; + } + + setMobileBankState({ pendingAction: 'depositearnings' }); + const sent = sendMobileBankEvent('phone::bank::depositEarnings::request', { + amount: availableEarnings, + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function requestMobileBankRepayCreditLine(amountValue) { + const amount = normalizeMobileBankAmount(amountValue); + const state = getMobileBankState(); + const amountDue = normalizeMobileBankAmount(state.session.creditLine?.amountDue); + + if (amountDue <= 0) { + showMobileBankNotice('error', 'No credit line payment is due.'); + return false; + } + + if (amount <= 0) { + showMobileBankNotice('error', 'Enter a valid payment amount.'); + return false; + } + + setMobileBankState({ pendingAction: 'repaycreditline' }); + const sent = sendMobileBankEvent('phone::bank::repayCreditLine::request', { + amount: Math.min(amount, amountDue), + }); + + if (!sent) { + setMobileBankState({ pendingAction: '' }); + } + + return sent; +} + +function updateMobileBank(payload) { + const current = getMobileBankState(); + setMobileBankState({ + account: { + ...current.account, + ...(payload && payload.account ? payload.account : {}), + }, + session: { + ...current.session, + ...(payload && payload.session ? payload.session : {}), + }, + pendingAction: '', + }); +} + +function updateMobileBankAccount(accountPatch) { + const current = getMobileBankState(); + setMobileBankState({ + account: { + ...current.account, + ...(accountPatch || {}), + }, + pendingAction: '', + }); +} + +function showMobileBankNotice(type, message) { + if (!message) return; + + setMobileBankState({ + notice: { + type: type || 'info', + message, + }, + pendingAction: '', + }); + + if (mobileBankNoticeTimer) { + clearTimeout(mobileBankNoticeTimer); + } + + mobileBankNoticeTimer = setTimeout(() => { + setMobileBankState({ notice: null }); + mobileBankNoticeTimer = null; + }, 3200); +} + +function mobileBankTransactionRows(transactions) { + const rows = Array.isArray(transactions) ? transactions.slice(0, 5) : []; + + if (rows.length === 0) { + const empty = document.createElement('div'); + empty.className = 'wallet-empty-state'; + empty.textContent = 'No recent transactions'; + return empty; + } + + const list = document.createElement('div'); + list.className = 'wallet-transaction-list'; + + rows.forEach((entry) => { + const row = document.createElement('div'); + row.className = 'wallet-transaction-row'; + + const copy = document.createElement('div'); + copy.className = 'wallet-transaction-copy'; + + const title = document.createElement('span'); + title.className = 'wallet-transaction-title'; + title.textContent = entry.type || 'Transaction'; + + const meta = document.createElement('span'); + meta.className = 'wallet-transaction-meta'; + meta.textContent = entry.date || 'Pending timestamp'; + + const value = document.createElement('span'); + value.className = 'wallet-transaction-value'; + value.textContent = formatMobileBankCurrency(entry.amount || 0); + + copy.append(title, meta); + row.append(copy, value); + list.appendChild(row); + }); + + return list; +} + +function initializeMobileBankApp(container) { + const state = getMobileBankState(); + const { account, session, notice, pendingAction } = state; + const transferTargets = Array.isArray(session.transferTargets) + ? session.transferTargets + : []; + const creditLine = session.creditLine || {}; + const amountDue = normalizeMobileBankAmount(creditLine.amountDue); + const outstandingPrincipal = normalizeMobileBankAmount(creditLine.outstandingPrincipal); + + requestMobileBankRefresh(false); + + const appContainer = document.createElement('div'); + appContainer.className = 'app-container wallet-app'; + appContainer.setAttribute('role', 'main'); + appContainer.setAttribute('aria-label', 'Wallet'); + + const navBar = new NavigationBar({ + title: 'Wallet', + rightButton: { + element: 'button', + props: { + className: 'wallet-nav-button', + type: 'button', + disabled: pendingAction !== '', + onClick: () => requestMobileBankRefresh(true), + 'aria-label': 'Refresh wallet', + }, + content: 'Refresh', + }, + }); + navBar.mount(appContainer); + + const content = document.createElement('div'); + content.className = 'content wallet-content'; + + if (notice && notice.message) { + const noticeElement = document.createElement('div'); + noticeElement.className = `wallet-notice wallet-notice-${notice.type || 'info'}`; + noticeElement.textContent = notice.message; + content.appendChild(noticeElement); + } + + const hero = document.createElement('section'); + hero.className = 'wallet-balance-card'; + hero.innerHTML = ` + Available Balance + ${formatMobileBankCurrency(account.bank)} + ${session.playerName || 'Personal account'} + `; + content.appendChild(hero); + + const metrics = document.createElement('section'); + metrics.className = 'wallet-metrics'; + metrics.innerHTML = ` +
+ Cash + ${formatMobileBankCurrency(account.cash)} +
+
+ Earnings + ${formatMobileBankCurrency(account.earnings)} +
+ `; + content.appendChild(metrics); + + const bankingActions = document.createElement('section'); + bankingActions.className = 'wallet-card'; + + const bankingTitle = document.createElement('div'); + bankingTitle.className = 'wallet-card-title'; + bankingTitle.textContent = 'Account Actions'; + + const earningsAction = document.createElement('div'); + earningsAction.className = 'wallet-action-block'; + + const earningsSummary = document.createElement('div'); + earningsSummary.className = 'wallet-action-summary'; + earningsSummary.innerHTML = ` + Deposit Earnings + ${formatMobileBankCurrency(account.earnings)} available + Move mission earnings into your bank balance. + `; + + const earningsButton = document.createElement('button'); + earningsButton.className = 'wallet-secondary-button wallet-full-button'; + earningsButton.type = 'button'; + earningsButton.disabled = pendingAction !== '' || normalizeMobileBankAmount(account.earnings) <= 0; + earningsButton.textContent = pendingAction === 'depositearnings' ? 'Depositing...' : 'Deposit Earnings'; + earningsButton.addEventListener('click', () => { + requestMobileBankDepositEarnings(); + }); + earningsAction.append(earningsSummary, earningsButton); + + const creditAction = document.createElement('div'); + creditAction.className = 'wallet-action-block'; + + const creditSummary = document.createElement('div'); + creditSummary.className = 'wallet-action-summary'; + creditSummary.innerHTML = ` + Credit Line Payment + ${formatMobileBankCurrency(amountDue)} due + ${session.orgName || 'Organization'} - ${formatMobileBankCurrency(outstandingPrincipal)} outstanding + `; + + const creditControls = document.createElement('div'); + creditControls.className = 'wallet-action-controls'; + + const creditAmount = document.createElement('input'); + creditAmount.className = 'wallet-input'; + creditAmount.type = 'number'; + creditAmount.min = '1'; + creditAmount.step = '1'; + creditAmount.placeholder = amountDue > 0 ? 'Payment amount' : 'No payment due'; + creditAmount.setAttribute('aria-label', 'Credit line payment amount'); + creditAmount.inputMode = 'numeric'; + creditAmount.disabled = pendingAction !== '' || amountDue <= 0; + + const creditButton = document.createElement('button'); + creditButton.className = 'wallet-secondary-button'; + creditButton.type = 'button'; + creditButton.disabled = pendingAction !== '' || amountDue <= 0; + creditButton.textContent = pendingAction === 'repaycreditline' ? 'Paying...' : 'Pay Credit'; + creditButton.addEventListener('click', () => { + requestMobileBankRepayCreditLine(creditAmount.value || amountDue); + }); + + creditControls.append(creditAmount, creditButton); + creditAction.append(creditSummary, creditControls); + bankingActions.append(bankingTitle, earningsAction, creditAction); + content.appendChild(bankingActions); + + const transferCard = document.createElement('section'); + transferCard.className = 'wallet-card'; + + const transferTitle = document.createElement('div'); + transferTitle.className = 'wallet-card-title'; + transferTitle.textContent = 'Transfer'; + + const targetSelect = document.createElement('select'); + targetSelect.className = 'wallet-input'; + targetSelect.setAttribute('aria-label', 'Transfer recipient'); + targetSelect.disabled = pendingAction !== '' || transferTargets.length === 0; + + const placeholder = document.createElement('option'); + placeholder.value = ''; + placeholder.textContent = transferTargets.length === 0 ? 'No online recipients' : 'Choose recipient'; + targetSelect.appendChild(placeholder); + + transferTargets.forEach((target) => { + const option = document.createElement('option'); + option.value = target.uid || ''; + option.textContent = target.name || target.uid || 'Player'; + targetSelect.appendChild(option); + }); + + const amountInput = document.createElement('input'); + amountInput.className = 'wallet-input'; + amountInput.type = 'number'; + amountInput.min = '1'; + amountInput.step = '1'; + amountInput.placeholder = 'Amount'; + amountInput.inputMode = 'numeric'; + amountInput.disabled = pendingAction !== ''; + + const transferButton = document.createElement('button'); + transferButton.className = 'wallet-primary-button'; + transferButton.type = 'button'; + transferButton.disabled = pendingAction !== '' || transferTargets.length === 0; + transferButton.textContent = pendingAction === 'transfer' ? 'Sending...' : 'Send Transfer'; + transferButton.addEventListener('click', () => { + requestMobileBankTransfer(targetSelect.value, amountInput.value); + }); + + transferCard.append(transferTitle, targetSelect, amountInput, transferButton); + content.appendChild(transferCard); + + const historyCard = document.createElement('section'); + historyCard.className = 'wallet-card'; + + const historyTitle = document.createElement('div'); + historyTitle.className = 'wallet-card-title'; + historyTitle.textContent = 'Recent Activity'; + + historyCard.append(historyTitle, mobileBankTransactionRows(account.transactions)); + content.appendChild(historyCard); + + appContainer.appendChild(content); + container.appendChild(appContainer); +} + +window.initializeMobileBankApp = initializeMobileBankApp; +window.requestMobileBankRefresh = requestMobileBankRefresh; +window.updateMobileBank = updateMobileBank; +window.updateMobileBankAccount = updateMobileBankAccount; +window.showMobileBankNotice = showMobileBankNotice; diff --git a/arma/client/addons/phone/ui/_site/js/components/Header.js b/arma/client/addons/phone/ui/_site/js/components/Header.js new file mode 100644 index 0000000..f487c77 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/Header.js @@ -0,0 +1,43 @@ +/** @format */ + +/** + * @class Header + * @extends Component + * @description A component that renders a header section with a title. + * Used for displaying page or section titles in the phone UI. + */ +class Header extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {string} [props.title='Phone UI'] - The title text to display in the header + */ + constructor(props) { + super(props); + } + + /** + * Render the header component + * @returns {HTMLElement} The rendered header element + */ + render() { + const { title = 'Phone UI' } = this.props; + + return this.createElement( + 'header', + { + className: 'header', + role: 'banner', + 'aria-label': 'Page header', + }, + this.createElement( + 'h1', + { + role: 'heading', + 'aria-level': '1', + }, + title + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/components/HomeIndicator.js b/arma/client/addons/phone/ui/_site/js/components/HomeIndicator.js new file mode 100644 index 0000000..fee13b8 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/HomeIndicator.js @@ -0,0 +1,77 @@ +/** @format */ + +/** + * @class HomeIndicator + * @extends Component + * @description A component that renders the iPhone-style home indicator. + * Provides navigation back to the home screen via click or swipe gestures. + * Currently implements click handling, with swipe gesture support planned for future. + */ +class HomeIndicator extends Component { + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + + // Bind event handlers + this.handleClick = this.handleClick.bind(this); + this.handleSwipeUp = this.handleSwipeUp.bind(this); + + // Touch event state for future swipe implementation + this.touchStartY = 0; + } + + /** + * Resets the app state and navigates to home screen + * @private + */ + handleClick() { + globalState.setState({ + currentApp: 'home', + selectedConversation: null, + selectedConversationRaw: null, + selectedContact: null, + showMessageContactPicker: false, + showModal: false, + }); + } + + /** + * Handles swipe up gesture + * @param {Event} e - Touch/swipe event object + * @private + * @todo Implement proper swipe gesture detection + */ + handleSwipeUp(e) { + // Simple click handler for now, swipe gesture to be implemented + this.handleClick(); + } + + /** + * Render the home indicator + * @returns {HTMLElement} The rendered home indicator element + */ + render() { + return this.createElement( + 'div', + { + className: 'home-indicator-container', + onClick: this.handleClick, + role: 'button', + 'aria-label': 'Return to home screen', + tabIndex: 0, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleClick(); + } + }, + }, + this.createElement('div', { + className: 'home-indicator', + 'aria-hidden': 'true', + }) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/components/HomeScreen.js b/arma/client/addons/phone/ui/_site/js/components/HomeScreen.js new file mode 100644 index 0000000..44b051f --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/HomeScreen.js @@ -0,0 +1,222 @@ +/** @format */ + +/** + * @class HomeScreen + * @extends Component + * @description The main home screen component that displays the app grid. + * Manages the display and interaction of app icons, handling navigation to different apps. + */ +class HomeScreen extends Component { + /** + * Cache for loaded icons + * @static + * @private + */ + static iconCache = new Map(); + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + this.handleAppClick = this.handleAppClick.bind(this); + this.state = { + isDarkTheme: document.documentElement.getAttribute('data-theme') === 'dark' + }; + } + + static iconPath(app, isDarkTheme) { + return PhoneMedia.base64Path('images', isDarkTheme ? 'dark' : 'light', `${app.icon}.png`); + } + + static backgroundPath(isDarkTheme) { + return PhoneMedia.base64Path('images', 'bg', isDarkTheme ? 'bgdark_01_ca.png' : 'bglight_01_ca.png'); + } + + componentDidMount() { + // Initial background update + this.updateBackground(); + + // Listen for theme changes + document.addEventListener('themeChanged', (event) => { + const isDarkTheme = event.detail.theme === 'dark'; + + // Update background immediately + const bgPath = HomeScreen.backgroundPath(isDarkTheme); + + PhoneMedia.loadImage(bgPath).then(imageContent => { + if (this.element) { + this.element.style.background = `url('${imageContent}')`; + this.element.style.backgroundSize = 'contain'; + this.element.style.backgroundPosition = 'center'; + } + }).catch(error => { + console.error(`Failed to load background image: ${bgPath}`, error); + }); + + // Update state after background change + this.setState({ isDarkTheme }); + }); + } + + updateBackground() { + const isDarkTheme = document.documentElement.getAttribute('data-theme') === 'dark'; + const bgPath = HomeScreen.backgroundPath(isDarkTheme); + + PhoneMedia.loadImage(bgPath).then(imageContent => { + if (this.element) { + this.element.style.background = `url('${imageContent}')`; + this.element.style.backgroundSize = 'contain'; + this.element.style.backgroundPosition = 'center'; + this.element.style.backgroundRepeat = 'no-repeat'; + this.element.style.backgroundColor = isDarkTheme ? '#000000' : '#ffffff'; + } else { + console.error('HomeScreen element not found during background update'); + } + }).catch(error => { + console.error(`Failed to load background image: ${bgPath}`, error); + }); + } + + /** + * List of available apps with their configurations + * @type {Array} + * @private + */ + static get apps() { + return [ + { name: 'safari', title: 'Safari', icon: 'Safari', color: '' }, + { name: 'mail', title: 'Mail', icon: 'Mail', color: '' }, + { name: 'notes', title: 'Notes', icon: 'Notes', color: '' }, + { name: 'iCloud', title: 'iCloud', icon: 'iCloud', color: '' }, + { name: 'camera', title: 'Camera', icon: 'Camera', color: '' }, + { name: 'photos', title: 'Photos', icon: 'Photos', color: '' }, + { name: 'clock', title: 'Clock', icon: 'Clock', color: '' }, + { name: 'calendar', title: 'Calendar', icon: 'Calendar', color: '' }, + { name: 'wallet', title: 'Wallet', icon: 'Wallet', color: '' }, + { name: 'store', title: 'App Store', icon: 'AppStore', color: '' }, + ]; + } + + /** + * List of apps to show in the dock + * @type {Array} + * @private + */ + static get dockApps() { + return [ + { name: 'phone', title: '', icon: 'Phone', color: '' }, + { name: 'contacts', title: '', icon: 'Contacts', color: '' }, + { name: 'messages', title: '', icon: 'Message', color: '' }, + { name: 'settings', title: '', icon: 'Settings', color: '' }, + ]; + } + + /** + * Handles app icon click events + * @param {string} appName - Name of the clicked app + * @private + */ + handleAppClick(appName) { + globalState.setState({ currentApp: appName }); + } + + /** + * Renders an individual app icon + * @param {AppConfig} app - App configuration object + * @returns {HTMLElement} The rendered app icon element + * @private + */ + renderAppIcon(app) { + const imgElement = this.createElement('img', { + alt: app.title, + style: { display: 'none' } // Hide initially + }); + + const isDarkTheme = document.documentElement.getAttribute('data-theme') === 'dark'; + const iconPath = HomeScreen.iconPath(app, isDarkTheme); + + // Check cache first + if (HomeScreen.iconCache.has(iconPath)) { + imgElement.src = HomeScreen.iconCache.get(iconPath); + imgElement.style.display = 'block'; + } else { + // Load the file if not in cache + PhoneMedia.loadImage(iconPath).then(imageContent => { + HomeScreen.iconCache.set(iconPath, imageContent); + imgElement.src = imageContent; + imgElement.style.display = 'block'; + }).catch(error => { + console.error(`Failed to load icon for ${app.title}:`, error); + }); + } + + return this.createElement( + 'div', + { + className: 'app-icon', + onClick: () => this.handleAppClick(app.name), + role: 'button', + 'aria-label': `Open ${app.title} app`, + tabIndex: 0, + onKeyPress: (e) => { + if (e.key === 'Enter' || e.key === ' ') { + this.handleAppClick(app.name); + } + }, + }, + this.createElement( + 'div', + { + className: 'app-icon-symbol', + 'aria-hidden': 'true', + style: app.color ? { background: app.color } : {} + }, + imgElement + ), + this.createElement('span', { className: 'app-title' }, app.title) + ); + } + + /** + * Render the home screen + * @returns {HTMLElement} The rendered home screen element + */ + render() { + return this.createElement( + 'div', + { + className: 'home-screen', + role: 'main', + 'aria-label': 'Home screen', + }, + this.createElement( + 'div', + { + className: 'app-grid', + role: 'grid', + 'aria-label': 'App grid', + }, + ...HomeScreen.apps.map((app) => this.renderAppIcon(app)) + ), + this.createElement( + 'div', + { + className: 'dock', + role: 'toolbar', + 'aria-label': 'App dock', + }, + ...HomeScreen.dockApps.map((app) => this.renderAppIcon(app)) + ) + ); + } +} + +/** + * @typedef {Object} AppConfig + * @property {string} name - Internal name/identifier of the app + * @property {string} title - Display title of the app + * @property {string} icon - Emoji icon representing the app + * @property {string} color - Background color for the app icon (if any) + */ diff --git a/arma/client/addons/phone/ui/_site/js/components/Modal.js b/arma/client/addons/phone/ui/_site/js/components/Modal.js new file mode 100644 index 0000000..5b26b6c --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/Modal.js @@ -0,0 +1,169 @@ +/** @format */ + +/** + * @class Modal + * @extends Component + * @description A reusable modal dialog component. + * Provides an overlay with a modal dialog box containing customizable content and actions. + * Supports keyboard interaction and click-outside-to-close behavior. + */ +class Modal extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} props.show - Whether the modal is visible + * @param {string} [props.title='Modal'] - Title of the modal + * @param {Array|Object} [props.children=[]] - Content to display in the modal + * @param {Function} [props.onClose] - Callback when modal is closed + * @param {Function} [props.onConfirm] - Callback when confirm button is clicked + */ + constructor(props) { + super(props); + + // Bind event handlers + this.handleOverlayClick = this.handleOverlayClick.bind(this); + this.handleModalClick = this.handleModalClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Handle click events on the overlay + * @param {Event} e - Click event object + * @private + */ + handleOverlayClick(e) { + if (e.target === e.currentTarget && this.props.onClose) { + this.props.onClose(); + } + } + + /** + * Prevent click events from bubbling through the modal + * @param {Event} e - Click event object + * @private + */ + handleModalClick(e) { + e.stopPropagation(); + } + + /** + * Handle keyboard events for accessibility + * @param {KeyboardEvent} e - Keyboard event object + * @private + */ + handleKeyDown(e) { + if (e.key === 'Escape' && this.props.onClose) { + this.props.onClose(); + } + } + + /** + * Render the modal actions (buttons) + * @param {Function} onClose - Close callback + * @param {Function} onConfirm - Confirm callback + * @param {string} confirmText - Text for confirm button + * @param {string} cancelText - Text for cancel button + * @returns {HTMLElement} The rendered actions element + * @private + */ + renderActions(onClose, onConfirm, confirmText = 'Call', cancelText = 'Cancel', extraActions = [], hideCancel = false, hideConfirm = false) { + if (hideCancel && hideConfirm && !extraActions.length) { + return null; + } + + return this.createElement( + 'div', + { className: 'modal-actions' }, + hideCancel ? null : this.createElement( + 'button', + { + className: 'button secondary', + onClick: () => onClose?.(), + type: 'button', + 'aria-label': cancelText, + }, + cancelText + ), + ...extraActions.map((action) => this.createElement( + 'button', + { + className: action.className || 'button secondary', + onClick: () => action.onClick?.(), + type: 'button', + disabled: action.disabled === true, + 'aria-label': action.ariaLabel || action.text, + }, + action.text + )), + hideConfirm ? null : this.createElement( + 'button', + { + className: 'button', + onClick: () => onConfirm?.(), + type: 'button', + 'aria-label': confirmText, + }, + confirmText + ) + ); + } + + /** + * Render the modal + * @returns {HTMLElement} The rendered modal element + */ + render() { + const { show, title, children = [], onClose, onConfirm, confirmText, cancelText, extraActions = [], hideCancel = false, hideConfirm = false } = this.props; + + if (!show) { + return this.createElement('div', { + className: 'hidden', + style: { display: 'none' }, + 'aria-hidden': 'true', + }); + } + + // Ensure children is always an array + const childElements = Array.isArray(children) ? children : [children]; + + return this.createElement( + 'div', + { + className: 'modal-overlay', + onClick: this.handleOverlayClick, + onKeyDown: this.handleKeyDown, + role: 'dialog', + 'aria-modal': 'true', + 'aria-labelledby': 'modal-title', + }, + this.createElement( + 'div', + { + className: 'modal', + onClick: this.handleModalClick, + role: 'document', + tabIndex: -1, + }, + this.createElement( + 'h2', + { + id: 'modal-title', + role: 'heading', + 'aria-level': '2', + }, + title || 'Modal' + ), + this.createElement( + 'div', + { + className: 'modal-content', + role: 'region', + 'aria-label': 'Modal content', + }, + ...childElements.filter((child) => child != null) + ), + this.renderActions(onClose, onConfirm, confirmText, cancelText, extraActions, hideCancel, hideConfirm) + ) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/components/NavigationBar.js b/arma/client/addons/phone/ui/_site/js/components/NavigationBar.js new file mode 100644 index 0000000..725f44e --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/NavigationBar.js @@ -0,0 +1,188 @@ +/** @format */ + +/** + * @class NavigationBar + * @extends Component + * @description A navigation bar component that provides app navigation controls. + * Handles back navigation and displays the current screen title. + */ +class NavigationBar extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {boolean} [props.showBackButton=false] - Whether to show the back button + * @param {string} [props.title] - Title to display in the navigation bar + * @param {Object|HTMLElement} [props.leftButton] - Optional custom button to display on the left side (overrides back button) + * @param {Object|HTMLElement} [props.rightButton] - Optional button to display on the right side + */ + constructor(props) { + super(props); + this.handleBackClick = this.handleBackClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Handle back button click event + * @private + */ + handleBackClick() { + const currentState = globalState.getState(); + + // Priority 1: If we're in a conversation, go back to messages list + if (currentState.selectedConversation) { + globalState.setState({ + selectedConversation: null, + selectedConversationRaw: null, + }); + return; // Exit early, don't execute the rest + } + + if (currentState.showMessageContactPicker) { + globalState.setState({ + showMessageContactPicker: false, + }); + return; + } + + if (currentState.selectedEmail || currentState.showEmailComposer) { + globalState.setState({ + selectedEmail: null, + showEmailComposer: false, + }); + return; + } + + // Priority 2: If we came from phone app, go back to phone + if (currentState.previousApp === 'phone') { + globalState.setState({ + currentApp: 'phone', + previousApp: null, + }); + return; // Exit early + } + + // Priority 3: Default - go to home and clear everything + globalState.setState({ + currentApp: 'home', + previousApp: null, + selectedConversation: null, + selectedConversationRaw: null, + selectedContact: null, + showMessageContactPicker: false, + showModal: false, + }); + } + + /** + * Handle keyboard events for accessibility + * @param {KeyboardEvent} e - Keyboard event object + * @private + */ + handleKeyDown(e) { + if (e.key === 'Backspace' && this.props.showBackButton) { + this.handleBackClick(); + } + } + + /** + * Render the left section (custom button, back button, or spacer) + * @returns {HTMLElement} The rendered element + * @private + */ + renderLeftSection() { + const { leftButton, showBackButton } = this.props; + + // Priority 1: Custom left button + if (leftButton) { + if (leftButton instanceof HTMLElement) { + return leftButton; + } + + return this.createElement( + leftButton.element || 'button', + leftButton.props || {}, + leftButton.content + ); + } + + // Priority 2: Default back button + if (showBackButton) { + return this.createElement( + 'button', + { + className: 'nav-back-button', + onClick: this.handleBackClick, + 'aria-label': 'Go back', + type: 'button', + }, + this.createElement('img', { + src: 'data:image/svg+xml;utf8,', + alt: '', + style: 'width:24px;height:24px;padding:0;margin:0;display:block;pointer-events:none;' + }) + ); + } + + // Priority 3: Empty spacer + return this.createElement('div', { + className: 'nav-spacer', + 'aria-hidden': 'true', + }); + } + + /** + * Render the right button section + * @returns {HTMLElement} The rendered element + * @private + */ + renderRightSection() { + const { rightButton } = this.props; + + if (!rightButton) { + return this.createElement('div', { + className: 'nav-spacer', + 'aria-hidden': 'true', + }); + } + + if (rightButton instanceof HTMLElement) { + return rightButton; + } + + return this.createElement( + rightButton.element || 'button', + rightButton.props || {}, + rightButton.content + ); + } + + /** + * Render the navigation bar + * @returns {HTMLElement} The rendered navigation bar element + */ + render() { + const { title } = this.props; + + return this.createElement( + 'nav', + { + className: 'navigation-bar', + role: 'navigation', + 'aria-label': 'Main navigation', + onKeyDown: this.handleKeyDown, + }, + this.renderLeftSection(), + title && + this.createElement( + 'h1', + { + className: 'nav-title', + role: 'heading', + 'aria-level': '1', + }, + title + ), + this.renderRightSection() + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/components/SearchBar.js b/arma/client/addons/phone/ui/_site/js/components/SearchBar.js new file mode 100644 index 0000000..7643855 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/SearchBar.js @@ -0,0 +1,117 @@ +/** @format */ + +/** + * @class SearchBar + * @extends Component + * @description A search input component that provides debounced search functionality. + * Includes built-in debouncing to prevent excessive search updates. + */ +class SearchBar extends Component { + /** + * @constructor + * @param {Object} props - Component properties + * @param {string} [props.placeholder='Search contacts...'] - Placeholder text for the search input + * @param {Function} [props.onSearch] - Callback function when search value changes + * @param {string} [props.value] - Initial input value + */ + constructor(props) { + super(props); + + // Set debounce delay + this.DEBOUNCE_DELAY = 300; // milliseconds + + // Initialize state + this.state = { + searchTerm: props.value || '' + }; + + // Bind methods + this.handleInput = debounce(this.handleInput.bind(this), this.DEBOUNCE_DELAY); + this.handleInputChange = this.handleInputChange.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + } + + /** + * Update state when props change + * @param {Object} nextProps - Next props + */ + componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ searchTerm: nextProps.value }); + } + } + + /** + * Handle input change events + * @param {Event} e - Input change event + * @private + */ + handleInputChange(e) { + const value = e.target.value; + this.setState({ searchTerm: value }); + this.handleInput(value); + } + + /** + * Debounced search handler + * @param {string} searchTerm - Current search term + * @private + */ + handleInput(searchTerm) { + const { onSearch } = this.props; + if (onSearch) { + onSearch(searchTerm); + } + } + + /** + * Handle keyboard events + * @param {KeyboardEvent} e - Keyboard event + * @private + */ + handleKeyDown(e) { + // Clear search on Escape + if (e.key === 'Escape') { + this.setState({ searchTerm: '' }); + this.handleInput(''); + } + } + + /** + * Render the search bar + * @returns {HTMLElement} The rendered search bar element + */ + render() { + const { placeholder = 'Search contacts...' } = this.props; + const { searchTerm } = this.state; + + return this.createElement( + 'div', + { + className: 'search-bar', + role: 'search', + 'aria-label': 'Search contacts', + style: { + paddingBottom: '10px', + borderBottom: '1px solid #e9ecef', + }, + }, + this.createElement('input', { + type: 'search', + placeholder, + value: searchTerm, + onInput: this.handleInputChange, + onKeyDown: this.handleKeyDown, + 'aria-label': placeholder, + style: { + width: '100%', + padding: '10px', + border: '1px solid #ddd', + borderRadius: '20px', + fontSize: '16px', + outline: 'none', + }, + }) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/components/StatusBar.js b/arma/client/addons/phone/ui/_site/js/components/StatusBar.js new file mode 100644 index 0000000..5d093a0 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/components/StatusBar.js @@ -0,0 +1,164 @@ +/** @format */ + +/** + * @class StatusBar + * @extends Component + * @description A component that displays the status bar at the top of the phone interface. + * Shows current time, signal strength, network status, and battery indicator. + */ +class StatusBar extends Component { + /** + * Cache for loaded icons + * @static + * @private + */ + static iconCache = new Map(); + + /** + * Time update interval in milliseconds + * @static + * @private + */ + static TIME_UPDATE_INTERVAL = 1000; + + /** + * @constructor + * @param {Object} props - Component properties + */ + constructor(props) { + super(props); + this.state = { + currentTime: this.getCurrentTime(), + }; + this.timerInterval = null; + } + + /** + * Start the timer when component mounts + * @lifecycle + */ + componentDidMount() { + if (!this.timerInterval) { + this.timerInterval = setInterval(() => { + this.setState({ currentTime: this.getCurrentTime() }); + }, StatusBar.TIME_UPDATE_INTERVAL); + } + } + + /** + * Clean up timer when component unmounts + * @lifecycle + */ + componentWillUnmount() { + if (this.timerInterval) { + clearInterval(this.timerInterval); + this.timerInterval = null; + } + } + + /** + * Get the current time in 24-hour format + * @returns {string} Formatted time string (HH:mm) + * @private + */ + getCurrentTime() { + return new Date().toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }); + } + + /** + * Render signal strength indicator + * @returns {HTMLElement} Signal bars element + * @private + */ + renderSignalBars() { + return this.createElement( + 'div', + { + className: 'signal-bars', + 'aria-label': 'Signal strength indicator', + role: 'meter', + 'aria-valuenow': '4', + 'aria-valuemin': '0', + 'aria-valuemax': '4', + }, + Array(4) + .fill(null) + .map(() => + this.createElement('div', { + className: 'bar', + 'aria-hidden': 'true', + }) + ) + ); + } + + /** + * Render battery icon + * @returns {HTMLElement} Battery icon element + * @private + */ + renderBatteryIcon() { + return this.createElement('span', { + className: 'battery-icon', + role: 'img', + 'aria-label': 'Battery full' + }); + } + + /** + * Render status indicators (network and battery) + * @returns {HTMLElement} Status indicators element + * @private + */ + renderStatusIndicators() { + return this.createElement( + 'div', + { className: 'status-indicators' }, + this.renderSignalBars(), + this.createElement( + 'span', + { + className: 'network-battery', + 'aria-label': 'Network: 5G, Battery: Full', + }, + '5G', + this.renderBatteryIcon() + ) + ); + } + + /** + * Render the status bar + * @returns {HTMLElement} The rendered status bar element + */ + render() { + const { currentTime } = this.state; + + return this.createElement( + 'div', + { + className: 'status-bar', + role: 'banner', + 'aria-label': 'Status bar', + }, + this.createElement( + 'div', + { + className: 'status-left', + role: 'timer', + 'aria-label': 'Current time', + }, + currentTime + ), + this.createElement('div', { + className: 'status-center', + 'aria-hidden': 'true', + }), + this.createElement('div', { className: 'status-right' }, this.renderStatusIndicators()) + ); + } +} diff --git a/arma/client/addons/phone/ui/_site/js/core/Component.js b/arma/client/addons/phone/ui/_site/js/core/Component.js new file mode 100644 index 0000000..03142a0 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/core/Component.js @@ -0,0 +1,272 @@ +/** @format */ + +/** + * @fileoverview Core Component class that provides the foundation for all UI components + * in the phone application. Implements a lightweight component lifecycle and virtual DOM-like + * functionality without external dependencies. + */ + +/** + * Base Component class that handles rendering, lifecycle events, and state management. + * Provides a React-like component interface for building UI elements. + * + * @class + * @example + * class MyComponent extends Component { + * constructor(props) { + * super(props); + * this.state = { count: 0 }; + * } + * + * render() { + * return this.createElement('div', {}, `Count: ${this.state.count}`); + * } + * } + */ +class Component { + /** + * Creates a new Component instance. + * @param {Object} props - Initial properties for the component + */ + constructor(props = {}) { + this.props = props; + this.state = {}; + this.element = null; + this.children = []; + this.eventListeners = new Map(); + this.mounted = false; + this.pendingUpdate = false; + } + + /** + * Updates component state and triggers a re-render. + * State updates are batched to prevent multiple renders in the same tick. + * + * @param {Object} newState - Object containing state updates + */ + setState(newState) { + const prevState = { ...this.state }; + this.state = { ...this.state, ...newState }; + + // Prevent multiple updates in the same tick + if (!this.pendingUpdate) { + this.pendingUpdate = true; + setTimeout(() => { + this.pendingUpdate = false; + this.updateComponent(prevState); + }, 0); + } + } + + /** + * Internal method to handle component updates. + * Manages the re-rendering process and maintains child component state. + * + * @private + * @param {Object} prevState - Previous state before update + */ + updateComponent(prevState) { + // Call onStateChange hook + this.onStateChange(prevState, this.state); + + // Re-render and update DOM + if (this.element && this.element.parentNode) { + const container = this.element.parentNode; + const oldElement = this.element; + + // Store input states and elements before update + const inputStates = new Map(); + oldElement.querySelectorAll('input').forEach(input => { + inputStates.set(input, { + element: input, + value: input.value, + selectionStart: input.selectionStart, + selectionEnd: input.selectionEnd, + isFocused: document.activeElement === input + }); + }); + + // Store mounted state of children + const childStates = new Map(); + this.children.forEach((child) => { + childStates.set(child, child.mounted); + }); + + // Create new element + const newElement = this.render(); + + // Update the DOM while preserving input elements + if (oldElement && newElement) { + // Replace the old element with the new one + container.replaceChild(newElement, oldElement); + this.element = newElement; + + // Restore input elements and their states + inputStates.forEach((state, oldInput) => { + const newInput = newElement.querySelector(`input[type="${oldInput.type}"]`); + if (newInput) { + // Replace the new input with the old one + newInput.parentNode.replaceChild(oldInput, newInput); + + // Restore input state + if (state.isFocused) { + oldInput.focus(); + oldInput.setSelectionRange(state.selectionStart, state.selectionEnd); + } + } + }); + + // Restore child components that were previously mounted + this.children.forEach((child) => { + if (childStates.get(child)) { + child.mount(this.element); + } + }); + } + } + } + + /** + * Lifecycle method called when state changes. + * Override in subclasses to handle state updates. + * + * @param {Object} prevState - Previous state + * @param {Object} newState - New state + */ + onStateChange(prevState, newState) { + // Override in subclasses if needed + } + + /** + * Mounts the component to a DOM container. + * Handles initial render and lifecycle methods. + * + * @param {HTMLElement} container - DOM element to mount component into + * @returns {Component} The component instance + */ + mount(container) { + // Skip if already mounted to this container + if (this.mounted && this.element && this.element.parentNode === container) { + return this; + } + + const newElement = this.render(); + if (this.element && this.element.parentNode) { + this.element.parentNode.replaceChild(newElement, this.element); + } else { + container.appendChild(newElement); + } + this.element = newElement; + + // Call componentDidMount after mounting + if (!this.mounted && this.componentDidMount) { + this.componentDidMount(); + } + this.mounted = true; + return this; + } + + /** + * Creates a DOM element with specified properties and children. + * Handles event listeners, styles, and refs. + * + * @param {string} tag - HTML tag name + * @param {Object} props - Element properties and attributes + * @param {...(string|number|Component|HTMLElement)} children - Child elements + * @returns {HTMLElement} Created DOM element + */ + createElement(tag, props = {}, ...children) { + const element = document.createElement(tag); + + // Set attributes and properties + Object.entries(props).forEach(([key, value]) => { + if (key.startsWith('on') && typeof value === 'function') { + const event = key.slice(2).toLowerCase(); + element.addEventListener(event, value); + + // Store event listener for cleanup + if (!this.eventListeners.has(element)) { + this.eventListeners.set(element, []); + } + this.eventListeners.get(element).push({ event, handler: value }); + } else if (key === 'className') { + element.className = value; + } else if (key === 'style' && typeof value === 'object') { + Object.assign(element.style, value); + } else if (key === 'ref' && typeof value === 'function') { + value(element); + } else if (typeof value === 'boolean') { + if (value) { + element.setAttribute(key, key); + } + } else if (value !== null && value !== undefined) { + element.setAttribute(key, value); + } else { + return; + } + }); + + // Add children + children.flat().forEach((child) => { + if (child === null || child === undefined) { + return; + } + + if (typeof child === 'string' || typeof child === 'number') { + element.appendChild(document.createTextNode(child)); + } else if (child instanceof Component) { + child.mount(element); + this.children.push(child); + } else if (child instanceof HTMLElement) { + element.appendChild(child); + } + }); + + return element; + } + + /** + * Renders the component's DOM representation. + * Must be overridden by subclasses to define component structure. + * + * @returns {HTMLElement} The rendered DOM element + */ + render() { + // Override in subclasses + return this.createElement('div'); + } + + /** + * Unmounts the component and cleans up resources. + * Removes event listeners and unmounts children. + */ + unmount() { + // Call componentWillUnmount before cleanup + if (this.mounted && this.componentWillUnmount) { + this.componentWillUnmount(); + } + + // Clean up event listeners + this.eventListeners.forEach((listeners, element) => { + listeners.forEach(({ event, handler }) => { + element.removeEventListener(event, handler); + }); + }); + this.eventListeners.clear(); + + // Unmount children + this.children.forEach((child) => { + if (child.mounted) { + child.unmount(); + } + }); + this.children = []; + + // Remove from DOM + if (this.element && this.element.parentNode) { + this.element.parentNode.removeChild(this.element); + } + this.element = null; + this.mounted = false; + } +} diff --git a/arma/client/addons/phone/ui/_site/js/core/StateManager.js b/arma/client/addons/phone/ui/_site/js/core/StateManager.js new file mode 100644 index 0000000..95afd13 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/core/StateManager.js @@ -0,0 +1,137 @@ +/** + * @format + * @fileoverview State management system for the phone application. Implements a simple pub/sub pattern for managing global application state. + */ + +/** + * Initial application state containing mock data for development. + * @type {Object} + */ +const initialAppState = { + // Navigation state + currentApp: 'home', + showModal: false, + + // Contact management + contacts: [], + + // Message management + messages: [], + + // Server-synced data (non-UI mapped) + // Keep raw server payloads separate to avoid breaking current UI + rawMessages: [], + emails: [], + selectedEmail: null, + showEmailComposer: false, + selectedConversationRaw: null, + + // UI state + selectedContact: null, + selectedConversation: null, + showMessageContactPicker: false, + newMessage: '', + currentUid: null, + + // Clock state + clockMode: 'world', + worldClocks: [], + timers: [], + alarms: [], + clockSettings: { format24h: true }, + + // Notes state + notes: [], + currentNote: null, + showNoteEditor: false, + + // Calendar state + events: [], + currentEvent: null, + showEventEditor: false, + + // Mobile bank state + mobileBank: { + account: { + bank: 0, + cash: 0, + earnings: 0, + transactions: [], + }, + session: { + playerName: '', + transferTargets: [], + uid: '', + }, + notice: null, + pendingAction: '', + }, +}; + +/** + * Manages global application state using a publish/subscribe pattern. + * Provides methods for accessing and updating state while notifying subscribers. + * + * @class + * @example + * const state = new StateManager({ count: 0 }); + * state.subscribe((newState, prevState) => { + * console.log('State changed:', newState); + * }); + * state.setState({ count: 1 }); + */ +class StateManager { + /** + * Creates a new StateManager instance. + * @param {Object} initialState - Initial state object + */ + constructor(initialState = {}) { + /** @private */ + this.state = { ...initialState }; + /** @private */ + this.subscribers = new Set(); + } + + /** + * Gets current state object. + * @returns {Object} Copy of current state + */ + getState() { + return { ...this.state }; + } + + /** + * Updates state and notifies subscribers. + * @param {Object} updates - Object containing state updates + */ + setState(updates) { + const prevState = { ...this.state }; + this.state = { ...this.state, ...updates }; + this.notifySubscribers(prevState, this.state); + } + + /** + * Subscribes to state changes. + * @param {Function} callback - Function to call when state changes + * @returns {Function} Unsubscribe function + */ + subscribe(callback) { + this.subscribers.add(callback); + return () => this.subscribers.delete(callback); + } + + /** + * Notifies subscribers of state changes. + * @private + * @param {Object} prevState - Previous state + * @param {Object} newState - New state + */ + notifySubscribers(prevState, newState) { + this.subscribers.forEach((callback) => { + callback(newState, prevState); + }); + } +} + +// Create and export global state instance +const globalState = new StateManager(initialAppState); diff --git a/arma/client/addons/phone/ui/_site/js/global.js b/arma/client/addons/phone/ui/_site/js/global.js new file mode 100644 index 0000000..b80f2a3 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/global.js @@ -0,0 +1,927 @@ +/** @format */ + +/** + * @fileoverview Global exports for the phone application. + * Exposes all API functions and initialization to the global window object. + */ + +/** + * Sets the theme for the phone application + * @param {string} theme - The theme to set ('dark' or 'light') + */ +function setTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); + + // Dispatch theme change event + const themeEvent = new CustomEvent('themeChanged', { + detail: { theme } + }); + document.dispatchEvent(themeEvent); +} + +// Debounce variables for contact requests +let lastContactRequest = 0; +const CONTACT_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests contacts from the server (Arma 3) with debouncing + */ +function requestContacts() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastContactRequest < CONTACT_REQUEST_COOLDOWN) { + console.log('Contact request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::contacts", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastContactRequest = now; + console.log('Requested contacts from server'); + } else { + console.warn('A3API not available, cannot request contacts'); + } +} + +/** + * Loads contacts into the global state (called by Arma 3) + * @param {Array} contacts - Array of contact objects from the server + */ +function loadContacts(contacts) { + try { + if (Array.isArray(contacts)) { + const normalizedContacts = normalizeContacts(contacts); + globalState.setState({ + contacts: normalizedContacts + }); + console.log(`Loaded ${contacts.length} contacts from server:`, contacts); + } else { + console.warn('Invalid contacts data received:', contacts); + } + } catch (error) { + console.error('Error loading contacts:', error); + } +} + +/** + * Refresh contacts via SQF-triggered UI event + */ +function refreshContacts() { + try { + requestContacts(); + } catch (e) { + console.error('Error refreshing contacts:', e); + } +} + +/** + * Updates contacts in state (SQF -> JS bridge) + * @param {Array} contacts + */ +function updateContacts(contacts) { + try { + if (Array.isArray(contacts)) { + const normalizedContacts = normalizeContacts(contacts); + globalState.setState({ contacts: normalizedContacts }); + // Rebuild message summaries to resolve names if raw present + rebuildMessageSummariesFromRaw(); + console.log(`Updated contacts from server: ${contacts.length}`); + } else { + console.warn('updateContacts: invalid data', contacts); + } + } catch (e) { + console.error('Error in updateContacts:', e); + } +} + +function normalizeContacts(contacts) { + return contacts + .filter(contact => contact && typeof contact === 'object') + .map(contact => { + const name = contact.name || contact.uid || 'Unknown Player'; + const uid = contact.uid || contact.id || ''; + return { + ...contact, + id: uid || contact.phone || name, + uid, + name, + fullName: contact.fullName || name, + phone: contact.phone || '', + email: contact.email || '', + avatar: contact.avatar || getInitials(name), + online: Boolean(contact.online), + system: Boolean(contact.system), + canCall: contact.canCall !== false, + canMessage: contact.canMessage !== false, + canEmail: contact.canEmail !== false + }; + }); +} + +// Player UID handling +function setPlayerUid(uid) { + try { + if (!uid || typeof uid !== 'string') { + console.warn('setPlayerUid: invalid uid', uid); + return; + } + window.__playerUid = uid; + globalState.setState({ currentUid: uid }); + // With UID known, we can build summaries + rebuildMessageSummariesFromRaw(); + // Optionally (re)request messages when UID is set + requestMessages(); + } catch (e) { + console.error('Error in setPlayerUid:', e); + } +} + +// Messages: request + update handlers + +let lastMessagesRequest = 0; +const MESSAGES_REQUEST_COOLDOWN = 1000; + +function requestMessages() { + const now = Date.now(); + if (now - lastMessagesRequest < MESSAGES_REQUEST_COOLDOWN) return; + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { event: 'phone::get::messages', data: {} }; + A3API.SendAlert(JSON.stringify(alert)); + lastMessagesRequest = now; + console.log('Requested messages from server'); + } else { + console.warn('A3API not available, cannot request messages'); + } +} + +/** + * Updates raw messages from server into state without breaking UI + * @param {Array} messages + */ +function updateMessages(messages) { + try { + if (Array.isArray(messages)) { + globalState.setState({ rawMessages: messages }); + rebuildMessageSummariesFromRaw(); + console.log(`Updated raw messages: ${messages.length}`); + } else { + console.warn('updateMessages: invalid data', messages); + } + } catch (e) { + console.error('Error in updateMessages:', e); + } +} + +/** + * Updates a specific message thread payload + * @param {Array} threadMessages + * @param {string} otherUid + */ +function updateMessageThread(threadMessages, otherUid) { + try { + if (!Array.isArray(threadMessages)) { + console.warn('updateMessageThread: invalid messages', threadMessages); + return; + } + const selectedConversationRaw = { otherUid, messages: threadMessages }; + globalState.setState({ selectedConversationRaw }); + // Update derived selectedConversation as well + rebuildMessageSummariesFromRaw(); + console.log(`Updated message thread with ${otherUid}: ${threadMessages.length}`); + } catch (e) { + console.error('Error in updateMessageThread:', e); + } +} + +/** + * Append a newly sent message to raw store + * @param {Object} messageObj + */ +function updateMessageSent(messageObj) { + try { + const { rawMessages = [], currentUid = window.__playerUid, selectedConversation } = globalState.getState(); + const next = [...rawMessages, messageObj]; + const otherUid = messageObj.from === currentUid ? messageObj.to : messageObj.from; + const statePatch = { rawMessages: next }; + if (selectedConversation && selectedConversation.id === otherUid) { + statePatch.selectedConversationRaw = { + otherUid, + messages: next.filter(message => + (message.from === currentUid && message.to === otherUid) || + (message.from === otherUid && message.to === currentUid) + ) + }; + } + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageSent:', e); + } +} + +/** + * Append a newly received message to raw store + * @param {Object} messageObj + */ +function updateMessageReceived(messageObj) { + try { + const { rawMessages = [], currentUid = window.__playerUid, selectedConversation } = globalState.getState(); + const next = [...rawMessages, messageObj]; + const otherUid = messageObj.from === currentUid ? messageObj.to : messageObj.from; + const statePatch = { rawMessages: next }; + if (selectedConversation && selectedConversation.id === otherUid) { + statePatch.selectedConversationRaw = { + otherUid, + messages: next.filter(message => + (message.from === currentUid && message.to === otherUid) || + (message.from === otherUid && message.to === currentUid) + ) + }; + } + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageReceived:', e); + } +} + +/** + * Mark message read in raw store by id + * @param {string} messageId + */ +function updateMessageRead(messageId) { + try { + const { rawMessages = [] } = globalState.getState(); + const updated = rawMessages.map(m => (m && m.id === messageId ? { ...m, read: true } : m)); + globalState.setState({ rawMessages: updated }); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageRead:', e); + } +} + +/** + * Remove a message from the local phone state after server delete succeeds + * @param {string} messageId + */ +function updateMessageDeleted(messageId) { + try { + const { rawMessages = [], selectedConversationRaw = null } = globalState.getState(); + const nextRawMessages = rawMessages.filter(message => message && message.id !== messageId); + const statePatch = { rawMessages: nextRawMessages }; + + if (selectedConversationRaw && Array.isArray(selectedConversationRaw.messages)) { + statePatch.selectedConversationRaw = { + ...selectedConversationRaw, + messages: selectedConversationRaw.messages.filter(message => message && message.id !== messageId) + }; + } + + globalState.setState(statePatch); + rebuildMessageSummariesFromRaw(); + } catch (e) { + console.error('Error in updateMessageDeleted:', e); + } +} + +// Transform raw message payloads into UI-friendly summary and thread structures +function rebuildMessageSummariesFromRaw() { + try { + const state = globalState.getState(); + const { rawMessages = [], contacts = [], currentUid = window.__playerUid, selectedConversationRaw } = state; + if (!Array.isArray(rawMessages) || !currentUid) { + // Nothing to do until we have both raw data and the player's UID + return; + } + + // Build contact lookup map by uid + const contactByUid = new Map(); + contacts.forEach(c => { if (c && c.uid) contactByUid.set(c.uid, c); }); + + // Group messages by other participant + const threadsMap = new Map(); + for (const m of rawMessages) { + if (!m) continue; + const from = m.from; + const to = m.to; + const otherUid = from === currentUid ? to : from; + if (!threadsMap.has(otherUid)) threadsMap.set(otherUid, []); + threadsMap.get(otherUid).push(m); + } + + // Helper to convert timestamp to Date + const toJsDate = (t) => { + if (t instanceof Date) return t; + if (typeof t === 'number') { + // serverTime is seconds; convert + return new Date(t * 1000); + } + // Fallback parse + const parsed = Date.parse(t); + return isNaN(parsed) ? new Date() : new Date(parsed); + }; + + // Build UI message summaries + const uiMessages = []; + for (const [otherUid, arr] of threadsMap.entries()) { + // Sort by timestamp ascending + const sorted = [...arr].sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0)); + const last = sorted[sorted.length - 1]; + const contact = contactByUid.get(otherUid) || { name: otherUid, uid: otherUid }; + + const conversation = sorted.map((msg, idx) => ({ + id: msg.id || idx, + text: msg.message || msg.text || '', + sender: msg.from === currentUid ? 'user' : 'contact', + timestamp: toJsDate(msg.timestamp) + })); + + uiMessages.push({ + id: otherUid, + contactId: otherUid, + contactName: contact.name || otherUid, + canMessage: contact.canMessage !== false, + lastMessage: (last && (last.message || last.text)) || '', + timestamp: toJsDate(last && last.timestamp), + unread: arr.filter(m => m.read === false && m.to === currentUid).length || 0, + conversation + }); + } + + // Sort conversations by last timestamp desc for UI list + uiMessages.sort((a, b) => (b.timestamp?.getTime?.() || 0) - (a.timestamp?.getTime?.() || 0)); + + const nextState = { messages: uiMessages }; + + // If we have a selected raw thread, map it to selectedConversation too + if (selectedConversationRaw && selectedConversationRaw.otherUid) { + const thread = threadsMap.get(selectedConversationRaw.otherUid) || selectedConversationRaw.messages || []; + const contact = contactByUid.get(selectedConversationRaw.otherUid) || { name: selectedConversationRaw.otherUid }; + nextState.selectedConversation = { + id: selectedConversationRaw.otherUid, + contactId: selectedConversationRaw.otherUid, + contactName: contact.name, + canMessage: contact.canMessage !== false, + lastMessage: thread.length ? (thread[thread.length - 1].message || thread[thread.length - 1].text) : '', + timestamp: thread.length ? toJsDate(thread[thread.length - 1].timestamp) : new Date(), + unread: thread.filter(m => m.read === false && m.to === currentUid).length || 0, + conversation: thread.map((msg, idx) => ({ + id: msg.id || idx, + text: msg.message || msg.text || '', + sender: msg.from === currentUid ? 'user' : 'contact', + timestamp: toJsDate(msg.timestamp) + })) + }; + } + + globalState.setState(nextState); + } catch (e) { + console.error('Error rebuilding message summaries:', e); + } +} + +// Emails: request + update handlers + +let lastEmailsRequest = 0; +const EMAILS_REQUEST_COOLDOWN = 1000; + +function requestEmails() { + const now = Date.now(); + if (now - lastEmailsRequest < EMAILS_REQUEST_COOLDOWN) return; + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { event: 'phone::get::emails', data: {} }; + A3API.SendAlert(JSON.stringify(alert)); + lastEmailsRequest = now; + console.log('Requested emails from server'); + } else { + console.warn('A3API not available, cannot request emails'); + } +} + +function normalizeEmails(emails) { + if (!Array.isArray(emails)) return []; + + const byId = new Map(); + emails + .filter((email) => email && typeof email === 'object') + .forEach((email) => { + const id = email.id || `${email.from || ''}:${email.to || ''}:${email.timestamp || ''}:${email.subject || ''}`; + byId.set(id, { + id, + from: email.from || '', + to: email.to || '', + subject: email.subject || '', + body: email.body || '', + timestamp: email.timestamp || '', + read: !!email.read + }); + }); + + return Array.from(byId.values()).sort((left, right) => { + const leftTime = new Date(left.timestamp).getTime() || 0; + const rightTime = new Date(right.timestamp).getTime() || 0; + return rightTime - leftTime; + }); +} + +/** + * Replace emails in state + * @param {Array} emails + */ +function updateEmails(emails) { + try { + if (Array.isArray(emails)) { + globalState.setState({ emails: normalizeEmails(emails) }); + console.log(`Updated emails: ${emails.length}`); + } else { + console.warn('updateEmails: invalid data', emails); + } + } catch (e) { + console.error('Error in updateEmails:', e); + } +} + +/** + * Append a newly sent email to state + * @param {Object} emailObj + */ +function updateEmailSent(emailObj) { + try { + const { emails = [] } = globalState.getState(); + globalState.setState({ emails: normalizeEmails([emailObj, ...emails]) }); + } catch (e) { + console.error('Error in updateEmailSent:', e); + } +} + +/** + * Append a newly received email to state + * @param {Object} emailObj + */ +function updateEmailReceived(emailObj) { + try { + const { emails = [] } = globalState.getState(); + globalState.setState({ emails: normalizeEmails([emailObj, ...emails]) }); + } catch (e) { + console.error('Error in updateEmailReceived:', e); + } +} + +/** + * Mark email read in state by id + * @param {string} emailId + */ +function updateEmailRead(emailId) { + try { + const { emails = [], selectedEmail = null } = globalState.getState(); + const updated = emails.map(e => (e && e.id === emailId ? { ...e, read: true } : e)); + globalState.setState({ + emails: updated, + selectedEmail: selectedEmail && selectedEmail.id === emailId ? { ...selectedEmail, read: true } : selectedEmail + }); + } catch (e) { + console.error('Error in updateEmailRead:', e); + } +} + +/** + * Remove an email from the local phone state after server delete succeeds + * @param {string} emailId + */ +function updateEmailDeleted(emailId) { + try { + const { emails = [], selectedEmail = null } = globalState.getState(); + globalState.setState({ + emails: emails.filter(email => email && email.id !== emailId), + selectedEmail: selectedEmail && selectedEmail.id === emailId ? null : selectedEmail + }); + } catch (e) { + console.error('Error in updateEmailDeleted:', e); + } +} + +// Debounce variables for notes requests +let lastNotesRequest = 0; +const NOTES_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests notes from the server (Arma 3) with debouncing + */ +function requestNotes() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastNotesRequest < NOTES_REQUEST_COOLDOWN) { + console.log('Notes request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::notes", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastNotesRequest = now; + console.log('Requested notes from server'); + } else { + console.warn('A3API not available, cannot request notes'); + } +} + +/** + * Loads notes into the global state (called by Arma 3) + * @param {Array} notes - Array of note objects from the server + */ +function loadNotes(notes) { + try { + if (Array.isArray(notes)) { + // Sort notes by updated date (newest first) + const sortedNotes = notes.sort((a, b) => { + const dateA = new Date(a.updatedAt || a.createdAt); + const dateB = new Date(b.updatedAt || b.createdAt); + return dateB - dateA; + }); + + // Update global state with loaded notes + globalState.setState({ + notes: sortedNotes + }); + console.log(`Loaded ${notes.length} notes from server:`, notes); + } else { + console.warn('Invalid notes data received:', notes); + } + } catch (error) { + console.error('Error loading notes:', error); + } +} + +/** + * Saves a note to the server (Arma 3) + * @param {Object} note - Note object to save + */ +function saveNote(note) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::note", + "data": note + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved note to server:', note); + } else { + console.warn('A3API not available, cannot save note'); + } +} + +/** + * Deletes a note from the server (Arma 3) + * @param {string} noteId - ID of the note to delete + */ +function deleteNote(noteId) { + if (!noteId) { + console.error('Cannot delete note: no ID provided'); + return; + } + + try { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::note", + "data": { id: noteId } + }; + A3API.SendAlert(JSON.stringify(alert)); + } else { + console.warn('A3API not available, cannot delete note. A3API type:', typeof A3API); + if (typeof A3API !== 'undefined') { + console.log('A3API object:', A3API); + console.log('A3API.SendAlert available:', !!A3API.SendAlert); + } + } + } catch (error) { + console.error('Error in deleteNote function:', error); + } +} + +// Debounce variables for events requests +let lastEventsRequest = 0; +const EVENTS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Request events from the server (Arma 3) with debouncing + */ +function requestCalendarEvents() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastEventsRequest < EVENTS_REQUEST_COOLDOWN) { + console.log('Events request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::events", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastNotesRequest = now; + console.log('Requested events from server'); + } else { + console.warn('A3API not available, cannot request events'); + } +} + +/** + * Loads calendar events into the global state (called by Arma 3) + * @param {Array} events - Array of calendar event objects from the server + */ +function loadCalendarEvents(events) { + try { + if (Array.isArray(events)) { + globalState.setState({ + events: events + }); + console.log(`Loaded ${events.length} calendar events from server:`, events); + } else { + console.warn('Invalid calendar events data received:', events); + } + } catch (error) { + console.error('Error loading calendar events:', error); + } +} + +/** + * Saves a calendar event to the server (Arma 3) + * @param {Object} event - Event object to save + */ +function saveCalendarEvent(event) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::event", + "data": event + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved calendar event to server:', event); + } else { + console.warn('A3API not available, cannot save calendar event'); + } +} + +/** + * Deletes a calendar event from the server (Arma 3) + * @param {string} eventId - ID of the event to delete + */ +function deleteCalendarEvent(eventId) { + if (!eventId) { + console.error('Cannot delete calendar event: no ID provided'); + return; + } + + try { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::event", + "data": { id: eventId } + }; + A3API.SendAlert(JSON.stringify(alert)); + } else { + console.warn('A3API not available, cannot delete calendar event.'); + } + } catch (error) { + console.error('Error in deleteCalendarEvent function:', error); + } +} + +// Debounce variables for world clocks requests +let lastWorldClocksRequest = 0; +const WORLD_CLOCKS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests world clocks from the server (Arma 3) with debouncing + */ +function requestWorldClocks() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastWorldClocksRequest < WORLD_CLOCKS_REQUEST_COOLDOWN) { + console.log('World clocks request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::clocks", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastWorldClocksRequest = now; + console.log('Requested world clocks from server'); + } else { + console.warn('A3API not available, cannot request world clocks'); + } +} + +/** + * Loads world clocks into the global state (called by Arma 3) + * @param {Array} worldClocks - Array of world clock objects from the server + */ +function loadWorldClocks(worldClocks) { + try { + if (Array.isArray(worldClocks)) { + // Update global state with loaded world clocks + globalState.setState({ + worldClocks: worldClocks + }); + console.log(`Loaded ${worldClocks.length} world clocks from server:`, worldClocks); + } else { + console.warn('Invalid world clocks data received:', worldClocks); + } + } catch (error) { + console.error('Error loading world clocks:', error); + } +} + +/** + * Saves a world clock to the server (Arma 3) + * @param {Object} worldClock - World clock object to save + */ +function saveWorldClock(worldClock) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::clock", + "data": worldClock + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved world clock to server:', worldClock); + } else { + console.warn('A3API not available, cannot save world clock'); + } +} + +/** + * Deletes a world clock from the server (Arma 3) + * @param {string} clockId - ID of the world clock to delete + */ +function deleteWorldClock(clockId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::clock", + "data": { id: clockId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Deleted world clock from server:', clockId); + } else { + console.warn('A3API not available, cannot delete world clock'); + } +} + +// Debounce variables for alarms requests +let lastAlarmsRequest = 0; +const ALARMS_REQUEST_COOLDOWN = 1000; // 1 second cooldown + +/** + * Requests alarms from the server (Arma 3) with debouncing + */ +function requestAlarms() { + const now = Date.now(); + + // Check if we're in cooldown period + if (now - lastAlarmsRequest < ALARMS_REQUEST_COOLDOWN) { + console.log('Alarms request ignored - too frequent'); + return; + } + + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::get::alarms", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alert)); + lastAlarmsRequest = now; + console.log('Requested alarms from server'); + } else { + console.warn('A3API not available, cannot request alarms'); + } +} + +/** + * Loads alarms into the global state (called by Arma 3) + * @param {Array} alarms - Array of alarm objects from the server + */ +function loadAlarms(alarms) { + try { + if (Array.isArray(alarms)) { + // Update global state with loaded alarms + globalState.setState({ + alarms: alarms + }); + console.log(`Loaded ${alarms.length} alarms from server:`, alarms); + } else { + console.warn('Invalid alarms data received:', alarms); + } + } catch (error) { + console.error('Error loading alarms:', error); + } +} + +/** + * Saves an alarm to the server (Arma 3) + * @param {Object} alarm - Alarm object to save + */ +function saveAlarm(alarm) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::save::alarm", + "data": alarm + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Saved alarm to server:', alarm); + } else { + console.warn('A3API not available, cannot save alarm'); + } +} + +/** + * Deletes an alarm from the server (Arma 3) + * @param {string} alarmId - ID of the alarm to delete + */ +function deleteAlarm(alarmId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::delete::alarm", + "data": { id: alarmId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Deleted alarm from server:', alarmId); + } else { + console.warn('A3API not available, cannot delete alarm'); + } +} + +/** + * Toggles an alarm on/off on the server (Arma 3) + * @param {string} alarmId - ID of the alarm to toggle + */ +function toggleAlarm(alarmId) { + if (typeof A3API !== 'undefined' && A3API.SendAlert) { + const alert = { + "event": "phone::toggle::alarm", + "data": { id: alarmId } + }; + A3API.SendAlert(JSON.stringify(alert)); + console.log('Toggled alarm on server:', alarmId); + } else { + console.warn('A3API not available, cannot toggle alarm'); + } +} + +// Handle any uncaught errors +window.addEventListener('error', (event) => { + console.error('Uncaught error:', event.error); +}); + +// Export the initialization function and all API functions to global scope +window.initializeApp = initializeApp; +window.setTheme = setTheme; +window.requestContacts = requestContacts; +window.loadContacts = loadContacts; +window.refreshContacts = refreshContacts; +window.updateContacts = updateContacts; +window.setPlayerUid = setPlayerUid; +// Messages +window.requestMessages = requestMessages; +window.updateMessages = updateMessages; +window.updateMessageThread = updateMessageThread; +window.updateMessageSent = updateMessageSent; +window.updateMessageReceived = updateMessageReceived; +window.updateMessageRead = updateMessageRead; +window.updateMessageDeleted = updateMessageDeleted; +// Emails +window.requestEmails = requestEmails; +window.updateEmails = updateEmails; +window.updateEmailSent = updateEmailSent; +window.updateEmailReceived = updateEmailReceived; +window.updateEmailRead = updateEmailRead; +window.updateEmailDeleted = updateEmailDeleted; +window.requestNotes = requestNotes; +window.loadNotes = loadNotes; +window.saveNote = saveNote; +window.deleteNote = deleteNote; +window.requestCalendarEvents = requestCalendarEvents; +window.loadCalendarEvents = loadCalendarEvents; +window.saveCalendarEvent = saveCalendarEvent; +window.deleteCalendarEvent = deleteCalendarEvent; +window.requestWorldClocks = requestWorldClocks; +window.loadWorldClocks = loadWorldClocks; +window.saveWorldClock = saveWorldClock; +window.deleteWorldClock = deleteWorldClock; +window.requestAlarms = requestAlarms; +window.loadAlarms = loadAlarms; +window.saveAlarm = saveAlarm; +window.deleteAlarm = deleteAlarm; +window.toggleAlarm = toggleAlarm; diff --git a/arma/client/addons/phone/ui/_site/js/main.js b/arma/client/addons/phone/ui/_site/js/main.js new file mode 100644 index 0000000..b190a37 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/main.js @@ -0,0 +1,98 @@ +/** @format */ + +/** + * @fileoverview Main entry point for the phone application. + * Initializes the application and mounts the root component. + */ + +/** + * Initialize and mount the phone application. + * Sets up error boundaries and debugging tools. + * + * @function + * @name initializeApp + * @throws {Error} If app container element is not found + */ +const initializeApp = () => { + try { + const appContainer = document.getElementById('app'); + if (!appContainer) { + throw new Error('App container element not found. Make sure there is an element with id="app" in the HTML.'); + } + + // Set default theme first + document.documentElement.setAttribute('data-theme', 'dark'); + + // Get theme from game using A3API + const themeAlert = { + "event": "phone::get::theme", + "data": {} + }; + A3API.SendAlert(JSON.stringify(themeAlert)); + + // Request player UID for correct message mapping + const meAlert = { + "event": "phone::get::player", + "data": {} + }; + A3API.SendAlert(JSON.stringify(meAlert)); + + // Request contacts from server + const contactsAlert = { + "event": "phone::get::contacts", + "data": {} + }; + A3API.SendAlert(JSON.stringify(contactsAlert)); + + // Request messages from server + const messagesAlert = { + "event": "phone::get::messages", + "data": {} + }; + A3API.SendAlert(JSON.stringify(messagesAlert)); + + // Request emails from server + const emailsAlert = { + "event": "phone::get::emails", + "data": {} + }; + A3API.SendAlert(JSON.stringify(emailsAlert)); + + // Request notes from server + const notesAlert = { + "event": "phone::get::notes", + "data": {} + }; + A3API.SendAlert(JSON.stringify(notesAlert)); + + // Request events from server + const eventsAlert = { + "event": "phone::get::events", + "data": {} + }; + A3API.SendAlert(JSON.stringify(eventsAlert)); + + // Request world clocks from server + const worldClocksAlert = { + "event": "phone::get::clocks", + "data": {} + }; + A3API.SendAlert(JSON.stringify(worldClocksAlert)); + + // Request alarms from server + const alarmsAlert = { + "event": "phone::get::alarms", + "data": {} + }; + A3API.SendAlert(JSON.stringify(alarmsAlert)); + + // Initialize phone app + const app = new App(); + app.mount(appContainer); + + console.log('Phone app initialized successfully'); + } catch (error) { + console.error('Failed to initialize phone app:', error); + throw error; + } +}; diff --git a/arma/client/addons/phone/ui/_site/js/utils/PhoneMedia.js b/arma/client/addons/phone/ui/_site/js/utils/PhoneMedia.js new file mode 100644 index 0000000..5ac8b37 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/utils/PhoneMedia.js @@ -0,0 +1,54 @@ +/** @format */ + +const PhoneMedia = (() => { + const addonRoot = 'forge\\forge_client\\addons\\phone\\ui\\_site\\'; + const cache = new Map(); + + function assetPath(...parts) { + return `${addonRoot}${parts.join('\\')}`; + } + + function base64Path(...parts) { + const path = assetPath(...parts); + return path.endsWith('.b64') ? path : `${path}.b64`; + } + + function toBrowserPath(path) { + return String(path || '') + .replace(addonRoot, '') + .replace(/\\/g, '/') + .replace(/\.b64$/i, ''); + } + + function toDataUrl(base64Text, mimeType = 'image/png') { + const value = String(base64Text || '').trim(); + if (!value) return ''; + return value.startsWith('data:') ? value : `data:${mimeType};base64,${value}`; + } + + function loadImage(path) { + const base64AssetPath = path.endsWith('.b64') ? path : `${path}.b64`; + + if (cache.has(base64AssetPath)) { + return Promise.resolve(cache.get(base64AssetPath)); + } + + if (typeof A3API !== 'undefined' && A3API.RequestFile) { + return A3API.RequestFile(base64AssetPath).then((base64Text) => { + const dataUrl = toDataUrl(base64Text); + cache.set(base64AssetPath, dataUrl); + return dataUrl; + }); + } + + const browserPath = toBrowserPath(base64AssetPath); + cache.set(base64AssetPath, browserPath); + return Promise.resolve(browserPath); + } + + return { + assetPath, + base64Path, + loadImage + }; +})(); diff --git a/arma/client/addons/phone/ui/_site/js/utils/helpers.js b/arma/client/addons/phone/ui/_site/js/utils/helpers.js new file mode 100644 index 0000000..f4132a1 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/js/utils/helpers.js @@ -0,0 +1,74 @@ +/** @format */ + +/** + * @fileoverview Utility functions for the phone application + * Contains helper functions for common operations like debouncing, + * ID generation, phone number formatting, and text manipulation. + */ + +/** + * Creates a debounced function that delays invoking func until after wait milliseconds have elapsed + * @param {Function} func - The function to debounce + * @param {number} wait - The number of milliseconds to delay + * @returns {Function} The debounced function + */ +const debounce = (func, wait) => { + let timeout; + + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +}; + +/** + * Generates a unique identifier using timestamp and random number. + * + * @returns {string} A unique string identifier + * @example + * const newId = generateId(); // Returns something like "lh8d3m4k2n1" + */ +const generateId = () => { + return Date.now().toString(36) + Math.random().toString(36).substr(2); +}; + +/** + * Formats a phone number string into a standardized format. + * Converts "11234567890" to "+1 (123) 456-7890" + * + * @param {string} phoneNumber - The raw phone number to format + * @returns {string} The formatted phone number + * @example + * const formatted = formatPhoneNumber('11234567890'); // Returns "+1 (123) 456-7890" + */ +const formatPhoneNumber = (phoneNumber) => { + const cleaned = phoneNumber.replace(/\D/g, ''); + const match = cleaned.match(/^(\d{1})(\d{3})(\d{3})(\d{4})$/); + if (match) { + return `+${match[1]} (${match[2]}) ${match[3]}-${match[4]}`; + } + return phoneNumber; +}; + +/** + * Extracts initials from a person's name. + * Takes first letter of first and last name, up to 2 characters. + * + * @param {string} name - The full name to get initials from + * @returns {string} The initials (maximum 2 characters) + * @example + * const initials = getInitials('John Doe'); // Returns "JD" + * const singleInitial = getInitials('John'); // Returns "J" + */ +const getInitials = (name) => { + return name + .split(' ') + .map((word) => word.charAt(0).toUpperCase()) + .join('') + .substring(0, 2); +}; diff --git a/arma/client/addons/phone/ui/_site/start.ps1 b/arma/client/addons/phone/ui/_site/start.ps1 new file mode 100644 index 0000000..3c193b6 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/start.ps1 @@ -0,0 +1,15 @@ +Write-Host "Building JS and CSS bundles..." +node tools/concat-all.js + +Write-Host "Starting local server..." +$pythonCommand = "python -m http.server" +try { + Start-Process python -ArgumentList "-m", "http.server" -NoNewWindow + Write-Host "Server started! Opening browser..." + Start-Sleep -Seconds 1 + Start-Process "http://localhost:8000" +} catch { + Write-Host "Error starting server. Make sure Python is installed." + Write-Host "You can install Python from: https://www.python.org/downloads/" + pause +} diff --git a/arma/client/addons/phone/ui/_site/start.sh b/arma/client/addons/phone/ui/_site/start.sh new file mode 100644 index 0000000..51aefbb --- /dev/null +++ b/arma/client/addons/phone/ui/_site/start.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +echo "Building JS and CSS bundles..." +node tools/concat-all.js + +echo "Starting local server..." +python3 -m http.server & +SERVER_PID=$! +sleep 1 + +# Try to open the browser automatically (Linux: xdg-open, macOS: open) +if command -v xdg-open > /dev/null; then + xdg-open http://localhost:8000 +elif command -v open > /dev/null; then + open http://localhost:8000 +else + echo "Please open http://localhost:8000 in your browser." +fi + +wait $SERVER_PID \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/base.css b/arma/client/addons/phone/ui/_site/styles/base.css new file mode 100644 index 0000000..0ea8abd --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/base.css @@ -0,0 +1,68 @@ +/* Base styles and CSS reset */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + /* Light theme (default) */ + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --text-primary: #000000; + --text-secondary: #6c757d; + --text-tertiary: #1c1c1e; + --border-color: #e9ecef; + --accent-color: #007aff; + --status-bar-bg: rgba(248, 249, 250, 0.95); + --nav-bg: #f8f9fa; + --message-bubble-user: #007aff; + --message-bubble-contact: #e9ecef; + --message-text-user: #ffffff; + --message-text-contact: #000000; + --input-bg: #ffffff; + --input-border: #ddd; + --icon-path: 'images/light/'; +} + +[data-theme="dark"] { + --bg-primary: #000000; + --bg-secondary: #1c1c1e; + --text-primary: #ffffff; + --text-secondary: #8e8e93; + --border-color: #38383a; + --accent-color: #0a84ff; + --status-bar-bg: rgba(28, 28, 30, 0.95); + --nav-bg: #1c1c1e; + --message-bubble-user: #0a84ff; + --message-bubble-contact: #2c2c2e; + --message-text-user: #ffffff; + --message-text-contact: #ffffff; + --input-bg: #2c2c2e; + --input-border: #38383a; + --icon-path: 'images/dark/'; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + background: transparent; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + padding: 20px; + color: var(--text-primary); +} + +html, body { + overflow: hidden !important; + -ms-overflow-style: none !important; + scrollbar-width: none !important; +} + +html::-webkit-scrollbar, +body::-webkit-scrollbar { + width: 0px !important; + height: 0px !important; + display: none !important; +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/buttons.css b/arma/client/addons/phone/ui/_site/styles/components/buttons.css new file mode 100644 index 0000000..4792147 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/buttons.css @@ -0,0 +1,24 @@ +/* Button Styles */ +.button { + background: #007aff; + color: white; + border: none; + padding: 12px 24px; + border-radius: 8px; + font-size: 16px; + cursor: pointer; + transition: background-color 0.2s; + margin: 10px 5px; + + &:hover { + background: #0056cc; + } + + &.secondary { + background: #6c757d; + + &:hover { + background: #545b62; + } + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/calendar.css b/arma/client/addons/phone/ui/_site/styles/components/calendar.css new file mode 100644 index 0000000..c63ea55 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/calendar.css @@ -0,0 +1,294 @@ +/* Calendar App Styles */ +.app-container { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-primary); +} + +.content { + flex: 1; + overflow-y: auto; + padding: 16px; +} + +/* Calendar Container */ +.calendar-container { + background: var(--bg-primary); + border-radius: 12px; + width: 100%; + max-width: 375px; + margin: 0 auto; +} + +/* Calendar Header */ +.calendar-header { + display: flex; + justify-content: space-between; + align-items: center; + margin: 10px; + padding: 0 16px; +} + +.calendar-title { + font-size: 20px; + font-weight: 600; + color: var(--text-primary); +} + +.calendar-nav { + display: flex; + gap: 8px; +} + +.calendar-nav-btn { + background: var(--bg-secondary); + border: none; + border-radius: 8px; + padding: 8px; + color: var(--accent-color); + font-weight: 500; + cursor: pointer; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + min-width: 36px; + height: 36px; +} + +.calendar-nav-btn img { + width: 20px; + height: 20px; + color: var(--accent-color); +} + +.calendar-nav-btn:hover { + background: var(--border-color); +} + +.nav-button.add-button img { + width: 24px; + height: 24px; + color: var(--accent-color); +} + +/* Calendar Grid */ +.calendar-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 4px; + padding: 0 16px; +} + +.calendar-weekday { + text-align: center; + font-size: 12px; + color: var(--text-secondary); + padding: 8px 0; + font-weight: 500; +} + +.calendar-day { + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; + position: relative; + border: 2px solid transparent; +} + +.calendar-day:hover { + background: var(--bg-secondary); +} + +.calendar-day.today { + background: var(--accent-color); + color: white; + border: 2px solid transparent; +} + +.calendar-day.selected { + background: var(--accent-color); + color: white; +} + +.calendar-day.today:not(.selected) { + background: transparent; + color: var(--text-primary); + border: 2px solid var(--accent-color); +} + +.calendar-day.today.selected { + border: 2px solid white; +} + +.calendar-day.other-month { + color: var(--text-secondary); + opacity: 0.5; +} + +.calendar-day.has-events::after { + content: ''; + position: absolute; + bottom: 4px; + width: 4px; + height: 4px; + border-radius: 50%; + background: var(--accent-color); +} + +/* Calendar Events */ +.calendar-events { + margin-top: 20px; + border-top: 1px solid var(--border-color); + padding: 16px; +} + +.no-events { + text-align: center; + color: var(--text-secondary); + font-size: 14px; + padding: 20px 0; +} + +.event-item { + display: flex; + align-items: center; + padding: 12px; + border-radius: 8px; + margin-bottom: 8px; + background: var(--bg-secondary); + cursor: pointer; + transition: background-color 0.2s; +} + +.event-item:hover { + background: var(--border-color); +} + +.event-time { + font-size: 12px; + color: var(--text-secondary); + margin-right: 12px; + min-width: 60px; +} + +.event-title { + font-size: 14px; + color: var(--text-primary); + flex-grow: 1; +} + +.event-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--accent-color); + margin-right: 8px; +} + +/* Event Editor */ +.event-editor { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-primary); +} + +.event-form { + display: flex; + flex-direction: column; + padding: 16px; + gap: 16px; +} + +.event-title-input { + font-size: 20px; + padding: 8px 0; + border: none; + border-bottom: 1px solid var(--border-color); + background: none; + color: var(--text-primary); + outline: none; +} + +.time-container { + display: flex; + gap: 16px; +} + +.time-input { + flex: 1; + padding: 8px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 14px; +} + +.event-description-input { + min-height: 100px; + padding: 8px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 14px; + resize: none; +} + +.delete-event-button { + background: transparent; + border: none; + color: #ff4444; + font-size: 0.9rem; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; +} + +.delete-event-button:hover { + background: rgba(255, 68, 68, 0.1); +} + +.delete-event-button:active { + background: rgba(255, 68, 68, 0.2); +} + +/* Navigation Buttons - Event Editor specific */ +.event-editor .navigation-bar .nav-button.cancel-button { + color: var(--text-secondary) !important; + font-size: 0.9rem !important; + font-weight: 400 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.event-editor .navigation-bar .nav-button.cancel-button:hover { + color: var(--text-primary) !important; +} + +.event-editor .navigation-bar .nav-button.save-button { + color: var(--accent-color) !important; + font-size: 0.9rem !important; + font-weight: 600 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.event-editor .navigation-bar .nav-button.save-button:hover { + color: var(--accent-color-hover) !important; +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/clock.css b/arma/client/addons/phone/ui/_site/styles/components/clock.css new file mode 100644 index 0000000..80c2b5d --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/clock.css @@ -0,0 +1,584 @@ +/* Clock App Styles */ + +/* Clock Tabs */ +.clock-tabs { + display: flex; + background: var(--background-secondary); + border-bottom: 1px solid var(--border-color); + margin-bottom: 1rem; +} + +.clock-tab { + flex: 1; + padding: 0.75rem 0.5rem; + background: none; + border: none; + color: var(--text-secondary); + font-size: 0.8rem; + cursor: pointer; + transition: all 0.2s ease; + border-bottom: 2px solid transparent; +} + +.clock-tab.active { + color: var(--accent-color); + border-bottom-color: var(--accent-color); + background: var(--bg-primary); +} + +.clock-tab:hover { + color: var(--text-primary); + background: var(--background-tertiary); +} + +.clock-content { + padding: 0 1rem; + overflow-y: auto; + max-height: calc(100vh - 200px); +} + +/* World Clock */ +.world-clock { + padding-bottom: 2rem; +} + +.local-time-section { + text-align: center; + margin-bottom: 2rem; + padding: 1.5rem; + background: var(--background-secondary); + border-radius: 12px; +} + +.local-time-label { + margin: 0 0 1rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--text-primary); +} + +.local-time-display { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.local-time { + font-size: 2.5rem; + font-weight: 300; + color: var(--accent-color); + font-family: 'SF Mono', monospace; +} + +.local-date { + font-size: 1rem; + color: var(--text-secondary); +} + +.add-world-clock-button { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + background: var(--accent-color); + color: white; + border: none; + border-radius: 8px; + font-size: 0.9rem; + cursor: pointer; + transition: background 0.2s ease; +} + +.add-world-clock-button:hover { + background: var(--accent-color-hover); +} + +.add-clock-form { + background: var(--background-secondary); + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; +} + +.add-clock-form h3 { + margin: 0 0 1rem 0; + font-size: 1rem; + color: var(--text-primary); +} + +.timezone-select { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 0.9rem; +} + +.form-buttons { + display: flex; + gap: 0.5rem; +} + +.form-buttons button { + flex: 1; + padding: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + cursor: pointer; + transition: all 0.2s ease; +} + +.form-buttons .add-button { + background: var(--accent-color); + color: white; + border-color: var(--accent-color); +} + +.form-buttons .add-button:hover { + background: var(--accent-color-hover); +} + +.form-buttons .add-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.world-clocks-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.world-clock-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + background: var(--background-secondary); + border-radius: 8px; + gap: 1rem; +} + +.clock-info { + flex: 1; +} + +.clock-city { + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.25rem; +} + +.clock-timezone { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.clock-time-info { + text-align: right; +} + +.clock-time { + font-size: 1.2rem; + font-weight: 500; + color: var(--accent-color); + font-family: 'SF Mono', monospace; +} + +.clock-date { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.remove-clock-button { + background: none; + border: 1px solid #ff4444; + color: #ff4444; + font-size: 0.8rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 4px; + transition: all 0.2s ease; +} + +.remove-clock-button:hover { + background: #ff4444; + color: white; +} + +/* Stopwatch */ +.stopwatch { + text-align: center; + padding: 2rem 1rem; +} + +.stopwatch-display { + margin-bottom: 2rem; +} + +.stopwatch-time { + font-size: 3rem; + font-weight: 300; + font-family: 'SF Mono', monospace; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.stopwatch-time.running { + color: var(--accent-color); +} + +.stopwatch-status { + font-size: 0.9rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 1px; +} + +.stopwatch-controls { + display: flex; + justify-content: center; + gap: 1rem; + margin-bottom: 2rem; +} + +.control-button { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 25px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + min-width: 80px; +} + +.start-button { + background: #4CAF50; + color: white; +} + +.start-button:hover { + background: #45a049; +} + +.stop-button { + background: #f44336; + color: white; +} + +.stop-button:hover { + background: #da190b; +} + +.lap-button { + background: var(--accent-color); + color: white; +} + +.lap-button:hover { + background: var(--accent-color-hover); +} + +.reset-button { + background: var(--text-secondary); + color: white; +} + +.reset-button:hover { + background: var(--text-primary); +} + +.lap-times-section { + text-align: left; +} + +.lap-times-title { + margin: 0 0 1rem 0; + font-size: 1.1rem; + color: var(--text-primary); + text-align: center; +} + +.lap-times-list { + max-height: 300px; + overflow-y: auto; + border: 1px solid var(--border-color); + border-radius: 8px; +} + +.lap-time-item { + display: grid; + grid-template-columns: 1fr 1fr 1fr auto; + gap: 1rem; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + align-items: center; + font-family: 'SF Mono', monospace; + font-size: 0.9rem; +} + +.lap-time-item:last-child { + border-bottom: none; +} + +.lap-time-item.fastest { + background: rgba(76, 175, 80, 0.1); + color: #4CAF50; +} + +.lap-time-item.slowest { + background: rgba(244, 67, 54, 0.1); + color: #f44336; +} + +.lap-number { + font-weight: 600; +} + +.lap-indicator { + font-size: 0.7rem; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 0.5px; +} + +/* Timer */ +.timer { + text-align: center; + padding: 2rem 1rem; +} + +.timer-display { + margin-bottom: 2rem; +} + +.timer-time { + font-size: 3rem; + font-weight: 300; + font-family: 'SF Mono', monospace; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.timer-time.finished { + color: #f44336; + animation: pulse 1s infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.timer-status { + font-size: 0.9rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 1px; +} + +.time-setters { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 2rem; +} + +.time-setter { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} + +.time-setter label { + font-size: 0.8rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.time-setter input { + width: 60px; + padding: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + text-align: center; + font-size: 1.1rem; + font-family: 'SF Mono', monospace; +} + +.timer-controls { + display: flex; + justify-content: center; + gap: 1rem; +} + +/* Alarm Clock */ +.alarm-clock { + padding-bottom: 2rem; +} + +.add-alarm-button { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + background: var(--accent-color); + color: white; + border: none; + border-radius: 8px; + font-size: 0.9rem; + cursor: pointer; + transition: background 0.2s ease; +} + +.add-alarm-button:hover { + background: var(--accent-color-hover); +} + +.add-alarm-form { + background: var(--background-secondary); + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; +} + +.add-alarm-form h3 { + margin: 0 0 1rem 0; + font-size: 1rem; + color: var(--text-primary); +} + +.add-alarm-form input { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 0.9rem; +} + +.alarms-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.alarm-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + background: var(--background-secondary); + border-radius: 8px; + gap: 1rem; + opacity: 1; + transition: opacity 0.2s ease; +} + +.alarm-item.disabled { + opacity: 0.6; +} + +.alarm-info { + flex: 1; +} + +.alarm-time { + font-size: 1.4rem; + font-weight: 500; + color: var(--text-primary); + font-family: 'SF Mono', monospace; + margin-bottom: 0.25rem; +} + +.alarm-label { + font-size: 0.9rem; + color: var(--text-secondary); + margin-bottom: 0.25rem; +} + +.alarm-days { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.alarm-controls { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.toggle-alarm { + padding: 0.5rem 1rem; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); + cursor: pointer; + font-size: 0.8rem; + transition: all 0.2s ease; +} + +.alarm-item.enabled .toggle-alarm { + background: var(--accent-color); + color: white; + border-color: var(--accent-color); +} + +.remove-alarm { + background: none; + border: 1px solid #ff4444; + color: #ff4444; + font-size: 0.8rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 4px; + transition: all 0.2s ease; +} + +.remove-alarm:hover { + background: #ff4444; + color: white; +} + +/* Empty States */ +.empty-state { + text-align: center; + padding: 2rem; + color: var(--text-secondary); +} + +/* Responsive */ +@media (max-width: 375px) { + .clock-tabs { + font-size: 0.7rem; + } + + .clock-tab { + padding: 0.5rem 0.25rem; + } + + .local-time { + font-size: 2rem; + } + + .stopwatch-time, + .timer-time { + font-size: 2.5rem; + } + + .time-setters { + gap: 1rem; + } +} + diff --git a/arma/client/addons/phone/ui/_site/styles/components/contacts.css b/arma/client/addons/phone/ui/_site/styles/components/contacts.css new file mode 100644 index 0000000..ba98cf8 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/contacts.css @@ -0,0 +1,96 @@ +/* Contacts App */ +.contact-list { + list-style: none; + + .contact-item { + display: flex; + align-items: center; + padding: 15px 0; + border-bottom: 1px solid #e9ecef; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: #f8f9fa; + color: var(--text-tertiary); + } + + .contact-avatar { + width: 50px; + height: 50px; + border-radius: 25px; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4); + display: flex; + align-items: center; + justify-content: center; + color: white; + font-weight: bold; + margin-right: 15px; + } + + .contact-info { + h3 { + font-size: 16px; + margin-bottom: 4px; + } + + p { + font-size: 14px; + color: #6c757d; + } + } + } +} + +/* Add Contact Form */ +.add-contact-form { + background: var(--bg-primary); + margin-bottom: 10px; + + h3 { + color: var(--text-primary); + font-size: 18px; + font-weight: 600; + margin-bottom: 15px; + } + + input { + background: var(--bg-secondary); + color: var(--text-primary); + border: 1px solid var(--border-color); + transition: border-color 0.2s; + width: 100%; + margin-bottom: 15px; + padding: 10px; + border-radius: 4px; + + &:focus { + outline: none; + } + + &::placeholder { + color: var(--text-secondary); + } + } + + button { + background: var(--accent-color); + color: white; + border: none; + padding: 12px; + border-radius: 8px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s; + margin: 0 !important; + width: 100% !important; + + &:hover { + opacity: 0.9; + } + + &:active { + opacity: 0.8; + } + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/dialpad.css b/arma/client/addons/phone/ui/_site/styles/components/dialpad.css new file mode 100644 index 0000000..eddf9e1 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/dialpad.css @@ -0,0 +1,270 @@ +/* Dialpad */ +.phone-dialpad { + display: flex; + flex-direction: column; + height: 100%; + padding: 20px; + background: var(--bg-primary); + color: var(--text-primary); + + &.call-active { + justify-content: center; + text-align: center; + } +} + +.phone-display { + text-align: center; + padding: 40px 20px; + margin-bottom: 20px; +} + +.phone-number { + font-size: 32px; + font-weight: 300; + color: var(--text-primary); + min-height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.dialpad { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin-bottom: 30px; + max-width: 300px; + margin-left: auto; + margin-right: auto; +} + +.dialpad-btn { + width: 75px; + height: 75px; + border-radius: 50%; + border: none; + background: var(--bg-secondary); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s ease; + position: relative; + overflow: hidden; + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + + .number { + font-size: 32px; + font-weight: 400; + color: var(--text-primary); + line-height: 1; + margin-bottom: 2px; + } + + .letters { + font-size: 10px; + color: var(--text-secondary); + font-weight: 500; + margin-top: 2px; + letter-spacing: 1px; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0) 50%, + rgba(0, 0, 0, 0.05) 100%); + } +} + +.phone-actions { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 280px; + margin: 0 auto; + padding: 0 20px; +} + +.action-btn { + width: 60px; + height: 60px; + border-radius: 50%; + border: none; + font-size: 24px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background: var(--bg-secondary); + color: var(--text-primary); + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + + &.delete-btn { + color: var(--text-secondary); + position: relative; + + &::before { + content: ''; + position: absolute; + padding: 0 4px 0 0; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + filter: brightness(0) saturate(100%) invert(30%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(90%) contrast(90%); + } + } + + &.call-btn { + color: var(--text-secondary); + color: white; + margin: 0 15px; + background: #34c759; + + img { + width: 32px; + height: 32px; + filter: brightness(0) invert(1); + } + + &:disabled { + background: #2eb350; + cursor: not-allowed; + transform: none; + box-shadow: none; + opacity: 0.5; + } + + &:hover:not(:disabled) { + background: #30d158; + } + + &:active:not(:disabled) { + background: #2eb350; + } + } + + &.contact-btn { + color: var(--text-secondary); + background: var(--bg-secondary); + + img { + width: 38px; + height: 38px; + filter: brightness(0) saturate(100%) invert(30%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(90%) contrast(90%); + } + + &:hover { + background: var(--border-color); + } + + &:active { + transform: scale(0.95); + background: var(--border-color); + } + } +} + +/* Call Active State */ +.call-info { + margin-bottom: 60px; +} + +.call-status { + font-size: 18px; + color: var(--text-secondary); + margin-bottom: 20px; +} + +.call-number { + font-size: 36px; + font-weight: 300; + color: var(--text-primary); + margin-bottom: 10px; +} + +.call-duration { + font-size: 20px; + color: var(--text-secondary); +} + +.call-actions { + display: flex; + justify-content: center; +} + +.end-call-btn { + width: 64px; + height: 64px; + border-radius: 50%; + border: none; + background: #ff3b30; + color: white; + font-size: 28px; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 4px 12px rgba(255, 59, 48, 0.2); + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 0; + + img { + width: 32px; + height: 32px; + filter: brightness(0) invert(1); + } + + &:hover { + background: #ff453a; + transform: scale(1.1); + box-shadow: 0 6px 16px rgba(255, 59, 48, 0.3); + } + + &:active { + transform: scale(0.9); + background: #ff2d55; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, + rgba(255, 255, 255, 0.1) 0%, + rgba(255, 255, 255, 0) 40%, + rgba(0, 0, 0, 0.05) 100%); + border-radius: 50%; + opacity: 0.5; + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/home.css b/arma/client/addons/phone/ui/_site/styles/components/home.css new file mode 100644 index 0000000..8060376 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/home.css @@ -0,0 +1,116 @@ +/* Home Screen */ +.home-screen { + flex: 1; + background-size: cover; + background-position: center; + padding: 60px 0 20px; + display: flex; + flex-direction: column; + position: relative; +} + +[data-theme="dark"] .home-screen { + background-size: cover; + background-position: center; +} + +.home-header { + text-align: center; + margin-bottom: 40px; + padding: 0 20px; + + h1 { + color: rgba(255, 255, 255, 0.8); + font-size: 24px; + font-weight: 500; + } +} + +.app-grid { + display: grid; + grid-template-columns: repeat(4, 65px); + gap: 25px; + justify-content: center; + flex: 1; + align-content: start; + padding: 0; + width: 100%; +} + +.dock { + position: absolute; + bottom: 32px; + left: 50%; + transform: translateX(-50%); + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-radius: 20px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15); + padding: 8px 8px 4px 8px; + display: flex; + align-items: center; + gap: 20px; +} + +[data-theme="dark"] .dock { + background: rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3); +} + +.app-icon { + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + cursor: pointer; + transition: transform 0.2s ease; + + &:hover { + transform: scale(1.05); + } + + .app-icon-symbol { + width: 64px; + height: 64px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + font-size: 28px; + position: relative; + overflow: hidden; + padding: 0; + + &[style*="background"] { + background: var(--app-color); + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 16px; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + } + + .app-title { + color: var(--text-primary); + font-size: 12px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + text-align: center; + width: 65px; + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/layout.css b/arma/client/addons/phone/ui/_site/styles/components/layout.css new file mode 100644 index 0000000..969b348 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/layout.css @@ -0,0 +1,19 @@ +/* App Container */ +.app-container { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + margin-bottom: 25px; + scrollbar-width: none !important; +} + +/* Content Areas */ +.content { + flex: 1; + overflow: hidden; + padding: 10px; + background: var(--bg-primary); + color: var(--text-primary); + scrollbar-width: none !important; +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/loader.css b/arma/client/addons/phone/ui/_site/styles/components/loader.css new file mode 100644 index 0000000..258b911 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/loader.css @@ -0,0 +1,74 @@ +#script-loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.8); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +} + +.loader-content { + text-align: center; + color: white; +} + +.spinner { + width: 50px; + height: 50px; + border: 5px solid #f3f3f3; + border-top: 5px solid #3498db; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.script-load-error { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.9); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +} + +.error-content { + background: white; + padding: 30px; + border-radius: 10px; + text-align: center; + max-width: 400px; + margin: 20px; +} + +.error-content h2 { + color: #e74c3c; + margin-bottom: 15px; +} + +.error-content button { + background: #3498db; + color: white; + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + margin-top: 15px; + font-size: 16px; +} + +.error-content button:hover { + background: #2980b9; +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/mail.css b/arma/client/addons/phone/ui/_site/styles/components/mail.css new file mode 100644 index 0000000..cb21cfa --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/mail.css @@ -0,0 +1,152 @@ +/* Mail App */ +.mail-content, +.mail-list-container { + height: 100%; + display: flex; + flex-direction: column; +} + +.mail-list { + flex: 1; + overflow-y: auto; + padding: 10px; +} + +.mail-item { + width: 100%; + border: 0; + border-bottom: 1px solid var(--border-color); + background: var(--bg-primary); + color: var(--text-primary); + padding: 14px 12px; + text-align: left; + cursor: pointer; +} + +.mail-item.unread { + font-weight: 700; +} + +.mail-item.read { + opacity: 0.74; +} + +.mail-item-header { + display: flex; + justify-content: space-between; + gap: 10px; + font-size: 12px; + color: var(--text-secondary); +} + +.mail-item-subject { + margin-top: 6px; + font-size: 16px; + color: var(--text-primary); +} + +.mail-item-preview { + margin-top: 4px; + color: var(--text-secondary); + font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mail-empty { + color: var(--text-secondary); + padding: 32px 16px; + text-align: center; +} + +.mail-composer { + display: flex; + flex-direction: column; + gap: 12px; + padding: 14px; +} + +.mail-composer label { + display: flex; + flex-direction: column; + gap: 6px; + color: var(--text-secondary); + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; +} + +.mail-composer input, +.mail-composer select, +.mail-composer textarea { + width: 100%; + border: 1px solid var(--border-color); + border-radius: 10px; + background: var(--bg-secondary); + color: var(--text-primary); + padding: 10px 12px; + font: inherit; + box-sizing: border-box; +} + +.mail-composer textarea { + resize: none; +} + +.mail-send-button { + border: 0; + border-radius: 12px; + background: var(--accent-color); + color: white; + cursor: pointer; + font-weight: 700; +} + +.mail-send-button { + padding: 12px 14px; +} + +.mail-detail { + padding: 16px; + overflow-y: auto; + color: var(--text-primary); +} + +.mail-detail h2 { + margin: 0 0 12px; + font-size: 20px; +} + +.mail-meta { + display: flex; + flex-direction: column; + gap: 4px; + color: var(--text-secondary); + font-size: 12px; + margin-bottom: 18px; +} + +.mail-body { + white-space: pre-wrap; + line-height: 1.45; + margin: 0; +} + +.mail-delete-button { + margin-top: 18px; + width: 100%; + border: 1px solid rgba(255, 59, 48, 0.55); + border-radius: 12px; + background: rgba(255, 59, 48, 0.14); + color: #ff6b61; + cursor: pointer; + font: inherit; + font-weight: 700; + padding: 11px 14px; +} + +.mail-delete-button:hover { + background: rgba(255, 59, 48, 0.22); +} diff --git a/arma/client/addons/phone/ui/_site/styles/components/messages.css b/arma/client/addons/phone/ui/_site/styles/components/messages.css new file mode 100644 index 0000000..6af659c --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/messages.css @@ -0,0 +1,373 @@ +/* Messages App */ +.messages-list { + padding: 0; + margin-bottom: 0; + + .message-item { + display: flex; + align-items: center; + padding: 15px 20px; + border-bottom: 1px solid var(--border-color); + cursor: pointer; + transition: background-color 0.2s; + background: var(--bg-primary); + + &:hover { + background-color: var(--bg-secondary); + } + + .message-avatar { + width: 50px; + height: 50px; + border-radius: 25px; + background: linear-gradient(45deg, #34c759, #30d158); + display: flex; + align-items: center; + justify-content: center; + color: white; + font-weight: bold; + margin-right: 15px; + font-size: 16px; + } + + .message-content { + flex: 1; + min-width: 0; + + .message-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; + + .contact-name { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + } + + .message-time { + font-size: 12px; + color: var(--text-secondary); + } + } + + .message-preview { + display: flex; + justify-content: space-between; + align-items: center; + + p { + font-size: 14px; + color: var(--text-secondary); + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .unread-badge { + background: #ff3b30; + color: white; + border-radius: 10px; + padding: 2px 6px; + font-size: 12px; + font-weight: bold; + min-width: 18px; + text-align: center; + margin-left: 8px; + } + } + } + + .message-thread-delete-button { + border: 1px solid rgba(255, 59, 48, 0.55); + border-radius: 10px; + background: rgba(255, 59, 48, 0.14); + color: #ff6b61; + cursor: pointer; + flex-shrink: 0; + font-size: 12px; + font-weight: 700; + margin-left: 10px; + padding: 7px 9px; + } + + .message-thread-delete-button:hover { + background: rgba(255, 59, 48, 0.22); + } + } +} + +.message-nav-delete-button { + border: 0; + border-radius: 10px; + background: rgba(255, 59, 48, 0.18); + color: #ff6b61; + cursor: pointer; + font: inherit; + font-size: 12px; + font-weight: 700; + padding: 7px 10px; +} + +.message-nav-delete-button:hover { + background: rgba(255, 59, 48, 0.28); +} + +.messages-empty-state { + align-items: center; + color: var(--text-secondary); + display: flex; + flex-direction: column; + gap: 6px; + justify-content: center; + min-height: 190px; + text-align: center; +} + +.messages-empty-state strong { + color: var(--text-primary); + font-size: 16px; +} + +/* Conversation View */ +.conversation-view { + height: 100%; + display: flex; + flex-direction: column; + margin-bottom: 25px; + overflow: hidden; + + .conversation-header { + background: #34c759; + color: white; + padding: 15px 20px; + display: flex; + align-items: center; + gap: 15px; + flex-shrink: 0; + + .back-button { + background: none; + border: none; + color: white; + font-size: 16px; + cursor: pointer; + padding: 5px 10px; + border-radius: 4px; + transition: background-color 0.2s; + + &:hover { + background: rgba(255, 255, 255, 0.2); + } + } + + h2 { + font-size: 18px; + font-weight: 600; + } + } + + .messages-container { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; + padding: 10px; + box-sizing: border-box; + overflow-y: auto; + overflow-x: hidden; + min-height: 0; + /* Force hardware acceleration for smoother scrolling */ + transform: translateZ(0); + -webkit-overflow-scrolling: touch; + /* Hide scrollbar but keep functionality */ + scrollbar-width: none !important; + /* scrollbar-color: rgba(0, 0, 0, 0.3) rgba(0, 0, 0, 0.1); */ + + /* Ultra-thin scrollbar for webkit browsers */ + /* &::-webkit-scrollbar { + width: 2px; + height: 2px; + } + + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); + border-radius: 1px; + } + + &::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.3); + border-radius: 1px; + min-height: 20px; + + &:hover { + background: rgba(0, 0, 0, 0.5); + } + } */ + + .message-bubble { + max-width: 70%; + padding: 12px 16px; + border-radius: 18px; + position: relative; + word-wrap: break-word; + flex-shrink: 0; + margin-bottom: 8px; + + &.user { + background: var(--message-bubble-user); + color: var(--message-text-user); + align-self: flex-end; + border-bottom-right-radius: 4px; + } + + &.contact { + background: var(--message-bubble-contact); + color: var(--message-text-contact); + align-self: flex-start; + border-bottom-left-radius: 4px; + } + + p { + margin: 0 0 4px 0; + font-size: 16px; + line-height: 1.4; + } + + .message-timestamp { + font-size: 11px; + opacity: 0.7; + display: block; + margin-top: 4px; + } + } + } + + .message-input-form { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15); + display: flex; + align-items: center; + padding: 8px; + flex-shrink: 0; + margin-bottom: 0; + position: absolute; + bottom: 32px; + left: 50%; + transform: translateX(-50%); + width: calc(100% - 24px); + border-radius: 20px; + + .message-input { + flex: 1; + padding: 10px 16px; + border: none; + border-radius: 18px; + font-size: 16px; + outline: none; + background: #eee; + color: var(--text-primary); + min-height: 36px; + max-height: 120px; + line-height: 1.4; + resize: none; + overflow-y: auto; + box-shadow: none; + transition: background-color 0.2s; + font-family: inherit; + + &:focus { + background: #f8f8f8; + } + + &::placeholder { + color: var(--text-secondary); + opacity: 0.7; + } + } + + .send-button { + width: 40px !important; + height: 40px !important; + border-radius: 50%; + background: var(--accent-color); + color: white; + border: none; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2); + transition: all 0.2s ease; + flex-shrink: 0; + padding: 0; + margin-left: 8px !important; + cursor: pointer; + + &:hover { + transform: scale(1.05); + box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3); + } + + &:active { + transform: scale(0.95); + } + + svg { + display: block; + width: 22px; + height: 22px; + stroke: currentColor; + } + + img { + display: block; + width: 22px; + height: 22px; + pointer-events: none; + } + } + } +} + +/* Dark theme adjustments */ +[data-theme="dark"] { + .conversation-view { + .messages-container { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.1); + + &::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); + } + + &::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + + &:hover { + background: rgba(255, 255, 255, 0.5); + } + } + } + } + + .message-input-form { + background: rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3); + + .message-input { + background: rgba(255, 255, 255, 0.05); + color: var(--text-primary); + + &:focus { + background: rgba(255, 255, 255, 0.08); + } + } + } +} diff --git a/arma/client/addons/phone/ui/_site/styles/components/modal.css b/arma/client/addons/phone/ui/_site/styles/components/modal.css new file mode 100644 index 0000000..5be0af4 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/modal.css @@ -0,0 +1,61 @@ +/* Modal */ +.modal-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + + .modal { + background: var(--bg-primary); + border-radius: 12px; + padding: 24px; + margin: 20px; + max-width: 300px; + width: 100%; + border: 1px solid var(--border-color); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + + h2 { + margin-bottom: 16px; + font-size: 18px; + color: var(--text-primary); + } + + p { + margin-bottom: 20px; + color: var(--text-secondary); + } + + .modal-actions { + display: flex; + justify-content: flex-end; + gap: 10px; + + button { + width: 100%; + } + + /* Style delete buttons differently */ + button[aria-label="Delete"] { + background: #ff4444; + border-color: #ff4444; + } + + button[aria-label="Delete"]:hover { + background: #ff3333; + border-color: #ff3333; + } + + button[aria-label="Delete"]:active { + background: #ff2222; + border-color: #ff2222; + } + } + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/nav-bar.css b/arma/client/addons/phone/ui/_site/styles/components/nav-bar.css new file mode 100644 index 0000000..881b022 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/nav-bar.css @@ -0,0 +1,70 @@ +/* Navigation Bar */ +.navigation-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 20px; + background: var(--nav-bg); + border-bottom: 1px solid var(--border-color); + min-height: 50px; + position: relative; + z-index: 1; +} + +.navigation-bar .nav-back-button { + background: none; + border: none; + color: var(--accent-color); + font-size: 16px; + cursor: pointer; + padding: 8px 12px; + border-radius: 6px; + transition: background-color 0.2s; +} + +.navigation-bar .nav-back-button:hover { + background: rgba(0, 122, 255, 0.1); +} + +.navigation-bar .nav-title { + font-size: 18px; + font-weight: 600; + color: var(--text-primary); + margin: 0; + flex: 1; + text-align: center; + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +.navigation-bar .nav-spacer { + width: 64px; +} + +.navigation-bar .nav-button { + background: none; + border: none; + color: var(--accent-color); + font-size: 24px; + padding: 8px 12px; + cursor: pointer; + transition: opacity 0.2s; + position: relative; + z-index: 2; +} + +.navigation-bar .nav-button:hover { + opacity: 0.8; +} + +.navigation-bar .nav-button:active { + opacity: 0.6; +} + +.navigation-bar .nav-button.add-button { + font-size: 28px; + font-weight: 300; + line-height: 1; + color: var(--accent-color); +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/notes.css b/arma/client/addons/phone/ui/_site/styles/components/notes.css new file mode 100644 index 0000000..e523d80 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/notes.css @@ -0,0 +1,287 @@ +/* Notes App Styles */ + +/* Notes List */ +.notes-list { + padding: 0; + margin: 0; +} + +.notes-list.empty { + display: flex; + align-items: center; + justify-content: center; + height: 60vh; +} + +.notes-empty-state { + text-align: center; + color: var(--text-secondary); + padding: 2rem; +} + +.notes-empty-state .empty-icon { + margin-bottom: 1rem; + display: flex; + justify-content: center; + align-items: center; +} + +.notes-empty-state .empty-icon img { + width: 64px; + height: 64px; + display: block; +} + +.notes-empty-state h3 { + margin: 0 0 0.5rem 0; + font-size: 1.2rem; + color: var(--text-primary); +} + +.notes-empty-state p { + margin: 0; + font-size: 0.9rem; +} + +/* Note Item */ +.note-item { + padding: 1rem; + border-bottom: 1px solid var(--border-color); + cursor: pointer; + transition: background-color 0.2s ease; + background: var(--background-primary); +} + +.note-item:hover { + background: var(--background-secondary); +} + +.note-item:active { + background: var(--background-tertiary); +} + +.note-item:last-child { + border-bottom: none; +} + +.note-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 0.5rem; + gap: 1rem; +} + +.note-title { + margin: 0; + font-size: 1rem; + font-weight: 600; + color: var(--text-primary); + line-height: 1.3; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.note-date { + font-size: 0.8rem; + color: var(--text-secondary); + white-space: nowrap; + flex-shrink: 0; +} + +.note-preview { + margin: 0; + font-size: 0.9rem; + color: var(--text-secondary); + line-height: 1.4; + display: -webkit-box; + line-clamp: 3; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Note Editor */ +.note-editor { + height: 100vh; + display: flex; + flex-direction: column; +} + +.editor-content { + flex: 1; + display: flex; + flex-direction: column; + padding: 1rem; + gap: 1rem; + overflow: hidden; +} + +.note-title-input { + border: none; + background: transparent; + font-size: 1.5rem; + font-weight: 600; + color: var(--text-primary); + padding: 0; + margin: 0; + outline: none; + width: 100%; +} + +.note-title-input::placeholder { + color: var(--text-secondary); + opacity: 0.7; +} + +.note-content-input { + flex: 1; + border: none; + background: transparent; + font-size: 1rem; + color: var(--text-primary); + padding: 0; + margin: 0; + outline: none; + resize: none; + font-family: inherit; + line-height: 1.5; + overflow-y: auto; +} + +.note-content-input::placeholder { + color: var(--text-secondary); + opacity: 0.7; +} + +.editor-footer { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem 0; + border-top: 1px solid var(--border-color); + margin-top: auto; + flex-shrink: 0; +} + +.editor-status { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.8rem; + color: var(--text-secondary); +} + +.word-count { + color: var(--text-secondary); +} + +.modified-indicator { + color: var(--accent-color); + font-weight: 500; +} + +.delete-button { + background: transparent; + border: none; + color: #ff4444; + font-size: 0.9rem; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; +} + +.delete-button:hover { + background: rgba(255, 68, 68, 0.1); +} + +.delete-button:active { + background: rgba(255, 68, 68, 0.2); +} + +/* Navigation Buttons - Note Editor specific */ +.note-editor .navigation-bar .nav-button.cancel-button { + color: var(--text-secondary) !important; + font-size: 0.9rem !important; + font-weight: 400 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.note-editor .navigation-bar .nav-button.cancel-button:hover { + color: var(--text-primary) !important; +} + +.note-editor .navigation-bar .nav-button.save-button { + color: var(--accent-color) !important; + font-size: 0.9rem !important; + font-weight: 600 !important; + padding: 0.5rem 1rem !important; + background: transparent; + border: none; + cursor: pointer; + transition: color 0.2s ease; +} + +.note-editor .navigation-bar .nav-button.save-button:hover { + color: var(--accent-color-hover) !important; +} + +/* Dark theme adjustments */ +[data-theme="dark"] .note-item { + border-bottom-color: rgba(255, 255, 255, 0.1); +} + +[data-theme="dark"] .editor-footer { + border-top-color: rgba(255, 255, 255, 0.1); +} + +/* Light theme adjustments */ +[data-theme="light"] .note-item { + border-bottom-color: rgba(0, 0, 0, 0.1); +} + +[data-theme="light"] .editor-footer { + border-top-color: rgba(0, 0, 0, 0.1); +} + +/* Focus states */ +.note-item:focus { + outline: 2px solid var(--accent-color); + outline-offset: -2px; +} + +.note-title-input:focus, +.note-content-input:focus { + outline: none; +} + +/* Responsive adjustments */ +@media (max-width: 375px) { + .note-header { + gap: 0.5rem; + } + + .note-title { + font-size: 0.95rem; + } + + .note-preview { + font-size: 0.85rem; + } + + .editor-content { + padding: 0.75rem; + } + + .note-title-input { + font-size: 1.3rem; + } +} + diff --git a/arma/client/addons/phone/ui/_site/styles/components/phone.css b/arma/client/addons/phone/ui/_site/styles/components/phone.css new file mode 100644 index 0000000..3d4557c --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/phone.css @@ -0,0 +1,205 @@ +/* Phone */ +.phone-container { + width: 375px; + height: 720px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border: 2px solid #a8a8a8; + border-radius: 40px; + padding: 8px; + position: relative; + + /* Volume Up Button */ + &::before { + content: ''; + position: absolute; + top: 120px; + right: -4px; + width: 3px; + height: 30px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Volume Down Button */ + &::after { + content: ''; + position: absolute; + top: 160px; + right: -4px; + width: 3px; + height: 30px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Power Button */ + .power-button { + position: absolute; + top: 200px; + right: -4px; + width: 3px; + height: 40px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Mute Switch */ + .mute-switch { + position: absolute; + top: 100px; + left: -4px; + width: 3px; + height: 20px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } + + /* Action Button */ + .action-button { + position: absolute; + top: 140px; + left: -4px; + width: 3px; + height: 20px; + background: linear-gradient(145deg, #0a0a0a 0%, #1d1d1d 25%, #232323 50%, #161616 75%, #0f0f0f 100%); + border-radius: 2px; + box-shadow: + inset 0 1px 1px rgba(255, 255, 255, 0.1), + inset 0 -1px 1px rgba(0, 0, 0, 0.2); + z-index: 2; + } +} + +.phone-screen { + width: 100%; + height: 100%; + background: var(--bg-primary); + border-radius: 32px; + overflow: hidden; + position: relative; + display: flex; + flex-direction: column; + z-index: 1; + color: var(--text-primary); + box-shadow: 0 -2px 8px 0 rgba(0, 0, 0, 0.7), 0 2px 8px 0 rgba(0, 0, 0, 0.05); + border-top: 3px solid #0f0f0f; + + &::after { + content: ''; + position: absolute; + top: 8px; + left: 50%; + transform: translateX(-50%); + width: 142px; + height: 32px; + background: #000000; + border-radius: 16px; + z-index: 1001; + display: none; + } + + &.dynamic-island::after { + display: block; + } +} + +.dynamic-island-content { + position: absolute; + top: 8px; + left: 50%; + transform: translateX(-50%); + width: 142px; + height: 32px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px; + z-index: 1002; + + .speaker { + width: 64px; + height: 6px; + background: #333333; + border-radius: 3px; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 52px; + height: 2px; + background: #000000; + border-radius: 1px; + } + } + + .camera { + width: 12px; + height: 12px; + background: #333333; + border-radius: 50%; + border: 1px solid #000000; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 6px; + height: 6px; + background: #000000; + border-radius: 50%; + } + } +} + +/* Home Indicator */ +.home-indicator-container { + position: absolute; + bottom: 4px; + left: 50%; + transform: translateX(-50%); + padding: 8px 16px; + cursor: pointer; + z-index: 100; + background: var(--status-bar-bg); + border-radius: 12px; + backdrop-filter: blur(10px); + border: 1px solid var(--border-color); + + &:hover .home-indicator { + background: var(--text-primary); + opacity: 0.5; + transform: scaleY(1.2); + } + + .home-indicator { + width: 134px; + height: 5px; + background: var(--text-primary); + opacity: 0.3; + border-radius: 3px; + transition: all 0.2s ease; + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/settings.css b/arma/client/addons/phone/ui/_site/styles/components/settings.css new file mode 100644 index 0000000..49bb9d9 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/settings.css @@ -0,0 +1,68 @@ +/* Settings */ +.settings-list { + background: var(--bg-primary); +} + +.settings-item { + border-bottom: 1px solid var(--border-color); + color: var(--text-primary); +} + +.settings-item:hover { + background: var(--bg-secondary); +} + +/* Theme Toggle Switch */ +.theme-toggle { + display: flex; + align-items: center; + justify-content: space-between; + padding: 15px 20px; + border-bottom: 1px solid var(--border-color); + background: var(--bg-primary); + color: var(--text-primary); +} + +.toggle-switch { + position: relative; + width: 51px; + height: 31px; +} + +.toggle-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #e9ecef; + transition: .4s; + border-radius: 34px; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 27px; + width: 27px; + left: 2px; + bottom: 2px; + background-color: white; + transition: .4s; + border-radius: 50%; +} + +input:checked+.toggle-slider { + background-color: var(--accent-color); +} + +input:checked+.toggle-slider:before { + transform: translateX(20px); +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/styles/components/status-bar.css b/arma/client/addons/phone/ui/_site/styles/components/status-bar.css new file mode 100644 index 0000000..315983b --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/status-bar.css @@ -0,0 +1,115 @@ +/* Status Bar */ +.status-bar { + height: 44px; + background: var(--status-bar-bg); + backdrop-filter: blur(10px); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; + font-size: 14px; + font-weight: 600; + flex-shrink: 0; + z-index: 10; + position: relative; + color: var(--text-primary); + + .status-left { + display: flex; + align-items: center; + gap: 8px; + flex: 1; + } + + .status-center { + position: absolute; + left: 50%; + transform: translateX(-50%); + font-weight: 600; + font-size: 14px; + } + + .status-right { + display: flex; + align-items: center; + gap: 4px; + flex: 1; + justify-content: flex-end; + + .status-indicators { + display: flex; + align-items: center; + gap: 5px; + + .signal-bars { + display: flex; + align-items: flex-end; + gap: 1px; + height: 12px; + + .bar { + background: var(--text-primary); + border-radius: 1px; + width: 3px; + margin-right: 1px; + + &:nth-child(1) { + height: 3px; + } + + &:nth-child(2) { + height: 5px; + } + + &:nth-child(3) { + height: 7px; + } + + &:nth-child(4) { + height: 9px; + } + } + } + + .network-battery { + display: flex; + align-items: center; + gap: 5px; + font-size: 12px; + color: var(--text-primary); + + .battery-icon { + position: relative; + display: inline-block; + width: 20px; + height: 10px; + border: 1.5px solid var(--text-primary); + border-radius: 3px; + box-sizing: border-box; + + &::before { + content: ""; + position: absolute; + top: 2px; + left: 2px; + right: 2px; + bottom: 2px; + border-radius: 1px; + background: var(--text-primary); + } + + &::after { + content: ""; + position: absolute; + top: 2px; + right: -4px; + width: 2px; + height: 4px; + border-radius: 0 1px 1px 0; + background: var(--text-primary); + } + } + } + } + } +} diff --git a/arma/client/addons/phone/ui/_site/styles/components/wallet.css b/arma/client/addons/phone/ui/_site/styles/components/wallet.css new file mode 100644 index 0000000..48492ba --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/components/wallet.css @@ -0,0 +1,314 @@ +/* Wallet */ +.wallet-app { + background: var(--bg-primary); +} + +.wallet-content { + background: var(--bg-primary); + color: var(--text-primary); + display: flex; + flex-direction: column; + gap: 12px; + height: calc(100% - 44px); + overflow-y: auto; + padding: 12px 16px 28px; +} + +.wallet-nav-button { + background: transparent; + border: 0; + color: #275a8c; + cursor: pointer; + font-size: 13px; + font-weight: 700; +} + +[data-theme="dark"] .wallet-nav-button { + color: #8bb9e6; +} + +.wallet-notice { + border-radius: 12px; + font-size: 13px; + font-weight: 700; + line-height: 1.35; + padding: 10px 12px; +} + +.wallet-notice-success { + background: rgba(47, 125, 91, 0.16); + color: #2f7d5b; +} + +.wallet-notice-error { + background: rgba(196, 57, 57, 0.16); + color: #b42323; +} + +.wallet-notice-info { + background: rgba(39, 90, 140, 0.14); + color: #275a8c; +} + +.wallet-balance-card { + background: linear-gradient(160deg, #142f52 0%, #275a8c 58%, #4f86bd 100%); + border-radius: 20px; + box-shadow: 0 14px 26px rgba(20, 47, 82, 0.22); + color: #ffffff; + display: flex; + flex-direction: column; + min-height: 142px; + padding: 18px; +} + +.wallet-eyebrow, +.wallet-card-title, +.wallet-metric span, +.wallet-transaction-meta { + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.wallet-eyebrow { + color: rgba(255, 255, 255, 0.72); + font-size: 11px; + font-weight: 800; +} + +.wallet-balance { + font-size: 34px; + letter-spacing: 0; + line-height: 1.1; + margin-top: 14px; +} + +.wallet-owner { + color: rgba(255, 255, 255, 0.8); + font-size: 13px; + margin-top: auto; +} + +.wallet-metrics { + display: grid; + gap: 10px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.wallet-metric, +.wallet-card { + background: linear-gradient(180deg, #ffffff 0%, #f4f8fd 100%); + border: 1px solid rgba(18, 54, 93, 0.12); + border-radius: 16px; +} + +[data-theme="dark"] .wallet-metric, +[data-theme="dark"] .wallet-card { + background: linear-gradient(180deg, #1c1c1e 0%, #151b23 100%); + border-color: rgba(139, 185, 230, 0.18); +} + +.wallet-metric { + display: flex; + flex-direction: column; + gap: 6px; + min-width: 0; + padding: 12px; +} + +.wallet-metric span, +.wallet-card-title { + color: #6f86a3; + font-size: 11px; + font-weight: 800; +} + +[data-theme="dark"] .wallet-metric span, +[data-theme="dark"] .wallet-card-title, +[data-theme="dark"] .wallet-transaction-meta { + color: #8ea2bb; +} + +.wallet-metric strong { + color: #142f52; + font-size: 18px; + line-height: 1.15; +} + +[data-theme="dark"] .wallet-metric strong { + color: #ffffff; +} + +.wallet-card { + display: flex; + flex-direction: column; + gap: 10px; + padding: 14px; +} + +.wallet-input { + background: var(--input-bg); + border: 1px solid rgba(18, 54, 93, 0.16); + border-radius: 12px; + color: var(--text-primary); + font: inherit; + min-height: 42px; + padding: 0 12px; + width: 100%; +} + +[data-theme="dark"] .wallet-input { + border-color: var(--input-border); +} + +.wallet-primary-button { + background: #275a8c; + border: 0; + border-radius: 12px; + color: #ffffff; + cursor: pointer; + font: inherit; + font-weight: 800; + min-height: 42px; +} + +.wallet-secondary-button { + background: rgba(39, 90, 140, 0.12); + border: 1px solid rgba(39, 90, 140, 0.18); + border-radius: 12px; + color: #275a8c; + cursor: pointer; + font: inherit; + font-size: 12px; + font-weight: 800; + min-height: 42px; + padding: 0 10px; +} + +.wallet-full-button { + width: 100%; +} + +[data-theme="dark"] .wallet-secondary-button { + background: rgba(139, 185, 230, 0.13); + border-color: rgba(139, 185, 230, 0.2); + color: #8bb9e6; +} + +.wallet-action-block { + background: rgba(39, 90, 140, 0.08); + border-radius: 12px; + display: grid; + gap: 10px; + padding: 10px 12px; +} + +.wallet-action-block + .wallet-action-block { + margin-top: 2px; +} + +[data-theme="dark"] .wallet-action-block { + background: rgba(139, 185, 230, 0.1); +} + +.wallet-action-summary { + display: grid; + gap: 3px; +} + +.wallet-action-summary span { + color: #6f86a3; + font-size: 11px; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.wallet-action-summary strong { + color: #142f52; + font-size: 18px; +} + +.wallet-action-summary small { + color: var(--text-secondary); + font-size: 12px; + line-height: 1.25; +} + +[data-theme="dark"] .wallet-action-summary span, +[data-theme="dark"] .wallet-action-summary strong { + color: #ffffff; +} + +.wallet-action-controls { + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) 112px; +} + +.wallet-primary-button:disabled, +.wallet-secondary-button:disabled, +.wallet-nav-button:disabled { + cursor: not-allowed; + opacity: 0.58; +} + +.wallet-transaction-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.wallet-transaction-row { + align-items: center; + border-top: 1px solid rgba(18, 54, 93, 0.1); + display: flex; + gap: 10px; + justify-content: space-between; + padding-top: 10px; +} + +[data-theme="dark"] .wallet-transaction-row { + border-top-color: rgba(139, 185, 230, 0.14); +} + +.wallet-transaction-copy { + display: flex; + flex-direction: column; + gap: 3px; + min-width: 0; +} + +.wallet-transaction-title { + color: var(--text-primary); + font-size: 14px; + font-weight: 700; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.wallet-transaction-meta { + color: #6f86a3; + font-size: 10px; + font-weight: 700; +} + +.wallet-transaction-value { + color: #142f52; + flex-shrink: 0; + font-size: 14px; + font-weight: 800; +} + +[data-theme="dark"] .wallet-transaction-value { + color: #ffffff; +} + +.wallet-empty-state { + border: 1px dashed rgba(18, 54, 93, 0.18); + border-radius: 12px; + color: var(--text-secondary); + font-size: 13px; + padding: 14px; + text-align: center; +} diff --git a/arma/client/addons/phone/ui/_site/styles/main.css b/arma/client/addons/phone/ui/_site/styles/main.css new file mode 100644 index 0000000..feb0cc4 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/styles/main.css @@ -0,0 +1,69 @@ +/* Utility classes */ +.hidden { + display: none !important; +} + +/* Animations */ +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes slideUp { + from { + transform: translateY(20px); + opacity: 0; + } + + to { + transform: translateY(0); + opacity: 1; + } +} + +.fade-in { + animation: fadeIn 0.3s ease forwards; +} + +.slide-up { + animation: slideUp 0.3s ease forwards; +} + +/* Responsive Design */ +@media (max-width: 480px) { + .phone-container { + width: 100%; + height: 100vh; + border-radius: 0; + padding: 0; + } + + .phone-screen { + border-radius: 0; + } + + body { + padding: 0; + } +} + +/* Remove unused styles */ +.home-button-container, +.home-button, +.nav-home-button { + display: none; +} + +/* Search Bar */ +.search-bar { + input { + &::placeholder { + color: var(--text-secondary); + } + } +} \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/tools/compress_css.py b/arma/client/addons/phone/ui/_site/tools/compress_css.py new file mode 100644 index 0000000..82eb6aa --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/compress_css.py @@ -0,0 +1,206 @@ +"""A script to compress CSS files using zlib compression and base64 encoding. + +This script takes a CSS file or directory as input, compresses the contents +of CSS files and then encodes the compressed data to base64 format. +The resulting b64 string is saved to a new file with a '.b64' extension. + +Functions: + compress_css(input_css_file): Compresses and encodes the CSS file + process_path(path): Process either a single file or a directory + get_input_path(): Gets the CSS file or folder path from user input + minify_css(css): Minifies CSS content by removing whitespace and comments + + +Usage: + Run the script and enter the path to your CSS file or folder when prompted. + The compressed and encoded output will be saved as 'your_file.css.b64' +""" + +import os +import glob +import base64 +import re +import zlib +import gzip +import lzma + +# pylint: disable=import-error +import brotli # type: ignore +import py7zr + + +def minify_css(css): + """Minifies CSS content by removing unnecessary characters""" + # Remove comments + css = re.sub(r"/\*[\s\S]*?\*/", "", css) + # Remove whitespace + css = re.sub(r"\s+", " ", css) + # Remove spaces around operators + css = re.sub(r"\s*([{};,:])\s*", r"\1", css) + # Remove unnecessary semicolons + css = re.sub(r";}", "}", css) + # Remove leading/trailing whitespace + css = css.strip() + return css + + +def process_css_content(css_content, minify, compress, compress_type): + """minification and compression to CSS based on user preferences.""" + if minify: + css_content = minify_css(css_content) + if compress: + if compress_type == "brotli": + return brotli.compress(css_content.encode("utf-8")) + elif compress_type == "gzip": + return gzip.compress(css_content.encode("utf-8")) + elif compress_type == "zlib": + return zlib.compress(css_content.encode("utf-8")) + return css_content.encode("utf-8") + + +def compress_css( + input_css_file, minify=True, compress=True, compress_type="brotli" +): + """Processes, optionally compresses, and Base64 encodes the CSS file.""" + with open(input_css_file, "r", encoding="utf-8") as f: + css_content = f.read() + + processed_content = process_css_content( + css_content, minify, compress, compress_type + ) + + b64_string = ( + base64.b64encode(processed_content) + .decode("utf-8") + .replace("\n", "") + ) + + output_file = input_css_file + ".b64" + line_length = 76 + formatted_b64 = "\n".join( + [ + b64_string[i : i + line_length] + for i in range(0, len(b64_string), line_length) + ] + ) + with open(output_file, "w", encoding="utf-8") as f: + f.write(formatted_b64) + + return b64_string + + +def get_input_path(): + """Gets user preferences for minification and compression.""" + user_path = input("Enter the path to your CSS file or folder: ").strip() + minify_choice = ( + input("Do you want to minify the CSS files? (yes/no): ") + .strip() + .lower() + ) + compress_choice = ( + input("Do you want to compress the CSS files? (yes/no): ") + .strip() + .lower() + ) + archive_choice = ( + input("Do you want to archive the files? (yes/no): ").strip().lower() + ) + + minify = minify_choice in ("yes", "y") + compress = compress_choice in ("yes", "y") + archive = archive_choice in ("yes", "y") + + user_compress_type = "brotli" + if compress: + user_compress_type = ( + input("Choose compression type (zlib/gzip/brotli): ") + .strip() + .lower() + ) + if user_compress_type not in ("zlib", "gzip", "brotli"): + print("Invalid compression type. Defaulting to brotli.") + user_compress_type = "brotli" + + user_archive_type = None + if archive: + user_archive_type = ( + input( + "Choose archival type (lzma(highest compression)\ + /7z(high compression)): " + ) + .strip() + .lower() + ) + if user_archive_type not in ("lzma", "7z"): + print("Invalid archival type. No archival will be applied.") + user_archive_type = None + + return user_path, minify, compress, user_compress_type, user_archive_type + + +def process_path( + input_path, minify, compress, compress_type, archive_type=None +): + """Process either a single file or all CSS files in a directory""" + if os.path.isfile(input_path): + if input_path.endswith(".css"): + b64_string = compress_css( + input_path, + minify=minify, + compress=compress, + compress_type=compress_type, + ) + print(f"Processed file: {input_path}") + if archive_type: + archive_compress(input_path, archive_type) + print(f"Archived file: {input_path}") + return b64_string + + elif os.path.isdir(input_path): + css_files = glob.glob( + os.path.join(input_path, "**/*.css"), recursive=True + ) + results = [] + for css_file in css_files: + b64_string = compress_css( + css_file, + minify=minify, + compress=compress, + compress_type=compress_type, + ) + print(f"Processed file: {css_file}") + if archive_type: + archive_compress(css_file, archive_type) + print(f"Archived file: {css_file}") + results.append(b64_string) + return results + else: + print("Invalid path provided") + return None + + +def archive_compress(input_file, archive_type): + """Archive compression using LZMA or 7z.""" + if archive_type == "lzma": + with lzma.open(input_file + ".xz", "w") as archive: + with open(input_file, "rb") as f: + archive.write(f.read()) + elif archive_type == "7z": + with py7zr.SevenZipFile(input_file + ".7z", "w") as archive: + archive.write(input_file, input_file) + + +if __name__ == "__main__": + path, minify_opt, compress_opt, compression_type, archival_type = ( + get_input_path() + ) + process_path( + path, + minify=minify_opt, + compress=compress_opt, + compress_type=compression_type, + archive_type=archival_type, + ) + print( + "Compression complete! Base64 output '.b64' files have been created." + ) diff --git a/arma/client/addons/phone/ui/_site/tools/concat-all.js b/arma/client/addons/phone/ui/_site/tools/concat-all.js new file mode 100644 index 0000000..93b7333 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/concat-all.js @@ -0,0 +1,109 @@ +// concat-all.js +// Concatenate JS and CSS files into dist/app.bundle.js and dist/app.bundle.css + +const fs = require('fs'); +const path = require('path'); + +// JS files in order +const jsFiles = [ + '../js/core/Component.js', + '../js/core/StateManager.js', + '../js/utils/helpers.js', + '../js/utils/PhoneMedia.js', + '../js/components/StatusBar.js', + '../js/components/Modal.js', + '../js/components/NavigationBar.js', + '../js/components/HomeIndicator.js', + '../js/components/SearchBar.js', + '../js/components/Header.js', + '../js/components/HomeScreen.js', + '../js/apps/phone/components/Dialpad.js', + '../js/apps/phone/index.js', + '../js/apps/messages/components/MessagesList.js', + '../js/apps/messages/components/MessageItem.js', + '../js/apps/messages/components/ConversationView.js', + '../js/apps/messages/index.js', + '../js/apps/contacts/components/ContactList.js', + '../js/apps/contacts/components/ContactItem.js', + '../js/apps/contacts/components/AddContactForm.js', + '../js/apps/contacts/index.js', + '../js/apps/mail/components/MailList.js', + '../js/apps/mail/components/MailComposer.js', + '../js/apps/mail/components/MailDetail.js', + '../js/apps/mail/index.js', + '../js/apps/notes/components/NotesList.js', + '../js/apps/notes/components/NoteEditor.js', + '../js/apps/notes/index.js', + '../js/apps/clock/components/WorldClock.js', + '../js/apps/clock/components/Stopwatch.js', + '../js/apps/clock/components/Timer.js', + '../js/apps/clock/components/AlarmClock.js', + '../js/apps/clock/index.js', + '../js/apps/settings/components/Settings.js', + '../js/apps/settings/index.js', + '../js/apps/calendar/components/Calendar.js', + '../js/apps/calendar/components/EventEditor.js', + '../js/apps/calendar/index.js', + '../js/app.js', + '../js/main.js', + '../js/global.js' +]; + +// CSS files in order +const cssFiles = [ + '../styles/base.css', + '../styles/main.css', + '../styles/components/layout.css', + '../styles/components/phone.css', + '../styles/components/buttons.css', + '../styles/components/modal.css', + '../styles/components/nav-bar.css', + '../styles/components/status-bar.css', + '../styles/components/home.css', + '../styles/components/contacts.css', + '../styles/components/dialpad.css', + '../styles/components/messages.css', + '../styles/components/mail.css', + '../styles/components/notes.css', + '../styles/components/clock.css', + '../styles/components/calendar.css', + '../styles/components/settings.css', + '../styles/components/loader.css' +]; + +const outDir = path.join(__dirname, '../dist'); +if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir); +} + +// Bundle JS +const jsOutFile = path.join(outDir, 'app.bundle.js'); +let jsBundle = ''; +jsFiles.forEach(file => { + const filePath = path.join(__dirname, file); + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf8'); + jsBundle += `\n// ---- ${file} ----\n`; + jsBundle += content + '\n'; + } else { + console.warn(`JS file not found: ${file}`); + } +}); +fs.writeFileSync(jsOutFile, jsBundle, 'utf8'); +console.log(`Bundled JS written to ${jsOutFile}`); + +// Bundle CSS +const cssOutFile = path.join(outDir, 'app.bundle.css'); +let cssBundle = ''; +cssFiles.forEach(file => { + const filePath = path.join(__dirname, file); + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf8'); + cssBundle += `\n/* ---- ${file} ---- */\n`; + cssBundle += content + '\n'; + } else { + console.warn(`CSS file not found: ${file}`); + } +}); +fs.writeFileSync(cssOutFile, cssBundle, 'utf8'); +console.log(`Bundled CSS written to ${cssOutFile}`); diff --git a/arma/client/addons/phone/ui/_site/tools/concat-css.js b/arma/client/addons/phone/ui/_site/tools/concat-css.js new file mode 100644 index 0000000..5ce7873 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/concat-css.js @@ -0,0 +1,51 @@ +// concat-css.js +// Concatenate CSS files in the correct order into dist/app.bundle.css + +const fs = require('fs'); +const path = require('path'); + +// List of CSS files in order (from index.html) +const files = [ + '../styles/base.css', + '../styles/main.css', + '../styles/components/layout.css', + '../styles/components/phone.css', + '../styles/components/buttons.css', + '../styles/components/modal.css', + '../styles/components/nav-bar.css', + '../styles/components/status-bar.css', + '../styles/components/home.css', + '../styles/components/contacts.css', + '../styles/components/dialpad.css', + '../styles/components/messages.css', + '../styles/components/mail.css', + '../styles/components/settings.css', + '../styles/components/notes.css', + '../styles/components/calendar.css', + '../styles/components/clock.css', + '../styles/components/wallet.css', + '../styles/components/loader.css' +]; + +const outDir = path.join(__dirname, '../dist'); +const outFile = path.join(outDir, 'app.bundle.css'); + +if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir); +} + +let bundle = ''; + +files.forEach(file => { + const filePath = path.join(__dirname, file); + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf8'); + bundle += `\n/* ---- ${file} ---- */\n`; + bundle += content + '\n'; + } else { + console.warn(`File not found: ${file}`); + } +}); + +fs.writeFileSync(outFile, bundle, 'utf8'); +console.log(`Bundled CSS written to ${outFile}`); diff --git a/arma/client/addons/phone/ui/_site/tools/concat-js.js b/arma/client/addons/phone/ui/_site/tools/concat-js.js new file mode 100644 index 0000000..e3c45bd --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/concat-js.js @@ -0,0 +1,101 @@ +// concat-js.js +// Concatenate JS files in the correct order into dist/app.bundle.js + +const fs = require('fs'); +const path = require('path'); + +// List of JS files in order (from index.html) +const files = [ + // Core Framework + '../js/core/Component.js', + '../js/core/StateManager.js', + + // Utils + '../js/utils/helpers.js', + '../js/utils/PhoneMedia.js', + + // Shared Components + '../js/components/StatusBar.js', + '../js/components/Modal.js', + '../js/components/NavigationBar.js', + '../js/components/HomeIndicator.js', + '../js/components/SearchBar.js', + '../js/components/Header.js', + + // App Components + '../js/components/HomeScreen.js', + + // Phone App + '../js/apps/phone/components/Dialpad.js', + '../js/apps/phone/index.js', + + // Messages App + '../js/apps/messages/components/MessagesList.js', + '../js/apps/messages/components/MessageItem.js', + '../js/apps/messages/components/ConversationView.js', + '../js/apps/messages/index.js', + + // Mail App + '../js/apps/mail/components/MailList.js', + '../js/apps/mail/components/MailDetail.js', + '../js/apps/mail/components/MailComposer.js', + '../js/apps/mail/index.js', + + // Contacts App + '../js/apps/contacts/components/ContactList.js', + '../js/apps/contacts/components/ContactItem.js', + '../js/apps/contacts/components/AddContactForm.js', + '../js/apps/contacts/index.js', + + // Settings App + '../js/apps/settings/components/Settings.js', + '../js/apps/settings/index.js', + + // Notes App + '../js/apps/notes/components/NotesList.js', + '../js/apps/notes/components/NoteEditor.js', + '../js/apps/notes/index.js', + + // Clock App + '../js/apps/clock/components/WorldClock.js', + '../js/apps/clock/components/Stopwatch.js', + '../js/apps/clock/components/Timer.js', + '../js/apps/clock/components/AlarmClock.js', + '../js/apps/clock/index.js', + + // Calendar App + '../js/apps/calendar/components/Calendar.js', + '../js/apps/calendar/components/EventEditor.js', + '../js/apps/calendar/index.js', + + // Wallet App + '../js/apps/wallet/index.js', + + // Main App + '../js/app.js', + '../js/main.js', + '../js/global.js' +]; + +const outDir = path.join(__dirname, '../dist'); +const outFile = path.join(outDir, 'app.bundle.js'); + +if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir); +} + +let bundle = ''; + +files.forEach(file => { + const filePath = path.join(__dirname, file); + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf8'); + bundle += `\n// ---- ${file} ----\n`; + bundle += content + '\n'; + } else { + console.warn(`File not found: ${file}`); + } +}); + +fs.writeFileSync(outFile, bundle, 'utf8'); +console.log(`Bundled JS written to ${outFile}`); diff --git a/arma/client/addons/phone/ui/_site/tools/media_to_base64.py b/arma/client/addons/phone/ui/_site/tools/media_to_base64.py new file mode 100644 index 0000000..4052db1 --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/media_to_base64.py @@ -0,0 +1,67 @@ +"""A script to convert media files to base64 encoded text files. + +This script processes media files (images, audio, video) and converts them to base64 encoded +text format. It can handle individual files or recursively process entire directories. +The encoded data is saved to new files with the original extension plus '.b64'. + +Supported file types: + - Images: .png, .jpg, .jpeg + - Audio: .mp3 + - Video: .mp4 + +Functions: + convert_to_base64(input_file): Converts a media file to base64 encoded text + main(): Handles user input and initiates file processing + +Usage: + Run the script and enter a file or directory path when prompted. + For directories, all supported media files will be processed recursively. + + Examples: + - Single file: "path/to/video.mp4" + - Current directory (recursive): "." + - Specific directory: "path/to/media/folder" + +Output: + Creates new files with '.b64' extension: 'your_file.mp4.b64' +""" + +import base64 +import os +from pathlib import Path + +def convert_to_base64(input_file): + # Read file in binary mode + with open(input_file, 'rb') as file: + # Convert to base64 + encoded = base64.b64encode(file.read()) + + # Create output filename by appending .b64 while keeping original extension + output_file = input_file.with_suffix(input_file.suffix + '.b64') + + # Write base64 string to text file + with open(output_file, 'w') as file: + file.write(encoded.decode('utf-8')) + + print(f"Converted {input_file} to base64 -> {output_file}") + +def main(): + # Get directory path from user + while True: + dir_path = input("Enter the directory path containing media files: ").strip() + path = Path(dir_path) + + if path.exists(): + break + print("Invalid directory path. Please try again.") + + # Supported extensions + supported_extensions = {'.jpg', '.jpeg', '.mp3', '.mp4', '.md', '.png'} + + # Recursively process all files in specified directory and subdirectories + for file in path.rglob('*'): + if file.is_file() and file.suffix.lower() in supported_extensions: + convert_to_base64(file) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/arma/client/addons/phone/ui/_site/tools/requirements.txt b/arma/client/addons/phone/ui/_site/tools/requirements.txt new file mode 100644 index 0000000..8a89bcb --- /dev/null +++ b/arma/client/addons/phone/ui/_site/tools/requirements.txt @@ -0,0 +1,4 @@ +py7zr +brotli +brotlipy +brotlicffi diff --git a/arma/client/addons/store/$PBOPREFIX$ b/arma/client/addons/store/$PBOPREFIX$ new file mode 100644 index 0000000..b7ca134 --- /dev/null +++ b/arma/client/addons/store/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\store diff --git a/arma/client/addons/store/CfgEventHandlers.hpp b/arma/client/addons/store/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/store/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient)); + }; +}; diff --git a/arma/client/addons/store/README.md b/arma/client/addons/store/README.md new file mode 100644 index 0000000..f2693ad --- /dev/null +++ b/arma/client/addons/store/README.md @@ -0,0 +1,28 @@ +# Forge Client Store + +## Overview +The store addon provides the client storefront UI for catalog browsing, +category loading, payment-source display, cart handling, and checkout requests. + +## Dependencies +- `forge_client_common` +- `forge_client_main` +- server store events from `forge_server_store` +- bank/org/locker/garage server state through checkout results + +## Main Components +- `fnc_initUIBridge.sqf` handles browser readiness, category requests, checkout + requests, and server responses. +- `fnc_handleUIEvents.sqf` handles `store::*` browser events. +- `fnc_openUI.sqf` opens `RscStore`. + +## Browser Events +- `store::ready` +- `store::category::request` +- `store::checkout::request` +- `store::close` + +## Runtime Notes +The client never calculates authoritative checkout results. The server store +addon and extension validate prices, charge payment sources, grant assets, and +return patches for the UI. diff --git a/arma/client/addons/store/XEH_PREP.hpp b/arma/client/addons/store/XEH_PREP.hpp new file mode 100644 index 0000000..339e665 --- /dev/null +++ b/arma/client/addons/store/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initUIBridge); +PREP(openUI); diff --git a/arma/client/addons/store/XEH_postInit.sqf b/arma/client/addons/store/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/store/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/store/XEH_postInitClient.sqf b/arma/client/addons/store/XEH_postInitClient.sqf new file mode 100644 index 0000000..44eb8c8 --- /dev/null +++ b/arma/client/addons/store/XEH_postInitClient.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +if (isNil QGVAR(StoreUIBridge)) then { call FUNC(initUIBridge); }; + +[QGVAR(responseCategory), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(StoreUIBridge) call ["handleCategoryResponse", [_payload]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseHydrateStore), { + params [["_payload", createHashMap, [createHashMap]], ["_bridgeEvent", "store::hydrate", [""]]]; + + GVAR(StoreUIBridge) call ["handleHydrateResponse", [_payload, _bridgeEvent]]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseCheckout), { + params [["_payload", createHashMap, [createHashMap]]]; + + GVAR(StoreUIBridge) call ["handleCheckoutResponse", [_payload]]; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/store/XEH_preInit.sqf b/arma/client/addons/store/XEH_preInit.sqf new file mode 100644 index 0000000..dbef1ae --- /dev/null +++ b/arma/client/addons/store/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +// #include "initSettings.inc.sqf" +// #include "initKeybinds.inc.sqf" diff --git a/arma/client/addons/store/XEH_preInitClient.sqf b/arma/client/addons/store/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/store/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/store/XEH_preStart.sqf b/arma/client/addons/store/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/client/addons/store/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/store/config.cpp b/arma/client/addons/store/config.cpp new file mode 100644 index 0000000..128e9a9 --- /dev/null +++ b/arma/client/addons/store/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_common", + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ui\RscCommon.hpp" +#include "ui\RscStore.hpp" diff --git a/arma/client/addons/store/functions/fnc_handleUIEvents.sqf b/arma/client/addons/store/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..5ee1dfe --- /dev/null +++ b/arma/client/addons/store/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_handleUIEvents.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-03-11 + * Public: No + * + * Description: + * Handles the UI events. + * + * Arguments: + * 0: [CONTROL] - The control that triggered the event + * 1: [BOOL] - Whether the event is from a confirm dialog + * 2: [STRING] - The message containing the event data + * + * Return Value: + * UI events handled [BOOL] + * + * Example: + * call forge_client_store_fnc_handleUIEvents; + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; + +diag_log format ["[FORGE:Client:Store] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "store::close": { closeDialog 1; }; + case "store::ready": { GVAR(StoreUIBridge) call ["handleReady", [_control]]; }; + case "store::category::request": { GVAR(StoreUIBridge) call ["handleCategoryRequest", [_data]]; }; + case "store::checkout::request": { GVAR(StoreUIBridge) call ["handleCheckoutRequest", [_data]]; }; + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/store/functions/fnc_initUIBridge.sqf b/arma/client/addons/store/functions/fnc_initUIBridge.sqf new file mode 100644 index 0000000..e2e7b47 --- /dev/null +++ b/arma/client/addons/store/functions/fnc_initUIBridge.sqf @@ -0,0 +1,142 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initUIBridge.sqf + * Author: IDSolutions + * Date: 2026-03-27 + * Public: No + * + * Description: + * Initializes the store UI bridge for browser control state and store UI events. + * + * Arguments: + * None + * + * Return Value: + * Store UI bridge object [HASHMAP OBJECT] + * + * Example: + * call forge_client_store_fnc_initUIBridge; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(StoreUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "StoreUIBridgeBaseClass"], + ["getActiveBrowserControl", compileFinal { + private _display = uiNamespace getVariable ["RscStore", displayNull]; + if (isNull _display) exitWith { controlNull }; + + _display displayCtrl 1004 + }], + ["execBridge", compileFinal { + params [["_control", controlNull, [controlNull]], ["_fnName", "", [""]], ["_payload", createHashMap, [createHashMap]]]; + + if (isNull _control || { _fnName isEqualTo "" }) exitWith { false }; + + private _json = toJSON _payload; + _control ctrlWebBrowserAction ["ExecJS", format ["StoreUIBridge.%1(%2)", _fnName, _json]]; + + true + }], + ["sendBridgeEvent", compileFinal { + params [["_event", "", [""]], ["_data", createHashMap, [createHashMap]], ["_control", controlNull, [controlNull]]]; + + if (_event isEqualTo "") exitWith { false }; + + private _targetControl = _control; + if (isNull _targetControl) then { _targetControl = _self call ["getActiveBrowserControl", []]; }; + if (isNull _targetControl) exitWith { false }; + + _self call ["execBridge", [_targetControl, "receive", createHashMapFromArray [ + ["event", _event], + ["data", _data] + ]]] + }], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + private _uid = getPlayerUID player; + if (_uid isEqualTo "") exitWith { + _self call ["sendBridgeEvent", ["store::hydrate", createHashMap, _control]]; + }; + + [SRPC(store,requestHydrateStore), [_uid, "store::hydrate"]] call CFUNC(serverEvent); + }], + ["handleCategoryRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _category = toLowerANSI (_data getOrDefault ["category", ""]); + private _uid = getPlayerUID player; + if (_category isEqualTo "") exitWith { + _self call ["sendBridgeEvent", ["store::category::failure", createHashMapFromArray [ + ["message", "No store category was provided."] + ]]]; + }; + + if (_uid isEqualTo "") exitWith { + _self call ["sendBridgeEvent", ["store::category::failure", createHashMapFromArray [ + ["category", _category], + ["message", "Store catalog request is unavailable."] + ]]]; + }; + + diag_log format ["[FORGE:Client:Store] Category request forwarded to server: %1", _category]; + [SRPC(store,requestCategory), [_uid, _category]] call CFUNC(serverEvent); + }], + ["handleCategoryResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _success = _payload getOrDefault ["success", false]; + private _bridgeEvent = ["store::category::failure", "store::category::hydrate"] select _success; + _self call ["sendBridgeEvent", [_bridgeEvent, _payload]]; + }], + ["refreshStoreConfig", compileFinal { + private _uid = getPlayerUID player; + if (_uid isEqualTo "") exitWith { false }; + + [SRPC(store,requestHydrateStore), [_uid, "store::config::hydrate"]] call CFUNC(serverEvent); + true + }], + ["handleHydrateResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]], ["_bridgeEvent", "store::hydrate", [""]]]; + + private _event = _bridgeEvent; + if !(_event in ["store::hydrate", "store::config::hydrate"]) then { _event = "store::hydrate"; }; + + _self call ["sendBridgeEvent", [_event, _payload]] + }], + ["handleCheckoutRequest", compileFinal { + params [["_data", createHashMap, [createHashMap]]]; + + private _uid = getPlayerUID player; + private _checkoutJson = _data getOrDefault ["checkoutJson", ""]; + + if (_uid isEqualTo "" || { _checkoutJson isEqualTo "" }) exitWith { + _self call ["sendBridgeEvent", ["store::checkout::failure", createHashMapFromArray [ + ["message", "Add at least one supported item before checkout."] + ]]]; + }; + + diag_log format ["[FORGE:Client:Store] Checkout request forwarded to server: %1", _checkoutJson]; + [SRPC(store,requestCheckout), [_uid, _checkoutJson]] call CFUNC(serverEvent); + }], + ["handleCheckoutResponse", compileFinal { + params [["_payload", createHashMap, [createHashMap]]]; + + private _success = _payload getOrDefault ["success", false]; + private _bridgeEvent = ["store::checkout::failure", "store::checkout::success"] select _success; + _self call ["sendBridgeEvent", [_bridgeEvent, _payload]]; + + if (_success) then { + [] spawn { + sleep 0.05; + if !(isNil QGVAR(StoreUIBridge)) then { + GVAR(StoreUIBridge) call ["refreshStoreConfig", []]; + }; + }; + }; + }] +]; + +GVAR(StoreUIBridge) = createHashMapObject [GVAR(StoreUIBridgeBaseClass)]; +GVAR(StoreUIBridge) diff --git a/arma/client/addons/store/functions/fnc_openUI.sqf b/arma/client/addons/store/functions/fnc_openUI.sqf new file mode 100644 index 0000000..e9b4aba --- /dev/null +++ b/arma/client/addons/store/functions/fnc_openUI.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_openUI.sqf + * Author: IDSolutions + * Date: 2026-01-28 + * Last Update: 2026-03-11 + * Public: No + * + * Description: + * Opens the store interface. + * + * Arguments: + * None + * + * Return Value: + * UI opened [BOOL] + * + * Example: + * call forge_client_store_fnc_openUI; + */ + +private _display = createDialog ["RscStore", true]; +private _ctrl = _display displayCtrl 1004; + +_ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + + [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents); +}]; + +_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)]; +// _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; + +true; diff --git a/arma/client/addons/store/initKeybinds.inc.sqf b/arma/client/addons/store/initKeybinds.inc.sqf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/addons/store/initKeybinds.inc.sqf @@ -0,0 +1 @@ + diff --git a/arma/client/addons/store/initSettings.inc.sqf b/arma/client/addons/store/initSettings.inc.sqf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/addons/store/initSettings.inc.sqf @@ -0,0 +1 @@ + diff --git a/arma/client/addons/store/script_component.hpp b/arma/client/addons/store/script_component.hpp new file mode 100644 index 0000000..5416b30 --- /dev/null +++ b/arma/client/addons/store/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT store +#define COMPONENT_BEAUTIFIED Store +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/addons/store/stringtable.xml b/arma/client/addons/store/stringtable.xml new file mode 100644 index 0000000..f0a0c86 --- /dev/null +++ b/arma/client/addons/store/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Store + + + diff --git a/arma/client/addons/store/ui/RscCommon.hpp b/arma/client/addons/store/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/store/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/store/ui/RscStore.hpp b/arma/client/addons/store/ui/RscStore.hpp new file mode 100644 index 0000000..a68c8d4 --- /dev/null +++ b/arma/client/addons/store/ui/RscStore.hpp @@ -0,0 +1,21 @@ +class RscStore { + idd = 1003; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscStore', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscStore', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1004; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/store/ui/_site/index.html b/arma/client/addons/store/ui/_site/index.html new file mode 100644 index 0000000..87ac510 --- /dev/null +++ b/arma/client/addons/store/ui/_site/index.html @@ -0,0 +1 @@ +FORGE Supply Exchange
\ No newline at end of file diff --git a/arma/client/addons/store/ui/_site/store-ui.css b/arma/client/addons/store/ui/_site/store-ui.css new file mode 100644 index 0000000..92a725c --- /dev/null +++ b/arma/client/addons/store/ui/_site/store-ui.css @@ -0,0 +1 @@ +:root{--store-shell-bg:#e4e3df;--store-surface:#f5f3ef;--store-surface-alt:#ece8e2;--store-surface-strong:#fff;--store-border:#4a5b6e33;--store-border-strong:#142e4f33;--store-text-main:#1f2d3d;--store-text-muted:#6a7787;--store-text-subtle:#8792a0;--store-accent:#12365d;--store-accent-soft:#dbe7f3;--store-accent-line:#12365d1f;--store-success:#2f7d5b;--store-danger:#8a3d3d}*{box-sizing:border-box}html,body{width:100%;height:100%;margin:0;overflow:hidden}body{color:var(--store-text-main);background:var(--store-shell-bg);font-family:Segoe UI,Trebuchet MS,sans-serif}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.7}:focus-visible{outline-offset:2px;outline:2px solid #12365d59}#app{width:100%;height:100%}.store-btn{border:1px solid var(--store-border-strong);letter-spacing:.08em;text-transform:uppercase;border-radius:.8rem;min-height:2.75rem;padding:.72rem 1rem;font-size:.82rem;font-weight:700}.store-btn.store-btn-primary{color:var(--store-accent);background:#ffffffad}.store-btn.store-btn-primary:hover{background:#dbe7f3e0}.store-btn.store-btn-secondary{color:var(--store-text-muted);background:#ffffff6b}.store-btn.store-btn-secondary:hover{color:var(--store-text-main);background:#fff9} \ No newline at end of file diff --git a/arma/client/addons/store/ui/_site/store-ui.js b/arma/client/addons/store/ui/_site/store-ui.js new file mode 100644 index 0000000..ffa5a91 --- /dev/null +++ b/arma/client/addons/store/ui/_site/store-ui.js @@ -0,0 +1 @@ +!function(){const e=window.ForgeWebUI;(window.StorefrontApp=window.StorefrontApp||{}).runtime=e,window.AppRuntime=e}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},t=e.runtime,[n,r]=t.createSignal(0),a=Object.create(null),o=Object.create(null),s=[],i=Object.create(null),c=Object.create(null),l=new WeakSet;let d=0,m=null,u=null,g=0;function p(e){let t=String(e||"").trim();if(!t)return"";for(;t.startsWith("\\")||t.startsWith("/");)t=t.slice(1);return/\.[A-Za-z0-9]+$/.test(t)||(t+=".paa"),t}function b(e){const t=String(e||"").trim().toLowerCase();return t.startsWith("data:image/")||t.startsWith("blob:")||t.startsWith("http://")||t.startsWith("https://")}function h(e,t){a[e]=t,function(){if(g)return;g=window.setTimeout(()=>{g=0,r(e=>e+1)},48)}()}function y(){if("undefined"!=typeof A3API&&"function"==typeof A3API.RequestTexture)for(;d<6&&s.length>0;){const e=s.shift();delete i[e],e&&void 0===a[e]&&!o[e]&&(d+=1,o[e]=Promise.resolve(A3API.RequestTexture(e,512)).then(t=>{const n=String(t||"").trim();b(n)?h(e,n):(console.warn("[Store UI] Ignoring unsupported texture response.",e,n),h(e,""))}).catch(t=>{console.warn("[Store UI] Failed to resolve texture.",e,t),h(e,"")}).finally(()=>{d=Math.max(0,d-1),delete o[e],y()}))}}function f(e){!e||i[e]||o[e]||(i[e]=!0,s.push(e),y())}function v(e){const t=p(e);t&&!c[t]&&(c[t]=!0,b(a[t])||o[t]||f(t))}function S(){const e=document.querySelectorAll("[data-store-texture-path]");if(0===e.length)return;const t=function(){const e=document.querySelector(".catalog-grid");return"function"!=typeof IntersectionObserver?null:(m&&u===e||(m&&m.disconnect(),u=e,m=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(v(e.target.getAttribute("data-store-texture-path")),m.unobserve(e.target))})},{root:e,rootMargin:"240px 0px",threshold:.01})),m)}();e.forEach(e=>{if(l.has(e))return;l.add(e);const n=e.getAttribute("data-store-texture-path");t?t.observe(e):v(n)})}e.media={getTextureState:function(e){n();const t=p(e);return{path:t,isVisible:Boolean(t&&c[t]),isLoaded:Boolean(t&&a[t]&&b(a[t]))}},getTextureSource:function(e){n();const t=p(e);return t?b(e)?(a[t]=String(e).trim(),a[t]):void 0!==a[t]?a[t]:c[t]?(f(t),""):"":""},scheduleTextureObservation:function(){window.requestAnimationFrame(()=>{S()})}}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},t={actorName:"",actorUid:"",approval:"Field Access",orgId:"",orgName:"",orgLeader:!1,defaultOrgCeo:!1,canUseOrgFunds:!1},n={budget:5e4,creditLine:0,availability:"In-Stock",moduleState:"Preview",searchTags:["Attachment","Grenade","Medical","Consumable","Static","Scope","Item","Misc"],paymentSources:[{id:"cash",label:"Cash",balance:0,enabled:!1,detail:"Use on-hand cash carried by the player."},{id:"bank",label:"Bank",balance:0,enabled:!1,detail:"Charge the player bank account."},{id:"org_funds",label:"Org Funds",balance:0,enabled:!1,detail:"Only organization leaders or the default-org CEO can use treasury funds."},{id:"credit_line",label:"Credit Line",balance:0,enabled:!1,detail:"No approved credit line is assigned to this member."}],defaultPaymentSource:"cash"};function r(e,t){var n;Object.keys(e).forEach(t=>delete e[t]),Object.assign(e,(n=t,JSON.parse(JSON.stringify(n))))}e.data={catalog:{categoryCards:[{id:"uniforms",label:"Uniforms"},{id:"headgear",label:"Headgear"},{id:"facewear",label:"Facewear"},{id:"vests",label:"Vests"},{id:"backpacks",label:"Backpacks"},{id:"attachments",label:"Attachments"},{id:"weapons",label:"Weapons"},{id:"ammo",label:"Ammo"},{id:"misc",label:"Misc"},{id:"vehicles",label:"Vehicles"}],vehicleCards:[{id:"cars",label:"Cars"},{id:"armor",label:"Armor"},{id:"helis",label:"Helicopters"},{id:"planes",label:"Planes"},{id:"naval",label:"Naval"},{id:"other",label:"Other"}],weaponCards:[{id:"primary",label:"Primary"},{id:"secondary",label:"Secondary"},{id:"handgun",label:"Handgun"}],previewItems:{uniforms:[],headgear:[],facewear:[],vests:[],backpacks:[],attachments:[],ammo:[],misc:[],primary:[],secondary:[],handgun:[],cars:[],armor:[],helis:[],planes:[],naval:[],other:[]}},session:Object.assign({},t),storeConfig:Object.assign({},n),applyHydratePayload(e){r(this.session,Object.assign({},t,e?.session||{})),r(this.storeConfig,Object.assign({},n,e?.storeConfig||{}))}}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},{createSignal:t}=e.runtime,n=window.SharedLogic=window.SharedLogic||{};n.createStorefrontStore=function({createSignal:e}){function t(e){return{className:String(e?.className||e?.code||""),code:String(e?.code||e?.className||""),name:String(e?.name||e?.displayName||""),description:String(e?.description||""),price:String(e?.price||""),image:String(e?.image||""),type:String(e?.type||""),category:String(e?.category||""),entryKind:String(e?.entryKind||"item"),quantity:Math.max(0,Number(e?.quantity||0))}}function n(e){return{code:String(e?.code||""),name:String(e?.name||""),price:String(e?.price||"$0"),category:String(e?.category||""),entryKind:String(e?.entryKind||"item"),quantity:Math.max(1,Number(e?.quantity||1))}}return new class{constructor(){[this.getView,this.setView]=e("categories"),[this.getSelectedCategory,this.setSelectedCategory]=e(""),[this.getSelectedWeaponSlot,this.setSelectedWeaponSlot]=e(""),[this.getSelectedVehicleSlot,this.setSelectedVehicleSlot]=e(""),[this.getCartOpen,this.setCartOpen]=e(!1),[this.getSearchQuery,this.setSearchQuery]=e(""),[this.getCartItems,this.setCartItems]=e([]),[this.getCatalogItemsByKey,this.setCatalogItemsByKey]=e({}),[this.getIsCatalogLoading,this.setIsCatalogLoading]=e(!1),[this.getCatalogRequestKey,this.setCatalogRequestKey]=e(""),[this.getCatalogPage,this.setCatalogPage]=e(1),[this.getNotice,this.setNotice]=e({type:"",text:""}),[this.getIsCheckingOut,this.setIsCheckingOut]=e(!1),[this.getSelectedPaymentSource,this.setSelectedPaymentSource]=e("cash")}resetToCategories(){this.setView("categories"),this.setSelectedCategory(""),this.setSelectedWeaponSlot(""),this.setSelectedVehicleSlot(""),this.setIsCatalogLoading(!1),this.setCatalogRequestKey(""),this.setCatalogPage(1)}openWeaponsRoot(){this.setView("weapons"),this.setSelectedCategory("weapons"),this.setSelectedWeaponSlot(""),this.setSelectedVehicleSlot(""),this.setIsCatalogLoading(!1),this.setCatalogRequestKey(""),this.setCatalogPage(1)}openVehiclesRoot(){this.setView("vehicles"),this.setSelectedCategory("vehicles"),this.setSelectedVehicleSlot(""),this.setSelectedWeaponSlot(""),this.setIsCatalogLoading(!1),this.setCatalogRequestKey(""),this.setCatalogPage(1)}resetCatalogPage(){this.setCatalogPage(1)}setCatalogPageNumber(e){const t=Math.max(1,Number(e||1));this.setCatalogPage(t)}selectCategory(e){this.setSelectedCategory(e),this.setSelectedWeaponSlot(""),this.setSelectedVehicleSlot(""),this.setCatalogPage(1),"weapons"!==e?"vehicles"!==e?this.setView("items"):this.openVehiclesRoot():this.openWeaponsRoot()}selectSubcategory(e,t){"vehicle"===t?(this.setSelectedVehicleSlot(e),this.setSelectedWeaponSlot("")):(this.setSelectedWeaponSlot(e),this.setSelectedVehicleSlot("")),this.setCatalogPage(1),this.setView("items")}startCategoryRequest(e){const t=String(e||"").trim().toLowerCase();return!!t&&(this.setCatalogRequestKey(t),this.setIsCatalogLoading(!0),!0)}finishCategoryRequest(e){const t=String(e||"").trim().toLowerCase(),n=String(this.getCatalogRequestKey()||"").trim().toLowerCase();t&&n&&n!==t||(this.setCatalogRequestKey(""),this.setIsCatalogLoading(!1))}hydrateCategoryItems(e){const n=String(e?.category||"").trim().toLowerCase(),r=Array.isArray(e?.items)?e.items:[];if(!n)return this.setCatalogRequestKey(""),void this.setIsCatalogLoading(!1);this.setCatalogItemsByKey(e=>Object.assign({},e,{[n]:r.map(t)})),this.finishCategoryRequest(n)}ensureSelectedPaymentSource(e){const t=Array.isArray(e?.paymentSources)?e.paymentSources:[],n=String(this.getSelectedPaymentSource()||"").trim(),r=String(e?.defaultPaymentSource||"").trim(),a=t.map(e=>String(e?.id||"").trim()),o=t.find(e=>e&&!1!==e.enabled),s=r&&a.includes(r)?t.find(e=>String(e?.id||"").trim()===r):null;n&&a.includes(n)&&t.some(e=>String(e?.id||"").trim()===n&&!1!==e?.enabled)||(s&&!1!==s.enabled?this.setSelectedPaymentSource(r):o?this.setSelectedPaymentSource(String(o.id||"cash")):this.setSelectedPaymentSource(r||"cash"))}navigateToBreadcrumb(e){switch(e){case"categories":return this.resetToCategories(),!0;case"weapons":return this.openWeaponsRoot(),!0;case"vehicles":return this.openVehiclesRoot(),!0;default:return!1}}hydrateFromPayload(e){const t=Array.isArray(e?.cartItems)?e.cartItems:[];this.setCartItems(t.map(n)),this.setCartOpen(!1),this.setIsCheckingOut(!1),this.setCatalogItemsByKey({}),this.setCatalogRequestKey(""),this.setIsCatalogLoading(!1),this.setCatalogPage(1),this.ensureSelectedPaymentSource(e?.storeConfig||{})}hydrateStoreConfig(e){const t=Array.isArray(e?.cartItems)?e.cartItems:[];this.setCartItems(t.map(n)),this.setCartOpen(!1),this.setIsCheckingOut(!1),this.ensureSelectedPaymentSource(e?.storeConfig||{})}}},e.store=n.createStorefrontStore({createSignal:t})}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{};function t(e){return e.selectedWeaponSlot||e.selectedVehicleSlot||e.selectedCategory}function n(e,t){if(!e)return!0;const n=String(e).trim().toLowerCase();return!n||t.some(e=>String(e||"").toLowerCase().includes(n))}function r(e){const t=Number(String(e||"0").replace(/[^0-9.-]+/g,""));return Number.isFinite(t)?t:0}function a(e){const t=String(e||"").trim().toLowerCase();return["items","misc"].includes(t)?"Misc":String(e||"").replace(/[-_]+/g," ").split(/\s+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")}function o(e,r){const a=t(e),o=String(a||"").trim().toLowerCase(),s=e.catalogItemsByKey||{};return(Array.isArray(s[o])?s[o]:[]).filter(t=>n(e.searchQuery,[t.className,t.code,t.name,t.description,t.price,t.type]))}function s(e,t){const n=o(e).length,r=Math.max(1,Math.ceil(n/6)),a=Math.min(r,Math.max(1,Number(e.catalogPage||1)));return{pageSize:6,totalItems:n,totalPages:r,currentPage:a,startIndex:0===n?0:6*(a-1)+1,endIndex:Math.min(6*a,n)}}function i(e){return(Array.isArray(e?.paymentSources)?e.paymentSources:[]).map(e=>({id:String(e?.id||"").trim(),label:String(e?.label||e?.id||"").trim(),balance:Number(e?.balance||0),enabled:!1!==e?.enabled,detail:String(e?.detail||"").trim()}))}e.getters={formatTitle:a,formatCurrency:function(e){return`$${Number(e||0).toLocaleString()}`},parsePrice:r,getSelectionKey:t,getStoreState:function(e){return{view:e.getView(),selectedCategory:e.getSelectedCategory(),selectedWeaponSlot:e.getSelectedWeaponSlot(),selectedVehicleSlot:e.getSelectedVehicleSlot(),selectedPaymentSource:e.getSelectedPaymentSource(),cartOpen:e.getCartOpen(),searchQuery:e.getSearchQuery(),cartItems:e.getCartItems(),catalogItemsByKey:e.getCatalogItemsByKey(),isCatalogLoading:e.getIsCatalogLoading(),catalogRequestKey:e.getCatalogRequestKey(),catalogPage:e.getCatalogPage(),isCheckingOut:e.getIsCheckingOut()}},getStoreHeader:function(e){if("weapons"===e.view)return{eyebrow:"Weapons Division",title:"Weapon Categories",copy:"Select a weapon slot to open the next supply tier. Primary, secondary, and handgun are staged with the same state and bridge flow as the org portal.",badge:"3 Slots"};if("vehicles"===e.view)return{eyebrow:"Vehicle Motorpool",title:"Vehicle Categories",copy:"Select a vehicle class to open the next supply tier. Cars, armor, airframes, and naval options stay inside the same local store and bridge lifecycle.",badge:"6 Classes"};if("items"===e.view){const n=t(e)||"catalog",r=e.searchQuery?` Filtered by "${e.searchQuery}".`:"",o=e.isCatalogLoading?" Pulling live inventory from the game engine.":"";return{eyebrow:"Catalog Preview",title:a(n),copy:`Live category inventory generated from the game engine for the selected department.${r}${o}`,badge:"Preview Items"}}return{eyebrow:"Supply Categories",title:"Procurement Dashboard",copy:"Choose a category to enter the exchange. Weapons and vehicles open a second tier, while the other departments display placeholder product inventory inside the new runtime/store architecture.",badge:"8 Categories"}},getStoreBreadcrumbs:function(e){const t=[{id:"categories",label:"Supply Exchange"}];if("weapons"===e.view)return t.push({id:"weapons",label:"Weapons"}),t;if("vehicles"===e.view)return t.push({id:"vehicles",label:"Vehicles"}),t;if("items"===e.view){if(e.selectedWeaponSlot)return t.push({id:"weapons",label:"Weapons"}),t.push({id:"weapon-slot",label:a(e.selectedWeaponSlot)}),t;if(e.selectedVehicleSlot)return t.push({id:"vehicles",label:"Vehicles"}),t.push({id:"vehicle-slot",label:a(e.selectedVehicleSlot)}),t;e.selectedCategory&&t.push({id:"category",label:a(e.selectedCategory)})}return t},getVisibleCategoryCards:function(e,t){return t.categoryCards.filter(t=>n(e.searchQuery,[t.id,t.label]))},getVisibleSubcategoryCards:function(e,t){return("vehicles"===e.view?t.vehicleCards:t.weaponCards).filter(t=>n(e.searchQuery,[t.id,t.label]))},getVisibleItems:o,getVisibleItemsPage:function(e,t){const n=o(e),r=s(e),a=(r.currentPage-1)*r.pageSize;return n.slice(a,a+r.pageSize)},getCatalogPagination:s,summarizeCart:function(e){const t=e.reduce((e,t)=>e+Number(t.quantity||0),0),n=e.reduce((e,t)=>e+r(t.price)*Number(t.quantity||0),0);return{lineCount:e.length,itemCount:t,subtotal:n,total:n}},getPaymentSources:i,getPaymentSourceById:function(e,t){const n=String(t||"").trim();return i(e).find(e=>e.id===n)}}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},t=e.store,n=window.ForgeWebUI.createBridge({closeEvent:"store::close",globalName:"StoreUIBridge",readyEvent:"store::ready"});n.on("store::hydrate",n=>{e.data.applyHydratePayload(n),t.hydrateFromPayload(n)}),n.on("store::config::hydrate",n=>{e.data.applyHydratePayload(n),t.hydrateStoreConfig(n)}),n.on("store::checkout::success",n=>{t.setIsCheckingOut(!1),t.setCartItems([]),t.setCartOpen(!1),e.actions&&e.actions.showNotice("success",n.message||"Checkout completed.")}),n.on("store::category::hydrate",e=>{t.hydrateCategoryItems(e)}),n.on("store::category::failure",n=>{t.finishCategoryRequest(n.category||""),e.actions&&e.actions.showNotice("error",n.message||"Category request failed.")}),n.on("store::checkout::failure",n=>{t.setIsCheckingOut(!1),e.actions&&e.actions.showNotice("error",n.message||"Checkout failed.")}),e.bridge={close:n.close,requestClose:function(){return n.close({})},requestCheckout:function(e){return n.send("store::checkout::request",e)},requestCategory:function(e){return n.send("store::category::request",e)},notifyReady:function(){return n.ready({loaded:!0})},receive:n.receive,sendEvent:n.send}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},t=e.store,n=e.getters,{storeConfig:r,session:a}=e.data;let o=null;function s(e,n){t.setNotice({type:e,text:n}),o&&clearTimeout(o),o=setTimeout(()=>{t.setNotice({type:"",text:""}),o=null},3200)}function i(e,t,n){const r={items:[],vehicles:[],totalPrice:n,paymentMethod:t};return e.forEach(e=>{const t=function(e){return{classname:String(e?.code||"").trim(),category:String(e?.category||"").trim().toLowerCase(),entryKind:String(e?.entryKind||"item").trim().toLowerCase(),quantity:Math.max(1,Number(e?.quantity||1))}}(e);if("vehicle"!==t.entryKind)r.items.push({classname:t.classname,category:t.category,quantity:t.quantity});else for(let e=0;e!e)},closeCart:function(){t.setCartOpen(!1)},closeStore:function(){const t=e.bridge;if(t&&"function"==typeof t.requestClose){if(t.requestClose())return!0}return s("error","Store bridge is unavailable."),!1},navigateToBreadcrumb:function(e){return t.navigateToBreadcrumb(e)},selectCategory:function(e){t.selectCategory(e),c(),["weapons","vehicles"].includes(String(e||""))||d(e)},selectSubcategory:function(e,n){t.selectSubcategory(e,n),c(),d(e)},goToCatalogPage:l,goToNextCatalogPage:function(e){const n=Number(t.getCatalogPage()||1);return!(n>=Math.max(1,Number(e||1)))&&(l(n+1),!0)},goToPreviousCatalogPage:function(){const e=Number(t.getCatalogPage()||1);return!(e<=1)&&(l(e-1),!0)},addToCart:function(e){t.setCartItems(t=>{const n=t.findIndex(t=>t.code===e.code);if(-1===n)return[...t,{code:e.code,name:e.name,price:e.price,category:e.category,entryKind:e.entryKind,quantity:1}];const r=[...t];return r[n]=Object.assign({},r[n],{category:e.category,entryKind:e.entryKind,quantity:r[n].quantity+1}),r}),s("success",`${e.name} added to the acquisition queue.`)},incrementCartItem:function(e){t.setCartItems(t=>t.map(t=>t.code===e?Object.assign({},t,{quantity:t.quantity+1}):t))},decrementCartItem:function(e){t.setCartItems(t=>t.map(t=>t.code===e?Object.assign({},t,{quantity:Math.max(0,t.quantity-1)}):t).filter(e=>e.quantity>0))},removeCartItem:function(e){t.setCartItems(t=>t.filter(t=>t.code!==e))},selectPaymentSource:function(e){const a=String(e||"").trim(),o=n.getPaymentSources(r).find(e=>e.id===a);return o?!1===o.enabled?(s("error",o.detail||"Selected payment source is not available."),!1):(t.setSelectedPaymentSource(a),!0):(s("error","Selected payment source is unavailable."),!1)},requestCheckout:function(){const a=t.getCartItems();if(0===a.length)return s("error","Add at least one item before checkout."),!1;const o=n.summarizeCart(a),c=n.getPaymentSourceById(r,t.getSelectedPaymentSource());if(!c)return s("error","Select a payment source before checkout."),!1;if(!1===c.enabled)return s("error",c.detail||"Selected payment source is unavailable."),!1;if(o.total>Number(c.balance||0))return s("error",`${c.label} cannot cover this checkout total.`),!1;const l=e.bridge;if(!l||"function"!=typeof l.requestCheckout)return s("error","Checkout bridge is unavailable."),!1;t.setIsCheckingOut(!0);const d=i(a,c.id,o.total);return!!l.requestCheckout({checkoutJson:JSON.stringify(d)})||(t.setIsCheckingOut(!1),s("error","Checkout bridge is unavailable."),!1)},formatTitle:n.formatTitle,formatCurrency:n.formatCurrency}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},{h:t,ensureScopedStyle:n}=e.runtime,r=window.SharedUI.componentFns.WindowTitleBar,a=e.store,o=e.getters,s=e.actions,{catalog:i,session:c,storeConfig:l}=e.data,d="data-ui-store-app-shell",m=`[${d}]`,u=`\n${m} {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background: var(--store-shell-bg);\n}\n\n${m} .footer-title,\n${m} .eyebrow {\n font-size: 0.68rem;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--store-text-subtle);\n font-weight: 700;\n}\n\n${m} .module-header,\n${m} .store-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n${m} .store-app {\n flex: 1;\n min-height: 0;\n width: min(100%, 1613px);\n margin: 0 auto;\n display: grid;\n grid-template-columns: 308px minmax(0, 1fr);\n gap: 1.25rem;\n padding: 1.25rem;\n}\n\n${m} .store-sidebar,\n${m} .store-main {\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n${m} .store-main {\n position: relative;\n overflow: hidden;\n}\n\n${m} .module-card,\n${m} .store-panel {\n background: linear-gradient(180deg, var(--store-surface) 0%, var(--store-surface-alt) 100%);\n border: 1px solid var(--store-border);\n border-radius: 1.35rem;\n}\n\n${m} .module-card {\n padding: 1rem;\n}\n\n${m} .store-panel {\n min-height: 0;\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n width: min(100%, 1280px);\n overflow: hidden;\n}\n\n${m} .module-header {\n margin-bottom: 0.85rem;\n}\n\n${m} .store-panel-header {\n padding: 1rem 1rem 0;\n}\n\n${m} .section-title {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: var(--store-text-main);\n}\n\n${m} .section-copy,\n${m} .footer-copy {\n margin: 0.2rem 0 0;\n font-size: 0.9rem;\n line-height: 1.45;\n color: var(--store-text-muted);\n}\n\n${m} .pill {\n padding: 0.48rem 0.8rem;\n border-radius: 999px;\n background: var(--store-accent-soft);\n color: var(--store-accent);\n font-size: 0.74rem;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n}\n\n${m} .search-module {\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n}\n\n${m} .search-form {\n display: grid;\n gap: 0.7rem;\n}\n\n${m} .search-input {\n width: 100%;\n height: 2.9rem;\n padding: 0 0.95rem;\n border-radius: 0.8rem;\n border: 1px solid var(--store-border);\n background: rgb(255 255 255 / 0.75);\n color: var(--store-text-main);\n}\n\n${m} .quick-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n${m} .quick-tag {\n padding: 0.55rem 0.72rem;\n border-radius: 999px;\n border: 1px solid var(--store-border);\n background: rgb(255 255 255 / 0.52);\n color: var(--store-text-muted);\n font-size: 0.75rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n${m} .filter-stack {\n display: grid;\n gap: 0.85rem;\n}\n\n${m} .filter-group {\n padding: 0.95rem;\n border-radius: 0.8rem;\n background: rgb(255 255 255 / 0.48);\n border: 1px solid var(--store-border);\n}\n\n${m} .filter-label {\n display: block;\n margin-bottom: 0.55rem;\n font-size: 0.72rem;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: var(--store-text-subtle);\n font-weight: 700;\n}\n\n${m} .filter-value {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n color: var(--store-text-main);\n font-size: 0.92rem;\n font-weight: 600;\n}\n\n${m} .filter-placeholder {\n color: var(--store-text-muted);\n font-weight: 500;\n}\n\n${m} .store-panel-intro {\n padding: 0 1rem 1rem;\n border-bottom: 1px solid var(--store-accent-line);\n}\n\n${m} .store-footer-bar {\n width: 100%;\n border-top: 1px solid rgb(18 54 93 / 0.1);\n background: transparent;\n}\n\n${m} .store-footer {\n width: min(100%, 1613px);\n margin: 0 auto;\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 1rem;\n padding: 0.95rem 1.25rem 1.15rem;\n}\n\n${m} .footer-block {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n${m} .store-toast-stack {\n position: fixed;\n top: 1.2rem;\n right: 1.5rem;\n z-index: 10;\n display: flex;\n flex-direction: column;\n gap: 0.65rem;\n}\n\n${m} .store-toast {\n max-width: 24rem;\n padding: 0.85rem 1rem;\n border-radius: 0.9rem;\n border: 1px solid var(--store-border);\n background: #fff;\n box-shadow: 0 14px 28px rgb(16 34 56 / 0.14);\n font-size: 0.92rem;\n}\n\n${m} .store-toast.is-success {\n background: #ecfdf5;\n border-color: #bbf7d0;\n color: #166534;\n}\n\n${m} .store-toast.is-error {\n background: #fef2f2;\n border-color: #fecaca;\n color: #991b1b;\n}\n\n@media (max-width: 1440px) {\n ${m} .store-app {\n grid-template-columns: 284px minmax(0, 1fr);\n }\n}\n\n@media (max-width: 1120px) {\n ${m} .store-app {\n grid-template-columns: 1fr;\n overflow: auto;\n }\n\n ${m} .store-sidebar,\n ${m} .store-main {\n min-height: auto;\n }\n\n ${m} .store-main {\n overflow: visible;\n }\n\n ${m} .store-footer {\n grid-template-columns: 1fr;\n }\n\n ${m} .store-toast-stack {\n right: 1rem;\n left: 1rem;\n }\n}\n`;e.components=e.components||{},e.componentFns=e.componentFns||{},e.components.App=function(){const m=e.componentFns.Navbar,g=e.componentFns.Cart,p=o.getStoreState(a),b=o.getStoreHeader(p),h=a.getNotice(),y=p.searchQuery,f=o.getPaymentSources(l).filter(e=>!1!==e.enabled).length,v="items"===p.view?s.formatTitle(o.getSelectionKey(p)||"Catalog"):s.formatTitle(p.view),S=o.getPaymentSourceById(l,p.selectedPaymentSource)||null;return n("storefront-app-shell",u),t("div",{[d]:""},r({kicker:"FORGE Logistics",title:"Supply Exchange",onClose:()=>s.closeStore(),closeLabel:"Close store interface"}),h.text?t("div",{className:"store-toast-stack"},t("div",{className:"error"===h.type?"store-toast is-error":"store-toast is-success"},h.text)):null,t("div",{className:"store-app"},t("aside",{className:"store-sidebar"},t("section",{className:"module-card search-module"},t("div",{className:"module-header"},t("div",null,t("span",{className:"eyebrow"},"Search"),t("h2",{className:"section-title"},"Inventory Search")),t("span",{className:"pill"},"Live")),t("div",{className:"search-form"},t("input",{id:"store-search-input",type:"text",className:"search-input",placeholder:"Search inventory, classes, or suppliers",value:y}),t("div",{style:{display:"flex",gap:"0.65rem"}},t("button",{type:"button",className:"store-btn store-btn-primary",onClick:()=>s.applySearchQuery(document.getElementById("store-search-input")?.value||"")},"Apply Search"),t("button",{type:"button",className:"store-btn store-btn-secondary",onClick:()=>s.clearSearch()},"Clear"))),t("div",{className:"quick-tags"},(l.searchTags||[]).map(e=>t("span",{className:"quick-tag"},e)))),t("section",{className:"module-card"},t("div",{className:"module-header"},t("div",null,t("span",{className:"eyebrow"},"Filter"),t("h2",{className:"section-title"},"Procurement Filters")),t("span",{className:"pill"},l.moduleState)),t("div",{className:"filter-stack"},t("div",{className:"filter-group"},t("span",{className:"filter-label"},"Department"),t("div",{className:"filter-value"},t("span",{className:"filter-placeholder"},v))),t("div",{className:"filter-group"},t("span",{className:"filter-label"},"Availability"),t("div",{className:"filter-value"},t("span",{className:"filter-placeholder"},l.availability))),t("div",{className:"filter-group"},t("span",{className:"filter-label"},"Payment"),t("div",{className:"filter-value"},t("span",{className:"filter-placeholder"},S?S.label:"Cash")))))),t("main",{className:"store-main"},t("section",{className:"store-panel"},m(),t("div",{className:"store-panel-header"},t("div",null,t("span",{className:"eyebrow"},b.eyebrow),t("h1",{className:"section-title"},b.title)),t("span",{className:"pill"},b.badge)),t("div",{className:"store-panel-intro"},t("p",{className:"section-copy"},b.copy)),function(t){const{CategoryCard:n,SubcategoryCard:r,ProductCard:a,EmptyStateCard:c,CategoryGrid:l,SubcategoryGrid:d,ProductGrid:m,CatalogPager:u}=e.componentFns;if("weapons"===t.view||"vehicles"===t.view){const e="vehicles"===t.view?"vehicle":"weapon",n=o.getVisibleSubcategoryCards(t,i);return d(n.length>0?n.map(t=>r(t,e)):c({title:"No matching slots",copy:"Try a different search query or clear the current filter.",actionLabel:"Clear Search",onAction:()=>s.clearSearch()}))}if("items"===t.view){const e=o.getVisibleItems(t,i),n=o.getVisibleItemsPage(t,i),r=o.getCatalogPagination(t,i),l=t.cartItems.reduce((e,t)=>(e[t.code]=t.quantity,e),{}),d=String(o.getSelectionKey(t)||"").toLowerCase();return[m(t.isCatalogLoading&&t.catalogRequestKey===d&&0===e.length?c({title:"Loading inventory",copy:"Pulling live category items from the game engine."}):e.length>0?n.map(e=>a(e,l[e.code]||0)):c({title:"No category items",copy:t.searchQuery?"Your search filter excluded the live inventory returned for this category.":"The game engine did not return any items for this category yet.",actionLabel:"Clear Search",onAction:()=>s.clearSearch()})),e.length>0?u(r):null]}const g=o.getVisibleCategoryCards(t,i);return l(g.length>0?g.map(e=>n(e)):c({title:"No matching departments",copy:"Your search filter excluded every top-level department.",actionLabel:"Clear Search",onAction:()=>s.clearSearch()}))}(p)),g())),t("footer",{className:"store-footer-bar"},t("div",{className:"store-footer"},t("div",{className:"footer-block"},t("span",{className:"footer-title"},"Procurement Desk"),t("span",{className:"footer-copy"},"Authorized supply browsing for personnel loadout preparation and mission staging.")),t("div",{className:"footer-block"},t("span",{className:"footer-title"},"Catalog Scope"),t("span",{className:"footer-copy"},"Uniforms, protective gear, weapon slots, vehicles, ammunition groups, and general support inventory.")),t("div",{className:"footer-block"},t("span",{className:"footer-title"},"Purchase Access"),t("span",{className:"footer-copy"},`${c.approval} approval. ${f} payment source(s) currently available${c.orgName?` for ${c.orgName}.`:"."}`)))))}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},{h:t,ensureScopedStyle:n}=e.runtime,r=e.actions,a=e.media,o="data-ui-store-cards",s=`[${o}]`,i=`\n${s}.catalog-grid-shell {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n\n${s}.catalog-pager-shell {\n display: block;\n}\n\n${s} .catalog-grid {\n flex: 1;\n min-height: 0;\n width: 100%;\n padding: 1rem;\n display: grid;\n gap: 1rem;\n align-content: start;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n scrollbar-width: auto;\n scrollbar-color: rgb(120 136 155 / 0.9) rgb(255 255 255 / 0.45);\n}\n\n${s} .catalog-grid::-webkit-scrollbar {\n width: 12px;\n}\n\n${s} .catalog-grid::-webkit-scrollbar-track {\n background: rgb(255 255 255 / 0.45);\n border-radius: 999px;\n}\n\n${s} .catalog-grid::-webkit-scrollbar-thumb {\n background: rgb(120 136 155 / 0.9);\n border-radius: 999px;\n border: 2px solid rgb(255 255 255 / 0.45);\n}\n\n${s} .catalog-grid.is-categories,\n${s} .catalog-grid.is-products {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n${s} .catalog-grid.is-subcategories {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n${s} .card-button,\n${s} .product-card,\n${s} .empty-state {\n border: 1px solid var(--store-border);\n border-radius: 1.15rem;\n background:\n linear-gradient(180deg, rgb(255 255 255 / 0.72) 0%, rgb(226 233 239 / 0.9) 100%),\n var(--store-surface-strong);\n color: var(--store-accent);\n box-shadow:\n inset 0 1px 0 rgb(255 255 255 / 0.8),\n 0 10px 24px rgb(16 34 56 / 0.06);\n}\n\n${s} .card-button {\n min-height: 12.5rem;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 0.75rem;\n padding: 1.35rem;\n text-align: left;\n transition:\n transform 120ms ease,\n box-shadow 120ms ease,\n border-color 120ms ease;\n}\n\n${s} .card-button:hover,\n${s} .product-card:hover {\n transform: translateY(-2px);\n border-color: rgb(18 54 93 / 0.32);\n box-shadow:\n 0 16px 28px rgb(16 34 56 / 0.11),\n inset 0 1px 0 rgb(255 255 255 / 0.88);\n}\n\n${s} .card-kicker,\n${s} .product-code,\n${s} .empty-state-kicker {\n font-size: 0.72rem;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--store-text-subtle);\n}\n\n${s} .card-label {\n font-size: 1.08rem;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n${s} .card-copy,\n${s} .product-copy,\n${s} .empty-state-copy {\n margin: 0;\n color: var(--store-text-muted);\n line-height: 1.45;\n}\n\n${s} .product-copy {\n white-space: pre-line;\n}\n\n${s} .product-card {\n min-height: 15.5rem;\n padding: 0.8rem;\n display: flex;\n flex-direction: column;\n gap: 0.65rem;\n}\n\n${s} .product-image {\n height: 5.9rem;\n border-radius: 0.95rem;\n border: 1px dashed rgb(18 54 93 / 0.24);\n background: linear-gradient(135deg, rgb(235 240 245) 0%, rgb(221 228 235) 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--store-text-subtle);\n font-size: 0.78rem;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n overflow: hidden;\n}\n\n${s} .product-image-asset {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n${s} .product-meta {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n}\n\n${s} .product-name {\n font-size: 0.96rem;\n font-weight: 700;\n color: var(--store-text-main);\n line-height: 1.3;\n}\n\n${s} .product-footer {\n margin-top: auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\n\n${s} .product-price {\n font-size: 0.96rem;\n font-weight: 700;\n color: var(--store-success);\n}\n\n${s} .product-qty {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.85rem;\n height: 1.85rem;\n border-radius: 999px;\n background: var(--store-accent-soft);\n color: var(--store-accent);\n font-size: 0.76rem;\n font-weight: 700;\n}\n\n${s} .empty-state {\n padding: 1.35rem;\n display: flex;\n flex-direction: column;\n gap: 0.65rem;\n}\n\n${s} .catalog-pager {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.9rem;\n padding: 0.55rem 0.9rem 0.75rem;\n border-top: 1px solid var(--store-accent-line);\n}\n\n${s} .catalog-pager-meta {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n}\n\n${s} .catalog-pager-summary {\n font-size: 0.86rem;\n color: var(--store-text-muted);\n}\n\n${s} .catalog-pager-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n}\n\n${s} .catalog-pager-page {\n min-width: 5.75rem;\n text-align: center;\n font-size: 0.82rem;\n font-weight: 700;\n color: var(--store-accent);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n${s} .product-copy {\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n\n@media (max-width: 1440px) {\n ${s} .catalog-grid.is-categories,\n ${s} .catalog-grid.is-products {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (max-width: 1120px) {\n ${s} .catalog-grid.is-categories,\n ${s} .catalog-grid.is-subcategories,\n ${s} .catalog-grid.is-products {\n grid-template-columns: 1fr;\n }\n}\n`;function c(e,r){return n("storefront-cards",i),"is-products"===e&&a&&"function"==typeof a.scheduleTextureObservation&&a.scheduleTextureObservation(),t("div",{[o]:"",className:"catalog-grid-shell"},t("div",{className:`catalog-grid ${e}`,"data-preserve-scroll-id":"catalog-grid"},r))}e.componentFns=e.componentFns||{},e.componentFns.CategoryCard=function(e){return t("button",{type:"button",className:"card-button",onClick:()=>r.selectCategory(e.id)},t("span",{className:"card-kicker"},"Department"),t("strong",{className:"card-label"},e.label),t("p",{className:"card-copy"},"Open this department and move into staged inventory browsing."))},e.componentFns.SubcategoryCard=function(e,n){return t("button",{type:"button",className:"card-button",onClick:()=>r.selectSubcategory(e.id,n)},t("span",{className:"card-kicker"},"vehicle"===n?"Vehicle Class":"Weapon Slot"),t("strong",{className:"card-label"},e.label),t("p",{className:"card-copy"},"Open the next tier and review product previews for this selection."))},e.componentFns.ProductCard=function(e,n){const o=a&&"function"==typeof a.getTextureState?a.getTextureState(e.image):{isVisible:!0},s=a&&"function"==typeof a.getTextureSource?a.getTextureSource(e.image):"",i=function(e,t){const n=String(e||"").trim();if(!n)return t;const r=n.replace(/<\s*br\s*\/?\s*>/gi,"\n").replace(/<\/\s*p\s*>/gi,"\n").replace(/<\s*li\s*>/gi,"- ").replace(/<\/\s*li\s*>/gi,"\n"),a=document.createElement("div");return a.innerHTML=r,String(a.textContent||a.innerText||"").replace(/\u00a0/g," ").replace(/[ \t]+\n/g,"\n").replace(/\n{3,}/g,"\n\n").trim()||t}(e.description,e.className||e.code);return t("article",{className:"product-card"},t("div",{className:"product-image","data-store-texture-path":e.image||""},s?t("img",{className:"product-image-asset",src:s,alt:e.name,loading:"lazy"}):o.isVisible?"Loading Image":"Image Placeholder"),t("div",{className:"product-meta"},t("span",{className:"product-code"},e.type||e.code||e.className),t("strong",{className:"product-name"},e.name)),t("p",{className:"product-copy"},i),t("div",{className:"product-footer"},t("span",{className:"product-price"},e.price||"Pending"),t("div",{style:{display:"flex",alignItems:"center",gap:"0.55rem"}},n>0?t("span",{className:"product-qty"},n):null,t("button",{type:"button",className:"store-btn store-btn-primary",onClick:()=>r.addToCart(e)},"Add to Cart"))))},e.componentFns.EmptyStateCard=function({title:e,copy:n,actionLabel:r,onAction:a}){return t("article",{className:"empty-state"},t("span",{className:"empty-state-kicker"},"No Results"),t("strong",{className:"card-label"},e),t("p",{className:"empty-state-copy"},n),r&&"function"==typeof a?t("button",{type:"button",className:"store-btn store-btn-secondary",onClick:a},r):null)},e.componentFns.CategoryGrid=function(e){return c("is-categories",e)},e.componentFns.SubcategoryGrid=function(e){return c("is-subcategories",e)},e.componentFns.ProductGrid=function(e){return c("is-products",e)},e.componentFns.CatalogPager=function({currentPage:e,totalPages:a,startIndex:s,endIndex:c,totalItems:l}){return n("storefront-cards",i),t("div",{[o]:"",className:"catalog-pager-shell"},t("div",{className:"catalog-pager"},t("div",{className:"catalog-pager-meta"},t("span",{className:"card-kicker"},"Catalog Page"),t("span",{className:"catalog-pager-summary"},l>0?`Showing ${s}-${c} of ${l} items`:"No items available")),t("div",{className:"catalog-pager-actions"},t("button",{type:"button",className:"store-btn store-btn-secondary",disabled:e<=1,onClick:()=>r.goToPreviousCatalogPage()},"Previous"),t("span",{className:"catalog-pager-page"},`Page ${e} / ${a}`),t("button",{type:"button",className:"store-btn store-btn-secondary",disabled:e>=a,onClick:()=>r.goToNextCatalogPage(a)},"Next"))))}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},{h:t,ensureScopedStyle:n}=e.runtime,r=e.store,a=e.getters,o=e.actions,{storeConfig:s}=e.data,i="data-ui-store-cart",c=`[${i}]`,l=`\n${c} {\n position: absolute;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n}\n\n${c}.is-open {\n pointer-events: auto;\n}\n\n${c} .store-cart {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n bottom: 0.5rem;\n width: min(24rem, calc(100% - 1rem));\n transform: translateX(calc(100% + 1rem));\n transition: transform 180ms ease;\n}\n\n${c}.is-open .store-cart {\n transform: translateX(0);\n}\n\n${c} .cart-card {\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n border-radius: 1.5rem;\n border: 1px solid var(--store-border);\n background: linear-gradient(180deg, var(--store-surface) 0%, var(--store-surface-alt) 100%);\n box-shadow:\n 0 18px 40px rgb(11 27 46 / 0.16),\n 0 4px 12px rgb(11 27 46 / 0.08);\n}\n\n${c} .cart-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n${c} .cart-close {\n min-width: 2.1rem;\n height: 2.1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border-radius: 0.6rem;\n border: 1px solid var(--store-border-strong);\n background: rgb(255 255 255 / 0.78);\n color: var(--store-accent);\n font-size: 0.92rem;\n font-weight: 800;\n line-height: 1;\n box-shadow: 0 6px 16px rgb(18 54 93 / 0.08);\n}\n\n${c} .cart-close:hover {\n background: var(--store-accent-soft);\n border-color: rgb(18 54 93 / 0.24);\n color: var(--store-accent);\n}\n\n${c} .cart-close:focus-visible {\n outline: 2px solid rgb(18 54 93 / 0.25);\n}\n\n${c} .cart-status,\n${c} .cart-kpi-card,\n${c} .cart-line {\n border-radius: 0.95rem;\n background: rgb(255 255 255 / 0.58);\n border: 1px solid var(--store-border);\n}\n\n${c} .cart-status,\n${c} .cart-kpi-card,\n${c} .cart-line {\n padding: 0.95rem;\n}\n\n${c} .cart-kpi {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 0.75rem;\n}\n\n${c} .kpi-label {\n display: block;\n margin-bottom: 0.3rem;\n font-size: 0.68rem;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--store-text-subtle);\n}\n\n${c} .kpi-value {\n font-size: 1rem;\n font-weight: 700;\n}\n\n${c} .cart-lines {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n scrollbar-width: auto;\n scrollbar-color: rgb(120 136 155 / 0.9) rgb(255 255 255 / 0.55);\n}\n\n${c} .cart-lines::-webkit-scrollbar {\n width: 12px;\n}\n\n${c} .cart-lines::-webkit-scrollbar-track {\n background: rgb(255 255 255 / 0.55);\n border-radius: 999px;\n}\n\n${c} .cart-lines::-webkit-scrollbar-thumb {\n background: rgb(120 136 155 / 0.9);\n border-radius: 999px;\n border: 2px solid rgb(255 255 255 / 0.55);\n}\n\n${c} .cart-line {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n${c} .cart-line-copy {\n min-width: 0;\n display: grid;\n gap: 0.18rem;\n}\n\n${c} .cart-line-top,\n${c} .cart-line-controls,\n${c} .summary-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\n\n${c} .cart-line-title {\n font-size: 0.92rem;\n font-weight: 700;\n line-height: 1.32;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n${c} .qty-controls {\n display: inline-flex;\n align-items: center;\n gap: 0.45rem;\n}\n\n${c} .qty-badge {\n min-width: 1.9rem;\n text-align: center;\n font-weight: 700;\n}\n\n${c} .qty-btn,\n${c} .remove-btn {\n min-width: 2rem;\n height: 2rem;\n padding: 0 0.65rem;\n}\n\n${c} .cart-summary {\n padding-top: 0.25rem;\n border-top: 1px solid var(--store-accent-line);\n display: grid;\n gap: 0.7rem;\n}\n\n${c} .payment-source-field {\n display: grid;\n gap: 0.65rem;\n}\n\n${c} .payment-source-select {\n width: 100%;\n min-height: 2.9rem;\n padding: 0 0.95rem;\n border-radius: 0.8rem;\n border: 1px solid var(--store-border);\n background: rgb(255 255 255 / 0.78);\n color: var(--store-text-main);\n}\n\n${c} .payment-source-meta,\n${c} .payment-source-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\n\n${c} .payment-source-meta {\n padding: 0.85rem 0.9rem;\n border-radius: 0.95rem;\n border: 1px solid var(--store-border);\n background: rgb(255 255 255 / 0.44);\n}\n\n${c} .payment-source-detail {\n margin: 0.2rem 0 0;\n font-size: 0.82rem;\n line-height: 1.4;\n color: var(--store-text-muted);\n}\n\n${c} .payment-source-label {\n font-weight: 700;\n color: var(--store-text-main);\n}\n\n${c} .payment-source-balance {\n font-weight: 700;\n color: var(--store-success);\n}\n\n${c} .payment-source-state {\n font-size: 0.7rem;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: var(--store-text-subtle);\n}\n\n${c} .summary-row.total {\n font-size: 1rem;\n font-weight: 700;\n}\n\n${c} .summary-label,\n${c} .cart-line-meta {\n color: var(--store-text-muted);\n}\n\n${c} .summary-value {\n font-weight: 700;\n}\n\n${c} .summary-actions {\n display: grid;\n gap: 0.65rem;\n}\n\n${c} .cart-empty {\n padding: 1rem;\n border-radius: 0.95rem;\n border: 1px dashed var(--store-border);\n color: var(--store-text-muted);\n background: rgb(255 255 255 / 0.38);\n}\n\n@media (max-width: 1120px) {\n ${c} .store-cart {\n top: 0;\n right: 0;\n bottom: 0;\n width: min(24rem, 100%);\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.Cart=function(){const e=a.getStoreState(r),c=a.summarizeCart(e.cartItems),d=a.getPaymentSources(s),m=a.getPaymentSourceById(s,e.selectedPaymentSource)||d[0]||null,u=d.filter(e=>!1!==e.enabled).length,g=m?m.label:"Unavailable",p=m?Number(m.balance||0):0,b=Math.max(0,p-c.total);return n("storefront-cart",l),t("div",{className:e.cartOpen?"is-open":"",[i]:"","aria-hidden":e.cartOpen?"false":"true"},t("aside",{className:"store-cart"},t("section",{className:"cart-card"},t("div",{className:"cart-header"},t("div",null,t("span",{className:"eyebrow"},"Cart"),t("h2",{className:"section-title"},"Acquisition Queue")),t("button",{type:"button",className:"cart-close","aria-label":"Close cart",title:"Close cart",onClick:()=>o.closeCart()},"X")),t("div",{className:"cart-kpi"},t("div",{className:"cart-kpi-card"},t("span",{className:"kpi-label"},"Items"),t("span",{className:"kpi-value"},c.lineCount)),t("div",{className:"cart-kpi-card"},t("span",{className:"kpi-label"},"Payment"),t("span",{className:"kpi-value"},g))),t("div",{className:"cart-status"},t("span",{className:"eyebrow"},"Payment Source"),t("div",{className:"payment-source-field"},t("select",{className:"payment-source-select",value:e.selectedPaymentSource,onChange:e=>o.selectPaymentSource(e.target.value)},d.map(e=>t("option",{value:e.id,disabled:!1===e.enabled},!1===e.enabled?`${e.label} (Locked)`:e.label))),m?t("div",{className:"payment-source-meta"},t("div",null,t("div",{className:"payment-source-row"},t("span",{className:"payment-source-label"},m.label),t("span",{className:"payment-source-balance"},a.formatCurrency(m.balance))),t("p",{className:"payment-source-detail"},m.detail)),t("span",{className:"payment-source-state"},u>0?!1===m.enabled?"Locked":"Available":"Unavailable")):null)),t("div",{className:"cart-lines","data-preserve-scroll-id":"cart-lines"},c.lineCount>0?e.cartItems.map(e=>t("div",{className:"cart-line"},t("div",{className:"cart-line-top"},t("div",{className:"cart-line-copy"},t("div",{className:"cart-line-title"},e.name)),t("strong",null,a.formatCurrency(a.parsePrice(e.price)*e.quantity))),t("div",{className:"cart-line-controls"},t("div",{className:"qty-controls"},t("button",{type:"button",className:"store-btn store-btn-secondary qty-btn",onClick:()=>o.decrementCartItem(e.code)},"-"),t("span",{className:"qty-badge"},e.quantity),t("button",{type:"button",className:"store-btn store-btn-secondary qty-btn",onClick:()=>o.incrementCartItem(e.code)},"+")),t("button",{type:"button",className:"store-btn store-btn-secondary remove-btn",onClick:()=>o.removeCartItem(e.code)},"Remove")))):t("div",{className:"cart-empty"},"No items are queued yet. Add products from the catalog to build a checkout payload.")),t("div",{className:"cart-summary"},t("div",{className:"summary-row"},t("span",{className:"summary-label"},"Items"),t("span",{className:"summary-value"},c.itemCount)),t("div",{className:"summary-row"},t("span",{className:"summary-label"},"Subtotal"),t("span",{className:"summary-value"},a.formatCurrency(c.subtotal))),t("div",{className:"summary-row"},t("span",{className:"summary-label"},"Remaining Source"),t("span",{className:"summary-value"},a.formatCurrency(b))),t("div",{className:"summary-row total"},t("span",{className:"summary-label"},"Total"),t("span",{className:"summary-value"},a.formatCurrency(c.total)))),t("div",{className:"summary-actions"},t("button",{type:"button",className:"store-btn store-btn-primary",disabled:0===c.lineCount||e.isCheckingOut,onClick:()=>o.requestCheckout()},e.isCheckingOut?"Submitting Request...":"Submit Checkout")))))}}(),function(){const e=window.StorefrontApp=window.StorefrontApp||{},{h:t,ensureScopedStyle:n}=e.runtime,r=e.getters,a=e.store,o=e.actions,s="data-ui-store-navbar",i=`[${s}]`,c=`\n${i} {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.9rem 1rem;\n margin-bottom: 0.95rem;\n border-bottom: 1px solid var(--store-accent-line);\n background:\n linear-gradient(180deg, rgb(255 255 255 / 0.52) 0%, transparent 100%),\n linear-gradient(180deg, rgb(236 241 246 / 0.52) 0%, rgb(245 243 239 / 0.2) 100%);\n}\n\n${i} .store-breadcrumbs {\n display: flex;\n align-items: center;\n gap: 0.55rem;\n min-width: 0;\n flex-wrap: wrap;\n}\n\n${i} .breadcrumb-link,\n${i} .breadcrumb-current,\n${i} .breadcrumb-separator {\n font-size: 0.78rem;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n font-weight: 700;\n}\n\n${i} .breadcrumb-link {\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--store-text-subtle);\n}\n\n${i} .breadcrumb-link:hover {\n color: var(--store-accent);\n}\n\n${i} .breadcrumb-current {\n color: var(--store-accent);\n}\n\n${i} .breadcrumb-separator {\n color: rgb(124 138 155 / 0.72);\n}\n\n${i} .store-cart-btn {\n position: relative;\n width: 2.6rem;\n height: 2.6rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n border-radius: 0.7rem;\n border: 1px solid var(--store-border-strong);\n background: rgb(255 255 255 / 0.68);\n color: var(--store-accent);\n box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.75);\n}\n\n${i} .store-cart-btn:hover {\n background: rgb(219 231 243 / 0.88);\n}\n\n${i} .cart-toggle-icon {\n position: relative;\n width: 0.95rem;\n height: 0.8rem;\n border: 1.5px solid currentColor;\n border-radius: 0.16rem 0.16rem 0.24rem 0.24rem;\n}\n\n${i} .cart-toggle-icon::before {\n content: "";\n position: absolute;\n top: -0.34rem;\n left: 0.2rem;\n width: 0.5rem;\n height: 0.3rem;\n border: 1.5px solid currentColor;\n border-bottom: 0;\n border-radius: 0.35rem 0.35rem 0 0;\n}\n\n${i} .cart-count {\n position: absolute;\n top: -0.35rem;\n right: -0.35rem;\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 0.3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 999px;\n background: var(--store-accent);\n color: #fff;\n font-size: 0.68rem;\n font-weight: 700;\n}\n\n@media (max-width: 1120px) {\n ${i} {\n align-items: flex-start;\n }\n}\n`;e.componentFns=e.componentFns||{},e.componentFns.Navbar=function(){const e=r.getStoreState(a),i=r.getStoreBreadcrumbs(e),l=r.summarizeCart(e.cartItems);return n("storefront-navbar",c),t("nav",{[s]:""},t("div",{className:"store-breadcrumbs","aria-label":"Store navigation"},i.map((e,n)=>n===i.length-1?t("span",{className:"breadcrumb-current"},e.label):[t("button",{type:"button",className:"breadcrumb-link",onClick:()=>o.navigateToBreadcrumb(e.id)},e.label),t("span",{className:"breadcrumb-separator"},"/")])),t("button",{type:"button",className:"store-cart-btn",onClick:()=>o.toggleCart(),title:e.cartOpen?"Close cart":"Open cart","aria-label":e.cartOpen?"Close cart":"Open cart"},t("span",{className:"cart-toggle-icon","aria-hidden":"true"}),l.itemCount>0?t("span",{className:"cart-count"},l.itemCount):null))}}(),function(){const e=window.ForgeWebUI,t=window.StorefrontApp;e.createApp({name:"store",root:"#app",setup({root:n}){e.mount(n,()=>t.components.App(),{preserveScroll:!1}),t.bridge&&t.bridge.notifyReady()}}).start()}(); \ No newline at end of file diff --git a/arma/client/addons/store/ui/src/bootstrap.js b/arma/client/addons/store/ui/src/bootstrap.js new file mode 100644 index 0000000..fe6082f --- /dev/null +++ b/arma/client/addons/store/ui/src/bootstrap.js @@ -0,0 +1,19 @@ +(function () { + const ForgeWebUI = window.ForgeWebUI; + const StorefrontApp = window.StorefrontApp; + const app = ForgeWebUI.createApp({ + name: "store", + root: "#app", + setup({ root }) { + ForgeWebUI.mount(root, () => StorefrontApp.components.App(), { + preserveScroll: false, + }); + + if (StorefrontApp.bridge) { + StorefrontApp.bridge.notifyReady(); + } + }, + }); + + app.start(); +})(); diff --git a/arma/client/addons/store/ui/src/bridge.js b/arma/client/addons/store/ui/src/bridge.js new file mode 100644 index 0000000..a38aa92 --- /dev/null +++ b/arma/client/addons/store/ui/src/bridge.js @@ -0,0 +1,81 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const store = StorefrontApp.store; + const bridge = window.ForgeWebUI.createBridge({ + closeEvent: "store::close", + globalName: "StoreUIBridge", + readyEvent: "store::ready", + }); + + function requestClose() { + return bridge.close({}); + } + + function requestCheckout(payload) { + return bridge.send("store::checkout::request", payload); + } + + function requestCategory(payload) { + return bridge.send("store::category::request", payload); + } + + function notifyReady() { + return bridge.ready({ loaded: true }); + } + + bridge.on("store::hydrate", (payloadData) => { + StorefrontApp.data.applyHydratePayload(payloadData); + store.hydrateFromPayload(payloadData); + }); + + bridge.on("store::config::hydrate", (payloadData) => { + StorefrontApp.data.applyHydratePayload(payloadData); + store.hydrateStoreConfig(payloadData); + }); + + bridge.on("store::checkout::success", (payloadData) => { + store.setIsCheckingOut(false); + store.setCartItems([]); + store.setCartOpen(false); + if (StorefrontApp.actions) { + StorefrontApp.actions.showNotice( + "success", + payloadData.message || "Checkout completed.", + ); + } + }); + + bridge.on("store::category::hydrate", (payloadData) => { + store.hydrateCategoryItems(payloadData); + }); + + bridge.on("store::category::failure", (payloadData) => { + store.finishCategoryRequest(payloadData.category || ""); + if (StorefrontApp.actions) { + StorefrontApp.actions.showNotice( + "error", + payloadData.message || "Category request failed.", + ); + } + }); + + bridge.on("store::checkout::failure", (payloadData) => { + store.setIsCheckingOut(false); + if (StorefrontApp.actions) { + StorefrontApp.actions.showNotice( + "error", + payloadData.message || "Checkout failed.", + ); + } + }); + + StorefrontApp.bridge = { + close: bridge.close, + requestClose, + requestCheckout, + requestCategory, + notifyReady, + receive: bridge.receive, + sendEvent: bridge.send, + }; +})(); diff --git a/arma/client/addons/store/ui/src/components/AppShell.js b/arma/client/addons/store/ui/src/components/AppShell.js new file mode 100644 index 0000000..810a7e5 --- /dev/null +++ b/arma/client/addons/store/ui/src/components/AppShell.js @@ -0,0 +1,669 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const { h, ensureScopedStyle } = StorefrontApp.runtime; + const WindowTitleBar = window.SharedUI.componentFns.WindowTitleBar; + const store = StorefrontApp.store; + const getters = StorefrontApp.getters; + const actions = StorefrontApp.actions; + const { catalog, session, storeConfig } = StorefrontApp.data; + const scopeAttr = "data-ui-store-app-shell"; + const scopeSelector = `[${scopeAttr}]`; + const appShellCss = ` +${scopeSelector} { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + overflow: hidden; + background: var(--store-shell-bg); +} + +${scopeSelector} .footer-title, +${scopeSelector} .eyebrow { + font-size: 0.68rem; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--store-text-subtle); + font-weight: 700; +} + +${scopeSelector} .module-header, +${scopeSelector} .store-panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +${scopeSelector} .store-app { + flex: 1; + min-height: 0; + width: min(100%, 1613px); + margin: 0 auto; + display: grid; + grid-template-columns: 308px minmax(0, 1fr); + gap: 1.25rem; + padding: 1.25rem; +} + +${scopeSelector} .store-sidebar, +${scopeSelector} .store-main { + min-height: 0; + display: flex; + flex-direction: column; + gap: 1rem; +} + +${scopeSelector} .store-main { + position: relative; + overflow: hidden; +} + +${scopeSelector} .module-card, +${scopeSelector} .store-panel { + background: linear-gradient(180deg, var(--store-surface) 0%, var(--store-surface-alt) 100%); + border: 1px solid var(--store-border); + border-radius: 1.35rem; +} + +${scopeSelector} .module-card { + padding: 1rem; +} + +${scopeSelector} .store-panel { + min-height: 0; + flex: 1 1 auto; + display: flex; + flex-direction: column; + width: min(100%, 1280px); + overflow: hidden; +} + +${scopeSelector} .module-header { + margin-bottom: 0.85rem; +} + +${scopeSelector} .store-panel-header { + padding: 1rem 1rem 0; +} + +${scopeSelector} .section-title { + margin: 0; + font-size: 1.1rem; + font-weight: 700; + letter-spacing: -0.02em; + color: var(--store-text-main); +} + +${scopeSelector} .section-copy, +${scopeSelector} .footer-copy { + margin: 0.2rem 0 0; + font-size: 0.9rem; + line-height: 1.45; + color: var(--store-text-muted); +} + +${scopeSelector} .pill { + padding: 0.48rem 0.8rem; + border-radius: 999px; + background: var(--store-accent-soft); + color: var(--store-accent); + font-size: 0.74rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +${scopeSelector} .search-module { + display: flex; + flex-direction: column; + gap: 0.8rem; +} + +${scopeSelector} .search-form { + display: grid; + gap: 0.7rem; +} + +${scopeSelector} .search-input { + width: 100%; + height: 2.9rem; + padding: 0 0.95rem; + border-radius: 0.8rem; + border: 1px solid var(--store-border); + background: rgb(255 255 255 / 0.75); + color: var(--store-text-main); +} + +${scopeSelector} .quick-tags { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +${scopeSelector} .quick-tag { + padding: 0.55rem 0.72rem; + border-radius: 999px; + border: 1px solid var(--store-border); + background: rgb(255 255 255 / 0.52); + color: var(--store-text-muted); + font-size: 0.75rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +${scopeSelector} .filter-stack { + display: grid; + gap: 0.85rem; +} + +${scopeSelector} .filter-group { + padding: 0.95rem; + border-radius: 0.8rem; + background: rgb(255 255 255 / 0.48); + border: 1px solid var(--store-border); +} + +${scopeSelector} .filter-label { + display: block; + margin-bottom: 0.55rem; + font-size: 0.72rem; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--store-text-subtle); + font-weight: 700; +} + +${scopeSelector} .filter-value { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + color: var(--store-text-main); + font-size: 0.92rem; + font-weight: 600; +} + +${scopeSelector} .filter-placeholder { + color: var(--store-text-muted); + font-weight: 500; +} + +${scopeSelector} .store-panel-intro { + padding: 0 1rem 1rem; + border-bottom: 1px solid var(--store-accent-line); +} + +${scopeSelector} .store-footer-bar { + width: 100%; + border-top: 1px solid rgb(18 54 93 / 0.1); + background: transparent; +} + +${scopeSelector} .store-footer { + width: min(100%, 1613px); + margin: 0 auto; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + padding: 0.95rem 1.25rem 1.15rem; +} + +${scopeSelector} .footer-block { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +${scopeSelector} .store-toast-stack { + position: fixed; + top: 1.2rem; + right: 1.5rem; + z-index: 10; + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +${scopeSelector} .store-toast { + max-width: 24rem; + padding: 0.85rem 1rem; + border-radius: 0.9rem; + border: 1px solid var(--store-border); + background: #fff; + box-shadow: 0 14px 28px rgb(16 34 56 / 0.14); + font-size: 0.92rem; +} + +${scopeSelector} .store-toast.is-success { + background: #ecfdf5; + border-color: #bbf7d0; + color: #166534; +} + +${scopeSelector} .store-toast.is-error { + background: #fef2f2; + border-color: #fecaca; + color: #991b1b; +} + +@media (max-width: 1440px) { + ${scopeSelector} .store-app { + grid-template-columns: 284px minmax(0, 1fr); + } +} + +@media (max-width: 1120px) { + ${scopeSelector} .store-app { + grid-template-columns: 1fr; + overflow: auto; + } + + ${scopeSelector} .store-sidebar, + ${scopeSelector} .store-main { + min-height: auto; + } + + ${scopeSelector} .store-main { + overflow: visible; + } + + ${scopeSelector} .store-footer { + grid-template-columns: 1fr; + } + + ${scopeSelector} .store-toast-stack { + right: 1rem; + left: 1rem; + } +} +`; + + StorefrontApp.components = StorefrontApp.components || {}; + StorefrontApp.componentFns = StorefrontApp.componentFns || {}; + + function renderStoreBody(state) { + const { + CategoryCard, + SubcategoryCard, + ProductCard, + EmptyStateCard, + CategoryGrid, + SubcategoryGrid, + ProductGrid, + CatalogPager, + } = StorefrontApp.componentFns; + + if (state.view === "weapons" || state.view === "vehicles") { + const slotType = state.view === "vehicles" ? "vehicle" : "weapon"; + const items = getters.getVisibleSubcategoryCards(state, catalog); + + return SubcategoryGrid( + items.length > 0 + ? items.map((category) => + SubcategoryCard(category, slotType), + ) + : EmptyStateCard({ + title: "No matching slots", + copy: "Try a different search query or clear the current filter.", + actionLabel: "Clear Search", + onAction: () => actions.clearSearch(), + }), + ); + } + + if (state.view === "items") { + const items = getters.getVisibleItems(state, catalog); + const pagedItems = getters.getVisibleItemsPage(state, catalog); + const pagination = getters.getCatalogPagination(state, catalog); + const quantityByCode = state.cartItems.reduce((acc, item) => { + acc[item.code] = item.quantity; + return acc; + }, {}); + const selectionKey = String( + getters.getSelectionKey(state) || "", + ).toLowerCase(); + + return [ + ProductGrid( + state.isCatalogLoading && + state.catalogRequestKey === selectionKey && + items.length === 0 + ? EmptyStateCard({ + title: "Loading inventory", + copy: "Pulling live category items from the game engine.", + }) + : items.length > 0 + ? pagedItems.map((item) => + ProductCard( + item, + quantityByCode[item.code] || 0, + ), + ) + : EmptyStateCard({ + title: "No category items", + copy: state.searchQuery + ? "Your search filter excluded the live inventory returned for this category." + : "The game engine did not return any items for this category yet.", + actionLabel: "Clear Search", + onAction: () => actions.clearSearch(), + }), + ), + items.length > 0 ? CatalogPager(pagination) : null, + ]; + } + + const items = getters.getVisibleCategoryCards(state, catalog); + return CategoryGrid( + items.length > 0 + ? items.map((category) => CategoryCard(category)) + : EmptyStateCard({ + title: "No matching departments", + copy: "Your search filter excluded every top-level department.", + actionLabel: "Clear Search", + onAction: () => actions.clearSearch(), + }), + ); + } + + StorefrontApp.components.App = function App() { + const Navbar = StorefrontApp.componentFns.Navbar; + const Cart = StorefrontApp.componentFns.Cart; + const state = getters.getStoreState(store); + const header = getters.getStoreHeader(state); + const notice = store.getNotice(); + const activeQuery = state.searchQuery; + const paymentSources = getters.getPaymentSources(storeConfig); + const availablePaymentSourceCount = paymentSources.filter( + (source) => source.enabled !== false, + ).length; + const filterDepartment = + state.view === "items" + ? actions.formatTitle( + getters.getSelectionKey(state) || "Catalog", + ) + : actions.formatTitle(state.view); + const selectedPaymentSource = + getters.getPaymentSourceById( + storeConfig, + state.selectedPaymentSource, + ) || null; + + ensureScopedStyle("storefront-app-shell", appShellCss); + + return h( + "div", + { [scopeAttr]: "" }, + WindowTitleBar({ + kicker: "FORGE Logistics", + title: "Supply Exchange", + onClose: () => actions.closeStore(), + closeLabel: "Close store interface", + }), + notice.text + ? h( + "div", + { className: "store-toast-stack" }, + h( + "div", + { + className: + notice.type === "error" + ? "store-toast is-error" + : "store-toast is-success", + }, + notice.text, + ), + ) + : null, + h( + "div", + { className: "store-app" }, + h( + "aside", + { className: "store-sidebar" }, + h( + "section", + { className: "module-card search-module" }, + h( + "div", + { className: "module-header" }, + h( + "div", + null, + h("span", { className: "eyebrow" }, "Search"), + h( + "h2", + { className: "section-title" }, + "Inventory Search", + ), + ), + h("span", { className: "pill" }, "Live"), + ), + h( + "div", + { className: "search-form" }, + h("input", { + id: "store-search-input", + type: "text", + className: "search-input", + placeholder: + "Search inventory, classes, or suppliers", + value: activeQuery, + }), + h( + "div", + { + style: { + display: "flex", + gap: "0.65rem", + }, + }, + h( + "button", + { + type: "button", + className: + "store-btn store-btn-primary", + onClick: () => + actions.applySearchQuery( + document.getElementById( + "store-search-input", + )?.value || "", + ), + }, + "Apply Search", + ), + h( + "button", + { + type: "button", + className: + "store-btn store-btn-secondary", + onClick: () => actions.clearSearch(), + }, + "Clear", + ), + ), + ), + h( + "div", + { className: "quick-tags" }, + (storeConfig.searchTags || []).map((tag) => + h("span", { className: "quick-tag" }, tag), + ), + ), + ), + h( + "section", + { className: "module-card" }, + h( + "div", + { className: "module-header" }, + h( + "div", + null, + h("span", { className: "eyebrow" }, "Filter"), + h( + "h2", + { className: "section-title" }, + "Procurement Filters", + ), + ), + h( + "span", + { className: "pill" }, + storeConfig.moduleState, + ), + ), + h( + "div", + { className: "filter-stack" }, + h( + "div", + { className: "filter-group" }, + h( + "span", + { className: "filter-label" }, + "Department", + ), + h( + "div", + { className: "filter-value" }, + h( + "span", + { className: "filter-placeholder" }, + filterDepartment, + ), + ), + ), + h( + "div", + { className: "filter-group" }, + h( + "span", + { className: "filter-label" }, + "Availability", + ), + h( + "div", + { className: "filter-value" }, + h( + "span", + { className: "filter-placeholder" }, + storeConfig.availability, + ), + ), + ), + h( + "div", + { className: "filter-group" }, + h( + "span", + { className: "filter-label" }, + "Payment", + ), + h( + "div", + { className: "filter-value" }, + h( + "span", + { className: "filter-placeholder" }, + selectedPaymentSource + ? selectedPaymentSource.label + : "Cash", + ), + ), + ), + ), + ), + ), + h( + "main", + { className: "store-main" }, + h( + "section", + { className: "store-panel" }, + Navbar(), + h( + "div", + { className: "store-panel-header" }, + h( + "div", + null, + h( + "span", + { className: "eyebrow" }, + header.eyebrow, + ), + h( + "h1", + { className: "section-title" }, + header.title, + ), + ), + h("span", { className: "pill" }, header.badge), + ), + h( + "div", + { className: "store-panel-intro" }, + h("p", { className: "section-copy" }, header.copy), + ), + renderStoreBody(state), + ), + Cart(), + ), + ), + h( + "footer", + { className: "store-footer-bar" }, + h( + "div", + { className: "store-footer" }, + h( + "div", + { className: "footer-block" }, + h( + "span", + { className: "footer-title" }, + "Procurement Desk", + ), + h( + "span", + { className: "footer-copy" }, + "Authorized supply browsing for personnel loadout preparation and mission staging.", + ), + ), + h( + "div", + { className: "footer-block" }, + h( + "span", + { className: "footer-title" }, + "Catalog Scope", + ), + h( + "span", + { className: "footer-copy" }, + "Uniforms, protective gear, weapon slots, vehicles, ammunition groups, and general support inventory.", + ), + ), + h( + "div", + { className: "footer-block" }, + h( + "span", + { className: "footer-title" }, + "Purchase Access", + ), + h( + "span", + { className: "footer-copy" }, + `${session.approval} approval. ${availablePaymentSourceCount} payment source(s) currently available${session.orgName ? ` for ${session.orgName}.` : "."}`, + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/store/ui/src/components/cards.js b/arma/client/addons/store/ui/src/components/cards.js new file mode 100644 index 0000000..fecf0cd --- /dev/null +++ b/arma/client/addons/store/ui/src/components/cards.js @@ -0,0 +1,546 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const { h, ensureScopedStyle } = StorefrontApp.runtime; + const actions = StorefrontApp.actions; + const media = StorefrontApp.media; + const scopeAttr = "data-ui-store-cards"; + const scopeSelector = `[${scopeAttr}]`; + const cardsCss = ` +${scopeSelector}.catalog-grid-shell { + flex: 1; + min-height: 0; + display: flex; +} + +${scopeSelector}.catalog-pager-shell { + display: block; +} + +${scopeSelector} .catalog-grid { + flex: 1; + min-height: 0; + width: 100%; + padding: 1rem; + display: grid; + gap: 1rem; + align-content: start; + overflow-y: auto; + overflow-x: hidden; + scrollbar-gutter: stable; + scrollbar-width: auto; + scrollbar-color: rgb(120 136 155 / 0.9) rgb(255 255 255 / 0.45); +} + +${scopeSelector} .catalog-grid::-webkit-scrollbar { + width: 12px; +} + +${scopeSelector} .catalog-grid::-webkit-scrollbar-track { + background: rgb(255 255 255 / 0.45); + border-radius: 999px; +} + +${scopeSelector} .catalog-grid::-webkit-scrollbar-thumb { + background: rgb(120 136 155 / 0.9); + border-radius: 999px; + border: 2px solid rgb(255 255 255 / 0.45); +} + +${scopeSelector} .catalog-grid.is-categories, +${scopeSelector} .catalog-grid.is-products { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +${scopeSelector} .catalog-grid.is-subcategories { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +${scopeSelector} .card-button, +${scopeSelector} .product-card, +${scopeSelector} .empty-state { + border: 1px solid var(--store-border); + border-radius: 1.15rem; + background: + linear-gradient(180deg, rgb(255 255 255 / 0.72) 0%, rgb(226 233 239 / 0.9) 100%), + var(--store-surface-strong); + color: var(--store-accent); + box-shadow: + inset 0 1px 0 rgb(255 255 255 / 0.8), + 0 10px 24px rgb(16 34 56 / 0.06); +} + +${scopeSelector} .card-button { + min-height: 12.5rem; + display: flex; + flex-direction: column; + justify-content: center; + gap: 0.75rem; + padding: 1.35rem; + text-align: left; + transition: + transform 120ms ease, + box-shadow 120ms ease, + border-color 120ms ease; +} + +${scopeSelector} .card-button:hover, +${scopeSelector} .product-card:hover { + transform: translateY(-2px); + border-color: rgb(18 54 93 / 0.32); + box-shadow: + 0 16px 28px rgb(16 34 56 / 0.11), + inset 0 1px 0 rgb(255 255 255 / 0.88); +} + +${scopeSelector} .card-kicker, +${scopeSelector} .product-code, +${scopeSelector} .empty-state-kicker { + font-size: 0.72rem; + letter-spacing: 0.14em; + text-transform: uppercase; + font-weight: 700; + color: var(--store-text-subtle); +} + +${scopeSelector} .card-label { + font-size: 1.08rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +${scopeSelector} .card-copy, +${scopeSelector} .product-copy, +${scopeSelector} .empty-state-copy { + margin: 0; + color: var(--store-text-muted); + line-height: 1.45; +} + +${scopeSelector} .product-copy { + white-space: pre-line; +} + +${scopeSelector} .product-card { + min-height: 15.5rem; + padding: 0.8rem; + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +${scopeSelector} .product-image { + height: 5.9rem; + border-radius: 0.95rem; + border: 1px dashed rgb(18 54 93 / 0.24); + background: linear-gradient(135deg, rgb(235 240 245) 0%, rgb(221 228 235) 100%); + display: flex; + align-items: center; + justify-content: center; + color: var(--store-text-subtle); + font-size: 0.78rem; + letter-spacing: 0.16em; + text-transform: uppercase; + overflow: hidden; +} + +${scopeSelector} .product-image-asset { + width: 100%; + height: 100%; + object-fit: contain; +} + +${scopeSelector} .product-meta { + display: flex; + flex-direction: column; + gap: 0.2rem; +} + +${scopeSelector} .product-name { + font-size: 0.96rem; + font-weight: 700; + color: var(--store-text-main); + line-height: 1.3; +} + +${scopeSelector} .product-footer { + margin-top: auto; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +${scopeSelector} .product-price { + font-size: 0.96rem; + font-weight: 700; + color: var(--store-success); +} + +${scopeSelector} .product-qty { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.85rem; + height: 1.85rem; + border-radius: 999px; + background: var(--store-accent-soft); + color: var(--store-accent); + font-size: 0.76rem; + font-weight: 700; +} + +${scopeSelector} .empty-state { + padding: 1.35rem; + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +${scopeSelector} .catalog-pager { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.9rem; + padding: 0.55rem 0.9rem 0.75rem; + border-top: 1px solid var(--store-accent-line); +} + +${scopeSelector} .catalog-pager-meta { + display: flex; + flex-direction: column; + gap: 0.15rem; +} + +${scopeSelector} .catalog-pager-summary { + font-size: 0.86rem; + color: var(--store-text-muted); +} + +${scopeSelector} .catalog-pager-actions { + display: inline-flex; + align-items: center; + gap: 0.6rem; +} + +${scopeSelector} .catalog-pager-page { + min-width: 5.75rem; + text-align: center; + font-size: 0.82rem; + font-weight: 700; + color: var(--store-accent); + letter-spacing: 0.08em; + text-transform: uppercase; +} + +${scopeSelector} .product-copy { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +@media (max-width: 1440px) { + ${scopeSelector} .catalog-grid.is-categories, + ${scopeSelector} .catalog-grid.is-products { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 1120px) { + ${scopeSelector} .catalog-grid.is-categories, + ${scopeSelector} .catalog-grid.is-subcategories, + ${scopeSelector} .catalog-grid.is-products { + grid-template-columns: 1fr; + } +} +`; + + StorefrontApp.componentFns = StorefrontApp.componentFns || {}; + + function createGrid(className, children) { + ensureScopedStyle("storefront-cards", cardsCss); + + if ( + className === "is-products" && + media && + typeof media.scheduleTextureObservation === "function" + ) { + media.scheduleTextureObservation(); + } + + return h( + "div", + { + [scopeAttr]: "", + className: "catalog-grid-shell", + }, + h( + "div", + { + className: `catalog-grid ${className}`, + "data-preserve-scroll-id": "catalog-grid", + }, + children, + ), + ); + } + + function formatDescription(description, fallbackValue) { + const rawDescription = String(description || "").trim(); + if (!rawDescription) { + return fallbackValue; + } + + const htmlDescription = rawDescription + .replace(/<\s*br\s*\/?\s*>/gi, "\n") + .replace(/<\/\s*p\s*>/gi, "\n") + .replace(/<\s*li\s*>/gi, "- ") + .replace(/<\/\s*li\s*>/gi, "\n"); + const scratch = document.createElement("div"); + scratch.innerHTML = htmlDescription; + + const textDescription = String( + scratch.textContent || scratch.innerText || "", + ) + .replace(/\u00a0/g, " ") + .replace(/[ \t]+\n/g, "\n") + .replace(/\n{3,}/g, "\n\n") + .trim(); + + return textDescription || fallbackValue; + } + + StorefrontApp.componentFns.CategoryCard = function CategoryCard(category) { + return h( + "button", + { + type: "button", + className: "card-button", + onClick: () => actions.selectCategory(category.id), + }, + h("span", { className: "card-kicker" }, "Department"), + h("strong", { className: "card-label" }, category.label), + h( + "p", + { className: "card-copy" }, + "Open this department and move into staged inventory browsing.", + ), + ); + }; + + StorefrontApp.componentFns.SubcategoryCard = function SubcategoryCard( + category, + slotType, + ) { + return h( + "button", + { + type: "button", + className: "card-button", + onClick: () => actions.selectSubcategory(category.id, slotType), + }, + h( + "span", + { className: "card-kicker" }, + slotType === "vehicle" ? "Vehicle Class" : "Weapon Slot", + ), + h("strong", { className: "card-label" }, category.label), + h( + "p", + { className: "card-copy" }, + "Open the next tier and review product previews for this selection.", + ), + ); + }; + + StorefrontApp.componentFns.ProductCard = function ProductCard( + item, + quantityInCart, + ) { + const textureState = + media && typeof media.getTextureState === "function" + ? media.getTextureState(item.image) + : { isVisible: true }; + const textureSource = + media && typeof media.getTextureSource === "function" + ? media.getTextureSource(item.image) + : ""; + const description = formatDescription( + item.description, + item.className || item.code, + ); + + return h( + "article", + { className: "product-card" }, + h( + "div", + { + className: "product-image", + "data-store-texture-path": item.image || "", + }, + textureSource + ? h("img", { + className: "product-image-asset", + src: textureSource, + alt: item.name, + loading: "lazy", + }) + : textureState.isVisible + ? "Loading Image" + : "Image Placeholder", + ), + h( + "div", + { className: "product-meta" }, + h( + "span", + { className: "product-code" }, + item.type || item.code || item.className, + ), + h("strong", { className: "product-name" }, item.name), + ), + h("p", { className: "product-copy" }, description), + h( + "div", + { className: "product-footer" }, + h( + "span", + { className: "product-price" }, + item.price || "Pending", + ), + h( + "div", + { + style: { + display: "flex", + alignItems: "center", + gap: "0.55rem", + }, + }, + quantityInCart > 0 + ? h( + "span", + { className: "product-qty" }, + quantityInCart, + ) + : null, + h( + "button", + { + type: "button", + className: "store-btn store-btn-primary", + onClick: () => actions.addToCart(item), + }, + "Add to Cart", + ), + ), + ), + ); + }; + + StorefrontApp.componentFns.EmptyStateCard = function EmptyStateCard({ + title, + copy, + actionLabel, + onAction, + }) { + return h( + "article", + { className: "empty-state" }, + h("span", { className: "empty-state-kicker" }, "No Results"), + h("strong", { className: "card-label" }, title), + h("p", { className: "empty-state-copy" }, copy), + actionLabel && typeof onAction === "function" + ? h( + "button", + { + type: "button", + className: "store-btn store-btn-secondary", + onClick: onAction, + }, + actionLabel, + ) + : null, + ); + }; + + StorefrontApp.componentFns.CategoryGrid = function CategoryGrid(children) { + return createGrid("is-categories", children); + }; + + StorefrontApp.componentFns.SubcategoryGrid = function SubcategoryGrid( + children, + ) { + return createGrid("is-subcategories", children); + }; + + StorefrontApp.componentFns.ProductGrid = function ProductGrid(children) { + return createGrid("is-products", children); + }; + + StorefrontApp.componentFns.CatalogPager = function CatalogPager({ + currentPage, + totalPages, + startIndex, + endIndex, + totalItems, + }) { + ensureScopedStyle("storefront-cards", cardsCss); + + return h( + "div", + { + [scopeAttr]: "", + className: "catalog-pager-shell", + }, + h( + "div", + { className: "catalog-pager" }, + h( + "div", + { className: "catalog-pager-meta" }, + h("span", { className: "card-kicker" }, "Catalog Page"), + h( + "span", + { className: "catalog-pager-summary" }, + totalItems > 0 + ? `Showing ${startIndex}-${endIndex} of ${totalItems} items` + : "No items available", + ), + ), + h( + "div", + { className: "catalog-pager-actions" }, + h( + "button", + { + type: "button", + className: "store-btn store-btn-secondary", + disabled: currentPage <= 1, + onClick: () => actions.goToPreviousCatalogPage(), + }, + "Previous", + ), + h( + "span", + { className: "catalog-pager-page" }, + `Page ${currentPage} / ${totalPages}`, + ), + h( + "button", + { + type: "button", + className: "store-btn store-btn-secondary", + disabled: currentPage >= totalPages, + onClick: () => + actions.goToNextCatalogPage(totalPages), + }, + "Next", + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/store/ui/src/components/cart.js b/arma/client/addons/store/ui/src/components/cart.js new file mode 100644 index 0000000..4249d59 --- /dev/null +++ b/arma/client/addons/store/ui/src/components/cart.js @@ -0,0 +1,645 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const { h, ensureScopedStyle } = StorefrontApp.runtime; + const store = StorefrontApp.store; + const getters = StorefrontApp.getters; + const actions = StorefrontApp.actions; + const { storeConfig } = StorefrontApp.data; + const scopeAttr = "data-ui-store-cart"; + const scopeSelector = `[${scopeAttr}]`; + const cartCss = ` +${scopeSelector} { + position: absolute; + inset: 0; + z-index: 4; + pointer-events: none; +} + +${scopeSelector}.is-open { + pointer-events: auto; +} + +${scopeSelector} .store-cart { + position: absolute; + top: 0.5rem; + right: 0.5rem; + bottom: 0.5rem; + width: min(24rem, calc(100% - 1rem)); + transform: translateX(calc(100% + 1rem)); + transition: transform 180ms ease; +} + +${scopeSelector}.is-open .store-cart { + transform: translateX(0); +} + +${scopeSelector} .cart-card { + height: 100%; + display: flex; + flex-direction: column; + gap: 1rem; + padding: 1rem; + border-radius: 1.5rem; + border: 1px solid var(--store-border); + background: linear-gradient(180deg, var(--store-surface) 0%, var(--store-surface-alt) 100%); + box-shadow: + 0 18px 40px rgb(11 27 46 / 0.16), + 0 4px 12px rgb(11 27 46 / 0.08); +} + +${scopeSelector} .cart-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +${scopeSelector} .cart-close { + min-width: 2.1rem; + height: 2.1rem; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + border-radius: 0.6rem; + border: 1px solid var(--store-border-strong); + background: rgb(255 255 255 / 0.78); + color: var(--store-accent); + font-size: 0.92rem; + font-weight: 800; + line-height: 1; + box-shadow: 0 6px 16px rgb(18 54 93 / 0.08); +} + +${scopeSelector} .cart-close:hover { + background: var(--store-accent-soft); + border-color: rgb(18 54 93 / 0.24); + color: var(--store-accent); +} + +${scopeSelector} .cart-close:focus-visible { + outline: 2px solid rgb(18 54 93 / 0.25); +} + +${scopeSelector} .cart-status, +${scopeSelector} .cart-kpi-card, +${scopeSelector} .cart-line { + border-radius: 0.95rem; + background: rgb(255 255 255 / 0.58); + border: 1px solid var(--store-border); +} + +${scopeSelector} .cart-status, +${scopeSelector} .cart-kpi-card, +${scopeSelector} .cart-line { + padding: 0.95rem; +} + +${scopeSelector} .cart-kpi { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.75rem; +} + +${scopeSelector} .kpi-label { + display: block; + margin-bottom: 0.3rem; + font-size: 0.68rem; + letter-spacing: 0.14em; + text-transform: uppercase; + font-weight: 700; + color: var(--store-text-subtle); +} + +${scopeSelector} .kpi-value { + font-size: 1rem; + font-weight: 700; +} + +${scopeSelector} .cart-lines { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + gap: 0.75rem; + overflow-y: auto; + overflow-x: hidden; + scrollbar-gutter: stable; + scrollbar-width: auto; + scrollbar-color: rgb(120 136 155 / 0.9) rgb(255 255 255 / 0.55); +} + +${scopeSelector} .cart-lines::-webkit-scrollbar { + width: 12px; +} + +${scopeSelector} .cart-lines::-webkit-scrollbar-track { + background: rgb(255 255 255 / 0.55); + border-radius: 999px; +} + +${scopeSelector} .cart-lines::-webkit-scrollbar-thumb { + background: rgb(120 136 155 / 0.9); + border-radius: 999px; + border: 2px solid rgb(255 255 255 / 0.55); +} + +${scopeSelector} .cart-line { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +${scopeSelector} .cart-line-copy { + min-width: 0; + display: grid; + gap: 0.18rem; +} + +${scopeSelector} .cart-line-top, +${scopeSelector} .cart-line-controls, +${scopeSelector} .summary-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +${scopeSelector} .cart-line-title { + font-size: 0.92rem; + font-weight: 700; + line-height: 1.32; + overflow-wrap: anywhere; + word-break: break-word; +} + +${scopeSelector} .qty-controls { + display: inline-flex; + align-items: center; + gap: 0.45rem; +} + +${scopeSelector} .qty-badge { + min-width: 1.9rem; + text-align: center; + font-weight: 700; +} + +${scopeSelector} .qty-btn, +${scopeSelector} .remove-btn { + min-width: 2rem; + height: 2rem; + padding: 0 0.65rem; +} + +${scopeSelector} .cart-summary { + padding-top: 0.25rem; + border-top: 1px solid var(--store-accent-line); + display: grid; + gap: 0.7rem; +} + +${scopeSelector} .payment-source-field { + display: grid; + gap: 0.65rem; +} + +${scopeSelector} .payment-source-select { + width: 100%; + min-height: 2.9rem; + padding: 0 0.95rem; + border-radius: 0.8rem; + border: 1px solid var(--store-border); + background: rgb(255 255 255 / 0.78); + color: var(--store-text-main); +} + +${scopeSelector} .payment-source-meta, +${scopeSelector} .payment-source-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +${scopeSelector} .payment-source-meta { + padding: 0.85rem 0.9rem; + border-radius: 0.95rem; + border: 1px solid var(--store-border); + background: rgb(255 255 255 / 0.44); +} + +${scopeSelector} .payment-source-detail { + margin: 0.2rem 0 0; + font-size: 0.82rem; + line-height: 1.4; + color: var(--store-text-muted); +} + +${scopeSelector} .payment-source-label { + font-weight: 700; + color: var(--store-text-main); +} + +${scopeSelector} .payment-source-balance { + font-weight: 700; + color: var(--store-success); +} + +${scopeSelector} .payment-source-state { + font-size: 0.7rem; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--store-text-subtle); +} + +${scopeSelector} .summary-row.total { + font-size: 1rem; + font-weight: 700; +} + +${scopeSelector} .summary-label, +${scopeSelector} .cart-line-meta { + color: var(--store-text-muted); +} + +${scopeSelector} .summary-value { + font-weight: 700; +} + +${scopeSelector} .summary-actions { + display: grid; + gap: 0.65rem; +} + +${scopeSelector} .cart-empty { + padding: 1rem; + border-radius: 0.95rem; + border: 1px dashed var(--store-border); + color: var(--store-text-muted); + background: rgb(255 255 255 / 0.38); +} + +@media (max-width: 1120px) { + ${scopeSelector} .store-cart { + top: 0; + right: 0; + bottom: 0; + width: min(24rem, 100%); + } +} +`; + + StorefrontApp.componentFns = StorefrontApp.componentFns || {}; + + StorefrontApp.componentFns.Cart = function Cart() { + const state = getters.getStoreState(store); + const summary = getters.summarizeCart(state.cartItems); + const paymentSources = getters.getPaymentSources(storeConfig); + const selectedPaymentSource = + getters.getPaymentSourceById( + storeConfig, + state.selectedPaymentSource, + ) || + paymentSources[0] || + null; + const availablePaymentSourceCount = paymentSources.filter( + (source) => source.enabled !== false, + ).length; + const selectedPaymentLabel = selectedPaymentSource + ? selectedPaymentSource.label + : "Unavailable"; + const selectedPaymentBalance = selectedPaymentSource + ? Number(selectedPaymentSource.balance || 0) + : 0; + const remainingSourceBalance = Math.max( + 0, + selectedPaymentBalance - summary.total, + ); + + ensureScopedStyle("storefront-cart", cartCss); + + return h( + "div", + { + className: state.cartOpen ? "is-open" : "", + [scopeAttr]: "", + "aria-hidden": state.cartOpen ? "false" : "true", + }, + h( + "aside", + { className: "store-cart" }, + h( + "section", + { className: "cart-card" }, + h( + "div", + { className: "cart-header" }, + h( + "div", + null, + h("span", { className: "eyebrow" }, "Cart"), + h( + "h2", + { className: "section-title" }, + "Acquisition Queue", + ), + ), + h( + "button", + { + type: "button", + className: "cart-close", + "aria-label": "Close cart", + title: "Close cart", + onClick: () => actions.closeCart(), + }, + "X", + ), + ), + h( + "div", + { className: "cart-kpi" }, + h( + "div", + { className: "cart-kpi-card" }, + h("span", { className: "kpi-label" }, "Items"), + h( + "span", + { className: "kpi-value" }, + summary.lineCount, + ), + ), + h( + "div", + { className: "cart-kpi-card" }, + h("span", { className: "kpi-label" }, "Payment"), + h( + "span", + { className: "kpi-value" }, + selectedPaymentLabel, + ), + ), + ), + h( + "div", + { className: "cart-status" }, + h("span", { className: "eyebrow" }, "Payment Source"), + h( + "div", + { className: "payment-source-field" }, + h( + "select", + { + className: "payment-source-select", + value: state.selectedPaymentSource, + onChange: (event) => + actions.selectPaymentSource( + event.target.value, + ), + }, + paymentSources.map((source) => + h( + "option", + { + value: source.id, + disabled: source.enabled === false, + }, + source.enabled === false + ? `${source.label} (Locked)` + : source.label, + ), + ), + ), + selectedPaymentSource + ? h( + "div", + { + className: "payment-source-meta", + }, + h( + "div", + null, + h( + "div", + { + className: + "payment-source-row", + }, + h( + "span", + { + className: + "payment-source-label", + }, + selectedPaymentSource.label, + ), + h( + "span", + { + className: + "payment-source-balance", + }, + getters.formatCurrency( + selectedPaymentSource.balance, + ), + ), + ), + h( + "p", + { + className: + "payment-source-detail", + }, + selectedPaymentSource.detail, + ), + ), + h( + "span", + { + className: "payment-source-state", + }, + availablePaymentSourceCount > 0 + ? selectedPaymentSource.enabled === + false + ? "Locked" + : "Available" + : "Unavailable", + ), + ) + : null, + ), + ), + h( + "div", + { + className: "cart-lines", + "data-preserve-scroll-id": "cart-lines", + }, + summary.lineCount > 0 + ? state.cartItems.map((item) => + h( + "div", + { className: "cart-line" }, + h( + "div", + { className: "cart-line-top" }, + h( + "div", + { + className: "cart-line-copy", + }, + h( + "div", + { + className: + "cart-line-title", + }, + item.name, + ), + ), + h( + "strong", + null, + getters.formatCurrency( + getters.parsePrice( + item.price, + ) * item.quantity, + ), + ), + ), + h( + "div", + { className: "cart-line-controls" }, + h( + "div", + { className: "qty-controls" }, + h( + "button", + { + type: "button", + className: + "store-btn store-btn-secondary qty-btn", + onClick: () => + actions.decrementCartItem( + item.code, + ), + }, + "-", + ), + h( + "span", + { className: "qty-badge" }, + item.quantity, + ), + h( + "button", + { + type: "button", + className: + "store-btn store-btn-secondary qty-btn", + onClick: () => + actions.incrementCartItem( + item.code, + ), + }, + "+", + ), + ), + h( + "button", + { + type: "button", + className: + "store-btn store-btn-secondary remove-btn", + onClick: () => + actions.removeCartItem( + item.code, + ), + }, + "Remove", + ), + ), + ), + ) + : h( + "div", + { className: "cart-empty" }, + "No items are queued yet. Add products from the catalog to build a checkout payload.", + ), + ), + h( + "div", + { className: "cart-summary" }, + h( + "div", + { className: "summary-row" }, + h("span", { className: "summary-label" }, "Items"), + h( + "span", + { className: "summary-value" }, + summary.itemCount, + ), + ), + h( + "div", + { className: "summary-row" }, + h( + "span", + { className: "summary-label" }, + "Subtotal", + ), + h( + "span", + { className: "summary-value" }, + getters.formatCurrency(summary.subtotal), + ), + ), + h( + "div", + { className: "summary-row" }, + h( + "span", + { className: "summary-label" }, + "Remaining Source", + ), + h( + "span", + { className: "summary-value" }, + getters.formatCurrency(remainingSourceBalance), + ), + ), + h( + "div", + { className: "summary-row total" }, + h("span", { className: "summary-label" }, "Total"), + h( + "span", + { className: "summary-value" }, + getters.formatCurrency(summary.total), + ), + ), + ), + h( + "div", + { className: "summary-actions" }, + h( + "button", + { + type: "button", + className: "store-btn store-btn-primary", + disabled: + summary.lineCount === 0 || + state.isCheckingOut, + onClick: () => actions.requestCheckout(), + }, + state.isCheckingOut + ? "Submitting Request..." + : "Submit Checkout", + ), + ), + ), + ), + ); + }; +})(); diff --git a/arma/client/addons/store/ui/src/components/navbar.js b/arma/client/addons/store/ui/src/components/navbar.js new file mode 100644 index 0000000..675ea48 --- /dev/null +++ b/arma/client/addons/store/ui/src/components/navbar.js @@ -0,0 +1,189 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const { h, ensureScopedStyle } = StorefrontApp.runtime; + const getters = StorefrontApp.getters; + const store = StorefrontApp.store; + const actions = StorefrontApp.actions; + const scopeAttr = "data-ui-store-navbar"; + const scopeSelector = `[${scopeAttr}]`; + const navbarCss = ` +${scopeSelector} { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.9rem 1rem; + margin-bottom: 0.95rem; + border-bottom: 1px solid var(--store-accent-line); + background: + linear-gradient(180deg, rgb(255 255 255 / 0.52) 0%, transparent 100%), + linear-gradient(180deg, rgb(236 241 246 / 0.52) 0%, rgb(245 243 239 / 0.2) 100%); +} + +${scopeSelector} .store-breadcrumbs { + display: flex; + align-items: center; + gap: 0.55rem; + min-width: 0; + flex-wrap: wrap; +} + +${scopeSelector} .breadcrumb-link, +${scopeSelector} .breadcrumb-current, +${scopeSelector} .breadcrumb-separator { + font-size: 0.78rem; + letter-spacing: 0.1em; + text-transform: uppercase; + font-weight: 700; +} + +${scopeSelector} .breadcrumb-link { + padding: 0; + border: 0; + background: transparent; + color: var(--store-text-subtle); +} + +${scopeSelector} .breadcrumb-link:hover { + color: var(--store-accent); +} + +${scopeSelector} .breadcrumb-current { + color: var(--store-accent); +} + +${scopeSelector} .breadcrumb-separator { + color: rgb(124 138 155 / 0.72); +} + +${scopeSelector} .store-cart-btn { + position: relative; + width: 2.6rem; + height: 2.6rem; + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + border-radius: 0.7rem; + border: 1px solid var(--store-border-strong); + background: rgb(255 255 255 / 0.68); + color: var(--store-accent); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.75); +} + +${scopeSelector} .store-cart-btn:hover { + background: rgb(219 231 243 / 0.88); +} + +${scopeSelector} .cart-toggle-icon { + position: relative; + width: 0.95rem; + height: 0.8rem; + border: 1.5px solid currentColor; + border-radius: 0.16rem 0.16rem 0.24rem 0.24rem; +} + +${scopeSelector} .cart-toggle-icon::before { + content: ""; + position: absolute; + top: -0.34rem; + left: 0.2rem; + width: 0.5rem; + height: 0.3rem; + border: 1.5px solid currentColor; + border-bottom: 0; + border-radius: 0.35rem 0.35rem 0 0; +} + +${scopeSelector} .cart-count { + position: absolute; + top: -0.35rem; + right: -0.35rem; + min-width: 1.25rem; + height: 1.25rem; + padding: 0 0.3rem; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + background: var(--store-accent); + color: #fff; + font-size: 0.68rem; + font-weight: 700; +} + +@media (max-width: 1120px) { + ${scopeSelector} { + align-items: flex-start; + } +} +`; + + StorefrontApp.componentFns = StorefrontApp.componentFns || {}; + + StorefrontApp.componentFns.Navbar = function Navbar() { + const state = getters.getStoreState(store); + const items = getters.getStoreBreadcrumbs(state); + const cartSummary = getters.summarizeCart(state.cartItems); + + ensureScopedStyle("storefront-navbar", navbarCss); + + return h( + "nav", + { [scopeAttr]: "" }, + h( + "div", + { + className: "store-breadcrumbs", + "aria-label": "Store navigation", + }, + items.map((item, index) => { + const isCurrent = index === items.length - 1; + + if (isCurrent) { + return h( + "span", + { className: "breadcrumb-current" }, + item.label, + ); + } + + return [ + h( + "button", + { + type: "button", + className: "breadcrumb-link", + onClick: () => + actions.navigateToBreadcrumb(item.id), + }, + item.label, + ), + h("span", { className: "breadcrumb-separator" }, "/"), + ]; + }), + ), + h( + "button", + { + type: "button", + className: "store-cart-btn", + onClick: () => actions.toggleCart(), + title: state.cartOpen ? "Close cart" : "Open cart", + "aria-label": state.cartOpen ? "Close cart" : "Open cart", + }, + h("span", { + className: "cart-toggle-icon", + "aria-hidden": "true", + }), + cartSummary.itemCount > 0 + ? h( + "span", + { className: "cart-count" }, + cartSummary.itemCount, + ) + : null, + ), + ); + }; +})(); diff --git a/arma/client/addons/store/ui/src/data.js b/arma/client/addons/store/ui/src/data.js new file mode 100644 index 0000000..5132da7 --- /dev/null +++ b/arma/client/addons/store/ui/src/data.js @@ -0,0 +1,138 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + + const defaultSession = { + actorName: "", + actorUid: "", + approval: "Field Access", + orgId: "", + orgName: "", + orgLeader: false, + defaultOrgCeo: false, + canUseOrgFunds: false, + }; + + const defaultStoreConfig = { + budget: 50000, + creditLine: 0, + availability: "In-Stock", + moduleState: "Preview", + searchTags: [ + "Attachment", + "Grenade", + "Medical", + "Consumable", + "Static", + "Scope", + "Item", + "Misc", + ], + paymentSources: [ + { + id: "cash", + label: "Cash", + balance: 0, + enabled: false, + detail: "Use on-hand cash carried by the player.", + }, + { + id: "bank", + label: "Bank", + balance: 0, + enabled: false, + detail: "Charge the player bank account.", + }, + { + id: "org_funds", + label: "Org Funds", + balance: 0, + enabled: false, + detail: "Only organization leaders or the default-org CEO can use treasury funds.", + }, + { + id: "credit_line", + label: "Credit Line", + balance: 0, + enabled: false, + detail: "No approved credit line is assigned to this member.", + }, + ], + defaultPaymentSource: "cash", + }; + + function cloneValue(value) { + return JSON.parse(JSON.stringify(value)); + } + + function replaceObject(target, source) { + Object.keys(target).forEach((key) => delete target[key]); + Object.assign(target, cloneValue(source)); + } + + const catalog = { + categoryCards: [ + { id: "uniforms", label: "Uniforms" }, + { id: "headgear", label: "Headgear" }, + { id: "facewear", label: "Facewear" }, + { id: "vests", label: "Vests" }, + { id: "backpacks", label: "Backpacks" }, + { id: "attachments", label: "Attachments" }, + { id: "weapons", label: "Weapons" }, + { id: "ammo", label: "Ammo" }, + { id: "misc", label: "Misc" }, + { id: "vehicles", label: "Vehicles" }, + ], + vehicleCards: [ + { id: "cars", label: "Cars" }, + { id: "armor", label: "Armor" }, + { id: "helis", label: "Helicopters" }, + { id: "planes", label: "Planes" }, + { id: "naval", label: "Naval" }, + { id: "other", label: "Other" }, + ], + weaponCards: [ + { id: "primary", label: "Primary" }, + { id: "secondary", label: "Secondary" }, + { id: "handgun", label: "Handgun" }, + ], + previewItems: { + uniforms: [], + headgear: [], + facewear: [], + vests: [], + backpacks: [], + attachments: [], + ammo: [], + misc: [], + primary: [], + secondary: [], + handgun: [], + cars: [], + armor: [], + helis: [], + planes: [], + naval: [], + other: [], + }, + }; + + StorefrontApp.data = { + catalog, + session: Object.assign({}, defaultSession), + storeConfig: Object.assign({}, defaultStoreConfig), + applyHydratePayload(payload) { + replaceObject( + this.session, + Object.assign({}, defaultSession, payload?.session || {}), + ); + replaceObject( + this.storeConfig, + Object.assign( + {}, + defaultStoreConfig, + payload?.storeConfig || {}, + ), + ); + }, + }; +})(); diff --git a/arma/client/addons/store/ui/src/media.js b/arma/client/addons/store/ui/src/media.js new file mode 100644 index 0000000..31f36fb --- /dev/null +++ b/arma/client/addons/store/ui/src/media.js @@ -0,0 +1,267 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const runtime = StorefrontApp.runtime; + const [getTextureVersion, setTextureVersion] = runtime.createSignal(0); + const MAX_CONCURRENT_TEXTURES = 6; + const RERENDER_DELAY_MS = 48; + const textureCache = Object.create(null); + const textureRequests = Object.create(null); + const queuedTexturePaths = []; + const queuedTextureLookup = Object.create(null); + const visibleTexturePaths = Object.create(null); + const observedTextureNodes = new WeakSet(); + let activeTextureRequests = 0; + let observer = null; + let observerRoot = null; + let rerenderTimer = 0; + + function normalizeTexturePath(path) { + let normalizedPath = String(path || "").trim(); + if (!normalizedPath) { + return ""; + } + + while ( + normalizedPath.startsWith("\\") || + normalizedPath.startsWith("/") + ) { + normalizedPath = normalizedPath.slice(1); + } + + if (!/\.[A-Za-z0-9]+$/.test(normalizedPath)) { + normalizedPath += ".paa"; + } + + return normalizedPath; + } + + function isBrowserTextureSource(path) { + const value = String(path || "") + .trim() + .toLowerCase(); + return ( + value.startsWith("data:image/") || + value.startsWith("blob:") || + value.startsWith("http://") || + value.startsWith("https://") + ); + } + + function finalizeTextureSource(path, source) { + textureCache[path] = source; + + scheduleRerender(); + } + + function scheduleRerender() { + if (rerenderTimer) { + return; + } + + rerenderTimer = window.setTimeout(() => { + rerenderTimer = 0; + setTextureVersion((currentVersion) => currentVersion + 1); + }, RERENDER_DELAY_MS); + } + + function pumpTextureQueue() { + if ( + typeof A3API === "undefined" || + typeof A3API.RequestTexture !== "function" + ) { + return; + } + + while ( + activeTextureRequests < MAX_CONCURRENT_TEXTURES && + queuedTexturePaths.length > 0 + ) { + const normalizedPath = queuedTexturePaths.shift(); + delete queuedTextureLookup[normalizedPath]; + + if ( + !normalizedPath || + textureCache[normalizedPath] !== undefined || + textureRequests[normalizedPath] + ) { + continue; + } + + activeTextureRequests += 1; + textureRequests[normalizedPath] = Promise.resolve( + A3API.RequestTexture(normalizedPath, 512), + ) + .then((resolvedPath) => { + const textureSource = String(resolvedPath || "").trim(); + + if (isBrowserTextureSource(textureSource)) { + finalizeTextureSource(normalizedPath, textureSource); + return; + } + + console.warn( + "[Store UI] Ignoring unsupported texture response.", + normalizedPath, + textureSource, + ); + finalizeTextureSource(normalizedPath, ""); + }) + .catch((error) => { + console.warn( + "[Store UI] Failed to resolve texture.", + normalizedPath, + error, + ); + finalizeTextureSource(normalizedPath, ""); + }) + .finally(() => { + activeTextureRequests = Math.max( + 0, + activeTextureRequests - 1, + ); + delete textureRequests[normalizedPath]; + pumpTextureQueue(); + }); + } + } + + function queueTextureRequest(path) { + if (!path || queuedTextureLookup[path] || textureRequests[path]) { + return; + } + + queuedTextureLookup[path] = true; + queuedTexturePaths.push(path); + pumpTextureQueue(); + } + + function markTextureVisible(path) { + const normalizedPath = normalizeTexturePath(path); + if (!normalizedPath || visibleTexturePaths[normalizedPath]) { + return; + } + + visibleTexturePaths[normalizedPath] = true; + if ( + !isBrowserTextureSource(textureCache[normalizedPath]) && + !textureRequests[normalizedPath] + ) { + queueTextureRequest(normalizedPath); + } + } + + function ensureObserver() { + const currentRoot = document.querySelector(".catalog-grid"); + if (typeof IntersectionObserver !== "function") { + return null; + } + + if (observer && observerRoot === currentRoot) { + return observer; + } + + if (observer) { + observer.disconnect(); + } + + observerRoot = currentRoot; + observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) { + return; + } + + const rawPath = entry.target.getAttribute( + "data-store-texture-path", + ); + markTextureVisible(rawPath); + observer.unobserve(entry.target); + }); + }, + { + root: currentRoot, + rootMargin: "240px 0px", + threshold: 0.01, + }, + ); + + return observer; + } + + function observeTextureTargets() { + const targets = document.querySelectorAll("[data-store-texture-path]"); + if (targets.length === 0) { + return; + } + + const activeObserver = ensureObserver(); + targets.forEach((target) => { + if (observedTextureNodes.has(target)) { + return; + } + + observedTextureNodes.add(target); + + const rawPath = target.getAttribute("data-store-texture-path"); + if (!activeObserver) { + markTextureVisible(rawPath); + return; + } + + activeObserver.observe(target); + }); + } + + function scheduleTextureObservation() { + window.requestAnimationFrame(() => { + observeTextureTargets(); + }); + } + + function getTextureState(path) { + getTextureVersion(); + const normalizedPath = normalizeTexturePath(path); + return { + path: normalizedPath, + isVisible: Boolean( + normalizedPath && visibleTexturePaths[normalizedPath], + ), + isLoaded: Boolean( + normalizedPath && + textureCache[normalizedPath] && + isBrowserTextureSource(textureCache[normalizedPath]), + ), + }; + } + + function getTextureSource(path) { + getTextureVersion(); + const normalizedPath = normalizeTexturePath(path); + if (!normalizedPath) { + return ""; + } + + if (isBrowserTextureSource(path)) { + textureCache[normalizedPath] = String(path).trim(); + return textureCache[normalizedPath]; + } + + if (textureCache[normalizedPath] !== undefined) { + return textureCache[normalizedPath]; + } + + if (visibleTexturePaths[normalizedPath]) { + queueTextureRequest(normalizedPath); + return ""; + } + + return ""; + } + + StorefrontApp.media = { + getTextureState, + getTextureSource, + scheduleTextureObservation, + }; +})(); diff --git a/arma/client/addons/store/ui/src/pages/StoreView.js b/arma/client/addons/store/ui/src/pages/StoreView.js new file mode 100644 index 0000000..c1ec182 --- /dev/null +++ b/arma/client/addons/store/ui/src/pages/StoreView.js @@ -0,0 +1,290 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const CATALOG_PAGE_SIZE = 6; + + function getSelectionKey(state) { + return ( + state.selectedWeaponSlot || + state.selectedVehicleSlot || + state.selectedCategory + ); + } + + function matchesQuery(query, values) { + if (!query) { + return true; + } + + const normalizedQuery = String(query).trim().toLowerCase(); + if (!normalizedQuery) { + return true; + } + + return values.some((value) => + String(value || "") + .toLowerCase() + .includes(normalizedQuery), + ); + } + + function parsePrice(value) { + const parsed = Number(String(value || "0").replace(/[^0-9.-]+/g, "")); + return Number.isFinite(parsed) ? parsed : 0; + } + + function formatCurrency(value) { + return `$${Number(value || 0).toLocaleString()}`; + } + + function formatTitle(value) { + const normalizedValue = String(value || "") + .trim() + .toLowerCase(); + if (["items", "misc"].includes(normalizedValue)) { + return "Misc"; + } + + return String(value || "") + .replace(/[-_]+/g, " ") + .split(/\s+/) + .filter(Boolean) + .map( + (part) => + part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(), + ) + .join(" "); + } + + function getStoreState(store) { + return { + view: store.getView(), + selectedCategory: store.getSelectedCategory(), + selectedWeaponSlot: store.getSelectedWeaponSlot(), + selectedVehicleSlot: store.getSelectedVehicleSlot(), + selectedPaymentSource: store.getSelectedPaymentSource(), + cartOpen: store.getCartOpen(), + searchQuery: store.getSearchQuery(), + cartItems: store.getCartItems(), + catalogItemsByKey: store.getCatalogItemsByKey(), + isCatalogLoading: store.getIsCatalogLoading(), + catalogRequestKey: store.getCatalogRequestKey(), + catalogPage: store.getCatalogPage(), + isCheckingOut: store.getIsCheckingOut(), + }; + } + + function getStoreHeader(state) { + if (state.view === "weapons") { + return { + eyebrow: "Weapons Division", + title: "Weapon Categories", + copy: "Select a weapon slot to open the next supply tier. Primary, secondary, and handgun are staged with the same state and bridge flow as the org portal.", + badge: "3 Slots", + }; + } + + if (state.view === "vehicles") { + return { + eyebrow: "Vehicle Motorpool", + title: "Vehicle Categories", + copy: "Select a vehicle class to open the next supply tier. Cars, armor, airframes, and naval options stay inside the same local store and bridge lifecycle.", + badge: "6 Classes", + }; + } + + if (state.view === "items") { + const label = getSelectionKey(state) || "catalog"; + const queryLabel = state.searchQuery + ? ` Filtered by "${state.searchQuery}".` + : ""; + const loadingLabel = state.isCatalogLoading + ? " Pulling live inventory from the game engine." + : ""; + + return { + eyebrow: "Catalog Preview", + title: formatTitle(label), + copy: `Live category inventory generated from the game engine for the selected department.${queryLabel}${loadingLabel}`, + badge: "Preview Items", + }; + } + + return { + eyebrow: "Supply Categories", + title: "Procurement Dashboard", + copy: "Choose a category to enter the exchange. Weapons and vehicles open a second tier, while the other departments display placeholder product inventory inside the new runtime/store architecture.", + badge: "8 Categories", + }; + } + + function getStoreBreadcrumbs(state) { + const items = [{ id: "categories", label: "Supply Exchange" }]; + + if (state.view === "weapons") { + items.push({ id: "weapons", label: "Weapons" }); + return items; + } + + if (state.view === "vehicles") { + items.push({ id: "vehicles", label: "Vehicles" }); + return items; + } + + if (state.view === "items") { + if (state.selectedWeaponSlot) { + items.push({ id: "weapons", label: "Weapons" }); + items.push({ + id: "weapon-slot", + label: formatTitle(state.selectedWeaponSlot), + }); + return items; + } + + if (state.selectedVehicleSlot) { + items.push({ id: "vehicles", label: "Vehicles" }); + items.push({ + id: "vehicle-slot", + label: formatTitle(state.selectedVehicleSlot), + }); + return items; + } + + if (state.selectedCategory) { + items.push({ + id: "category", + label: formatTitle(state.selectedCategory), + }); + } + } + + return items; + } + + function getVisibleCategoryCards(state, catalog) { + return catalog.categoryCards.filter((category) => + matchesQuery(state.searchQuery, [category.id, category.label]), + ); + } + + function getVisibleSubcategoryCards(state, catalog) { + const source = + state.view === "vehicles" + ? catalog.vehicleCards + : catalog.weaponCards; + + return source.filter((category) => + matchesQuery(state.searchQuery, [category.id, category.label]), + ); + } + + function getVisibleItems(state, catalog) { + const key = getSelectionKey(state); + const categoryKey = String(key || "") + .trim() + .toLowerCase(); + const itemsByKey = state.catalogItemsByKey || {}; + const items = Array.isArray(itemsByKey[categoryKey]) + ? itemsByKey[categoryKey] + : []; + + return items.filter((item) => + matchesQuery(state.searchQuery, [ + item.className, + item.code, + item.name, + item.description, + item.price, + item.type, + ]), + ); + } + + function getCatalogPagination(state, catalog) { + const totalItems = getVisibleItems(state, catalog).length; + const totalPages = Math.max( + 1, + Math.ceil(totalItems / CATALOG_PAGE_SIZE), + ); + const currentPage = Math.min( + totalPages, + Math.max(1, Number(state.catalogPage || 1)), + ); + + return { + pageSize: CATALOG_PAGE_SIZE, + totalItems, + totalPages, + currentPage, + startIndex: + totalItems === 0 + ? 0 + : (currentPage - 1) * CATALOG_PAGE_SIZE + 1, + endIndex: Math.min(currentPage * CATALOG_PAGE_SIZE, totalItems), + }; + } + + function getVisibleItemsPage(state, catalog) { + const items = getVisibleItems(state, catalog); + const pagination = getCatalogPagination(state, catalog); + const startOffset = (pagination.currentPage - 1) * pagination.pageSize; + return items.slice(startOffset, startOffset + pagination.pageSize); + } + + function summarizeCart(cartItems) { + const itemCount = cartItems.reduce( + (sum, item) => sum + Number(item.quantity || 0), + 0, + ); + const subtotal = cartItems.reduce( + (sum, item) => + sum + parsePrice(item.price) * Number(item.quantity || 0), + 0, + ); + + return { + lineCount: cartItems.length, + itemCount, + subtotal, + total: subtotal, + }; + } + + function getPaymentSources(storeConfig) { + const paymentSources = Array.isArray(storeConfig?.paymentSources) + ? storeConfig.paymentSources + : []; + + return paymentSources.map((source) => ({ + id: String(source?.id || "").trim(), + label: String(source?.label || source?.id || "").trim(), + balance: Number(source?.balance || 0), + enabled: source?.enabled !== false, + detail: String(source?.detail || "").trim(), + })); + } + + function getPaymentSourceById(storeConfig, paymentSourceId) { + const sourceId = String(paymentSourceId || "").trim(); + return getPaymentSources(storeConfig).find( + (source) => source.id === sourceId, + ); + } + + StorefrontApp.getters = { + formatTitle, + formatCurrency, + parsePrice, + getSelectionKey, + getStoreState, + getStoreHeader, + getStoreBreadcrumbs, + getVisibleCategoryCards, + getVisibleSubcategoryCards, + getVisibleItems, + getVisibleItemsPage, + getCatalogPagination, + summarizeCart, + getPaymentSources, + getPaymentSourceById, + }; +})(); diff --git a/arma/client/addons/store/ui/src/registry/events.js b/arma/client/addons/store/ui/src/registry/events.js new file mode 100644 index 0000000..14cabc9 --- /dev/null +++ b/arma/client/addons/store/ui/src/registry/events.js @@ -0,0 +1,362 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const store = StorefrontApp.store; + const getters = StorefrontApp.getters; + const { storeConfig, session } = StorefrontApp.data; + + let noticeTimer = null; + + function showNotice(type, text) { + store.setNotice({ type, text }); + + if (noticeTimer) { + clearTimeout(noticeTimer); + } + + noticeTimer = setTimeout(() => { + store.setNotice({ type: "", text: "" }); + noticeTimer = null; + }, 3200); + } + + function normalizeCheckoutItem(item) { + return { + classname: String(item?.code || "").trim(), + category: String(item?.category || "") + .trim() + .toLowerCase(), + entryKind: String(item?.entryKind || "item") + .trim() + .toLowerCase(), + quantity: Math.max(1, Number(item?.quantity || 1)), + }; + } + + function buildCheckoutPayload(cartItems, paymentMethod, totalPrice) { + const payload = { + items: [], + vehicles: [], + totalPrice, + paymentMethod, + }; + + cartItems.forEach((item) => { + const normalizedItem = normalizeCheckoutItem(item); + + if (normalizedItem.entryKind === "vehicle") { + for ( + let index = 0; + index < normalizedItem.quantity; + index += 1 + ) { + payload.vehicles.push({ + classname: normalizedItem.classname, + category: normalizedItem.category, + }); + } + return; + } + + payload.items.push({ + classname: normalizedItem.classname, + category: normalizedItem.category, + quantity: normalizedItem.quantity, + }); + }); + + return payload; + } + + function applySearchQuery(value) { + store.setSearchQuery(String(value || "").trim()); + store.resetCatalogPage(); + } + + function clearSearch() { + store.setSearchQuery(""); + store.resetCatalogPage(); + } + + function toggleCart() { + store.setCartOpen((open) => !open); + } + + function closeCart() { + store.setCartOpen(false); + } + + function closeStore() { + const bridge = StorefrontApp.bridge; + if (bridge && typeof bridge.requestClose === "function") { + const sent = bridge.requestClose(); + if (sent) { + return true; + } + } + + showNotice("error", "Store bridge is unavailable."); + return false; + } + + function navigateToBreadcrumb(target) { + return store.navigateToBreadcrumb(target); + } + + function scrollCatalogToTop() { + const catalogGrid = document.querySelector( + '[data-preserve-scroll-id="catalog-grid"]', + ); + if (catalogGrid) { + catalogGrid.scrollTop = 0; + } + } + + function selectCategory(category) { + store.selectCategory(category); + scrollCatalogToTop(); + + if (!["weapons", "vehicles"].includes(String(category || ""))) { + requestCategoryItems(category); + } + } + + function selectSubcategory(subcategory, slotType) { + store.selectSubcategory(subcategory, slotType); + scrollCatalogToTop(); + requestCategoryItems(subcategory); + } + + function goToCatalogPage(page) { + store.setCatalogPageNumber(page); + scrollCatalogToTop(); + } + + function goToNextCatalogPage(totalPages) { + const currentPage = Number(store.getCatalogPage() || 1); + const lastPage = Math.max(1, Number(totalPages || 1)); + if (currentPage >= lastPage) { + return false; + } + + goToCatalogPage(currentPage + 1); + return true; + } + + function goToPreviousCatalogPage() { + const currentPage = Number(store.getCatalogPage() || 1); + if (currentPage <= 1) { + return false; + } + + goToCatalogPage(currentPage - 1); + return true; + } + + function requestCategoryItems(category) { + const categoryKey = String(category || "") + .trim() + .toLowerCase(); + if (!categoryKey) { + return false; + } + + const cachedItems = store.getCatalogItemsByKey(); + if (Array.isArray(cachedItems[categoryKey])) { + store.finishCategoryRequest(""); + return true; + } + + store.startCategoryRequest(categoryKey); + + const bridge = StorefrontApp.bridge; + if (!bridge || typeof bridge.requestCategory !== "function") { + store.finishCategoryRequest(categoryKey); + showNotice("error", "Store bridge is unavailable."); + return false; + } + + const sent = bridge.requestCategory({ category: categoryKey }); + if (!sent) { + store.finishCategoryRequest(categoryKey); + showNotice("error", "Category request bridge is unavailable."); + return false; + } + + return true; + } + + function addToCart(item) { + store.setCartItems((currentItems) => { + const existingIndex = currentItems.findIndex( + (entry) => entry.code === item.code, + ); + if (existingIndex === -1) { + return [ + ...currentItems, + { + code: item.code, + name: item.name, + price: item.price, + category: item.category, + entryKind: item.entryKind, + quantity: 1, + }, + ]; + } + + const nextItems = [...currentItems]; + nextItems[existingIndex] = Object.assign( + {}, + nextItems[existingIndex], + { + category: item.category, + entryKind: item.entryKind, + quantity: nextItems[existingIndex].quantity + 1, + }, + ); + return nextItems; + }); + + showNotice("success", `${item.name} added to the acquisition queue.`); + } + + function incrementCartItem(code) { + store.setCartItems((currentItems) => + currentItems.map((item) => + item.code === code + ? Object.assign({}, item, { quantity: item.quantity + 1 }) + : item, + ), + ); + } + + function decrementCartItem(code) { + store.setCartItems((currentItems) => + currentItems + .map((item) => + item.code === code + ? Object.assign({}, item, { + quantity: Math.max(0, item.quantity - 1), + }) + : item, + ) + .filter((item) => item.quantity > 0), + ); + } + + function removeCartItem(code) { + store.setCartItems((currentItems) => + currentItems.filter((item) => item.code !== code), + ); + } + + function selectPaymentSource(paymentSourceId) { + const sourceId = String(paymentSourceId || "").trim(); + const paymentSources = getters.getPaymentSources(storeConfig); + const selectedSource = paymentSources.find( + (source) => source.id === sourceId, + ); + + if (!selectedSource) { + showNotice("error", "Selected payment source is unavailable."); + return false; + } + + if (selectedSource.enabled === false) { + showNotice( + "error", + selectedSource.detail || + "Selected payment source is not available.", + ); + return false; + } + + store.setSelectedPaymentSource(sourceId); + return true; + } + + function requestCheckout() { + const cartItems = store.getCartItems(); + if (cartItems.length === 0) { + showNotice("error", "Add at least one item before checkout."); + return false; + } + + const summary = getters.summarizeCart(cartItems); + const selectedPaymentSource = getters.getPaymentSourceById( + storeConfig, + store.getSelectedPaymentSource(), + ); + + if (!selectedPaymentSource) { + showNotice("error", "Select a payment source before checkout."); + return false; + } + + if (selectedPaymentSource.enabled === false) { + showNotice( + "error", + selectedPaymentSource.detail || + "Selected payment source is unavailable.", + ); + return false; + } + + if (summary.total > Number(selectedPaymentSource.balance || 0)) { + showNotice( + "error", + `${selectedPaymentSource.label} cannot cover this checkout total.`, + ); + return false; + } + + const bridge = StorefrontApp.bridge; + if (!bridge || typeof bridge.requestCheckout !== "function") { + showNotice("error", "Checkout bridge is unavailable."); + return false; + } + + store.setIsCheckingOut(true); + + const checkoutPayload = buildCheckoutPayload( + cartItems, + selectedPaymentSource.id, + summary.total, + ); + + const sent = bridge.requestCheckout({ + checkoutJson: JSON.stringify(checkoutPayload), + }); + + if (!sent) { + store.setIsCheckingOut(false); + showNotice("error", "Checkout bridge is unavailable."); + return false; + } + + return true; + } + + StorefrontApp.actions = { + showNotice, + applySearchQuery, + clearSearch, + toggleCart, + closeCart, + closeStore, + navigateToBreadcrumb, + selectCategory, + selectSubcategory, + goToCatalogPage, + goToNextCatalogPage, + goToPreviousCatalogPage, + addToCart, + incrementCartItem, + decrementCartItem, + removeCartItem, + selectPaymentSource, + requestCheckout, + formatTitle: getters.formatTitle, + formatCurrency: getters.formatCurrency, + }; +})(); diff --git a/arma/client/addons/store/ui/src/registry/store.js b/arma/client/addons/store/ui/src/registry/store.js new file mode 100644 index 0000000..e8b608e --- /dev/null +++ b/arma/client/addons/store/ui/src/registry/store.js @@ -0,0 +1,288 @@ +(function () { + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + const { createSignal } = StorefrontApp.runtime; + const SharedLogic = (window.SharedLogic = window.SharedLogic || {}); + + SharedLogic.createStorefrontStore = function createStorefrontStore({ + createSignal, + }) { + function normalizeCatalogItem(item) { + return { + className: String(item?.className || item?.code || ""), + code: String(item?.code || item?.className || ""), + name: String(item?.name || item?.displayName || ""), + description: String(item?.description || ""), + price: String(item?.price || ""), + image: String(item?.image || ""), + type: String(item?.type || ""), + category: String(item?.category || ""), + entryKind: String(item?.entryKind || "item"), + quantity: Math.max(0, Number(item?.quantity || 0)), + }; + } + + function normalizeCartItem(item) { + return { + code: String(item?.code || ""), + name: String(item?.name || ""), + price: String(item?.price || "$0"), + category: String(item?.category || ""), + entryKind: String(item?.entryKind || "item"), + quantity: Math.max(1, Number(item?.quantity || 1)), + }; + } + + class StorefrontStore { + constructor() { + [this.getView, this.setView] = createSignal("categories"); + [this.getSelectedCategory, this.setSelectedCategory] = + createSignal(""); + [this.getSelectedWeaponSlot, this.setSelectedWeaponSlot] = + createSignal(""); + [this.getSelectedVehicleSlot, this.setSelectedVehicleSlot] = + createSignal(""); + [this.getCartOpen, this.setCartOpen] = createSignal(false); + [this.getSearchQuery, this.setSearchQuery] = createSignal(""); + [this.getCartItems, this.setCartItems] = createSignal([]); + [this.getCatalogItemsByKey, this.setCatalogItemsByKey] = + createSignal({}); + [this.getIsCatalogLoading, this.setIsCatalogLoading] = + createSignal(false); + [this.getCatalogRequestKey, this.setCatalogRequestKey] = + createSignal(""); + [this.getCatalogPage, this.setCatalogPage] = createSignal(1); + [this.getNotice, this.setNotice] = createSignal({ + type: "", + text: "", + }); + [this.getIsCheckingOut, this.setIsCheckingOut] = + createSignal(false); + [this.getSelectedPaymentSource, this.setSelectedPaymentSource] = + createSignal("cash"); + } + + resetToCategories() { + this.setView("categories"); + this.setSelectedCategory(""); + this.setSelectedWeaponSlot(""); + this.setSelectedVehicleSlot(""); + this.setIsCatalogLoading(false); + this.setCatalogRequestKey(""); + this.setCatalogPage(1); + } + + openWeaponsRoot() { + this.setView("weapons"); + this.setSelectedCategory("weapons"); + this.setSelectedWeaponSlot(""); + this.setSelectedVehicleSlot(""); + this.setIsCatalogLoading(false); + this.setCatalogRequestKey(""); + this.setCatalogPage(1); + } + + openVehiclesRoot() { + this.setView("vehicles"); + this.setSelectedCategory("vehicles"); + this.setSelectedVehicleSlot(""); + this.setSelectedWeaponSlot(""); + this.setIsCatalogLoading(false); + this.setCatalogRequestKey(""); + this.setCatalogPage(1); + } + + resetCatalogPage() { + this.setCatalogPage(1); + } + + setCatalogPageNumber(page) { + const nextPage = Math.max(1, Number(page || 1)); + this.setCatalogPage(nextPage); + } + + selectCategory(category) { + this.setSelectedCategory(category); + this.setSelectedWeaponSlot(""); + this.setSelectedVehicleSlot(""); + this.setCatalogPage(1); + + if (category === "weapons") { + this.openWeaponsRoot(); + return; + } + + if (category === "vehicles") { + this.openVehiclesRoot(); + return; + } + + this.setView("items"); + } + + selectSubcategory(subcategory, slotType) { + if (slotType === "vehicle") { + this.setSelectedVehicleSlot(subcategory); + this.setSelectedWeaponSlot(""); + } else { + this.setSelectedWeaponSlot(subcategory); + this.setSelectedVehicleSlot(""); + } + + this.setCatalogPage(1); + this.setView("items"); + } + + startCategoryRequest(category) { + const categoryKey = String(category || "") + .trim() + .toLowerCase(); + if (!categoryKey) { + return false; + } + + this.setCatalogRequestKey(categoryKey); + this.setIsCatalogLoading(true); + return true; + } + + finishCategoryRequest(category) { + const categoryKey = String(category || "") + .trim() + .toLowerCase(); + const activeKey = String(this.getCatalogRequestKey() || "") + .trim() + .toLowerCase(); + + if (!categoryKey || !activeKey || activeKey === categoryKey) { + this.setCatalogRequestKey(""); + this.setIsCatalogLoading(false); + } + } + + hydrateCategoryItems(payload) { + const categoryKey = String(payload?.category || "") + .trim() + .toLowerCase(); + const items = Array.isArray(payload?.items) + ? payload.items + : []; + + if (!categoryKey) { + this.setCatalogRequestKey(""); + this.setIsCatalogLoading(false); + return; + } + + this.setCatalogItemsByKey((currentItemsByKey) => + Object.assign({}, currentItemsByKey, { + [categoryKey]: items.map(normalizeCatalogItem), + }), + ); + + this.finishCategoryRequest(categoryKey); + } + + ensureSelectedPaymentSource(storeConfig) { + const paymentSources = Array.isArray( + storeConfig?.paymentSources, + ) + ? storeConfig.paymentSources + : []; + const currentSource = String( + this.getSelectedPaymentSource() || "", + ).trim(); + const defaultSource = String( + storeConfig?.defaultPaymentSource || "", + ).trim(); + const sourceIds = paymentSources.map((source) => + String(source?.id || "").trim(), + ); + const enabledSource = paymentSources.find( + (source) => source && source.enabled !== false, + ); + const defaultAvailable = + defaultSource && sourceIds.includes(defaultSource) + ? paymentSources.find( + (source) => + String(source?.id || "").trim() === + defaultSource, + ) + : null; + + if ( + currentSource && + sourceIds.includes(currentSource) && + paymentSources.some( + (source) => + String(source?.id || "").trim() === currentSource && + source?.enabled !== false, + ) + ) { + return; + } + + if (defaultAvailable && defaultAvailable.enabled !== false) { + this.setSelectedPaymentSource(defaultSource); + return; + } + + if (enabledSource) { + this.setSelectedPaymentSource( + String(enabledSource.id || "cash"), + ); + return; + } + + this.setSelectedPaymentSource(defaultSource || "cash"); + } + + navigateToBreadcrumb(target) { + switch (target) { + case "categories": + this.resetToCategories(); + return true; + case "weapons": + this.openWeaponsRoot(); + return true; + case "vehicles": + this.openVehiclesRoot(); + return true; + default: + return false; + } + } + + hydrateFromPayload(payload) { + const cartItems = Array.isArray(payload?.cartItems) + ? payload.cartItems + : []; + + this.setCartItems(cartItems.map(normalizeCartItem)); + this.setCartOpen(false); + this.setIsCheckingOut(false); + this.setCatalogItemsByKey({}); + this.setCatalogRequestKey(""); + this.setIsCatalogLoading(false); + this.setCatalogPage(1); + this.ensureSelectedPaymentSource(payload?.storeConfig || {}); + } + + hydrateStoreConfig(payload) { + const cartItems = Array.isArray(payload?.cartItems) + ? payload.cartItems + : []; + + this.setCartItems(cartItems.map(normalizeCartItem)); + this.setCartOpen(false); + this.setIsCheckingOut(false); + this.ensureSelectedPaymentSource(payload?.storeConfig || {}); + } + } + + return new StorefrontStore(); + }; + + StorefrontApp.store = SharedLogic.createStorefrontStore({ + createSignal, + }); +})(); diff --git a/arma/client/addons/store/ui/src/runtime.js b/arma/client/addons/store/ui/src/runtime.js new file mode 100644 index 0000000..2462fdd --- /dev/null +++ b/arma/client/addons/store/ui/src/runtime.js @@ -0,0 +1,6 @@ +(function () { + const runtime = window.ForgeWebUI; + const StorefrontApp = (window.StorefrontApp = window.StorefrontApp || {}); + StorefrontApp.runtime = runtime; + window.AppRuntime = runtime; +})(); diff --git a/arma/client/addons/store/ui/src/styles.css b/arma/client/addons/store/ui/src/styles.css new file mode 100644 index 0000000..9bda616 --- /dev/null +++ b/arma/client/addons/store/ui/src/styles.css @@ -0,0 +1,89 @@ +:root { + --store-shell-bg: #e4e3df; + --store-surface: #f5f3ef; + --store-surface-alt: #ece8e2; + --store-surface-strong: #ffffff; + --store-border: rgba(74, 91, 110, 0.2); + --store-border-strong: rgba(20, 46, 79, 0.2); + --store-text-main: #1f2d3d; + --store-text-muted: #6a7787; + --store-text-subtle: #8792a0; + --store-accent: #12365d; + --store-accent-soft: #dbe7f3; + --store-accent-line: rgba(18, 54, 93, 0.12); + --store-success: #2f7d5b; + --store-danger: #8a3d3d; +} + +* { + box-sizing: border-box; +} + +html, +body { + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; +} + +body { + font-family: "Segoe UI", "Trebuchet MS", sans-serif; + color: var(--store-text-main); + background: var(--store-shell-bg); +} + +button, +input, +select { + font: inherit; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.7; +} + +:focus-visible { + outline: 2px solid rgb(18 54 93 / 0.35); + outline-offset: 2px; +} + +#app { + width: 100%; + height: 100%; +} + +.store-btn { + min-height: 2.75rem; + padding: 0.72rem 1rem; + border-radius: 0.8rem; + border: 1px solid var(--store-border-strong); + font-size: 0.82rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.store-btn.store-btn-primary { + background: rgb(255 255 255 / 0.68); + color: var(--store-accent); +} + +.store-btn.store-btn-primary:hover { + background: rgb(219 231 243 / 0.88); +} + +.store-btn.store-btn-secondary { + background: rgb(255 255 255 / 0.42); + color: var(--store-text-muted); +} + +.store-btn.store-btn-secondary:hover { + background: rgb(255 255 255 / 0.6); + color: var(--store-text-main); +} diff --git a/arma/client/addons/store/ui/ui.config.mjs b/arma/client/addons/store/ui/ui.config.mjs new file mode 100644 index 0000000..b99ac7b --- /dev/null +++ b/arma/client/addons/store/ui/ui.config.mjs @@ -0,0 +1,38 @@ +export default { + addonName: "store", + title: "FORGE Supply Exchange", + logLabel: "Store UI", + outputDir: "_site", + jsBundles: [ + { + name: "Store UI app", + output: "store-ui.js", + sources: [ + "src/runtime.js", + "src/media.js", + "src/data.js", + "src/registry/store.js", + "src/pages/StoreView.js", + "src/bridge.js", + "src/registry/events.js", + "src/components/AppShell.js", + "src/components/cards.js", + "src/components/cart.js", + "src/components/navbar.js", + "src/bootstrap.js", + ], + }, + ], + cssBundles: [ + { + name: "Store UI styles", + output: "store-ui.css", + sources: ["src/styles.css"], + }, + ], + site: { + styles: ["store-ui.css"], + commonScripts: ["forge-webui.js"], + scripts: ["store-ui.js"], + }, +}; diff --git a/arma/client/client.code-workspace b/arma/client/client.code-workspace new file mode 100644 index 0000000..661fbc1 --- /dev/null +++ b/arma/client/client.code-workspace @@ -0,0 +1,22 @@ +{ + "folders": [ + { + "path": ".", + }, + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config", + }, + }, +} diff --git a/arma/client/docs/README.md b/arma/client/docs/README.md new file mode 100644 index 0000000..1fc922c --- /dev/null +++ b/arma/client/docs/README.md @@ -0,0 +1,47 @@ +# Forge Client Documentation + +This folder documents the Arma client mod. The client side is responsible for +displaying UI, handling player input, caching client-visible state, and sending +CBA events to server addons. + +Authoritative gameplay state lives on the server side or in the Rust extension. +Client repositories should be treated as view state, not durable storage. + +## Architecture +- Each addon declares its own UI resources and CBA extended event handlers. +- `XEH_preStart.sqf`/`XEH_preInit.sqf` compile functions. +- `XEH_postInitClient.sqf` initializes client repositories, UI bridges, and + response event handlers. +- Browser UIs send JSON events through A3API. +- SQF handlers translate browser events into local actions or server RPCs. +- Server responses update repositories and push browser events back into the UI. + +## Addon Docs +- [Main](../addons/main/README.md) +- [Common](../addons/common/README.md) +- [Actor](../addons/actor/README.md) +- [Bank](../addons/bank/README.md) +- [CAD](../addons/cad/README.md) +- [Garage](../addons/garage/README.md) +- [Locker](../addons/locker/README.md) +- [Notifications](../addons/notifications/README.md) +- [Organization](../addons/org/README.md) +- [Phone](../addons/phone/README.md) +- [Store](../addons/store/README.md) + +## Related Docs +- [Root Client Usage Guide](../../../docs/CLIENT_USAGE_GUIDE.md) +- [Root Client Main Usage Guide](../../../docs/CLIENT_MAIN_USAGE_GUIDE.md) +- [Root Client Common Usage Guide](../../../docs/CLIENT_COMMON_USAGE_GUIDE.md) +- [Root Client Actor Usage Guide](../../../docs/CLIENT_ACTOR_USAGE_GUIDE.md) +- [Root Client Bank Usage Guide](../../../docs/CLIENT_BANK_USAGE_GUIDE.md) +- [Root Client CAD Usage Guide](../../../docs/CLIENT_CAD_USAGE_GUIDE.md) +- [Root Client Garage Usage Guide](../../../docs/CLIENT_GARAGE_USAGE_GUIDE.md) +- [Root Client Locker Usage Guide](../../../docs/CLIENT_LOCKER_USAGE_GUIDE.md) +- [Root Client Notifications Usage Guide](../../../docs/CLIENT_NOTIFICATIONS_USAGE_GUIDE.md) +- [Root Client Organization Usage Guide](../../../docs/CLIENT_ORG_USAGE_GUIDE.md) +- [Root Client Phone Usage Guide](../../../docs/CLIENT_PHONE_USAGE_GUIDE.md) +- [Root Client Store Usage Guide](../../../docs/CLIENT_STORE_USAGE_GUIDE.md) +- [Shared web UI framework notes](../addons/common/WEB_UI_FRAMEWORK.md) +- [CAD map integration notes](../addons/cad/MAP_README.md) +- [Root framework docs](../../../docs/README.md) diff --git a/arma/client/extra/example_addon/$PBOPREFIX$ b/arma/client/extra/example_addon/$PBOPREFIX$ new file mode 100644 index 0000000..ae5f222 --- /dev/null +++ b/arma/client/extra/example_addon/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\addonName diff --git a/arma/client/extra/example_addon/CfgEventHandlers.hpp b/arma/client/extra/example_addon/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/client/extra/example_addon/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/arma/client/extra/example_addon/README.md b/arma/client/extra/example_addon/README.md new file mode 100644 index 0000000..8448397 --- /dev/null +++ b/arma/client/extra/example_addon/README.md @@ -0,0 +1,9 @@ +# Forge Client Example Addon + +This directory is a template for creating a new Forge client addon. + +Use it as a starting point for addon structure, config layout, event handler +files, and function preparation. Replace the component names, display strings, +and placeholder implementation with the new addon's real feature behavior. + +Do not ship this example addon as a gameplay module. diff --git a/arma/client/extra/example_addon/XEH_PREP.hpp b/arma/client/extra/example_addon/XEH_PREP.hpp new file mode 100644 index 0000000..171d26d --- /dev/null +++ b/arma/client/extra/example_addon/XEH_PREP.hpp @@ -0,0 +1 @@ +// PREP(empty); diff --git a/arma/client/extra/example_addon/XEH_preInit.sqf b/arma/client/extra/example_addon/XEH_preInit.sqf new file mode 100644 index 0000000..8d45ad6 --- /dev/null +++ b/arma/client/extra/example_addon/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initSettings.inc.sqf" +#include "initKeybinds.inc.sqf" diff --git a/arma/client/extra/example_addon/XEH_preStart.sqf b/arma/client/extra/example_addon/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/extra/example_addon/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/extra/example_addon/config.cpp b/arma/client/extra/example_addon/config.cpp new file mode 100644 index 0000000..78d0972 --- /dev/null +++ b/arma/client/extra/example_addon/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"You!"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/client/extra/example_addon/functions/fnc_empty.sqf b/arma/client/extra/example_addon/functions/fnc_empty.sqf new file mode 100644 index 0000000..73c0a37 --- /dev/null +++ b/arma/client/extra/example_addon/functions/fnc_empty.sqf @@ -0,0 +1,16 @@ +#include "..\script_component.hpp" +/* + * Author: You! + * An empty function that does nothing. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_client_addonName_fnc_empty; + * + * Public: No + */ diff --git a/arma/client/extra/example_addon/initKeybinds.inc.sqf b/arma/client/extra/example_addon/initKeybinds.inc.sqf new file mode 100644 index 0000000..0e6dd20 --- /dev/null +++ b/arma/client/extra/example_addon/initKeybinds.inc.sqf @@ -0,0 +1,8 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" + +[ + _category, QGVAR(key_doTheThing), + [LSTRING(doTheThing_name), LSTRING(doTheThing_tooltip)], { + // ... + }, {}, [DIK_KEYNAME, _shift, _ctrl, _alt] // Default keybind +] call CBA_fnc_addKeybind; diff --git a/arma/client/extra/example_addon/initSettings.inc.sqf b/arma/client/extra/example_addon/initSettings.inc.sqf new file mode 100644 index 0000000..b29e374 --- /dev/null +++ b/arma/client/extra/example_addon/initSettings.inc.sqf @@ -0,0 +1,6 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(enabled_name), LSTRING(enabled_tooltip)], + _category, true, true +] call CBA_fnc_addSetting; diff --git a/arma/client/extra/example_addon/script_component.hpp b/arma/client/extra/example_addon/script_component.hpp new file mode 100644 index 0000000..ef74027 --- /dev/null +++ b/arma/client/extra/example_addon/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT addonName +#define COMPONENT_BEAUTIFIED Addon Name +#include "\forge\forge_client\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_client\addons\main\script_macros.hpp" diff --git a/arma/client/extra/example_addon/stringtable.xml b/arma/client/extra/example_addon/stringtable.xml new file mode 100644 index 0000000..51ac06f --- /dev/null +++ b/arma/client/extra/example_addon/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Addon Name + + + diff --git a/arma/client/extra/example_subaddon/config.cpp b/arma/client/extra/example_subaddon/config.cpp new file mode 100644 index 0000000..ed5ce38 --- /dev/null +++ b/arma/client/extra/example_subaddon/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + author = AUTHOR; + authors[] = {"You!"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + addonRootClass = QUOTE(ADDON); + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + QUOTE(ADDON) + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; diff --git a/arma/client/extra/example_subaddon/script_component.hpp b/arma/client/extra/example_subaddon/script_component.hpp new file mode 100644 index 0000000..63dfda0 --- /dev/null +++ b/arma/client/extra/example_subaddon/script_component.hpp @@ -0,0 +1,4 @@ +#define SUBCOMPONENT subaddonName +#define SUBCOMPONENT_BEAUTIFIED Sub Addon + +#include "..\script_component.hpp" diff --git a/arma/client/extra/notify.wav b/arma/client/extra/notify.wav new file mode 100644 index 0000000..88a18e1 Binary files /dev/null and b/arma/client/extra/notify.wav differ diff --git a/arma/client/icon_128_ca.paa b/arma/client/icon_128_ca.paa new file mode 100644 index 0000000..02dc39e Binary files /dev/null and b/arma/client/icon_128_ca.paa differ diff --git a/arma/client/icon_128_highlight_ca.paa b/arma/client/icon_128_highlight_ca.paa new file mode 100644 index 0000000..8374f2a Binary files /dev/null and b/arma/client/icon_128_highlight_ca.paa differ diff --git a/arma/client/icon_64_ca.paa b/arma/client/icon_64_ca.paa new file mode 100644 index 0000000..afcab39 Binary files /dev/null and b/arma/client/icon_64_ca.paa differ diff --git a/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc b/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 0000000..4031b6b --- /dev/null +++ b/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,190 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/arma/client/include/x/cba/addons/main/script_macros_common.hpp b/arma/client/include/x/cba/addons/main/script_macros_common.hpp new file mode 100644 index 0000000..be13021 --- /dev/null +++ b/arma/client/include/x/cba/addons/main/script_macros_common.hpp @@ -0,0 +1,1833 @@ +/* + Header: script_macros_common.hpp + + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + + Authors: + Sickboy and Spooner +*/ + +/* **************************************************** + New - Should be exported to general addon + Aim: + - Simplify (shorten) the amount of characters required for repetitive tasks + - Provide a solid structure that can be dynamic and easy editable (Which sometimes means we cannot adhere to Aim #1 ;-) + An example is the path that is built from defines. Some available in this file, others in mods and addons. + + Follows Standard: + Object variables: PREFIX_COMPONENT + Main-object variables: PREFIX_main + Paths: MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SCRIPTNAME.sqf + e.g: x\six\addons\sys_menu\fDate.sqf + + Usage: + define PREFIX and COMPONENT, then include this file + (Note, you could have a main addon for your mod, define the PREFIX in a macros.hpp, + and include this script_macros_common.hpp file. + Then in your addons, add a component.hpp, define the COMPONENT, + and include your mod's script_macros.hpp + In your scripts you can then include the addon's component.hpp with relative path) + + TODO: + - Try only to use 1 string type " vs ' + - Evaluate double functions, and simplification + - Evaluate naming scheme; current = prototype + - Evaluate "Debug" features.. + - Evaluate "create mini function per precompiled script, that will load the script on first usage, rather than on init" + - Also saw "Namespace" typeName, evaluate which we need :P + - Single/Multi player gamelogics? (Incase of MP, you would want only 1 gamelogic per component, which is pv'ed from server, etc) + */ + +#ifndef MAINPREFIX + #define MAINPREFIX x +#endif + +#ifndef SUBPREFIX + #define SUBPREFIX addons +#endif + +#ifndef MAINLOGIC + #define MAINLOGIC main +#endif + +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ +#ifndef VERSION + #define VERSION 0 +#endif + +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + +#ifndef VERSION_AR + #define VERSION_AR VERSION +#endif + +#ifndef VERSION_CONFIG + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} +#endif + +/* ------------------------------------------- +Group: Debugging +------------------------------------------- */ + +/* ------------------------------------------- +Macros: DEBUG_MODE_x + Managing debugging based on debug level. + + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. + +Examples: + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) + + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) + + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) + +Author: + Spooner +------------------------------------------- */ + +// If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. +#ifdef DEBUG_MODE_FULL +#define DEBUG_MODE_NORMAL +#endif + +// If DEBUG_MODE_NORMAL, then also enable DEBUG_MODE_MINIMAL. +#ifdef DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +// If no debug modes specified, use DEBUG_MODE_NORMAL (+ DEBUG_MODE_MINIMAL). +#ifndef DEBUG_MODE_MINIMAL +#define DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +#define LOG_SYS_FORMAT(LEVEL,MESSAGE) format ['[%1] (%2) %3: %4', toUpper 'PREFIX', 'COMPONENT', LEVEL, MESSAGE] + +#ifdef DEBUG_SYNCHRONOUS +#define LOG_SYS(LEVEL,MESSAGE) diag_log text LOG_SYS_FORMAT(LEVEL,MESSAGE) +#else +#define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log +#endif + +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) + +/* ------------------------------------------- +Macro: LOG() + Log a debug message into the RPT log. + + Only run if is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_FULL + +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) +#define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) +#define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) LOG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) LOG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) LOG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) LOG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) LOG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define LOG(MESSAGE) /* disabled */ +#define LOG_1(MESSAGE,ARG1) /* disabled */ +#define LOG_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: INFO() + Record a message without file and line number in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + INFO("Mod X is loaded, do Y"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define INFO(MESSAGE) LOG_SYS('INFO',MESSAGE) +#define INFO_1(MESSAGE,ARG1) INFO(FORMAT_1(MESSAGE,ARG1)) +#define INFO_2(MESSAGE,ARG1,ARG2) INFO(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define INFO_3(MESSAGE,ARG1,ARG2,ARG3) INFO(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define INFO_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) INFO(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define INFO_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) INFO(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define INFO_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) INFO(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define INFO_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) INFO(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define INFO_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) INFO(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: WARNING() + Record a non-critical error in the RPT log. + + Only run if or higher is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_NORMAL + +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) +#define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) +#define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) WARNING(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) WARNING(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) WARNING(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) WARNING(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) WARNING(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define WARNING(MESSAGE) /* disabled */ +#define WARNING_1(MESSAGE,ARG1) /* disabled */ +#define WARNING_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: ERROR() + Record a critical error in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR("value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) +#define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_WITH_TITLE() + Record a critical error in the RPT log. + + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + TITLE - Title of error message + MESSAGE - Body of error message + +Example: + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line in the RPT log. + +Parameters: + TITLE - Title of log message + MESSAGE - Body of message + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) LOG_SYS_FILELINENUMBERS(TITLE,MESSAGE) + +/* ------------------------------------------- +Macro: RETDEF() + If a variable is undefined, return the default value. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + DEFAULT_VALUE - the default value to use if variable is undefined + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=5" + _var = 7; + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=7" + (end example) +Author: + 654wak654 +------------------------------------------- */ +#define RETDEF(VARIABLE,DEFAULT_VALUE) (if (isNil {VARIABLE}) then [{DEFAULT_VALUE}, {VARIABLE}]) + +/* ------------------------------------------- +Macro: RETNIL() + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var)]; // "_var=any" + (end example) + +Author: + Alef (see CBA issue #8514) +------------------------------------------- */ +#define RETNIL(VARIABLE) RETDEF(VARIABLE,nil) + +/* ------------------------------------------- +Macros: TRACE_n() + Log a message and 1-8 variables to the RPT log. + + Only run if is defined. + + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + +Parameters: + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] + +Example: + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) + +Author: + Spooner +------------------------------------------- */ +#define PFORMAT_1(MESSAGE,A) \ + format ['%1: A=%2', MESSAGE, RETNIL(A)] + +#define PFORMAT_2(MESSAGE,A,B) \ + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + +#define PFORMAT_3(MESSAGE,A,B,C) \ + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + +#define PFORMAT_4(MESSAGE,A,B,C,D) \ + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + +#define PFORMAT_5(MESSAGE,A,B,C,D,E) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + +#define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + +#define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + +#define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + +#define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + + +#ifdef DEBUG_MODE_FULL +#define TRACE_1(MESSAGE,A) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_1(str diag_frameNo + ' ' + (MESSAGE),A)) +#define TRACE_2(MESSAGE,A,B) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_2(str diag_frameNo + ' ' + (MESSAGE),A,B)) +#define TRACE_3(MESSAGE,A,B,C) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_3(str diag_frameNo + ' ' + (MESSAGE),A,B,C)) +#define TRACE_4(MESSAGE,A,B,C,D) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_4(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D)) +#define TRACE_5(MESSAGE,A,B,C,D,E) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_5(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E)) +#define TRACE_6(MESSAGE,A,B,C,D,E,F) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_6(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F)) +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_7(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G)) +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_8(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H)) +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_9(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I)) +#else +#define TRACE_1(MESSAGE,A) /* disabled */ +#define TRACE_2(MESSAGE,A,B) /* disabled */ +#define TRACE_3(MESSAGE,A,B,C) /* disabled */ +#define TRACE_4(MESSAGE,A,B,C,D) /* disabled */ +#define TRACE_5(MESSAGE,A,B,C,D,E) /* disabled */ +#define TRACE_6(MESSAGE,A,B,C,D,E,F) /* disabled */ +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) /* disabled */ +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) /* disabled */ +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) /* disabled */ +#endif + +/* ------------------------------------------- +Group: General +------------------------------------------- */ + +// ************************************* +// Internal Functions +#define DOUBLES(var1,var2) var1##_##var2 +#define TRIPLES(var1,var2,var3) var1##_##var2##_##var3 +#define QUOTE(var1) #var1 + +#ifdef MODULAR + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C +#else + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT +#endif + +/* ------------------------------------------- +Macro: INC() + +Description: + Increase a number by one. + +Parameters: + VAR - Variable to increment [Number] + +Example: + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) + +Author: + Spooner +------------------------------------------- */ +#define INC(var) var = (var) + 1 + +/* ------------------------------------------- +Macro: DEC() + +Description: + Decrease a number by one. + +Parameters: + VAR - Variable to decrement [Number] + +Example: + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEC(var) var = (var) - 1 + +/* ------------------------------------------- +Macro: ADD() + +Description: + Add a value to a variable. Variable and value should be both Numbers or both Strings. + +Parameters: + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] + +Examples: + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ADD(var1,var2) var1 = (var1) + (var2) + +/* ------------------------------------------- +Macro: SUB() + +Description: + Subtract a value from a number variable. VAR and VALUE should both be Numbers. + +Parameters: + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] + +Examples: + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) +------------------------------------------- */ +#define SUB(var1,var2) var1 = (var1) - (var2) + +/* ------------------------------------------- +Macro: REM() + +Description: + Remove an element from an array each time it occurs. + + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. + +Parameters: + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] + +Examples: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) + +Author: + Spooner +------------------------------------------- */ +#define REM(var1,var2) SUB(var1,[var2]) + +/* ------------------------------------------- +Macro: PUSH() + +Description: + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + +Parameters: + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] + +Examples: + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) + +Author: + Spooner +------------------------------------------- */ +#define PUSH(var1,var2) (var1) pushBack (var2) + +/* ------------------------------------------- +Macro: MAP() +Description: + Applies given code to each element of the array, then assigns the + resulting array to the original +Parameters: + ARRAY - Array to be modified + CODE - Code that'll be applied to each element of the array. +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + MAP(_array,_x + 1); + // _array is now [2, 3, 4, 5, 4, 9]; + (end) +Author: + 654wak654 +------------------------------------------- */ +#define MAP(ARR,CODE) ARR = ARR apply {CODE} + +/* ------------------------------------------- +Macro: FILTER() +Description: + Filters an array based on given code, then assigns the resulting array + to the original +Parameters: + ARRAY - Array to be filtered + CODE - Condition to pick elements +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + FILTER(_array,_x % 2 == 0) + // _array is now [2, 4, 8]; + (end) +Author: + Commy2 +------------------------------------------- */ +#define FILTER(ARR,CODE) ARR = ARR select {CODE} + +/* ------------------------------------------- +Macro: UNIQUE() +Description: + Removes duplicate values in given array +Parameters: + ARRAY - The array to be modified +Example: + (begin example) + _someArray = [4, 4, 5, 5, 5, 2]; + UNIQUE(_someArray); + // _someArray is now [4, 5, 2] + (end) +Author: + Commy2 +------------------------------------------- */ +#define UNIQUE(ARR) ARR = ARR arrayIntersect ARR + +/* ------------------------------------------- +Macro: INTERSECTION() +Description: + Finds unique common elements between two arrays and assigns them + to the first array +Parameters: + ARRAY0 - The array to be modified + ARRAY1 - The array to find intersections with +Example: + (begin example) + _someArray = [1, 2, 3, 4, 5, 5]; + _anotherArray = [4, 5, 6, 7]; + INTERSECTION(_someArray,_anotherArray); + // _someArray is now [4, 5] + (end) +Author: + 654wak654 +------------------------------------------- */ +#define INTERSECTION(ARG0,ARG1) ARG0 = ARG0 arrayIntersect (ARG1) + +/* ------------------------------------------- +Macro: ISNILS() + +Description: + Sets a variable with a value, but only if it is undefined. + +Parameters: + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + +Examples: + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { VARIABLE = DEFAULT_VALUE } +#define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) +#define ISNILS3(var1,var2,var3) ISNILS(DOUBLES(var1,var2),var3) +#define ISNIL(var1,var2) ISNILS2(PREFIX,COMPONENT,var1,var2) +#define ISNILMAIN(var1,var2) ISNILS3(PREFIX,var1,var2) + +#define CREATELOGICS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"] +#define CREATELOGICLOCALS(var1,var2) var1##_##var2 = "LOGIC" createVehicleLocal [0, 0, 0] +#define CREATELOGICGLOBALS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"]; publicVariable QUOTE(DOUBLES(var1,var2)) +#define CREATELOGICGLOBALTESTS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit [QUOTE(DOUBLES(ADDON,logic)), [0, 0, 0], [], 0, "NONE"] + +#define GETVARS(var1,var2,var3) (var1##_##var2 getVariable #var3) +#define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) + +#ifndef PATHTO_SYS + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3.sqf +#endif +#ifndef PATHTOF_SYS + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#ifndef PATHTOF2_SYS + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_T(var1) PATHTOF_SYS(PREFIX,COMPONENT_T,var1) +#define PATHTO_M(var1) PATHTOF_SYS(PREFIX,COMPONENT_M,var1) +#define PATHTO_S(var1) PATHTOF_SYS(PREFIX,COMPONENT_S,var1) +#define PATHTO_C(var1) PATHTOF_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_F(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) + +// Already quoted "" +#define QPATHTO_R(var1) QUOTE(PATHTO_R(var1)) +#define QPATHTO_T(var1) QUOTE(PATHTO_T(var1)) +#define QPATHTO_M(var1) QUOTE(PATHTO_M(var1)) +#define QPATHTO_S(var1) QUOTE(PATHTO_S(var1)) +#define QPATHTO_C(var1) QUOTE(PATHTO_C(var1)) +#define QPATHTO_F(var1) QUOTE(PATHTO_F(var1)) + +// This only works for binarized configs after recompiling the pbos +// TODO: Reduce amount of calls / code.. +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 +#define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) + +#define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') +#define COMPILE_FILE_CFG_SYS(var1,var2,var3) COMPILE_FILE2_CFG_SYS('PATHTO_SYS(var1,var2,var3)') + +#define SETVARS(var1,var2) var1##_##var2 setVariable +#define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) +#define GVARMAINS(var1,var2) var1##_##var2 +#define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = + +// Compile-Once, JIT: On first use. +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } + +// Compile-Once, at Macro. As opposed to Compile-Once, on first use. +#define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)) + +#define LSTR(var1) TRIPLES(ADDON,STR,var1) + +#ifndef DEBUG_SETTINGS + #define DEBUG_SETTINGS [false, true, false] +#endif + +#define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) + +// ************************************* +// User Functions +#define CFGSETTINGS CFGSETTINGSS(PREFIX,COMPONENT) +#define PATHTO(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) +#define PATHTOF(var1) PATHTOF_SYS(PREFIX,COMPONENT,var1) +#define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#define QPATHTOF(var1) QUOTE(PATHTOF(var1)) +#define QPATHTOEF(var1,var2) QUOTE(PATHTOEF(var1,var2)) + +#define COMPILE_FILE(var1) COMPILE_FILE_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE_CFG(var1) COMPILE_FILE_CFG_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE2(var1) COMPILE_FILE2_SYS('var1') +#define COMPILE_FILE2_CFG(var1) COMPILE_FILE2_CFG_SYS('var1') + +#define COMPILE_SCRIPT(var1) compileScript ['PATHTO_SYS(PREFIX,COMPONENT_F,var1)'] + + +#define VERSIONING_SYS(var1) class CfgSettings \ +{ \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ +}; + +#define VERSIONING VERSIONING_SYS(PREFIX) + +/* ------------------------------------------- +Macro: GVAR() + Get full variable identifier for a global variable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVAR(var1) DOUBLES(ADDON,var1) +#define EGVAR(var1,var2) TRIPLES(PREFIX,var1,var2) +#define QGVAR(var1) QUOTE(GVAR(var1)) +#define QEGVAR(var1,var2) QUOTE(EGVAR(var1,var2)) +#define QQGVAR(var1) QUOTE(QGVAR(var1)) +#define QQEGVAR(var1,var2) QUOTE(QEGVAR(var1,var2)) + +/* ------------------------------------------- +Macro: GVARMAIN() + Get full variable identifier for a global variable owned by this addon. + +Parameters: + VARIABLE - Partial name of global variable owned by this addon [Any]. + +Example: + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVARMAIN(var1) GVARMAINS(PREFIX,var1) +#define QGVARMAIN(var1) QUOTE(GVARMAIN(var1)) +#define QQGVARMAIN(var1) QUOTE(QGVARMAIN(var1)) +// TODO: What's this? +#define SETTINGS DOUBLES(PREFIX,settings) +#define CREATELOGIC CREATELOGICS(PREFIX,COMPONENT) +#define CREATELOGICGLOBAL CREATELOGICGLOBALS(PREFIX,COMPONENT) +#define CREATELOGICGLOBALTEST CREATELOGICGLOBALTESTS(PREFIX,COMPONENT) +#define CREATELOGICLOCAL CREATELOGICLOCALS(PREFIX,COMPONENT) +#define CREATELOGICMAIN CREATELOGICS(PREFIX,MAINLOGIC) +#define GETVAR(var1) GETVARS(PREFIX,COMPONENT,var1) +#define SETVAR SETVARS(PREFIX,COMPONENT) +#define SETVARMAIN SETVARMAINS(PREFIX) +#define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; + +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ +//#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) + +#ifdef DISABLE_COMPILE_CACHE + #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' + #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' +#else + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW +#endif + +/* ------------------------------------------- +Macro: PATHTO_FNC() + +Description: + Defines a function inside CfgFunctions. + + Full file path in addons: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + // file name: fnc_addPerFrameHandler.sqf + class CfgFunctions { + class CBA { + class Misc { + PATHTO_FNC(addPerFrameHandler); + }; + }; + }; + // -> CBA_fnc_addPerFrameHandler + (end) + +Author: + dixon13, commy2 + ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + +#define PATHTO_FNC(func) class func {\ + file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ + RECOMPILE;\ +} + +#define FUNC(var1) TRIPLES(ADDON,fnc,var1) +#define FUNCMAIN(var1) TRIPLES(PREFIX,fnc,var1) +#define FUNC_INNER(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) +#define EFUNC(var1,var2) FUNC_INNER(var1,var2) +#define QFUNC(var1) QUOTE(FUNC(var1)) +#define QFUNCMAIN(var1) QUOTE(FUNCMAIN(var1)) +#define QFUNC_INNER(var1,var2) QUOTE(FUNC_INNER(var1,var2)) +#define QEFUNC(var1,var2) QUOTE(EFUNC(var1,var2)) +#define QQFUNC(var1) QUOTE(QFUNC(var1)) +#define QQFUNCMAIN(var1) QUOTE(QFUNCMAIN(var1)) +#define QQFUNC_INNER(var1,var2) QUOTE(QFUNC_INNER(var1,var2)) +#define QQEFUNC(var1,var2) QUOTE(QEFUNC(var1,var2)) + +#ifndef PRELOAD_ADDONS + #define PRELOAD_ADDONS class CfgAddons \ +{ \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ +} +#endif + +/* ------------------------------------------- +Macros: ARG_#() + Select from list of array arguments + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Rommel +------------------------------------------- */ +#define ARG_1(A,B) ((A) select (B)) +#define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) +#define ARG_3(A,B,C,D) (ARG_1(ARG_2(A,B,C),D)) +#define ARG_4(A,B,C,D,E) (ARG_1(ARG_3(A,B,C,D),E)) +#define ARG_5(A,B,C,D,E,F) (ARG_1(ARG_4(A,B,C,D,E),F)) +#define ARG_6(A,B,C,D,E,F,G) (ARG_1(ARG_5(A,B,C,D,E,F),G)) +#define ARG_7(A,B,C,D,E,F,G,H) (ARG_1(ARG_6(A,B,C,D,E,E,F,G),H)) +#define ARG_8(A,B,C,D,E,F,G,H,I) (ARG_1(ARG_7(A,B,C,D,E,E,F,G,H),I)) + +/* ------------------------------------------- +Macros: ARR_#() + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Nou +------------------------------------------- */ +#define ARR_1(ARG1) ARG1 +#define ARR_2(ARG1,ARG2) ARG1, ARG2 +#define ARR_3(ARG1,ARG2,ARG3) ARG1, ARG2, ARG3 +#define ARR_4(ARG1,ARG2,ARG3,ARG4) ARG1, ARG2, ARG3, ARG4 +#define ARR_5(ARG1,ARG2,ARG3,ARG4,ARG5) ARG1, ARG2, ARG3, ARG4, ARG5 +#define ARR_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 +#define ARR_7(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 +#define ARR_8(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 + +/* ------------------------------------------- +Macros: FORMAT_#(STR, ARG1) + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + STRING - string used by format + VARIABLE(1-8) - elements for usage in format + +Author: + Nou & Sickboy +------------------------------------------- */ +#define FORMAT_1(STR,ARG1) format[STR, ARG1] +#define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] +#define FORMAT_3(STR,ARG1,ARG2,ARG3) format[STR, ARG1, ARG2, ARG3] +#define FORMAT_4(STR,ARG1,ARG2,ARG3,ARG4) format[STR, ARG1, ARG2, ARG3, ARG4] +#define FORMAT_5(STR,ARG1,ARG2,ARG3,ARG4,ARG5) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5] +#define FORMAT_6(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6] +#define FORMAT_7(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7] +#define FORMAT_8(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8] + +// CONTROL(46) 12 +#define DISPLAY(A) (findDisplay A) +#define CONTROL(A) DISPLAY(A) displayCtrl + +/* ------------------------------------------- +Macros: IS_x() + Checking the data types of variables. + + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. + +Parameters: + VARIABLE - Variable to check if it is of a particular type [Any, not nil] + +Author: + Spooner +------------------------------------------- */ +#define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then {false} else {(VAR) isEqualType TYPE}) +#define IS_ARRAY(VAR) IS_META_SYS(VAR,[]) +#define IS_BOOL(VAR) IS_META_SYS(VAR,false) +#define IS_CODE(VAR) IS_META_SYS(VAR,{}) +#define IS_CONFIG(VAR) IS_META_SYS(VAR,configNull) +#define IS_CONTROL(VAR) IS_META_SYS(VAR,controlNull) +#define IS_DISPLAY(VAR) IS_META_SYS(VAR,displayNull) +#define IS_GROUP(VAR) IS_META_SYS(VAR,grpNull) +#define IS_OBJECT(VAR) IS_META_SYS(VAR,objNull) +#define IS_SCALAR(VAR) IS_META_SYS(VAR,0) +#define IS_SCRIPT(VAR) IS_META_SYS(VAR,scriptNull) +#define IS_SIDE(VAR) IS_META_SYS(VAR,west) +#define IS_STRING(VAR) IS_META_SYS(VAR,"STRING") +#define IS_TEXT(VAR) IS_META_SYS(VAR,text "") +#define IS_LOCATION(VAR) IS_META_SYS(VAR,locationNull) + +#define IS_BOOLEAN(VAR) IS_BOOL(VAR) +#define IS_FUNCTION(VAR) IS_CODE(VAR) +#define IS_INTEGER(VAR) (if (IS_SCALAR(VAR)) then {floor (VAR) == (VAR)} else {false}) +#define IS_NUMBER(VAR) IS_SCALAR(VAR) + +#define FLOAT_TO_STRING(num) (if (_this == 0) then {"0"} else {str parseNumber (str (_this % _this) + str floor abs _this) + "." + (str (abs _this - floor abs _this) select [2]) + "0"}) + +/* ------------------------------------------- +Macro: SCRIPT() + Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. + +Parameters: + NAME - Name of script [Indentifier] + +Example: + (begin example) + SCRIPT(eradicateMuppets); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif + +/* ------------------------------------------- +Macros: EXPLODE_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Splitting an ARRAY into a number of variables (A, B, C, etc). + + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + +Parameters: + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] + +Example: + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) + +Author: + Spooner +------------------------------------------- */ +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] +#define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) + +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] +#define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) + +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] +#define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] +#define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) + +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] +#define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) + +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] +#define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) + +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] +#define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) + +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] +#define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) + +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] +#define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) + + #define LLSTRING(var1) localize QUOTE(TRIPLES(STR,ADDON,var1)) + #define LELSTRING(var1,var2) localize QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) +#endif + + +/* ------------------------------------------- +Group: Managing Function Parameters +------------------------------------------- */ + +/* ------------------------------------------- +Macros: PARAMS_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Setting variables based on parameters passed to a function. + + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + +Parameters: + A..H - Name of variable to read from _this [Identifier] + +Example: + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define PARAMS_1(A) EXPLODE_1_PVT(_this,A) +#define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) +#define PARAMS_3(A,B,C) EXPLODE_3_PVT(_this,A,B,C) +#define PARAMS_4(A,B,C,D) EXPLODE_4_PVT(_this,A,B,C,D) +#define PARAMS_5(A,B,C,D,E) EXPLODE_5_PVT(_this,A,B,C,D,E) +#define PARAMS_6(A,B,C,D,E,F) EXPLODE_6_PVT(_this,A,B,C,D,E,F) +#define PARAMS_7(A,B,C,D,E,F,G) EXPLODE_7_PVT(_this,A,B,C,D,E,F,G) +#define PARAMS_8(A,B,C,D,E,F,G,H) EXPLODE_8_PVT(_this,A,B,C,D,E,F,G,H) +#define PARAMS_9(A,B,C,D,E,F,G,H,I) EXPLODE_9_PVT(_this,A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: DEFAULT_PARAM() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. + +Parameters: + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + +Example: + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + +/* ------------------------------------------- +Macro: KEY_PARAM() + Get value from key in _this list, return default when key is not included in list. + +Parameters: + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] + +Example: + + +Author: + Muzzleflash +------------------------------------------- */ +#define KEY_PARAM(KEY,NAME,DEF_VALUE) \ + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + +/* ------------------------------------------- +Group: Assertions +------------------------------------------- */ + +#define ASSERTION_ERROR(MESSAGE) ERROR_WITH_TITLE("Assertion failed!",MESSAGE) + +/* ------------------------------------------- +Macro: ASSERT_TRUE() + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_TRUE(CONDITION,MESSAGE) \ + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_FALSE() + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_FALSE(CONDITION,MESSAGE) \ + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } + +/* ------------------------------------------- +Macro: ASSERT_OP() + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_DEFINED() + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_DEFINED(VARIABLE,MESSAGE) \ + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED_AND_OP() + Tests that A and B are defined and (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch, PabstMirror +------------------------------------------- */ +#define TEST_DEFINED_AND_OP(A,OPERATOR,B,MESSAGE) \ + if (isNil #A) then { \ + TEST_FAIL('(A is not defined) ' + (MESSAGE)); \ + } else { \ + if (isNil #B) then { \ + TEST_FAIL('(B is not defined) ' + (MESSAGE)); \ + } else { \ + if ((A) OPERATOR (B)) then { \ + TEST_SUCCESS('(A OPERATOR B) ' + (MESSAGE)) \ + } else { \ + TEST_FAIL('(A OPERATOR B) ' + (MESSAGE)) \ + }; }; }; + + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Managing Deprecation +------------------------------------------- */ + +/* ------------------------------------------- +Macro: DEPRECATE_SYS() + Allow deprecation of a function that has been renamed. + + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } + +/* ------------------------------------------- +Macro: DEPRECATE() + Allow deprecation of a function, in the current component, that has been renamed. + + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + +/* ------------------------------------------- +Macro: OBSOLETE_SYS() + Replace a function that has become obsolete. + + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, and runs the command function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } + +/* ------------------------------------------- +Macro: OBSOLETE() + Replace a function, in the current component, that has become obsolete. + + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. + + Shows a warning in RPT each time the deprecated function is used. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + +#define BWC_CONFIG(NAME) class NAME { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ +} + +// XEH Specific +#define XEH_CLASS CBA_Extended_EventHandlers +#define XEH_CLASS_BASE DOUBLES(XEH_CLASS,base) +#define XEH_DISABLED class EventHandlers { class XEH_CLASS {}; }; SLX_XEH_DISABLED = 1 +#define XEH_ENABLED class EventHandlers { class XEH_CLASS { EXTENDED_EVENTHANDLERS }; }; SLX_XEH_DISABLED = 0 + +// TODO: These are actually outdated; _Once ? +#define XEH_PRE_INIT QUOTE(call COMPILE_FILE(XEH_PreInit_Once)) +#define XEH_PRE_CINIT QUOTE(call COMPILE_FILE(XEH_PreClientInit_Once)) +#define XEH_PRE_SINIT QUOTE(call COMPILE_FILE(XEH_PreServerInit_Once)) + +#define XEH_POST_INIT QUOTE(call COMPILE_FILE(XEH_PostInit_Once)) +#define XEH_POST_CINIT QUOTE(call COMPILE_FILE(XEH_PostClientInit_Once)) +#define XEH_POST_SINIT QUOTE(call COMPILE_FILE(XEH_PostServerInit_Once)) + +/* ------------------------------------------- +Macro: IS_ADMIN + Check if the local machine is an admin in the multiplayer environment. + + Reports 'true' for logged and voted in admins. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin + systemChat str IS_ADMIN; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' + +/* ------------------------------------------- +Macro: IS_ADMIN_LOGGED + Check if the local machine is a logged in admin in the multiplayer environment. + + Reports 'false' if the player was voted to be the admin. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin and entered in the server password + systemChat str IS_ADMIN_LOGGED; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' + +/* ------------------------------------------- +Macro: FILE_EXISTS + Check if a file exists + + Reports "false" if the file does not exist. + +Parameters: + FILE - Path to the file + +Example: + (begin example) + // print "true" if file exists + systemChat str FILE_EXISTS("\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/arma/client/include/x/cba/addons/xeh/script_xeh.hpp b/arma/client/include/x/cba/addons/xeh/script_xeh.hpp new file mode 100644 index 0000000..2eba000 --- /dev/null +++ b/arma/client/include/x/cba/addons/xeh/script_xeh.hpp @@ -0,0 +1,118 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ +///////////////////////////////////////////////////////////////////////////////// +// MACRO: EXTENDED_EVENTHANDLERS +// Add all XEH event handlers +///////////////////////////////////////////////////////////////////////////////// + +#define EXTENDED_EVENTHANDLERS init = "call cba_xeh_fnc_init"; \ +fired = "call cba_xeh_fnc_fired"; \ +animChanged = "call cba_xeh_fnc_animChanged"; \ +animDone = "call cba_xeh_fnc_animDone"; \ +animStateChanged = "call cba_xeh_fnc_animStateChanged"; \ +containerClosed = "call cba_xeh_fnc_containerClosed"; \ +containerOpened = "call cba_xeh_fnc_containerOpened"; \ +controlsShifted = "call cba_xeh_fnc_controlsShifted"; \ +dammaged = "call cba_xeh_fnc_dammaged"; \ +engine = "call cba_xeh_fnc_engine"; \ +epeContact = "call cba_xeh_fnc_epeContact"; \ +epeContactEnd = "call cba_xeh_fnc_epeContactEnd"; \ +epeContactStart = "call cba_xeh_fnc_epeContactStart"; \ +explosion = "call cba_xeh_fnc_explosion"; \ +firedNear = "call cba_xeh_fnc_firedNear"; \ +fuel = "call cba_xeh_fnc_cba_xeh_fuel"; \ +gear = "call cba_xeh_fnc_gear"; \ +getIn = "call cba_xeh_fnc_getIn"; \ +getInMan = "call cba_xeh_fnc_getInMan"; \ +getOut = "call cba_xeh_fnc_getOut"; \ +getOutMan = "call cba_xeh_fnc_getOutMan"; \ +handleHeal = "call cba_xeh_fnc_handleHeal"; \ +hit = "call cba_xeh_fnc_hit"; \ +hitPart = "call cba_xeh_fnc_hitPart"; \ +incomingMissile = "call cba_xeh_fnc_incomingMissile"; \ +inventoryClosed = "call cba_xeh_fnc_inventoryClosed"; \ +inventoryOpened = "call cba_xeh_fnc_inventoryOpened"; \ +killed = "call cba_xeh_fnc_killed"; \ +landedTouchDown = "call cba_xeh_fnc_landedTouchDown"; \ +landedStopped = "call cba_xeh_fnc_landedStopped"; \ +local = "call cba_xeh_fnc_local"; \ +respawn = "call cba_xeh_fnc_respawn"; \ +put = "call cba_xeh_fnc_put"; \ +take = "call cba_xeh_fnc_take"; \ +seatSwitched = "call cba_xeh_fnc_seatSwitched"; \ +seatSwitchedMan = "call cba_xeh_fnc_seatSwitchedMan"; \ +soundPlayed = "call cba_xeh_fnc_soundPlayed"; \ +weaponAssembled = "call cba_xeh_fnc_weaponAssembled"; \ +weaponDisassembled = "call cba_xeh_fnc_weaponDisassembled"; \ +weaponDeployed = "call cba_xeh_fnc_weaponDeployed"; \ +weaponRested = "call cba_xeh_fnc_weaponRested"; \ +reloaded = "call cba_xeh_fnc_reloaded"; \ +firedMan = "call cba_xeh_fnc_firedMan"; \ +turnIn = "call cba_xeh_fnc_turnIn"; \ +turnOut = "call cba_xeh_fnc_turnOut"; \ +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; \ +gestureChanged = "call cba_xeh_fnc_gestureChanged"; \ +gestureDone = "call cba_xeh_fnc_gestureDone"; + +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. +*/ + +#define DELETE_EVENTHANDLERS init = ""; \ +fired = ""; \ +animChanged = ""; \ +animDone = ""; \ +animStateChanged = ""; \ +containerClosed = ""; \ +containerOpened = ""; \ +controlsShifted = ""; \ +dammaged = ""; \ +engine = ""; \ +epeContact = ""; \ +epeContactEnd = ""; \ +epeContactStart = ""; \ +explosion = ""; \ +firedNear = ""; \ +fuel = ""; \ +gear = ""; \ +getIn = ""; \ +getInMan = ""; \ +getOut = ""; \ +getOutMan = ""; \ +handleHeal = ""; \ +hit = ""; \ +hitPart = ""; \ +incomingMissile = ""; \ +inventoryClosed = ""; \ +inventoryOpened = ""; \ +killed = ""; \ +landedTouchDown = ""; \ +landedStopped = ""; \ +local = ""; \ +respawn = ""; \ +put = ""; \ +take = ""; \ +seatSwitched = ""; \ +seatSwitchedMan = ""; \ +soundPlayed = ""; \ +weaponAssembled = ""; \ +weaponDisassembled = ""; \ +weaponDeployed = ""; \ +weaponRested = ""; \ +reloaded = ""; \ +firedMan = ""; \ +turnIn = ""; \ +turnOut = ""; \ +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; \ +gestureChanged = ""; \ +gestureDone = "" diff --git a/arma/client/meta.cpp b/arma/client/meta.cpp new file mode 100644 index 0000000..1ef1072 --- /dev/null +++ b/arma/client/meta.cpp @@ -0,0 +1,4 @@ +protocol = 1; +publishedid = MOD_ID; +name = "forge-client"; +timestamp = 5250140732737923549; diff --git a/arma/client/mod.cpp b/arma/client/mod.cpp new file mode 100644 index 0000000..c833d00 --- /dev/null +++ b/arma/client/mod.cpp @@ -0,0 +1,15 @@ +dir = "@forge_client"; +author = "J.Schmidt"; +name = "Forge Client"; +description = "Forge Client - Version 1.0.0"; +overview = ""; +overviewPicture = "title_ca.paa"; +picture = "title_ca.paa"; +logoSmall = "icon_64_ca.paa"; +logo = "icon_128_ca.paa"; +logoOver = "icon_128_highlight_ca.paa"; +tooltip = "Forge Client"; +tooltipOwned = "IDS Owned"; +action = "https://innovativedevsolutions.org"; +actionName = "Website"; +dlcColor[] = {0.45, 0.47, 0.41, 1}; diff --git a/arma/client/title_ca.paa b/arma/client/title_ca.paa new file mode 100644 index 0000000..f46f6d0 Binary files /dev/null and b/arma/client/title_ca.paa differ diff --git a/arma/client/tools/config_style_checker.py b/arma/client/tools/config_style_checker.py new file mode 100644 index 0000000..2332750 --- /dev/null +++ b/arma/client/tools/config_style_checker.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + reIsClass = re.compile(r'^\s*class(.*)') + reIsClassInherit = re.compile(r'^\s*class(.*):') + reIsClassBody = re.compile(r'^\s*class(.*){') + reBadColon = re.compile(r'\s*class (.*) :') + reSpaceAfterColon = re.compile(r'\s*class (.*): ') + reSpaceBeforeCurly = re.compile(r'\s*class (.*) {') + reClassSingleLine = re.compile(r'\s*class (.*)[{;]') + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + + file.seek(0) + for lineNumber, line in enumerate(file.readlines()): + if reIsClass.match(line): + if reBadColon.match(line): + print(f"WARNING: bad class colon {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + if reIsClassInherit.match(line): + if not reSpaceAfterColon.match(line): + print(f"WARNING: bad class missing space after colon {filepath} Line number: {lineNumber+1}") + if reIsClassBody.match(line): + if not reSpaceBeforeCurly.match(line): + print(f"WARNING: bad class inherit missing space before curly braces {filepath} Line number: {lineNumber+1}") + if not reClassSingleLine.match(line): + print(f"WARNING: bad class braces placement {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.rvmat'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cfg'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/arma/client/tools/release.bat b/arma/client/tools/release.bat new file mode 100644 index 0000000..667a74c --- /dev/null +++ b/arma/client/tools/release.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_minor.rhai +hemtt release diff --git a/arma/client/tools/release_patch.bat b/arma/client/tools/release_patch.bat new file mode 100644 index 0000000..ec4db02 --- /dev/null +++ b/arma/client/tools/release_patch.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_patch.rhai +hemtt release diff --git a/arma/server/.editorconfig b/arma/server/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/arma/server/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/arma/server/.gitattributes b/arma/server/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/arma/server/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/arma/server/.github/CONTRIBUTING.md b/arma/server/.github/CONTRIBUTING.md new file mode 100644 index 0000000..a378b46 --- /dev/null +++ b/arma/server/.github/CONTRIBUTING.md @@ -0,0 +1,17 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment + +### 1. Clone the repository from GitHub + +### 2. Install HEMTT + +The latest version of HEMTT can be installed by running: + +```cmd +winget install hemtt +``` + +## Coding Guidelines + +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/arma/server/.github/ISSUE_TEMPLATE/bug-report.md b/arma/server/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..2e818b5 --- /dev/null +++ b/arma/server/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: "" +labels: kind/bug +--- + +## Describe the bug + +A clear and concise description of what the bug is. + +## To reproduce + +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior + +A clear and concise description of what you expected to happen. + +## Attachments + +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context + +Add any other context about the problem here. diff --git a/arma/server/.github/ISSUE_TEMPLATE/feature-request.md b/arma/server/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..7bd655d --- /dev/null +++ b/arma/server/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: "" +labels: kind/feature-request +--- + +## Describe the feature that you would like + +A clear and concise description of the feature you'd want. + +## Possible alternatives + +Possible alternatives to your suggestion. + +## Additional context + +Add any other context about the feature here. diff --git a/arma/server/.github/PULL_REQUEST_TEMPLATE.md b/arma/server/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..1721684 --- /dev/null +++ b/arma/server/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +**When merged this pull request will:** + +- Describe what this pull request will do +- Each change in a separate line + +### Important + +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + + +### Known Issues + +- [ ] Issue diff --git a/arma/server/.github/assets/placeholder.txt b/arma/server/.github/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/server/.github/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/server/.github/workflows/check.yml b/arma/server/.github/workflows/check.yml new file mode 100644 index 0000000..abb328f --- /dev/null +++ b/arma/server/.github/workflows/check.yml @@ -0,0 +1,28 @@ +name: HEMTT + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + + - name: Validate Config + run: python tools/config_style_checker.py + - name: Check for BOM + uses: arma-actions/bom-check@master + with: + path: "addons" + + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT check + run: hemtt check --pedantic diff --git a/arma/server/.gitignore b/arma/server/.gitignore new file mode 100644 index 0000000..41f642f --- /dev/null +++ b/arma/server/.gitignore @@ -0,0 +1,18 @@ +# HEMTT +hemtt.exe +.hemtt/missions/~* +.hemttout/ +releases/ +.hemttprivatekey + +# Textures +Exports/ +*.spp +*.spp.painter_lock +*.psd + +# Other +*.biprivatekey +*.zip +*.pbo +*.sqfc diff --git a/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml b/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml new file mode 100644 index 0000000..97b2d5f --- /dev/null +++ b/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml @@ -0,0 +1,28 @@ +name: ctrlWebBrowserAction +description: Executes an action on a web browser control +groups: + - GUI Control +syntax: + - call: !Binary [control, actionArray] + ret: + - Nothing + - Nothing + params: + - name: control + type: Control + description: Web browser control to execute action on + - name: actionArray + type: ArrayUnknown + description: | + Array in format [actionType, actionData] where: + - actionType (String): Type of action ("ExecJS", "LoadURL", "Reload", "Stop", etc.) + - actionData (String): Data for the action (JavaScript code for ExecJS, URL for LoadURL, empty string for others) +argument_loc: Local +effect_loc: Local +since: + arma_3: + major: 2 + minor: 2 +examples: + - _control ctrlWebBrowserAction ["ExecJS", "document.getElementById('test').innerHTML = 'Hello World!'"]; + - _control ctrlWebBrowserAction ["LoadURL", "https://community.bistudio.com"]; diff --git a/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai b/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai new file mode 100644 index 0000000..eb59898 --- /dev/null +++ b/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai @@ -0,0 +1,13 @@ +let readme = HEMTT_RFS.join("docs") + .join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_RFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai b/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000..c7930cd --- /dev/null +++ b/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,26 @@ +let modcpp = HEMTT_VFS.join("mod.cpp") + .open_file() + .read(); +modcpp.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("mod.cpp") + .create_file() + .write(modcpp); +print("mod.cpp version set to " + HEMTT.project().version()); + +// Currently unused, but included anyway +let readme = HEMTT_VFS.join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/server/.hemtt/launch.toml b/arma/server/.hemtt/launch.toml new file mode 100644 index 0000000..1e2e390 --- /dev/null +++ b/arma/server/.hemtt/launch.toml @@ -0,0 +1,16 @@ +[default] +workshop = [ + "450814997", # CBA_A3 + "3499977893", # Advanced Dev Tools + "623475643", # 3DEN Enhanced +] +presets = [] +dlc = [] +optionals = [] +parameters = [] + +[ace] +extends = "default" +workshop = [ + "463939057", # ACE +] diff --git a/arma/server/.hemtt/lints.toml b/arma/server/.hemtt/lints.toml new file mode 100644 index 0000000..87607ed --- /dev/null +++ b/arma/server/.hemtt/lints.toml @@ -0,0 +1,35 @@ +[sqf.banned_commands] +options.banned = [ + # "spawn", # Scheduled should be avoided whenever possible + "execVM", # Script files should never be run directly, they should be functions + # "remoteExec", # CBA events should be used for networking +] + +[sqf.banned_macros] +options.release = [ + "DEBUG_MODE_FULL", + "DISABLE_COMPILE_CACHE" +] + +[sqf.this_call] +enabled = true + +[sqf.undefined] +enabled = true +options.check_orphan_code = true + +[sqf.unused] +enabled = true # many false positives without DEBUG_MODE_FULL +options.check_params = false + +[sqf.shadowed] +enabled = false + +[sqf.not_private] +enabled = true + +[config.file_type] +options.allow_no_extension = false + +[stringtables.usage] +options.ignore_unused = true diff --git a/arma/server/.hemtt/project.toml b/arma/server/.hemtt/project.toml new file mode 100644 index 0000000..febc71a --- /dev/null +++ b/arma/server/.hemtt/project.toml @@ -0,0 +1,26 @@ +name = "forge-server" +author = "J.Schmidt" +prefix = "forge_server" +mainprefix = "forge" + +[version] +path = "addons/main/script_version.hpp" +git_hash = 0 + +[files] +include = [ + "mod.cpp", + "meta.cpp", + "icon_64_ca.paa", + "icon_128_ca.paa", + "icon_128_highlight_ca.paa", + "title_ca.paa", + "config.example.toml", + "LICENSE.md", + "README.md", + "surrealdb/**/*", +] +exclude = [] + +[properties] +author = "J.Schmidt" diff --git a/arma/server/.hemtt/scripts/update_build.rhai b/arma/server/.hemtt/scripts/update_build.rhai new file mode 100644 index 0000000..14bdbeb --- /dev/null +++ b/arma/server/.hemtt/scripts/update_build.rhai @@ -0,0 +1,19 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define BUILD "; +let current = HEMTT.project().version().build(); +let next = current + 1; +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/.hemtt/scripts/update_minor.rhai b/arma/server/.hemtt/scripts/update_minor.rhai new file mode 100644 index 0000000..b8344fb --- /dev/null +++ b/arma/server/.hemtt/scripts/update_minor.rhai @@ -0,0 +1,23 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define MINOR "; +let current = HEMTT.project().version().minor(); +let next = current + 1; + +// Updating minor version should reset patch number +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); +current = HEMTT.project().version().patch(); +script_version.replace("#define PATCH " + current.to_string(), "#define PATCH 0"); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/.hemtt/scripts/update_patch.rhai b/arma/server/.hemtt/scripts/update_patch.rhai new file mode 100644 index 0000000..a90383f --- /dev/null +++ b/arma/server/.hemtt/scripts/update_patch.rhai @@ -0,0 +1,20 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define PATCH "; +let current = HEMTT.project().version().patch(); +let next = current + 1; + +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/LICENSE.md b/arma/server/LICENSE.md new file mode 100644 index 0000000..0cb1a9b --- /dev/null +++ b/arma/server/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +- **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +- **Noncommercial** - You may not use this material for any commercial purposes. +- **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +- **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. diff --git a/arma/server/README.md b/arma/server/README.md new file mode 100644 index 0000000..99c542a --- /dev/null +++ b/arma/server/README.md @@ -0,0 +1,30 @@ +

Forge Server

+

+ Version + Issues + + License +
+ HEMTT + CBA A3 +

+ +

+ Requires the latest version of CBA A3 +

+ +**Forge Server** aims to... + +The project is entirely **open-source** and any contributions are welcome. + +## Core Features + +- Feature + +## Contributing + +For new contributers, see the [Contributing Setup & Guidelines](./.github/CONTRIBUTING.md). + +## License + +Forge Server is licensed under [APL-SA](./LICENSE.md). diff --git a/arma/server/addons/actor/$PBOPREFIX$ b/arma/server/addons/actor/$PBOPREFIX$ new file mode 100644 index 0000000..0d8ae67 --- /dev/null +++ b/arma/server/addons/actor/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\actor diff --git a/arma/server/addons/actor/CfgEventHandlers.hpp b/arma/server/addons/actor/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/actor/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/actor/README.md b/arma/server/addons/actor/README.md new file mode 100644 index 0000000..6f8c2a8 --- /dev/null +++ b/arma/server/addons/actor/README.md @@ -0,0 +1,37 @@ +# Forge Server Actor + +## Overview +The actor addon is the server-side bridge for player identity and character +state. It keeps Arma-facing actor snapshots in SQF while durable and hot actor +state are owned by the Rust extension. + +Actor records include UID, name, loadout, position, direction, stance, rank, +life state, phone number, email, organization, and holster state. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for actor extension calls +- `forge_server_phone` for new actor welcome email and messages +- `forge_server_bank` for new actor starting bank credit +- `forge_client_actor` for response RPCs + +## Main Components +- `fnc_initActorStore.sqf` initializes `ActorModel` and `ActorStore`. +- `ActorModel` provides defaults, player snapshot conversion, migration, and + validation. +- `ActorStore` wraps extension hot-state calls and exposes event-facing actor + operations. + +## Runtime Behavior +- Missing persistent actors can be created from live player snapshots. +- Newly created actors receive a Field Commander job orientation email, two + Field Commander text messages, and a `$2,000` starting credit in their bank + account. +- Hot actor reads are migrated and hydrated before use. +- `saveHotState` in the main addon snapshots and saves actor state on player + disconnect and mission end. + +## Event Surface +The addon handles server events for actor init, get, set, multi-set, save, and +remove requests, then replies to the requesting player through client actor RPCs. diff --git a/arma/server/addons/actor/XEH_PREP.hpp b/arma/server/addons/actor/XEH_PREP.hpp new file mode 100644 index 0000000..50e6a39 --- /dev/null +++ b/arma/server/addons/actor/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(initActorStore); diff --git a/arma/server/addons/actor/XEH_postInit.sqf b/arma/server/addons/actor/XEH_postInit.sqf new file mode 100644 index 0000000..d06a0ed --- /dev/null +++ b/arma/server/addons/actor/XEH_postInit.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(BankAccountCreatedEventTokens)) then { + private _welcomeNewActor = { + params ["_event"]; + + private _uid = _event getOrDefault ["uid", ""]; + if (_uid isEqualTo "" || { isNil QGVAR(ActorStore) }) exitWith {}; + + private _actor = GVAR(ActorStore) call ["get", [_uid, ""]]; + if !(_actor isEqualType createHashMap) then { + _actor = createHashMap; + }; + + if (_actor isEqualTo createHashMap) then { + private _player = [_uid] call EFUNC(common,getPlayer); + _actor = GVAR(ActorModel) call ["fromPlayer", [_player]]; + _actor set ["uid", _uid]; + }; + + GVAR(ActorStore) call ["welcomeNewActor", [_uid, _actor]]; + }; + + GVAR(BankAccountCreatedEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["bank.account.created", _welcomeNewActor, "actor.newActor.welcome"]] + ]; +}; diff --git a/arma/server/addons/actor/XEH_preInit.sqf b/arma/server/addons/actor/XEH_preInit.sqf new file mode 100644 index 0000000..4fff430 --- /dev/null +++ b/arma/server/addons/actor/XEH_preInit.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +[QGVAR(requestInitActor), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + GVAR(ActorStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetActor), { + params [["_uid", "", [""]], ["_field", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + + private _finalData = GVAR(ActorStore) call ["get", [_uid, _field]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(actor,responseSyncActor), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestSetActor), { + params [["_uid", "", [""]], ["_field", "", [""]], ["_value", nil, [[], "", 0, false, createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || _field isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID or Key!" }; + + private _hashMap = GVAR(ActorStore) call ["set", [_uid, _field, _value, _sync]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(actor,responseSyncActor), [_hashMap], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestMSetActor), { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + if ((_fieldValuePairs isEqualTo createHashMap) || !(_fieldValuePairs isEqualType createHashMap)) exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid field pairs!" }; + + private _hashMap = GVAR(ActorStore) call ["mset", [_uid, _fieldValuePairs, _sync]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(actor,responseSyncActor), [_hashMap], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveActor), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + + GVAR(ActorStore) call ["snapshot", [_uid]]; + private _finalData = GVAR(ActorStore) call ["save", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(actor,responseSyncActor), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestRemoveActor), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + GVAR(ActorStore) call ["remove", [_uid]]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/actor/XEH_preStart.sqf b/arma/server/addons/actor/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/actor/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/actor/config.cpp b/arma/server/addons/actor/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/actor/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/actor/functions/fnc_initActorStore.sqf b/arma/server/addons/actor/functions/fnc_initActorStore.sqf new file mode 100644 index 0000000..8f60179 --- /dev/null +++ b/arma/server/addons/actor/functions/fnc_initActorStore.sqf @@ -0,0 +1,567 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initActorStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-05-16 + * Public: Yes + * + * Description: + * Initializes the actor store for managing player actor data. + * Actor hot state is owned by the extension; SQF acts as a thin bridge for + * engine-adjacent reads, snapshots, and response fan-out. + * + * Arguments: + * None + * + * Return Value: + * Actor store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_actor_fnc_initActorStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ActorModel) = compileFinal createHashMapObject [[ + ["#type", "ActorModel"], + ["defaults", compileFinal { + private _actor = createHashMap; + + _actor set ["uid", ""]; + _actor set ["name", ""]; + _actor set ["loadout", [[],[],[],["U_BG_Guerrilla_6_1",[["FirstAidKit", 2]]],[],[],"H_Cap_blk_ION","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]]; + _actor set ["position", [0,0,0]]; + _actor set ["direction", 0]; + _actor set ["stance", "STAND"]; + _actor set ["rank", "PRIVATE"]; + _actor set ["state", "HEALTHY"]; + _actor set ["phone_number", ""]; + _actor set ["email", ""]; + _actor set ["organization", "default"]; + _actor set ["holster", true]; + + _actor + }], + ["fromPlayer", compileFinal { + params [["_player", objNull, [objNull]]]; + + if (_player isEqualTo objNull) exitWith { _self call ["defaults", []] }; + + private _actor = _self call ["defaults", []]; + + _actor set ["uid", getPlayerUID _player]; + _actor set ["name", name _player]; + _actor set ["position", getPosASL _player]; + _actor set ["direction", getDir _player]; + _actor set ["stance", stance _player]; + _actor set ["rank", rank _player]; + _actor set ["state", lifeState _player]; + + _actor + }], + ["migrate", compileFinal { + params [["_actor", createHashMap, [createHashMap]]]; + + private _defaults = _self call ["defaults", []]; + + { + if !(_x in _actor) then { _actor set [_x, _y]; }; + } forEach _defaults; + + _actor + }], + ["validate", compileFinal { + params [["_actor", createHashMap, [createHashMap]]]; + + private _uid = _actor getOrDefault ["uid", ""]; + private _name = _actor getOrDefault ["name", ""]; + private _position = _actor getOrDefault ["position", []]; + private _direction = _actor getOrDefault ["direction", 0]; + private _stance = _actor getOrDefault ["stance", ""]; + private _rank = _actor getOrDefault ["rank", ""]; + private _state = _actor getOrDefault ["state", ""]; + private _phone_number = _actor getOrDefault ["phone_number", ""]; + private _email = _actor getOrDefault ["email", ""]; + private _organization = _actor getOrDefault ["organization", ""]; + + [_uid, _name, _position, _direction, _stance, _rank, _state, _phone_number, _email, _organization] try { + if (_uid isEqualTo "" || !(_uid isEqualType "")) then { throw "Invalid UID!"; }; + if (_name isEqualTo "" || !(_name isEqualType "")) then { throw "Invalid Name!"; }; + if (_position isEqualTo [] || !(_position isEqualType [])) then { throw "Invalid Position!"; }; + if (_direction < 0 || !(_direction isEqualType 0)) then { throw "Invalid Direction!"; }; + if (_stance isEqualTo "" || !(_stance isEqualType "")) then { throw "Invalid Stance!"; }; + if (_rank isEqualTo "" || !(_rank isEqualType "")) then { throw "Invalid Rank!"; }; + if (_state isEqualTo "" || !(_state isEqualType "")) then { throw "Invalid State!"; }; + if (_phone_number isEqualTo "" || !(_phone_number isEqualType "")) then { throw "Invalid Phone Number!"; }; + if (_email isEqualTo "" || !(_email isEqualType "")) then { throw "Invalid Email!"; }; + if (_organization isEqualTo "" || !(_organization isEqualType "")) then { throw "Invalid Organization!"; }; + } catch { + ["ERROR", format ["Failed to validate actor %1!", _exception]] call EFUNC(common,log); + false + }; + + true + }] +]]; + +GVAR(ActorBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "ActorBaseStore"], + ["#create", compileFinal { + ["INFO", "Actor Store Initialized!"] call EFUNC(common,log); + }], + ["cacheActor", compileFinal { + params [["_uid", "", [""]], ["_actor", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "" || { !(_actor isEqualType createHashMap) }) exitWith { createHashMap }; + + GVAR(ActorModel) call ["migrate", [+_actor]] + }], + ["callHotActor", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Actor extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["listHotUids", compileFinal { + ["actor:hot:keys", []] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { [] }; + if !(_result isEqualType "") exitWith { [] }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Actor extension call '%1' failed: %2", "actor:hot:keys", _result]] call EFUNC(common,log); + [] + }; + + private _uids = fromJSON _result; + if !(_uids isEqualType []) exitWith { [] }; + + _uids select { _x isEqualType "" && { _x isNotEqualTo "" } } + }], + ["sendNewActorWelcomeComms", compileFinal { + params [["_uid", "", [""]], ["_actor", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { false }; + if (isNil QEGVAR(phone,PhoneStore)) exitWith { + ["WARNING", format ["Unable to send new actor welcome comms for %1: phone store is unavailable.", _uid]] call EFUNC(common,log); + false + }; + + EGVAR(phone,PhoneStore) call ["init", [_uid]]; + + private _phoneNumber = _actor getOrDefault ["phone_number", ""]; + private _emailAddress = _actor getOrDefault ["email", ""]; + private _welcomeEmail = format [ + "Welcome to your first day on the job. Forge Dynamics has issued you a work phone with phone number %1 and email address %2. Keep these details handy for field communications and future assignments.", + _phoneNumber, + _emailAddress + ]; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _emailObj = EGVAR(phone,PhoneStore) call [ + "sendEmail", + ["field_commander", _uid, "Job Orientation", _welcomeEmail] + ]; + + if ( + _emailObj isEqualType createHashMap + && { _emailObj isNotEqualTo createHashMap } + && { !(isNull _player) } + ) then { + ["forge_client_phone_responseEmailReceived", [_emailObj], _player] call CFUNC(targetEvent); + }; + + private _messages = [ + "Welcome to your first day on the job. Forge Dynamics has issued your starting equipment and a small account credit. These are the only free supplies you will receive for this identity, so use them wisely. You are responsible for all purchases going forward.", + "Deposit your Earnings before leaving the session. Access the Bank from any laptop, then select Deposit Earnings." + ]; + + { + private _messageObj = EGVAR(phone,PhoneStore) call [ + "sendMessage", + ["field_commander", _uid, _x] + ]; + if ( + _messageObj isEqualType createHashMap + && { _messageObj isNotEqualTo createHashMap } + && { !(isNull _player) } + ) then { + ["forge_client_phone_responseMessageReceived", [_messageObj], _player] call CFUNC(targetEvent); + }; + } forEach _messages; + + true + }], + ["welcomeNewActor", compileFinal { + params [["_uid", "", [""]], ["_actor", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { false }; + + _self call ["sendNewActorWelcomeComms", [_uid, _actor]]; + + true + }], + ["loadHotActor", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + if (_initialize) then { + // Missing actors should be created explicitly from a server snapshot + // before the hot cache is initialized. + private _ensureResult = _self call ["ensurePersistentActor", [_uid]]; + if !(_ensureResult isEqualType true && { _ensureResult }) exitWith { createHashMap }; + }; + + private _command = ["actor:hot:get", "actor:hot:init"] select _initialize; + private _actor = _self call ["callHotActor", [_command, [_uid]]]; + if (_actor isEqualTo createHashMap) exitWith { _actor }; + + _self call ["hydrateActorIfNeeded", [_uid, _actor, true]] + }], + ["ensurePersistentActor", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + ["actor:exists", [_uid]] call EFUNC(extension,extCall) params ["_existsResult", "_existsSuccess"]; + if (!_existsSuccess || { !(_existsResult isEqualType "") }) exitWith { + ["ERROR", format ["Failed to verify persistent actor state for %1.", _uid]] call EFUNC(common,log); + false + }; + + if (_existsResult isEqualTo "true") exitWith { true }; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _actor = GVAR(ActorModel) call ["fromPlayer", [_player]]; + _actor set ["uid", _uid]; + + if ((_actor getOrDefault ["organization", ""]) isEqualTo "") then { + _actor set ["organization", "default"]; + }; + + private _json = _self call ["toJSON", [_actor]]; + ["actor:create", [_uid, _json]] call EFUNC(extension,extCall) params ["_createResult", "_createSuccess"]; + + if (!_createSuccess || { !(_createResult isEqualType "") }) exitWith { + ["ERROR", format ["Failed to create actor %1 from server snapshot.", _uid]] call EFUNC(common,log); + false + }; + + if ((_createResult find "Error:") == 0) exitWith { + ["ERROR", format ["Actor create for %1 failed: %2", _uid, _createResult]] call EFUNC(common,log); + false + }; + + private _createdActor = fromJSON _createResult; + if !(_createdActor isEqualType createHashMap) then { + _createdActor = +_actor; + }; + _createdActor = GVAR(ActorModel) call ["migrate", [_createdActor]]; + true + }], + ["hydrateActorIfNeeded", compileFinal { + params [["_uid", "", [""]], ["_actor", createHashMap, [createHashMap]], ["_save", true, [false]]]; + + if (_uid isEqualTo "" || { !(_actor isEqualType createHashMap) } || { _actor isEqualTo createHashMap }) exitWith { + createHashMap + }; + + // Hot actor reads can still surface older partial records. Repair them + // from the live player snapshot when possible and persist the result. + private _hydratedActor = GVAR(ActorModel) call ["migrate", [+_actor]]; + private _defaults = GVAR(ActorModel) call ["defaults", []]; + private _player = [_uid] call EFUNC(common,getPlayer); + private _needsPersist = false; + + if ((_hydratedActor getOrDefault ["uid", ""]) isEqualTo "") then { + _hydratedActor set ["uid", _uid]; + _needsPersist = true; + }; + if ((_hydratedActor getOrDefault ["organization", ""]) isEqualTo "") then { + _hydratedActor set ["organization", "default"]; + _needsPersist = true; + }; + + { + private _value = _hydratedActor getOrDefault [_x, ""]; + if !(_value isEqualType "") then { + _hydratedActor set [_x, _defaults getOrDefault [_x, ""]]; + _needsPersist = true; + }; + } forEach ["phone_number", "email"]; + + if (_player isNotEqualTo objNull) then { + private _snapshot = GVAR(ActorModel) call ["fromPlayer", [_player]]; + private _name = _hydratedActor getOrDefault ["name", ""]; + if ( + !(_name isEqualType "") + || { _name isEqualTo "" } + || { toLowerANSI _name isEqualTo "unknown" } + ) then { + _hydratedActor set ["name", _snapshot getOrDefault ["name", name _player]]; + _needsPersist = true; + }; + + private _position = _hydratedActor getOrDefault ["position", []]; + if !(_position isEqualType [] && { count _position isEqualTo 3 }) then { + _hydratedActor set ["position", _snapshot getOrDefault ["position", getPosASL _player]]; + _needsPersist = true; + }; + + private _direction = _hydratedActor getOrDefault ["direction", 0]; + if !(_direction isEqualType 0) then { + _hydratedActor set ["direction", _snapshot getOrDefault ["direction", getDir _player]]; + _needsPersist = true; + }; + + { + private _fieldValue = _hydratedActor getOrDefault [_x, ""]; + if (!(_fieldValue isEqualType "") || { _fieldValue isEqualTo "" }) then { + _hydratedActor set [_x, _snapshot getOrDefault [_x, _defaults getOrDefault [_x, ""]]]; + _needsPersist = true; + }; + } forEach ["stance", "rank", "state"]; + + private _loadout = _hydratedActor getOrDefault ["loadout", []]; + if !(_loadout isEqualType [] && { count _loadout > 0 }) then { + _hydratedActor set ["loadout", getUnitLoadout _player]; + _needsPersist = true; + }; + } else { + { + private _fieldValue = _hydratedActor getOrDefault [_x, ""]; + if (!(_fieldValue isEqualType "") || { _fieldValue isEqualTo "" }) then { + _hydratedActor set [_x, _defaults getOrDefault [_x, ""]]; + _needsPersist = true; + }; + } forEach ["stance", "rank", "state"]; + }; + + if !_needsPersist exitWith { + _self call ["cacheActor", [_uid, _hydratedActor]] + }; + + private _updatedActor = _self call ["override", [_uid, _hydratedActor, _save]]; + if (_updatedActor isEqualType createHashMap && { _updatedActor isNotEqualTo createHashMap }) exitWith { + _self call ["cacheActor", [_uid, _updatedActor]] + }; + + ["WARNING", format ["Failed to hydrate actor %1 from player snapshot.", _uid]] call EFUNC(common,log); + _self call ["cacheActor", [_uid, _hydratedActor]] + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + + ["actor:exists", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + ["ERROR", format ["Failed to check if actor %1 exists! Using fallback actor.", _uid]] call EFUNC(common,log); + + private _fallbackActor = GVAR(ActorModel) call ["fromPlayer", [_player]]; + _fallbackActor set ["uid", _uid]; + _fallbackActor = _self call ["cacheActor", [_uid, _fallbackActor]]; + + [CRPC(actor,responseInitActor), [_fallbackActor], _player] call CFUNC(targetEvent); + _fallbackActor + }; + + private _finalActor = createHashMap; + if (_result == "true") then { + _finalActor = _self call ["loadHotActor", [_uid, true]]; + ["INFO", format ["Found actor for %1", _uid]] call EFUNC(common,log); + } else { + if !(_self call ["ensurePersistentActor", [_uid]]) exitWith { + ["ERROR", format ["Failed to create actor %1! Using fallback actor.", _uid]] call EFUNC(common,log); + + _finalActor = GVAR(ActorModel) call ["fromPlayer", [_player]]; + _finalActor set ["uid", _uid]; + _finalActor = _self call ["cacheActor", [_uid, _finalActor]]; + [CRPC(actor,responseInitActor), [_finalActor], _player] call CFUNC(targetEvent); + _finalActor + }; + + _finalActor = _self call ["loadHotActor", [_uid, true]]; + ["INFO", format ["Created new actor for %1", _uid]] call EFUNC(common,log); + }; + + if (_finalActor isEqualTo createHashMap) then { + _finalActor = GVAR(ActorModel) call ["fromPlayer", [_player]]; + _finalActor set ["uid", _uid]; + }; + + _finalActor = _self call ["cacheActor", [_uid, _finalActor]]; + + [CRPC(actor,responseInitActor), [_finalActor], _player] call CFUNC(targetEvent); + _finalActor + }], + ["get", compileFinal { + params [["_uid", "", [""]], ["_field", "", [""]]]; + + private _actor = _self call ["loadHotActor", [_uid, false]]; + + if (_field isEqualTo "") exitWith { _actor }; + _actor getOrDefault [_field, nil] + }], + ["load", compileFinal { + params [["_uid", "", [""]]]; + + private _actor = _self call ["get", [_uid, ""]]; + if !(_actor isEqualType createHashMap) exitWith { createHashMap }; + + _actor + }], + ["getFieldOrDefault", compileFinal { + params [["_uid", "", [""]], ["_field", "", [""]], ["_default", nil]]; + + if (_uid isEqualTo "" || { _field isEqualTo "" }) exitWith { _default }; + + private _actor = _self call ["load", [_uid]]; + if !(_actor isEqualType createHashMap) exitWith { _default }; + if (_actor isEqualTo createHashMap) exitWith { _default }; + + _actor getOrDefault [_field, _default] + }], + ["getOrganization", compileFinal { + params [["_uid", "", [""]], ["_default", "default", [""]]]; + + private _orgID = _self call ["getFieldOrDefault", [_uid, "organization", _default]]; + if !(_orgID isEqualType "") exitWith { _default }; + if (_orgID isEqualTo "") exitWith { _default }; + + _orgID + }], + ["getName", compileFinal { + params [["_uid", "", [""]], ["_default", "", [""]]]; + + private _name = _self call ["getFieldOrDefault", [_uid, "name", _default]]; + if !(_name isEqualType "") exitWith { _default }; + + _name + }], + ["getPhoneNumber", compileFinal { + params [["_uid", "", [""]], ["_default", "", [""]]]; + + private _phoneNumber = _self call ["getFieldOrDefault", [_uid, "phone_number", _default]]; + if !(_phoneNumber isEqualType "") exitWith { _default }; + + _phoneNumber + }], + ["override", compileFinal { + params [ + ["_uid", "", [""]], + ["_data", createHashMap, [createHashMap]], + ["_save", false, [false]] + ]; + + if (_uid isEqualTo "" || { !(_data isEqualType createHashMap) }) exitWith { createHashMap }; + + private _actor = _self call ["callHotActor", ["actor:hot:override", [_uid, toJSON _data]]]; + if (_save && { _actor isNotEqualTo createHashMap }) then { + private _savedActor = _self call ["callHotActor", ["actor:hot:save", [_uid]]]; + if (_savedActor isNotEqualTo createHashMap) then { + _actor = _savedActor; + } else { + _actor = createHashMap; + }; + }; + + if (_actor isEqualTo createHashMap) exitWith { _actor }; + _self call ["cacheActor", [_uid, _actor]] + }], + ["set", compileFinal { + params [ + ["_uid", "", [""]], + ["_field", "", [""]], + ["_value", nil, [0, "", [], false, createHashMap, objNull, grpNull]], + ["_sync", false, [false]] + ]; + + if (_uid isEqualTo "" || { _field isEqualTo "" }) exitWith { createHashMap }; + + private _actor = _self call ["get", [_uid, ""]]; + if !(_actor isEqualType createHashMap) exitWith { createHashMap }; + + _actor set [_field, _value]; + private _updatedActor = _self call ["override", [_uid, _actor, _sync]]; + if !(_updatedActor isEqualType createHashMap) exitWith { createHashMap }; + if (_updatedActor isEqualTo createHashMap) exitWith { createHashMap }; + + createHashMapFromArray [[_field, _updatedActor getOrDefault [_field, _value]]] + }], + ["mset", compileFinal { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || { !(_fieldValuePairs isEqualType createHashMap) }) exitWith { createHashMap }; + + private _actor = _self call ["get", [_uid, ""]]; + if !(_actor isEqualType createHashMap) exitWith { createHashMap }; + + { _actor set [_x, _y]; } forEach _fieldValuePairs; + private _updatedActor = _self call ["override", [_uid, _actor, _sync]]; + if !(_updatedActor isEqualType createHashMap) exitWith { createHashMap }; + if (_updatedActor isEqualTo createHashMap) exitWith { createHashMap }; + + +_fieldValuePairs + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + private _actor = _self call ["callHotActor", ["actor:hot:save", [_uid]]]; + if (_actor isEqualTo createHashMap) exitWith { _actor }; + + _self call ["cacheActor", [_uid, _actor]] + }], + ["remove", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + ["actor:hot:remove", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + _isSuccess && { _result isEqualTo "OK" } + }], + ["snapshot", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _finalActor = +(_self call ["get", [_uid, ""]]); + + if (!(_finalActor isEqualType createHashMap) || (_finalActor isEqualTo createHashMap)) then { + _finalActor = GVAR(ActorModel) call ["defaults", []]; + _finalActor set ["uid", _uid]; + }; + + if (_player isNotEqualTo objNull) then { + _finalActor set ["uid", _uid]; + _finalActor set ["name", name _player]; + _finalActor set ["position", getPosASL _player]; + _finalActor set ["direction", getDir _player]; + _finalActor set ["stance", stance _player]; + _finalActor set ["rank", rank _player]; + _finalActor set ["state", lifeState _player]; + _finalActor set ["loadout", getUnitLoadout _player]; + if ((_finalActor getOrDefault ["organization", ""]) isEqualTo "") then { + _finalActor set ["organization", "default"]; + }; + } else { + ["WARNING", format ["No player object found for %1 during actor snapshot, using cached values.", _uid]] call EFUNC(common,log); + }; + + _self call ["override", [_uid, _finalActor, false]] + }] +]; + +GVAR(ActorStore) = createHashMapObject [GVAR(ActorBaseStore)]; +GVAR(ActorStore) diff --git a/arma/server/addons/actor/script_component.hpp b/arma/server/addons/actor/script_component.hpp new file mode 100644 index 0000000..dec8071 --- /dev/null +++ b/arma/server/addons/actor/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT actor +#define COMPONENT_BEAUTIFIED Actor +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/actor/stringtable.xml b/arma/server/addons/actor/stringtable.xml new file mode 100644 index 0000000..95427c0 --- /dev/null +++ b/arma/server/addons/actor/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Actor + + + diff --git a/arma/server/addons/bank/$PBOPREFIX$ b/arma/server/addons/bank/$PBOPREFIX$ new file mode 100644 index 0000000..d4d3bbc --- /dev/null +++ b/arma/server/addons/bank/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\bank diff --git a/arma/server/addons/bank/CfgEventHandlers.hpp b/arma/server/addons/bank/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/bank/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/bank/README.md b/arma/server/addons/bank/README.md new file mode 100644 index 0000000..c9129bb --- /dev/null +++ b/arma/server/addons/bank/README.md @@ -0,0 +1,46 @@ +# Forge Server Bank + +## Overview +The bank addon owns the SQF bridge for player accounts, cash and bank balances, +PIN/session handling, transfers, checkout charging, earnings deposits, and +credit-line repayment. It also verifies and persists player-requested ATM PIN +changes. + +Account truth lives in the extension hot cache. SQF handles Arma-facing +validation, client messaging, session state, and payment integration with other +server addons. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for bank extension calls +- `forge_server_org` at runtime for credit-line repayment +- `forge_client_bank` and `forge_client_notifications` for response RPCs + +## Main Components +- `fnc_initBank.sqf` initializes all bank stores and helpers. +- `fnc_initModel.sqf` defines account defaults and migration behavior. +- `fnc_initPayloadBuilder.sqf` builds UI, checkout, and organization payment + context. +- `fnc_initSessionManager.sqf` manages PIN and authorization session state. +- `fnc_initMessenger.sqf` sends account syncs, alerts, and notifications. +- `fnc_initStore.sqf` wraps hot bank calls and account mutations. + +## Supported Operations +- initialize and hydrate player bank state +- deposit, withdraw, transfer, and deposit earnings +- validate PIN-backed sessions and change ATM PINs +- charge checkout previews and committed purchases +- repay organization credit lines with rollback on failure +- save hot bank state to durable storage + +## Runtime Notes +`forge_server_main_fnc_saveHotState` saves bank hot state on disconnect and +mission shutdown. Store checkout and task rewards use this addon for +authoritative player balance changes. + +Account syncs and notifications route through the event bus: +- `bank.account.sync.requested` - client-facing account sync +- `notification.requested` - alerts and transaction notifications + +These events are emitted and listened to by the notifications addon. diff --git a/arma/server/addons/bank/XEH_PREP.hpp b/arma/server/addons/bank/XEH_PREP.hpp new file mode 100644 index 0000000..d3dfff0 --- /dev/null +++ b/arma/server/addons/bank/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(initBank); +PREP(initBankStore); +PREP(initMessenger); +PREP(initModel); +PREP(initPayloadBuilder); +PREP(initSessionManager); diff --git a/arma/server/addons/bank/XEH_postInit.sqf b/arma/server/addons/bank/XEH_postInit.sqf new file mode 100644 index 0000000..fab3df1 --- /dev/null +++ b/arma/server/addons/bank/XEH_postInit.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +call FUNC(initBank); + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(AccountSyncEventTokens)) then { + private _sendAccountSync = { + params ["_event"]; + + private _uid = _event getOrDefault ["uid", ""]; + private _account = _event getOrDefault ["account", createHashMap]; + private _responseEvent = _event getOrDefault ["responseEvent", CRPC(bank,responseSyncBank)]; + + if (_uid isEqualTo "" || { _account isEqualTo createHashMap }) exitWith {}; + GVAR(BankMessenger) call ["sendAccountSync", [_uid, _account, _responseEvent]]; + }; + + GVAR(AccountSyncEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["bank.account.sync.requested", _sendAccountSync, "bank.account.sync"]] + ]; +}; diff --git a/arma/server/addons/bank/XEH_preInit.sqf b/arma/server/addons/bank/XEH_preInit.sqf new file mode 100644 index 0000000..bdb85e3 --- /dev/null +++ b/arma/server/addons/bank/XEH_preInit.sqf @@ -0,0 +1,63 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +[QGVAR(requestInitBank), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + GVAR(BankStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestHydrateBank), { + params [["_uid", "", [""]], ["_mode", "bank", [""]], ["_resetAuthorization", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + GVAR(BankStore) call ["hydrateSession", [_uid, _mode, _resetAuthorization]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestDeposit), { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + GVAR(BankStore) call ["deposit", [_uid, _amount]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSubmitPin), { + params [["_uid", "", [""]], ["_pin", "", [""]]]; + + GVAR(BankSessionManager) call ["submitPin", [_uid, _pin]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestChangePin), { + params [["_uid", "", [""]], ["_currentPin", "", [""]], ["_newPin", "", [""]]]; + + GVAR(BankStore) call ["changePin", [_uid, _currentPin, _newPin]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestTransfer), { + params [["_uid", "", [""]], ["_target", "", [""]], ["_from", "", [""]], ["_amount", 0, [0]]]; + + GVAR(BankStore) call ["transfer", [_uid, _target, _amount, createHashMapFromArray [["sourceField", _from]]]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestWithdraw), { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + GVAR(BankStore) call ["withdraw", [_uid, _amount]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestDepositEarnings), { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + GVAR(BankStore) call ["depositEarnings", [_uid, _amount]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRepayCreditLine), { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + GVAR(BankStore) call ["repayCreditLine", [_uid, _amount]]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/bank/XEH_preStart.sqf b/arma/server/addons/bank/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/bank/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/bank/config.cpp b/arma/server/addons/bank/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/bank/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/bank/functions/fnc_initBank.sqf b/arma/server/addons/bank/functions/fnc_initBank.sqf new file mode 100644 index 0000000..a4800b1 --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initBank.sqf @@ -0,0 +1,49 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initBank.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-02-17 + * Public: No + * + * Description: + * Initializes all editor-placed banks. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_server_bank_fnc_initBank + */ + +private _atms = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ("atm" in _x) && { _var isEqualType objNull } && { !isNull _var } +}; + +private _banks = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ("bank" in _x) && { _var isEqualType objNull } && { !isNull _var } +}; + +if (_atms isNotEqualTo []) then { + { + private _atm = missionNamespace getVariable _x; + SETPVAR(_atm,isAtm,true); + } forEach _atms; +} else { + ["INFO", "No editor-placed atms found."] call EFUNC(common,log); +}; + +if (_banks isNotEqualTo []) then { + { + private _bank = missionNamespace getVariable _x; + SETPVAR(_bank,isBank,true); + } forEach _banks; +} else { + ["INFO", "No editor-placed banks found."] call EFUNC(common,log); +}; diff --git a/arma/server/addons/bank/functions/fnc_initBankStore.sqf b/arma/server/addons/bank/functions/fnc_initBankStore.sqf new file mode 100644 index 0000000..bc46888 --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initBankStore.sqf @@ -0,0 +1,577 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initBankStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-04-02 + * Public: No + * + * Description: + * Initializes the bank store for managing player bank accounts. + * Bank account truth lives in the extension hot cache; SQF handles + * session state, Arma-facing validation, and client messaging. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "BankBaseStore"], + ["#create", compileFinal { + ["INFO", "Bank Store Initialized!"] call EFUNC(common,log); + }], + ["normalizeAccount", compileFinal { + params [["_uid", "", [""]], ["_account", createHashMap, [createHashMap]], ["_playerName", "", [""]]]; + + if (_uid isEqualTo "" || { !(_account isEqualType createHashMap) }) exitWith { createHashMap }; + + private _finalAccount = GVAR(BankModel) call ["migrate", [+_account]]; + if ((_finalAccount getOrDefault ["uid", ""]) isEqualTo "") then { + _finalAccount set ["uid", _uid]; + }; + if ((_finalAccount getOrDefault ["name", ""]) isEqualTo "" && { _playerName isNotEqualTo "" }) then { + _finalAccount set ["name", _playerName]; + }; + + _finalAccount + }], + ["callHotBank", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + private _envelope = _self call ["callHotBankEnvelope", [_function, _arguments]]; + _envelope getOrDefault ["data", createHashMap] + }], + ["callHotBankEnvelope", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + private _envelope = createHashMapFromArray [["data", createHashMap], ["error", ""]]; + + if (_function isEqualTo "") exitWith { _envelope }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + _envelope set ["error", format ["Bank backend call '%1' failed.", _function]]; + _envelope + }; + if !(_result isEqualType "") exitWith { + _envelope set ["error", format ["Bank backend call '%1' returned an invalid response.", _function]]; + _envelope + }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Bank extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + _envelope set ["error", _result select [7]]; + _envelope + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { + _envelope set ["error", format ["Bank backend call '%1' returned unreadable JSON.", _function]]; + _envelope + }; + + _envelope set ["data", _data]; + _envelope + }], + ["loadHotBank", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]], ["_playerName", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _command = ["bank:hot:get", "bank:hot:init"] select _initialize; + private _account = _self call ["callHotBank", [_command, [_uid]]]; + if (_account isEqualTo createHashMap) exitWith { _account }; + + _self call ["normalizeAccount", [_uid, _account, _playerName]] + }], + ["finalizeMutation", compileFinal { + params [ + ["_uid", "", [""]], + ["_result", createHashMap, [createHashMap]], + ["_save", false, [false]] + ]; + + if (_uid isEqualTo "" || { _result isEqualTo createHashMap }) exitWith { createHashMap }; + + private _account = _result getOrDefault ["account", createHashMap]; + private _patch = _result getOrDefault ["patch", createHashMap]; + + if !(_patch isEqualType createHashMap) then { + _patch = createHashMap; + }; + + if (_save && { _account isNotEqualTo createHashMap }) then { + private _savedAccount = _self call ["callHotBank", ["bank:hot:save", [_uid]]]; + if (_savedAccount isEqualTo createHashMap) exitWith { createHashMap }; + _account = _savedAccount; + }; + + if (_account isNotEqualTo createHashMap) then { + _self call ["normalizeAccount", [_uid, _account, ""]]; + }; + + _patch + }], + ["runMutation", compileFinal { + params [ + ["_uid", "", [""]], + ["_command", "", [""]], + ["_arguments", [], [[]]], + ["_save", false, [false]], + ["_notification", "", [""]] + ]; + + if (_uid isEqualTo "" || { _command isEqualTo "" }) exitWith { false }; + + private _envelope = _self call ["callHotBankEnvelope", [_command, _arguments]]; + private _result = _envelope getOrDefault ["data", createHashMap]; + private _finalPatch = _self call ["finalizeMutation", [_uid, _result, _save]]; + if (_finalPatch isEqualTo createHashMap) exitWith { + private _message = _envelope getOrDefault ["error", "Bank operation failed."]; + if (_message isNotEqualTo "") then { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _message]]; + }; + false + }; + + GVAR(BankMessenger) call ["sendAccountSync", [_uid, _finalPatch]]; + if (_notification isNotEqualTo "") then { + GVAR(BankMessenger) call ["sendNotification", [_uid, "info", "Bank", _notification]]; + }; + + true + }], + ["chargeCheckout", compileFinal { + params [["_uid", "", [""]], ["_source", "cash", [""]], ["_amount", 0, [0]], ["_commit", false, [false]]]; + + private _result = createHashMapFromArray [["success", false], ["message", "Unable to process bank payment."], ["patch", createHashMap]]; + if (_uid isEqualTo "") exitWith { _result }; + + private _checkoutContext = GVAR(BankPayloadBuilder) call ["buildCheckoutContext", [_source, _commit]]; + private _envelope = _self call [ + "callHotBankEnvelope", + [ + "bank:hot:charge_checkout", + [_uid, str _amount, toJSON _checkoutContext] + ] + ]; + private _mutationResult = _envelope getOrDefault ["data", createHashMap]; + private _patch = _self call ["finalizeMutation", [_uid, _mutationResult, false]]; + if (_patch isEqualTo createHashMap) exitWith { + _result set ["message", _envelope getOrDefault ["error", "Bank checkout payment failed."]]; + _result + }; + + _result set ["success", true]; + _result set ["message", ""]; + _result set ["patch", _patch]; + _result + }], + ["repayCreditLine", compileFinal { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "" || { _amount <= 0 }) exitWith { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Enter a valid repayment amount."]]; + false + }; + + private _originalAccount = _self call ["loadHotBank", [_uid, false, ""]]; + if (_originalAccount isEqualTo createHashMap) then { + _originalAccount = _self call ["loadHotBank", [_uid, true, ""]]; + }; + if (_originalAccount isEqualTo createHashMap) exitWith { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank account could not be loaded."]]; + false + }; + + private _checkoutContext = GVAR(BankPayloadBuilder) call ["buildCheckoutContext", ["bank", false]]; + private _previewEnvelope = _self call [ + "callHotBankEnvelope", + [ + "bank:hot:charge_checkout", + [_uid, str _amount, toJSON _checkoutContext] + ] + ]; + private _previewResult = _previewEnvelope getOrDefault ["data", createHashMap]; + private _bankPatch = _self call ["finalizeMutation", [_uid, _previewResult, false]]; + if (_bankPatch isEqualTo createHashMap) exitWith { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _previewEnvelope getOrDefault ["error", "Credit repayment could not be funded from the bank account."]]]; + false + }; + + private _nextAccount = _previewResult getOrDefault ["account", createHashMap]; + if (_nextAccount isEqualTo createHashMap) exitWith { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank repayment preview returned an invalid account state."]]; + false + }; + + private _overrideEnvelope = _self call [ + "callHotBankEnvelope", + ["bank:hot:override", [_uid, _self call ["toJSON", [_nextAccount]]]] + ]; + if ((_overrideEnvelope getOrDefault ["data", createHashMap]) isEqualTo createHashMap) exitWith { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _overrideEnvelope getOrDefault ["error", "Credit repayment could not reserve bank funds."]]]; + false + }; + + private _orgResult = EGVAR(org,OrgStore) call ["repayCreditLine", [_uid, _amount]]; + if !(_orgResult getOrDefault ["success", false]) exitWith { + private _rollbackEnvelope = _self call [ + "callHotBankEnvelope", + ["bank:hot:override", [_uid, _self call ["toJSON", [_originalAccount]]]] + ]; + if ((_rollbackEnvelope getOrDefault ["data", createHashMap]) isEqualTo createHashMap) then { + ["ERROR", format ["Failed to roll back bank state for %1 after org credit repayment failure.", _uid]] call EFUNC(common,log); + }; + + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _orgResult getOrDefault ["message", "Credit repayment failed."]]]; + false + }; + + private _persistenceFailures = []; + private _savedBank = _self call ["save", [_uid]]; + if (_savedBank isEqualTo createHashMap) then { + _persistenceFailures pushBack "bank"; + }; + + private _orgPersistenceMessage = _orgResult getOrDefault ["persistenceMessage", ""]; + if !(_orgResult getOrDefault ["persisted", false]) then { + _persistenceFailures pushBack "organization"; + }; + + GVAR(BankMessenger) call ["sendAccountSync", [_uid, _bankPatch]]; + GVAR(BankMessenger) call ["sendNotification", [_uid, "info", "Bank", _orgResult getOrDefault ["message", format ["Repaid $%1 toward the organization credit line.", [_amount] call EFUNC(common,formatNumber)]]]]; + + private _orgPatch = _orgResult getOrDefault ["patch", createHashMap]; + if (_orgPatch isNotEqualTo createHashMap) then { + private _memberUids = +(_orgResult getOrDefault ["memberUids", []]); + if (isNil QEGVAR(common,EventBus)) then { + { + private _memberPlayer = [_x] call EFUNC(common,getPlayer); + if (_memberPlayer isNotEqualTo objNull) then { + [CRPC(org,responseSyncOrg), [_orgPatch], _memberPlayer] call CFUNC(targetEvent); + }; + } forEach _memberUids; + } else { + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["memberUids", _memberUids], + ["patch", +_orgPatch] + ], + createHashMapFromArray [["source", "bank"]] + ]]; + }; + }; + + if (_persistenceFailures isNotEqualTo []) then { + private _warning = format [ + "Credit repayment posted, but durable save failed for: %1.", + _persistenceFailures joinString ", " + ]; + if (_orgPersistenceMessage isNotEqualTo "") then { + _warning = format ["%1 %2", _warning, _orgPersistenceMessage]; + }; + + ["ERROR", format ["Credit repayment for %1 completed with persistence failures: %2", _uid, _persistenceFailures joinString ", "]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "warning", _warning]]; + }; + + _self call ["hydrateSession", [_uid, "", false]]; + true + }], + ["deposit", compileFinal { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + _self call [ + "runMutation", + [ + _uid, + "bank:hot:deposit", + [_uid, str _amount, toJSON (GVAR(BankPayloadBuilder) call ["buildOperationContext", [_uid]])], + false, + format ["Deposited $%1", [_amount] call EFUNC(common,formatNumber)] + ] + ] + }], + ["hydrateSession", compileFinal { + params [["_uid", "", [""]], ["_mode", "", [""]], ["_resetAuthorization", false, [false]]]; + + private _payload = GVAR(BankPayloadBuilder) call ["buildHydratePayload", [_uid, _mode, _resetAuthorization]]; + if (_payload isEqualTo createHashMap) exitWith { false }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { false }; + + [CRPC(bank,responseHydrateBank), [_payload], _player] call CFUNC(targetEvent); + true + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _playerName = if (isNull _player) then { "Unknown" } else { name _player }; + ["bank:exists", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + ["ERROR", format ["Failed to check if bank account %1 exists in backend.", _uid]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank backend is unavailable right now."]]; + createHashMap + }; + if !(_result isEqualType "") exitWith { + ["ERROR", format ["Bank exists check for %1 returned an invalid response.", _uid]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank backend returned an invalid response."]]; + createHashMap + }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Bank exists check for %1 failed: %2", _uid, _result]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _result select [7]]]; + createHashMap + }; + if !(_result in ["true", "false"]) exitWith { + ["ERROR", format ["Bank exists check for %1 returned unexpected response: %2", _uid, _result]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank backend returned an unexpected existence response."]]; + createHashMap + }; + + private _finalAccount = createHashMap; + private _wasCreated = false; + if (_result isEqualTo "true") then { + _finalAccount = _self call ["loadHotBank", [_uid, true, _playerName]]; + ["INFO", format ["Found bank account for %1", _uid]] call EFUNC(common,log); + } else { + _finalAccount = GVAR(BankModel) call ["fromPlayer", [_player]]; + _finalAccount set ["uid", _uid]; + _finalAccount set ["bank", 2000]; + if ((_finalAccount getOrDefault ["name", ""]) isEqualTo "") then { + _finalAccount set ["name", _playerName]; + }; + + private _json = _self call ["toJSON", [_finalAccount]]; + ["bank:create", [_uid, _json]] call EFUNC(extension,extCall) params ["_createResult", "_createSuccess"]; + if (!_createSuccess) exitWith { + ["ERROR", format ["Failed to create bank account %1 in backend.", _uid]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Failed to create bank account in backend."]]; + createHashMap + }; + if !(_createResult isEqualType "") exitWith { + ["ERROR", format ["Bank create for %1 returned an invalid response.", _uid]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank backend returned an invalid create response."]]; + createHashMap + }; + if ((_createResult find "Error:") == 0) exitWith { + ["ERROR", format ["Bank create for %1 failed: %2", _uid, _createResult]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _createResult select [7]]]; + createHashMap + }; + + _finalAccount = _self call ["loadHotBank", [_uid, true, _playerName]]; + _wasCreated = true; + ["INFO", format ["Created new bank account for %1", _uid]] call EFUNC(common,log); + }; + + if (_finalAccount isEqualTo createHashMap) exitWith { + ["ERROR", format ["Failed to initialize bank hot state for %1.", _uid]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", "Bank account hot state could not be initialized."]]; + createHashMap + }; + + _finalAccount = _self call ["normalizeAccount", [_uid, _finalAccount, _playerName]]; + GVAR(BankMessenger) call ["sendAccountSync", [_uid, _finalAccount, CRPC(bank,responseInitBank)]]; + if (_wasCreated && { !(isNil QEGVAR(common,EventBus)) }) then { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.created", + createHashMapFromArray [ + ["uid", _uid], + ["account", +_finalAccount], + ["playerName", _playerName] + ], + createHashMapFromArray [["source", "bank"]] + ]]; + }; + _finalAccount + }], + ["get", compileFinal { + params [["_uid", "", [""]], ["_field", "", [""]]]; + + private _account = _self call ["loadHotBank", [_uid, false, ""]]; + if (_account isEqualTo createHashMap) then { + _account = _self call ["loadHotBank", [_uid, true, ""]]; + }; + + if (_field isEqualTo "") exitWith { _account }; + _account getOrDefault [_field, nil] + }], + ["set", compileFinal { + params [["_uid", "", [""]], ["_field", "", [""]], ["_value", nil, [[], "", 0, false, createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || { _field isEqualTo "" }) exitWith { createHashMap }; + + _self call ["mset", [_uid, createHashMapFromArray [[_field, _value]], _sync]] + }], + ["mset", compileFinal { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || { !(_fieldValuePairs isEqualType createHashMap) }) exitWith { createHashMap }; + + private _result = _self call ["callHotBank", ["bank:hot:patch", [_uid, toJSON _fieldValuePairs]]]; + _self call ["finalizeMutation", [_uid, _result, _sync]] + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _envelope = _self call ["callHotBankEnvelope", ["bank:hot:save", [_uid]]]; + private _account = _envelope getOrDefault ["data", createHashMap]; + if (_account isEqualTo createHashMap) exitWith { + private _message = _envelope getOrDefault ["error", "Bank save failed."]; + ["ERROR", format ["Failed to save bank account %1: %2", _uid, _message]] call EFUNC(common,log); + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _message]]; + createHashMap + }; + + _self call ["normalizeAccount", [_uid, _account, ""]] + }], + ["transfer", compileFinal { + params [["_uid", "", [""]], ["_target", "", [""]], ["_amount", 0, [0]], ["_context", createHashMap, [createHashMap]]]; + + private _transferContext = GVAR(BankPayloadBuilder) call ["buildTransferContext", [_uid, _context getOrDefault ["sourceField", "bank"]]]; + private _envelope = _self call [ + "callHotBankEnvelope", + [ + "bank:hot:transfer", + [_uid, _target, str _amount, toJSON _transferContext] + ] + ]; + private _result = _envelope getOrDefault ["data", createHashMap]; + if (_result isEqualTo createHashMap) exitWith { + private _message = _envelope getOrDefault ["error", "Bank transfer failed."]; + if (_message isNotEqualTo "") then { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _message]]; + }; + false + }; + + private _sourceAccount = _result getOrDefault ["sourceAccount", createHashMap]; + private _targetAccount = _result getOrDefault ["targetAccount", createHashMap]; + private _finalSourcePatch = _result getOrDefault ["sourcePatch", createHashMap]; + private _finalTargetPatch = _result getOrDefault ["targetPatch", createHashMap]; + + if ( + _finalSourcePatch isEqualTo createHashMap + || { _finalTargetPatch isEqualTo createHashMap } + ) exitWith { + private _message = _envelope getOrDefault ["error", "Bank transfer failed."]; + if (_message isNotEqualTo "") then { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _message]]; + }; + false + }; + + if (_sourceAccount isEqualType createHashMap && { _sourceAccount isNotEqualTo createHashMap }) then { + _self call ["normalizeAccount", [_uid, _sourceAccount, ""]]; + }; + if (_targetAccount isEqualType createHashMap && { _targetAccount isNotEqualTo createHashMap }) then { + _self call ["normalizeAccount", [_target, _targetAccount, ""]]; + }; + + GVAR(BankMessenger) call ["sendAccountSync", [_uid, _finalSourcePatch]]; + GVAR(BankMessenger) call ["sendAccountSync", [_target, _finalTargetPatch]]; + + private _contextTargetAccount = _context getOrDefault ["targetAccount", createHashMap]; + private _contextAccount = _context getOrDefault ["account", createHashMap]; + private _targetPlayer = [_target] call EFUNC(common,getPlayer); + private _targetName = if (isNull _targetPlayer) then { _contextTargetAccount getOrDefault ["name", "Recipient"] } else { name _targetPlayer }; + private _player = [_uid] call EFUNC(common,getPlayer); + private _playerName = if (isNull _player) then { _contextAccount getOrDefault ["name", "Unknown"] } else { name _player }; + + GVAR(BankMessenger) call ["sendNotification", [_uid, "info", "Bank", format ["Transferred $%1 to %2", [_amount] call EFUNC(common,formatNumber), _targetName]]]; + GVAR(BankMessenger) call ["sendNotification", [_target, "info", "Bank", format ["Received $%1 from %2", [_amount] call EFUNC(common,formatNumber), _playerName]]]; + true + }], + ["validatePin", compileFinal { + params [["_uid", "", [""]], ["_pin", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + private _enteredPin = _pin; + if !(_enteredPin isEqualType "") then { + _enteredPin = str _enteredPin; + }; + + private _envelope = _self call [ + "callHotBankEnvelope", + [ + "bank:hot:validate_pin", + [_uid, _enteredPin, toJSON (GVAR(BankPayloadBuilder) call ["buildOperationContext", [_uid, "atm"]])] + ] + ]; + + private _message = _envelope getOrDefault ["error", ""]; + if (_message isNotEqualTo "") then { + GVAR(BankMessenger) call ["sendAlert", [_uid, "error", _message]]; + false + } else { + true + } + }], + ["changePin", compileFinal { + params [["_uid", "", [""]], ["_currentPin", "", [""]], ["_newPin", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + private _current = _currentPin; + private _next = _newPin; + if !(_current isEqualType "") then { _current = str _current; }; + if !(_next isEqualType "") then { _next = str _next; }; + + private _changed = _self call [ + "runMutation", + [ + _uid, + "bank:hot:change_pin", + [_uid, _current, _next, toJSON (GVAR(BankPayloadBuilder) call ["buildOperationContext", [_uid]])], + true, + "" + ] + ]; + + if (_changed) then { + GVAR(BankMessenger) call ["sendAlert", [_uid, "success", "Bank PIN updated."]]; + _self call ["hydrateSession", [_uid, "", false]]; + }; + + _changed + }], + ["withdraw", compileFinal { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + _self call [ + "runMutation", + [ + _uid, + "bank:hot:withdraw", + [_uid, str _amount, toJSON (GVAR(BankPayloadBuilder) call ["buildOperationContext", [_uid]])], + false, + format ["Withdrew $%1", [_amount] call EFUNC(common,formatNumber)] + ] + ] + }], + ["depositEarnings", compileFinal { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + _self call [ + "runMutation", + [ + _uid, + "bank:hot:deposit_earnings", + [_uid, str _amount, toJSON (GVAR(BankPayloadBuilder) call ["buildOperationContext", [_uid]])], + false, + format ["Deposited $%1 from earnings", [_amount] call EFUNC(common,formatNumber)] + ] + ] + }] +]; + +GVAR(BankStore) = createHashMapObject [GVAR(BankBaseStore)]; +GVAR(BankStore) diff --git a/arma/server/addons/bank/functions/fnc_initMessenger.sqf b/arma/server/addons/bank/functions/fnc_initMessenger.sqf new file mode 100644 index 0000000..eafb94f --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initMessenger.sqf @@ -0,0 +1,75 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initMessenger.sqf + * Author: IDSolutions + * Date: 2026-03-16 + * Last Update: 2026-04-02 + * Public: No + * + * Description: + * Initializes the bank messenger for all server-to-client + * communication including account syncs, toast notifications, + * and inline bank UI notices. + * + * Parameter(s): + * None + * + * Returns: + * Messenger object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_bank_fnc_initMessenger + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankMessenger) = createHashMapObject [[ + ["#type", "BankMessenger"], + ["buildAccountPatch", compileFinal { + params [["_account", createHashMap, [createHashMap]]]; + + private _patch = createHashMap; + { + if (_x in _account) then { + _patch set [_x, _account get _x]; + }; + } forEach ["uid", "name", "bank", "cash", "earnings", "transactions"]; + + _patch + }], + ["sendAccountSync", compileFinal { + params [["_uid", "", [""]], ["_account", createHashMap, [createHashMap]], ["_event", CRPC(bank,responseSyncBank), [""]]]; + + if (_uid isEqualTo "" || { _account isEqualTo createHashMap }) exitWith { false }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { false }; + + [_event, [_self call ["buildAccountPatch", [_account]]], _player] call CFUNC(targetEvent); + true + }], + ["sendNotification", compileFinal { + params [["_uid", "", [""]], ["_type", "info", [""]], ["_title", "Bank", [""]], ["_message", "", [""]]]; + + if (_uid isEqualTo "" || { _message isEqualTo "" }) exitWith { false }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { false }; + + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + true + }], + ["sendAlert", compileFinal { + params [["_uid", "", [""]], ["_type", "error", [""]], ["_message", "", [""]]]; + + if (_uid isEqualTo "" || { _message isEqualTo "" }) exitWith { false }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { false }; + + [CRPC(bank,responseBankNotice), [_type, _message], _player] call CFUNC(targetEvent); + true + }] +]]; + +GVAR(BankMessenger) diff --git a/arma/server/addons/bank/functions/fnc_initModel.sqf b/arma/server/addons/bank/functions/fnc_initModel.sqf new file mode 100644 index 0000000..3642fe3 --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initModel.sqf @@ -0,0 +1,67 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initModel.sqf + * Author: IDSolutions + * Date: 2026-03-16 + * Last Update: 2026-03-16 + * Public: No + * + * Description: + * Initializes the bank account data model. Provides default account + * schema, player-based account creation, schema migration for + * existing accounts. + * + * Parameter(s): + * None + * + * Returns: + * Bank model object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_bank_fnc_initModel + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankModel) = compileFinal createHashMapObject [[ + ["#type", "BankModel"], + ["defaults", compileFinal { + private _account = createHashMap; + + _account set ["uid", ""]; + _account set ["name", ""]; + _account set ["bank", 0]; + _account set ["cash", 0]; + _account set ["earnings", 0]; + _account set ["pin", 1234]; + _account set ["transactions", []]; + + _account + }], + ["fromPlayer", compileFinal { + params [["_player", objNull, [objNull]]]; + + if (_player isEqualTo objNull) exitWith { _self call ["defaults", []] }; + + private _account = _self call ["defaults", []]; + + _account set ["uid", getPlayerUID _player]; + _account set ["name", name _player]; + + _account + }], + ["migrate", compileFinal { + params [["_account", createHashMap, [createHashMap]]]; + + private _defaults = _self call ["defaults", []]; + { + if !(_x in _account) then { + _account set [_x, _y]; + }; + } forEach _defaults; + + _account + }] +]]; + +GVAR(BankModel) diff --git a/arma/server/addons/bank/functions/fnc_initPayloadBuilder.sqf b/arma/server/addons/bank/functions/fnc_initPayloadBuilder.sqf new file mode 100644 index 0000000..24f8615 --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initPayloadBuilder.sqf @@ -0,0 +1,148 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initPayloadBuilder.sqf + * Author: IDSolutions + * Date: 2026-04-02 + * Public: No + * + * Description: + * Initializes the bank payload builder for session/view shaping. + * Keeps hydrate/context construction out of BankStore so the store + * can focus on extension-backed account operations. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankPayloadBuilder) = createHashMapObject [[ + ["#type", "BankPayloadBuilder"], + ["buildOperationContext", compileFinal { + params [["_uid", "", [""]], ["_modeOverride", "", [""]]]; + + private _session = GVAR(BankSessionManager) call ["getSessionState", [_uid]]; + private _mode = if (_modeOverride isEqualTo "") then { + _session getOrDefault ["mode", "bank"] + } else { + GVAR(BankSessionManager) call ["resolveMode", [_modeOverride]] + }; + + createHashMapFromArray [ + ["mode", _mode], + ["atmAuthorized", _session getOrDefault ["atmAuthorized", false]] + ] + }], + ["buildTransferContext", compileFinal { + params [["_uid", "", [""]], ["_from", "", [""]]]; + + private _context = _self call ["buildOperationContext", [_uid]]; + _context set ["fromField", _from]; + _context + }], + ["buildCheckoutContext", compileFinal { + params [["_source", "bank", [""]], ["_commit", false, [false]]]; + + createHashMapFromArray [ + ["commit", _commit], + ["sourceField", toLowerANSI _source] + ] + }], + ["resolveOrgState", compileFinal { + params [["_uid", "", [""]]]; + + private _defaultCreditLine = createHashMapFromArray [ + ["approvedAmount", 0], + ["availableAmount", 0], + ["outstandingPrincipal", 0], + ["interestRate", 0.1], + ["amountDue", 0] + ]; + private _defaultState = createHashMapFromArray [ + ["funds", 0], + ["name", ""], + ["creditLine", _defaultCreditLine] + ]; + if (_uid isEqualTo "") exitWith { _defaultState }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) then { + _org = EGVAR(org,OrgStore) call ["loadById", ["default"]]; + }; + if (_org isEqualTo createHashMap) exitWith { _defaultState }; + + private _creditLines = _org getOrDefault ["credit_lines", createHashMap]; + if !(_creditLines isEqualType createHashMap) then { + _creditLines = createHashMap; + }; + + private _creditLine = _creditLines getOrDefault [_uid, createHashMap]; + if !(_creditLine isEqualType createHashMap) then { + _creditLine = createHashMap; + }; + + createHashMapFromArray [ + ["funds", _org getOrDefault ["funds", 0]], + ["name", _org getOrDefault ["name", ""]], + ["creditLine", createHashMapFromArray [ + ["approvedAmount", _creditLine getOrDefault [ + "approved_amount", + _creditLine getOrDefault ["amount", 0] + ]], + ["availableAmount", _creditLine getOrDefault [ + "available_amount", + _creditLine getOrDefault ["amount", 0] + ]], + ["outstandingPrincipal", _creditLine getOrDefault ["outstanding_principal", 0]], + ["interestRate", _creditLine getOrDefault ["interest_rate", 0.1]], + ["amountDue", _creditLine getOrDefault ["amount_due", 0]] + ]] + ] + }], + ["buildTransferTargets", compileFinal { + params [["_sourceUid", "", [""]]]; + + private _targets = []; + { + if (isNull _x) then { continue; }; + private _targetUid = getPlayerUID _x; + private _targetName = name _x; + if (_targetUid isEqualTo "" || { _targetUid isEqualTo _sourceUid } || { _targetName isEqualTo "" }) then { continue; }; + _targets pushBack (createHashMapFromArray [["name", _targetName], ["uid", _targetUid]]); + } forEach allPlayers; + + private _targetPairs = _targets apply { [toLowerANSI (_x getOrDefault ["name", ""]), _x] }; + _targetPairs sort true; + _targetPairs apply { _x param [1, createHashMap] } + }], + ["buildHydratePayload", compileFinal { + params [["_uid", "", [""]], ["_mode", "", [""]], ["_resetAuthorization", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _account = GVAR(BankStore) call ["get", [_uid, ""]]; + if (_account isEqualTo createHashMap) then { + _account = GVAR(BankStore) call ["init", [_uid]]; + }; + if (_account isEqualTo createHashMap) exitWith { createHashMap }; + + private _session = GVAR(BankSessionManager) call ["syncSessionMode", [_uid, _mode, _resetAuthorization]]; + private _orgState = _self call ["resolveOrgState", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + private _playerName = if (isNull _player) then { _account getOrDefault ["name", "Unknown"] } else { name _player }; + + createHashMapFromArray [ + ["session", createHashMapFromArray [ + ["atmAuthorized", _session getOrDefault ["atmAuthorized", false]], + ["mode", _session getOrDefault ["mode", "bank"]], + ["orgFunds", _orgState getOrDefault ["funds", 0]], + ["orgName", _orgState getOrDefault ["name", ""]], + ["creditLine", _orgState getOrDefault ["creditLine", createHashMap]], + ["playerName", _playerName], + ["transferTargets", _self call ["buildTransferTargets", [_uid]]], + ["uid", _uid] + ]], + ["account", GVAR(BankMessenger) call ["buildAccountPatch", [_account]]] + ] + }] +]]; + +GVAR(BankPayloadBuilder) diff --git a/arma/server/addons/bank/functions/fnc_initSessionManager.sqf b/arma/server/addons/bank/functions/fnc_initSessionManager.sqf new file mode 100644 index 0000000..7d4774b --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initSessionManager.sqf @@ -0,0 +1,107 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initSessionManager.sqf + * Author: IDSolutions + * Date: 2026-03-16 + * Last Update: 2026-04-02 + * Public: No + * + * Description: + * Initializes the bank session manager for managing ATM/bank + * session state, mode resolution, and PIN authorization. + * + * Parameter(s): + * None + * + * Returns: + * Session manager object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_bank_fnc_initSessionManager + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankSessionManager) = createHashMapObject [[ + ["#type", "BankSessionManager"], + ["#create", compileFinal { + _self set ["sessions", createHashMap]; + }], + ["getSessionState", compileFinal { + params [["_uid", "", [""]]]; + + private _sessions = _self getOrDefault ["sessions", createHashMap]; + private _session = _sessions getOrDefault [_uid, createHashMap]; + if (_session isEqualTo createHashMap) then { + _session = createHashMapFromArray [ + ["atmAuthorized", false], + ["mode", "bank"] + ]; + _sessions set [_uid, _session]; + }; + + _session + }], + ["setSessionState", compileFinal { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _session = +(_self call ["getSessionState", [_uid]]); + private _sessions = _self getOrDefault ["sessions", createHashMap]; + { _session set [_x, _y]; } forEach _fieldValuePairs; + + _sessions set [_uid, _session]; + _session + }], + ["resolveMode", compileFinal { + params [["_mode", "bank", [""]]]; + + private _finalMode = toLowerANSI _mode; + if !(_finalMode in ["atm", "bank"]) then { _finalMode = "bank"; }; + + _finalMode + }], + ["syncSessionMode", compileFinal { + params [["_uid", "", [""]], ["_mode", "", [""]], ["_resetAuthorization", false, [false]]]; + + private _current = _self call ["getSessionState", [_uid]]; + private _finalMode = if (_mode isEqualTo "") then { + _current getOrDefault ["mode", "bank"] + } else { + _self call ["resolveMode", [_mode]] + }; + private _atmAuthorized = _current getOrDefault ["atmAuthorized", false]; + + if (_finalMode isEqualTo "atm") then { + if (_resetAuthorization || { (_current getOrDefault ["mode", "bank"]) isNotEqualTo "atm" }) then { + _atmAuthorized = false; + }; + } else { + _atmAuthorized = false; + }; + + _self call ["setSessionState", [_uid, createHashMapFromArray [ + ["atmAuthorized", _atmAuthorized], + ["mode", _finalMode] + ]]] + }], + ["submitPin", compileFinal { + params [["_uid", "", [""]], ["_pin", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + _self call ["setSessionState", [_uid, createHashMapFromArray [["atmAuthorized", false], ["mode", "atm"]]]]; + if !(GVAR(BankStore) call ["validatePin", [_uid, _pin]]) exitWith { + GVAR(BankStore) call ["hydrateSession", [_uid, "atm", false]]; + false + }; + + _self call ["setSessionState", [_uid, createHashMapFromArray [["atmAuthorized", true], ["mode", "atm"]]]]; + GVAR(BankMessenger) call ["sendNotification", [_uid, "info", "Bank", "ATM access granted."]]; + GVAR(BankStore) call ["hydrateSession", [_uid, "atm", false]]; + true + }] +]]; + +GVAR(BankSessionManager) diff --git a/arma/server/addons/bank/script_component.hpp b/arma/server/addons/bank/script_component.hpp new file mode 100644 index 0000000..7b0884d --- /dev/null +++ b/arma/server/addons/bank/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT bank +#define COMPONENT_BEAUTIFIED Bank +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/bank/stringtable.xml b/arma/server/addons/bank/stringtable.xml new file mode 100644 index 0000000..0cd5b23 --- /dev/null +++ b/arma/server/addons/bank/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Bank + + + diff --git a/arma/server/addons/cad/$PBOPREFIX$ b/arma/server/addons/cad/$PBOPREFIX$ new file mode 100644 index 0000000..5062385 --- /dev/null +++ b/arma/server/addons/cad/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\cad diff --git a/arma/server/addons/cad/CfgEventHandlers.hpp b/arma/server/addons/cad/CfgEventHandlers.hpp new file mode 100644 index 0000000..9b160c1 --- /dev/null +++ b/arma/server/addons/cad/CfgEventHandlers.hpp @@ -0,0 +1,5 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/arma/server/addons/cad/README.md b/arma/server/addons/cad/README.md new file mode 100644 index 0000000..c5f19f5 --- /dev/null +++ b/arma/server/addons/cad/README.md @@ -0,0 +1,63 @@ +# Forge Server CAD + +## Overview +The CAD addon coordinates dispatch-facing operational state: groups, +assignments, dispatch orders, support requests, task assignment, permissions, +hydrate payloads, and recent activity. + +CAD state is extension-backed but intentionally transient. It is scoped to the +active server or mission lifecycle and starts fresh after restart. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_org` +- `forge_server_task` +- `forge_server_extension` at runtime for CAD extension calls +- `forge_client_cad` and `forge_client_notifications` for response RPCs + +## Main Components +- `fnc_initCadStore.sqf` coordinates repositories and request handling. +- `fnc_initActivityRepository.sqf` records recent CAD activity. +- `fnc_initAssignmentRepository.sqf` manages task assignments and dispatch + orders. +- `fnc_initGroupRepository.sqf` manages group membership, role, and status. +- `fnc_initPermissionService.sqf` resolves dispatch permissions. +- `fnc_initPersistenceService.sqf` bridges SQF state to extension hot CAD + storage. +- `fnc_initRequestRepository.sqf` manages support requests. + +## Event Surface +The addon listens to and emits events through the event bus: + +**Listens to:** +- Task lifecycle events (`task.started`, `task.completed`, `task.failed`) +- Task reward events to sync assignments +- Client notification/sync request events + +**Emits:** +- `cad.assignment.assigned` - task assigned to group +- `cad.assignment.created` - new assignment created +- `cad.assignment.acknowledged` - assignment acknowledged +- `cad.assignment.declined` - assignment declined +- `cad.assignment.closed` - assignment completed +- `cad.request.submitted` - support request submitted +- `cad.request.closed` - support request resolved +- `cad.group.updated` - group status updated + +Successful mutations may invalidate CAD state globally so clients refresh their views. + +## Contract Lifecycle +CAD assignment and task acceptance are intentionally separate. Dispatch +assignment reserves a contract for a group and marks the CAD assignment +`assigned`; it does not start task logic. The assigned group leader must +acknowledge the assignment before the task is accepted and ownership is bound. +If the leader declines, CAD removes the assignment and the contract returns to +the open board. Task status follows the same lifecycle: `available` on +creation, `assigned` after dispatch assignment, and `active` after +acknowledgement. + +## Notes +CAD hydrate payloads include assignable task catalog entries from `TaskStore` and +organization context from `ActorStore`. diff --git a/arma/server/addons/cad/XEH_PREP.hpp b/arma/server/addons/cad/XEH_PREP.hpp new file mode 100644 index 0000000..fcebe2a --- /dev/null +++ b/arma/server/addons/cad/XEH_PREP.hpp @@ -0,0 +1,8 @@ +PREP(initActivityRepository); +PREP(initAssignmentRepository); +PREP(initCadStore); +PREP(initGroupRepository); +PREP(initPermissionService); +PREP(initPersistenceService); +PREP(initRequestRepository); +PREP(registerEventListeners); diff --git a/arma/server/addons/cad/XEH_preInit.sqf b/arma/server/addons/cad/XEH_preInit.sqf new file mode 100644 index 0000000..0f63771 --- /dev/null +++ b/arma/server/addons/cad/XEH_preInit.sqf @@ -0,0 +1,262 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +call FUNC(initCadStore); +call FUNC(registerEventListeners); + +[QGVAR(requestHydrateCad), { + params [["_uid", "", [""]]]; + + private _player = GVAR(CadStore) call ["resolveRequestPlayer", [_uid, "CAD hydrate request received with empty UID."]]; + if (_player isEqualTo objNull) exitWith {}; + + private _payload = GVAR(CadStore) call ["buildHydratePayload", [_uid]]; + [CRPC(cad,responseHydrateCad), [_payload], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestAssignCadTask), { + params [ + ["_uid", "", [""]], + ["_taskID", "", [""]], + ["_groupID", "", [""]], + ["_note", "", [""]] + ]; + + if (_taskID isEqualTo "" || { _groupID isEqualTo "" }) exitWith { + ["WARNING", "Invalid CAD task assignment payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD task assignment payload.", + CRPC(cad,responseCadAssignment), + "assignTaskToGroup", + [_uid, _taskID, _groupID, _note], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestCreateCadDispatchOrder), { + params [ + ["_uid", "", [""]], + ["_assigneeGroupID", "", [""]], + ["_targetGroupID", "", [""]], + ["_note", "", [""]], + ["_priority", "priority", [""]], + ["_request", createHashMap, [createHashMap]] + ]; + + if (_assigneeGroupID isEqualTo "" || { _targetGroupID isEqualTo "" }) exitWith { + ["WARNING", "Invalid CAD dispatch order payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD dispatch order payload.", + CRPC(cad,responseCadAssignment), + "createDispatchOrder", + [_uid, _assigneeGroupID, _targetGroupID, _note, _priority, _request], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGenerateCadMissionTask), { + params [ + ["_uid", "", [""]], + ["_taskType", "", [""]], + ["_metadata", createHashMap, [createHashMap]] + ]; + + private _player = GVAR(CadStore) call ["resolveRequestPlayer", [_uid, "Invalid CAD generated task payload."]]; + if (_player isEqualTo objNull) exitWith {}; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Generated task request failed."] + ]; + + if (_taskType isEqualTo "") exitWith { + _result set ["message", "Select a task type before requesting a generated task."]; + [CRPC(cad,responseCadRequest), [_result], _player] call CFUNC(targetEvent); + }; + + private _permissionService = GVAR(CadStore) getOrDefault ["PermissionService", createHashMap]; + if (_permissionService isEqualTo createHashMap || { !(_permissionService call ["canDispatch", [_uid]]) }) exitWith { + _result set ["message", "Only dispatchers can request generated tasks."]; + [CRPC(cad,responseCadRequest), [_result], _player] call CFUNC(targetEvent); + }; + + if (isNil "forge_pmc_fnc_requestMissionTask") exitWith { + _result set ["message", "This mission does not expose dispatcher-generated tasks."]; + [CRPC(cad,responseCadRequest), [_result], _player] call CFUNC(targetEvent); + }; + + // Temporary mission-owned integration point. This keeps simulator-specific + // generator logic in the mission until CAD/task grows a framework-level + // on-demand generation interface. + _result = [_taskType, _metadata, _uid] call forge_pmc_fnc_requestMissionTask; + [CRPC(cad,responseCadRequest), [_result], _player] call CFUNC(targetEvent); + + if (_result getOrDefault ["success", false]) then { + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); + }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSubmitCadSupportRequest), { + params [ + ["_uid", "", [""]], + ["_type", "", [""]], + ["_fields", createHashMap, [createHashMap]], + ["_priority", "priority", [""]] + ]; + + if (_type isEqualTo "") exitWith { + ["WARNING", "Invalid CAD support request payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD support request payload.", + CRPC(cad,responseCadRequest), + "submitSupportRequest", + [_uid, _type, _fields, _priority], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestCloseCadSupportRequest), { + params [["_uid", "", [""]], ["_requestID", "", [""]]]; + + if (_requestID isEqualTo "") exitWith { + ["WARNING", "Invalid CAD support request close payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD support request close payload.", + CRPC(cad,responseCadRequest), + "closeSupportRequest", + [_uid, _requestID], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestAcknowledgeCadTask), { + params [["_uid", "", [""]], ["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { + ["WARNING", "Invalid CAD acknowledge payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD acknowledge payload.", + CRPC(cad,responseCadAssignment), + "acknowledgeTask", + [_uid, _taskID], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestCloseCadDispatchOrder), { + params [["_uid", "", [""]], ["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { + ["WARNING", "Invalid CAD dispatch order close payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD dispatch order close payload.", + CRPC(cad,responseCadAssignment), + "closeDispatchOrder", + [_uid, _taskID], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestDeclineCadTask), { + params [["_uid", "", [""]], ["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { + ["WARNING", "Invalid CAD decline payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD decline payload.", + CRPC(cad,responseCadAssignment), + "declineTask", + [_uid, _taskID], + false, + false + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestUpdateCadGroupStatus), { + params [["_uid", "", [""]], ["_groupID", "", [""]], ["_status", "", [""]]]; + + if (_groupID isEqualTo "" || { _status isEqualTo "" }) exitWith { + ["WARNING", "Invalid CAD group status payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD group status payload.", + CRPC(cad,responseCadGroupUpdate), + "updateGroupStatus", + [_uid, _groupID, _status], + false, + true + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestUpdateCadGroupRole), { + params [["_uid", "", [""]], ["_groupID", "", [""]], ["_role", "", [""]]]; + + if (_groupID isEqualTo "" || { _role isEqualTo "" }) exitWith { + ["WARNING", "Invalid CAD group role payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD group role payload.", + CRPC(cad,responseCadGroupUpdate), + "updateGroupRole", + [_uid, _groupID, _role], + false, + true + ]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestUpdateCadGroupProfile), { + params [ + ["_uid", "", [""]], + ["_groupID", "", [""]], + ["_status", "", [""]], + ["_role", "", [""]] + ]; + + if (_groupID isEqualTo "") exitWith { + ["WARNING", "Invalid CAD group profile payload."] call EFUNC(common,log); + }; + + GVAR(CadStore) call ["dispatchRpcMutation", [ + _uid, + "Invalid CAD group profile payload.", + CRPC(cad,responseCadGroupUpdate), + "updateGroupProfile", + [_uid, _groupID, _status, _role], + false, + true + ]]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/cad/config.cpp b/arma/server/addons/cad/config.cpp new file mode 100644 index 0000000..74d149d --- /dev/null +++ b/arma/server/addons/cad/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common", + "forge_server_actor", + "forge_server_org", + "forge_server_task" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/cad/functions/fnc_initActivityRepository.sqf b/arma/server/addons/cad/functions/fnc_initActivityRepository.sqf new file mode 100644 index 0000000..fa9b05b --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initActivityRepository.sqf @@ -0,0 +1,69 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initActivityRepository.sqf + * Author: IDSolutions + * Date: 2026-03-30 + * Public: No + * + * Description: + * Initializes the CAD activity repository for recent operational events. + * + * Arguments: + * None + * + * Return Value: + * CAD activity repository object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initActivityRepository + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ActivityRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadActivityRepositoryBaseClass"], + ["appendEntry", compileFinal { + params [["_entry", createHashMap, [createHashMap]]]; + + if (_entry isEqualTo createHashMap) exitWith { false }; + private _finalEntry = +_entry; + if ((_finalEntry getOrDefault ["timestamp", -1]) < 0) then { + _finalEntry set ["timestamp", serverTime]; + }; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { false }; + + _persistenceService call ["appendActivity", [_finalEntry]] + }], + ["appendActivity", compileFinal { + params [ + ["_type", "", [""]], + ["_message", "", [""]], + ["_taskID", "", [""]], + ["_groupID", "", [""]], + ["_actorUid", "", [""]] + ]; + + if (_type isEqualTo "" || { _message isEqualTo "" }) exitWith { false }; + private _entry = createHashMapFromArray [ + ["type", _type], + ["message", _message], + ["taskId", _taskID], + ["groupId", _groupID], + ["actorUid", _actorUid] + ]; + _self call ["appendEntry", [_entry]] + }], + ["getActivity", compileFinal { + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { [] }; + + private _result = _persistenceService call ["loadActivity", []]; + if !(_result getOrDefault ["success", false]) exitWith { [] }; + + +(_result getOrDefault ["data", []]) + }] +]; + +createHashMapObject [GVAR(ActivityRepositoryBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_initAssignmentRepository.sqf b/arma/server/addons/cad/functions/fnc_initAssignmentRepository.sqf new file mode 100644 index 0000000..4a75cbc --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initAssignmentRepository.sqf @@ -0,0 +1,607 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initAssignmentRepository.sqf + * Author: IDSolutions + * Date: 2026-03-30 + * Public: No + * + * Description: + * Initializes the CAD assignment repository for contract assignment + * state and dispatcher/group-leader task actions. + * + * Arguments: + * None + * + * Return Value: + * CAD assignment repository object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initAssignmentRepository + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(AssignmentRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadAssignmentRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["ownershipHydrated", false]; + }], + ["loadState", compileFinal { + private _result = createHashMapFromArray [ + ["success", false], + ["assignments", createHashMap], + ["dispatchOrders", createHashMap] + ]; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { _result }; + + private _assignmentsResult = _persistenceService call ["loadAssignments", []]; + if !(_assignmentsResult getOrDefault ["success", false]) exitWith { _result }; + + private _ordersResult = _persistenceService call ["loadDispatchOrders", []]; + if !(_ordersResult getOrDefault ["success", false]) exitWith { _result }; + + private _assignmentRegistry = +(_assignmentsResult getOrDefault ["data", createHashMap]); + private _dispatchOrderRegistry = +(_ordersResult getOrDefault ["data", createHashMap]); + + if !(_self getOrDefault ["ownershipHydrated", false]) then { + { + if ((_y getOrDefault ["state", ""]) isNotEqualTo "acknowledged") then { continue; }; + if ((_y getOrDefault ["acknowledgedByUid", ""]) isEqualTo "") then { continue; }; + if ((_dispatchOrderRegistry getOrDefault [_x, createHashMap]) isNotEqualTo createHashMap) then { continue; }; + if !((EGVAR(task,TaskStore) call ["getTaskStatus", [_x]]) in ["assigned", "active"]) then { continue; }; + + EGVAR(task,TaskStore) call ["acceptTask", [_x, _y getOrDefault ["acknowledgedByUid", ""]]]; + EGVAR(task,TaskStore) call ["setTaskStatus", [_x, "active"]]; + } forEach _assignmentRegistry; + + _self set ["ownershipHydrated", true]; + }; + + _result set ["success", true]; + _result set ["assignments", _assignmentRegistry]; + _result set ["dispatchOrders", _dispatchOrderRegistry]; + _result + }], + ["pruneAssignments", compileFinal { + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { 0 }; + + private _assignmentRegistry = _state getOrDefault ["assignments", createHashMap]; + private _dispatchOrderRegistry = _state getOrDefault ["dispatchOrders", createHashMap]; + private _keysToRemove = []; + + { + if ((_dispatchOrderRegistry getOrDefault [_x, createHashMap]) isNotEqualTo createHashMap) then { + continue; + }; + + private _status = EGVAR(task,TaskStore) call ["getTaskStatus", [_x]]; + if !(_status in ["available", "assigned", "active", ""]) then { + _keysToRemove pushBack _x; + }; + } forEach _assignmentRegistry; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isNotEqualTo createHashMap) then { + { + _persistenceService call ["deleteAssignment", [_x]]; + } forEach _keysToRemove; + }; + + count _keysToRemove + }], + ["getAssignments", compileFinal { + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { [] }; + + values (_state getOrDefault ["assignments", createHashMap]) + }], + ["isDispatchOrder", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { false }; + + ((_state getOrDefault ["dispatchOrders", createHashMap]) getOrDefault [_taskID, createHashMap]) isNotEqualTo createHashMap + }], + ["getAssignmentByTaskId", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { createHashMap }; + + +((_state getOrDefault ["assignments", createHashMap]) getOrDefault [_taskID, createHashMap]) + }], + ["getDispatchOrderByTaskId", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { createHashMap }; + + +((_state getOrDefault ["dispatchOrders", createHashMap]) getOrDefault [_taskID, createHashMap]) + }], + ["getCurrentTaskIdForGroup", compileFinal { + params [["_groupID", "", [""]]]; + + if (_groupID isEqualTo "") exitWith { "" }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { "" }; + + private _assignmentRegistry = _state getOrDefault ["assignments", createHashMap]; + private _dispatchOrderRegistry = _state getOrDefault ["dispatchOrders", createHashMap]; + private _taskID = ""; + + { + if ((_y getOrDefault ["groupId", ""]) isNotEqualTo _groupID) then { continue; }; + if !((_y getOrDefault ["state", ""]) in ["assigned", "acknowledged"]) then { continue; }; + + private _dispatchOrder = +(_dispatchOrderRegistry getOrDefault [_x, createHashMap]); + if (_dispatchOrder isEqualTo createHashMap) then { + if !((EGVAR(task,TaskStore) call ["getTaskStatus", [_x]]) in ["assigned", "active"]) then { continue; }; + _taskID = _x; + } else { + _taskID = _dispatchOrder getOrDefault ["title", _x]; + }; + } forEach _assignmentRegistry; + + _taskID + }], + ["buildDispatchOrderEntry", compileFinal { + params [ + ["_taskID", "", [""]], + ["_order", createHashMap, [createHashMap]], + ["_assignment", createHashMap, [createHashMap]], + ["_groupRepository", createHashMap, [createHashMap]] + ]; + + if (_taskID isEqualTo "" || { _order isEqualTo createHashMap }) exitWith { createHashMap }; + + private _entry = +_order; + private _targetGroupID = _order getOrDefault ["targetGroupId", ""]; + if (_targetGroupID isNotEqualTo "") then { + private _targetGroup = _groupRepository call ["getGroupRecord", [_targetGroupID]]; + if (_targetGroup isNotEqualTo createHashMap) then { + private _targetCallsign = _targetGroup getOrDefault ["callsign", _targetGroupID]; + _entry set ["targetGroupCallsign", _targetCallsign]; + _entry set ["position", +(_targetGroup getOrDefault ["position", _entry getOrDefault ["position", []]])]; + _entry set ["title", format ["Backup %1", _targetCallsign]]; + + if ((_order getOrDefault ["note", ""]) isEqualTo "") then { + _entry set ["description", format ["Dispatch order to back up %1 at its current position.", _targetCallsign]]; + }; + }; + }; + + _entry set ["taskId", _taskID]; + _entry set ["taskID", _taskID]; + _entry set ["type", _entry getOrDefault ["type", "dispatch_order"]]; + _entry set ["isDispatchOrder", true]; + _entry set ["assignedGroupId", _assignment getOrDefault ["groupId", ""]]; + _entry set ["assignmentState", [_assignment getOrDefault ["state", ""], "unassigned"] select (_assignment isEqualTo createHashMap)]; + _entry + }], + ["buildDispatchOrderEntryForTask", compileFinal { + params [ + ["_taskID", "", [""]], + ["_groupRepository", createHashMap, [createHashMap]] + ]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { createHashMap }; + + private _order = +((_state getOrDefault ["dispatchOrders", createHashMap]) getOrDefault [_taskID, createHashMap]); + if (_order isEqualTo createHashMap) exitWith { createHashMap }; + + private _assignment = +((_state getOrDefault ["assignments", createHashMap]) getOrDefault [_taskID, createHashMap]); + _self call ["buildDispatchOrderEntry", [_taskID, _order, _assignment, _groupRepository]] + }], + ["assignTaskToGroup", compileFinal { + params [ + ["_requesterUid", "", [""]], + ["_taskID", "", [""]], + ["_groupID", "", [""]], + ["_note", "", [""]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to assign task."], + ["assignment", createHashMap] + ]; + + private _permissionService = _self getOrDefault ["permissionService", createHashMap]; + if !(_permissionService call ["canDispatch", [_requesterUid]]) exitWith { + _result set ["message", "You are not authorized to assign contracts."]; + _result + }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _assignmentRegistry = _state getOrDefault ["assignments", createHashMap]; + private _dispatchOrderRegistry = _state getOrDefault ["dispatchOrders", createHashMap]; + private _isDispatchOrder = (_dispatchOrderRegistry getOrDefault [_taskID, createHashMap]) isNotEqualTo createHashMap; + + if (!_isDispatchOrder && { (EGVAR(task,TaskStore) call ["getTaskStatus", [_taskID]]) isNotEqualTo "available" }) exitWith { + _result set ["message", "Task is no longer available."]; + _result + }; + + private _existingAssignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]); + if ( + _existingAssignment isNotEqualTo createHashMap + && { (_existingAssignment getOrDefault ["state", ""]) in ["assigned", "acknowledged"] } + ) exitWith { + _result set ["message", ["Task is already assigned and must be declined or completed before reassignment.", "Dispatch order is already assigned and must be declined or closed before reassignment."] select _isDispatchOrder]; + _result set ["assignment", _existingAssignment]; + _result + }; + + private _groupRepository = _self getOrDefault ["groupRepository", createHashMap]; + private _groupRecord = _groupRepository call ["getGroupRecord", [_groupID]]; + if (_groupRecord isEqualTo createHashMap) exitWith { + _result set ["message", "Selected group is unavailable."]; + _result + }; + + private _leaderUid = _groupRecord getOrDefault ["leaderUid", ""]; + if (_leaderUid isEqualTo "") exitWith { + _result set ["message", "Selected group has no online leader."]; + _result + }; + + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _assignment = createHashMapFromArray [ + ["taskId", _taskID], + ["groupId", _groupID], + ["groupCallsign", _groupRecord getOrDefault ["callsign", _groupID]], + ["assignedByUid", _requesterUid], + ["assignedByName", ["Dispatcher", name _requesterPlayer] select (_requesterPlayer isNotEqualTo objNull)], + ["assignedAt", serverTime], + ["state", "assigned"], + ["note", _note] + ]; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _assignResult = _persistenceService call ["assignAssignment", [_taskID, _assignment]]; + if !(_assignResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the assignment."]; + _result + }; + + private _assignData = +(_assignResult getOrDefault ["data", createHashMap]); + _assignment = +(_assignData getOrDefault ["assignment", createHashMap]); + if (_assignment isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension returned an invalid assignment."]; + _result + }; + + private _activityEntry = +(_assignData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + if (!_isDispatchOrder) then { + EGVAR(task,TaskStore) call ["setTaskStatus", [_taskID, "assigned"]]; + }; + + _result set ["success", true]; + _result set ["message", _assignData getOrDefault ["message", ["Task assigned.", "Dispatch order assigned."] select _isDispatchOrder]]; + _result set ["assignment", _assignment]; + _result set ["leaderUid", _leaderUid]; + _result set ["isDispatchOrder", _isDispatchOrder]; + if (_isDispatchOrder) then { + _result set ["order", +(_dispatchOrderRegistry getOrDefault [_taskID, createHashMap])]; + }; + _result + }], + ["createDispatchOrder", compileFinal { + params [ + ["_requesterUid", "", [""]], + ["_assigneeGroupID", "", [""]], + ["_targetGroupID", "", [""]], + ["_note", "", [""]], + ["_priority", "priority", [""]], + ["_request", createHashMap, [createHashMap]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to create dispatch order."], + ["assignment", createHashMap], + ["order", createHashMap] + ]; + + private _permissionService = _self getOrDefault ["permissionService", createHashMap]; + if !(_permissionService call ["canDispatch", [_requesterUid]]) exitWith { + _result set ["message", "You are not authorized to create dispatch orders."]; + _result + }; + + if (_assigneeGroupID isEqualTo "" || { _targetGroupID isEqualTo "" }) exitWith { + _result set ["message", "Assignee and target groups are required."]; + _result + }; + + if (_assigneeGroupID isEqualTo _targetGroupID) exitWith { + _result set ["message", "Assignee and target groups must be different."]; + _result + }; + + private _groupRepository = _self getOrDefault ["groupRepository", createHashMap]; + private _assigneeGroup = _groupRepository call ["getGroupRecord", [_assigneeGroupID]]; + if (_assigneeGroup isEqualTo createHashMap) exitWith { + _result set ["message", "Selected assignee group is unavailable."]; + _result + }; + + private _assigneeLeaderUid = _assigneeGroup getOrDefault ["leaderUid", ""]; + if (_assigneeLeaderUid isEqualTo "") exitWith { + _result set ["message", "Selected assignee group has no online leader."]; + _result + }; + + private _targetGroup = _groupRepository call ["getGroupRecord", [_targetGroupID]]; + if (_targetGroup isEqualTo createHashMap) exitWith { + _result set ["message", "Selected target group is unavailable."]; + _result + }; + + private _validPriorities = ["routine", "priority", "emergency"]; + private _finalPriority = toLowerANSI _priority; + if !(_finalPriority in _validPriorities) then { + _finalPriority = "priority"; + }; + + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _dispatchContext = createHashMapFromArray [ + ["assigneeGroupId", _assigneeGroupID], + ["assigneeGroupCallsign", _assigneeGroup getOrDefault ["callsign", _assigneeGroupID]], + ["targetGroupId", _targetGroupID], + ["targetGroupCallsign", _targetGroup getOrDefault ["callsign", _targetGroupID]], + ["targetPosition", +(_targetGroup getOrDefault ["position", []])], + ["createdByUid", _requesterUid], + ["createdByName", ["Dispatcher", name _requesterPlayer] select (_requesterPlayer isNotEqualTo objNull)], + ["requestId", _request getOrDefault ["requestId", ""]], + ["requestType", _request getOrDefault ["type", ""]], + ["requestTitle", _request getOrDefault ["title", ""]], + ["requestSummary", _request getOrDefault ["summary", ""]], + ["requestFields", +(_request getOrDefault ["fields", createHashMap])], + ["note", _note], + ["priority", _finalPriority], + ["createdAt", serverTime] + ]; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _createResult = _persistenceService call ["createDispatchOrderFromContext", [_dispatchContext]]; + if !(_createResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the dispatch order."]; + _result + }; + + private _createData = +(_createResult getOrDefault ["data", createHashMap]); + private _taskID = _createData getOrDefault ["taskId", ""]; + private _order = +(_createData getOrDefault ["order", createHashMap]); + private _assignment = +(_createData getOrDefault ["assignment", createHashMap]); + if (_taskID isEqualTo "" || { _order isEqualTo createHashMap } || { _assignment isEqualTo createHashMap }) exitWith { + _result set ["message", "CAD extension returned an invalid dispatch order."]; + _result + }; + + private _activityEntry = +(_createData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", _createData getOrDefault ["message", "Dispatch order created."]]; + _result set ["assignment", _assignment]; + _result set ["order", _order]; + _result set ["leaderUid", _assigneeLeaderUid]; + _result set ["isDispatchOrder", true]; + _result + }], + ["closeDispatchOrder", compileFinal { + params [["_requesterUid", "", [""]], ["_taskID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to close dispatch order."], + ["assignment", createHashMap] + ]; + + private _permissionService = _self getOrDefault ["permissionService", createHashMap]; + if !(_permissionService call ["canDispatch", [_requesterUid]]) exitWith { + _result set ["message", "You are not authorized to close dispatch orders."]; + _result + }; + + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _order = +((_state getOrDefault ["dispatchOrders", createHashMap]) getOrDefault [_taskID, createHashMap]); + if (_order isEqualTo createHashMap) exitWith { + _result set ["message", "Dispatch order could not be resolved."]; + _result + }; + + private _assignment = +((_state getOrDefault ["assignments", createHashMap]) getOrDefault [_taskID, createHashMap]); + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _closeResult = _persistenceService call ["closeDispatchOrder", [_taskID]]; + if !(_closeResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the dispatch order close."]; + _result + }; + + private _closeData = +(_closeResult getOrDefault ["data", createHashMap]); + _assignment = +(_closeData getOrDefault ["assignment", _assignment]); + + private _activityEntry = +(_closeData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + _activityEntry set ["actorUid", _requesterUid]; + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", _closeData getOrDefault ["message", "Dispatch order closed."]]; + _result set ["assignment", _assignment]; + _result set ["isDispatchOrder", true]; + _result + }], + ["applyAssignmentTransition", compileFinal { + params [["_requesterUid", "", [""]], ["_taskID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to update task assignment."], + ["assignment", createHashMap] + ]; + + private _transition = _this param [2, "acknowledge", [""]]; + private _state = _self call ["loadState", []]; + if !(_state getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _assignment = +((_state getOrDefault ["assignments", createHashMap]) getOrDefault [_taskID, createHashMap]); + private _isDispatchOrder = ((_state getOrDefault ["dispatchOrders", createHashMap]) getOrDefault [_taskID, createHashMap]) isNotEqualTo createHashMap; + if (_assignment isEqualTo createHashMap) exitWith { + _result set ["message", "Task is not assigned."]; + _result + }; + + private _groupID = _assignment getOrDefault ["groupId", ""]; + private _groupRepository = _self getOrDefault ["groupRepository", createHashMap]; + if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith { + _result set ["message", format ["Only the assigned group leader can %1 this task.", _transition]]; + _result + }; + + switch (_transition) do { + case "acknowledge": { + if (!_isDispatchOrder) then { + private _acceptResult = EGVAR(task,TaskStore) call ["acceptTask", [_taskID, _requesterUid]]; + if !(_acceptResult getOrDefault ["success", false]) exitWith { + _result set ["message", _acceptResult getOrDefault ["message", "Failed to accept task."]]; + _result + }; + EGVAR(task,TaskStore) call ["setTaskStatus", [_taskID, "active"]]; + }; + }; + case "decline": { + if (!_isDispatchOrder) then { + EGVAR(task,TaskStore) call ["releaseTaskOwnership", [_taskID]]; + EGVAR(task,TaskStore) call ["setTaskStatus", [_taskID, "available"]]; + }; + }; + }; + + if (_result getOrDefault ["success", false]) exitWith { _result }; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _patch = switch (_transition) do { + case "decline": { + createHashMapFromArray [ + ["state", "declined"], + ["declinedAt", serverTime], + ["declinedByUid", _requesterUid] + ] + }; + default { + createHashMapFromArray [ + ["state", "acknowledged"], + ["acknowledgedAt", serverTime], + ["acknowledgedByUid", _requesterUid] + ] + }; + }; + private _transitionResult = switch (_transition) do { + case "decline": { _persistenceService call ["declineAssignment", [_taskID, _patch]] }; + default { _persistenceService call ["acknowledgeAssignment", [_taskID, _patch]] }; + }; + if !(_transitionResult getOrDefault ["success", false]) exitWith { + _result set ["message", switch (_transition) do { + case "decline": { "CAD extension rejected the decline." }; + default { "CAD extension rejected the acknowledgement." }; + }]; + _result + }; + + private _transitionData = +(_transitionResult getOrDefault ["data", createHashMap]); + _assignment = +(_transitionData getOrDefault ["assignment", createHashMap]); + if (_assignment isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension returned an invalid assignment."]; + _result + }; + + private _activityEntry = +(_transitionData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + if (_isDispatchOrder) then { + _activityEntry set ["type", format ["dispatch_order_%1", _transition]]; + _activityEntry set ["message", format ["%1 %2d %3.", _requesterUid, _transition, _taskID]]; + }; + + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", switch (_transition) do { + case "decline": { [_transitionData getOrDefault ["message", "Task declined and returned to the contract board."], "Dispatch order declined and returned to the dispatch board."] select _isDispatchOrder }; + default { [_transitionData getOrDefault ["message", "Task acknowledged."], "Dispatch order acknowledged."] select _isDispatchOrder }; + }]; + _result set ["assignment", _assignment]; + _result set ["isDispatchOrder", _isDispatchOrder]; + _result + }], + ["acknowledgeTask", compileFinal { + _self call ["applyAssignmentTransition", [_this # 0, _this # 1, "acknowledge"]] + }], + ["declineTask", compileFinal { + _self call ["applyAssignmentTransition", [_this # 0, _this # 1, "decline"]] + }] +]; + +createHashMapObject [GVAR(AssignmentRepositoryBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_initCadStore.sqf b/arma/server/addons/cad/functions/fnc_initCadStore.sqf new file mode 100644 index 0000000..0bec8bb --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initCadStore.sqf @@ -0,0 +1,342 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initCadStore.sqf + * Author: IDSolutions + * Date: 2026-03-29 + * Public: Yes + * + * Description: + * Initializes the CAD store as a coordinator over activity, group, + * assignment, and permission domain objects. + * + * CAD operational state is extension-backed but intentionally transient. + * Orders, requests, assignments, hydrate state, and recent activity are + * scoped to the active server/mission lifecycle and start fresh after a + * restart. + * + * Arguments: + * None + * + * Return Value: + * CAD store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initCadStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(CadStoreBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadStoreBaseClass"], + ["#create", compileFinal { + private _activityRepository = call FUNC(initActivityRepository); + private _permissionService = call FUNC(initPermissionService); + private _groupRepository = call FUNC(initGroupRepository); + private _assignmentRepository = call FUNC(initAssignmentRepository); + private _persistenceService = call FUNC(initPersistenceService); + private _requestRepository = call FUNC(initRequestRepository); + + _groupRepository set ["activityRepository", _activityRepository]; + _groupRepository set ["assignmentRepository", _assignmentRepository]; + _groupRepository set ["permissionService", _permissionService]; + _groupRepository set ["persistenceService", _persistenceService]; + + _assignmentRepository set ["activityRepository", _activityRepository]; + _assignmentRepository set ["groupRepository", _groupRepository]; + _assignmentRepository set ["permissionService", _permissionService]; + _assignmentRepository set ["persistenceService", _persistenceService]; + + _requestRepository set ["activityRepository", _activityRepository]; + _requestRepository set ["groupRepository", _groupRepository]; + _requestRepository set ["permissionService", _permissionService]; + _requestRepository set ["persistenceService", _persistenceService]; + + _activityRepository set ["persistenceService", _persistenceService]; + + _self set ["ActivityRepository", _activityRepository]; + _self set ["PermissionService", _permissionService]; + _self set ["GroupRepository", _groupRepository]; + _self set ["AssignmentRepository", _assignmentRepository]; + _self set ["PersistenceService", _persistenceService]; + _self set ["RequestRepository", _requestRepository]; + + ["INFO", "CAD Store Initialized!"] call EFUNC(common,log); + }], + ["notifyPlayer", compileFinal { + params [ + ["_uid", "", [""]], + ["_type", "info", [""]], + ["_title", "CAD", [""]], + ["_message", "", [""]] + ]; + + if (_uid isEqualTo "" || { _message isEqualTo "" }) exitWith { false }; + if (isNil QEGVAR(common,EventBus)) exitWith { + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith { false }; + + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + true + }; + + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + createHashMapFromArray [ + ["uids", [_uid]], + ["notificationType", _type], + ["title", _title], + ["message", _message] + ], + createHashMapFromArray [["source", "cad"]] + ]]; + true + }], + ["resolveRequestPlayer", compileFinal { + params [ + ["_uid", "", [""]], + ["_warning", "Invalid CAD payload.", [""]] + ]; + + if (_uid isEqualTo "") exitWith { + ["WARNING", _warning] call EFUNC(common,log); + objNull + }; + + [_uid] call EFUNC(common,getPlayer) + }], + ["sendRpcResult", compileFinal { + params [ + ["_player", objNull, [objNull]], + ["_responseRpc", "", [""]], + ["_result", createHashMap, [createHashMap]], + ["_invalidateOnSuccess", false, [false]], + ["_requireChanged", false, [false]] + ]; + + if (_player isEqualTo objNull || { _responseRpc isEqualTo "" }) exitWith {}; + + [_responseRpc, [_result], _player] call CFUNC(targetEvent); + + if ( + _invalidateOnSuccess + && { _result getOrDefault ["success", false] } + && { !_requireChanged || { _result getOrDefault ["changed", true] } } + ) then { + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); + }; + }], + ["dispatchRpcMutation", compileFinal { + params [ + ["_uid", "", [""]], + ["_warning", "Invalid CAD payload.", [""]], + ["_responseRpc", "", [""]], + ["_method", "", [""]], + ["_arguments", [], [[]]], + ["_invalidateOnSuccess", false, [false]], + ["_requireChanged", false, [false]] + ]; + + private _player = _self call ["resolveRequestPlayer", [_uid, _warning]]; + if (_player isEqualTo objNull || { _method isEqualTo "" }) exitWith { createHashMap }; + + private _result = _self call [_method, _arguments]; + _self call ["sendRpcResult", [_player, _responseRpc, _result, _invalidateOnSuccess, _requireChanged]]; + _result + }], + ["emitAssignmentEvent", compileFinal { + params [["_eventName", "", [""]], ["_result", createHashMap, [createHashMap]]]; + + if (_eventName isEqualTo "" || { !(_result getOrDefault ["success", false]) }) exitWith { createHashMap }; + if (isNil QEGVAR(common,EventBus)) exitWith { createHashMap }; + + private _assignment = +(_result getOrDefault ["assignment", createHashMap]); + private _payload = createHashMapFromArray [ + ["taskID", _assignment getOrDefault ["taskId", ""]], + ["assignment", _assignment], + ["leaderUid", _result getOrDefault ["leaderUid", ""]], + ["isDispatchOrder", _result getOrDefault ["isDispatchOrder", false]], + ["message", _result getOrDefault ["message", ""]] + ]; + + if (_result getOrDefault ["isDispatchOrder", false]) then { + _payload set ["order", +(_result getOrDefault ["order", createHashMap])]; + }; + + EGVAR(common,EventBus) call ["emit", [ + _eventName, + _payload, + createHashMapFromArray [["source", "cad"]] + ]] + }], + ["emitRequestEvent", compileFinal { + params [["_eventName", "", [""]], ["_result", createHashMap, [createHashMap]]]; + + if (_eventName isEqualTo "" || { !(_result getOrDefault ["success", false]) }) exitWith { createHashMap }; + if (isNil QEGVAR(common,EventBus)) exitWith { createHashMap }; + + private _request = +(_result getOrDefault ["request", createHashMap]); + EGVAR(common,EventBus) call ["emit", [ + _eventName, + createHashMapFromArray [ + ["requestID", _request getOrDefault ["requestId", ""]], + ["groupID", _request getOrDefault ["groupId", ""]], + ["request", _request], + ["message", _result getOrDefault ["message", ""]] + ], + createHashMapFromArray [["source", "cad"]] + ]] + }], + ["emitGroupEvent", compileFinal { + params [["_eventName", "", [""]], ["_result", createHashMap, [createHashMap]]]; + + if ( + _eventName isEqualTo "" + || { !(_result getOrDefault ["success", false]) } + || { !(_result getOrDefault ["changed", true]) } + ) exitWith { createHashMap }; + if (isNil QEGVAR(common,EventBus)) exitWith { createHashMap }; + + private _group = +(_result getOrDefault ["group", createHashMap]); + EGVAR(common,EventBus) call ["emit", [ + _eventName, + createHashMapFromArray [ + ["groupID", _group getOrDefault ["groupId", ""]], + ["group", _group], + ["message", _result getOrDefault ["message", ""]], + ["changed", _result getOrDefault ["changed", true]] + ], + createHashMapFromArray [["source", "cad"]] + ]] + }], + ["notifyAssignmentLeader", compileFinal { + params [["_result", createHashMap, [createHashMap]]]; + + if !(_result getOrDefault ["success", false]) exitWith { false }; + + private _leaderUid = _result getOrDefault ["leaderUid", ""]; + if (_leaderUid isEqualTo "") exitWith { false }; + + private _assignmentRepository = _self get "AssignmentRepository"; + private _message = if (_result getOrDefault ["isDispatchOrder", false]) then { + private _order = _result getOrDefault ["order", createHashMap]; + if (_order isEqualTo createHashMap) then { + private _assignment = _result getOrDefault ["assignment", createHashMap]; + private _taskID = _assignment getOrDefault ["taskId", ""]; + _order = _assignmentRepository call ["buildDispatchOrderEntryForTask", [_taskID, _self get "GroupRepository"]]; + }; + + format ["Dispatch order assigned: %1. Open CAD to review and acknowledge.", _order getOrDefault ["title", "Dispatch Order"]] + } else { + private _assignment = _result getOrDefault ["assignment", createHashMap]; + format ["Contract assigned: %1. Open CAD to review and acknowledge.", _assignment getOrDefault ["taskId", "Task"]] + }; + + _self call ["notifyPlayer", [ + _leaderUid, + "info", + "Tasks", + _message + ]] + }], + ["assignTaskToGroup", compileFinal { + private _result = (_self get "AssignmentRepository") call ["assignTaskToGroup", _this]; + if !(_result getOrDefault ["success", false]) exitWith { _result }; + + _self call ["notifyAssignmentLeader", [_result]]; + _self call ["emitAssignmentEvent", ["cad.assignment.assigned", _result]]; + _result + }], + ["createDispatchOrder", compileFinal { + private _result = (_self get "AssignmentRepository") call ["createDispatchOrder", _this]; + if !(_result getOrDefault ["success", false]) exitWith { _result }; + + _self call ["notifyAssignmentLeader", [_result]]; + _self call ["emitAssignmentEvent", ["cad.assignment.created", _result]]; + _result + }], + ["closeDispatchOrder", compileFinal { + private _result = (_self get "AssignmentRepository") call ["closeDispatchOrder", _this]; + _self call ["emitAssignmentEvent", ["cad.assignment.closed", _result]]; + _result + }], + ["submitSupportRequest", compileFinal { + private _result = (_self get "RequestRepository") call ["submitRequest", _this]; + _self call ["emitRequestEvent", ["cad.request.submitted", _result]]; + _result + }], + ["closeSupportRequest", compileFinal { + private _result = (_self get "RequestRepository") call ["closeRequest", _this]; + _self call ["emitRequestEvent", ["cad.request.closed", _result]]; + _result + }], + ["acknowledgeTask", compileFinal { + private _result = (_self get "AssignmentRepository") call ["acknowledgeTask", _this]; + _self call ["emitAssignmentEvent", ["cad.assignment.acknowledged", _result]]; + _result + }], + ["declineTask", compileFinal { + private _result = (_self get "AssignmentRepository") call ["declineTask", _this]; + _self call ["emitAssignmentEvent", ["cad.assignment.declined", _result]]; + _result + }], + ["updateGroupStatus", compileFinal { + private _result = (_self get "GroupRepository") call ["updateGroupStatus", _this]; + _self call ["emitGroupEvent", ["cad.group.updated", _result]]; + _result + }], + ["updateGroupRole", compileFinal { + private _result = (_self get "GroupRepository") call ["updateGroupRole", _this]; + _self call ["emitGroupEvent", ["cad.group.updated", _result]]; + _result + }], + ["updateGroupProfile", compileFinal { + private _result = (_self get "GroupRepository") call ["updateGroupProfile", _this]; + _self call ["emitGroupEvent", ["cad.group.updated", _result]]; + _result + }], + ["buildHydratePayload", compileFinal { + params [["_uid", "", [""]]]; + + private _permissionService = _self get "PermissionService"; + private _groupRepository = _self get "GroupRepository"; + + private _groupID = _groupRepository call ["getPlayerGroupId", [_uid]]; + private _session = createHashMapFromArray [ + ["uid", _uid], + ["orgId", EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]], + ["isDispatcher", _permissionService call ["canDispatch", [_uid]]], + ["groupId", _groupID], + ["isLeader", _groupRepository call ["isGroupLeader", [_uid, _groupID]]] + ]; + private _seed = createHashMapFromArray [ + ["groups", _groupRepository call ["buildGroups", []]], + ["activeTasks", EGVAR(task,TaskStore) call ["getActiveTaskCatalog", []]], + ["session", _session] + ]; + private _emptyPayload = createHashMapFromArray [ + ["groups", _seed get "groups"], + ["contracts", []], + ["requests", []], + ["assignments", []], + ["activity", []], + ["session", _session] + ]; + private _persistenceService = _self getOrDefault ["PersistenceService", createHashMap]; + + if (_persistenceService isEqualTo createHashMap) exitWith { + ["WARNING", "CAD hydrate extension state is unavailable; returning seed-only payload."] call EFUNC(common,log); + _emptyPayload + }; + + private _hydrateResult = _persistenceService call ["buildHydratePayload", [_seed]]; + if (_hydrateResult getOrDefault ["success", false]) exitWith { + _hydrateResult getOrDefault ["data", createHashMap] + }; + + ["WARNING", "CAD hydrate failed in the extension; returning seed-only payload."] call EFUNC(common,log); + _emptyPayload + }] +]; + +GVAR(CadStore) = createHashMapObject [GVAR(CadStoreBaseClass)]; +GVAR(CadStore) diff --git a/arma/server/addons/cad/functions/fnc_initGroupRepository.sqf b/arma/server/addons/cad/functions/fnc_initGroupRepository.sqf new file mode 100644 index 0000000..94f1fbf --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initGroupRepository.sqf @@ -0,0 +1,299 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initGroupRepository.sqf + * Author: IDSolutions + * Date: 2026-03-30 + * Public: No + * + * Description: + * Initializes the CAD group repository for live group state, roles, + * and dispatcher/leader-managed group profiles. + * + * Arguments: + * None + * + * Return Value: + * CAD group repository object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initGroupRepository + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GroupRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadGroupRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["validStatuses", [ + "available", + "en_route", + "on_task", + "holding", + "danger", + "unavailable" + ]]; + _self set ["validRoles", [ + "infantry", + "recon", + "armor", + "air", + "logistics", + "support" + ]]; + }], + ["resolveGroupId", compileFinal { + params [["_group", grpNull, [grpNull]]]; + + if (isNull _group) exitWith { "" }; + + private _leader = leader _group; + private _leaderUid = if (isNull _leader) then { "" } else { getPlayerUID _leader }; + if (_leaderUid isNotEqualTo "") exitWith { format ["group:%1", _leaderUid] }; + + private _groupLabel = groupId _group; + if (_groupLabel isNotEqualTo "") exitWith { format ["group:%1", _groupLabel] }; + + str _group + }], + ["getCurrentTaskIdForGroup", compileFinal { + params [["_groupID", "", [""]]]; + + if (_groupID isEqualTo "") exitWith { "" }; + + private _assignmentRepository = _self getOrDefault ["assignmentRepository", createHashMap]; + if (_assignmentRepository isEqualTo createHashMap) exitWith { "" }; + + _assignmentRepository call ["getCurrentTaskIdForGroup", [_groupID]] + }], + ["syncGroups", compileFinal { + private _liveGroups = []; + + { + private _group = _x; + if (side _group isNotEqualTo west) then { continue; }; + + private _members = allPlayers select { group _x isEqualTo _group }; + if (_members isEqualTo []) then { continue; }; + + private _leader = leader _group; + if (isNull _leader || { !isPlayer _leader }) then { + _leader = _members # 0; + }; + + private _groupID = _self call ["resolveGroupId", [_group]]; + if (_groupID isEqualTo "") then { continue; }; + + private _leaderUid = getPlayerUID _leader; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_leaderUid]]; + private _memberUids = []; + private _memberRoster = []; + { + private _memberUid = getPlayerUID _x; + private _memberState = toLowerANSI (lifeState _x); + + if (_memberUid isNotEqualTo "") then { + _memberUids pushBack _memberUid; + }; + + _memberRoster pushBack (createHashMapFromArray [ + ["uid", _memberUid], + ["name", name _x], + ["lifeState", _memberState], + ["isLeader", _x isEqualTo _leader], + ["position", getPosATL _x] + ]); + } forEach _members; + + _liveGroups pushBack (createHashMapFromArray [ + ["groupId", _groupID], + ["callsign", [groupId _group, _groupID] select ((groupId _group) isEqualTo "")], + ["leaderUid", _leaderUid], + ["leaderName", name _leader], + ["memberUids", _memberUids], + ["members", _memberRoster], + ["orgId", _orgID], + ["role", "infantry"], + ["status", "available"], + ["position", getPosATL _leader], + ["currentTaskId", _self call ["getCurrentTaskIdForGroup", [_groupID]]], + ["lastUpdate", serverTime] + ]); + } forEach allGroups; + + private _mergedGroups = _liveGroups; + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isNotEqualTo createHashMap) then { + private _buildResult = _persistenceService call ["buildGroups", [_liveGroups]]; + if (_buildResult getOrDefault ["success", false]) then { + _mergedGroups = +(_buildResult getOrDefault ["data", _liveGroups]); + }; + }; + + private _nextRegistry = createHashMap; + { + if !(_x isEqualType createHashMap) then { continue; }; + private _groupID = _x getOrDefault ["groupId", ""]; + if (_groupID isEqualTo "") then { continue; }; + + private _groupRecord = +_x; + _nextRegistry set [_groupID, _groupRecord]; + } forEach _mergedGroups; + + _nextRegistry + }], + ["getGroupRecord", compileFinal { + params [["_groupID", "", [""]]]; + + if (_groupID isEqualTo "") exitWith { createHashMap }; + + private _groupRegistry = _self call ["syncGroups", []]; + +(_groupRegistry getOrDefault [_groupID, createHashMap]) + }], + ["getPlayerGroupId", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { "" }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith { "" }; + + _self call ["resolveGroupId", [group _player]] + }], + ["isGroupLeader", compileFinal { + params [["_uid", "", [""]], ["_groupID", "", [""]]]; + + if (_uid isEqualTo "" || { _groupID isEqualTo "" }) exitWith { false }; + + private _groupRecord = _self call ["getGroupRecord", [_groupID]]; + (_groupRecord getOrDefault ["leaderUid", ""]) isEqualTo _uid + }], + ["buildGroups", compileFinal { + private _groupRegistry = _self call ["syncGroups", []]; + private _groups = []; + + { + _groups pushBack +_y; + } forEach _groupRegistry; + + _groups + }], + ["applyGroupProfileUpdate", compileFinal { + params [ + ["_requesterUid", "", [""]], + ["_groupID", "", [""]], + ["_status", "", [""]], + ["_role", "", [""]], + ["_mode", "profile", [""]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to update group profile."], + ["changed", false], + ["group", createHashMap] + ]; + + private _finalStatus = toLowerANSI _status; + private _finalRole = toLowerANSI _role; + private _hasStatus = _finalStatus isNotEqualTo ""; + private _hasRole = _finalRole isNotEqualTo ""; + + if (_mode isEqualTo "status" && !_hasStatus) exitWith { + _result set ["message", "Invalid group status."]; + _result + }; + + if (_mode isEqualTo "role" && !_hasRole) exitWith { + _result set ["message", "Invalid group role."]; + _result + }; + + if (_mode isEqualTo "profile" && !(_hasStatus || _hasRole)) exitWith { + _result set ["message", "No group changes were provided."]; + _result + }; + + if (_hasStatus && !(_finalStatus in (_self getOrDefault ["validStatuses", []]))) exitWith { + _result set ["message", "Invalid group status."]; + _result + }; + + if (_hasRole && !(_finalRole in (_self getOrDefault ["validRoles", []]))) exitWith { + _result set ["message", "Invalid group role."]; + _result + }; + + private _permissionService = _self getOrDefault ["permissionService", createHashMap]; + private _isAuthorized = (_self call ["isGroupLeader", [_requesterUid, _groupID]]) || { _permissionService call ["canDispatch", [_requesterUid]] }; + if !_isAuthorized exitWith { + _result set ["message", "You are not authorized to update that group."]; + _result + }; + + private _groupRegistry = _self call ["syncGroups", []]; + private _groupRecord = +(_groupRegistry getOrDefault [_groupID, createHashMap]); + if (_groupRecord isEqualTo createHashMap) exitWith { + _result set ["message", "Group could not be resolved."]; + _result + }; + + private _didChangeStatus = _hasStatus && { (_groupRecord getOrDefault ["status", ""]) isNotEqualTo _finalStatus }; + private _didChangeRole = _hasRole && { (_groupRecord getOrDefault ["role", ""]) isNotEqualTo _finalRole }; + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _updateContext = createHashMapFromArray [ + ["groupId", _groupID], + ["groupCallsign", _groupRecord getOrDefault ["callsign", _groupID]], + ["requesterUid", _requesterUid], + ["currentRole", _groupRecord getOrDefault ["role", "infantry"]], + ["currentStatus", _groupRecord getOrDefault ["status", "available"]], + ["role", [_finalRole, ""] select !_hasRole], + ["status", [_finalStatus, ""] select !_hasStatus], + ["mode", _mode] + ]; + + private _profileResult = _persistenceService call ["updateGroupProfileFromContext", [_updateContext]]; + if !(_profileResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the group profile update."]; + _result + }; + + private _profileData = +(_profileResult getOrDefault ["data", createHashMap]); + private _profile = +(_profileData getOrDefault ["profile", createHashMap]); + if (_profile isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension returned an invalid group profile."]; + _result + }; + + _groupRecord set ["role", _profile getOrDefault ["role", _groupRecord getOrDefault ["role", "infantry"]]]; + _groupRecord set ["status", _profile getOrDefault ["status", _groupRecord getOrDefault ["status", "available"]]]; + _groupRecord set ["lastUpdate", serverTime]; + + private _activityEntry = +(_profileData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", _profileData getOrDefault ["message", "Group profile updated."]]; + _result set ["changed", _profileData getOrDefault ["changed", (_didChangeStatus || _didChangeRole)]]; + _result set ["group", _groupRecord]; + _result + }], + ["updateGroupStatus", compileFinal { + _self call ["applyGroupProfileUpdate", [_this # 0, _this # 1, _this # 2, "", "status"]] + }], + ["updateGroupRole", compileFinal { + _self call ["applyGroupProfileUpdate", [_this # 0, _this # 1, "", _this # 2, "role"]] + }], + ["updateGroupProfile", compileFinal { + _self call ["applyGroupProfileUpdate", [_this # 0, _this # 1, _this # 2, _this # 3, "profile"]] + }] +]; + +createHashMapObject [GVAR(GroupRepositoryBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_initPermissionService.sqf b/arma/server/addons/cad/functions/fnc_initPermissionService.sqf new file mode 100644 index 0000000..f27f215 --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initPermissionService.sqf @@ -0,0 +1,45 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initPermissionService.sqf + * Author: IDSolutions + * Date: 2026-03-30 + * Public: No + * + * Description: + * Initializes the CAD permission service for dispatcher authorization checks. + * + * Arguments: + * None + * + * Return Value: + * CAD permission service object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initPermissionService + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(PermissionServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadPermissionServiceBaseClass"], + ["canDispatch", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { false }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) exitWith { false }; + + private _owner = _org getOrDefault ["owner", ""]; + if (_owner isEqualTo _uid) exitWith { true }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith { false }; + + private _playerVar = toLowerANSI (vehicleVarName _player); + (_orgID isEqualTo "default") && { _playerVar in ["ceo", "dispatch"] } + }] +]; + +createHashMapObject [GVAR(PermissionServiceBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_initPersistenceService.sqf b/arma/server/addons/cad/functions/fnc_initPersistenceService.sqf new file mode 100644 index 0000000..e1ad1e1 --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initPersistenceService.sqf @@ -0,0 +1,213 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initPersistenceService.sqf + * Author: IDSolutions + * Date: 2026-03-31 + * Public: No + * + * Description: + * Initializes the CAD extension-state service that bridges live SQF + * state to the Rust extension for hot CAD storage and recent history. + * + * This is a live operational cache, not a durable persistence layer. + * CAD extension state is expected to reset with the current server or + * mission lifecycle. + * + * Arguments: + * None + * + * Return Value: + * CAD persistence service object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initPersistenceService + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(PersistenceServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadPersistenceServiceBaseClass"], + ["makeResult", compileFinal { + params [ + ["_success", false, [false]], + ["_data", nil, [createHashMap, []]] + ]; + + createHashMapFromArray [ + ["success", _success], + ["data", _data] + ] + }], + ["loadObject", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + private _result = _self call ["makeResult", [false, createHashMap]]; + if (_function isEqualTo "") exitWith { _result }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_payload", "_isSuccess"]; + if (!_isSuccess || { !(_payload isEqualType "") } || { (_payload find "Error:") == 0 }) exitWith { + _result + }; + + private _data = fromJSON _payload; + if !(_data isEqualType createHashMap) exitWith { _result }; + + _result set ["success", true]; + _result set ["data", _data]; + _result + }], + ["loadCollection", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + private _result = _self call ["makeResult", [false, []]]; + if (_function isEqualTo "") exitWith { _result }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_payload", "_isSuccess"]; + if (!_isSuccess || { !(_payload isEqualType "") } || { (_payload find "Error:") == 0 }) exitWith { + _result + }; + + private _data = fromJSON _payload; + if !(_data isEqualType []) exitWith { _result }; + + _result set ["success", true]; + _result set ["data", _data]; + _result + }], + ["loadRegistry", compileFinal { + params [["_function", "", [""]], ["_idField", "", [""]]]; + + private _result = _self call ["makeResult", [false, createHashMap]]; + if (_function isEqualTo "" || { _idField isEqualTo "" }) exitWith { _result }; + + private _collectionResult = _self call ["loadCollection", [_function, []]]; + if !(_collectionResult getOrDefault ["success", false]) exitWith { _result }; + + private _registry = createHashMap; + { + if !(_x isEqualType createHashMap) then { continue; }; + private _entryId = _x getOrDefault [_idField, ""]; + if (_entryId isEqualTo "") then { continue; }; + _registry set [_entryId, +_x]; + } forEach (_collectionResult getOrDefault ["data", []]); + + _result set ["success", true]; + _result set ["data", _registry]; + _result + }], + ["saveEntry", compileFinal { + params [ + ["_function", "", [""]], + ["_entryID", "", [""]], + ["_entry", createHashMap, [createHashMap]] + ]; + + if (_function isEqualTo "" || { _entryID isEqualTo "" } || { _entry isEqualTo createHashMap }) exitWith { false }; + + [_function, [_entryID, toJSON _entry]] call EFUNC(extension,extCall) params ["_payload", "_isSuccess"]; + _isSuccess && { !(_payload isEqualType "") || { (_payload find "Error:") != 0 } } + }], + ["deleteEntry", compileFinal { + params [["_function", "", [""]], ["_entryID", "", [""]]]; + + if (_function isEqualTo "" || { _entryID isEqualTo "" }) exitWith { false }; + + [_function, [_entryID]] call EFUNC(extension,extCall) params ["_payload", "_isSuccess"]; + _isSuccess && { !(_payload isEqualType "") || { (_payload find "Error:") != 0 } } + }], + ["appendActivity", compileFinal { + params [["_entry", createHashMap, [createHashMap]]]; + + if (_entry isEqualTo createHashMap) exitWith { false }; + + ["cad:activity:append", [toJSON _entry]] call EFUNC(extension,extCall) params ["_payload", "_isSuccess"]; + _isSuccess && { !(_payload isEqualType "") || { (_payload find "Error:") != 0 } } + }], + ["loadActivity", compileFinal { + _self call ["loadCollection", ["cad:activity:recent", [str 50]]] + }], + ["buildHydratePayload", compileFinal { + _self call ["loadObject", ["cad:view:hydrate", [toJSON (_this # 0)]]] + }], + ["loadAssignments", compileFinal { + _self call ["loadRegistry", ["cad:assignments:list", "taskId"]] + }], + ["assignAssignment", compileFinal { + _self call ["loadObject", ["cad:assignments:assign", [_this # 0, toJSON (_this # 1)]]] + }], + ["acknowledgeAssignment", compileFinal { + _self call ["loadObject", ["cad:assignments:acknowledge", [_this # 0, toJSON (_this # 1)]]] + }], + ["declineAssignment", compileFinal { + _self call ["loadObject", ["cad:assignments:decline", [_this # 0, toJSON (_this # 1)]]] + }], + ["saveAssignment", compileFinal { + _self call ["saveEntry", ["cad:assignments:upsert", _this # 0, _this # 1]] + }], + ["deleteAssignment", compileFinal { + _self call ["deleteEntry", ["cad:assignments:delete", _this # 0]] + }], + ["loadDispatchOrders", compileFinal { + _self call ["loadRegistry", ["cad:orders:list", "taskID"]] + }], + ["createDispatchOrder", compileFinal { + params [ + ["_orderSeed", createHashMap, [createHashMap]], + ["_assignmentSeed", createHashMap, [createHashMap]] + ]; + + _self call ["loadObject", ["cad:orders:create", [toJSON (createHashMapFromArray [ + ["order", _orderSeed], + ["assignment", _assignmentSeed] + ])]]] + }], + ["createDispatchOrderFromContext", compileFinal { + _self call ["loadObject", ["cad:orders:create_from_context", [toJSON (_this # 0)]]] + }], + ["closeDispatchOrder", compileFinal { + _self call ["loadObject", ["cad:orders:close", [_this # 0]]] + }], + ["saveDispatchOrder", compileFinal { + _self call ["saveEntry", ["cad:orders:upsert", _this # 0, _this # 1]] + }], + ["deleteDispatchOrder", compileFinal { + _self call ["deleteEntry", ["cad:orders:delete", _this # 0]] + }], + ["loadRequests", compileFinal { + _self call ["loadRegistry", ["cad:requests:list", "requestId"]] + }], + ["submitSupportRequest", compileFinal { + _self call ["loadObject", ["cad:requests:submit", [toJSON (_this # 0)]]] + }], + ["submitSupportRequestFromContext", compileFinal { + _self call ["loadObject", ["cad:requests:submit_from_context", [toJSON (_this # 0)]]] + }], + ["closeSupportRequest", compileFinal { + _self call ["loadObject", ["cad:requests:close", [_this # 0]]] + }], + ["saveRequest", compileFinal { + _self call ["saveEntry", ["cad:requests:upsert", _this # 0, _this # 1]] + }], + ["deleteRequest", compileFinal { + _self call ["deleteEntry", ["cad:requests:delete", _this # 0]] + }], + ["loadGroupProfiles", compileFinal { + _self call ["loadRegistry", ["cad:profiles:list", "groupId"]] + }], + ["buildGroups", compileFinal { + _self call ["loadCollection", ["cad:groups:build", [toJSON (createHashMapFromArray [ + ["liveGroups", _this # 0] + ])]]] + }], + ["updateGroupProfileFromContext", compileFinal { + _self call ["loadObject", ["cad:profiles:update_from_context", [toJSON (_this # 0)]]] + }], + ["saveGroupProfile", compileFinal { + _self call ["saveEntry", ["cad:profiles:upsert", _this # 0, _this # 1]] + }], + ["deleteGroupProfile", compileFinal { + _self call ["deleteEntry", ["cad:profiles:delete", _this # 0]] + }] +]; + +createHashMapObject [GVAR(PersistenceServiceBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_initRequestRepository.sqf b/arma/server/addons/cad/functions/fnc_initRequestRepository.sqf new file mode 100644 index 0000000..eeedad4 --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_initRequestRepository.sqf @@ -0,0 +1,190 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initRequestRepository.sqf + * Author: IDSolutions + * Date: 2026-03-31 + * Public: No + * + * Description: + * Initializes the CAD request repository for structured support + * requests submitted by groups and triaged by dispatch. + * + * Arguments: + * None + * + * Return Value: + * CAD request repository object [HASHMAP OBJECT] + * + * Example: + * call forge_server_cad_fnc_initRequestRepository + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(RequestRepositoryBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "CadRequestRepositoryBaseClass"], + ["#create", compileFinal { + _self set ["validTypes", [ + "medevac_9line", + "ace_lace", + "fire_support", + "air_support", + "logreq" + ]]; + _self set ["validPriorities", [ + "routine", + "priority", + "emergency" + ]]; + }], + ["loadRequestRegistry", compileFinal { + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { createHashMap }; + + private _result = _persistenceService call ["loadRequests", []]; + if !(_result getOrDefault ["success", false]) exitWith { createHashMap }; + + +(_result getOrDefault ["data", createHashMap]) + }], + ["submitRequest", compileFinal { + params [ + ["_requesterUid", "", [""]], + ["_type", "", [""]], + ["_fields", createHashMap, [createHashMap]], + ["_priority", "priority", [""]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to submit support request."], + ["request", createHashMap] + ]; + + private _finalType = toLowerANSI _type; + if !(_finalType in (_self getOrDefault ["validTypes", []])) exitWith { + _result set ["message", "Invalid support request type."]; + _result + }; + + private _groupRepository = _self getOrDefault ["groupRepository", createHashMap]; + private _groupID = _groupRepository call ["getPlayerGroupId", [_requesterUid]]; + if (_groupID isEqualTo "") exitWith { + _result set ["message", "You are not currently assigned to a group."]; + _result + }; + + if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith { + _result set ["message", "Only the current group leader can submit support requests."]; + _result + }; + + private _groupRecord = _groupRepository call ["getGroupRecord", [_groupID]]; + if (_groupRecord isEqualTo createHashMap) exitWith { + _result set ["message", "Your group could not be resolved."]; + _result + }; + + private _validPriorities = _self getOrDefault ["validPriorities", []]; + private _finalPriority = toLowerANSI _priority; + if !(_finalPriority in _validPriorities) then { + _finalPriority = "priority"; + }; + + private _requestContext = createHashMapFromArray [ + ["type", _finalType], + ["fields", +_fields], + ["groupId", _groupID], + ["groupCallsign", _groupRecord getOrDefault ["callsign", _groupID]], + ["submittedByUid", _requesterUid], + ["submittedByName", _groupRecord getOrDefault ["leaderName", _requesterUid]], + ["priority", _finalPriority], + ["position", +(_groupRecord getOrDefault ["position", []])], + ["createdAt", serverTime] + ]; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _submitResult = _persistenceService call ["submitSupportRequestFromContext", [_requestContext]]; + if !(_submitResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the support request."]; + _result + }; + + private _submitData = +(_submitResult getOrDefault ["data", createHashMap]); + private _request = +(_submitData getOrDefault ["request", createHashMap]); + private _requestID = _request getOrDefault ["requestId", ""]; + if (_requestID isEqualTo "") exitWith { + _result set ["message", "CAD extension returned an invalid support request."]; + _result + }; + + private _activityEntry = +(_submitData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", _submitData getOrDefault ["message", "Support request submitted."]]; + _result set ["request", _request]; + _result + }], + ["closeRequest", compileFinal { + params [["_requesterUid", "", [""]], ["_requestID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to close support request."], + ["request", createHashMap] + ]; + + private _requestRegistry = _self call ["loadRequestRegistry", []]; + private _request = +(_requestRegistry getOrDefault [_requestID, createHashMap]); + if (_request isEqualTo createHashMap) exitWith { + _result set ["message", "Support request could not be resolved."]; + _result + }; + + private _permissionService = _self getOrDefault ["permissionService", createHashMap]; + private _groupRepository = _self getOrDefault ["groupRepository", createHashMap]; + private _groupID = _request getOrDefault ["groupId", ""]; + private _isAuthorized = (_permissionService call ["canDispatch", [_requesterUid]]) || { _groupRepository call ["isGroupLeader", [_requesterUid, _groupID]] }; + if !_isAuthorized exitWith { + _result set ["message", "You are not authorized to close that support request."]; + _result + }; + + private _persistenceService = _self getOrDefault ["persistenceService", createHashMap]; + if (_persistenceService isEqualTo createHashMap) exitWith { + _result set ["message", "CAD extension state is unavailable."]; + _result + }; + + private _closeResult = _persistenceService call ["closeSupportRequest", [_requestID]]; + if !(_closeResult getOrDefault ["success", false]) exitWith { + _result set ["message", "CAD extension rejected the support request close."]; + _result + }; + + private _closeData = +(_closeResult getOrDefault ["data", createHashMap]); + _request = +(_closeData getOrDefault ["request", _request]); + + private _activityEntry = +(_closeData getOrDefault ["activity", createHashMap]); + if (_activityEntry isNotEqualTo createHashMap) then { + _activityEntry set ["actorUid", _requesterUid]; + private _activityRepository = _self getOrDefault ["activityRepository", createHashMap]; + _activityRepository call ["appendEntry", [_activityEntry]]; + }; + + _result set ["success", true]; + _result set ["message", _closeData getOrDefault ["message", "Support request closed."]]; + _result set ["request", _request]; + _result + }] +]; + +createHashMapObject [GVAR(RequestRepositoryBaseClass)] diff --git a/arma/server/addons/cad/functions/fnc_registerEventListeners.sqf b/arma/server/addons/cad/functions/fnc_registerEventListeners.sqf new file mode 100644 index 0000000..6b1a500 --- /dev/null +++ b/arma/server/addons/cad/functions/fnc_registerEventListeners.sqf @@ -0,0 +1,98 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_registerEventListeners.sqf + * Author: IDSolutions + * Date: 2026-05-14 + * Public: No + * + * Description: + * Registers CAD listeners for framework events that should refresh CAD state. + * + * Arguments: + * None + * + * Return Value: + * Listener tokens [ARRAY] + * + * Example: + * call forge_server_cad_fnc_registerEventListeners + */ + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if !(isNil QGVAR(TaskEventListenerTokens)) exitWith { GVAR(TaskEventListenerTokens) }; + +private _invalidateCadState = { + params ["_event"]; + + ["INFO", format [ + "CAD task event received: %1 taskID=%2 taskType=%3 status=%4", + _event getOrDefault ["event", ""], + _event getOrDefault ["taskID", ""], + _event getOrDefault ["taskType", ""], + _event getOrDefault ["status", ""] + ]] call EFUNC(common,log); + + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); +}; + +private _invalidateCadAssignmentState = { + params ["_event"]; + + private _assignment = _event getOrDefault ["assignment", createHashMap]; + ["INFO", format [ + "CAD assignment event received: %1 taskID=%2 groupID=%3 state=%4", + _event getOrDefault ["event", ""], + _event getOrDefault ["taskID", ""], + _assignment getOrDefault ["groupId", ""], + _assignment getOrDefault ["state", ""] + ]] call EFUNC(common,log); + + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); +}; + +private _invalidateCadRequestState = { + params ["_event"]; + + ["INFO", format [ + "CAD request event received: %1 requestID=%2 groupID=%3", + _event getOrDefault ["event", ""], + _event getOrDefault ["requestID", ""], + _event getOrDefault ["groupID", ""] + ]] call EFUNC(common,log); + + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); +}; + +private _invalidateCadGroupState = { + params ["_event"]; + + private _group = _event getOrDefault ["group", createHashMap]; + ["INFO", format [ + "CAD group event received: %1 groupID=%2 status=%3 role=%4", + _event getOrDefault ["event", ""], + _event getOrDefault ["groupID", ""], + _group getOrDefault ["status", ""], + _group getOrDefault ["role", ""] + ]] call EFUNC(common,log); + + [CRPC(cad,invalidateCadState), []] call CFUNC(globalEvent); +}; + +GVAR(TaskEventListenerTokens) = [ + EGVAR(common,EventBus) call ["on", ["task.created", _invalidateCadState, "cad.task.invalidate"]], + EGVAR(common,EventBus) call ["on", ["task.started", _invalidateCadState, "cad.task.invalidate"]], + EGVAR(common,EventBus) call ["on", ["task.completed", _invalidateCadState, "cad.task.invalidate"]], + EGVAR(common,EventBus) call ["on", ["task.failed", _invalidateCadState, "cad.task.invalidate"]], + EGVAR(common,EventBus) call ["on", ["task.cleared", _invalidateCadState, "cad.task.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.assignment.assigned", _invalidateCadAssignmentState, "cad.assignment.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.assignment.created", _invalidateCadAssignmentState, "cad.assignment.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.assignment.acknowledged", _invalidateCadAssignmentState, "cad.assignment.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.assignment.declined", _invalidateCadAssignmentState, "cad.assignment.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.assignment.closed", _invalidateCadAssignmentState, "cad.assignment.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.request.submitted", _invalidateCadRequestState, "cad.request.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.request.closed", _invalidateCadRequestState, "cad.request.invalidate"]], + EGVAR(common,EventBus) call ["on", ["cad.group.updated", _invalidateCadGroupState, "cad.group.invalidate"]] +]; + +GVAR(TaskEventListenerTokens) diff --git a/arma/server/addons/cad/script_component.hpp b/arma/server/addons/cad/script_component.hpp new file mode 100644 index 0000000..e5f508d --- /dev/null +++ b/arma/server/addons/cad/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT cad +#define COMPONENT_BEAUTIFIED CAD +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/common/$PBOPREFIX$ b/arma/server/addons/common/$PBOPREFIX$ new file mode 100644 index 0000000..dd94028 --- /dev/null +++ b/arma/server/addons/common/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\common diff --git a/arma/server/addons/common/CfgEventHandlers.hpp b/arma/server/addons/common/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/server/addons/common/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/arma/server/addons/common/CfgSounds.hpp b/arma/server/addons/common/CfgSounds.hpp new file mode 100644 index 0000000..b3e080e --- /dev/null +++ b/arma/server/addons/common/CfgSounds.hpp @@ -0,0 +1,23 @@ +class CfgSounds { + sounds[] = {}; + class FORGE_timerBeep { + name = "FORGE_timerBeep"; + sound[] = {QUOTE(PATHTOF(sounds\timerClick.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_timerBeepShort { + name = "FORGE_timerBeepShort"; + sound[] = {QUOTE(PATHTOF(sounds\timerClickShort.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_timerEnd { + name = "FORGE_timerEnd"; + sound[] = {QUOTE(PATHTOF(sounds\timerEnd.wav)), 1, 3}; + titles[] = {}; + }; + class FORGE_defused { + name = "FORGE_defused"; + sound[] = {QUOTE(PATHTOF(sounds\defused.wav)), 1, 3}; + titles[] = {}; + }; +}; diff --git a/arma/server/addons/common/CfgVehicles.hpp b/arma/server/addons/common/CfgVehicles.hpp new file mode 100644 index 0000000..61587be --- /dev/null +++ b/arma/server/addons/common/CfgVehicles.hpp @@ -0,0 +1,12 @@ +class CfgVehicles { + class Land_Bodybag_01_black_F; + class forge_bodyBag: Land_Bodybag_01_black_F { + maximumLoad = 2000; + transportMaxWeapons = 500; + transportMaxMagazines = 2000; + transportMaxItems = 1000; + ace_dragging_canCarry = 1; + ace_dragging_carryPosition[] = {0, 0.5, 1.2}; + ace_dragging_carryDirection = 90; + }; +}; diff --git a/arma/server/addons/common/README.md b/arma/server/addons/common/README.md new file mode 100644 index 0000000..22f12d8 --- /dev/null +++ b/arma/server/addons/common/README.md @@ -0,0 +1,102 @@ +# Forge Server Common + +## Overview +The common addon provides shared SQF utilities used by server-side Forge +addons. It contains lightweight helpers only; gameplay domain state belongs in +the specific domain addons or the Rust extension. + +## Dependencies +- `forge_server_main` + +## Main Components +- `fnc_baseStore.sqf` provides shared hash-map object behavior such as JSON + conversion. +- `fnc_eventBus.sqf` provides a framework-wide in-process event bus for + cross-addon notifications. +- `fnc_log.sqf` standardizes server log messages. +- `fnc_getPlayer.sqf` resolves online players by UID. +- `fnc_formatNumber.sqf` formats numeric values for notifications and UI text. +- `fnc_generateHash.sqf` and `fnc_generateSecureData.sqf` provide hashing and + random data helpers. +- `fnc_timeToSeconds.sqf` converts time values into seconds. + +## Notes +Keep this addon free of domain-specific behavior. If a helper needs actor, +bank, org, task, store, or CAD state, it belongs in that addon instead. + +## Event Bus +The event bus is initialized as `forge_server_common_EventBus` during store +bootstrap. It is synchronous and in-process: listeners run immediately when an +event is emitted. + +### Event Naming +Use lower-case dot-separated names: + +- `..` for domain events, such as `cad.assignment.assigned` +- `.` for simple lifecycle events, such as `task.started` + +Prefer past-tense action names for events that report completed state changes: +`created`, `started`, `assigned`, `acknowledged`, `declined`, `completed`, +`failed`, `cleared`, `updated`, `closed`. + +Payloads should be hash maps and should include stable identifiers first: +`taskID`, `requestID`, `groupID`, `uid`, `orgID`, or `accountID` as appropriate. +The event bus adds `event`, `source`, and `timestamp` when the event is emitted. + +### Current Events +Task lifecycle: +- `task.created` +- `task.started` +- `task.completed` +- `task.failed` +- `task.cleared` + +Task rewards and notifications: +- `task.reward.requested` +- `task.reward.applied` +- `task.reward.failed` +- `task.rating.applied` +- `task.rating.failed` +- `task.notification.requested` +- `task.reward.notification.requested` + +CAD state: +- `cad.assignment.assigned` +- `cad.assignment.created` +- `cad.assignment.acknowledged` +- `cad.assignment.declined` +- `cad.assignment.closed` +- `cad.request.submitted` +- `cad.request.closed` +- `cad.group.updated` + +Client sync and notification requests: +- `notification.requested` +- `bank.account.sync.requested` +- `org.sync.requested` +- `locker.sync.requested` +- `locker.va.sync.requested` +- `garage.vgarage.sync.requested` + +### Example + +Register a listener, emit an event, then remove the listener when it is no longer needed: + +```sqf +private _token = EGVAR(common,EventBus) call ["on", [ + "task.completed", + { + params ["_event"]; + ["INFO", format ["Task completed: %1", _event getOrDefault ["taskID", ""]]] call EFUNC(common,log); + }, + "example" +]]; + +EGVAR(common,EventBus) call ["emit", [ + "task.completed", + createHashMapFromArray [["taskID", "task_001"]], + createHashMapFromArray [["source", "task"]] +]]; + +EGVAR(common,EventBus) call ["off", [_token]]; +``` diff --git a/arma/server/addons/common/XEH_PREP.hpp b/arma/server/addons/common/XEH_PREP.hpp new file mode 100644 index 0000000..4b810bc --- /dev/null +++ b/arma/server/addons/common/XEH_PREP.hpp @@ -0,0 +1,8 @@ +PREP(baseStore); +PREP(eventBus); +PREP(formatNumber); +PREP(getPlayer); +PREP(generateHash); +PREP(generateSecureData); +PREP(log); +PREP(timeToSeconds); diff --git a/arma/server/addons/common/XEH_preInit.sqf b/arma/server/addons/common/XEH_preInit.sqf new file mode 100644 index 0000000..52ef5b7 --- /dev/null +++ b/arma/server/addons/common/XEH_preInit.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(EventBus)) then { call FUNC(eventBus); }; +if (isNil QGVAR(NotificationEventTokens)) then { + private _sendNotification = { + params ["_event"]; + + private _uids = +(_event getOrDefault ["uids", []]); + private _type = _event getOrDefault ["notificationType", "info"]; + private _title = _event getOrDefault ["title", ""]; + private _message = _event getOrDefault ["message", ""]; + private _duration = _event getOrDefault ["duration", -1]; + + if (_message isEqualTo "" || { _uids isEqualTo [] }) exitWith {}; + + private _params = [_type, _title, _message]; + if (_duration >= 0) then { + _params pushBack _duration; + }; + + { + private _player = [_x] call FUNC(getPlayer); + if (isNull _player) then { continue; }; + [CRPC(notifications,recieveNotification), _params, _player] call CFUNC(targetEvent); + } forEach _uids; + }; + + GVAR(NotificationEventTokens) = [ + GVAR(EventBus) call ["on", ["notification.requested", _sendNotification, "common.notification.send"]] + ]; +}; diff --git a/arma/server/addons/common/XEH_preStart.sqf b/arma/server/addons/common/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/common/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/common/config.cpp b/arma/server/addons/common/config.cpp new file mode 100644 index 0000000..af40e08 --- /dev/null +++ b/arma/server/addons/common/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgSounds.hpp" +#include "CfgVehicles.hpp" diff --git a/arma/server/addons/common/functions/fnc_baseStore.sqf b/arma/server/addons/common/functions/fnc_baseStore.sqf new file mode 100644 index 0000000..585d3cc --- /dev/null +++ b/arma/server/addons/common/functions/fnc_baseStore.sqf @@ -0,0 +1,117 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_baseStore.sqf + * Author: IDSolutions + * Date: 2026-01-08 + * Last Update: 2026-02-13 + * Public: No + * + * Description: + * No description added yet. + * + * Arguments: + * None + * + * Return Value: + * Base store [HASHMAP] + * + * Example: + * call forge_x_component_fnc_myFunction + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BaseStore) = compileFinal createHashMapFromArray [ + ["#type", "IBaseStore"], + ["fetch", { + params [["_function", "", [""]], ["_key", "", [""]]]; + + private _data = createHashMap; + + [_function, [_key]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + ["INFO", format ["Data: %1", _result]] call EFUNC(common,log); + + if (_result isNotEqualTo []) then { _data = _self call ["toHashMap", [_result]] }; + + _data + }], + ["get", { + params [["_registry", createHashMap, [createHashMap]], ["_key", "", [""]], ["_field", "", [""]]]; + + private _existingData = _registry get _key; + private _finalData = createHashMap; + + if (_field isNotEqualTo "") then { + _finalData = _existingData get _field + } else { + _finalData = _existingData + }; + + _finalData + }], + ["set", { + params [["_registry", createHashMap, [createHashMap]], ["_function", "", [""]], ["_key", "", [""]], ["_field", "", [""]], ["_value", nil, [0, "", [], false, createHashMap, objNull, grpNull]], ["_sync", false, [false]]]; + + private _existingData = _registry get _key; + private _finalData = +_existingData; + private _hashMap = createHashMap; + + _finalData set [_field, _value]; + _hashMap set [_field, _value]; + _registry set [_key, _finalData]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + [_function, [_key, _json]] call EFUNC(extension,extCall); + }; + + _hashMap + }], + ["mset", { + params [["_registry", createHashMap, [createHashMap]], ["_function", "", [""]], ["_key", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + private _existingData = _registry get _key; + private _finalData = +_existingData; + private _hashMap = createHashMap; + + { _finalData set [_x, _y]; } forEach _fieldValuePairs; + { _hashMap set [_x, _y]; } forEach _fieldValuePairs; + + _registry set [_key, _finalData]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + [_function, [_key, _json]] call EFUNC(extension,extCall); + }; + + _hashMap + }], + ["save", { + params [["_registry", createHashMap, [createHashMap]], ["_function", "", [""]], ["_key", "", [""]]]; + + private _existingData = _registry get _key; + private _finalData = +_existingData; + private _json = _self call ["toJSON", [_finalData]]; + + [_function, [_key, _json]] call EFUNC(extension,extCall); + + _finalData + }], + ["remove", { + params [["_registry", createHashMap, [createHashMap]], ["_key", "", [""]]]; + + _registry deleteAt _key; + }], + ["toHashMap", { + params [["_data", "", [""]]]; + + fromJSON _data + }], + ["toJSON", { + params [["_data", createHashMap, [createHashMap]]]; + + toJSON _data + }] +]; + +GVAR(BaseStore) diff --git a/arma/server/addons/common/functions/fnc_eventBus.sqf b/arma/server/addons/common/functions/fnc_eventBus.sqf new file mode 100644 index 0000000..e66fbcb --- /dev/null +++ b/arma/server/addons/common/functions/fnc_eventBus.sqf @@ -0,0 +1,167 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_eventBus.sqf + * Author: IDSolutions + * Date: 2026-05-14 + * Public: No + * + * Description: + * Initializes the framework-wide in-process event bus. + * + * Arguments: + * None + * + * Return Value: + * Event bus object [HASHMAP OBJECT] + * + * Example: + * call forge_server_common_fnc_eventBus + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(EventBusBase) = compileFinal createHashMapFromArray [ + ["#type", "EventBus"], + ["#create", compileFinal { + _self set ["handlers", createHashMap]; + _self set ["nextToken", 0]; + + ["INFO", "Common EventBus Initialized!"] call EFUNC(common,log); + }], + ["on", compileFinal { + params [["_eventName", "", [""]], ["_handler", {}, [{}]], ["_owner", "", [""]]]; + + if (_eventName isEqualTo "") exitWith { "" }; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + private _eventHandlers = +(_handlers getOrDefault [_eventName, []]); + private _nextToken = (_self getOrDefault ["nextToken", 0]) + 1; + private _token = format ["%1:%2", _eventName, _nextToken]; + + _eventHandlers pushBack createHashMapFromArray [ + ["token", _token], + ["owner", _owner], + ["handler", _handler] + ]; + + _handlers set [_eventName, _eventHandlers]; + _self set ["handlers", _handlers]; + _self set ["nextToken", _nextToken]; + + _token + }], + ["off", compileFinal { + params [["_token", "", [""]]]; + + if (_token isEqualTo "") exitWith { false }; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + private _removed = false; + + { + private _eventHandlers = +(_handlers getOrDefault [_x, []]); + private _remainingHandlers = _eventHandlers select { + (_x getOrDefault ["token", ""]) isNotEqualTo _token + }; + + if ((count _remainingHandlers) isNotEqualTo (count _eventHandlers)) then { + _removed = true; + if (_remainingHandlers isEqualTo []) then { + _handlers deleteAt _x; + } else { + _handlers set [_x, _remainingHandlers]; + }; + }; + } forEach (keys _handlers); + + _self set ["handlers", _handlers]; + _removed + }], + ["emit", compileFinal { + params [["_eventName", "", [""]], ["_payload", createHashMap], ["_options", createHashMap]]; + + private _result = createHashMapFromArray [ + ["event", _eventName], + ["listenerCount", 0], + ["invoked", 0], + ["failed", 0] + ]; + + if (_eventName isEqualTo "") exitWith { _result }; + + if !(_payload isEqualType createHashMap) then { + _payload = createHashMapFromArray [["value", _payload]]; + }; + if !(_options isEqualType createHashMap) then { + _options = createHashMap; + }; + + private _eventPayload = +_payload; + _eventPayload set ["event", _eventName]; + _eventPayload set ["source", _eventPayload getOrDefault ["source", _options getOrDefault ["source", "unknown"]]]; + _eventPayload set ["timestamp", _eventPayload getOrDefault ["timestamp", serverTime]]; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + private _eventHandlers = +(_handlers getOrDefault [_eventName, []]); + _result set ["listenerCount", count _eventHandlers]; + + { + private _handler = _x getOrDefault ["handler", {}]; + private _token = _x getOrDefault ["token", ""]; + private _owner = _x getOrDefault ["owner", ""]; + + try { + [_eventPayload] call _handler; + _result set ["invoked", (_result getOrDefault ["invoked", 0]) + 1]; + } catch { + _result set ["failed", (_result getOrDefault ["failed", 0]) + 1]; + ["ERROR", format ["EventBus handler failed. Event=%1 Token=%2 Owner=%3 Error=%4", _eventName, _token, _owner, _exception]] call EFUNC(common,log); + }; + } forEach _eventHandlers; + + _result + }], + ["clear", compileFinal { + params [["_eventName", "", [""]]]; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + + if (_eventName isEqualTo "") then { + _self set ["handlers", createHashMap]; + } else { + _handlers deleteAt _eventName; + _self set ["handlers", _handlers]; + }; + + true + }], + ["listenerCount", compileFinal { + params [["_eventName", "", [""]]]; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + + if (_eventName isEqualTo "") exitWith { + private _total = 0; + { _total = _total + (count _y); } forEach _handlers; + _total + }; + + count (_handlers getOrDefault [_eventName, []]) + }], + ["listeners", compileFinal { + params [["_eventName", "", [""]]]; + + private _handlers = _self getOrDefault ["handlers", createHashMap]; + + if (_eventName isNotEqualTo "") exitWith { +(_handlers getOrDefault [_eventName, []]) }; + + private _counts = createHashMap; + { _counts set [_x, count _y]; } forEach _handlers; + + _counts + }] +]; + +GVAR(EventBus) = createHashMapObject [GVAR(EventBusBase)]; + +GVAR(EventBus) diff --git a/arma/server/addons/common/functions/fnc_formatNumber.sqf b/arma/server/addons/common/functions/fnc_formatNumber.sqf new file mode 100644 index 0000000..b0e3132 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_formatNumber.sqf @@ -0,0 +1,47 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Formats a number with thousands separators and decimal places + * + * Arguments: + * 0: Number + * + * Return Value: + * Formatted Number + * + * Examples: + * [1234567.89] call forge_server_common_fnc_formatNumber + * + * Public: Yes + */ + +#define PX_DC_SEP "." +#define PX_TH_SEP "," +#define PX_DC_PL 2 + +private _value = _this; +if (_value isEqualType []) then { + _value = _value param [0, 0, [0]]; +}; + +private _count = 0; +private _arr = (_value toFixed PX_DC_PL) splitString "."; +private _str = PX_DC_SEP+(_arr select 1); + +_arr = toArray(_arr select 0); +reverse _arr; + +{ + if (_count == 3) then { + _count = 0; + _str = PX_TH_SEP + _str; + }; + + _str = toString[_x] + _str; + _count = _count + 1; + + true +} count (_arr); + +_str diff --git a/arma/server/addons/common/functions/fnc_generateHash.sqf b/arma/server/addons/common/functions/fnc_generateHash.sqf new file mode 100644 index 0000000..9dcdb99 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_generateHash.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Generates a 6-digit hash from input string using DJB2 algorithm. + * + * Arguments: + * 0: Input string to hash + * + * Return Value: + * 6-digit hash string + * + * Example: + * ["test_input"] call forge_server_common_fnc_generateHash + * // Returns: "461324" + * + * Public: Yes + */ + +params [["_input", "", [""]]]; + +private _hash = 5381; +private _chars = toArray _input; + +{ + _hash = ((_hash * 33) + _x) mod 999999; +} forEach _chars; + +private _result = str _hash; + +while { count _result < 6 } do { _result = "0" + _result; }; + +_result diff --git a/arma/server/addons/common/functions/fnc_generateSecureData.sqf b/arma/server/addons/common/functions/fnc_generateSecureData.sqf new file mode 100644 index 0000000..acd981a --- /dev/null +++ b/arma/server/addons/common/functions/fnc_generateSecureData.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Generates a secure data object with timestamp, signature, and token. + * + * Arguments: + * 0: Player UID + * 1: Data to secure + * + * Return Value: + * Secure data object + * + * Example: + * ["test_uid", createHashMap] call forge_server_common_fnc_generateSecureData + * // Returns: ["data", createHashMap], ["timestamp", ], ["signature", ], ["token", ] + * + * Public: Yes + */ + +params [["_uid", "", [""]], ["_data", createHashMap, [createHashMap]]]; + +private _timestamp = systemTime; +private _sessionToken = EGVAR(actor,PlayerSessions) getOrDefault [_uid, ""]; +private _sigInput = format ["%1|%2|%3|%4", _uid, str _data, _timestamp, _sessionToken]; +private _signature = _sigInput call EFUNC(common,generateHash); + +private _secureData = createHashMap; +_secureData set ["data", _data]; +_secureData set ["timestamp", _timestamp]; +_secureData set ["signature", _signature]; +_secureData set ["token", _sessionToken]; + +["INFO", format ["Generated secure data for %1: sig=%2", _uid, _signature], nil, nil] call EFUNC(common,log); + +_secureData diff --git a/arma/server/addons/common/functions/fnc_getPlayer.sqf b/arma/server/addons/common/functions/fnc_getPlayer.sqf new file mode 100644 index 0000000..d86f7f6 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_getPlayer.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Gets a player object by UID. + * + * Arguments: + * 0: Player UID + * + * Return Value: + * Player object or objNull if not found + * + * Example: + * ["0123456789"] call forge_server_common_fnc_getPlayer + * + * Public: Yes + */ + +params ["_uid"]; + +private _player = objNull; + +{ + if ((getPlayerUID _x) isEqualTo _uid) exitWith { _player = _x; }; +} forEach allPlayers; + +_player diff --git a/arma/server/addons/common/functions/fnc_log.sqf b/arma/server/addons/common/functions/fnc_log.sqf new file mode 100644 index 0000000..3ec4d09 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_log.sqf @@ -0,0 +1,55 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_log.sqf + * Author: IDSolutions + * Date: 2026-01-03 + * Last Update: 2026-01-18 + * Public: No + * + * Description: + * Writes a log entry. + * + * Parameter(s): + * 0: Log level (DEBUG, INFO, ERROR, WARNING, VERBOSE) + * 1: Message to log + * 2: File that's being logged + * 3: File that called the file being logged (Optional) + * 4: Stack trace (Default: false) + * 5: Identifier (Default: "FORGE") + * + * Returns: + * N/A + * + * Example(s): + * ["ERROR", "Ooh, something went wrong"] call para_g_fnc_log; + */ + +params ["_logLevel", "_message", "_file", "_callingFile", ["_stackTrace", false, [false]], ["_identifier", "FORGE", [""]]]; + +if (is3DENPreview) exitWith { diag_log text format ["[%1] %2: %3", _identifier, _logLevel, _message]; }; +if !(_logLevel in ["DEBUG", "INFO", "ERROR", "WARNING", "VERBOSE"]) exitWith { diag_log text format ["[%1] ERROR: Invalid log level '%2'", _identifier, _logLevel]; }; +if (_stackTrace) then { + private _trace = diag_stacktrace; + private _traceText = _trace apply { format ["%1 (Line %2)", _x # 0, _x # 1] } joinString endl; + _message = _traceText; +}; + +// private _timestamp = format (["%1-%2-%3 %4:%5:%6:%7"] + systemTimeUTC); + +if (isNil "_file") then { _file = ["", _fnc_scriptName] select (!isNil "_fnc_scriptName"); }; +if (isNil "_callingFile" && !isNil "_fnc_scriptNameParent") then { _callingFile = _fnc_scriptNameParent; }; + +// private _callingFileText = if !(isNil "_callingFile") then { format ["Called By: %1", _callingFile] } else { "" }; + +// diag_log text format [ +// "%1 | %2 | %3 | File: %4 | %5 | %6", +// _timestamp, +// _identifier, +// _logLevel, +// _file, +// _callingFileText, +// _message +// ]; + +diag_log text format ["[%1] %2: %3", _identifier, _logLevel, _message]; diff --git a/arma/server/addons/common/functions/fnc_timeToSeconds.sqf b/arma/server/addons/common/functions/fnc_timeToSeconds.sqf new file mode 100644 index 0000000..fe85258 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_timeToSeconds.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Converts systemTime array to total seconds since midnight. + * + * Arguments: + * 0: System time array from systemTime command + * + * Return Value: + * Total seconds since midnight + * + * Example: + * [systemTime] call forge_server_common_fnc_timeToSeconds + * // Returns: 43200 (for 12:00:00) + * + * Public: Yes + */ + +params [["_systemTime", [], [[]]]]; + +if (typeName _systemTime != "ARRAY") exitWith { + ["WARNING", format ["timeToSeconds received %1 instead of ARRAY: %2", typeName _systemTime, _systemTime], nil, nil] call EFUNC(common,log); + 0 +}; + +if (count _systemTime < 6) exitWith { + ["WARNING", format ["timeToSeconds received array with %1 elements, need at least 6: %2", count _systemTime, _systemTime], nil, nil] call EFUNC(common,log); + 0 +}; + +private _hours = _systemTime select 3; +private _minutes = _systemTime select 4; +private _seconds = _systemTime select 5; + +(_hours * 3600) + (_minutes * 60) + _seconds diff --git a/arma/server/addons/common/script_component.hpp b/arma/server/addons/common/script_component.hpp new file mode 100644 index 0000000..26eec82 --- /dev/null +++ b/arma/server/addons/common/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT common +#define COMPONENT_BEAUTIFIED Common +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/common/sounds/defused.wav b/arma/server/addons/common/sounds/defused.wav new file mode 100644 index 0000000..a3d067f Binary files /dev/null and b/arma/server/addons/common/sounds/defused.wav differ diff --git a/arma/server/addons/common/sounds/timerClick.wav b/arma/server/addons/common/sounds/timerClick.wav new file mode 100644 index 0000000..4dcbbeb Binary files /dev/null and b/arma/server/addons/common/sounds/timerClick.wav differ diff --git a/arma/server/addons/common/sounds/timerClickShort.wav b/arma/server/addons/common/sounds/timerClickShort.wav new file mode 100644 index 0000000..8216e58 Binary files /dev/null and b/arma/server/addons/common/sounds/timerClickShort.wav differ diff --git a/arma/server/addons/common/sounds/timerEnd.wav b/arma/server/addons/common/sounds/timerEnd.wav new file mode 100644 index 0000000..1297da8 Binary files /dev/null and b/arma/server/addons/common/sounds/timerEnd.wav differ diff --git a/arma/server/addons/common/stringtable.xml b/arma/server/addons/common/stringtable.xml new file mode 100644 index 0000000..936e702 --- /dev/null +++ b/arma/server/addons/common/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Common + + + diff --git a/arma/server/addons/economy/$PBOPREFIX$ b/arma/server/addons/economy/$PBOPREFIX$ new file mode 100644 index 0000000..448e3b0 --- /dev/null +++ b/arma/server/addons/economy/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\economy diff --git a/arma/server/addons/economy/CfgEventHandlers.hpp b/arma/server/addons/economy/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/economy/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/economy/README.md b/arma/server/addons/economy/README.md new file mode 100644 index 0000000..14f7331 --- /dev/null +++ b/arma/server/addons/economy/README.md @@ -0,0 +1,112 @@ +# Forge Server Economy + +## Overview +The economy addon contains server-side systems for world economic interactions +that are still implemented in SQF. It owns Arma-world behavior such as active +refueling sessions, medical spawn occupancy, respawn placement, and death +inventory handling. + +Current stores cover fuel tracking, medical service behavior, and service +charges such as repairs and rearming. + +## Dependencies +- `forge_server_main` +- `forge_server_common` for logging, formatting, and player lookup +- `forge_server_bank` (runtime) for player-funded medical billing +- `forge_server_org` (runtime) for extension-backed organization hot-cache charges +- `forge_client_actor` and `forge_client_notifications` for response RPCs + +Note: Bank and Org are runtime-only dependencies (not compile-time requiredAddons). They must be loaded before economy stores initialize. + +## Main Components +- `fnc_initFEconomyStore.sqf` tracks active refueling sessions, calculates fuel + totals, charges the player's organization through `OrgStore`, syncs the org + patch, and rolls fuel back to the starting level when organization funds + cannot cover the refuel. +- `fnc_initMEconomyStore.sqf` manages medical spawn occupancy, healing charges, + respawn placement, death inventory handling, and body-bag transfer. Medical + charges use player bank/cash first, then organization funds with repayable + member debt only when the player cannot cover the service. +- `fnc_initSEconomyStore.sqf` handles organization-funded service charges, + repairs, and rearming. Vehicle services only apply after the organization + charge succeeds. The + shared org-charge helper can also record member debt for medical fallback. + +## Event Surface +The addon registers CBA server events for fuel start/tick/stop, direct refuel +service, repair service, player killed, player respawn, and healing. Medical +store initialization runs after post-init to discover configured medical spawn +objects. + +Service results emit notifications and syncs through the event bus: +- `notification.requested` - service receipts and failure alerts +- `org.sync.requested` - organization balance updates after service charges +- `bank.account.sync.requested` - player bank/cash balance updates from medical billing + +Repair service requests use: + +```sqf +[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service repair cost. + +Rearm service requests use: + +```sqf +[QEGVAR(economy,RearmService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service rearm cost. +`setVehicleAmmo` has global effects, but only adds ammo to local turrets, so +the ammo reset is broadcast after billing succeeds. + +Garage refuel service requests use: + +```sqf +[QEGVAR(economy,RefuelService), [_target, _unit]] call CBA_fnc_serverEvent; +``` + +This fills the selected live vehicle after organization billing succeeds. + +## Billing Rules +Economy does not own durable money state. It coordinates Arma-world effects +after the relevant hot-cache charge succeeds. + +Fuel and repair services are organization-funded: + +1. Resolve the player's organization from actor state. +2. Ensure the player is a member of that organization hot record. +3. Call `OrgStore chargeCheckout` with `source = "org_funds"`, + `commit = true`, and member service charging enabled. +4. Send the returned organization patch to online members. +5. If the charge fails, do not complete the service. Refueling rolls the target + back to its starting fuel level; repairs and rearming are not applied. + +Direct refuel service requests, such as those from the garage UI, calculate +the missing fuel from `fuelCapacity`, charge the organization, and fill the +vehicle only after the charge succeeds. + +Medical services are player-funded first: + +1. Load the player's bank hot state. +2. Charge the player's bank balance when it can cover the medical bill. +3. Otherwise charge the player's cash when it can cover the bill. +4. If neither personal balance can cover the bill, charge organization funds + and record the same amount as a debt on the player's organization credit + line. +5. If personal billing is unavailable, or both personal and organization funds + fail, do not complete the heal. + +The organization fallback reduces org funds immediately and adds the medical +cost to the player's credit-line balance due. Repayment uses the normal bank +credit-line repayment flow, which moves player bank funds back into the +organization treasury. + +This keeps money mutation rules in the extension-backed organization service +and bank service while leaving world interactions in SQF. + +## Notes +Fuel, medical, and service world behavior should stay server-authoritative +because it mutates inventory, vehicles, and respawn state. Money mutations +should continue to use extension-backed bank and organization hot state. diff --git a/arma/server/addons/economy/XEH_PREP.hpp b/arma/server/addons/economy/XEH_PREP.hpp new file mode 100644 index 0000000..a377c3a --- /dev/null +++ b/arma/server/addons/economy/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(initFEconomyStore); +PREP(initMEconomyStore); +PREP(initSEconomyStore); diff --git a/arma/server/addons/economy/XEH_postInit.sqf b/arma/server/addons/economy/XEH_postInit.sqf new file mode 100644 index 0000000..96be61d --- /dev/null +++ b/arma/server/addons/economy/XEH_postInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +if !(isNil QGVAR(MEconomyStore)) then { + GVAR(MEconomyStore) call ["init", []]; +}; diff --git a/arma/server/addons/economy/XEH_preInit.sqf b/arma/server/addons/economy/XEH_preInit.sqf new file mode 100644 index 0000000..f941726 --- /dev/null +++ b/arma/server/addons/economy/XEH_preInit.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(MEconomyStore)) then { call FUNC(initMEconomyStore); }; +if (isNil QGVAR(FEconomyStore)) then { call FUNC(initFEconomyStore); }; +if (isNil QGVAR(SEconomyStore)) then { call FUNC(initSEconomyStore); }; + +[QGVAR(FuelStart), { + params ["_source", "_target", "_unit"]; + GVAR(FEconomyStore) call ["start", [_source, _target, _unit]]; +}] call CFUNC(addEventHandler); + +[QGVAR(FuelTick), { + params ["_source", "_target", "_amount"]; + + private _liters = GETVAR(_target,liters,0); + private _newLiters = _liters + _amount; + SETVAR(_target,liters,_newLiters); +}] call CFUNC(addEventHandler); + +[QGVAR(FuelStop), { + params ["_source", "_target"]; + GVAR(FEconomyStore) call ["stop", [_source, _target]]; +}] call CFUNC(addEventHandler); + +[QGVAR(RepairService), { + params ["_target", "_unit", ["_cost", -1, [0]]]; + GVAR(SEconomyStore) call ["repair", [_target, _unit, _cost]]; +}] call CFUNC(addEventHandler); + +[QGVAR(RearmService), { + params ["_target", "_unit", ["_cost", -1, [0]]]; + GVAR(SEconomyStore) call ["rearm", [_target, _unit, _cost]]; +}] call CFUNC(addEventHandler); + +[QGVAR(RefuelService), { + params ["_target", "_unit"]; + GVAR(FEconomyStore) call ["refuel", [_target, _unit]]; +}] call CFUNC(addEventHandler); + +[QGVAR(onKilled), { + params ["_unit"]; + GVAR(MEconomyStore) call ["onKilled", [_unit]]; +}] call CFUNC(addEventHandler); + +[QGVAR(onRespawn), { + params ["_unit", "_corpse", "_uid"]; + GVAR(MEconomyStore) call ["onRespawn", [_unit, _corpse, _uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(onHealed), { + params ["_unit"]; + GVAR(MEconomyStore) call ["onHealed", [_unit]]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/economy/XEH_preStart.sqf b/arma/server/addons/economy/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/economy/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/economy/config.cpp b/arma/server/addons/economy/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/economy/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf new file mode 100644 index 0000000..2e6824d --- /dev/null +++ b/arma/server/addons/economy/functions/fnc_initFEconomyStore.sqf @@ -0,0 +1,168 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initFEconomyStore.sqf + * Author: IDSolutions + * Date: 2025-12-20 + * Last Update: 2026-05-15 + * Public: No + * + * Description: + * Initializes the fuel economy store. Active refueling sessions remain + * server-local; payment is routed through the organization extension hot + * cache. Garage service refuels use the same organization billing path + * and only fill the vehicle after the charge succeeds. + * + * Parameter(s): + * N/A + * + * Returns: + * Fuel economy store object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_economy_fnc_initFEconomyStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(FEconomyStore) = createHashMapObject [[ + ["#type", "IFuelEconomy"], + ["#create", { + GVAR(FuelCost) = 5; + _self set ["fuelRegistry", createHashMap]; + + ["INFO", "Fuel Store Initialized!", nil, nil] call EFUNC(common,log); + }], + ["start", { + params ["_source", "_target", "_unit"]; + + private _index = netId _target; + private _uid = getPlayerUID _unit; + private _fuelRegistry = _self getOrDefault ["fuelRegistry", createHashMap]; + + _fuelRegistry set [_index, createHashMapFromArray [ + ["uid", _uid], + ["initialFuel", fuel _target] + ]]; + SETVAR(_target,liters,0); + }], + ["rollbackFuel", { + params [["_target", objNull, [objNull]], ["_initialFuel", 0, [0]]]; + + if (isNull _target) exitWith { false }; + + _target setFuel (_initialFuel max 0 min 1); + SETVAR(_target,liters,0); + true + }], + ["notify", { + params [["_unit", objNull, [objNull]], ["_type", "info", [""]], ["_title", "Refueling", [""]], ["_message", "", [""]]]; + + if (isNull _unit || { _message isEqualTo "" }) exitWith { false }; + + private _uid = getPlayerUID _unit; + if (_uid isEqualTo "") exitWith { false }; + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(notifications,recieveNotification), [_type, _title, _message], _unit] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + createHashMapFromArray [ + ["uids", [_uid]], + ["notificationType", _type], + ["title", _title], + ["message", _message] + ], + createHashMapFromArray [["source", "economy"]] + ]]; + }; + + true + }], + ["refuel", { + params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; + + if (isNull _target || { isNull _unit }) exitWith { false }; + + private _currentFuel = fuel _target; + private _missingFuel = (1 - _currentFuel) max 0 min 1; + if (_missingFuel <= 0.001) exitWith { + _self call ["notify", [_unit, "info", "Refueling", "Vehicle fuel tank is already full."]]; + false + }; + + if (isNil QGVAR(SEconomyStore)) exitWith { + ["ERROR", "Service economy store unavailable for garage refueling charge.", nil, nil] call EFUNC(common,log); + _self call ["notify", [_unit, "danger", "Refueling", "Organization billing is unavailable. Refueling was not completed."]]; + false + }; + + private _fuelCapacity = getNumber (configOf _target >> "fuelCapacity"); + if (_fuelCapacity <= 0) then { _fuelCapacity = 100; }; + + private _totalLiters = _missingFuel * _fuelCapacity; + private _totalCost = _totalLiters * GVAR(FuelCost); + private _chargeResult = GVAR(SEconomyStore) call ["chargeOrg", [_unit, _totalCost, "Refueling"]]; + if !(_chargeResult getOrDefault ["success", false]) exitWith { + _self call ["notify", [_unit, "danger", "Refueling", _chargeResult getOrDefault ["message", "Organization funds cannot cover this refuel. Refueling was not completed."]]]; + false + }; + + _target setFuel 1; + SETVAR(_target,liters,0); + + private _formattedTotalCost = [_totalCost] call EFUNC(common,formatNumber); + private _formattedTotalLiters = _totalLiters toFixed 2; + _self call ["notify", [_unit, "info", "Refueling", format ["Refueling complete: %1L
Organization charged $%2.", _formattedTotalLiters, _formattedTotalCost]]]; + true + }], + ["stop", { + params ["_source", "_target"]; + + private _index = netId _target; + private _fuelRegistry = _self getOrDefault ["fuelRegistry", createHashMap]; + private _session = _fuelRegistry getOrDefault [_index, createHashMap]; + if (_session isEqualType "") then { + _session = createHashMapFromArray [["uid", _session], ["initialFuel", fuel _target]]; + }; + + private _uid = _session getOrDefault ["uid", ""]; + private _initialFuel = _session getOrDefault ["initialFuel", fuel _target]; + private _player = [_uid] call EFUNC(common,getPlayer); + + private _totalLiters = GETVAR(_target,liters,0); + private _totalCost = _totalLiters * GVAR(FuelCost); + private _formattedTotalCost = [_totalCost] call EFUNC(common,formatNumber); + private _formattedTotalLiters = _totalLiters toFixed 2; + + if (isNull _player || { _uid isEqualTo "" }) exitWith { + ["WARNING", format ["Unable to resolve refueling player for vehicle %1.", _index], nil, nil] call EFUNC(common,log); + _self call ["rollbackFuel", [_target, _initialFuel]]; + _fuelRegistry deleteAt _index; + }; + + if (_totalCost <= 0) exitWith { + _self call ["notify", [_player, "info", "Refueling", format ["Refueling complete: %1L", _formattedTotalLiters]]]; + _fuelRegistry deleteAt _index; + }; + + if (isNil QGVAR(SEconomyStore)) exitWith { + ["ERROR", "Service economy store unavailable for refueling charge.", nil, nil] call EFUNC(common,log); + _self call ["notify", [_player, "danger", "Refueling", "Organization billing is unavailable. Refueling was not completed."]]; + _self call ["rollbackFuel", [_target, _initialFuel]]; + _fuelRegistry deleteAt _index; + }; + + private _chargeResult = GVAR(SEconomyStore) call ["chargeOrg", [_player, _totalCost, "Refueling"]]; + if !(_chargeResult getOrDefault ["success", false]) exitWith { + _self call ["notify", [_player, "danger", "Refueling", _chargeResult getOrDefault ["message", "Organization funds cannot cover this refuel. Refueling was not completed."]]]; + _self call ["rollbackFuel", [_target, _initialFuel]]; + _fuelRegistry deleteAt _index; + }; + + _self call ["notify", [_player, "info", "Refueling", format ["Refueling complete: %1L
Organization charged $%2.", _formattedTotalLiters, _formattedTotalCost]]]; + _fuelRegistry deleteAt _index; + }] +]]; + +SETMVAR(FORGE_FEconomyStore,GVAR(FEconomyStore)); +GVAR(FEconomyStore) diff --git a/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf new file mode 100644 index 0000000..9024a48 --- /dev/null +++ b/arma/server/addons/economy/functions/fnc_initMEconomyStore.sqf @@ -0,0 +1,306 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initMEconomyStore.sqf + * Author: IDSolutions + * Date: 2025-12-20 + * Last Update: 2026-05-15 + * Public: No + * + * Description: + * Initializes the medical economy store. Respawn, body-bag, and spawn + * occupancy behavior remains server-local, while money mutations are + * routed through player bank hot state first, then organization hot state + * with a repayable member debt when personal funds cannot cover the bill. + * + * Parameter(s): + * N/A + * + * Returns: + * Medical economy store object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_economy_fnc_initMEconomyStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(MEconomyStore) = createHashMapObject [[ + ["#type", "IMedEconomy"], + ["#create", { + _self set ["mSpawns", createHashMap]; + + GVAR(occupancyTriggers) = []; + ["INFO", "Medical Store Initialized!", nil, nil] call EFUNC(common,log); + }], + ["init", { + private _mSpawns = (_self get "mSpawns"); + private _prefix = "med_spawn"; + + for "_i" from 0 to 10 do { + private _var = if (_i == 0) then { _prefix } else { format ["%1_%2", _prefix, _i] }; + private _obj = missionNamespace getVariable [_var, objNull]; + + if (!isNull _obj) then { + _mSpawns set [_var, [_obj, (getPos _obj)]]; + }; + }; + + if (_mSpawns isEqualTo createHashMap) then { + ["WARNING", "No medical spawns found in the world.", nil, nil] call EFUNC(common,log); + } else { + { + _y params ["_obj", "_pos"]; + private _trigger = createTrigger ["EmptyDetector", _pos]; + + _trigger setVariable ["isOccupied", false, true]; + _trigger setVariable ["linkedObject", _obj, true]; + _trigger setTriggerArea [5, 5, 0, true, 5]; + _trigger setTriggerActivation ["ANYPLAYER", "PRESENT", true]; + _trigger setTriggerStatements [ + "{ (_x isKindOf 'CAManBase') && _x distance thisTrigger < 0.5 } count thisList > 0", + "thisTrigger setVariable ['isOccupied', true, true];", + "thisTrigger setVariable ['isOccupied', false, true];" + ]; + + GVAR(occupancyTriggers) pushBack _trigger; + } forEach _mSpawns; + }; + }], + ["notify", { + params [["_unit", objNull, [objNull]], ["_type", "info", [""]], ["_title", "Medical Billing", [""]], ["_message", "", [""]]]; + + if (isNull _unit || { _message isEqualTo "" }) exitWith { false }; + + private _uid = getPlayerUID _unit; + if (_uid isEqualTo "") exitWith { false }; + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(notifications,recieveNotification), [_type, _title, _message], _unit] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + createHashMapFromArray [ + ["uids", [_uid]], + ["notificationType", _type], + ["title", _title], + ["message", _message] + ], + createHashMapFromArray [["source", "economy"]] + ]]; + }; + + true + }], + ["chargePlayer", { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["fallbackEligible", false], + ["source", ""], + ["message", "Unable to charge personal funds."] + ]; + + if (_uid isEqualTo "") exitWith { + _result set ["message", "A valid player UID is required for medical billing."]; + _result + }; + if (_amount <= 0) exitWith { + _result set ["success", true]; + _result + }; + if (isNil QEGVAR(bank,BankStore)) exitWith { + _result set ["message", "Personal billing is unavailable. Medical service cannot complete."]; + _result + }; + + private _account = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + if (_account isEqualTo createHashMap) exitWith { + _result set ["message", "Personal account could not be loaded for medical billing."]; + _result + }; + + private _source = ""; + if ((_account getOrDefault ["bank", 0]) >= _amount) then { + _source = "bank"; + } else { + if ((_account getOrDefault ["cash", 0]) >= _amount) then { + _source = "cash"; + }; + }; + + if (_source isEqualTo "") exitWith { + _result set ["fallbackEligible", true]; + _result set ["message", "Personal bank and cash balances cannot cover this medical service."]; + _result + }; + + private _charge = EGVAR(bank,BankStore) call ["chargeCheckout", [_uid, _source, _amount, true]]; + if !(_charge getOrDefault ["success", false]) exitWith { + _result set ["message", _charge getOrDefault ["message", "Personal funds could not be charged for medical service."]]; + _result + }; + + private _patch = _charge getOrDefault ["patch", createHashMap]; + if (_patch isNotEqualTo createHashMap && { !(isNil QEGVAR(bank,BankMessenger)) }) then { + if (isNil QEGVAR(common,EventBus)) then { + EGVAR(bank,BankMessenger) call ["sendAccountSync", [_uid, _patch]]; + } else { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["account", +_patch] + ], + createHashMapFromArray [["source", "economy"]] + ]]; + }; + }; + + private _savedAccount = EGVAR(bank,BankStore) call ["save", [_uid]]; + if (_savedAccount isEqualTo createHashMap) then { + ["ERROR", format ["Medical charge for %1 succeeded in hot bank state, but durable bank save failed.", _uid]] call EFUNC(common,log); + }; + + _result set ["success", true]; + _result set ["source", _source]; + _result set ["message", ""]; + _result + }], + ["onHealed", { + params [["_unit", objNull, [objNull]]]; + + if (isNull _unit) exitWith { ["WARNING", format ["Invalid unit provided: %1", (name _unit)], nil, nil] call EFUNC(common,log); }; + + private _uid = getPlayerUID _unit; + if (_uid isEqualTo "") exitWith { ["WARNING", "Unable to charge medical service for unit without UID.", nil, nil] call EFUNC(common,log); }; + + private _healCost = 100; + + private _personalCharge = _self call ["chargePlayer", [_uid, _healCost]]; + if (_personalCharge getOrDefault ["success", false]) exitWith { + private _sourceLabel = ["cash", "bank"] select ((_personalCharge getOrDefault ["source", "bank"]) isEqualTo "bank"); + _self call ["notify", [_unit, "info", "Medical Billing", format ["Medical service charged $%1 from your %2.", [_healCost] call EFUNC(common,formatNumber), _sourceLabel]]]; + [CRPC(actor,onActorHealed), [], _unit] call CFUNC(targetEvent); + }; + + if !(_personalCharge getOrDefault ["fallbackEligible", false]) exitWith { + private _message = _personalCharge getOrDefault ["message", "Personal funds could not be charged for medical service."]; + _self call ["notify", [_unit, "danger", "Medical Billing", _message]]; + }; + + if (isNil QGVAR(SEconomyStore)) exitWith { + ["ERROR", "Service economy store unavailable for medical organization fallback charge.", nil, nil] call EFUNC(common,log); + _self call ["notify", [_unit, "danger", "Medical Billing", "Organization billing is unavailable. Medical service cannot complete."]]; + }; + + private _chargeResult = GVAR(SEconomyStore) call ["chargeOrg", [_unit, _healCost, "Medical", true]]; + if !(_chargeResult getOrDefault ["success", false]) exitWith { + private _message = _chargeResult getOrDefault ["message", "Organization funds cannot cover this medical service."]; + _self call ["notify", [_unit, "danger", "Medical Billing", _message]]; + }; + + _self call ["notify", [_unit, "info", "Medical Billing", format ["Personal funds could not cover medical service. Organization charged $%1; repay it through your organization credit line.", [_healCost] call EFUNC(common,formatNumber)]]]; + [CRPC(actor,onActorHealed), [], _unit] call CFUNC(targetEvent); + }], + ["onRespawn", { + params [["_unit", objNull, [objNull]], ["_corpse", objNull, [objNull]], ["_uid", "", [""]]]; + + private _loadout = [[], [], [], ["U_BG_Guerrilla_6_1", []], [], [], "", "", [], ["", "", "", "", "", ""]]; + private _medSpawn = (GVAR(occupancyTriggers) select { !(GETVAR(_x,isOccupied,false)) }) param [0, objNull]; + private _medSpawnObj = _medSpawn getVariable ["linkedObject", objNull]; + private _medSpawnPos = (getPosATL _medSpawnObj) vectorAdd [0.05, -0.125, 0.45]; + private _medSpawnDir = getDir _medSpawnObj; + + deleteVehicle _corpse; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(actor,onActorRespawn), [_loadout, _medSpawnPos, _medSpawnDir], _player] call CFUNC(targetEvent); + }], + ["onKilled", { + params [["_unit", objNull, [objNull]]]; + + private _unitPos = getPosATL _unit; + private _bodyBag = createVehicle ["forge_bodyBag", _unitPos, [], 0, "NONE"]; + + _self call ["saveWeapons", [_unit]]; + _self call ["moveInventory", [_unit, _bodyBag]]; + }], + ["saveWeapons", { + params [["_unit", objNull, [objNull]]]; + + private _droppedWeapons = []; + private _droppedItems = []; + + _droppedWeapons pushBack (primaryWeapon _unit); + _droppedItems append (primaryWeaponItems _unit); + _droppedItems append (primaryWeaponMagazine _unit); + _droppedWeapons pushBack (secondaryWeapon _unit); + _droppedItems append (secondaryWeaponItems _unit); + _droppedItems append (secondaryWeaponMagazine _unit); + + if (isPlayer _unit) then { _droppedItems pushBack (goggles _unit); }; + if (currentWeapon _unit isEqualTo handgunWeapon _unit) then { + _droppedWeapons pushBack (handgunWeapon _unit); + _droppedItems append (handgunItems _unit); + _droppedItems append (handgunMagazine _unit); + }; + + _unit setVariable [QGVAR(droppedWeapons), _droppedWeapons, true]; + _unit setVariable [QGVAR(droppedItems), _droppedItems, true]; + }], + ["moveInventory", { + params [["_unit", objNull, [objNull]], ["_bodyBag", objNull, [objNull]]]; + + private _items = []; + private _weapons = []; + private _backpack = backpack _unit; + private _nearHolders = _bodyBag nearObjects ["WeaponHolderSimulated", 3]; + + _items pushBack (headgear _unit); + _items pushBack (uniform _unit); + _items append (uniformItems _unit); + _items pushBack (vest _unit); + _items append (vestItems _unit); + _items append (backpackItems _unit); + _weapons pushBack (primaryWeapon _unit); + _items append (primaryWeaponItems _unit); + _items append (primaryWeaponMagazine _unit); + _weapons pushBack (secondaryWeapon _unit); + _items append (secondaryWeaponItems _unit); + _items append (secondaryWeaponMagazine _unit); + _weapons pushBack (handgunWeapon _unit); + _items append (handgunItems _unit); + _items append (handgunMagazine _unit); + _weapons append (_unit getVariable [QGVAR(droppedWeapons), []]); + _items append (_unit getVariable [QGVAR(droppedItems), []]); + _items append (assignedItems _unit); + _items pushBack (_unit call CFUNC(binocularMagazine)); + + if !((goggles _unit ) in (_unit getVariable [QGVAR(droppedItems), []])) then { _items pushBack (goggles _unit); }; + + _items = _items select { _x isNotEqualTo "" }; + _weapons = _weapons select { _x isNotEqualTo "" }; + + { _bodyBag addItemCargoGlobal [_x, 1] } forEach _items; + + { + private _weaponNonPresent = [_x] call CFUNC(getNonPresetClass); + if (_weaponNonPresent == "") then { _weaponNonPresent = _x; }; + _bodyBag addWeaponCargoGlobal [_weaponNonPresent, 1]; + } forEach _weapons; + + if (_backpack isNotEqualTo "") then { + private _backpackNonPresent = [_backpack, "CfgVehicles"] call CFUNC(getNonPresetClass); + if (_backpackNonPresent == "") then { _backpackNonPresent = _backpack; }; + _bodyBag addItemCargoGlobal [_backpackNonPresent, 1]; + }; + + { + private _holderWeapons = ((getWeaponCargo _x) select 0) select { _x in _weapons }; + if (_holderWeapons isNotEqualTo []) then { deleteVehicle _x; }; + } forEach _nearHolders; + }] +]]; + +SETMVAR(FORGE_MEconomyStore,GVAR(MEconomyStore)); +GVAR(MEconomyStore) diff --git a/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf b/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf new file mode 100644 index 0000000..3cd86d3 --- /dev/null +++ b/arma/server/addons/economy/functions/fnc_initSEconomyStore.sqf @@ -0,0 +1,182 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initSEconomyStore.sqf + * Author: IDSolutions + * Date: 2025-12-20 + * Last Update: 2026-05-19 + * Public: No + * + * Description: + * Initializes the service economy store for organization-funded world + * services such as repairs, with optional member debt recording for + * organization-covered medical fallback charges. + * + * Parameter(s): + * N/A + * + * Returns: + * Service economy store object [HASHMAP OBJECT] + * + * Example(s): + * call forge_server_economy_fnc_initSEconomyStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(SEconomyStore) = createHashMapObject [[ + ["#type", "IServiceEconomy"], + ["#create", { + GVAR(ServiceRepairCost) = 500; + GVAR(ServiceRearmCost) = 500; + ["INFO", "Service Store Initialized!", nil, nil] call EFUNC(common,log); + }], + ["notify", { + params [["_unit", objNull, [objNull]], ["_type", "info", [""]], ["_title", "Service", [""]], ["_message", "", [""]]]; + + if (isNull _unit || { _message isEqualTo "" }) exitWith { false }; + + private _uid = getPlayerUID _unit; + if (_uid isEqualTo "") exitWith { false }; + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(notifications,recieveNotification), [_type, _title, _message], _unit] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + createHashMapFromArray [ + ["uids", [_uid]], + ["notificationType", _type], + ["title", _title], + ["message", _message] + ], + createHashMapFromArray [["source", "economy"]] + ]]; + }; + true + }], + ["syncOrgPatch", { + params [["_result", createHashMap, [createHashMap]]]; + + private _patch = _result getOrDefault ["patch", createHashMap]; + if ((keys _patch) isEqualTo []) exitWith { false }; + + private _memberUids = +(_result getOrDefault ["memberUids", []]); + if (isNil QEGVAR(common,EventBus)) then { + { + private _memberPlayer = [_x] call EFUNC(common,getPlayer); + if (_memberPlayer isNotEqualTo objNull) then { + [CRPC(org,responseSyncOrg), [_patch], _memberPlayer] call CFUNC(targetEvent); + }; + } forEach _memberUids; + } else { + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["memberUids", _memberUids], + ["patch", +_patch] + ], + createHashMapFromArray [["source", "economy"]] + ]]; + }; + + true + }], + ["chargeOrg", { + params [ + ["_unit", objNull, [objNull]], + ["_amount", 0, [0]], + ["_label", "Service", [""]], + ["_recordDebt", false, [false]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to charge organization funds."], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (isNull _unit) exitWith { + _result set ["message", "A valid player is required for organization billing."]; + _result + }; + + private _uid = getPlayerUID _unit; + if (_uid isEqualTo "") exitWith { + _result set ["message", "A valid player UID is required for organization billing."]; + _result + }; + + if (_amount <= 0) exitWith { + _result set ["success", true]; + _result set ["message", ""]; + _result + }; + + if (isNil QEGVAR(org,OrgStore)) exitWith { + _result set ["message", "Organization service is unavailable."]; + ["ERROR", format ["Org store unavailable for %1 charge.", _label], nil, nil] call EFUNC(common,log); + _result + }; + + private _orgID = EGVAR(org,OrgStore) call ["resolveOrgIdForUid", [_uid]]; + if (_orgID isEqualTo "") then { _orgID = "default"; }; + + private _actor = createHashMap; + if !(isNil QEGVAR(actor,ActorStore)) then { + _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + }; + private _memberName = EGVAR(org,OrgStore) call ["resolveActorName", [_uid, _unit, _actor]]; + private _org = EGVAR(org,OrgStore) call ["ensureMember", [_orgID, _uid, _memberName]]; + if (_org isEqualTo createHashMap) exitWith { + _result set ["message", "Organization membership could not be verified."]; + _result + }; + + private _charge = EGVAR(org,OrgStore) call ["chargeCheckout", [_uid, _unit, "org_funds", _amount, true, true, _recordDebt]]; + if !(_charge getOrDefault ["success", false]) exitWith { + _result set ["message", _charge getOrDefault ["message", "Organization funds cannot cover this service."]]; + _result + }; + + _self call ["syncOrgPatch", [_charge]]; + _charge + }], + ["repair", { + params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_cost", -1, [0]]]; + + if (isNull _target || { isNull _unit }) exitWith { false }; + + private _repairCost = [_cost, GVAR(ServiceRepairCost)] select (_cost < 0); + private _charge = _self call ["chargeOrg", [_unit, _repairCost, "Repair"]]; + if !(_charge getOrDefault ["success", false]) exitWith { + _self call ["notify", [_unit, "danger", "Repair", _charge getOrDefault ["message", "Organization funds cannot cover this repair."]]]; + false + }; + + _target setDamage 0; + _self call ["notify", [_unit, "info", "Repair", format ["Repair complete. Organization charged $%1.", [_repairCost] call EFUNC(common,formatNumber)]]]; + true + }], + ["rearm", { + params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_cost", -1, [0]]]; + + if (isNull _target || { isNull _unit }) exitWith { false }; + + private _rearmCost = [_cost, GVAR(ServiceRearmCost)] select (_cost < 0); + private _charge = _self call ["chargeOrg", [_unit, _rearmCost, "Rearm"]]; + if !(_charge getOrDefault ["success", false]) exitWith { + _self call ["notify", [_unit, "danger", "Rearm", _charge getOrDefault ["message", "Organization funds cannot cover this rearm."]]]; + false + }; + + [_target, 1] remoteExecCall ["setVehicleAmmo", 0]; + _self call ["notify", [_unit, "info", "Rearm", format ["Rearm complete. Organization charged $%1.", [_rearmCost] call EFUNC(common,formatNumber)]]]; + true + }], + ["init", {}] +]]; + +SETMVAR(FORGE_SEconomyStore,GVAR(SEconomyStore)); +GVAR(SEconomyStore) diff --git a/arma/server/addons/economy/script_component.hpp b/arma/server/addons/economy/script_component.hpp new file mode 100644 index 0000000..89677f7 --- /dev/null +++ b/arma/server/addons/economy/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT economy +#define COMPONENT_BEAUTIFIED Economy +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/economy/stringtable.xml b/arma/server/addons/economy/stringtable.xml new file mode 100644 index 0000000..320b079 --- /dev/null +++ b/arma/server/addons/economy/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Economy + + + diff --git a/arma/server/addons/extension/$PBOPREFIX$ b/arma/server/addons/extension/$PBOPREFIX$ new file mode 100644 index 0000000..3b867e2 --- /dev/null +++ b/arma/server/addons/extension/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\extension diff --git a/arma/server/addons/extension/CfgEventHandlers.hpp b/arma/server/addons/extension/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/server/addons/extension/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; diff --git a/arma/server/addons/extension/README.md b/arma/server/addons/extension/README.md new file mode 100644 index 0000000..2d939a3 --- /dev/null +++ b/arma/server/addons/extension/README.md @@ -0,0 +1,29 @@ +# Forge Server Extension + +## Overview +The extension addon is the SQF bridge to the `forge_server` arma-rs extension. +It normalizes `callExtension` responses, routes large payloads through the +transport layer, and exposes helper functions used by extension-backed server +addons. + +## Dependencies +- `forge_server_main` + +## Main Components +- `fnc_extCall.sqf` is the primary extension call wrapper. +- `fnc_transport.sqf` stages large requests and assembles chunked responses. +- `fnc_setHandler.sqf` registers local SQF handlers for extension callback + integration. + +## Transport Behavior +Most commands use direct `callExtension`. Commands that can return large +payloads, or requests whose encoded arguments exceed the chunk threshold, are +routed through `transport:invoke` or staged transport requests. + +The wrapper falls back to direct calls if the transport route is unsupported and +the request was not chunked. + +## Notes +Domain addons should call `EFUNC(extension,extCall)` instead of calling the +extension directly. This keeps response handling, chunking, and error logging +consistent. diff --git a/arma/server/addons/extension/XEH_PREP.hpp b/arma/server/addons/extension/XEH_PREP.hpp new file mode 100644 index 0000000..7fa64fc --- /dev/null +++ b/arma/server/addons/extension/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(extCall); +PREP(setHandler); +PREP(transport); diff --git a/arma/server/addons/extension/XEH_preInit.sqf b/arma/server/addons/extension/XEH_preInit.sqf new file mode 100644 index 0000000..aa5dec2 --- /dev/null +++ b/arma/server/addons/extension/XEH_preInit.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +addMissionEventHandler ["ExtensionCallback", { + params ["_function", "_result", "_data"]; + (GVAR(handlers) get _function) params ["_handler", "_arguments"]; + [_result, (fromJSON _data), _arguments] call _handler; +}]; diff --git a/arma/server/addons/extension/XEH_preStart.sqf b/arma/server/addons/extension/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/extension/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/extension/config.cpp b/arma/server/addons/extension/config.cpp new file mode 100644 index 0000000..4023b3c --- /dev/null +++ b/arma/server/addons/extension/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/extension/functions/fnc_extCall.sqf b/arma/server/addons/extension/functions/fnc_extCall.sqf new file mode 100644 index 0000000..0ec3c69 --- /dev/null +++ b/arma/server/addons/extension/functions/fnc_extCall.sqf @@ -0,0 +1,183 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_extCall.sqf + * Author: IDSolutions + * Date: 2026-01-03 + * Last Update: 2026-04-28 + * Public: No + * + * Description: + * Call Forge Server extension. + * + * Parameter(s): + * 0: Function name to call + * 1: Arguments to pass to function + * + * Returns: + * Extension result + * Success + * + * Example(s): + * ["icom:connect", ["127.0.0.1:9090", "server_1"]] call forge_x_component_fnc_extCall params ["_result", "_isSuccess"]; + */ + +params [["_function", "", [""]], ["_arguments", [], [[]]]]; + +private _quietFunctionLogs = [ + "task:defuse:get", + "task:catalog:get", + "task:status:get" +]; +private _functionLower = toLower _function; +if !(_functionLower in _quietFunctionLogs) then { + ["INFO", format ["Calling function: %1", _function], nil, nil] call EFUNC(common,log); +}; + +private _chunkPrefix = "FORGE_TRANSPORT_CHUNK:"; +private _chunkPrefixLength = count toArray _chunkPrefix; +private _unsupportedRoutePrefix = "Error: Unsupported transport route"; +private _requestChunkSize = 12000; +// Keep bootstrap create/update calls on the direct extension path by default. +// Actor/bank initialization payloads are small enough for normal callExtension +// usage, and their correctness depends on preserving the native argument shape +// of [uid, json]. Transport remains available automatically for genuinely large +// requests through the chunked-request path below. +private _transportResponseFunctions = [ + "actor:get", + "actor:hot:init", + "actor:hot:get", + "actor:hot:keys", + "actor:hot:save", + "bank:get", + "bank:hot:init", + "bank:hot:get", + "bank:hot:save", + "cad:view:hydrate", + "cad:groups:build", + "cad:assignments:list", + "cad:orders:list", + "cad:requests:list", + "cad:activity:recent", + "phone:init", + "phone:contacts:list", + "phone:messages:list", + "phone:messages:thread", + "phone:emails:list", + "org:members:get", + "org:assets:get", + "org:fleet:get" +]; +private _callExtensionCommand = { + params [["_command", "", [""]], ["_commandArguments", [], [[]]]]; + + ("forge_server" callExtension [_command, _commandArguments]) params [ + "_response", + "_responseExtCode", + "_responseArmaCode" + ]; + + private _responseSuccess = true; + + if (_responseArmaCode != 0 && _responseArmaCode != 301) then { + _responseSuccess = false; + + private _armaCodeMessage = createHashMapFromArray [ + [101, "SYNTAX_ERROR_WRONG_PARAMS_SIZE"], + [102, "SYNTAX_ERROR_WRONG_PARAMS_TYPE"], + [201, "PARAMS_ERROR_TOO_MANY_ARGS"], + [400, "EXTENSION_LOAD_FAILED"], + [403, "EXTENSION_BLOCKED_BY_BATTLEYE"], + [404, "EXTENSION_NOT_FOUND"] + ] getOrDefault [_responseArmaCode, format ["UNKNOWN_%1", _responseArmaCode]]; + + ["WARNING", format ["Arma error: %1", _armaCodeMessage], nil, nil] call EFUNC(common,log); + }; + + if (_responseExtCode != 0) then { + _responseSuccess = false; + + if (_responseExtCode == -1) exitWith { + ["WARNING", "Extension not available", nil, nil] call EFUNC(common,log); + [_response, false] + }; + + if (_responseExtCode == 9) exitWith { + ["WARNING", format ["Extension error: %1", _response], nil, nil] call EFUNC(common,log); + [_response, false] + }; + + ["WARNING", format ["Extension error: %1", _responseExtCode], nil, nil] call EFUNC(common,log); + }; + + [_response, _responseSuccess] +}; + +private _buildTransportArgumentsJson = { + private _rawArguments = _this; + if !(_rawArguments isEqualType []) then { + _rawArguments = [_rawArguments]; + }; + + private _stringArguments = _rawArguments apply { + if (_x isEqualType "") exitWith { _x }; + if (_x isEqualType true) exitWith { ["false", "true"] select _x }; + str _x + }; + + if !(_stringArguments isEqualType []) then { + _stringArguments = [_stringArguments]; + }; + + private _encodedArguments = []; + { + _encodedArguments pushBack (toJSON _x); + } forEach _stringArguments; + + format ["[%1]", _encodedArguments joinString ","] +}; + +if (_functionLower in ["status", "version"]) exitWith { + [_function, _arguments] call _callExtensionCommand +}; + +private _argumentsJson = _arguments call _buildTransportArgumentsJson; +private _usesTransportResponse = _functionLower in _transportResponseFunctions; +private _usesChunkedRequest = (count toArray _argumentsJson) > _requestChunkSize; + +// Most calls should stay direct unless they either need chunked response +// assembly or the request body is large enough to require staging. +if !(_usesTransportResponse || { _usesChunkedRequest }) exitWith { + [_function, _arguments] call _callExtensionCommand +}; + +private _transportCommand = "transport:invoke"; +private _transportArguments = [_function, _argumentsJson]; + +if (_usesChunkedRequest) then { + ["stage", _function, _argumentsJson, _requestChunkSize, _callExtensionCommand] call FUNC(transport) params [ + "_stagedTransportCommand", + "_stagedTransportArguments", + "_stageSuccess" + ]; + + if (!_stageSuccess) exitWith { + ["Error: Failed to stage chunked extension request", false] + }; + + _transportCommand = _stagedTransportCommand; + _transportArguments = _stagedTransportArguments; +}; + +[_transportCommand, _transportArguments] call _callExtensionCommand params ["_result", "_success"]; + +if ( + _success + && { _result isEqualType "" } + && { (_result find _unsupportedRoutePrefix) == 0 } + && { !_usesChunkedRequest } +) exitWith { + [_function, _arguments] call _callExtensionCommand +}; + +["assemble", _result, _success, _chunkPrefix, _chunkPrefixLength, _callExtensionCommand] call FUNC(transport) diff --git a/arma/server/addons/extension/functions/fnc_setHandler.sqf b/arma/server/addons/extension/functions/fnc_setHandler.sqf new file mode 100644 index 0000000..19762f1 --- /dev/null +++ b/arma/server/addons/extension/functions/fnc_setHandler.sqf @@ -0,0 +1,45 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_setHandler.sqf + * Author: IDSolutions + * Date: 2026-01-03 + * Last Update: 2026-01-03 + * Public: No + * + * Description: + * Set handler for extension function callbacks. + * + * Parameter(s): + * 0: Function name to handle callbacks + * 1: Callback function to use as handler + * 2: Arguments to pass to callback function + * + * Returns: + * Handler was set + * + * Example(s): + * ["actor:greet", { + * params ["_message"]; + * private _player = _arguments select 0; + * systemChat format ["Hello, %1! %2", name _player, _message]; + * }, [player]] call forge_x_component_fnc_setHandler; + */ + +params [["_function", "", [""]], ["_callback", {}, [{}]], ["_arguments", [], [[]]]]; + +if (_function isEqualTo "") exitWith { + ["WARNING", "Function not specified, handler not set!", nil, nil] call EFUNC(common,log); + false +}; +if (_callback isEqualTo {}) exitWith { + ["WARNING", "Callback not specified, handler not set!", nil, nil] call EFUNC(common,log); + false +}; +if (isNil QGVAR(handlers)) then { GVAR(handlers) = createHashMap; }; + +private _entry = format ["forge_server:%1", _function]; +GVAR(handlers) set [_entry, [_callback, _arguments]]; +["INFO", format ["Handler set: %1", _entry], nil, nil] call EFUNC(common,log); + +true diff --git a/arma/server/addons/extension/functions/fnc_transport.sqf b/arma/server/addons/extension/functions/fnc_transport.sqf new file mode 100644 index 0000000..a86494c --- /dev/null +++ b/arma/server/addons/extension/functions/fnc_transport.sqf @@ -0,0 +1,115 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_transport.sqf + * Author: IDSolutions + * Date: 2026-04-01 + * Public: No + * + * Description: + * Shared transport helper for staging oversized requests and assembling + * chunked responses. + * + * Parameter(s): + * 0: Mode + * "stage": 1=function, 2=argumentsJson, 3=chunkSize, 4=invoker + * "assemble": 1=response, 2=success, 3=chunkPrefix, 4=chunkPrefixLength, 5=invoker + * + * Returns: + * Depends on mode. + */ + +params [["_mode", "", [""]]]; + +switch (_mode) do { + case "stage": { + _this params [ + "_mode", + ["_transportFunction", "", [""]], + ["_argumentsJson", "", [""]], + ["_requestChunkSize", 12000, [0]], + ["_callExtensionCommand", {}, [{}]] + ]; + + private _transferID = format [ + "req_%1_%2", + floor (diag_tickTime * 1000), + floor (random 1000000000) + ]; + + for "_offset" from 0 to ((count toArray _argumentsJson) - 1) step _requestChunkSize do { + private _chunk = _argumentsJson select [_offset, _requestChunkSize]; + + ["transport:request:append", [_transferID, _chunk]] call _callExtensionCommand params [ + "_appendResult", + "_appendSuccess" + ]; + + if (!_appendSuccess || { !(_appendResult isEqualType "") } || { (_appendResult find "Error:") == 0 }) exitWith { + _transferID = ""; + }; + }; + + if (_transferID isEqualTo "") exitWith { + ["", [], false] + }; + + [ + "transport:invoke_stored", + [_transportFunction, _transferID], + true + ] + }; + + case "assemble": { + _this params [ + "_mode", + ["_response", "", [""]], + ["_responseSuccess", false, [true]], + ["_chunkPrefix", "", [""]], + ["_chunkPrefixLength", 0, [0]], + ["_callExtensionCommand", {}, [{}]] + ]; + + if !(_responseSuccess && { _response isEqualType "" } && { (_response find _chunkPrefix) == 0 }) exitWith { + [_response, _responseSuccess] + }; + + private _chunkEnvelope = fromJSON (_response select [_chunkPrefixLength]); + if !(_chunkEnvelope isEqualType createHashMap) exitWith { + ["Error: Invalid extension chunk envelope", false] + }; + + private _transferID = _chunkEnvelope getOrDefault ["transferId", ""]; + private _chunkCount = _chunkEnvelope getOrDefault ["chunkCount", 0]; + + if (_transferID isEqualTo "" || { !(_chunkCount isEqualType 0) } || { _chunkCount < 1 }) exitWith { + ["Error: Invalid extension chunk metadata", false] + }; + + private _assembledResponse = ""; + private _chunkReadSuccess = true; + + for "_index" from 0 to (_chunkCount - 1) do { + ["transport:response:get", [_transferID, str _index]] call _callExtensionCommand params [ + "_chunkResult", + "_chunkSuccess" + ]; + + if (!_chunkSuccess || { !(_chunkResult isEqualType "") } || { (_chunkResult find "Error:") == 0 }) exitWith { + _chunkReadSuccess = false; + _assembledResponse = "Error: Failed to retrieve chunked extension response"; + }; + + _assembledResponse = _assembledResponse + _chunkResult; + }; + + ["transport:response:clear", [_transferID]] call _callExtensionCommand; + + [_assembledResponse, _chunkReadSuccess] + }; + + default { + ["Error: Unsupported extension transport mode", false] + }; +}; diff --git a/arma/server/addons/extension/script_component.hpp b/arma/server/addons/extension/script_component.hpp new file mode 100644 index 0000000..ba0d457 --- /dev/null +++ b/arma/server/addons/extension/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT extension +#define COMPONENT_BEAUTIFIED Extension +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/extension/stringtable.xml b/arma/server/addons/extension/stringtable.xml new file mode 100644 index 0000000..d56e591 --- /dev/null +++ b/arma/server/addons/extension/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Extension + + + diff --git a/arma/server/addons/garage/$PBOPREFIX$ b/arma/server/addons/garage/$PBOPREFIX$ new file mode 100644 index 0000000..66f9369 --- /dev/null +++ b/arma/server/addons/garage/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\garage diff --git a/arma/server/addons/garage/CfgEventHandlers.hpp b/arma/server/addons/garage/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/garage/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/garage/README.md b/arma/server/addons/garage/README.md new file mode 100644 index 0000000..9eece37 --- /dev/null +++ b/arma/server/addons/garage/README.md @@ -0,0 +1,36 @@ +# Forge Server Garage + +## Overview +The garage addon is the server-side bridge for player vehicle storage and +owner-scoped vehicle unlock storage. + +Garage hot state is owned by the extension. SQF validates Arma-facing requests, +serializes vehicle payloads, sends client syncs, and marks editor-placed garage +objects. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for garage extension calls +- `forge_client_garage` for response RPCs + +## Main Components +- `fnc_initGarage.sqf` initializes garage world objects. +- `fnc_initGarageStore.sqf` manages player garage hot state. +- `fnc_initVGStore.sqf` manages owner-scoped vehicle unlock state. + +## Supported Operations +- initialize player garage data +- save player and owner-scoped garage state +- store and retrieve player vehicles +- initialize and save owner-scoped vehicle storage + +## Runtime Notes +`forge_server_main_fnc_saveHotState` saves both `GarageStore` and +`VGarageStore` on disconnect and mission shutdown. + +Garage listens for sync events through the event bus: +- `garage.vgarage.sync.requested` - updates client vehicles and unlock state when granted by store/task checkout +- `notification.requested` - storage and vehicle modification alerts + +The store module emits these events when granting vehicles; garage applies the changes to player state. diff --git a/arma/server/addons/garage/XEH_PREP.hpp b/arma/server/addons/garage/XEH_PREP.hpp new file mode 100644 index 0000000..f30dc3b --- /dev/null +++ b/arma/server/addons/garage/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(initGarage); +PREP(initGarageStore); +PREP(initVGStore); diff --git a/arma/server/addons/garage/XEH_postInit.sqf b/arma/server/addons/garage/XEH_postInit.sqf new file mode 100644 index 0000000..8916239 --- /dev/null +++ b/arma/server/addons/garage/XEH_postInit.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +call FUNC(initGarage); + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(SyncEventTokens)) then { + private _sendVGarageSync = { + params ["_event"]; + + private _uid = _event getOrDefault ["uid", ""]; + private _patch = _event getOrDefault ["patch", createHashMap]; + + if (_uid isEqualTo "" || { _patch isEqualTo createHashMap }) exitWith {}; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith {}; + + [CRPC(garage,responseSyncVG), [_patch], _player] call CFUNC(targetEvent); + }; + + GVAR(SyncEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["garage.vgarage.sync.requested", _sendVGarageSync, "garage.vgarage.sync"]] + ]; +}; diff --git a/arma/server/addons/garage/XEH_preInit.sqf b/arma/server/addons/garage/XEH_preInit.sqf new file mode 100644 index 0000000..2b34c05 --- /dev/null +++ b/arma/server/addons/garage/XEH_preInit.sqf @@ -0,0 +1,126 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +[QGVAR(requestInitGarage), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Garage] Empty/Invalid UID!" }; + GVAR(GarageStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveGarage), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Garage] Empty/Invalid UID!" }; + + private _finalData = GVAR(GarageStore) call ["save", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(garage,responseSyncGarage), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestStoreVehicle), { + params [ + ["_uid", "", [""]], + ["_netId", "", [""]], + ["_className", "", [""]], + ["_fuel", 0, [0]], + ["_damage", 0, [0]], + ["_hitPointsJson", "", [""]] + ]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_uid isEqualTo "" || { _netId isEqualTo "" } || { _className isEqualTo "" } || { _hitPointsJson isEqualTo "" }) exitWith { + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "store"], + ["success", false], + ["message", "Missing vehicle data for garage storage."] + ]], _player] call CFUNC(targetEvent); + }; + + private _payloadJson = toJSON (createHashMapFromArray [ + ["classname", _className], + ["fuel", _fuel], + ["damage", _damage], + ["hit_points", fromJSON _hitPointsJson] + ]); + + private _garage = GVAR(GarageStore) call ["storeVehicle", [_uid, _payloadJson]]; + if !(GVAR(GarageStore) call ["didLastCallSucceed", []]) exitWith { + private _message = GVAR(GarageStore) call ["getLastError", []]; + if (_message isEqualTo "") then { _message = "Failed to store vehicle."; }; + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "store"], + ["success", false], + ["message", _message] + ]], _player] call CFUNC(targetEvent); + }; + + private _vehicle = objectFromNetId _netId; + if !(isNull _vehicle) then { + deleteVehicle _vehicle; + }; + + [CRPC(garage,responseSyncGarage), [_garage], _player] call CFUNC(targetEvent); + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "store"], + ["success", true], + ["message", "Vehicle stored in garage."] + ]], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestRetrieveVehicle), { + params [["_uid", "", [""]], ["_plate", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_uid isEqualTo "" || { _plate isEqualTo "" }) exitWith { + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "retrieve"], + ["success", false], + ["message", "Select a stored vehicle to retrieve."] + ]], _player] call CFUNC(targetEvent); + }; + + private _payloadJson = toJSON (createHashMapFromArray [["plate", _plate]]); + private _garage = GVAR(GarageStore) call ["retrieveVehicle", [_uid, _payloadJson]]; + if !(GVAR(GarageStore) call ["didLastCallSucceed", []]) exitWith { + private _message = GVAR(GarageStore) call ["getLastError", []]; + if (_message isEqualTo "") then { _message = "Failed to retrieve vehicle."; }; + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "retrieve"], + ["success", false], + ["message", _message] + ]], _player] call CFUNC(targetEvent); + }; + + [CRPC(garage,responseSyncGarage), [_garage], _player] call CFUNC(targetEvent); + [CRPC(garage,responseGarageAction), [createHashMapFromArray [ + ["action", "retrieve"], + ["success", true], + ["message", "Vehicle retrieved from garage."] + ]], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestInitVG), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:VGarage] Empty/Invalid UID!" }; + GVAR(VGarageStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveVG), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:VGarage] Empty/Invalid UID!" }; + + private _finalData = GVAR(VGarageStore) call ["save", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(garage,responseSyncVG), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + diff --git a/arma/server/addons/garage/XEH_preStart.sqf b/arma/server/addons/garage/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/garage/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/garage/config.cpp b/arma/server/addons/garage/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/garage/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/garage/functions/fnc_initGarage.sqf b/arma/server/addons/garage/functions/fnc_initGarage.sqf new file mode 100644 index 0000000..7250fae --- /dev/null +++ b/arma/server/addons/garage/functions/fnc_initGarage.sqf @@ -0,0 +1,56 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initGarage.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-02-05 + * Public: No + * + * Description: + * Initializes all editor-placed garages. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_server_garage_fnc_initGarage + */ + +private _resolveGarageType = { + params [["_value", "", [""]]]; + + private _normalized = toLowerANSI (trim _value); + + switch (true) do { + case ((_normalized find "cars") >= 0): { "cars" }; + case ((_normalized find "armor") >= 0): { "armor" }; + case ((_normalized find "helis") >= 0): { "helis" }; + case ((_normalized find "planes") >= 0): { "planes" }; + case ((_normalized find "naval") >= 0): { "naval" }; + case ((_normalized find "other") >= 0): { "other" }; + default { "" }; + } +}; + +private _garages = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ((toLowerANSI _x) find "garage") >= 0 && { _var isEqualType objNull } && { !isNull _var } +}; + +if (_garages isEqualTo []) exitWith { ["INFO", "No editor-placed garages found."] call EFUNC(common,log) }; + +{ + private _garageName = _x; + private _garage = missionNamespace getVariable _garageName; + SETPVAR(_garage,isGarage,true); + if ((_garage getVariable ["garageType", ""]) isEqualTo "") then { + private _garageType = _garageName call _resolveGarageType; + if (_garageType isNotEqualTo "") then { + SETPVAR(_garage,garageType,_garageType); + }; + }; +} forEach _garages; diff --git a/arma/server/addons/garage/functions/fnc_initGarageStore.sqf b/arma/server/addons/garage/functions/fnc_initGarageStore.sqf new file mode 100644 index 0000000..759f685 --- /dev/null +++ b/arma/server/addons/garage/functions/fnc_initGarageStore.sqf @@ -0,0 +1,120 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initGarageStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-04-01 + * Public: No + * + * Description: + * Initializes the Garage store for managing player vehicles. + * Garage hot state is owned by the extension; SQF acts as a thin bridge. + * + * Arguments: + * None + * + * Return Value: + * Garage store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_garage_fnc_initGarageStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(GarageBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "GarageBaseStore"], + ["#create", compileFinal { + ["INFO", "Garage Store Initialized!"] call EFUNC(common,log); + _self set ["lastCallSucceeded", false]; + _self set ["lastError", ""]; + }], + ["callHotGarage", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + _self set ["lastCallSucceeded", false]; + _self set ["lastError", ""]; + + if (_function isEqualTo "") exitWith { + _self set ["lastError", "Garage extension function was empty."]; + createHashMap + }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + _self set ["lastError", format ["Garage extension call '%1' did not succeed.", _function]]; + createHashMap + }; + if !(_result isEqualType "") exitWith { + _self set ["lastError", format ["Garage extension call '%1' returned invalid data.", _function]]; + createHashMap + }; + if ((_result find "Error:") == 0) exitWith { + _self set ["lastError", _result]; + ["ERROR", format ["Garage extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { + _self set ["lastError", format ["Garage extension call '%1' returned non-map JSON.", _function]]; + createHashMap + }; + + _self set ["lastCallSucceeded", true]; + _data + }], + ["didLastCallSucceed", compileFinal { + _self getOrDefault ["lastCallSucceeded", false] + }], + ["getLastError", compileFinal { + _self getOrDefault ["lastError", ""] + }], + ["loadHotGarage", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _command = ["garage:hot:get", "garage:hot:init"] select _initialize; + _self call ["callHotGarage", [_command, [_uid]]] + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _garage = _self call ["loadHotGarage", [_uid, true]]; + + [CRPC(garage,responseInitGarage), [_garage], _player] call CFUNC(targetEvent); + _garage + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + _self call ["callHotGarage", ["garage:hot:save", [_uid]]] + }], + ["storeVehicle", compileFinal { + params [ + ["_uid", "", [""]], + ["_payloadJson", "", [""]] + ]; + + if (_uid isEqualTo "" || { _payloadJson isEqualTo "" }) exitWith { createHashMap }; + _self call ["callHotGarage", ["garage:hot:add", [_uid, _payloadJson]]] + }], + ["retrieveVehicle", compileFinal { + params [ + ["_uid", "", [""]], + ["_payloadJson", "", [""]] + ]; + + if (_uid isEqualTo "" || { _payloadJson isEqualTo "" }) exitWith { createHashMap }; + _self call ["callHotGarage", ["garage:hot:remove_vehicle", [_uid, _payloadJson]]] + }] +]; + +GVAR(GarageStore) = createHashMapObject [GVAR(GarageBaseStore)]; +GVAR(GarageStore) diff --git a/arma/server/addons/garage/functions/fnc_initVGStore.sqf b/arma/server/addons/garage/functions/fnc_initVGStore.sqf new file mode 100644 index 0000000..a17b9c5 --- /dev/null +++ b/arma/server/addons/garage/functions/fnc_initVGStore.sqf @@ -0,0 +1,96 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initVGStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-04-01 + * Public: No + * + * Description: + * Initializes the Virtual Garage store for managing player vehicle unlocks. + * Virtual garage hot state is owned by the extension; SQF acts as a thin bridge. + * + * Arguments: + * None + * + * Return Value: + * VG store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_garage_fnc_initVGStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(VGarageModel) = compileFinal createHashMapObject [[ + ["#type", "VGarageModel"], + ["defaults", compileFinal { + private _vGarage = createHashMap; + + _vGarage set ["armor", []]; + _vGarage set ["cars", ["B_Quadbike_01_F"]]; + _vGarage set ["helis", []]; + _vGarage set ["naval", []]; + _vGarage set ["other", []]; + _vGarage set ["planes", []]; + + _vGarage + }] +]]; + +GVAR(VGBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "VGBaseStore"], + ["#create", compileFinal { + ["INFO", "VGarage Store Initialized!"] call EFUNC(common,log); + }], + ["callHotVGarage", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["VGarage extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["loadHotVGarage", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _command = ["owned:garage:hot:fetch", "owned:garage:hot:init"] select _initialize; + _self call ["callHotVGarage", [_command, [_uid]]] + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _garage = _self call ["loadHotVGarage", [_uid, true]]; + if (_garage isEqualTo createHashMap) then { + _garage = GVAR(VGarageModel) call ["defaults", []]; + ["ERROR", format ["Failed to initialize virtual garage for %1! Using fallback virtual garage.", _uid]] call EFUNC(common,log); + }; + + [CRPC(garage,responseInitVG), [_garage], _player] call CFUNC(targetEvent); + _garage + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + _self call ["callHotVGarage", ["owned:garage:hot:save", [_uid]]] + }] +]; + +GVAR(VGarageStore) = createHashMapObject [GVAR(VGBaseStore)]; +GVAR(VGarageStore) diff --git a/arma/server/addons/garage/script_component.hpp b/arma/server/addons/garage/script_component.hpp new file mode 100644 index 0000000..25c5611 --- /dev/null +++ b/arma/server/addons/garage/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT garage +#define COMPONENT_BEAUTIFIED Garage +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/garage/stringtable.xml b/arma/server/addons/garage/stringtable.xml new file mode 100644 index 0000000..71ca3e2 --- /dev/null +++ b/arma/server/addons/garage/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Garage + + + diff --git a/arma/server/addons/locker/$PBOPREFIX$ b/arma/server/addons/locker/$PBOPREFIX$ new file mode 100644 index 0000000..c89686b --- /dev/null +++ b/arma/server/addons/locker/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\locker diff --git a/arma/server/addons/locker/CfgEventHandlers.hpp b/arma/server/addons/locker/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/locker/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/locker/README.md b/arma/server/addons/locker/README.md new file mode 100644 index 0000000..1a82b3d --- /dev/null +++ b/arma/server/addons/locker/README.md @@ -0,0 +1,37 @@ +# Forge Server Locker + +## Overview +The locker addon is the server-side bridge for player item storage and +owner-scoped arsenal unlock storage. + +Locker hot state is owned by the extension. SQF handles client events, payload +validation, synchronization, and save calls. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for locker extension calls +- `forge_client_locker` for response RPCs + +## Main Components +- `fnc_initLocker.sqf` initializes locker world objects. +- `fnc_initLockerStore.sqf` manages player locker hot state. +- `fnc_initVAStore.sqf` manages owner-scoped arsenal unlock state. + +## Supported Operations +- initialize player locker data +- save player and owner-scoped locker state +- override locker data from trusted server-side callers +- initialize and save owner-scoped arsenal storage + +## Runtime Notes +`forge_server_main_fnc_saveHotState` saves both `LockerStore` and `VAStore` on +disconnect and mission shutdown. Store checkout and task rewards can grant +assets into organization-owned storage through the org addon. + +Locker listens for sync events through the event bus: +- `locker.sync.requested` - updates client item storage when granted by store/task checkout +- `locker.va.sync.requested` - updates client arsenal unlocks when granted +- `notification.requested` - storage and item modification alerts + +The store module emits these events when granting items; locker applies the changes to player state. diff --git a/arma/server/addons/locker/XEH_PREP.hpp b/arma/server/addons/locker/XEH_PREP.hpp new file mode 100644 index 0000000..a81a67c --- /dev/null +++ b/arma/server/addons/locker/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(initLocker); +PREP(initLockerStore); +PREP(initVAStore); diff --git a/arma/server/addons/locker/XEH_postInit.sqf b/arma/server/addons/locker/XEH_postInit.sqf new file mode 100644 index 0000000..e0e1969 --- /dev/null +++ b/arma/server/addons/locker/XEH_postInit.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" + +call FUNC(initLocker); + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(SyncEventTokens)) then { + private _sendLockerSync = { + params ["_event"]; + + private _uid = _event getOrDefault ["uid", ""]; + private _patch = _event getOrDefault ["patch", createHashMap]; + + if (_uid isEqualTo "" || { _patch isEqualTo createHashMap }) exitWith {}; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith {}; + + [CRPC(locker,responseSyncLocker), [_patch], _player] call CFUNC(targetEvent); + }; + + private _sendVASync = { + params ["_event"]; + + private _uid = _event getOrDefault ["uid", ""]; + private _patch = _event getOrDefault ["patch", createHashMap]; + + if (_uid isEqualTo "" || { _patch isEqualTo createHashMap }) exitWith {}; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith {}; + + [CRPC(locker,responseSyncVA), [_patch], _player] call CFUNC(targetEvent); + }; + + GVAR(SyncEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["locker.sync.requested", _sendLockerSync, "locker.sync"]], + EGVAR(common,EventBus) call ["on", ["locker.va.sync.requested", _sendVASync, "locker.va.sync"]] + ]; +}; diff --git a/arma/server/addons/locker/XEH_preInit.sqf b/arma/server/addons/locker/XEH_preInit.sqf new file mode 100644 index 0000000..bfd7343 --- /dev/null +++ b/arma/server/addons/locker/XEH_preInit.sqf @@ -0,0 +1,54 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +[QGVAR(requestInitLocker), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Locker] Empty/Invalid UID!" }; + GVAR(LockerStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveLocker), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Locker] Empty/Invalid UID!" }; + + private _finalData = GVAR(LockerStore) call ["save", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(locker,responseSyncLocker), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestOverrideLocker), { + params [["_uid", "", [""]], ["_data", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Locker] Empty/Invalid UID!" }; + private _finalData = GVAR(LockerStore) call ["override", [_uid, _data, false]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(locker,responseSyncLocker), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestInitVA), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:VArsenal] Empty/Invalid UID!" }; + GVAR(VAStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveVA), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:VArsenal] Empty/Invalid UID!" }; + + private _finalData = GVAR(VAStore) call ["save", [_uid]]; + private _player = [_uid] call EFUNC(common,getPlayer); + + [CRPC(locker,responseSyncVA), [_finalData], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + diff --git a/arma/server/addons/locker/XEH_preStart.sqf b/arma/server/addons/locker/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/locker/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/locker/config.cpp b/arma/server/addons/locker/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/locker/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/locker/functions/fnc_initLocker.sqf b/arma/server/addons/locker/functions/fnc_initLocker.sqf new file mode 100644 index 0000000..248e91b --- /dev/null +++ b/arma/server/addons/locker/functions/fnc_initLocker.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initLocker.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-02-05 + * Public: No + * + * Description: + * Initializes lockers by hiding editor-placed global locker objects. + * Each client will create their own local instance. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_server_locker_fnc_initLocker + */ + +private _lockers = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ("locker" in _x) && { _var isEqualType objNull } && { !isNull _var } && { _x isNotEqualTo "forge_locker_box" } +}; + +if (_lockers isEqualTo []) exitWith { ["INFO", "No editor-placed lockers found."] call EFUNC(common,log) }; + +{ + private _locker = missionNamespace getVariable _x; + _locker hideObjectGlobal true; +} forEach _lockers; diff --git a/arma/server/addons/locker/functions/fnc_initLockerStore.sqf b/arma/server/addons/locker/functions/fnc_initLockerStore.sqf new file mode 100644 index 0000000..b76bde4 --- /dev/null +++ b/arma/server/addons/locker/functions/fnc_initLockerStore.sqf @@ -0,0 +1,98 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initLockerStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-04-01 + * Public: No + * + * Description: + * Initializes the Locker store for managing player locker items. + * Locker hot state is owned by the extension; SQF acts as a thin bridge. + * + * Arguments: + * None + * + * Return Value: + * Locker store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_locker_fnc_initLockerStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(LockerBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "LockerBaseStore"], + ["#create", compileFinal { + ["INFO", "Locker Store Initialized!"] call EFUNC(common,log); + }], + ["callHotLocker", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Locker extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["loadHotLocker", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _command = ["locker:hot:get", "locker:hot:init"] select _initialize; + _self call ["callHotLocker", [_command, [_uid]]] + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _locker = _self call ["loadHotLocker", [_uid, true]]; + + [CRPC(locker,responseInitLocker), [_locker], _player] call CFUNC(targetEvent); + _locker + }], + ["override", compileFinal { + params [ + ["_uid", "", [""]], + ["_data", createHashMap, [createHashMap]], + ["_save", false, [false]] + ]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + + private _locker = _self call ["callHotLocker", ["locker:hot:override", [_uid, toJSON _data]]]; + if (_save && { _locker isNotEqualTo createHashMap }) then { + private _savedLocker = _self call ["callHotLocker", ["locker:hot:save", [_uid]]]; + if (_savedLocker isNotEqualTo createHashMap) then { + _locker = _savedLocker; + } else { + _locker = createHashMap; + }; + }; + + _locker + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + _self call ["callHotLocker", ["locker:hot:save", [_uid]]] + }] +]; + +GVAR(LockerStore) = createHashMapObject [GVAR(LockerBaseStore)]; +GVAR(LockerStore) diff --git a/arma/server/addons/locker/functions/fnc_initVAStore.sqf b/arma/server/addons/locker/functions/fnc_initVAStore.sqf new file mode 100644 index 0000000..ecbc234 --- /dev/null +++ b/arma/server/addons/locker/functions/fnc_initVAStore.sqf @@ -0,0 +1,94 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initVAStore.sqf + * Author: IDSolutions + * Date: 2025-12-17 + * Last Update: 2026-04-05 + * Public: No + * + * Description: + * Initializes the Virtual Arsenal store for managing player arsenal unlocks. + * Virtual arsenal hot state is owned by the extension; SQF acts as a thin bridge. + * + * Arguments: + * None + * + * Return Value: + * VA store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_locker_fnc_initVAStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(VArsenalModel) = compileFinal createHashMapObject [[ + ["#type", "VArsenalModel"], + ["defaults", compileFinal { + private _vArsenal = createHashMap; + + _vArsenal set ["backpacks", ["B_AssaultPack_rgr"]]; + _vArsenal set ["items", ["FirstAidKit", "G_Combat", "H_Cap_blk_ION", "H_HelmetB", "ItemCompass", "ItemGPS", "ItemMap", "ItemRadio", "ItemWatch", "U_BG_Guerrilla_6_1", "V_TacVest_oli", "ACE_EarPlugs"]]; + _vArsenal set ["magazines", ["16Rnd_9x21_Mag", "30Rnd_65x39_caseless_black_mag", "Chemlight_blue", "Chemlight_green", "Chemlight_red", "Chemlight_yellow", "HandGrenade", "SmokeShell", "SmokeShellBlue", "SmokeShellGreen", "SmokeShellOrange", "SmokeShellPurple", "SmokeShellRed", "SmokeShellYellow"]]; + _vArsenal set ["weapons", ["arifle_MX_F", "hgun_P07_F"]]; + + _vArsenal + }] +]]; + +GVAR(VABaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "VABaseStore"], + ["#create", compileFinal { + ["INFO", "VArsenal Store Initialized!"] call EFUNC(common,log); + }], + ["callHotVArsenal", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["VArsenal extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["loadHotVArsenal", compileFinal { + params [["_uid", "", [""]], ["_initialize", false, [false]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _command = ["owned:locker:hot:fetch", "owned:locker:hot:init"] select _initialize; + _self call ["callHotVArsenal", [_command, [_uid]]] + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _arsenal = _self call ["loadHotVArsenal", [_uid, true]]; + if (_arsenal isEqualTo createHashMap) then { + _arsenal = GVAR(VArsenalModel) call ["defaults", []]; + ["ERROR", format ["Failed to initialize virtual arsenal for %1! Using fallback virtual arsenal.", _uid]] call EFUNC(common,log); + }; + + [CRPC(locker,responseInitVA), [_arsenal], _player] call CFUNC(targetEvent); + _arsenal + }], + ["save", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + _self call ["callHotVArsenal", ["owned:locker:hot:save", [_uid]]] + }] +]; + +GVAR(VAStore) = createHashMapObject [GVAR(VABaseStore)]; +GVAR(VAStore) diff --git a/arma/server/addons/locker/script_component.hpp b/arma/server/addons/locker/script_component.hpp new file mode 100644 index 0000000..89fd768 --- /dev/null +++ b/arma/server/addons/locker/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT locker +#define COMPONENT_BEAUTIFIED Locker +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/locker/stringtable.xml b/arma/server/addons/locker/stringtable.xml new file mode 100644 index 0000000..fe4de1c --- /dev/null +++ b/arma/server/addons/locker/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Locker + + + diff --git a/arma/server/addons/main/$PBOPREFIX$ b/arma/server/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..9e6049b --- /dev/null +++ b/arma/server/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\main diff --git a/arma/server/addons/main/CfgEventHandlers.hpp b/arma/server/addons/main/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/main/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/main/CfgSettings.hpp b/arma/server/addons/main/CfgSettings.hpp new file mode 100644 index 0000000..f517d07 --- /dev/null +++ b/arma/server/addons/main/CfgSettings.hpp @@ -0,0 +1,3 @@ +class CfgSettings { + class CBA {}; +}; diff --git a/arma/server/addons/main/README.md b/arma/server/addons/main/README.md new file mode 100644 index 0000000..bc7d2aa --- /dev/null +++ b/arma/server/addons/main/README.md @@ -0,0 +1,29 @@ +# Forge Server Main + +## Overview +The main addon owns server-side bootstrap behavior for Forge. It prepares +functions, wires extension callbacks and ICom events, initializes shared stores, +and flushes hot state when players disconnect or the mission ends. + +## Dependencies +- `cba_main` +- `ace_main` + +## Main Components +- `fnc_initStores.sqf` initializes core server stores in dependency order. +- `fnc_saveHotState.sqf` snapshots and saves extension-backed hot state. +- `fnc_initValidationHarness.sqf` provides targeted runtime smoke checks for + multi-module flows. +- `XEH_preInit.sqf` registers ICom and extension callback handlers. +- `XEH_postInit.sqf` starts store initialization. + +## Store Initialization +The main addon initializes shared base stores, actor, bank, garage, locker, +organization, store, and validation harness state. Some addons initialize their +own state in pre-init or post-init when they are intentionally independent of +the main bootstrap flow. + +## Hot State Flush +On player disconnect, mission ended, and MP ended events, `saveHotState` +persists actor, bank, locker, virtual arsenal, garage, virtual garage, and +organization hot state for the relevant UID or all known UIDs. diff --git a/arma/server/addons/main/XEH_PREP.hpp b/arma/server/addons/main/XEH_PREP.hpp new file mode 100644 index 0000000..baa381f --- /dev/null +++ b/arma/server/addons/main/XEH_PREP.hpp @@ -0,0 +1,5 @@ +PREP(initStores); +PREP(initValidationHarness); +PREP(playerGroup2Server); +PREP(redirectClient2Server); +PREP(saveHotState); diff --git a/arma/server/addons/main/XEH_postInit.sqf b/arma/server/addons/main/XEH_postInit.sqf new file mode 100644 index 0000000..1b295d1 --- /dev/null +++ b/arma/server/addons/main/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +call FUNC(initStores); diff --git a/arma/server/addons/main/XEH_preInit.sqf b/arma/server/addons/main/XEH_preInit.sqf new file mode 100644 index 0000000..929f1ff --- /dev/null +++ b/arma/server/addons/main/XEH_preInit.sqf @@ -0,0 +1,78 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +GVAR(PlayerBootstrapRegistry) = createHashMap; + +["forge_icom_event", { + params [["_event", "", [""]], ["_data", createHashMap, [createHashMap]]]; + + systemChat format ["ICOM Event: %1", _event]; + diag_log format ["[ICOM] Event received: %1 | Data: %2", _event, _data]; + + switch (_event) do { + case "supply_drop": { + systemChat "Supply drop event received"; + + private _coords = _data getOrDefault ["coords", []]; + private _supplies = _data getOrDefault ["supplies", []]; + + diag_log format ["[ICOM] Supply drop at %1 with supplies: %2", _coords, _supplies]; + }; + case "spawn_mission": { + systemChat "Mission spawn event received"; + + private _missionType = _data getOrDefault ["mission_type", ""]; + private _location = _data getOrDefault ["location", []]; + + diag_log format ["[ICOM] Spawning mission type '%1' at %2", _missionType, _location]; + }; + case "global_alert": { + systemChat "Global event received"; + + private _message = _data getOrDefault ["message", ""]; + private _severity = _data getOrDefault ["severity", ""]; + + diag_log format ["[ICOM] Global event '%1' severity: %2", _message, _severity]; + }; + default { + diag_log format ["[ICOM] Unhandled event: %1", _event]; + }; + }; +}] call CFUNC(addEventHandler); + +diag_log "[ICOM] Event handler initialized"; + +addMissionEventHandler ["ExtensionCallback", { + params ["_name", "_function", "_data"]; + + if (_name isEqualTo "icom") then { + ["forge_icom_event", (fromJSON _data)] call CFUNC(serverEvent); + } else { + (fromJSON _data) call (missionNamespace getVariable [_function, { + diag_log "[FORGE:Server] Function does not exist!"; + }]); + }; +}]; + +addMissionEventHandler ["PlayerConnected", { + params ["_id", "_uid", "_name", "_jip", "_owner", "_idStr"]; +}]; + +addMissionEventHandler ["PlayerDisconnected", { + params ["_id", "_uid", "_name", "_jip", "_owner", "_idStr"]; + + if (_uid isEqualTo "") exitWith {}; + + [_uid] call FUNC(saveHotState); +}]; + +addMissionEventHandler ["Ended", { + [""] call FUNC(saveHotState); +}]; + +addMissionEventHandler ["MPEnded", { + [""] call FUNC(saveHotState); +}]; diff --git a/arma/server/addons/main/XEH_preStart.sqf b/arma/server/addons/main/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/main/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/main/config.cpp b/arma/server/addons/main/config.cpp new file mode 100644 index 0000000..21acf8f --- /dev/null +++ b/arma/server/addons/main/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = CSTRING(url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "cba_main", + "ace_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgSettings.hpp" +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/main/functions/fnc_initStores.sqf b/arma/server/addons/main/functions/fnc_initStores.sqf new file mode 100644 index 0000000..fbed0dc --- /dev/null +++ b/arma/server/addons/main/functions/fnc_initStores.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" + +/* + * Author: J.Schmidt + * Initializes all stores in the correct order. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_server_main_fnc_initStores; + * + * Public: No + */ + +// Base +if (isNil QEGVAR(common,BaseStore)) then { call EFUNC(common,baseStore); }; +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; + +// Actor +if (isNil QEGVAR(actor,ActorStore)) then { call EFUNC(actor,initActorStore); }; + +// Bank +if (isNil QEGVAR(bank,BankSessionManager)) then { call EFUNC(bank,initSessionManager); }; +if (isNil QEGVAR(bank,BankMessenger)) then { call EFUNC(bank,initMessenger); }; +if (isNil QEGVAR(bank,BankModel)) then { call EFUNC(bank,initModel); }; +if (isNil QEGVAR(bank,BankPayloadBuilder)) then { call EFUNC(bank,initPayloadBuilder); }; +if (isNil QEGVAR(bank,BankStore)) then { call EFUNC(bank,initBankStore); }; + +// Garage +if (isNil QEGVAR(garage,GarageStore)) then { call EFUNC(garage,initGarageStore); }; + +// VGarage +if (isNil QEGVAR(garage,VGarageStore)) then { call EFUNC(garage,initVGStore); }; + +// Locker +if (isNil QEGVAR(locker,LockerStore)) then { call EFUNC(locker,initLockerStore); }; + +// VArsenal +if (isNil QEGVAR(locker,VAStore)) then { call EFUNC(locker,initVAStore); }; + +// Org +if (isNil QEGVAR(org,OrgPayloadBuilder)) then { call EFUNC(org,initPayloadBuilder); }; +if (isNil QEGVAR(org,OrgStore)) then { call EFUNC(org,initOrgStore); }; + +// Store +if (isNil QEGVAR(store,StorefrontStore)) then { call EFUNC(store,initStorefrontStore); }; + +// Validation Harness +if (isNil QGVAR(ValidationHarness)) then { call FUNC(initValidationHarness); }; diff --git a/arma/server/addons/main/functions/fnc_initValidationHarness.sqf b/arma/server/addons/main/functions/fnc_initValidationHarness.sqf new file mode 100644 index 0000000..26cb19a --- /dev/null +++ b/arma/server/addons/main/functions/fnc_initValidationHarness.sqf @@ -0,0 +1,213 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the server-side validation harness for targeted runtime smoke + * checks around high-risk multi-module flows. + * + * Arguments: + * None + * + * Return Value: + * Validation harness object + * + * Example: + * call forge_server_main_fnc_initValidationHarness; + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ValidationHarness) = createHashMapObject [[ + ["#type", "ValidationHarness"], + ["buildResult", compileFinal { + params [ + ["_action", "", [""]], + ["_success", false, [false]], + ["_message", "", [""]], + ["_data", createHashMap, [createHashMap]] + ]; + + createHashMapFromArray [ + ["action", _action], + ["success", _success], + ["message", _message], + ["data", _data] + ] + }], + ["logResult", compileFinal { + params [["_result", createHashMap, [createHashMap]]]; + + if (_result isEqualTo createHashMap) exitWith { _result }; + + private _level = ["WARNING", "INFO"] select (_result getOrDefault ["success", false]); + private _action = _result getOrDefault ["action", "validation"]; + private _message = _result getOrDefault ["message", ""]; + [_level, format ["Validation harness '%1': %2", _action, _message]] call EFUNC(common,log); + + _result + }], + ["normalizeMapArg", compileFinal { + params [ + ["_value", createHashMap, [createHashMap, ""]], + ["_fallback", createHashMap, [createHashMap]] + ]; + + if (_value isEqualType createHashMap) exitWith { +_value }; + if !(_value isEqualType "") exitWith { +_fallback }; + if (_value isEqualTo "") exitWith { +_fallback }; + + private _parsed = fromJSON _value; + if !(_parsed isEqualType createHashMap) exitWith { +_fallback }; + + _parsed + }], + ["run", compileFinal { + params [["_action", "", [""]], ["_arguments", [], [[]]]]; + + private _actionLower = toLowerANSI _action; + if (_actionLower isEqualTo "") exitWith { + _self call ["logResult", [_self call ["buildResult", ["unknown", false, "A validation action is required.", createHashMap]]]] + }; + + switch (_actionLower) do { + case "save_hot_state": { + _arguments params [["_uid", "", [""]]]; + + private _success = [_uid] call FUNC(saveHotState); + private _message = [ + format ["Hot-state save failed for '%1'.", _uid], + format ["Hot-state save completed for '%1'.", [_uid, "all hot state"] select (_uid isEqualTo "")] + ] select _success; + + _self call ["logResult", [_self call ["buildResult", [ + _actionLower, + _success, + _message, + createHashMapFromArray [["uid", _uid]] + ]]]] + }; + case "store_checkout": { + _arguments params [["_uid", "", [""]], ["_payload", createHashMap, [createHashMap, ""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_uid isEqualTo "" || { isNull _player }) exitWith { + _self call ["logResult", [_self call ["buildResult", [_actionLower, false, "A valid online player UID is required for store checkout validation.", createHashMap]]]] + }; + + private _payloadMap = _self call ["normalizeMapArg", [_payload, createHashMap]]; + if (_payloadMap isEqualTo createHashMap) exitWith { + _self call ["logResult", [_self call ["buildResult", [_actionLower, false, "Store checkout validation payload was invalid.", createHashMap]]]] + }; + + private _result = EGVAR(store,StorefrontStore) call ["checkout", [_uid, _player, toJSON _payloadMap]]; + private _success = _result getOrDefault ["success", false]; + private _message = _result getOrDefault ["message", "Store checkout validation completed."]; + + _self call ["logResult", [_self call ["buildResult", [_actionLower, _success, _message, _result]]]] + }; + case "org_assign_credit_line": { + _arguments params [ + ["_requesterUid", "", [""]], + ["_memberUid", "", [""]], + ["_memberName", "", [""]], + ["_amount", 0, [0]] + ]; + + private _result = EGVAR(org,OrgStore) call ["assignCreditLine", [_requesterUid, _memberUid, _memberName, _amount]]; + private _success = _result getOrDefault ["success", false]; + private _message = _result getOrDefault ["message", "Credit line validation completed."]; + + _self call ["logResult", [_self call ["buildResult", [_actionLower, _success, _message, _result]]]] + }; + case "bank_credit_repayment": { + _arguments params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "") exitWith { + _self call ["logResult", [_self call ["buildResult", [_actionLower, false, "A valid UID is required for bank credit repayment validation.", createHashMap]]]] + }; + + private _beforeAccount = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + private _beforeOrgState = EGVAR(bank,BankPayloadBuilder) call ["resolveOrgState", [_uid]]; + private _success = EGVAR(bank,BankStore) call ["repayCreditLine", [_uid, _amount]]; + private _afterAccount = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + private _afterOrgState = EGVAR(bank,BankPayloadBuilder) call ["resolveOrgState", [_uid]]; + + private _message = [ + format ["Bank credit repayment validation failed for %1.", _uid], + format ["Bank credit repayment validation completed for %1.", _uid] + ] select _success; + + _self call ["logResult", [_self call ["buildResult", [ + _actionLower, + _success, + _message, + createHashMapFromArray [ + ["beforeAccount", _beforeAccount], + ["afterAccount", _afterAccount], + ["beforeOrgState", _beforeOrgState], + ["afterOrgState", _afterOrgState] + ] + ]]]] + }; + case "task_reward_context": { + _arguments params [["_taskID", "", [""]]]; + + private _context = EGVAR(task,TaskStore) call ["resolveRewardContext", [_taskID]]; + private _success = _taskID isNotEqualTo "" && { (_context getOrDefault ["orgID", ""]) isNotEqualTo "" }; + private _message = [ + format ["No reward context was available for task %1.", _taskID], + format ["Resolved reward context for task %1.", _taskID] + ] select _success; + + _self call ["logResult", [_self call ["buildResult", [_actionLower, _success, _message, _context]]]] + }; + case "task_apply_rating": { + _arguments params [["_taskID", "", [""]], ["_delta", 0, [0]]]; + + private _result = EGVAR(task,TaskStore) call ["applyRatingOutcome", [_taskID, _delta]]; + private _success = _result getOrDefault ["success", true]; + private _message = [ + _result getOrDefault ["message", format ["Task rating validation failed for %1.", _taskID]], + format ["Task rating validation completed for %1.", _taskID] + ] select _success; + + _self call ["logResult", [_self call ["buildResult", [_actionLower, _success, _message, _result]]]] + }; + case "task_apply_rewards": { + _arguments params [["_taskID", "", [""]], ["_rewards", createHashMap, [createHashMap, ""]]]; + + private _rewardsMap = _self call ["normalizeMapArg", [_rewards, createHashMap]]; + if (_taskID isEqualTo "" || { _rewardsMap isEqualTo createHashMap }) exitWith { + _self call ["logResult", [_self call ["buildResult", [_actionLower, false, "Task reward validation requires a task ID and reward payload.", createHashMap]]]] + }; + + private _rewardContext = EGVAR(task,TaskStore) call ["resolveRewardContext", [_taskID]]; + private _beforeOrg = EGVAR(org,OrgStore) call ["loadById", [_rewardContext getOrDefault ["orgID", ""]]]; + private _success = [_taskID, _rewardsMap] call EFUNC(task,handleTaskRewards); + private _afterOrg = EGVAR(org,OrgStore) call ["loadById", [_rewardContext getOrDefault ["orgID", ""]]]; + + private _message = [ + format ["Task reward validation failed for %1.", _taskID], + format ["Task reward validation completed for %1.", _taskID] + ] select _success; + + _self call ["logResult", [_self call ["buildResult", [ + _actionLower, + _success, + _message, + createHashMapFromArray [ + ["rewardContext", _rewardContext], + ["beforeOrg", _beforeOrg], + ["afterOrg", _afterOrg] + ] + ]]]] + }; + default { + _self call ["logResult", [_self call ["buildResult", [_actionLower, false, format ["Unknown validation action '%1'.", _actionLower], createHashMap]]]] + }; + }; + }] +]]; + +GVAR(ValidationHarness) diff --git a/arma/server/addons/main/functions/fnc_playerGroup2Server.sqf b/arma/server/addons/main/functions/fnc_playerGroup2Server.sqf new file mode 100644 index 0000000..b3bb562 --- /dev/null +++ b/arma/server/addons/main/functions/fnc_playerGroup2Server.sqf @@ -0,0 +1,10 @@ +#include "..\script_component.hpp" + +params [["_ip", "127.0.0.1", [""]], ["_port", "2312", [""]], ["_password", "abc", [""]]]; + +private _units = units group player select { isPlayer _x }; +private _machineIDs = _units apply { owner _x }; + +{ + [_ip, _port, _password] remoteExecCall ["forge_server_misc_fnc_redirectClient2Server", _x]; +} forEach _machineIDs; diff --git a/arma/server/addons/main/functions/fnc_redirectClient2Server.sqf b/arma/server/addons/main/functions/fnc_redirectClient2Server.sqf new file mode 100644 index 0000000..d35c5c1 --- /dev/null +++ b/arma/server/addons/main/functions/fnc_redirectClient2Server.sqf @@ -0,0 +1,73 @@ +#include "..\script_component.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" + +// Enable Client to Server Travel +if (isServer || !(isRemoteExecuted && remoteExecutedOwner isEqualTo 2)) exitWith { diag_log "Must be remote executed from dedicated server" }; + +params [["_IP", "127.0.0.1", [""]], ["_PORT", "2302", [""]], ["_PASS", "", [""]], ["_TIMEOUT", 30, [0]]]; + +_this resize 0; + +onEachFrame format [ +" + private _allDisplays = allDisplays select [ + allDisplays find findDisplay %5, + count allDisplays + ]; + reverse _allDisplays; + { _x closeDisplay %4 } forEach _allDisplays; + + onEachFrame { + findDisplay %6 closeDisplay %4; + findDisplay %7 closeDisplay %4; + + onEachFrame { + ctrlActivate (findDisplay %8 displayCtrl %9); + + onEachFrame { + private _ctrlServerAddress = findDisplay %10 displayCtrl 2300; + _ctrlServerAddress controlsGroupCtrl %11 ctrlSetText ""%1""; + _ctrlServerAddress controlsGroupCtrl %12 ctrlSetText ""%2""; + ctrlActivate (_ctrlServerAddress controlsGroupCtrl %14); + + onEachFrame { + findDisplay %8 displayCtrl %13 lbData 0 call { + if (diag_tickTime > %18) then { + diag_log ""RCTS Timeout (no server)""; + onEachFrame {}; + }; + + if (_this isEqualTo ""%1:%2"") then { + findDisplay %8 displayCtrl %13 lbSetCurSel 0; + + onEachFrame { + ctrlActivate (findDisplay %8 displayCtrl %15); + + onEachFrame { + if (diag_tickTime > %18) then { + diag_log ""RCTS Timeout (cannot join)""; + onEachFrame {}; + }; + + if (!isNull findDisplay %16) then { + private _ctrlPassword = findDisplay %16 displayCtrl %17; + _ctrlPassword ctrlSetTextColor [0,0,0,0]; + _ctrlPassword ctrlSetText ""%3""; + ctrlActivate (findDisplay %16 displayCtrl %14); + }; + + if (getClientStateNumber >= 3) then { + diag_log ""RCTS Success""; + onEachFrame {}; + }; + }; + }; + }; + }; + }; + }; + }; + }; +", _IP, _PORT, _PASS, IDC_CANCEL, IDD_MISSION, IDD_DEBRIEFING, IDD_MP_SETUP, IDD_MULTIPLAYER, +IDC_MULTI_TAB_DIRECT_CONNECT, IDD_IP_ADDRESS, IDC_IP_ADDRESS, IDC_IP_PORT, IDC_MULTI_SESSIONS, +IDC_OK, IDC_MULTI_JOIN, IDD_PASSWORD, IDC_PASSWORD, diag_tickTime + _TIMEOUT]; diff --git a/arma/server/addons/main/functions/fnc_saveHotState.sqf b/arma/server/addons/main/functions/fnc_saveHotState.sqf new file mode 100644 index 0000000..dc819da --- /dev/null +++ b/arma/server/addons/main/functions/fnc_saveHotState.sqf @@ -0,0 +1,84 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_saveHotState.sqf + * Author: IDSolutions + * Date: 2026-04-01 + * Public: No + * + * Description: + * Flushes extension-backed hot state for a single UID or every known UID. + * + * Arguments: + * 0: UID to flush. Empty string flushes all known players. + * + * Return Value: + * True if the flush routine completed. + */ + +params [["_uid", "", [""]]]; + +private _uids = []; +if (_uid isEqualTo "") then { + { + if (isNull _x) then { continue; }; + private _playerUid = getPlayerUID _x; + if (_playerUid isNotEqualTo "") then { + _uids pushBackUnique _playerUid; + }; + } forEach allPlayers; + + if !(isNil QEGVAR(actor,ActorStore)) then { + { + if (_x isNotEqualTo "") then { + _uids pushBackUnique _x; + }; + } forEach (EGVAR(actor,ActorStore) call ["listHotUids", []]); + }; +} else { + _uids pushBack _uid; +}; + +{ + private _flushUid = _x; + if (_flushUid isEqualTo "") then { continue; }; + + private _orgID = "default"; + if !(isNil QEGVAR(org,OrgStore)) then { + _orgID = EGVAR(org,OrgStore) call ["resolveOrgIdForUid", [_flushUid]]; + if (_orgID isEqualTo "") then { + _orgID = "default"; + }; + }; + + if !(isNil QEGVAR(actor,ActorStore)) then { + EGVAR(actor,ActorStore) call ["snapshot", [_flushUid]]; + EGVAR(actor,ActorStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(bank,BankStore)) then { + EGVAR(bank,BankStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(locker,LockerStore)) then { + EGVAR(locker,LockerStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(locker,VAStore)) then { + EGVAR(locker,VAStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(garage,GarageStore)) then { + EGVAR(garage,GarageStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(garage,VGarageStore)) then { + EGVAR(garage,VGarageStore) call ["save", [_flushUid]]; + }; + + if !(isNil QEGVAR(org,OrgStore)) then { + EGVAR(org,OrgStore) call ["saveById", [_orgID]]; + }; +} forEach _uids; + +true diff --git a/arma/server/addons/main/script_component.hpp b/arma/server/addons/main/script_component.hpp new file mode 100644 index 0000000..32d193a --- /dev/null +++ b/arma/server/addons/main/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT main +#define COMPONENT_BEAUTIFIED Main +#include "script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "script_macros.hpp" diff --git a/arma/server/addons/main/script_macros.hpp b/arma/server/addons/main/script_macros.hpp new file mode 100644 index 0000000..44efa49 --- /dev/null +++ b/arma/server/addons/main/script_macros.hpp @@ -0,0 +1,164 @@ +// Global toggles for caching/logging +// #define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +#define DEBUG_SYNCHRONOUS + +#include "\x\cba\addons\main\script_macros_common.hpp" +#include "\x\cba\addons\xeh\script_xeh.hpp" + +// Functions +#define AFUNC(var1,var2) TRIPLES(DOUBLES(ace,var1),fnc,var2) +#define BFUNC(var1) TRIPLES(BIS,fnc,var1) +#define CFUNC(var1) TRIPLES(CBA,fnc,var1) + +// Remote Procedure Calls +#define CRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_client,var1),var2)) +#define SRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_server,var1),var2)) + +#define CLASS(var1) DOUBLES(PREFIX,var1) +#define QCLASS(var1) QUOTE(DOUBLES(PREFIX,var1)) + +#define QQUOTE(var1) QUOTE(QUOTE(var1)) + +// QPATHTOF but without a leading slash +#define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\var1 +#define QPATHTOF2(var1) QUOTE(PATHTOF2(var1)) + +#ifdef SUBCOMPONENT + #define SUBADDON DOUBLES(ADDON,SUBCOMPONENT) + + // Update PATHTO macros to point to subaddon instead + #undef PATHTO + #define PATHTO(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF + #define PATHTOF(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 + #undef PATHTO2 + #define PATHTO2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF2 + #define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 +#endif + +#undef PREP +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {call FUNC(x)} + #define PREP(fncName) FUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) + #define PREP_SUBDIR(dir,fncName) FUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\dir\DOUBLES(fnc,fncName).sqf) + #define PREP_RECOMPILE_START if (isNil "forge_server_fnc_recompile") then {forge_server_recompiles = []; forge_server_fnc_recompile = {{call _x} forEach forge_server_recompiles;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; forge_server_recompiles pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction + #define PREP_SUBDIR(dir,fncName) [QPATHTOF(functions\dir\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + +#define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] +#define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] +#define SETPVAR_SYS(var1,var2) setVariable [ARR_3(QUOTE(var1),var2,true)] + +#undef GETVAR +#define GETVAR(var1,var2,var3) (var1 GETVAR_SYS(var2,var3)) +#define GETMVAR(var1,var2) (missionNamespace GETVAR_SYS(var1,var2)) +#define GETUVAR(var1,var2) (uiNamespace GETVAR_SYS(var1,var2)) +#define GETPRVAR(var1,var2) (profileNamespace GETVAR_SYS(var1,var2)) +#define GETPAVAR(var1,var2) (parsingNamespace GETVAR_SYS(var1,var2)) + +#undef SETVAR +#define SETVAR(var1,var2,var3) var1 SETVAR_SYS(var2,var3) +#define SETPVAR(var1,var2,var3) var1 SETPVAR_SYS(var2,var3) +#define SETMVAR(var1,var2) missionNamespace SETVAR_SYS(var1,var2) +#define SETUVAR(var1,var2) uiNamespace SETVAR_SYS(var1,var2) +#define SETPRVAR(var1,var2) profileNamespace SETVAR_SYS(var1,var2) +#define SETPAVAR(var1,var2) parsingNamespace SETVAR_SYS(var1,var2) + +#define GETGVAR(var1,var2) GETMVAR(GVAR(var1),var2) +#define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) + +// Extension +#define EXT "forge_server" + +#define EXTCALL(function,args) private _ext_res = EXT callExtension [function, args]; \ +if ((_ext_res select 1) != 0) then { \ + ERROR_2("Error calling %1: %2",function,(_ext_res select 1)); \ + ERROR_1("ARGS: %1",args); \ +} + +#define EXTFUNC(function) EXTCALL(function,[]) + +#define WEAP_XX(WEAP, COUNT) class DOUBLES(_xx,WEAP) { \ + weapon = QUOTE(WEAP); \ + count = COUNT; \ +} + +#define MAG_XX(MAG, COUNT) class DOUBLES(_xx,MAG) { \ + magazine = QUOTE(MAG); \ + count = COUNT; \ +} + +#define ITEM_XX(ITEM, COUNT) class DOUBLES(_xx,ITEM) { \ + name = QUOTE(ITEM); \ + count = COUNT; \ +} + +// ACE Cargo +#define CARGO_XX(ITEM, COUNT) class ITEM { \ + type = QUOTE(ITEM); \ + amount = COUNT; \ +} + +#define MAG_CSW(var1,var2) class DOUBLES(var1,csw): var1 { \ + scope = var2; \ + type = TYPE_MAGAZINE_PRIMARY_AND_THROW; \ +} + +// Debug textures, mainly for testing hiddenSelections +#define DBUG_TEX_RED "#(rgb,8,8,3)color(1,0,0,1)" +#define DBUG_TEX_GRN "#(rgb,8,8,3)color(0,1,0,1)" +#define DBUG_TEX_BLU "#(rgb,8,8,3)color(0,0,1,1)" +#define DBUG_TEX_PUR "#(rgb,8,8,3)color(1,0,1,1)" +#define DBUG_TEX_YEL "#(rgb,8,8,3)color(1,1,0,1)" + +// Statements and conditions +#define CLAMP(var1,lower,upper) (lower max (var1 min upper)) + +// Weapon types +#define TYPE_WEAPON_PRIMARY 1 +#define TYPE_WEAPON_HANDGUN 2 +#define TYPE_WEAPON_SECONDARY 4 +// Magazine types +#define TYPE_MAGAZINE_HANDGUN_AND_GL 16 // mainly +#define TYPE_MAGAZINE_PRIMARY_AND_THROW 256 +#define TYPE_MAGAZINE_SECONDARY_AND_PUT 512 // mainly +#define TYPE_MAGAZINE_MISSILE 768 +// More types +#define TYPE_BINOCULAR_AND_NVG 4096 +#define TYPE_WEAPON_VEHICLE 65536 +#define TYPE_ITEM 131072 +// Item types +#define TYPE_DEFAULT 0 +#define TYPE_MUZZLE 101 +#define TYPE_OPTICS 201 +#define TYPE_FLASHLIGHT 301 +#define TYPE_BIPOD 302 +#define TYPE_FIRST_AID_KIT 401 +#define TYPE_FINS 501 // not implemented +#define TYPE_BREATHING_BOMB 601 // not implemented +#define TYPE_NVG 602 +#define TYPE_GOGGLE 603 +#define TYPE_SCUBA 604 // not implemented +#define TYPE_HEADGEAR 605 +#define TYPE_FACTOR 607 +#define TYPE_MAP 608 +#define TYPE_COMPASS 609 +#define TYPE_WATCH 610 +#define TYPE_RADIO 611 +#define TYPE_GPS 612 +#define TYPE_HMD 616 +#define TYPE_BINOCULAR 617 +#define TYPE_MEDIKIT 619 +#define TYPE_TOOLKIT 620 +#define TYPE_UAV_TERMINAL 621 +#define TYPE_VEST 701 +#define TYPE_UNIFORM 801 +#define TYPE_BACKPACK 901 diff --git a/arma/server/addons/main/script_mod.hpp b/arma/server/addons/main/script_mod.hpp new file mode 100644 index 0000000..475c6bf --- /dev/null +++ b/arma/server/addons/main/script_mod.hpp @@ -0,0 +1,26 @@ +#define MAINPREFIX forge +#define PREFIX forge_server +#define MOD_NAME forge-server +#define AUTHOR "J.Schmidt" + +#define REQUIRED_VERSION 2.20 +#define REQUIRED_CBA_VERSION {3,18,4} +#define REQUIRED_ACE_VERSION {3,20,0} + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCH.BUILD +#define VERSION_AR MAJOR,MINOR,PATCH,BUILD + +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif +#ifdef SUBCOMPONENT + #ifndef SUBCOMPONENT_BEAUTIFIED + #define SUBCOMPONENT_BEAUTIFIED SUBCOMPONENT + #endif + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED (SUBCOMPONENT_BEAUTIFIED)) +#else + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED) +#endif diff --git a/arma/server/addons/main/script_version.hpp b/arma/server/addons/main/script_version.hpp new file mode 100644 index 0000000..3e6aaab --- /dev/null +++ b/arma/server/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 1 +#define MINOR 0 +#define PATCH 0 +#define BUILD 0 diff --git a/arma/server/addons/main/stringtable.xml b/arma/server/addons/main/stringtable.xml new file mode 100644 index 0000000..c40749d --- /dev/null +++ b/arma/server/addons/main/stringtable.xml @@ -0,0 +1,24 @@ + + + + + Main + + + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + + + diff --git a/arma/server/addons/org/$PBOPREFIX$ b/arma/server/addons/org/$PBOPREFIX$ new file mode 100644 index 0000000..75b39af --- /dev/null +++ b/arma/server/addons/org/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\org diff --git a/arma/server/addons/org/CfgEventHandlers.hpp b/arma/server/addons/org/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/org/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/org/README.md b/arma/server/addons/org/README.md new file mode 100644 index 0000000..bd0316a --- /dev/null +++ b/arma/server/addons/org/README.md @@ -0,0 +1,45 @@ +# Forge Server Organization + +## Overview +The organization addon is the server-side bridge for player organizations, +membership, treasury funds, reputation, credit lines, shared assets, fleet +entries, and invitations. + +Organization hot state is owned by the extension. SQF coordinates Arma-facing +events, UI payloads, membership syncs, and integration with actor, bank, store, +and task flows. + +Organization registration charges a $50,000 personal funds fee before the +player is assigned to the new organization. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for organization extension calls +- `forge_server_actor` at runtime for organization membership lookups +- `forge_client_org` and `forge_client_notifications` for response RPCs + +## Main Components +- `fnc_initOrgStore.sqf` initializes `OrgModel` and `OrgStore`. +- `fnc_initPayloadBuilder.sqf` builds portal, organization, member, asset, and + fleet payloads. + +## Supported Operations +- initialize and hydrate organization portal data +- register, leave, and disband organizations +- invite, accept, and decline members +- assign and repay credit lines +- update funds and reputation +- grant assets and fleet vehicles +- save organization hot state + +## Runtime Notes +The addon ensures the `default` organization exists during store creation. +Task rewards and store checkout both rely on `OrgStore` for authoritative +organization-owned state. + +Organization syncs and notifications route through the event bus: +- `org.sync.requested` - client-facing organization patch and member updates +- `notification.requested` - alerts about funds, reputation, and membership changes + +These events are emitted and listened to by the notifications addon. diff --git a/arma/server/addons/org/XEH_PREP.hpp b/arma/server/addons/org/XEH_PREP.hpp new file mode 100644 index 0000000..6a5b9f9 --- /dev/null +++ b/arma/server/addons/org/XEH_PREP.hpp @@ -0,0 +1,2 @@ +PREP(initPayloadBuilder); +PREP(initOrgStore); diff --git a/arma/server/addons/org/XEH_postInit.sqf b/arma/server/addons/org/XEH_postInit.sqf new file mode 100644 index 0000000..2a74f25 --- /dev/null +++ b/arma/server/addons/org/XEH_postInit.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(SyncEventTokens)) then { + private _sendOrgSync = { + params ["_event"]; + + private _patch = _event getOrDefault ["patch", createHashMap]; + private _memberUids = +(_event getOrDefault ["memberUids", []]); + + if (_memberUids isEqualTo []) exitWith {}; + + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(org,responseSyncOrg), [_patch], _player] call CFUNC(targetEvent); + } forEach _memberUids; + }; + + GVAR(SyncEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["org.sync.requested", _sendOrgSync, "org.sync"]] + ]; +}; diff --git a/arma/server/addons/org/XEH_preInit.sqf b/arma/server/addons/org/XEH_preInit.sqf new file mode 100644 index 0000000..933f557 --- /dev/null +++ b/arma/server/addons/org/XEH_preInit.sqf @@ -0,0 +1,378 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +GVAR(RequestOrgSync) = { + params [["_memberUids", [], [[]]], ["_patch", createHashMap, [createHashMap]]]; + + if (_memberUids isEqualTo []) exitWith {}; + + if (isNil QEGVAR(common,EventBus)) exitWith { + { + private _memberPlayer = [_x] call EFUNC(common,getPlayer); + if (_memberPlayer isNotEqualTo objNull) then { + [CRPC(org,responseSyncOrg), [_patch], _memberPlayer] call CFUNC(targetEvent); + }; + } forEach _memberUids; + }; + + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["memberUids", +_memberUids], + ["patch", +_patch] + ], + createHashMapFromArray [["source", "org"]] + ]]; +}; + +GVAR(RequestNotification) = { + params [ + ["_uids", [], [[]]], + ["_type", "info", [""]], + ["_title", "", [""]], + ["_message", "", [""]], + ["_duration", -1, [0]] + ]; + + if (_uids isEqualTo [] || { _message isEqualTo "" }) exitWith {}; + + if (isNil QEGVAR(common,EventBus)) exitWith { + private _params = [_type, _title, _message]; + if (_duration >= 0) then { _params pushBack _duration; }; + { + private _player = [_x] call EFUNC(common,getPlayer); + if (_player isNotEqualTo objNull) then { + [CRPC(notifications,recieveNotification), _params, _player] call CFUNC(targetEvent); + }; + } forEach _uids; + }; + + private _payload = createHashMapFromArray [ + ["uids", +_uids], + ["notificationType", _type], + ["title", _title], + ["message", _message] + ]; + if (_duration >= 0) then { _payload set ["duration", _duration]; }; + + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + _payload, + createHashMapFromArray [["source", "org"]] + ]]; +}; + +[QGVAR(requestInitOrg), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + + GVAR(OrgStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestHydrateOrg), { + params [["_uid", "", [""]], ["_bridgeEvent", "org::sync", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + + if !(_bridgeEvent in ["org::login::success", "org::create::success", "org::sync"]) then { + _bridgeEvent = "org::sync"; + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _payload = GVAR(OrgStore) call ["buildPortalPayload", [_uid]]; + if (_payload isEqualTo createHashMap) exitWith {}; + + [CRPC(org,responseHydrateOrg), [_payload, _bridgeEvent], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestCreateOrg), { + params [["_uid", "", [""]], ["_orgName", "", [""]]]; + + if (_uid isEqualTo "" || { _orgName isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Org] Empty/Invalid UID or Organization Name!" + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _result = GVAR(OrgStore) call ["register", [_uid, _orgName]]; + + if (_result getOrDefault ["success", false]) then { + private _actorPatch = _result getOrDefault ["actorPatch", createHashMap]; + if (_actorPatch isNotEqualTo createHashMap) then { + [CRPC(actor,responseSyncActor), [_actorPatch], _player] call CFUNC(targetEvent); + }; + }; + + [CRPC(org,responseCreateOrg), [_result], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestAssignCreditLine), { + params [ + ["_uid", "", [""]], + ["_memberUid", "", [""]], + ["_memberName", "", [""]], + ["_amount", 0, [0]] + ]; + + if (_uid isEqualTo "" || { _memberUid isEqualTo "" } || { _amount <= 0 }) exitWith { + diag_log "[FORGE:Server:Org] Invalid credit line request payload!" + }; + + private _requester = [_uid] call EFUNC(common,getPlayer); + if (_requester isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["assignCreditLine", [_uid, _memberUid, _memberName, _amount]]; + if (_result getOrDefault ["success", false]) then { + private _patch = _result getOrDefault ["patch", createHashMap]; + + if (_patch isNotEqualTo createHashMap) then { + [_result getOrDefault ["memberUids", []], _patch] call GVAR(RequestOrgSync); + }; + }; + + [CRPC(org,responseCreditLine), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to assign credit line."]] + ]], _requester] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestPayroll), { + params [ + ["_uid", "", [""]], + ["_amount", 0, [0]] + ]; + + if (_uid isEqualTo "" || { _amount <= 0 }) exitWith { + diag_log "[FORGE:Server:Org] Invalid payroll request payload!" + }; + + private _requester = [_uid] call EFUNC(common,getPlayer); + if (_requester isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["runPayroll", [_uid, _amount]]; + if (_result getOrDefault ["success", false]) then { + private _syncTargets = +(_result getOrDefault ["memberUids", []]); + _syncTargets pushBackUnique _uid; + [_syncTargets, createHashMap] call GVAR(RequestOrgSync); + }; + + [CRPC(org,responseTreasuryAction), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to run payroll."]] + ]], _requester] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestTreasuryTransfer), { + params [ + ["_uid", "", [""]], + ["_memberUid", "", [""]], + ["_memberName", "", [""]], + ["_amount", 0, [0]] + ]; + + if (_uid isEqualTo "" || { _memberUid isEqualTo "" } || { _amount <= 0 }) exitWith { + diag_log "[FORGE:Server:Org] Invalid treasury transfer request payload!" + }; + + private _requester = [_uid] call EFUNC(common,getPlayer); + if (_requester isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["transferFunds", [_uid, _memberUid, _memberName, _amount]]; + if (_result getOrDefault ["success", false]) then { + private _syncTargets = +(_result getOrDefault ["memberUids", []]); + _syncTargets pushBackUnique _uid; + [_syncTargets, createHashMap] call GVAR(RequestOrgSync); + }; + + [CRPC(org,responseTreasuryAction), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to send funds."]] + ]], _requester] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestInviteOrgMember), { + params [["_uid", "", [""]], ["_targetUid", "", [""]], ["_targetName", "", [""]]]; + + if (_uid isEqualTo "" || { _targetUid isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Org] Invalid org invite request payload!" + }; + + private _requester = [_uid] call EFUNC(common,getPlayer); + if (_requester isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["inviteMember", [_uid, _targetUid, _targetName]]; + if (_result getOrDefault ["success", false]) then { + private _resolvedTargetUid = _result getOrDefault ["targetUid", _targetUid]; + [[_uid, _resolvedTargetUid], createHashMap] call GVAR(RequestOrgSync); + [[_resolvedTargetUid], "info", "Organization Invite", "You received an organization invite. Open the organization portal to accept or decline it.", 7000] call GVAR(RequestNotification); + }; + + [CRPC(org,responseInviteOrg), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to send organization invite."]] + ]], _requester] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestAcceptOrgInvite), { + params [["_uid", "", [""]], ["_orgID", "", [""]]]; + + if (_uid isEqualTo "" || { _orgID isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Org] Invalid accept invite request payload!" + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["acceptInvite", [_uid, _orgID]]; + if (_result getOrDefault ["success", false]) then { + private _actorPatch = _result getOrDefault ["actorPatch", createHashMap]; + if (_actorPatch isNotEqualTo createHashMap) then { + [CRPC(actor,responseSyncActor), [_actorPatch], _player] call CFUNC(targetEvent); + }; + + private _syncTargets = [_uid]; + { + private _orgData = GVAR(OrgStore) call ["loadById", [_x]]; + if !(_orgData isEqualType createHashMap) then { continue; }; + + { + private _memberUid = _y getOrDefault ["uid", ""]; + if (_memberUid isNotEqualTo "") then { + _syncTargets pushBackUnique _memberUid; + }; + } forEach (_orgData getOrDefault ["members", createHashMap]); + } forEach (_result getOrDefault ["affectedOrgIds", []]); + + [_syncTargets, createHashMap] call GVAR(RequestOrgSync); + }; + + [CRPC(org,responseInviteDecision), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to accept organization invite."]], + ["action", "accept"] + ]], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestDeclineOrgInvite), { + params [["_uid", "", [""]], ["_orgID", "", [""]]]; + + if (_uid isEqualTo "" || { _orgID isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Org] Invalid decline invite request payload!" + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["declineInvite", [_uid, _orgID]]; + if (_result getOrDefault ["success", false]) then { + private _syncTargets = [_uid]; + { + private _orgData = GVAR(OrgStore) call ["loadById", [_x]]; + if !(_orgData isEqualType createHashMap) then { continue; }; + + { + private _memberUid = _y getOrDefault ["uid", ""]; + if (_memberUid isNotEqualTo "") then { + _syncTargets pushBackUnique _memberUid; + }; + } forEach (_orgData getOrDefault ["members", createHashMap]); + } forEach (_result getOrDefault ["affectedOrgIds", []]); + + [_syncTargets, createHashMap] call GVAR(RequestOrgSync); + }; + + [CRPC(org,responseInviteDecision), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to decline organization invite."]], + ["action", "decline"] + ]], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestLeaveOrg), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Org] Empty/Invalid UID for leave request!" + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["leave", [_uid]]; + if (_result getOrDefault ["success", false]) then { + private _actorPatch = _result getOrDefault ["actorPatch", createHashMap]; + if (_actorPatch isNotEqualTo createHashMap) then { + [CRPC(actor,responseSyncActor), [_actorPatch], _player] call CFUNC(targetEvent); + }; + + GVAR(OrgStore) call ["init", [_uid]]; + + private _notificationParams = _result getOrDefault ["notification", []]; + if (_notificationParams isEqualType [] && { count _notificationParams > 0 }) then { + private _duration = if ((count _notificationParams) > 3) then { _notificationParams # 3 } else { -1 }; + [[_uid], _notificationParams # 0, _notificationParams # 1, _notificationParams # 2, _duration] call GVAR(RequestNotification); + }; + }; + + [CRPC(org,responseLeaveOrg), [createHashMapFromArray [ + ["success", _result getOrDefault ["success", false]], + ["message", _result getOrDefault ["message", "Unable to leave the organization."]] + ]], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestDisbandOrg), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Org] Empty/Invalid UID for disband request!" + }; + + private _requester = [_uid] call EFUNC(common,getPlayer); + if (_requester isEqualTo objNull) exitWith {}; + + private _result = GVAR(OrgStore) call ["disband", [_uid]]; + if !(_result getOrDefault ["success", false]) exitWith { + [CRPC(org,responseDisbandOrg), [createHashMapFromArray [ + ["success", false], + ["message", _result getOrDefault ["message", "Failed to disband organization."]], + ["requester", true] + ]], _requester] call CFUNC(targetEvent); + }; + + { + [_x, _result] call { + params [["_member", createHashMap, [createHashMap]], ["_disbandResult", createHashMap, [createHashMap]]]; + + private _memberUid = _member getOrDefault ["uid", ""]; + if (_memberUid isEqualTo "") exitWith {}; + + private _memberPlayer = [_memberUid] call EFUNC(common,getPlayer); + if (_memberPlayer isEqualTo objNull) exitWith {}; + + private _actorPatch = _member getOrDefault ["actorPatch", createHashMap]; + if (_actorPatch isNotEqualTo createHashMap) then { + [CRPC(actor,responseSyncActor), [_actorPatch], _memberPlayer] call CFUNC(targetEvent); + }; + + GVAR(OrgStore) call ["init", [_memberUid]]; + [CRPC(org,responseDisbandOrg), [createHashMapFromArray [ + ["success", true], + ["message", _member getOrDefault ["message", _disbandResult getOrDefault ["message", "Organization disbanded."]]], + ["requester", _member getOrDefault ["requester", false]] + ]], _memberPlayer] call CFUNC(targetEvent); + + private _notificationParams = _member getOrDefault ["notification", []]; + if (_notificationParams isEqualType [] && { count _notificationParams > 0 }) then { + private _duration = if ((count _notificationParams) > 3) then { _notificationParams # 3 } else { -1 }; + [[_memberUid], _notificationParams # 0, _notificationParams # 1, _notificationParams # 2, _duration] call GVAR(RequestNotification); + }; + }; + } forEach (_result getOrDefault ["members", []]); +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/org/XEH_preStart.sqf b/arma/server/addons/org/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/org/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/org/config.cpp b/arma/server/addons/org/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/org/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/org/functions/fnc_initOrgStore.sqf b/arma/server/addons/org/functions/fnc_initOrgStore.sqf new file mode 100644 index 0000000..46c851d --- /dev/null +++ b/arma/server/addons/org/functions/fnc_initOrgStore.sqf @@ -0,0 +1,1369 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initOrgStore.sqf + * Author: IDSolutions + * Date: 2026-02-13 + * Last Update: 2026-05-15 + * Public: Yes + * + * Description: + * Initializes the org store for managing player organizations. + * Org hot state is owned by the extension; SQF acts as the bridge for + * treasury charges, credit lines, and service debt recording. + * + * Arguments: + * None + * + * Return Value: + * Org store object [HASHMAP OBJECT] + * + * Examples: + * call forge_server_org_fnc_initOrgStore + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(OrgModel) = compileFinal createHashMapObject [[ + ["#type", "OrgModel"], + ["defaults", compileFinal { + private _org = createHashMap; + + _org set ["id", ""]; + _org set ["owner", ""]; + _org set ["name", ""]; + _org set ["funds", 0]; + _org set ["reputation", 0]; + _org set ["credit_lines", createHashMap]; + _org set ["assets", createHashMap]; + _org set ["fleet", createHashMap]; + _org set ["members", createHashMap]; + _org set ["pending_invites", createHashMap]; + + _org + }], + ["migrate", compileFinal { + params [["_org", createHashMap, [createHashMap]]]; + + private _defaults = _self call ["defaults", []]; + { + if !(_x in _org) then { _org set [_x, _y]; }; + } forEach _defaults; + + private _assets = _org getOrDefault ["assets", createHashMap]; + if !(_assets isEqualType createHashMap) then { + _assets = createHashMap; + }; + + private _migratedAssets = createHashMap; + { + private _categoryKey = _x; + private _value = _y; + + if (_value isEqualType createHashMap) then { + private _categoryMap = createHashMap; + + if (_categoryKey find ":" >= 0) then { + private _legacyAsset = +_value; + private _category = toLowerANSI (_legacyAsset getOrDefault ["type", "items"]); + private _className = _legacyAsset getOrDefault ["classname", ""]; + if (_className isNotEqualTo "") then { + _categoryMap = +(_migratedAssets getOrDefault [_category, createHashMap]); + _categoryMap set [_className, _legacyAsset]; + _migratedAssets set [_category, _categoryMap]; + }; + } else { + { + if (_y isEqualType createHashMap) then { + _categoryMap set [_x, +_y]; + }; + } forEach _value; + + _migratedAssets set [toLowerANSI _categoryKey, _categoryMap]; + }; + }; + } forEach _assets; + + _org set ["assets", _migratedAssets]; + + private _creditLines = _org getOrDefault ["credit_lines", createHashMap]; + if !(_creditLines isEqualType createHashMap) then { + _creditLines = createHashMap; + }; + + { + if !(_y isEqualType createHashMap) then { continue; }; + + private _line = +_y; + private _legacyAmount = _line getOrDefault ["amount", 0]; + private _approvedAmount = _line getOrDefault ["approved_amount", _legacyAmount]; + private _availableAmount = _line getOrDefault ["available_amount", _approvedAmount]; + private _outstandingPrincipal = _line getOrDefault ["outstanding_principal", 0]; + private _interestRate = _line getOrDefault ["interest_rate", 0.1]; + private _amountDue = _line getOrDefault ["amount_due", 0]; + + _line set ["uid", _line getOrDefault ["uid", _x]]; + _line set ["approved_amount", _approvedAmount]; + _line set ["available_amount", _availableAmount]; + _line set ["outstanding_principal", _outstandingPrincipal]; + _line set ["interest_rate", _interestRate]; + _line set ["amount_due", _amountDue]; + _line set ["amount", _availableAmount]; + _creditLines set [_x, _line]; + } forEach _creditLines; + + _org set ["credit_lines", _creditLines]; + + private _pendingInvites = _org getOrDefault ["pending_invites", createHashMap]; + if !(_pendingInvites isEqualType createHashMap) then { + _pendingInvites = createHashMap; + }; + + _org set ["pending_invites", _pendingInvites]; + + _org + }], + ["validate", compileFinal { + params [["_org", createHashMap, [createHashMap]]]; + + private _id = _org get "id"; + private _owner = _org get "owner"; + private _name = _org get "name"; + private _funds = _org get "funds"; + private _reputation = _org get "reputation"; + private _creditLines = _org getOrDefault ["credit_lines", createHashMap]; + + [_id, _owner, _name, _funds, _reputation, _creditLines] try { + if (_id isEqualTo "" || !(_id isEqualType "")) then { throw "Invalid ID!"; }; + if (_owner isEqualTo "" || !(_owner isEqualType "")) then { throw "Invalid Owner!"; }; + if (_name isEqualTo "" || !(_name isEqualType "")) then { throw "Invalid Name!"; }; + if (_funds isEqualTo 0 || !(_funds isEqualType 0)) then { throw "Invalid Funds!"; }; + if (_reputation isEqualTo 0 || !(_reputation isEqualType 0)) then { throw "Invalid Reputation!"; }; + if !(_creditLines isEqualType createHashMap) then { throw "Invalid Credit Lines!"; }; + } catch { + ["ERROR", format ["Failed to validate org %1!", _exception]] call EFUNC(common,log); + false + }; + + true + }] +]]; + +GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ + ["#base", EGVAR(common,BaseStore)], + ["#type", "OrgBaseStore"], + ["#create", compileFinal { + ["INFO", "Org Store Initialized!"] call EFUNC(common,log); + + ["org:exists", ["default"]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + ["ERROR", "Failed to check for default org!"] call EFUNC(common,log); + + private _defaultOrg = createHashMapFromArray [ + ["id", "default"], + ["owner", "server"], + ["name", "Forge Dynamics"], + ["funds", 200000], + ["reputation", 0], + ["credit_lines", createHashMap], + ["assets", createHashMap], + ["fleet", createHashMap], + ["members", createHashMap], + ["pending_invites", createHashMap] + ]; + _defaultOrg + }; + + if (_result != "true") then { + private _defaultOrg = createHashMapFromArray [ + ["id", "default"], + ["owner", "server"], + ["name", "Forge Dynamics"], + ["funds", 200000], + ["reputation", 0], + ["credit_lines", createHashMap], + ["assets", createHashMap], + ["fleet", createHashMap], + ["members", createHashMap], + ["pending_invites", createHashMap] + ]; + + private _defaultJson = _self call ["toJSON", [_defaultOrg]]; + ["org:create", ["default", _defaultJson]] call EFUNC(extension,extCall); + }; + + private _loadedDefaultOrg = _self call ["loadHotOrg", ["default", true]]; + if (_loadedDefaultOrg isEqualTo createHashMap) then { + _loadedDefaultOrg = createHashMapFromArray [ + ["id", "default"], + ["owner", "server"], + ["name", "Forge Dynamics"], + ["funds", 200000], + ["reputation", 0], + ["credit_lines", createHashMap], + ["assets", createHashMap], + ["fleet", createHashMap], + ["members", createHashMap], + ["pending_invites", createHashMap] + ]; + }; + + _loadedDefaultOrg + }], + ["callHotOrg", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Org extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + + _self call ["syncHotOrg", [_data]] + }], + ["callHotOrgEnvelope", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { createHashMap }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { createHashMap }; + if !(_result isEqualType "") exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Org extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + + if ("org" in _data) then { + private _syncedOrg = _self call ["syncHotOrg", [_data getOrDefault ["org", createHashMap]]]; + if (_syncedOrg isNotEqualTo createHashMap) then { + _data set ["org", _syncedOrg]; + }; + }; + + _data + }], + ["callHotOrgArray", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + if (_function isEqualTo "") exitWith { [] }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { [] }; + if !(_result isEqualType "") exitWith { [] }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Org extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + [] + }; + + private _data = fromJSON _result; + if !(_data isEqualType []) exitWith { [] }; + + _data + }], + ["syncHotOrg", compileFinal { + params [["_org", createHashMap, [createHashMap]]]; + + if !(_org isEqualType createHashMap) exitWith { createHashMap }; + + private _migratedOrg = GVAR(OrgModel) call ["migrate", [+_org]]; + private _orgID = _migratedOrg getOrDefault ["id", ""]; + if (_orgID isEqualTo "") exitWith { createHashMap }; + + _migratedOrg + }], + ["resolveOrgIdForUid", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { "default" }; + + EGVAR(actor,ActorStore) call ["getOrganization", [_uid]] + }], + ["resolveActorName", compileFinal { + params [["_uid", "", [""]], ["_player", objNull, [objNull]], ["_actor", createHashMap, [createHashMap]]]; + + private _memberName = _actor getOrDefault ["name", ""]; + if ((_memberName isEqualTo "" || { toLowerANSI _memberName isEqualTo "unknown" }) && { _player isNotEqualTo objNull }) then { + _memberName = name _player; + }; + if (_memberName isEqualTo "") then { _memberName = "Unknown"; }; + _memberName + }], + ["applyActorOrganization", compileFinal { + params [["_uid", "", [""]], ["_orgID", "", [""]], ["_actor", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "" || { _orgID isEqualTo "" }) exitWith { createHashMap }; + + private _actorPatch = EGVAR(actor,ActorStore) call ["set", [_uid, "organization", _orgID, true]]; + private _updatedActor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + if ( + !(_updatedActor isEqualType createHashMap) + || { _updatedActor isEqualTo createHashMap } + || { (_updatedActor getOrDefault ["organization", ""]) isNotEqualTo _orgID } + ) then { + private _forcedActor = +_actor; + if !(_forcedActor isEqualType createHashMap) then { + _forcedActor = EGVAR(actor,ActorModel) call ["defaults", []]; + _forcedActor set ["uid", _uid]; + }; + + _forcedActor set ["organization", _orgID]; + _updatedActor = EGVAR(actor,ActorStore) call ["override", [_uid, _forcedActor, true]]; + if (_updatedActor isEqualType createHashMap && { _updatedActor isNotEqualTo createHashMap }) then { + _actorPatch = createHashMapFromArray [["organization", _orgID]]; + }; + }; + + if ( + !(_updatedActor isEqualType createHashMap) + || { _updatedActor isEqualTo createHashMap } + || { (_updatedActor getOrDefault ["organization", ""]) isNotEqualTo _orgID } + ) exitWith { createHashMap }; + + _actorPatch + }], + ["loadHotOrg", compileFinal { + params [["_orgID", "", [""]], ["_initialize", false, [false]]]; + + if (_orgID isEqualTo "") exitWith { createHashMap }; + + private _command = ["org:hot:get", "org:hot:init"] select _initialize; + _self call ["callHotOrg", [_command, [_orgID]]] + }], + ["get", compileFinal { + params [["_orgID", "", [""]], ["_field", "", [""]]]; + + private _org = _self call ["loadHotOrg", [_orgID, false]]; + if (_org isEqualTo createHashMap) then { + _org = _self call ["loadHotOrg", [_orgID, true]]; + }; + + if (_field isEqualTo "") exitWith { _org }; + _org getOrDefault [_field, createHashMap] + }], + ["delete", compileFinal { + params [["_orgID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""] + ]; + + if (_orgID isEqualTo "" || { toLower _orgID isEqualTo "default" }) exitWith { + _result set ["message", "Invalid organization ID."]; + _result + }; + + ["org:delete", [_orgID]] call EFUNC(extension,extCall) params ["_deleteResult", "_deleteSuccess"]; + if (!_deleteSuccess || { _deleteResult isNotEqualTo "OK" }) exitWith { + _result set ["message", format ["Failed to delete organization: %1", _deleteResult]]; + _result + }; + + ["org:hot:remove", [_orgID]] call EFUNC(extension,extCall); + _result set ["success", true]; + _result + }], + ["ensureMember", compileFinal { + params [["_orgID", "", [""]], ["_uid", "", [""]], ["_memberName", "", [""]]]; + + if (_orgID isEqualTo "" || { _uid isEqualTo "" }) exitWith { createHashMap }; + + private _context = createHashMapFromArray [ + ["orgId", _orgID], + ["memberUid", _uid], + ["memberName", _memberName] + ]; + + _self call ["callHotOrg", ["org:hot:ensure_member", [toJSON _context]]] + }], + ["listMemberInvites", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { [] }; + + _self call ["callHotOrgArray", ["org:hot:member_invites", [_uid]]] + }], + ["inviteMember", compileFinal { + params [["_requesterUid", "", [""]], ["_targetUid", "", [""]], ["_targetName", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["targetUid", _targetUid], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (_requesterUid isEqualTo "" || { _targetUid isEqualTo "" }) exitWith { + _result set ["message", "A valid organization invite target is required."]; + _result + }; + + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterActor = EGVAR(actor,ActorStore) call ["load", [_requesterUid]]; + private _requesterOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _requesterName = _self call ["resolveActorName", [_requesterUid, _requesterPlayer, _requesterActor]]; + private _requesterIsDefaultOrgCeo = ( + _requesterPlayer isNotEqualTo objNull + && { _requesterOrgID isEqualTo "default" } + && { toLowerANSI (vehicleVarName _requesterPlayer) isEqualTo "ceo" } + ); + private _targetOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_targetUid]]; + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["requesterName", _requesterName], + ["orgId", _requesterOrgID], + ["requesterIsDefaultOrgCeo", _requesterIsDefaultOrgCeo], + ["targetUid", _targetUid], + ["targetName", _targetName], + ["targetOrgId", _targetOrgID] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:invite_member", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Unable to send organization invite."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Invitation sent."]]; + _result set ["targetUid", _envelope getOrDefault ["targetUid", _targetUid]]; + _self call ["persistMutationResult", [_requesterOrgID, _result, "Organization invite"]] + }], + ["acceptInvite", compileFinal { + params [["_requesterUid", "", [""]], ["_orgID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["actorPatch", createHashMap], + ["affectedOrgIds", []] + ]; + + if (_requesterUid isEqualTo "" || { _orgID isEqualTo "" }) exitWith { + _result set ["message", "A valid invite selection is required."]; + _result + }; + + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterActor = EGVAR(actor,ActorStore) call ["load", [_requesterUid]]; + private _requesterName = _self call ["resolveActorName", [_requesterUid, _requesterPlayer, _requesterActor]]; + private _existingOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["requesterName", _requesterName], + ["orgId", _orgID], + ["existingOrgId", _existingOrgID] + ]; + + ["org:hot:accept_invite", [toJSON _context]] call EFUNC(extension,extCall) params ["_rawResult", "_isSuccess"]; + if !_isSuccess exitWith { + _result set ["message", "Organization invite service was unavailable."]; + _result + }; + if !(_rawResult isEqualType "") exitWith { + _result set ["message", "Organization invite service returned an invalid response."]; + _result + }; + if ((_rawResult find "Error:") == 0) exitWith { + _result set ["message", _rawResult select [7]]; + _result + }; + + private _envelope = fromJSON _rawResult; + if !(_envelope isEqualType createHashMap) exitWith { + _result set ["message", "Organization invite service returned malformed data."]; + _result + }; + + private _invitedOrg = _self call ["syncHotOrg", [_envelope getOrDefault ["invitedOrg", createHashMap]]]; + if (_invitedOrg isNotEqualTo createHashMap) then { + _envelope set ["invitedOrg", _invitedOrg]; + }; + + private _previousOrgData = _envelope getOrDefault ["previousOrg", createHashMap]; + if (_previousOrgData isEqualType createHashMap && { _previousOrgData isNotEqualTo createHashMap }) then { + private _syncedPreviousOrg = _self call ["syncHotOrg", [_previousOrgData]]; + if (_syncedPreviousOrg isNotEqualTo createHashMap) then { + _envelope set ["previousOrg", _syncedPreviousOrg]; + }; + }; + + private _actorOrg = _envelope getOrDefault ["actorOrganization", _orgID]; + private _actorPatch = _self call ["applyActorOrganization", [_requesterUid, _actorOrg, _requesterActor]]; + if (_actorPatch isEqualTo createHashMap) exitWith { + _result set ["message", "Failed to assign the player to the invited organization."]; + _result + }; + + private _affectedOrgIds = [_actorOrg]; + private _previousOrg = _envelope getOrDefault ["previousOrg", createHashMap]; + if (_previousOrg isEqualType createHashMap && { _previousOrg isNotEqualTo createHashMap }) then { + private _previousOrgID = _previousOrg getOrDefault ["id", ""]; + if (_previousOrgID isNotEqualTo "") then { + _affectedOrgIds pushBackUnique _previousOrgID; + }; + }; + + { + _self call ["saveById", [_x]]; + } forEach _affectedOrgIds; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Organization invite accepted."]]; + _result set ["actorPatch", _actorPatch]; + _result set ["affectedOrgIds", _affectedOrgIds]; + _result + }], + ["declineInvite", compileFinal { + params [["_requesterUid", "", [""]], ["_orgID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["affectedOrgIds", []] + ]; + + if (_requesterUid isEqualTo "" || { _orgID isEqualTo "" }) exitWith { + _result set ["message", "A valid invite selection is required."]; + _result + }; + + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterActor = EGVAR(actor,ActorStore) call ["load", [_requesterUid]]; + private _requesterName = _self call ["resolveActorName", [_requesterUid, _requesterPlayer, _requesterActor]]; + private _existingOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["requesterName", _requesterName], + ["orgId", _orgID], + ["existingOrgId", _existingOrgID] + ]; + + ["org:hot:decline_invite", [toJSON _context]] call EFUNC(extension,extCall) params ["_rawResult", "_isSuccess"]; + if !_isSuccess exitWith { + _result set ["message", "Organization invite service was unavailable."]; + _result + }; + if !(_rawResult isEqualType "") exitWith { + _result set ["message", "Organization invite service returned an invalid response."]; + _result + }; + if ((_rawResult find "Error:") == 0) exitWith { + _result set ["message", _rawResult select [7]]; + _result + }; + + private _envelope = fromJSON _rawResult; + if !(_envelope isEqualType createHashMap) exitWith { + _result set ["message", "Organization invite service returned malformed data."]; + _result + }; + + private _invitedOrg = _self call ["syncHotOrg", [_envelope getOrDefault ["invitedOrg", createHashMap]]]; + if (_invitedOrg isNotEqualTo createHashMap) then { + _envelope set ["invitedOrg", _invitedOrg]; + }; + + _self call ["saveById", [_orgID]]; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Organization invite declined."]]; + _result set ["affectedOrgIds", [_orgID]]; + _result + }], + ["leave", compileFinal { + params [["_uid", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["actorPatch", createHashMap], + ["notification", []] + ]; + + if (_uid isEqualTo "") exitWith { + _result set ["message", "A valid player UID is required."]; + _result + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _memberName = _self call ["resolveActorName", [_uid, _player, _actor]]; + private _context = createHashMapFromArray [ + ["requesterUid", _uid], + ["requesterName", _memberName], + ["orgId", _orgID] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:leave", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Unable to leave the organization."]; + _result + }; + + private _actorOrg = _envelope getOrDefault ["actorOrganization", "default"]; + private _actorPatch = _self call ["applyActorOrganization", [_uid, _actorOrg, _actor]]; + if (_actorPatch isEqualTo createHashMap) exitWith { + _result set ["message", "Failed to restore default organization membership."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "You returned to the default organization."]]; + _result set ["actorPatch", _actorPatch]; + _result set ["notification", ["info", "Organization Left", _result get "message", 6000]]; + _result + }], + ["disband", compileFinal { + params [["_uid", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["members", []] + ]; + + if (_uid isEqualTo "") exitWith { + _result set ["message", "A valid player UID is required."]; + _result + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _memberName = _self call ["resolveActorName", [_uid, _player, _actor]]; + private _context = createHashMapFromArray [ + ["requesterUid", _uid], + ["requesterName", _memberName], + ["orgId", _orgID] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:disband", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Failed to disband organization."]; + _result + }; + + private _memberResults = []; + { + private _memberUid = _x getOrDefault ["uid", ""]; + if (_memberUid isEqualTo "") then { continue; }; + + private _memberActor = EGVAR(actor,ActorStore) call ["load", [_memberUid]]; + private _actorPatch = _self call ["applyActorOrganization", [_memberUid, _x getOrDefault ["actorOrganization", "default"], _memberActor]]; + if (_actorPatch isEqualTo createHashMap) then { + ["WARNING", format ["Failed to restore actor organization for %1 after org disband.", _memberUid]] call EFUNC(common,log); + }; + + private _responseMessage = _x getOrDefault ["message", _envelope getOrDefault ["message", "Organization disbanded."]]; + private _notificationParams = [ + ["warning", "Organization Disbanded", _responseMessage, 6000], + ["success", "Organization Disbanded", _responseMessage, 6000] + ] select (_x getOrDefault ["requester", false]); + + _memberResults pushBack (createHashMapFromArray [ + ["uid", _memberUid], + ["requester", _x getOrDefault ["requester", false]], + ["message", _responseMessage], + ["notification", _notificationParams], + ["actorPatch", _actorPatch] + ]); + } forEach (_envelope getOrDefault ["members", []]); + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Organization disbanded."]]; + _result set ["members", _memberResults]; + _result + }], + ["assignCreditLine", compileFinal { + params [["_requesterUid", "", [""]], ["_memberUid", "", [""]], ["_memberName", "", [""]], ["_amount", 0, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (_requesterUid isEqualTo "" || { _memberUid isEqualTo "" } || { _amount <= 0 }) exitWith { + _result set ["message", "A valid requester, member, and credit amount are required."]; + _result + }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterIsDefaultOrgCeo = ( + _requesterPlayer isNotEqualTo objNull + && { _orgID isEqualTo "default" } + && { toLowerANSI (vehicleVarName _requesterPlayer) isEqualTo "ceo" } + ); + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _orgID], + ["requesterIsDefaultOrgCeo", _requesterIsDefaultOrgCeo], + ["memberUid", _memberUid], + ["memberName", _memberName], + ["amount", _amount] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:assign_credit_line", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Unable to assign credit line."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Credit line assigned."]]; + _result set ["patch", _envelope getOrDefault ["patch", createHashMap]]; + _result set ["memberUids", _envelope getOrDefault ["memberUids", []]]; + _self call ["persistMutationResult", [_orgID, _result, "Credit line assignment"]] + }], + ["creditMemberBank", compileFinal { + params [["_memberUid", "", [""]], ["_amount", 0, [0]], ["_message", "", [""]]]; + + if (_memberUid isEqualTo "" || { _amount <= 0 }) exitWith { false }; + + private _account = EGVAR(bank,BankStore) call ["get", [_memberUid, ""]]; + if (_account isEqualTo createHashMap) then { + _account = EGVAR(bank,BankStore) call ["init", [_memberUid]]; + }; + if (_account isEqualTo createHashMap) exitWith { false }; + + private _currentBank = _account getOrDefault ["bank", 0]; + private _patch = EGVAR(bank,BankStore) call ["mset", [_memberUid, createHashMapFromArray [["bank", _currentBank + _amount]], true]]; + if (_patch isEqualTo createHashMap) exitWith { false }; + if (isNil QEGVAR(common,EventBus)) then { + EGVAR(bank,BankMessenger) call ["sendAccountSync", [_memberUid, _patch]]; + } else { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.sync.requested", + createHashMapFromArray [ + ["uid", _memberUid], + ["account", +_patch] + ], + createHashMapFromArray [["source", "org"]] + ]]; + }; + + if (_message isNotEqualTo "") then { + if (isNil QEGVAR(common,EventBus)) then { + EGVAR(bank,BankMessenger) call ["sendNotification", [_memberUid, "info", "Treasury", _message]]; + } else { + EGVAR(common,EventBus) call ["emit", [ + "notification.requested", + createHashMapFromArray [ + ["uids", [_memberUid]], + ["notificationType", "info"], + ["title", "Treasury"], + ["message", _message] + ], + createHashMapFromArray [["source", "org"]] + ]]; + }; + }; + + true + }], + ["syncBankPatch", compileFinal { + params [["_uid", "", [""]], ["_patch", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "" || { _patch isEqualTo createHashMap }) exitWith { false }; + + if (isNil QEGVAR(common,EventBus)) then { + EGVAR(bank,BankMessenger) call ["sendAccountSync", [_uid, _patch]]; + } else { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["account", +_patch] + ], + createHashMapFromArray [["source", "org"]] + ]]; + }; + + true + }], + ["chargeRegistrationFee", compileFinal { + params [["_uid", "", [""]], ["_amount", 50000, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to charge the organization registration fee."], + ["patch", createHashMap], + ["refundPatch", createHashMap] + ]; + + if (_uid isEqualTo "" || { _amount <= 0 }) exitWith { _result }; + if (isNil QEGVAR(bank,BankStore)) exitWith { + _result set ["message", "Bank service is unavailable for organization registration."]; + _result + }; + + private _account = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + if (_account isEqualTo createHashMap) then { + _account = EGVAR(bank,BankStore) call ["init", [_uid]]; + }; + if (_account isEqualTo createHashMap) exitWith { + _result set ["message", "Bank account could not be loaded for organization registration."]; + _result + }; + + private _currentBank = _account getOrDefault ["bank", 0]; + private _currentCash = _account getOrDefault ["cash", 0]; + if ((_currentBank + _currentCash) < _amount) exitWith { + _result set ["message", format ["You need at least $%1 in personal funds to create an organization.", [_amount] call EFUNC(common,formatNumber)]]; + _result + }; + + private _bankCharge = _amount min _currentBank; + private _cashCharge = _amount - _bankCharge; + private _patch = createHashMapFromArray [ + ["bank", _currentBank - _bankCharge], + ["cash", _currentCash - _cashCharge] + ]; + private _refundPatch = createHashMapFromArray [ + ["bank", _currentBank], + ["cash", _currentCash] + ]; + + private _appliedPatch = EGVAR(bank,BankStore) call ["mset", [_uid, _patch, true]]; + if (_appliedPatch isEqualTo createHashMap) exitWith { + _result set ["message", "Organization registration fee could not be charged."]; + _result + }; + + _result set ["success", true]; + _result set ["message", ""]; + _result set ["patch", _appliedPatch]; + _result set ["refundPatch", _refundPatch]; + _result + }], + ["refundRegistrationFee", compileFinal { + params [["_uid", "", [""]], ["_refundPatch", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "" || { _refundPatch isEqualTo createHashMap } || { isNil QEGVAR(bank,BankStore) }) exitWith { false }; + + private _patch = EGVAR(bank,BankStore) call ["mset", [_uid, _refundPatch, true]]; + if (_patch isEqualTo createHashMap) exitWith { false }; + + _self call ["syncBankPatch", [_uid, _patch]] + }], + ["updateOrgTreasuryFunds", compileFinal { + params [["_orgID", "", [""]], ["_funds", 0, [0]]]; + + if (_orgID isEqualTo "") exitWith { createHashMap }; + + private _org = _self call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) exitWith { createHashMap }; + + private _nextOrg = +_org; + _nextOrg set ["funds", _funds]; + + private _updatedOrg = _self call ["callHotOrg", ["org:hot:override", [_orgID, toJSON _nextOrg]]]; + if (_updatedOrg isEqualTo createHashMap) exitWith { createHashMap }; + + _self call ["saveById", [_orgID]] + }], + ["runPayroll", compileFinal { + params [["_requesterUid", "", [""]], ["_amountPerMember", 0, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["memberUids", []] + ]; + + if (_requesterUid isEqualTo "" || { _amountPerMember <= 0 }) exitWith { + _result set ["message", "A valid payroll amount is required."]; + _result + }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterIsDefaultOrgCeo = ( + _requesterPlayer isNotEqualTo objNull + && { _orgID isEqualTo "default" } + && { toLowerANSI (vehicleVarName _requesterPlayer) isEqualTo "ceo" } + ); + + private _org = _self call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) exitWith { + _result set ["message", "Organization data could not be loaded."]; + _result + }; + + private _ownerUid = _org getOrDefault ["owner", ""]; + private _canManageTreasury = ( + _requesterUid isEqualTo _ownerUid + || { _orgID isEqualTo "default" && { _requesterIsDefaultOrgCeo } } + ); + if !(_canManageTreasury) exitWith { + _result set ["message", "Only the organization leader or CEO can manage treasury actions."]; + _result + }; + + private _membersRaw = _org getOrDefault ["members", createHashMap]; + private _memberUids = []; + { + private _memberUid = _y getOrDefault ["uid", ""]; + if (_memberUid isNotEqualTo "") then { + _memberUids pushBackUnique _memberUid; + }; + } forEach _membersRaw; + + if (_memberUids isEqualTo []) exitWith { + _result set ["message", "No members available for payroll."]; + _result + }; + + private _total = _amountPerMember * count _memberUids; + private _funds = _org getOrDefault ["funds", 0]; + if (_total > _funds) exitWith { + _result set ["message", "Insufficient org funds for payroll."]; + _result + }; + + { + private _memberData = _membersRaw getOrDefault [_x, createHashMap]; + private _memberName = _memberData getOrDefault ["name", "a member"]; + private _ok = _self call ["creditMemberBank", [_x, _amountPerMember, format ["Received payroll of $%1 from %2.", [_amountPerMember] call EFUNC(common,formatNumber), _org getOrDefault ["name", "the organization"]]]]; + if !(_ok) exitWith { + _result set ["message", format ["Failed to credit payroll for %1.", _memberName]]; + _result set ["success", false]; + }; + } forEach _memberUids; + if (_result getOrDefault ["message", ""] isNotEqualTo "") exitWith { _result }; + + private _savedOrg = _self call ["updateOrgTreasuryFunds", [_orgID, _funds - _total]]; + if (_savedOrg isEqualTo createHashMap) exitWith { + _result set ["message", "Payroll was credited, but organization funds could not be updated."]; + _result + }; + + _result set ["success", true]; + _result set ["message", format ["Payroll sent to %1 members for $%2.", count _memberUids, [_total] call EFUNC(common,formatNumber)]]; + _result set ["memberUids", _memberUids]; + _result + }], + ["transferFunds", compileFinal { + params [["_requesterUid", "", [""]], ["_memberUid", "", [""]], ["_memberName", "", [""]], ["_amount", 0, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["memberUids", []] + ]; + + if (_requesterUid isEqualTo "" || { _memberUid isEqualTo "" } || { _amount <= 0 }) exitWith { + _result set ["message", "A valid member and transfer amount are required."]; + _result + }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + private _requesterIsDefaultOrgCeo = ( + _requesterPlayer isNotEqualTo objNull + && { _orgID isEqualTo "default" } + && { toLowerANSI (vehicleVarName _requesterPlayer) isEqualTo "ceo" } + ); + + private _org = _self call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) exitWith { + _result set ["message", "Organization data could not be loaded."]; + _result + }; + + private _ownerUid = _org getOrDefault ["owner", ""]; + private _canManageTreasury = ( + _requesterUid isEqualTo _ownerUid + || { _orgID isEqualTo "default" && { _requesterIsDefaultOrgCeo } } + ); + if !(_canManageTreasury) exitWith { + _result set ["message", "Only the organization leader or CEO can manage treasury actions."]; + _result + }; + + private _membersRaw = _org getOrDefault ["members", createHashMap]; + private _memberData = _membersRaw getOrDefault [_memberUid, createHashMap]; + if (_memberData isEqualTo createHashMap) exitWith { + _result set ["message", "Selected member was not found in the organization roster."]; + _result + }; + + private _funds = _org getOrDefault ["funds", 0]; + if (_amount > _funds) exitWith { + _result set ["message", "Insufficient org funds for this transfer."]; + _result + }; + + private _resolvedMemberName = _memberData getOrDefault ["name", _memberName]; + private _ok = _self call ["creditMemberBank", [_memberUid, _amount, format ["Received treasury transfer of $%1 from %2.", [_amount] call EFUNC(common,formatNumber), _org getOrDefault ["name", "the organization"]]]]; + if !(_ok) exitWith { + _result set ["message", format ["Failed to transfer funds to %1.", _resolvedMemberName]]; + _result + }; + + private _savedOrg = _self call ["updateOrgTreasuryFunds", [_orgID, _funds - _amount]]; + if (_savedOrg isEqualTo createHashMap) exitWith { + _result set ["message", "Transfer was credited, but organization funds could not be updated."]; + _result + }; + + _result set ["success", true]; + _result set ["message", format ["$%1 sent to %2.", [_amount] call EFUNC(common,formatNumber), _resolvedMemberName]]; + _result set ["memberUids", [_memberUid]]; + _result + }], + ["repayCreditLine", compileFinal { + params [["_requesterUid", "", [""]], ["_amount", 0, [0]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (_requesterUid isEqualTo "" || { _amount <= 0 }) exitWith { + _result set ["message", "A valid repayment amount is required."]; + _result + }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _orgID], + ["amount", _amount] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:repay_credit_line", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Unable to apply credit repayment."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", "Credit repayment posted."]]; + _result set ["patch", _envelope getOrDefault ["patch", createHashMap]]; + _result set ["memberUids", _envelope getOrDefault ["memberUids", []]]; + _self call ["persistMutationResult", [_orgID, _result, "Credit repayment"]] + }], + ["buildPortalPayload", compileFinal { + params [["_uid", "", [""]]]; + + GVAR(OrgPayloadBuilder) call ["buildPortalPayload", [_uid]] + }], + ["persistMutationResult", compileFinal { + params [ + ["_orgID", "", [""]], + ["_result", createHashMap, [createHashMap]], + ["_actionLabel", "Organization update", [""]] + ]; + + if (_orgID isEqualTo "" || { _result isEqualTo createHashMap }) exitWith { _result }; + + if !(_result getOrDefault ["success", false]) exitWith { _result }; + + _result set ["persisted", false]; + _result set ["persistenceMessage", ""]; + + private _savedOrg = _self call ["saveById", [_orgID]]; + if (_savedOrg isEqualTo createHashMap) exitWith { + private _message = format ["%1 applied, but durable save failed for organization %2.", _actionLabel, _orgID]; + ["ERROR", _message] call EFUNC(common,log); + _result set ["persistenceMessage", _message]; + _result + }; + + _result set ["persisted", true]; + _result + }], + ["chargeCheckout", compileFinal { + params [ + ["_requesterUid", "", [""]], + ["_requesterPlayer", objNull, [objNull]], + ["_source", "org_funds", [""]], + ["_amount", 0, [0]], + ["_commit", false, [false]], + ["_allowMemberCharge", false, [false]], + ["_recordMemberDebt", false, [false]] + ]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to process organization payment."], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _requesterIsDefaultOrgCeo = ( + _requesterPlayer isNotEqualTo objNull + && { _orgID isEqualTo "default" } + && { toLowerANSI (vehicleVarName _requesterPlayer) isEqualTo "ceo" } + ); + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _orgID], + ["requesterIsDefaultOrgCeo", _requesterIsDefaultOrgCeo], + ["allowMemberCharge", _allowMemberCharge], + ["recordMemberDebt", _recordMemberDebt], + ["source", _source], + ["amount", _amount], + ["commit", _commit] + ]; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:charge_checkout", [toJSON _context]]]; + if (_envelope isEqualTo createHashMap) exitWith { _result }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", ""]]; + _result set ["patch", _envelope getOrDefault ["patch", createHashMap]]; + _result set ["memberUids", _envelope getOrDefault ["memberUids", []]]; + _self call ["persistMutationResult", [_orgID, _result, "Organization checkout charge"]] + }], + ["saveById", compileFinal { + params [["_orgID", "", [""]]]; + + if (_orgID isEqualTo "") exitWith { createHashMap }; + + _self call ["callHotOrg", ["org:hot:save", [_orgID]]] + }], + ["addAssets", compileFinal { + params [["_requesterUid", "", [""]], ["_assets", [], [[]]], ["_commit", false, [false]], ["_orgID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to update organization assets."], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (_assets isEqualTo []) exitWith { + _result set ["success", true]; + _result set ["message", ""]; + _result + }; + + private _resolvedOrgID = _orgID; + if (_resolvedOrgID isEqualTo "") then { + _resolvedOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + }; + if (_resolvedOrgID isEqualTo "") then { _resolvedOrgID = "default"; }; + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _resolvedOrgID], + ["commit", _commit] + ]; + private _assetSeeds = _assets apply { + createHashMapFromArray [ + ["classname", _x getOrDefault ["classname", ""]], + ["category", toLowerANSI (_x getOrDefault ["category", "items"])], + ["quantity", floor ((_x getOrDefault ["quantity", 0]) max 0)] + ] + }; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:add_assets", [toJSON _context, toJSON _assetSeeds]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Failed to update organization asset cache."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", ""]]; + _result set ["patch", _envelope getOrDefault ["patch", createHashMap]]; + _result set ["memberUids", _envelope getOrDefault ["memberUids", []]]; + _self call ["persistMutationResult", [_resolvedOrgID, _result, "Organization asset update"]] + }], + ["addFleetVehicles", compileFinal { + params [["_requesterUid", "", [""]], ["_vehicles", [], [[]]], ["_commit", false, [false]], ["_orgID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to update organization fleet."], + ["patch", createHashMap], + ["memberUids", []], + ["persisted", false], + ["persistenceMessage", ""] + ]; + + if (_vehicles isEqualTo []) exitWith { + _result set ["success", true]; + _result set ["message", ""]; + _result + }; + + private _resolvedOrgID = _orgID; + if (_resolvedOrgID isEqualTo "") then { + _resolvedOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + }; + if (_resolvedOrgID isEqualTo "") then { _resolvedOrgID = "default"; }; + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _resolvedOrgID], + ["commit", _commit] + ]; + private _fleetSeeds = _vehicles apply { + createHashMapFromArray [ + ["classname", _x getOrDefault ["classname", ""]], + ["category", toLowerANSI (_x getOrDefault ["category", "other"])] + ] + }; + + private _envelope = _self call ["callHotOrgEnvelope", ["org:hot:add_fleet", [toJSON _context, toJSON _fleetSeeds]]]; + if (_envelope isEqualTo createHashMap) exitWith { + _result set ["message", "Failed to update organization fleet cache."]; + _result + }; + + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", ""]]; + _result set ["patch", _envelope getOrDefault ["patch", createHashMap]]; + _result set ["memberUids", _envelope getOrDefault ["memberUids", []]]; + _self call ["persistMutationResult", [_resolvedOrgID, _result, "Organization fleet update"]] + }], + ["loadById", compileFinal { + params [["_orgID", "", [""]]]; + + if (_orgID isEqualTo "") exitWith { createHashMap }; + + _self call ["loadHotOrg", [_orgID, true]] + }], + ["register", compileFinal { + params [["_uid", "", [""]], ["_orgName", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", ""], + ["org", createHashMap], + ["actorPatch", createHashMap] + ]; + + if (_uid isEqualTo "" || { _orgName isEqualTo "" }) exitWith { + _result set ["message", "A valid player and organization name are required."]; + _result + }; + + private _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + private _existingOrgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid, ""]]; + private _orgID = EGVAR(actor,ActorStore) call ["getPhoneNumber", [_uid]]; + if (_orgID isEqualTo "") exitWith { + _result set ["message", "Player phone number was not available for organization registration."]; + _result + }; + + private _context = createHashMapFromArray [ + ["requesterUid", _uid], + ["requesterName", _self call ["resolveActorName", [_uid, [_uid] call EFUNC(common,getPlayer), _actor]]], + ["orgId", _orgID], + ["orgName", _orgName], + ["existingOrgId", _existingOrgID] + ]; + + private _registrationFee = 50000; + private _feeCharge = _self call ["chargeRegistrationFee", [_uid, _registrationFee]]; + if !(_feeCharge getOrDefault ["success", false]) exitWith { + _result set ["message", _feeCharge getOrDefault ["message", "Organization registration fee could not be charged."]]; + _result + }; + private _refundPatch = _feeCharge getOrDefault ["refundPatch", createHashMap]; + + ["org:hot:register", [toJSON _context]] call EFUNC(extension,extCall) params ["_rawResult", "_isSuccess"]; + if !_isSuccess exitWith { + _self call ["refundRegistrationFee", [_uid, _refundPatch]]; + _result set ["message", "Organization service was unavailable during registration."]; + _result + }; + + if !(_rawResult isEqualType "") exitWith { + _self call ["refundRegistrationFee", [_uid, _refundPatch]]; + _result set ["message", "Organization service returned an invalid registration response."]; + _result + }; + + if ((_rawResult find "Error:") == 0) exitWith { + _self call ["refundRegistrationFee", [_uid, _refundPatch]]; + _result set ["message", _rawResult select [7]]; + _result + }; + + private _envelope = fromJSON _rawResult; + if !(_envelope isEqualType createHashMap) exitWith { + _self call ["refundRegistrationFee", [_uid, _refundPatch]]; + _result set ["message", "Organization service returned malformed registration data."]; + _result + }; + + if ("org" in _envelope) then { + private _syncedOrg = _self call ["syncHotOrg", [_envelope getOrDefault ["org", createHashMap]]]; + if (_syncedOrg isNotEqualTo createHashMap) then { + _envelope set ["org", _syncedOrg]; + }; + }; + + private _actorPatch = _self call ["applyActorOrganization", [_uid, _envelope getOrDefault ["actorOrganization", _orgID], _actor]]; + if (_actorPatch isEqualTo createHashMap) exitWith { + _self call ["refundRegistrationFee", [_uid, _refundPatch]]; + _result set ["message", "Failed to assign the player to the new organization."]; + _result + }; + + _self call ["syncBankPatch", [_uid, _feeCharge getOrDefault ["patch", createHashMap]]]; + _result set ["success", true]; + _result set ["message", _envelope getOrDefault ["message", ""]]; + _result set ["org", _envelope getOrDefault ["org", createHashMap]]; + _result set ["actorPatch", _actorPatch]; + _result + }], + ["init", compileFinal { + params [["_uid", "", [""]]]; + + private _player = [_uid] call EFUNC(common,getPlayer); + private _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _finalOrg = _self call ["loadById", [_orgID]]; + if (_finalOrg isEqualTo createHashMap) then { + ["WARNING", format ["No existing org found for %1, using default org.", _uid]] call EFUNC(common,log); + _finalOrg = _self call ["loadById", ["default"]]; + _orgID = "default"; + }; + + private _verifiedOrg = _self call ["ensureMember", [_orgID, _uid, _self call ["resolveActorName", [_uid, _player, _actor]]]]; + if (_verifiedOrg isNotEqualTo createHashMap) then { + _finalOrg = _verifiedOrg; + }; + + [CRPC(org,responseInitOrg), [_finalOrg], _player] call CFUNC(targetEvent); + + _finalOrg + }] +]; + +GVAR(OrgStore) = createHashMapObject [GVAR(OrgBaseStore)]; +GVAR(OrgStore) diff --git a/arma/server/addons/org/functions/fnc_initPayloadBuilder.sqf b/arma/server/addons/org/functions/fnc_initPayloadBuilder.sqf new file mode 100644 index 0000000..c1a25df --- /dev/null +++ b/arma/server/addons/org/functions/fnc_initPayloadBuilder.sqf @@ -0,0 +1,285 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initPayloadBuilder.sqf + * Author: IDSolutions + * Date: 2026-04-02 + * Public: No + * + * Description: + * Initializes the org payload builder for portal/read-model shaping. + * Keeps hydrate construction out of OrgStore so the store can focus on + * extension-backed org operations and actor coordination. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(OrgPayloadBuilder) = createHashMapObject [[ + ["#type", "OrgPayloadBuilder"], + ["resolveOrgForUid", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _orgID = GVAR(OrgStore) call ["resolveOrgIdForUid", [_uid]]; + private _org = GVAR(OrgStore) call ["loadById", [_orgID]]; + if (_org isEqualTo createHashMap) then { + _org = GVAR(OrgStore) call ["init", [_uid]]; + }; + + _org + }], + ["resolveOwnerName", compileFinal { + params [["_ownerUid", "", [""]], ["_uid", "", [""]], ["_playerName", "", [""]], ["_membersRaw", createHashMap, [createHashMap]]]; + + private _ownerName = ["", "Server"] select (toLowerANSI _ownerUid isEqualTo "server"); + { + private _memberData = _y; + private _memberUid = _memberData getOrDefault ["uid", ""]; + if (_memberUid isEqualTo _ownerUid && { _ownerName isEqualTo "" }) exitWith { + _ownerName = _memberData getOrDefault ["name", "Unknown"]; + }; + } forEach _membersRaw; + + if (_ownerName isEqualTo "" && { _ownerUid isEqualTo _uid }) then { _ownerName = _playerName; }; + if (_ownerName isEqualTo "" && { _ownerUid isNotEqualTo "" }) then { _ownerName = "Unknown Owner"; }; + if !(_ownerName isEqualType "") then { _ownerName = str _ownerName; }; + _ownerName + }], + ["buildMembersList", compileFinal { + params [["_membersRaw", createHashMap, [createHashMap]], ["_uid", "", [""]], ["_ownerUid", "", [""]]]; + + private _sessionRole = "Member"; + private _membersList = []; + + { + private _memberData = _y; + private _memberName = _memberData getOrDefault ["name", "Unknown"]; + private _memberUid = _memberData getOrDefault ["uid", ""]; + + if (_memberUid isEqualTo _uid) then { _sessionRole = "Member"; }; + if (_memberUid isEqualTo _ownerUid) then { _sessionRole = ["Member", "Leader"] select (_ownerUid isEqualTo _uid); }; + + _membersList pushBack [ + ["uid", _memberUid], + ["name", _memberName] + ]; + } forEach _membersRaw; + + createHashMapFromArray [ + ["members", _membersList], + ["sessionRole", _sessionRole] + ] + }], + ["resolveDisplayName", compileFinal { + params [["_className", "", [""]], ["_configRoots", [], [[]]]]; + + if (_className isEqualTo "") exitWith { "" }; + + private _displayName = _className; + { + private _cfg = _x >> _className; + if (isClass _cfg) exitWith { + private _resolvedName = getText (_cfg >> "displayName"); + if (_resolvedName isNotEqualTo "") then { _displayName = _resolvedName; }; + }; + } forEach _configRoots; + + _displayName + }], + ["buildAssetsList", compileFinal { + params [["_assetsRaw", createHashMap, [createHashMap]]]; + + private _assetsList = []; + { + private _category = _x; + { + private _assetData = _y; + private _className = _assetData getOrDefault ["classname", ""]; + private _displayName = _self call ["resolveDisplayName", [_className, [ + configFile >> "CfgWeapons", + configFile >> "CfgMagazines", + configFile >> "CfgVehicles", + configFile >> "CfgGlasses" + ]]]; + + _assetsList pushBack [ + ["name", _displayName], + ["type", _assetData getOrDefault ["type", _category]], + ["quantity", str (_assetData getOrDefault ["quantity", 0])] + ]; + } forEach _y; + } forEach _assetsRaw; + + _assetsList + }], + ["buildFleetList", compileFinal { + params [["_fleetRaw", createHashMap, [createHashMap]]]; + + private _fleetList = []; + { + private _vehicleData = _y; + _fleetList pushBack [ + ["name", _vehicleData getOrDefault ["name", "Unknown Vehicle"]], + ["type", _vehicleData getOrDefault ["type", "other"]], + ["status", _vehicleData getOrDefault ["status", "Unknown"]], + ["damage", _vehicleData getOrDefault ["damage", "0%"]] + ]; + } forEach _fleetRaw; + + _fleetList + }], + ["buildCreditLinesList", compileFinal { + params [["_creditLinesRaw", createHashMap, [createHashMap]]]; + + private _creditLinesList = []; + { + private _creditLineData = _y; + private _availableAmount = _creditLineData getOrDefault [ + "available_amount", + _creditLineData getOrDefault ["amount", 0] + ]; + _creditLinesList pushBack [ + ["uid", _creditLineData getOrDefault ["uid", _x]], + ["member", _creditLineData getOrDefault ["name", "Unknown Member"]], + ["approvedAmount", _creditLineData getOrDefault ["approved_amount", _availableAmount]], + ["availableAmount", _availableAmount], + ["outstandingPrincipal", _creditLineData getOrDefault ["outstanding_principal", 0]], + ["interestRate", _creditLineData getOrDefault ["interest_rate", 0.1]], + ["amountDue", _creditLineData getOrDefault ["amount_due", 0]], + ["amount", _availableAmount] + ]; + } forEach _creditLinesRaw; + + _creditLinesList + }], + ["buildPendingInvitesList", compileFinal { + params [["_pendingInvitesRaw", [], [[]]]]; + + private _pendingInvites = []; + { + if !(_x isEqualType createHashMap) then { continue; }; + + _pendingInvites pushBack [ + ["orgId", _x getOrDefault ["orgId", ""]], + ["orgName", _x getOrDefault ["orgName", "Unknown Organization"]], + ["inviterUid", _x getOrDefault ["inviterUid", ""]], + ["inviterName", _x getOrDefault ["inviterName", "Unknown"]], + ["targetUid", _x getOrDefault ["targetUid", ""]], + ["targetName", _x getOrDefault ["targetName", "Unknown"]] + ]; + } forEach _pendingInvitesRaw; + + _pendingInvites + }], + ["buildInviteablePlayers", compileFinal { + params [ + ["_uid", "", [""]], + ["_orgID", "", [""]], + ["_membersRaw", createHashMap, [createHashMap]], + ["_pendingInvitesRaw", createHashMap, [createHashMap]] + ]; + + private _memberUids = []; + { + _memberUids pushBackUnique (_y getOrDefault ["uid", ""]); + } forEach _membersRaw; + + private _pendingInviteUids = []; + { + _pendingInviteUids pushBackUnique (_x); + } forEach _pendingInvitesRaw; + + private _players = []; + { + private _player = _x; + if (isNull _player) then { continue; }; + + private _playerUid = getPlayerUID _player; + if (_playerUid isEqualTo "" || { _playerUid isEqualTo _uid }) then { continue; }; + if (_playerUid in _memberUids || { _playerUid in _pendingInviteUids }) then { continue; }; + + private _playerOrgID = GVAR(OrgStore) call ["resolveOrgIdForUid", [_playerUid]]; + if (_playerOrgID isNotEqualTo "default") then { continue; }; + + _players pushBack [ + ["uid", _playerUid], + ["name", name _player], + ["orgId", _playerOrgID] + ]; + } forEach allPlayers; + + _players + }], + ["buildPortalPayload", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _actor = EGVAR(actor,ActorStore) call ["load", [_uid]]; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _org = _self call ["resolveOrgForUid", [_uid]]; + if (_org isEqualTo createHashMap) exitWith { createHashMap }; + + private _verifiedOrg = GVAR(OrgStore) call ["ensureMember", [_orgID, _uid, GVAR(OrgStore) call ["resolveActorName", [_uid, _player, _actor]]]]; + if (_verifiedOrg isNotEqualTo createHashMap) then { _org = _verifiedOrg; }; + + private _name = _org getOrDefault ["name", ""]; + private _id = _org getOrDefault ["id", _orgID]; + private _ownerUid = _org getOrDefault ["owner", ""]; + private _funds = _org getOrDefault ["funds", 0]; + private _reputation = _org getOrDefault ["reputation", 0]; + private _creditLinesRaw = _org getOrDefault ["credit_lines", createHashMap]; + private _assetsRaw = _org getOrDefault ["assets", createHashMap]; + private _fleetRaw = _org getOrDefault ["fleet", createHashMap]; + private _membersRaw = _org getOrDefault ["members", createHashMap]; + private _pendingInvitesRaw = _org getOrDefault ["pending_invites", createHashMap]; + private _isDefaultOrg = (_org getOrDefault ["default", false]) + || { toLowerANSI _id isEqualTo "default" } + || { toLowerANSI _ownerUid isEqualTo "server" }; + private _memberInvites = []; + if (_isDefaultOrg) then { + _memberInvites = GVAR(OrgStore) call ["listMemberInvites", [_uid]]; + }; + + private _playerName = name _player; + private _playerVar = vehicleVarName _player; + private _sessionIsCeo = _isDefaultOrg && { _playerVar isEqualTo "ceo" }; + private _memberShape = _self call ["buildMembersList", [_membersRaw, _uid, _ownerUid]]; + private _sessionRole = _memberShape getOrDefault ["sessionRole", "Member"]; + private _ownerName = _self call ["resolveOwnerName", [_ownerUid, _uid, _playerName, _membersRaw]]; + + if (_ownerUid isEqualTo _uid) then { _sessionRole = "Leader"; }; + + createHashMapFromArray [ + ["session", createHashMapFromArray [ + ["actorName", _playerName], + ["actorUid", _uid], + ["role", _sessionRole], + ["ceo", _sessionIsCeo] + ]], + ["portalData", createHashMapFromArray [ + ["org", createHashMapFromArray [ + ["name", _name], + ["tag", _id], + ["owner", _ownerName], + ["ownerUid", _ownerUid], + ["isDefault", _isDefaultOrg] + ]], + ["funds", _funds], + ["reputation", _reputation], + ["creditLines", _self call ["buildCreditLinesList", [_creditLinesRaw]]], + ["members", _memberShape getOrDefault ["members", []]], + ["pendingInvites", _self call ["buildPendingInvitesList", [_memberInvites]]], + ["inviteablePlayers", _self call ["buildInviteablePlayers", [_uid, _id, _membersRaw, _pendingInvitesRaw]]], + ["fleet", _self call ["buildFleetList", [_fleetRaw]]], + ["assets", _self call ["buildAssetsList", [_assetsRaw]]], + ["activity", []] + ]] + ] + }] +]]; + +GVAR(OrgPayloadBuilder) diff --git a/arma/server/addons/org/script_component.hpp b/arma/server/addons/org/script_component.hpp new file mode 100644 index 0000000..b51fe86 --- /dev/null +++ b/arma/server/addons/org/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT org +#define COMPONENT_BEAUTIFIED Org +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/org/stringtable.xml b/arma/server/addons/org/stringtable.xml new file mode 100644 index 0000000..4c73262 --- /dev/null +++ b/arma/server/addons/org/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Org + + + diff --git a/arma/server/addons/phone/$PBOPREFIX$ b/arma/server/addons/phone/$PBOPREFIX$ new file mode 100644 index 0000000..fbdcb88 --- /dev/null +++ b/arma/server/addons/phone/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\phone diff --git a/arma/server/addons/phone/CfgEventHandlers.hpp b/arma/server/addons/phone/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/phone/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/phone/README.md b/arma/server/addons/phone/README.md new file mode 100644 index 0000000..a5dfbeb --- /dev/null +++ b/arma/server/addons/phone/README.md @@ -0,0 +1,34 @@ +# Forge Server Phone + +## Overview +The phone addon is the server-side bridge for contacts, SMS messages, and email. +Phone runtime state is owned by the extension. SQF stores preserve the +event-facing API and synchronize client UI state. + +## Dependencies +- `forge_server_main` +- `forge_server_common` at runtime for online player lookup +- `forge_server_actor` at runtime for contact and player lookups +- `forge_server_extension` at runtime for phone extension calls +- `forge_client_phone` for response RPCs + +## Main Components +- `fnc_initPhoneStore.sqf` coordinates the phone facade. +- `fnc_initContactStore.sqf` manages contacts. +- `fnc_initMessageStore.sqf` manages SMS messages and threads. +- `fnc_initEmailStore.sqf` manages email messages. +- `fnc_initPlayer.sqf` initializes phone data for a player. + +## Persistent Extension Tables +- `phone_user`: owner row for an initialized phone profile +- `phone_contact`: per-owner contact rows keyed by owner UID and contact UID +- `phone_message`: shared message records +- `phone_message_index`: per-owner message visibility and read state +- `phone_email`: shared email records +- `phone_email_index`: per-owner email visibility and read state +- `phone_sequence`: global sequence state for generated message and email IDs + +## Event Surface +The addon handles client requests to initialize phone state, add/remove/refresh +contacts, send/read/delete messages, send/read/delete emails, and remove phone +state. diff --git a/arma/server/addons/phone/XEH_PREP.hpp b/arma/server/addons/phone/XEH_PREP.hpp new file mode 100644 index 0000000..a6c4704 --- /dev/null +++ b/arma/server/addons/phone/XEH_PREP.hpp @@ -0,0 +1,5 @@ +PREP(initContactStore); +PREP(initEmailStore); +PREP(initMessageStore); +PREP(initPhoneStore); +PREP(initPlayer); diff --git a/arma/server/addons/phone/XEH_postInit.sqf b/arma/server/addons/phone/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/server/addons/phone/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/server/addons/phone/XEH_preInit.sqf b/arma/server/addons/phone/XEH_preInit.sqf new file mode 100644 index 0000000..e25b713 --- /dev/null +++ b/arma/server/addons/phone/XEH_preInit.sqf @@ -0,0 +1,218 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(PhoneStore)) then { [] call FUNC(initPhoneStore); }; + +// Contact Management Events +[QGVAR(requestInitPhone), { + params [["_uid", "", [""]], ["_data", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestInitPhone"; }; + + GVAR(PhoneStore) call ["init", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestAddContact), { + params [["_uid", "", [""]], ["_contactUid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _contactUid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Invalid parameters for requestAddContact"; }; + + private _result = GVAR(PhoneStore) call ["addContact", [_uid, _contactUid]]; + + if (!isNull _player) then { ["forge_client_phone_responseAddContact", [_result], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestAddContactByPhone), { + params [["_uid", "", [""]], ["_phoneNumber", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _phoneNumber isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Invalid parameters for requestAddContactByPhone"; }; + + private _result = GVAR(PhoneStore) call ["addContactByPhone", [_uid, _phoneNumber]]; + + if (!isNull _player) then { ["forge_client_phone_responseAddContactByPhone", [_result, _phoneNumber], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestAddContactByEmail), { + params [["_uid", "", [""]], ["_email", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _email isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Invalid parameters for requestAddContactByEmail"; }; + + private _result = GVAR(PhoneStore) call ["addContactByEmail", [_uid, _email]]; + + if (!isNull _player) then { ["forge_client_phone_responseAddContactByEmail", [_result, _email], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRemoveContact), { + params [["_uid", "", [""]], ["_contactUid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _contactUid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Invalid parameters for requestRemoveContact"; }; + + private _result = GVAR(PhoneStore) call ["removeContact", [_uid, _contactUid]]; + + if (!isNull _player) then { ["forge_client_phone_responseRemoveContact", [_result, _contactUid], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRefreshContacts), { + params [["_uid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestRefreshContacts"; }; + + private _contacts = GVAR(PhoneStore) call ["refreshContacts", [_uid]]; + + if (!isNull _player) then { ["forge_client_phone_responseRefreshContacts", [_contacts], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetContacts), { + params [["_uid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestGetContacts"; }; + + private _contactUids = GVAR(PhoneStore) call ["getContacts", [_uid]]; + + if (!isNull _player) then { ["forge_client_phone_responseGetContacts", [_contactUids], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +// Messaging Events +[QGVAR(requestSendMessage), { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_message", "", [""]], ["_player", objNull, [objNull]]]; + + if (_fromUid isEqualTo "" || _toUid isEqualTo "" || _message isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestSendMessage"; + }; + + private _messageObj = GVAR(PhoneStore) call ["sendMessage", [_fromUid, _toUid, _message]]; + private _success = _messageObj isEqualType createHashMap && { _messageObj isNotEqualTo createHashMap }; + + if (!isNull _player) then { + ["forge_client_phone_responseSendMessage", [_success], _player] call CFUNC(targetEvent); + if (_success) then { + ["forge_client_phone_responseMessageSent", [_messageObj], _player] call CFUNC(targetEvent); + }; + }; + + private _recipient = [_toUid] call EFUNC(common,getPlayer); + if (_success && { _toUid isNotEqualTo _fromUid } && { !isNull _recipient }) then { + ["forge_client_phone_responseMessageReceived", [_messageObj], _recipient] call CFUNC(targetEvent); + }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetMessages), { + params [["_uid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestGetMessages"; }; + + private _messages = GVAR(PhoneStore) call ["getMessages", [_uid]]; + + if (!isNull _player) then { ["forge_client_phone_responseGetMessages", [_messages], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetMessageThread), { + params [["_uid", "", [""]], ["_otherUid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _otherUid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestGetMessageThread"; + }; + + private _messages = GVAR(PhoneStore) call ["getMessageThread", [_uid, _otherUid]]; + + if (!isNull _player) then { ["forge_client_phone_responseGetMessageThread", [_messages, _otherUid], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestMarkMessageRead), { + params [["_uid", "", [""]], ["_messageId", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _messageId isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestMarkMessageRead"; + }; + + private _result = GVAR(PhoneStore) call ["markMessageRead", [_uid, _messageId]]; + + if (!isNull _player) then { ["forge_client_phone_responseMarkMessageRead", [_result, _messageId], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestDeleteMessage), { + params [["_uid", "", [""]], ["_messageId", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _messageId isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestDeleteMessage"; + }; + + private _result = GVAR(PhoneStore) call ["deleteMessage", [_uid, _messageId]]; + + if (!isNull _player) then { ["forge_client_phone_responseDeleteMessage", [_result, _messageId], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +// Email Events +[QGVAR(requestSendEmail), { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_subject", "", [""]], ["_body", "", [""]], ["_player", objNull, [objNull]]]; + if (_subject isEqualTo "") then { _subject = "No subject"; }; + + if (_fromUid isEqualTo "" || _toUid isEqualTo "" || _body isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestSendEmail"; + }; + + private _emailObj = GVAR(PhoneStore) call ["sendEmail", [_fromUid, _toUid, _subject, _body]]; + private _success = _emailObj isEqualType createHashMap && { _emailObj isNotEqualTo createHashMap }; + + if (!isNull _player) then { + ["forge_client_phone_responseSendEmail", [_success], _player] call CFUNC(targetEvent); + if (_success) then { + ["forge_client_phone_responseEmailSent", [_emailObj], _player] call CFUNC(targetEvent); + }; + }; + + private _recipient = [_toUid] call EFUNC(common,getPlayer); + if (_success && { _toUid isNotEqualTo _fromUid } && { !isNull _recipient }) then { + ["forge_client_phone_responseEmailReceived", [_emailObj], _recipient] call CFUNC(targetEvent); + }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetEmails), { + params [["_uid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestGetEmails"; }; + + private _emails = GVAR(PhoneStore) call ["getEmails", [_uid]]; + + if (!isNull _player) then { ["forge_client_phone_responseGetEmails", [_emails], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestMarkEmailRead), { + params [["_uid", "", [""]], ["_emailId", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _emailId isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestMarkEmailRead"; + }; + + private _result = GVAR(PhoneStore) call ["markEmailRead", [_uid, _emailId]]; + + if (!isNull _player) then { ["forge_client_phone_responseMarkEmailRead", [_result, _emailId], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +[QGVAR(requestDeleteEmail), { + params [["_uid", "", [""]], ["_emailId", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "" || _emailId isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Invalid parameters for requestDeleteEmail"; + }; + + private _result = GVAR(PhoneStore) call ["deleteEmail", [_uid, _emailId]]; + + if (!isNull _player) then { ["forge_client_phone_responseDeleteEmail", [_result, _emailId], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); + +// Cleanup Event +[QGVAR(requestRemovePhone), { + params [["_uid", "", [""]], ["_player", objNull, [objNull]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to requestRemovePhone"; }; + + private _result = GVAR(PhoneStore) call ["remove", [_uid]]; + + if (!isNull _player) then { ["forge_client_phone_responseRemovePhone", [_result], _player] call CFUNC(targetEvent); }; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/phone/XEH_preStart.sqf b/arma/server/addons/phone/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/phone/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/phone/config.cpp b/arma/server/addons/phone/config.cpp new file mode 100644 index 0000000..19bad94 --- /dev/null +++ b/arma/server/addons/phone/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J. Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/phone/functions/fnc_initContactStore.sqf b/arma/server/addons/phone/functions/fnc_initContactStore.sqf new file mode 100644 index 0000000..3aa0588 --- /dev/null +++ b/arma/server/addons/phone/functions/fnc_initContactStore.sqf @@ -0,0 +1,217 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initialize contact store for phone contact management. + * + * Contact membership is owned by the extension phone hot-state service. SQF + * enriches contact UIDs with live actor/player identity for the UI. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ContactStore) = createHashMapObject [[ + ["#type", "IContactStore"], + ["#create", { + diag_log "[FORGE:Server:Phone] Contact Store Initialized!"; + }], + ["callPhoneArray", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { [] }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Contact] Extension call %1 failed: %2", _function, _result]; + [] + }; + + private _data = fromJSON _result; + if !(_data isEqualType []) exitWith { [] }; + _data + }], + ["callPhoneBool", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { false }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Contact] Extension call %1 failed: %2", _function, _result]; + false + }; + + _result isEqualTo "true" + }], + ["init", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone:Contact] Empty UID provided to init"; + false + }; + + private _fieldCommanderUid = "field_commander"; + _self call ["callPhoneBool", ["phone:contacts:add", [_uid, _uid]]]; + _self call ["callPhoneBool", ["phone:contacts:add", [_uid, _fieldCommanderUid]]]; + _self call ["refreshContacts", [_uid]]; + true + }], + ["addContact", { + params [["_uid", "", [""]], ["_contactUid", "", [""]]]; + + if (_uid isEqualTo "" || { _contactUid isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Phone:Contact] Invalid UIDs provided to addContact"; + false + }; + + private _added = _self call ["callPhoneBool", ["phone:contacts:add", [_uid, _contactUid]]]; + if (_added) then { _self call ["refreshContacts", [_uid]]; }; + _added + }], + ["removeContact", { + params [["_uid", "", [""]], ["_contactUid", "", [""]]]; + + if (_uid isEqualTo "" || { _contactUid isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Phone:Contact] Invalid UIDs provided to removeContact"; + false + }; + + private _removed = _self call ["callPhoneBool", ["phone:contacts:remove", [_uid, _contactUid]]]; + if (_removed) then { _self call ["refreshContacts", [_uid]]; }; + _removed + }], + ["resolveUidByActorField", { + params [["_field", "", [""]], ["_value", "", [""]], ["_requesterUid", "", [""]]]; + + if (_field isEqualTo "" || { _value isEqualTo "" }) exitWith { "" }; + + private _normalizedValue = toLowerANSI _value; + private _candidateUids = []; + + { + private _candidateUid = getPlayerUID _x; + if (_candidateUid isNotEqualTo "" && { !(_candidateUid in _candidateUids) }) then { + _candidateUids pushBack _candidateUid; + }; + } forEach allPlayers; + + { + if (_x isNotEqualTo "" && { !(_x in _candidateUids) }) then { + _candidateUids pushBack _x; + }; + } forEach (EGVAR(actor,ActorStore) call ["listHotUids", []]); + + private _matchedUid = ""; + { + private _candidateUid = _x; + + private _actorValue = EGVAR(actor,ActorStore) call ["getFieldOrDefault", [_candidateUid, _field, ""]]; + if (_actorValue isEqualType "" && { toLowerANSI _actorValue isEqualTo _normalizedValue }) exitWith { + _matchedUid = _candidateUid; + }; + } forEach _candidateUids; + + _matchedUid + }], + ["addContactByPhone", { + params [["_uid", "", [""]], ["_phoneNumber", "", [""]]]; + + private _contactUid = _self call ["resolveUidByActorField", ["phone_number", _phoneNumber, _uid]]; + if (_contactUid isEqualTo "") exitWith { + diag_log format ["[FORGE:Server:Phone:Contact] Phone number %1 not found in hot actors", _phoneNumber]; + false + }; + + _self call ["addContact", [_uid, _contactUid]] + }], + ["addContactByEmail", { + params [["_uid", "", [""]], ["_email", "", [""]]]; + + private _contactUid = _self call ["resolveUidByActorField", ["email", _email, _uid]]; + if (_contactUid isEqualTo "") exitWith { + diag_log format ["[FORGE:Server:Phone:Contact] Email %1 not found in hot actors", _email]; + false + }; + + _self call ["addContact", [_uid, _contactUid]] + }], + ["getContacts", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { [] }; + _self call ["callPhoneArray", ["phone:contacts:list", [_uid]]] + }], + ["refreshContacts", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone:Contact] Empty UID provided to refreshContacts"; + [] + }; + + private _contactObjects = []; + private _fieldCommanderUid = "field_commander"; + private _fieldCommanderContact = createHashMapFromArray [ + ["uid", _fieldCommanderUid], + ["name", "Field Cmdr"], + ["fullName", "Field Commander"], + ["phone", "0160000000"], + ["email", "field_cmdr@spearnet.mil"], + ["online", false], + ["system", true], + ["canCall", false], + ["canMessage", false], + ["canEmail", false] + ]; + private _contactUids = _self call ["getContacts", [_uid]]; + if !(_fieldCommanderUid in _contactUids) then { + _contactUids pushBack _fieldCommanderUid; + }; + + { + private _contactUid = _x; + if (_contactUid isEqualTo _fieldCommanderUid) then { + _contactObjects pushBack _fieldCommanderContact; + continue; + }; + + private _contactData = EGVAR(actor,ActorStore) call ["load", [_contactUid]]; + + if (_contactData isNotEqualTo createHashMap) then { + private _player = [_contactUid] call EFUNC(common,getPlayer); + private _isOnline = !isNull _player; + private _name = _contactData getOrDefault ["name", ""]; + if (_isOnline) then { _name = name _player; }; + if (_name isEqualTo "") then { _name = "Unknown Player"; }; + + _contactObjects pushBack createHashMapFromArray [ + ["uid", _contactUid], + ["name", _name], + ["fullName", _name], + ["phone", _contactData getOrDefault ["phone_number", ""]], + ["email", _contactData getOrDefault ["email", ""]], + ["online", _isOnline], + ["system", false], + ["canCall", true], + ["canMessage", true], + ["canEmail", true] + ]; + }; + } forEach _contactUids; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (!isNull _player) then { + _player setVariable ["FORGE_Contacts", _contactObjects, true]; + }; + + _contactObjects + }], + ["remove", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + + ["phone:remove", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + _isSuccess && { _result isEqualTo "OK" } + }] +]]; + +SETMVAR(FORGE_ContactStore,GVAR(ContactStore)); +GVAR(ContactStore) diff --git a/arma/server/addons/phone/functions/fnc_initEmailStore.sqf b/arma/server/addons/phone/functions/fnc_initEmailStore.sqf new file mode 100644 index 0000000..324cf1c --- /dev/null +++ b/arma/server/addons/phone/functions/fnc_initEmailStore.sqf @@ -0,0 +1,102 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initialize email store for phone email management. + * + * Email state is owned by the extension phone hot-state service. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(EmailStore) = createHashMapObject [[ + ["#type", "IEmailStore"], + ["#create", { + diag_log "[FORGE:Server:Phone] Email Store Initialized!"; + }], + ["callPhoneArray", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { [] }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Email] Extension call %1 failed: %2", _function, _result]; + [] + }; + + private _data = fromJSON _result; + if !(_data isEqualType []) exitWith { [] }; + _data + }], + ["callPhoneObject", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Email] Extension call %1 failed: %2", _function, _result]; + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["callPhoneBool", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { false }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Email] Extension call %1 failed: %2", _function, _result]; + false + }; + + _result isEqualTo "true" + }], + ["init", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + true + }], + ["loadEmailsFromDatabase", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + true + }], + ["sendEmail", { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_subject", "", [""]], ["_body", "", [""]]]; + if (_subject isEqualTo "") then { _subject = "No subject"; }; + + if (_fromUid isEqualTo "" || { _toUid isEqualTo "" } || { _body isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Phone:Email] Invalid parameters provided to sendEmail"; + false + }; + + _self call ["callPhoneObject", ["phone:emails:send", [_fromUid, _toUid, _subject, _body, str serverTime]]] + }], + ["getEmails", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { [] }; + _self call ["callPhoneArray", ["phone:emails:list", [_uid]]] + }], + ["markEmailRead", { + params [["_uid", "", [""]], ["_emailId", "", [""]]]; + if (_uid isEqualTo "" || { _emailId isEqualTo "" }) exitWith { false }; + _self call ["callPhoneBool", ["phone:emails:mark_read", [_uid, _emailId]]] + }], + ["deleteEmail", { + params [["_uid", "", [""]], ["_emailId", "", [""]]]; + if (_uid isEqualTo "" || { _emailId isEqualTo "" }) exitWith { false }; + _self call ["callPhoneBool", ["phone:emails:delete", [_uid, _emailId]]] + }], + ["remove", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + + ["phone:remove", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + _isSuccess && { _result isEqualTo "OK" } + }] +]]; + +SETMVAR(FORGE_EmailStore,GVAR(EmailStore)); +GVAR(EmailStore) diff --git a/arma/server/addons/phone/functions/fnc_initMessageStore.sqf b/arma/server/addons/phone/functions/fnc_initMessageStore.sqf new file mode 100644 index 0000000..a0f0e9c --- /dev/null +++ b/arma/server/addons/phone/functions/fnc_initMessageStore.sqf @@ -0,0 +1,110 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initialize message store for phone SMS management. + * + * Message state is owned by the extension phone hot-state service. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(MessageStore) = createHashMapObject [[ + ["#type", "IMessageStore"], + ["#create", { + diag_log "[FORGE:Server:Phone] Message Store Initialized!"; + }], + ["callPhoneArray", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { [] }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Message] Extension call %1 failed: %2", _function, _result]; + [] + }; + + private _data = fromJSON _result; + if !(_data isEqualType []) exitWith { [] }; + _data + }], + ["callPhoneObject", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Message] Extension call %1 failed: %2", _function, _result]; + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["callPhoneBool", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { false }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone:Message] Extension call %1 failed: %2", _function, _result]; + false + }; + + _result isEqualTo "true" + }], + ["init", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + true + }], + ["loadMessagesFromDatabase", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + true + }], + ["sendMessage", { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_message", "", [""]]]; + + if (_fromUid isEqualTo "" || { _toUid isEqualTo "" } || { _message isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Phone:Message] Invalid parameters provided to sendMessage"; + false + }; + + _self call ["callPhoneObject", ["phone:messages:send", [_fromUid, _toUid, _message, str serverTime]]] + }], + ["getMessageThread", { + params [["_uid", "", [""]], ["_otherUid", "", [""]]]; + if (_uid isEqualTo "" || { _otherUid isEqualTo "" }) exitWith { [] }; + _self call ["callPhoneArray", ["phone:messages:thread", [_uid, _otherUid]]] + }], + ["markMessageRead", { + params [["_uid", "", [""]], ["_messageId", "", [""]]]; + if (_uid isEqualTo "" || { _messageId isEqualTo "" }) exitWith { false }; + _self call ["callPhoneBool", ["phone:messages:mark_read", [_uid, _messageId]]] + }], + ["deleteMessage", { + params [["_uid", "", [""]], ["_messageId", "", [""]]]; + if (_uid isEqualTo "" || { _messageId isEqualTo "" }) exitWith { false }; + _self call ["callPhoneBool", ["phone:messages:delete", [_uid, _messageId]]] + }], + ["getMessages", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { [] }; + _self call ["callPhoneArray", ["phone:messages:list", [_uid]]] + }], + ["remove", { + params [["_uid", "", [""]]]; + if (_uid isEqualTo "") exitWith { false }; + + ["phone:remove", [_uid]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + _isSuccess && { _result isEqualTo "OK" } + }], + ["syncMessageIndices", { + params [["_uid", "", [""]]]; + _uid isNotEqualTo "" + }] +]]; + +SETMVAR(FORGE_MessageStore,GVAR(MessageStore)); +GVAR(MessageStore) diff --git a/arma/server/addons/phone/functions/fnc_initPhoneStore.sqf b/arma/server/addons/phone/functions/fnc_initPhoneStore.sqf new file mode 100644 index 0000000..f680d54 --- /dev/null +++ b/arma/server/addons/phone/functions/fnc_initPhoneStore.sqf @@ -0,0 +1,190 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initialize phone store for communication management + * + * Arguments: + * N/A + * + * Return Value: + * Phone Store Object + * + * Examples: + * [] call forge_server_phone_fnc_initPhoneStore + * + * Public: No + * + * ARCHITECTURAL REFACTOR COMPLETE: + * This PhoneStore now acts as a facade pattern coordinating between: + * - MessageStore (for SMS/messaging functionality) + * - EmailStore (for email functionality) + * - ContactStore (for contact management) + * + * Phone runtime state is owned by the extension. SQF stores are bridge objects + * that preserve the legacy event-facing API. + */ + +// Initialize the sub-stores +if (isNil QGVAR(MessageStore)) then { [] call FUNC(initMessageStore); }; +if (isNil QGVAR(EmailStore)) then { [] call FUNC(initEmailStore); }; +if (isNil QGVAR(ContactStore)) then { [] call FUNC(initContactStore); }; + +#pragma hemtt ignore_variables ["_self"] +GVAR(PhoneStore) = createHashMapObject [[ + ["#type", "IPhoneStore"], + ["#create", { + // Sub-stores are already initialized above + diag_log "[FORGE:Server:Phone] Phone Store Initialized with sub-stores!"; + }], + ["callPhonePayload", { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if (!_isSuccess || { !(_result isEqualType "") }) exitWith { createHashMap }; + if ((_result find "Error:") == 0) exitWith { + diag_log format ["[FORGE:Server:Phone] Extension call %1 failed: %2", _function, _result]; + createHashMap + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { createHashMap }; + _data + }], + ["init", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Phone] Empty UID provided to init"; createHashMap }; + + private _payload = _self call ["callPhonePayload", ["phone:init", [_uid]]]; + if (_payload isEqualTo createHashMap) exitWith { + diag_log format ["[FORGE:Server:Phone] Phone extension init failed for %1", _uid]; + false + }; + + // Initialize all sub-stores for this user + GVAR(ContactStore) call ["init", [_uid]]; + GVAR(MessageStore) call ["init", [_uid]]; + GVAR(EmailStore) call ["init", [_uid]]; + + diag_log format ["[FORGE:Server:Phone] Phone initialized for %1", _uid]; + true + }], + ["addContact", { + params [["_uid", "", [""]], ["_contactUid", "", [""]]]; + GVAR(ContactStore) call ["addContact", [_uid, _contactUid]] + }], + ["removeContact", { + params [["_uid", "", [""]], ["_contactUid", "", [""]]]; + GVAR(ContactStore) call ["removeContact", [_uid, _contactUid]] + }], + ["addContactByPhone", { + params [["_uid", "", [""]], ["_phoneNumber", "", [""]]]; + GVAR(ContactStore) call ["addContactByPhone", [_uid, _phoneNumber]] + }], + ["addContactByEmail", { + params [["_uid", "", [""]], ["_email", "", [""]]]; + GVAR(ContactStore) call ["addContactByEmail", [_uid, _email]] + }], + ["getContacts", { + params [["_uid", "", [""]]]; + GVAR(ContactStore) call ["getContacts", [_uid]] + }], + ["refreshContacts", { + params [["_uid", "", [""]]]; + GVAR(ContactStore) call ["refreshContacts", [_uid]] + }], + ["loadMessagesFromDatabase", { + params [["_uid", "", [""]]]; + GVAR(MessageStore) call ["loadMessagesFromDatabase", [_uid]] + }], + ["sendMessage", { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_message", "", [""]]]; + GVAR(MessageStore) call ["sendMessage", [_fromUid, _toUid, _message]] + }], + ["getMessageThread", { + params [["_uid", "", [""]], ["_otherUid", "", [""]]]; + GVAR(MessageStore) call ["getMessageThread", [_uid, _otherUid]] + }], + ["getMessages", { + params [["_uid", "", [""]]]; + GVAR(MessageStore) call ["getMessages", [_uid]] + }], + ["markMessageRead", { + params [["_uid", "", [""]], ["_messageId", "", [""]]]; + GVAR(MessageStore) call ["markMessageRead", [_uid, _messageId]] + }], + ["deleteMessage", { + params [["_uid", "", [""]], ["_messageId", "", [""]]]; + GVAR(MessageStore) call ["deleteMessage", [_uid, _messageId]] + }], + ["syncMessageIndices", { + params [["_uid", "", [""]]]; + GVAR(MessageStore) call ["syncMessageIndices", [_uid]] + }], + ["sendEmail", { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_subject", "", [""]], ["_body", "", [""]]]; + GVAR(EmailStore) call ["sendEmail", [_fromUid, _toUid, _subject, _body]] + }], + ["getEmails", { + params [["_uid", "", [""]]]; + GVAR(EmailStore) call ["getEmails", [_uid]] + }], + ["markEmailRead", { + params [["_uid", "", [""]], ["_emailId", "", [""]]]; + GVAR(EmailStore) call ["markEmailRead", [_uid, _emailId]] + }], + ["deleteEmail", { + params [["_uid", "", [""]], ["_emailId", "", [""]]]; + GVAR(EmailStore) call ["deleteEmail", [_uid, _emailId]] + }], + ["remove", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Empty UID provided to remove"; + false + }; + + // Remove from all sub-stores + GVAR(ContactStore) call ["remove", [_uid]]; + GVAR(MessageStore) call ["remove", [_uid]]; + GVAR(EmailStore) call ["remove", [_uid]]; + + diag_log format ["[FORGE:Server:Phone] Removed phone data for %1", _uid]; + true + }], + ["toArray", { + params [["_data", createHashMap, [createHashMap]]]; + + private _keys = keys _data; + private _array = []; + + { + private _key = _x; + private _value = _data get _key; + _array pushBack _key; + _array pushBack _value; + } forEach _keys; + + _array + }], + ["toHashMap", { + params [["_data", [], [[]]]]; + + private _keyValuePairs = []; + _data = _data select 0; + + for "_i" from 0 to (count _data - 2) step 2 do { + private _key = _data select _i; + private _value = _data select (_i + 1); + _keyValuePairs pushBack [_key, _value]; + }; + + private _hashMap = createHashMapFromArray _keyValuePairs; + _hashMap + }] +]]; + +SETMVAR(FORGE_PhoneStore,GVAR(PhoneStore)); +GVAR(PhoneStore) diff --git a/arma/server/addons/phone/functions/fnc_initPlayer.sqf b/arma/server/addons/phone/functions/fnc_initPlayer.sqf new file mode 100644 index 0000000..a5a46c6 --- /dev/null +++ b/arma/server/addons/phone/functions/fnc_initPlayer.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initialize phone system for a player + * + * Arguments: + * 0: Player UID + * + * Return Value: + * Success + * + * Examples: + * ["76561198123456789"] call forge_server_phone_fnc_initPlayer + * + * Public: Yes + */ + +params [["_uid", "", [""]]]; + +if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Phone] Empty UID provided to initPlayer"; + false +}; + +// Initialize phone store for player +GVAR(PhoneStore) call ["init", [_uid]]; + +diag_log format ["[FORGE:Server:Phone] Initialized phone for player %1", _uid]; +true diff --git a/arma/server/addons/phone/script_component.hpp b/arma/server/addons/phone/script_component.hpp new file mode 100644 index 0000000..ca5400f --- /dev/null +++ b/arma/server/addons/phone/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT phone +#define COMPONENT_BEAUTIFIED Phone +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/phone/stringtable.xml b/arma/server/addons/phone/stringtable.xml new file mode 100644 index 0000000..90f8803 --- /dev/null +++ b/arma/server/addons/phone/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Phone + + + diff --git a/arma/server/addons/store/$PBOPREFIX$ b/arma/server/addons/store/$PBOPREFIX$ new file mode 100644 index 0000000..ed419a2 --- /dev/null +++ b/arma/server/addons/store/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\store diff --git a/arma/server/addons/store/CfgEventHandlers.hpp b/arma/server/addons/store/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/store/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/store/README.md b/arma/server/addons/store/README.md new file mode 100644 index 0000000..8518890 --- /dev/null +++ b/arma/server/addons/store/README.md @@ -0,0 +1,42 @@ +# Forge Server Store + +## Overview +The store addon manages server-side storefront entities, catalog hydration, and +checkout coordination. + +SQF owns Arma-facing storefront discovery and request validation. The Rust +extension owns authoritative checkout calculation through `store:checkout`. + +## Dependencies +- `forge_server_main` +- `forge_server_common` +- `forge_server_extension` at runtime for checkout calls +- `forge_server_actor`, `forge_server_bank`, and `forge_server_org` at runtime + for checkout context and payment state +- `forge_client_store` for response RPCs + +## Main Components +- `fnc_initStore.sqf` marks editor-placed store objects with `isStore = true`. +- `fnc_initCatalogService.sqf` scans live Arma config categories, builds + catalog responses, resolves checkout entries, and calculates authoritative + catalog prices. +- `fnc_initStorefrontStore.sqf` builds hydrate payloads, validates checkout + requests, calls `store:checkout`, syncs client patches, and coordinates + related bank/org persistence. + +## Editor Entities +`fnc_initStore` matches non-null mission namespace objects whose variable names +contain `store`, mirroring the garage entity initialization pattern. + +## Checkout Flow +Store checkout can charge cash, bank balance, organization funds, or approved +credit lines depending on the hydrated session context. Checkout results can +grant locker assets, organization assets, and fleet vehicles through the +related domain stores. + +Checkout results emit notifications and syncs through the event bus: +- `notification.requested` - receipt and transaction alerts +- `bank.account.sync.requested` - player balance updates +- `org.sync.requested` - organization balance and asset updates +- `locker.sync.requested` - item grant notifications +- `garage.vgarage.sync.requested` - vehicle grant notifications diff --git a/arma/server/addons/store/XEH_PREP.hpp b/arma/server/addons/store/XEH_PREP.hpp new file mode 100644 index 0000000..310c381 --- /dev/null +++ b/arma/server/addons/store/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(initCatalogService); +PREP(initStore); +PREP(initStorefrontStore); diff --git a/arma/server/addons/store/XEH_postInit.sqf b/arma/server/addons/store/XEH_postInit.sqf new file mode 100644 index 0000000..b6cbab5 --- /dev/null +++ b/arma/server/addons/store/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +call FUNC(initStore); diff --git a/arma/server/addons/store/XEH_preInit.sqf b/arma/server/addons/store/XEH_preInit.sqf new file mode 100644 index 0000000..21a2764 --- /dev/null +++ b/arma/server/addons/store/XEH_preInit.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +[QGVAR(requestCategory), { + params [["_uid", "", [""]], ["_category", "", [""]]]; + + if (_uid isEqualTo "" || { _category isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Store] Invalid category request payload." + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + if (isNil QGVAR(StoreCatalogService)) exitWith { + diag_log "[FORGE:Server:Store] Store catalog service is unavailable." + }; + + private _result = GVAR(StoreCatalogService) call ["buildCategoryResponse", [_category]]; + [CRPC(store,responseCategory), [_result], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestHydrateStore), { + params [["_uid", "", [""]], ["_bridgeEvent", "store::hydrate", [""]]]; + + if (_uid isEqualTo "") exitWith { + diag_log "[FORGE:Server:Store] Invalid hydrate request payload." + }; + + if !(_bridgeEvent in ["store::hydrate", "store::config::hydrate"]) then { + _bridgeEvent = "store::hydrate"; + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _payload = GVAR(StorefrontStore) call ["buildHydratePayload", [_uid]]; + if (_payload isEqualTo createHashMap) exitWith {}; + + [CRPC(store,responseHydrateStore), [_payload, _bridgeEvent], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); + +[QGVAR(requestCheckout), { + params [["_uid", "", [""]], ["_payloadJson", "", [""]]]; + + if (_uid isEqualTo "" || { _payloadJson isEqualTo "" }) exitWith { + diag_log "[FORGE:Server:Store] Invalid checkout request payload." + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (_player isEqualTo objNull) exitWith {}; + + private _result = GVAR(StorefrontStore) call ["checkout", [_uid, _player, _payloadJson]]; + [CRPC(store,responseCheckout), [_result], _player] call CFUNC(targetEvent); +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/store/XEH_preStart.sqf b/arma/server/addons/store/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/store/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/store/config.cpp b/arma/server/addons/store/config.cpp new file mode 100644 index 0000000..cbd0a75 --- /dev/null +++ b/arma/server/addons/store/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/store/functions/fnc_initCatalogService.sqf b/arma/server/addons/store/functions/fnc_initCatalogService.sqf new file mode 100644 index 0000000..a27f364 --- /dev/null +++ b/arma/server/addons/store/functions/fnc_initCatalogService.sqf @@ -0,0 +1,493 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initCatalogService.sqf + * Author: IDSolutions + * Date: 2026-03-14 + * Public: No + * + * Description: + * Initializes the server-side store catalog service for authoritative category hydration and pricing. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(StoreCatalogServiceBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "StoreCatalogServiceBaseClass"], + ["#create", compileFinal { + _self set ["catalogCache", createHashMap]; + ["INFO", "Store catalog service initialized!"] call EFUNC(common,log); + }], + ["formatCurrency", compileFinal { + params [["_amount", 0, [0]]]; + + format ["$%1", [_amount max 0] call EFUNC(common,formatNumber)] + }], + ["isVisibleConfig", compileFinal { + params [["_cfg", configNull, [configNull]]]; + + isClass _cfg + && { getNumber (_cfg >> "scope") >= 2 } + && { (getText (_cfg >> "displayName")) isNotEqualTo "" } + }], + ["buildDescription", compileFinal { + params [["_cfg", configNull, [configNull]], ["_fallback", "", [""]]]; + + private _description = getText (_cfg >> "descriptionShort"); + if (_description isEqualTo "") then { _description = _fallback; }; + + _description + }], + ["normalizeCategoryKey", compileFinal { + params [["_category", "", [""]]]; + + private _categoryKey = toLowerANSI _category; + if (_categoryKey isEqualTo "items") exitWith { "misc" }; + + _categoryKey + }], + ["calculateCatalogPriceValue", compileFinal { + params [ + ["_cfg", configNull, [configNull]], + ["_isVehicle", false, [false]] + ]; + + if (isNull _cfg) exitWith { 50 }; + + private _mass = 0; + private _priceValue = 0; + + if (_isVehicle) then { + _priceValue = getNumber (_cfg >> "cost"); + } else { + private _weaponType = getNumber (_cfg >> "type"); + if (_weaponType in [1, 2, 4]) then { _mass = getNumber (_cfg >> "WeaponSlotsInfo" >> "mass"); }; + if (_mass <= 0) then { _mass = getNumber (_cfg >> "ItemInfo" >> "mass"); }; + if (_mass <= 0) then { _mass = getNumber (_cfg >> "mass"); }; + + _priceValue = ceil ((_mass max 0) * 7.5); + }; + + _priceValue max 50 + }], + ["buildCatalogItem", compileFinal { + params [ + ["_cfg", configNull, [configNull]], + ["_typeLabel", "", [""]], + ["_fallbackDescription", "", [""]], + ["_imageField", "picture", [""]], + ["_isVehicle", false, [false]] + ]; + + if (isNull _cfg) exitWith { createHashMap }; + + private _className = configName _cfg; + private _displayName = getText (_cfg >> "displayName"); + private _picture = getText (_cfg >> _imageField); + if (_picture isEqualTo "" && { _imageField isNotEqualTo "picture" }) then { + _picture = getText (_cfg >> "picture"); + }; + + private _priceValue = _self call ["calculateCatalogPriceValue", [_cfg, _isVehicle]]; + + createHashMapFromArray [ + ["className", _className], + ["code", _className], + ["name", _displayName], + ["description", _self call ["buildDescription", [_cfg, _fallbackDescription]]], + ["price", _self call ["formatCurrency", [_priceValue]]], + ["priceValue", _priceValue], + ["image", _picture], + ["type", _typeLabel] + ] + }], + ["appendCfgWeaponsByItemInfoType", compileFinal { + params [["_items", [], [[]]], ["_itemInfoType", -1, [0]], ["_typeLabel", "", [""]], ["_fallbackDescription", "", [""]]]; + + { + private _cfg = _x; + if ( + _self call ["isVisibleConfig", [_cfg]] + && { getNumber (_cfg >> "ItemInfo" >> "type") isEqualTo _itemInfoType } + ) then { + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, _fallbackDescription]]); + }; + } forEach ("true" configClasses (configFile >> "CfgWeapons")); + + _items + }], + ["appendCfgWeaponsByType", compileFinal { + params [["_items", [], [[]]], ["_weaponType", -1, [0]], ["_typeLabel", "", [""]], ["_fallbackDescription", "", [""]]]; + + { + private _cfg = _x; + if ( + _self call ["isVisibleConfig", [_cfg]] + && { getNumber (_cfg >> "type") isEqualTo _weaponType } + ) then { + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, _fallbackDescription]]); + }; + } forEach ("true" configClasses (configFile >> "CfgWeapons")); + + _items + }], + ["isAceClassName", compileFinal { + params [["_cfg", configNull, [configNull]]]; + + ((toLowerANSI (configName _cfg)) select [0, 4]) isEqualTo "ace_" + }], + ["isAttachmentConfig", compileFinal { + params [["_cfg", configNull, [configNull]]]; + + if !(_self call ["isVisibleConfig", [_cfg]]) exitWith { false }; + if (_self call ["isAceClassName", [_cfg]]) exitWith { false }; + + private _className = configName _cfg; + private _itemType = [_className] call BIS_fnc_itemType; + private _group = toLowerANSI (_itemType param [0, ""]); + private _kind = toLowerANSI (_itemType param [1, ""]); + + (_group find "accessory") >= 0 + || { (_kind find "accessory") >= 0 } + || { _kind in ["accessorymuzzle", "accessorypointer", "accessorysights", "accessorybipod"] } + }], + ["resolveAttachmentTypeLabel", compileFinal { + params [["_cfg", configNull, [configNull]]]; + + private _className = configName _cfg; + private _itemType = [_className] call BIS_fnc_itemType; + private _kind = toLowerANSI (_itemType param [1, ""]); + + if ((_kind find "muzzle") >= 0) exitWith { "Muzzle Attachment" }; + if ((_kind find "optic") >= 0 || { (_kind find "sight") >= 0 }) exitWith { "Optic Attachment" }; + if ((_kind find "pointer") >= 0 || { (_kind find "flash") >= 0 } || { (_kind find "light") >= 0 }) exitWith { "Light Attachment" }; + if ((_kind find "bipod") >= 0) exitWith { "Bipod Attachment" }; + + "Attachment" + }], + ["appendCfgAttachments", compileFinal { + params [["_items", [], [[]]], ["_fallbackDescription", "", [""]]]; + + { + private _cfg = _x; + if (_self call ["isAttachmentConfig", [_cfg]]) then { + private _typeLabel = _self call ["resolveAttachmentTypeLabel", [_cfg]]; + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, _fallbackDescription]]); + }; + } forEach ("true" configClasses (configFile >> "CfgWeapons")); + + _items + }], + ["appendCfgVehiclesByKind", compileFinal { + params [["_items", [], [[]]], ["_baseClass", "", [""]], ["_typeLabel", "", [""]], ["_fallbackDescription", "", [""]]]; + + { + private _cfg = _x; + private _className = configName _cfg; + if ( + _self call ["isVisibleConfig", [_cfg]] + && { getNumber (_cfg >> "isBackpack") isEqualTo 0 } + && { !(_className isKindOf ["CAManBase", configFile >> "CfgVehicles"]) } + && { !(_className isKindOf ["StaticWeapon", configFile >> "CfgVehicles"]) } + && { _className isKindOf [_baseClass, configFile >> "CfgVehicles"] } + ) then { + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, _fallbackDescription, "editorPreview", true]]); + }; + } forEach ("true" configClasses (configFile >> "CfgVehicles")); + + _items + }], + ["isBackpackConfig", compileFinal { + params [["_cfg", configNull, [configNull]]]; + + getNumber (_cfg >> "isBackpack") isEqualTo 1 + || { getNumber (_cfg >> "ItemInfo" >> "type") isEqualTo TYPE_BACKPACK } + }], + ["appendCfgBackpacks", compileFinal { + params [["_items", [], [[]]], ["_typeLabel", "Backpack", [""]], ["_fallbackDescription", "", [""]]]; + + { + private _cfg = _x; + if ( + _self call ["isVisibleConfig", [_cfg]] + && { _self call ["isBackpackConfig", [_cfg]] } + ) then { + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, _fallbackDescription]]); + }; + } forEach ("true" configClasses (configFile >> "CfgVehicles")); + + _items + }], + ["scanCategoryItems", compileFinal { + params [["_category", "", [""]]]; + + private _categoryKey = _self call ["normalizeCategoryKey", [_category]]; + if (_categoryKey isEqualTo "") exitWith { [] }; + + private _items = []; + + switch (_categoryKey) do { + case "uniforms": { _items = _self call ["appendCfgWeaponsByItemInfoType", [_items, TYPE_UNIFORM, "Uniform", "Live uniform entry generated from the game inventory."]]; }; + case "headgear": { _items = _self call ["appendCfgWeaponsByItemInfoType", [_items, TYPE_HEADGEAR, "Headgear", "Live headgear entry generated from the game inventory."]]; }; + case "vests": { _items = _self call ["appendCfgWeaponsByItemInfoType", [_items, TYPE_VEST, "Vest", "Live vest entry generated from the game inventory."]]; }; + case "backpacks": { _items = _self call ["appendCfgBackpacks", [_items, "Backpack", "Live backpack entry generated from the game inventory."]]; }; + case "attachments": { + _items = _self call ["appendCfgAttachments", [_items, "Live attachment entry generated from the game inventory."]]; + }; + case "facewear": { + { if (_self call ["isVisibleConfig", [_x]]) then { _items pushBack (_self call ["buildCatalogItem", [_x, "Facewear", "Live facewear entry generated from the game inventory."]]); }; } forEach ("true" configClasses (configFile >> "CfgGlasses")); + }; + case "ammo": { + { if (_self call ["isVisibleConfig", [_x]]) then { _items pushBack (_self call ["buildCatalogItem", [_x, "Magazine", "Live ammunition entry generated from the game inventory."]]); }; } forEach ("true" configClasses (configFile >> "CfgMagazines")); + }; + case "misc": { + { + private _cfg = _x; + private _className = configName _cfg; + private _itemType = [_className] call BIS_fnc_itemType; + private _group = _itemType param [0, ""]; + private _kind = _itemType param [1, ""]; + private _weaponType = getNumber (_cfg >> "type"); + private _isAceClass = _self call ["isAceClassName", [_cfg]]; + + if ( + _self call ["isVisibleConfig", [_cfg]] + && { !(_weaponType in [1, 2, 4]) } + && { (_group in ["Item", "Equipment"]) || { _isAceClass } } + && { !(_kind in ["Uniform", "Vest", "Headgear"]) } + && { !(_self call ["isAttachmentConfig", [_cfg]]) } + && { (getNumber (_cfg >> "ItemInfo" >> "type") isNotEqualTo TYPE_BACKPACK) } + ) then { + private _typeLabel = [_kind, "Item"] select (_kind isEqualTo ""); + _items pushBack (_self call ["buildCatalogItem", [_cfg, _typeLabel, "Live utility entry generated from the game inventory."]]); + }; + } forEach ("true" configClasses (configFile >> "CfgWeapons")); + }; + case "primary": { _items = _self call ["appendCfgWeaponsByType", [_items, 1, "Primary Weapon", "Live primary weapon entry generated from the game inventory."]]; }; + case "handgun": { _items = _self call ["appendCfgWeaponsByType", [_items, 2, "Handgun", "Live sidearm entry generated from the game inventory."]]; }; + case "secondary": { _items = _self call ["appendCfgWeaponsByType", [_items, 4, "Launcher", "Live launcher entry generated from the game inventory."]]; }; + case "cars": { _items = _self call ["appendCfgVehiclesByKind", [_items, "Car", "Vehicle", "Live wheeled vehicle entry generated from the game inventory."]]; }; + case "armor": { _items = _self call ["appendCfgVehiclesByKind", [_items, "Tank", "Vehicle", "Live armored vehicle entry generated from the game inventory."]]; }; + case "helis": { _items = _self call ["appendCfgVehiclesByKind", [_items, "Helicopter", "Aircraft", "Live helicopter entry generated from the game inventory."]]; }; + case "planes": { _items = _self call ["appendCfgVehiclesByKind", [_items, "Plane", "Aircraft", "Live fixed-wing entry generated from the game inventory."]]; }; + case "naval": { _items = _self call ["appendCfgVehiclesByKind", [_items, "Ship", "Naval", "Live naval vehicle entry generated from the game inventory."]]; }; + case "other": { + { + private _cfg = _x; + private _className = configName _cfg; + private _isSupportedVehicle = _className isKindOf ["AllVehicles", configFile >> "CfgVehicles"]; + private _isKnownCategory = + _className isKindOf ["Car", configFile >> "CfgVehicles"] + || { _className isKindOf ["Tank", configFile >> "CfgVehicles"] } + || { _className isKindOf ["Helicopter", configFile >> "CfgVehicles"] } + || { _className isKindOf ["Plane", configFile >> "CfgVehicles"] } + || { _className isKindOf ["Ship", configFile >> "CfgVehicles"] }; + + if ( + _self call ["isVisibleConfig", [_cfg]] + && { _isSupportedVehicle } + && { !_isKnownCategory } + && { getNumber (_cfg >> "isBackpack") isEqualTo 0 } + && { !(_className isKindOf ["CAManBase", configFile >> "CfgVehicles"]) } + && { !(_className isKindOf ["StaticWeapon", configFile >> "CfgVehicles"]) } + ) then { + _items pushBack (_self call ["buildCatalogItem", [_cfg, "Special Vehicle", "Live specialty vehicle entry generated from the game inventory.", "editorPreview", true]]); + }; + } forEach ("true" configClasses (configFile >> "CfgVehicles")); + }; + }; + + private _sortedItems = _items apply { [toLowerANSI (_x getOrDefault ["name", ""]), _x] }; + _sortedItems sort true; + _sortedItems apply { _x select 1 } + }], + ["isVehicleCategory", compileFinal { + params [["_category", "", [""]]]; + + (toLowerANSI _category) in ["cars", "armor", "helis", "planes", "naval", "other"] + }], + ["buildPayloadCategory", compileFinal { + params [["_category", "", [""]]]; + + switch (toLowerANSI _category) do { + case "backpacks": { "backpack" }; + case "attachments": { "attachment" }; + case "ammo": { "magazine" }; + case "primary"; + case "secondary"; + case "handgun": { "weapon" }; + case "cars"; + case "armor"; + case "helis"; + case "planes"; + case "naval"; + case "other": { toLowerANSI _category }; + default { "item" }; + } + }], + ["isSupportedCategory", compileFinal { + params [["_category", "", [""]]]; + + (_self call ["normalizeCategoryKey", [_category]]) in ["uniforms", "headgear", "vests", "backpacks", "attachments", "facewear", "ammo", "misc", "primary", "handgun", "secondary", "cars", "armor", "helis", "planes", "naval", "other"] + }], + ["buildCategoryItems", compileFinal { + params [["_category", "", [""]]]; + + private _categoryKey = _self call ["normalizeCategoryKey", [_category]]; + if (_categoryKey isEqualTo "") exitWith { [] }; + + private _catalogCache = _self getOrDefault ["catalogCache", createHashMap]; + if (_categoryKey in (keys _catalogCache)) exitWith { _catalogCache get _categoryKey }; + + private _items = _self call ["scanCategoryItems", [_categoryKey]]; + private _payloadCategory = _self call ["buildPayloadCategory", [_categoryKey]]; + private _entryKind = ["item", "vehicle"] select (_self call ["isVehicleCategory", [_categoryKey]]); + + { + _x set ["category", _payloadCategory]; + _x set ["entryKind", _entryKind]; + } forEach _items; + + _catalogCache set [_categoryKey, _items]; + _self set ["catalogCache", _catalogCache]; + + _items + }], + ["buildCategoryResponse", compileFinal { + params [["_category", "", [""]]]; + + private _categoryKey = _self call ["normalizeCategoryKey", [_category]]; + private _response = createHashMapFromArray [["success", false], ["category", _categoryKey], ["items", []], ["message", "No store category was provided."]]; + + if (_categoryKey isEqualTo "") exitWith { _response }; + if !(_self call ["isSupportedCategory", [_categoryKey]]) exitWith { + _response set ["message", format ["Unsupported store category: %1", _categoryKey]]; + _response + }; + + _response set ["success", true]; + _response set ["message", ""]; + _response set ["items", _self call ["buildCategoryItems", [_categoryKey]]]; + _response + }], + ["resolveCheckoutCategories", compileFinal { + params [["_entry", createHashMap, [createHashMap]]]; + + private _entryKind = toLowerANSI (_entry getOrDefault ["entryKind", "item"]); + private _category = toLowerANSI (_entry getOrDefault ["category", ""]); + + if (_entryKind isEqualTo "vehicle") exitWith { ["cars", "armor", "helis", "planes", "naval", "other"] }; + if (_category isEqualTo "weapon") exitWith { ["primary", "handgun", "secondary"] }; + if (_category isEqualTo "backpack") exitWith { ["backpacks"] }; + if (_category isEqualTo "attachment") exitWith { ["attachments"] }; + if (_category isEqualTo "magazine") exitWith { ["ammo"] }; + + ["uniforms", "headgear", "vests", "facewear", "misc", "attachments", "backpacks"] + }], + ["resolveCheckoutCatalogEntry", compileFinal { + params [["_entry", createHashMap, [createHashMap]]]; + + private _className = toLowerANSI (_entry getOrDefault ["classname", ""]); + if (_className isEqualTo "") exitWith { createHashMap }; + + private _resolved = createHashMap; + { + private _catalogEntries = _self call ["buildCategoryItems", [_x]]; + private _match = _catalogEntries select { (toLowerANSI (_x getOrDefault ["className", ""])) isEqualTo _className }; + + if (_match isNotEqualTo []) exitWith { _resolved = _match select 0; }; + } forEach (_self call ["resolveCheckoutCategories", [_entry]]); + + _resolved + }], + ["buildCheckoutRequest", compileFinal { + params [["_items", [], [[]]], ["_vehicles", [], [[]]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["total", 0], + ["message", "Checkout total must be greater than zero."], + ["items", []], + ["vehicles", []] + ]; + private _total = 0; + private _message = ""; + private _resolvedItems = []; + private _resolvedVehicles = []; + + { + if (_message isEqualTo "") then { + private _className = _x getOrDefault ["classname", ""]; + private _quantity = floor ((_x getOrDefault ["quantity", 1]) max 0); + + if (_className isEqualTo "" || { _quantity <= 0 }) then { + _message = "Checkout contains an invalid item entry."; + } else { + private _catalogEntry = _self call ["resolveCheckoutCatalogEntry", [createHashMapFromArray [["classname", _className], ["category", _x getOrDefault ["category", "item"]], ["entryKind", "item"]]]]; + + if (_catalogEntry isEqualTo createHashMap) then { + _message = format ["Unsupported store item: %1", _className]; + } else { + private _priceValue = _catalogEntry getOrDefault ["priceValue", 0]; + _total = _total + (_priceValue * _quantity); + _resolvedItems pushBack (createHashMapFromArray [ + ["classname", _className], + ["category", _catalogEntry getOrDefault ["category", "item"]], + ["priceValue", _priceValue], + ["quantity", _quantity] + ]); + }; + }; + }; + } forEach _items; + + { + if (_message isEqualTo "") then { + private _className = _x getOrDefault ["classname", ""]; + if (_className isEqualTo "") then { + _message = "Checkout contains an invalid vehicle entry."; + } else { + private _catalogEntry = _self call ["resolveCheckoutCatalogEntry", [createHashMapFromArray [["classname", _className], ["category", _x getOrDefault ["category", ""]], ["entryKind", "vehicle"]]]]; + + if (_catalogEntry isEqualTo createHashMap) then { + _message = format ["Unsupported store vehicle: %1", _className]; + } else { + private _priceValue = _catalogEntry getOrDefault ["priceValue", 0]; + _total = _total + _priceValue; + _resolvedVehicles pushBack (createHashMapFromArray [ + ["classname", _className], + ["category", _catalogEntry getOrDefault ["category", _x getOrDefault ["category", "other"]]], + ["priceValue", _priceValue] + ]); + }; + }; + }; + } forEach _vehicles; + + if (_message isNotEqualTo "") exitWith { + _result set ["message", _message]; + _result + }; + + if (_total <= 0) exitWith { _result }; + + _result set ["success", true]; + _result set ["total", floor _total]; + _result set ["message", ""]; + _result set ["items", _resolvedItems]; + _result set ["vehicles", _resolvedVehicles]; + _result + }], + ["calculateCheckoutTotal", compileFinal { + params [["_items", [], [[]]], ["_vehicles", [], [[]]]]; + + private _checkout = _self call ["buildCheckoutRequest", [_items, _vehicles]]; + createHashMapFromArray [ + ["success", _checkout getOrDefault ["success", false]], + ["total", _checkout getOrDefault ["total", 0]], + ["message", _checkout getOrDefault ["message", "Checkout total must be greater than zero."]] + ] + }] +]; + +GVAR(StoreCatalogService) = createHashMapObject [GVAR(StoreCatalogServiceBaseClass)]; +GVAR(StoreCatalogService) diff --git a/arma/server/addons/store/functions/fnc_initStore.sqf b/arma/server/addons/store/functions/fnc_initStore.sqf new file mode 100644 index 0000000..b50dbde --- /dev/null +++ b/arma/server/addons/store/functions/fnc_initStore.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initStore.sqf + * Author: IDSolutions + * Date: 2026-04-17 + * Public: No + * + * Description: + * Initializes all editor-placed store entities. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call forge_server_store_fnc_initStore + */ + +private _stores = (allVariables missionNamespace) select { + private _var = missionNamespace getVariable _x; + ("store" in _x) && { _var isEqualType objNull } && { !isNull _var } +}; + +if (_stores isEqualTo []) exitWith { ["INFO", "No editor-placed stores found."] call EFUNC(common,log) }; + +{ + private _store = missionNamespace getVariable _x; + SETPVAR(_store,isStore,true); +} forEach _stores; diff --git a/arma/server/addons/store/functions/fnc_initStorefrontStore.sqf b/arma/server/addons/store/functions/fnc_initStorefrontStore.sqf new file mode 100644 index 0000000..7b0edea --- /dev/null +++ b/arma/server/addons/store/functions/fnc_initStorefrontStore.sqf @@ -0,0 +1,476 @@ +#include "..\script_component.hpp" + +/* + * File: fnc_initStorefrontStore.sqf + * Author: IDSolutions + * Date: 2026-03-12 + * Last Update: 2026-04-04 + * Public: No + * + * Description: + * Initializes the server-side storefront state and checkout flow. + */ + +if (isNil QGVAR(StoreCatalogService)) then { call FUNC(initCatalogService); }; + +#pragma hemtt ignore_variables ["_self"] +GVAR(StorefrontBaseStore) = compileFinal createHashMapFromArray [ + ["#type", "StorefrontBaseStore"], + ["#create", compileFinal { + ["INFO", "Storefront store initialized!"] call EFUNC(common,log); + }], + ["buildHydratePayload", compileFinal { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { createHashMap }; + + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith { createHashMap }; + + private _budget = 50000; + private _creditLine = 0; + private _creditLineDue = 0; + private _cashBalance = 0; + private _bankBalance = 0; + private _orgFunds = 0; + private _orgName = ""; + private _orgOwnerUid = ""; + private _orgCreditLines = createHashMap; + private _playerVar = toLowerANSI (vehicleVarName _player); + private _isOrgLeader = false; + private _isDefaultOrg = false; + private _isDefaultOrgCeo = false; + + private _bankAccount = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + if (_bankAccount isEqualTo createHashMap) then { + _bankAccount = EGVAR(bank,BankStore) call ["init", [_uid]]; + }; + if (_bankAccount isNotEqualTo createHashMap) then { + _cashBalance = _bankAccount getOrDefault ["cash", 0]; + _bankBalance = _bankAccount getOrDefault ["bank", 0]; + }; + + private _orgId = EGVAR(actor,ActorStore) call ["getOrganization", [_uid]]; + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgId]]; + if (_org isEqualTo createHashMap) then { + _org = EGVAR(org,OrgStore) call ["loadById", ["default"]]; + _orgId = _org getOrDefault ["id", "default"]; + }; + + if (_org isNotEqualTo createHashMap) then { + _orgName = _org getOrDefault ["name", ""]; + _orgOwnerUid = _org getOrDefault ["owner", ""]; + _orgFunds = _org getOrDefault ["funds", 0]; + _orgCreditLines = _org getOrDefault ["credit_lines", createHashMap]; + _isDefaultOrg = (_orgId isEqualTo "default") || { toLowerANSI _orgOwnerUid isEqualTo "server" }; + _isOrgLeader = _orgOwnerUid isEqualTo _uid; + _isDefaultOrgCeo = _isDefaultOrg && { _playerVar isEqualTo "ceo" }; + }; + + if (_orgCreditLines isEqualType createHashMap) then { + private _playerCreditLine = _orgCreditLines getOrDefault [_uid, createHashMap]; + if (_playerCreditLine isEqualType createHashMap) then { + _creditLine = _playerCreditLine getOrDefault [ + "available_amount", + _playerCreditLine getOrDefault ["amount", 0] + ]; + _creditLineDue = _playerCreditLine getOrDefault ["amount_due", 0]; + }; + }; + + private _canUseOrgFunds = _isOrgLeader || _isDefaultOrgCeo; + private _orgFundsEnabled = _canUseOrgFunds && { _orgFunds > 0 }; + private _paymentSources = [ + createHashMapFromArray [ + ["id", "cash"], + ["label", "Cash"], + ["balance", _cashBalance], + ["enabled", _cashBalance > 0], + ["detail", "Use on-hand cash carried by the player."] + ], + createHashMapFromArray [ + ["id", "bank"], + ["label", "Bank"], + ["balance", _bankBalance], + ["enabled", _bankBalance > 0], + ["detail", "Charge the player bank account."] + ], + createHashMapFromArray [ + ["id", "org_funds"], + ["label", "Org Funds"], + ["balance", _orgFunds], + ["enabled", _orgFundsEnabled], + ["detail", [ + "Only organization leaders or the default-org CEO can use treasury funds.", + [ + "Charge organization treasury funds.", + "No organization funds are currently available." + ] select _orgFundsEnabled + ] select _canUseOrgFunds] + ], + createHashMapFromArray [ + ["id", "credit_line"], + ["label", "Credit Line"], + ["balance", _creditLine], + ["enabled", _creditLine > 0], + ["detail", [ + "No approved credit line is assigned to this member.", + format [ + "Use the approved procurement credit line. Outstanding due: $%1.", + [_creditLineDue] call EFUNC(common,formatNumber) + ] + ] select (_creditLine > 0)] + ] + ]; + + createHashMapFromArray [ + ["session", createHashMapFromArray [ + ["actorName", name _player], + ["actorUid", _uid], + ["approval", "Field Access"], + ["orgId", _orgId], + ["orgName", _orgName], + ["orgLeader", _isOrgLeader], + ["defaultOrgCeo", _isDefaultOrgCeo], + ["canUseOrgFunds", _canUseOrgFunds] + ]], + ["storeConfig", createHashMapFromArray [ + ["budget", _budget], + ["creditLine", _creditLine], + ["availability", "In-Stock"], + ["moduleState", "Preview"], + ["paymentSources", _paymentSources], + ["defaultPaymentSource", "cash"] + ]], + ["cartItems", []] + ] + }], + ["buildResult", compileFinal { + params [["_message", "Checkout failed.", [""]], ["_paymentMethod", "cash", [""]]]; + + createHashMapFromArray [ + ["success", false], + ["message", _message], + ["paymentMethod", _paymentMethod], + ["chargedTotal", 0], + ["lockerGranted", []], + ["vehicleGranted", []], + ["bankPatch", createHashMap], + ["orgPatch", createHashMap], + ["orgTargetUids", []], + ["persistenceSucceeded", false], + ["persistenceFailures", []], + ["persistenceMessage", ""] + ] + }], + ["formatCurrency", compileFinal { + params [["_amount", 0, [0]]]; + + format ["$%1", [_amount max 0] call EFUNC(common,formatNumber)] + }], + ["callCheckoutBackendEnvelope", compileFinal { + params [["_context", createHashMap, [createHashMap]]]; + + private _envelope = createHashMapFromArray [["data", createHashMap], ["error", ""]]; + if (_context isEqualTo createHashMap) exitWith { + _envelope set ["error", "Checkout request was invalid."]; + _envelope + }; + + ["store:checkout", [toJSON _context]] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !(_isSuccess) exitWith { + _envelope set ["error", "Store backend call failed."]; + _envelope + }; + if !(_result isEqualType "") exitWith { + _envelope set ["error", "Store backend returned an invalid response."]; + _envelope + }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Store extension checkout failed: %1", _result]] call EFUNC(common,log); + _envelope set ["error", _result select [7]]; + _envelope + }; + + private _data = fromJSON _result; + if !(_data isEqualType createHashMap) exitWith { + _envelope set ["error", "Store backend returned unreadable JSON."]; + _envelope + }; + + _envelope set ["data", _data]; + _envelope + }], + ["buildCheckoutContext", compileFinal { + params [ + ["_uid", "", [""]], + ["_player", objNull, [objNull]], + ["_paymentMethod", "cash", [""]], + ["_items", [], [[]]], + ["_vehicles", [], [[]]] + ]; + + if (_uid isEqualTo "" || { isNull _player }) exitWith { createHashMap }; + + private _orgID = EGVAR(org,OrgStore) call ["resolveOrgIdForUid", [_uid]]; + private _requesterIsDefaultOrgCeo = ( + _orgID isEqualTo "default" + && { toLowerANSI (vehicleVarName _player) isEqualTo "ceo" } + ); + + createHashMapFromArray [ + ["requesterUid", _uid], + ["requesterName", name _player], + ["orgId", _orgID], + ["requesterIsDefaultOrgCeo", _requesterIsDefaultOrgCeo], + ["paymentMethod", toLowerANSI _paymentMethod], + ["items", _items], + ["vehicles", _vehicles] + ] + }], + ["syncCheckoutResult", compileFinal { + params [["_player", objNull, [objNull]], ["_result", createHashMap, [createHashMap]]]; + + if (isNull _player || { _result isEqualTo createHashMap }) exitWith { false }; + + private _lockerPatch = _result getOrDefault ["lockerPatch", createHashMap]; + private _vaPatch = _result getOrDefault ["vaPatch", createHashMap]; + private _vgPatch = _result getOrDefault ["vgaragePatch", createHashMap]; + private _bankPatch = _result getOrDefault ["bankPatch", createHashMap]; + private _orgPatch = _result getOrDefault ["orgPatch", createHashMap]; + private _uid = getPlayerUID _player; + + if (keys _lockerPatch isNotEqualTo []) then { + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(locker,responseSyncLocker), [_lockerPatch], _player] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "locker.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["patch", +_lockerPatch] + ], + createHashMapFromArray [["source", "store"]] + ]]; + }; + }; + + if (keys _vaPatch isNotEqualTo []) then { + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(locker,responseSyncVA), [_vaPatch], _player] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "locker.va.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["patch", +_vaPatch] + ], + createHashMapFromArray [["source", "store"]] + ]]; + }; + }; + + if (keys _vgPatch isNotEqualTo []) then { + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(garage,responseSyncVG), [_vgPatch], _player] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "garage.vgarage.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["patch", +_vgPatch] + ], + createHashMapFromArray [["source", "store"]] + ]]; + }; + }; + if (keys _bankPatch isNotEqualTo []) then { + if (isNil QEGVAR(common,EventBus)) then { + [CRPC(bank,responseSyncBank), [_bankPatch], _player] call CFUNC(targetEvent); + } else { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["account", +_bankPatch] + ], + createHashMapFromArray [["source", "store"]] + ]]; + }; + }; + + if (keys _orgPatch isNotEqualTo []) then { + private _orgTargetUids = +(_result getOrDefault ["orgTargetUids", []]); + if (isNil QEGVAR(common,EventBus)) then { + { + private _memberPlayer = [_x] call EFUNC(common,getPlayer); + if (_memberPlayer isNotEqualTo objNull) then { + [CRPC(org,responseSyncOrg), [_orgPatch], _memberPlayer] call CFUNC(targetEvent); + }; + } forEach _orgTargetUids; + } else { + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["memberUids", _orgTargetUids], + ["patch", +_orgPatch] + ], + createHashMapFromArray [["source", "store"]] + ]]; + }; + }; + + true + }], + ["persistCheckoutState", compileFinal { + params [ + ["_uid", "", [""]], + ["_orgID", "", [""]], + ["_backendResult", createHashMap, [createHashMap]] + ]; + + private _result = createHashMapFromArray [ + ["success", true], + ["failures", []], + ["message", ""] + ]; + + if (_uid isEqualTo "" || { _backendResult isEqualTo createHashMap }) exitWith { + _result set ["success", false]; + _result set ["failures", ["checkout"]]; + _result set ["message", "Checkout persistence context was invalid."]; + _result + }; + + private _persistenceFailures = []; + + if ((keys (_backendResult getOrDefault ["lockerPatch", createHashMap])) isNotEqualTo []) then { + if ((EGVAR(locker,LockerStore) call ["save", [_uid]]) isEqualTo createHashMap) then { + _persistenceFailures pushBack "locker"; + }; + }; + + if ((keys (_backendResult getOrDefault ["vaPatch", createHashMap])) isNotEqualTo []) then { + if ((EGVAR(locker,VAStore) call ["save", [_uid]]) isEqualTo createHashMap) then { + _persistenceFailures pushBack "virtual_arsenal"; + }; + }; + + if ((keys (_backendResult getOrDefault ["vgaragePatch", createHashMap])) isNotEqualTo []) then { + if ((EGVAR(garage,VGarageStore) call ["save", [_uid]]) isEqualTo createHashMap) then { + _persistenceFailures pushBack "virtual_garage"; + }; + }; + + if ((keys (_backendResult getOrDefault ["bankPatch", createHashMap])) isNotEqualTo []) then { + if ((EGVAR(bank,BankStore) call ["save", [_uid]]) isEqualTo createHashMap) then { + _persistenceFailures pushBack "bank"; + }; + }; + + if (_orgID isNotEqualTo "" && { (keys (_backendResult getOrDefault ["orgPatch", createHashMap])) isNotEqualTo [] }) then { + if ((EGVAR(org,OrgStore) call ["saveById", [_orgID]]) isEqualTo createHashMap) then { + _persistenceFailures pushBack "organization"; + }; + }; + + if (_persistenceFailures isNotEqualTo []) then { + _result set ["success", false]; + _result set ["failures", _persistenceFailures]; + _result set ["message", format [ + "Checkout completed, but durable save failed for: %1.", + _persistenceFailures joinString ", " + ]]; + }; + + _result + }], + ["checkout", compileFinal { + params [["_uid", "", [""]], ["_player", objNull, [objNull]], ["_payloadJson", "", [""]]]; + + private _result = _self call ["buildResult", ["Checkout failed.", "cash"]]; + private _payload = fromJSON _payloadJson; + if !(_payload isEqualType createHashMap) exitWith { + _result set ["message", "Checkout request payload is invalid."]; + _result + }; + + private _paymentMethod = toLowerANSI (_payload getOrDefault ["paymentMethod", "cash"]); + private _items = _payload getOrDefault ["items", []]; + private _vehicles = _payload getOrDefault ["vehicles", []]; + + if (isNil QGVAR(StoreCatalogService)) exitWith { + _result set ["message", "Store catalog service is unavailable."]; + _result + }; + + private _checkoutRequest = GVAR(StoreCatalogService) call ["buildCheckoutRequest", [_items, _vehicles]]; + private _totalPrice = _checkoutRequest getOrDefault ["total", 0]; + + _result set ["paymentMethod", _paymentMethod]; + _result set ["chargedTotal", _totalPrice]; + + if (_items isEqualTo [] && { _vehicles isEqualTo [] }) exitWith { + _result set ["message", "Add at least one item before checkout."]; + _result + }; + + if !(_checkoutRequest getOrDefault ["success", false]) exitWith { + _result set ["message", _checkoutRequest getOrDefault ["message", "Checkout total must be greater than zero."]]; + _result + }; + + private _checkoutContext = _self call ["buildCheckoutContext", [ + _uid, + _player, + _paymentMethod, + _checkoutRequest getOrDefault ["items", []], + _checkoutRequest getOrDefault ["vehicles", []] + ]]; + if (_checkoutContext isEqualTo createHashMap) exitWith { + _result set ["message", "Checkout request context was invalid."]; + _result + }; + + private _envelope = _self call ["callCheckoutBackendEnvelope", [_checkoutContext]]; + private _backendResult = _envelope getOrDefault ["data", createHashMap]; + if (_backendResult isEqualTo createHashMap) exitWith { + _result set ["message", _envelope getOrDefault ["error", "Checkout failed."]]; + _result + }; + + _self call ["syncCheckoutResult", [_player, _backendResult]]; + private _persistenceResult = _self call [ + "persistCheckoutState", + [ + _uid, + _checkoutContext getOrDefault ["orgId", ""], + _backendResult + ] + ]; + + _result set ["success", true]; + _result set ["message", _backendResult getOrDefault ["message", format [ + "Checkout completed. %1 charged, %2 locker grant(s), %3 vehicle unlock(s).", + _self call ["formatCurrency", [_totalPrice]], + count (_backendResult getOrDefault ["lockerGranted", []]), + count (_backendResult getOrDefault ["vehicleGranted", []]) + ]]]; + _result set ["lockerGranted", _backendResult getOrDefault ["lockerGranted", []]]; + _result set ["vehicleGranted", _backendResult getOrDefault ["vehicleGranted", []]]; + _result set ["persistenceSucceeded", _persistenceResult getOrDefault ["success", false]]; + _result set ["persistenceFailures", _persistenceResult getOrDefault ["failures", []]]; + _result set ["persistenceMessage", _persistenceResult getOrDefault ["message", ""]]; + + if !(_persistenceResult getOrDefault ["success", false]) then { + private _warning = _persistenceResult getOrDefault ["message", "Checkout completed with persistence failures."]; + ["ERROR", format ["Store checkout for %1 completed with persistence failures: %2", _uid, (_persistenceResult getOrDefault ["failures", []]) joinString ", "]] call EFUNC(common,log); + _result set ["message", format ["%1 %2", _result get "message", _warning]]; + }; + + _result + }] +]; + +GVAR(StorefrontStore) = createHashMapObject [GVAR(StorefrontBaseStore)]; +GVAR(StorefrontStore) diff --git a/arma/server/addons/store/script_component.hpp b/arma/server/addons/store/script_component.hpp new file mode 100644 index 0000000..0b59e38 --- /dev/null +++ b/arma/server/addons/store/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT store +#define COMPONENT_BEAUTIFIED Store +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/store/stringtable.xml b/arma/server/addons/store/stringtable.xml new file mode 100644 index 0000000..464a672 --- /dev/null +++ b/arma/server/addons/store/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Store + + + diff --git a/arma/server/addons/task/$PBOPREFIX$ b/arma/server/addons/task/$PBOPREFIX$ new file mode 100644 index 0000000..429c994 --- /dev/null +++ b/arma/server/addons/task/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\task diff --git a/arma/server/addons/task/CfgEventHandlers.hpp b/arma/server/addons/task/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/task/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/task/CfgFactionClasses.hpp b/arma/server/addons/task/CfgFactionClasses.hpp new file mode 100644 index 0000000..84782dd --- /dev/null +++ b/arma/server/addons/task/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class FORGE_Modules: NO_CATEGORY { + displayName = "FORGE"; + }; +}; diff --git a/arma/server/addons/task/CfgMissions.hpp b/arma/server/addons/task/CfgMissions.hpp new file mode 100644 index 0000000..38576f5 --- /dev/null +++ b/arma/server/addons/task/CfgMissions.hpp @@ -0,0 +1,270 @@ +// TODO: Move to mission template and provide documentation +class CfgMissions { + // Global settings + maxConcurrentMissions = 3; + missionInterval = 300; // 5 minutes between mission generation + + // Mission type weights + class MissionWeights { + attack = 0.2; + defend = 0.2; + hostage = 0.2; + hvt = 0.15; + defuse = 0.15; + delivery = 0.1; + }; + + // Mission locations + class Locations { + class CityOne { + position[] = {1000, 1000, 0}; + type = "city"; + radius = 300; + suitable[] = {"attack", "defend", "hostage"}; + }; + class MilitaryBase { + position[] = {2000, 2000, 0}; + type = "military"; + radius = 500; + suitable[] = {"hvt", "defend", "attack"}; + }; + class Industrial { + position[] = {3000, 3000, 0}; + type = "industrial"; + radius = 200; + suitable[] = {"delivery", "defuse"}; + }; + }; + + // AI Groups configuration + class AIGroups { + class Infantry { + side = "EAST"; + class Units { + class Unit0 { + vehicle = "O_Soldier_TL_F"; + rank = "SERGEANT"; + position[] = {0, 0, 0}; + }; + class Unit1 { + vehicle = "O_Soldier_AR_F"; + rank = "CORPORAL"; + position[] = {5, -5, 0}; + }; + class Unit2 { + vehicle = "O_Soldier_LAT_F"; + rank = "PRIVATE"; + position[] = {-5, -5, 0}; + }; + }; + suitable[] = {"attack", "defend", "hostage"}; + }; + class Assault { + side = "EAST"; + class Units { + class Unit0 { + vehicle = "O_Soldier_SL_F"; + rank = "SERGEANT"; + position[] = {0, 0, 0}; + }; + class Unit1 { + vehicle = "O_Soldier_GL_F"; + rank = "CORPORAL"; + position[] = {4, -3, 0}; + }; + class Unit2 { + vehicle = "O_Soldier_AR_F"; + rank = "CORPORAL"; + position[] = {-4, -3, 0}; + }; + class Unit3 { + vehicle = "O_medic_F"; + rank = "PRIVATE"; + position[] = {7, -6, 0}; + }; + }; + suitable[] = {"attack", "defend"}; + }; + class MotorizedPatrol { + side = "EAST"; + class Units { + class Unit0 { + vehicle = "O_Soldier_TL_F"; + rank = "SERGEANT"; + position[] = {0, 0, 0}; + }; + class Unit1 { + vehicle = "O_Soldier_LAT_F"; + rank = "CORPORAL"; + position[] = {5, -4, 0}; + }; + class Unit2 { + vehicle = "O_Soldier_F"; + rank = "PRIVATE"; + position[] = {-5, -4, 0}; + }; + class Unit3 { + vehicle = "O_Soldier_A_F"; + rank = "PRIVATE"; + position[] = {8, -7, 0}; + }; + }; + suitable[] = {"attack", "defend"}; + }; + class SpecOps { + side = "EAST"; + class Units { + class Unit0 { + vehicle = "O_recon_TL_F"; + rank = "SERGEANT"; + position[] = {0, 0, 0}; + }; + class Unit1 { + vehicle = "O_recon_M_F"; + rank = "CORPORAL"; + position[] = {5, -5, 0}; + }; + }; + suitable[] = {"hvt", "hostage"}; + }; + class ReconRaid { + side = "EAST"; + class Units { + class Unit0 { + vehicle = "O_recon_TL_F"; + rank = "SERGEANT"; + position[] = {0, 0, 0}; + }; + class Unit1 { + vehicle = "O_recon_M_F"; + rank = "CORPORAL"; + position[] = {4, -4, 0}; + }; + class Unit2 { + vehicle = "O_recon_LAT_F"; + rank = "CORPORAL"; + position[] = {-4, -4, 0}; + }; + class Unit3 { + vehicle = "O_recon_medic_F"; + rank = "PRIVATE"; + position[] = {7, -7, 0}; + }; + }; + suitable[] = {"attack", "hvt", "hostage"}; + }; + }; + + // TODO: Continue to refine mission types and their specific settings + // Mission type specific settings + class MissionTypes { + class Attack { + minUnits = 4; + maxUnits = 8; + patrolRadius = 200; + class Rewards { + money[] = {25000, 60000}; + reputation[] = {6, 14}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-8, -3}; + timeLimit[] = {900, 1800}; // 15-30 minutes + }; + + class Defend { + minWaves = 3; + maxWaves = 8; + unitsPerWave[] = {4, 8}; + waveCooldown = 300; + class Rewards { + money[] = {40000, 90000}; + reputation[] = {8, 18}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-12, -4}; + timeLimit[] = {1800, 3600}; // 30-60 minutes + }; + + class Hostage { + class Hostages { + civilian[] = {"C_man_1", "C_man_polo_1_F"}; + military[] = {"B_Pilot_F", "B_officer_F"}; + }; + class Rewards { + money[] = {60000, 140000}; + reputation[] = {12, 25}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-16, -6}; + timeLimit[] = {600, 900}; // 10-15 minutes + }; + + class HVT { + class Targets { + officer[] = {"O_officer_F"}; + sniper[] = {"O_sniper_F"}; + }; + escorts = 4; + class Rewards { + money[] = {50000, 120000}; + reputation[] = {10, 22}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-14, -5}; + timeLimit[] = {900, 1800}; // 15-30 minutes + }; + + class Defuse { + class Devices { + small[] = {"DemoCharge_Remote_Mag"}; + large[] = {"SatchelCharge_Remote_Mag"}; + }; + maxDevices = 3; + class Rewards { + money[] = {20000, 50000}; + reputation[] = {5, 12}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-9, -3}; + timeLimit[] = {600, 900}; // 10-15 minutes + }; + + class Delivery { + class Cargo { + supplies[] = {"Land_CargoBox_V1_F"}; + vehicles[] = {"B_MRAP_01_F", "B_Truck_01_transport_F"}; + }; + class Rewards { + money[] = {10000, 30000}; + reputation[] = {3, 8}; + equipment[] = {{"ItemGPS", 0.5}, {"ItemCompass", 0.3}}; + supplies[] = {{"FirstAidKit", 0.2}, {"Medikit", 0.1}}; + weapons[] = {{"arifle_MX_F", 0.3}, {"arifle_Katiba_F", 0.2}}; + vehicles[] = {{"B_MRAP_01_F", 0.1}, {"B_APC_Wheeled_01_cannon_F", 0.05}}; + special[] = {{"B_UAV_01_F", 0.05}, {"B_Heli_Light_01_F", 0.02}}; + }; + penalty[] = {-6, -2}; + timeLimit[] = {900, 1800}; // 15-30 minutes + }; + }; +}; diff --git a/arma/server/addons/task/CfgVehicles.hpp b/arma/server/addons/task/CfgVehicles.hpp new file mode 100644 index 0000000..8870c7f --- /dev/null +++ b/arma/server/addons/task/CfgVehicles.hpp @@ -0,0 +1,1068 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class AttributesBase { + class Edit; + class Combo; + }; + class ModuleDescription {}; + }; + + class FORGE_Module_Attack: Module_F { + scope = 2; + displayName = "Attack Task"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(attackModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Attack_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + // defaultValue = """"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Attack) + class LimitFail: Edit { + property = "FORGE_Module_Attack_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of targets that escape to fail the task"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_Attack_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of targets that need to be eliminated to succeed the task"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Attack_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Attack) + class RatingFail: Edit { + property = "FORGE_Module_Attack_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Attack_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Attack_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Attack_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_Attack_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Time in seconds before targets escape (0 for no limit)"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates an attack task with configurable parameters"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Attack task module", + "Sync with units/vehicles to mark as targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Explosives: Module_F { + scope = 2; + displayName = "Explosive Entities"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(explosivesModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase {}; + class ModuleDescription: ModuleDescription { + description = "Module for explosive entities that need to be defused"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Explosive entities module", + "Sync with objects to mark as explosives", + "Those objects will be processed as defusal targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Hostages: Module_F { + scope = 2; + displayName = "Hostage Entities"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(hostagesModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase {}; + class ModuleDescription: ModuleDescription { + description = "Module for hostage entities that need to be rescued"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Hostage entities module", + "Sync with units to mark as hostages", + "Those objects will be processed as rescue targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Shooters: Module_F { + scope = 2; + displayName = "Shooter Entities"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(shootersModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase {}; + class ModuleDescription: ModuleDescription { + description = "Module for shooter entities that need to be eliminated"; + sync[] = { "AnyBrain" }; + + class AnyBrain { + description[] = { + "Shooter entities module", + "Sync with units to mark as shooters", + "Those objects will be processed as elimination targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Protected: Module_F { + scope = 2; + displayName = "Protected Entities"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(protectedModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase {}; + class ModuleDescription: ModuleDescription { + description = "Module for protected entities that need to be protected"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Protected entities module", + "Sync with objects to mark as protected entities", + "Those objects will be processed as protected targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Defend: Module_F { + scope = 2; + displayName = "Defend Task"; + category = "FORGE_Modules"; + + function = QFUNC(defendModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Defend_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Defend) + class DefenseZone: Edit { + property = "FORGE_Module_Defend_DefenseZone"; + displayName = "Defense Zone Marker"; + tooltip = "Name of the marker defining the defense zone"; + typeName = "STRING"; + }; + class DefendTime: Edit { + property = "FORGE_Module_Defend_DefendTime"; + displayName = "Defend Time"; + tooltip = "Time in seconds the zone must be held"; + typeName = "NUMBER"; + defaultValue = 600; + }; + class WaveCount: Edit { + property = "FORGE_Module_Defend_WaveCount"; + displayName = "Wave Count"; + tooltip = "Number of enemy waves to spawn"; + typeName = "NUMBER"; + defaultValue = 3; + }; + class WaveCooldown: Edit { + property = "FORGE_Module_Defend_WaveCooldown"; + displayName = "Wave Cooldown"; + tooltip = "Time in seconds between enemy waves"; + typeName = "NUMBER"; + defaultValue = 300; + }; + class MinBlufor: Edit { + property = "FORGE_Module_Defend_MinBlufor"; + displayName = "Minimum BLUFOR"; + tooltip = "Minimum number of BLUFOR units that must remain in the zone"; + typeName = "NUMBER"; + defaultValue = 1; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Defend_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Defend) + class RatingFail: Edit { + property = "FORGE_Module_Defend_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Defend_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Defend_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Defend_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a defend task with configurable defense zone and designer-controlled enemy wave templates"; + sync[] = { "AnyBrain" }; + + class AnyBrain { + description[] = { + "Defend task module", + "Sync with enemy units or group members to use their groups as wave templates" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Defuse: Module_F { + scope = 2; + displayName = "Defuse Task"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(defuseModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Defuse_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + // defaultValue = """"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Defuse) + class LimitFail: Edit { + property = "FORGE_Module_Defuse_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of protected entities destroyed to fail the task"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_Defuse_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of entities that need to be defused to complete the task"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Defuse_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Defuse) + class RatingFail: Edit { + property = "FORGE_Module_Defuse_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Defuse_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Defuse_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEnSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Defuse_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_Defuse_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Time in seconds before detonation; must be greater than 0"; + typeName = "NUMBER"; + defaultValue = 300; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a defuse task with configurable parameters"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Defuse task module", + "Sync with entities to mark as explosives and protected entities", + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Destroy: Module_F { + scope = 2; + displayName = "Destroy Task"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(destroyModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Destroy_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + // defaultValue = """"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Destroy) + class LimitFail: Edit { + property = "FORGE_Module_Destroy_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of targets that can escape before failing"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_Destroy_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of targets that need to be destroyed"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Destroy_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Destroy) + class RatingFail: Edit { + property = "FORGE_Module_Destroy_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Destroy_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Destroy_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Destroy_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_Destroy_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Time in seconds before targets escape (0 for no limit)"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a destroy task with configurable parameters"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Destroy task module", + "Sync with units and/or vehicles to mark as targets" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Hostage: Module_F { + scope = 2; + displayName = "Hostage Task"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(hostageModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Hostage_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + // defaultValue = """"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Hostage) + class LimitFail: Edit { + property = "FORGE_Module_Hostage_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of hostages KIA before failing"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_Hostage_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of hostages rescued before succeeding"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class ExtZone: Edit { + property = "FORGE_Module_Hostage_ExtZone"; + displayName = "Extraction Zone"; + tooltip = "Unique marker name for the extraction zone"; + typeName = "STRING"; + // defaultValue = """"; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Hostage_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Hostage) + class RatingFail: Edit { + property = "FORGE_Module_Hostage_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Hostage_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class CBRN: Combo { + property = "FORGE_Module_Hostage_CBRN"; + displayName = "CBRN Attack"; + tooltip = "CBRN Attack instead of execution"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class TrueCBRN { name = "True"; value = 1; }; + class FalseCBRN { name = "False"; value = 0; }; + }; + }; + class Execution: Combo { + property = "FORGE_Module_Hostage_Execution"; + displayName = "Execution"; + tooltip = "Execution instead of CBRN Attack"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class TrueExecution { name = "True"; value = 1; }; + class FalseExecution { name = "False"; value = 0; }; + }; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Hostage_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Hostage_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_Hostage_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Time in seconds before hostages are executed (0 for no limit)"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class CBRNZone: Edit { + property = "FORGE_Module_Hostage_CBRNZone"; + displayName = "CBRN Zone"; + tooltip = "Unique marker name for the CBRN zone"; + typeName = "STRING"; + // defaultValue = """"; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a Hostage task with configurable parameters"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Hostage task module", + "Sync with hostage and shooter module to register the entities to the task" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Delivery: Module_F { + scope = 2; + displayName = "Delivery Task"; + category = "FORGE_Modules"; + + function = QFUNC(deliveryModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_Delivery_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_Delivery) + class DeliveryZone: Edit { + property = "FORGE_Module_Delivery_DeliveryZone"; + displayName = "Delivery Zone Marker"; + tooltip = "Name of the marker defining the delivery destination"; + typeName = "STRING"; + }; + class LimitFail: Edit { + property = "FORGE_Module_Delivery_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of cargo items damaged or lost before failing"; + typeName = "NUMBER"; + defaultValue = 1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_Delivery_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of cargo items that must reach the delivery zone"; + typeName = "NUMBER"; + defaultValue = 1; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_Delivery_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_Delivery) + class RatingFail: Edit { + property = "FORGE_Module_Delivery_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_Delivery_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class EndSuccess: Combo { + property = "FORGE_Module_Delivery_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_Delivery_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_Delivery_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Seconds to complete delivery (0 for no limit)"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a delivery task. Sync with a FORGE_Module_Cargo to register cargo objects."; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Delivery task module", + "Sync with FORGE_Module_Cargo which groups the cargo objects" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_Cargo: Module_F { + scope = 2; + displayName = "Cargo Entities"; + category = "FORGE_Modules"; + + function = QFUNC(cargoModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase {}; + class ModuleDescription: ModuleDescription { + description = "Grouping module for cargo objects in a delivery task. Sync with objects to mark as cargo, then sync this module to FORGE_Module_Delivery."; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "Cargo entities module", + "Sync with objects to mark as delivery cargo" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; + + class FORGE_Module_HVT: Module_F { + scope = 2; + displayName = "HVT Task"; + // icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\default_ca.paa"; + category = "FORGE_Modules"; + + function = QFUNC(hvtModule); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 1; + isDisposable = 1; + is3DEN = 0; + + canSetArea = 0; + canSetAreaShape = 0; + canSetAreaHeight = 0; + + class AttributeValues {}; + class Attributes: AttributesBase { + class TaskID: Edit { + property = "FORGE_Module_HVT_TaskID"; + displayName = "Task ID"; + tooltip = "Unique identifier for this task"; + typeName = "STRING"; + // defaultValue = """"; + }; + TASK_CHAIN_ATTRIBUTES(FORGE_Module_HVT) + class LimitFail: Edit { + property = "FORGE_Module_HVT_LimitFail"; + displayName = "Fail Limit"; + tooltip = "Number of hvts that can escape or KIA before failing"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class LimitSuccess: Edit { + property = "FORGE_Module_HVT_LimitSuccess"; + displayName = "Success Limit"; + tooltip = "Number of hvts that need to be captured or KIA"; + typeName = "NUMBER"; + defaultValue = -1; + }; + class ExtZone: Edit { + property = "FORGE_Module_HVT_ExtZone"; + displayName = "Extraction Zone"; + tooltip = "Unique marker name for the extraction zone"; + typeName = "STRING"; + // defaultValue = """"; + }; + class CompanyFunds: Edit { + property = "FORGE_Module_HVT_CompanyFunds"; + displayName = "Reward Funds"; + tooltip = "Amount of funds awarded on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + REWARD_ARRAY_ATTRIBUTES(FORGE_Module_HVT) + class RatingFail: Edit { + property = "FORGE_Module_HVT_RatingFail"; + displayName = "Rating Loss"; + tooltip = "Amount of rating lost on failure"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class RatingSuccess: Edit { + property = "FORGE_Module_HVT_RatingSuccess"; + displayName = "Rating Gain"; + tooltip = "Amount of rating gained on success"; + typeName = "NUMBER"; + defaultValue = 0; + }; + class CaptureHVT: Combo { + property = "FORGE_Module_HVT_CaptureHVT"; + displayName = "Capture HVT"; + tooltip = "Capture HVT instead of eliminating"; + typeName = "BOOL"; + defaultValue = 1; + + class Values { + class TrueCapture { name = "True"; value = 1; }; + class FalseCapture { name = "False"; value = 0; }; + }; + }; + class EliminateHVT: Combo { + property = "FORGE_Module_HVT_EliminateHVT"; + displayName = "Eliminate HVT"; + tooltip = "Eliminate HVT instead of capturing"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class TrueEliminate { name = "True"; value = 1; }; + class FalseEliminate { name = "False"; value = 0; }; + }; + }; + class EndSuccess: Combo { + property = "FORGE_Module_HVT_EndSuccess"; + displayName = "End on Success"; + tooltip = "End mission when task is completed successfully"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndSuccess { name = "Enable"; value = 1; }; + class DisableEndSuccess { name = "Disable"; value = 0; }; + }; + }; + class EndFail: Combo { + property = "FORGE_Module_HVT_EndFail"; + displayName = "End on Failure"; + tooltip = "End mission when task fails"; + typeName = "BOOL"; + defaultValue = 0; + + class Values { + class EnableEndFail { name = "Enable"; value = 1; }; + class DisableEndFail { name = "Disable"; value = 0; }; + }; + }; + class TimeLimit: Edit { + property = "FORGE_Module_HVT_TimeLimit"; + displayName = "Time Limit"; + tooltip = "Time in seconds before the HVT task fails (0 for no limit)"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + + class ModuleDescription: ModuleDescription { + description = "Creates a HVT task with configurable parameters"; + sync[] = { "Anything" }; + + class Anything { + description[] = { + "HVT task module", + "Sync with units to mark as HVTs" + }; + position = 1; + direction = 1; + optional = 1; + duplicate = 1; + }; + }; + }; +}; diff --git a/arma/server/addons/task/README.md b/arma/server/addons/task/README.md new file mode 100644 index 0000000..31414cc --- /dev/null +++ b/arma/server/addons/task/README.md @@ -0,0 +1,257 @@ +# Forge Task Module + +## Overview +The task addon is a server-owned mission/task system for Forge. It manages task execution, task-owned state, participant tracking, contribution-based player earnings, and org-owned rewards. + +Task operational state is mission-scoped. The extension-backed task catalog, +ownership, status, and defuse state are reset on task store startup, so the +system intentionally starts clean after each server or mission restart. + +## Responsibilities +- spawn and monitor task flows on the server +- track per-task entities through `TaskStore` +- track task participants and engine-rating contribution +- award player earnings through the bank module +- award org funds, reputation, assets, and fleet rewards +- notify task participants and sync org updates to online members + +## Dependencies +- `forge_server_extension` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_bank` +- `forge_server_org` +- `forge_client_notifications` + +## Main Components + +### Task Flows +- `fnc_attack.sqf` +- `fnc_defend.sqf` +- `fnc_defuse.sqf` +- `fnc_delivery.sqf` +- `fnc_destroy.sqf` +- `fnc_hostage.sqf` +- `fnc_hvt.sqf` + +### TaskStore +`fnc_initTaskStore.sqf` initializes `TaskStore`, which owns: +- task ownership bindings +- participant snapshots +- defuse progress +- per-task entity registries for cargo, hostages, HVTs, IEDs, protected entities, shooters, and targets + +**Public API Methods:** +- **Lifecycle**: `bindTaskOwnership`, `releaseTaskOwnership`, `registerTaskCatalogEntry`, `setTaskStatus`, `getTaskStatus`, `clearTaskStatus`, `clearTask` +- **Catalog**: `getActiveTaskCatalog`, `hasTaskCatalogEntry`, `getTaskCatalogEntry` +- **Entities**: `registerTaskEntity`, `getTaskEntities`, `findTaskEntityOwner`, `clearTaskEntities` +- **Participants**: `acceptTask`, `isTaskAccepted`, `trackParticipants`, `getTaskParticipants`, `getTaskParticipantUids`, `notifyParticipants` +- **Rewards**: `resolveRewardContext`, `applyRatingOutcome`, `incrementDefuseCount`, `getDefuseCount` +- **Events**: `emitTaskLifecycleEvent`, `buildTaskLifecycleEventPayload` +- **Utilities**: `callTaskState`, `callTaskStateEnvelope` + +### Object Model +Object-style task instances and entity controllers live under +`functions/objects/` and are initialized directly from `XEH_preInit.sqf`. + +- `TaskInstanceBaseClass` +- `EntityControllerBaseClass` +- `functions/objects/README.md` + +The task functions are compatibility adapters around these object-style task +classes. This keeps the public task function names stable while moving stateful +task behavior into per-task `createHashMapObject` instances. + +### Reward Handling +`fnc_handleTaskRewards.sqf` applies org-owned rewards: +- `funds` -> org funds +- `equipment`, `supplies`, `weapons`, `special` -> org assets +- `vehicles` -> org fleet + +Player `earnings` and org `reputation` from task outcomes are distributed separately through `TaskStore.applyRatingOutcome` using Arma engine `rating` deltas. + +## Task Ownership +Tasks are bound to an owner org when they are started through `fnc_handler.sqf`. + +- if a requester UID is provided, the task is owned by that requester's org +- if no requester UID is available, the task is bound to the `default` org + +Org rewards always go to the bound owner org. Player earnings still use per-player contribution. + +## Usage + +Task time limits use `0` for no limit on attack, destroy, delivery, hostage, +and HVT tasks. Defuse IED timers are different: each IED must have a positive +countdown value. + +Mission designers can create tasks in four ways: + +- Eden modules for editor-authored tasks. +- `fnc_startTask.sqf` for script-authored tasks. +- `fnc_handler.sqf` for pre-registered entities with reputation gating and + ownership binding. This path expects the BIS task and catalog entry to + already exist if map-task and CAD visibility are required. +- Direct task function calls for server-owned or mission-authored flows that + intentionally fall back to the `default` org. This path expects the BIS task + to already exist if map-task visibility is required. + +The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path. + +### CAD Compatibility +CAD hydrates assignable tasks from `TaskStore.getActiveTaskCatalog`. A task must +have a catalog entry and a task status of `available`, `assigned`, or `active` +before CAD can show it. +CAD assignment reserves a task for a group, but task logic waits until the +assigned group leader acknowledges the assignment. Declined assignments return +to the open CAD board. + +CAD-compatible creation paths: +- Eden modules: compatible because they delegate to `fnc_startTask.sqf` +- `fnc_startTask.sqf`: compatible because it registers the catalog entry, + creates the BIS task, and dispatches through `fnc_handler.sqf` +- dynamic mission manager attack tasks: compatible because the mission manager + uses `fnc_startTask.sqf` + +Limited or incompatible paths: +- `fnc_handler.sqf`: only compatible if a catalog entry was already registered + elsewhere. The handler sets available status and ownership, but it does not + create the BIS task shown in the map task tab or upsert the catalog entry +- direct task function calls: not CAD-compatible by default. They bypass + `fnc_startTask.sqf` and usually do not register the task catalog entry or + available/assigned/active status that CAD hydrates from. They also only call + `BIS_fnc_taskSetState` at completion/failure; they do not create the BIS task + first + +### BIS Map Task Prerequisite +Only the Eden task modules and `fnc_startTask.sqf` create the BIS task +automatically through `BIS_fnc_taskCreate`. + +If a mission uses `fnc_handler.sqf` directly or calls a task flow function such +as `forge_server_task_fnc_attack`, the mission must create a BIS task with the +same task ID before the Forge task completes. Otherwise the success/failure +`BIS_fnc_taskSetState` call has no visible map task to update. + +That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted `BIS_fnc_taskCreate` call. `fnc_startTask.sqf` is the preferred Forge +path because it handles BIS task creation, Forge catalog registration, entity +registration, and handler dispatch together. + +### Create With Eden Modules +Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules. + +For a mission-designer-focused step-by-step setup guide, see: + +- `docs/TASK_USAGE_GUIDE.md` + +Available task modules: +- `FORGE_Module_Attack`: sync directly to target units or vehicles +- `FORGE_Module_Destroy`: sync directly to objects, vehicles, or units +- `FORGE_Module_Defuse`: sync to `FORGE_Module_Explosives` and optionally + `FORGE_Module_Protected` +- `FORGE_Module_Delivery`: sync to `FORGE_Module_Cargo`; the cargo module syncs + to cargo objects +- `FORGE_Module_Hostage`: sync to `FORGE_Module_Hostages` and + `FORGE_Module_Shooters` +- `FORGE_Module_HVT`: sync directly to HVT units +- `FORGE_Module_Defend`: configure the defense marker and wave settings; sync + enemy units to use their groups as wave templates + +These modules delegate to `fnc_startTask.sqf`. + +### Start Through `fnc_startTask.sqf` +Use `fnc_startTask.sqf` for script-authored tasks. It registers task entities, +creates the BIS task, stores the catalog entry, and dispatches through +`fnc_handler.sqf`. + +```sqf +[ + "attack", + "compound_attack_01", + getPosATL leader1, + "Attack: East Compound", + "Eliminate all hostile forces.", + createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", 3], + ["funds", 50000], + ["ratingFail", -10], + ["ratingSuccess", 20], + ["timeLimit", 900] + ], + 0, + getPlayerUID player, + "script" +] call forge_server_task_fnc_startTask; +``` + +### Start Through The Handler +Use the handler when you want reputation gating and task ownership binding. +Create the BIS task and catalog entry separately if this task should appear in +the map task tab or CAD. + +```sqf +["attack", ["task_attack_1", 1, 2, 1500000, -75, 375, false, false], 250, getPlayerUID player] call forge_server_task_fnc_handler; +["delivery", ["task_delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900], 0, getPlayerUID player] call forge_server_task_fnc_handler; +``` + +Arguments: +- `0`: task type +- `1`: task-specific argument array +- `2`: minimum org reputation required to start the task +- `3`: requester UID used for ownership binding + +### Start Task Functions Directly +Direct task calls still work, but they do not provide a requester UID. That means task ownership falls back to the `default` org. +Create the BIS task separately if this task should appear in the map task tab. + +Use direct starts only when that behavior is intended, such as: +- mission-authored tasks +- editor-placed tasks +- server-owned/random tasks + +If you want the accepting player's org to own the task rewards, use `fnc_handler.sqf` instead. + +```sqf +["task_attack_1", 1, 2, 1500000, -75, 375, false, false] spawn forge_server_task_fnc_attack; +["task_hostage_1", 1, 2, "extract_marker", 1500000, -75, 500, [false, true], false, false] spawn forge_server_task_fnc_hostage; +``` + +## Event Hooks and Bus Integration +- `XEH_preInit.sqf` + - compiles functions + - initializes `TaskStore` + - initializes task instance and entity controller classes +- `XEH_postInit.sqf` + - registers task lifecycle event listeners with the event bus + - handles task reward, notification, and rating events + - syncs org and bank state through event bus listeners + - registers the ACE defuse event hook + +## Events Emitted +Task module emits the following events to the event bus: +- `task.created` - task instance created +- `task.started` - task execution started +- `task.completed` - task succeeded +- `task.failed` - task failed +- `task.cleared` - task cleaned up +- `task.reward.requested` - org rewards pending application +- `task.reward.applied` - org rewards applied +- `task.rating.applied` - player rating applied +- `task.notification.requested` - participant notifications pending dispatch + +## Notes +- the dynamic mission manager in `fnc_missionManager.sqf` is initialized during task post-init; mission generation only runs when the `forge_task_enableGenerator` CBA setting is enabled +- it starts server-owned tasks through `fnc_handler.sqf` and binds them to the `default` org +- task lifecycle for the mission manager is tracked through `TaskStore` status entries +- task backend state is intentionally transient and resets with the active server/mission lifecycle +- task rewards are org-owned, not player-owned +- participant notifications are sent through the notifications module, not through local server UI + +## Authors +- J. Schmidt +- Creedcoder +- IDSolutions diff --git a/arma/server/addons/task/XEH_PREP.hpp b/arma/server/addons/task/XEH_PREP.hpp new file mode 100644 index 0000000..426b5e0 --- /dev/null +++ b/arma/server/addons/task/XEH_PREP.hpp @@ -0,0 +1,62 @@ +PREP(attack); +PREP(defend); +PREP(defuse); +PREP(delivery); +PREP(destroy); +PREP(handler); +PREP(hostage); +PREP(hvt); +PREP(makeCargo); +PREP(makeHostage); +PREP(makeHVT); +PREP(makeIED); +PREP(makeObject); +PREP(makeShooter); +PREP(makeTarget); +PREP(missionManager); +PREP(initTaskStore); + +PREP_SUBDIR(generators,attackMissionGenerator); + +PREP_SUBDIR(helpers,handleTaskRewards); +PREP_SUBDIR(helpers,parseTaskChainAttributes); +PREP_SUBDIR(helpers,parseRewards); +PREP_SUBDIR(helpers,spawnEnemyWave); +PREP_SUBDIR(helpers,startTask); + +PREP_SUBDIR(modules,attackModule); +PREP_SUBDIR(modules,cargoModule); +PREP_SUBDIR(modules,defendModule); +PREP_SUBDIR(modules,defuseModule); +PREP_SUBDIR(modules,deliveryModule); +PREP_SUBDIR(modules,destroyModule); +PREP_SUBDIR(modules,explosivesModule); +PREP_SUBDIR(modules,hostageModule); +PREP_SUBDIR(modules,hostagesModule); +PREP_SUBDIR(modules,hvtModule); +PREP_SUBDIR(modules,protectedModule); +PREP_SUBDIR(modules,shootersModule); + +PREP_SUBDIR(objects,TaskInstanceBaseClass); +PREP_SUBDIR(objects,TaskStateGateway); +PREP_SUBDIR(objects,TaskLifecycleReporter); +PREP_SUBDIR(objects,TaskCatalogStore); +PREP_SUBDIR(objects,TaskEntityRegistry); +PREP_SUBDIR(objects,TaskParticipantTracker); +PREP_SUBDIR(objects,TaskRewardService); +PREP_SUBDIR(objects,EntityControllerBaseClass); +PREP_SUBDIR(objects,AttackTaskBaseClass); +PREP_SUBDIR(objects,HostageTaskBaseClass); +PREP_SUBDIR(objects,HostageEntityController); +PREP_SUBDIR(objects,TargetEntityController); +PREP_SUBDIR(objects,ShooterEntityController); +PREP_SUBDIR(objects,HVTEntityController); +PREP_SUBDIR(objects,CargoEntityController); +PREP_SUBDIR(objects,ProtectedEntityController); +PREP_SUBDIR(objects,IEDEntityController); +PREP_SUBDIR(objects,DefenseEnemyController); +PREP_SUBDIR(objects,DefuseTaskBaseClass); +PREP_SUBDIR(objects,DestroyTaskBaseClass); +PREP_SUBDIR(objects,DeliveryTaskBaseClass); +PREP_SUBDIR(objects,HVTTaskBaseClass); +PREP_SUBDIR(objects,DefendTaskBaseClass); diff --git a/arma/server/addons/task/XEH_postInit.sqf b/arma/server/addons/task/XEH_postInit.sqf new file mode 100644 index 0000000..7666467 --- /dev/null +++ b/arma/server/addons/task/XEH_postInit.sqf @@ -0,0 +1,135 @@ +#include "script_component.hpp" + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(TaskLifecycleEventLogTokens)) then { + private _logTaskLifecycleEvent = { + params ["_event"]; + + if !(missionNamespace getVariable [QGVAR(enableEventLogs), false]) exitWith {}; + + ["INFO", format [ + "Task lifecycle event: %1 taskID=%2 taskType=%3 status=%4 participants=%5", + _event getOrDefault ["event", ""], + _event getOrDefault ["taskID", ""], + _event getOrDefault ["taskType", ""], + _event getOrDefault ["status", ""], + _event getOrDefault ["participants", []] + ]] call EFUNC(common,log); + }; + + private _logTaskRewardEvent = { + params ["_event"]; + + if !(missionNamespace getVariable [QGVAR(enableEventLogs), false]) exitWith {}; + + ["INFO", format [ + "Task reward event: %1 taskID=%2 success=%3 message=%4", + _event getOrDefault ["event", ""], + _event getOrDefault ["taskID", ""], + !((_event getOrDefault ["event", ""]) in ["task.reward.failed", "task.rating.failed"]), + _event getOrDefault ["message", ""] + ]] call EFUNC(common,log); + }; + + GVAR(TaskLifecycleEventLogTokens) = [ + EGVAR(common,EventBus) call ["on", ["task.created", _logTaskLifecycleEvent, "task.lifecycle.log"]], + EGVAR(common,EventBus) call ["on", ["task.started", _logTaskLifecycleEvent, "task.lifecycle.log"]], + EGVAR(common,EventBus) call ["on", ["task.completed", _logTaskLifecycleEvent, "task.lifecycle.log"]], + EGVAR(common,EventBus) call ["on", ["task.failed", _logTaskLifecycleEvent, "task.lifecycle.log"]], + EGVAR(common,EventBus) call ["on", ["task.cleared", _logTaskLifecycleEvent, "task.lifecycle.log"]], + EGVAR(common,EventBus) call ["on", ["task.reward.requested", _logTaskRewardEvent, "task.reward.log"]], + EGVAR(common,EventBus) call ["on", ["task.reward.applied", _logTaskRewardEvent, "task.reward.log"]], + EGVAR(common,EventBus) call ["on", ["task.reward.failed", _logTaskRewardEvent, "task.reward.log"]], + EGVAR(common,EventBus) call ["on", ["task.rating.applied", _logTaskRewardEvent, "task.reward.log"]], + EGVAR(common,EventBus) call ["on", ["task.rating.failed", _logTaskRewardEvent, "task.reward.log"]] + ]; +}; + +if (isNil QGVAR(TaskNotificationEventTokens)) then { + private _sendTaskNotification = { + params ["_event"]; + + private _type = _event getOrDefault ["notificationType", "info"]; + private _title = _event getOrDefault ["title", "Tasks"]; + private _message = _event getOrDefault ["message", ""]; + private _participantUids = +(_event getOrDefault ["participantUids", []]); + + if (_message isEqualTo "" || { _participantUids isEqualTo [] }) exitWith {}; + + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + } forEach _participantUids; + + if (missionNamespace getVariable [QGVAR(enableEventLogs), false]) then { + ["INFO", format [ + "Task notification event: taskID=%1 type=%2 recipients=%3 message=%4", + _event getOrDefault ["taskID", ""], + _type, + _participantUids, + _message + ]] call EFUNC(common,log); + }; + }; + + private _sendRewardNotification = { + params ["_event"]; + + private _type = _event getOrDefault ["notificationType", "info"]; + private _title = _event getOrDefault ["title", "Tasks"]; + private _message = _event getOrDefault ["message", ""]; + private _memberUids = +(_event getOrDefault ["memberUids", []]); + + if (_message isEqualTo "" || { _memberUids isEqualTo [] }) exitWith {}; + + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + } forEach _memberUids; + + if (missionNamespace getVariable [QGVAR(enableEventLogs), false]) then { + ["INFO", format [ + "Task reward notification event: taskID=%1 type=%2 recipients=%3 message=%4", + _event getOrDefault ["taskID", ""], + _type, + _memberUids, + _message + ]] call EFUNC(common,log); + }; + }; + + GVAR(TaskNotificationEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["task.notification.requested", _sendTaskNotification, "task.notification.send"]], + EGVAR(common,EventBus) call ["on", ["task.reward.notification.requested", _sendRewardNotification, "task.reward.notification.send"]] + ]; +}; + +["ace_explosives_defuse", { + private _taskID = ""; + private _explosive = objNull; + { + if (_x isEqualType objNull && { !isNull _x }) then { + if (isNull _explosive) then { _explosive = _x; }; + _taskID = _x getVariable ["assignedTask", ""]; + if (_taskID isNotEqualTo "") exitWith {}; + }; + } forEach _this; + + if (_taskID isEqualTo "" && { !isNull _explosive }) then { + _taskID = GVAR(TaskStore) call ["findTaskEntityOwner", ["ieds", _explosive]]; + }; + + if (_taskID isEqualTo "") exitWith { + ["WARNING", format [ + "ACE Defuse Event Ignored: No assignedTask found. Explosive=%1, Type=%2, NetID=%3", + _explosive, + typeOf _explosive, + netId _explosive + ]] call EFUNC(common,log); + }; + + GVAR(TaskStore) call ["incrementDefuseCount", [_taskID]]; +}] call CFUNC(addEventHandler); +[] call FUNC(missionManager); diff --git a/arma/server/addons/task/XEH_preInit.sqf b/arma/server/addons/task/XEH_preInit.sqf new file mode 100644 index 0000000..9aea1c0 --- /dev/null +++ b/arma/server/addons/task/XEH_preInit.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +#include "initSettings.inc.sqf" + +[] call FUNC(TaskStateGateway); +[] call FUNC(TaskLifecycleReporter); +[] call FUNC(TaskCatalogStore); +[] call FUNC(TaskEntityRegistry); +[] call FUNC(TaskParticipantTracker); +[] call FUNC(TaskRewardService); +[] call FUNC(TaskInstanceBaseClass); +[] call FUNC(EntityControllerBaseClass); +[] call FUNC(AttackTaskBaseClass); +[] call FUNC(HostageTaskBaseClass); +[] call FUNC(HostageEntityController); +[] call FUNC(TargetEntityController); +[] call FUNC(ShooterEntityController); +[] call FUNC(HVTEntityController); +[] call FUNC(CargoEntityController); +[] call FUNC(ProtectedEntityController); +[] call FUNC(IEDEntityController); +[] call FUNC(DefenseEnemyController); +[] call FUNC(DefuseTaskBaseClass); +[] call FUNC(DestroyTaskBaseClass); +[] call FUNC(DeliveryTaskBaseClass); +[] call FUNC(HVTTaskBaseClass); +[] call FUNC(DefendTaskBaseClass); + +call FUNC(initTaskStore); +if !(isNil QGVAR(TaskStore)) then { GVAR(TaskStore) call ["resetMissionState", []]; }; diff --git a/arma/server/addons/task/XEH_preStart.sqf b/arma/server/addons/task/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/arma/server/addons/task/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/task/backup/attack-mission-generator-2026-04-26.7z b/arma/server/addons/task/backup/attack-mission-generator-2026-04-26.7z new file mode 100644 index 0000000..5a54903 Binary files /dev/null and b/arma/server/addons/task/backup/attack-mission-generator-2026-04-26.7z differ diff --git a/arma/server/addons/task/config.cpp b/arma/server/addons/task/config.cpp new file mode 100644 index 0000000..fa97541 --- /dev/null +++ b/arma/server/addons/task/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main", + "forge_server_common" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" +#include "CfgMissions.hpp" diff --git a/arma/server/addons/task/functions/fnc_attack.sqf b/arma/server/addons/task/functions/fnc_attack.sqf new file mode 100644 index 0000000..b7fa533 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_attack.sqf @@ -0,0 +1,78 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Registers an attack task. + * + * This public function is now a compatibility adapter around + * AttackTaskBaseClass. Keep the argument list stable for Eden modules, + * startTask, and external scripts while the object-style task objects + * become the live implementation. + * + * Arguments: + * 0: ID of the task + * 1: Amount of targets escaped to fail the task + * 2: Amount of targets eliminated to complete the task + * 3: Amount of funds the company receives if the task is successful + * 4: Amount of rating the company and player lose if the task is failed + * 5: Amount of rating the company and player receive if the task is successful + * 6: Should the mission end if the task is successful + * 7: Should the mission end if the task is failed + * 8: Amount of time before target(s) escape + * 9: Equipment rewards + * 10: Supply rewards + * 11: Weapon rewards + * 12: Vehicle rewards + * 13: Special rewards + * + * Return Value: + * None + * + * Public: Yes + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_timeLimit", 0, [0]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["timeLimit", _timeLimit], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(AttackTaskBaseClass), + [ + _taskID, + createHashMapFromArray [["targets", GVAR(TaskStore) call ["getTaskEntities", ["targets", _taskID]]]], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_defend.sqf b/arma/server/addons/task/functions/fnc_defend.sqf new file mode 100644 index 0000000..872bfa5 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_defend.sqf @@ -0,0 +1,57 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style defend task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_defenseZone", "", [""]], + ["_defendTime", 600, [0]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_waveCount", 3, [0]], + ["_waveCooldown", 300, [0]], + ["_minBlufor", 1, [0]], + ["_enemyTemplates", [], [[]]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["defenseZone", _defenseZone], + ["defendTime", _defendTime], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["waveCount", _waveCount], + ["waveCooldown", _waveCooldown], + ["minBlufor", _minBlufor], + ["enemyTemplates", _enemyTemplates], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(DefendTaskBaseClass), + [ + _taskID, + createHashMap, + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_defuse.sqf b/arma/server/addons/task/functions/fnc_defuse.sqf new file mode 100644 index 0000000..9c56394 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_defuse.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style defuse task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(DefuseTaskBaseClass), + [ + _taskID, + createHashMapFromArray [ + ["ieds", GVAR(TaskStore) call ["getTaskEntities", ["ieds", _taskID]]], + ["protected", GVAR(TaskStore) call ["getTaskEntities", ["entities", _taskID]]] + ], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_delivery.sqf b/arma/server/addons/task/functions/fnc_delivery.sqf new file mode 100644 index 0000000..291c262 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_delivery.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style delivery task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_deliveryZone", "", [""]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_timeLimit", 0, [0]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["deliveryZone", _deliveryZone], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["timeLimit", _timeLimit], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(DeliveryTaskBaseClass), + [ + _taskID, + createHashMapFromArray [["cargo", GVAR(TaskStore) call ["getTaskEntities", ["cargo", _taskID]]]], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_destroy.sqf b/arma/server/addons/task/functions/fnc_destroy.sqf new file mode 100644 index 0000000..49ece7e --- /dev/null +++ b/arma/server/addons/task/functions/fnc_destroy.sqf @@ -0,0 +1,51 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style destroy task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_timeLimit", 0, [0]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["timeLimit", _timeLimit], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(DestroyTaskBaseClass), + [ + _taskID, + createHashMapFromArray [["targets", GVAR(TaskStore) call ["getTaskEntities", ["targets", _taskID]]]], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_handler.sqf b/arma/server/addons/task/functions/fnc_handler.sqf new file mode 100644 index 0000000..a26640d --- /dev/null +++ b/arma/server/addons/task/functions/fnc_handler.sqf @@ -0,0 +1,127 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Server side task handler/spawner + * + * Arguments: + * 0: Type of task + * 1: Arguments for task + * 2: Minimum org reputation for task (default: 0) + * 3: Requester UID (default: "") + * + * Return Value: + * None + * + * Example: + * ["task_type", [_reward, _punish, _time, etc.....], minReputation, requesterUid] call forge_server_task_fnc_handler; + * + * Public: Yes + */ + +params [["_taskType", "", [""]], ["_args", [], [[]]], ["_minRating", 0, [0]], ["_requesterUid", "", [""]]]; + +private _taskID = ""; +private _shouldStartTaskLogic = true; + +if (_minRating > 0) then { + if (_requesterUid isEqualTo "") then { + ["WARNING", format ["Task %1 requires minimum reputation %2 but no requester UID was provided, skipping reputation gate.", _taskType, _minRating]] call EFUNC(common,log); + } else { + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgID]]; + private _orgReputation = _org getOrDefault ["reputation", 0]; + if (_orgReputation < _minRating) exitWith { + private _message = format ["Organization reputation of %1 does not meet the minimum required reputation of %2.", _orgReputation, _minRating]; + ["WARNING", format ["Task %1 blocked: %2", _taskType, _message]] call EFUNC(common,log); + + private _player = [_requesterUid] call EFUNC(common,getPlayer); + if (isNull _player) exitWith {}; + + [CRPC(notifications,recieveNotification), ["warning", "Tasks", _message], _player] call CFUNC(targetEvent); + }; + }; +}; + +if (_args isNotEqualTo [] && { (_args select 0) isEqualType "" }) then { + _taskID = _args select 0; +}; + +if (_taskID isNotEqualTo "") then { + private _catalogEntry = GVAR(TaskStore) call ["getTaskCatalogEntry", [_taskID]]; + private _source = if (_catalogEntry isEqualType createHashMap) then { + _catalogEntry getOrDefault ["source", ""] + } else { + "" + }; + + if (_requesterUid isNotEqualTo "" || { _source isNotEqualTo "mission_manager" }) then { + private _ownershipResult = GVAR(TaskStore) call ["bindTaskOwnership", [_taskID, _requesterUid]]; + if !(_ownershipResult getOrDefault ["success", false]) then { + ["WARNING", format [ + "Failed to bind task ownership for %1 (%2): %3", + _taskID, + _taskType, + _ownershipResult getOrDefault ["message", "Unknown error."] + ]] call EFUNC(common,log); + }; + } else { + ["INFO", format [ + "Skipped automatic ownership bind for generated mission %1 so it remains unaccepted until a player accepts it.", + _taskID + ]] call EFUNC(common,log); + }; + + private _initialStatus = GVAR(TaskStore) call ["resolveInitialTaskStatus", [_taskID, _catalogEntry]]; + GVAR(TaskStore) call ["setTaskStatus", [_taskID, _initialStatus]]; + if (_initialStatus isEqualTo "locked") then { + ["INFO", format ["Task %1 is waiting for chained prerequisites before task logic starts.", _taskID]] call EFUNC(common,log); + waitUntil { + sleep 2; + private _status = GVAR(TaskStore) call ["getTaskStatus", [_taskID]]; + _status isNotEqualTo "locked" + }; + if ((GVAR(TaskStore) call ["getTaskStatus", [_taskID]]) isEqualTo "") then { + _shouldStartTaskLogic = false; + ["WARNING", format ["Task %1 was cleared before its chained prerequisites unlocked.", _taskID]] call EFUNC(common,log); + }; + }; +}; + +if !(_shouldStartTaskLogic) exitWith {}; + +switch (_taskType) do { + case "attack": { + private _thread = _args spawn FUNC(attack); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "defuse": { + private _thread = _args spawn FUNC(defuse); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "destroy": { + private _thread = _args spawn FUNC(destroy); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "delivery": { + private _thread = _args spawn FUNC(delivery); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "defend": { + private _thread = _args spawn FUNC(defend); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "hostage": { + private _thread = _args spawn FUNC(hostage); + waitUntil { sleep 2; scriptDone _thread }; + }; + case "hvt": { + private _thread = _args spawn FUNC(hvt); + waitUntil { sleep 2; scriptDone _thread }; + }; + default { + ["ERROR", format ["Unknown Contract Type: %1", _taskType]] call EFUNC(common,log); + }; +}; + +["INFO", "Mission Handler Done"] call EFUNC(common,log); diff --git a/arma/server/addons/task/functions/fnc_hostage.sqf b/arma/server/addons/task/functions/fnc_hostage.sqf new file mode 100644 index 0000000..e6351fc --- /dev/null +++ b/arma/server/addons/task/functions/fnc_hostage.sqf @@ -0,0 +1,62 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style hostage task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_extZone", "", [""]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_type", [false, true], [[]]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_timeLimit", 0, [0]], + ["_cbrnZone", "", [""]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["extractionZone", _extZone], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["type", _type], + ["cbrn", _type param [0, false, [false]]], + ["execution", _type param [1, true, [false]]], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["timeLimit", _timeLimit], + ["cbrnZone", _cbrnZone], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(HostageTaskBaseClass), + [ + _taskID, + createHashMapFromArray [ + ["hostages", GVAR(TaskStore) call ["getTaskEntities", ["hostages", _taskID]]], + ["shooters", GVAR(TaskStore) call ["getTaskEntities", ["shooters", _taskID]]] + ], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_hvt.sqf b/arma/server/addons/task/functions/fnc_hvt.sqf new file mode 100644 index 0000000..0c1afa2 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_hvt.sqf @@ -0,0 +1,56 @@ +#include "..\script_component.hpp" + +/* + * Compatibility adapter for the object-style HVT task implementation. + */ + +params [ + ["_taskID", "", [""]], + ["_limitFail", -1, [0]], + ["_limitSuccess", -1, [0]], + ["_extZone", "", [""]], + ["_companyFunds", 0, [0]], + ["_ratingFail", 0, [0]], + ["_ratingSuccess", 0, [0]], + ["_type", [true, false], [[]]], + ["_endSuccess", false, [false]], + ["_endFail", false, [false]], + ["_timeLimit", 0, [0]], + ["_equipmentRewards", [], [[]]], + ["_supplyRewards", [], [[]]], + ["_weaponRewards", [], [[]]], + ["_vehicleRewards", [], [[]]], + ["_specialRewards", [], [[]]] +]; + +private _taskParams = createHashMapFromArray [ + ["limitFail", _limitFail], + ["limitSuccess", _limitSuccess], + ["extractionZone", _extZone], + ["funds", _companyFunds], + ["ratingFail", _ratingFail], + ["ratingSuccess", _ratingSuccess], + ["type", _type], + ["captureHvt", _type param [0, true, [false]]], + ["endSuccess", _endSuccess], + ["endFail", _endFail], + ["timeLimit", _timeLimit], + ["useTaskStore", true] +]; + +if (_equipmentRewards isNotEqualTo []) then { _taskParams set ["equipment", _equipmentRewards]; }; +if (_supplyRewards isNotEqualTo []) then { _taskParams set ["supplies", _supplyRewards]; }; +if (_weaponRewards isNotEqualTo []) then { _taskParams set ["weapons", _weaponRewards]; }; +if (_vehicleRewards isNotEqualTo []) then { _taskParams set ["vehicles", _vehicleRewards]; }; +if (_specialRewards isNotEqualTo []) then { _taskParams set ["special", _specialRewards]; }; + +private _task = createHashMapObject [ + GVAR(HVTTaskBaseClass), + [ + _taskID, + createHashMapFromArray [["hvts", GVAR(TaskStore) call ["getTaskEntities", ["hvts", _taskID]]]], + _taskParams + ] +]; + +_task call ["runLoop", []]; diff --git a/arma/server/addons/task/functions/fnc_initTaskStore.sqf b/arma/server/addons/task/functions/fnc_initTaskStore.sqf new file mode 100644 index 0000000..6b01de5 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_initTaskStore.sqf @@ -0,0 +1,160 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the task store for task entity tracking, participant + * contribution tracking, and task outcome application. + * + * Task metadata is extension-backed but intentionally transient. The task + * backend is reset explicitly from task preInit so task/catalog/status state + * starts clean before mission setup repopulates contracts. + * + * Arguments: + * None + * + * Return Value: + * Task store object [HASHMAP OBJECT] + * + * Example: + * call forge_server_task_fnc_initTaskStore + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskStore) = createHashMapObject [[ + ["#type", "TaskStore"], + ["#create", compileFinal {}], + ["resetMissionState", compileFinal { + GVAR(TaskLifecycleReporter) call ["resetRuntimeState", []]; + GVAR(TaskCatalogStore) call ["resetRuntimeState", []]; + GVAR(TaskEntityRegistry) call ["resetRuntimeState", []]; + GVAR(TaskParticipantTracker) call ["resetRuntimeState", []]; + + GVAR(TaskStateGateway) call ["reset", []] + }], + ["bindTaskOwnership", compileFinal { + params [["_taskID", "", [""]], ["_requesterUid", "", [""]]]; + GVAR(TaskCatalogStore) call ["bindTaskOwnership", [_taskID, _requesterUid]] + }], + ["releaseTaskOwnership", compileFinal { + params [["_taskID", "", [""]]]; + GVAR(TaskCatalogStore) call ["releaseTaskOwnership", [_taskID]] + }], + ["buildTaskLifecycleEventPayload", compileFinal { + GVAR(TaskLifecycleReporter) call ["buildTaskLifecycleEventPayload", _this] + }], + ["emitTaskLifecycleEvent", compileFinal { + GVAR(TaskLifecycleReporter) call ["emitTaskLifecycleEvent", _this] + }], + ["normalizePrerequisiteTaskIds", compileFinal { + GVAR(TaskCatalogStore) call ["normalizePrerequisiteTaskIds", _this] + }], + ["getTaskPrerequisites", compileFinal { + GVAR(TaskCatalogStore) call ["getTaskPrerequisites", _this] + }], + ["isTaskCompleted", compileFinal { + GVAR(TaskCatalogStore) call ["isTaskCompleted", _this] + }], + ["areTaskPrerequisitesSatisfied", compileFinal { + GVAR(TaskCatalogStore) call ["areTaskPrerequisitesSatisfied", _this] + }], + ["resolveInitialTaskStatus", compileFinal { + GVAR(TaskCatalogStore) call ["resolveInitialTaskStatus", _this] + }], + ["markTaskCompleted", compileFinal { + GVAR(TaskCatalogStore) call ["markTaskCompleted", _this] + }], + ["unlockDependentTasks", compileFinal { + GVAR(TaskCatalogStore) call ["unlockDependentTasks", _this] + }], + ["registerTaskCatalogEntry", compileFinal { + GVAR(TaskCatalogStore) call ["registerTaskCatalogEntry", _this] + }], + ["getActiveTaskCatalog", compileFinal { + GVAR(TaskCatalogStore) call ["getActiveTaskCatalog", _this] + }], + ["hasTaskCatalogEntry", compileFinal { + GVAR(TaskCatalogStore) call ["hasTaskCatalogEntry", _this] + }], + ["getTaskCatalogEntry", compileFinal { + GVAR(TaskCatalogStore) call ["getTaskCatalogEntry", _this] + }], + ["isTaskAccepted", compileFinal { + GVAR(TaskCatalogStore) call ["isTaskAccepted", _this] + }], + ["acceptTask", compileFinal { + GVAR(TaskCatalogStore) call ["acceptTask", _this] + }], + ["setTaskStatus", compileFinal { + GVAR(TaskCatalogStore) call ["setTaskStatus", _this] + }], + ["getTaskStatus", compileFinal { + GVAR(TaskCatalogStore) call ["getTaskStatus", _this] + }], + ["clearTaskStatus", compileFinal { + GVAR(TaskCatalogStore) call ["clearTaskStatus", _this] + }], + ["registerTaskEntity", compileFinal { + GVAR(TaskEntityRegistry) call ["registerTaskEntity", _this] + }], + ["getTaskEntities", compileFinal { + GVAR(TaskEntityRegistry) call ["getTaskEntities", _this] + }], + ["findTaskEntityOwner", compileFinal { + GVAR(TaskEntityRegistry) call ["findTaskEntityOwner", _this] + }], + ["clearTaskEntities", compileFinal { + GVAR(TaskEntityRegistry) call ["clearTaskEntities", _this] + }], + ["trackParticipants", compileFinal { + GVAR(TaskParticipantTracker) call ["trackParticipants", _this] + }], + ["getTaskParticipants", compileFinal { + GVAR(TaskParticipantTracker) call ["getTaskParticipants", _this] + }], + ["getTaskParticipantUids", compileFinal { + GVAR(TaskParticipantTracker) call ["getTaskParticipantUids", _this] + }], + ["resolveRewardContext", compileFinal { + GVAR(TaskRewardService) call ["resolveRewardContext", _this] + }], + ["incrementDefuseCount", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { 0 }; + + [GVAR(TaskStateGateway) call ["callTaskState", ["task:defuse:increment", [_taskID], 0]]] params [["_count", 0, [0]]]; + _count + }], + ["getDefuseCount", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { 0 }; + + [GVAR(TaskStateGateway) call ["callTaskState", ["task:defuse:get", [_taskID], 0]]] params [["_count", 0, [0]]]; + _count + }], + ["notifyParticipants", compileFinal { + GVAR(TaskParticipantTracker) call ["notifyParticipants", _this] + }], + ["clearTask", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + _self call ["emitTaskLifecycleEvent", ["task.cleared", _taskID, "cleared", createHashMap]]; + + GVAR(TaskLifecycleReporter) call ["clearTaskLifecycle", [_taskID]]; + GVAR(TaskParticipantTracker) call ["clearTaskParticipants", [_taskID]]; + GVAR(TaskCatalogStore) call ["clearRuntimeTask", [_taskID]]; + GVAR(TaskStateGateway) call ["callTaskState", ["task:clear", [_taskID], false]]; + _self call ["clearTaskEntities", [_taskID]]; + true + }], + ["applyRatingOutcome", compileFinal { + GVAR(TaskRewardService) call ["applyRatingOutcome", _this] + }] +]]; + +GVAR(TaskStore) diff --git a/arma/server/addons/task/functions/fnc_makeCargo.sqf b/arma/server/addons/task/functions/fnc_makeCargo.sqf new file mode 100644 index 0000000..5f53ca0 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeCargo.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" + +/* + * Assigns cargo to a task for delivery. + * + * Public compatibility adapter around CargoEntityController. + */ + +params [["_cargo", objNull, [objNull]], ["_taskID", "", [""]]]; + +["INFO", format ["Make Cargo: %1", _this]] call EFUNC(common,log); + +if (isNull _cargo) exitWith { ["ERROR", "Attempt to create cargo from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for cargo"] call EFUNC(common,log); false }; + +private _controller = createHashMapObject [ + GVAR(CargoEntityController), + [_taskID, _cargo, createHashMap] +]; + +if !(_controller call ["registerTaskEntity", ["cargo"]]) exitWith { false }; +_controller call ["watchDamage", []] diff --git a/arma/server/addons/task/functions/fnc_makeHVT.sqf b/arma/server/addons/task/functions/fnc_makeHVT.sqf new file mode 100644 index 0000000..54d7da5 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeHVT.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Assigns an AI unit to a task as an HVT. + * + * Public compatibility adapter around HVTEntityController. + */ + +params [["_entity", objNull, [objNull, grpNull]], ["_taskID", "", [""]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; + +["INFO", format ["Make HVT: %1", _this]] call EFUNC(common,log); + +private _controller = createHashMapObject [ + GVAR(HVTEntityController), + [_taskID, _entity, createHashMap] +]; + +_controller call ["registerTaskEntity", ["hvts"]]; + +true diff --git a/arma/server/addons/task/functions/fnc_makeHostage.sqf b/arma/server/addons/task/functions/fnc_makeHostage.sqf new file mode 100644 index 0000000..1e1ed2a --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeHostage.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" + +/* + * Assigns an AI unit to a task as a hostage. + * + * Public compatibility adapter around HostageEntityController. The hostage + * task instance owns the rescue loop, so this helper only registers and + * applies initial state. + */ + +params [["_entity", objNull, [objNull, grpNull]], ["_taskID", "", [""]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; + +["INFO", format ["Make Hostage: %1", _this]] call EFUNC(common,log); + +private _controller = createHashMapObject [ + GVAR(HostageEntityController), + [_taskID, _entity, createHashMap] +]; + +if !(_controller call ["registerTaskEntity", ["hostages"]]) exitWith { false }; +_controller call ["applyInitialState", []] diff --git a/arma/server/addons/task/functions/fnc_makeIED.sqf b/arma/server/addons/task/functions/fnc_makeIED.sqf new file mode 100644 index 0000000..92159cd --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeIED.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" + +/* + * Assigns an IED to a task and starts its required countdown timer. + * + * Public compatibility adapter around IEDEntityController. + */ + +params [["_entity", objNull, [objNull]], ["_taskID", "", [""]], ["_time", 0, [0]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; +if (_time <= 0) exitWith { ["ERROR", "Invalid time provided for IED"] call EFUNC(common,log); false }; + +["INFO", format ["Make IED: %1", _this]] call EFUNC(common,log); + +_entity setVariable [QGVAR(iedCountdown), _time, true]; + +private _controller = createHashMapObject [ + GVAR(IEDEntityController), + [_taskID, _entity, createHashMapFromArray [["countdown", _time]]] +]; + +_controller call ["registerTaskEntity", ["ieds"]]; + +true diff --git a/arma/server/addons/task/functions/fnc_makeObject.sqf b/arma/server/addons/task/functions/fnc_makeObject.sqf new file mode 100644 index 0000000..dcddff3 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeObject.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" + +/* + * Assigns an object to a task as a protected target. + * + * Public compatibility adapter around ProtectedEntityController. + */ + +params [["_entity", objNull, [objNull]], ["_taskID", "", [""]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; + +["INFO", format ["Make Object: %1", _this]] call EFUNC(common,log); + +private _controller = createHashMapObject [ + GVAR(ProtectedEntityController), + [_taskID, _entity, createHashMap] +]; + +_controller call ["registerTaskEntity", ["entities"]] diff --git a/arma/server/addons/task/functions/fnc_makeShooter.sqf b/arma/server/addons/task/functions/fnc_makeShooter.sqf new file mode 100644 index 0000000..7a10e53 --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeShooter.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" + +/* + * Assigns an AI unit to a task as a shooter. + * + * Public compatibility adapter around ShooterEntityController. + */ + +params [["_entity", objNull, [objNull, grpNull]], ["_taskID", "", [""]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; + +["INFO", format ["Make Shooter: %1", _this]] call EFUNC(common,log); + +private _controller = createHashMapObject [ + GVAR(ShooterEntityController), + [_taskID, _entity, createHashMap] +]; + +_controller call ["registerTaskEntity", ["shooters"]] diff --git a/arma/server/addons/task/functions/fnc_makeTarget.sqf b/arma/server/addons/task/functions/fnc_makeTarget.sqf new file mode 100644 index 0000000..c5570df --- /dev/null +++ b/arma/server/addons/task/functions/fnc_makeTarget.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" + +/* + * Assigns an object to a task as a target. + * + * Public compatibility adapter around TargetEntityController. + */ + +params [["_entity", objNull, [objNull, grpNull]], ["_taskID", "", [""]]]; + +if (isNull _entity) exitWith { ["ERROR", "Attempt to create entity from null object"] call EFUNC(common,log); false }; +if (_taskID isEqualTo "") exitWith { ["ERROR", "No task ID provided for entity"] call EFUNC(common,log); false }; + +["INFO", format ["Make Target: %1", _this]] call EFUNC(common,log); + +private _controller = createHashMapObject [ + GVAR(TargetEntityController), + [_taskID, _entity, createHashMap] +]; + +_controller call ["registerTaskEntity", ["targets"]] diff --git a/arma/server/addons/task/functions/fnc_missionManager.sqf b/arma/server/addons/task/functions/fnc_missionManager.sqf new file mode 100644 index 0000000..72a6e4d --- /dev/null +++ b/arma/server/addons/task/functions/fnc_missionManager.sqf @@ -0,0 +1,173 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Manages dynamic mission generators. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_server_task_fnc_missionManager + * + * Public: No + */ + +if !(isServer) exitWith { false }; +if !(isNil QGVAR(MissionManagerPFH)) exitWith { false }; +if (isNil QGVAR(AttackMissionGeneratorBaseClass)) then { call FUNC(attackMissionGenerator); }; + +#pragma hemtt ignore_variables ["_self"] +GVAR(MissionManagerBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "MissionManagerBaseClass"], + ["#create", compileFinal { + _self set ["lastMissionGenerationAt", -1e10]; + _self set ["recentLocationRegistry", []]; + _self set ["activeMissionRegistry", createHashMap]; + _self set ["generators", [createHashMapObject [GVAR(AttackMissionGeneratorBaseClass)]]]; + }], + ["getGenerators", compileFinal { + _self getOrDefault ["generators", []] + }], + ["getActiveMissionIds", compileFinal { + private _activeMissionRegistry = _self getOrDefault ["activeMissionRegistry", createHashMap]; + keys _activeMissionRegistry + }], + ["getActiveGeneratedMissionIds", compileFinal { + private _activeCatalog = GVAR(TaskStore) call ["getActiveTaskCatalog", []]; + if !(_activeCatalog isEqualType []) exitWith { [] }; + + private _taskIds = []; + { + if !(_x isEqualType createHashMap) then { continue; }; + if ((_x getOrDefault ["source", ""]) isNotEqualTo "mission_manager") then { continue; }; + + private _taskID = _x getOrDefault ["taskId", _x getOrDefault ["taskID", ""]]; + if (_taskID isNotEqualTo "") then { + _taskIds pushBackUnique _taskID; + }; + } forEach _activeCatalog; + + _taskIds + }], + ["getMaxConcurrentMissions", compileFinal { + private _maxConcurrent = 1; + { + _maxConcurrent = _maxConcurrent max (_x call ["getMaxConcurrentMissions", []]); + } forEach (_self call ["getGenerators", []]); + _maxConcurrent + }], + ["getMissionInterval", compileFinal { + private _interval = 300; + private _generators = _self call ["getGenerators", []]; + if (_generators isEqualTo []) exitWith { _interval }; + + _interval = (_generators select 0) call ["getMissionInterval", []]; + { + _interval = _interval min (_x call ["getMissionInterval", []]); + } forEach _generators; + _interval + }], + ["cleanupCompletedMissions", compileFinal { + { + private _taskID = _x; + private _status = GVAR(TaskStore) call ["getTaskStatus", [_taskID]]; + private _hasCatalogEntry = GVAR(TaskStore) call ["hasTaskCatalogEntry", [_taskID]]; + private _shouldCleanup = (_status in ["succeeded", "failed"]) || { _status isEqualTo "" && { !_hasCatalogEntry } }; + if (_shouldCleanup) then { + ["INFO", format [ + "Mission manager cleaning up generated mission %1. Status='%2', HasCatalogEntry=%3", + _taskID, + _status, + _hasCatalogEntry + ]] call EFUNC(common,log); + + { + if (_x call ["completeMission", [_self, _taskID]]) exitWith {}; + } forEach (_self call ["getGenerators", []]); + + GVAR(TaskStore) call ["clearTaskStatus", [_taskID]]; + }; + } forEach (_self call ["getActiveMissionIds", []]); + + true + }], + ["completeMission", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + { + if (_x call ["completeMission", [_self, _taskID]]) exitWith { true }; + } forEach (_self call ["getGenerators", []]); + + false + }], + ["startAvailableMissions", compileFinal { + private _activeGeneratedMissionIds = _self call ["getActiveGeneratedMissionIds", []]; + private _maxConcurrentMissions = _self call ["getMaxConcurrentMissions", []]; + if (count _activeGeneratedMissionIds >= _maxConcurrentMissions) exitWith { + ["INFO", format [ + "Mission manager skipped generation because cap was reached. ActiveGenerated=%1, Cap=%2, TaskIDs=%3", + count _activeGeneratedMissionIds, + _maxConcurrentMissions, + _activeGeneratedMissionIds + ]] call EFUNC(common,log); + "" + }; + + private _startedTaskID = ""; + { + private _taskID = _x call ["startMission", [_self]]; + if (_taskID isNotEqualTo "") exitWith { + _startedTaskID = _taskID; + }; + } forEach (_self call ["getGenerators", []]); + + _startedTaskID + }] +]; + +GVAR(MissionManager) = createHashMapObject [GVAR(MissionManagerBaseClass)]; + +if (isNil QEGVAR(common,EventBus)) then { call EFUNC(common,eventBus); }; +if (isNil QGVAR(MissionManagerTaskEventTokens)) then { + private _handleTaskCleared = { + params ["_event"]; + + private _taskID = _event getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "") exitWith {}; + if (isNil QGVAR(MissionManager)) exitWith {}; + + if (GVAR(MissionManager) call ["completeMission", [_taskID]]) then { + ["INFO", format ["Mission manager completed generated mission from event. TaskID=%1", _taskID]] call EFUNC(common,log); + }; + }; + + GVAR(MissionManagerTaskEventTokens) = [ + EGVAR(common,EventBus) call ["on", ["task.cleared", _handleTaskCleared, "task.missionManager.cleanup"]] + ]; +}; + +if (GVAR(enableGenerator)) then { + GVAR(MissionManagerPFH) = [{ + GVAR(MissionManager) call ["cleanupCompletedMissions", []]; + + private _now = diag_tickTime; + private _interval = GVAR(MissionManager) call ["getMissionInterval", []]; + private _lastMissionGenerationAt = GVAR(MissionManager) getOrDefault ["lastMissionGenerationAt", -1e10]; + if ((_now - _lastMissionGenerationAt) < _interval) exitWith {}; + + GVAR(MissionManager) set ["lastMissionGenerationAt", _now]; + + private _taskID = GVAR(MissionManager) call ["startAvailableMissions", []]; + if (_taskID isEqualTo "") exitWith {}; + + ["INFO", format ["Mission manager started mission %1.", _taskID]] call EFUNC(common,log); + }, GVAR(MissionManager) call ["getMissionInterval", []], []] call CFUNC(addPerFrameHandler); +}; + +true diff --git a/arma/server/addons/task/functions/generators/fnc_attackMissionGenerator.sqf b/arma/server/addons/task/functions/generators/fnc_attackMissionGenerator.sqf new file mode 100644 index 0000000..40f9978 --- /dev/null +++ b/arma/server/addons/task/functions/generators/fnc_attackMissionGenerator.sqf @@ -0,0 +1,405 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Attack mission generator used by the dynamic mission manager. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_server_task_fnc_attackMissionGenerator + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(AttackMissionGeneratorBaseClass) = compileFinal createHashMapFromArray [ + ["#type", "AttackMissionGeneratorBaseClass"], + ["#create", compileFinal { + private _missionConfig = missionConfigFile >> "CfgMissions"; + _self set ["missionConfig", _missionConfig]; + _self set ["aiGroupsConfig", (_missionConfig >> "AIGroups")]; + _self set ["attackConfig", (_missionConfig >> "MissionTypes" >> "Attack")]; + _self set ["generatorType", "attack"]; + }], + ["getGeneratorType", compileFinal { + _self getOrDefault ["generatorType", "attack"] + }], + ["getMissionInterval", compileFinal { + private _missionConfig = _self getOrDefault ["missionConfig", configNull]; + private _interval = getNumber (_missionConfig >> "missionInterval"); + if (_interval <= 0) then { _interval = 300; }; + _interval + }], + ["getMaxConcurrentMissions", compileFinal { + private _missionConfig = _self getOrDefault ["missionConfig", configNull]; + private _maxConcurrent = getNumber (_missionConfig >> "maxConcurrentMissions"); + if (_maxConcurrent <= 0) then { _maxConcurrent = 1; }; + _maxConcurrent + }], + ["getLocationReuseCooldown", compileFinal { + private _missionConfig = _self getOrDefault ["missionConfig", configNull]; + private _cooldown = getNumber (_missionConfig >> "locationReuseCooldown"); + if (_cooldown <= 0) then { _cooldown = 900; }; + _cooldown + }], + ["pruneRecentLocations", compileFinal { + params [["_manager", createHashMapObject [createHashMapFromArray []], [createHashMap]]]; + + private _recentLocationRegistry = _manager getOrDefault ["recentLocationRegistry", []]; + private _reuseCooldown = _self call ["getLocationReuseCooldown", []]; + private _now = serverTime; + + _recentLocationRegistry = _recentLocationRegistry select { + private _usedAt = _x param [1, -1, [0]]; + (_usedAt >= 0) && { (_now - _usedAt) < _reuseCooldown } + }; + + _manager set ["recentLocationRegistry", _recentLocationRegistry]; + _recentLocationRegistry + }], + ["getActiveMissionPositions", compileFinal { + params [["_manager", createHashMapObject [createHashMapFromArray []], [createHashMap]]]; + + private _activeMissionRegistry = _manager getOrDefault ["activeMissionRegistry", createHashMap]; + private _positions = []; + { + if ((_y getOrDefault ["generatorType", ""]) isNotEqualTo "attack") then { continue; }; + + private _position = _y getOrDefault ["position", []]; + if (_position isEqualType [] && { count _position >= 2 }) then { + _positions pushBack _position; + }; + } forEach _activeMissionRegistry; + _positions + }], + ["selectLocation", compileFinal { + params [["_manager", createHashMapObject [createHashMapFromArray []], [createHashMap]]]; + + private _worldSize = worldSize; + private _center = [_worldSize / 2, _worldSize / 2, 0]; + private _safeDist = 800; + private _playerPos = _center; + private _minEdgeDist = _safeDist + 200; + + private _recentLocationRegistry = _self call ["pruneRecentLocations", [_manager]]; + private _activeMissionPositions = _self call ["getActiveMissionPositions", [_manager]]; + + private _blkListMarkers = allMapMarkers select { markerShape _x in ["RECTANGLE", "ELLIPSE"] }; + _blkListMarkers = _blkListMarkers select { + ( + (toLowerANSI _x find "blklist") == 0 + || { (toLowerANSI (markerText _x) find "blklist") == 0 } + ) + && { getMarkerPos _x distance2D [0, 0] > 0 } + }; + + private _taskPos = []; + private _attempt = 0; + private _maxAttempts = 50; + + while { _attempt < _maxAttempts && { _taskPos isEqualTo [] } } do { + _attempt = _attempt + 1; + private _candidate = [_center, _worldSize / 2 - _minEdgeDist, _worldSize / 2 - _minEdgeDist, 3, 0, 0.3, 0] call BIS_fnc_findSafePos; + + if (_candidate isEqualTo [0, 0, 0]) then { continue; }; + if (_candidate distance2D _playerPos < _safeDist) then { continue; }; + + private _isTooClose = false; + { + private _prevPos = _x param [0, [], [[]]]; + if (_prevPos isEqualType [] && { count _prevPos >= 2 } && { _candidate distance2D _prevPos < 500 }) exitWith { + _isTooClose = true; + }; + } forEach _recentLocationRegistry; + + if (_isTooClose) then { continue; }; + + { + if (_candidate distance2D _x < 500) exitWith { + _isTooClose = true; + }; + } forEach _activeMissionPositions; + + if (_isTooClose) then { continue; }; + + private _inBlkList = false; + { + if (_candidate inArea _x) exitWith { + _inBlkList = true; + }; + } forEach _blkListMarkers; + + if (!_inBlkList) then { + _taskPos = _candidate; + }; + }; + + if (_taskPos isEqualTo []) exitWith { + ["WARNING", "Attack mission generator: selectLocation failed to find a valid dynamic position."] call EFUNC(common,log); + createHashMap + }; + + createHashMapFromArray [ + ["position", _taskPos], + ["grid", mapGridPosition _taskPos] + ] + }], + ["spawnAttackGroup", compileFinal { + params [["_position", [0, 0, 0], [[]]]]; + + private _aiGroupsConfig = _self getOrDefault ["aiGroupsConfig", configNull]; + private _attackConfig = _self getOrDefault ["attackConfig", configNull]; + private _groups = []; + { + if ("attack" in getArray (_x >> "suitable")) then { + _groups pushBack _x; + }; + } forEach ("true" configClasses _aiGroupsConfig); + + if (_groups isEqualTo []) exitWith { + ["WARNING", "Attack mission generator: no AI group configs are suitable for attack missions."] call EFUNC(common,log); + grpNull + }; + + private _groupConfig = selectRandom _groups; + private _side = getText (_groupConfig >> "side"); + private _group = createGroup (call compile _side); + private _minUnits = getNumber (_attackConfig >> "minUnits"); + private _maxUnits = getNumber (_attackConfig >> "maxUnits"); + private _patrolRadius = getNumber (_attackConfig >> "patrolRadius"); + + if (_minUnits <= 0) then { _minUnits = 4; }; + if (_maxUnits < _minUnits) then { _maxUnits = _minUnits; }; + if (_patrolRadius <= 0) then { _patrolRadius = 200; }; + + private _targetUnitCount = floor random [_minUnits, ceil ((_minUnits + _maxUnits) / 2), _maxUnits + 1]; + private _unitPool = []; + { + if ((getText (_x >> "side")) isNotEqualTo _side) then { continue; }; + + { + _unitPool pushBack createHashMapFromArray [ + ["vehicle", getText (_x >> "vehicle")], + ["rank", getText (_x >> "rank")], + ["position", getArray (_x >> "position")] + ]; + } forEach ("true" configClasses (_x >> "Units")); + } forEach _groups; + + if (_unitPool isEqualTo []) exitWith { + ["WARNING", format ["Attack mission generator: selected AI group side '%1' produced an empty unit pool.", _side]] call EFUNC(common,log); + deleteGroup _group; + grpNull + }; + + private _leaderPool = _unitPool select { + toUpperANSI (_x getOrDefault ["rank", "PRIVATE"]) in ["SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] + }; + if (_leaderPool isEqualTo []) then { _leaderPool = +_unitPool; }; + + private _spawnDefs = [selectRandom _leaderPool]; + for "_i" from 1 to (_targetUnitCount - 1) do { + _spawnDefs pushBack (selectRandom _unitPool); + }; + + { + private _unitClass = _x getOrDefault ["vehicle", ""]; + if (_unitClass isEqualTo "") then { continue; }; + + private _unitOffset = +(_x getOrDefault ["position", [0, 0, 0]]); + if (count _unitOffset < 3) then { _unitOffset resize 3; }; + _unitOffset set [0, (_unitOffset # 0) + (random 6 - 3)]; + _unitOffset set [1, (_unitOffset # 1) + (random 6 - 3)]; + + private _unit = _group createUnit [_unitClass, _position vectorAdd _unitOffset, [], 0, "NONE"]; + _unit setRank (_x getOrDefault ["rank", "PRIVATE"]); + } forEach _spawnDefs; + + [_group, _position, _patrolRadius] call BFUNC(taskPatrol); + + ["INFO", format [ + "Attack mission generator: spawned attack group. Side=%1, Units=%2, PatrolRadius=%3, Position=%4", + _side, + count (units _group), + _patrolRadius, + _position + ]] call EFUNC(common,log); + _group + }], + ["rollRewards", compileFinal { + private _attackConfig = _self getOrDefault ["attackConfig", configNull]; + private _equipmentRewards = []; + private _supplyRewards = []; + private _weaponRewards = []; + private _vehicleRewards = []; + private _specialRewards = []; + + { + private _category = _x; + { + _x params ["_item", "_chance"]; + if (random 1 < _chance) then { + switch (_category) do { + case "equipment": { _equipmentRewards pushBack _item; }; + case "supplies": { _supplyRewards pushBack _item; }; + case "weapons": { _weaponRewards pushBack _item; }; + case "vehicles": { _vehicleRewards pushBack _item; }; + case "special": { _specialRewards pushBack _item; }; + }; + }; + } forEach (getArray (_attackConfig >> "Rewards" >> _category)); + } forEach ["equipment", "supplies", "weapons", "vehicles", "special"]; + + createHashMapFromArray [ + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + }], + ["startMission", compileFinal { + params [["_manager", createHashMapObject [createHashMapFromArray []], [createHashMap]]]; + + private _attackConfig = _self getOrDefault ["attackConfig", configNull]; + private _locationData = _self call ["selectLocation", [_manager]]; + if (_locationData isEqualTo createHashMap) exitWith { "" }; + + private _position = _locationData getOrDefault ["position", [0, 0, 0]]; + private _grid = _locationData getOrDefault ["grid", mapGridPosition _position]; + + ["INFO", format [ + "Attack mission generator: selected location. Grid=%1, Position=%2", + _grid, + _position + ]] call EFUNC(common,log); + + private _group = _self call ["spawnAttackGroup", [_position]]; + if (isNull _group) exitWith { + ["WARNING", format [ + "Attack mission generator: spawnAttackGroup failed for Grid=%1, Position=%2", + _grid, + _position + ]] call EFUNC(common,log); + "" + }; + + private _units = units _group; + if (_units isEqualTo []) exitWith { + ["WARNING", format [ + "Attack mission generator: spawned group has no units. Grid=%1, Group=%2", + _grid, + _group + ]] call EFUNC(common,log); + deleteGroup _group; + "" + }; + + private _taskID = format ["task_attack_%1", round (diag_tickTime * 1000)]; + private _rewardRange = getArray (_attackConfig >> "Rewards" >> "money"); + private _reputationRange = getArray (_attackConfig >> "Rewards" >> "reputation"); + private _penaltyRange = getArray (_attackConfig >> "penalty"); + private _timeRange = getArray (_attackConfig >> "timeLimit"); + private _rewards = _self call ["rollRewards"]; + private _fundsReward = _rewardRange call BFUNC(randomNum); + private _reputationReward = _reputationRange call BFUNC(randomNum); + private _reputationPenalty = _penaltyRange call BFUNC(randomNum); + private _timeLimit = _timeRange call BFUNC(randomNum); + + ["INFO", format [ + "Attack mission generator: creating task. TaskID=%1, Grid=%2, Units=%3", + _taskID, + _grid, + count _units + ]] call EFUNC(common,log); + + private _success = [ + "attack", + _taskID, + _position, + format ["Attack: Grid %1", _grid], + format ["Eliminate hostile forces operating near grid %1.", _grid], + createHashMapFromArray [["targets", _units]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", count _units], + ["funds", _fundsReward], + ["ratingFail", _reputationPenalty], + ["ratingSuccess", _reputationReward], + ["endSuccess", false], + ["endFail", false], + ["timeLimit", _timeLimit], + ["equipment", _rewards get "equipment"], + ["supplies", _rewards get "supplies"], + ["weapons", _rewards get "weapons"], + ["vehicles", _rewards get "vehicles"], + ["special", _rewards get "special"] + ], + 0, + "", + "mission_manager" + ] call FUNC(startTask); + + if !(_success) exitWith { + ["WARNING", format [ + "Attack mission generator: startTask failed. TaskID=%1, Grid=%2, Units=%3", + _taskID, + _grid, + count _units + ]] call EFUNC(common,log); + "" + }; + + ["INFO", format [ + "Attack mission generator: task registered. TaskID=%1, Source=mission_manager, TimeLimit=%2s, LimitSuccess=%3", + _taskID, + _timeLimit, + count _units + ]] call EFUNC(common,log); + + private _activeMissionRegistry = _manager getOrDefault ["activeMissionRegistry", createHashMap]; + _activeMissionRegistry set [_taskID, createHashMapFromArray [ + ["generatorType", _self call ["getGeneratorType", []]], + ["position", _position], + ["startedAt", serverTime] + ]]; + _manager set ["activeMissionRegistry", _activeMissionRegistry]; + + ["INFO", format [ + "Attack mission generator: mission started successfully. TaskID=%1, Grid=%2", + _taskID, + _grid + ]] call EFUNC(common,log); + + _taskID + }], + ["completeMission", compileFinal { + params [ + ["_manager", createHashMapObject [createHashMapFromArray []], [createHashMap]], + ["_taskID", "", [""]] + ]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _activeMissionRegistry = _manager getOrDefault ["activeMissionRegistry", createHashMap]; + private _missionRecord = _activeMissionRegistry getOrDefault [_taskID, createHashMap]; + if ((_missionRecord getOrDefault ["generatorType", ""]) isNotEqualTo (_self call ["getGeneratorType", []])) exitWith { false }; + + private _position = _missionRecord getOrDefault ["position", []]; + _activeMissionRegistry deleteAt _taskID; + _manager set ["activeMissionRegistry", _activeMissionRegistry]; + + if (_position isEqualType [] && { count _position >= 2 }) then { + private _recentLocationRegistry = _manager getOrDefault ["recentLocationRegistry", []]; + _recentLocationRegistry pushBack [_position, serverTime]; + _manager set ["recentLocationRegistry", _recentLocationRegistry]; + }; + + true + }] +]; diff --git a/arma/server/addons/task/functions/helpers/fnc_handleTaskRewards.sqf b/arma/server/addons/task/functions/helpers/fnc_handleTaskRewards.sqf new file mode 100644 index 0000000..8f12c2e --- /dev/null +++ b/arma/server/addons/task/functions/helpers/fnc_handleTaskRewards.sqf @@ -0,0 +1,300 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Handles task completion rewards for organizations. + * + * Arguments: + * 0: Task ID + * 1: Reward Data + * - funds: Amount of money to award + * - equipment: Array of equipment classnames to award + * - supplies: Array of supply classnames to award + * - weapons: Array of weapon classnames to award + * - vehicles: Array of vehicle classnames to award + * - special: Array of special item classnames to award + * + * Return Value: + * Success + * + * Example: + * private _rewards = createHashMapFromArray [ + * ["funds", 10000], + * ["reputation", 50], + * ["equipment", ["ItemGPS", "ItemCompass"]], + * ["supplies", ["FirstAidKit", "Medikit"]], + * ["weapons", ["arifle_MX_F"]], + * ["vehicles", ["B_MRAP_01_F"]], + * ["special", ["B_UAV_01_F"]] + * ]; + * ["task_1", _rewards] call forge_server_task_fnc_handleTaskRewards; + * + * Public: No + */ + +params [["_taskID", ""], ["_rewards", createHashMap]]; + +if (_taskID == "") exitWith { + ["ERROR", "No task ID provided for rewards"] call EFUNC(common,log); + false +}; + +private _emitRewardEvent = { + params [["_eventName", "", [""]], ["_payload", createHashMap, [createHashMap]]]; + + if (_eventName isEqualTo "" || { isNil QEGVAR(common,EventBus) }) exitWith { createHashMap }; + + private _eventPayload = +_payload; + _eventPayload set ["taskID", _taskID]; + _eventPayload set ["rewardData", +_rewards]; + + EGVAR(common,EventBus) call ["emit", [ + _eventName, + _eventPayload, + createHashMapFromArray [["source", "task"]] + ]] +}; + +private _rewardContext = GVAR(TaskStore) call ["resolveRewardContext", [_taskID]]; +private _requesterUid = _rewardContext getOrDefault ["requesterUid", ""]; +private _orgID = _rewardContext getOrDefault ["orgID", ""]; +private _memberUids = _rewardContext getOrDefault ["memberUids", []]; +if (_orgID isEqualTo "") exitWith { + ["ERROR", format ["No organization reward context found for task %1.", _taskID]] call EFUNC(common,log); + ["task.reward.failed", createHashMapFromArray [ + ["rewardContext", _rewardContext], + ["failureMessages", ["missing organization reward context"]] + ]] call _emitRewardEvent; + false +}; + +["task.reward.requested", createHashMapFromArray [ + ["rewardContext", _rewardContext] +]] call _emitRewardEvent; + +private _success = true; +private _funds = _rewards getOrDefault ["funds", 0]; +private _rewardMessages = []; +private _failureMessages = []; + +private _resolveRewardLabel = { + params [["_className", "", [""]]]; + + if (_className isEqualTo "") exitWith { "" }; + + { + private _cfg = _x >> _className; + if (isClass _cfg) exitWith { + private _displayName = getText (_cfg >> "displayName"); + [_displayName, _className] select (_displayName isEqualTo ""); + }; + } forEach [ + configFile >> "CfgWeapons", + configFile >> "CfgMagazines", + configFile >> "CfgVehicles", + configFile >> "CfgGlasses" + ]; + + _className +}; + +private _notifyMembers = { + params [["_type", "info", [""]], ["_title", "Tasks", [""]], ["_message", "", [""]]]; + + if (_message isEqualTo "") exitWith {}; + if (isNil QEGVAR(common,EventBus)) exitWith { + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + } forEach _memberUids; + }; + + EGVAR(common,EventBus) call ["emit", [ + "task.reward.notification.requested", + createHashMapFromArray [ + ["taskID", _taskID], + ["notificationType", _type], + ["title", _title], + ["message", _message], + ["memberUids", +_memberUids] + ], + createHashMapFromArray [["source", "task"]] + ]]; +}; + +private _syncOrgPatch = { + params [["_patch", createHashMap, [createHashMap]]]; + + if (_patch isEqualTo createHashMap) exitWith {}; + if (isNil QEGVAR(common,EventBus)) exitWith { + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(org,responseSyncOrg), [_patch], _player] call CFUNC(targetEvent); + } forEach _memberUids; + }; + + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["orgID", _orgID], + ["memberUids", +_memberUids], + ["patch", +_patch] + ], + createHashMapFromArray [["source", "task"]] + ]]; +}; + +if (_funds > 0) then { + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgID]]; + + if (_org isEqualTo createHashMap) then { + ["ERROR", format ["Failed to load organization %1 for task %2 funds reward.", _orgID, _taskID]] call EFUNC(common,log); + _success = false; + } else { + private _nextFunds = (_org getOrDefault ["funds", 0]) + _funds; + _org set ["funds", _nextFunds]; + private _updatedOrg = EGVAR(org,OrgStore) call [ + "callHotOrg", + [ + "org:hot:override", + [_orgID, toJSON _org] + ] + ]; + + if (_updatedOrg isEqualTo createHashMap) then { + ["ERROR", format ["Failed to update organization %1 funds for task %2.", _orgID, _taskID]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack "org funds update"; + } else { + private _patch = createHashMapFromArray [["funds", _nextFunds]]; + private _savedOrg = EGVAR(org,OrgStore) call ["saveById", [_orgID]]; + if (_savedOrg isEqualTo createHashMap) then { + ["ERROR", format ["Task %1 updated organization %2 funds, but durable save failed.", _taskID, _orgID]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack "org funds persistence"; + }; + + [_patch] call _syncOrgPatch; + _rewardMessages pushBack format ["$%1 org funds", [_funds] call EFUNC(common,formatNumber)]; + }; + }; +}; + +private _grantOrgAssets = { + params [["_category", "items", [""]], ["_items", [], [[]]]]; + + if (_items isEqualTo []) exitWith {}; + + private _assetEntries = _items apply { + createHashMapFromArray [ + ["classname", _x], + ["category", _category], + ["quantity", 1] + ] + }; + + private _grantResult = EGVAR(org,OrgStore) call ["addAssets", [_requesterUid, _assetEntries, false, _orgID]]; + if !(_grantResult getOrDefault ["success", false]) then { + ["ERROR", format ["Failed to award %1 assets for task %2: %3", _category, _taskID, _grantResult getOrDefault ["message", "Unknown error."]]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack format ["%1 asset update", _category]; + } else { + [_grantResult getOrDefault ["patch", createHashMap]] call _syncOrgPatch; + if !(_grantResult getOrDefault ["persisted", false]) then { + private _persistenceMessage = _grantResult getOrDefault ["persistenceMessage", format ["%1 assets updated, but durable save failed.", _category]]; + ["ERROR", format ["Task %1 %2", _taskID, _persistenceMessage]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack format ["%1 asset persistence", _category]; + }; + private _labels = _items apply { [_x] call _resolveRewardLabel }; + _rewardMessages pushBack format ["%1: %2", _category, _labels joinString ", "]; + }; +}; + +private _grantOrgFleet = { + params [["_vehicles", [], [[]]]]; + + if (_vehicles isEqualTo []) exitWith {}; + + private _vehicleEntries = _vehicles apply { + private _category = "other"; + if (_x isKindOf "Car") then { _category = "cars"; }; + if (_x isKindOf "Tank") then { _category = "armor"; }; + if (_x isKindOf "Helicopter") then { _category = "helis"; }; + if (_x isKindOf "Plane") then { _category = "planes"; }; + if (_x isKindOf "Ship") then { _category = "naval"; }; + + createHashMapFromArray [ + ["classname", _x], + ["category", _category] + ] + }; + + private _fleetResult = EGVAR(org,OrgStore) call ["addFleetVehicles", [_requesterUid, _vehicleEntries, false, _orgID]]; + if !(_fleetResult getOrDefault ["success", false]) then { + ["ERROR", format ["Failed to award vehicle rewards for task %2: %1", _fleetResult getOrDefault ["message", "Unknown error."], _taskID]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack "fleet update"; + } else { + [_fleetResult getOrDefault ["patch", createHashMap]] call _syncOrgPatch; + if !(_fleetResult getOrDefault ["persisted", false]) then { + private _persistenceMessage = _fleetResult getOrDefault ["persistenceMessage", "Fleet updated, but durable save failed."]; + ["ERROR", format ["Task %1 %2", _taskID, _persistenceMessage]] call EFUNC(common,log); + _success = false; + _failureMessages pushBack "fleet persistence"; + }; + private _labels = _vehicles apply { [_x] call _resolveRewardLabel }; + _rewardMessages pushBack format ["vehicles: %1", _labels joinString ", "]; + }; +}; + +private _equipment = _rewards getOrDefault ["equipment", []]; +private _special = _rewards getOrDefault ["special", []]; +private _supplies = _rewards getOrDefault ["supplies", []]; +private _vehicles = _rewards getOrDefault ["vehicles", []]; +private _weapons = _rewards getOrDefault ["weapons", []]; + +if (_equipment isNotEqualTo []) then { ["equipment", _equipment] call _grantOrgAssets; }; +if (_supplies isNotEqualTo []) then {["supplies", _supplies] call _grantOrgAssets; }; +if (_weapons isNotEqualTo []) then { ["weapons", _weapons] call _grantOrgAssets; }; +if (_special isNotEqualTo []) then { ["special", _special] call _grantOrgAssets; }; +if (_vehicles isNotEqualTo []) then { [_vehicles] call _grantOrgFleet; }; + +if (_success) then { + private _orgName = ""; + private _org = EGVAR(org,OrgStore) call ["loadById", [_orgID]]; + if (_org isNotEqualTo createHashMap) then { + _orgName = _org getOrDefault ["name", _orgID]; + }; + if (_orgName isEqualTo "") then { _orgName = _orgID; }; + + private _message = format ["Task rewards added to %1.", _orgName]; + if (_rewardMessages isNotEqualTo []) then { + _message = format ["%1 %2", _message, _rewardMessages joinString ", "]; + }; + + ["INFO", _message] call EFUNC(common,log); + ["success", "Tasks", _message] call _notifyMembers; + ["task.reward.applied", createHashMapFromArray [ + ["rewardContext", _rewardContext], + ["rewardMessages", +_rewardMessages], + ["message", _message] + ]] call _emitRewardEvent; +} else { + private _warningMessage = format ["Task %1 completed, but one or more org rewards failed to apply.", _taskID]; + if (_failureMessages isNotEqualTo []) then { + _warningMessage = format ["%1 Failed areas: %2.", _warningMessage, _failureMessages joinString ", "]; + }; + + ["warning", "Tasks", _warningMessage] call _notifyMembers; + ["task.reward.failed", createHashMapFromArray [ + ["rewardContext", _rewardContext], + ["rewardMessages", +_rewardMessages], + ["failureMessages", +_failureMessages], + ["message", _warningMessage] + ]] call _emitRewardEvent; +}; + +_success diff --git a/arma/server/addons/task/functions/helpers/fnc_parseRewards.sqf b/arma/server/addons/task/functions/helpers/fnc_parseRewards.sqf new file mode 100644 index 0000000..c87c9fe --- /dev/null +++ b/arma/server/addons/task/functions/helpers/fnc_parseRewards.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" + +/* + * Author: OpenAI + * Parses an Eden module reward string into a SQF array. + * + * Supports both the preferred comma-separated format: + * ItemGPS, FirstAidKit + * and the legacy SQF array string format: + * ["ItemGPS","FirstAidKit"] + * + * Arguments: + * 0: Raw value + * 1: Task label + * 2: Reward key + * + * Return Value: + * Parsed reward array + * + * Example: + * [_logic getVariable ["EquipmentRewards", ""], "attack_01", "equipment"] call forge_server_task_fnc_parseRewards; + * + * Public: No + */ + +params [["_rawValue", "", [""]], ["_taskLabel", "", [""]], ["_rewardKey", "", [""]]]; + +private _trimmed = trim _rawValue; +if (_trimmed isEqualTo "") exitWith { [] }; +if ((_trimmed select [0, 1]) isEqualTo "[") then { + private _parsed = parseSimpleArray _trimmed; + if (_parsed isEqualType []) exitWith { _parsed }; + + ["WARNING", format [ + "Task module '%1' reward input '%2' is invalid: %3. Expected comma-separated class names like ItemGPS, FirstAidKit or SQF array syntax like [""ItemGPS"",""FirstAidKit""].", + _taskLabel, + _rewardKey, + _rawValue + ]] call EFUNC(common,log); + + [] +}; + +private _parsedRewards = []; +{ + private _reward = trim _x; + if (_reward isEqualTo "") then { continue; }; + + _parsedRewards pushBackUnique _reward; +} forEach (_trimmed splitString ","); + +_parsedRewards diff --git a/arma/server/addons/task/functions/helpers/fnc_parseTaskChainAttributes.sqf b/arma/server/addons/task/functions/helpers/fnc_parseTaskChainAttributes.sqf new file mode 100644 index 0000000..f15f732 --- /dev/null +++ b/arma/server/addons/task/functions/helpers/fnc_parseTaskChainAttributes.sqf @@ -0,0 +1,38 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Reads shared Eden task chain attributes and returns startTask parameter pairs. + * + * Arguments: + * 0: Logic + * + * Return Value: + * Task parameter pairs + * + * Public: No + */ + +params [["_logic", objNull, [objNull]]]; + +private _prerequisiteRaw = _logic getVariable ["PrerequisiteTaskIds", ""]; +private _prerequisiteTaskIds = []; + +if (_prerequisiteRaw isEqualType []) then { + { + if !(_x isEqualType "") then { continue; }; + if (_x isEqualTo "") then { continue; }; + _prerequisiteTaskIds pushBackUnique _x; + } forEach _prerequisiteRaw; +} else { + if (_prerequisiteRaw isEqualType "") then { + { + if (_x isEqualTo "") then { continue; }; + _prerequisiteTaskIds pushBackUnique _x; + } forEach (_prerequisiteRaw splitString ", "); + }; +}; + +[ + ["prerequisiteTaskIds", _prerequisiteTaskIds] +] diff --git a/arma/server/addons/task/functions/helpers/fnc_spawnEnemyWave.sqf b/arma/server/addons/task/functions/helpers/fnc_spawnEnemyWave.sqf new file mode 100644 index 0000000..8bc0229 --- /dev/null +++ b/arma/server/addons/task/functions/helpers/fnc_spawnEnemyWave.sqf @@ -0,0 +1,130 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Spawns an enemy wave for a defense task + * + * Arguments: + * 0: Defense zone marker name + * 1: Task ID + * 2: Wave number (0-based) + * 3: Enemy template groups (default: []) + * + * Return Value: + * None + * + * Example: + * ["defend_marker", "defend_1", 0] call forge_server_task_fnc_spawnEnemyWave; + * + * Public: No + */ + +params [["_defenseZone", "", [""]], ["_taskID", "", [""]], ["_waveNumber", 0, [0]], ["_enemyTemplates", [], [[]]]]; + +if (_defenseZone == "") exitWith { ["ERROR", "No defense zone provided for enemy wave spawn"] call EFUNC(common,log); }; + +// TODO: Add unit types to mission config +private _basicTypes = ["O_Soldier_F", "O_Soldier_AR_F", "O_Soldier_GL_F", "O_medic_F"]; +private _specialTypes = ["O_Soldier_LAT_F", "O_soldier_M_F", "O_Soldier_TL_F", "O_Soldier_SL_F"]; +private _eliteTypes = ["O_Soldier_HAT_F", "O_Soldier_AA_F", "O_engineer_F", "O_Sharpshooter_F"]; + +private _unitCount = 6 + (_waveNumber * 2); // TODO: Make this configurable in mission config +private _specialChance = 0.2 + (_waveNumber * 0.1); // TODO: Make this configurable in mission config +private _eliteChance = (_waveNumber * 0.05); // TODO: Make this configurable in mission config + +private _center = getMarkerPos _defenseZone; +private _radius = (getMarkerSize _defenseZone select 0) max (getMarkerSize _defenseZone select 1); +private _spawnRadius = _radius + 150; +private _spawnPositions = []; + +for "_i" from 0 to 3 do { + private _angle = _i * 90; + private _variance = 45; + private _spawnAngle = _angle + (random (_variance * 2) - _variance); + private _spawnDist = _spawnRadius + (random 50 - 25); + + private _spawnX = (_center select 0) + (_spawnDist * cos _spawnAngle); + private _spawnY = (_center select 1) + (_spawnDist * sin _spawnAngle); + private _spawnPos = [_spawnX, _spawnY, 0]; + + private _safePos = _spawnPos findEmptyPosition [0, 50, "O_Soldier_F"]; + if (count _safePos > 0) then { _spawnPositions pushBack _safePos; }; +}; + +private _groups = []; +if (_spawnPositions isEqualTo []) exitWith { + ["ERROR", format ["Defense wave %1 for task %2 could not find spawn positions", _waveNumber + 1, _taskID]] call EFUNC(common,log); +}; + +if (_enemyTemplates isNotEqualTo []) then { + private _groupCount = ((_waveNumber + 1) min 4) min (count _spawnPositions); + private _selectedSpawnPositions = +_spawnPositions; + _selectedSpawnPositions resize _groupCount; + + { + private _spawnPos = _x; + private _templateGroup = selectRandom _enemyTemplates; + if !(_templateGroup isEqualType []) then { continue; }; + if (_templateGroup isEqualTo []) then { continue; }; + + private _firstTemplate = _templateGroup select 0; + if !(_firstTemplate isEqualType createHashMap) then { continue; }; + + private _side = _firstTemplate getOrDefault ["side", east]; + private _group = createGroup _side; + _groups pushBack _group; + + { + private _unitTemplate = _x; + if !(_unitTemplate isEqualType createHashMap) then { continue; }; + + private _unitType = _unitTemplate getOrDefault ["type", "O_Soldier_F"]; + private _unit = _group createUnit [_unitType, _spawnPos, [], 0, "NONE"]; + _unit setVariable ["assignedTask", _taskID, true]; + _unit setUnitLoadout (_unitTemplate getOrDefault ["loadout", getUnitLoadout _unit]); + _unit setSkill (_unitTemplate getOrDefault ["skill", skill _unit]); + _unit setRank (_unitTemplate getOrDefault ["rank", rank _unit]); + _unit setBehaviour "AWARE"; + _unit setSpeedMode "NORMAL"; + _unit enableDynamicSimulation true; + } forEach _templateGroup; + + [_group, _center, _radius * 0.75] call CFUNC(taskDefend); + } forEach _selectedSpawnPositions; + + ["INFO", format [ + "Spawned defense wave %1 for task %2 from %3 template group(s)", + _waveNumber + 1, + _taskID, + count _groups + ]] call EFUNC(common,log); +} else { + { + private _groupSize = ceil(_unitCount / (count _spawnPositions)); + private _group = createGroup east; + _groups pushBack _group; + + for "_i" from 1 to _groupSize do { + private _unitType = _basicTypes select (floor random count _basicTypes); + private _roll = random 1; + + if (_roll < _eliteChance) then { + _unitType = _eliteTypes select (floor random count _eliteTypes); + } else { + if (_roll < _specialChance) then { + _unitType = _specialTypes select (floor random count _specialTypes); + }; + }; + + private _unit = _group createUnit [_unitType, _x, [], 0, "NONE"]; + _unit setVariable ["assignedTask", _taskID, true]; + _unit setBehaviour "AWARE"; + _unit setSpeedMode "NORMAL"; + _unit enableDynamicSimulation true; + }; + + [_group, _center, _radius * 0.75] call CFUNC(taskDefend); + } forEach _spawnPositions; + + ["INFO", format ["Spawned defense wave %1 for task %2 with %3 fallback units", _waveNumber + 1, _taskID, _unitCount]] call EFUNC(common,log); +}; diff --git a/arma/server/addons/task/functions/helpers/fnc_startTask.sqf b/arma/server/addons/task/functions/helpers/fnc_startTask.sqf new file mode 100644 index 0000000..9640383 --- /dev/null +++ b/arma/server/addons/task/functions/helpers/fnc_startTask.sqf @@ -0,0 +1,217 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Unified task initializer used by both Eden modules and missionManager-generated + * tasks. Registers entities, creates the BIS task, registers the catalog entry, + * and dispatches to the task handler. + * + * Arguments: + * 0: Task type ("attack"|"defuse"|"destroy"|"delivery"|"hostage"|"hvt"|"defend") + * 1: Task ID + * 2: Task position + * 3: Task title + * 4: Task description + * 5: Task entities + * Keys: "targets" -- attack, destroy + * "hostages" -- hostage + * "shooters" -- hostage + * "hvts" -- hvt + * "ieds" -- defuse + * "protected" -- defuse + * "cargo" -- delivery + * 6: Task parameters + * Common keys: + * "limitFail" (default: -1) + * "limitSuccess" (default: -1) + * "prerequisiteTaskIds" (default: []) -- task IDs that must succeed before this task is available + * "funds" (default: 0) + * "ratingFail" (default: 0) + * "ratingSuccess" (default: 0) + * "endSuccess" (default: false) + * "endFail" (default: false) + * "timeLimit" (default: 0, 0 = no limit) + * Reward keys: + * "equipment" , "supplies" , "weapons" , + * "vehicles" , "special" + * Type-specific keys: + * defuse: "iedTimer" -- required IED countdown in seconds (> 0) + * delivery: "deliveryZone" -- marker name + * hostage: "extractionZone" -- marker name + * "cbrn" (default: false) + * "execution" (default: false) + * "cbrnZone" (default: "") + * hvt: "extractionZone" -- marker name (capture mode only) + * "captureHvt" (default: true) + * defend: "defenseZone" -- marker name + * "defendTime" (default: 600) + * "waveCount" (default: 3) + * "waveCooldown" (default: 300) + * "minBlufor" (default: 1) + * "enemyTemplates" (default: []) + * 7: Minimum org reputation required (default: 0) + * 8: Requester UID (default: "") + * 9: Source tag (default: "eden") -- "eden"|"mission_manager"|"script" + * + * Return Value: + * Success + * + * Examples: + * // From a unit init field -- register entity first, then start task from trigger/init.sqf: + * [this, "compound_attack_01"] call forge_server_task_fnc_makeTarget; + * + * // From a trigger or init.sqf (all-in-one): + * [ + * "attack", "compound_attack_01", getPosATL leader1, + * "Attack: East Compound", "Eliminate all hostile forces.", + * createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + * createHashMapFromArray [ + * ["limitFail", 0], ["limitSuccess", 3], + * ["funds", 50000], ["ratingFail", -10], ["ratingSuccess", 20], + * ["timeLimit", 900] + * ] + * ] call forge_server_task_fnc_startTask; + * + * Public: Yes + */ + +params [ + ["_taskType", "", [""]], + ["_taskID", "", [""]], + ["_position", [0, 0, 0], [[]]], + ["_title", "", [""]], + ["_description", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]], + ["_minRating", 0, [0]], + ["_requesterUid", "", [""]], + ["_source", "eden", [""]] +]; + +if (_taskType isEqualTo "" || { _taskID isEqualTo "" }) exitWith { + ["ERROR", "startTask: missing task type or task ID."] call EFUNC(common,log); + false +}; + +// --- 1. Register task entities --- + +private _iedTimer = _taskParams getOrDefault ["iedTimer", 0]; + +{ + private _role = _x; + private _objects = _entities getOrDefault [_role, []]; + { + if !(_x isEqualType objNull) then { + ["WARNING", format ["startTask: skipping non-object entity for role '%1' in task '%2': %3", _role, _taskID, _x]] call EFUNC(common,log); + continue; + }; + if (isNull _x) then { continue; }; + switch (_role) do { + case "targets": { [_x, _taskID] call FUNC(makeTarget); }; + case "hostages": { [_x, _taskID] call FUNC(makeHostage); }; + case "shooters": { [_x, _taskID] call FUNC(makeShooter); }; + case "hvts": { [_x, _taskID] call FUNC(makeHVT); }; + case "ieds": { [_x, _taskID, _iedTimer] call FUNC(makeIED); }; + case "protected": { [_x, _taskID] call FUNC(makeObject); }; + case "cargo": { [_x, _taskID] call FUNC(makeCargo); }; + }; + } forEach _objects; +} forEach ["targets", "hostages", "shooters", "hvts", "ieds", "protected", "cargo"]; + +// --- 2. Create BIS task --- + +[west, _taskID, [_description, _title, _taskType], _position, "CREATED", 1, true, _taskType] call BFUNC(taskCreate); + +// --- 3. Register catalog entry --- + +private _prerequisiteTaskIds = _taskParams getOrDefault [ + "prerequisiteTaskIds", + _taskParams getOrDefault [ + "prerequisiteTaskIDs", + _taskParams getOrDefault ["requiresTaskIds", []] + ] +]; + +GVAR(TaskStore) call ["registerTaskCatalogEntry", [_taskID, createHashMapFromArray [ + ["taskID", _taskID], + ["taskId", _taskID], + ["type", _taskType], + ["title", _title], + ["description", _description], + ["position", _position], + ["accepted", false], + ["requesterUid", _requesterUid], + ["orgID", "default"], + ["source", _source], + ["prerequisiteTaskIds", _prerequisiteTaskIds] +]]]; + +// --- 4. Assemble type-specific handler args --- + +private _limitFail = _taskParams getOrDefault ["limitFail", -1]; +private _limitSuccess = _taskParams getOrDefault ["limitSuccess", -1]; +private _funds = _taskParams getOrDefault ["funds", 0]; +private _ratingFail = _taskParams getOrDefault ["ratingFail", 0]; +private _ratingSuccess = _taskParams getOrDefault ["ratingSuccess", 0]; +private _endSuccess = _taskParams getOrDefault ["endSuccess", false]; +private _endFail = _taskParams getOrDefault ["endFail", false]; +private _timeLimit = _taskParams getOrDefault ["timeLimit", 0]; +private _equipRewards = _taskParams getOrDefault ["equipment", []]; +private _supplyRewards = _taskParams getOrDefault ["supplies", []]; +private _weaponRewards = _taskParams getOrDefault ["weapons", []]; +private _vehicleRewards = _taskParams getOrDefault ["vehicles", []]; +private _specialRewards = _taskParams getOrDefault ["special", []]; + +private _rewardTail = [_equipRewards, _supplyRewards, _weaponRewards, _vehicleRewards, _specialRewards]; + +private _handlerArgs = switch (_taskType) do { + case "attack"; + case "destroy": { + private _args = [_taskID, _limitFail, _limitSuccess, _funds, _ratingFail, _ratingSuccess, _endSuccess, _endFail, _timeLimit]; + _args + _rewardTail + }; + case "defuse": { + [_taskID, _limitFail, _limitSuccess, _funds, _ratingFail, _ratingSuccess, _endSuccess, _endFail] + _rewardTail + }; + case "delivery": { + private _deliveryZone = _taskParams getOrDefault ["deliveryZone", ""]; + private _args = [_taskID, _limitFail, _limitSuccess, _deliveryZone, _funds, _ratingFail, _ratingSuccess, _endSuccess, _endFail, _timeLimit]; + _args + _rewardTail + }; + case "hostage": { + private _extZone = _taskParams getOrDefault ["extractionZone", ""]; + private _cbrn = _taskParams getOrDefault ["cbrn", false]; + private _execution = _taskParams getOrDefault ["execution", false]; + private _cbrnZone = _taskParams getOrDefault ["cbrnZone", ""]; + private _args = [_taskID, _limitFail, _limitSuccess, _extZone, _funds, _ratingFail, _ratingSuccess, [_cbrn, _execution], _endSuccess, _endFail, _timeLimit]; + _args pushBack _cbrnZone; + _args + _rewardTail + }; + case "hvt": { + private _extZone = _taskParams getOrDefault ["extractionZone", ""]; + private _captureHvt = _taskParams getOrDefault ["captureHvt", true]; + private _args = [_taskID, _limitFail, _limitSuccess, _extZone, _funds, _ratingFail, _ratingSuccess, [_captureHvt, !_captureHvt], _endSuccess, _endFail, _timeLimit]; + _args + _rewardTail + }; + case "defend": { + private _defenseZone = _taskParams getOrDefault ["defenseZone", ""]; + private _defendTime = _taskParams getOrDefault ["defendTime", 600]; + private _waveCount = _taskParams getOrDefault ["waveCount", 3]; + private _waveCooldown = _taskParams getOrDefault ["waveCooldown", 300]; + private _minBlufor = _taskParams getOrDefault ["minBlufor", 1]; + private _enemyTemplates = _taskParams getOrDefault ["enemyTemplates", []]; + [_taskID, _defenseZone, _defendTime, _funds, _ratingFail, _ratingSuccess, _endSuccess, _endFail, _waveCount, _waveCooldown, _minBlufor, _enemyTemplates] + _rewardTail + }; + default { + ["ERROR", format ["startTask: unknown task type '%1'.", _taskType]] call EFUNC(common,log); + [] + }; +}; + +if (_handlerArgs isEqualTo []) exitWith { false }; + +// --- 5. Dispatch handler --- + +[_taskType, _handlerArgs, _minRating, _requesterUid] spawn FUNC(handler); + +true diff --git a/arma/server/addons/task/functions/modules/fnc_attackModule.sqf b/arma/server/addons/task/functions/modules/fnc_attackModule.sqf new file mode 100644 index 0000000..aa57225 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_attackModule.sqf @@ -0,0 +1,72 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the attack module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_attackModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Attack module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedEntities = synchronizedObjects _logic; +["INFO", format ["Attack Module: TaskID: %1, Synced entities: %2", _taskID, count _syncedEntities]] call EFUNC(common,log); + +private _taskPos = if (_syncedEntities isNotEqualTo []) then { + getPosATL (_syncedEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "attack", + _taskID, + _taskPos, + format ["Attack: %1", _taskID], + "Eliminate all hostile forces in the area.", + createHashMapFromArray [ + ["targets", _syncedEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["timeLimit", _logic getVariable ["TimeLimit", 0]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_cargoModule.sqf b/arma/server/addons/task/functions/modules/fnc_cargoModule.sqf new file mode 100644 index 0000000..6971693 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_cargoModule.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Grouping module for cargo entities in a delivery task. + * This module has no logic of its own — it acts as a sync target so that + * cargo objects can be grouped and discovered by the parent delivery module + * via synchronizedObjects + typeOf "FORGE_Module_Cargo". + * + * Arguments: + * 0: Logic + * 1: Units + * 2: Activated + * + * Return Value: + * None + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; diff --git a/arma/server/addons/task/functions/modules/fnc_defendModule.sqf b/arma/server/addons/task/functions/modules/fnc_defendModule.sqf new file mode 100644 index 0000000..a61eee9 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_defendModule.sqf @@ -0,0 +1,116 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the defend task module. + * Reads parameters from the logic object and delegates to fnc_startTask. + * The designer must place a named marker in Eden for the defense zone. + * Synced enemy units are used as wave composition templates. + * + * Arguments: + * 0: Logic + * 1: Units + * 2: Activated + * + * Return Value: + * None + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +private _defenseZone = _logic getVariable ["DefenseZone", ""]; + +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Defend module: no task ID configured."] call EFUNC(common,log); +}; +if (_defenseZone isEqualTo "" || { markerShape _defenseZone isEqualTo "" }) exitWith { + ["ERROR", format ["Defend module '%1': DefenseZone marker '%2' is missing or invalid.", _taskID, _defenseZone]] call EFUNC(common,log); +}; + +private _syncedEnemies = synchronizedObjects _logic select { _x isKindOf "CAManBase" }; +private _templateGroups = []; +private _templateUnits = []; +private _seenGroups = []; + +{ + private _group = group _x; + if (_group in _seenGroups) then { continue; }; + _seenGroups pushBack _group; + + private _templates = []; + { + if (isNull _x) then { continue; }; + _templateUnits pushBackUnique _x; + _templates pushBack createHashMapFromArray [ + ["type", typeOf _x], + ["loadout", getUnitLoadout _x], + ["skill", skill _x], + ["rank", rank _x], + ["side", side _x] + ]; + } forEach (units _group); + + if (_templates isNotEqualTo []) then { + _templateGroups pushBack _templates; + }; +} forEach _syncedEnemies; + +{ deleteVehicle _x } forEach _templateUnits; + +if (_templateGroups isEqualTo []) then { + ["WARNING", format [ + "Defend module '%1' has no synced enemy units. Falling back to default CSAT wave templates.", + _taskID + ]] call EFUNC(common,log); +}; + +["INFO", format [ + "Defend Module Parameters: TaskID: %1, DefenseZone: %2, DefendTime: %3, WaveCount: %4, WaveCooldown: %5, MinBlufor: %6, EnemyTemplateGroups: %7", + _taskID, _defenseZone, + _logic getVariable ["DefendTime", 600], + _logic getVariable ["WaveCount", 3], + _logic getVariable ["WaveCooldown", 300], + _logic getVariable ["MinBlufor", 1], + count _templateGroups +]] call EFUNC(common,log); + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "defend", + _taskID, + getMarkerPos _defenseZone, + format ["Defend: %1", _taskID], + "Hold the defense zone against incoming enemy forces.", + createHashMap, + createHashMapFromArray ([ + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["defenseZone", _defenseZone], + ["defendTime", _logic getVariable ["DefendTime", 600]], + ["waveCount", _logic getVariable ["WaveCount", 3]], + ["waveCooldown", _logic getVariable ["WaveCooldown", 300]], + ["minBlufor", _logic getVariable ["MinBlufor", 1]], + ["enemyTemplates", _templateGroups], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_defuseModule.sqf b/arma/server/addons/task/functions/modules/fnc_defuseModule.sqf new file mode 100644 index 0000000..b1f1f1c --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_defuseModule.sqf @@ -0,0 +1,90 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the defuse module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_defuseModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Defuse module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedModules = synchronizedObjects _logic; +private _iedModule = (_syncedModules select { typeOf _x isEqualTo "FORGE_Module_Explosives" }) param [0, objNull]; +private _protectedModule = (_syncedModules select { typeOf _x isEqualTo "FORGE_Module_Protected" }) param [0, objNull]; +private _iedEntities = if (!isNull _iedModule) then { + synchronizedObjects _iedModule select { !(_x isKindOf "Logic") } +} else { + [] +}; +private _protectedEntities = if (!isNull _protectedModule) then { + synchronizedObjects _protectedModule select { !(_x isKindOf "Logic") } +} else { + [] +}; + +["INFO", format [ + "Defuse Module: TaskID: %1, IEDs: %2, Protected: %3, IED timer: %4s", + _taskID, count _iedEntities, count _protectedEntities, + _logic getVariable ["TimeLimit", 300] +]] call EFUNC(common,log); + +private _taskPos = if (_iedEntities isNotEqualTo []) then { + getPosATL (_iedEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "defuse", + _taskID, + _taskPos, + format ["Defuse: %1", _taskID], + "Locate and defuse all explosive devices before they detonate.", + createHashMapFromArray [ + ["ieds", _iedEntities], + ["protected", _protectedEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["iedTimer", _logic getVariable ["TimeLimit", 300]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_deliveryModule.sqf b/arma/server/addons/task/functions/modules/fnc_deliveryModule.sqf new file mode 100644 index 0000000..3528638 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_deliveryModule.sqf @@ -0,0 +1,83 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the delivery task module. + * Reads parameters from the logic object, collects cargo from the synced + * FORGE_Module_Cargo grouping module, and delegates to fnc_startTask. + * + * Eden layout: + * [FORGE_Module_Delivery] --sync--> [FORGE_Module_Cargo] --sync--> cargo_obj1, cargo_obj2 + * + * Arguments: + * 0: Logic + * 1: Units + * 2: Activated + * + * Return Value: + * None + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Delivery module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedModules = synchronizedObjects _logic; +private _cargoModule = (_syncedModules select { typeOf _x isEqualTo "FORGE_Module_Cargo" }) param [0, objNull]; +private _cargoEntities = if (!isNull _cargoModule) then { synchronizedObjects _cargoModule } else { [] }; + +["INFO", format [ + "Delivery Module Parameters: TaskID: %1, DeliveryZone: %2, Cargo count: %3", + _taskID, + _logic getVariable ["DeliveryZone", ""], + count _cargoEntities +]] call EFUNC(common,log); + +private _taskPos = if (_cargoEntities isNotEqualTo []) then { + getPosATL (_cargoEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "delivery", + _taskID, + _taskPos, + format ["Delivery: %1", _taskID], + "Transport all cargo to the designated delivery zone.", + createHashMapFromArray [ + ["cargo", _cargoEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["timeLimit", _logic getVariable ["TimeLimit", 0]], + ["deliveryZone", _logic getVariable ["DeliveryZone", ""]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_destroyModule.sqf b/arma/server/addons/task/functions/modules/fnc_destroyModule.sqf new file mode 100644 index 0000000..46f6c88 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_destroyModule.sqf @@ -0,0 +1,72 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the destroy module. + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_destroyModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Destroy module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedEntities = synchronizedObjects _logic; +["INFO", format ["Destroy Module: TaskID: %1, Synced entities: %2", _taskID, count _syncedEntities]] call EFUNC(common,log); + +private _taskPos = if (_syncedEntities isNotEqualTo []) then { + getPosATL (_syncedEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "destroy", + _taskID, + _taskPos, + format ["Destroy: %1", _taskID], + "Locate and destroy all designated targets.", + createHashMapFromArray [ + ["targets", _syncedEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["timeLimit", _logic getVariable ["TimeLimit", 0]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_explosivesModule.sqf b/arma/server/addons/task/functions/modules/fnc_explosivesModule.sqf new file mode 100644 index 0000000..6725b17 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_explosivesModule.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the explosives module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_explosivesModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; diff --git a/arma/server/addons/task/functions/modules/fnc_hostageModule.sqf b/arma/server/addons/task/functions/modules/fnc_hostageModule.sqf new file mode 100644 index 0000000..46389fc --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_hostageModule.sqf @@ -0,0 +1,102 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the hostage module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_hostageModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "Hostage module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedModules = synchronizedObjects _logic; +private _hostageModule = (_syncedModules select { typeOf _x isEqualTo "FORGE_Module_Hostages" }) param [0, objNull]; +private _shooterModule = (_syncedModules select { typeOf _x isEqualTo "FORGE_Module_Shooters" }) param [0, objNull]; +private _hostageEntities = if (!isNull _hostageModule) then { + synchronizedObjects _hostageModule select { + (_x isKindOf "CAManBase") && { !(_x isKindOf "Logic") } + } +} else { + [] +}; +private _shooterEntities = if (!isNull _shooterModule) then { + synchronizedObjects _shooterModule select { + (_x isKindOf "CAManBase") && { !(_x isKindOf "Logic") } + } +} else { + [] +}; + +["INFO", format [ + "Hostage Module: TaskID: %1, ExtZone: %2, Hostages: %3, Shooters: %4, CBRN: %5, Execution: %6", + _taskID, + _logic getVariable ["ExtZone", ""], + count _hostageEntities, + count _shooterEntities, + _logic getVariable ["CBRN", false], + _logic getVariable ["Execution", false] +]] call EFUNC(common,log); + +private _taskPos = if (_hostageEntities isNotEqualTo []) then { + getPosATL (_hostageEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "hostage", + _taskID, + _taskPos, + format ["Hostage Rescue: %1", _taskID], + "Locate and rescue the hostages and bring them to the extraction zone.", + createHashMapFromArray [ + ["hostages", _hostageEntities], + ["shooters", _shooterEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["timeLimit", _logic getVariable ["TimeLimit", 0]], + ["extractionZone", _logic getVariable ["ExtZone", ""]], + ["cbrn", _logic getVariable ["CBRN", false]], + ["execution", _logic getVariable ["Execution", false]], + ["cbrnZone", _logic getVariable ["CBRNZone", ""]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_hostagesModule.sqf b/arma/server/addons/task/functions/modules/fnc_hostagesModule.sqf new file mode 100644 index 0000000..80b7b00 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_hostagesModule.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the hostage module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_hostagesModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; diff --git a/arma/server/addons/task/functions/modules/fnc_hvtModule.sqf b/arma/server/addons/task/functions/modules/fnc_hvtModule.sqf new file mode 100644 index 0000000..77d220e --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_hvtModule.sqf @@ -0,0 +1,80 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the hvt module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_hvtModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; + +private _taskID = _logic getVariable ["TaskID", ""]; +if (_taskID isEqualTo "") exitWith { + ["ERROR", "HVT module: no task ID configured."] call EFUNC(common,log); +}; + +private _syncedEntities = synchronizedObjects _logic; +["INFO", format [ + "HVT Module: TaskID: %1, ExtZone: %2, CaptureHVT: %3, HVTs: %4", + _taskID, + _logic getVariable ["ExtZone", ""], + _logic getVariable ["CaptureHVT", true], + count _syncedEntities +]] call EFUNC(common,log); + +private _taskPos = if (_syncedEntities isNotEqualTo []) then { + getPosATL (_syncedEntities select 0) +} else { + getPosATL _logic +}; + +private _equipmentRewards = [_logic getVariable ["EquipmentRewards", "[]"], _taskID, "equipment"] call FUNC(parseRewards); +private _supplyRewards = [_logic getVariable ["SupplyRewards", "[]"], _taskID, "supplies"] call FUNC(parseRewards); +private _weaponRewards = [_logic getVariable ["WeaponRewards", "[]"], _taskID, "weapons"] call FUNC(parseRewards); +private _vehicleRewards = [_logic getVariable ["VehicleRewards", "[]"], _taskID, "vehicles"] call FUNC(parseRewards); +private _specialRewards = [_logic getVariable ["SpecialRewards", "[]"], _taskID, "special"] call FUNC(parseRewards); +private _taskChainParams = [_logic] call FUNC(parseTaskChainAttributes); + +[ + "hvt", + _taskID, + _taskPos, + format ["HVT: %1", _taskID], + "Locate and capture or eliminate the high-value target.", + createHashMapFromArray [ + ["hvts", _syncedEntities] + ], + createHashMapFromArray ([ + ["limitFail", _logic getVariable ["LimitFail", -1]], + ["limitSuccess", _logic getVariable ["LimitSuccess", -1]], + ["funds", _logic getVariable ["CompanyFunds", 0]], + ["ratingFail", _logic getVariable ["RatingFail", 0]], + ["ratingSuccess", _logic getVariable ["RatingSuccess", 0]], + ["endSuccess", _logic getVariable ["EndSuccess", false]], + ["endFail", _logic getVariable ["EndFail", false]], + ["timeLimit", _logic getVariable ["TimeLimit", 0]], + ["extractionZone", _logic getVariable ["ExtZone", ""]], + ["captureHvt", _logic getVariable ["CaptureHVT", true]], + ["equipment", _equipmentRewards], + ["supplies", _supplyRewards], + ["weapons", _weaponRewards], + ["vehicles", _vehicleRewards], + ["special", _specialRewards] + ] + _taskChainParams) +] call FUNC(startTask); + +deleteVehicle _logic; diff --git a/arma/server/addons/task/functions/modules/fnc_protectedModule.sqf b/arma/server/addons/task/functions/modules/fnc_protectedModule.sqf new file mode 100644 index 0000000..cd80fd0 --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_protectedModule.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the protected module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_protectedModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; diff --git a/arma/server/addons/task/functions/modules/fnc_shootersModule.sqf b/arma/server/addons/task/functions/modules/fnc_shootersModule.sqf new file mode 100644 index 0000000..610f89b --- /dev/null +++ b/arma/server/addons/task/functions/modules/fnc_shootersModule.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the shooters module + * + * Arguments: + * 0: Logic - The logic object + * 1: Units - The array of units + * 2: Activated - Whether the module is activated + * + * Return Value: + * None + * + * Example: + * [logicObject, [unit1, unit2], true] call forge_server_task_fnc_shootersModule; + * + * Public: No + */ + +params [["_logic", objNull, [objNull]], ["_units", [], [[]]], ["_activated", true, [true]]]; + +if !(_activated) exitWith {}; diff --git a/arma/server/addons/task/functions/objects/README.md b/arma/server/addons/task/functions/objects/README.md new file mode 100644 index 0000000..bde3cce --- /dev/null +++ b/arma/server/addons/task/functions/objects/README.md @@ -0,0 +1,62 @@ +# Task Objects + +This folder documents the active `createHashMapObject` task instances and entity +controllers. Their source lives under `functions/objects/`, and each class is +initialized directly from `XEH_preInit.sqf`. + +Current task objects: +- `TaskInstanceBaseClass` +- `EntityControllerBaseClass` +- `TargetEntityController` +- `ShooterEntityController` +- `AttackTaskBaseClass` +- `HostageTaskBaseClass` +- `HostageEntityController` +- `HVTEntityController` +- `CargoEntityController` +- `ProtectedEntityController` +- `IEDEntityController` +- `DefenseEnemyController` +- `DefuseTaskBaseClass` +- `DestroyTaskBaseClass` +- `DeliveryTaskBaseClass` +- `HVTTaskBaseClass` +- `DefendTaskBaseClass` + +Source entry points: +- [fnc_TaskInstanceBaseClass.sqf](./fnc_TaskInstanceBaseClass.sqf) +- [fnc_EntityControllerBaseClass.sqf](./fnc_EntityControllerBaseClass.sqf) +- [fnc_TargetEntityController.sqf](./fnc_TargetEntityController.sqf) +- [fnc_ShooterEntityController.sqf](./fnc_ShooterEntityController.sqf) +- [fnc_AttackTaskBaseClass.sqf](./fnc_AttackTaskBaseClass.sqf) +- [fnc_HostageTaskBaseClass.sqf](./fnc_HostageTaskBaseClass.sqf) +- [fnc_HostageEntityController.sqf](./fnc_HostageEntityController.sqf) +- [fnc_HVTEntityController.sqf](./fnc_HVTEntityController.sqf) +- [fnc_CargoEntityController.sqf](./fnc_CargoEntityController.sqf) +- [fnc_ProtectedEntityController.sqf](./fnc_ProtectedEntityController.sqf) +- [fnc_IEDEntityController.sqf](./fnc_IEDEntityController.sqf) +- [fnc_DefenseEnemyController.sqf](./fnc_DefenseEnemyController.sqf) +- [fnc_DefuseTaskBaseClass.sqf](./fnc_DefuseTaskBaseClass.sqf) +- [fnc_DestroyTaskBaseClass.sqf](./fnc_DestroyTaskBaseClass.sqf) +- [fnc_DeliveryTaskBaseClass.sqf](./fnc_DeliveryTaskBaseClass.sqf) +- [fnc_HVTTaskBaseClass.sqf](./fnc_HVTTaskBaseClass.sqf) +- [fnc_DefendTaskBaseClass.sqf](./fnc_DefendTaskBaseClass.sqf) + +Purpose: +- keep per-task instance state in task objects +- keep per-entity behavior in controller objects +- separate state ownership from long procedural function flows +- keep shared lifecycle and reward initialization in `TaskInstanceBaseClass` +- so concrete task objects only define task-specific state +- keep heartbeat-style AI/object behavior in separate entity controllers instead + of mixing it into task outcome loops + +Important design choice: +- these objects use explicit `markSucceeded`, `markFailed`, and `cleanup` + methods instead of relying on `#delete` +- task loops that use `sleep` or `waitUntil` with `sleep` must be started from + scheduled code, typically via `spawn` + +That is intentional. `createHashMapObject` destructor timing is reference-based, +so `#delete` is not a good primitive for mission-critical task completion or +reward flow. diff --git a/arma/server/addons/task/functions/objects/fnc_AttackTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_AttackTaskBaseClass.sqf new file mode 100644 index 0000000..9487a72 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_AttackTaskBaseClass.sqf @@ -0,0 +1,227 @@ +#include "..\script_component.hpp" + +/* + * Object-style attack task class. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\TaskInstanceBaseClass.sqf"; + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\AttackTaskBaseClass.sqf"; + * + * private _task = createHashMapObject [ + * GVAR(AttackTaskBaseClass), + * [ + * "task_attack_review", + * createHashMapFromArray [ + * ["targets", [unit1, unit2, unit3]] + * ], + * createHashMapFromArray [ + * ["limitSuccess", 3], + * ["timeLimit", 900], + * ["funds", 50000], + * ["ratingSuccess", 25] + * ] + * ] + * ]; + * + * [_task] spawn { + * params ["_task"]; + * _task call ["runLoop", []]; + * }; + * _task = nil; // Safe after the spawned closure has captured the reference. + * + * Note: + * `runLoop` uses `sleep`, so it must be entered from scheduled code. + */ + +#pragma hemtt ignore_variables ["_self"] + +GVAR(AttackTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(AttackTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "AttackTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "attack", _entities, _taskParams]]; + + private _targets = +(_entities getOrDefault ["targets", []]); + private _requiredKills = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredKills < 0) then { _requiredKills = count _targets; }; + + private _maxTargetLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxTargetLosses < 0) then { _maxTargetLosses = count _targets; }; + + _self set ["targets", _targets]; + _self set ["requiredKills", _requiredKills]; + _self set ["maxTargetLosses", _maxTargetLosses]; + _self set ["timeLimit", _taskParams getOrDefault ["timeLimit", 0]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["refreshTargetsFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _targets = GVAR(TaskStore) call ["getTaskEntities", ["targets", _taskID]]; + _self set ["targets", _targets]; + + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _requiredKills = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredKills < 0) then { _requiredKills = count _targets; }; + + private _maxTargetLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxTargetLosses < 0) then { _maxTargetLosses = count _targets; }; + + _self set ["requiredKills", _requiredKills]; + _self set ["maxTargetLosses", _maxTargetLosses]; + true + }], + ["countKilledTargets", compileFinal { + private _targets = _self getOrDefault ["targets", []]; + { !alive _x } count _targets + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["tick", compileFinal { + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _targetsKilled = _self call ["countKilledTargets", []]; + private _requiredKills = _self getOrDefault ["requiredKills", 0]; + private _maxTargetLosses = _self getOrDefault ["maxTargetLosses", 0]; + private _timeExpired = false; + + if (_timeLimit > 0 && { _startedAt >= 0 }) then { + _timeExpired = (serverTime - _startedAt) >= _timeLimit; + }; + + createHashMapFromArray [ + ["targetsKilled", _targetsKilled], + ["requiredKills", _requiredKills], + ["maxTargetLosses", _maxTargetLosses], + ["timeExpired", _timeExpired], + ["shouldFail", _timeExpired && { _targetsKilled < _requiredKills }], + ["shouldSucceed", _targetsKilled >= _requiredKills] + ] + }], + ["runLoop", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + private _useTaskStore = _self getOrDefault ["useTaskStore", false]; + + if (_useTaskStore) then { + waitUntil { + sleep 1; + _self call ["refreshTargetsFromStore", []]; + private _targets = _self getOrDefault ["targets", []]; + GVAR(TaskStore) call ["trackParticipants", [_taskID, _targets, "", 300]]; + count _targets > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["targets", []]) > 0 + }; + }; + + _self call ["waitForAssignment", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + private _targets = _self getOrDefault ["targets", []]; + + if (_useTaskStore) then { + _self call ["refreshTargetsFromStore", []]; + _targets = _self getOrDefault ["targets", []]; + GVAR(TaskStore) call ["trackParticipants", [_taskID, _targets, "", 300]]; + }; + + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + ["WARNING", format [ + "Attack task %1 failed by timeout. TargetsKilled=%2, Required=%3, TimeLimit=%4s", + _taskID, + _snapshot getOrDefault ["targetsKilled", 0], + _snapshot getOrDefault ["requiredKills", 0], + _timeLimit + ]] call EFUNC(common,log); + _self call ["markFailed", ["Attack fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + ["INFO", format [ + "Attack task %1 succeeded. TargetsRequired=%2, TargetsKilled=%3", + _taskID, + _snapshot getOrDefault ["requiredKills", 0], + _snapshot getOrDefault ["targetsKilled", 0] + ]] call EFUNC(common,log); + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + private _targets = _self getOrDefault ["targets", []]; + { deleteVehicle _x } forEach _targets; + + if (_useTaskStore) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + } else { + private _targets = _self getOrDefault ["targets", []]; + { deleteVehicle _x } forEach _targets; + + if (_useTaskStore) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_CargoEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_CargoEntityController.sqf new file mode 100644 index 0000000..1b615db --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_CargoEntityController.sqf @@ -0,0 +1,80 @@ +#include "..\script_component.hpp" + +/* + * Object-style delivery cargo entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(CargoEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(CargoEntityController) merge [createHashMapFromArray [ + ["#type", "CargoEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "cargo", _controllerParams]]; + _self set ["damageThreshold", _controllerParams getOrDefault ["damageThreshold", 0.7]]; + _self set ["damageEventId", -1]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["cleanup", []]; + }], + ["watchDamage", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity) exitWith { false }; + + private _threshold = _self getOrDefault ["damageThreshold", 0.7]; + _entity setVariable [QGVAR(cargoDamageThreshold), _threshold]; + + private _eventId = _entity addEventHandler ["Dammaged", { + params ["_unit"]; + + private _threshold = _unit getVariable [QGVAR(cargoDamageThreshold), 0.7]; + if (damage _unit < _threshold) exitWith {}; + + private _taskID = _unit getVariable ["assignedTask", _unit getVariable [QGVAR(assignedTask), ""]]; + if (_taskID isEqualTo "") exitWith {}; + if (_unit getVariable [QGVAR(cargoDamageWarned), false]) exitWith {}; + + _unit setVariable [QGVAR(cargoDamageWarned), true]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Cargo for task %1 has been severely damaged.", _taskID]]]; + }]; + + _self set ["damageEventId", _eventId]; + true + }], + ["cleanup", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + private _eventId = _self getOrDefault ["damageEventId", -1]; + + if (!isNull _entity && { _eventId >= 0 }) then { + _entity removeEventHandler ["Dammaged", _eventId]; + }; + + _self call ["unregisterInstance", []] + }], + ["runLoop", compileFinal { + if !(_self call ["registerTaskEntity", ["cargo"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["watchDamage", []]; + _self call ["markActive", []]; + + waitUntil { + sleep 1; + private _entity = _self getOrDefault ["entity", objNull]; + isNull _entity || { !alive _entity } || { damage _entity >= (_self getOrDefault ["damageThreshold", 0.7]) } + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_DefendTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_DefendTaskBaseClass.sqf new file mode 100644 index 0000000..6e29abe --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_DefendTaskBaseClass.sqf @@ -0,0 +1,216 @@ +#include "..\script_component.hpp" + +/* + * Object-style defend task class. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(DefendTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(DefendTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "DefendTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "defend", _entities, _taskParams]]; + + _self set ["defenseZone", _taskParams getOrDefault ["defenseZone", ""]]; + _self set ["defendTime", _taskParams getOrDefault ["defendTime", 600]]; + _self set ["waveCount", _taskParams getOrDefault ["waveCount", 3]]; + _self set ["waveCooldown", _taskParams getOrDefault ["waveCooldown", 300]]; + _self set ["minBlufor", _taskParams getOrDefault ["minBlufor", 1]]; + _self set ["enemyTemplates", _taskParams getOrDefault ["enemyTemplates", []]]; + _self set ["nextWaveTime", -1]; + _self set ["currentWave", 0]; + _self set ["zoneEmptyCounter", 0]; + _self set ["warningIssued", false]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["isValidDefenseZone", compileFinal { + private _defenseZone = _self getOrDefault ["defenseZone", ""]; + _defenseZone isNotEqualTo "" && { markerShape _defenseZone in ["RECTANGLE", "ELLIPSE"] } + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, [], _self getOrDefault ["defenseZone", ""], 0]]; + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["countBluforInZone", compileFinal { + private _defenseZone = _self getOrDefault ["defenseZone", ""]; + if (_defenseZone isEqualTo "") exitWith { 0 }; + + count (allUnits select { _x isKindOf "CAManBase" && { side _x == west } && { alive _x }} inAreaArray _defenseZone) + }], + ["waitForDefenseStart", compileFinal { + private _minBlufor = _self getOrDefault ["minBlufor", 1]; + + waitUntil { + sleep 1; + _self call ["trackParticipants", []]; + + private _ready = (_self call ["countBluforInZone", []]) >= _minBlufor; + if (_ready) then { + _self call ["markActive", []]; + _self set ["nextWaveTime", serverTime]; + + if (_self getOrDefault ["useTaskStore", false]) then { + GVAR(TaskStore) call ["notifyParticipants", [_self getOrDefault ["taskID", ""], "info", "Tasks", "Defense has started. Hold the zone."]]; + }; + }; + + _ready + }; + + true + }], + ["tick", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _defenseZone = _self getOrDefault ["defenseZone", ""]; + private _defendTime = _self getOrDefault ["defendTime", 600]; + private _waveCount = _self getOrDefault ["waveCount", 3]; + private _waveCooldown = _self getOrDefault ["waveCooldown", 300]; + private _minBlufor = _self getOrDefault ["minBlufor", 1]; + private _currentWave = _self getOrDefault ["currentWave", 0]; + private _enemyTemplates = _self getOrDefault ["enemyTemplates", []]; + private _nextWaveTime = _self getOrDefault ["nextWaveTime", -1]; + private _zoneEmptyCounter = _self getOrDefault ["zoneEmptyCounter", 0]; + private _warningIssued = _self getOrDefault ["warningIssued", false]; + private _bluforInZone = _self call ["countBluforInZone", []]; + private _elapsed = serverTime - (_self getOrDefault ["startedAt", serverTime]); + + if (_bluforInZone < _minBlufor) then { + _zoneEmptyCounter = _zoneEmptyCounter + 1; + + if (_zoneEmptyCounter == 15 && { !_warningIssued } && { _self getOrDefault ["useTaskStore", false] }) then { + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", "Defense zone is empty. Return immediately."]]; + _warningIssued = true; + }; + } else { + _zoneEmptyCounter = 0; + _warningIssued = false; + }; + + if (_currentWave < _waveCount && { serverTime >= _nextWaveTime }) then { + [_defenseZone, _taskID, _currentWave, _enemyTemplates] call FUNC(spawnEnemyWave); + + _currentWave = _currentWave + 1; + _nextWaveTime = serverTime + _waveCooldown; + + if (_self getOrDefault ["useTaskStore", false]) then { + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "info", "Tasks", format ["Enemy forces approaching. Wave %1 of %2.", _currentWave, _waveCount]]]; + }; + }; + + _self set ["currentWave", _currentWave]; + _self set ["nextWaveTime", _nextWaveTime]; + _self set ["zoneEmptyCounter", _zoneEmptyCounter]; + _self set ["warningIssued", _warningIssued]; + + createHashMapFromArray [ + ["bluforInZone", _bluforInZone], + ["elapsed", _elapsed], + ["currentWave", _currentWave], + ["waveCount", _waveCount], + ["zoneEmptyCounter", _zoneEmptyCounter], + ["shouldFail", _zoneEmptyCounter >= 30], + ["shouldSucceed", (_bluforInZone >= _minBlufor) && { _elapsed >= _defendTime } && { _currentWave >= _waveCount }] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + if !(_self call ["isValidDefenseZone", []]) exitWith { + _self call ["markFailed", ["Invalid defense zone.", createHashMap]]; + _self call ["cleanup", []]; + false + }; + + _self call ["waitForAssignment", []]; + _self call ["waitForDefenseStart", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["Defend fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_DefenseEnemyController.sqf b/arma/server/addons/task/functions/objects/fnc_DefenseEnemyController.sqf new file mode 100644 index 0000000..8e54c7b --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_DefenseEnemyController.sqf @@ -0,0 +1,52 @@ +#include "..\script_component.hpp" + +/* + * Object-style defense enemy controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(DefenseEnemyController) = +GVAR(EntityControllerBaseClass); +GVAR(DefenseEnemyController) merge [createHashMapFromArray [ + ["#type", "DefenseEnemyController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "defense_enemy", _controllerParams]]; + _self set ["defenseZone", _controllerParams getOrDefault ["defenseZone", ""]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["applyInitialState", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { false }; + + _self call ["assignTaskVariable", []]; + _entity setBehaviour "AWARE"; + _entity setSpeedMode "NORMAL"; + _entity enableDynamicSimulation true; + true + }], + ["runLoop", compileFinal { + if !(_self call ["applyInitialState", []]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + waitUntil { + sleep 1; + !(_self call ["isEntityUsable", []]) + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_DefuseTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_DefuseTaskBaseClass.sqf new file mode 100644 index 0000000..b024e60 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_DefuseTaskBaseClass.sqf @@ -0,0 +1,277 @@ +#include "..\script_component.hpp" + +/* + * Object-style defuse task class. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\TaskInstanceBaseClass.sqf"; + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\DefuseTaskBaseClass.sqf"; + * + * private _task = createHashMapObject [ + * GVAR(DefuseTaskBaseClass), + * [ + * "task_defuse_review", + * createHashMapFromArray [ + * ["ieds", [ied1, ied2]], + * ["protected", [truck1]] + * ], + * createHashMapFromArray [ + * ["limitSuccess", 2], + * ["limitFail", 1], + * ["iedTimer", 300], + * ["funds", 75000], + * ["ratingSuccess", 30] + * ] + * ] + * ]; + * + * [_task] spawn { + * params ["_task"]; + * _task call ["runLoop", []]; + * }; + * + * Note: + * `runLoop` uses `sleep`, so it must be entered from scheduled code. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(DefuseTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(DefuseTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "DefuseTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "defuse", _entities, _taskParams]]; + + private _ieds = +(_entities getOrDefault ["ieds", []]); + private _protected = +(_entities getOrDefault ["protected", []]); + private _requiredDefusals = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDefusals < 0) then { _requiredDefusals = count _ieds; }; + + private _maxProtectedLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxProtectedLosses < 0) then { _maxProtectedLosses = count _protected; }; + + _self set ["ieds", _ieds]; + _self set ["protected", _protected]; + _self set ["requiredDefusals", _requiredDefusals]; + _self set ["maxProtectedLosses", _maxProtectedLosses]; + _self set ["iedTimer", _taskParams getOrDefault ["iedTimer", 300]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + _self set ["localDefuseCount", _taskParams getOrDefault ["localDefuseCount", 0]]; + _self set ["iedControllers", []]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["refreshEntitiesFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _ieds = GVAR(TaskStore) call ["getTaskEntities", ["ieds", _taskID]]; + private _protected = GVAR(TaskStore) call ["getTaskEntities", ["entities", _taskID]]; + _self set ["ieds", _ieds]; + _self set ["protected", _protected]; + + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _requiredDefusals = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDefusals < 0) then { _requiredDefusals = count _ieds; }; + + private _maxProtectedLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxProtectedLosses < 0) then { _maxProtectedLosses = count _protected; }; + + _self set ["requiredDefusals", _requiredDefusals]; + _self set ["maxProtectedLosses", _maxProtectedLosses]; + true + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, (_self getOrDefault ["ieds", []]) + (_self getOrDefault ["protected", []]), "", 250]]; + true + }], + ["waitForRequiredEntities", compileFinal { + if (_self getOrDefault ["useTaskStore", false]) then { + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + count (_self getOrDefault ["ieds", []]) > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["ieds", []]) > 0 + }; + }; + + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["startIedControllers", compileFinal { + if ((_self getOrDefault ["iedControllers", []]) isNotEqualTo []) exitWith { true }; + + private _taskID = _self getOrDefault ["taskID", ""]; + private _defaultCountdown = _self getOrDefault ["iedTimer", 300]; + private _controllers = []; + + { + if (!isNull _x) then { + private _countdown = _x getVariable [QGVAR(iedCountdown), _defaultCountdown]; + private _controller = createHashMapObject [ + GVAR(IEDEntityController), + [ + _taskID, + _x, + createHashMapFromArray [ + ["countdown", _countdown], + ["waitForAcceptance", true] + ] + ] + ]; + + _controllers pushBack _controller; + [_controller] spawn { + params ["_controller"]; + _controller call ["runLoop", []]; + }; + }; + } forEach (_self getOrDefault ["ieds", []]); + + _self set ["iedControllers", _controllers]; + true + }], + ["countProtectedDestroyed", compileFinal { + private _protected = _self getOrDefault ["protected", []]; + { !alive _x } count _protected + }], + ["getDefuseCount", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "") exitWith { 0 }; + if !(_self getOrDefault ["useTaskStore", false]) exitWith { + _self getOrDefault ["localDefuseCount", 0] + }; + + GVAR(TaskStore) call ["getDefuseCount", [_taskID]] + }], + ["incrementLocalDefuseCount", compileFinal { + private _next = (_self getOrDefault ["localDefuseCount", 0]) + 1; + _self set ["localDefuseCount", _next]; + _next + }], + ["tick", compileFinal { + private _defusedCount = _self call ["getDefuseCount", []]; + private _protectedDestroyed = _self call ["countProtectedDestroyed", []]; + private _requiredDefusals = _self getOrDefault ["requiredDefusals", 0]; + private _maxProtectedLosses = _self getOrDefault ["maxProtectedLosses", 0]; + + createHashMapFromArray [ + ["defusedCount", _defusedCount], + ["protectedDestroyed", _protectedDestroyed], + ["requiredDefusals", _requiredDefusals], + ["maxProtectedLosses", _maxProtectedLosses], + ["shouldFail", (_protectedDestroyed >= _maxProtectedLosses) && { _maxProtectedLosses > 0 }], + ["shouldSucceed", (_defusedCount >= _requiredDefusals) && { _requiredDefusals > 0 } && { _protectedDestroyed < _maxProtectedLosses || { _maxProtectedLosses <= 0 } }] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _ieds = _self getOrDefault ["ieds", []]; + private _protected = _self getOrDefault ["protected", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + + { deleteVehicle _x } forEach _ieds; + { deleteVehicle _x } forEach _protected; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _ieds = _self getOrDefault ["ieds", []]; + private _protected = _self getOrDefault ["protected", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + + { deleteVehicle _x } forEach _ieds; + { deleteVehicle _x } forEach _protected; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + _self call ["waitForRequiredEntities", []]; + _self call ["waitForAssignment", []]; + _self call ["startIedControllers", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["Defuse fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_DeliveryTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_DeliveryTaskBaseClass.sqf new file mode 100644 index 0000000..15272dc --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_DeliveryTaskBaseClass.sqf @@ -0,0 +1,204 @@ +#include "..\script_component.hpp" + +/* + * Object-style delivery task class. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(DeliveryTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(DeliveryTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "DeliveryTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "delivery", _entities, _taskParams]]; + + private _cargo = +(_entities getOrDefault ["cargo", []]); + private _requiredDelivered = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDelivered < 0) then { _requiredDelivered = count _cargo; }; + + private _maxDamaged = _taskParams getOrDefault ["limitFail", -1]; + if (_maxDamaged < 0) then { _maxDamaged = count _cargo; }; + + _self set ["cargo", _cargo]; + _self set ["deliveryZone", _taskParams getOrDefault ["deliveryZone", ""]]; + _self set ["requiredDelivered", _requiredDelivered]; + _self set ["maxDamaged", _maxDamaged]; + _self set ["timeLimit", _taskParams getOrDefault ["timeLimit", 0]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["refreshEntitiesFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _cargo = GVAR(TaskStore) call ["getTaskEntities", ["cargo", _taskID]]; + _self set ["cargo", _cargo]; + true + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, _self getOrDefault ["cargo", []], _self getOrDefault ["deliveryZone", ""], 125]]; + true + }], + ["waitForRequiredEntities", compileFinal { + if (_self getOrDefault ["useTaskStore", false]) then { + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + _self call ["trackParticipants", []]; + count (_self getOrDefault ["cargo", []]) > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["cargo", []]) > 0 + }; + }; + + private _cargo = _self getOrDefault ["cargo", []]; + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _requiredDelivered = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDelivered < 0) then { _requiredDelivered = count _cargo; }; + + private _maxDamaged = _taskParams getOrDefault ["limitFail", -1]; + if (_maxDamaged < 0) then { _maxDamaged = count _cargo; }; + + _self set ["requiredDelivered", _requiredDelivered]; + _self set ["maxDamaged", _maxDamaged]; + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["countDeliveredCargo", compileFinal { + private _deliveryZone = _self getOrDefault ["deliveryZone", ""]; + private _cargo = _self getOrDefault ["cargo", []]; + + if (_deliveryZone isEqualTo "") exitWith { 0 }; + { _x inArea _deliveryZone && { damage _x < 0.7 } } count _cargo + }], + ["countDamagedCargo", compileFinal { + private _cargo = _self getOrDefault ["cargo", []]; + { damage _x >= 0.7 } count _cargo + }], + ["tick", compileFinal { + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _delivered = _self call ["countDeliveredCargo", []]; + private _damaged = _self call ["countDamagedCargo", []]; + private _requiredDelivered = _self getOrDefault ["requiredDelivered", 0]; + private _maxDamaged = _self getOrDefault ["maxDamaged", 0]; + private _timeExpired = false; + + if (_timeLimit > 0 && { _startedAt >= 0 }) then { + _timeExpired = (serverTime - _startedAt) >= _timeLimit; + }; + + createHashMapFromArray [ + ["delivered", _delivered], + ["damaged", _damaged], + ["requiredDelivered", _requiredDelivered], + ["maxDamaged", _maxDamaged], + ["timeExpired", _timeExpired], + ["shouldFail", (_damaged >= _maxDamaged) || { _timeExpired && { _delivered < _requiredDelivered } }], + ["shouldSucceed", (_delivered >= _requiredDelivered) && { _damaged < _maxDamaged }] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _cargo = _self getOrDefault ["cargo", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + + { deleteVehicle _x } forEach _cargo; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _cargo = _self getOrDefault ["cargo", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + + { deleteVehicle _x } forEach _cargo; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + _self call ["waitForRequiredEntities", []]; + _self call ["waitForAssignment", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["Delivery fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_DestroyTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_DestroyTaskBaseClass.sqf new file mode 100644 index 0000000..29dd41f --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_DestroyTaskBaseClass.sqf @@ -0,0 +1,184 @@ +#include "..\script_component.hpp" + +/* + * Object-style destroy task class. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(DestroyTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(DestroyTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "DestroyTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "destroy", _entities, _taskParams]]; + + private _targets = +(_entities getOrDefault ["targets", []]); + private _requiredDestroyed = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDestroyed < 0) then { _requiredDestroyed = count _targets; }; + + _self set ["targets", _targets]; + _self set ["requiredDestroyed", _requiredDestroyed]; + _self set ["timeLimit", _taskParams getOrDefault ["timeLimit", 0]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["refreshEntitiesFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _targets = GVAR(TaskStore) call ["getTaskEntities", ["targets", _taskID]]; + _self set ["targets", _targets]; + true + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, _self getOrDefault ["targets", []], "", 300]]; + true + }], + ["waitForRequiredEntities", compileFinal { + if (_self getOrDefault ["useTaskStore", false]) then { + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + _self call ["trackParticipants", []]; + count (_self getOrDefault ["targets", []]) > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["targets", []]) > 0 + }; + }; + + private _targets = _self getOrDefault ["targets", []]; + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _requiredDestroyed = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredDestroyed < 0) then { _requiredDestroyed = count _targets; }; + + _self set ["requiredDestroyed", _requiredDestroyed]; + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["countDestroyedTargets", compileFinal { + private _targets = _self getOrDefault ["targets", []]; + { !alive _x } count _targets + }], + ["tick", compileFinal { + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _destroyed = _self call ["countDestroyedTargets", []]; + private _requiredDestroyed = _self getOrDefault ["requiredDestroyed", 0]; + private _timeExpired = false; + + if (_timeLimit > 0 && { _startedAt >= 0 }) then { + _timeExpired = (serverTime - _startedAt) >= _timeLimit; + }; + + createHashMapFromArray [ + ["destroyed", _destroyed], + ["requiredDestroyed", _requiredDestroyed], + ["timeExpired", _timeExpired], + ["shouldFail", _timeExpired && { _destroyed < _requiredDestroyed }], + ["shouldSucceed", _destroyed >= _requiredDestroyed] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _targets = _self getOrDefault ["targets", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + + { deleteVehicle _x } forEach _targets; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _targets = _self getOrDefault ["targets", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + + { deleteVehicle _x } forEach _targets; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + _self call ["waitForRequiredEntities", []]; + _self call ["waitForAssignment", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["Destroy fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_EntityControllerBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_EntityControllerBaseClass.sqf new file mode 100644 index 0000000..4b951f2 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_EntityControllerBaseClass.sqf @@ -0,0 +1,144 @@ +#include "..\script_component.hpp" + +/* + * Object-style base class for object-based entity controllers. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\EntityControllerBaseClass.sqf"; + * + * private _controller = createHashMapObject [ + * GVAR(EntityControllerBaseClass), + * [ + * "task_review_001", + * hostage1, + * "custom", + * createHashMapFromArray [ + * ["radius", 2] + * ] + * ] + * ]; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(EntityControllerBaseClass) = createHashMapFromArray [ + ["#type", "EntityControllerBaseClass"], + ["initializeControllerState", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerType", "custom", [""]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self set ["taskID", _taskID]; + _self set ["entity", _entity]; + _self set ["controllerType", _controllerType]; + _self set ["controllerParams", _controllerParams]; + _self set ["status", "created"]; + _self set ["startedAt", -1]; + _self set ["finishedAt", -1]; + true + }], + ["#create", compileFinal { + private _taskID = ""; + private _entity = objNull; + private _controllerType = "custom"; + private _controllerParams = createHashMap; + + if (_this isEqualType [] && { count _this > 0 }) then { + _taskID = _this param [0, "", [""]]; + _entity = _this param [1, objNull, [objNull]]; + + if ((count _this > 2) && { (_this select 2) isEqualType "" }) then { + _controllerType = _this param [2, "custom", [""]]; + _controllerParams = _this param [3, createHashMap, [createHashMap]]; + } else { + _controllerParams = _this param [2, createHashMap, [createHashMap]]; + }; + }; + + _self call ["initializeControllerState", [_taskID, _entity, _controllerType, _controllerParams]]; + }], + ["getEntity", compileFinal { + _self getOrDefault ["entity", objNull] + }], + ["getRegistryKey", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity) exitWith { "" }; + + format ["%1_controller_%2", _self getOrDefault ["controllerType", "custom"], netId _entity] + }], + ["getTaskID", compileFinal { + _self getOrDefault ["taskID", ""] + }], + ["isEntityUsable", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + !isNull _entity && { alive _entity } + }], + ["assignTaskVariable", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + private _taskID = _self getOrDefault ["taskID", ""]; + if (isNull _entity || { _taskID isEqualTo "" }) exitWith { false }; + + _entity setVariable ["assignedTask", _taskID, true]; + _entity setVariable [QGVAR(assignedTask), _taskID, true]; + true + }], + ["registerTaskEntity", compileFinal { + params [["_role", "", [""]]]; + + private _taskID = _self getOrDefault ["taskID", ""]; + private _entity = _self getOrDefault ["entity", objNull]; + private _useTaskStore = (_self getOrDefault ["controllerParams", createHashMap]) getOrDefault ["useTaskStore", true]; + + if (_role isEqualTo "" || { _taskID isEqualTo "" } || { isNull _entity }) exitWith { false }; + _self call ["assignTaskVariable", []]; + + if (_useTaskStore) then { + GVAR(TaskStore) call ["registerTaskEntity", [_role, _taskID, _entity]]; + }; + + true + }], + ["registerInstance", compileFinal { + private _registryKey = _self call ["getRegistryKey", []]; + if (_registryKey isEqualTo "") exitWith { false }; + + private _registry = missionNamespace getVariable [QGVAR(ObjectControllerInstances), createHashMap]; + _registry set [_registryKey, _self]; + missionNamespace setVariable [QGVAR(ObjectControllerInstances), _registry]; + missionNamespace setVariable [_registryKey, _self]; + true + }], + ["unregisterInstance", compileFinal { + private _registryKey = _self call ["getRegistryKey", []]; + if (_registryKey isEqualTo "") exitWith { false }; + + private _registry = missionNamespace getVariable [QGVAR(ObjectControllerInstances), createHashMap]; + _registry deleteAt _registryKey; + missionNamespace setVariable [_registryKey, nil]; + true + }], + ["markActive", compileFinal { + _self set ["status", "active"]; + _self set ["startedAt", serverTime]; + true + }], + ["markFinished", compileFinal { + _self set ["status", "finished"]; + _self set ["finishedAt", serverTime]; + true + }], + ["markAborted", compileFinal { + _self set ["status", "aborted"]; + _self set ["finishedAt", serverTime]; + true + }], + ["cleanup", compileFinal { + _self call ["unregisterInstance", []] + }], + ["runLoop", compileFinal { + false + }] +]; diff --git a/arma/server/addons/task/functions/objects/fnc_HVTEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_HVTEntityController.sqf new file mode 100644 index 0000000..cd758c8 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_HVTEntityController.sqf @@ -0,0 +1,72 @@ +#include "..\script_component.hpp" + +/* + * Object-style HVT entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(HVTEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(HVTEntityController) merge [createHashMapFromArray [ + ["#type", "HVTEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "hvt", _controllerParams]]; + _self set ["captureRadius", _controllerParams getOrDefault ["captureRadius", 2]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["findNearbyCapturer", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { objNull }; + + private _radius = _self getOrDefault ["captureRadius", 2]; + private _nearPlayers = allPlayers inAreaArray [ASLToAGL getPosASL _entity, _radius, _radius, 0, false, 2]; + if (_nearPlayers isEqualTo []) exitWith { objNull }; + + _nearPlayers select 0 + }], + ["transitionToCaptured", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { false }; + + _entity setCaptive true; + _entity enableAIFeature ["MOVE", true]; + true + }], + ["runLoop", compileFinal { + if !(_self call ["registerTaskEntity", ["hvts"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + + private _capturer = objNull; + waitUntil { + sleep 1; + if !(_self call ["isEntityUsable", []]) exitWith { true }; + + _capturer = _self call ["findNearbyCapturer", []]; + !isNull _capturer + }; + + if !(_self call ["isEntityUsable", []]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["transitionToCaptured", []]; + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_HVTTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_HVTTaskBaseClass.sqf new file mode 100644 index 0000000..142d9a0 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_HVTTaskBaseClass.sqf @@ -0,0 +1,240 @@ +#include "..\script_component.hpp" + +/* + * Object-style HVT task class. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(HVTTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(HVTTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "HVTTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "hvt", _entities, _taskParams]]; + + private _hvts = +(_entities getOrDefault ["hvts", []]); + private _required = _taskParams getOrDefault ["limitSuccess", -1]; + if (_required < 0) then { _required = count _hvts; }; + + private _maxKilled = _taskParams getOrDefault ["limitFail", -1]; + if (_maxKilled < 0) then { _maxKilled = count _hvts; }; + + private _type = _taskParams getOrDefault ["type", []]; + private _captureHvt = _taskParams getOrDefault ["captureHvt", true]; + private _capture = _captureHvt; + private _eliminate = !_captureHvt; + + if (_type isEqualType [] && { count _type >= 2 }) then { + _capture = _type param [0, true, [false]]; + _eliminate = _type param [1, false, [false]]; + }; + + _self set ["hvts", _hvts]; + _self set ["extractionZone", _taskParams getOrDefault ["extractionZone", ""]]; + _self set ["required", _required]; + _self set ["maxKilled", _maxKilled]; + _self set ["capture", _capture]; + _self set ["eliminate", _eliminate]; + _self set ["timeLimit", _taskParams getOrDefault ["timeLimit", 0]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + _self set ["hvtControllers", []]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["refreshEntitiesFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _hvts = GVAR(TaskStore) call ["getTaskEntities", ["hvts", _taskID]]; + _self set ["hvts", _hvts]; + true + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, _self getOrDefault ["hvts", []], _self getOrDefault ["extractionZone", ""], 250]]; + true + }], + ["waitForRequiredEntities", compileFinal { + if (_self getOrDefault ["useTaskStore", false]) then { + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + _self call ["trackParticipants", []]; + count (_self getOrDefault ["hvts", []]) > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["hvts", []]) > 0 + }; + }; + + private _hvts = _self getOrDefault ["hvts", []]; + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _required = _taskParams getOrDefault ["limitSuccess", -1]; + if (_required < 0) then { _required = count _hvts; }; + + private _maxKilled = _taskParams getOrDefault ["limitFail", -1]; + if (_maxKilled < 0) then { _maxKilled = count _hvts; }; + + _self set ["required", _required]; + _self set ["maxKilled", _maxKilled]; + true + }], + ["startHvtControllers", compileFinal { + if ((_self getOrDefault ["hvtControllers", []]) isNotEqualTo []) exitWith { true }; + + private _taskID = _self getOrDefault ["taskID", ""]; + private _controllers = []; + + { + if (!isNull _x) then { + private _controller = createHashMapObject [ + GVAR(HVTEntityController), + [_taskID, _x, createHashMapFromArray [["captureRadius", 2]]] + ]; + + _controllers pushBack _controller; + [_controller] spawn { + params ["_controller"]; + _controller call ["runLoop", []]; + }; + }; + } forEach (_self getOrDefault ["hvts", []]); + + _self set ["hvtControllers", _controllers]; + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["tick", compileFinal { + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _hvts = _self getOrDefault ["hvts", []]; + private _extZone = _self getOrDefault ["extractionZone", ""]; + private _capture = _self getOrDefault ["capture", true]; + private _eliminate = _self getOrDefault ["eliminate", false]; + private _required = _self getOrDefault ["required", 0]; + private _maxKilled = _self getOrDefault ["maxKilled", 0]; + private _captives = { captive _x } count _hvts; + private _killed = { !alive _x } count _hvts; + private _inZone = if (_extZone isEqualTo "") then { 0 } else { { _x inArea _extZone } count _hvts }; + private _timeExpired = false; + + if (_timeLimit > 0 && { _startedAt >= 0 }) then { + _timeExpired = (serverTime - _startedAt) >= _timeLimit; + }; + + private _captureSucceeded = _capture && { _inZone >= _required } && { _killed < _maxKilled }; + private _eliminateSucceeded = _eliminate && { _killed >= _required }; + + createHashMapFromArray [ + ["captives", _captives], + ["killed", _killed], + ["inZone", _inZone], + ["required", _required], + ["maxKilled", _maxKilled], + ["timeExpired", _timeExpired], + ["shouldFail", (_capture && { _killed >= _maxKilled }) || { _timeExpired && { (_capture && { !_captureSucceeded }) || { _eliminate && { !_eliminateSucceeded } } } }], + ["shouldSucceed", _captureSucceeded || _eliminateSucceeded] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _hvts = _self getOrDefault ["hvts", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + + { deleteVehicle _x } forEach _hvts; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "failed"]]; + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _hvts = _self getOrDefault ["hvts", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + + { deleteVehicle _x } forEach _hvts; + + if (_self getOrDefault ["useTaskStore", false]) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + _self call ["waitForRequiredEntities", []]; + _self call ["waitForAssignment", []]; + _self call ["startHvtControllers", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["HVT fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_HostageEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_HostageEntityController.sqf new file mode 100644 index 0000000..0d70b34 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_HostageEntityController.sqf @@ -0,0 +1,123 @@ +#include "..\script_component.hpp" + +/* + * Object-style hostage entity controller. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\EntityControllerBaseClass.sqf"; + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\HostageEntityController.sqf"; + * + * private _controller = createHashMapObject [ + * GVAR(HostageEntityController), + * [ + * "task_hostage_review", + * hostage1, + * createHashMapFromArray [ + * ["rescueRadius", 2], + * ["loopAnimation", "acts_executionvictim_loop"], + * ["rescueAnimation", "acts_executionvictim_unbow"] + * ] + * ] + * ]; + * + * [_controller] spawn { + * params ["_controller"]; + * _controller call ["runLoop", []]; + * }; + * + * Note: + * `runLoop` uses `sleep`, so it must be entered from scheduled code. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(HostageEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(HostageEntityController) merge [createHashMapFromArray [ + ["#type", "HostageEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "hostage", _controllerParams]]; + _self set ["rescueRadius", _controllerParams getOrDefault ["rescueRadius", 2]]; + _self set ["loopAnimation", _controllerParams getOrDefault ["loopAnimation", "acts_executionvictim_loop"]]; + _self set ["rescueAnimation", _controllerParams getOrDefault ["rescueAnimation", "acts_executionvictim_unbow"]]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["applyInitialState", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { false }; + + _entity setCaptive true; + _entity enableAIFeature ["MOVE", false]; + _entity playMove (_self getOrDefault ["loopAnimation", "acts_executionvictim_loop"]); + true + }], + ["findNearbyRescuer", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { objNull }; + + private _radius = _self getOrDefault ["rescueRadius", 2]; + private _nearPlayers = allPlayers inAreaArray [ASLToAGL getPosASL _entity, _radius, _radius, 0, false, 2]; + if (_nearPlayers isEqualTo []) exitWith { objNull }; + + _nearPlayers select 0 + }], + ["transitionToRescued", compileFinal { + params [["_rescuer", objNull, [objNull]]]; + + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { isNull _rescuer }) exitWith { false }; + + [_entity] joinSilent (group _rescuer); + _entity setCaptive true; + _entity enableAIFeature ["MOVE", true]; + _entity playMove (_self getOrDefault ["rescueAnimation", "acts_executionvictim_unbow"]); + true + }], + ["runLoop", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + + if !(_self call ["applyInitialState", []]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + private _rescuer = objNull; + waitUntil { + sleep 1; + + if (isNull _entity || { !alive _entity }) exitWith { true }; + + _rescuer = _self call ["findNearbyRescuer", []]; + !isNull _rescuer + }; + + if (isNull _entity || { !alive _entity }) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["transitionToRescued", [_rescuer]]; + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_HostageTaskBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_HostageTaskBaseClass.sqf new file mode 100644 index 0000000..c8193aa --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_HostageTaskBaseClass.sqf @@ -0,0 +1,367 @@ +#include "..\script_component.hpp" + +/* + * Object-style hostage task class. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\TaskInstanceBaseClass.sqf"; + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\HostageTaskBaseClass.sqf"; + * + * private _task = createHashMapObject [ + * GVAR(HostageTaskBaseClass), + * [ + * "task_hostage_review", + * createHashMapFromArray [ + * ["hostages", [hostage1, hostage2]], + * ["shooters", [shooter1, shooter2]] + * ], + * createHashMapFromArray [ + * ["extractionZone", "hostage_extract"], + * ["limitSuccess", 2], + * ["limitFail", 1], + * ["execution", true], + * ["timeLimit", 900], + * ["funds", 100000], + * ["ratingSuccess", 50] + * ] + * ] + * ]; + * + * [_task] spawn { + * params ["_task"]; + * _task call ["runLoop", []]; + * }; + * + * Note: + * `runLoop` and the wait helpers use `sleep`, so they must be entered from + * scheduled code. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(HostageTaskBaseClass) = +GVAR(TaskInstanceBaseClass); +GVAR(HostageTaskBaseClass) merge [createHashMapFromArray [ + ["#type", "HostageTaskBaseClass"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeBaseState", [_taskID, "hostage", _entities, _taskParams]]; + + private _hostages = +(_entities getOrDefault ["hostages", []]); + private _shooters = +(_entities getOrDefault ["shooters", []]); + private _requiredRescues = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredRescues < 0) then { _requiredRescues = count _hostages; }; + + private _maxHostageLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxHostageLosses < 0) then { _maxHostageLosses = count _hostages; }; + + private _type = _taskParams getOrDefault ["type", []]; + private _cbrn = _taskParams getOrDefault ["cbrn", false]; + private _execution = _taskParams getOrDefault ["execution", false]; + + if (_type isEqualType [] && { count _type >= 2 }) then { + _cbrn = _type param [0, false, [false]]; + _execution = _type param [1, true, [false]]; + }; + + _self set ["hostages", _hostages]; + _self set ["shooters", _shooters]; + _self set ["extractionZone", _taskParams getOrDefault ["extractionZone", ""]]; + _self set ["timeLimit", _taskParams getOrDefault ["timeLimit", 0]]; + _self set ["execution", _execution]; + _self set ["cbrn", _cbrn]; + _self set ["cbrnZone", _taskParams getOrDefault ["cbrnZone", ""]]; + _self set ["useTaskStore", _taskParams getOrDefault ["useTaskStore", false]]; + _self set ["requiredRescues", _requiredRescues]; + _self set ["maxHostageLosses", _maxHostageLosses]; + _self set ["hostageControllers", []]; + + _self call ["createHostageControllers", []]; + + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["createHostageControllers", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _hostages = _self getOrDefault ["hostages", []]; + private _controllers = []; + + { + _controllers pushBack (createHashMapObject [ + GVAR(HostageEntityController), + [ + _taskID, + _x, + createHashMapFromArray [ + ["rescueRadius", 2], + ["loopAnimation", "acts_executionvictim_loop"], + ["rescueAnimation", "acts_executionvictim_unbow"] + ] + ] + ]); + } forEach _hostages; + + _self set ["hostageControllers", _controllers]; + _controllers + }], + ["startHostageControllers", compileFinal { + private _controllers = _self getOrDefault ["hostageControllers", []]; + + { + [_x] spawn { + params ["_controller"]; + _controller call ["runLoop", []]; + }; + } forEach _controllers; + + true + }], + ["refreshEntitiesFromStore", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _hostages = GVAR(TaskStore) call ["getTaskEntities", ["hostages", _taskID]]; + private _shooters = GVAR(TaskStore) call ["getTaskEntities", ["shooters", _taskID]]; + + _self set ["hostages", _hostages]; + _self set ["shooters", _shooters]; + true + }], + ["trackParticipants", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { false }; + + private _hostages = _self getOrDefault ["hostages", []]; + private _shooters = _self getOrDefault ["shooters", []]; + private _extZone = _self getOrDefault ["extractionZone", ""]; + + GVAR(TaskStore) call ["trackParticipants", [_taskID, _hostages + _shooters, _extZone, 250]]; + true + }], + ["waitForRequiredEntities", compileFinal { + if (_self getOrDefault ["useTaskStore", false]) then { + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + count (_self getOrDefault ["hostages", []]) > 0 + }; + + waitUntil { + sleep 1; + _self call ["refreshEntitiesFromStore", []]; + _self call ["trackParticipants", []]; + count (_self getOrDefault ["shooters", []]) > 0 + }; + } else { + waitUntil { + sleep 1; + count (_self getOrDefault ["hostages", []]) > 0 + }; + + waitUntil { + sleep 1; + count (_self getOrDefault ["shooters", []]) > 0 + }; + }; + + private _hostages = _self getOrDefault ["hostages", []]; + private _taskParams = _self getOrDefault ["taskParams", createHashMap]; + private _requiredRescues = _taskParams getOrDefault ["limitSuccess", -1]; + if (_requiredRescues < 0) then { _requiredRescues = count _hostages; }; + + private _maxHostageLosses = _taskParams getOrDefault ["limitFail", -1]; + if (_maxHostageLosses < 0) then { _maxHostageLosses = count _hostages; }; + + _self set ["requiredRescues", _requiredRescues]; + _self set ["maxHostageLosses", _maxHostageLosses]; + true + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + + if (_taskID isEqualTo "" || { !(_self getOrDefault ["useTaskStore", false]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["countFreedHostages", compileFinal { + private _playerGroups = allPlayers apply { group _x }; + private _hostages = _self getOrDefault ["hostages", []]; + + { + alive _x && { ((group _x) in _playerGroups) || { !captive _x } } + } count _hostages + }], + ["countHostagesInZone", compileFinal { + private _extZone = _self getOrDefault ["extractionZone", ""]; + private _hostages = _self getOrDefault ["hostages", []]; + + if (_extZone isEqualTo "") exitWith { 0 }; + { _x inArea _extZone } count _hostages + }], + ["countKilledHostages", compileFinal { + private _hostages = _self getOrDefault ["hostages", []]; + { !alive _x } count _hostages + }], + ["countAliveShooters", compileFinal { + private _shooters = _self getOrDefault ["shooters", []]; + { alive _x } count _shooters + }], + ["tick", compileFinal { + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _timeLimit = _self getOrDefault ["timeLimit", 0]; + private _killed = _self call ["countKilledHostages", []]; + private _freed = _self call ["countFreedHostages", []]; + private _inZone = _self call ["countHostagesInZone", []]; + private _shootersAlive = _self call ["countAliveShooters", []]; + private _requiredRescues = _self getOrDefault ["requiredRescues", 0]; + private _maxHostageLosses = _self getOrDefault ["maxHostageLosses", 0]; + private _timeExpired = false; + + if (_timeLimit > 0 && { _startedAt >= 0 }) then { + _timeExpired = (serverTime - _startedAt) >= _timeLimit; + }; + + private _hostageSucceeded = (_inZone >= _requiredRescues) && { _killed < _maxHostageLosses }; + private _shootersClearedSucceeded = (_shootersAlive <= 0) && { _hostageSucceeded }; + + createHashMapFromArray [ + ["freed", _freed], + ["inZone", _inZone], + ["killed", _killed], + ["shootersAlive", _shootersAlive], + ["requiredRescues", _requiredRescues], + ["maxHostageLosses", _maxHostageLosses], + ["timeExpired", _timeExpired], + ["shouldFail", (_killed >= _maxHostageLosses) || { _timeExpired && { !_hostageSucceeded } }], + ["shouldSucceed", _hostageSucceeded || _shootersClearedSucceeded] + ] + }], + ["handleFailureOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _hostages = _self getOrDefault ["hostages", []]; + private _shooters = _self getOrDefault ["shooters", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingFail = _rewardData getOrDefault ["ratingFail", 0]; + private _endFail = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endFail", false]; + private _cbrn = _self getOrDefault ["cbrn", false]; + private _hostage = _self getOrDefault ["execution", false]; + private _cbrnZone = _self getOrDefault ["cbrnZone", ""]; + private _useTaskStore = _self getOrDefault ["useTaskStore", false]; + + if (_cbrn && { _cbrnZone isNotEqualTo "" }) then { + "SmokeShellYellow" createVehicle getMarkerPos _cbrnZone; + + sleep 5; + + { + if (captive _x) then { + _x setDamage 0.9; + _x playMove "acts_executionvictim_kill_end"; + + sleep 2.75; + + _x setDamage 1; + }; + } forEach _hostages; + }; + + if (_hostage) then { + { + _x enableAIFeature ["MOVE", true]; + _x playMove ""; + } forEach _shooters; + + sleep 1; + + { _x setCaptive false; } forEach _hostages; + + sleep 5; + }; + + { deleteVehicle _x } forEach _hostages; + { deleteVehicle _x } forEach _shooters; + + if (_useTaskStore) then { + [_taskID, "FAILED"] call BFUNC(taskSetState); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingFail]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Task failed: %1 reputation", _ratingFail]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endFail) then { "EveryoneLost" call BFUNC(endMissionServer); }; + true + }], + ["handleSuccessOutcome", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _hostages = _self getOrDefault ["hostages", []]; + private _shooters = _self getOrDefault ["shooters", []]; + private _rewardData = _self getOrDefault ["rewardData", createHashMap]; + private _ratingSuccess = _rewardData getOrDefault ["ratingSuccess", 0]; + private _funds = _rewardData getOrDefault ["funds", 0]; + private _endSuccess = (_self getOrDefault ["taskParams", createHashMap]) getOrDefault ["endSuccess", false]; + private _useTaskStore = _self getOrDefault ["useTaskStore", false]; + + { deleteVehicle _x } forEach _hostages; + { deleteVehicle _x } forEach _shooters; + + if (_useTaskStore) then { + [_taskID, "SUCCEEDED"] call BFUNC(taskSetState); + GVAR(TaskStore) call ["setTaskStatus", [_taskID, "succeeded"]]; + [_taskID, _rewardData] call FUNC(handleTaskRewards); + + sleep 1; + + GVAR(TaskStore) call ["applyRatingOutcome", [_taskID, _ratingSuccess]]; + GVAR(TaskStore) call ["notifyParticipants", [_taskID, "success", "Tasks", format ["Task completed: %1 reputation, $%2 funds", _ratingSuccess, [_funds] call EFUNC(common,formatNumber)]]]; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + }; + + if (_endSuccess) then { "EveryoneWon" call BFUNC(endMissionServer); }; + true + }], + ["runLoop", compileFinal { + _self call ["waitForRequiredEntities", []]; + _self call ["waitForAssignment", []]; + _self call ["startHostageControllers", []]; + _self call ["markActive", []]; + + while { (_self call ["getStatus", []]) isEqualTo "active" } do { + _self call ["trackParticipants", []]; + private _snapshot = _self call ["tick", []]; + + if (_snapshot getOrDefault ["shouldFail", false]) exitWith { + _self call ["markFailed", ["Hostage fail conditions met.", _snapshot]]; + }; + + if (_snapshot getOrDefault ["shouldSucceed", false]) exitWith { + _self call ["markSucceeded", [_snapshot]]; + }; + + sleep 1; + }; + + if ((_self call ["getStatus", []]) isEqualTo "failed") then { + _self call ["handleFailureOutcome", []]; + } else { + _self call ["handleSuccessOutcome", []]; + }; + + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_IEDEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_IEDEntityController.sqf new file mode 100644 index 0000000..2613431 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_IEDEntityController.sqf @@ -0,0 +1,88 @@ +#include "..\script_component.hpp" + +/* + * Object-style IED entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(IEDEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(IEDEntityController) merge [createHashMapFromArray [ + ["#type", "IEDEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "ied", _controllerParams]]; + _self set ["countdown", _controllerParams getOrDefault ["countdown", _controllerParams getOrDefault ["iedTimer", 0]]]; + _self set ["waitForAcceptance", _controllerParams getOrDefault ["waitForAcceptance", true]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["waitForAssignment", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + if (_taskID isEqualTo "" || { !(_self getOrDefault ["waitForAcceptance", true]) }) exitWith { true }; + + waitUntil { + sleep 1; + GVAR(TaskStore) call ["isTaskAccepted", [_taskID]] + }; + + true + }], + ["playCountdownSound", compileFinal { + params [["_timeRemaining", 0, [0]]]; + + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity) exitWith { false }; + + if (_timeRemaining > 10) exitWith { _entity say3D "FORGE_timerBeep"; true }; + if (_timeRemaining > 5) exitWith { _entity say3D "FORGE_timerBeepShort"; true }; + + _entity say3D "FORGE_timerEnd"; + true + }], + ["detonate", compileFinal { + private _entity = _self getOrDefault ["entity", objNull]; + if (isNull _entity || { !alive _entity }) exitWith { false }; + + _entity setDamage 1; + true + }], + ["runLoop", compileFinal { + private _countdown = _self getOrDefault ["countdown", 0]; + if (_countdown <= 0) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + if !(_self call ["registerTaskEntity", ["ieds"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["waitForAssignment", []]; + _self call ["markActive", []]; + + while { (_self call ["isEntityUsable", []]) && { _countdown > 0 } } do { + _self call ["playCountdownSound", [_countdown]]; + _countdown = _countdown - 1; + _self set ["countdown", _countdown]; + sleep 1; + }; + + if ((_self call ["isEntityUsable", []]) && { _countdown <= 0 }) then { + _self call ["detonate", []]; + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_ProtectedEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_ProtectedEntityController.sqf new file mode 100644 index 0000000..5de2f15 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_ProtectedEntityController.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" + +/* + * Object-style protected entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ProtectedEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(ProtectedEntityController) merge [createHashMapFromArray [ + ["#type", "ProtectedEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "protected", _controllerParams]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["runLoop", compileFinal { + if !(_self call ["registerTaskEntity", ["entities"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + waitUntil { + sleep 1; + !(_self call ["isEntityUsable", []]) + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_ShooterEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_ShooterEntityController.sqf new file mode 100644 index 0000000..06a8fdc --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_ShooterEntityController.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" + +/* + * Object-style shooter entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ShooterEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(ShooterEntityController) merge [createHashMapFromArray [ + ["#type", "ShooterEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "shooter", _controllerParams]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["runLoop", compileFinal { + if !(_self call ["registerTaskEntity", ["shooters"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + waitUntil { + sleep 1; + !(_self call ["isEntityUsable", []]) + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_TargetEntityController.sqf b/arma/server/addons/task/functions/objects/fnc_TargetEntityController.sqf new file mode 100644 index 0000000..bb965e9 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TargetEntityController.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" + +/* + * Object-style target entity controller. + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TargetEntityController) = +GVAR(EntityControllerBaseClass); +GVAR(TargetEntityController) merge [createHashMapFromArray [ + ["#type", "TargetEntityController"], + ["#create", compileFinal { + params [ + ["_taskID", "", [""]], + ["_entity", objNull, [objNull]], + ["_controllerParams", createHashMap, [createHashMap]] + ]; + + _self call ["initializeControllerState", [_taskID, _entity, "target", _controllerParams]]; + _self call ["registerInstance", []]; + }], + ["#delete", compileFinal { + _self call ["unregisterInstance", []]; + }], + ["runLoop", compileFinal { + if !(_self call ["registerTaskEntity", ["targets"]]) exitWith { + _self call ["markAborted", []]; + _self call ["cleanup", []]; + false + }; + + _self call ["markActive", []]; + waitUntil { + sleep 1; + !(_self call ["isEntityUsable", []]) + }; + + _self call ["markFinished", []]; + _self call ["cleanup", []]; + true + }] +], true]; diff --git a/arma/server/addons/task/functions/objects/fnc_TaskCatalogStore.sqf b/arma/server/addons/task/functions/objects/fnc_TaskCatalogStore.sqf new file mode 100644 index 0000000..ec0ee4c --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskCatalogStore.sqf @@ -0,0 +1,436 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Catalog/status/chaining store for task metadata. + * + * TaskStore keeps the public facade used by the rest of the task system. This + * object owns catalog persistence calls, active status, acceptance, and chained + * task availability. + * + * Arguments: + * None + * + * Return Value: + * Task catalog store object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskCatalogStore) = createHashMapObject [[ + ["#type", "TaskCatalogStore"], + ["#create", compileFinal { + _self call ["resetRuntimeState", []]; + }], + ["resetRuntimeState", compileFinal { + _self set ["completedTaskRegistry", createHashMap]; + _self set ["taskDependencyRegistry", createHashMap]; + _self set ["runtimeCatalogRegistry", createHashMap]; + true + }], + ["bindTaskOwnership", compileFinal { + params [["_taskID", "", [""]], ["_requesterUid", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["requesterUid", _requesterUid], + ["orgID", "default"], + ["message", ""] + ]; + + if (_taskID isEqualTo "") exitWith { + _result set ["message", "Missing task ID."]; + _result + }; + + private _orgID = "default"; + + if (_requesterUid isNotEqualTo "") then { + private _actor = EGVAR(actor,ActorStore) call ["load", [_requesterUid]]; + + if (_actor isEqualTo createHashMap) exitWith { + _result set ["message", format ["Failed to load actor for %1.", _requesterUid]]; + _result + }; + + _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + }; + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _orgID] + ]; + private _envelope = GVAR(TaskStateGateway) call [ + "callTaskStateEnvelope", + [ + "task:ownership:bind", + [_taskID, toJSON _context] + ] + ]; + if !(_envelope getOrDefault ["success", false]) exitWith { + _result set ["message", _envelope getOrDefault ["error", "Failed to bind task ownership."]]; + _result + }; + + private _bindResult = _envelope getOrDefault ["data", createHashMap]; + _result set ["success", true]; + _result set ["message", _bindResult getOrDefault [ + "message", + ["No requester UID provided. Bound task to default organization.", "Task ownership updated."] select (_requesterUid isNotEqualTo "") + ]]; + _result set ["orgID", _bindResult getOrDefault ["orgId", _orgID]]; + _result + }], + ["releaseTaskOwnership", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _envelope = GVAR(TaskStateGateway) call ["callTaskStateEnvelope", ["task:ownership:release", [_taskID]]]; + _envelope getOrDefault ["success", false] + }], + ["normalizePrerequisiteTaskIds", compileFinal { + params [["_value", [], [[], ""]]]; + + if (_value isEqualType "") then { _value = [_value]; }; + if !(_value isEqualType []) exitWith { [] }; + + private _taskIDs = []; + { + if !(_x isEqualType "") then { continue; }; + if (_x isEqualTo "") then { continue; }; + _taskIDs pushBackUnique _x; + } forEach _value; + + _taskIDs + }], + ["getTaskPrerequisites", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { [] }; + + private _dependencyRegistry = _self getOrDefault ["taskDependencyRegistry", createHashMap]; + +(_dependencyRegistry getOrDefault [_taskID, []]) + }], + ["isTaskCompleted", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _completedRegistry = _self getOrDefault ["completedTaskRegistry", createHashMap]; + if (_completedRegistry getOrDefault [_taskID, false]) exitWith { true }; + + (_self call ["getTaskStatus", [_taskID]]) isEqualTo "succeeded" + }], + ["areTaskPrerequisitesSatisfied", compileFinal { + params [["_taskID", "", [""]], ["_entry", createHashMap, [createHashMap]]]; + + private _prerequisites = _self call ["getTaskPrerequisites", [_taskID]]; + if (_prerequisites isEqualTo [] && { _entry isNotEqualTo createHashMap }) then { + _prerequisites = _self call ["normalizePrerequisiteTaskIds", [_entry getOrDefault ["prerequisiteTaskIds", []]]]; + }; + if (_prerequisites isEqualTo []) exitWith { true }; + + private _satisfied = true; + { + if !(_self call ["isTaskCompleted", [_x]]) exitWith { _satisfied = false; }; + } forEach _prerequisites; + + _satisfied + }], + ["resolveInitialTaskStatus", compileFinal { + params [["_taskID", "", [""]], ["_entry", createHashMap, [createHashMap]]]; + + if (_self call ["areTaskPrerequisitesSatisfied", [_taskID, _entry]]) exitWith { "available" }; + + "locked" + }], + ["markTaskCompleted", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _completedRegistry = _self getOrDefault ["completedTaskRegistry", createHashMap]; + _completedRegistry set [_taskID, true]; + _self set ["completedTaskRegistry", _completedRegistry]; + true + }], + ["unlockDependentTasks", compileFinal { + params [["_completedTaskID", "", [""]]]; + + private _dependencyRegistry = _self getOrDefault ["taskDependencyRegistry", createHashMap]; + { + private _dependentTaskID = _x; + private _prerequisites = _y; + + if !(_completedTaskID in _prerequisites) then { continue; }; + if ((_self call ["getTaskStatus", [_dependentTaskID]]) isNotEqualTo "locked") then { continue; }; + if !(_self call ["areTaskPrerequisitesSatisfied", [_dependentTaskID]]) then { continue; }; + + _self call ["setTaskStatus", [_dependentTaskID, "available"]]; + ["INFO", format ["Unlocked chained task '%1' after prerequisite '%2' completed.", _dependentTaskID, _completedTaskID]] call EFUNC(common,log); + } forEach _dependencyRegistry; + + true + }], + ["registerTaskCatalogEntry", compileFinal { + params [["_taskID", "", [""]], ["_entry", createHashMap, [createHashMap]]]; + + if (_taskID isEqualTo "" || { _entry isEqualTo createHashMap }) exitWith { false }; + + _entry set ["taskID", _taskID]; + _entry set ["taskId", _taskID]; + + private _prerequisiteTaskIds = _self call ["normalizePrerequisiteTaskIds", [_entry getOrDefault ["prerequisiteTaskIds", []]]]; + _entry set ["prerequisiteTaskIds", _prerequisiteTaskIds]; + + private _dependencyRegistry = _self getOrDefault ["taskDependencyRegistry", createHashMap]; + if (_prerequisiteTaskIds isEqualTo []) then { + _dependencyRegistry deleteAt _taskID; + } else { + _dependencyRegistry set [_taskID, _prerequisiteTaskIds]; + }; + _self set ["taskDependencyRegistry", _dependencyRegistry]; + + private _initialStatus = ["available", "locked"] select !(_self call ["areTaskPrerequisitesSatisfied", [_taskID, _entry]]); + _entry set ["locked", _initialStatus isEqualTo "locked"]; + _entry set ["status", _initialStatus]; + + private _envelope = GVAR(TaskStateGateway) call [ + "callTaskStateEnvelope", + [ + "task:catalog:upsert", + [_taskID, toJSON _entry] + ] + ]; + private _registered = _envelope getOrDefault ["success", false]; + + if (_registered) then { + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + _runtimeCatalogRegistry set [_taskID, +_entry]; + _self set ["runtimeCatalogRegistry", _runtimeCatalogRegistry]; + + GVAR(TaskLifecycleReporter) call ["recordTaskCreated", [_taskID]]; + GVAR(TaskLifecycleReporter) call ["emitTaskLifecycleEvent", ["task.created", _taskID, "created", createHashMap]]; + _self call ["setTaskStatus", [_taskID, _initialStatus]]; + }; + + _registered + }], + ["getActiveTaskCatalog", compileFinal { + private _entries = GVAR(TaskStateGateway) call ["callTaskState", ["task:catalog:active", [], []]]; + if !(_entries isEqualType []) then { _entries = [] }; + + private _entryRegistry = createHashMap; + { + if !(_x isEqualType createHashMap) then { continue; }; + private _taskID = _x getOrDefault ["taskID", _x getOrDefault ["taskId", ""]]; + if (_taskID isEqualTo "") then { continue; }; + _entryRegistry set [_taskID, +_x]; + } forEach _entries; + + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + { + if (_x in _entryRegistry) then { continue; }; + _entryRegistry set [_x, +_y]; + } forEach _runtimeCatalogRegistry; + + if (_entries isEqualTo [] && { _runtimeCatalogRegistry isNotEqualTo createHashMap }) then { + ["WARNING", format [ + "Task active catalog backend returned no entries; using %1 runtime catalog entr%2 as fallback.", + count _runtimeCatalogRegistry, + ["y", "ies"] select ((count _runtimeCatalogRegistry) isNotEqualTo 1) + ]] call EFUNC(common,log); + }; + + private _visibleEntries = []; + { + private _taskID = _x; + private _entry = _y; + if !(_entry isEqualType createHashMap) then { continue; }; + if (_taskID isEqualTo "") then { continue; }; + + private _entryStatus = toLowerANSI (_entry getOrDefault ["status", ""]); + private _status = _self call ["getTaskStatus", [_taskID]]; + if !(_status in ["available", "assigned", "active"]) then { + if (_entryStatus in ["available", "assigned", "active"]) then { + _status = _entryStatus; + }; + }; + if !(_status in ["available", "assigned", "active"]) then { continue; }; + if !(_self call ["areTaskPrerequisitesSatisfied", [_taskID, _entry]]) then { continue; }; + + _entry set ["status", _status]; + _visibleEntries pushBack _entry; + } forEach _entryRegistry; + + _visibleEntries + }], + ["hasTaskCatalogEntry", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _entry = GVAR(TaskStateGateway) call ["callTaskState", ["task:catalog:get", [_taskID], objNull]]; + if (_entry isEqualType createHashMap) exitWith { true }; + + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + (_runtimeCatalogRegistry getOrDefault [_taskID, createHashMap]) isNotEqualTo createHashMap + }], + ["getTaskCatalogEntry", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + [(GVAR(TaskStateGateway) call ["callTaskState", ["task:catalog:get", [_taskID], createHashMap]])] params [["_entry", createHashMap, [createHashMap]]]; + if !(_entry isEqualType createHashMap) then { _entry = createHashMap }; + if (_entry isEqualTo createHashMap) then { + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + _entry = +(_runtimeCatalogRegistry getOrDefault [_taskID, createHashMap]); + }; + if !(_entry isEqualType createHashMap) exitWith { createHashMap }; + + _entry + }], + ["isTaskAccepted", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + [(_self call ["getTaskCatalogEntry", [_taskID]])] params [["_entry", createHashMap, [createHashMap]]]; + if (_entry isEqualTo createHashMap) exitWith { false }; + + [(_entry getOrDefault ["accepted", false])] params [["_accepted", false, [false]]]; + [(_entry getOrDefault ["requesterUid", ""])] params [["_requesterUid", "", [""]]]; + + _accepted || { _requesterUid isNotEqualTo "" } + }], + ["acceptTask", compileFinal { + params [["_taskID", "", [""]], ["_requesterUid", "", [""]]]; + + private _result = createHashMapFromArray [ + ["success", false], + ["message", "Unable to accept task."], + ["entry", createHashMap] + ]; + + if (_taskID isEqualTo "" || { _requesterUid isEqualTo "" }) exitWith { + _result set ["message", "Missing task ID or requester UID."]; + _result + }; + + private _actor = EGVAR(actor,ActorStore) call ["load", [_requesterUid]]; + if (_actor isEqualTo createHashMap) exitWith { + _result set ["message", format ["Failed to load actor for %1.", _requesterUid]]; + _result + }; + + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_requesterUid]]; + + private _context = createHashMapFromArray [ + ["requesterUid", _requesterUid], + ["orgId", _orgID] + ]; + private _envelope = GVAR(TaskStateGateway) call [ + "callTaskStateEnvelope", + [ + "task:ownership:accept", + [_taskID, toJSON _context] + ] + ]; + if !(_envelope getOrDefault ["success", false]) exitWith { + _result set ["message", _envelope getOrDefault ["error", "Unable to accept task."]]; + _result + }; + + private _acceptResult = _envelope getOrDefault ["data", createHashMap]; + private _entry = _acceptResult getOrDefault ["entry", createHashMap]; + if !(_entry isEqualType createHashMap) then { _entry = createHashMap; }; + + _result set ["success", true]; + _result set ["message", _acceptResult getOrDefault ["message", "Task accepted."]]; + _result set ["entry", _entry]; + _result + }], + ["setTaskStatus", compileFinal { + params [["_taskID", "", [""]], ["_status", "", [""]]]; + + if (_taskID isEqualTo "" || { _status isEqualTo "" }) exitWith { false }; + + private _normalizedStatus = toLowerANSI _status; + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + private _runtimeEntry = +(_runtimeCatalogRegistry getOrDefault [_taskID, createHashMap]); + if (_runtimeEntry isNotEqualTo createHashMap) then { + _runtimeEntry set ["status", _normalizedStatus]; + _runtimeEntry set ["locked", _normalizedStatus isEqualTo "locked"]; + _runtimeCatalogRegistry set [_taskID, _runtimeEntry]; + _self set ["runtimeCatalogRegistry", _runtimeCatalogRegistry]; + }; + + private _envelope = GVAR(TaskStateGateway) call ["callTaskStateEnvelope", ["task:status:set", [_taskID, _status]]]; + private _statusResult = _envelope getOrDefault ["success", false]; + + if (_statusResult) then { + private _eventName = GVAR(TaskLifecycleReporter) call ["recordTaskStatus", [_taskID, _normalizedStatus]]; + + if (_eventName isNotEqualTo "") then { + GVAR(TaskLifecycleReporter) call ["emitTaskLifecycleEvent", [_eventName, _taskID, _normalizedStatus, createHashMap]]; + }; + + if (_normalizedStatus isEqualTo "succeeded") then { + _self call ["markTaskCompleted", [_taskID]]; + _self call ["unlockDependentTasks", [_taskID]]; + }; + } else { + ["WARNING", format [ + "Task status backend update failed for %1 -> %2; runtime status was retained for CAD visibility.", + _taskID, + _normalizedStatus + ]] call EFUNC(common,log); + }; + + _statusResult + }], + ["getTaskStatus", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { "" }; + + [(GVAR(TaskStateGateway) call ["callTaskState", ["task:status:get", [_taskID], ""]])] params [["_status", "", [""]]]; + if (_status isEqualTo "") then { + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + private _entry = _runtimeCatalogRegistry getOrDefault [_taskID, createHashMap]; + if (_entry isNotEqualTo createHashMap) then { + _status = _entry getOrDefault ["status", ["available", "locked"] select (_entry getOrDefault ["locked", false])]; + }; + }; + _status + }], + ["clearTaskStatus", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + [(GVAR(TaskStateGateway) call ["callTaskState", ["task:status:clear", [_taskID], false]])] params [["_statusResult", false, [false]]]; + + _statusResult + }], + ["clearRuntimeTask", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _runtimeCatalogRegistry = _self getOrDefault ["runtimeCatalogRegistry", createHashMap]; + _runtimeCatalogRegistry deleteAt _taskID; + _self set ["runtimeCatalogRegistry", _runtimeCatalogRegistry]; + + private _dependencyRegistry = _self getOrDefault ["taskDependencyRegistry", createHashMap]; + _dependencyRegistry deleteAt _taskID; + _self set ["taskDependencyRegistry", _dependencyRegistry]; + + true + }] +]]; + +GVAR(TaskCatalogStore) diff --git a/arma/server/addons/task/functions/objects/fnc_TaskEntityRegistry.sqf b/arma/server/addons/task/functions/objects/fnc_TaskEntityRegistry.sqf new file mode 100644 index 0000000..0653a11 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskEntityRegistry.sqf @@ -0,0 +1,106 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Runtime entity registry for task-owned Arma objects. + * + * Stores object references by registry key and task ID. TaskStore remains the + * public facade, while this object owns entity storage and lookup behavior. + * + * Arguments: + * None + * + * Return Value: + * Task entity registry object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskEntityRegistry) = createHashMapObject [[ + ["#type", "TaskEntityRegistry"], + ["#create", compileFinal { + _self call ["resetRuntimeState", []]; + }], + ["resetRuntimeState", compileFinal { + _self set ["taskEntityRegistries", createHashMapFromArray [ + ["cargo", createHashMap], + ["hostages", createHashMap], + ["hvts", createHashMap], + ["ieds", createHashMap], + ["entities", createHashMap], + ["shooters", createHashMap], + ["targets", createHashMap] + ]]; + true + }], + ["registerTaskEntity", compileFinal { + params [["_registryKey", "", [""]], ["_taskID", "", [""]], ["_entity", objNull, [objNull]]]; + + if (_registryKey isEqualTo "" || { _taskID isEqualTo "" } || { isNull _entity }) exitWith { false }; + + private _taskEntityRegistries = _self getOrDefault ["taskEntityRegistries", createHashMap]; + private _registry = +(_taskEntityRegistries getOrDefault [_registryKey, createHashMap]); + private _entities = +(_registry getOrDefault [_taskID, []]); + _entities pushBackUnique _entity; + _registry set [_taskID, _entities]; + _taskEntityRegistries set [_registryKey, _registry]; + _self set ["taskEntityRegistries", _taskEntityRegistries]; + + true + }], + ["getTaskEntities", compileFinal { + params [["_registryKey", "", [""]], ["_taskID", "", [""]]]; + + if (_registryKey isEqualTo "" || { _taskID isEqualTo "" }) exitWith { [] }; + + private _taskEntityRegistries = _self getOrDefault ["taskEntityRegistries", createHashMap]; + private _registry = _taskEntityRegistries getOrDefault [_registryKey, createHashMap]; + + +(_registry getOrDefault [_taskID, []]) + }], + ["findTaskEntityOwner", compileFinal { + params [["_registryKey", "", [""]], ["_entity", objNull, [objNull]]]; + + if (_registryKey isEqualTo "" || { isNull _entity }) exitWith { "" }; + + private _taskEntityRegistries = _self getOrDefault ["taskEntityRegistries", createHashMap]; + private _registry = _taskEntityRegistries getOrDefault [_registryKey, createHashMap]; + private _resolvedTaskID = ""; + + { + private _taskID = _x; + private _entities = _y; + + if (_entity in _entities) exitWith { _resolvedTaskID = _taskID; }; + + private _matchingEntity = _entities select { + !isNull _x + && { (typeOf _x) isEqualTo (typeOf _entity) } + && { _x distance _entity < 1 } + }; + + if (_matchingEntity isNotEqualTo []) exitWith { _resolvedTaskID = _taskID; }; + } forEach _registry; + + _resolvedTaskID + }], + ["clearTaskEntities", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _taskEntityRegistries = _self getOrDefault ["taskEntityRegistries", createHashMap]; + + { + private _registry = +_y; + _registry deleteAt _taskID; + _taskEntityRegistries set [_x, _registry]; + } forEach _taskEntityRegistries; + + _self set ["taskEntityRegistries", _taskEntityRegistries]; + true + }] +]]; + +GVAR(TaskEntityRegistry) diff --git a/arma/server/addons/task/functions/objects/fnc_TaskInstanceBaseClass.sqf b/arma/server/addons/task/functions/objects/fnc_TaskInstanceBaseClass.sqf new file mode 100644 index 0000000..305b565 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskInstanceBaseClass.sqf @@ -0,0 +1,194 @@ +#include "..\script_component.hpp" + +/* + * Object-style base class for object-based task instances. + * + * Example: + * call compile preprocessFileLineNumbers + * "\forge\forge_server\addons\task\objects\TaskInstanceBaseClass.sqf"; + * + * private _task = createHashMapObject [ + * GVAR(TaskInstanceBaseClass), + * [ + * "task_review_001", + * "custom", + * createHashMap, + * createHashMapFromArray [ + * ["funds", 50000], + * ["ratingSuccess", 25] + * ] + * ] + * ]; + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskInstanceBaseClass) = createHashMapFromArray [ + ["#type", "TaskInstanceBaseClass"], + ["initializeBaseState", compileFinal { + params [ + ["_taskID", "", [""]], + ["_taskType", "custom", [""]], + ["_entities", createHashMap, [createHashMap]], + ["_taskParams", createHashMap, [createHashMap]] + ]; + + _self set ["taskID", _taskID]; + _self set ["taskType", _taskType]; + _self set ["entities", _entities]; + _self set ["taskParams", _taskParams]; + _self set ["status", "created"]; + _self set ["startedAt", -1]; + _self set ["finishedAt", -1]; + _self set ["failureReason", ""]; + _self set ["resultSnapshot", createHashMap]; + _self set ["rewardData", createHashMapFromArray [ + ["funds", _taskParams getOrDefault ["funds", 0]], + ["ratingFail", _taskParams getOrDefault ["ratingFail", 0]], + ["ratingSuccess", _taskParams getOrDefault ["ratingSuccess", 0]], + ["equipment", _taskParams getOrDefault ["equipment", []]], + ["supplies", _taskParams getOrDefault ["supplies", []]], + ["weapons", _taskParams getOrDefault ["weapons", []]], + ["vehicles", _taskParams getOrDefault ["vehicles", []]], + ["special", _taskParams getOrDefault ["special", []]] + ]]; + true + }], + ["#create", compileFinal { + private _taskID = ""; + private _taskType = "custom"; + private _entities = createHashMap; + private _taskParams = createHashMap; + + if (_this isEqualType [] && { count _this > 0 }) then { + _taskID = _this param [0, "", [""]]; + + if ((count _this > 1) && { (_this select 1) isEqualType "" }) then { + _taskType = _this param [1, "custom", [""]]; + _entities = _this param [2, createHashMap, [createHashMap]]; + _taskParams = _this param [3, createHashMap, [createHashMap]]; + } else { + _entities = _this param [1, createHashMap, [createHashMap]]; + _taskParams = _this param [2, createHashMap, [createHashMap]]; + }; + }; + + _self call ["initializeBaseState", [_taskID, _taskType, _entities, _taskParams]]; + }], + ["getTaskID", compileFinal { + _self getOrDefault ["taskID", ""] + }], + ["getTaskType", compileFinal { + _self getOrDefault ["taskType", ""] + }], + ["getStatus", compileFinal { + _self getOrDefault ["status", "created"] + }], + ["getRewardData", compileFinal { + _self getOrDefault ["rewardData", createHashMap] + }], + ["getRegistryKey", compileFinal { + _self getOrDefault ["taskID", ""] + }], + ["registerInstance", compileFinal { + private _registryKey = _self call ["getRegistryKey", []]; + if (_registryKey isEqualTo "") exitWith { false }; + + private _registry = missionNamespace getVariable [QGVAR(ObjectTaskInstances), createHashMap]; + _registry set [_registryKey, _self]; + missionNamespace setVariable [QGVAR(ObjectTaskInstances), _registry]; + missionNamespace setVariable [_registryKey, _self]; + true + }], + ["unregisterInstance", compileFinal { + private _registryKey = _self call ["getRegistryKey", []]; + if (_registryKey isEqualTo "") exitWith { false }; + + private _registry = missionNamespace getVariable [QGVAR(ObjectTaskInstances), createHashMap]; + _registry deleteAt _registryKey; + missionNamespace setVariable [_registryKey, nil]; + true + }], + ["buildLifecycleEventPayload", compileFinal { + private _taskID = _self getOrDefault ["taskID", ""]; + private _taskType = _self getOrDefault ["taskType", "custom"]; + private _status = _self getOrDefault ["status", "created"]; + private _startedAt = _self getOrDefault ["startedAt", -1]; + private _finishedAt = _self getOrDefault ["finishedAt", -1]; + private _participantUids = []; + + if ( + _taskID isNotEqualTo "" + && { _self getOrDefault ["useTaskStore", false] } + && { !(isNil QGVAR(TaskStore)) } + ) then { + _participantUids = GVAR(TaskStore) call ["getTaskParticipantUids", [_taskID]]; + }; + + private _payload = createHashMapFromArray [ + ["taskID", _taskID], + ["taskType", _taskType], + ["status", _status], + ["startedAt", _startedAt], + ["finishedAt", _finishedAt], + ["duration", if (_startedAt >= 0 && { _finishedAt >= 0 }) then { _finishedAt - _startedAt } else { -1 }], + ["failureReason", _self getOrDefault ["failureReason", ""]], + ["participants", _participantUids], + ["rewardData", +(_self getOrDefault ["rewardData", createHashMap])], + ["resultSnapshot", +(_self getOrDefault ["resultSnapshot", createHashMap])] + ]; + + _payload + }], + ["emitLifecycleEvent", compileFinal { + params [["_eventName", "", [""]]]; + + if (_eventName isEqualTo "") exitWith { createHashMap }; + if (isNil QEGVAR(common,EventBus)) exitWith { createHashMap }; + + EGVAR(common,EventBus) call ["emit", [ + _eventName, + _self call ["buildLifecycleEventPayload", []], + createHashMapFromArray [["source", "task"]] + ]] + }], + ["markActive", compileFinal { + _self set ["status", "active"]; + _self set ["startedAt", serverTime]; + if !(_self getOrDefault ["useTaskStore", false]) then { + _self call ["emitLifecycleEvent", ["task.started"]]; + }; + true + }], + ["markSucceeded", compileFinal { + params [["_resultSnapshot", createHashMap, [createHashMap]]]; + + _self set ["status", "succeeded"]; + _self set ["finishedAt", serverTime]; + _self set ["resultSnapshot", _resultSnapshot]; + if !(_self getOrDefault ["useTaskStore", false]) then { + _self call ["emitLifecycleEvent", ["task.completed"]]; + }; + true + }], + ["markFailed", compileFinal { + params [["_reason", "", [""]], ["_resultSnapshot", createHashMap, [createHashMap]]]; + + _self set ["status", "failed"]; + _self set ["finishedAt", serverTime]; + _self set ["failureReason", _reason]; + _self set ["resultSnapshot", _resultSnapshot]; + if !(_self getOrDefault ["useTaskStore", false]) then { + _self call ["emitLifecycleEvent", ["task.failed"]]; + }; + true + }], + ["cleanup", compileFinal { + _self call ["unregisterInstance", []] + }], + ["tick", compileFinal { + createHashMap + }], + ["runLoop", compileFinal { + false + }] +]; diff --git a/arma/server/addons/task/functions/objects/fnc_TaskLifecycleReporter.sqf b/arma/server/addons/task/functions/objects/fnc_TaskLifecycleReporter.sqf new file mode 100644 index 0000000..e11a795 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskLifecycleReporter.sqf @@ -0,0 +1,128 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Task lifecycle timestamp tracking and event reporting. + * + * Owns task lifecycle timestamps and emits task lifecycle events through the + * common event bus. TaskStore remains the public facade. + * + * Arguments: + * None + * + * Return Value: + * Task lifecycle reporter object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskLifecycleReporter) = createHashMapObject [[ + ["#type", "TaskLifecycleReporter"], + ["#create", compileFinal { + _self call ["resetRuntimeState", []]; + }], + ["resetRuntimeState", compileFinal { + _self set ["taskLifecycleRegistry", createHashMap]; + true + }], + ["recordTaskCreated", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _lifecycleRegistry = _self getOrDefault ["taskLifecycleRegistry", createHashMap]; + private _lifecycle = +(_lifecycleRegistry getOrDefault [_taskID, createHashMap]); + _lifecycle set ["createdAt", serverTime]; + _lifecycleRegistry set [_taskID, _lifecycle]; + _self set ["taskLifecycleRegistry", _lifecycleRegistry]; + true + }], + ["recordTaskStatus", compileFinal { + params [["_taskID", "", [""]], ["_status", "", [""]]]; + + if (_taskID isEqualTo "" || { _status isEqualTo "" }) exitWith { "" }; + + private _normalizedStatus = toLowerANSI _status; + private _lifecycleRegistry = _self getOrDefault ["taskLifecycleRegistry", createHashMap]; + private _lifecycle = +(_lifecycleRegistry getOrDefault [_taskID, createHashMap]); + private _eventName = ""; + + switch (_normalizedStatus) do { + case "active": { + _lifecycle set ["startedAt", serverTime]; + _eventName = "task.started"; + }; + case "succeeded": { + _lifecycle set ["finishedAt", serverTime]; + _eventName = "task.completed"; + }; + case "failed": { + _lifecycle set ["finishedAt", serverTime]; + _eventName = "task.failed"; + }; + }; + + _lifecycleRegistry set [_taskID, _lifecycle]; + _self set ["taskLifecycleRegistry", _lifecycleRegistry]; + + _eventName + }], + ["clearTaskLifecycle", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _lifecycleRegistry = _self getOrDefault ["taskLifecycleRegistry", createHashMap]; + _lifecycleRegistry deleteAt _taskID; + _self set ["taskLifecycleRegistry", _lifecycleRegistry]; + true + }], + ["buildTaskLifecycleEventPayload", compileFinal { + params [["_taskID", "", [""]], ["_status", "", [""]], ["_extra", createHashMap]]; + + if !(_extra isEqualType createHashMap) then { + _extra = createHashMap; + }; + + private _catalogEntry = GVAR(TaskCatalogStore) call ["getTaskCatalogEntry", [_taskID]]; + private _lifecycleRegistry = _self getOrDefault ["taskLifecycleRegistry", createHashMap]; + private _lifecycle = +(_lifecycleRegistry getOrDefault [_taskID, createHashMap]); + private _startedAt = _lifecycle getOrDefault ["startedAt", -1]; + private _finishedAt = _lifecycle getOrDefault ["finishedAt", -1]; + + createHashMapFromArray [ + ["taskID", _taskID], + ["taskType", _catalogEntry getOrDefault ["type", ""]], + ["title", _catalogEntry getOrDefault ["title", _taskID]], + ["description", _catalogEntry getOrDefault ["description", ""]], + ["position", +(_catalogEntry getOrDefault ["position", []])], + ["status", _status], + ["source", _catalogEntry getOrDefault ["source", "task"]], + ["requesterUid", _catalogEntry getOrDefault ["requesterUid", ""]], + ["orgID", _catalogEntry getOrDefault ["orgID", "default"]], + ["startedAt", _startedAt], + ["finishedAt", _finishedAt], + ["duration", if (_startedAt >= 0 && { _finishedAt >= 0 }) then { _finishedAt - _startedAt } else { -1 }], + ["failureReason", _extra getOrDefault ["failureReason", ""]], + ["participants", GVAR(TaskParticipantTracker) call ["getTaskParticipantUids", [_taskID]]], + ["rewardData", +(_extra getOrDefault ["rewardData", createHashMap])], + ["resultSnapshot", +(_extra getOrDefault ["resultSnapshot", createHashMap])], + ["catalogEntry", +_catalogEntry] + ] + }], + ["emitTaskLifecycleEvent", compileFinal { + params [["_eventName", "", [""]], ["_taskID", "", [""]], ["_status", "", [""]], ["_extra", createHashMap]]; + + if (_eventName isEqualTo "" || { _taskID isEqualTo "" }) exitWith { createHashMap }; + if (isNil QEGVAR(common,EventBus)) exitWith { createHashMap }; + + EGVAR(common,EventBus) call ["emit", [ + _eventName, + _self call ["buildTaskLifecycleEventPayload", [_taskID, _status, _extra]], + createHashMapFromArray [["source", "task"]] + ]] + }] +]]; + +GVAR(TaskLifecycleReporter) diff --git a/arma/server/addons/task/functions/objects/fnc_TaskParticipantTracker.sqf b/arma/server/addons/task/functions/objects/fnc_TaskParticipantTracker.sqf new file mode 100644 index 0000000..e149596 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskParticipantTracker.sqf @@ -0,0 +1,155 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Runtime participant tracking and task notification fanout. + * + * TaskStore remains the public facade, while this object owns participant + * snapshots keyed by task ID. + * + * Arguments: + * None + * + * Return Value: + * Task participant tracker object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskParticipantTracker) = createHashMapObject [[ + ["#type", "TaskParticipantTracker"], + ["#create", compileFinal { + _self call ["resetRuntimeState", []]; + }], + ["resetRuntimeState", compileFinal { + _self set ["participantRegistry", createHashMap]; + true + }], + ["trackParticipants", compileFinal { + params [["_taskID", "", [""]], ["_entities", [], [[]]], ["_marker", "", [""]], ["_radius", 300, [0]]]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + private _participantRegistry = _self getOrDefault ["participantRegistry", createHashMap]; + private _participantSnapshots = +(_participantRegistry getOrDefault [_taskID, createHashMap]); + private _activePlayers = allPlayers select { + alive _x + && { side group _x isEqualTo west } + }; + + if (_marker isNotEqualTo "" && { markerShape _marker in ["RECTANGLE", "ELLIPSE"] }) then { + { + private _uid = getPlayerUID _x; + if (_uid isNotEqualTo "" && { _x inArea _marker }) then { + if !(_uid in _participantSnapshots) then { + _participantSnapshots set [_uid, createHashMapFromArray [ + ["startRating", rating _x] + ]]; + }; + }; + } forEach _activePlayers; + }; + + if (_radius > 0 && { _entities isNotEqualTo [] }) then { + { + private _entity = _x; + if (isNull _entity) then { continue; }; + + { + private _uid = getPlayerUID _x; + if (_uid isNotEqualTo "" && { (_x distance2D _entity) <= _radius }) then { + if !(_uid in _participantSnapshots) then { + _participantSnapshots set [_uid, createHashMapFromArray [ + ["startRating", rating _x] + ]]; + }; + }; + } forEach _activePlayers; + } forEach _entities; + }; + + _participantRegistry set [_taskID, _participantSnapshots]; + _self set ["participantRegistry", _participantRegistry]; + + _participantSnapshots + }], + ["recordParticipant", compileFinal { + params [["_taskID", "", [""]], ["_uid", "", [""]], ["_snapshot", createHashMap, [createHashMap]]]; + + if (_taskID isEqualTo "" || { _uid isEqualTo "" }) exitWith { createHashMap }; + + private _participantRegistry = _self getOrDefault ["participantRegistry", createHashMap]; + private _participantSnapshots = +(_participantRegistry getOrDefault [_taskID, createHashMap]); + _participantSnapshots set [_uid, +_snapshot]; + _participantRegistry set [_taskID, _participantSnapshots]; + _self set ["participantRegistry", _participantRegistry]; + + _participantSnapshots + }], + ["getTaskParticipants", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { createHashMap }; + + private _participantRegistry = _self getOrDefault ["participantRegistry", createHashMap]; + +(_participantRegistry getOrDefault [_taskID, createHashMap]) + }], + ["getTaskParticipantUids", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { [] }; + + keys (_self call ["getTaskParticipants", [_taskID]]) + }], + ["clearTaskParticipants", compileFinal { + params [["_taskID", "", [""]]]; + + if (_taskID isEqualTo "") exitWith { false }; + + private _participantRegistry = _self getOrDefault ["participantRegistry", createHashMap]; + _participantRegistry deleteAt _taskID; + _self set ["participantRegistry", _participantRegistry]; + true + }], + ["notifyParticipants", compileFinal { + params [ + ["_taskID", "", [""]], + ["_type", "info", [""]], + ["_title", "Tasks", [""]], + ["_message", "", [""]] + ]; + + if (_taskID isEqualTo "" || { _message isEqualTo "" }) exitWith { false }; + + private _participantSnapshots = _self call ["getTaskParticipants", [_taskID]]; + if (_participantSnapshots isEqualTo createHashMap) exitWith { false }; + + private _participantUids = keys _participantSnapshots; + if (_participantUids isEqualTo []) exitWith { false }; + if (isNil QEGVAR(common,EventBus)) exitWith { + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(notifications,recieveNotification), [_type, _title, _message], _player] call CFUNC(targetEvent); + } forEach _participantUids; + true + }; + + EGVAR(common,EventBus) call ["emit", [ + "task.notification.requested", + createHashMapFromArray [ + ["taskID", _taskID], + ["notificationType", _type], + ["title", _title], + ["message", _message], + ["participantUids", _participantUids] + ], + createHashMapFromArray [["source", "task"]] + ]]; + + true + }] +]]; + +GVAR(TaskParticipantTracker) diff --git a/arma/server/addons/task/functions/objects/fnc_TaskRewardService.sqf b/arma/server/addons/task/functions/objects/fnc_TaskRewardService.sqf new file mode 100644 index 0000000..aaf6bf1 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskRewardService.sqf @@ -0,0 +1,276 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Task reward and rating outcome service. + * + * Resolves task ownership reward context and applies player earnings plus + * organization reputation outcomes. TaskStore remains the public facade. + * + * Arguments: + * None + * + * Return Value: + * Task reward service object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskRewardService) = createHashMapObject [[ + ["#type", "TaskRewardService"], + ["resolveRewardContext", compileFinal { + params [["_taskID", "", [""]]]; + + private _result = createHashMapFromArray [ + ["requesterUid", ""], + ["orgID", ""], + ["memberUids", []] + ]; + + if (_taskID isEqualTo "") exitWith { _result }; + + private _rewardState = GVAR(TaskStateGateway) call ["callTaskState", ["task:ownership:reward_context", [_taskID], createHashMap]]; + if (_rewardState isEqualTo createHashMap) exitWith { _result }; + + private _requesterUid = _rewardState getOrDefault ["requesterUid", ""]; + private _resolvedOrgID = _rewardState getOrDefault ["orgId", ""]; + if (_resolvedOrgID isEqualTo "") exitWith { _result }; + + private _org = EGVAR(org,OrgStore) call ["loadById", [_resolvedOrgID]]; + private _memberUids = []; + if (_org isNotEqualTo createHashMap) then { + private _members = _org getOrDefault ["members", createHashMap]; + + if (_members isEqualType createHashMap) then { _memberUids = keys _members; }; + if (_requesterUid isNotEqualTo "" && { !(_requesterUid in _memberUids) }) then { _memberUids pushBack _requesterUid; }; + }; + + _result set ["requesterUid", _requesterUid]; + _result set ["orgID", _resolvedOrgID]; + _result set ["memberUids", _memberUids]; + _result + }], + ["applyRatingOutcome", compileFinal { + params [["_taskID", "", [""]], ["_delta", 0, [0]]]; + + private _emitRatingEvent = { + params [["_eventName", "", [""]], ["_payload", createHashMap, [createHashMap]]]; + + if (_eventName isEqualTo "" || { isNil QEGVAR(common,EventBus) }) exitWith { createHashMap }; + + private _eventPayload = +_payload; + _eventPayload set ["taskID", _taskID]; + _eventPayload set ["ratingDelta", _delta]; + + EGVAR(common,EventBus) call ["emit", [ + _eventName, + _eventPayload, + createHashMapFromArray [["source", "task"]] + ]] + }; + + private _result = createHashMapFromArray [ + ["participantUids", []], + ["orgIds", []], + ["contributions", createHashMap], + ["success", true], + ["mutationFailures", []], + ["persistenceFailures", []], + ["message", ""] + ]; + + if (_taskID isEqualTo "" || { _delta isEqualTo 0 }) exitWith { _result }; + + private _participantSnapshots = GVAR(TaskParticipantTracker) call ["getTaskParticipants", [_taskID]]; + if (_participantSnapshots isEqualTo createHashMap) exitWith { _result }; + + private _rewardContext = _self call ["resolveRewardContext", [_taskID]]; + private _participantUids = keys _participantSnapshots; + if (_participantUids isEqualTo [] && { _delta > 0 }) then { + private _requesterUid = _rewardContext getOrDefault ["requesterUid", ""]; + if (_requesterUid isNotEqualTo "") then { + private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer); + if (!isNull _requesterPlayer) then { + _participantUids pushBack _requesterUid; + _participantSnapshots = GVAR(TaskParticipantTracker) call ["recordParticipant", [_taskID, _requesterUid, createHashMapFromArray [ + ["startRating", rating _requesterPlayer] + ]]]; + ["WARNING", format ["Task %1 had no tracked participants at payout time; falling back to requester %2 for personal earnings.", _taskID, _requesterUid]] call EFUNC(common,log); + }; + }; + }; + if (_participantUids isEqualTo []) exitWith { + _result set ["success", false]; + _result set ["message", "No task participants were available for rating outcome."]; + ["task.rating.failed", createHashMapFromArray [ + ["participantUids", []], + ["orgIds", []], + ["contributions", createHashMap], + ["mutationFailures", []], + ["persistenceFailures", []], + ["message", _result get "message"] + ]] call _emitRatingEvent; + _result + }; + + private _orgIds = []; + private _contributions = createHashMap; + private _totalContribution = 0; + private _mutationFailures = []; + private _persistenceFailures = []; + + if (_delta > 0) then { + { + private _uid = _x; + private _player = [_uid] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + + _contributions set [_uid, 1]; + _totalContribution = _totalContribution + 1; + } forEach _participantUids; + }; + + if (_totalContribution <= 0) exitWith { + _result set ["success", false]; + _result set ["message", "No eligible participant contribution was available for rating outcome."]; + ["task.rating.failed", createHashMapFromArray [ + ["participantUids", +_participantUids], + ["orgIds", +_orgIds], + ["contributions", +_contributions], + ["mutationFailures", []], + ["persistenceFailures", []], + ["message", _result get "message"] + ]] call _emitRatingEvent; + GVAR(TaskStore) call ["clearTask", [_taskID]]; + _result + }; + + { + private _uid = _x; + private _orgID = EGVAR(actor,ActorStore) call ["getOrganization", [_uid, ""]]; + if (_orgID isNotEqualTo "") then { _orgIds pushBackUnique _orgID; }; + if (_delta > 0) then { + private _contribution = _contributions getOrDefault [_uid, 0]; + if (_contribution <= 0) then { continue; }; + + private _account = EGVAR(bank,BankStore) call ["get", [_uid, ""]]; + if (_account isEqualTo createHashMap) then { _account = EGVAR(bank,BankStore) call ["init", [_uid]]; }; + if (_account isNotEqualTo createHashMap) then { + private _earnings = _account getOrDefault ["earnings", 0]; + private _earningsDelta = round ((_delta * _contribution) / _totalContribution); + if (_earningsDelta <= 0) then { continue; }; + + private _patch = EGVAR(bank,BankStore) call [ + "mset", + [ + _uid, + createHashMapFromArray [["earnings", (_earnings + _earningsDelta)]], + false + ] + ]; + + if !(_patch isEqualType createHashMap) then { continue; }; + if (_patch isEqualTo createHashMap) then { continue; }; + if (isNil QEGVAR(common,EventBus)) then { + EGVAR(bank,BankMessenger) call ["sendAccountSync", [_uid, _patch]]; + } else { + EGVAR(common,EventBus) call ["emit", [ + "bank.account.sync.requested", + createHashMapFromArray [ + ["uid", _uid], + ["account", +_patch] + ], + createHashMapFromArray [["source", "task"]] + ]]; + }; + + if ((EGVAR(bank,BankStore) call ["save", [_uid]]) isEqualTo createHashMap) then { + _persistenceFailures pushBackUnique format ["bank:%1", _uid]; + ["ERROR", format ["Task %1 updated bank earnings for %2, but durable save failed.", _taskID, _uid]] call EFUNC(common,log); + }; + }; + }; + } forEach _participantUids; + + private _ownerOrgID = _rewardContext getOrDefault ["orgID", ""]; + if (_ownerOrgID isNotEqualTo "") then { + private _org = EGVAR(org,OrgStore) call ["loadById", [_ownerOrgID]]; + + if (_org isNotEqualTo createHashMap) then { + private _reputation = _org getOrDefault ["reputation", 0]; + private _nextReputation = round (_reputation + _delta); + _org set ["reputation", _nextReputation]; + private _updatedOrg = EGVAR(org,OrgStore) call [ + "callHotOrg", + [ + "org:hot:override", + [_ownerOrgID, toJSON _org] + ] + ]; + + if (_updatedOrg isNotEqualTo createHashMap) then { + private _patch = createHashMapFromArray [["reputation", _nextReputation]]; + private _memberUids = _rewardContext getOrDefault ["memberUids", []]; + if (isNil QEGVAR(common,EventBus)) then { + { + private _player = [_x] call EFUNC(common,getPlayer); + if (isNull _player) then { continue; }; + [CRPC(org,responseSyncOrg), [_patch], _player] call CFUNC(targetEvent); + } forEach _memberUids; + } else { + EGVAR(common,EventBus) call ["emit", [ + "org.sync.requested", + createHashMapFromArray [ + ["orgID", _ownerOrgID], + ["memberUids", +_memberUids], + ["patch", +_patch] + ], + createHashMapFromArray [["source", "task"]] + ]]; + }; + + _orgIds = [_ownerOrgID]; + if ((EGVAR(org,OrgStore) call ["saveById", [_ownerOrgID]]) isEqualTo createHashMap) then { + _persistenceFailures pushBackUnique format ["organization:%1", _ownerOrgID]; + ["ERROR", format ["Task %1 updated reputation for organization %2, but durable save failed.", _taskID, _ownerOrgID]] call EFUNC(common,log); + }; + } else { + ["ERROR", format ["Failed to update organization %1 reputation for task %2.", _ownerOrgID, _taskID]] call EFUNC(common,log); + _mutationFailures pushBackUnique format ["organization:%1", _ownerOrgID]; + }; + }; + }; + + _result set ["participantUids", _participantUids]; + _result set ["orgIds", _orgIds]; + _result set ["contributions", _contributions]; + _result set ["success", (_mutationFailures isEqualTo []) && { _persistenceFailures isEqualTo [] }]; + _result set ["mutationFailures", _mutationFailures]; + _result set ["persistenceFailures", _persistenceFailures]; + if (_mutationFailures isNotEqualTo [] || { _persistenceFailures isNotEqualTo [] }) then { + private _messageParts = []; + if (_mutationFailures isNotEqualTo []) then { + _messageParts pushBack format ["mutation failures: %1", _mutationFailures joinString ", "]; + }; + if (_persistenceFailures isNotEqualTo []) then { + _messageParts pushBack format ["persistence failures: %1", _persistenceFailures joinString ", "]; + }; + _result set ["message", _messageParts joinString "; "]; + }; + + private _eventName = ["task.rating.failed", "task.rating.applied"] select (_result getOrDefault ["success", false]); + [_eventName, createHashMapFromArray [ + ["participantUids", +(_result getOrDefault ["participantUids", []])], + ["orgIds", +(_result getOrDefault ["orgIds", []])], + ["contributions", +(_result getOrDefault ["contributions", createHashMap])], + ["mutationFailures", +(_result getOrDefault ["mutationFailures", []])], + ["persistenceFailures", +(_result getOrDefault ["persistenceFailures", []])], + ["message", _result getOrDefault ["message", ""]] + ]] call _emitRatingEvent; + + _result + }] +]]; + +GVAR(TaskRewardService) diff --git a/arma/server/addons/task/functions/objects/fnc_TaskStateGateway.sqf b/arma/server/addons/task/functions/objects/fnc_TaskStateGateway.sqf new file mode 100644 index 0000000..f76c273 --- /dev/null +++ b/arma/server/addons/task/functions/objects/fnc_TaskStateGateway.sqf @@ -0,0 +1,77 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Gateway for task hot-state extension calls. + * + * TaskStore owns gameplay/runtime behavior. This gateway owns the transport + * boundary to the extension-backed task state service. + * + * Arguments: + * None + * + * Return Value: + * Task state gateway object + * + * Public: No + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(TaskStateGateway) = createHashMapObject [[ + ["#type", "TaskStateGateway"], + ["reset", compileFinal { + ["task:reset", []] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if ( + !_isSuccess + || { !(_result isEqualType "") } + || { (_result find "Error:") == 0 } + ) exitWith { + ["WARNING", "Failed to reset task backend state during task store initialization."] call EFUNC(common,log); + false + }; + + ["INFO", "Task backend state reset for mission lifecycle."] call EFUNC(common,log); + true + }], + ["callTaskStateEnvelope", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]]]; + + private _envelope = createHashMapFromArray [ + ["success", false], + ["error", ""] + ]; + + if (_function isEqualTo "") exitWith { _envelope }; + + [_function, _arguments] call EFUNC(extension,extCall) params ["_result", "_isSuccess"]; + if !_isSuccess exitWith { + _envelope set ["error", format ["Task backend call '%1' failed.", _function]]; + _envelope + }; + if !(_result isEqualType "") exitWith { + _envelope set ["error", format ["Task backend call '%1' returned an invalid response.", _function]]; + _envelope + }; + if ((_result find "Error:") == 0) exitWith { + ["ERROR", format ["Task extension call '%1' failed: %2", _function, _result]] call EFUNC(common,log); + _envelope set ["error", _result select [7]]; + _envelope + }; + + _envelope set ["success", true]; + if (_result isNotEqualTo "") then { _envelope set ["data", fromJSON _result]; }; + + _envelope + }], + ["callTaskState", compileFinal { + params [["_function", "", [""]], ["_arguments", [], [[]]], ["_fallback", nil]]; + + private _envelope = _self call ["callTaskStateEnvelope", [_function, _arguments]]; + if !(_envelope getOrDefault ["success", false]) exitWith { _fallback }; + if (isNil { _envelope get "data" }) exitWith { _fallback }; + + _envelope get "data" + }] +]]; + +GVAR(TaskStateGateway) diff --git a/arma/server/addons/task/functions/script_component.hpp b/arma/server/addons/task/functions/script_component.hpp new file mode 100644 index 0000000..fcf9da9 --- /dev/null +++ b/arma/server/addons/task/functions/script_component.hpp @@ -0,0 +1 @@ +#include "..\script_component.hpp" diff --git a/arma/server/addons/task/initSettings.inc.sqf b/arma/server/addons/task/initSettings.inc.sqf new file mode 100644 index 0000000..b86599c --- /dev/null +++ b/arma/server/addons/task/initSettings.inc.sqf @@ -0,0 +1,11 @@ +[ + QGVAR(enableGenerator), "CHECKBOX", + [LSTRING(enableGenerator), LSTRING(enableGeneratorTooltip)], + _category, false, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableEventLogs), "CHECKBOX", + [LSTRING(enableEventLogs), LSTRING(enableEventLogsTooltip)], + _category, false, true +] call CBA_fnc_addSetting; diff --git a/arma/server/addons/task/script_component.hpp b/arma/server/addons/task/script_component.hpp new file mode 100644 index 0000000..31b5f85 --- /dev/null +++ b/arma/server/addons/task/script_component.hpp @@ -0,0 +1,49 @@ +#define COMPONENT task +#define COMPONENT_BEAUTIFIED Task +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" + +#define REWARD_ARRAY_ATTRIBUTES(PREFIX) \ + class EquipmentRewards: Edit { \ + property = QUOTE(DOUBLES(PREFIX,EquipmentRewards)); \ + displayName = "Equipment Rewards"; \ + tooltip = "Comma-separated equipment class names, e.g. ItemGPS, ItemCompass. Legacy SQF arrays still work."; \ + typeName = "STRING"; \ + }; \ + class SupplyRewards: Edit { \ + property = QUOTE(DOUBLES(PREFIX,SupplyRewards)); \ + displayName = "Supply Rewards"; \ + tooltip = "Comma-separated supply class names, e.g. FirstAidKit, Medikit. Legacy SQF arrays still work."; \ + typeName = "STRING"; \ + }; \ + class WeaponRewards: Edit { \ + property = QUOTE(DOUBLES(PREFIX,WeaponRewards)); \ + displayName = "Weapon Rewards"; \ + tooltip = "Comma-separated weapon class names, e.g. arifle_MX_F, arifle_Katiba_F. Legacy SQF arrays still work."; \ + typeName = "STRING"; \ + }; \ + class VehicleRewards: Edit { \ + property = QUOTE(DOUBLES(PREFIX,VehicleRewards)); \ + displayName = "Vehicle Rewards"; \ + tooltip = "Comma-separated vehicle class names, e.g. B_MRAP_01_F, B_Quadbike_01_F. Legacy SQF arrays still work."; \ + typeName = "STRING"; \ + }; \ + class SpecialRewards: Edit { \ + property = QUOTE(DOUBLES(PREFIX,SpecialRewards)); \ + displayName = "Special Rewards"; \ + tooltip = "Comma-separated special reward class names, e.g. B_UAV_01_F, B_Heli_Light_01_F. Legacy SQF arrays still work."; \ + typeName = "STRING"; \ + }; + +#define TASK_CHAIN_ATTRIBUTES(PREFIX) \ + class PrerequisiteTaskIds: Edit { \ + property = QUOTE(DOUBLES(PREFIX,PrerequisiteTaskIds)); \ + displayName = "Prerequisite Task IDs"; \ + tooltip = "Comma-separated task IDs that must succeed before this task appears in CAD or can be assigned"; \ + typeName = "STRING"; \ + }; diff --git a/arma/server/addons/task/stringtable.xml b/arma/server/addons/task/stringtable.xml new file mode 100644 index 0000000..43df877 --- /dev/null +++ b/arma/server/addons/task/stringtable.xml @@ -0,0 +1,20 @@ + + + + + Task + + + Enable Event Logs + + + Log task event bus lifecycle, reward, rating, and notification events for debugging. + + + Enable Generator + + + Enable Task Generator + + + diff --git a/arma/server/config.example.toml b/arma/server/config.example.toml new file mode 100644 index 0000000..67d1947 --- /dev/null +++ b/arma/server/config.example.toml @@ -0,0 +1,12 @@ +# Forge Server Configuration +# Copy this file to config.toml and place it beside forge_server_x64.dll. +# Start SurrealDB before launching the Arma server, and keep these values +# aligned with the running database. + +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 diff --git a/arma/server/docs/README.md b/arma/server/docs/README.md new file mode 100644 index 0000000..d2cac9f --- /dev/null +++ b/arma/server/docs/README.md @@ -0,0 +1,49 @@ +# Forge Server Extension + +Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB. + +## Architecture + +SQF modules call `forge_server` through `fnc_extCall`. Small requests use the +direct `callExtension` path, while large payloads are staged through the +transport layer. + +```text +SQF module + -> extension bridge + -> domain command + -> service layer + -> repository + -> SurrealDB +``` + +## Configuration + +Copy `config.example.toml` to `config.toml` next to the extension DLL before +launching a Forge-enabled server. SurrealDB must also be running before the +server starts, and the values in `config.toml` must match that database. + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +Players and mission designers do not need this file unless they are hosting +locally. Server owners and developers do. + +For install links and Forge-specific setup steps, see +[SurrealDB Setup](../../../docs/surrealdb-setup.md). + +## References + +- [API Reference](./api-reference.md) +- [Usage Examples](./usage-examples.md) +- [ICOM Usage Guide](../../../docs/ICOM_USAGE_GUIDE.md) +- [Framework Module Guides](../../../docs/README.md) diff --git a/arma/server/docs/api-reference.md b/arma/server/docs/api-reference.md new file mode 100644 index 0000000..4d3b515 --- /dev/null +++ b/arma/server/docs/api-reference.md @@ -0,0 +1,51 @@ +# Forge Server API Reference + +The Forge server extension exposes domain-oriented commands through +`callExtension`. Persistent data is stored through the configured SurrealDB +connection and schema modules. + +## Core Commands + +```sqf +"forge_server" callExtension ["version", []]; +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +`status` and `surreal:status` return `initializing`, `connected`, or `failed`. + +## Domain Commands + +Game systems should call the domain APIs instead of raw database operations: + +- `actor:*` +- `bank:*` +- `garage:*` +- `locker:*` +- `org:*` +- `phone:*` +- `store:*` +- `task:*` +- `cad:*` +- `icom:*` +- `owned:garage:*` +- `owned:locker:*` +- `transport:*` + +Large request and response payloads are routed through the transport layer when +needed by `forge_server_addons_extension_fnc_extCall`. + +## Module Guides + +- [Actor](../../../docs/ACTOR_USAGE_GUIDE.md) +- [Bank](../../../docs/BANK_USAGE_GUIDE.md) +- [CAD](../../../docs/CAD_USAGE_GUIDE.md) +- [Economy](../../../docs/ECONOMY_USAGE_GUIDE.md) +- [Garage](../../../docs/GARAGE_USAGE_GUIDE.md) +- [Locker](../../../docs/LOCKER_USAGE_GUIDE.md) +- [Organization](../../../docs/ORG_USAGE_GUIDE.md) +- [Owned Storage](../../../docs/OWNED_STORAGE_USAGE_GUIDE.md) +- [Phone](../../../docs/PHONE_USAGE_GUIDE.md) +- [Store](../../../docs/STORE_USAGE_GUIDE.md) +- [Task](../../../docs/TASK_USAGE_GUIDE.md) +- [ICOM](../../../docs/ICOM_USAGE_GUIDE.md) diff --git a/arma/server/docs/usage-examples.md b/arma/server/docs/usage-examples.md new file mode 100644 index 0000000..c766ea2 --- /dev/null +++ b/arma/server/docs/usage-examples.md @@ -0,0 +1,47 @@ +# Forge Server Usage Examples + +These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB. + +## Status Check + +```sqf +["status", []] call forge_server_extension_fnc_extCall params ["_status", "_ok"]; +if (_ok && {_status isEqualTo "connected"}) then { + systemChat "Forge persistence is online."; +}; +``` + +## Actor Fetch + +```sqf +private _uid = getPlayerUID player; +["actor:get", [_uid]] call forge_server_extension_fnc_extCall params ["_payload", "_ok"]; +if (_ok) then { + private _actor = fromJSON _payload; + systemChat format ["Loaded actor %1", _actor getOrDefault ["uid", _uid]]; +}; +``` + +## Store Checkout + +```sqf +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [ + createHashMapFromArray [ + ["classname", "FirstAidKit"], + ["category", "item"], + ["priceValue", 50], + ["quantity", 2] + ] + ]], + ["vehicles", []] +]; + +["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall; +``` diff --git a/arma/server/extension/Cargo.toml b/arma/server/extension/Cargo.toml new file mode 100644 index 0000000..41bb122 --- /dev/null +++ b/arma/server/extension/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "forge-server" +version = "0.1.0" +edition = "2024" + +[lib] +name = "forge_server_x64" +crate-type = ["cdylib"] + +[dependencies] +arma-rs = { workspace = true } +base64 = "0.22.1" +chrono = { workspace = true } +forge-icom = { path = "../../../bin/icom" } +forge-models = { path = "../../../lib/models", features = ["actor"] } +forge-repositories = { path = "../../../lib/repositories" } +forge-services = { path = "../../../lib/services" } +forge-shared = { path = "../../../lib/shared" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +surrealdb = { version = "3", default-features = false, features = ["protocol-http", "rustls"] } +tokio = { workspace = true } +toml = "1.1.2" +uuid = { workspace = true } diff --git a/arma/server/extension/README.md b/arma/server/extension/README.md new file mode 100644 index 0000000..9eeda21 --- /dev/null +++ b/arma/server/extension/README.md @@ -0,0 +1,56 @@ +# Forge Server Extension + +The Forge server extension is the Rust backend for server-side game systems. +It exposes domain commands through `arma-rs`, runs a shared Tokio runtime, and +persists durable state through SurrealDB. + +This extension build targets SurrealDB `3.x`. + +## Launch Prerequisites + +Before starting the Arma server with Forge enabled: + +1. Start SurrealDB. +2. Copy `config.example.toml` to `config.toml` beside `forge_server_x64.dll`. +3. Match the `config.toml` endpoint, namespace, database, username, and password + to the running SurrealDB instance. + +The extension reads configuration during startup. If SurrealDB is offline or +the config values do not match, persistence-backed commands are not ready for +normal gameplay. + +## Responsibilities + +- Register extension command groups for actor, bank, garage, locker, org, + phone, store, task, CAD, terrain, and transport systems. +- Load extension configuration from `@forge_server/config.toml`. +- Connect to SurrealDB and apply schema modules on startup. +- Keep SQF-facing command handlers thin while service crates own domain rules. + +## Configuration + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +## Status + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +Status values are `initializing`, `connected`, or `failed`. + +## Build + +```powershell +cargo test -p forge-server +cargo build -p forge-server +``` diff --git a/arma/server/extension/config.example.toml b/arma/server/extension/config.example.toml new file mode 100644 index 0000000..346efe3 --- /dev/null +++ b/arma/server/extension/config.example.toml @@ -0,0 +1,16 @@ +# Forge Server Configuration +# Copy this file to config.toml and place it beside forge_server_x64.dll. +# Start SurrealDB before launching the Arma server, and keep these values +# aligned with the running database. + +[surreal] +# SurrealDB HTTP endpoint. Use "127.0.0.1:8000" for a local server. +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" + +# Optional authentication. +username = "root" +password = "root" + +connect_timeout_ms = 5000 diff --git a/arma/server/extension/src/actor.rs b/arma/server/extension/src/actor.rs new file mode 100644 index 0000000..59672d0 --- /dev/null +++ b/arma/server/extension/src/actor.rs @@ -0,0 +1,413 @@ +//! Actor management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for player data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::{CallContext, Group}; +use forge_repositories::InMemoryActorHotRepository; +use forge_services::{ActorHotStateService, ActorService}; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::ActorStorageRepository; + +/// Global actor service instance. +/// +/// Lazily initialized singleton combining repository and service layers. +static ACTOR_SERVICE: LazyLock> = + LazyLock::new(|| ActorService::new(ActorStorageRepository::configured())); +static HOT_ACTOR_SERVICE: LazyLock< + ActorHotStateService, +> = LazyLock::new(|| { + let repository = ActorStorageRepository::configured(); + let hot_repository = InMemoryActorHotRepository::new(); + ActorHotStateService::new(repository, hot_repository) +}); + +#[allow(dead_code)] +pub(crate) fn hot_service() +-> &'static ActorHotStateService { + &HOT_ACTOR_SERVICE +} + +/// Creates the Arma 3 command group for actor operations. +/// +/// Registers commands: `get`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_actor) + .command("create", create_actor) + .command("update", update_actor) + .command("exists", actor_exists) + .command("delete", delete_actor) + .group( + "hot", + Group::new() + .command("init", init_hot_actor) + .command("get", get_hot_actor) + .command("keys", list_hot_actor_keys) + .command("override", override_hot_actor) + .command("save", save_hot_actor) + .command("remove", remove_hot_actor), + ) +} + +fn serialize_hot_actor(actor: forge_models::Actor) -> String { + match serde_json::to_string(&actor) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot actor: {}", error), + } +} + +pub(crate) fn init_hot_actor(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_ACTOR_SERVICE.init_actor(resolved_uid) { + Ok(actor) => serialize_hot_actor(actor), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_actor(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_ACTOR_SERVICE.get_actor(resolved_uid) { + Ok(actor) => serialize_hot_actor(actor), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn list_hot_actor_keys() -> String { + match HOT_ACTOR_SERVICE.list_actor_keys() { + Ok(keys) => match serde_json::to_string(&keys) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize actor hot-state keys: {}", error), + }, + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn override_hot_actor( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_ACTOR_SERVICE.override_actor(resolved_uid, json_data) { + Ok(actor) => serialize_hot_actor(actor), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_actor(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_ACTOR_SERVICE.get_actor(resolved_uid.clone()) { + Ok(actor) => { + enqueue_persistence_task("actor", move || { + HOT_ACTOR_SERVICE.save_actor(resolved_uid).map(|_| ()) + }); + serialize_hot_actor(actor) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_actor(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_ACTOR_SERVICE.remove_actor(resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +/// Retrieves an actor by key/UID. +/// +/// Resolves the key to a Steam UID and returns the actor as JSON. +/// Returns an error message if resolution fails or retrieval fails. +pub fn get_actor(call_context: CallContext, key: String) -> String { + log("actor", "DEBUG", &format!("Getting actor for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("actor", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.get_actor(resolved_uid.clone()) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully retrieved actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to get actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Creates a new actor with the provided JSON data. +/// +/// Resolves key to UID, validates JSON data, and persists the new actor. +pub fn create_actor(call_context: CallContext, key: String, json_data: String) -> String { + log( + "actor", + "DEBUG", + &format!("Creating actor for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for creation: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.create_actor(resolved_uid.clone(), json_data) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully created actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to create actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates an existing actor with JSON data. +/// +/// Resolves key to UID, applies partial updates from JSON, and persists changes. +pub fn update_actor(call_context: CallContext, key: String, json_update: String) -> String { + log( + "actor", + "DEBUG", + &format!("Updating actor for key: {} with data: {}", key, json_update), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for update: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.update_actor(resolved_uid.clone(), json_update) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully updated actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized updated actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to update actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if an actor exists in the database. +/// +/// Returns "true" if the actor exists, "false" otherwise. +pub fn actor_exists(call_context: CallContext, key: String) -> String { + log( + "actor", + "DEBUG", + &format!("Checking if actor exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for existence check: {}", uid), + ); + uid + } + None => { + log( + "actor", + "WARN", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match ACTOR_SERVICE.actor_exists(resolved_uid.clone()) { + Ok(exists) => { + log( + "actor", + "DEBUG", + &format!("Actor '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + log( + "actor", + "ERROR", + &format!("Failed to check if actor '{}' exists: {}", resolved_uid, e), + ); + "false".to_string() + } + } +} + +/// Permanently deletes an actor. +/// +/// Resolves key to UID and removes the actor and associated data. +pub fn delete_actor(call_context: CallContext, key: String) -> String { + log( + "actor", + "DEBUG", + &format!("Deleting actor for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for deletion: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.delete_actor(resolved_uid.clone()) { + Ok(_) => { + log( + "actor", + "INFO", + &format!("Successfully deleted actor: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to delete actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} diff --git a/arma/server/extension/src/bank.rs b/arma/server/extension/src/bank.rs new file mode 100644 index 0000000..48b9b16 --- /dev/null +++ b/arma/server/extension/src/bank.rs @@ -0,0 +1,634 @@ +//! Bank management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for player data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::{CallContext, Group}; +use forge_models::{ + BankCheckoutContext, BankMutationResult, BankOperationContext, BankPinContext, + BankTransferContext, BankTransferResult, +}; +use forge_repositories::InMemoryBankHotRepository; +use forge_services::{BankHotStateService, BankService}; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::BankStorageRepository; + +/// Global bank service instance. +/// +/// Lazily initialized singleton combining repository and service layers. +static BANK_SERVICE: LazyLock> = + LazyLock::new(|| BankService::new(BankStorageRepository::configured())); +static HOT_BANK_SERVICE: LazyLock< + BankHotStateService, +> = LazyLock::new(|| { + let repository = BankStorageRepository::configured(); + let hot_repository = InMemoryBankHotRepository::new(); + BankHotStateService::new(repository, hot_repository) +}); + +pub(crate) fn hot_service() +-> &'static BankHotStateService { + &HOT_BANK_SERVICE +} + +/// Creates the Arma 3 command group for bank operations. +/// +/// Registers commands: `get`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_bank) + .command("create", create_bank) + .command("update", update_bank) + .command("exists", bank_exists) + .command("delete", delete_bank) + .group( + "hot", + Group::new() + .command("init", init_hot_bank) + .command("get", get_hot_bank) + .command("override", override_hot_bank) + .command("patch", patch_hot_bank) + .command("charge_checkout", charge_checkout_hot_bank) + .command("deposit", deposit_hot_bank) + .command("withdraw", withdraw_hot_bank) + .command("deposit_earnings", deposit_earnings_hot_bank) + .command("transfer", transfer_hot_bank) + .command("validate_pin", validate_pin_hot_bank) + .command("change_pin", change_pin_hot_bank) + .command("save", save_hot_bank) + .command("remove", remove_hot_bank), + ) +} + +fn serialize_hot_bank(bank: forge_models::Bank) -> String { + match serde_json::to_string(&bank) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot bank: {}", error), + } +} + +fn serialize_hot_bank_mutation(result: BankMutationResult) -> String { + match serde_json::to_string(&result) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot bank mutation: {}", error), + } +} + +fn serialize_hot_bank_transfer(result: BankTransferResult) -> String { + match serde_json::to_string(&result) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot bank transfer: {}", error), + } +} + +fn parse_amount(amount: String, label: &str) -> Result { + amount + .parse::() + .map_err(|error| format!("Invalid {} amount '{}': {}", label, amount, error)) +} + +fn parse_operation_context(json_context: String) -> Result { + serde_json::from_str(&json_context) + .map_err(|error| format!("Invalid bank operation context: {}", error)) +} + +fn parse_transfer_context(json_context: String) -> Result { + serde_json::from_str(&json_context) + .map_err(|error| format!("Invalid bank transfer context: {}", error)) +} + +fn parse_checkout_context(json_context: String) -> Result { + serde_json::from_str(&json_context) + .map_err(|error| format!("Invalid bank checkout context: {}", error)) +} + +fn parse_pin_context(json_context: String) -> Result { + serde_json::from_str(&json_context) + .map_err(|error| format!("Invalid bank PIN context: {}", error)) +} + +pub(crate) fn init_hot_bank(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.init_bank(resolved_uid) { + Ok(bank) => serialize_hot_bank(bank), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_bank(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.get_bank(resolved_uid) { + Ok(bank) => serialize_hot_bank(bank), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn override_hot_bank( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.override_bank(resolved_uid.clone(), json_data) { + Ok(bank) => serialize_hot_bank(bank), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn patch_hot_bank(call_context: CallContext, key: String, json_patch: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.patch_bank(resolved_uid, json_patch) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn charge_checkout_hot_bank( + call_context: CallContext, + key: String, + amount: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let amount = match parse_amount(amount, "checkout") { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + let context = match parse_checkout_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.charge_checkout(resolved_uid, amount, context) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn deposit_hot_bank( + call_context: CallContext, + key: String, + amount: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let amount = match parse_amount(amount, "deposit") { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + let context = match parse_operation_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.deposit(resolved_uid, amount, context) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn withdraw_hot_bank( + call_context: CallContext, + key: String, + amount: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let amount = match parse_amount(amount, "withdraw") { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + let context = match parse_operation_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.withdraw(resolved_uid, amount, context) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn deposit_earnings_hot_bank( + call_context: CallContext, + key: String, + amount: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let amount = match parse_amount(amount, "deposit earnings") { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + let context = match parse_operation_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.deposit_earnings(resolved_uid, amount, context) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn transfer_hot_bank( + call_context: CallContext, + source_key: String, + target_key: String, + amount: String, + json_context: String, +) -> String { + let resolved_source_uid = match resolve_uid(&source_key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", source_key), + }; + let resolved_target_uid = match resolve_uid(&target_key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", target_key), + }; + let amount = match parse_amount(amount, "transfer") { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + let context = match parse_transfer_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.transfer(resolved_source_uid, resolved_target_uid, context, amount) { + Ok(result) => serialize_hot_bank_transfer(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn validate_pin_hot_bank( + call_context: CallContext, + key: String, + pin: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + let context = match parse_pin_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.validate_pin(resolved_uid, pin, context) { + Ok(_) => "{}".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn change_pin_hot_bank( + call_context: CallContext, + key: String, + current_pin: String, + new_pin: String, + json_context: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + let context = match parse_pin_context(json_context) { + Ok(value) => value, + Err(error) => return format!("Error: {}", error), + }; + + match HOT_BANK_SERVICE.change_pin(resolved_uid, current_pin, new_pin, context) { + Ok(result) => serialize_hot_bank_mutation(result), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_bank(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.get_bank(resolved_uid.clone()) { + Ok(bank) => { + enqueue_persistence_task("bank", move || { + HOT_BANK_SERVICE.save_bank(resolved_uid).map(|_| ()) + }); + serialize_hot_bank(bank) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_bank(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_BANK_SERVICE.remove_bank(resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +/// Retrieves an bank by key/UID. +/// +/// Resolves the key to a Steam UID and returns the bank as JSON. +/// Returns an error message if resolution fails or retrieval fails. +pub fn get_bank(call_context: CallContext, key: String) -> String { + log("bank", "DEBUG", &format!("Getting bank for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("bank", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.get_bank(resolved_uid.clone()) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully retrieved bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to get bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Creates a new bank with the provided JSON data. +/// +/// Resolves key to UID, validates JSON data, and persists the new bank. +pub fn create_bank(call_context: CallContext, key: String, json_data: String) -> String { + log( + "bank", + "DEBUG", + &format!("Creating bank for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for creation: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.create(resolved_uid.clone(), json_data) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully created bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to create bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates an existing bank with JSON data. +/// +/// Resolves key to UID, applies partial updates from JSON, and persists changes. +pub fn update_bank(call_context: CallContext, key: String, json_update: String) -> String { + log( + "bank", + "DEBUG", + &format!("Updating bank for key: {} with data: {}", key, json_update), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for update: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.update_bank(resolved_uid.clone(), json_update) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully updated bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized updated bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to update bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if an bank exists in the database. +/// +/// Returns "true" if the bank exists, "false" otherwise. +/// Backend failures are returned as errors so callers do not confuse a failed +/// lookup with a missing account and create duplicate/default records. +pub fn bank_exists(call_context: CallContext, key: String) -> String { + log( + "bank", + "DEBUG", + &format!("Checking if bank exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("bank", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.bank_exists(resolved_uid.clone()) { + Ok(exists) => { + log( + "bank", + "DEBUG", + &format!("Bank '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to check if bank '{}' exists: {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Permanently deletes an bank. +/// +/// Resolves key to UID and removes the bank and associated data. +pub fn delete_bank(call_context: CallContext, key: String) -> String { + log("bank", "DEBUG", &format!("Deleting bank for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for deletion: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.delete_bank(resolved_uid.clone()) { + Ok(_) => { + log( + "bank", + "INFO", + &format!("Successfully deleted bank: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to delete bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} diff --git a/arma/server/extension/src/cad.rs b/arma/server/extension/src/cad.rs new file mode 100644 index 0000000..d6c4223 --- /dev/null +++ b/arma/server/extension/src/cad.rs @@ -0,0 +1,187 @@ +//! CAD hot-state operations for the Arma 3 server extension. +//! +//! The extension owns the in-memory CAD state store, while the shared service +//! layer handles mutation rules and hydrate shaping. This keeps the extension +//! surface thin and aligned with the workspace architecture. +//! +//! CAD state is intentionally transient operational state. It follows the +//! active server or mission lifecycle and is not treated as durable player or +//! organization persistence. + +use arma_rs::Group; +use forge_repositories::InMemoryCadRepository; +use forge_services::CadStateService; +use serde::Serialize; +use std::sync::LazyLock; + +static CAD_SERVICE: LazyLock> = + LazyLock::new(|| CadStateService::new(InMemoryCadRepository::new())); + +pub fn group() -> Group { + Group::new() + .group( + "activity", + Group::new() + .command("append", append_activity) + .command("recent", recent_activity), + ) + .group( + "assignments", + Group::new() + .command("list", list_assignments) + .command("assign", assign_assignment) + .command("acknowledge", acknowledge_assignment) + .command("decline", decline_assignment) + .command("upsert", upsert_assignment) + .command("delete", delete_assignment), + ) + .group( + "orders", + Group::new() + .command("list", list_orders) + .command("create", create_order) + .command("create_from_context", create_order_from_context) + .command("close", close_order) + .command("upsert", upsert_order) + .command("delete", delete_order), + ) + .group( + "requests", + Group::new() + .command("list", list_requests) + .command("submit", submit_request) + .command("submit_from_context", submit_request_from_context) + .command("close", close_request) + .command("upsert", upsert_request) + .command("delete", delete_request), + ) + .group( + "profiles", + Group::new() + .command("list", list_profiles) + .command("update_from_context", update_profile_from_context) + .command("upsert", upsert_profile) + .command("delete", delete_profile), + ) + .group("groups", Group::new().command("build", build_groups)) + .group("view", Group::new().command("hydrate", hydrate_view)) +} + +pub(crate) fn append_activity(json_data: String) -> String { + serialize_ok(CAD_SERVICE.append_activity(json_data)) +} + +pub(crate) fn recent_activity(limit: String) -> String { + serialize_json(CAD_SERVICE.recent_activity(limit)) +} + +pub(crate) fn list_assignments() -> String { + serialize_json(CAD_SERVICE.list_assignments()) +} + +pub(crate) fn assign_assignment(entry_id: String, json_data: String) -> String { + serialize_json(CAD_SERVICE.assign_assignment(entry_id, json_data)) +} + +pub(crate) fn acknowledge_assignment(entry_id: String, json_data: String) -> String { + serialize_json(CAD_SERVICE.acknowledge_assignment(entry_id, json_data)) +} + +pub(crate) fn decline_assignment(entry_id: String, json_data: String) -> String { + serialize_json(CAD_SERVICE.decline_assignment(entry_id, json_data)) +} + +pub(crate) fn upsert_assignment(entry_id: String, json_data: String) -> String { + serialize_ok(CAD_SERVICE.upsert_assignment(entry_id, json_data)) +} + +pub(crate) fn delete_assignment(entry_id: String) -> String { + serialize_ok(CAD_SERVICE.delete_assignment(entry_id)) +} + +pub(crate) fn list_orders() -> String { + serialize_json(CAD_SERVICE.list_orders()) +} + +pub(crate) fn create_order(json_data: String) -> String { + serialize_json(CAD_SERVICE.create_order(json_data)) +} + +pub(crate) fn create_order_from_context(json_data: String) -> String { + serialize_json(CAD_SERVICE.create_order_from_context(json_data)) +} + +pub(crate) fn close_order(entry_id: String) -> String { + serialize_json(CAD_SERVICE.close_order(entry_id)) +} + +pub(crate) fn upsert_order(entry_id: String, json_data: String) -> String { + serialize_ok(CAD_SERVICE.upsert_order(entry_id, json_data)) +} + +pub(crate) fn delete_order(entry_id: String) -> String { + serialize_ok(CAD_SERVICE.delete_order(entry_id)) +} + +pub(crate) fn list_requests() -> String { + serialize_json(CAD_SERVICE.list_requests()) +} + +pub(crate) fn submit_request(json_data: String) -> String { + serialize_json(CAD_SERVICE.submit_request(json_data)) +} + +pub(crate) fn submit_request_from_context(json_data: String) -> String { + serialize_json(CAD_SERVICE.submit_request_from_context(json_data)) +} + +pub(crate) fn close_request(entry_id: String) -> String { + serialize_json(CAD_SERVICE.close_request(entry_id)) +} + +pub(crate) fn upsert_request(entry_id: String, json_data: String) -> String { + serialize_ok(CAD_SERVICE.upsert_request(entry_id, json_data)) +} + +pub(crate) fn delete_request(entry_id: String) -> String { + serialize_ok(CAD_SERVICE.delete_request(entry_id)) +} + +pub(crate) fn list_profiles() -> String { + serialize_json(CAD_SERVICE.list_profiles()) +} + +pub(crate) fn update_profile_from_context(json_data: String) -> String { + serialize_json(CAD_SERVICE.update_profile_from_context(json_data)) +} + +pub(crate) fn upsert_profile(entry_id: String, json_data: String) -> String { + serialize_ok(CAD_SERVICE.upsert_profile(entry_id, json_data)) +} + +pub(crate) fn delete_profile(entry_id: String) -> String { + serialize_ok(CAD_SERVICE.delete_profile(entry_id)) +} + +pub(crate) fn build_groups(json_data: String) -> String { + serialize_json(CAD_SERVICE.build_groups(json_data)) +} + +pub(crate) fn hydrate_view(json_data: String) -> String { + serialize_json(CAD_SERVICE.build_hydrate_payload(json_data)) +} + +fn serialize_ok(result: Result<(), String>) -> String { + match result { + Ok(()) => "OK".to_string(), + Err(error) => format!("Error: {error}"), + } +} + +fn serialize_json(result: Result) -> String { + match result { + Ok(value) => serde_json::to_string(&value) + .unwrap_or_else(|error| format!("Error: Failed to serialize CAD state: {error}")), + Err(error) => format!("Error: {error}"), + } +} diff --git a/arma/server/extension/src/config.rs b/arma/server/extension/src/config.rs new file mode 100644 index 0000000..7ffc835 --- /dev/null +++ b/arma/server/extension/src/config.rs @@ -0,0 +1,79 @@ +//! Extension configuration for SurrealDB-backed persistence. + +use serde::Deserialize; +use std::fs; +use std::path::PathBuf; +use std::sync::OnceLock; + +use crate::log::log; + +static CONFIG_CACHE: OnceLock = OnceLock::new(); + +#[derive(Debug, Clone, Deserialize, Default)] +pub struct Config { + #[serde(default)] + pub surreal: SurrealConfig, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct SurrealConfig { + pub endpoint: String, + pub namespace: String, + pub database: String, + pub username: Option, + pub password: Option, + pub connect_timeout_ms: Option, +} + +impl Default for SurrealConfig { + fn default() -> Self { + Self { + endpoint: "127.0.0.1:8000".to_string(), + namespace: "forge".to_string(), + database: "main".to_string(), + username: Some("root".to_string()), + password: Some("root".to_string()), + connect_timeout_ms: Some(5000), + } + } +} + +pub fn load() -> Config { + CONFIG_CACHE + .get_or_init(|| { + let config_path = std::env::current_exe() + .ok() + .and_then(|exe| { + exe.parent() + .map(|dir| dir.join("@forge_server").join("config.toml")) + }) + .filter(|path| path.exists()) + .unwrap_or_else(|| PathBuf::from("@forge_server/config.toml")); + + match fs::read_to_string(&config_path) { + Ok(contents) => { + log("main", "INFO", "Config file found. Loading."); + match toml::from_str::(&contents) { + Ok(config) => config, + Err(error) => { + log( + "main", + "ERROR", + &format!( + "Failed to parse config file '{}': {}. Using defaults.", + config_path.display(), + error + ), + ); + Config::default() + } + } + } + Err(_) => { + log("main", "INFO", "Config file not found. Using defaults."); + Config::default() + } + } + }) + .clone() +} diff --git a/arma/server/extension/src/garage.rs b/arma/server/extension/src/garage.rs new file mode 100644 index 0000000..50f1b38 --- /dev/null +++ b/arma/server/extension/src/garage.rs @@ -0,0 +1,721 @@ +//! Garage management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for vehicle storage, retrieval, and updates. + +use arma_rs::{CallContext, Group}; +use forge_models::Vehicle; +use forge_repositories::InMemoryGarageHotRepository; +use forge_services::{GarageHotStateService, GarageService}; +use std::collections::HashMap; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::GarageStorageRepository; + +/// Global garage service instance. +static GARAGE_SERVICE: LazyLock> = + LazyLock::new(|| GarageService::new(GarageStorageRepository::configured())); +static HOT_GARAGE_SERVICE: LazyLock< + GarageHotStateService, +> = LazyLock::new(|| { + let repository = GarageStorageRepository::configured(); + let hot_repository = InMemoryGarageHotRepository::new(); + GarageHotStateService::new(repository, hot_repository) +}); + +#[allow(dead_code)] +pub(crate) fn hot_service() +-> &'static GarageHotStateService { + &HOT_GARAGE_SERVICE +} + +/// Creates the Arma 3 command group for garage operations. +/// +/// Registers commands: `create`, `get`, `add`, `update`, `remove`, `delete`, `exists`. +pub fn group() -> Group { + Group::new() + .command("create", create_garage) + .command("get", get_garage) + .command("add", add_vehicle) + .command("update", update_garage) + .command("patch", patch_vehicle) + .command("remove", remove_vehicle) + .command("delete", delete_garage) + .command("exists", garage_exists) + .group( + "hot", + Group::new() + .command("init", init_hot_garage) + .command("get", get_hot_garage) + .command("override", override_hot_garage) + .command("save", save_hot_garage) + .command("remove", remove_hot_garage) + .command("add", add_hot_vehicle) + .command("remove_vehicle", remove_hot_vehicle), + ) +} + +fn serialize_hot_vehicles(garage: forge_models::garage::Garage) -> String { + match serde_json::to_string(&garage.vehicles) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot garage: {}", error), + } +} + +pub(crate) fn init_hot_garage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_GARAGE_SERVICE.init_garage(resolved_uid) { + Ok(garage) => serialize_hot_vehicles(garage), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_garage(call_context: CallContext, key: String) -> String { + init_hot_garage(call_context, key) +} + +pub(crate) fn override_hot_garage( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let vehicles: HashMap = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid JSON data: {}", error), + }; + + match HOT_GARAGE_SERVICE.override_garage(resolved_uid, vehicles) { + Ok(garage) => serialize_hot_vehicles(garage), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_garage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_GARAGE_SERVICE.get_garage(resolved_uid.clone()) { + Ok(garage) => { + enqueue_persistence_task("garage", move || { + HOT_GARAGE_SERVICE.save_garage(resolved_uid).map(|_| ()) + }); + serialize_hot_vehicles(garage) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_garage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_GARAGE_SERVICE.remove_garage(resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn add_hot_vehicle(call_context: CallContext, key: String, json_data: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(error) => return format!("Error: Invalid JSON data: {}", error), + }; + + let classname = match data.get("classname").and_then(|v| v.as_str()) { + Some(c) => c.to_string(), + None => return "Error: Missing or invalid classname".to_string(), + }; + let fuel = match data.get("fuel").and_then(|v| v.as_f64()) { + Some(f) => f, + None => return "Error: Missing or invalid fuel".to_string(), + }; + let damage = match data.get("damage").and_then(|v| v.as_f64()) { + Some(d) => d, + None => return "Error: Missing or invalid damage".to_string(), + }; + let hit_points_json = match data.get("hit_points") { + Some(hp) => match serde_json::to_string(hp) { + Ok(s) => s, + Err(error) => return format!("Error: Failed to serialize hit_points: {}", error), + }, + None => return "Error: Missing hit_points".to_string(), + }; + + match HOT_GARAGE_SERVICE.add_vehicle( + resolved_uid.clone(), + classname, + fuel, + damage, + hit_points_json, + ) { + Ok(garage) => { + enqueue_persistence_task("garage", move || { + HOT_GARAGE_SERVICE.save_garage(resolved_uid).map(|_| ()) + }); + serialize_hot_vehicles(garage) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_vehicle( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(error) => return format!("Error: Invalid JSON data: {}", error), + }; + + let plate = match data.get("plate").and_then(|v| v.as_str()) { + Some(p) => p.to_string(), + None => return "Error: Missing or invalid plate".to_string(), + }; + + match HOT_GARAGE_SERVICE.remove_vehicle(resolved_uid.clone(), plate) { + Ok(garage) => { + enqueue_persistence_task("garage", move || { + HOT_GARAGE_SERVICE.save_garage(resolved_uid).map(|_| ()) + }); + serialize_hot_vehicles(garage) + } + Err(error) => format!("Error: {}", error), + } +} + +/// Creates a new empty garage for a player. +/// +/// Parameters: key +pub fn create_garage(call_context: CallContext, key: String) -> String { + log( + "garage", + "DEBUG", + &format!("Creating garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.create_garage(resolved_uid.clone()) { + Ok(empty_garage) => { + log( + "garage", + "INFO", + &format!("Successfully created garage for: {}", resolved_uid), + ); + match serde_json::to_string(&empty_garage.vehicles) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to create garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a player's garage by key/UID. +/// +/// Returns JSON object with garage data including all vehicles. +pub fn get_garage(call_context: CallContext, key: String) -> String { + log( + "garage", + "DEBUG", + &format!("Getting garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.get_garage(resolved_uid.clone()) { + Ok(garage) => { + log( + "garage", + "INFO", + &format!( + "Successfully retrieved garage with {} vehicles", + garage.vehicles.len() + ), + ); + match serde_json::to_string(&garage.vehicles) { + Ok(json) => { + log( + "garage", + "DEBUG", + &format!("Serialized garage to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to get garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Adds a new vehicle to a player's garage. +/// +/// Parameters: key, json_data +pub fn add_vehicle(call_context: CallContext, key: String, json_data: String) -> String { + log( + "garage", + "DEBUG", + &format!("Adding vehicle for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse JSON data + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Extract fields + let classname = match data.get("classname").and_then(|v| v.as_str()) { + Some(c) => c.to_string(), + None => { + let error_msg = "Error: Missing or invalid classname".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let fuel = match data.get("fuel").and_then(|v| v.as_f64()) { + Some(f) => f, + None => { + let error_msg = "Error: Missing or invalid fuel".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let damage = match data.get("damage").and_then(|v| v.as_f64()) { + Some(d) => d, + None => { + let error_msg = "Error: Missing or invalid damage".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let hit_points_json = match data.get("hit_points") { + Some(hp) => match serde_json::to_string(hp) { + Ok(s) => s, + Err(e) => { + let error_msg = format!("Error: Failed to serialize hit_points: {}", e); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }, + None => { + let error_msg = "Error: Missing hit_points".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.add_vehicle( + resolved_uid.clone(), + classname, + fuel, + damage, + hit_points_json, + ) { + Ok(garage) => { + log( + "garage", + "INFO", + &format!("Successfully added vehicle to garage: {}", resolved_uid), + ); + match serde_json::to_string(&garage.vehicles) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to add vehicle '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates the entire garage state. +/// +/// Parameters: key, json_data (Map of vehicles) +pub fn update_garage(call_context: CallContext, key: String, json_data: String) -> String { + log( + "garage", + "DEBUG", + &format!("Updating garage for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse JSON data + let vehicles: HashMap = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.update_garage(resolved_uid.clone(), vehicles) { + Ok(garage) => { + log( + "garage", + "INFO", + &format!("Successfully updated garage for: {}", resolved_uid), + ); + match serde_json::to_string(&garage.vehicles) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to update garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Patches a specific vehicle in the garage. +/// +/// Parameters: key, json_data (Map with plate and optional fields) +pub fn patch_vehicle(call_context: CallContext, key: String, json_data: String) -> String { + log( + "garage", + "DEBUG", + &format!("Patching vehicle for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let plate = match data.get("plate").and_then(|v| v.as_str()) { + Some(s) => s.to_string(), + None => { + let error_msg = "Error: Missing plate".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + let fuel = data.get("fuel").and_then(|v| v.as_f64()); + let damage = data.get("damage").and_then(|v| v.as_f64()); + let hit_points_json = data + .get("hit_points") + .and_then(|v| serde_json::to_string(v).ok()); + + match GARAGE_SERVICE.patch_vehicle(resolved_uid.clone(), plate, damage, fuel, hit_points_json) { + Ok(garage) => { + log( + "garage", + "INFO", + &format!("Successfully patched vehicle for: {}", resolved_uid), + ); + match serde_json::to_string(&garage.vehicles) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to patch vehicle '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Removes a vehicle from the garage. +/// +/// Parameters: key, json_data +pub fn remove_vehicle(call_context: CallContext, key: String, json_data: String) -> String { + log( + "garage", + "DEBUG", + &format!( + "Removing vehicle from garage for key: {} with data: {}", + key, json_data + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse JSON data + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Extract plate + let plate = match data.get("plate").and_then(|v| v.as_str()) { + Some(p) => p.to_string(), + None => { + let error_msg = "Error: Missing or invalid plate".to_string(); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.remove_vehicle(resolved_uid.clone(), plate) { + Ok(garage) => { + log( + "garage", + "INFO", + &format!("Successfully removed vehicle from garage: {}", resolved_uid), + ); + match serde_json::to_string(&garage.vehicles) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to remove vehicle '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Permanently deletes a player's garage. +pub fn delete_garage(call_context: CallContext, key: String) -> String { + log( + "garage", + "DEBUG", + &format!("Deleting garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match GARAGE_SERVICE.delete_garage(resolved_uid.clone()) { + Ok(_) => { + log( + "garage", + "INFO", + &format!("Successfully deleted garage: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "garage", + "ERROR", + &format!("Failed to delete garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if a player has a garage. +pub fn garage_exists(call_context: CallContext, key: String) -> String { + log( + "garage", + "DEBUG", + &format!("Checking garage existence for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + log( + "garage", + "ERROR", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match GARAGE_SERVICE.garage_exists(resolved_uid.clone()) { + Ok(exists) => { + log( + "garage", + "DEBUG", + &format!("Garage '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + log( + "garage", + "ERROR", + &format!("Failed to check if garage '{}' exists: {}", resolved_uid, e), + ); + "false".to_string() + } + } +} diff --git a/arma/server/extension/src/helpers.rs b/arma/server/extension/src/helpers.rs new file mode 100644 index 0000000..dfd6b6d --- /dev/null +++ b/arma/server/extension/src/helpers.rs @@ -0,0 +1,12 @@ +use arma_rs::CallContext; + +pub fn resolve_uid(uid: &str, call_context: &CallContext) -> Option { + if !uid.is_empty() && uid != "_SP_PLAYER_" { + return Some(uid.to_string()); + } + + match call_context.caller() { + arma_rs::Caller::Steam(steam_id) => Some(steam_id.to_string()), + arma_rs::Caller::Unknown => None, + } +} diff --git a/arma/server/extension/src/icom.rs b/arma/server/extension/src/icom.rs new file mode 100644 index 0000000..43144a1 --- /dev/null +++ b/arma/server/extension/src/icom.rs @@ -0,0 +1,351 @@ +//! ICOM (Internal Communication) module for inter-server communication +//! +//! This module provides functionality for Arma 3 servers to communicate with each other +//! through a central ICOM hub server. It enables real-time event passing between multiple +//! game servers, allowing for synchronized gameplay experiences. +//! +//! # Architecture +//! +//! - **Extension Module**: This code runs inside the Arma 3 server extension +//! - **ICOM Client**: Connects to the central ICOM server on initialization +//! - **Event Listener**: Spawned task that continuously listens for incoming events +//! - **Event Forwarder**: Receives events and forwards them to Arma via callbacks +//! +//! # Event Flow +//! +//! 1. **Outgoing**: SQF → Extension command → ICOM client → ICOM server → Target server +//! 2. **Incoming**: ICOM server → Event listener → Forward helper → Arma callback → SQF +//! +//! # Usage from SQF +//! +//! ```sqf +//! // Send event to specific server +//! "forge_server" callExtension ["icom:send_event", ["server_2", "supply_drop", '{"coords":[1234,5678,0]}']] +//! +//! // Broadcast to all servers +//! "forge_server" callExtension ["icom:broadcast", ["global_alert", '{"message":"Event starting"}']] +//! +//! // Handle incoming events +//! ["forge_icom_event", { +//! params ["_eventName", "_data"]; +//! // Process event based on _eventName +//! }] call CBA_fnc_addEventHandler; +//! ``` + +use arma_rs::{Context, Group}; +use forge_icom::Message; +use forge_icom::client::IComClient; +use std::sync::OnceLock; + +use crate::{CONTEXT, RUNTIME, log}; + +/// Global ICOM client, created once and shared by all commands. +/// Initialized asynchronously after extension loads. +pub static ICOM_CLIENT: OnceLock = OnceLock::new(); + +/// Initialize ICOM client connection +/// +/// Establishes connection to the ICOM server and spawns a background listener task. +/// This function is called during extension startup (from `lib.rs`) or manually via +/// the `icom:connect` command. +/// +/// # Process +/// +/// 1. Stores Arma context globally for use in event forwarding callbacks +/// 2. Connects to ICOM server and registers with the provided server ID +/// 3. Spawns persistent listener task on the runtime's thread pool +/// 4. Listener automatically forwards incoming events to Arma via CBA +/// +/// # Arguments +/// +/// * `ctx` - Arma extension context for triggering CBA callbacks +/// * `address` - ICOM server address (e.g., "127.0.0.1:9090") +/// * `server_id` - Unique identifier for this server (e.g., "server_1") +/// +/// # Behavior +/// +/// - If connection fails, a warning is logged but the extension continues +/// - If already connected, logs an error and returns +/// - Listener runs indefinitely until connection is lost or extension unloads +pub async fn initialize(ctx: Context, address: String, server_id: String) { + // Store context in global CONTEXT + *CONTEXT.write().await = Some(ctx); + match IComClient::connect(&address, server_id).await { + Ok(client) => { + if ICOM_CLIENT.set(client).is_ok() { + log::log("icom", "INFO", "Connected to ICOM server"); + + // Spawn listener task + RUNTIME.spawn(async move { + if let Some(client) = ICOM_CLIENT.get() { + let result = client + .listen_for_events(|msg| { + if let Message::Event { + event_name, data, .. + } = msg + { + log::log( + "icom", + "INFO", + &format!("Received event '{}': {}", event_name, data), + ); + + // Forward event to Arma + forward(&event_name, &data); + } + Ok(()) + }) + .await; + + if let Err(e) = result { + log::log("icom", "ERROR", &format!("Event listener error: {}", e)); + } + } + }); + } else { + log::log("icom", "ERROR", "Failed to set ICOM client (already set)"); + } + } + Err(e) => { + log::log( + "icom", + "WARN", + &format!("Failed to connect to ICOM server: {}", e), + ); + } + } +} + +/// Create ICOM command group +/// +/// Builds the command group exposed to SQF under the `icom:` namespace. +/// +/// # Available Commands +/// +/// - `connect` - Connect to the ICOM server manually +/// - `send_event` - Send event to a specific server +/// - `broadcast` - Broadcast event to all connected servers +pub fn group() -> Group { + Group::new() + .command("connect", connect) + .command("broadcast", broadcast) + .command("send_event", send_event) +} + +/// Connect to ICOM server from SQF +/// +/// Initiates connection to the ICOM server with custom parameters. Useful for: +/// - Retrying after initial connection failure +/// - Connecting to non-default ICOM server address +/// - Setting server ID at runtime instead of compile-time +/// +/// The connection process runs asynchronously in the background. Check logs +/// for success/failure status. +/// +/// # Arguments +/// +/// * `ctx` - Arma extension context (automatically provided by arma-rs) +/// * `address` - ICOM server address (e.g., "127.0.0.1:9090") +/// * `server_id` - Unique server identifier (e.g., "server_1", "server_2") +/// +/// # Returns +/// +/// - `"Connection initiated"` - Background connection task started successfully +/// - `"ERROR: Already connected"` - Client is already connected (disconnect first) +/// +/// # SQF Usage +/// +/// ```sqf +/// private _result = "forge_server" callExtension ["icom:connect", ["127.0.0.1:9090", "server_1"]]; +/// systemChat _result; // "Connection initiated" +/// // Check @forge_server/logs/icom.log for connection status +/// ``` +fn connect(ctx: Context, address: String, server_id: String) -> String { + if ICOM_CLIENT.get().is_some() { + return "ERROR: Already connected".to_string(); + } + + RUNTIME.spawn(async move { + log::log( + "icom", + "INFO", + &format!("Connecting to {} as {}", address, server_id), + ); + + initialize(ctx, address, server_id).await; + }); + + "Connection initiated".to_string() +} + +/// Broadcast an event to all connected servers +/// +/// Sends an event to all servers currently connected to the ICOM hub, +/// except the sender itself. +/// +/// # Arguments +/// +/// * `event_name` - Name of the event (e.g., "global_alert", "server_restart") +/// * `data` - JSON string containing event data +/// +/// # Returns +/// +/// - `"OK"` if the broadcast was sent successfully +/// - `"ERROR: "` if broadcast failed +/// +/// # SQF Usage +/// +/// ```sqf +/// private _result = "forge_server" callExtension [ +/// "icom:broadcast", +/// ["global_alert", '{"message":"Server restart in 5 minutes","severity":"warning"}'] +/// ]; +/// ``` +fn broadcast(event_name: String, data: String) -> String { + let client = match ICOM_CLIENT.get() { + Some(c) => c, + None => { + log::log("icom", "ERROR", "ICOM client not connected"); + return "ERROR: Not connected to ICOM server".to_string(); + } + }; + + // Parse JSON data + let json_data: serde_json::Value = match serde_json::from_str(&data) { + Ok(d) => d, + Err(e) => { + log::log("icom", "ERROR", &format!("Invalid JSON data: {}", e)); + return format!("ERROR: Invalid JSON - {}", e); + } + }; + + log::log( + "icom", + "INFO", + &format!("Broadcasting event '{}'", event_name), + ); + + // Broadcast the event asynchronously + RUNTIME.spawn(async move { + if let Err(e) = client.broadcast(&event_name, json_data).await { + log::log("icom", "ERROR", &format!("Failed to send event: {}", e)); + } + }); + + "OK".to_string() +} + +/// Send an event to a specific server +/// +/// Sends a custom event with arbitrary JSON data to another server connected to ICOM. +/// +/// # Arguments +/// +/// * `target_server` - The server ID to send the event to (e.g., "server_2") +/// * `event_name` - Name of the event (e.g., "supply_drop", "spawn_mission") +/// * `data` - JSON string containing event data +/// +/// # Returns +/// +/// - `"OK"` if the event was sent successfully +/// - `"ERROR: "` if sending failed +/// +/// # SQF Usage +/// +/// ```sqf +/// private _result = "forge_server" callExtension [ +/// "icom:send_event", +/// ["server_2", "supply_drop", '{"coords":[1234,5678,0],"supplies":["ammo","medical"]}'] +/// ]; +/// ``` +fn send_event(target_server: String, event_name: String, data: String) -> String { + let client = match ICOM_CLIENT.get() { + Some(c) => c, + None => { + log::log("icom", "ERROR", "ICOM client not connected"); + return "ERROR: Not connected to ICOM server".to_string(); + } + }; + + // Parse JSON data + let json_data: serde_json::Value = match serde_json::from_str(&data) { + Ok(d) => d, + Err(e) => { + log::log("icom", "ERROR", &format!("Invalid JSON data: {}", e)); + return format!("ERROR: Invalid JSON - {}", e); + } + }; + + log::log( + "icom", + "INFO", + &format!("Sending event '{}' to '{}'", event_name, target_server), + ); + + // Send the event asynchronously + RUNTIME.spawn(async move { + if let Err(e) = client + .send_event(&target_server, &event_name, json_data) + .await + { + log::log("icom", "ERROR", &format!("Failed to send event: {}", e)); + } + }); + + "OK".to_string() +} + +/// Forward an ICOM event to Arma via callback +/// +/// Internal helper function that takes an event received from ICOM and forwards it +/// to Arma 3 via the callback mechanism. The event is sent to SQF as a JSON array: +/// `["event_name", {data}]` +/// +/// # Arguments +/// +/// * `event_name` - The name of the event +/// * `data` - The event data as a JSON value +/// +/// # Implementation Notes +/// +/// Uses `try_read()` instead of blocking to avoid deadlocks when called from within +/// an async task running on the same runtime that manages the context lock. +/// +/// The callback triggers the "forge_icom_event" CBA event in Arma, which should be +/// handled by mission code to process incoming inter-server events. +fn forward(event_name: &str, data: &serde_json::Value) { + // Use try_read to avoid blocking inside async context + let context_guard = match CONTEXT.try_read() { + Ok(guard) => guard, + Err(_) => { + log::log("icom", "WARN", "Could not acquire CONTEXT read lock"); + return; + } + }; + + if let Some(ctx) = context_guard.as_ref() { + // Format as JSON array: ["event_name", data] + let event_data = serde_json::json!([event_name, data]); + let event_json = + serde_json::to_string(&event_data).unwrap_or_else(|_| "[\"error\",null]".to_string()); + + match ctx.callback_data("icom", "forge_icom_event", Some(event_json)) { + Ok(_) => { + log::log( + "icom", + "INFO", + &format!("Forwarded event '{}' to Arma", event_name), + ); + } + Err(e) => { + log::log( + "icom", + "ERROR", + &format!("Failed to forward event to Arma: {}", e), + ); + } + } + } else { + log::log("icom", "WARN", "Context not available for callback"); + } +} diff --git a/arma/server/extension/src/lib.rs b/arma/server/extension/src/lib.rs new file mode 100644 index 0000000..7d4e4a1 --- /dev/null +++ b/arma/server/extension/src/lib.rs @@ -0,0 +1,111 @@ +//! Entry point and runtime bootstrap for the Forge Arma server extension. +//! +//! Initializes a global async runtime, SurrealDB persistence, and registers +//! all command groups. Provides status/version commands and maintains a shared +//! Arma `Context` for engine interop. +//! +#![allow(future_incompatible)] // Future-incompatible lint is triggered by arma_rs + +use arma_rs::{Context, Extension, Group, arma}; +use std::sync::LazyLock; +use tokio::runtime::{Builder, Runtime}; +use tokio::sync::RwLock as TokioRwLock; + +pub mod actor; +pub mod bank; +pub mod cad; +pub mod config; +pub mod garage; +pub mod helpers; +pub mod icom; +pub mod locker; +mod log; +pub mod org; +pub mod phone; +pub mod schema; +pub mod storage; +pub mod store; +pub mod surreal; +pub mod task; +pub mod terrain; +pub mod transport; +pub mod v_garage; +pub mod v_locker; + +/// Global Arma `Context` captured at initialization and made available to +/// commands that need engine interop. Stored inside an async `RwLock` to +/// allow mutation by the startup task and later reads. +static CONTEXT: LazyLock>> = LazyLock::new(|| TokioRwLock::new(None)); +/// Global multi-threaded Tokio runtime used to execute async operations from +/// command handlers and startup tasks. +pub(crate) static RUNTIME: LazyLock = LazyLock::new(|| { + Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime") +}); + +pub(crate) fn enqueue_persistence_task(module: &'static str, job: F) +where + F: FnOnce() -> Result<(), String> + Send + 'static, +{ + RUNTIME.spawn_blocking(move || { + if let Err(error) = job() { + crate::log::log( + module, + "ERROR", + &format!("Async persistence failed: {}", error), + ); + } + }); +} + +#[arma] +/// Initializes the extension, registers commands/groups, and asynchronously +/// connects SurrealDB on the global runtime. +fn init() -> Extension { + let config = config::load(); + let ext = Extension::build() + .command("version", get_version) + .command("status", get_status) + .group("surreal", surreal::group()) + .group("actor", actor::group()) + .group("bank", bank::group()) + .group("cad", cad::group()) + .group("garage", garage::group()) + .group("icom", icom::group()) + .group("locker", locker::group()) + .group("org", org::group()) + .group("phone", phone::group()) + .group("store", store::group()) + .group("task", task::group()) + .group("terrain", terrain::group()) + .group("transport", transport::group()) + .group( + "owned", + Group::new() + .group("garage", v_garage::group()) + .group("locker", v_locker::group()), + ) + .finish(); + + let surreal_config = config.surreal.clone(); + surreal::prepare(); + RUNTIME.spawn(async move { + surreal::initialize(surreal_config).await; + }); + + ext +} + +/// Returns current persistence connection state as a string: `initializing`, +/// `connected`, or `failed`. Intended for SQF polling before issuing +/// operations that require persistence. +fn get_status() -> String { + surreal::status() +} + +/// Returns the extension version string for diagnostics and tooling. +pub fn get_version() -> String { + format!("forge-server v{}", env!("CARGO_PKG_VERSION")) +} diff --git a/arma/server/extension/src/locker.rs b/arma/server/extension/src/locker.rs new file mode 100644 index 0000000..39e15d6 --- /dev/null +++ b/arma/server/extension/src/locker.rs @@ -0,0 +1,597 @@ +use arma_rs::{CallContext, Group}; +use forge_models::locker::Item; +use forge_repositories::InMemoryLockerHotRepository; +use forge_services::{LockerHotStateService, LockerService}; +use std::collections::HashMap; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::LockerStorageRepository; + +static LOCKER_SERVICE: LazyLock> = + LazyLock::new(|| LockerService::new(LockerStorageRepository::configured())); +static HOT_LOCKER_SERVICE: LazyLock< + LockerHotStateService, +> = LazyLock::new(|| { + let repository = LockerStorageRepository::configured(); + let hot_repository = InMemoryLockerHotRepository::new(); + LockerHotStateService::new(repository, hot_repository) +}); + +pub(crate) fn hot_service() +-> &'static LockerHotStateService { + &HOT_LOCKER_SERVICE +} + +/// Creates the Arma 3 command group for locker operations. +/// +/// Registers commands: `create`, `get`, `add`, `update`, `remove`, `delete`, `exists`. +pub fn group() -> Group { + Group::new() + .command("create", create_locker) + .command("get", get_locker) + .command("add", add_item) + .command("update", update_locker) + .command("patch", patch_item) + .command("remove", remove_item) + .command("delete", delete_locker) + .command("exists", locker_exists) + .group( + "hot", + Group::new() + .command("init", init_hot_locker) + .command("get", get_hot_locker) + .command("override", override_hot_locker) + .command("save", save_hot_locker) + .command("remove", remove_hot_locker), + ) +} + +fn serialize_hot_items(locker: forge_models::locker::Locker) -> String { + match serde_json::to_string(&locker.items) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot locker: {}", error), + } +} + +pub(crate) fn init_hot_locker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_LOCKER_SERVICE.init_locker(resolved_uid) { + Ok(locker) => serialize_hot_items(locker), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_locker(call_context: CallContext, key: String) -> String { + init_hot_locker(call_context, key) +} + +pub(crate) fn override_hot_locker( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let items: std::collections::HashMap = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid JSON data: {}", error), + }; + + match HOT_LOCKER_SERVICE.override_locker(resolved_uid, items) { + Ok(locker) => serialize_hot_items(locker), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_locker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_LOCKER_SERVICE.get_locker(resolved_uid.clone()) { + Ok(locker) => { + enqueue_persistence_task("locker", move || { + HOT_LOCKER_SERVICE.save_locker(resolved_uid).map(|_| ()) + }); + serialize_hot_items(locker) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_locker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_LOCKER_SERVICE.remove_locker(resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +/// Creates a new empty locker for a player. +/// +/// Parameters: key +pub fn create_locker(call_context: CallContext, key: String) -> String { + log( + "locker", + "DEBUG", + &format!("Creating locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.create_locker(resolved_uid.clone()) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!("Successfully created locker for: {}", resolved_uid), + ); + match serde_json::to_string(&locker.items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!("Failed to create locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a player's locker by key/UID. +/// +/// Returns JSON object with locker data including all items. +pub fn get_locker(call_context: CallContext, key: String) -> String { + log( + "locker", + "DEBUG", + &format!("Getting locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.get_locker(resolved_uid.clone()) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!("Successfully got locker for: {}", resolved_uid), + ); + match serde_json::to_string(&locker.items) { + Ok(json) => { + log( + "locker", + "DEBUG", + &format!("Serialized locker to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!("Failed to get locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Adds a new item to a player's locker. +/// +/// Parameters: key, json_data +pub fn add_item(call_context: CallContext, key: String, json_data: String) -> String { + log( + "locker", + "DEBUG", + &format!( + "Adding item to locker for key: {} with data: {}", + key, json_data + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse JSON data + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Extract fields + let category = match data.get("category").and_then(|v| v.as_str()) { + Some(c) => c.to_string(), + None => { + let error_msg = "Error: Missing or invalid category".to_string(); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let classname = match data.get("classname").and_then(|v| v.as_str()) { + Some(c) => c.to_string(), + None => { + let error_msg = "Error: Missing or invalid classname".to_string(); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let amount = match data.get("amount").and_then(|v| v.as_u64()) { + Some(a) => a as u32, + None => { + let error_msg = "Error: Missing or invalid amount".to_string(); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Create item with validation + let item = match Item::new(category, classname, amount) { + Ok(i) => i, + Err(e) => { + let error_msg = format!("Error: Validation failed: {}", e); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.add_item(resolved_uid.clone(), item) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!("Successfully added item to locker for: {}", resolved_uid), + ); + match serde_json::to_string(&locker.items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!("Failed to add item to locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates the entire locker state (Bulk Sync). +/// +/// Parameters: key, json_data (Map of items) +pub fn update_locker(call_context: CallContext, key: String, json_data: String) -> String { + log( + "locker", + "DEBUG", + &format!("Updating locker for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let items: HashMap = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.update_locker(resolved_uid.clone(), items) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!("Locker updated successfully for key: {}", resolved_uid), + ); + match serde_json::to_string(&locker.items) { + Ok(s) => s, + Err(e) => format!("Error serializing locker: {}", e), + } + } + Err(e) => { + log("locker", "ERROR", &format!("Error updating locker: {}", e)); + format!("Error: {}", e) + } + } +} + +/// Patches a specific item in the locker. +/// +/// Parameters: key, json_data (Map with classname and optional amount) +pub fn patch_item(call_context: CallContext, key: String, json_data: String) -> String { + log( + "locker", + "DEBUG", + &format!("Patching item for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let data: serde_json::Value = match serde_json::from_str(&json_data) { + Ok(d) => d, + Err(e) => { + let error_msg = format!("Error: Invalid JSON data: {}", e); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let classname = match data.get("classname").and_then(|v| v.as_str()) { + Some(s) => s.to_string(), + None => { + let error_msg = "Error: Missing classname".to_string(); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + let amount = data + .get("amount") + .and_then(|v| v.as_u64()) + .map(|v| v as u32); + + match LOCKER_SERVICE.patch_item(resolved_uid.clone(), classname, amount) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!("Successfully patched item for: {}", resolved_uid), + ); + match serde_json::to_string(&locker.items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!("Failed to patch item '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Removes an item from the locker. +/// +/// Parameters: key, classname +pub fn remove_item(call_context: CallContext, key: String, classname: String) -> String { + log( + "locker", + "DEBUG", + &format!("Removing item from locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.remove_item(resolved_uid.clone(), classname) { + Ok(locker) => { + log( + "locker", + "INFO", + &format!( + "Successfully removed item from locker for: {}", + resolved_uid + ), + ); + match serde_json::to_string(&locker.items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!( + "Failed to remove item from locker '{}': {}", + resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Permanently deletes a player's locker. +pub fn delete_locker(call_context: CallContext, key: String) -> String { + log( + "locker", + "DEBUG", + &format!("Deleting locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match LOCKER_SERVICE.delete_locker(resolved_uid.clone()) { + Ok(()) => { + log( + "locker", + "INFO", + &format!("Successfully deleted locker for: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "locker", + "ERROR", + &format!("Failed to delete locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if a player has a locker (even if empty) +pub fn locker_exists(call_context: CallContext, key: String) -> String { + log( + "locker", + "DEBUG", + &format!("Checking if locker exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + log( + "locker", + "ERROR", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match LOCKER_SERVICE.locker_exists(resolved_uid.clone()) { + Ok(exists) => { + log( + "locker", + "DEBUG", + &format!("Locker '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + log( + "locker", + "ERROR", + &format!( + "Failed to check if locker exists for '{}': {}", + resolved_uid, e + ), + ); + "false".to_string() + } + } +} diff --git a/arma/server/extension/src/log.rs b/arma/server/extension/src/log.rs new file mode 100644 index 0000000..7103451 --- /dev/null +++ b/arma/server/extension/src/log.rs @@ -0,0 +1,49 @@ +#![allow(dead_code)] + +use std::collections::HashMap; +use std::fs::{File, OpenOptions, create_dir_all}; +use std::io::Write; +use std::path::Path; +use std::sync::LazyLock; +use std::sync::Mutex; + +static LOG_FILES: LazyLock>> = LazyLock::new(|| { + let logs_dir = Path::new("@forge_server/logs"); + create_dir_all(logs_dir).expect("Failed to create logs directory"); + Mutex::new(HashMap::new()) +}); + +/// Generic logging function that creates log files on-demand. +/// +/// # Arguments +/// * `category` - The log category (e.g., "actor", "org", "vehicle") +/// * `level` - The log level (e.g., "INFO", "DEBUG", "WARN", "ERROR") +/// * `message` - The message to log +/// +/// # Example +/// ``` +/// log("actor", "INFO", "Actor created successfully"); +/// log("vehicle", "ERROR", "Failed to spawn vehicle"); +/// ``` +pub fn log(category: &str, level: &str, message: &str) { + let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S"); + let log_entry = format!("[{}] [{}] {}\n", timestamp, level, message); + + if let Ok(mut files) = LOG_FILES.lock() { + // Get or create the log file for this category + let file = files.entry(category.to_string()).or_insert_with(|| { + let logs_dir = Path::new("@forge_server/logs"); + let filename = format!("{}.log", category); + let path = logs_dir.join(filename); + + OpenOptions::new() + .create(true) + .append(true) + .open(path) + .unwrap_or_else(|_| panic!("Failed to open {} log file", category)) + }); + + let _ = file.write_all(log_entry.as_bytes()); + let _ = file.flush(); + } +} diff --git a/arma/server/extension/src/org.rs b/arma/server/extension/src/org.rs new file mode 100644 index 0000000..89a7d11 --- /dev/null +++ b/arma/server/extension/src/org.rs @@ -0,0 +1,523 @@ +//! Organization management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for organization data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::Group; +use forge_models::{ + HotOrgRecord, OrgAssetGrantSeed, OrgCheckoutContext, OrgCreditLineContext, + OrgCreditLineRepaymentContext, OrgCreditLineRepaymentResult, OrgDisbandResult, + OrgEnsureMemberContext, OrgFleetGrantSeed, OrgGrantContext, OrgInviteContext, + OrgInviteDecisionContext, OrgInviteDecisionResult, OrgInviteRecord, OrgInviteResult, + OrgLeaveContext, OrgLeaveResult, OrgRegisterContext, +}; +use forge_repositories::InMemoryOrgHotRepository; +use forge_services::{OrgHotStateService, OrgService}; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::log::log; +use crate::storage::OrgStorageRepository; + +/// Global organization service instance. +/// +/// Lazily initialized singleton combining repository and service layers. +static ORG_SERVICE: LazyLock> = + LazyLock::new(|| OrgService::new(OrgStorageRepository::configured())); +static HOT_ORG_SERVICE: LazyLock< + OrgHotStateService, +> = LazyLock::new(|| { + let repository = OrgStorageRepository::configured(); + let hot_repository = InMemoryOrgHotRepository::new(); + OrgHotStateService::new(repository, hot_repository) +}); + +pub(crate) fn hot_service() +-> &'static OrgHotStateService { + &HOT_ORG_SERVICE +} + +/// Creates the Arma 3 command group for organization operations. +/// +/// Registers commands: `get`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_org) + .command("create", create_org) + .command("update", update_org) + .command("exists", org_exists) + .command("delete", delete_org) + .group( + "hot", + Group::new() + .command("init", init_hot_org) + .command("get", get_hot_org) + .command("override", override_hot_org) + .command("ensure_member", ensure_hot_org_member) + .command("member_invites", get_hot_org_member_invites) + .command("register", register_hot_org) + .command("invite_member", invite_hot_org_member) + .command("accept_invite", accept_hot_org_invite) + .command("decline_invite", decline_hot_org_invite) + .command("assign_credit_line", assign_credit_line_hot_org) + .command("repay_credit_line", repay_credit_line_hot_org) + .command("charge_checkout", charge_checkout_hot_org) + .command("add_assets", add_assets_hot_org) + .command("add_fleet", add_fleet_hot_org) + .command("leave", leave_hot_org) + .command("disband", disband_hot_org) + .command("save", save_hot_org) + .command("remove", remove_hot_org), + ) + .group( + "assets", + Group::new() + .command("get", get_assets) + .command("update", update_assets), + ) + .group( + "fleet", + Group::new() + .command("get", get_fleet) + .command("update", update_fleet), + ) + .group( + "members", + Group::new() + .command("get", get_members) + .command("add", add_member) + .command("remove", remove_member), + ) +} + +fn serialize_hot_org(org: HotOrgRecord) -> String { + match serde_json::to_string(&org) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot org: {}", error), + } +} + +fn serialize_result(value: &T, label: &str) -> String { + match serde_json::to_string(value) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize {}: {}", label, error), + } +} + +pub(crate) fn init_hot_org(org_id: String) -> String { + match HOT_ORG_SERVICE.init_org(org_id) { + Ok(org) => serialize_hot_org(org), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_org(org_id: String) -> String { + match HOT_ORG_SERVICE.get_org(org_id) { + Ok(org) => serialize_hot_org(org), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn override_hot_org(org_id: String, json_data: String) -> String { + let hot_org: HotOrgRecord = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org JSON: {}", error), + }; + + match HOT_ORG_SERVICE.override_org(org_id, hot_org) { + Ok(org) => serialize_hot_org(org), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn ensure_hot_org_member(json_data: String) -> String { + let context: OrgEnsureMemberContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid ensure-member JSON: {}", error), + }; + + match HOT_ORG_SERVICE.ensure_member(context) { + Ok(org) => serialize_hot_org(org), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn get_hot_org_member_invites(member_uid: String) -> String { + match HOT_ORG_SERVICE.get_member_invites(member_uid) { + Ok(invites) => serialize_result::>(&invites, "org invite list"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn register_hot_org(json_data: String) -> String { + let context: OrgRegisterContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid register org JSON: {}", error), + }; + + match HOT_ORG_SERVICE.register_org(context) { + Ok(result) => serialize_result(&result, "org register result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn invite_hot_org_member(json_data: String) -> String { + let context: OrgInviteContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org invite JSON: {}", error), + }; + + match HOT_ORG_SERVICE.invite_member(context) { + Ok(result) => serialize_result::(&result, "org invite result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn accept_hot_org_invite(json_data: String) -> String { + let context: OrgInviteDecisionContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org invite decision JSON: {}", error), + }; + + match HOT_ORG_SERVICE.accept_invite(context) { + Ok(result) => { + serialize_result::(&result, "org invite decision result") + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn decline_hot_org_invite(json_data: String) -> String { + let context: OrgInviteDecisionContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org invite decision JSON: {}", error), + }; + + match HOT_ORG_SERVICE.decline_invite(context) { + Ok(result) => { + serialize_result::(&result, "org invite decision result") + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn assign_credit_line_hot_org(json_data: String) -> String { + let context: OrgCreditLineContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org credit-line JSON: {}", error), + }; + + match HOT_ORG_SERVICE.assign_credit_line(context) { + Ok(result) => serialize_result(&result, "org mutation result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn charge_checkout_hot_org(json_data: String) -> String { + let context: OrgCheckoutContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org checkout JSON: {}", error), + }; + + match HOT_ORG_SERVICE.charge_checkout(context) { + Ok(result) => serialize_result(&result, "org mutation result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn repay_credit_line_hot_org(json_data: String) -> String { + let context: OrgCreditLineRepaymentContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org credit repayment JSON: {}", error), + }; + + match HOT_ORG_SERVICE.repay_credit_line(context) { + Ok(result) => { + serialize_result::(&result, "org credit repayment result") + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn add_assets_hot_org(context_json: String, assets_json: String) -> String { + let context: OrgGrantContext = match serde_json::from_str(&context_json) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org asset context JSON: {}", error), + }; + let assets: Vec = match serde_json::from_str(&assets_json) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org asset seed JSON: {}", error), + }; + + match HOT_ORG_SERVICE.add_assets(context, assets) { + Ok(result) => serialize_result(&result, "org mutation result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn add_fleet_hot_org(context_json: String, fleet_json: String) -> String { + let context: OrgGrantContext = match serde_json::from_str(&context_json) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org fleet context JSON: {}", error), + }; + let fleet: Vec = match serde_json::from_str(&fleet_json) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org fleet seed JSON: {}", error), + }; + + match HOT_ORG_SERVICE.add_fleet_vehicles(context, fleet) { + Ok(result) => serialize_result(&result, "org mutation result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn leave_hot_org(json_data: String) -> String { + let context: OrgLeaveContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org leave JSON: {}", error), + }; + + match HOT_ORG_SERVICE.leave_org(context) { + Ok(result) => serialize_result::(&result, "org leave result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn disband_hot_org(json_data: String) -> String { + let context: OrgLeaveContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid org disband JSON: {}", error), + }; + + match HOT_ORG_SERVICE.disband_org(context) { + Ok(result) => serialize_result::(&result, "org disband result"), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_org(org_id: String) -> String { + match HOT_ORG_SERVICE.get_org(org_id.clone()) { + Ok(org) => { + enqueue_persistence_task("org", move || HOT_ORG_SERVICE.save_org(org_id).map(|_| ())); + serialize_hot_org(org) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_org(org_id: String) -> String { + match HOT_ORG_SERVICE.remove_org(org_id) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +// ============================================================================ +// Organization Asset Operations +// ============================================================================ + +/// Retrieves an organization by key/ID. +/// +/// Returns the organization as JSON or an error message if not found. +pub fn get_org(key: String) -> String { + log( + "org", + "DEBUG", + &format!("Getting organization for key: {}", key), + ); + + match ORG_SERVICE.get_org(key.clone()) { + Ok(org) => { + log( + "org", + "INFO", + &format!("Successfully retrieved organization: {}", key), + ); + match serde_json::to_string(&org) { + Ok(json) => { + log("org", "DEBUG", &format!("Serialized org to JSON: {}", json)); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize org: {}", e); + log("org", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "org", + "ERROR", + &format!("Failed to get organization '{}': {}", key, e), + ); + error_msg + } + } +} + +/// Checks if an organization exists in the database. +/// +/// Returns "true" if the organization exists, "false" otherwise. +pub fn org_exists(key: String) -> String { + match ORG_SERVICE.org_exists(key) { + Ok(exists) => if exists { "true" } else { "false" }.to_string(), + Err(_) => "false".to_string(), + } +} + +/// Creates a new organization with the provided JSON data. +/// +/// Resolves key to ID, validates JSON data, and persists the new organization. +pub fn create_org(key: String, json_data: String) -> String { + log( + "org", + "DEBUG", + &format!( + "Creating organization for key: {} with data: {}", + key, json_data + ), + ); + + match ORG_SERVICE.create_org(key.clone(), json_data) { + Ok(org) => { + log( + "org", + "INFO", + &format!("Successfully created organization: {}", key), + ); + match serde_json::to_string(&org) { + Ok(json) => { + log("org", "DEBUG", &format!("Serialized org to JSON: {}", json)); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize org: {}", e); + log("org", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "org", + "ERROR", + &format!("Failed to create organization '{}': {}", key, e), + ); + error_msg + } + } +} + +/// Updates an existing organization with JSON data. +/// +/// Resolves key to ID, applies partial updates from JSON, and persists changes. +pub fn update_org(key: String, json_update: String) -> String { + match ORG_SERVICE.update_org(key, json_update) { + Ok(org) => match serde_json::to_string(&org) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +/// Permanently deletes an organization. +/// +/// Resolves key to ID and removes the organization and associated data. +pub fn delete_org(key: String) -> String { + match ORG_SERVICE.delete_org(key) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} + +pub fn get_assets(key: String) -> String { + match ORG_SERVICE.get_assets(key) { + Ok(assets) => match serde_json::to_string(&assets) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org assets: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +pub fn update_assets(key: String, json_update: String) -> String { + let assets_value: serde_json::Value = match serde_json::from_str(&json_update) { + Ok(value) => value, + Err(e) => return format!("Error: Invalid JSON: {}", e), + }; + + match ORG_SERVICE.update_assets(key, assets_value) { + Ok(assets) => match serde_json::to_string(&assets) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org assets: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +pub fn get_fleet(key: String) -> String { + match ORG_SERVICE.get_fleet(key) { + Ok(fleet) => match serde_json::to_string(&fleet) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org fleet: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +pub fn update_fleet(key: String, json_update: String) -> String { + let fleet_value: serde_json::Value = match serde_json::from_str(&json_update) { + Ok(value) => value, + Err(e) => return format!("Error: Invalid JSON: {}", e), + }; + + match ORG_SERVICE.update_fleet(key, fleet_value) { + Ok(fleet) => match serde_json::to_string(&fleet) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org fleet: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +// ============================================================================ +// Member Operations +// ============================================================================ + +/// Retrieves organization members as a JSON object. +/// +/// Returns a map of member UIDs to names. Returns empty object if not found. +pub fn get_members(key: String) -> String { + match ORG_SERVICE.get_members(key) { + Ok(members) => match serde_json::to_string(&members) { + Ok(json) => json, + Err(_) => "{}".to_string(), + }, + Err(_) => "{}".to_string(), + } +} + +/// Adds a new member to an organization by their UID. +/// +/// Resolves organization key to ID and adds the member UID. +/// Member collections automatically prevent duplicate members. +pub fn add_member(key: String, member_uid: String) -> String { + match ORG_SERVICE.add_member(key, member_uid) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} + +/// Removes a member from an organization by their UID. +/// +/// Resolves organization key to ID and removes the member UID. +pub fn remove_member(key: String, member_uid: String) -> String { + match ORG_SERVICE.remove_member(key, member_uid) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} diff --git a/arma/server/extension/src/phone.rs b/arma/server/extension/src/phone.rs new file mode 100644 index 0000000..ed539ae --- /dev/null +++ b/arma/server/extension/src/phone.rs @@ -0,0 +1,128 @@ +//! Phone hot-state operations for the Arma 3 server extension. +//! +//! The extension owns phone runtime state for contacts, messages, and emails. +//! SQF remains the event bridge and may enrich contact identity from actor state. + +use crate::storage::PhoneStorageRepository; +use arma_rs::Group; +use forge_services::PhoneStateService; +use serde::Serialize; +use std::sync::LazyLock; + +static PHONE_SERVICE: LazyLock> = + LazyLock::new(|| PhoneStateService::new(PhoneStorageRepository::configured())); + +pub fn group() -> Group { + Group::new() + .command("init", init_phone) + .group( + "contacts", + Group::new() + .command("list", list_contacts) + .command("add", add_contact) + .command("remove", remove_contact), + ) + .group( + "messages", + Group::new() + .command("list", list_messages) + .command("thread", message_thread) + .command("send", send_message) + .command("mark_read", mark_message_read) + .command("delete", delete_message), + ) + .group( + "emails", + Group::new() + .command("list", list_emails) + .command("send", send_email) + .command("mark_read", mark_email_read) + .command("delete", delete_email), + ) + .command("remove", remove_phone) +} + +pub(crate) fn init_phone(uid: String) -> String { + serialize_json(PHONE_SERVICE.init(uid)) +} + +pub(crate) fn list_contacts(uid: String) -> String { + serialize_json(PHONE_SERVICE.list_contacts(uid)) +} + +pub(crate) fn add_contact(uid: String, contact_uid: String) -> String { + serialize_bool(PHONE_SERVICE.add_contact(uid, contact_uid)) +} + +pub(crate) fn remove_contact(uid: String, contact_uid: String) -> String { + serialize_bool(PHONE_SERVICE.remove_contact(uid, contact_uid)) +} + +pub(crate) fn send_message( + from_uid: String, + to_uid: String, + message: String, + timestamp: String, +) -> String { + serialize_json(PHONE_SERVICE.send_message(from_uid, to_uid, message, timestamp)) +} + +pub(crate) fn list_messages(uid: String) -> String { + serialize_json(PHONE_SERVICE.list_messages(uid)) +} + +pub(crate) fn message_thread(uid: String, other_uid: String) -> String { + serialize_json(PHONE_SERVICE.message_thread(uid, other_uid)) +} + +pub(crate) fn mark_message_read(uid: String, message_id: String) -> String { + serialize_bool(PHONE_SERVICE.mark_message_read(uid, message_id)) +} + +pub(crate) fn delete_message(uid: String, message_id: String) -> String { + serialize_bool(PHONE_SERVICE.delete_message(uid, message_id)) +} + +pub(crate) fn send_email( + from_uid: String, + to_uid: String, + subject: String, + body: String, + timestamp: String, +) -> String { + serialize_json(PHONE_SERVICE.send_email(from_uid, to_uid, subject, body, timestamp)) +} + +pub(crate) fn list_emails(uid: String) -> String { + serialize_json(PHONE_SERVICE.list_emails(uid)) +} + +pub(crate) fn mark_email_read(uid: String, email_id: String) -> String { + serialize_bool(PHONE_SERVICE.mark_email_read(uid, email_id)) +} + +pub(crate) fn delete_email(uid: String, email_id: String) -> String { + serialize_bool(PHONE_SERVICE.delete_email(uid, email_id)) +} + +pub(crate) fn remove_phone(uid: String) -> String { + match PHONE_SERVICE.remove(uid) { + Ok(()) => "OK".to_string(), + Err(error) => format!("Error: {error}"), + } +} + +fn serialize_bool(result: Result) -> String { + match result { + Ok(value) => value.to_string(), + Err(error) => format!("Error: {error}"), + } +} + +fn serialize_json(result: Result) -> String { + match result { + Ok(value) => serde_json::to_string(&value) + .unwrap_or_else(|error| format!("Error: Failed to serialize phone state: {error}")), + Err(error) => format!("Error: {error}"), + } +} diff --git a/arma/server/extension/src/schema/actor.surql b/arma/server/extension/src/schema/actor.surql new file mode 100644 index 0000000..e2f2a29 --- /dev/null +++ b/arma/server/extension/src/schema/actor.surql @@ -0,0 +1,15 @@ +DEFINE TABLE IF NOT EXISTS actor SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON actor TYPE string; +DEFINE FIELD IF NOT EXISTS name ON actor TYPE option; +DEFINE FIELD IF NOT EXISTS loadout ON actor TYPE any; +DEFINE FIELD IF NOT EXISTS position ON actor TYPE option; +DEFINE FIELD IF NOT EXISTS direction ON actor TYPE number; +DEFINE FIELD IF NOT EXISTS stance ON actor TYPE option; +DEFINE FIELD IF NOT EXISTS email ON actor TYPE string; +DEFINE FIELD IF NOT EXISTS phone_number ON actor TYPE string; +DEFINE FIELD IF NOT EXISTS state ON actor TYPE string; +DEFINE FIELD IF NOT EXISTS holster ON actor TYPE bool; +DEFINE FIELD IF NOT EXISTS rank ON actor TYPE option; +DEFINE FIELD IF NOT EXISTS organization ON actor TYPE string; +DEFINE FIELD OVERWRITE updated_at ON actor TYPE option; +DEFINE INDEX IF NOT EXISTS actor_uid ON actor COLUMNS uid UNIQUE; diff --git a/arma/server/extension/src/schema/bank.surql b/arma/server/extension/src/schema/bank.surql new file mode 100644 index 0000000..18812b4 --- /dev/null +++ b/arma/server/extension/src/schema/bank.surql @@ -0,0 +1,17 @@ +DEFINE TABLE IF NOT EXISTS bank SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON bank TYPE string; +DEFINE FIELD IF NOT EXISTS name ON bank TYPE string; +DEFINE FIELD IF NOT EXISTS bank ON bank TYPE number; +DEFINE FIELD IF NOT EXISTS cash ON bank TYPE number; +DEFINE FIELD IF NOT EXISTS earnings ON bank TYPE number; +DEFINE FIELD IF NOT EXISTS pin ON bank TYPE int; +DEFINE FIELD OVERWRITE updated_at ON bank TYPE option; +DEFINE INDEX IF NOT EXISTS bank_uid ON bank COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS bank_transaction SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON bank_transaction TYPE string; +DEFINE FIELD IF NOT EXISTS ordinal ON bank_transaction TYPE int; +DEFINE FIELD IF NOT EXISTS message ON bank_transaction TYPE string; +DEFINE FIELD OVERWRITE created_at ON bank_transaction TYPE option; +DEFINE INDEX IF NOT EXISTS bank_transaction_owner ON bank_transaction COLUMNS uid; +DEFINE INDEX IF NOT EXISTS bank_transaction_unique ON bank_transaction COLUMNS uid, ordinal UNIQUE; diff --git a/arma/server/extension/src/schema/garage.surql b/arma/server/extension/src/schema/garage.surql new file mode 100644 index 0000000..374db84 --- /dev/null +++ b/arma/server/extension/src/schema/garage.surql @@ -0,0 +1,32 @@ +DEFINE TABLE IF NOT EXISTS garage SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON garage TYPE string; +DEFINE FIELD OVERWRITE updated_at ON garage TYPE option; +DEFINE INDEX IF NOT EXISTS garage_uid ON garage COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS garage_vehicle SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS plate ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS fuel ON garage_vehicle TYPE number; +DEFINE FIELD IF NOT EXISTS damage ON garage_vehicle TYPE number; +DEFINE FIELD IF NOT EXISTS hit_points ON garage_vehicle TYPE object; +DEFINE FIELD IF NOT EXISTS hit_points.names ON garage_vehicle TYPE array; +DEFINE FIELD IF NOT EXISTS hit_points.selections ON garage_vehicle TYPE array; +DEFINE FIELD IF NOT EXISTS hit_points.values ON garage_vehicle TYPE array; +DEFINE FIELD OVERWRITE updated_at ON garage_vehicle TYPE option; +DEFINE INDEX IF NOT EXISTS garage_vehicle_owner ON garage_vehicle COLUMNS uid; +DEFINE INDEX IF NOT EXISTS garage_vehicle_unique ON garage_vehicle COLUMNS uid, plate UNIQUE; + +DEFINE TABLE IF NOT EXISTS owned_garage SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON owned_garage TYPE string; +DEFINE FIELD OVERWRITE updated_at ON owned_garage TYPE option; +DEFINE INDEX IF NOT EXISTS owned_garage_uid ON owned_garage COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS garage_unlock SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS category ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS source ON garage_unlock TYPE option; +DEFINE FIELD OVERWRITE unlocked_at ON garage_unlock TYPE option; +DEFINE INDEX IF NOT EXISTS garage_unlock_owner ON garage_unlock COLUMNS uid; +DEFINE INDEX IF NOT EXISTS garage_unlock_unique ON garage_unlock COLUMNS uid, category, classname UNIQUE; diff --git a/arma/server/extension/src/schema/locker.surql b/arma/server/extension/src/schema/locker.surql new file mode 100644 index 0000000..7796c4b --- /dev/null +++ b/arma/server/extension/src/schema/locker.surql @@ -0,0 +1,27 @@ +DEFINE TABLE IF NOT EXISTS locker SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON locker TYPE string; +DEFINE FIELD OVERWRITE updated_at ON locker TYPE option; +DEFINE INDEX IF NOT EXISTS locker_uid ON locker COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS locker_item SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS category ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS amount ON locker_item TYPE int; +DEFINE FIELD OVERWRITE updated_at ON locker_item TYPE option; +DEFINE INDEX IF NOT EXISTS locker_item_owner ON locker_item COLUMNS uid; +DEFINE INDEX IF NOT EXISTS locker_item_unique ON locker_item COLUMNS uid, classname UNIQUE; + +DEFINE TABLE IF NOT EXISTS owned_locker SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON owned_locker TYPE string; +DEFINE FIELD OVERWRITE updated_at ON owned_locker TYPE option; +DEFINE INDEX IF NOT EXISTS owned_locker_uid ON owned_locker COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS locker_unlock SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS category ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS source ON locker_unlock TYPE option; +DEFINE FIELD OVERWRITE unlocked_at ON locker_unlock TYPE option; +DEFINE INDEX IF NOT EXISTS locker_unlock_owner ON locker_unlock COLUMNS uid; +DEFINE INDEX IF NOT EXISTS locker_unlock_unique ON locker_unlock COLUMNS uid, category, classname UNIQUE; diff --git a/arma/server/extension/src/schema/mod.rs b/arma/server/extension/src/schema/mod.rs new file mode 100644 index 0000000..d64b1ba --- /dev/null +++ b/arma/server/extension/src/schema/mod.rs @@ -0,0 +1,48 @@ +use crate::log; +use crate::surreal::SurrealDb; + +const SCHEMAS: &[(&str, &str)] = &[ + ("actor", include_str!("actor.surql")), + ("bank", include_str!("bank.surql")), + ("org", include_str!("org.surql")), + ("locker", include_str!("locker.surql")), + ("garage", include_str!("garage.surql")), + ("phone", include_str!("phone.surql")), +]; + +pub async fn apply_all(db: &SurrealDb) -> Result<(), String> { + for (name, schema) in SCHEMAS { + for statement in schema_statements(schema) { + db.query(statement) + .await + .map_err(|error| { + format!( + "SurrealDB {} schema bootstrap failed for statement '{}': {}", + name, statement, error + ) + })? + .check() + .map_err(|error| { + format!( + "SurrealDB {} schema bootstrap failed for statement '{}': {}", + name, statement, error + ) + })?; + } + + log::log( + "surreal", + "DEBUG", + &format!("Applied SurrealDB {} schema", name), + ); + } + + Ok(()) +} + +fn schema_statements(schema: &'static str) -> impl Iterator { + schema + .split(';') + .map(str::trim) + .filter(|statement| !statement.is_empty()) +} diff --git a/arma/server/extension/src/schema/org.surql b/arma/server/extension/src/schema/org.surql new file mode 100644 index 0000000..7a423ad --- /dev/null +++ b/arma/server/extension/src/schema/org.surql @@ -0,0 +1,51 @@ +DEFINE TABLE IF NOT EXISTS org SCHEMALESS; +DEFINE FIELD IF NOT EXISTS org_id ON org TYPE string; +DEFINE FIELD IF NOT EXISTS owner ON org TYPE string; +DEFINE FIELD IF NOT EXISTS name ON org TYPE string; +DEFINE FIELD IF NOT EXISTS funds ON org TYPE number; +DEFINE FIELD IF NOT EXISTS reputation ON org TYPE int; +DEFINE FIELD OVERWRITE updated_at ON org TYPE option; +DEFINE INDEX IF NOT EXISTS org_org_id ON org COLUMNS org_id UNIQUE; + +DEFINE TABLE IF NOT EXISTS org_member SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS org_id ON org_member TYPE string; +DEFINE FIELD IF NOT EXISTS member_uid ON org_member TYPE string; +DEFINE FIELD OVERWRITE joined_at ON org_member TYPE option; +DEFINE INDEX IF NOT EXISTS org_member_org ON org_member COLUMNS org_id; +DEFINE INDEX IF NOT EXISTS org_member_unique ON org_member COLUMNS org_id, member_uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS org_credit_line SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS org_id ON org_credit_line TYPE string; +DEFINE FIELD IF NOT EXISTS uid ON org_credit_line TYPE string; +DEFINE FIELD IF NOT EXISTS name ON org_credit_line TYPE string; +DEFINE FIELD IF NOT EXISTS approved_amount ON org_credit_line TYPE number; +DEFINE FIELD IF NOT EXISTS available_amount ON org_credit_line TYPE number; +DEFINE FIELD IF NOT EXISTS outstanding_principal ON org_credit_line TYPE number; +DEFINE FIELD IF NOT EXISTS interest_rate ON org_credit_line TYPE number; +DEFINE FIELD IF NOT EXISTS amount_due ON org_credit_line TYPE number; +DEFINE FIELD IF NOT EXISTS amount ON org_credit_line TYPE number; +DEFINE FIELD OVERWRITE updated_at ON org_credit_line TYPE option; +DEFINE INDEX IF NOT EXISTS org_credit_line_org ON org_credit_line COLUMNS org_id; +DEFINE INDEX IF NOT EXISTS org_credit_line_unique ON org_credit_line COLUMNS org_id, uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS org_asset SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS org_id ON org_asset TYPE string; +DEFINE FIELD IF NOT EXISTS category ON org_asset TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON org_asset TYPE string; +DEFINE FIELD IF NOT EXISTS asset_type ON org_asset TYPE string; +DEFINE FIELD IF NOT EXISTS quantity ON org_asset TYPE int; +DEFINE FIELD OVERWRITE updated_at ON org_asset TYPE option; +DEFINE INDEX IF NOT EXISTS org_asset_org ON org_asset COLUMNS org_id; +DEFINE INDEX IF NOT EXISTS org_asset_unique ON org_asset COLUMNS org_id, category, classname UNIQUE; + +DEFINE TABLE IF NOT EXISTS org_fleet_vehicle SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS org_id ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS fleet_key ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS name ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS fleet_type ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS status ON org_fleet_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS damage ON org_fleet_vehicle TYPE string; +DEFINE FIELD OVERWRITE updated_at ON org_fleet_vehicle TYPE option; +DEFINE INDEX IF NOT EXISTS org_fleet_vehicle_org ON org_fleet_vehicle COLUMNS org_id; +DEFINE INDEX IF NOT EXISTS org_fleet_vehicle_unique ON org_fleet_vehicle COLUMNS org_id, fleet_key UNIQUE; diff --git a/arma/server/extension/src/schema/phone.surql b/arma/server/extension/src/schema/phone.surql new file mode 100644 index 0000000..16cdd7f --- /dev/null +++ b/arma/server/extension/src/schema/phone.surql @@ -0,0 +1,53 @@ +DEFINE TABLE IF NOT EXISTS phone_user SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON phone_user TYPE string; +DEFINE FIELD OVERWRITE updated_at ON phone_user TYPE option; +DEFINE INDEX IF NOT EXISTS phone_user_uid ON phone_user COLUMNS uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_contact SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_contact TYPE string; +DEFINE FIELD IF NOT EXISTS contact_uid ON phone_contact TYPE string; +DEFINE FIELD OVERWRITE created_at ON phone_contact TYPE option; +DEFINE INDEX IF NOT EXISTS phone_contact_owner ON phone_contact COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_contact_unique ON phone_contact COLUMNS uid, contact_uid UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_message SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS message_id ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS from_uid ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS to_uid ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS message ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS timestamp ON phone_message TYPE number; +DEFINE FIELD OVERWRITE created_at ON phone_message TYPE option; +DEFINE INDEX IF NOT EXISTS phone_message_message_id ON phone_message COLUMNS message_id UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_message_index SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_message_index TYPE string; +DEFINE FIELD IF NOT EXISTS message_id ON phone_message_index TYPE string; +DEFINE FIELD IF NOT EXISTS is_read ON phone_message_index TYPE bool; +DEFINE FIELD OVERWRITE updated_at ON phone_message_index TYPE option; +DEFINE INDEX IF NOT EXISTS phone_message_index_owner ON phone_message_index COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_message_index_message ON phone_message_index COLUMNS message_id; +DEFINE INDEX IF NOT EXISTS phone_message_index_unique ON phone_message_index COLUMNS uid, message_id UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_email SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS email_id ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS from_uid ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS to_uid ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS subject ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS body ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS timestamp ON phone_email TYPE number; +DEFINE FIELD OVERWRITE created_at ON phone_email TYPE option; +DEFINE INDEX IF NOT EXISTS phone_email_email_id ON phone_email COLUMNS email_id UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_email_index SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_email_index TYPE string; +DEFINE FIELD IF NOT EXISTS email_id ON phone_email_index TYPE string; +DEFINE FIELD IF NOT EXISTS is_read ON phone_email_index TYPE bool; +DEFINE FIELD OVERWRITE updated_at ON phone_email_index TYPE option; +DEFINE INDEX IF NOT EXISTS phone_email_index_owner ON phone_email_index COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_email_index_email ON phone_email_index COLUMNS email_id; +DEFINE INDEX IF NOT EXISTS phone_email_index_unique ON phone_email_index COLUMNS uid, email_id UNIQUE; + +DEFINE TABLE IF NOT EXISTS phone_sequence SCHEMALESS; +DEFINE FIELD IF NOT EXISTS sequence_id ON phone_sequence TYPE string; +DEFINE FIELD IF NOT EXISTS value ON phone_sequence TYPE int; +DEFINE INDEX IF NOT EXISTS phone_sequence_id ON phone_sequence COLUMNS sequence_id UNIQUE; diff --git a/arma/server/extension/src/storage.rs b/arma/server/extension/src/storage.rs new file mode 100644 index 0000000..a41aa44 --- /dev/null +++ b/arma/server/extension/src/storage.rs @@ -0,0 +1,37 @@ +//! Durable repository selection for the extension. + +mod actor; +mod bank; +mod common; +mod garage; +mod locker; +mod org; +mod phone; + +pub use actor::{ActorStorageRepository, SurrealActorRepository}; +pub use bank::{BankStorageRepository, SurrealBankRepository}; +pub use garage::{ + GarageStorageRepository, SurrealGarageRepository, SurrealVGarageRepository, + VGarageStorageRepository, +}; +pub use locker::{ + LockerStorageRepository, SurrealLockerRepository, SurrealVLockerRepository, + VLockerStorageRepository, +}; +pub use org::{OrgStorageRepository, SurrealOrgRepository}; +pub use phone::{PhoneStorageRepository, SurrealPhoneRepository}; + +use forge_models::{ + Actor, Bank, CreditLineSummary, Garage, HitPoints, Item, Locker, MemberSummary, Org, + OrgAssetEntry, OrgFleetEntry, PhoneEmail, PhoneMessage, VGarage, VLocker, Vehicle, +}; +use forge_repositories::{ + ActorRepository, BankRepository, GarageRepository, LockerRepository, OrgRepository, + PhoneRepository, VGarageRepository, VLockerRepository, +}; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use std::collections::{HashMap, HashSet}; + +use crate::RUNTIME; +use crate::surreal; diff --git a/arma/server/extension/src/storage/actor.rs b/arma/server/extension/src/storage/actor.rs new file mode 100644 index 0000000..1174efb --- /dev/null +++ b/arma/server/extension/src/storage/actor.rs @@ -0,0 +1,124 @@ +use super::common::*; +use super::*; + +pub enum ActorStorageRepository { + Surreal(SurrealActorRepository), +} + +impl ActorStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealActorRepository) + } +} + +impl ActorRepository for ActorStorageRepository { + fn create(&self, actor: &Actor) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(actor), + } + } + + fn get_by_id(&self, id: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get_by_id(id), + } + } + + fn update(&self, actor: &Actor) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(actor), + } + } + + fn delete(&self, id: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(id), + } + } + + fn exists(&self, id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(id), + } + } +} + +pub struct SurrealActorRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ActorRecord { + uid: String, + name: Option, + loadout: serde_json::Value, + position: Option>, + direction: f64, + stance: Option, + email: String, + phone_number: String, + state: String, + holster: bool, + rank: Option, + organization: String, +} + +impl ActorRecord { + fn into_actor(self) -> Actor { + Actor { + uid: self.uid, + name: self.name, + loadout: self.loadout, + position: self.position, + direction: self.direction, + stance: self.stance, + email: self.email, + phone_number: self.phone_number, + state: self.state, + holster: self.holster, + rank: self.rank, + organization: self.organization, + } + } +} + +impl From<&Actor> for ActorRecord { + fn from(actor: &Actor) -> Self { + Self { + uid: actor.uid.clone(), + name: actor.name.clone(), + loadout: actor.loadout.clone(), + position: actor.position.clone(), + direction: actor.direction, + stance: actor.stance.clone(), + email: actor.email.clone(), + phone_number: actor.phone_number.clone(), + state: actor.state.clone(), + holster: actor.holster, + rank: actor.rank.clone(), + organization: actor.organization.clone(), + } + } +} + +impl ActorRepository for SurrealActorRepository { + fn create(&self, actor: &Actor) -> Result<(), String> { + self.update(actor) + } + + fn get_by_id(&self, id: &str) -> Result, String> { + surreal_select::("actor", id, "actor") + .map(|record| record.map(ActorRecord::into_actor)) + } + + fn update(&self, actor: &Actor) -> Result<(), String> { + let record = ActorRecord::from(actor); + surreal_upsert("actor", actor.uid.as_str(), "actor", &record) + } + + fn delete(&self, id: &str) -> Result<(), String> { + surreal_delete::("actor", id, "actor") + } + + fn exists(&self, id: &str) -> Result { + self.get_by_id(id).map(|actor| actor.is_some()) + } +} diff --git a/arma/server/extension/src/storage/bank.rs b/arma/server/extension/src/storage/bank.rs new file mode 100644 index 0000000..7c76f10 --- /dev/null +++ b/arma/server/extension/src/storage/bank.rs @@ -0,0 +1,154 @@ +use super::common::*; +use super::*; + +pub enum BankStorageRepository { + Surreal(SurrealBankRepository), +} + +impl BankStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealBankRepository) + } +} + +impl BankRepository for BankStorageRepository { + fn create(&self, bank: &Bank) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(bank), + } + } + + fn get_by_id(&self, id: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get_by_id(id), + } + } + + fn update(&self, bank: &Bank) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(bank), + } + } + + fn delete(&self, id: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(id), + } + } + + fn exists(&self, id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(id), + } + } +} + +pub struct SurrealBankRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct BankAccountRecord { + uid: String, + name: String, + bank: f64, + cash: f64, + earnings: f64, + pin: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct BankTransactionRecord { + uid: String, + ordinal: u64, + message: String, +} + +impl BankAccountRecord { + fn into_bank(self, transactions: Vec) -> Bank { + Bank { + uid: self.uid, + name: self.name, + bank: self.bank, + cash: self.cash, + earnings: self.earnings, + pin: self.pin, + transactions, + } + } +} + +impl From<&Bank> for BankAccountRecord { + fn from(bank: &Bank) -> Self { + Self { + uid: bank.uid.clone(), + name: bank.name.clone(), + bank: bank.bank, + cash: bank.cash, + earnings: bank.earnings, + pin: bank.pin, + } + } +} + +fn bank_transaction_id(uid: &str, ordinal: usize) -> String { + format!("{}:{}", uid, ordinal) +} + +fn bank_transactions_from_records(mut records: Vec) -> Vec { + records.sort_by_key(|record| record.ordinal); + records + .into_iter() + .map(|record| record.message) + .collect::>() +} + +impl BankRepository for SurrealBankRepository { + fn create(&self, bank: &Bank) -> Result<(), String> { + self.update(bank) + } + + fn get_by_id(&self, id: &str) -> Result, String> { + let Some(record) = surreal_select::("bank", id, "bank")? else { + return Ok(None); + }; + + let transaction_records = surreal_select_by_uid::( + "bank_transaction", + "bank transactions", + id, + )?; + let transactions = bank_transactions_from_records(transaction_records); + + Ok(Some(record.into_bank(transactions))) + } + + fn update(&self, bank: &Bank) -> Result<(), String> { + let account = BankAccountRecord::from(bank); + surreal_upsert("bank", bank.uid.as_str(), "bank", &account)?; + surreal_delete_by_uid("bank_transaction", "bank transactions", &bank.uid)?; + + for (ordinal, message) in bank.transactions.iter().enumerate() { + let record = BankTransactionRecord { + uid: bank.uid.clone(), + ordinal: ordinal as u64, + message: message.clone(), + }; + surreal_upsert( + "bank_transaction", + &bank_transaction_id(&bank.uid, ordinal), + "bank transaction", + &record, + )?; + } + + Ok(()) + } + + fn delete(&self, id: &str) -> Result<(), String> { + surreal_delete_by_uid("bank_transaction", "bank transactions", id)?; + surreal_delete::("bank", id, "bank") + } + + fn exists(&self, id: &str) -> Result { + self.get_by_id(id).map(|bank| bank.is_some()) + } +} diff --git a/arma/server/extension/src/storage/common.rs b/arma/server/extension/src/storage/common.rs new file mode 100644 index 0000000..00aa0c8 --- /dev/null +++ b/arma/server/extension/src/storage/common.rs @@ -0,0 +1,153 @@ +use super::*; +use serde_json::Value as JsonValue; + +pub(super) fn surreal_select( + table: &'static str, + id: &str, + label: &str, +) -> Result, String> +where + T: DeserializeOwned, +{ + let id = id.to_string(); + RUNTIME.block_on(async move { + let value: Option = surreal::client() + .await? + .select((table, id.as_str())) + .await + .map_err(|error| format!("SurrealDB {} select failed: {}", label, error))?; + value + .map(|record| { + serde_json::from_value(record) + .map_err(|error| format!("SurrealDB {} decode failed: {}", label, error)) + }) + .transpose() + }) +} + +pub(super) fn surreal_select_all(table: &'static str, label: &str) -> Result, String> +where + T: DeserializeOwned, +{ + RUNTIME.block_on(async move { + let values: Vec = surreal::client() + .await? + .select(table) + .await + .map_err(|error| format!("SurrealDB {} select all failed: {}", label, error))?; + values + .into_iter() + .map(|record| { + serde_json::from_value(record) + .map_err(|error| format!("SurrealDB {} decode failed: {}", label, error)) + }) + .collect() + }) +} + +pub(super) fn surreal_upsert( + table: &'static str, + id: &str, + label: &str, + record: &T, +) -> Result<(), String> +where + T: Serialize + DeserializeOwned, +{ + let id = id.to_string(); + let record = serde_json::to_value(record) + .map_err(|error| format!("SurrealDB {} serialize failed: {}", label, error))?; + RUNTIME.block_on(async move { + let _: Option = surreal::client() + .await? + .upsert((table, id.as_str())) + .content(record) + .await + .map_err(|error| format!("SurrealDB {} upsert failed: {}", label, error))?; + Ok(()) + }) +} + +pub(super) fn surreal_delete(table: &'static str, id: &str, label: &str) -> Result<(), String> +where + T: DeserializeOwned, +{ + let id = id.to_string(); + RUNTIME.block_on(async move { + let _: Option = surreal::client() + .await? + .delete((table, id.as_str())) + .await + .map_err(|error| format!("SurrealDB {} delete failed: {}", label, error))?; + Ok(()) + }) +} + +pub(super) fn surreal_select_by_uid( + table: &'static str, + label: &str, + uid: &str, +) -> Result, String> +where + T: DeserializeOwned, +{ + surreal_select_by_field(table, label, "uid", uid) +} + +pub(super) fn surreal_select_by_field( + table: &'static str, + label: &str, + field: &'static str, + value: &str, +) -> Result, String> +where + T: DeserializeOwned, +{ + let value = value.to_string(); + RUNTIME.block_on(async move { + let mut response = surreal::client() + .await? + .query(format!("SELECT * FROM {} WHERE {} = $value", table, field)) + .bind(("value", value)) + .await + .map_err(|error| format!("SurrealDB {} select by field failed: {}", label, error))?; + let values: Vec = response + .take(0) + .map_err(|error| format!("SurrealDB {} select by field failed: {}", label, error))?; + values + .into_iter() + .map(|record| { + serde_json::from_value(record) + .map_err(|error| format!("SurrealDB {} decode failed: {}", label, error)) + }) + .collect() + }) +} + +pub(super) fn surreal_delete_by_uid( + table: &'static str, + label: &str, + uid: &str, +) -> Result<(), String> { + surreal_delete_by_field(table, label, "uid", uid) +} + +pub(super) fn surreal_delete_by_field( + table: &'static str, + label: &str, + field: &'static str, + value: &str, +) -> Result<(), String> { + let value = value.to_string(); + RUNTIME.block_on(async move { + surreal::client() + .await? + .query(format!("DELETE {} WHERE {} = $value", table, field)) + .bind(("value", value)) + .await + .map_err(|error| format!("SurrealDB {} delete by field failed: {}", label, error))? + .check() + .map_err(|error| format!("SurrealDB {} delete by field failed: {}", label, error))?; + Ok(()) + }) +} diff --git a/arma/server/extension/src/storage/garage.rs b/arma/server/extension/src/storage/garage.rs new file mode 100644 index 0000000..2680df1 --- /dev/null +++ b/arma/server/extension/src/storage/garage.rs @@ -0,0 +1,317 @@ +use super::common::*; +use super::*; + +pub enum GarageStorageRepository { + Surreal(SurrealGarageRepository), +} + +impl GarageStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealGarageRepository) + } +} + +impl GarageRepository for GarageStorageRepository { + fn create(&self, uid: &str, garage: &Garage) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(uid, garage), + } + } + + fn update(&self, uid: &str, garage: &Garage) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(uid, garage), + } + } + + fn get(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get(uid), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(uid), + } + } + + fn exists(&self, uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(uid), + } + } +} + +pub struct SurrealGarageRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct GarageOwnerRecord { + uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct GarageVehicleRecord { + uid: String, + plate: String, + classname: String, + fuel: f64, + damage: f64, + hit_points: HitPoints, +} + +fn garage_vehicle_id(uid: &str, plate: &str) -> String { + format!("{}:{}", uid, plate) +} + +fn garage_from_vehicle_records(records: Vec) -> Garage { + let vehicles = records + .into_iter() + .map(|record| { + let vehicle = Vehicle { + plate: record.plate.clone(), + classname: record.classname, + fuel: record.fuel, + damage: record.damage, + hit_points: record.hit_points, + }; + (record.plate, vehicle) + }) + .collect(); + + Garage { vehicles } +} + +impl GarageRepository for SurrealGarageRepository { + fn create(&self, uid: &str, garage: &Garage) -> Result<(), String> { + self.update(uid, garage) + } + + fn update(&self, uid: &str, garage: &Garage) -> Result<(), String> { + let owner = GarageOwnerRecord { + uid: uid.to_string(), + }; + surreal_upsert("garage", uid, "garage owner", &owner)?; + surreal_delete_by_uid("garage_vehicle", "garage vehicles", uid)?; + + for (plate_key, vehicle) in &garage.vehicles { + let plate = if vehicle.plate.trim().is_empty() { + plate_key.clone() + } else { + vehicle.plate.clone() + }; + let record = GarageVehicleRecord { + uid: uid.to_string(), + plate: plate.clone(), + classname: vehicle.classname.clone(), + fuel: vehicle.fuel, + damage: vehicle.damage, + hit_points: vehicle.hit_points.clone(), + }; + surreal_upsert( + "garage_vehicle", + &garage_vehicle_id(uid, &plate), + "garage vehicle", + &record, + )?; + } + + Ok(()) + } + + fn get(&self, uid: &str) -> Result, String> { + if surreal_select::("garage", uid, "garage owner")?.is_none() { + return Ok(None); + } + + let vehicle_records = + surreal_select_by_uid::("garage_vehicle", "garage vehicles", uid)?; + Ok(Some(garage_from_vehicle_records(vehicle_records))) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + surreal_delete_by_uid("garage_vehicle", "garage vehicles", uid)?; + surreal_delete::("garage", uid, "garage owner") + } + + fn exists(&self, uid: &str) -> Result { + surreal_select::("garage", uid, "garage owner") + .map(|garage| garage.is_some()) + } +} + +pub enum VGarageStorageRepository { + Surreal(SurrealVGarageRepository), +} + +impl VGarageStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealVGarageRepository) + } +} + +impl VGarageRepository for VGarageStorageRepository { + fn create(&self, uid: &str, garage: &VGarage) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(uid, garage), + } + } + + fn update(&self, uid: &str, garage: &VGarage) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(uid, garage), + } + } + + fn fetch(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.fetch(uid), + } + } + + fn get(&self, uid: &str, field: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get(uid, field), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(uid), + } + } + + fn exists(&self, uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(uid), + } + } +} + +pub struct SurrealVGarageRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct VGarageOwnerRecord { + uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct GarageUnlockRecord { + uid: String, + category: String, + classname: String, + #[serde(skip_serializing_if = "Option::is_none")] + source: Option, +} + +fn garage_unlock_id(uid: &str, category: &str, classname: &str) -> String { + format!("{}:{}:{}", uid, category, classname) +} + +fn push_garage_unlock(garage: &mut VGarage, category: &str, classname: String) { + let target = match category { + "cars" => &mut garage.cars, + "armor" => &mut garage.armor, + "helis" => &mut garage.helis, + "planes" => &mut garage.planes, + "naval" => &mut garage.naval, + "other" => &mut garage.other, + _ => return, + }; + + if !target.contains(&classname) { + target.push(classname); + } +} + +fn vgarage_from_unlock_records(records: Vec) -> VGarage { + let mut garage = VGarage { + cars: Vec::new(), + armor: Vec::new(), + helis: Vec::new(), + planes: Vec::new(), + naval: Vec::new(), + other: Vec::new(), + }; + + for record in records { + push_garage_unlock(&mut garage, &record.category, record.classname); + } + + garage +} + +fn upsert_garage_unlocks(uid: &str, category: &str, classnames: &[String]) -> Result<(), String> { + for classname in classnames { + let record = GarageUnlockRecord { + uid: uid.to_string(), + category: category.to_string(), + classname: classname.clone(), + source: None, + }; + surreal_upsert( + "garage_unlock", + &garage_unlock_id(uid, category, classname), + "garage unlock", + &record, + )?; + } + + Ok(()) +} + +impl VGarageRepository for SurrealVGarageRepository { + fn create(&self, uid: &str, garage: &VGarage) -> Result<(), String> { + self.update(uid, garage) + } + + fn update(&self, uid: &str, garage: &VGarage) -> Result<(), String> { + let owner = VGarageOwnerRecord { + uid: uid.to_string(), + }; + surreal_upsert("owned_garage", uid, "virtual garage owner", &owner)?; + surreal_delete_by_uid("garage_unlock", "garage unlocks", uid)?; + upsert_garage_unlocks(uid, "cars", &garage.cars)?; + upsert_garage_unlocks(uid, "armor", &garage.armor)?; + upsert_garage_unlocks(uid, "helis", &garage.helis)?; + upsert_garage_unlocks(uid, "planes", &garage.planes)?; + upsert_garage_unlocks(uid, "naval", &garage.naval)?; + upsert_garage_unlocks(uid, "other", &garage.other)?; + Ok(()) + } + + fn fetch(&self, uid: &str) -> Result, String> { + if surreal_select::("owned_garage", uid, "virtual garage owner")? + .is_none() + { + return Ok(None); + } + + let unlock_records = + surreal_select_by_uid::("garage_unlock", "garage unlocks", uid)?; + Ok(Some(vgarage_from_unlock_records(unlock_records))) + } + + fn get(&self, uid: &str, field: &str) -> Result, String> { + let garage = self.fetch(uid)?.unwrap_or_else(VGarage::new); + match field { + "cars" => Ok(garage.cars), + "armor" => Ok(garage.armor), + "helis" => Ok(garage.helis), + "planes" => Ok(garage.planes), + "naval" => Ok(garage.naval), + "other" => Ok(garage.other), + _ => Err(format!("Unknown virtual garage field '{}'", field)), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + surreal_delete_by_uid("garage_unlock", "garage unlocks", uid)?; + surreal_delete::("owned_garage", uid, "virtual garage owner") + } + + fn exists(&self, uid: &str) -> Result { + surreal_select::("owned_garage", uid, "virtual garage owner") + .map(|garage| garage.is_some()) + } +} diff --git a/arma/server/extension/src/storage/locker.rs b/arma/server/extension/src/storage/locker.rs new file mode 100644 index 0000000..a00d6b3 --- /dev/null +++ b/arma/server/extension/src/storage/locker.rs @@ -0,0 +1,298 @@ +use super::common::*; +use super::*; + +pub enum LockerStorageRepository { + Surreal(SurrealLockerRepository), +} + +impl LockerStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealLockerRepository) + } +} + +impl LockerRepository for LockerStorageRepository { + fn create(&self, uid: &str, locker: &Locker) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(uid, locker), + } + } + + fn update(&self, uid: &str, locker: &Locker) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(uid, locker), + } + } + + fn get(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get(uid), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(uid), + } + } + + fn exists(&self, uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(uid), + } + } +} + +pub struct SurrealLockerRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct LockerOwnerRecord { + uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct LockerItemRecord { + uid: String, + category: String, + classname: String, + amount: u32, +} + +fn locker_item_id(uid: &str, classname: &str) -> String { + format!("{}:{}", uid, classname) +} + +fn locker_from_item_records(records: Vec) -> Locker { + let items = records + .into_iter() + .map(|record| { + let item = Item { + category: record.category, + classname: record.classname.clone(), + amount: record.amount, + }; + (record.classname, item) + }) + .collect(); + + Locker { items } +} + +impl LockerRepository for SurrealLockerRepository { + fn create(&self, uid: &str, locker: &Locker) -> Result<(), String> { + self.update(uid, locker) + } + + fn update(&self, uid: &str, locker: &Locker) -> Result<(), String> { + let owner = LockerOwnerRecord { + uid: uid.to_string(), + }; + surreal_upsert("locker", uid, "locker owner", &owner)?; + surreal_delete_by_uid("locker_item", "locker items", uid)?; + + for item in locker.items.values() { + let record = LockerItemRecord { + uid: uid.to_string(), + category: item.category.clone(), + classname: item.classname.clone(), + amount: item.amount, + }; + surreal_upsert( + "locker_item", + &locker_item_id(uid, &item.classname), + "locker item", + &record, + )?; + } + + Ok(()) + } + + fn get(&self, uid: &str) -> Result, String> { + if surreal_select::("locker", uid, "locker owner")?.is_none() { + return Ok(None); + } + + let item_records = + surreal_select_by_uid::("locker_item", "locker items", uid)?; + Ok(Some(locker_from_item_records(item_records))) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + surreal_delete_by_uid("locker_item", "locker items", uid)?; + surreal_delete::("locker", uid, "locker owner") + } + + fn exists(&self, uid: &str) -> Result { + surreal_select::("locker", uid, "locker owner") + .map(|locker| locker.is_some()) + } +} + +pub enum VLockerStorageRepository { + Surreal(SurrealVLockerRepository), +} + +impl VLockerStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealVLockerRepository) + } +} + +impl VLockerRepository for VLockerStorageRepository { + fn create(&self, uid: &str, locker: &VLocker) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(uid, locker), + } + } + + fn update(&self, uid: &str, locker: &VLocker) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(uid, locker), + } + } + + fn fetch(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.fetch(uid), + } + } + + fn get(&self, uid: &str, field: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get(uid, field), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(uid), + } + } + + fn exists(&self, uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(uid), + } + } +} + +pub struct SurrealVLockerRepository; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct VLockerOwnerRecord { + uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct LockerUnlockRecord { + uid: String, + category: String, + classname: String, + #[serde(skip_serializing_if = "Option::is_none")] + source: Option, +} + +fn locker_unlock_id(uid: &str, category: &str, classname: &str) -> String { + format!("{}:{}:{}", uid, category, classname) +} + +fn push_locker_unlock(locker: &mut VLocker, category: &str, classname: String) { + let target = match category { + "items" => &mut locker.items, + "weapons" => &mut locker.weapons, + "magazines" => &mut locker.magazines, + "backpacks" => &mut locker.backpacks, + _ => return, + }; + + if !target.contains(&classname) { + target.push(classname); + } +} + +fn vlocker_from_unlock_records(records: Vec) -> VLocker { + let mut locker = VLocker { + items: Vec::new(), + weapons: Vec::new(), + magazines: Vec::new(), + backpacks: Vec::new(), + }; + + for record in records { + push_locker_unlock(&mut locker, &record.category, record.classname); + } + + locker +} + +fn upsert_locker_unlocks(uid: &str, category: &str, classnames: &[String]) -> Result<(), String> { + for classname in classnames { + let record = LockerUnlockRecord { + uid: uid.to_string(), + category: category.to_string(), + classname: classname.clone(), + source: None, + }; + surreal_upsert( + "locker_unlock", + &locker_unlock_id(uid, category, classname), + "locker unlock", + &record, + )?; + } + + Ok(()) +} + +impl VLockerRepository for SurrealVLockerRepository { + fn create(&self, uid: &str, locker: &VLocker) -> Result<(), String> { + self.update(uid, locker) + } + + fn update(&self, uid: &str, locker: &VLocker) -> Result<(), String> { + let owner = VLockerOwnerRecord { + uid: uid.to_string(), + }; + surreal_upsert("owned_locker", uid, "virtual locker owner", &owner)?; + surreal_delete_by_uid("locker_unlock", "locker unlocks", uid)?; + upsert_locker_unlocks(uid, "items", &locker.items)?; + upsert_locker_unlocks(uid, "weapons", &locker.weapons)?; + upsert_locker_unlocks(uid, "magazines", &locker.magazines)?; + upsert_locker_unlocks(uid, "backpacks", &locker.backpacks)?; + Ok(()) + } + + fn fetch(&self, uid: &str) -> Result, String> { + if surreal_select::("owned_locker", uid, "virtual locker owner")? + .is_none() + { + return Ok(None); + } + + let unlock_records = + surreal_select_by_uid::("locker_unlock", "locker unlocks", uid)?; + Ok(Some(vlocker_from_unlock_records(unlock_records))) + } + + fn get(&self, uid: &str, field: &str) -> Result, String> { + let locker = self.fetch(uid)?.unwrap_or_else(VLocker::new); + match field { + "items" => Ok(locker.items), + "weapons" => Ok(locker.weapons), + "magazines" => Ok(locker.magazines), + "backpacks" => Ok(locker.backpacks), + _ => Err(format!("Unknown virtual locker field '{}'", field)), + } + } + + fn delete(&self, uid: &str) -> Result<(), String> { + surreal_delete_by_uid("locker_unlock", "locker unlocks", uid)?; + surreal_delete::("owned_locker", uid, "virtual locker owner") + } + + fn exists(&self, uid: &str) -> Result { + surreal_select::("owned_locker", uid, "virtual locker owner") + .map(|locker| locker.is_some()) + } +} diff --git a/arma/server/extension/src/storage/org.rs b/arma/server/extension/src/storage/org.rs new file mode 100644 index 0000000..905c462 --- /dev/null +++ b/arma/server/extension/src/storage/org.rs @@ -0,0 +1,483 @@ +use super::common::*; +use super::*; + +pub enum OrgStorageRepository { + Surreal(SurrealOrgRepository), +} + +impl OrgStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealOrgRepository) + } +} + +impl OrgRepository for OrgStorageRepository { + fn create(&self, org: &Org) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.create(org), + } + } + + fn get_by_id(&self, id: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get_by_id(id), + } + } + + fn update(&self, org: &Org) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update(org), + } + } + + fn delete(&self, id: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.delete(id), + } + } + + fn exists(&self, id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.exists(id), + } + } + + fn add_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.add_member(org_id, member_uid), + } + } + + fn get_members(&self, org_id: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get_members(org_id), + } + } + + fn remove_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.remove_member(org_id, member_uid), + } + } + + fn get_assets( + &self, + org_id: &str, + ) -> Result>, String> { + match self { + Self::Surreal(repository) => repository.get_assets(org_id), + } + } + + fn update_assets( + &self, + org_id: &str, + assets: &HashMap>, + ) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update_assets(org_id, assets), + } + } + + fn get_fleet(&self, org_id: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.get_fleet(org_id), + } + } + + fn update_fleet( + &self, + org_id: &str, + fleet: &HashMap, + ) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.update_fleet(org_id, fleet), + } + } +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +struct SurrealOrgRecord { + #[serde(default)] + org_id: String, + #[serde(default)] + owner: String, + #[serde(default)] + name: String, + #[serde(default)] + funds: f64, + #[serde(default)] + reputation: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct OrgMemberRow { + org_id: String, + member_uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct OrgCreditLineRow { + org_id: String, + uid: String, + name: String, + approved_amount: f64, + available_amount: f64, + outstanding_principal: f64, + interest_rate: f64, + amount_due: f64, + amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct OrgAssetRow { + org_id: String, + category: String, + classname: String, + asset_type: String, + quantity: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct OrgFleetRow { + org_id: String, + fleet_key: String, + classname: String, + name: String, + fleet_type: String, + status: String, + damage: String, +} + +impl SurrealOrgRecord { + fn into_org(self, fallback_id: &str, credit_lines: HashMap) -> Org { + let id = if self.org_id.trim().is_empty() { + fallback_id.to_string() + } else { + self.org_id + }; + + let mut org = Org { + id, + owner: self.owner, + name: self.name, + funds: self.funds, + reputation: self.reputation, + credit_lines, + }; + org.normalize_credit_lines(); + org + } +} + +impl From<&Org> for SurrealOrgRecord { + fn from(org: &Org) -> Self { + Self { + org_id: org.id.clone(), + owner: org.owner.clone(), + name: org.name.clone(), + funds: org.funds, + reputation: org.reputation, + } + } +} + +pub struct SurrealOrgRepository; + +fn org_member_id(org_id: &str, member_uid: &str) -> String { + format!("{}:{}", org_id, member_uid) +} + +fn org_credit_line_id(org_id: &str, uid: &str) -> String { + format!("{}:{}", org_id, uid) +} + +fn org_asset_id(org_id: &str, category: &str, classname: &str) -> String { + format!("{}:{}:{}", org_id, category, classname) +} + +fn org_fleet_id(org_id: &str, fleet_key: &str) -> String { + format!("{}:{}", org_id, fleet_key) +} + +fn org_credit_lines_from_rows(rows: Vec) -> HashMap { + rows.into_iter() + .map(|row| { + let mut credit_line = CreditLineSummary { + uid: row.uid.clone(), + name: row.name, + approved_amount: row.approved_amount, + available_amount: row.available_amount, + outstanding_principal: row.outstanding_principal, + interest_rate: row.interest_rate, + amount_due: row.amount_due, + amount: row.amount, + }; + credit_line.normalize(); + (row.uid, credit_line) + }) + .collect() +} + +fn org_member_uids(org_id: &str) -> Result, String> { + let rows = + surreal_select_by_field::("org_member", "org members", "org_id", org_id)?; + let mut uids = rows + .into_iter() + .map(|row| row.member_uid) + .filter(|uid| !uid.trim().is_empty()) + .collect::>(); + uids.sort(); + uids.dedup(); + Ok(uids) +} + +fn upsert_org_member(org_id: &str, member_uid: &str) -> Result<(), String> { + let row = OrgMemberRow { + org_id: org_id.to_string(), + member_uid: member_uid.to_string(), + }; + surreal_upsert( + "org_member", + &org_member_id(org_id, member_uid), + "org member", + &row, + ) +} + +fn org_assets_from_rows(rows: Vec) -> HashMap> { + let mut assets = HashMap::new(); + for row in rows { + let category_assets = assets + .entry(row.category.clone()) + .or_insert_with(HashMap::new); + category_assets.insert( + row.classname.clone(), + OrgAssetEntry { + classname: row.classname, + asset_type: row.asset_type, + quantity: row.quantity, + }, + ); + } + assets +} + +fn org_fleet_from_rows(rows: Vec) -> HashMap { + rows.into_iter() + .map(|row| { + ( + row.fleet_key, + OrgFleetEntry { + classname: row.classname, + name: row.name, + fleet_type: row.fleet_type, + status: row.status, + damage: row.damage, + }, + ) + }) + .collect() +} + +impl OrgRepository for SurrealOrgRepository { + fn create(&self, org: &Org) -> Result<(), String> { + self.update(org) + } + + fn get_by_id(&self, id: &str) -> Result, String> { + let Some(record) = surreal_select::("org", id, "org")? else { + return Ok(None); + }; + + let credit_line_rows = surreal_select_by_field::( + "org_credit_line", + "org credit lines", + "org_id", + id, + )?; + let credit_lines = org_credit_lines_from_rows(credit_line_rows); + + Ok(Some(record.into_org(id, credit_lines))) + } + + fn update(&self, org: &Org) -> Result<(), String> { + let record = SurrealOrgRecord::from(org); + surreal_upsert("org", org.id.as_str(), "org", &record)?; + surreal_delete_by_field("org_credit_line", "org credit lines", "org_id", &org.id)?; + + for (uid, credit_line) in &org.credit_lines { + let resolved_uid = if credit_line.uid.trim().is_empty() { + uid.clone() + } else { + credit_line.uid.clone() + }; + let mut normalized = credit_line.clone(); + normalized.uid = resolved_uid.clone(); + normalized.normalize(); + let row = OrgCreditLineRow { + org_id: org.id.clone(), + uid: resolved_uid.clone(), + name: normalized.name, + approved_amount: normalized.approved_amount, + available_amount: normalized.available_amount, + outstanding_principal: normalized.outstanding_principal, + interest_rate: normalized.interest_rate, + amount_due: normalized.amount_due, + amount: normalized.amount, + }; + surreal_upsert( + "org_credit_line", + &org_credit_line_id(&org.id, &resolved_uid), + "org credit line", + &row, + )?; + } + + Ok(()) + } + + fn delete(&self, id: &str) -> Result<(), String> { + surreal_delete::("org", id, "org")?; + surreal_delete_by_field("org_member", "org members", "org_id", id)?; + surreal_delete_by_field("org_credit_line", "org credit lines", "org_id", id)?; + surreal_delete_by_field("org_asset", "org assets", "org_id", id)?; + surreal_delete_by_field("org_fleet_vehicle", "org fleet", "org_id", id) + } + + fn exists(&self, id: &str) -> Result { + self.get_by_id(id).map(|org| org.is_some()) + } + + fn add_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + if !self.exists(org_id)? { + return Err(format!("Organization {} does not exist", org_id)); + } + + let mut member_uids = org_member_uids(org_id)?; + if !member_uids.iter().any(|uid| uid == member_uid) { + member_uids.push(member_uid.to_string()); + } + surreal_delete_by_field("org_member", "org members", "org_id", org_id)?; + for uid in member_uids { + upsert_org_member(org_id, &uid)?; + } + Ok(()) + } + + fn get_members(&self, org_id: &str) -> Result, String> { + let member_uids = org_member_uids(org_id)?; + let mut members = Vec::with_capacity(member_uids.len()); + let actor_repository = SurrealActorRepository; + + for uid in member_uids { + if uid.trim().is_empty() { + continue; + } + + let name = match actor_repository.get_by_id(&uid)? { + Some(actor) => actor + .name + .filter(|name| !name.trim().is_empty()) + .unwrap_or_else(|| "Unknown".to_string()), + None => "Unknown".to_string(), + }; + + members.push(MemberSummary { uid, name }); + } + + Ok(members) + } + + fn remove_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + let mut member_uids = org_member_uids(org_id)?; + member_uids.retain(|uid| uid != member_uid); + surreal_delete_by_field("org_member", "org members", "org_id", org_id)?; + for uid in member_uids { + upsert_org_member(org_id, &uid)?; + } + Ok(()) + } + + fn get_assets( + &self, + org_id: &str, + ) -> Result>, String> { + let rows = + surreal_select_by_field::("org_asset", "org assets", "org_id", org_id)?; + Ok(org_assets_from_rows(rows)) + } + + fn update_assets( + &self, + org_id: &str, + assets: &HashMap>, + ) -> Result<(), String> { + surreal_delete_by_field("org_asset", "org assets", "org_id", org_id)?; + + for (category, category_assets) in assets { + for (classname, asset) in category_assets { + let row = OrgAssetRow { + org_id: org_id.to_string(), + category: category.clone(), + classname: if asset.classname.trim().is_empty() { + classname.clone() + } else { + asset.classname.clone() + }, + asset_type: asset.asset_type.clone(), + quantity: asset.quantity, + }; + surreal_upsert( + "org_asset", + &org_asset_id(org_id, category, &row.classname), + "org asset", + &row, + )?; + } + } + + Ok(()) + } + + fn get_fleet(&self, org_id: &str) -> Result, String> { + let rows = surreal_select_by_field::( + "org_fleet_vehicle", + "org fleet", + "org_id", + org_id, + )?; + if !rows.is_empty() { + return Ok(org_fleet_from_rows(rows)); + } + Ok(HashMap::new()) + } + + fn update_fleet( + &self, + org_id: &str, + fleet: &HashMap, + ) -> Result<(), String> { + surreal_delete_by_field("org_fleet_vehicle", "org fleet", "org_id", org_id)?; + + for (fleet_key, entry) in fleet { + let row = OrgFleetRow { + org_id: org_id.to_string(), + fleet_key: fleet_key.clone(), + classname: entry.classname.clone(), + name: entry.name.clone(), + fleet_type: entry.fleet_type.clone(), + status: entry.status.clone(), + damage: entry.damage.clone(), + }; + surreal_upsert( + "org_fleet_vehicle", + &org_fleet_id(org_id, fleet_key), + "org fleet", + &row, + )?; + } + + Ok(()) + } +} diff --git a/arma/server/extension/src/storage/phone.rs b/arma/server/extension/src/storage/phone.rs new file mode 100644 index 0000000..2c57e65 --- /dev/null +++ b/arma/server/extension/src/storage/phone.rs @@ -0,0 +1,516 @@ +use super::common::*; +use super::*; + +pub enum PhoneStorageRepository { + Surreal(SurrealPhoneRepository), +} + +impl PhoneStorageRepository { + pub fn configured() -> Self { + Self::Surreal(SurrealPhoneRepository) + } +} + +impl PhoneRepository for PhoneStorageRepository { + fn init(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.init(uid), + } + } + + fn add_contact(&self, uid: &str, contact_uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.add_contact(uid, contact_uid), + } + } + + fn remove_contact(&self, uid: &str, contact_uid: &str) -> Result { + match self { + Self::Surreal(repository) => repository.remove_contact(uid, contact_uid), + } + } + + fn list_contacts(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.list_contacts(uid), + } + } + + fn remove_phone(&self, uid: &str) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.remove_phone(uid), + } + } + + fn append_message(&self, uid: &str, message: PhoneMessage) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.append_message(uid, message), + } + } + + fn list_messages(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.list_messages(uid), + } + } + + fn mark_message_read(&self, uid: &str, message_id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.mark_message_read(uid, message_id), + } + } + + fn delete_message(&self, uid: &str, message_id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.delete_message(uid, message_id), + } + } + + fn append_email(&self, uid: &str, email: PhoneEmail) -> Result<(), String> { + match self { + Self::Surreal(repository) => repository.append_email(uid, email), + } + } + + fn list_emails(&self, uid: &str) -> Result, String> { + match self { + Self::Surreal(repository) => repository.list_emails(uid), + } + } + + fn mark_email_read(&self, uid: &str, email_id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.mark_email_read(uid, email_id), + } + } + + fn delete_email(&self, uid: &str, email_id: &str) -> Result { + match self { + Self::Surreal(repository) => repository.delete_email(uid, email_id), + } + } + + fn next_sequence(&self) -> Result { + match self { + Self::Surreal(repository) => repository.next_sequence(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneUserRecord { + uid: String, +} + +impl PhoneUserRecord { + fn new(uid: &str) -> Self { + Self { + uid: uid.to_string(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneContactRecord { + uid: String, + contact_uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneMessageIndexRecord { + uid: String, + message_id: String, + is_read: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneEmailIndexRecord { + uid: String, + email_id: String, + is_read: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneMessageRecord { + message_id: String, + from_uid: String, + to_uid: String, + message: String, + timestamp: f64, +} + +impl PhoneMessageRecord { + fn into_message(self, read: bool) -> PhoneMessage { + PhoneMessage { + id: self.message_id, + from: self.from_uid, + to: self.to_uid, + message: self.message, + timestamp: self.timestamp, + read, + } + } +} + +impl From<&PhoneMessage> for PhoneMessageRecord { + fn from(message: &PhoneMessage) -> Self { + Self { + message_id: message.id.clone(), + from_uid: message.from.clone(), + to_uid: message.to.clone(), + message: message.message.clone(), + timestamp: message.timestamp, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PhoneEmailRecord { + email_id: String, + from_uid: String, + to_uid: String, + subject: String, + body: String, + timestamp: f64, +} + +impl PhoneEmailRecord { + fn into_email(self, read: bool) -> PhoneEmail { + PhoneEmail { + id: self.email_id, + from: self.from_uid, + to: self.to_uid, + subject: self.subject, + body: self.body, + timestamp: self.timestamp, + read, + } + } +} + +impl From<&PhoneEmail> for PhoneEmailRecord { + fn from(email: &PhoneEmail) -> Self { + Self { + email_id: email.id.clone(), + from_uid: email.from.clone(), + to_uid: email.to.clone(), + subject: email.subject.clone(), + body: email.body.clone(), + timestamp: email.timestamp, + } + } +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +struct PhoneSequenceRecord { + #[serde(default)] + sequence_id: String, + #[serde(default)] + value: u64, +} + +pub struct SurrealPhoneRepository; + +impl SurrealPhoneRepository { + fn save_user(&self, uid: &str) -> Result<(), String> { + let record = PhoneUserRecord::new(uid); + surreal_upsert("phone_user", uid, "phone user", &record) + } + + fn message_is_referenced(&self, message_id: &str) -> Result { + Ok(!surreal_select_by_field::( + "phone_message_index", + "phone message indexes", + "message_id", + message_id, + )? + .is_empty()) + } + + fn email_is_referenced(&self, email_id: &str) -> Result { + Ok(!surreal_select_by_field::( + "phone_email_index", + "phone email indexes", + "email_id", + email_id, + )? + .is_empty()) + } + + fn cleanup_orphaned_records(&self) -> Result<(), String> { + let referenced_messages = surreal_select_all::( + "phone_message_index", + "phone message indexes", + )? + .into_iter() + .map(|record| record.message_id) + .collect::>(); + let referenced_emails = surreal_select_all::( + "phone_email_index", + "phone email indexes", + )? + .into_iter() + .map(|record| record.email_id) + .collect::>(); + + for record in surreal_select_all::("phone_message", "phone messages")? { + let message_id = record.message_id.trim(); + if !message_id.is_empty() && !referenced_messages.contains(message_id) { + surreal_delete::("phone_message", message_id, "phone message")?; + } + } + + for record in surreal_select_all::("phone_email", "phone emails")? { + let email_id = record.email_id.trim(); + if !email_id.is_empty() && !referenced_emails.contains(email_id) { + surreal_delete::("phone_email", email_id, "phone email")?; + } + } + + Ok(()) + } + + fn contact_id(uid: &str, contact_uid: &str) -> String { + format!("{}:{}", uid, contact_uid) + } + + fn message_index_id(uid: &str, message_id: &str) -> String { + format!("{}:{}", uid, message_id) + } + + fn email_index_id(uid: &str, email_id: &str) -> String { + format!("{}:{}", uid, email_id) + } +} + +impl PhoneRepository for SurrealPhoneRepository { + fn init(&self, uid: &str) -> Result<(), String> { + if surreal_select::("phone_user", uid, "phone user")?.is_none() { + self.save_user(uid)?; + } + self.cleanup_orphaned_records()?; + Ok(()) + } + + fn add_contact(&self, uid: &str, contact_uid: &str) -> Result { + self.save_user(uid)?; + let record = PhoneContactRecord { + uid: uid.to_string(), + contact_uid: contact_uid.to_string(), + }; + surreal_upsert( + "phone_contact", + &Self::contact_id(uid, contact_uid), + "phone contact", + &record, + )?; + Ok(true) + } + + fn remove_contact(&self, uid: &str, contact_uid: &str) -> Result { + let id = Self::contact_id(uid, contact_uid); + let exists = + surreal_select::("phone_contact", &id, "phone contact")?.is_some(); + if !exists { + return Ok(false); + } + + surreal_delete::("phone_contact", &id, "phone contact")?; + Ok(true) + } + + fn list_contacts(&self, uid: &str) -> Result, String> { + let mut contacts = + surreal_select_by_uid::("phone_contact", "phone contacts", uid)? + .into_iter() + .map(|record| record.contact_uid) + .collect::>(); + contacts.sort(); + contacts.dedup(); + Ok(contacts) + } + + fn remove_phone(&self, uid: &str) -> Result<(), String> { + surreal_delete_by_uid("phone_contact", "phone contacts", uid)?; + surreal_delete_by_uid("phone_message_index", "phone message indexes", uid)?; + surreal_delete_by_uid("phone_email_index", "phone email indexes", uid)?; + surreal_delete::("phone_user", uid, "phone user")?; + self.cleanup_orphaned_records() + } + + fn append_message(&self, uid: &str, message: PhoneMessage) -> Result<(), String> { + self.save_user(uid)?; + + let record = PhoneMessageRecord::from(&message); + surreal_upsert("phone_message", &message.id, "phone message", &record)?; + let index = PhoneMessageIndexRecord { + uid: uid.to_string(), + message_id: message.id.clone(), + is_read: message.from == uid, + }; + surreal_upsert( + "phone_message_index", + &Self::message_index_id(uid, &message.id), + "phone message index", + &index, + ) + } + + fn list_messages(&self, uid: &str) -> Result, String> { + let indexes = surreal_select_by_uid::( + "phone_message_index", + "phone message indexes", + uid, + )?; + let mut messages = Vec::with_capacity(indexes.len()); + + for index in indexes { + if index.message_id.trim().is_empty() { + continue; + } + + if let Some(record) = surreal_select::( + "phone_message", + &index.message_id, + "phone message", + )? { + messages.push(record.into_message(index.is_read)); + } + } + + messages.sort_by(|left, right| { + left.timestamp + .partial_cmp(&right.timestamp) + .unwrap_or(std::cmp::Ordering::Equal) + }); + Ok(messages) + } + + fn mark_message_read(&self, uid: &str, message_id: &str) -> Result { + let id = Self::message_index_id(uid, message_id); + let Some(mut index) = surreal_select::( + "phone_message_index", + &id, + "phone message index", + )? + else { + return Ok(false); + }; + + index.is_read = true; + surreal_upsert("phone_message_index", &id, "phone message index", &index)?; + Ok(true) + } + + fn delete_message(&self, uid: &str, message_id: &str) -> Result { + let id = Self::message_index_id(uid, message_id); + let exists = surreal_select::( + "phone_message_index", + &id, + "phone message index", + )? + .is_some(); + if !exists { + return Ok(false); + } + + surreal_delete::( + "phone_message_index", + &id, + "phone message index", + )?; + if !self.message_is_referenced(message_id)? { + surreal_delete::("phone_message", message_id, "phone message")?; + } + Ok(true) + } + + fn append_email(&self, uid: &str, email: PhoneEmail) -> Result<(), String> { + self.save_user(uid)?; + + let record = PhoneEmailRecord::from(&email); + surreal_upsert("phone_email", &email.id, "phone email", &record)?; + let index = PhoneEmailIndexRecord { + uid: uid.to_string(), + email_id: email.id.clone(), + is_read: false, + }; + surreal_upsert( + "phone_email_index", + &Self::email_index_id(uid, &email.id), + "phone email index", + &index, + ) + } + + fn list_emails(&self, uid: &str) -> Result, String> { + let indexes = surreal_select_by_uid::( + "phone_email_index", + "phone email indexes", + uid, + )?; + let mut emails = Vec::with_capacity(indexes.len()); + + for index in indexes { + if index.email_id.trim().is_empty() { + continue; + } + + if let Some(record) = + surreal_select::("phone_email", &index.email_id, "phone email")? + { + emails.push(record.into_email(index.is_read)); + } + } + + emails.sort_by(|left, right| { + right + .timestamp + .partial_cmp(&left.timestamp) + .unwrap_or(std::cmp::Ordering::Equal) + }); + Ok(emails) + } + + fn mark_email_read(&self, uid: &str, email_id: &str) -> Result { + let id = Self::email_index_id(uid, email_id); + let Some(mut index) = + surreal_select::("phone_email_index", &id, "phone email index")? + else { + return Ok(false); + }; + + index.is_read = true; + surreal_upsert("phone_email_index", &id, "phone email index", &index)?; + Ok(true) + } + + fn delete_email(&self, uid: &str, email_id: &str) -> Result { + let id = Self::email_index_id(uid, email_id); + let exists = + surreal_select::("phone_email_index", &id, "phone email index")? + .is_some(); + if !exists { + return Ok(false); + } + + surreal_delete::("phone_email_index", &id, "phone email index")?; + if !self.email_is_referenced(email_id)? { + surreal_delete::("phone_email", email_id, "phone email")?; + } + Ok(true) + } + + fn next_sequence(&self) -> Result { + let mut record = + surreal_select::("phone_sequence", "global", "phone sequence")? + .unwrap_or_default(); + record.sequence_id = "global".to_string(); + record.value = record + .value + .checked_add(1) + .ok_or_else(|| "Phone sequence overflowed.".to_string())?; + surreal_upsert("phone_sequence", "global", "phone sequence", &record)?; + Ok(record.value) + } +} diff --git a/arma/server/extension/src/store.rs b/arma/server/extension/src/store.rs new file mode 100644 index 0000000..7842ca7 --- /dev/null +++ b/arma/server/extension/src/store.rs @@ -0,0 +1,37 @@ +use arma_rs::Group; +use forge_models::{StoreCheckoutContext, StoreCheckoutResult}; +use forge_services::StoreService; + +pub fn group() -> Group { + Group::new().command("checkout", checkout) +} + +fn serialize_result(result: &StoreCheckoutResult) -> String { + match serde_json::to_string(result) { + Ok(json) => json, + Err(error) => format!( + "Error: Failed to serialize store checkout result: {}", + error + ), + } +} + +pub fn checkout(json_data: String) -> String { + let context: StoreCheckoutContext = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid store checkout JSON: {}", error), + }; + + let service = StoreService::new( + crate::bank::hot_service(), + crate::org::hot_service(), + crate::locker::hot_service(), + crate::v_locker::hot_service(), + crate::v_garage::hot_service(), + ); + + match service.checkout(context) { + Ok(result) => serialize_result(&result), + Err(error) => format!("Error: {}", error), + } +} diff --git a/arma/server/extension/src/surreal.rs b/arma/server/extension/src/surreal.rs new file mode 100644 index 0000000..527cebb --- /dev/null +++ b/arma/server/extension/src/surreal.rs @@ -0,0 +1,184 @@ +//! SurrealDB connection bootstrap for persistent storage. + +use arma_rs::Group; +use std::sync::{LazyLock, OnceLock, RwLock as StdRwLock}; +use surrealdb::Surreal; +use surrealdb::engine::remote::http::{Client, Http}; +use surrealdb::opt::auth::Root; +use tokio::time::{Duration, sleep, timeout}; + +use crate::config::SurrealConfig; +use crate::log; +use crate::schema; + +pub type SurrealDb = Surreal; + +const CLIENT_READY_TIMEOUT: Duration = Duration::from_secs(30); +const CLIENT_READY_POLL_INTERVAL: Duration = Duration::from_millis(25); + +static SURREAL_DB: OnceLock = OnceLock::new(); +static SURREAL_CONNECTION_STATE: LazyLock> = + LazyLock::new(|| StdRwLock::new(SurrealConnectionState::Disabled)); +static SURREAL_FAILURE_REASON: LazyLock>> = + LazyLock::new(|| StdRwLock::new(None)); + +#[derive(Clone, Copy, PartialEq, Eq)] +enum SurrealConnectionState { + Disabled, + Initializing, + Connected, + Failed, +} + +pub fn prepare() { + *SURREAL_FAILURE_REASON.write().unwrap() = None; + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Initializing; +} + +pub async fn initialize(config: SurrealConfig) { + prepare(); + + log::log( + "surreal", + "INFO", + &format!( + "Connecting to SurrealDB endpoint '{}' namespace '{}' database '{}'", + config.endpoint, config.namespace, config.database + ), + ); + + let timeout_duration = Duration::from_millis(config.connect_timeout_ms.unwrap_or(5000)); + let connection = timeout(timeout_duration, connect(config)).await; + + let db = match connection { + Err(_) => { + log::log( + "surreal", + "ERROR", + &format!( + "SurrealDB connection timed out after {} ms", + timeout_duration.as_millis() + ), + ); + set_failure_reason(format!( + "SurrealDB connection timed out after {} ms", + timeout_duration.as_millis() + )); + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Failed; + return; + } + Ok(Ok(db)) => db, + Ok(Err(error)) => { + log::log( + "surreal", + "ERROR", + &format!("Failed to connect to SurrealDB: {}", error), + ); + set_failure_reason(error); + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Failed; + return; + } + }; + + log::log("surreal", "DEBUG", "Applying SurrealDB schemas"); + if let Err(error) = schema::apply_all(&db).await { + log::log( + "surreal", + "ERROR", + &format!("Failed to apply SurrealDB schemas: {}", error), + ); + set_failure_reason(error); + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Failed; + return; + } + + if SURREAL_DB.set(db).is_ok() { + log::log("surreal", "INFO", "Connected to SurrealDB server"); + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Connected; + } else { + log::log("surreal", "ERROR", "Failed to set SurrealDB client"); + set_failure_reason("Failed to set SurrealDB client".to_string()); + *SURREAL_CONNECTION_STATE.write().unwrap() = SurrealConnectionState::Failed; + } +} + +fn set_failure_reason(reason: String) { + *SURREAL_FAILURE_REASON.write().unwrap() = Some(reason); +} + +fn failure_reason() -> String { + SURREAL_FAILURE_REASON + .read() + .unwrap() + .clone() + .unwrap_or_else(|| "unknown failure".to_string()) +} + +async fn connect(config: SurrealConfig) -> Result { + let db = Surreal::new::(config.endpoint.as_str()) + .await + .map_err(|error| error.to_string())?; + + if let (Some(username), Some(password)) = (&config.username, &config.password) { + db.signin(Root { + username: username.clone(), + password: password.clone(), + }) + .await + .map_err(|error| error.to_string())?; + } + + db.use_ns(config.namespace.as_str()) + .use_db(config.database.as_str()) + .await + .map_err(|error| error.to_string())?; + + Ok(db) +} + +pub async fn client() -> Result<&'static SurrealDb, String> { + if let Some(db) = SURREAL_DB.get() { + return Ok(db); + } + + timeout(CLIENT_READY_TIMEOUT, wait_for_client()) + .await + .unwrap_or_else(|_| { + Err("SurrealDB connection did not become ready before timeout".to_string()) + }) +} + +async fn wait_for_client() -> Result<&'static SurrealDb, String> { + loop { + if let Some(db) = SURREAL_DB.get() { + return Ok(db); + } + + let state = *SURREAL_CONNECTION_STATE.read().unwrap(); + match state { + SurrealConnectionState::Disabled => { + return Err("SurrealDB connection is disabled".to_string()); + } + SurrealConnectionState::Failed => { + return Err(format!("SurrealDB connection failed: {}", failure_reason())); + } + SurrealConnectionState::Initializing | SurrealConnectionState::Connected => { + sleep(CLIENT_READY_POLL_INTERVAL).await; + } + } + } +} + +pub fn status() -> String { + let state = *SURREAL_CONNECTION_STATE.read().unwrap(); + match state { + SurrealConnectionState::Disabled => "disabled".to_string(), + SurrealConnectionState::Initializing => "initializing".to_string(), + SurrealConnectionState::Connected => "connected".to_string(), + SurrealConnectionState::Failed => "failed".to_string(), + } +} + +pub fn group() -> Group { + Group::new().command("status", status) +} diff --git a/arma/server/extension/src/task.rs b/arma/server/extension/src/task.rs new file mode 100644 index 0000000..fbe2e40 --- /dev/null +++ b/arma/server/extension/src/task.rs @@ -0,0 +1,126 @@ +//! Task hot-state operations for the Arma 3 server extension. +//! +//! The extension owns portable task metadata while SQF keeps Arma-only runtime +//! state such as entity references and participant tracking. +//! +//! This state is intentionally transient and is reset during server task-store +//! initialization so tasks start clean for each server or mission lifecycle. + +use arma_rs::Group; +use forge_repositories::InMemoryTaskRepository; +use forge_services::TaskStateService; +use serde::Serialize; +use std::sync::LazyLock; + +static TASK_SERVICE: LazyLock> = + LazyLock::new(|| TaskStateService::new(InMemoryTaskRepository::new())); + +pub fn group() -> Group { + Group::new() + .command("reset", reset) + .group( + "catalog", + Group::new() + .command("active", list_active_catalog) + .command("get", get_catalog_entry) + .command("upsert", upsert_catalog_entry) + .command("delete", delete_catalog_entry), + ) + .group( + "ownership", + Group::new() + .command("bind", bind_ownership) + .command("release", release_ownership) + .command("accept", accept_task) + .command("reward_context", reward_context), + ) + .group( + "status", + Group::new() + .command("set", set_status) + .command("get", get_status) + .command("clear", clear_status), + ) + .group( + "defuse", + Group::new() + .command("increment", increment_defuse_count) + .command("get", get_defuse_count), + ) + .command("clear", clear_task) +} + +pub(crate) fn list_active_catalog() -> String { + serialize_json(TASK_SERVICE.list_active_catalog()) +} + +pub(crate) fn reset() -> String { + serialize_json(TASK_SERVICE.reset()) +} + +pub(crate) fn get_catalog_entry(entry_id: String) -> String { + serialize_json(TASK_SERVICE.get_catalog_entry(entry_id)) +} + +pub(crate) fn upsert_catalog_entry(entry_id: String, json_data: String) -> String { + serialize_json(TASK_SERVICE.upsert_catalog_entry(entry_id, json_data)) +} + +pub(crate) fn delete_catalog_entry(entry_id: String) -> String { + serialize_ok(TASK_SERVICE.delete_catalog_entry(entry_id)) +} + +pub(crate) fn bind_ownership(entry_id: String, json_data: String) -> String { + serialize_json(TASK_SERVICE.bind_ownership(entry_id, json_data)) +} + +pub(crate) fn release_ownership(entry_id: String) -> String { + serialize_json(TASK_SERVICE.release_ownership(entry_id)) +} + +pub(crate) fn accept_task(entry_id: String, json_data: String) -> String { + serialize_json(TASK_SERVICE.accept_task(entry_id, json_data)) +} + +pub(crate) fn reward_context(entry_id: String) -> String { + serialize_json(TASK_SERVICE.get_reward_context(entry_id)) +} + +pub(crate) fn set_status(entry_id: String, status: String) -> String { + serialize_json(TASK_SERVICE.set_status(entry_id, status)) +} + +pub(crate) fn get_status(entry_id: String) -> String { + serialize_json(TASK_SERVICE.get_status(entry_id)) +} + +pub(crate) fn clear_status(entry_id: String) -> String { + serialize_json(TASK_SERVICE.clear_status(entry_id)) +} + +pub(crate) fn increment_defuse_count(entry_id: String) -> String { + serialize_json(TASK_SERVICE.increment_defuse_count(entry_id)) +} + +pub(crate) fn get_defuse_count(entry_id: String) -> String { + serialize_json(TASK_SERVICE.get_defuse_count(entry_id)) +} + +pub(crate) fn clear_task(entry_id: String) -> String { + serialize_json(TASK_SERVICE.clear_task(entry_id)) +} + +fn serialize_json(result: Result) -> String { + match result { + Ok(value) => serde_json::to_string(&value) + .unwrap_or_else(|error| format!("Error: Failed to serialize task state: {error}")), + Err(error) => format!("Error: {error}"), + } +} + +fn serialize_ok(result: Result<(), String>) -> String { + match result { + Ok(()) => "true".to_string(), + Err(error) => format!("Error: {error}"), + } +} diff --git a/arma/server/extension/src/terrain.rs b/arma/server/extension/src/terrain.rs new file mode 100644 index 0000000..675ee63 --- /dev/null +++ b/arma/server/extension/src/terrain.rs @@ -0,0 +1,175 @@ +//! Terrain SVG export functionality via FFI to external C++ library. +//! +//! Provides commands to export terrain data to SVG format with various +//! rendering options (location names, grid, contour lines, etc.). + +use arma_rs::Group; + +#[cfg(target_os = "windows")] +mod windows_ffi { + use std::os::raw::{c_char, c_void}; + + #[link(name = "kernel32")] + unsafe extern "system" { + pub(super) fn GetModuleHandleA(lpModuleName: *const u8) -> *mut c_void; + pub(super) fn GetProcAddress(hModule: *mut c_void, lpProcName: *const u8) -> *mut c_void; + } + + pub(super) const EXPORT_SVG_PROC_NAME: &[u8] = b"?ExportSVG@@YAXPEBD_N11111@Z\0"; + + pub(super) type FnExportSVG = + extern "system" fn(*const c_char, bool, bool, bool, bool, bool, bool) -> *const c_void; +} + +/// Creates the Arma 3 command group for the terrain module. +/// +/// Registers the `exportSVG` command with the Arma 3 extension. +pub fn group() -> Group { + Group::new().command("exportSVG", export_svg) +} + +/// Exports terrain data to an SVG file with configurable rendering options. +/// +/// # Parameters +/// - `file_path`: Output SVG file path +/// - `draw_location_names`: Include location/place names +/// - `draw_grid`: Include grid overlay +/// - `draw_contourlines`: Include elevation contour lines +/// - `draw_tree_objects`: Include vegetation/tree objects +/// - `draw_mountain_heightpoints`: Include mountain peak elevation markers +/// - `simple_roads`: Use simplified road rendering +/// +/// # Returns +/// - `Ok(())` on success +/// - `Err(String)` with error message on failure +#[cfg(target_os = "windows")] +pub fn export_terrain_svg( + file_path: String, + draw_location_names: bool, + draw_grid: bool, + draw_contourlines: bool, + draw_tree_objects: bool, + draw_mountain_heightpoints: bool, + simple_roads: bool, +) -> Result<(), String> { + unsafe { + use windows_ffi::*; + + let module = GetModuleHandleA(std::ptr::null()); + if module.is_null() { + return Err("Failed to get game engine module handle".to_string()); + } + + let export_svg_proc = GetProcAddress(module, EXPORT_SVG_PROC_NAME.as_ptr()); + if export_svg_proc.is_null() { + return Err("Failed to find ExportSVG function in game engine".to_string()); + } + + let export_svg: FnExportSVG = std::mem::transmute(export_svg_proc); + let file_path_cstr = + std::ffi::CString::new(file_path).map_err(|e| format!("Invalid file path: {}", e))?; + + export_svg( + file_path_cstr.as_ptr(), + draw_location_names, + draw_grid, + draw_contourlines, + draw_tree_objects, + draw_mountain_heightpoints, + simple_roads, + ); + + Ok(()) + } +} + +#[cfg(not(target_os = "windows"))] +pub fn export_terrain_svg( + _file_path: String, + _draw_location_names: bool, + _draw_grid: bool, + _draw_contourlines: bool, + _draw_tree_objects: bool, + _draw_mountain_heightpoints: bool, + _simple_roads: bool, +) -> Result<(), String> { + Err("Terrain SVG export is only available on Windows".to_string()) +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExportSvgOptions { + file_path: String, + #[serde(default)] + draw_location_names: bool, + #[serde(default)] + draw_grid: bool, + #[serde(default)] + draw_contourlines: bool, + #[serde(default)] + draw_tree_objects: bool, + #[serde(default)] + draw_mountain_heightpoints: bool, + #[serde(default)] + simple_roads: bool, +} + +/// Arma command handler for terrain SVG export. +/// +/// # SQF Usage +/// ```sqf +/// // Register callback handler (optional, for async result) +/// ["terrain:exportSVG", { +/// params ["_response"]; +/// systemChat format ["Export %1: %2", +/// _response get "status", +/// _response get "message" +/// ]; +/// }] call forge_x_extension_fnc_setHandler; +/// +/// // Create options and call extension +/// private _options = createHashMapFromArray [ +/// ["filePath", "C:\terrain.svg"], +/// ["drawLocationNames", true], +/// ["drawGrid", true], +/// ["drawContourlines", true], +/// ["drawTreeObjects", false], +/// ["drawMountainHeightpoints", true], +/// ["simpleRoads", false] +/// ]; +/// +/// ["terrain:exportSVG", [toJSON _options]] call forge_x_extension_fnc_extCall; +/// ``` +fn export_svg(options_json: String) -> String { + let options: ExportSvgOptions = match serde_json::from_str(&options_json) { + Ok(opts) => opts, + Err(e) => { + return serde_json::json!({ + "status": "error", + "message": format!("Invalid JSON options: {}", e) + }) + .to_string(); + } + }; + + match export_terrain_svg( + options.file_path, + options.draw_location_names, + options.draw_grid, + options.draw_contourlines, + options.draw_tree_objects, + options.draw_mountain_heightpoints, + options.simple_roads, + ) { + Ok(_) => serde_json::json!({ + "status": "success", + "message": "Terrain exported successfully" + }) + .to_string(), + Err(e) => serde_json::json!({ + "status": "error", + "message": e + }) + .to_string(), + } +} diff --git a/arma/server/extension/src/transport.rs b/arma/server/extension/src/transport.rs new file mode 100644 index 0000000..1289234 --- /dev/null +++ b/arma/server/extension/src/transport.rs @@ -0,0 +1,196 @@ +//! Shared transport helpers for oversized extension requests and responses. +//! +//! This module provides a routed invoke path that accepts JSON-encoded string +//! arguments, supports request staging for large payloads, and stores oversized +//! responses in memory for chunked retrieval by SQF. + +use arma_rs::{CallContext, Group}; +use serde::Serialize; +use std::collections::HashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{LazyLock, Mutex as StdMutex}; + +mod routes; + +use routes::route_command; + +const CHUNK_PREFIX: &str = "FORGE_TRANSPORT_CHUNK:"; +const RESPONSE_CHUNK_SIZE: usize = 12_000; + +static REQUEST_STORE: LazyLock>> = + LazyLock::new(|| StdMutex::new(HashMap::new())); +static RESPONSE_STORE: LazyLock>>> = + LazyLock::new(|| StdMutex::new(HashMap::new())); +static TRANSFER_SEQUENCE: AtomicU64 = AtomicU64::new(1); + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct ChunkEnvelope { + transfer_id: String, + chunk_count: usize, + total_size: usize, +} + +pub fn group() -> Group { + Group::new() + .command("invoke", invoke) + .command("invoke_stored", invoke_stored) + .group( + "request", + Group::new() + .command("append", append_request_chunk) + .command("clear", clear_request_chunks), + ) + .group( + "response", + Group::new() + .command("get", get_response_chunk) + .command("clear", clear_response_chunks), + ) +} + +fn append_request_chunk(transfer_id: String, chunk: String) -> String { + let mut store = REQUEST_STORE.lock().unwrap(); + store.entry(transfer_id).or_default().push_str(&chunk); + "OK".to_string() +} + +fn clear_request_chunks(transfer_id: String) -> String { + REQUEST_STORE.lock().unwrap().remove(&transfer_id); + "OK".to_string() +} + +fn get_response_chunk(transfer_id: String, index: String) -> String { + let chunk_index = match index.parse::() { + Ok(value) => value, + Err(error) => return format!("Error: Invalid response chunk index: {error}"), + }; + + let store = RESPONSE_STORE.lock().unwrap(); + let Some(chunks) = store.get(&transfer_id) else { + return format!("Error: Response transfer '{transfer_id}' was not found"); + }; + + chunks.get(chunk_index).cloned().unwrap_or_else(|| { + format!( + "Error: Response chunk {} was not found for '{}'", + chunk_index, transfer_id + ) + }) +} + +fn clear_response_chunks(transfer_id: String) -> String { + RESPONSE_STORE.lock().unwrap().remove(&transfer_id); + "OK".to_string() +} + +fn invoke(call_context: CallContext, function_name: String, arguments_json: String) -> String { + invoke_internal(call_context, function_name, arguments_json) +} + +fn invoke_stored(call_context: CallContext, function_name: String, transfer_id: String) -> String { + let Some(arguments_json) = REQUEST_STORE.lock().unwrap().remove(&transfer_id) else { + return format!("Error: Request transfer '{transfer_id}' was not found"); + }; + + invoke_internal(call_context, function_name, arguments_json) +} + +fn invoke_internal( + call_context: CallContext, + function_name: String, + arguments_json: String, +) -> String { + let arguments: Vec = match parse_transport_arguments(&arguments_json) { + Ok(value) => value, + Err(error) => return format!("Error: Invalid transport arguments JSON: {error}"), + }; + + let result = match route_command(call_context, &function_name, arguments) { + Ok(value) => value, + Err(error) => format!("Error: {error}"), + }; + + chunk_response_if_needed(result) +} + +fn parse_transport_arguments(arguments_json: &str) -> Result, String> { + let value: serde_json::Value = + serde_json::from_str(arguments_json).map_err(|error| error.to_string())?; + parse_transport_argument_value(value) +} + +fn parse_transport_argument_value(value: serde_json::Value) -> Result, String> { + match value { + serde_json::Value::Array(values) => Ok(values + .into_iter() + .map(|entry| match entry { + serde_json::Value::String(string_value) => string_value, + other => other.to_string(), + }) + .collect()), + serde_json::Value::String(value) => { + let trimmed = value.trim(); + if (trimmed.starts_with('[') || trimmed.starts_with('{') || trimmed.eq("null")) + && let Ok(nested_value) = serde_json::from_str::(trimmed) + { + return parse_transport_argument_value(nested_value); + } + + Ok(vec![value]) + } + serde_json::Value::Null => Ok(Vec::new()), + other => Err(format!("expected string or array but received {}", other)), + } +} + +fn chunk_response_if_needed(result: String) -> String { + if result.len() <= RESPONSE_CHUNK_SIZE { + return result; + } + + let transfer_id = next_transfer_id("rsp"); + let chunks = split_string_chunks(&result, RESPONSE_CHUNK_SIZE); + let envelope = ChunkEnvelope { + transfer_id: transfer_id.clone(), + chunk_count: chunks.len(), + total_size: result.len(), + }; + + RESPONSE_STORE.lock().unwrap().insert(transfer_id, chunks); + + format!( + "{CHUNK_PREFIX}{}", + serde_json::to_string(&envelope) + .unwrap_or_else(|error| format!("{{\"error\":\"{error}\"}}")) + ) +} + +fn next_transfer_id(prefix: &str) -> String { + let sequence = TRANSFER_SEQUENCE.fetch_add(1, Ordering::Relaxed); + format!("{prefix}_{sequence}") +} + +fn split_string_chunks(input: &str, max_bytes: usize) -> Vec { + if input.is_empty() { + return vec![String::new()]; + } + + let mut chunks = Vec::new(); + let mut chunk_start = 0usize; + let mut chunk_len = 0usize; + + for (index, character) in input.char_indices() { + let char_len = character.len_utf8(); + if chunk_len > 0 && chunk_len + char_len > max_bytes { + chunks.push(input[chunk_start..index].to_string()); + chunk_start = index; + chunk_len = 0; + } + + chunk_len += char_len; + } + + chunks.push(input[chunk_start..].to_string()); + chunks +} diff --git a/arma/server/extension/src/transport/routes.rs b/arma/server/extension/src/transport/routes.rs new file mode 100644 index 0000000..1462286 --- /dev/null +++ b/arma/server/extension/src/transport/routes.rs @@ -0,0 +1,74 @@ +use arma_rs::CallContext; + +mod actor; +mod bank; +mod cad; +mod garage; +mod locker; +mod org; +mod phone; +mod store; +mod v_garage; +mod v_locker; + +const UNSUPPORTED_ROUTE_PREFIX: &str = "Unsupported transport route"; + +pub(super) fn route_command( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + if function_name.starts_with("actor:") { + return actor::route(call_context, function_name, arguments); + } + if function_name.starts_with("bank:") { + return bank::route(call_context, function_name, arguments); + } + if function_name.starts_with("org:") { + return org::route(call_context, function_name, arguments); + } + if function_name == "store:checkout" { + return store::route(call_context, function_name, arguments); + } + if function_name.starts_with("garage:") { + return garage::route(call_context, function_name, arguments); + } + if function_name.starts_with("locker:") { + return locker::route(call_context, function_name, arguments); + } + if function_name.starts_with("owned:garage:") { + return v_garage::route(call_context, function_name, arguments); + } + if function_name.starts_with("owned:locker:") { + return v_locker::route(call_context, function_name, arguments); + } + if function_name.starts_with("cad:") { + return cad::route(call_context, function_name, arguments); + } + if function_name.starts_with("phone:") { + return phone::route(call_context, function_name, arguments); + } + + Err(unsupported_route(function_name)) +} + +pub(super) fn expect_arg_count( + function_name: &str, + arguments: &[String], + expected_count: usize, +) -> Result<(), String> { + if arguments.len() == expected_count { + return Ok(()); + } + + Err(format!( + "Transport route '{}' expected {} arguments but received {}", + function_name, + expected_count, + arguments.len() + )) +} + +pub(super) fn unsupported_route(function_name: &str) -> String { + format!("{UNSUPPORTED_ROUTE_PREFIX} for function '{function_name}'") +} diff --git a/arma/server/extension/src/transport/routes/actor.rs b/arma/server/extension/src/transport/routes/actor.rs new file mode 100644 index 0000000..93a6e28 --- /dev/null +++ b/arma/server/extension/src/transport/routes/actor.rs @@ -0,0 +1,72 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::actor; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "actor:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::get_actor(call_context, arguments[0].clone())) + } + "actor:create" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(actor::create_actor( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "actor:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(actor::update_actor( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "actor:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::actor_exists(call_context, arguments[0].clone())) + } + "actor:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::delete_actor(call_context, arguments[0].clone())) + } + "actor:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::init_hot_actor(call_context, arguments[0].clone())) + } + "actor:hot:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::get_hot_actor(call_context, arguments[0].clone())) + } + "actor:hot:keys" => { + expect_arg_count(function_name, &arguments, 0)?; + Ok(actor::list_hot_actor_keys()) + } + "actor:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(actor::override_hot_actor( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "actor:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::save_hot_actor(call_context, arguments[0].clone())) + } + "actor:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(actor::remove_hot_actor(call_context, arguments[0].clone())) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/bank.rs b/arma/server/extension/src/transport/routes/bank.rs new file mode 100644 index 0000000..9155fb5 --- /dev/null +++ b/arma/server/extension/src/transport/routes/bank.rs @@ -0,0 +1,141 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::bank; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "bank:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::get_bank(call_context, arguments[0].clone())) + } + "bank:create" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(bank::create_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "bank:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(bank::update_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "bank:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::bank_exists(call_context, arguments[0].clone())) + } + "bank:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::delete_bank(call_context, arguments[0].clone())) + } + "bank:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::init_hot_bank(call_context, arguments[0].clone())) + } + "bank:hot:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::get_hot_bank(call_context, arguments[0].clone())) + } + "bank:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(bank::override_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "bank:hot:patch" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(bank::patch_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "bank:hot:charge_checkout" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(bank::charge_checkout_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "bank:hot:deposit" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(bank::deposit_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "bank:hot:withdraw" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(bank::withdraw_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "bank:hot:deposit_earnings" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(bank::deposit_earnings_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "bank:hot:transfer" => { + expect_arg_count(function_name, &arguments, 4)?; + Ok(bank::transfer_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + arguments[3].clone(), + )) + } + "bank:hot:validate_pin" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(bank::validate_pin_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "bank:hot:change_pin" => { + expect_arg_count(function_name, &arguments, 4)?; + Ok(bank::change_pin_hot_bank( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + arguments[3].clone(), + )) + } + "bank:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::save_hot_bank(call_context, arguments[0].clone())) + } + "bank:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(bank::remove_hot_bank(call_context, arguments[0].clone())) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/cad.rs b/arma/server/extension/src/transport/routes/cad.rs new file mode 100644 index 0000000..e9668ef --- /dev/null +++ b/arma/server/extension/src/transport/routes/cad.rs @@ -0,0 +1,141 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::cad; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "cad:activity:append" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::append_activity(arguments[0].clone())) + } + "cad:activity:recent" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::recent_activity(arguments[0].clone())) + } + "cad:assignments:list" => { + expect_arg_count(function_name, &arguments, 0)?; + Ok(cad::list_assignments()) + } + "cad:assignments:assign" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::assign_assignment( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:assignments:acknowledge" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::acknowledge_assignment( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:assignments:decline" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::decline_assignment( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:assignments:upsert" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::upsert_assignment( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:assignments:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::delete_assignment(arguments[0].clone())) + } + "cad:orders:list" => { + expect_arg_count(function_name, &arguments, 0)?; + Ok(cad::list_orders()) + } + "cad:orders:create" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::create_order(arguments[0].clone())) + } + "cad:orders:create_from_context" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::create_order_from_context(arguments[0].clone())) + } + "cad:orders:close" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::close_order(arguments[0].clone())) + } + "cad:orders:upsert" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::upsert_order( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:orders:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::delete_order(arguments[0].clone())) + } + "cad:requests:list" => { + expect_arg_count(function_name, &arguments, 0)?; + Ok(cad::list_requests()) + } + "cad:requests:submit" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::submit_request(arguments[0].clone())) + } + "cad:requests:submit_from_context" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::submit_request_from_context(arguments[0].clone())) + } + "cad:requests:close" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::close_request(arguments[0].clone())) + } + "cad:requests:upsert" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::upsert_request( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:requests:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::delete_request(arguments[0].clone())) + } + "cad:profiles:list" => { + expect_arg_count(function_name, &arguments, 0)?; + Ok(cad::list_profiles()) + } + "cad:profiles:update_from_context" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::update_profile_from_context(arguments[0].clone())) + } + "cad:profiles:upsert" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(cad::upsert_profile( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "cad:profiles:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::delete_profile(arguments[0].clone())) + } + "cad:groups:build" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::build_groups(arguments[0].clone())) + } + "cad:view:hydrate" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(cad::hydrate_view(arguments[0].clone())) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/garage.rs b/arma/server/extension/src/transport/routes/garage.rs new file mode 100644 index 0000000..6d7d7c4 --- /dev/null +++ b/arma/server/extension/src/transport/routes/garage.rs @@ -0,0 +1,107 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::garage; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "garage:create" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::create_garage(call_context, arguments[0].clone())) + } + "garage:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::get_garage(call_context, arguments[0].clone())) + } + "garage:add" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::add_vehicle( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::update_garage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:patch" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::patch_vehicle( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:remove" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::remove_vehicle( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::delete_garage(call_context, arguments[0].clone())) + } + "garage:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::garage_exists(call_context, arguments[0].clone())) + } + "garage:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::init_hot_garage(call_context, arguments[0].clone())) + } + "garage:hot:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::get_hot_garage(call_context, arguments[0].clone())) + } + "garage:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::override_hot_garage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::save_hot_garage(call_context, arguments[0].clone())) + } + "garage:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(garage::remove_hot_garage( + call_context, + arguments[0].clone(), + )) + } + "garage:hot:add" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::add_hot_vehicle( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "garage:hot:remove_vehicle" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(garage::remove_hot_vehicle( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/locker.rs b/arma/server/extension/src/transport/routes/locker.rs new file mode 100644 index 0000000..8696764 --- /dev/null +++ b/arma/server/extension/src/transport/routes/locker.rs @@ -0,0 +1,91 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::locker; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "locker:create" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::create_locker(call_context, arguments[0].clone())) + } + "locker:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::get_locker(call_context, arguments[0].clone())) + } + "locker:add" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(locker::add_item( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "locker:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(locker::update_locker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "locker:patch" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(locker::patch_item( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "locker:remove" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(locker::remove_item( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "locker:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::delete_locker(call_context, arguments[0].clone())) + } + "locker:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::locker_exists(call_context, arguments[0].clone())) + } + "locker:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::init_hot_locker(call_context, arguments[0].clone())) + } + "locker:hot:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::get_hot_locker(call_context, arguments[0].clone())) + } + "locker:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(locker::override_hot_locker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "locker:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::save_hot_locker(call_context, arguments[0].clone())) + } + "locker:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(locker::remove_hot_locker( + call_context, + arguments[0].clone(), + )) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/org.rs b/arma/server/extension/src/transport/routes/org.rs new file mode 100644 index 0000000..e80584f --- /dev/null +++ b/arma/server/extension/src/transport/routes/org.rs @@ -0,0 +1,154 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::org; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "org:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_org(arguments[0].clone())) + } + "org:create" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::create_org(arguments[0].clone(), arguments[1].clone())) + } + "org:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::update_org(arguments[0].clone(), arguments[1].clone())) + } + "org:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::org_exists(arguments[0].clone())) + } + "org:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::delete_org(arguments[0].clone())) + } + "org:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::init_hot_org(arguments[0].clone())) + } + "org:hot:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_hot_org(arguments[0].clone())) + } + "org:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::override_hot_org( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "org:hot:ensure_member" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::ensure_hot_org_member(arguments[0].clone())) + } + "org:hot:member_invites" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_hot_org_member_invites(arguments[0].clone())) + } + "org:hot:register" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::register_hot_org(arguments[0].clone())) + } + "org:hot:invite_member" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::invite_hot_org_member(arguments[0].clone())) + } + "org:hot:accept_invite" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::accept_hot_org_invite(arguments[0].clone())) + } + "org:hot:decline_invite" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::decline_hot_org_invite(arguments[0].clone())) + } + "org:hot:assign_credit_line" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::assign_credit_line_hot_org(arguments[0].clone())) + } + "org:hot:repay_credit_line" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::repay_credit_line_hot_org(arguments[0].clone())) + } + "org:hot:charge_checkout" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::charge_checkout_hot_org(arguments[0].clone())) + } + "org:hot:add_assets" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::add_assets_hot_org( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "org:hot:add_fleet" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::add_fleet_hot_org( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "org:hot:leave" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::leave_hot_org(arguments[0].clone())) + } + "org:hot:disband" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::disband_hot_org(arguments[0].clone())) + } + "org:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::save_hot_org(arguments[0].clone())) + } + "org:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::remove_hot_org(arguments[0].clone())) + } + "org:assets:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_assets(arguments[0].clone())) + } + "org:assets:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::update_assets( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "org:fleet:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_fleet(arguments[0].clone())) + } + "org:fleet:update" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::update_fleet( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "org:members:get" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(org::get_members(arguments[0].clone())) + } + "org:members:add" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::add_member(arguments[0].clone(), arguments[1].clone())) + } + "org:members:remove" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(org::remove_member( + arguments[0].clone(), + arguments[1].clone(), + )) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/phone.rs b/arma/server/extension/src/transport/routes/phone.rs new file mode 100644 index 0000000..3c7c480 --- /dev/null +++ b/arma/server/extension/src/transport/routes/phone.rs @@ -0,0 +1,104 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::phone; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "phone:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(phone::init_phone(arguments[0].clone())) + } + "phone:contacts:list" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(phone::list_contacts(arguments[0].clone())) + } + "phone:contacts:add" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::add_contact( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:contacts:remove" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::remove_contact( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:messages:list" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(phone::list_messages(arguments[0].clone())) + } + "phone:messages:thread" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::message_thread( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:messages:send" => { + expect_arg_count(function_name, &arguments, 4)?; + Ok(phone::send_message( + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + arguments[3].clone(), + )) + } + "phone:messages:mark_read" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::mark_message_read( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:messages:delete" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::delete_message( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:emails:list" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(phone::list_emails(arguments[0].clone())) + } + "phone:emails:send" => { + expect_arg_count(function_name, &arguments, 5)?; + Ok(phone::send_email( + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + arguments[3].clone(), + arguments[4].clone(), + )) + } + "phone:emails:mark_read" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::mark_email_read( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:emails:delete" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(phone::delete_email( + arguments[0].clone(), + arguments[1].clone(), + )) + } + "phone:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(phone::remove_phone(arguments[0].clone())) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/store.rs b/arma/server/extension/src/transport/routes/store.rs new file mode 100644 index 0000000..2ab3ec7 --- /dev/null +++ b/arma/server/extension/src/transport/routes/store.rs @@ -0,0 +1,18 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "store:checkout" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(crate::store::checkout(arguments[0].clone())) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/v_garage.rs b/arma/server/extension/src/transport/routes/v_garage.rs new file mode 100644 index 0000000..9e76f13 --- /dev/null +++ b/arma/server/extension/src/transport/routes/v_garage.rs @@ -0,0 +1,120 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::v_garage; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "owned:garage:create" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::create_vgarage(call_context, arguments[0].clone())) + } + "owned:garage:fetch" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::fetch_vgarage(call_context, arguments[0].clone())) + } + "owned:garage:get" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_garage::get_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:garage:add" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_garage::add_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "owned:garage:remove" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_garage::remove_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "owned:garage:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::delete_vgarage(call_context, arguments[0].clone())) + } + "owned:garage:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::vgarage_exists(call_context, arguments[0].clone())) + } + "owned:garage:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::init_hot_vgarage( + call_context, + arguments[0].clone(), + )) + } + "owned:garage:hot:fetch" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::fetch_hot_vgarage( + call_context, + arguments[0].clone(), + )) + } + "owned:garage:hot:get" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_garage::get_hot_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:garage:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_garage::override_hot_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:garage:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::save_hot_vgarage( + call_context, + arguments[0].clone(), + )) + } + "owned:garage:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_garage::remove_hot_vgarage( + call_context, + arguments[0].clone(), + )) + } + "owned:garage:hot:add" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_garage::add_hot_vgarage( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "owned:garage:hot:remove_item" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_garage::remove_hot_vgarage_item( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/transport/routes/v_locker.rs b/arma/server/extension/src/transport/routes/v_locker.rs new file mode 100644 index 0000000..d1b83fe --- /dev/null +++ b/arma/server/extension/src/transport/routes/v_locker.rs @@ -0,0 +1,102 @@ +use arma_rs::CallContext; + +use super::expect_arg_count; +use crate::v_locker; + +pub(super) fn route( + call_context: CallContext, + function_name: &str, + arguments: Vec, +) -> Result { + let _ = &call_context; + + match function_name { + "owned:locker:create" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::create_vlocker(call_context, arguments[0].clone())) + } + "owned:locker:fetch" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::fetch_vlocker(call_context, arguments[0].clone())) + } + "owned:locker:get" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_locker::get_vlocker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:locker:add" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_locker::add_vlocker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "owned:locker:remove" => { + expect_arg_count(function_name, &arguments, 3)?; + Ok(v_locker::remove_vlocker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + arguments[2].clone(), + )) + } + "owned:locker:delete" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::delete_vlocker(call_context, arguments[0].clone())) + } + "owned:locker:exists" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::vlocker_exists(call_context, arguments[0].clone())) + } + "owned:locker:hot:init" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::init_hot_vlocker( + call_context, + arguments[0].clone(), + )) + } + "owned:locker:hot:fetch" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::fetch_hot_vlocker( + call_context, + arguments[0].clone(), + )) + } + "owned:locker:hot:get" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_locker::get_hot_vlocker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:locker:hot:override" => { + expect_arg_count(function_name, &arguments, 2)?; + Ok(v_locker::override_hot_vlocker( + call_context, + arguments[0].clone(), + arguments[1].clone(), + )) + } + "owned:locker:hot:save" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::save_hot_vlocker( + call_context, + arguments[0].clone(), + )) + } + "owned:locker:hot:remove" => { + expect_arg_count(function_name, &arguments, 1)?; + Ok(v_locker::remove_hot_vlocker( + call_context, + arguments[0].clone(), + )) + } + _ => Err(super::unsupported_route(function_name)), + } +} diff --git a/arma/server/extension/src/v_garage.rs b/arma/server/extension/src/v_garage.rs new file mode 100644 index 0000000..187550a --- /dev/null +++ b/arma/server/extension/src/v_garage.rs @@ -0,0 +1,649 @@ +use arma_rs::{CallContext, Group}; +use forge_models::{VGarage, VehicleCategory}; +use forge_repositories::InMemoryVGarageHotRepository; +use forge_services::{VGarageHotStateService, VGarageService}; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::VGarageStorageRepository; + +static VGARAGE_SERVICE: LazyLock> = + LazyLock::new(|| VGarageService::new(VGarageStorageRepository::configured())); +static HOT_VGARAGE_SERVICE: LazyLock< + VGarageHotStateService, +> = LazyLock::new(|| { + let repository = VGarageStorageRepository::configured(); + let hot_repository = InMemoryVGarageHotRepository::new(); + VGarageHotStateService::new(repository, hot_repository) +}); + +pub(crate) fn hot_service() +-> &'static VGarageHotStateService { + &HOT_VGARAGE_SERVICE +} + +/// Creates the Arma 3 command group for virtual garage operations. +/// +/// Registers commands: `create`, `fetch`, `get`, `add`, `remove`, `delete`, `exists`. +pub fn group() -> Group { + Group::new() + .command("create", create_vgarage) + .command("fetch", fetch_vgarage) + .command("get", get_vgarage) + .command("add", add_vgarage) + .command("remove", remove_vgarage) + .command("delete", delete_vgarage) + .command("exists", vgarage_exists) + .group( + "hot", + Group::new() + .command("init", init_hot_vgarage) + .command("fetch", fetch_hot_vgarage) + .command("get", get_hot_vgarage) + .command("override", override_hot_vgarage) + .command("save", save_hot_vgarage) + .command("remove", remove_hot_vgarage) + .command("add", add_hot_vgarage) + .command("remove_item", remove_hot_vgarage_item), + ) +} + +fn serialize_hot_vgarage(garage: VGarage) -> String { + match serde_json::to_string(&garage) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot virtual garage: {}", error), + } +} + +pub(crate) fn init_hot_vgarage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VGARAGE_SERVICE.init_garage(&resolved_uid) { + Ok(garage) => serialize_hot_vgarage(garage), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn fetch_hot_vgarage(call_context: CallContext, key: String) -> String { + init_hot_vgarage(call_context, key) +} + +pub(crate) fn get_hot_vgarage(call_context: CallContext, key: String, field: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let items = match HOT_VGARAGE_SERVICE.get_garage(&resolved_uid, &field) { + Ok(items) => items, + Err(error) => return format!("Error: {}", error), + }; + match serde_json::to_string(&items) { + Ok(json) => json, + Err(error) => format!( + "Error: Failed to serialize hot virtual garage field: {}", + error + ), + } +} + +pub(crate) fn override_hot_vgarage( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let garage: VGarage = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid virtual garage JSON: {}", error), + }; + + match HOT_VGARAGE_SERVICE.override_garage(&resolved_uid, garage) { + Ok(garage) => serialize_hot_vgarage(garage), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_vgarage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VGARAGE_SERVICE.fetch_garage(&resolved_uid) { + Ok(garage) => { + enqueue_persistence_task("owned_garage", move || { + HOT_VGARAGE_SERVICE.save_garage(&resolved_uid).map(|_| ()) + }); + serialize_hot_vgarage(garage) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_vgarage(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VGARAGE_SERVICE.remove_hot_garage(&resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn add_hot_vgarage( + call_context: CallContext, + key: String, + category: String, + classnames_json: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let category_enum = match category.to_lowercase().as_str() { + "cars" => VehicleCategory::Cars, + "armor" => VehicleCategory::Armor, + "helis" => VehicleCategory::Helis, + "planes" => VehicleCategory::Planes, + "naval" => VehicleCategory::Naval, + "other" => VehicleCategory::Other, + _ => { + return format!( + "Error: Invalid category '{}'. Valid options: cars, armor, helis, planes, naval, other", + category + ); + } + }; + + let classnames: Vec = match serde_json::from_str(&classnames_json) { + Ok(names) => names, + Err(error) => return format!("Error: Invalid JSON array: {}", error), + }; + + match HOT_VGARAGE_SERVICE.add_garage(&resolved_uid, category_enum, classnames) { + Ok(garage) => match serde_json::to_string(&garage.get(category_enum)) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize category: {}", error), + }, + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_vgarage_item( + call_context: CallContext, + key: String, + category: String, + classname: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let category_enum = match category.to_lowercase().as_str() { + "cars" => VehicleCategory::Cars, + "armor" => VehicleCategory::Armor, + "heli" | "helis" => VehicleCategory::Helis, + "planes" => VehicleCategory::Planes, + "naval" => VehicleCategory::Naval, + "other" => VehicleCategory::Other, + _ => { + return format!( + "Error: Invalid category '{}'. Valid options: cars, armor, helis, planes, naval, other", + category + ); + } + }; + + match HOT_VGARAGE_SERVICE.remove_garage(&resolved_uid, category_enum, &classname) { + Ok(garage) => match serde_json::to_string(&garage.get(category_enum)) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize category: {}", error), + }, + Err(error) => format!("Error: {}", error), + } +} + +/// Creates a new empty virtual garage for a player. +/// +/// Parameters: key +pub fn create_vgarage(call_context: CallContext, key: String) -> String { + log( + "v_garage", + "DEBUG", + &format!("Creating virtual garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.create_garage(&resolved_uid) { + Ok(garage) => { + log( + "v_garage", + "INFO", + &format!("Successfully created virtual garage for: {}", resolved_uid), + ); + match serde_json::to_string(&garage) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("v_garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!("Failed to create virtual garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a player's complete virtual garage. +/// +/// Returns JSON object with all six vehicle arrays. +pub fn fetch_vgarage(call_context: CallContext, key: String) -> String { + log( + "v_garage", + "DEBUG", + &format!("Getting virtual garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.fetch_garage(&resolved_uid) { + Ok(garage) => { + log( + "v_garage", + "INFO", + &format!("Successfully got virtual garage for: {}", resolved_uid), + ); + match serde_json::to_string(&garage) { + Ok(json) => { + log( + "v_garage", + "DEBUG", + &format!("Serialized garage to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize garage: {}", e); + log("v_garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!("Failed to get virtual garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a specific field from a player's virtual garage. +/// +/// Parameters: key, field (cars, armor, helis, planes, naval, or other) +pub fn get_vgarage(call_context: CallContext, key: String, field: String) -> String { + log( + "v_garage", + "DEBUG", + &format!( + "Getting field '{}' from virtual garage for key: {}", + field, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.get_garage(&resolved_uid, &field) { + Ok(items) => { + log( + "v_garage", + "INFO", + &format!( + "Successfully got field '{}' from virtual garage for: {}", + field, resolved_uid + ), + ); + match serde_json::to_string(&items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize field: {}", e); + log("v_garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!( + "Failed to get field '{}' from virtual garage '{}': {}", + field, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Adds cars/armor/helis/planes/naval/other to a player's virtual garage. +/// +/// Parameters: key, category (cars, armor, helis, planes, naval, or other), classnames_json (JSON array string) +pub fn add_vgarage( + call_context: CallContext, + key: String, + category: String, + classnames_json: String, +) -> String { + log( + "v_garage", + "DEBUG", + &format!( + "Adding to category '{}' in virtual garage for key: {}", + category, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse category string to enum + let category_enum = match category.to_lowercase().as_str() { + "cars" => VehicleCategory::Cars, + "armor" => VehicleCategory::Armor, + "helis" => VehicleCategory::Helis, + "planes" => VehicleCategory::Planes, + "naval" => VehicleCategory::Naval, + "other" => VehicleCategory::Other, + _ => { + let error_msg = format!( + "Error: Invalid category '{}'. Valid options: cars, armor, helis, planes, naval, other", + category + ); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse classnames JSON + let classnames: Vec = match serde_json::from_str(&classnames_json) { + Ok(names) => names, + Err(e) => { + let error_msg = format!("Error: Invalid JSON array: {}", e); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.add_garage(&resolved_uid, category_enum, classnames) { + Ok(garage) => { + log( + "v_garage", + "INFO", + &format!( + "Successfully added items to category '{}' for: {}", + category, resolved_uid + ), + ); + match serde_json::to_string(&garage.get(category_enum)) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize category: {}", e); + log("v_garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!( + "Failed to add items to category '{}' for virtual garage '{}': {}", + category, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Removes an item from a player's virtual garage category. +/// +/// Parameters: key, category (cars, armor, helis, planes, naval, or other), classname +pub fn remove_vgarage( + call_context: CallContext, + key: String, + category: String, + classname: String, +) -> String { + log( + "v_garage", + "DEBUG", + &format!( + "Removing '{}' from category '{}' in virtual garage for key: {}", + classname, category, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse category string to enum + let category_enum = match category.to_lowercase().as_str() { + "cars" => VehicleCategory::Cars, + "armor" => VehicleCategory::Armor, + "heli" => VehicleCategory::Helis, + "planes" => VehicleCategory::Planes, + "naval" => VehicleCategory::Naval, + "other" => VehicleCategory::Other, + _ => { + let error_msg = format!( + "Error: Invalid category '{}'. Valid options: cars, armor, helis, planes, naval, other", + category + ); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.remove_garage(&resolved_uid, category_enum, &classname) { + Ok(garage) => { + log( + "v_garage", + "INFO", + &format!( + "Successfully removed item from category '{}' for: {}", + category, resolved_uid + ), + ); + match serde_json::to_string(&garage.get(category_enum)) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize category: {}", e); + log("v_garage", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!( + "Failed to remove item from category '{}' for virtual garage '{}': {}", + category, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Permanently deletes a player's virtual garage. +/// +/// Parameters: key +pub fn delete_vgarage(call_context: CallContext, key: String) -> String { + log( + "v_garage", + "DEBUG", + &format!("Deleting virtual garage for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_garage", "ERROR", &error_msg); + return error_msg; + } + }; + + match VGARAGE_SERVICE.delete_garage(&resolved_uid) { + Ok(()) => { + log( + "v_garage", + "INFO", + &format!("Successfully deleted virtual garage for: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_garage", + "ERROR", + &format!("Failed to delete virtual garage '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if a player has a virtual garage (even if empty) +/// +/// Parameters: key +pub fn vgarage_exists(call_context: CallContext, key: String) -> String { + log( + "v_garage", + "DEBUG", + &format!("Checking if virtual garage exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_garage", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + log( + "v_garage", + "WARN", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match VGARAGE_SERVICE.garage_exists(&resolved_uid) { + Ok(exists) => { + log( + "v_garage", + "DEBUG", + &format!("Virtual garage '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + log( + "v_garage", + "ERROR", + &format!( + "Failed to check if virtual garage '{}' exists: {}", + resolved_uid, e + ), + ); + "false".to_string() + } + } +} diff --git a/arma/server/extension/src/v_locker.rs b/arma/server/extension/src/v_locker.rs new file mode 100644 index 0000000..8df133e --- /dev/null +++ b/arma/server/extension/src/v_locker.rs @@ -0,0 +1,569 @@ +use arma_rs::{CallContext, Group}; +use forge_models::{EquipmentCategory, VLocker}; +use forge_repositories::InMemoryVLockerHotRepository; +use forge_services::{VLockerHotStateService, VLockerService}; +use std::sync::LazyLock; + +use crate::enqueue_persistence_task; +use crate::helpers::resolve_uid; +use crate::log::log; +use crate::storage::VLockerStorageRepository; + +static VLOCKER_SERVICE: LazyLock> = + LazyLock::new(|| VLockerService::new(VLockerStorageRepository::configured())); +static HOT_VLOCKER_SERVICE: LazyLock< + VLockerHotStateService, +> = LazyLock::new(|| { + let repository = VLockerStorageRepository::configured(); + let hot_repository = InMemoryVLockerHotRepository::new(); + VLockerHotStateService::new(repository, hot_repository) +}); + +pub(crate) fn hot_service() +-> &'static VLockerHotStateService { + &HOT_VLOCKER_SERVICE +} + +/// Creates the Arma 3 command group for virtual locker operations. +/// +/// Registers commands: `create`, `fetch`, `get`, `add`, `remove`, `delete`, `exists`. +pub fn group() -> Group { + Group::new() + .command("create", create_vlocker) + .command("fetch", fetch_vlocker) + .command("get", get_vlocker) + .command("add", add_vlocker) + .command("remove", remove_vlocker) + .command("delete", delete_vlocker) + .command("exists", vlocker_exists) + .group( + "hot", + Group::new() + .command("init", init_hot_vlocker) + .command("fetch", fetch_hot_vlocker) + .command("get", get_hot_vlocker) + .command("override", override_hot_vlocker) + .command("save", save_hot_vlocker) + .command("remove", remove_hot_vlocker), + ) +} + +fn serialize_hot_vlocker(locker: VLocker) -> String { + match serde_json::to_string(&locker) { + Ok(json) => json, + Err(error) => format!("Error: Failed to serialize hot virtual locker: {}", error), + } +} + +pub(crate) fn init_hot_vlocker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VLOCKER_SERVICE.init_locker(&resolved_uid) { + Ok(locker) => serialize_hot_vlocker(locker), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn fetch_hot_vlocker(call_context: CallContext, key: String) -> String { + init_hot_vlocker(call_context, key) +} + +pub(crate) fn get_hot_vlocker(call_context: CallContext, key: String, field: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let items = match HOT_VLOCKER_SERVICE.get_locker(&resolved_uid, &field) { + Ok(items) => items, + Err(error) => return format!("Error: {}", error), + }; + + match serde_json::to_string(&items) { + Ok(json) => json, + Err(error) => format!( + "Error: Failed to serialize hot virtual locker field: {}", + error + ), + } +} + +pub(crate) fn override_hot_vlocker( + call_context: CallContext, + key: String, + json_data: String, +) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + let locker: VLocker = match serde_json::from_str(&json_data) { + Ok(data) => data, + Err(error) => return format!("Error: Invalid virtual locker JSON: {}", error), + }; + + match HOT_VLOCKER_SERVICE.override_locker(&resolved_uid, locker) { + Ok(locker) => serialize_hot_vlocker(locker), + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn save_hot_vlocker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VLOCKER_SERVICE.fetch_locker(&resolved_uid) { + Ok(locker) => { + enqueue_persistence_task("owned_locker", move || { + HOT_VLOCKER_SERVICE.save_locker(&resolved_uid).map(|_| ()) + }); + serialize_hot_vlocker(locker) + } + Err(error) => format!("Error: {}", error), + } +} + +pub(crate) fn remove_hot_vlocker(call_context: CallContext, key: String) -> String { + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => return format!("Error: Failed to resolve UID for key: {}", key), + }; + + match HOT_VLOCKER_SERVICE.remove_locker(&resolved_uid) { + Ok(_) => "OK".to_string(), + Err(error) => format!("Error: {}", error), + } +} + +/// Creates a new empty virtual locker for a player. +/// +/// Parameters: key +pub fn create_vlocker(call_context: CallContext, key: String) -> String { + log( + "v_locker", + "DEBUG", + &format!("Creating virtual locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.create_locker(&resolved_uid) { + Ok(locker) => { + log( + "v_locker", + "INFO", + &format!("Successfully created virtual locker for: {}", resolved_uid), + ); + match serde_json::to_string(&locker) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("v_locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!("Failed to create virtual locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a player's complete virtual locker. +/// +/// Returns JSON object with all four equipment arrays. +pub fn fetch_vlocker(call_context: CallContext, key: String) -> String { + log( + "v_locker", + "DEBUG", + &format!("Getting virtual locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.fetch_locker(&resolved_uid) { + Ok(locker) => { + log( + "v_locker", + "INFO", + &format!("Successfully got virtual locker for: {}", resolved_uid), + ); + match serde_json::to_string(&locker) { + Ok(json) => { + log( + "v_locker", + "DEBUG", + &format!("Serialized locker to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize locker: {}", e); + log("v_locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!("Failed to get virtual locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Retrieves a specific field from a player's virtual locker. +/// +/// Parameters: key, field (items, weapons, magazines, or backpacks) +pub fn get_vlocker(call_context: CallContext, key: String, field: String) -> String { + log( + "v_locker", + "DEBUG", + &format!( + "Getting field '{}' from virtual locker for key: {}", + field, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.get_locker(&resolved_uid, &field) { + Ok(items) => { + log( + "v_locker", + "INFO", + &format!( + "Successfully got field '{}' from virtual locker for: {}", + field, resolved_uid + ), + ); + match serde_json::to_string(&items) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize field: {}", e); + log("v_locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!( + "Failed to get field '{}' from virtual locker '{}': {}", + field, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Adds items/weapons/magazines/backpacks to a player's virtual locker. +/// +/// Parameters: key, category (items/weapons/magazines/backpacks), classnames_json (JSON array string) +pub fn add_vlocker( + call_context: CallContext, + key: String, + category: String, + classnames_json: String, +) -> String { + log( + "v_locker", + "DEBUG", + &format!( + "Adding to category '{}' in virtual locker for key: {}", + category, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse category string to enum + let category_enum = match category.to_lowercase().as_str() { + "items" => EquipmentCategory::Items, + "weapons" => EquipmentCategory::Weapons, + "magazines" => EquipmentCategory::Magazines, + "backpacks" => EquipmentCategory::Backpacks, + _ => { + let error_msg = format!( + "Error: Invalid category '{}'. Valid options: items, weapons, magazines, backpacks", + category + ); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse classnames JSON + let classnames: Vec = match serde_json::from_str(&classnames_json) { + Ok(names) => names, + Err(e) => { + let error_msg = format!("Error: Invalid JSON array: {}", e); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.add_locker(&resolved_uid, category_enum, classnames) { + Ok(locker) => { + log( + "v_locker", + "INFO", + &format!( + "Successfully added items to category '{}' for: {}", + category, resolved_uid + ), + ); + match serde_json::to_string(&locker.get(category_enum)) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize category: {}", e); + log("v_locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!( + "Failed to add items to category '{}' for virtual locker '{}': {}", + category, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Removes an item from a player's virtual locker category. +/// +/// Parameters: key, category (items/weapons/magazines/backpacks), classname +pub fn remove_vlocker( + call_context: CallContext, + key: String, + category: String, + classname: String, +) -> String { + log( + "v_locker", + "DEBUG", + &format!( + "Removing '{}' from category '{}' in virtual locker for key: {}", + classname, category, key + ), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + // Parse category string to enum + let category_enum = match category.to_lowercase().as_str() { + "items" => EquipmentCategory::Items, + "weapons" => EquipmentCategory::Weapons, + "magazines" => EquipmentCategory::Magazines, + "backpacks" => EquipmentCategory::Backpacks, + _ => { + let error_msg = format!( + "Error: Invalid category '{}'. Valid options: items, weapons, magazines, backpacks", + category + ); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.remove_locker(&resolved_uid, category_enum, &classname) { + Ok(locker) => { + log( + "v_locker", + "INFO", + &format!( + "Successfully removed item from category '{}' for: {}", + category, resolved_uid + ), + ); + match serde_json::to_string(&locker.get(category_enum)) { + Ok(json) => json, + Err(e) => { + let error_msg = format!("Error: Failed to serialize category: {}", e); + log("v_locker", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!( + "Failed to remove item from category '{}' for virtual locker '{}': {}", + category, resolved_uid, e + ), + ); + error_msg + } + } +} + +/// Permanently deletes a player's virtual locker. +/// +/// Parameters: key +pub fn delete_vlocker(call_context: CallContext, key: String) -> String { + log( + "v_locker", + "DEBUG", + &format!("Deleting virtual locker for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("v_locker", "ERROR", &error_msg); + return error_msg; + } + }; + + match VLOCKER_SERVICE.delete_locker(&resolved_uid) { + Ok(()) => { + log( + "v_locker", + "INFO", + &format!("Successfully deleted virtual locker for: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "v_locker", + "ERROR", + &format!("Failed to delete virtual locker '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if a player has a virtual locker (even if empty) +/// +/// Parameters: key +pub fn vlocker_exists(call_context: CallContext, key: String) -> String { + log( + "v_locker", + "DEBUG", + &format!("Checking if virtual locker exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("v_locker", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + log( + "v_locker", + "WARN", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match VLOCKER_SERVICE.locker_exists(&resolved_uid) { + Ok(exists) => { + log( + "v_locker", + "DEBUG", + &format!("Virtual locker '{}' exists: {}", resolved_uid, exists), + ); + exists.to_string() + } + Err(e) => { + log( + "v_locker", + "ERROR", + &format!( + "Failed to check if virtual locker '{}' exists: {}", + resolved_uid, e + ), + ); + "false".to_string() + } + } +} diff --git a/arma/server/icon_128_ca.paa b/arma/server/icon_128_ca.paa new file mode 100644 index 0000000..02dc39e Binary files /dev/null and b/arma/server/icon_128_ca.paa differ diff --git a/arma/server/icon_128_highlight_ca.paa b/arma/server/icon_128_highlight_ca.paa new file mode 100644 index 0000000..8374f2a Binary files /dev/null and b/arma/server/icon_128_highlight_ca.paa differ diff --git a/arma/server/icon_64_ca.paa b/arma/server/icon_64_ca.paa new file mode 100644 index 0000000..afcab39 Binary files /dev/null and b/arma/server/icon_64_ca.paa differ diff --git a/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc b/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 0000000..4031b6b --- /dev/null +++ b/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,190 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/arma/server/include/a3/ui_f/hpp/defineResincl.inc b/arma/server/include/a3/ui_f/hpp/defineResincl.inc new file mode 100644 index 0000000..986ac0d --- /dev/null +++ b/arma/server/include/a3/ui_f/hpp/defineResincl.inc @@ -0,0 +1,3186 @@ +#ifndef _RESINCL_HPP +#define _RESINCL_HPP + +/*******************/ +/* Tactical menu */ +/*******************/ + +// Menu commands + // main menu +#define CMD_SEPARATOR -1 +#define CMD_NOTHING -2 +#define CMD_HIDE_MENU -3 +#define CMD_BACK -4 +// Custom menu command +#define CMD_EXECUTE -5 + +#ifdef _CONFIG +enum +{ +// note: this CMD should be if possible organized as is menu +// (items from the same menu together) +// this makes searching much easier + +//main menu level +CMD_GETIN, +CMD_GETOUT, +CMD_ACTION, + +// move submenu + +// other commands +CMD_ADVANCE, +CMD_STAY_BACK, +CMD_FLANK_LEFT, +CMD_FLANK_RIGHT, +CMD_NEXT_WAYPOINT, +CMD_HIDE, +CMD_JOIN, +CMD_STOP, +CMD_EXPECT, +CMD_MOVE, + + // formations +CMD_FORM_COLUMN, +CMD_FORM_STAGCOL, +CMD_FORM_WEDGE, +CMD_FORM_ECHLEFT, +CMD_FORM_ECHRIGHT, +CMD_FORM_VEE, +CMD_FORM_LINE, +CMD_FORM_DIAMOND, +CMD_FORM_FILE, + +// engage +CMD_ENGAGE, +CMD_LOOSE_FORM, +CMD_KEEP_FORM, + +CMD_HOLD_FIRE, +CMD_OPEN_FIRE, +CMD_FIRE, + +// status +CMD_WATCH, +CMD_WATCH_AROUND, +CMD_WATCH_AUTO, +CMD_WATCH_DIR, + +// combat modes +CMD_STEALTH, +CMD_COMBAT, +CMD_AWARE, +CMD_SAFE, + +// heal +CMD_HEALBLEEDING, +CMD_HEAL, +CMD_HEAL_SELF, +CMD_REPAIR_VEHICLE, +CMD_CARRY, +CMD_DROP_CARRIED, +CMD_PUTIN, +CMD_UNLOADFROM, + +// swiming and diving +CMD_KEEP_DEPTH_RELATIVE_UP, +CMD_KEEP_DEPTH_RELATIVE_DOWN, +CMD_KEEP_DEPTH_LEADER, +CMD_KEEP_DEPTH_UNDERSURFACE, +CMD_KEEP_DEPTH_ABOVESURFACE, +CMD_KEEP_DEPTH_BOTTOM, + +//suppress fire +CMD_SUPPRESS, + +CMD_POS_UP, +CMD_POS_MIDDLE, +CMD_POS_DOWN, +CMD_POS_AUTO, + // teams +CMD_TEAM_MAIN, +CMD_TEAM_RED, +CMD_TEAM_GREEN, +CMD_TEAM_BLUE, +CMD_TEAM_YELLOW, +CMD_ASSIGN_MAIN, +CMD_ASSIGN_RED, +CMD_ASSIGN_GREEN, +CMD_ASSIGN_BLUE, +CMD_ASSIGN_YELLOW, +CMD_TEAM_DISSOLVE, + +// radio +CMD_RADIO_ALPHA, +CMD_RADIO_BRAVO, +CMD_RADIO_CHARLIE, +CMD_RADIO_DELTA, +CMD_RADIO_ECHO, +CMD_RADIO_FOXTROT, +CMD_RADIO_GOLF, +CMD_RADIO_HOTEL, +CMD_RADIO_INDIA, +CMD_RADIO_JULIET, + +// reply commands + +CMD_REPLY_DONE, +CMD_REPLY_FAIL, +CMD_REPLY_COPY, +CMD_REPLY_REPEAT, +CMD_REPLY_WHERE_ARE_YOU, +CMD_REPORT, +CMD_REPLY_ENGAGING, +CMD_REPLY_UNDER_FIRE, +CMD_REPLY_HIT, +CMD_REPLY_ONE_LESS, +CMD_REPLY_FIREREADY, +CMD_REPLY_FIRENOTREADY, +CMD_REPLY_KILLED, +CMD_REPLY_AMMO_LOW, +CMD_REPLY_FUEL_LOW, +CMD_REPLY_INJURED, +CMD_REPLY_OUT_OF_FAKs, + +CMD_SUPPORT_MEDIC, +CMD_SUPPORT_AMBULANCE, +CMD_SUPPORT_REPAIR, +CMD_SUPPORT_REARM, +CMD_SUPPORT_REFUEL, +CMD_SUPPORT_DONE, + +CMD_RADIO_CUSTOM, +CMD_RADIO_CUSTOM_1, +CMD_RADIO_CUSTOM_2, +CMD_RADIO_CUSTOM_3, +CMD_RADIO_CUSTOM_4, +CMD_RADIO_CUSTOM_5, +CMD_RADIO_CUSTOM_6, +CMD_RADIO_CUSTOM_7, +CMD_RADIO_CUSTOM_8, +CMD_RADIO_CUSTOM_9, +CMD_RADIO_CUSTOM_0, + +CMD_UNIT_1, +CMD_UNIT_2, +CMD_UNIT_3, +CMD_UNIT_4, +CMD_UNIT_5, +CMD_UNIT_6, +CMD_UNIT_7, +CMD_UNIT_8, +CMD_UNIT_9, +CMD_UNIT_10, +CMD_UNIT_11, +CMD_UNIT_12, +CMD_UNITS_ALL, + +CMD_MY_VEHICLE, + +CMD_SELECT_MAIN, +CMD_SELECT_RED, +CMD_SELECT_GREEN, +CMD_SELECT_BLUE, +CMD_SELECT_YELLOW, + +CMD_VEHICLE_1, +CMD_VEHICLE_2, +CMD_VEHICLE_3, +CMD_VEHICLE_4, +CMD_VEHICLE_5, +CMD_VEHICLE_6, +CMD_VEHICLE_7, +CMD_VEHICLE_8, +CMD_VEHICLE_9, +CMD_VEHICLE_10, +CMD_VEHICLE_11, +CMD_VEHICLE_12, + +CMD_SINGLE_UNITS, + +CMD_MP_CHANNEL_GLOBAL, +CMD_MP_CHANNEL_SIDE, +CMD_MP_CHANNEL_COMMAND, +CMD_MP_CHANNEL_GROUP, +CMD_MP_CHANNEL_VEHICLE, + +CMD_CONVERSATION, + +// Context sensitive commands +CMD_MOVE_AUTO, +CMD_STOP_AUTO, +CMD_WATCH_CTX, +CMD_GETIN_AUTO, +CMD_REARM_AUTO, +CMD_ATTACK_AUTO, +CMD_FIRE_AT_POSITION_AUTO, +CMD_SELECT_AUTO, +CMD_SELECT_AUTO_ADD, +CMD_DESELECT_AUTO, +CMD_JOIN_AUTO, +CMD_OPEN_FIRE_AUTO, +CMD_HOLD_FIRE_AUTO, +CMD_COMPLEX_COMMAND, +CMD_DISABLE_MINE, + +CMD_SELECT_UNIT_FROM_BAR, +CMD_DESELECT_UNIT_FROM_BAR, +CMD_SELECT_VEHICLE_FROM_BAR, +CMD_DESELECT_VEHICLE_FROM_BAR, +CMD_SELECT_TEAM_FROM_BAR, +CMD_DESELECT_TEAM_FROM_BAR, + +CMD_JOIN_ALL, + +CMD_SWITCH_TO_LEADER, +CMD_SWITCH_TO_SELECTED, + +CMD_NOTARGET, + +CMD_HC_SELECT_AUTO, +CMD_HC_SELECT_AUTO_ADD, +CMD_HC_DESELECT_AUTO, +CMD_HC_SELECT_UNIT_FROM_BAR, +CMD_HC_DESELECT_UNIT_FROM_BAR, +CMD_HC_SELECT_TEAM_FROM_BAR, +CMD_HC_DESELECT_TEAM_FROM_BAR, +CMD_OPENPARACHUTE, +CMD_TAKE_BACKPACK, +CMD_ASSEMBLE_WEAPON, +CMD_DISASSEMBLE_WEAPON, +CMD_ENGAGE_AUTO, +CMD_FIRE_AUTO, +CMD_FIRE_AT_POSITION_AMMO // same as CMD_FIRE_AT_POSITION_AUTO but with custom magazine +}; + +/// In-game UI hiding animation type +enum HideType +{ + HTNone, // no animation + HTFade, // fade in / fade out + HTMoveLeft, // move from / to the left + HTMoveRight // move from / to the right +}; + +enum +{ + SPTPlain, + SPTPercents +}; + +#endif + + +/*******************/ +/* Controls */ +/*******************/ + +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_CONTROLS_TABLE 19 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 +#define CT_VEHICLE_DIRECTION 105 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 +#define MB_ERROR_DIALOG 8 + +// Xbox buttons +#define KEY_XINPUT 0x00050000 + +#define KEY_XBOX_A KEY_XINPUT + 0 +#define KEY_XBOX_B KEY_XINPUT + 1 +#define KEY_XBOX_X KEY_XINPUT + 2 +#define KEY_XBOX_Y KEY_XINPUT + 3 +#define KEY_XBOX_Up KEY_XINPUT + 4 +#define KEY_XBOX_Down KEY_XINPUT + 5 +#define KEY_XBOX_Left KEY_XINPUT + 6 +#define KEY_XBOX_Right KEY_XINPUT + 7 +#define KEY_XBOX_Start KEY_XINPUT + 8 +#define KEY_XBOX_Back KEY_XINPUT + 9 +#define KEY_XBOX_LeftBumper KEY_XINPUT + 10 +#define KEY_XBOX_RightBumper KEY_XINPUT + 11 +#define KEY_XBOX_LeftTrigger KEY_XINPUT + 12 +#define KEY_XBOX_RightTrigger KEY_XINPUT + 13 +#define KEY_XBOX_LeftThumb KEY_XINPUT + 14 +#define KEY_XBOX_RightThumb KEY_XINPUT + 15 +#define KEY_XBOX_LeftThumbXRight KEY_XINPUT + 16 +#define KEY_XBOX_LeftThumbYUp KEY_XINPUT + 17 +#define KEY_XBOX_RightThumbXRight KEY_XINPUT + 18 +#define KEY_XBOX_RightThumbYUp KEY_XINPUT + 19 +#define KEY_XBOX_LeftThumbXLeft KEY_XINPUT + 20 +#define KEY_XBOX_LeftThumbYDown KEY_XINPUT + 21 +#define KEY_XBOX_RightThumbXLeft KEY_XINPUT + 22 +#define KEY_XBOX_RightThumbYDown KEY_XINPUT + 23 + +// Predefined controls +#define IDC_OK 1 +#define IDC_CANCEL 2 +#define IDC_AUTOCANCEL 3 +#define IDC_ABORT 4 +#define IDC_RESTART 5 +#define IDC_USER_BUTTON 6 +#define IDC_EXIT_TO_MAIN 7 + +// my own control window for tests +#define IDC_MY_FIRST_LISTBOX 110 +#define IDC_MY_FIRST_BUTTON 111 +#define IDC_MY_FIRST_SLIDER 112 + +#define IDC_MAP 51 +#define IDC_WEATHER 52 +#define IDC_POSITION 53 +#define IDC_TIME 54 +#define IDC_DATE 55 +#define IDC_BRIEFING 56 +#define IDC_MAP_NOTES 57 +#define IDC_MAP_PLAN 58 +#define IDC_MAP_TEAM_SWITCH 59 +#define IDC_MAP_GROUP 60 +//#define IDC_MAP_BRIEFING 61 +//#define IDC_MAP_DEBRIEFING 62 +#define IDC_RADIO_ALPHA 63 +#define IDC_RADIO_BRAVO 64 +#define IDC_RADIO_CHARLIE 65 +#define IDC_RADIO_DELTA 66 +#define IDC_RADIO_ECHO 67 +#define IDC_RADIO_FOXTROT 68 +#define IDC_RADIO_GOLF 69 +#define IDC_RADIO_HOTEL 70 +#define IDC_RADIO_INDIA 71 +#define IDC_RADIO_JULIET 72 +#define IDC_MAP_NAME 73 +#define IDC_WARRANT 74 +#define IDC_GPS 75 + +#define IDC_NOTEPAD_PICTURE 76 + +#define IDC_GPS_ALT 77 +#define IDC_GPS_HEADING 78 + +// - diary topics (used in multiple displays - diary, map, briefing, debriefing) +#define IDC_DIARY_TOPIC_MAP 80 +#define IDC_DIARY_TOPIC_1 81 +#define IDC_DIARY_TOPIC_2 82 +#define IDC_DIARY_TOPIC_3 83 +#define IDC_DIARY_TOPIC_4 84 +#define IDC_DIARY_TOPIC_5 85 +#define IDC_DIARY_TOPIC_6 86 +#define IDC_DIARY_TOPIC_7 87 +#define IDC_DIARY_TOPIC_8 88 +#define IDC_DIARY_TOPIC_9 89 + +#define IDC_HSLIDER 98 +#define IDC_VSLIDER 99 + +#define IDC_ARTILLERY_MAP 500 +#define IDC_ARTILLERY_MAP_FIRE 501 + +#define IDC_ARTILLERY_MAP_NAME 502 +#define IDC_ARTILLERY_MAP_ID 503 +#define IDC_ARTILLERY_MAP_GRID 504 +#define IDC_ARTILLERY_MAP_DIST 505 +#define IDC_ARTILLERY_MAP_MIN 506 +#define IDC_ARTILLERY_MAP_MAX 507 +#define IDC_ARTILLERY_MAP_DIR 508 +#define IDC_ARTILLERY_MAP_ALT 509 +#define IDC_ARTILLERY_MAP_MODE 510 +#define IDC_ARTILLERY_MAP_AMMO 511 +#define IDC_ARTILLERY_MAP_SHELLS 512 +#define IDC_ARTILLERY_MAP_SPREAD 513 +#define IDC_ARTILLERY_MAP_ETA 514 +#define IDC_ARTILLERY_MAP_AMMOCOUNT 515 +#define IDC_ARTILLERY_MAP_WARNING 516 +#define IDC_ARTILLERY_MAP_AIMABOVE 517 + +#define IDC_DIARY_TOPIC_LIST 1001 +#define IDC_DIARY_TOPIC_LISTINDEX 1002 +#define IDC_DIARY_TOPIC_HTML 1003 +#define IDC_DIARY_TOPIC_ADD_RECORD 1004 +#define IDC_DIARY_TOPIC_HTML_GROUP 1013 + +#define IDC_DIARY_PLAYER_NAME 111 +#define IDC_DIARY_MISSION_NAME 112 +#define IDC_DIARY_CURRENT_TASK 113 +#define IDC_DIARY_PLAYER_RANK 116 +//VON/chat muting in Diary +#define IDC_DIARY_PLAYERS_BUTTON 117 +#define IDC_DIARY_PLAYERS_SORT 118 +#define IDC_DIARY_MUTE_ALL 119 + +#define IDC_DIARY_TOPIC_BACKGROUND 1021 +#define IDC_DIARY_SUBTOPIC_BACKGROUND 1022 +#define IDC_DIARY_CONTENT_BACKGROUND 1023 + +//IDCs for marker color and icon. +//Are directly connected to RscMapControl, namely its idcMarkerColor and idcMarkerIcon parameters. +//Engine searches for the parameters in any display where RscMapControl is used, that's why they got more uncommon IDCs. +#define IDC_DIARY_MARKER_COLOR 1090 +#define IDC_DIARY_MARKER_ICON 1091 + + +// Instances of display +#define IDD_MAIN 0 +#define IDD_GAME 1 +#define IDD_SINGLE_MISSION 2 +#define IDD_OPTIONS 3 +#define IDD_CONFIGURE 4 +#define IDD_OPTIONS_VIDEO 5 +#define IDD_OPTIONS_AUDIO 6 +#define IDD_MULTIPLAYER 8 +#define IDD_LOAD_AAR 9 +#define IDD_MAIN_MAP 12 +#define IDD_SAVE 13 +#define IDD_END 14 +#define IDD_SERVER 17 +#define IDD_CLIENT 18 +#define IDD_IP_ADDRESS 19 +#define IDD_SERVER_SETUP 20 +#define IDD_CLIENT_SETUP 21 +#define IDD_CLIENT_WAIT 22 +#define IDD_CHAT 24 +#define IDD_CUSTOM_ARCADE 25 +#define IDD_ARCADE_MAP 26 +#define IDD_ARCADE_UNIT 27 +#define IDD_ARCADE_WAYPOINT 28 +#define IDD_TEMPLATE_SAVE 29 +#define IDD_TEMPLATE_LOAD 30 +#define IDD_LOGIN 31 +#define IDD_INTEL 32 +#define IDD_CAMPAIGN 33 +#define IDD_CREDITS 34 +#define IDD_INTEL_GETREADY 37 +#define IDD_ARCADE_GROUP 40 +#define IDD_ARCADE_SENSOR 41 +#define IDD_NEW_USER 42 +#define IDD_CAMPAIGN_LOAD 43 +#define IDD_ARCADE_EFFECTS 44 +#define IDD_ARCADE_MARKER 45 +#define IDD_MISSION 46 +#define IDD_INTRO 47 +#define IDD_OUTRO 48 +#define IDD_INTERRUPT 49 +#define IDD_DEBRIEFING 50 +#define IDD_SELECT_ISLAND 51 +#define IDD_SERVER_GET_READY 52 +#define IDD_CLIENT_GET_READY 53 +#define IDD_INSERT_MARKER 54 +#define IDD_VOICE_CHAT 55 +#define IDD_DEBUG 56 +#define IDD_HINTC 57 +#define IDD_MISSION_END 58 +#define IDD_SERVER_SIDE 59 +#define IDD_CLIENT_SIDE 60 +#define IDD_MULTIPLAYER_ROLE 61 +#define IDD_AWARD 62 +#define IDD_CHANNEL 63 +#define IDD_PASSWORD 64 +#define IDD_MP_PLAYERS 65 +#define IDD_REVERT 66 +#define IDD_PORT 69 +#define IDD_MP_SETUP 70 +#define IDD_FILTER 71 +#define IDD_HINTC_EX 72 +#define IDD_SELECT_PROFILE 73 +#define IDD_CAMPAIGN_SELECT 74 +#define IDD_PROFILE 75 +#define IDD_PROFILE_NAME 76 +#define IDD_PROFILE_FACE 77 +#define IDD_PROFILE_VOICE 78 +#define IDD_PROFILE_CONTROLLER 79 +#define IDD_PROFILE_AUDIO 80 +#define IDD_PROFILE_VIDEO 81 +#define IDD_PROFILE_LIVE 82 +#define IDD_MP_TYPE 83 +#define IDD_MP_PASSCODE 84 +#define IDD_OPTIMATCH_FILTER 86 +#define IDD_QUICKMATCH 87 +#define IDD_FRIENDS 88 +#define IDD_FRIENDS_OPTIONS 89 +#define IDD_XWIZARD_TEMPLATE 90 +#define IDD_XWIZARD_INTEL 91 +#define IDD_XWIZARD_NAME 92 +#define IDD_XWIZARD_ISLAND 93 +#define IDD_XWIZARD_WEATHER 94 +#define IDD_XWIZARD_TIME 95 +#define IDD_XWIZARD_UNIT 96 +#define IDD_XWIZARD_MAP 97 +#define IDD_XWIZARD_UNIT_SELECT 98 +#define IDD_XWIZARD_UNIT_SELECT_CUSTOM 99 +#define IDD_XWIZARD_WAYPOINT 100 +#define IDD_DOWNLOAD_CONTENT 101 +#define IDD_DOWNLOAD_CONTENT_DETAILS 102 +#define IDD_XPLAYERS 103 +#define IDD_XPLAYERS_ACTIONS 104 +#define IDD_XPLAYERS_FEEDBACK 105 +#define IDD_GEAR 106 +#define IDD_EQUIP 555 +#define IDD_DOWNLOAD_CONTENT_INSTALL 108 +#define IDD_SERVER_SETTINGS 109 +#define IDD_SERVER_ADVANCED 110 +#define IDD_SERVER_SELECT_PLAYER 112 +#define IDD_DEDICATED_SERVER 114 +#define IDD_FRIEND_MISSIONS 115 +#define IDD_LIVE_STATS 116 +#define IDD_LIVE_STATS_BOARD 117 +#define IDD_NETWORK_CONDITIONS 118 +#define IDD_SEND_VOICE_MAIL 119 +#define IDD_RECEIVE_VOICE_MAIL 120 +#define IDD_SELECT_ISLAND_NEW 351 + +#define IDD_EDIT_OBJECT 121 +#define IDD_MISSION_LOAD 122 +#define IDD_MISSION_SAVE 123 + +#define IDD_EDIT_DIARY_RECORD 125 + +#define IDD_SERVER_VOTED 126 +#define IDD_DEDICATED_SERVER_SETTINGS 127 + +#define IDD_MISSION_EDITOR 128 + +#define IDD_DIARY 129 + +#define IDD_TEAM_SWITCH 130 + +#define IDD_CONFIGURE_ACTION 131 + +#define IDD_HOST_SETTINGS 132 + +#define IDD_MINIMAP 133 +#define IDD_OVERLAY_CREATE 134 +#define IDD_OVERLAY_LOAD 135 + +#define IDD_ESRB 136 + +#define IDD_MISSION_EDITOR_REALTIME 137 + +//TODO: Has to be checked by Pete! +#define IDD_EDIT_BRIEFING 138 +#define IDD_LIVE 139 + +#define IDD_LASE 141 + +#define IDD_LAYER_LOAD 142 + +#define IDD_CONTROLS 143 +#define IDD_INTERRUPT_REVERT 144 + +#define IDD_PERFORMANCE 145 +#define IDD_XWIZARD_PARAMS 146 +#define IDD_XWIZARD_PARAMETER 147 + +#define IDD_CONFIGURE_JOYSTICKS 148 +#define IDD_CAPTURE 149 +#define IDD_CUSTOMIZE_CONTROLLER 150 +#define IDD_GAMEOPTIONS 151 + +//new editor dialog +#define IDD_ARCADE_MODULES 153 +#define IDD_SELECT_SAVE 154 +#define IDD_DSINTERFACE 155 +#define IDD_ADDON_ACTIONS 156 + +// PhysX debug window +#define IDD_PHYSX_DEBUG 157 + +// mod launcher dialog +#define IDD_MOD_LAUNCHER 157 +#define IDD_NEW_MOD 158 + +// joystick schemes mapping dialog +#define IDD_JOYSTICK_SCHEMES 159 + +//AV Terminal dialog - MUF +#define IDD_AV_TERMINAL 160 +//Field Manual +#define IDD_FIELD_MANUAL 162 +//Dialogue for controls scheme selection +#define IDD_CONTROLS_SCHEME 163 +//Dialogue for choosing layout of mission editor. NOTE: 161-163 are already in use, see A3\Ui_f\hpp\defineResincl.inc +#define IDD_EDITOR_LAYOUT 164 +//Dialogue for publishing mission on Steam. +#define IDD_PUBLISH_MISSION 165 +//Dialogue for selecting tags for mission on Steam. +#define IDD_PUBLISH_MISSION_TAGS 166 +//Dialogue for selecting file from the hard drive +#define IDD_FILE_SELECT_DIALOG 167 +//Idd reserved for debriefing 168 +#define IDD_DLC_VEHICLEMSGBOX 169 +#define IDD_DLC_PURCHASENOTIFICATION 170 +#define IDD_BOOTCAMPMSGBOX 171 +#define IDD_COMMUNITY_GUIDE 172 +#define IDD_SLING_LOAD_ASSISTANT 173 +#define IDD_DLC_CONTENTBROWSER 174 +#define IDD_MP_SCORE_TABLE 175 +#define IDD_CAMPAIGN_MP 176 +#define IDD_MP_QUICK_PLAY 177 +#define IDD_MP_SERVER_SEARCH 178 +#define IDD_MP_SERVER_FOUND 179 +#define IDD_KEYMAPMSGBOX 180 + +// MessageBoxes +#define IDD_MSG_DELETEPLAYER 200 +#define IDD_MSG_DELETEGAME 201 +#define IDD_MSG_CLEARTEMPLATE 202 +#define IDD_MSG_EXITTEMPLATE 203 +#define IDD_MSG_LAUNCHGAME 204 // ADDED IN PATCH 1.04 + +#define IDD_MSG_NEWACCOUNT 205 + +#define IDD_MSG_FRIENDS_REMOVE 206 +#define IDD_MSG_FRIENDS_BLOCK 207 +#define IDD_MSG_FRIENDS_INVITE 208 + +#define IDD_MSG_DELETEMISSION 209 + +#define IDD_MSG_XONLINE_CONNECTION_FAILED 210 +#define IDD_MSG_XONLINE_UPDATE_REQUIRED 211 +#define IDD_MSG_XONLINE_SERVER_BUSY 212 +#define IDD_MSG_XONLINE_REQUIRED_MSG 213 +#define IDD_MSG_XONLINE_RECOMMENDED_MSG 214 +#define IDD_MSG_XONLINE_INVALID_USER 215 +#define IDD_MSG_XONLINE_WRONG_PASSCODE 216 + +#define IDD_MSG_CANCEL_SUBSCRIPTION 217 +#define IDD_MSG_SUBSCRIBE 218 +#define IDD_MSG_PURCHASE 219 +#define IDD_MSG_INSTALL_ABORT 220 +#define IDD_MSG_INSTALL_RESULT 221 + +#define IDD_MSG_DECLINE_INVITATION 222 +#define IDD_MSG_REVOKE_INVITATION 223 +#define IDD_MSG_BLOCK_REQUEST 224 +#define IDD_MSG_DECLINE_REQUEST 225 +#define IDD_MSG_CANCEL_REQUEST 226 +#define IDD_MSG_KICK_OFF 227 +#define IDD_MSG_TERMINATE_SESSION 228 +#define IDD_MSG_NETWORK_CONDITIONS 229 + +#define IDD_MSG_STATS_NOT_UPLOADED 230 + +#define IDD_MSG_LOAD_FAILED 231 +#define IDD_MSG_DELETESAVE 232 + +#define IDD_MSG_DISK_FULL 233 + +#define IDD_MSG_RESTART_MISSION 234 +#define IDD_MSG_SAVE_MISSION 235 +#define IDD_MSG_SIGN_OUT 236 +#define IDD_MSG_LOAD_MISSION 237 +#define IDD_MSG_NEGATIVE_FEEDBACK 238 +#define IDD_MSG_PENDING_INVITATION 239 +#define IDD_MSG_HOST_SESSION 240 +#define IDD_MSG_ROLES_LOST 241 +#define IDD_MSG_ACCEPT_INVITATION 242 +#define IDD_MSG_MP_PLAYER_COUNT 243 +#define IDD_MSG_GAME_JOIN 244 +#define IDD_MSG_EDITOR_WIZARD_NONAME_MISSION 245 + +#define IDD_MSG_RESTART_NEEDED 246 + +// new editor +#define IDD_MSG_COMMIT_OVERLAY 247 +#define IDD_MSG_CLEAR_OVERLAY 248 +#define IDD_MSG_LOAD_OVERLAY 249 +#define IDD_MSG_EXIT_OVERLAY 250 +#define IDD_MSG_CREATE_OVERLAY 251 +#define IDD_MSG_CLOSE_OVERLAY 252 +#define IDD_MSG_LOAD_AAR 253 +#define IDD_MSG_CLEAR_MISSION 254 +#define IDD_MSG_RETRY_MISSION 255 +#define IDD_MSG_DELETE_DIARY_RECORD 256 + +// XBOX 360 profile and save messages +#define IDD_MSG_XBOX_NO_SIGN_IN 257 +#define IDD_MSG_XBOX_NO_STORAGE 258 +#define IDD_MSG_XBOX_STORAGE_CHANGED 259 +#define IDD_MSG_XBOX_SAVE_FAILED 260 +#define IDD_MSG_XBOX_NO_STORAGE_ON_INVITE 261 + +#define IDD_OPTIONS_AUDIO_ADJUST_MIC 262 + +//MUF-MessageBox for restarting mission editor during layout change +#define IDD_MSG_RESTART_EDITOR 263 + +#define IDD_PROGRESS_MESSAGE 264 + +//Message box for confirming deleting published mission +#define IDD_MSG_DELETE_STEAM_MISSION 265 +//Message box for confirming updating published mission +#define IDD_MSG_UPDATE_STEAM_MISSION 266 +//Message box for confirming saving current mission before the publish dialog is opened +#define IDD_MSG_SAVE_MISSION_BEFORE_PUBLISH 267 +//Message box for asking user to agree with Battleye licence. +#define IDD_MSG_BATTLEYE_LICENCE 268 +#define IDD_MSG_UPNP_ACTIVATION 269 +//#define IDD_MSG_ACCOUNT_LOGIN_GUIDE 270 - Reserved + +// InGameUI +#define IDD_UNITINFO 300 +#define IDD_HINT 301 +#define IDD_TASKHINT 302 +#define IDD_STANCEINFO 303 +#define IDD_AVCAMERA 304 +#define IDD_STAMINA_BAR 305 + +//Custom Info +#define IDD_CUSTOMINFO 310 +#define IDD_CUSTOMINFO_MINIMAP 311 +#define IDD_CUSTOMINFO_SLA 312 +#define IDD_CUSTOMINFO_CREW 313 +#define IDD_CUSTOMINFO_SENS 314 +#define IDD_CUSTOMINFO_FEEDUAV 315 +#define IDD_CUSTOMINFO_FEEDDRIVER 316 +#define IDD_CUSTOMINFO_FEEDPRIMARYGUNNER 317 +#define IDD_CUSTOMINFO_FEEDCOMMANDER 318 +#define IDD_CUSTOMINFO_FEEDMISSILE 319 +#define IDD_CUSTOMINFO_MINEDETECT 320 + + +// Futura ui +#define IDD_FUTURAGEAR 602 +// FUTURA GEAR controls +#define IDC_FG_PRIMARY 610 +#define IDC_FG_SECONDARY 611 +#define IDC_FG_HANDGUN 612 + +// prefix 620 means slot items +//--- +#define IDC_FG_MAP 6211 +#define IDC_FG_COMPASS 6212 +#define IDC_FG_WATCH 6213 +#define IDC_FG_RADIO 6214 +#define IDC_FG_GPS 6215 + +#define IDC_FG_GOGGLES 6216 +#define IDC_FG_HMD 6217 +#define IDC_FG_BINOC 6238 + +#define IDC_FG_BACKPACK2 6239 +#define IDC_FG_HEADGEAR 6240 + +// prefix 630 means slot container items(uniform, vest, backpack) +#define IDC_FG_UNIFORM_SLOT 6301 +#define IDC_FG_VEST_SLOT 6302 +#define IDC_FG_BACKPACK_SLOT 6303 +/// containers load +#define IDC_FG_UNIFORM_LOAD 6304 +#define IDC_FG_VEST_LOAD 6305 +#define IDC_FG_BACKPACK_LOAD 6306 +#define IDC_FG_GROUND_LOAD 6307 +#define IDC_FG_TOTAL_LOAD 6308 +//--- +#define IDC_FG_MAGAZINES 618 +// primary +#define IDC_FG_PW_MUZZLE 620 +#define IDC_FG_PW_OPTICS 621 +#define IDC_FG_PW_FLASHLIGHT 622 +#define IDC_FG_PW_MAGAZINE 623 +// secondary +#define IDC_FG_SW_MUZZLE 624 +#define IDC_FG_SW_OPTICS 625 +#define IDC_FG_SW_FLASHLIGHT 626 +#define IDC_FG_SW_MAGAZINE 627 +// handgun +#define IDC_FG_HG_MUZZLE 628 +#define IDC_FG_HG_OPTICS 629 +#define IDC_FG_HG_FLASHLIGHT 630 +#define IDC_FG_HG_MAGAZINE 631 + +#define IDC_FG_GROUND_ITEMS 632 +#define IDC_FG_CHOSEN_CONTAINER 640 +#define IDC_FG_PW_UNDERBARREL 641 +#define IDC_FG_SW_UNDERBARREL 642 +#define IDC_FG_HG_UNDERBARREL 643 +#define IDC_FG_PW_MAGAZINE_GL 644 +// #define IDC_FG_BACKPACK_ITEMS 633 +// #define IDC_FG_ITEMS 619 + +// new inventory + +// filter +#define IDC_FG_GROUND_FILTER 6554 + +// images which will painted over containers during DnD state +#define IDC_FG_GROUND_MARKER 6385 +#define IDC_FG_CONTAINER_MARKER 6325 +#define IDC_FG_CHOSEN_MARKER 6405 + +#define IDC_FG_VEST_CONTAINER 638 +#define IDC_FG_UNIFORM_CONTAINER 633 +#define IDC_FG_BACKPACK_CONTAINER 619 + +#define IDC_FG_VEST_TAB 6381 +#define IDC_FG_VEST_TEXT 6382 +#define IDC_FG_UNIFORM_TAB 6331 +#define IDC_FG_UNIFORM_TEXT 6332 +#define IDC_FG_BACKPACK_TAB 6191 +#define IDC_FG_BACKPACK_TEXT 6192 + +#define IDC_FG_CHOSEN_TAB 6401 +#define IDC_FG_CHOSEN_TEXT 6402 +#define IDC_FG_GROUND_TAB 6321 +#define IDC_FG_GROUND_TEXT 6322 +#define IDC_DLC_TEMPLATE_LOGO 100 +#define IDC_DLC_TEMPLATE_BACKGROUND 101 +/////////////// + +/// weight info +#define IDC_FG_GROUND_WEIGHT 634 +#define IDC_FG_BACKPACK_WEIGHT 635 +#define IDC_FG_ITEMS_WEIGHT 636 + +/// player info +#define IDC_FG_TOTAL_WEIGHT 637 +////// + +// Arcade Sites +#define IDD_ARCADE_SITE 700 + +#define IDC_AS_AZIMUT 701 +#define IDC_AS_AZIMUT_PICTURE 702 + +// ---- combos +#define IDC_AS_SIDE 703 +#define IDC_AS_FACTION 704 +#define IDC_AS_CLASS 705 +#define IDC_AS_SITETYPE 706 +#define IDC_AS_REPAIRABLE 707 +#define IDC_AS_FASTTRAVEL 708 +#define IDC_AS_STORAGE 709 +// ---- flags +#define IDC_AS_FLGEQUIP 710 +#define IDC_AS_FLGFOOD 711 +#define IDC_AS_FLGARMORED 712 +#define IDC_AS_FLGFUEL 713 +#define IDC_AS_FLGWEAPON 714 +// ---- strings +#define IDC_AS_NAME 715 +#define IDC_AS_DESC 716 +#define IDC_AS_INIT 717 +#define IDC_AS_CONDITION 718 +#define IDC_AS_RADIUS 719 +// ---- sliders +#define IDC_AS_HEALTH 720 +#define IDC_AS_MOOD 721 +#define IDC_AS_PRESENCE 722 + +#define IDC_AS_ARGUMENTS 733 +//////////////////////////////////////// + +// Virtual keyboard +#define IDC_VK_SHIFT 1001 +#define IDC_VK_CAPSLOCK 1002 +#define IDC_VK_SYMBOLS 1003 +#define IDC_VK_ACCENTS 1004 +#define IDC_VK_BACKSPACE 1005 +#define IDC_VK_LEFT 1006 +#define IDC_VK_RIGHT 1007 +#define IDC_VK_BASE 1010 + +// Main display controls +#define IDC_MAIN_GAME 101 +#define IDC_MAIN_OPTIONS 102 +#define IDC_MAIN_TRAINING 103 +#define IDC_MAIN_CUSTOM 104 +#define IDC_MAIN_MULTIPLAYER 105 +#define IDC_MAIN_QUIT 106 +#define IDC_MAIN_CREDITS 107 +#define IDC_MAIN_ARCADE 108 +#define IDC_MAIN_PLAYER 109 +#define IDC_MAIN_RANK 110 +#define IDC_MAIN_ISLAND 111 +#define IDC_MAIN_DATE 112 +#define IDC_MAIN_MISSION 113 +#define IDC_MAIN_CONTINUE 114 +#define IDC_MAIN_EDITOR 115 +#define IDC_MAIN_BOOK 116 +#define IDC_MAIN_SINGLE 117 +#define IDC_MAIN_VERSION 118 +#define IDC_MAIN_SINGLE_PROFILES 119 +#define IDC_MAIN_CAMPAIGN_PROFILES 120 +#define IDC_MAIN_MP_PROFILES 121 +#define IDC_MAIN_SETTINGS_PROFILES 122 +#define IDC_MAIN_SYSTEM_LINK 123 +#define IDC_MAIN_CUSTOM_PROFILES 124 +#define IDC_MAIN_SIGN_IN_STATUS 125 +#define IDC_MAIN_PLAYER_LABEL 126 +#define IDC_MAIN_PLAYER_NAME 127 +#define IDC_MAIN_CONTROLS 128 +#define IDC_MAIN_PLAYER_ID 129 +#define IDC_MAIN_PLAYER_COLOR 130 +#define IDC_MAIN_SERVICE_ID_LABEL 131 +#define IDC_MAIN_NICKNAME_LABEL 132 +#define IDC_MAIN_NICKNAME_BG 133 +#define IDC_MAIN_LOAD 134 +#define IDC_MAIN_SAVE 135 +#define IDC_MAIN_AAR 136 +#define IDC_MAIN_ACHIEVEMENTS 137 +#define IDC_MAIN_SINGLEPLAYER 138 +#define IDC_MAIN_MOD_LIST 139 +#define IDC_MAIN_MOD_LAUNCHER 140 +#define IDC_MAIN_MOD_ICONS 141 +#define IDC_SP_EDITOR 142 +#define IDC_MAIN_FIELD_MANUAL 143 +#define IDC_MAIN_DLC_ICONS 144 +#define IDC_MAIN_DLC_OWNED_ICONS 145 +#define IDC_MAIN_DLC_ICONS_BACK 146 +#define IDC_MAIN_MOD_ICONS_BACK 147 +#define IDC_MAIN_DLC_OWNED_ICONS_BACK 148 +#define IDC_MAIN_BOOTCAMP_CAMPAIGN 149 +#define IDC_MAIN_BOOTCAMP_SHOWCASES 150 +#define IDC_MAIN_BOOTCAMP_CHALLENGES 151 +#define IDC_MAIN_BOOTCAMP_VRTRAINING 152 +#define IDC_MAIN_QUICKPLAY 154 +#define IDC_MAIN_UNIT 155 + +#define IDC_MAIN_CARDAS_CUDL 199 // muj vlastni cudl + +#define IDC_MAIN_VIDEOCONTROL 3335 + +#define IDC_MAIN_TAB_LOGIN 9001 +#define IDC_MAIN_TAB_LIBRARY 9002 +#define IDC_MAIN_TAB_SINGLE 9003 +#define IDC_MAIN_TAB_MULTIPLAYER 9004 +#define IDC_MAIN_TAB_OPTIONS 9005 +#define IDC_MAIN_TAB_CONTROLS 9006 +#define IDC_MAIN_TAB_EDITOR 9007 +#define IDC_MAIN_TAB_QUIT 9008 +#define IDC_MAIN_TAB_AAR 9011 + +#define IDC_BUILD_VERSION 9009 +#define IDC_BUILD_DATE 9010 + +// Single player display controls +#define IDC_SP_TRAINING 101 +//#define IDC_SP_EDITOR 102 +#define IDC_SP_MISSION 103 +#define IDC_SP_CAMPAIGN 104 + +// Select profile display controls +#define IDC_PROFILES_LIST 101 +#define IDC_PROFILES_HEAD 102 +#define IDC_PROFILES_TITLE 103 +#define IDC_PROFILES_CONTROLLER 104 +#define IDC_PROFILES_DIFFICULTY 105 +#define IDC_PROFILES_MISSION 106 +#define IDC_PROFILES_LIVE 107 +#define IDC_PROFILES_MISSION_TEXT 108 +#define IDC_PROFILES_SIGN_IN_STATUS 109 +#define IDC_PROFILES_EDIT 110 +#define IDC_PROFILES_DELETE 111 + +// Edit profile display controls +#define IDC_PROFILE_NAME 101 +#define IDC_PROFILE_FACE 102 +#define IDC_PROFILE_VOICE 103 +#define IDC_PROFILE_CONTROLLER 104 +#define IDC_PROFILE_AUDIO 105 +#define IDC_PROFILE_VIDEO 106 +#define IDC_PROFILE_HEAD 108 +#define IDC_PROFILE_SUM_NAME 109 +#define IDC_PROFILE_SUM_CONTROLLER 110 +#define IDC_PROFILE_SUM_LIVE 111 +#define IDC_PROFILE_VOICE_MASK 112 +#define IDC_PROFILE_SIGN_IN_STATUS 113 +#define IDC_PROFILE_CREDITS 114 +#define IDC_PROFILE_STORAGE_DEVICE 115 + +// Edit profile name display controls +#define IDC_PROFILE_NAME_PREVIEW 101 + +// Edit profile face +#define IDC_PROF_FACE_FACE 101 +#define IDC_PROF_FACE_GLASSES 102 +#define IDC_PROF_FACE_HEAD 103 + +// Edit profile voice +#define IDC_PROF_VOICE_SPEAKER 101 +#define IDC_PROF_VOICE_PITCH_TITLE 102 +#define IDC_PROF_VOICE_PITCH_VALUE 103 +#define IDC_PROF_VOICE_PITCH 104 +#define IDC_PROF_VOICE_MASK 105 +#define IDC_PROF_VOICE_THROUGH_SPEAKERS 106 +#define IDC_PROF_VOICE_HEAD 107 +#define IDC_PROF_VOICE_DEFAULT 108 + +// Edit profile controller +#define IDC_PROF_CONTR_VEHICLE 101 +#define IDC_PROF_CONTR_TYPE 102 +#define IDC_PROF_CONTR_IMAGE 103 +#define IDC_PROF_CONTR_SCHEME 104 +#define IDC_PROF_CONTR_SENSITIVITY 105 +#define IDC_PROF_CONTR_A 200 +#define IDC_PROF_CONTR_B 201 +#define IDC_PROF_CONTR_Y 202 +#define IDC_PROF_CONTR_X 203 +#define IDC_PROF_CONTR_WHITE 204 +#define IDC_PROF_CONTR_BLACK 205 +#define IDC_PROF_CONTR_LEFT 206 +#define IDC_PROF_CONTR_RIGHT 207 +#define IDC_PROF_CONTR_UP 208 +#define IDC_PROF_CONTR_DOWN 209 +#define IDC_PROF_CONTR_BACK 210 +#define IDC_PROF_CONTR_START 211 +#define IDC_PROF_CONTR_LEFT_THUMB 212 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_X 213 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_Y 214 +#define IDC_PROF_CONTR_RIGHT_THUMB 215 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_X 216 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_Y 217 +#define IDC_PROF_CONTR_LEFT_TRIGGER 218 +#define IDC_PROF_CONTR_RIGHT_TRIGGER 219 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE 220 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE 221 +#define IDC_PROF_CONTR_DPAD 222 +#define IDC_PROF_CONTR_NEXT_SCHEME 223 +#define IDC_PROF_CONTR_PREV_SCHEME 224 +#define IDC_PROF_CONTR_Y_AXIS 225 +#define IDC_PROF_CONTR_VIBRATIONS 226 + +// Controller buttons +// #define IDC_CONTROLLER_BUTTONS 101 + +// Edit profile audio options +#define IDC_PROF_AUDIO_MUSIC_TITLE 101 +#define IDC_PROF_AUDIO_MUSIC_VALUE 102 +#define IDC_PROF_AUDIO_MUSIC 103 +#define IDC_PROF_AUDIO_RADIO_TITLE 104 +#define IDC_PROF_AUDIO_RADIO_VALUE 105 +#define IDC_PROF_AUDIO_RADIO 106 +#define IDC_PROF_AUDIO_EFFECT_TITLE 107 +#define IDC_PROF_AUDIO_EFFECT_VALUE 108 +#define IDC_PROF_AUDIO_EFFECT 109 +#define IDC_PROF_AUDIO_DEFAULT 110 + +// Edit profile video options +#define IDC_PROF_VIDEO_BRIGHT 101 +#define IDC_PROF_VIDEO_BRIGHT_TITLE 102 +#define IDC_PROF_VIDEO_BRIGHT_VALUE 103 +#define IDC_PROF_VIDEO_GAMMA 104 +#define IDC_PROF_VIDEO_GAMMA_TITLE 105 +#define IDC_PROF_VIDEO_GAMMA_VALUE 106 +#define IDC_PROF_VIDEO_SUBTITLES 107 +#define IDC_PROF_VIDEO_RADIO 108 +#define IDC_PROF_VIDEO_DEFAULT 109 + +// Select profile an Xbox live account display controls +#define IDC_PROFILE_LIVE_ACCOUNTS 101 +#define IDC_PROFILE_LIVE_CREATE 102 + +// Select difficulty dialog +#define IDC_DIFF_LIST 108 +#define IDC_DIFF_DESC 102 + +// Single mission display controls +#define IDC_SINGLE_MISSION 101 +#define IDC_SINGLE_OVERVIEW 102 +#define IDC_SINGLE_MISSION_PAD 103 +#define IDC_SINGLE_DIFF 104 +#define IDC_SINGLE_LOAD 105 +#define IDC_SINGLE_TITLE 106 +#define IDC_SINGLE_DELETE 107 +#define IDC_SINGLE_COPY 108 +#define IDC_SINGLE_EDIT 109 +#define IDC_SINGLE_NAME 110 +#define IDC_SINGLE_AUTHOR 111 +#define IDC_SINGLE_PICTURE 112 +#define IDC_SINGLE_DESCRIPTION 113 +#define IDC_SINGLE_LOADING_PICTURE 114 +#define IDC_SINGLE_SHOW_MISSION_WORKSHOP 115 +#define IDC_SINGLE_SHOW_GAME_WORKSHOP 116 +#define IDC_SINGLE_SHOW_GAME_OR_MISSION_WORKSHOP 117 +#define IDC_SINGLE_MISSION_SORT_COMBO 118 +#define IDC_SINGLE_MISSION_SORT_ORDER 119 +#define IDC_SINGLE_MISSION_BUY_DLC 120 +#define IDC_SINGLE_MISSION_DLCSTRIPE 121 +#define IDC_SINGLE_MISSION_DLCICON 122 + +// Xbox style mission wizard +#define IDC_XWIZ_TEMPLATE 101 +#define IDC_XWIZ_TEMPLATE_OVERVIEW 102 + +#define IDC_XWIZ_NAME 101 +#define IDC_XWIZ_ISLAND 102 +#define IDC_XWIZ_WEATHER 103 +#define IDC_XWIZ_TIME 104 +#define IDC_XWIZ_SUM_NAME 105 +#define IDC_XWIZ_SUM_TIME 106 +#define IDC_XWIZ_SUM_TEMPLATE 107 +#define IDC_XWIZ_SUM_ISLAND 108 +#define IDC_XWIZ_SUM_WEATHER 109 +#define IDC_XWIZ_SUM_WEATHER_FORECAST 110 +#define IDC_XWIZ_UNIT 111 +#define IDC_XWIZ_MAP 112 +#define IDC_XWIZ_SUM_DATE 113 +#define IDC_XWIZ_PARAM 114 +#define IDC_XWIZ_SAVE 115 + +#define IDC_XWIZ_UNITS 101 +#define IDC_XWIZ_UNITS_OVERVIEW 102 + +#define IDC_XWIZ_PARAMS 101 +#define IDC_XWIZ_PARAMS_TITLES 102 +#define IDC_XWIZ_PARAMS_VALUES 103 +#define IDC_EDIT 104 +#define IDD_XWIZARD_PARAMETER_TITLE 105 + +#define IDC_XWIZ_UNIT_SELECT 101 +#define IDC_XWIZ_UNIT_SELECT_TITLE 102 + +#define IDC_XWIZ_UNIT_CLASS 101 +#define IDC_XWIZ_UNIT_TYPE 102 +#define IDC_XWIZ_UNIT_COUNT 103 +#define IDC_XWIZ_UNIT_SIDE 104 +#define IDC_XWIZ_UNIT_SELECT_CUSTOM_TITLE 105 + +#define IDC_XWIZ_WP_TYPE 101 +#define IDC_XWIZ_WP_BEHAVIOUR 102 +#define IDC_XWIZ_WP_FORMATION 103 +#define IDC_XWIZ_WP_COMBAT_MODE 104 + +#define IDC_XWIZ_ISLAND_LIST 101 +#define IDC_XWIZ_ISLAND_MAP 102 +#define IDC_XWIZ_ISLAND_SHOTS 103 + +#define IDC_XWIZ_WEATHER_TITLE 101 +#define IDC_XWIZ_WEATHER_VALUE 102 +#define IDC_XWIZ_WEATHER_FORECAST_TITLE 103 +#define IDC_XWIZ_WEATHER_FORECAST_VALUE 104 +#define IDC_XWIZ_FOG_TITLE 105 +#define IDC_XWIZ_FOG_VALUE 106 +#define IDC_XWIZ_FOG_FORECAST_TITLE 107 +#define IDC_XWIZ_FOG_FORECAST_VALUE 108 +#define IDC_XWIZ_VIEW_DISTANCE_TITLE 109 +#define IDC_XWIZ_VIEW_DISTANCE_VALUE 110 + +#define IDC_XWIZ_TIME_HOUR 101 +#define IDC_XWIZ_TIME_MINUTE 102 +#define IDC_XWIZ_TIME_DAY 103 +#define IDC_XWIZ_TIME_MONTH 104 +#define IDC_XWIZ_TIME_YEAR 105 + +#define IDC_XWIZ_MAP_POINTS 101 +#define IDC_XWIZ_MAP_DELETE 102 +#define IDC_XWIZ_MAP_EDIT 103 +#define IDC_XWIZ_MAP_INSERT_WP 104 +#define IDC_XWIZ_MAP_NOTEPAD 105 +#define IDC_XWIZ_MAP_MOVE 106 + +// Select campaign display +#define IDC_CAMPAIGNS_LIST 101 +#define IDC_CAMPAIGNS_CAMPAIGN 102 +#define IDC_CAMPAIGNS_DESCRIPTION 103 + +// Campaign display +#define IDC_CAMPAIGN_HISTORY 101 +#define IDC_CAMPAIGN_REPLAY 102 +#define IDC_CAMPAIGN_DIFF 103 +#define IDC_CAMPAIGN_NAME 104 +#define IDC_CAMPAIGN_AUTHOR 105 +#define IDC_CAMPAIGN_PICTURE 106 +#define IDC_CAMPAIGN_DESCRIPTION 107 +#define IDC_CAMPAIGN_TEXT_ESTDEPLOY 108 +#define IDC_CAMPAIGN_RELEASEDATE 109 +#define IDC_CAMPAIGN_BUY_DLC 110 +#define IDC_CAMPAIGN_DLCSTRIPE 111 +#define IDC_CAMPAIGN_DLCICON 112 + +// MP campaign display +#define IDC_CAMPAIGN_MP_LIST 101 +#define IDC_CAMPAIGN_MP_TITLE 102 +#define IDC_CAMPAIGN_MP_NAME 103 +#define IDC_CAMPAIGN_MP_AUTHOR 104 +#define IDC_CAMPAIGN_MP_PICTURE 105 +#define IDC_CAMPAIGN_MP_DESCRIPTION 106 +#define IDC_CAMPAIGN_MP_PLAY 107 +#define IDC_CAMPAIGN_MP_HOST 108 +#define IDC_CAMPAIGN_MP_JOIN 109 +#define IDC_CAMPAIGN_MP_BUY_DLC 110 + +// Revert display +#define IDC_REVERT_BOOK 101 +#define IDC_REVERT_TITLE 102 +#define IDC_REVERT_QUESTION 103 + +// Game display controls +#define IDC_GAME_SELECT 301 +#define IDC_SIDE_NAME 101 + +// Options display controls +#define IDC_OPTIONS_VIDEO 301 +#define IDC_OPTIONS_AUDIO 302 +#define IDC_OPTIONS_CONFIGURE 303 +#define IDC_OPTIONS_DIFFICULTY 304 +#define IDC_OPTIONS_NOTEBOOK 305 +#define IDC_OPTIONS_CREDITS 306 +#define IDC_OPTIONS_GAMEOPTIONS 307 + +#define IDC_OPTIONS_OBJECT_VISIBILITY_VALUE 308 +#define IDC_OPTIONS_OBJECT_VISIBILITY_SLIDER 309 +#define IDC_OPTIONS_VISIBILITY_TEXT 310 +#define IDC_OPTIONS_SHADOW_VISIBILITY_VALUE 311 +#define IDC_OPTIONS_SHADOW_VISIBILITY_SLIDER 312 +#define IDC_OPTIONS_SHADOW_VISIBILIT_TEXT 313 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_VALUE 314 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_SLIDER 315 +#define IDC_OPTIONS_PIP_VISIBILITY_VALUE 316 +#define IDC_OPTIONS_PIP_VISIBILITY_SLIDER 317 + +#define IDC_OPTIONS_PIP_VALUE 334 +#define IDC_OPTIONS_SW_VALUE 335 +#define IDC_OPTIONS_FXAA_VALUE 336 +#define IDC_OPTIONS_WATER_SS_REFLECTIONS_VALUE 337 + +#define IDC_OPTIONS_QUALITY_VALUE 101 +#define IDC_OPTIONS_QUALITY_SLIDER 102 +#define IDC_OPTIONS_VISIBILITY_VALUE 103 +#define IDC_OPTIONS_VISIBILITY_SLIDER 104 + +#define IDC_OPTIONS_DRAWDISTANCE_VALUE 1336 +#define IDC_OPTIONS_DRAWDISTANCE_SLIDER 1337 + +#define IDC_OPTIONS_RATE_VALUE 105 +#define IDC_OPTIONS_RATE_SLIDER 106 +#define IDC_OPTIONS_TEXTURES_VALUE 107 +#define IDC_OPTIONS_TEXTURES_SLIDER 108 +#define IDC_OPTIONS_GAMMA_VALUE 109 +#define IDC_OPTIONS_GAMMA_SLIDER 110 +#define IDC_OPTIONS_BRIGHT_VALUE 111 +#define IDC_OPTIONS_BRIGHT_SLIDER 112 +#define IDC_OPTIONS_RESOLUTION 113 +#define IDC_OPTIONS_DISPLAY_MODE 1131 +#define IDC_OPTIONS_REFRESH 114 +#define IDC_OPTIONS_OBJSHADOWS 115 +//#define IDC_OPTIONS_VEHSHADOWS 116 +//#define IDC_OPTIONS_CLOUDLETS 117 +//#define IDC_OPTIONS_HWTL 118 +#define IDC_OPTIONS_BLOOD 119 +//#define IDC_OPTIONS_MULTITEXTURING 120 +#define IDC_OPTIONS_WBUFFER 121 +#define IDC_OPTIONS_BLOOD_TEXT 122 +#define IDC_OPTIONS_TERRAIN 123 +#define IDC_OPTIONS_LIFESTATE 199 +#define IDC_OPTIONS_TUTORIAL_HINTS 140 + +#define IDC_OBJECTS_DETAIL 124 +#define IDC_TEXTURE_DETAIL 125 +#define IDC_QUALITY_PREFERENCE 126 +#define IDC_SHADING_DETAIL 127 +#define IDC_SHADOW_DETAIL 128 + +#define IDC_OPTIONS_VIDEO_DEFAULT 129 +#define IDC_OPTIONS_VIDEO_AUTODETECT 1291 + +#define IDC_ANISO_DETAIL 130 +#define IDC_HDR_DETAIL 131 +#define IDC_POSTPROCESS_EFFECTS 132 +#define IDC_FSAA_DETAIL 133 +#define IDC_ASPECT_RATIO 134 +#define IDC_ATOC_DETAIL 1300 +#define IDC_PPAA_DETAIL 1301 + +#define IDC_OPTIONS_PP_SSAO 1310 +#define IDC_OPTIONS_PP_BLOOM_SLIDER 1311 +#define IDC_OPTIONS_PP_BLOOM_VALUE 1312 +#define IDC_OPTIONS_PP_ROTBLUR_SLIDER 1313 +#define IDC_OPTIONS_PP_ROTBLUR_VALUE 1314 +#define IDC_OPTIONS_PP_RADIALBLUR_SLIDER 1315 +#define IDC_OPTIONS_PP_RADIALBLUR_VALUE 1316 +#define IDC_OPTIONS_PP_DOF_SLIDER 1317 +#define IDC_OPTIONS_PP_DOF_VALUE 1318 +#define IDC_OPTIONS_PP_CAUSTICS 1319 +#define IDC_OPTIONS_PP_SHARPEN_SLIDER 1320 +#define IDC_OPTIONS_PP_SHARPEN_VALUE 1321 +#define IDC_OPTIONS_PP_COLOR_CORRECTIONS 1322 +#define IDC_OPTIONS_PP_BRIGHTNESS_SLIDER 1323 +#define IDC_OPTIONS_PP_BRIGHTNESS_VALUE 1324 +#define IDC_OPTIONS_PP_CONTRAST_SLIDER 1325 +#define IDC_OPTIONS_PP_CONTRAST_VALUE 1326 +#define IDC_OPTIONS_PP_SATURATION_SLIDER 1327 +#define IDC_OPTIONS_PP_SATURATION_VALUE 1328 + +#define IDC_OPTIONS_VIDEO_FPS_TEXT 1400 +#define IDC_OPTIONS_VIDEO_PERF_WARNING 1401 + + +#define IDC_OPTIONS_LANGUAGE 135 + +#define IDC_OPTIONS_IGUISIZE 136 +#define IDC_OPTIONS_IGUISIZE_LABEL 1014 +#define IDC_OPTIONS_IGUISIZE_TEXT 137 +#define IDC_OPTIONS_HEADBOB 138 + +#define IDC_VRAM_VALUE 139 + +#define IDC_VSYNC_VALUE 140 +#define IDC_OPTIONS_IMPERIALUNITS 141 +#define IDC_OPTIONS_VEHICLEFREELOOK 142 +#define IDC_OPTIONS_STREAM_FRIENDLY 143 +#define IDC_OPTIONS_ADAPTIVE_CROSSHAIR 144 +#define IDC_OPTIONS_INSTRUCTOR_FIGURE 145 +#define IDC_OPTIONS_ENABLE_RTD 146 +#define IDC_OPTIONS_ALLOW_FULL_RTD_HUD 147 +#define IDC_OPTIONS_ALLOW_ROUGH_LANDING_RTD 148 +#define IDC_OPTIONS_WIND_INFLUENCE_DYN_RTD 149 +#define IDC_OPTIONS_AUTO_TRIM_RTD 150 +#define IDC_OPTIONS_STRESS_DAMAGE_RTD 151 + +#define IDC_PARTICLES_EFFECTS 143 +#define IDC_OPTIONS_DYNAMIC_LIGHTS 144 + +#define IDC_OPTIONS_SLIDER_FILLRATE 1234 +#define IDC_OPTIONS_VALUE_FILLRATE 1236 + + +#define IDC_OPTIONS_MUSIC_VALUE 101 +#define IDC_OPTIONS_MUSIC_SLIDER 102 +#define IDC_OPTIONS_EFFECTS_VALUE 103 +#define IDC_OPTIONS_EFFECTS_SLIDER 104 +#define IDC_OPTIONS_VOICES_VALUE 105 +#define IDC_OPTIONS_VOICES_SLIDER 106 +#define IDC_OPTIONS_SAMPLING 107 +#define IDC_OPTIONS_HWACC 108 +#define IDC_OPTIONS_EAX 109 +#define IDC_OPTIONS_SINGLE_VOICE 110 +#define IDC_OPTIONS_AUDIO_DEFAULT 111 +#define IDC_OPTIONS_PLAYER_VOICE 112 +#define IDC_OPTIONS_VON_VALUE 113 +#define IDC_OPTIONS_VON_SLIDER 114 +//samples setting was replaced by audio output device +#define IDC_OPTIONS_SAMPLES_VALUE 115 +#define IDC_OPTIONS_SAMPLES_SLIDER 116 + +#define IDC_OPTIONS_AUDIO_OUTPUT_REFRESH 115 +#define IDC_OPTIONS_AUDIO_OUTPUT_COMBO 116 + +#define IDC_OPTIONS_MIC_SENS_SLIDER 117 +#define IDC_OPTIONS_MIC_ADJUST 118 + +#define IDC_OPTIONS_MAPDUCKING_VALUE 119 +#define IDC_OPTIONS_MAPDUCKING_SLIDER 120 + +// microphone adjustment +#define IDC_OPTIONS_MIC_PROGRESS_BAR 1001 +#define IDC_OPTIONS_MIC_PROGRESS 1002 + +#define IDC_OPTIONS_SUBTITLES 102 +#define IDC_OPTIONS_RADIO 103 + +#define IDC_DIFF_AI_LEVEL_TEXT 1510 +#define IDC_DIFF_AI_LEVEL 1511 +#define IDC_DIFF_AI_SKILL_LABEL 1512 +#define IDC_DIFF_AI_SKILL_SLIDER 1513 +#define IDC_DIFF_AI_SKILL_VALUE 1514 +#define IDC_DIFF_AI_PRECISION_LABEL 1515 +#define IDC_DIFF_AI_PRECISION_SLIDER 1516 +#define IDC_DIFF_AI_PRECISION_VALUE 1517 +#define IDC_DIFF_PICTURE 1518 +#define IDC_DIFF_DESCRIPTION 1519 +#define IDC_DIFF_OPTIONS_GROUP 1520 +#define IDC_DIFF_REDUCED_DAMAGE 1521 +#define IDC_DIFF_GROUP_INDICATORS 1522 +#define IDC_DIFF_FRIENDLY_TAG 1523 +#define IDC_DIFF_ENEMY_TAG 1524 +#define IDC_DIFF_MINES 1525 +#define IDC_DIFF_COMMANDS 1526 +#define IDC_DIFF_WAYPOINTS 1527 +#define IDC_DIFF_WEAPON_INFO 1528 +#define IDC_DIFF_STANCE_INDICATOR 1529 +#define IDC_DIFF_STAMINA_BAR 1530 +#define IDC_DIFF_CROSSHAIR 1531 +#define IDC_DIFF_VISION_AID 1532 +#define IDC_DIFF_THIRD_PERSON 1533 +#define IDC_DIFF_CAMERA_SHAKE 1534 +#define IDC_DIFF_SCORE_TABLE 1535 +#define IDC_DIFF_KILLED_BY 1536 +#define IDC_DIFF_VON_ID 1537 +#define IDC_DIFF_EXTENDED_MAP_FRIENDLY 1538 +#define IDC_DIFF_AUTO_REPORT 1539 +#define IDC_DIFF_MULTIPLE_SAVES 1540 +// #define IDC_DIFF_SQUAD_RADAR 1541 +#define IDC_DIFF_TACTICAL_PING 1542 +#define IDC_DIFF_EXTENDED_MAP_ENEMY 1543 +#define IDC_DIFF_EXTENDED_MAP_MINES 1544 +#define IDC_DIFF_MINIMAP_ALLOWED 1545 +#define IDC_DIFF_EXTENDED_MAP_PING 1546 + +// Configure display controls +#define IDC_CONFIG_DEFAULT 101 +#define IDC_CONFIG_KEYS 102 +#define IDC_CONFIG_XAXIS 103 +#define IDC_CONFIG_YAXIS 104 +#define IDC_CONFIG_YREVERSED 105 +#define IDC_CONFIG_JOYSTICK 106 +#define IDC_CONFIG_BUTTONS 107 +#define IDC_CONFIG_CONTROLS_PAGE 108 +#define IDC_CONFIG_FLOATING_ZONE 109 +#define IDC_CONFIG_MOUSE_FILTERING 110 +#define IDC_CONFIG_GEARBOX_MODE 112 +#define IDC_CONFIG_MOUSE_ACCELERATION 113 +#define IDC_CONFIG_KEY_PRESETS 114 + +// dialog for selecting default controls preset +#define IDC_CONFIG_DEFAULTCONTROLS_LIST 101 + +// Multiplayer type display controls +#define IDC_MP_TYPE_RANKED_MATCH 101 +#define IDC_MP_TYPE_PLAYER_MATCH 102 +#define IDC_MP_TYPE_SYSTEM_LINK 103 +#define IDC_MP_TYPE_FRIENDS 104 +#define IDC_MP_TYPE_DOWNLOAD 105 +#define IDC_MP_TYPE_INFO 106 +#define IDC_MP_TYPE_STATS 107 +#define IDC_MP_TYPE_SIGN_OUT 108 +#define IDC_MP_TYPE_DEDICATED_SERVER 109 +#define IDC_MP_TYPE_SERVER 110 +#define IDC_MP_TYPE_APPEAR_OFFLINE 111 + +// Xbox Live display controls +#define IDC_LIVE_QUICK_MATCH 101 +#define IDC_LIVE_CUSTOM_MATCH 102 +#define IDC_LIVE_CREATE_MATCH 103 + +// Friends dialog +#define IDC_FRIENDS_LIST 101 +#define IDC_FRIENDS_STATUS 102 + +// Friends options dialog +#define IDC_FRIENDS_PLAYER 101 +#define IDC_FRIENDS_GAME_INVITE 102 +#define IDC_FRIENDS_GAME_CANCEL 103 +#define IDC_FRIENDS_GAME_ACCEPT 104 +#define IDC_FRIENDS_GAME_DECLINE 105 +#define IDC_FRIENDS_GAME_JOIN 106 +#define IDC_FRIENDS_ACCEPT 107 +#define IDC_FRIENDS_DECLINE 108 +#define IDC_FRIENDS_STOP 109 +#define IDC_FRIENDS_CANCEL 110 +#define IDC_FRIENDS_REMOVE 111 +#define IDC_FRIENDS_VOICE 112 +#define IDC_FRIENDS_FEEDBACK 113 +#define IDC_FRIENDS_GAME_INVITE_VOICE 114 +#define IDC_FRIENDS_PLAY_MESSAGE 115 +#define IDC_FRIENDS_MISSIONS 152 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 + +// Send voice mail dialog +#define IDC_SVM_TITLE 101 +#define IDC_SVM_PLAYER 102 +#define IDC_SVM_RECORD 103 +#define IDC_SVM_PLAY 104 +#define IDC_SVM_SEND 105 +#define IDC_SVM_PROGRESS 106 +#define IDC_SVM_TIME 107 + +// Receive voice mail dialog +#define IDC_RVM_TITLE 101 +#define IDC_RVM_PLAYER 102 +#define IDC_RVM_PLAY 103 +#define IDC_RVM_FEEDBACK 104 +#define IDC_RVM_PROGRESS 105 +#define IDC_RVM_TIME 106 + +// Xbox players dialog +#define IDC_XPLAYERS_LIST 101 +#define IDC_XPLAYERS_STATUS 102 +#define IDC_XPLAYERS_DISABLE_VOICE 103 +#define IDC_XPLAYERS_ENABLE_VOICE 104 +#define IDC_XPLAYERS_KICKOFF 105 + +// Xbox players options dialog +#define IDC_XPLAYERS_PLAYER 101 +#define IDC_XPLAYERS_ASK 102 +#define IDC_XPLAYERS_MUTE 103 +#define IDC_XPLAYERS_FEEDBACK 104 +#define IDC_XPLAYERS_CANCEL 105 +#define IDC_XPLAYERS_ASK_VOICE 107 + +// Feedback dialog +#define IDC_FEEDBACK_PLAYER 101 +#define IDC_FEEDBACK_DATE 102 +#define IDC_FEEDBACK_GREAT_SESSION 103 +#define IDC_FEEDBACK_GOOD_ATTITUDE 104 +#define IDC_FEEDBACK_BAD_NAME 105 +#define IDC_FEEDBACK_CURSING 106 +#define IDC_FEEDBACK_SCREAM 107 +#define IDC_FEEDBACK_CHEAT 108 +#define IDC_FEEDBACK_THREAT 109 +#define IDC_FEEDBACK_MSG_HARASSING 110 +#define IDC_FEEDBACK_MSG_OFFENSIVE 111 +#define IDC_FEEDBACK_MSG_SPAM 112 + +// Download content display controls +#define IDC_DOWNLOAD_CONTENT_LIST 101 + +#define IDC_DOWNLOAD_CONTENT_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_TERMS 102 +#define IDC_DOWNLOAD_CONTENT_PICTURE 103 +#define IDC_DOWNLOAD_CONTENT_SHOW_PRICE 104 + +#define IDC_DOWNLOAD_CONTENT_PRICE_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_PRICE 102 +#define IDC_DOWNLOAD_CONTENT_PRICE_QUESTION 103 + +#define IDC_INSTALL_CONTENT_PROGRESS 101 +#define IDC_INSTALL_CONTENT_NAME 102 +#define IDC_INSTALL_CONTENT_TIME 103 + +// Multiplayer passcode display controls +#define IDC_MP_PASSCODE_FIRST 101 + +// Multiplayer display controls +#define IDC_MULTI_TITLE 101 +#define IDC_MULTI_SESSIONS 102 +//#define IDC_MULTI_REMOTE 103 //Renamed to IDC_MULTI_TAB_DIRECT_CONNECT +//#define IDC_MULTI_NEW 104 //Renamed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_JOIN 105 +#define IDC_MULTI_NOTEBOOK 106 +#define IDC_MULTI_PASSWORD 107 +#define IDC_MULTI_PORT 108 +#define IDC_MULTI_SERVER_ICON 111 +#define IDC_MULTI_SERVER_COLUMN 112 +#define IDC_MULTI_MISSION_ICON 113 +#define IDC_MULTI_MISSION_COLUMN 114 +#define IDC_MULTI_STATE_ICON 115 +#define IDC_MULTI_STATE_COLUMN 116 +#define IDC_MULTI_PLAYERS_ICON 117 +#define IDC_MULTI_PLAYERS_COLUMN 118 +#define IDC_MULTI_PING_ICON 119 +#define IDC_MULTI_PING_COLUMN 120 +#define IDC_MULTI_PROGRESS 121 +#define IDC_MULTI_INTERNET 122 +#define IDC_MULTI_REFRESH 123 +#define IDC_MULTI_FILTER 124 +#define IDC_MULTI_SERVER_FILTER 125 +#define IDC_MULTI_MISSION_FILTER 126 +#define IDC_MULTI_PLAYERS_FILTER 127 +#define IDC_MULTI_PING_FILTER 128 +#define IDC_MP_HOST 129 +#define IDC_MP_TYPE 130 +#define IDC_MP_MISSION 131 +#define IDC_MP_ISLAND 132 +#define IDC_MP_STATE 133 +#define IDC_MP_TIMELEFT 134 +#define IDC_MP_SLOTS_PUBLIC 135 +#define IDC_MP_SLOTS_PRIVATE 136 +#define IDC_MP_NO_SESSION 137 +#define IDC_MP_DIFFICULTY 138 +#define IDC_MP_LANGUAGE 139 +#define IDC_MULTI_GAMETYPE_ICON 140 +#define IDC_MULTI_GAMETYPE_COLUMN 141 +#define IDC_MP_PING 142 +#define IDC_MP_PASSWORD 143 +#define IDC_MP_PLATFORM 144 +#define IDC_MP_COUNTRY 145 +#define IDC_MP_VERSION 146 +#define IDC_MP_VERSION_REQUIRED 147 +#define IDC_MP_MODS 148 +#define IDC_MP_PLAYERS_ROW 149 +#define IDC_MULTI_PASSWORDED_FILTER 150 +#define IDC_MULTI_FULL_FILTER 151 +#define IDC_MULTI_TYPE_FILTER 152 +#define IDC_MP_NEXT_SESSION 153 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 +#define IDC_MULTI_FAVORITE_COLUMN 156 +#define IDC_MULTI_FAVORITE_ICON 157 +#define IDC_MULTI_SERVER_COUNT 158 +#define IDC_MULTI_TAB_INTERNET 159 +#define IDC_MULTI_TAB_RECENT 160 +#define IDC_MULTI_TAB_LAN 161 +#define IDC_MULTI_TAB_FRIENDS 162 +#define IDC_MULTI_TAB_OFFICIAL 163 //Changed 164 to 163 +#define IDC_MULTI_TAB_QUICK_PLAY 164 //IDC_MULTI_QUICK_PLAY renamed to IDC_MULTI_TAB_OFFICIAL, changed to 164 +#define IDC_MULTI_TAB_SERVERS 165 //IDC_MULTI_SERVERS renamed to IDC_MULTI_TAB_SERVERS, changed to 165 +#define IDC_MULTI_TAB_DIRECT_CONNECT 166 //IDC_MULTI_REMOTE 103 renamed and changed to IDC_MULTI_TAB_DIRECT_CONNECT +#define IDC_MULTI_TAB_HOST_SERVER 167 //IDC_MULTI_NEW 104 renamed and changed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_LAUNCHER 168 //Launcher button +#define IDC_MP_FILEPATCHING 169 + +//MP Quick Play dialogue +#define IDC_MP_QUICK_GAME_TYPE 110 +#define IDC_MP_QUICK_MAX_PING 111 +#define IDC_MP_QUICK_BEST_SERVER 112 +#define IDC_MP_QUICK_FIND_SERVER 113 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_MODE_TITLE 115 +#define IDC_MP_QUICK_MODE_PICTURE 116 +#define IDC_MP_QUICK_MODE_DESCRIPTION 117 +#define IDC_MP_QUICK_MODE_BACKGROUND 118 + +//Server Search dialogue +#define IDC_MP_SERVER_SEARCH_STATUS 101 +#define IDC_MP_SERVER_SEARCH_PROGRESS 102 + +//Server Found dialogue +#define IDC_MP_SERVER_FOUND_COUNTDOWN 101 +#define IDC_MP_SERVER_FOUND_MISSION 102 +#define IDC_MP_SERVER_FOUND_GAME_TYPE 103 +#define IDC_MP_SERVER_FOUND_PLAYERS 104 +#define IDC_MP_SERVER_FOUND_BUTTON_NEXT 105 +#define IDC_MP_SERVER_FOUND_BUTTON_JOIN 106 + +#define IDC_OPTIMATCH_FILTER_SPEED 101 +#define IDC_OPTIMATCH_FILTER_TYPE 102 +#define IDC_OPTIMATCH_FILTER_MIN_PLAYERS 103 +#define IDC_OPTIMATCH_FILTER_MAX_PLAYERS 104 +#define IDC_OPTIMATCH_FILTER_LANGUAGE 105 +#define IDC_OPTIMATCH_FILTER_DIFFICULTY 106 + +#define IDC_PASSWORD 101 + +#define IDC_IP_ADDRESS 101 +#define IDC_IP_PORT 102 + +#define IDC_PORT_PORT 101 + +#define IDC_FILTER_SERVER 101 +#define IDC_FILTER_MISSION 102 +#define IDC_FILTER_MAXPING 103 +#define IDC_FILTER_MINPLAYERS 104 +#define IDC_FILTER_MAXPLAYERS 105 +#define IDC_FILTER_FULL 106 +#define IDC_FILTER_PASSWORDED 107 +#define IDC_FILTER_DEFAULT 108 +#define IDC_FILTER_TYPE 109 +#define IDC_FILTER_BATTLEYE 110 +#define IDC_FILTER_EXPANSIONS 111 +#define IDC_FILTER_MONETIZED 112 + +#define IDC_CLIENT_TEXT 101 +#define IDC_CLIENT_PLAYERS 102 +#define IDC_CLIENT_PROGRESS 103 + +#define IDC_SERVER_ISLAND 101 +#define IDC_SERVER_MISSION 102 +#define IDC_SERVER_EDITOR 103 +#define IDC_SERVER_DIFF 104 +#define IDC_SERVER_PLAYERS 105 +#define IDC_SERVER_GAMETYPE 106 +#define IDC_SERVER_SLOTS 107 +#define IDC_SERVER_SLOTS_PRIVATE 108 +#define IDC_SERVER_SLOTS_PUBLIC 109 +#define IDC_SERVER_MIN_PLAYERS 110 +#define IDC_SERVER_MAX_PLAYERS 111 +#define IDC_SERVER_SLOTS_PRIVATE_TITLE 112 +#define IDC_SERVER_SLOTS_PRIVATE_TEXT 112 +#define IDC_SERVER_SLOTS_PUBLIC_TITLE 113 +#define IDC_SERVER_SLOTS_PUBLIC_TEXT 113 +#define IDC_SERVER_SLOTS_PUBLIC_VALUE 114 +#define IDC_SERVER_SLOTS_PRIVATE_VALUE 115 +#define IDC_SERVER_VOTED_MISSIONS 116 +#define IDC_SERVER_PLAYERS_TITLE 117 +#define IDC_SERVER_TIMEOUT 118 +#define IDC_SERVER_VOTED_DIFFICULTY 119 +#define IDC_SERVER_DELETE 120 +#define IDC_SERVER_COPY 121 +#define IDC_SERVER_EDIT 122 +#define IDC_SERVER_LOAD 123 +#define IDC_SERVER_PRIVATE_SLOTS_TITLE 124 +#define IDC_SERVER_PRIVATE_SLOTS_VALUE 125 +#define IDC_SERVER_PRIVATE_SLOTS 126 +#define IDC_SERVER_MAXIMUM_SLOTS_TITLE 127 +#define IDC_SERVER_MAXIMUM_SLOTS 128 +#define IDC_SERVER_MAXIMUM_SLOTS_VALUE 129 +#define IDC_SERVER_MI_OVERVIEW 130 +#define IDC_SERVER_MI_GAMETYPE 131 +#define IDC_SERVER_MI_MAX_PLAYERS 132 +#define IDC_SERVER_MI_RESPAWN 133 +#define IDC_SERVER_MI_MIN_PLAYERS 134 +#define IDC_SERVER_SHOW_MISSION_WORKSHOP 135 +#define IDC_SERVER_SHOW_GAME_WORKSHOP 136 +#define IDC_SERVER_MI_NAME 137 +#define IDC_SERVER_MI_AUTHOR 138 +#define IDC_SERVER_MI_PICTURE 139 +#define IDC_SERVER_MI_DESCRIPTION 140 +#define IDC_SERVER_LOADING_PICTURE 141 +#define IDC_SERVER_GAME_OR_MISSION_WORKSHOP 142 +#define IDC_SERVER_ISLAND_TITLE 143 +#define IDC_SERVER_MISSION_TITLE 144 +#define IDC_SERVER_DIFF_INDICATOR 145 +#define IDC_SERVER_PURCHASE_BUTTON 146 + + +#define IDC_REQUIRED_BATTLEYE 201 + +// _VBS3 +#define IDC_AAR_SERVER 121 +#define IDC_AAR_SERVER_FILES 122 +#define IDC_AAR_DOWNLOADPROGRESS 123 +#define IDC_AAR_DOWNLOADSTART 124 +#define IDC_AAR_DOWNLOADSTOP 125 + +// Host settings dialog +#define IDC_HOST_NAME 101 +#define IDC_HOST_PASSWORD 102 +#define IDC_HOST_MAX_PLAYERS 103 +#define IDC_HOST_PRIVATE 104 +#define IDC_HOST_PORT 105 +#define IDC_HOST_PORT_WARNING 106 +#define IDC_HOST_UPNP 107 + +#define IDC_DED_SERVER_SLOTS_PUBLIC 101 +#define IDC_DED_SERVER_SLOTS_PUBLIC_TITLE 102 +#define IDC_DED_SERVER_SLOTS_PUBLIC_VALUE 103 +#define IDC_DED_SERVER_SLOTS_PRIVATE 104 +#define IDC_DED_SERVER_SLOTS_PRIVATE_TITLE 105 +#define IDC_DED_SERVER_SLOTS_PRIVATE_VALUE 106 + +#define IDC_WIZT_TEMPLATES 101 +#define IDC_WIZT_OVERVIEW 102 +#define IDC_WIZT_NAME 103 + +#define IDC_WIZM_EDIT 101 + +#define IDC_SRVSETUP_PLAYERS 101 +#define IDC_SRVSETUP_UNITS 102 +#define IDC_SRVSETUP_ISLAND 103 +#define IDC_SRVSETUP_NAME 104 +#define IDC_SRVSETUP_DESC 105 +#define IDC_SRVSETUP_ASSIGN 106 +#define IDC_SRVSETUP_UNASSIGN 107 +#define IDC_SRVSETUP_RANDOM 108 +#define IDC_SRVSETUP_PARAM1 109 +#define IDC_SRVSETUP_PARAM1_TEXT 110 +#define IDC_SRVSETUP_PARAM2 111 +#define IDC_SRVSETUP_PARAM2_TEXT 112 + +#define IDC_SRVSIDE_NAME 101 +#define IDC_SRVSIDE_ISLAND 102 +#define IDC_SRVSIDE_POOL 103 +#define IDC_SRVSIDE_WEST 104 +#define IDC_SRVSIDE_EAST 105 +#define IDC_SRVSIDE_RESIST 106 +#define IDC_SRVSIDE_CIVIL 107 +#define IDC_SRVSIDE_WEST_TEXT 108 +#define IDC_SRVSIDE_EAST_TEXT 109 +#define IDC_SRVSIDE_RESIST_TEXT 110 +#define IDC_SRVSIDE_CIVIL_TEXT 111 +#define IDC_SRVSIDE_DEFAULT 112 +#define IDC_SRVSIDE_PARAM1 113 +#define IDC_SRVSIDE_PARAM1_TEXT 114 +#define IDC_SRVSIDE_PARAM2 115 +#define IDC_SRVSIDE_PARAM2_TEXT 116 +#define IDC_SRVSIDE_PLAYERS 117 + +#define IDC_MPROLE_TITLE 101 +#define IDC_MPROLE_NAME 102 +#define IDC_MPROLE_ISLAND 103 +#define IDC_MPROLE_DESC 104 +#define IDC_MPROLE_POOL 105 +#define IDC_MPROLE_POOL_TEXT 106 +#define IDC_MPROLE_ROLES 107 +#define IDC_MPROLE_DEFAULT 108 +#define IDC_MPROLE_ENABLE 109 +#define IDC_MPROLE_SIDES 110 +#define IDC_MPROLE_ENABLE_ALL 111 + +#define IDC_CLIENT_GAME 101 + +#define IDC_CLIENTMAP_START1 101 +#define IDC_CLIENTMAP_START2 102 + +#define IDC_CLIENT_READY_PLAYERS 120 +#define IDC_CLIENT_READY_PLAYERS_TITLE 121 +#define IDC_CLIENT_READY_TIMEOUT 122 + +#define IDC_SERVER_READY_PLAYERS 120 +#define IDC_SERVER_READY_PLAYERS_TITLE 121 + +#define IDC_MP_PLAYERS 101 +#define IDC_MP_PL 102 +#define IDC_MP_PL_NAME 103 +#define IDC_MP_PL_MAIL 104 +#define IDC_MP_PL_ICQ 105 +#define IDC_MP_PL_REMARK 106 +#define IDC_MP_SQ 107 +#define IDC_MP_SQ_NAME 108 +#define IDC_MP_SQ_ID 109 +#define IDC_MP_SQ_MAIL 110 +#define IDC_MP_SQ_WEB 111 +#define IDC_MP_SQ_PICTURE 112 +#define IDC_MP_SQ_TITLE 113 +#define IDC_MP_KICKOFF 114 +#define IDC_MP_BAN 115 +#define IDC_MP_PL_MISSION 116 +#define IDC_MP_PL_ISLAND 117 +#define IDC_MP_PL_TIME 118 +#define IDC_MP_PL_MINPING 119 +#define IDC_MP_PL_AVGPING 120 +#define IDC_MP_PL_MAXPING 121 +#define IDC_MP_PL_MINBAND 122 +#define IDC_MP_PL_AVGBAND 123 +#define IDC_MP_PL_MAXBAND 124 +#define IDC_MP_PL_DESYNC 125 +#define IDC_MP_PL_REST 126 +#define IDC_MP_MUTE 127 + +#define IDC_CLIENT_WAIT_TITLE 130 // is used together with MP_PL + +#define IDC_MPSETUP_NAME 101 +#define IDC_MPSETUP_ISLAND 102 +#define IDC_MPSETUP_DESC 103 +#define IDC_MPSETUP_WEST 104 +#define IDC_MPSETUP_EAST 105 +#define IDC_MPSETUP_GUERRILA 106 +#define IDC_MPSETUP_CIVILIAN 107 +#define IDC_MPSETUP_ROLES_TITLE 108 +#define IDC_MPSETUP_ROLES 109 +#define IDC_MPSETUP_PARAM1_TITLE 110 +#define IDC_MPSETUP_PARAM1 111 +#define IDC_MPSETUP_PARAM2_TITLE 112 +#define IDC_MPSETUP_PARAM2 113 +#define IDC_MPSETUP_POOL 114 +#define IDC_MPSETUP_MESSAGE 115 +#define IDC_MPSETUP_KICK 116 +#define IDC_MPSETUP_ENABLE_ALL 117 +#define IDC_MPSETUP_LOCK 118 +#define IDC_MPSETUP_SIDE 119 +#define IDC_MPSETUP_POOL_TITLE 120 +#define IDC_MPSETUP_TIMEOUT 121 +#define IDC_MPSETUP_PLAYERS 122 +#define IDC_MPSETUP_FRIENDS 123 +#define IDC_MPSETUP_ADVANCED 124 +#define IDC_MPSETUP_GAMERCARD 125 +#define IDC_MPSETUP_PARTYGUI 126 +#define IDC_MPSETUP_ASSIGNROLE 127 +#define IDC_MPSETUP_PARAMS 128 +#define IDC_MPSETUP_DSINTERFACE 129 +#define IDC_MPSETUP_MISSION_WORKSHOP 130 +#define IDC_MPSETUP_LOGIC 131 +#define IDC_MPSETUP_VIRTUAL 132 +#define IDC_MPSETUP_PLAYERS_BUTTON 133 +#define IDC_MPSETUP_PLAYERS_SORT 134 +#define IDC_MPSETUP_PING_BUTTON 135 +#define IDC_MPSETUP_PING_SORT 136 +#define IDC_MPSETUP_MUTE_ALL 137 + +#define IDC_MPSETUP_MSG_MESSAGE 101 +#define IDC_MPSETUP_MSG_PROGRESS 102 +#define IDC_MPSETUP_MSG_TIME 103 + +#define IDC_PROGRESS_MSG_MESSAGE 101 +#define IDC_PROGRESS_MSG_PROGRESS 102 +#define IDC_PROGRESS_MSG_TIME 103 + +#define IDC_SERVER_SETTINGS_PARAM1_TEXT 101 +#define IDC_SERVER_SETTINGS_PARAM1 102 +#define IDC_SERVER_SETTINGS_PARAM2_TEXT 103 +#define IDC_SERVER_SETTINGS_PARAM2 104 +#define IDC_SERVER_SETTINGS_AI 105 +#define IDC_SERVER_SETTINGS_ASSIGN 106 + +#define IDC_SERVER_ADVANCED_ROLES 101 +#define IDC_SERVER_ADVANCED_DISABLE_ALL 102 +#define IDC_SERVER_ADVANCED_AUTOASSIGN 103 + +#define IDC_SERVER_SELECT_PLAYERS 101 + +// Main map display controls +#define IDC_MAP_WATCH 101 +#define IDC_MAP_COMPASS 102 +#define IDC_MAP_WALKIE_TALKIE 103 +#define IDC_MAP_NOTEPAD 104 +#define IDC_MAP_WARRANT 105 +#define IDC_MAP_GPS 106 +#define IDC_MAP_TEXTURES 107 +#define IDC_MAP_BRIEFING_SHOW 108 +#define IDC_MAP_BRIEFING_PAGE 109 +#define IDC_MAP_PREV_MARKER 110 +#define IDC_MAP_NEXT_MARKER 111 +#define IDC_MAP_GEAR 112 + +// Diary display controls +#define IDC_DIARY 101 +#define IDC_DIARY_INDEX 102 +#define IDC_DIARY_PAGE 103 +#define IDC_DIARY_ADD 104 + +// Select island display controls +#define IDC_SELECT_ISLAND 101 +#define IDC_SELECT_ISLAND_NOTEBOOK 102 +#define IDC_SELECT_ISLAND_WIZARD 103 +#define IDC_SELECT_ISLAND_EDITOR 104 +#define IDC_SELECT_ISLAND_EDITOR_OLD 105 +//Redefined in Eden +//IDC_SELECT_ISLAND_EDITOR_OLD 105 +//IDC_SELECT_ISLAND_3DEN 106 +#define IDC_SELECT_ISLAND_BUTTON_PURCHASE 107 + +// Custom arcade display controls +#define IDC_CUST_GAME 101 +#define IDC_CUST_PLAY 102 +#define IDC_CUST_EDIT 103 +#define IDC_CUST_DELETE 104 +#define IDC_CUST_EDIT_2 105 + +#define IDC_MISSION_PARAMS_LABEL 101 +#define IDC_MISSION_PARAMS_COMBO 102 + +#define IDC_ARCMAP_LOAD 101 +#define IDC_ARCMAP_SAVE 102 +#define IDC_ARCMAP_CLEAR 103 +#define IDC_ARCMAP_MODE 104 +#define IDC_ARCMAP_INTEL 105 +#define IDC_ARCMAP_MERGE 106 +#define IDC_ARCMAP_PREVIEW 107 +#define IDC_ARCMAP_CONTINUE 108 +#define IDC_ARCMAP_SECTION 109 +#define IDC_ARCMAP_IDS 111 +#define IDC_ARCMAP_TEXTURES 112 +#define IDC_ARCMAP_MISSION_NAME 113 +#define IDC_ARCMAP_MAP 114 +#define IDC_ARCMAP_BACKGROUND 115 +#define IDC_ARCMAP_LAYOUT 116 +#define IDC_ARCMAP_PUBLISH_MISSION 117 + +#define IDC_ARCUNIT_TITLE 101 +#define IDC_ARCUNIT_SIDE 102 +#define IDC_ARCUNIT_VEHICLE 103 +#define IDC_ARCUNIT_RANK 104 +#define IDC_ARCUNIT_CTRL 105 +#define IDC_ARCUNIT_CLASS 107 +#define IDC_ARCUNIT_HEALTH 108 +#define IDC_ARCUNIT_FUEL 109 +#define IDC_ARCUNIT_AMMO 110 +#define IDC_ARCUNIT_AZIMUT 111 +#define IDC_ARCUNIT_SPECIAL 112 +#define IDC_ARCUNIT_AGE 113 +#define IDC_ARCUNIT_AZIMUT_PICTURE 114 +#define IDC_ARCUNIT_PLACE 115 +#define IDC_ARCUNIT_PRESENCE 116 +#define IDC_ARCUNIT_PRESENCE_COND 117 +#define IDC_ARCUNIT_TEXT 118 +#define IDC_ARCUNIT_LOCK 119 +#define IDC_ARCUNIT_INIT 120 +#define IDC_ARCUNIT_SKILL 121 +#define IDC_ARCUNIT_DESC 122 +#define IDC_ARCUNIT_FACTION 123 +#define IDC_ARCUNIT_ELEVATION 124 +#define IDC_ARCUNIT_EQUIP 125 +#define IDC_ARCUNIT_RADIUS 126 +#define IDC_ARCUNIT_ARGUMENTS 127 +#define IDC_ARCUNIT_CATEGORY 128 +#define IDC_ARCUNIT_SETTINGS 2301 + +#define IDC_ARCGRP_SIDE 101 +#define IDC_ARCGRP_TYPE 102 +#define IDC_ARCGRP_NAME 103 +#define IDC_ARCGRP_AZIMUT 104 +#define IDC_ARCGRP_AZIMUT_PICTURE 105 +#define IDC_ARCGRP_FACTION 106 +#define IDC_ARCGRP_UNITS_LIST 107 + +#define IDC_ARCWP_TITLE 101 +#define IDC_ARCWP_TYPE 102 +#define IDC_ARCWP_SEQ 103 +#define IDC_ARCWP_DESC 104 +#define IDC_ARCWP_SEMAPHORE 105 +#define IDC_ARCWP_FORM 106 +#define IDC_ARCWP_SPEED 107 +#define IDC_ARCWP_COMBAT 108 +#define IDC_ARCWP_PLACE 109 +#define IDC_ARCWP_EFFECTS 110 +#define IDC_ARCWP_TIMEOUT_MIN 111 +#define IDC_ARCWP_TIMEOUT_MAX 112 +#define IDC_ARCWP_TIMEOUT_MID 113 +#define IDC_ARCWP_HOUSEPOS 114 +#define IDC_ARCWP_HOUSEPOSTEXT 115 +#define IDC_ARCWP_EXPACTIV 116 +#define IDC_ARCWP_SHOW 117 +#define IDC_ARCWP_EXPCOND 118 +#define IDC_ARCWP_SCRIPT 119 +#define IDC_ARCWP_PREC 120 +#define IDC_ARCWP_HEIGHT 121 +#define IDC_ARCWP_HEIGHTTEXT 122 +#define IDC_ARCWP_SCRIPTTEXT 123 +#define IDC_ARCWP_CATEGORY 124 + +#define IDC_ARCWP_ARGUMENTS 125 +#define IDC_ARCWP_ARGUMENTSTEXT 126 +#define IDC_ARCWP_NAME 127 + +#define IDC_ARCEFF_SOUND 103 +#define IDC_ARCEFF_VOICE 104 +#define IDC_ARCEFF_SOUND_ENV 105 +#define IDC_ARCEFF_SOUND_DET 106 +#define IDC_ARCEFF_MUSIC 107 +#define IDC_ARCEFF_TITTYPE 108 +#define IDC_ARCEFF_TITEFF 109 +#define IDC_ARCEFF_TITTEXT 110 +#define IDC_ARCEFF_TITRES 111 +#define IDC_ARCEFF_TITOBJ 112 +//#define IDC_ARCEFF_PLAYERONLY 113 +#define IDC_ARCEFF_CONDITION 113 +#define IDC_ARCEFF_TEXT_TITTEXT 114 + +#define IDC_ARCSENS_TITLE 101 +#define IDC_ARCSENS_A 102 +#define IDC_ARCSENS_B 103 +#define IDC_ARCSENS_ANGLE 104 +#define IDC_ARCSENS_ACTIV 105 +#define IDC_ARCSENS_PRESENCE 106 +#define IDC_ARCSENS_REPEATING 107 +#define IDC_ARCSENS_INTERRUPT 108 +#define IDC_ARCSENS_TIMEOUT_MIN 109 +#define IDC_ARCSENS_TIMEOUT_MAX 110 +#define IDC_ARCSENS_TIMEOUT_MID 111 +#define IDC_ARCSENS_TYPE 112 +#define IDC_ARCSENS_OBJECT 113 +#define IDC_ARCSENS_TEXT 114 +#define IDC_ARCSENS_AGE 115 +#define IDC_ARCSENS_EFFECTS 116 +#define IDC_ARCSENS_EXPCOND 117 +#define IDC_ARCSENS_EXPACTIV 118 +#define IDC_ARCSENS_EXPDESACTIV 119 +#define IDC_ARCSENS_RECT 120 +#define IDC_ARCSENS_NAME 121 + +#define IDC_ARCMARK_TITLE 101 +#define IDC_ARCMARK_NAME 102 +#define IDC_ARCMARK_MARKER 103 +#define IDC_ARCMARK_TYPE 104 +#define IDC_ARCMARK_COLOR 105 +#define IDC_ARCMARK_A 106 +#define IDC_ARCMARK_B 107 +#define IDC_ARCMARK_ANGLE 108 +#define IDC_ARCMARK_TYPE_TEXT 109 +#define IDC_ARCMARK_FILL 110 +#define IDC_ARCMARK_TEXT 111 + +#define IDC_INTEL_RESISTANCE 101 +#define IDC_INTEL_MONTH 102 +#define IDC_INTEL_DAY 103 +#define IDC_INTEL_HOUR 104 +#define IDC_INTEL_MINUTE 105 +#define IDC_INTEL_BRIEFING_NAME 106 +#define IDC_INTEL_BRIEFING_DESC 107 +#define IDC_INTEL_WEATHER 108 +#define IDC_INTEL_FOG 109 +#define IDC_INTEL_WEATHER_FORECAST 110 +#define IDC_INTEL_FOG_FORECAST 111 +#define IDC_INTEL_YEAR 112 +//added by MUF - new intel dialog-------------------------- +#define IDC_INTEL_WEATHER_TB 113 +#define IDC_INTEL_WEATHER_FORECAST_TB 114 + +#define IDC_INTEL_FOG_CB 115 +#define IDC_INTEL_FOG_TB 116 +#define IDC_INTEL_FOG_FORECAST_TB 117 + +#define IDC_INTEL_RAIN_CB 118 +#define IDC_INTEL_RAIN 119 +#define IDC_INTEL_RAIN_TB 120 +#define IDC_INTEL_RAIN_FORECAST 121 +#define IDC_INTEL_RAIN_FORECAST_TB 122 + +#define IDC_INTEL_LIGHTN_CB 123 +#define IDC_INTEL_LIGHTN 124 +#define IDC_INTEL_LIGHTN_TB 125 +#define IDC_INTEL_LIGHTN_FORECAST 126 +#define IDC_INTEL_LIGHTN_FORECAST_TB 127 + +#define IDC_INTEL_WAVES_CB 128 +#define IDC_INTEL_WAVES 129 +#define IDC_INTEL_WAVES_TB 130 +#define IDC_INTEL_WAVES_FORECAST 131 +#define IDC_INTEL_WAVES_FORECAST_TB 132 + +#define IDC_INTEL_WIND_CB 133 +#define IDC_INTEL_STRENGTH 134 +#define IDC_INTEL_STRENGTH_TB 135 +#define IDC_INTEL_STRENGTH_FORECAST 136 +#define IDC_INTEL_STRENGTH_FORECAST_TB 137 + +#define IDC_INTEL_GUSTS 138 +#define IDC_INTEL_GUSTS_TB 139 +#define IDC_INTEL_GUSTS_FORECAST 140 +#define IDC_INTEL_GUSTS_FORECAST_TB 141 + +#define IDC_INTEL_WINDDIR 142 +#define IDC_INTEL_WINDDIR_TB 143 +#define IDC_INTEL_WINDDIR_FORECAST 144 +#define IDC_INTEL_WINDDIR_FORECAST_TB 145 + +#define IDC_INTEL_CHNGTIME 146 +#define IDC_INTEL_CHNGTIME_HOUR_TB 147 +#define IDC_INTEL_CHNGTIME_MIN_TB 148 + +#define IDC_INTEL_CHNGTIME_HLEFT 149 +#define IDC_INTEL_CHNGTIME_HMIDDLE 150 +#define IDC_INTEL_CHNGTIME_HRIGHT 151 + +//added by MUF - new intel dialog-------------------------- + +// Dialog for choosing Editor's layout +#define IDC_LAYOUT_LIST 101 +#define IDC_LAYOUT_PICTURE 102 + +// Chat +#define IDC_CHANNEL 101 +#define IDC_CHANNEL_VOICE 102 +#define IDC_CHANNEL_MUTE_VON 103 +#define IDC_CHANNEL_MUTE_CHAT 104 + +#define IDC_CHAT 101 + +#define IDC_VOICE_CHAT 101 + +// Save / load template +#define IDC_TEMPL_NAME 101 +#define IDC_TEMPL_TITLE 102 +#define IDC_TEMPL_MODE 103 +#define IDC_TEMPL_ISLAND 104 + +// publish / update to Steam workshop +#define IDC_PUBLISH_STEAM_TITLE 101 +#define IDC_PUBLISH_STEAM_TAGS 102 +#define IDC_PUBLISH_STEAM_PICTURE 103 +#define IDC_PUBLISH_STEAM_DESCRIPTION 104 +#define IDC_PUBLISH_STEAM_MISSION_LIST 105 +#define IDC_PUBLISH_STEAM_VISIBILITY 106 +#define IDC_PUBLISH_STEAM_CHANGE_NOTES 107 +#define IDC_PUBLISH_STEAM_PREVIEW_FILE 108 +#define IDC_PUBLISH_CHECKBOX_LICENCE 109 +#define IDC_PUBLISH_TEXT_MISSION_SIZE 110 +#define IDC_PUBLISH_TEXT_QUOTA 111 +#define IDC_PUBLISH_BUTTON_PUBLISH 112 +#define IDC_PUBLISH_BUTTON_UPDATE 113 +#define IDC_PUBLISH_BUTTON_DELETE 114 +#define IDC_PUBLISH_BUTTON_EDIT_TAGS 115 +#define IDC_PUBLISH_BUTTON_WORKSHOP 116 +#define IDC_PUBLISH_BUTTON_WORKSHOP_LICENCE 117 +#define IDC_PUBLISH_BUTTON_SELECT_PREVIEW 118 +#define IDC_PUBLISH_BUTTON_DEFAULT_PREVIEW 119 +#define IDC_PUBLISH_STORAGE_SLIDER 120 +// group that is hidden when new mission is selected and shown when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_HIDE_NEW_MISSION 121 +// group that is shown when new mission is selected and hidden when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_SHOW_NEW_MISSION 122 + +// publish / update to Steam workshop - tags dialog +#define IDC_PUBLISH_STEAM_TAGS_AVAILABLE 101 +#define IDC_PUBLISH_STEAM_TAGS_SELECTED 102 +#define IDC_PUBLISH_STEAM_TAGS_ADD 103 +#define IDC_PUBLISH_STEAM_TAGS_REMOVE 104 +#define IDC_PUBLISH_STEAM_TAGS_NEXT 105 +#define IDC_PUBLISH_STEAM_TAGS_BACK 106 +#define IDC_PUBLISH_STEAM_TAGS_TITLE 107 + +// select file dialog +#define IDC_FILE_SELECT_PATH 101 +#define IDC_FILE_SELECT_DIR_TREE 102 +#define IDC_FILE_SELECT_FILE_LIST 103 +#define IDC_FILE_SELECT_PREVIEW 104 + + +//Login display +#define IDC_LOGIN_USER_LIST 101 +#define IDC_LOGIN_EDIT 102 +#define IDC_LOGIN_NEW_USER 103 +#define IDC_LOGIN_DELETE 104 +#define IDC_LOGIN_NAME 105 +#define IDC_LOGIN_FACE 106 +#define IDC_LOGIN_SPEAKER 107 +#define IDC_LOGIN_PITCH 108 +#define IDC_LOGIN_HEAD 109 +#define IDC_LOGIN_GLASSES 110 +#define IDC_LOGIN_ID 111 +#define IDC_LOGIN_SQUAD 112 +#define IDC_LOGIN_SQUAD_TEXT 113 +#define IDC_LOGIN_DISCARD 114 +#define IDC_LOGIN_TAB_AVATAR 115 +#define IDC_LOGIN_TAB_UNIT 116 +#define IDC_LOGIN_UNIT_SELECT 117 +#define IDC_LOGIN_UNIT_LOGO 118 +#define IDC_LOGIN_UNIT_NAME 119 +#define IDC_LOGIN_UNIT_MOTTO 120 +#define IDC_LOGIN_UNIT_DESCRIPTION 121 +#define IDC_LOGIN_ID_TEXT 122 +#define IDC_LOGIN_REFRESH 123 + +// Interrupt display +#define IDC_INT_OPTIONS 101 +#define IDC_INT_LOAD 102 +#define IDC_INT_SAVE 103 +#define IDC_INT_ABORT 104 +#define IDC_INT_RETRY 105 +#define IDC_INT_TITLE 106 +#define IDC_INT_SETTINGS 107 +#define IDC_INT_FRIENDS 108 +#define IDC_INT_PLAYERS 109 +#define IDC_INT_APPEAR_OFFLINE 110 +#define IDC_INT_MISSION 111 +#define IDC_INT_SIGN_IN_STATUS 112 +#define IDC_INT_EDIT_MAP 113 +#define IDC_INT_EDIT_3D 114 +#define IDC_INT_EDIT_PREVIEW 115 +#define IDC_INT_EDIT_REALTIME 116 +#define IDC_INT_RESTART 117 +#define IDC_INT_DIARY 118 +#define IDC_INT_REVERT 119 +#define IDC_INT_MISSIONNAME 120 +#define IDC_INT_TRAFFIC_LIGHT 121 +#define IDC_INT_FIELD_MANUAL 122 + +// Interrupt revert display +#define IDC_INT_REVERT_TYPE 101 + +// Select save display +#define IDC_SELECT_SAVE_SLOTS 101 + +// Mission end display +#define IDC_ME_SUBTITLE 101 +#define IDC_ME_QUOTATION 102 +#define IDC_ME_AUTHOR 103 +#define IDC_ME_RETRY 104 +#define IDC_ME_LOAD 105 +#define IDC_ME_RESTART 106 +#define IDC_ME_TEAM_SWITCH 107 + +// Get ready display +#define IDC_GETREADY_NAME 101 +#define IDC_GETREADY_DESC 102 +#define IDC_GETREADY_PRIMARY 105 +#define IDC_GETREADY_SECONDARY 106 +#define IDC_GETREADY_PLAYER 107 +#define IDC_GETREADY_DATE 108 +#define IDC_GETREADY_MODE 110 +#define IDC_GETREADY_PRIMARY_TEXT 111 +#define IDC_GETREADY_SECONDARY_TEXT 112 +#define IDC_GETREADY_EDITMODE 113 +#define IDC_GETREADY_TITLE 114 + +#define IDC_GEAR_UNIT 101 +#define IDC_GEAR_SKILL 102 +#define IDC_GEAR_VEHICLE 103 +#define IDC_GEAR_POOL 105 +#define IDC_GEAR_OVERVIEW 106 +#define IDC_GEAR_SLOT_PRIMARY 107 +#define IDC_GEAR_SLOT_SECONDARY 108 +#define IDC_GEAR_SLOT_ITEM1 109 +#define IDC_GEAR_SLOT_ITEM2 110 +#define IDC_GEAR_SLOT_ITEM3 111 +#define IDC_GEAR_SLOT_ITEM4 112 +#define IDC_GEAR_SLOT_ITEM5 113 +#define IDC_GEAR_SLOT_ITEM6 114 +#define IDC_GEAR_SLOT_ITEM7 115 +#define IDC_GEAR_SLOT_ITEM8 116 +#define IDC_GEAR_SLOT_ITEM9 117 +#define IDC_GEAR_SLOT_ITEM10 118 +#define IDC_GEAR_SLOT_ITEM11 119 +#define IDC_GEAR_SLOT_ITEM12 120 +#define IDC_GEAR_SLOT_HANDGUN 121 +#define IDC_GEAR_SLOT_HANGUN_ITEM1 122 +#define IDC_GEAR_SLOT_HANGUN_ITEM2 123 +#define IDC_GEAR_SLOT_HANGUN_ITEM3 124 +#define IDC_GEAR_SLOT_HANGUN_ITEM4 125 +#define IDC_GEAR_SLOT_HANGUN_ITEM5 126 +#define IDC_GEAR_SLOT_HANGUN_ITEM6 127 +#define IDC_GEAR_SLOT_HANGUN_ITEM7 128 +#define IDC_GEAR_SLOT_HANGUN_ITEM8 129 +#define IDC_GEAR_SLOT_SPECIAL1 130 +#define IDC_GEAR_SLOT_SPECIAL2 131 +#define IDC_GEAR_REARM 132 +#define IDC_GEAR_CONTINUE 133 +#define IDC_GEAR_SLOT_INVENTORY1 134 +#define IDC_GEAR_SLOT_INVENTORY2 135 +#define IDC_GEAR_SLOT_INVENTORY3 136 +#define IDC_GEAR_SLOT_INVENTORY4 137 +#define IDC_GEAR_SLOT_INVENTORY5 138 +#define IDC_GEAR_SLOT_INVENTORY6 139 +#define IDC_GEAR_SLOT_INVENTORY7 140 +#define IDC_GEAR_SLOT_INVENTORY8 141 +#define IDC_GEAR_SLOT_INVENTORY9 142 +#define IDC_GEAR_SLOT_INVENTORY10 143 +#define IDC_GEAR_SLOT_INVENTORY11 144 +#define IDC_GEAR_SLOT_INVENTORY12 145 + +#define IDC_GEAR_ADD_ITEM 146 +#define IDC_GEAR_REMOVE_ITEM 147 + +#define IDC_GEAR_FILTER 148 +#define IDC_GEAR_FILTER_ICON1 149 +#define IDC_GEAR_FILTER_ICON2 150 +#define IDC_GEAR_FILTER_ICON3 151 +#define IDC_GEAR_FILTER_ICON4 152 +#define IDC_GEAR_FILTER_ICON5 153 +#define IDC_GEAR_FILTER_ICON6 154 + +#define IDC_GEAR_POOL_GROUP 155 +#define IDC_GEAR_SOURCE_NAME 156 +#define IDC_GEAR_OPEN_BAG 157 +#define IDC_GEAR_CLOSE_BAG 158 +#define IDC_GEAR_ADD_DEFAULT 255 +#define IDC_GEAR_CLEAR_ALL 256 +#define IDC_BAG_ITEMS_GROUP 159 +#define IDC_UNIT_ITEMS_GROUP 160 + +#define IDC_GEAR_BAG_EMPTY 5000 +/* +#define IDC_GEAR_BAG_EMPTY_SLOT1 5000 +#define IDC_GEAR_BAG_EMPTY_SLOT2 5001 +#define IDC_GEAR_BAG_EMPTY_SLOT3 5002 +. +. +. +#define IDC_GEAR_BAG_EMPTY_SLOT499 5498 +#define IDC_GEAR_BAG_EMPTY_SLOT500 5499 +*/ +#define IDC_GEAR_BAG_FULL 5500 + +// Debriefing +/* +#define IDC_DEBRIEFING_LEFT 101 +#define IDC_DEBRIEFING_RIGHT 102 +*/ +#define IDC_DEBRIEFING_STAT 103 +#define IDC_DEBRIEFING_RESTART 104 +#define IDC_DEBRIEFING_PAD2 105 +#define IDC_DEBRIEFING_PLAYERS_TITLE_BG 106 +#define IDC_DEBRIEFING_PLAYERS_TITLE 107 +#define IDC_DEBRIEFING_PLAYERS_BG 108 +#define IDC_DEBRIEFING_PLAYERS 109 +#define IDC_DEBRIEFING_TIMEOUT 110 +#define IDC_DEBRIEFING_RESULT 111 +#define IDC_DEBRIEFING_TITLE 112 +#define IDC_DEBRIEFING_DEBRIEFING 113 +#define IDC_DEBRIEFING_OBJECTIVES 114 +#define IDC_DEBRIEFING_INFO 115 +#define IDC_DEBRIEFING_SHOW_PLAYERS 116 +#define IDC_DEBRIEFING_SHOW_PAGE2 117 +#define IDC_DEBRIEFING_LIVE_STATS 118 +#define IDC_DEBRIEFING_PREV_PAGE 119 +#define IDC_DEBRIEFING_NEXT_PAGE 120 +#define IDC_DEBRIEFING_LOAD 121 +#define IDC_DEBRIEFING_TEXT_GROUP 122 +#define IDC_DEBRIEFING_OBJECTIVES_GROUP 123 +#define IDC_DEBRIEFING_STATS_GROUP 124 +#define IDC_DEBRIEFING_MISSION_WORKSHOP 125 +#define IDC_DEBRIEFING_READY 126 +#define IDC_DEBRIEFING_DISCONNECT 127 + +// Debug display +#define IDC_DEBUG_EXP 101 +#define IDC_DEBUG_APPLY 102 +#define IDC_DEBUG_LOG 103 +#define IDC_DEBUG_SEARCH 161 +#define IDC_DEBUG_SEARCH_BUTTON 162 +#define IDC_DEBUG_HISTORY 163 + +#define IDC_DEBUG_EXP1 121 +#define IDC_DEBUG_EXP2 122 +#define IDC_DEBUG_EXP3 123 +#define IDC_DEBUG_EXP4 124 + +#define IDC_DEBUG_RES1 141 +#define IDC_DEBUG_RES2 142 +#define IDC_DEBUG_RES3 143 +#define IDC_DEBUG_RES4 144 + +#define IDC_DEBUG_CLEAR_LOG 151 +#define IDC_DEBUG_FILTER_EDIT 152 + +// Debug PhysX Display +#define IDC_PHYSX_DEBUG_DIAGMODE 101 +#define IDC_PHYSX_DEBUG_DIAGMODEDRAW 102 + +#define IDC_PHYSX_DEBUG_TERRAIN 103 +#define IDC_PHYSX_DEBUG_STATIC 104 +#define IDC_PHYSX_DEBUG_KINEMATIC 105 +#define IDC_PHYSX_DEBUG_DYNAMIC 106 + +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_START 109 +#define IDC_PHYSX_DEBUG_WORLD_AXES 110 +#define IDC_PHYSX_DEBUG_BODY_AXES 111 +#define IDC_PHYSX_DEBUG_BODY_MASS_AXES 112 +#define IDC_PHYSX_DEBUG_BODY_LIN_VELOCITY 113 +#define IDC_PHYSX_DEBUG_BODY_ANG_VELOCITY 114 +#define IDC_PHYSX_DEBUG_BODY_JOINT_GROUPS 115 +#define IDC_PHYSX_DEBUG_JOINT_LOCAL_AXES 116 +#define IDC_PHYSX_DEBUG_JOINT_WORLD_AXES 117 +#define IDC_PHYSX_DEBUG_JOINT_LIMITS 118 +#define IDC_PHYSX_DEBUG_CONTACT_POINT 119 +#define IDC_PHYSX_DEBUG_CONTACT_NORMAL 120 +#define IDC_PHYSX_DEBUG_CONTACT_ERROR 121 +#define IDC_PHYSX_DEBUG_CONTACT_FORCE 122 +#define IDC_PHYSX_DEBUG_ACTOR_AXES 123 +#define IDC_PHYSX_DEBUG_COLLISION_AABBS 124 +#define IDC_PHYSX_DEBUG_COLLISION_SHAPES 125 +#define IDC_PHYSX_DEBUG_COLLISION_AXES 126 +#define IDC_PHYSX_DEBUG_COLLISION_COMPOUNDS 127 +#define IDC_PHYSX_DEBUG_COLLISION_VNORMALS 128 +#define IDC_PHYSX_DEBUG_COLLISION_FNORMALS 129 +#define IDC_PHYSX_DEBUG_COLLISION_EDGES 130 +#define IDC_PHYSX_DEBUG_COLLISION_SPHERES 131 +#define IDC_PHYSX_DEBUG_COLLISION_STATIC 132 +#define IDC_PHYSX_DEBUG_COLLISION_DYNAMIC 133 +#define IDC_PHYSX_DEBUG_COLLISION_FREE 134 +#define IDC_PHYSX_DEBUG_COLLISION_CCD 135 +#define IDC_PHYSX_DEBUG_COLLISION_SKELETONS 136 +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_END 148 + +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_START 149 +#define IDC_PHYSX3_DEBUG_WORLD_AXES 150 +#define IDC_PHYSX3_DEBUG_BODY_AXES 151 +#define IDC_PHYSX3_DEBUG_BODY_MASS_AXES 152 +#define IDC_PHYSX3_DEBUG_BODY_LIN_VELOCITY 153 +#define IDC_PHYSX3_DEBUG_BODY_ANG_VELOCITY 154 +#define IDC_PHYSX3_DEBUG_BODY_JOINT_GROUPS 155 +#define IDC_PHYSX3_DEBUG_CONTACT_POINT 156 +#define IDC_PHYSX3_DEBUG_CONTACT_NORMAL 157 +#define IDC_PHYSX3_DEBUG_CONTACT_ERROR 158 +#define IDC_PHYSX3_DEBUG_CONTACT_FORCE 159 +#define IDC_PHYSX3_DEBUG_ACTOR_AXES 160 +#define IDC_PHYSX3_DEBUG_COLLISION_AABBS 161 +#define IDC_PHYSX3_DEBUG_COLLISION_SHAPES 162 +#define IDC_PHYSX3_DEBUG_COLLISION_AXES 163 +#define IDC_PHYSX3_DEBUG_COLLISION_COMPOUNDS 164 +#define IDC_PHYSX3_DEBUG_COLLISION_FNORMALS 165 +#define IDC_PHYSX3_DEBUG_COLLISION_EDGES 166 +#define IDC_PHYSX3_DEBUG_COLLISION_STATIC 167 +#define IDC_PHYSX3_DEBUG_COLLISION_DYNAMIC 168 +#define IDC_PHYSX3_DEBUG_COLLISION_PAIRS 169 +#define IDC_PHYSX3_DEBUG_JOINT_LOCAL_AXES 170 +#define IDC_PHYSX3_DEBUG_JOINT_LIMITS 171 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_POSITION 172 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_VELOCITY 173 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_COLLISION_NORMAL 174 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BOUNDS 175 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_GRID 176 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BROADPHASE_BOUNDS 177 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_MAX_MOTION_DISTANCE 178 +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_END 188 + +#define IDC_PHYSX_DEBUG_ALL 190 +#define IDC_PHYSX_DEBUG_NONE 191 +#define IDC_PHYSX_DEBUG_DIAGMODEPERF 192 +#define IDC_PHYSX_DEBUG_DIAGMODESTATS 193 + +#define IDC_PHYSX_DEBUG_USECONVEXSHAPES 194 +#define IDC_PHYSX_DEBUG_USEROADWAYS 195 +#define IDC_PHYSX_DEBUG_USEONECAPSULE 196 +#define IDC_PHYSX_DEBUG_IMMEDIATEFETCH 197 + +#define IDC_PHYSX_DEBUG_BASIC 198 + +// DS interface display +#define IDC_DSI_PLAYERLIST 101 +#define IDC_DSI_MISSONLIST 102 + +// HintC display +#define IDC_HINTC_BG 101 +#define IDC_HINTC_HINT 102 +#define IDC_HINTC_TITLE 103 +#define IDC_HINTC_CONTINUE 104 +#define IDC_HINTC_LINE1 105 +#define IDC_HINTC_LINE2 106 + +// Insert marker display +#define IDC_INSERT_MARKER 101 +#define IDC_INSERT_MARKER_PICTURE 102 +#define IDC_INSERT_MARKER_CHANNELS 103 + +// InGameUI +// - unit info +#define IDC_IGUI_TIME 101 +#define IDC_IGUI_DATE 102 +#define IDC_IGUI_NAME 103 +#define IDC_IGUI_UNIT 104 +#define IDC_IGUI_VALUE_EXP 106 +#define IDC_IGUI_COMBAT_MODE 107 +#define IDC_IGUI_VALUE_HEALTH 109 +#define IDC_IGUI_HITZONES 111 +#define IDC_IGUI_VALUE_FUEL 113 +#define IDC_IGUI_CARGO_MAN 114 +#define IDC_IGUI_CARGO_FUEL 115 +#define IDC_IGUI_CARGO_REPAIR 116 +#define IDC_IGUI_CARGO_AMMO 117 +#define IDC_IGUI_WEAPON 118 +#define IDC_IGUI_AMMO 119 +#define IDC_IGUI_VEHICLE 120 +#define IDC_IGUI_SPEED 121 +#define IDC_IGUI_ALT 122 +#define IDC_IGUI_FORMATION 123 +#define IDC_IGUI_BG 124 +#define IDC_IGUI_COMMANDER 125 +#define IDC_IGUI_DRIVER 126 +#define IDC_IGUI_GUNNER 127 + +#define IDC_IGUI_SPEED_FREEFALL 380 +#define IDC_IGUI_SPEED_VERTICAL_FREEFALL 381 +#define IDC_IGUI_ALT_FREEFALL 382 + +#define IDC_IGUI_ANALOGUE_HORIZON 383 +#define IDC_IGUI_ANALOGUE_SPEED_LADDER 384 +#define IDC_IGUI_ANALOGUE_ALT_LADDER 385 + +#define IDC_IGUI_OPTICS_GROUP 390 +#define IDC_IGUI_DRIVER_GROUP 391 +#define IDC_IGUI_DRIVER_OPTICS_GROUP 392 +#define IDC_IGUI_VEHICLE_PITCH 393 + + +//AV_Terminal +#define IDC_IGUI_AVT_NAME 100 +#define IDC_IGUI_AVT_TAKE_CONTROL 101 +#define IDC_IGUI_AVT_STATUS 102 +#define IDC_IGUI_AVT_TARGET 103 +#define IDC_IGUI_AVT_POSITION 104 +#define IDC_IGUI_AVT_PIP1 105 +#define IDC_IGUI_AVT_PIP2 106 +#define IDC_IGUI_AVT_COUNT 107 +#define IDC_IGUI_AVT_EDITOR_MENU 108 +#define IDC_IGUI_AVT_FUEL 109 +#define IDC_IGUI_AVT_WEAPON 110 +#define IDC_IGUI_AVT_AMMO 111 +#define IDC_IGUI_AVT_WEAPON_SEC 112 +#define IDC_IGUI_AVT_AMMO_SEC 113 +#define IDC_IGUI_AVT_TAKE_CONTROL_DRIVER 114 +#define IDC_IGUI_AVT_TAKE_CONTROL_GUNNER 115 +#define IDC_IGUI_AVT_AUTONOMOUS 116 +#define IDC_IGUI_AVT_COMBO 117 +#define IDC_IGUI_AVT_ALLOW_LIGHTS 118 + +//AV Camera +#define IDC_IGUI_AVC_PIP_DRIVER 100 +#define IDC_IGUI_AVC_PIP_GUNNER 101 +#define IDC_IGUI_AVC_PIP_SINGLE_VIEW 102 +#define IDC_IGUI_AVC_PIP_SOURCE 103 +#define IDC_IGUI_AVC_PIP_HEADING 104 +#define IDC_IGUI_AVC_PIP_MODE 105 + +//Sling Load Assistant +#define IDC_SLA_MAP 100 +#define IDC_SLA_HDIST 101 +#define IDC_SLA_VDIST 102 +#define IDC_SLA_STATUS 103 +#define IDC_SLA_LIFT_PROGRESS 104 +#define IDC_SLA_HEIGHT_BAR 105 +#define IDC_SLA_MAX_ALT 106 +#define IDC_SLA_VIEWPORT 107 + +//Sensors Display +#define IDC_SENS_VIEWPORT 101 +#define IDC_SENS_CIRCLES 102 +#define IDC_SENS_VEHICLE 103 +#define IDC_SENS_RANGE 104 +#define IDC_SENS_RADARON 105 +#define IDC_SENS_RADAROFF 106 +#define IDC_SENS_TARGET 107 +#define IDC_SENS_TARGETRANGE 108 +#define IDC_SENS_TARGETSPEED 109 +#define IDC_SENS_TARGETALT 110 +#define IDC_SENS_HEADING 111 + +//Mine detector Display +#define IDC_MINEDETECT_VIEWPORT 101 +#define IDC_MINEDETECT_CIRCLES 102 +#define IDC_MINEDETECT_VEHICLE 103 +#define IDC_MINEDETECT_RANGE 104 + +//Crew list +#define IDC_CREW_VEHICLE 101 +#define IDC_CREW_LIST 102 + +//MP Score Table +#define IDC_MP_SCORE_TABLE_TITLE 101 +#define IDC_MP_SCORE_TABLE_PLAYERS_LIST 102 +#define IDC_MP_SCORE_TABLE_SIDES_LIST 103 +#define IDC_MP_SCORE_TABLE_LINE_TEMPLATE 104 +#define IDC_MP_SCORE_TABLE_LINE_BACK 105 +#define IDC_MP_SCORE_TABLE_ORDER 106 +#define IDC_MP_SCORE_TABLE_PLAYERSNAME 107 +#define IDC_MP_SCORE_TABLE_KILLS_INF 108 +#define IDC_MP_SCORE_TABLE_KILLS_FORGET 109 +#define IDC_MP_SCORE_TABLE_KILLS_ARMOR 110 +#define IDC_MP_SCORE_TABLE_KILLS_AIR 111 +#define IDC_MP_SCORE_TABLE_KILLED 112 +#define IDC_MP_SCORE_TABLE_KILLSTOTAL 113 + +//Vehicle MessageBox +#define IDC_VEHICLEMSGBOX_BACKGROUND 100 +#define IDC_VEHICLEMSGBOX_LOGO 101 +#define IDC_VEHICLEMSGBOX_TEXT 102 +#define IDC_VEHICLEMSGBOX_PURCHASE 103 + +//Action Notification +#define IDC_DLC_ACTION_NOTIFICATION_GROUP 11406 +#define IDC_DLC_ACTION_NOTIFICATION_LOGO 100 +#define IDC_DLC_ACTION_NOTIFICATION_TEXT 101 +#define IDC_DLC_ACTION_NOTIFICATION_TITLE 102 + +//first aid icons +#define IDC_IGUI_BLEEDING0 401 +#define IDC_IGUI_BLEEDING1 402 +#define IDC_IGUI_INJURED_HEAD0 403 +#define IDC_IGUI_INJURED_HEAD1 404 +#define IDC_IGUI_INJURED_HANDS0 405 +#define IDC_IGUI_INJURED_HANDS1 406 +#define IDC_IGUI_INJURED_HANDS2 407 +#define IDC_IGUI_INJURED_LEGS0 408 +#define IDC_IGUI_INJURED_LEGS1 409 +#define IDC_IGUI_INJURED_LEGS2 410 +#define IDC_IGUI_BODY 411 +#define IDC_IGUI_VALUE_OXYGEN 412 +#define IDC_IGUI_BURNING 413 + +#define IDC_IGUI_ALT_WANTED 128 +#define IDC_IGUI_SPEED_WANTED 129 +#define IDC_IGUI_POSITION 130 +#define IDC_IGUI_OPTIC 131 + +// _VBS3 + #define IDC_IGUI_MAGAZINE 132 + #define IDC_IGUI_OVR_STATUS 133 + //TI + #define IDC_IGUI_TI_BACK 134 + #define IDC_IGUI_TI_MODE 135 + #define IDC_IGUI_TI_BRIGHTNESS_TXT 136 + #define IDC_IGUI_TI_BRIGHTNESS 137 + #define IDC_IGUI_TI_CONTRAST_TXT 138 + #define IDC_IGUI_TI_CONTRAST 139 + #define IDC_IGUI_TI_AUTO_CONTRAST 140 + + //LASE + #define IDC_IGLR_RANGE 141 + #define IDC_IGLR_BG 142 + #define IDC_IGLR_RANGE_NUM 143 + + //AVRS + #define IDC_IGUI_NICK 144 + #define IDC_IGUI_NICK_VAL 145 + #define IDC_IGUI_BANK 146 + #define IDC_IGUI_BANK_VAL 147 +// !_VBS3 +#define IDC_IGUI_HEADING 148 + +// !new arrowhead +#define IDC_IGUI_WEAPON_MODE 149 +#define IDC_IGUI_WEAPON_GUNNER 150 +#define IDC_IGUI_COUNTER_MEASURES_AMMO 151 +#define IDC_IGUI_COUNTER_MEASURES_MODE 152 + +#define IDC_IGUI_RADARRANGE 153 +#define IDC_IGUI_VALUE_RELOAD 154 +#define IDC_IGUI_WEAPON_AMMO 155 + +// New Arma 3 +#define IDC_IGUI_STANCE_INDICATOR 188 +#define IDC_IGUI_GPS_PLAYER 189 +#define IDC_IGUI_SPEED2 190 +#define IDC_IGUI_ALT2 191 +#define IDC_IGUI_PILOT_OPTIC_ZOOM 192 +#define IDC_IGUI_STAMINA_BAR 193 + +// weapon/turret info controls +#define IDC_IGUI_WEAPON_DISTANCE 151 +#define IDC_IGUI_WEAPON_VISION_MODE 152 +#define IDC_IGUI_WEAPON_FLIR_MODE 153 +#define IDC_IGUI_WEAPON_FOV_MODE 154 +#define IDC_IGUI_WEAPON_COMPASS 155 +#define IDC_IGUI_WEAPON_HEADING 156 +#define IDC_IGUI_WEAPON_AUTOHOVER 157 +#define IDC_IGUI_WEAPON_LASER_MARKER_ON 158 +#define IDC_IGUI_WEAPON_BALL_ENABLED 159 +#define IDC_IGUI_WEAPON_JAVELIN_DAY 160 +#define IDC_IGUI_WEAPON_JAVELIN_FLTR 161 +#define IDC_IGUI_WEAPON_JAVELIN_NFOV 162 +#define IDC_IGUI_WEAPON_JAVELIN_WFOV 163 +#define IDC_IGUI_WEAPON_BALL_RANGE 164 +#define IDC_IGUI_WEAPON_BALISTIC_COMP 165 +#define IDC_IGUI_WEAPON_JAVELIN_SEEK 166 +#define IDC_IGUI_WEAPON_JAVELIN_MISSLE 167 +#define IDC_IGUI_WEAPON_ELEVATION 168 +#define IDC_IGUI_WEAPON_ELEVATION_TEXT 169 +#define IDC_IGUI_WEAPON_STATIC_ITEMS 170 +#define IDC_IGUI_WEAPON_GPS_PLAYER 171 +#define IDC_IGUI_WEAPON_GPS_TARGET 172 +#define IDC_IGUI_WEAPON_ARTI_DIST 173 +#define IDC_IGUI_WEAPON_ARTI_TIME 174 +#define IDC_IGUI_WEAPON_ARTI_ELEV 175 +#define IDC_IGUI_WEAPON_ARTI_ELEV_NEED 176 +#define IDC_IGUI_WEAPON_ARTI_OUT_RANGE 177 +#define IDC_IGUI_WEAPON_ARTI_AUTO_ELEV 178 +#define IDC_IGUI_WEAPON_VISION_MODE2 179 +#define IDC_IGUI_WEAPON_OPTICS_ZOOM 180 +#define IDC_IGUI_WEAPON_TARGET_UNIT 181 +#define IDC_IGUI_WEAPON_OPTICS_PITCH 182 +#define IDC_IGUI_WEAPON_DISTANCE2 183 + +// unit info (to preserve order) - new A3 +#define IDC_IGUI_AMMOCOUNT 184 +#define IDC_IGUI_MAGCOUNT 185 + +#define IDC_IGUI_DEPTH 186 +#define IDC_IGUI_WEAPON_MODE_TEXTURE 187 +#define IDC_IGUI_WEAPON_SPEED 188 +#define IDC_IGUI_WEAPON_ALT 189 +#define IDC_IGUI_WEAPON_TIME 190 + +#define IDC_IGUI_WEAPON_CAM_TRACK_AREA 194 +#define IDC_IGUI_WEAPON_CAM_TRACK_TARGET 195 + +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_FROM_TOP 196 +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_DIRECT 197 + +#define IDC_IGUI_WEAPON_LASED_DISTANCE 198 +#define IDC_IGUI_WEAPON_LASED_SPEED 199 +#define IDC_IGUI_WEAPON_LASED_VALID 200 +#define IDC_IGUI_WEAPON_LASED_ERR_LEAD 201 +#define IDC_IGUI_WEAPON_LASED_ERR_ELEV 202 +#define IDC_IGUI_WEAPON_LASED_ERR_OBJECT 203 +#define IDC_IGUI_WEAPON_LASER_ZEROING_DELAY 204 + +#define IDC_IGUI_THROTTLE 205 +#define IDC_IGUI_VEHICLE_DIRECTION 206 +#define IDC_IGUI_VEHICLE_DIRECTION2 207 + + + + + +// helicopter unit info +#define IDC_IGUI_GMETER 501 +#define IDC_IGUI_RADARALTIMETER 505 +#define IDC_IGUI_RADARALTIMETER_BAR 506 +#define IDC_IGUI_RADARALTIMETER_VALUE 507 +#define IDC_IGUI_TORQUE 510 +#define IDC_IGUI_WINDINDICATOR 515 +#define IDC_IGUI_WINDINDICATOR_TEXT 516 +#define IDC_IGUI_WINDINDICATOR_IMAGE 517 +#define IDC_IGUI_STABILITYINDICATOR 520 +#define IDC_IGUI_STABILITYINDICATOR_AXIS 521 +#define IDC_IGUI_STABILITYINDICATOR_OFFSET 522 +#define IDC_IGUI_COLLECTIVE 525 +#define IDC_IGUI_AIRSPEEDINDICATOR 530 +#define IDC_IGUI_AIRSPEEDINDICATOR_AXIS 531 +#define IDC_IGUI_AIRSPEEDINDICATOR_VALUE 532 +#define IDC_IGUI_ALTIMETER 535 +#define IDC_IGUI_ALTIMETER_AXIS 536 +#define IDC_IGUI_ALTIMETER_VALUE 537 +#define IDC_IGUI_ATTITUDEINDICATOR 540 +#define IDC_IGUI_ATTITUDEINDICATOR_LITE 541 +#define IDC_IGUI_TRIMINDICATOR 545 +#define IDC_IGUI_AUTOHOVERNDICATOR 546 +#define IDC_IGUI_HELIHUD_MISCELLANEOUS 550 + +// helicopter Analogue unit info +#define IDC_IGUI_ANALOGUE_SPEED 601 +#define IDC_IGUI_ANALOGUE_SPEED_NEEDLE 602 +#define IDC_IGUI_ANALOGUE_SPEED_MIN 603 +#define IDC_IGUI_ANALOGUE_SPEED_MAX 604 +#define IDC_IGUI_ANALOGUE_SPEED_TEXT 605 +#define IDC_IGUI_ANALOGUE_SPEED_IMPERIAL 606 +#define IDC_IGUI_ANALOGUE_SPEED_METRIC 607 + +#define IDC_IGUI_ANALOGUE_ALTITUDE 611 +#define IDC_IGUI_ANALOGUE_ALTITUDE_NEEDLE 612 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MIN 613 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MAX 614 +#define IDC_IGUI_ANALOGUE_ALTITUDE_TEXT 615 +#define IDC_IGUI_ANALOGUE_ALTITUDE_IMPERIAL 616 +#define IDC_IGUI_ANALOGUE_ALTITUDE_METRIC 617 + +#define IDC_IGUI_ANALOGUE_ATTITUDE 621 +#define IDC_IGUI_ANALOGUE_ATTITUDE_HORIZON 622 +#define IDC_IGUI_ANALOGUE_ATTITUDE_VALUE 623 + +#define IDC_IGUI_ANALOGUE_COMPASS 631 +#define IDC_IGUI_ANALOGUE_COMPASS_DIR 632 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND 633 +#define IDC_IGUI_ANALOGUE_COMPASS_WAYPOINT 634 +#define IDC_IGUI_ANALOGUE_COMPASS_MIN 635 +#define IDC_IGUI_ANALOGUE_COMPASS_MAX 636 +#define IDC_IGUI_ANALOGUE_COMPASS_TEXT 637 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND_TEXT 638 + +#define IDC_IGUI_ANALOGUE_STABILITY 641 +#define IDC_IGUI_ANALOGUE_STABILITY_SPEED 642 +#define IDC_IGUI_ANALOGUE_STABILITY_TEXT 643 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED_NEEDLE 644 +#define IDC_IGUI_ANALOGUE_STABILITY_COLLECTIVE 645 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED 646 +#define IDC_IGUI_ANALOGUE_STABILITY_IMPERIAL 647 +#define IDC_IGUI_ANALOGUE_STABILITY_METRIC 648 + +//damage +#define IDC_IGUI_DAMAGE_GROUP 660 +#define IDC_IGUI_DAMAGE_ENGINESRPM 662 +#define IDC_IGUI_DAMAGE_ENGINESDAMAGE 663 +#define IDC_IGUI_DAMAGE_TORQUE 664 +#define IDC_IGUI_DAMAGE_ELECTRICITY 665 +#define IDC_IGUI_DAMAGE_FUEL 666 +#define IDC_IGUI_DAMAGE_HYDRAULICS 667 +#define IDC_IGUI_DAMAGE_MAINROTOR 668 +#define IDC_IGUI_DAMAGE_TAILROTOR 669 +#define IDC_IGUI_DAMAGE_AUTOHOVER 670 +#define IDC_IGUI_DAMAGE_INSTALLATIONS 671 +#define IDC_IGUI_DAMAGE_HULL 672 +#define IDC_IGUI_DAMAGE_WHEELBRAKE 673 +#define IDC_IGUI_DAMAGE_ROTORBRAKE 674 +#define IDC_IGUI_DAMAGE_WINCH 675 +#define IDC_IGUI_DAMAGE_GEAR 676 + +// - hint +#define IDC_IGHINT_BG 101 +#define IDC_IGHINT_HINT 102 + +// - task hint +#define IDC_IGTASKHINT_BG 103 +#define IDC_IGTASKHINT_HINT 104 + +// - load mission progress bar +#define IDC_LOAD_MISSION_NAME 101 +#define IDC_LOAD_MISSION_DATE 102 +#define IDC_PROGRESS_TIME 103 +#define IDC_PROGRESS_PROGRESS 104 +#define IDC_LOAD_MISSION_PICTURE 105 +#define IDC_LOAD_MISSION_TEXT 106 + +// - dedicated server dialog +#define IDC_DS_REPORT 101 +#define IDC_DS_PLAYERS 102 +#define IDC_DS_FRIENDS 103 + +// - friend's missions dialog +#define IDC_FRIEND_MISSIONS_LIST 101 + +// - live statistics dialogs +#define IDC_LIVE_STATS_BOARDS 101 + +#define IDC_LIVE_STATS_LIST 101 +#define IDC_LIVE_STATS_COUNT 102 +#define IDC_LIVE_STATS_TITLE 103 +#define IDC_LIVE_STATS_PLAYER 104 +#define IDC_LIVE_STATS_BEGIN 105 +#define IDC_LIVE_STATS_END 106 +#define IDC_LIVE_STATS_PREV 107 +#define IDC_LIVE_STATS_NEXT 108 +#define IDC_LIVE_STATS_FRIENDS 109 +#define IDC_LIVE_STATS_GAMER_CARD 110 + +#define IDC_RECEIVING_TEXT 101 +#define IDC_RECEIVING_TIME 102 + +#define IDC_MSG_BOX_MESSAGE 101 + +#define IDC_EDITOR_OBJECTS 201 +#define IDC_EDITOR_ATTRIBUTES 202 +#define IDC_EDITOR_BACKGROUND 203 +#define IDC_EDITOR_MENU 204 +#define IDC_EDITOR_SAVE 205 +#define IDC_EDITOR_LOAD 206 +#define IDC_EDITOR_RESTART 207 +#define IDC_EDITOR_PREVIEW 208 +#define IDC_EDITOR_MAP 209 +#define IDC_EDITOR_CLEAR 210 +#define IDC_EDITOR_TYPE_LIST 211 + +// editor menu system +#define IDC_EDITOR_FILE 212 +#define IDC_EDITOR_VIEW 213 +#define IDC_EDITOR_USER 214 +#define IDC_EDITOR_MENU_FILE 216 +#define IDC_EDITOR_MENU_VIEW 217 +#define IDC_EDITOR_MENU_USER 218 + +#define IDC_EDITOR_CONTROLS_HELP 220 +#define IDC_EDITOR_LOAD_AAR 221 + +#define IDC_EDITOR_ADDOBJ_TYPES 222 +#define IDC_EDITOR_ADDOBJ_CATEGORIES 223 +#define IDC_EDITOR_ADDOBJ_LISTING 224 + +#define IDC_MINI_MAP 225 + +// editor tree filtering +#define IDC_EDITOR_OBJECTS_FILTER 236 +#define IDC_EDITOR_TREE_EXPAND_ALL 237 +#define IDC_EDITOR_TREE_EXPAND_ALL_BACK 238 +#define IDC_EDITOR_TREE_COLLAPSE_ALL 239 +#define IDC_EDITOR_TREE_COLLAPSE_ALL_BACK 240 + +#define IDC_EDIT_OBJECT_CONTROLS 101 +#define IDC_EDIT_OBJECT_TOGGLE_BUTTON 102 + +#define IDC_NEW_OBJECT_TYPE 101 +#define IDC_NEW_OBJECT_PARENT 102 + +#define IDC_MISSION_LOAD_ISLAND 101 +#define IDC_MISSION_LOAD_MISSION 102 + +#define IDC_MISSION_SAVE_MISSION 101 +#define IDC_MISSION_SAVE_TITLE 102 +#define IDC_MISSION_SAVE_DESCRIPTION 103 +#define IDC_MISSION_SAVE_PLACEMENT 104 + +#define IDC_OVERLAY_CREATE_NAME 101 +#define IDC_OVERLAY_LOAD_NAME 101 +#define IDC_OVERLAY_LOAD_MISSION 102 + +#define IDC_EDIT_DIARY_RECORD 101 +#define IDC_EDIT_DIARY_TITLE 102 + +#define IDC_LOAD_AAR_NAME 101 + +#define IDC_EDITOR_EB_PLAN 101 +#define IDC_EDITOR_EB_NOTES 102 +#define IDC_EDITOR_EB_SIDE 103 +#define IDC_EDITOR_EB_OBJECTIVES 104 +#define IDC_EDITOR_EB_NEW_OBJECTIVE 105 +#define IDC_EDITOR_EB_ADD_OBJECTIVE 106 +#define IDC_EDITOR_EB_DEL_OBJECTIVE 107 + +// - team switch display + +#define IDC_TEAM_SWITCH_ROLES 101 + +// - configure action display + +#define IDC_CONFIGURE_ACTION_TITLE 101 +#define IDC_CONFIGURE_ACTION_KEYS 102 +#define IDC_CONFIGURE_ACTION_SPECIAL 103 +#define IDC_CONFIGURE_ACTION_DELETE 104 +#define IDC_CONFIGURE_ACTION_DEFAULT 105 +#define IDC_CONFIGURE_ACTION_CLEAR 106 +#define IDC_CONFIGURE_ACTION_CANCEL 107 +#define IDC_CONFIGURE_ACTION_PREV 108 +#define IDC_CONFIGURE_ACTION_NEXT 109 + +// - controls display +#define IDC_CONTROLS_TYPE 101 +#define IDC_CONTROLS_CONFIGURE 102 + +// - miniMap display + +#define IDC_MINIMAP 101 +#define IDC_MINIMAP_VIEWPORT 102 +#define IDC_MINIMAP_GRID 197 +#define IDC_MINIMAP_HEADING 198 +#define IDC_MINIMAP_TIME 199 + + +// - scripting help display +#define IDC_SCRITING_HELP 101 +#define IDC_SCRITING_HELP_BACK 102 +#define IDC_SCRITING_HELP_FORWARD 103 +#define IDC_SCRITING_HELP_EXAMPLE 104 + +// - performance display +#define IDC_PERF_INDEX 101 +#define IDC_PERF_ENABLE 102 +#define IDC_PERF_GRAPH 103 +#define IDC_PERF_GRAPH_TITLE 104 +#define IDC_PERF_MAXTIME 105 + +// - capture display +#define IDC_CAPTURE_INDEX 101 +#define IDC_CAPTURE_TIMELINES 102 +#define IDC_CAPTURE_ZOOMIN 103 +#define IDC_CAPTURE_ZOOMOUT 104 +#define IDC_CAPTURE_EXPORT 105 +#define IDC_CAPTURE_INFO 106 +#define IDC_CAPTURE_EXPORT_ALL 107 +#define IDC_CAPTURE_IMPORT_ALL 108 +#define IDC_CAPTURE_PREVIOUS_DATA 109 +#define IDC_CAPTURE_AVERAGES 110 +#define IDC_CAPTURE_SAVE_ARCHIVE 111 +#define IDC_CAPTURE_SEARCH 112 + + +// - joysticks configuration display +#define IDC_CONTROLLER_CUSTOMIZE 101 +#define IDC_CONTROLLER_ENABLE 102 +#define IDC_CONTROLLER_XINPUT_LIST 103 +#define IDC_CONTROLLER_LIST 104 +#define IDC_CONTROLLER_REFRESH 105 + +// - customize controllers +#define IDC_CUSTOMIZE_CTRL_SENSITIVITIES 101 +#define IDC_CUSTOMIZE_CTRL_UNMAP 102 +#define IDC_CUSTOMIZE_CTRL_DEFAULT 103 +#define IDC_CUSTOMIZE_CTRL_TITLE 104 +#define IDC_CUSTOMIZE_CTRL_DEFAULT_BINDING 105 +#define IDC_CUSTOMIZE_CTRL_ADVANCED 106 +#define IDC_SENSITIVITY_SLIDER 120 +#define IDC_DEADZONE_SLIDER 220 +#define IDC_CUSTOMIZE_CTRL_ACTIVE_AXIS_ICON 320 +#define IDC_CUSTOMIZE_CTRL_STEEPNESS 420 +#define IDC_CUSTOMIZE_CTRL_VALUE 520 + +// - joystick schemes +#define IDC_JOY_SCHEMES_TITLE 101 +#define IDC_JOY_SCHEMES_LIST 102 +#define IDC_JOY_SCHEMES_MAP 103 + +// - helper IDC for DisplayCampaignLoadLight +#define IDC_MP_CAMPAIGN_RESTART 150 +#define IDC_MP_CAMPAIGN_REPLAY 151 +#define IDC_MP_CAMPAIGN_LOAD 152 + +// - addon actions display +#define IDC_ADDON_ACTIONS 101 +#define IDC_ADDON_ACTIONS_NEW_MOD 102 + +// - mod launcher +#define IDC_MOD_LAUNCHER_MODS 101 +#define IDC_MOD_LAUNCHER_PICTURE 102 +#define IDC_MOD_LAUNCHER_UP 103 +#define IDC_MOD_LAUNCHER_DOWN 104 +#define IDC_MOD_LAUNCHER_DISABLE 105 +#define IDC_MOD_LAUNCHER_ACTION 106 +#define IDC_MOD_LAUNCHER_PURCHASE 107 +#define IDC_MOD_LAUNCHER_DESCRIPTION 108 + +// - create new mod +#define IDC_MOD_NAME 101 +#define IDC_MOD_DIR 102 + + +//A3 credits +#define ONBUTTONCLICK_START_CREDITS "0 = _this spawn (uinamespace getvariable 'bis_fnc_credits');" + + +// Hitzone types +#define HZ_AIRPLANE_HULL 0 +#define HZ_AIRPLANE_ENG 22 +#define HZ_AIRPLANE_FUEL 23 +#define HZ_AIRPLANE_GEAR 24 +#define HZ_AIRPLANE_WINGS 25 +#define HZ_AIRPLANE_INST 26 + +#define HZ_HELICOPTER_HULL 1 +#define HZ_HELICOPTER_ENG 2 +#define HZ_HELICOPTER_INST 3 +#define HZ_HELICOPTER_ATRQ 4 +#define HZ_HELICOPTER_MROT 5 +#define HZ_HELICOPTER_WINCH 6 + +#define HZ_CAR_HULL 7 +#define HZ_CAR_ENG 8 +#define HZ_CAR_FUEL 9 +#define HZ_CAR_WHL 10 + +#define HZ_MOTORCYCLE_HULL 11 +#define HZ_MOTORCYCLE_ENG 12 +#define HZ_MOTORCYCLE_FUEL 13 +#define HZ_MOTORCYCLE_WHL 14 + +#define HZ_TANK_HULL 15 +#define HZ_TANK_ENG 16 +#define HZ_TANK_GUN 17 +#define HZ_TANK_LTR 18 +#define HZ_TANK_RTR 19 +#define HZ_TANK_TRRT 20 + +#define HZ_VEH_GUN HZ_TANK_GUN +#define HZ_VEH_TRRT HZ_TANK_TRRT + +#define HZ_SHIP_ENG 21 + +#define HZ_VEH_TOTAL 27 + +#define HZ_TANK_CMDGUN 28 +#define HZ_TANK_CMDTRRT 29 +#define HZ_VEH_CMDGUN HZ_TANK_CMDGUN +#define HZ_VEH_CMDTRRT HZ_TANK_CMDTRRT + +#define HZ_VEH_TRRT_TOTAL 30 +#define HZ_VEH_CMDTRRT_TOTAL 31 + +#define HZ_TANK_BOTH_TRACKS 32 + + +#endif \ No newline at end of file diff --git a/arma/server/include/a3/ui_f/hpp/defineResinclDesign.inc b/arma/server/include/a3/ui_f/hpp/defineResinclDesign.inc new file mode 100644 index 0000000..0c66937 --- /dev/null +++ b/arma/server/include/a3/ui_f/hpp/defineResinclDesign.inc @@ -0,0 +1,1063 @@ +#define IDC_SEARCH 645 +#define IDC_SEARCH_BUTTON 646 + +//--- RscDisplayMain +#define IDC_MAIN_GAMEMODES 201 +#define IDC_MAIN_MP_SCENARIOS 202 +#define IDC_MAIN_ARSENAL 203 +#define IDC_MAIN_COMMUNITYGUIDES 204 +#define IDC_MAIN_PROFILE 205 +#define IDC_MAIN_CAMPAIGN_MP 206 + +#define IDC_MAIN_MOUSEAREA 999 +#define IDC_MAIN_BACKGROUND_PICTURE 998 +#define IDC_MAIN_BACKGROUND_BLACK 997 + +#define IDC_MAIN_GROUP_SINGLEPLAYER 1001 +#define IDC_MAIN_GROUP_MULTIPLAYER 1002 +#define IDC_MAIN_GROUP_TUTORIALS 1003 +#define IDC_MAIN_GROUP_OPTIONS 1004 +#define IDC_MAIN_GROUP_SESSION 1005 + +#define IDC_MAIN_TITLE_SINGLEPLAYER 1011 +#define IDC_MAIN_TITLE_MULTIPLAYER 1012 +#define IDC_MAIN_TITLE_TUTORIALS 1013 +#define IDC_MAIN_TITLE_OPTIONS 1014 +#define IDC_MAIN_TITLE_SESSION 1015 + +#define IDC_MAIN_TITLEICON_SINGLEPLAYER 1111 +#define IDC_MAIN_TITLEICON_MULTIPLAYER 1112 +#define IDC_MAIN_TITLEICON_TUTORIALS 1113 +#define IDC_MAIN_TITLEICON_OPTIONS 1114 +#define IDC_MAIN_TITLEICON_SESSION 1115 + +#define IDC_MAIN_SPOTLIGHT_GROUP_1 1020 +#define IDC_MAIN_SPOTLIGHT_GROUP_2 1021 +#define IDC_MAIN_SPOTLIGHT_GROUP_3 1022 +#define IDC_MAIN_SPOTLIGHT_PICTURE 1023 +#define IDC_MAIN_SPOTLIGHT_VIDEO 1024 +#define IDC_MAIN_SPOTLIGHT_HOVER 1025 +#define IDC_MAIN_SPOTLIGHT_BUTTON 1026 +#define IDC_MAIN_SPOTLIGHT_ACTION 1027 +#define IDC_MAIN_SPOTLIGHT_TEXT 1028 +#define IDC_MAIN_SPOTLIGHT_TEXTBCG 1029 + +#define IDC_MAIN_SPOTLIGHT_PREV 1060 +#define IDC_MAIN_SPOTLIGHT_NEXT 1061 + +#define IDC_MAIN_INFO_MODS 1030 +#define IDC_MAIN_INFO_DLCS 1031 +#define IDC_MAIN_INFO_DLCSOWNED 10311 +#define IDC_MAIN_INFO_NEWS 1032 +#define IDC_MAIN_INFO_VERSION 1033 + +#define IDC_MAIN_INFO_BACKGROUND 1034 +#define IDC_MAIN_INFO_BACKGROUND_ICON 1035 +#define IDC_MAIN_INFO_ICON 1036 +#define IDC_MAIN_INFO_BUTTON 1037 +#define IDC_MAIN_INFO_BUTTON_DEV 1038 +#define IDC_MAIN_INFO_NOTIFICATION 1039 + +#define IDC_MAIN_VERSION_DEV 1050 + +#define BARCOLOR 0, 0, 0, 0.75 +#define INFO_BACKGROUND_COLOR BARCOLOR +#define INFO_ICON_COLOR 1, 1, 1, 0.5 + +//--- RscDisplayDebug +#define IDC_RSCDISPLAYDEBUG_DESIGNHTML 11735 +#define IDC_RSCDISPLAYDEBUG_TEXTEXPRESSION 11736 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR1 11737 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR2 11738 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR3 11739 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR4 11740 +#define IDC_RSCDISPLAYDEBUG_TEXTWATCH 11741 +#define IDC_RSCDISPLAYDEBUG_DIAGTEXT 11747 +#define IDC_RSCDISPLAYDEBUG_DRAWTEXT 11748 +#define IDC_RSCDISPLAYDEBUG_CA_TITLE 11838 +#define IDC_RSCDISPLAYDEBUG_CA_PLAYER 12145 +#define IDC_RSCDISPLAYDEBUG_CA_VERSION 12146 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST 12236 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST_SEARCH 12238 +#define IDC_RSCDISPLAYDEBUG_DRAWLIST 12237 +#define IDC_RSCDISPLAYDEBUG_DIAGFRAME 12535 +#define IDC_RSCDISPLAYDEBUG_DRAWFRAME 12536 +#define IDC_RSCDISPLAYDEBUG_FRAMELOG 12537 +#define IDC_RSCDISPLAYDEBUG_G_EXPRESSION 13035 +#define IDC_RSCDISPLAYDEBUG_G_DIAG 13036 +#define IDC_RSCDISPLAYDEBUG_G_DESIGN 13037 +#define IDC_RSCDISPLAYDEBUG_G_WATCH 13038 +#define IDC_RSCDISPLAYDEBUG_G_DRAW 13039 +#define IDC_RSCDISPLAYDEBUG_DIAGBUTTON 13138 +#define IDC_RSCDISPLAYDEBUG_DRAWBUTTON 13139 +#define IDC_RSCDISPLAYDEBUG_DEBUGFLOW 13140 +#define IDC_RSCDISPLAYDEBUG_DEBUGANIM 13141 +#define IDC_RSCDISPLAYDEBUG_B_CAMERANEW 13142 +#define IDC_RSCDISPLAYDEBUG_CREATEJIRAISSUE 13143 +#define IDC_RSCDISPLAYDEBUG_DEBUGGUI 13144 +#define IDC_RSCDISPLAYDEBUG_DEBUGFUNCTIONS 13145 +#define IDC_RSCDISPLAYDEBUG_DEBUGCONFIG 13154 +#define IDC_RSCDISPLAYDEBUG_B_CAMERA 13155 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT1 13157 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT2 13158 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT3 13159 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT4 13160 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT5 13161 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT6 13163 +#define IDC_RSCDISPLAYDEBUG_DEBUGCAPTURE 13164 + +//--- RscDisplayAnimViewer +#define IDC_RSCDISPLAYANIMVIEWER_TITLE 1000 +#define IDC_RSCDISPLAYANIMVIEWER_BACKGROUND 1001 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTACTION 1002 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTPOSE 1003 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTMOVEMENT 1004 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTSTANCE 1005 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTITEM 1006 +#define IDC_RSCDISPLAYANIMVIEWER_DESCRIPTION 1100 +#define IDC_RSCDISPLAYANIMVIEWER_MISC 1500 +#define IDC_RSCDISPLAYANIMVIEWER_ACTION 2100 +#define IDC_RSCDISPLAYANIMVIEWER_POSE 2101 +#define IDC_RSCDISPLAYANIMVIEWER_MOVEMENT 2102 +#define IDC_RSCDISPLAYANIMVIEWER_STANCE 2103 +#define IDC_RSCDISPLAYANIMVIEWER_ITEM 2104 +#define IDC_RSCDISPLAYANIMVIEWER_SOLDIER 2106 +#define IDC_RSCDISPLAYANIMVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYANIMVIEWER_MOUSEAREA 999 +#define IDC_RSCDISPLAYANIMVIEWER 1320 + +//--- RscDisplayFunctionsViewer +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEBACKGROUND 1000 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDLEFT 1001 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDRIGHT 1002 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDMETA 1003 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLETEXT 1004 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_AUTHOR 1005 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODESTRUCTURED 1100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEICON 1200 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODE 1400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_NAME 1401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_FUNCTIONS 1500 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_SOURCES 2100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TAGS 2101 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CATEGORIES 2102 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_PREVIEW 2300 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_ALL 2400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_SELECTED 2401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYFUNCTIONSVIEWER 1321 + +//--- Loading +#define IDC_LOADING_MAPBACKTOP 1000 +#define IDC_LOADING_MAPNAME 1001 +#define IDC_LOADING_MAPAUTHOR 1002 +#define IDC_LOADING_MAPBACKBOTTOM 1003 +#define IDC_LOADING_MISSIONBACKGROUNDTOP 1005 +#define IDC_LOADING_MISSIONNAME 1006 +#define IDC_LOADING_MISSIONAUTHOR 1007 +#define IDC_LOADING_PROGRESSMAP 1008 +#define IDC_LOADING_DISCLAIMERNAME 1009 +#define IDC_LOADING_MISSIONPICTUREBACK 1010 +#define IDC_LOADING_MISSIONGAMETYPE 1012 +#define IDC_LOADING_PROGRESSMISSION 1013 +#define IDC_LOADING_MISSIONDESCRIPTION 1100 +#define IDC_LOADING_DISCLAIMERDESCRIPTION 1101 +#define IDC_LOADING_MAPDESCRIPTION 1102 +#define IDC_LOADING_MISSION 2300 +#define IDC_LOADING_DISCLAIMER 2301 +//--- Loading - DLC part +#define IDC_LOADING_DLCNAME 3207 +#define IDC_LOADING_DLCAUTHOR 3208 +#define IDC_LOADING_DLCPICTUREBACK 3209 +#define IDC_LOADING_DLCDESCRIPTION 3296 +#define IDC_LOADING_DLCPICTURE 3393 +#define IDC_LOADING_DLCSTRIPE 3395 +#define IDC_LOADING_DLCICON 3396 + +#define IDC_LOADING_MAP 999 + +//--- LoadingStart +#define IDC_LOADINGSTART_BLACK 1000 +#define IDC_LOADINGSTART_LOGO 1200 +#define IDC_LOADINGSTART_NOISE 1201 +#define IDC_LOADINGSTART_LOADINGSTART 2310 + +//--- RscDisplayDebriefing +#define IDC_RSCDISPLAYDEBRIEFING_LISTGROUP 21903 //Defined manually +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE 21904 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBACKGROUND 20594 +#define IDC_RSCDISPLAYDEBRIEFING_MAINBACKGROUND 20595 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBACKGROUND 20596 +#define IDC_RSCDISPLAYDEBRIEFING_PLAYERNAME 20599 +#define IDC_RSCDISPLAYDEBRIEFING_TITLE 20600 +#define IDC_RSCDISPLAYDEBRIEFING_SUBTITLE 20601 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVESBACKGROUND 20602 +#define IDC_RSCDISPLAYDEBRIEFING_STATBACKGROUND 20603 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONBACKGROUND 20604 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBACKGROUND 20605 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGTEXT 20606 +#define IDC_RSCDISPLAYDEBRIEFING_RATING 20607 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBEST 20608 +#define IDC_RSCDISPLAYDEBRIEFING_TIMETEXT 20609 +#define IDC_RSCDISPLAYDEBRIEFING_TIME 20610 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBEST 20611 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSTEXT 20612 +#define IDC_RSCDISPLAYDEBRIEFING_LOADS 20613 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBEST 20614 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWBACKGROUND 20615 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWTEXT 20616 +#define IDC_RSCDISPLAYDEBRIEFING_DLCCOUNTDOWN 20617 +#define IDC_RSCDISPLAYDEBRIEFING_TABSBACKGROUND 20618 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBAR 20619 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONTEXT 20693 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOMTEXT 20694 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE1 20696 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE2 20697 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE3 20698 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE4 20699 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE5 20700 +#define IDC_RSCDISPLAYDEBRIEFING_PICTURE 20793 +#define IDC_RSCDISPLAYDEBRIEFING_MISSIONPICTURE 20794 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWPICTURE 20795 +#define IDC_RSCDISPLAYDEBRIEFING_DLCLOCKICON 20798 +#define IDC_RSCDISPLAYDEBRIEFING_SECTION 21093 +#define IDC_RSCDISPLAYDEBRIEFING_SUMMARY 21893 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTION 21894 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVES 21895 +#define IDC_RSCDISPLAYDEBRIEFING_STAT 21896 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOM 21897 +#define IDC_RSCDISPLAYDEBRIEFING_DATA 21898 +#define IDC_RSCDISPLAYDEBRIEFING_SIDES 21899 +#define IDC_RSCDISPLAYDEBRIEFING_DLCGENERALGROUP 21900 +#define IDC_RSCDISPLAYDEBRIEFING_LOAC 21901 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONALLASSETS 21995 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONKARTS 21996 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONHELI 21997 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONMARKSMEN 21998 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONAPEX 22000 + +//--- RscDisplayDebriefing - DLC item template +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUND 20623 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUNDBLACK 20624 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMNAME 20625 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTSESSIONTIME 20626 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMSESSIONTIME 20627 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTTOTALTIME 20628 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTOTALTIME 20629 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDESCRIPTION 20630 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMPICTURE 20796 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDLCLOGO 20797 +#define IDC_RSCDISPLAYDEBRIEFING_RSCDISPLAYDEBRIEFING_ITEMTEMPLATE 21902 +#define IDC_RSCDISPLAYDEBRIEFING_BUTTONPURCHASE 21999 + +//--- RscDisplayDebriefing_LOACTemplate +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_BACKGROUND 52605 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TITLE 52705 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXT 52706 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_PICTURE 52805 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXTGROUP 53905 + + +//--- RscDebugConsole +#define IDC_RSCDEBUGCONSOLE_TITLE 11884 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONBACKGROUND 11885 +#define IDC_RSCDEBUGCONSOLE_WATCHBACKGROUND 11886 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND1 11887 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND2 11888 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND3 11889 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND4 11890 +#define IDC_RSCDEBUGCONSOLE_LINK 11891 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONTEXT 11892 +#define IDC_RSCDEBUGCONSOLE_WATCHTEXT 11893 +#define IDC_RSCDEBUGCONSOLE_EXPRESSION 12284 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT1 12285 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT1 12286 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT2 12287 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT2 12288 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT3 12289 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT3 12290 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT4 12291 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT4 12293 +#define IDC_RSCDEBUGCONSOLE_RSCDEBUGCONSOLE 13184 +#define IDC_RSCDEBUGCONSOLE_BUTTONCODEPERFORMANCE 13284 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTEALL 13285 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTESERVER 13286 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPECTATORCAMERA 13287 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPLENDIDCAMERA 13288 +#define IDC_RSCDEBUGCONSOLE_BUTTONFUNCTIONS 13289 +#define IDC_RSCDEBUGCONSOLE_BUTTONCONFIG 13290 +#define IDC_RSCDEBUGCONSOLE_BUTTONANIMATIONS 13291 +#define IDC_RSCDEBUGCONSOLE_BUTTONGUI 13292 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTELOCAL 13484 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUT 13190 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUTBACKGROUND 13191 + + + +//--- RscDisplayOptionsLayout +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TITLE 1000 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BACKGROUND 1001 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGSTEXT 1002 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETSLABEL 1003 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_MOUSEAREA 1004 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERW 1005 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERH 1006 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TOOLTIP 1100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGS 2100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETS 2101 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONSAVE 2400 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONOK 2600 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONCANCEL 2700 + +//--- RscDisplayRespawn +#define IDC_RSCDISPLAYRESPAWN_TITLE 1000 +#define IDC_RSCDISPLAYRESPAWN_LISTBACKGROUND 1001 +#define IDC_RSCDISPLAYRESPAWN_SECTION 1002 +#define IDC_RSCDISPLAYRESPAWN_BLACK 1003 +#define IDC_RSCDISPLAYRESPAWN_CONTENTBACKGROUND 1004 +#define IDC_RSCDISPLAYRESPAWN_BLACKCONTENT 1005 +#define IDC_RSCDISPLAYRESPAWN_PLAYERSNAME 1006 +#define IDC_RSCDISPLAYRESPAWN_CONTENT 1100 +#define IDC_RSCDISPLAYRESPAWN_LIST 1500 +#define IDC_RSCDISPLAYRESPAWN_CONTENTGROUP 2300 +#define IDC_RSCDISPLAYRESPAWN_BUTTONOK 2600 +#define IDC_RSCDISPLAYRESPAWN_BUTTONCANCEL 2700 + +#define IDC_RSCDISPLAYRESPAWN_MAP 1050 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 1000 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 1002 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 1003 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 1004 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 1200 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 1201 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 1202 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 1203 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 1204 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 1205 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 2300 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 2600 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 2700 + +//--- RscSpectator +#define IDC_RSCSPECTATOR_PLAYERNAMEBACKGROUND 1000 +#define IDC_RSCSPECTATOR_PLAYERGROUP 1001 +#define IDC_RSCSPECTATOR_PLAYERNAME 1002 +#define IDC_RSCSPECTATOR_PLAYERDESCRIPTION 1100 +#define IDC_RSCSPECTATOR_PLAYERICON 1200 +#define IDC_RSCSPECTATOR_PLAYER 2300 + +//--- RscMissionEnd +#define IDC_RSCMISSIONEND_TITLE 8942 +#define IDC_RSCMISSIONEND_SUBTITLE 8943 +#define IDC_RSCMISSIONEND_SIDE1 9045 +#define IDC_RSCMISSIONEND_SIDE2 9046 +#define IDC_RSCMISSIONEND_SIDE3 9047 +#define IDC_RSCMISSIONEND_SIDE4 9048 +#define IDC_RSCMISSIONEND_SIDE5 9049 +#define IDC_RSCMISSIONEND_PICTURE 9142 +#define IDC_RSCMISSIONEND_SIDES 10248 + +//--- RscNotification +#define IDC_RSCNOTIFICATION_TITLE 12135 +#define IDC_RSCNOTIFICATION_PICTUREBACKGROUND 12136 +#define IDC_RSCNOTIFICATION_SCORE 12137 +#define IDC_RSCNOTIFICATION_DESCRIPTIONBACKGROUND 12138 +#define IDC_RSCNOTIFICATION_DESCRIPTION 12235 +#define IDC_RSCNOTIFICATION_PICTURE 12335 +#define IDC_RSCNOTIFICATION_NOTIFICATION 13435 + +#define IDC_RSCNOTIFICATION_NOTIFICATIONAREA 312 + +//--- RscCommMenuItems +#define IDC_RSCCOMMMENUITEMS_SLOT1BACKGROUND 1000 +#define IDC_RSCCOMMMENUITEMS_SLOT2BACKGROUND 1001 +#define IDC_RSCCOMMMENUITEMS_SLOT3BACKGROUND 1002 +#define IDC_RSCCOMMMENUITEMS_SLOT4BACKGROUND 1003 +#define IDC_RSCCOMMMENUITEMS_SLOT5BACKGROUND 1004 +#define IDC_RSCCOMMMENUITEMS_SLOT6BACKGROUND 1005 +#define IDC_RSCCOMMMENUITEMS_SLOT7BACKGROUND 1006 +#define IDC_RSCCOMMMENUITEMS_SLOT8BACKGROUND 1007 +#define IDC_RSCCOMMMENUITEMS_SLOT9BACKGROUND 1008 +#define IDC_RSCCOMMMENUITEMS_SLOT0BACKGROUND 1009 +#define IDC_RSCCOMMMENUITEMS_SLOT1TEXT 1010 +#define IDC_RSCCOMMMENUITEMS_SLOT1 1200 +#define IDC_RSCCOMMMENUITEMS_SLOT2 1201 +#define IDC_RSCCOMMMENUITEMS_SLOT3 1202 +#define IDC_RSCCOMMMENUITEMS_SLOT4 1203 +#define IDC_RSCCOMMMENUITEMS_SLOT5 1204 +#define IDC_RSCCOMMMENUITEMS_SLOT6 1205 +#define IDC_RSCCOMMMENUITEMS_SLOT7 1206 +#define IDC_RSCCOMMMENUITEMS_SLOT8 1207 +#define IDC_RSCCOMMMENUITEMS_SLOT9 1208 +#define IDC_RSCCOMMMENUITEMS_SLOT0 1209 +#define IDC_RSCCOMMMENUITEMS_SLOT2TEXT 1210 +#define IDC_RSCCOMMMENUITEMS_SLOT3TEXT 1211 +#define IDC_RSCCOMMMENUITEMS_SLOT4TEXT 1212 +#define IDC_RSCCOMMMENUITEMS_SLOT5TEXT 1213 +#define IDC_RSCCOMMMENUITEMS_SLOT6TEXT 1214 +#define IDC_RSCCOMMMENUITEMS_SLOT7TEXT 1215 +#define IDC_RSCCOMMMENUITEMS_SLOT8TEXT 1216 +#define IDC_RSCCOMMMENUITEMS_SLOT9TEXT 1217 +#define IDC_RSCCOMMMENUITEMS_SLOT0TEXT 1218 +#define IDC_RSCCOMMMENUITEMS_RSCCOMMMENUITEMS 2300 + +//--- RscRespawnCounter +#define IDC_RSCRESPAWNCOUNTER_MPTABLE 1000 +#define IDC_RSCRESPAWNCOUNTER_TITLE 1001 +#define IDC_RSCRESPAWNCOUNTER_TITLEBACKGROUND 1002 +#define IDC_RSCRESPAWNCOUNTER_PLAYERRESPAWNTIME 1003 +#define IDC_RSCRESPAWNCOUNTER_DESCRIPTION 1100 + +//--- RscFiringDrillTime +#define IDC_RSCFIRINGDRILLTIME_CURRENTBACKGROUND 1100 +#define IDC_RSCFIRINGDRILLTIME_BEST 1101 +#define IDC_RSCFIRINGDRILLTIME_PREVIOUS 1102 +#define IDC_RSCFIRINGDRILLTIME_BONUS 1103 +#define IDC_RSCFIRINGDRILLTIME_CURRENT 1104 +#define IDC_RSCFIRINGDRILLTIME_PENALTY 1105 +#define IDC_RSCFIRINGDRILLTIME_TIME 2300 + +//--- RscFiringDrillCheckpoint +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTBACKGROUND 1000 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETBACKGROUND 1001 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEBACKGROUND 1002 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONBACKGROUND 1003 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTTEXT 1004 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTTOTAL 1005 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTCURRENT 1006 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTPICTURE 1200 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEPICTURE 1201 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONPICTURE 1202 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETPICTURE 1203 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINT 2300 + +//--- RscAdvancedHint +#define IDC_RSCADVANCEDHINT_TITLE 11657 +#define IDC_RSCADVANCEDHINT_HINT 11757 +#define IDC_RSCADVANCEDHINT_HINTGROUP 12957 + +//--- RscSectorCapture +#define IDC_RSCSECTORCAPTURE_WEST 1001 +#define IDC_RSCSECTORCAPTURE_EAST 1002 +#define IDC_RSCSECTORCAPTURE_GUER 1003 +#define IDC_RSCSECTORCAPTURE_CIV 1004 +#define IDC_RSCSECTORCAPTURE_NAME 1005 +#define IDC_RSCSECTORCAPTURE_BACKGROUND 1200 +#define IDC_RSCSECTORCAPTURE_SECTORCAPTURE 2300 + +//--- RscMissionStatus +#define IDC_RSCMISSIONSTATUS_BARBRIDGE 13983 +#define IDC_RSCMISSIONSTATUS_BARWEST 13984 +#define IDC_RSCMISSIONSTATUS_BAREAST 13985 +#define IDC_RSCMISSIONSTATUS_BARGUER 13986 +#define IDC_RSCMISSIONSTATUS_BARCIV 13987 +#define IDC_RSCMISSIONSTATUS_BARUNKNOWN 13988 +#define IDC_RSCMISSIONSTATUS_SLOT1BACKGROUND 13989 +#define IDC_RSCMISSIONSTATUS_SLOT1PROGRESS 13990 +#define IDC_RSCMISSIONSTATUS_SLOT2BACKGROUND 13991 +#define IDC_RSCMISSIONSTATUS_SLOT2PROGRESS 13992 +#define IDC_RSCMISSIONSTATUS_SLOT3BACKGROUND 13993 +#define IDC_RSCMISSIONSTATUS_SLOT3PROGRESS 13994 +#define IDC_RSCMISSIONSTATUS_SLOT4BACKGROUND 13995 +#define IDC_RSCMISSIONSTATUS_SLOT4PROGRESS 13996 +#define IDC_RSCMISSIONSTATUS_SLOT5BACKGROUND 13997 +#define IDC_RSCMISSIONSTATUS_SLOT5PROGRESS 13998 +#define IDC_RSCMISSIONSTATUS_SLOT6BACKGROUND 13999 +#define IDC_RSCMISSIONSTATUS_SLOT6PROGRESS 14000 +#define IDC_RSCMISSIONSTATUS_SLOT7BACKGROUND 14001 +#define IDC_RSCMISSIONSTATUS_SLOT7PROGRESS 14002 +#define IDC_RSCMISSIONSTATUS_SLOT8BACKGROUND 14003 +#define IDC_RSCMISSIONSTATUS_SLOT8PROGRESS 14004 +#define IDC_RSCMISSIONSTATUS_SLOT9BACKGROUND 14005 +#define IDC_RSCMISSIONSTATUS_SLOT9PROGRESS 14006 +#define IDC_RSCMISSIONSTATUS_SLOT0BACKGROUND 14007 +#define IDC_RSCMISSIONSTATUS_SLOT0PROGRESS 14008 +#define IDC_RSCMISSIONSTATUS_SLOT1TEXT 14093 +#define IDC_RSCMISSIONSTATUS_SLOT2TEXT 14094 +#define IDC_RSCMISSIONSTATUS_SLOT3TEXT 14095 +#define IDC_RSCMISSIONSTATUS_SLOT4TEXT 14096 +#define IDC_RSCMISSIONSTATUS_SLOT5TEXT 14097 +#define IDC_RSCMISSIONSTATUS_SLOT6TEXT 14098 +#define IDC_RSCMISSIONSTATUS_SLOT7TEXT 14099 +#define IDC_RSCMISSIONSTATUS_SLOT8TEXT 14100 +#define IDC_RSCMISSIONSTATUS_SLOT9TEXT 14101 +#define IDC_RSCMISSIONSTATUS_SLOT0TEXT 14102 +#define IDC_RSCMISSIONSTATUS_SLOT1 14183 +#define IDC_RSCMISSIONSTATUS_SLOT2 14184 +#define IDC_RSCMISSIONSTATUS_SLOT3 14185 +#define IDC_RSCMISSIONSTATUS_SLOT4 14186 +#define IDC_RSCMISSIONSTATUS_SLOT5 14187 +#define IDC_RSCMISSIONSTATUS_SLOT6 14188 +#define IDC_RSCMISSIONSTATUS_SLOT7 14189 +#define IDC_RSCMISSIONSTATUS_SLOT8 14190 +#define IDC_RSCMISSIONSTATUS_SLOT9 14191 +#define IDC_RSCMISSIONSTATUS_SLOT0 14192 +#define IDC_RSCMISSIONSTATUS_RSCMISSIONSTATUS 15283 + +//--- RscFeedback +#define IDC_RSCFEEDBACK_RSCFEEDBACK 6455 + +//--- RscDisplayCommunityGuide +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_TITLE 29956 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_PLAYERSNAME 29957 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BRIEFINGNAME 29958 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_AUTHOR 29959 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWTEXT 30056 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWPICTURE 30156 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_GUIDELIST 30456 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWCONTROLSGROUP 31256 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONPLAY 31556 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONCANCEL 31656 + +//--- RscDisplayArsenal +#define IDC_RSCDISPLAYARSENAL_MOUSEAREA 899 +#define IDC_RSCDISPLAYARSENAL_MOUSEBLOCK 898 +#define IDC_RSCDISPLAYARSENAL_TABS 1800 +#define IDC_RSCDISPLAYARSENAL_FRAMELEFT 1801 +#define IDC_RSCDISPLAYARSENAL_FRAMERIGHT 1802 +#define IDC_RSCDISPLAYARSENAL_LINEICON 1803 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFT 1804 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFTSELECTED 1805 +#define IDC_RSCDISPLAYARSENAL_LINETABRIGHT 1806 +#define IDC_RSCDISPLAYARSENAL_ICON 900 +#define IDC_RSCDISPLAYARSENAL_ICONBACKGROUND 830 +#define IDC_RSCDISPLAYARSENAL_TAB 930 +#define IDC_RSCDISPLAYARSENAL_LIST 960 +#define IDC_RSCDISPLAYARSENAL_SORT 800 +#define IDC_RSCDISPLAYARSENAL_LISTDISABLED 860 +#define IDC_RSCDISPLAYARSENAL_LOAD 990 +#define IDC_RSCDISPLAYARSENAL_LOADCARGO 991 +#define IDC_RSCDISPLAYARSENAL_ARROWLEFT 992 +#define IDC_RSCDISPLAYARSENAL_ARROWRIGHT 993 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDLEFT 994 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDRIGHT 995 +#define IDC_RSCDISPLAYARSENAL_MESSAGE 996 + +#define IDC_RSCDISPLAYARSENAL_TAB_PRIMARYWEAPON 0 +#define IDC_RSCDISPLAYARSENAL_TAB_SECONDARYWEAPON 1 +#define IDC_RSCDISPLAYARSENAL_TAB_HANDGUN 2 +#define IDC_RSCDISPLAYARSENAL_TAB_UNIFORM 3 +#define IDC_RSCDISPLAYARSENAL_TAB_VEST 4 +#define IDC_RSCDISPLAYARSENAL_TAB_BACKPACK 5 +#define IDC_RSCDISPLAYARSENAL_TAB_HEADGEAR 6 +#define IDC_RSCDISPLAYARSENAL_TAB_GOGGLES 7 +#define IDC_RSCDISPLAYARSENAL_TAB_NVGS 8 +#define IDC_RSCDISPLAYARSENAL_TAB_BINOCULARS 9 +#define IDC_RSCDISPLAYARSENAL_TAB_MAP 10 +#define IDC_RSCDISPLAYARSENAL_TAB_GPS 11 +#define IDC_RSCDISPLAYARSENAL_TAB_RADIO 12 +#define IDC_RSCDISPLAYARSENAL_TAB_COMPASS 13 +#define IDC_RSCDISPLAYARSENAL_TAB_WATCH 14 +#define IDC_RSCDISPLAYARSENAL_TAB_FACE 15 +#define IDC_RSCDISPLAYARSENAL_TAB_VOICE 16 +#define IDC_RSCDISPLAYARSENAL_TAB_INSIGNIA 17 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMOPTIC 18 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMACC 19 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMMUZZLE 20 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMBIPOD 25 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAG 21 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOTHROW 22 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOPUT 23 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMISC 24 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAGALL 26 + +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONBACKGROUND 29489 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONTEXT 29589 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPON 30789 + +#define IDC_RSCDISPLAYARSENAL_INFO_INFOBACKGROUND 24515 +#define IDC_RSCDISPLAYARSENAL_INFO_INFONAME 24516 +#define IDC_RSCDISPLAYARSENAL_INFO_INFOAUTHOR 24517 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCBACKGROUND 24518 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCICON 24715 +#define IDC_RSCDISPLAYARSENAL_INFO_INFO 25815 + +#define IDC_RSCDISPLAYARSENAL_STATS_STATSBACKGROUND 27347 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT1 27348 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT2 27349 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT3 27350 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT4 27351 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT5 27352 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT1 27353 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT2 27354 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT3 27355 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT4 27356 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT5 27357 +#define IDC_RSCDISPLAYARSENAL_STATS_STATS 28644 + +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_CONTROLBAR 44046 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONSAVE 44146 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONLOAD 44147 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONEXPORT 44148 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONIMPORT 44149 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONRANDOM 44150 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONINTERFACE 44151 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONOK 44346 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONTRY 44347 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONCLOSE 44448 + +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TITLE 34619 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN1 34620 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEXTNAME 34621 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_MAINBACKGROUND 34622 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN2 34623 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN3 34624 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN4 34625 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN5 34626 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_EDITNAME 35020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_VALUENAME 35119 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEMPLATE 35919 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONOK 36019 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONCANCEL 36020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONDELETE 36021 + +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENALBACKGROUND 26603 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGEBACKGROUND 26604 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENAL 26803 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGE 26804 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACE 27903 + +//--- RscDisplayGarage +#define IDC_RSCDISPLAYGARAGE_TAB_CAR 0 +#define IDC_RSCDISPLAYGARAGE_TAB_ARMOR 1 +#define IDC_RSCDISPLAYGARAGE_TAB_HELI 2 +#define IDC_RSCDISPLAYGARAGE_TAB_PLANE 3 +#define IDC_RSCDISPLAYGARAGE_TAB_NAVAL 4 +#define IDC_RSCDISPLAYGARAGE_TAB_STATIC 5 + +#define IDC_RSCDISPLAYGARAGE_TAB_SUBCREW 18 //--- Match he numbers with Arsenal right panel IDCs +#define IDC_RSCDISPLAYGARAGE_TAB_SUBANIMATION 19 +#define IDC_RSCDISPLAYGARAGE_TAB_SUBTEXTURE 20 + +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBANIMATION 0 +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBTEXTURE 1 + +//--- RscDisplayCreateJIRAIssue +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BACKGROUND 29997 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATHTITLE 29998 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_TITLE 30097 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMISSION 30098 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMAP 30099 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONOBJECT 30100 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONEMPTY 30101 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATH 30397 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONCANCEL 31697 + +//--- RscDisplayDLCContentBrowser - main display +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLEBACKGROUND 37179 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MAINBACKGROUND 37180 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLE 37099 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_PLAYERSNAME 37100 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONCANCEL 38799 //MUF - todo - was exported, but not added to config +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_LISTGROUP 38400 +//--- RscDisplayDLCContentBrowser - General +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWBACKGROUND 37101 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWTEXT 37102 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TABSBACKGROUND 37106 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWDLCNAME 37137 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWPICTURE 37299 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_GENERALGROUP 38399 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONASSETS 38499 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONSINGLEPLAYER 38500 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONMULTIPLAYER 38501 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONFEATURES 38502 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONPURCHASE 38503 +//--- RscDisplayDLCContentBrowser - item template +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUND 37129 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUNDBLACK 37130 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMNAME 37131 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTSESSIONTIME 37132 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMSESSIONTIME 37133 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTTOTALTIME 37134 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTOTALTIME 37135 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMDESCRIPTION 37136 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPICTURE 37300 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPREMIUMICON 37311 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEMPLATE 38401 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONTRY 38504 +//--- RscDisplayDLCContentBrowser - dlc selection group +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSPURCHASED 37103 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIPURCHASED 37104 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENPURCHASED 37105 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSBACKGROUND 37108 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSNAME 37109 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIBACKGROUND 37110 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELINAME 37111 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENBACKGROUND 37112 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENNAME 37113 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEBACKGROUND 37114 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLENAME 37115 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSLOGO 37301 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELILOGO 37302 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENLOGO 37303 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLELOGO 37304 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSOVERLAY 37305 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIOVERLAY 37306 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENOVERLAY 37307 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEOVERLAY 37308 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCSELECTIONGROUP 38402 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXBACKGROUND 37116 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXNAME 37117 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXPURCHASED 37118 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXLOGO 37309 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXOVERLAY 37310 + + +//--- GroundSupport_ProcedureVisualization +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_PROGRESS 68374 +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_TEXT 68375 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 24691 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 24693 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 24694 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 24695 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 24891 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 24892 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 24893 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 24894 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 24895 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 24896 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 25991 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE3D 26091 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 26291 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 26391 + +//--- RscDisplayPurchaseNotification +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TITLE 46662 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TEXT 46663 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_DLCLIST 46762 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNPICTURE 46862 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNCONTROLSGROUP 47962 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_BUTTONOK 48262 + +//--- RscDiary +#define IDC_TASKTOOLTIP 47060 +#define IDC_TASKTOOLTIP_BACKGROUND 47061 +#define IDC_TASKTOOLTIP_TITLE 47062 +#define IDC_TASKTOOLTIP_SUBTITLE 47063 +#define IDC_TASKTOOLTIP_BUTTON 47064 +#define IDC_TASKTOOLTIP_ASSIGNEDICON 47065 +#define IDC_TASKTOOLTIP_ASSIGNEDCOUNTER 47066 + +//--- RscRespawnControlsGroup +#define IDC_RSCRESPAWNCONTROLS_RESPAWNCONTROLSGROUP 88800 +#define IDC_RSCRESPAWNCONTROLS_LOCBACKGROUND 88802 +#define IDC_RSCRESPAWNCONTROLS_ROLEBACKGROUND 88803 +#define IDC_RSCRESPAWNCONTROLS_GEARBACKGROUND 88804 +#define IDC_RSCRESPAWNCONTROLS_HEADERBACKGROUND 88801 +#define IDC_RSCRESPAWNCONTROLS_BUTTONSPECTATE 88811 +#define IDC_RSCRESPAWNCONTROLS_LOCLIST 88808 +#define IDC_RSCRESPAWNCONTROLS_ROLELIST 88809 +#define IDC_RSCRESPAWNCONTROLS_COUNTERTEXT 88826 +#define IDC_RSCRESPAWNCONTROLS_COUNTER 88806 +#define IDC_RSCRESPAWNCONTROLS_AUTORESPAWN 88830 +#define IDC_RSCRESPAWNCONTROLS_TEAMTEXT 88827 +#define IDC_RSCRESPAWNCONTROLS_TEAM 88805 +#define IDC_RSCRESPAWNCONTROLS_TICKETSTEXT 88828 +#define IDC_RSCRESPAWNCONTROLS_TICKETS 88807 +#define IDC_RSCRESPAWNCONTROLS_HEADERRESPAWNBUTTON 88829 +#define IDC_RSCRESPAWNCONTROLS_WARNING 88831 +#define IDC_RSCRESPAWNCONTROLS_COMBOLOADOUT 88813 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILS 88814 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDPRIMARYWEAPON 88822 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDSECONDARYWEAPON 88823 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDOPTICS 88824 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDITEM 88825 +#define IDC_RSCRESPAWNCONTROLS_PICTUREPRIMARYWEAPON 88815 +#define IDC_RSCRESPAWNCONTROLS_PICTURESECONDARYWEAPON 88816 +#define IDC_RSCRESPAWNCONTROLS_PICTUREOPTICS 88817 +#define IDC_RSCRESPAWNCONTROLS_PICTUREITEM 88818 +#define IDC_RSCRESPAWNCONTROLS_LOCTITLE 88819 +#define IDC_RSCRESPAWNCONTROLS_ROLETITLE 88820 +#define IDC_RSCRESPAWNCONTROLS_GEARTITLE 88821 +#define IDC_RSCRESPAWNCONTROLS_LOCDISABLED 88832 +#define IDC_RSCRESPAWNCONTROLS_ROLEDISABLED 88833 +#define IDC_RSCRESPAWNCONTROLS_LOADOUTDISABLED 88834 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSCONTROLSGROUP 88850 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDDETAILS 88851 +#define IDC_RSCRESPAWNCONTROLS_DETAILSTITLE 88852 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILSCLOSE 88853 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSLISTCONTROLSGROUP 88860 +#define IDC_RSCRESPAWNCONTROLS_DETAILSLIST 88861 + +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERBACKGROUND 88870 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERLEFT 88871 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERRIGHT 88872 + +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO 88874 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_TITLE 88875 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_OPTION 88876 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO 88877 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_TITLE 88878 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_OPTION 88879 + +//--- RscRevive +#define IDC_RSCREVIVE_REVIVEPROGRESSBACKGROUND 4817 +#define IDC_RSCREVIVE_REVIVEPROGRESS 4818 +#define IDC_RSCREVIVE_REVIVEKEYPROGRESS 4819 +#define IDC_RSCREVIVE_REVIVEBAR 4820 +#define IDC_RSCREVIVE_REVIVETEXT 4917 +#define IDC_RSCREVIVE_REVIVECOUNTDOWN 4918 +#define IDC_RSCREVIVE_REVIVEINFO 4919 +#define IDC_RSCREVIVE_REVIVEKEYBACKGROUND 4920 +#define IDC_RSCREVIVE_REVIVEKEY 4921 +#define IDC_RSCREVIVE_REVIVEMEDIKIT 5017 +#define IDC_RSCREVIVE_REVIVEMEDIKITPROGRESS 5018 +#define IDC_RSCREVIVE_REVIVEDEATH 5019 +#define IDC_RSCREVIVE_REVIVERESPAWN 6117 +#define IDC_RSCREVIVE_REVIVETEXT2 6118 + +//--- DynamicGroups +#define IDC_DYNAMICGROUPS_HEADER 9377 +#define IDC_DYNAMICGROUPS_BACKGROUNDMANAGE 9379 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAME 9380 +#define IDC_DYNAMICGROUPS_BACKGROUNDGROUPNAME 9381 +#define IDC_DYNAMICGROUPS_BACKGROUNDPLAYERS 9382 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDE 9383 +#define IDC_DYNAMICGROUPS_TEXTPLAYERCOUNT 9384 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCORE 9386 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAMEFILL 9387 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDEFILL 9388 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCOREFILL 9389 +#define IDC_DYNAMICGROUPS_TEXTPRIVATE 9390 +#define IDC_DYNAMICGROUPS_GROUPICON 9577 +#define IDC_DYNAMICGROUPS_PICTURESIDE 9578 +#define IDC_DYNAMICGROUPS_EDITGROUPNAME 9777 +#define IDC_DYNAMICGROUPS_LISTBOXGROUPS 9877 +#define IDC_DYNAMICGROUPS_LISTBOXMANAGE 9878 +#define IDC_DYNAMICGROUPS_LISTBOXPLAYERS 9880 +#define IDC_DYNAMICGROUPS_BUTTONJOIN 9977 +#define IDC_DYNAMICGROUPS_BUTTONCREATELEAVEKICK 9978 +#define IDC_DYNAMICGROUPS_BUTTONPROMOTEDISBAND 9979 +#define IDC_DYNAMICGROUPS_BUTTONINVITE 9980 +#define IDC_DYNAMICGROUPS_TABBUTTONGROUPS 9981 +#define IDC_DYNAMICGROUPS_TABBUTTONPLAYERS 9983 +#define IDC_DYNAMICGROUPS_SECTIONMANAGE 10677 +#define IDC_DYNAMICGROUPS_SECTIONGROUPS 10679 +#define IDC_DYNAMICGROUPS_CHECKBOXPRIVATE 11177 + +//--- RscHvtPhase +#define IDC_RSCHVTPHASE_PERSISTENT 6610 +#define IDC_RSCHVTPHASE_DYNAMIC 6611 +#define IDC_RSCHVTPHASE_DOWNLOADTITLE 6612 +#define IDC_RSCHVTPHASE_DOWNLOADCONTENT 6613 +#define IDC_RSCHVTPHASE_MULTIPLIER 6614 +#define IDC_RSCHVTPHASE_RANGEBACKGROUND 6615 +#define IDC_RSCHVTPHASE_TIMER 6616 +#define IDC_RSCHVTPHASE_PROGRESSBAR 6620 +#define IDC_RSCHVTPHASE_DOWNLOADSPEED 6621 +#define IDC_RSCHVTPHASE_RANGE 6810 +#define IDC_RSCHVTPHASE_CARRIERPICTURE 6811 +#define IDC_RSCHVTPHASE_DOWNLOAD 7910 + +//--- RscPhaseRules +#define IDC_RSCPHASERULES_PHASE1NUMBER 9131 +#define IDC_RSCPHASERULES_PHASE1TEXT 9132 +#define IDC_RSCPHASERULES_PHASE2TEXT 9133 +#define IDC_RSCPHASERULES_PHASE2NUMBER 9134 +#define IDC_RSCPHASERULES_PHASE3TEXT 9135 +#define IDC_RSCPHASERULES_PHASE3NUMBER 9136 +#define IDC_RSCPHASERULES_PHASE1INFO 9137 +#define IDC_RSCPHASERULES_PHASE2INFO 9138 +#define IDC_RSCPHASERULES_PHASE3INFO 9139 +#define IDC_RSCPHASERULES_PHASERULES 10431 + +//--- RscDisplayEGSpectator +#define IDD_RSCDISPLAYEGSPECTATOR 60492 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMETIMETEXT 42609 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMEPHASETEXT 48610 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBBACKGROUND 42611 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEATASK 42612 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEABACKGROUND 42613 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBTASK 42614 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLORBACKGROUND 42615 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLORBACKGROUND 42616 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLOR 42617 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLOR 42618 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEAPROGRESSGROUP 48909 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBPROGRESSGROUP 43910 +#define IDC_RSCDISPLAYEGSPECTATOR_MOUSEHANDLER 42989 +#define IDC_RSCDISPLAYEGSPECTATOR_TABS 43609 +#define IDC_RSCDISPLAYEGSPECTATOR_LIST 43109 +#define IDC_RSCDISPLAYEGSPECTATOR_LISTGROUP 43909 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESBACKGROUND 52610 +#define IDC_RSCDISPLAYEGSPECTATOR_FREE 52809 +#define IDC_RSCDISPLAYEGSPECTATOR_FOLLOW 52810 +#define IDC_RSCDISPLAYEGSPECTATOR_FPS 52811 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESGROUP 52909 +#define IDC_RSCDISPLAYEGSPECTATOR_MAP 62609 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPHEADER 62610 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPFOOTER 62611 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPTITLE 62612 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSCOUNT 62613 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSICON 62809 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPGROUP 63909 +#define IDC_RSCDISPLAYEGSPECTATOR_HELPBACKGROUND 72812 +#define IDC_RSCDISPLAYEGSPECTATOR_HELP 73189 +#define IDC_RSCDISPLAYEGSPECTATOR_UPPERBACKGROUND 82609 +#define IDC_RSCDISPLAYEGSPECTATOR_NAME 82610 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERLEFTBACKGROUND 82611 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERRIGHTBACKGROUND 82612 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATARBACKGROUND 82613 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS_COUNT 82614 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS_COUNT 82615 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS_COUNT 82616 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS_COUNT 82617 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS_COUNT 82618 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL_COUNT 82619 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATAR 82809 +#define IDC_RSCDISPLAYEGSPECTATOR_UNITTYPE 82810 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS 82811 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS 82812 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS 82813 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS 82814 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS 82815 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL 82816 +#define IDC_RSCDISPLAYEGSPECTATOR_WEAPONPICTURE 82817 +#define IDC_RSCDISPLAYEGSPECTATOR_VEHICLETYPE 82818 +#define IDC_RSCDISPLAYEGSPECTATOR_FOCUSINFO 83909 + +//--- RscEGProgress +#define IDC_RSCEGPROGRESS_DOWNLOADICONBACKGROUND 9170 +#define IDC_RSCEGPROGRESS_OBJECTIVELETTER 9171 +#define IDC_RSCEGPROGRESS_ACTIVITYBACKGROUND 9172 +#define IDC_RSCEGPROGRESS_PROGRESSBARBACKGROUND 9173 +#define IDC_RSCEGPROGRESS_TITLE 9174 +#define IDC_RSCEGPROGRESS_PROGRESSBAR 9180 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUND 9370 +#define IDC_RSCEGPROGRESS_ACTIVITY 9372 +#define IDC_RSCEGPROGRESS_DOWNLOADICON 9374 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUNDCOLOURED 9375 +#define IDC_RSCEGPROGRESS_DOWNLOAD 9376 + +//--- RscDisplayQuickPlay +#define IDC_RSCDISPLAYQUICKPLAY_TITLE 18702 +#define IDC_RSCDISPLAYQUICKPLAY_PLAYERSNAME 18703 +#define IDC_RSCDISPLAYQUICKPLAY_MODTEXT 18704 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENTBACKGROUND 18705 +#define IDC_RSCDISPLAYQUICKPLAY_MAXPINGTEXT 18706 +#define IDC_RSCDISPLAYQUICKPLAY_BESTMATCHTEXT 18707 +#define IDC_RSCDISPLAYQUICKPLAY_MODBACKGROUND 18708 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTION 18713 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLEBACKGROUND 18714 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLE 18715 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEOVERVIEW 18903 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTIONBACKGROUND 18904 +#define IDC_RSCDISPLAYQUICKPLAY_MODICON 18905 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENT 20002 +#define IDC_RSCDISPLAYQUICKPLAY_BUTTONBACK 20402 + +//--- RscDisplayCampaignLobby (Scripted campaign lobby) +#define IDD_CAMPAIGN_LOBBY 50000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_FULL_GROUP 51000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_GROUP 51100 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_LOADING_GROUP 51200 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_BORDER_GROUP 51300 +#define IDC_CAMPAIGN_LOBBY_TABLET_GROUP 52000 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_GROUP 52100 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SEARCH_GROUP 52200 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SETTINGS_GROUP 52300 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_RESPAWN_GROUP 52400 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_REVIVE_GROUP 52500 +#define IDC_CAMPAIGN_LOBBY_TABLET_MILITARY_GROUP 52600 +#define IDC_CAMPAIGN_LOBBY_MAIN_GROUP 53000 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_GROUP 53100 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_HEADER_GROUP 53200 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_STRUCTURE_GROUP 53300 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_CORE_GROUP 53400 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_GROUP 53500 +#define IDC_CAMPAIGN_LOBBY_LOGIN_GROUP 54100 +#define IDC_CAMPAIGN_LOBBY_ACCESS_KEY_GROUP 54200 +#define IDC_CAMPAIGN_LOBBY_MISSION_GROUP 54300 +#define IDC_CAMPAIGN_LOBBY_MISSION_VIDEO_GROUP 54400 +#define IDC_CAMPAIGN_LOBBY_MISSION_INTEL_GROUP 54500 +#define IDC_CAMPAIGN_LOBBY_MISSION_OVERLAY_GROUP 54600 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_CORE_GROUP 55000 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_GROUP 55100 +#define IDC_CAMPAIGN_LOBBY_PROGRESS_GROUP 56000 +#define IDC_CAMPAIGN_LOBBY_OVERLAY_GROUP 57000 + +// RscDisplayDLCContentBrowser +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTUREBACKGROUND 2000 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTURE 2001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEOGROUP 2002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEO 2003 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_ICON 2004 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEL 2005 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINER 2006 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINET 2007 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEB 2008 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_BUTTON 2009 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_TITLE 2010 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_HOVER 2011 + +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MOUSEAREA 999 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCGROUP 1001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCBACKGROUND 1002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONBACKGROUND 1003 + +//--- RscDisplayDLCPreview_List +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUND 31263 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOTITLE 31264 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUNDBOTTOM 31266 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFO 31363 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOSTATS 31364 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIM 31463 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURE 31464 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSEPREV 31465 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSENEXT 31466 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAY 31467 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAY 31468 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAYICON 31469 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAYICON 31470 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREBACKGROUND 31471 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMBACKGROUND 31472 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREGROUP 32563 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURELISTGROUP 32564 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOGROUP 32565 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONTRY 32663 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONPURCHASE 32664 + +//--- RscDisplayDLCPreview_ListItem +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SELECT 41883 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_HOVER 41884 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_PICTURE 42083 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SESSIONNOTIFICATION 42084 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BACKGROUND 42085 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BUTTON 42483 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_RSCDISPLAYDLCPREVIEW_LISTITEM 43183 + +//--- RscDisplayDLCPreview +#define IDC_RSCDISPLAYDLCPREVIEW_BACKGROUND 1001 +#define IDC_RSCDISPLAYDLCPREVIEW_LOGO 1002 +#define IDC_RSCDISPLAYDLCPREVIEW_OVERVIEW 1003 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWGROUP 1004 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWBACKGROUND 1005 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONBACKGROUND 1006 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONPURCHASE 1007 +#define IDC_RSCDISPLAYDLCPREVIEW_AUTHOR 1008 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTGROUP 1009 +#define IDC_RSCDISPLAYDLCPREVIEW_BOHEMIA 1010 + +//--- RscDisplayTimeline +#define IDD_RSCDISPLAYTIMELINE 15000 + +//--- RscDisplayTimeline +#define IDC_RSCDISPLAYTIMELINE_BACKGROUND 16985 +#define IDC_RSCDISPLAYTIMELINE_TEXTTIME 17085 +#define IDC_RSCDISPLAYTIMELINE_TEXTPLAYRATE 17086 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYFORWARD 17585 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYBACKWARD 17586 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPAUSE 17587 +#define IDC_RSCDISPLAYTIMELINE_BUTTONDECREASEPLAYRATE 17588 +#define IDC_RSCDISPLAYTIMELINE_BUTTONINCREASEPLAYRATE 17589 +#define IDC_RSCDISPLAYTIMELINE_LIST 18085 +#define IDC_RSCDISPLAYTIMELINE_TIMELINECONTROLS 18285 diff --git a/arma/server/include/x/cba/addons/main/script_macros_common.hpp b/arma/server/include/x/cba/addons/main/script_macros_common.hpp new file mode 100644 index 0000000..be13021 --- /dev/null +++ b/arma/server/include/x/cba/addons/main/script_macros_common.hpp @@ -0,0 +1,1833 @@ +/* + Header: script_macros_common.hpp + + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + + Authors: + Sickboy and Spooner +*/ + +/* **************************************************** + New - Should be exported to general addon + Aim: + - Simplify (shorten) the amount of characters required for repetitive tasks + - Provide a solid structure that can be dynamic and easy editable (Which sometimes means we cannot adhere to Aim #1 ;-) + An example is the path that is built from defines. Some available in this file, others in mods and addons. + + Follows Standard: + Object variables: PREFIX_COMPONENT + Main-object variables: PREFIX_main + Paths: MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SCRIPTNAME.sqf + e.g: x\six\addons\sys_menu\fDate.sqf + + Usage: + define PREFIX and COMPONENT, then include this file + (Note, you could have a main addon for your mod, define the PREFIX in a macros.hpp, + and include this script_macros_common.hpp file. + Then in your addons, add a component.hpp, define the COMPONENT, + and include your mod's script_macros.hpp + In your scripts you can then include the addon's component.hpp with relative path) + + TODO: + - Try only to use 1 string type " vs ' + - Evaluate double functions, and simplification + - Evaluate naming scheme; current = prototype + - Evaluate "Debug" features.. + - Evaluate "create mini function per precompiled script, that will load the script on first usage, rather than on init" + - Also saw "Namespace" typeName, evaluate which we need :P + - Single/Multi player gamelogics? (Incase of MP, you would want only 1 gamelogic per component, which is pv'ed from server, etc) + */ + +#ifndef MAINPREFIX + #define MAINPREFIX x +#endif + +#ifndef SUBPREFIX + #define SUBPREFIX addons +#endif + +#ifndef MAINLOGIC + #define MAINLOGIC main +#endif + +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ +#ifndef VERSION + #define VERSION 0 +#endif + +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + +#ifndef VERSION_AR + #define VERSION_AR VERSION +#endif + +#ifndef VERSION_CONFIG + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} +#endif + +/* ------------------------------------------- +Group: Debugging +------------------------------------------- */ + +/* ------------------------------------------- +Macros: DEBUG_MODE_x + Managing debugging based on debug level. + + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. + +Examples: + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) + + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) + + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) + +Author: + Spooner +------------------------------------------- */ + +// If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. +#ifdef DEBUG_MODE_FULL +#define DEBUG_MODE_NORMAL +#endif + +// If DEBUG_MODE_NORMAL, then also enable DEBUG_MODE_MINIMAL. +#ifdef DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +// If no debug modes specified, use DEBUG_MODE_NORMAL (+ DEBUG_MODE_MINIMAL). +#ifndef DEBUG_MODE_MINIMAL +#define DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +#define LOG_SYS_FORMAT(LEVEL,MESSAGE) format ['[%1] (%2) %3: %4', toUpper 'PREFIX', 'COMPONENT', LEVEL, MESSAGE] + +#ifdef DEBUG_SYNCHRONOUS +#define LOG_SYS(LEVEL,MESSAGE) diag_log text LOG_SYS_FORMAT(LEVEL,MESSAGE) +#else +#define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log +#endif + +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) + +/* ------------------------------------------- +Macro: LOG() + Log a debug message into the RPT log. + + Only run if is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_FULL + +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) +#define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) +#define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) LOG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) LOG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) LOG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) LOG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) LOG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define LOG(MESSAGE) /* disabled */ +#define LOG_1(MESSAGE,ARG1) /* disabled */ +#define LOG_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: INFO() + Record a message without file and line number in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + INFO("Mod X is loaded, do Y"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define INFO(MESSAGE) LOG_SYS('INFO',MESSAGE) +#define INFO_1(MESSAGE,ARG1) INFO(FORMAT_1(MESSAGE,ARG1)) +#define INFO_2(MESSAGE,ARG1,ARG2) INFO(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define INFO_3(MESSAGE,ARG1,ARG2,ARG3) INFO(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define INFO_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) INFO(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define INFO_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) INFO(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define INFO_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) INFO(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define INFO_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) INFO(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define INFO_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) INFO(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: WARNING() + Record a non-critical error in the RPT log. + + Only run if or higher is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_NORMAL + +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) +#define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) +#define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) WARNING(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) WARNING(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) WARNING(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) WARNING(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) WARNING(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define WARNING(MESSAGE) /* disabled */ +#define WARNING_1(MESSAGE,ARG1) /* disabled */ +#define WARNING_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: ERROR() + Record a critical error in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR("value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) +#define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_WITH_TITLE() + Record a critical error in the RPT log. + + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + TITLE - Title of error message + MESSAGE - Body of error message + +Example: + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line in the RPT log. + +Parameters: + TITLE - Title of log message + MESSAGE - Body of message + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) LOG_SYS_FILELINENUMBERS(TITLE,MESSAGE) + +/* ------------------------------------------- +Macro: RETDEF() + If a variable is undefined, return the default value. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + DEFAULT_VALUE - the default value to use if variable is undefined + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=5" + _var = 7; + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=7" + (end example) +Author: + 654wak654 +------------------------------------------- */ +#define RETDEF(VARIABLE,DEFAULT_VALUE) (if (isNil {VARIABLE}) then [{DEFAULT_VALUE}, {VARIABLE}]) + +/* ------------------------------------------- +Macro: RETNIL() + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var)]; // "_var=any" + (end example) + +Author: + Alef (see CBA issue #8514) +------------------------------------------- */ +#define RETNIL(VARIABLE) RETDEF(VARIABLE,nil) + +/* ------------------------------------------- +Macros: TRACE_n() + Log a message and 1-8 variables to the RPT log. + + Only run if is defined. + + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + +Parameters: + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] + +Example: + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) + +Author: + Spooner +------------------------------------------- */ +#define PFORMAT_1(MESSAGE,A) \ + format ['%1: A=%2', MESSAGE, RETNIL(A)] + +#define PFORMAT_2(MESSAGE,A,B) \ + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + +#define PFORMAT_3(MESSAGE,A,B,C) \ + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + +#define PFORMAT_4(MESSAGE,A,B,C,D) \ + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + +#define PFORMAT_5(MESSAGE,A,B,C,D,E) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + +#define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + +#define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + +#define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + +#define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + + +#ifdef DEBUG_MODE_FULL +#define TRACE_1(MESSAGE,A) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_1(str diag_frameNo + ' ' + (MESSAGE),A)) +#define TRACE_2(MESSAGE,A,B) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_2(str diag_frameNo + ' ' + (MESSAGE),A,B)) +#define TRACE_3(MESSAGE,A,B,C) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_3(str diag_frameNo + ' ' + (MESSAGE),A,B,C)) +#define TRACE_4(MESSAGE,A,B,C,D) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_4(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D)) +#define TRACE_5(MESSAGE,A,B,C,D,E) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_5(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E)) +#define TRACE_6(MESSAGE,A,B,C,D,E,F) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_6(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F)) +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_7(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G)) +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_8(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H)) +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_9(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I)) +#else +#define TRACE_1(MESSAGE,A) /* disabled */ +#define TRACE_2(MESSAGE,A,B) /* disabled */ +#define TRACE_3(MESSAGE,A,B,C) /* disabled */ +#define TRACE_4(MESSAGE,A,B,C,D) /* disabled */ +#define TRACE_5(MESSAGE,A,B,C,D,E) /* disabled */ +#define TRACE_6(MESSAGE,A,B,C,D,E,F) /* disabled */ +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) /* disabled */ +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) /* disabled */ +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) /* disabled */ +#endif + +/* ------------------------------------------- +Group: General +------------------------------------------- */ + +// ************************************* +// Internal Functions +#define DOUBLES(var1,var2) var1##_##var2 +#define TRIPLES(var1,var2,var3) var1##_##var2##_##var3 +#define QUOTE(var1) #var1 + +#ifdef MODULAR + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C +#else + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT +#endif + +/* ------------------------------------------- +Macro: INC() + +Description: + Increase a number by one. + +Parameters: + VAR - Variable to increment [Number] + +Example: + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) + +Author: + Spooner +------------------------------------------- */ +#define INC(var) var = (var) + 1 + +/* ------------------------------------------- +Macro: DEC() + +Description: + Decrease a number by one. + +Parameters: + VAR - Variable to decrement [Number] + +Example: + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEC(var) var = (var) - 1 + +/* ------------------------------------------- +Macro: ADD() + +Description: + Add a value to a variable. Variable and value should be both Numbers or both Strings. + +Parameters: + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] + +Examples: + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ADD(var1,var2) var1 = (var1) + (var2) + +/* ------------------------------------------- +Macro: SUB() + +Description: + Subtract a value from a number variable. VAR and VALUE should both be Numbers. + +Parameters: + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] + +Examples: + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) +------------------------------------------- */ +#define SUB(var1,var2) var1 = (var1) - (var2) + +/* ------------------------------------------- +Macro: REM() + +Description: + Remove an element from an array each time it occurs. + + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. + +Parameters: + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] + +Examples: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) + +Author: + Spooner +------------------------------------------- */ +#define REM(var1,var2) SUB(var1,[var2]) + +/* ------------------------------------------- +Macro: PUSH() + +Description: + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + +Parameters: + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] + +Examples: + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) + +Author: + Spooner +------------------------------------------- */ +#define PUSH(var1,var2) (var1) pushBack (var2) + +/* ------------------------------------------- +Macro: MAP() +Description: + Applies given code to each element of the array, then assigns the + resulting array to the original +Parameters: + ARRAY - Array to be modified + CODE - Code that'll be applied to each element of the array. +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + MAP(_array,_x + 1); + // _array is now [2, 3, 4, 5, 4, 9]; + (end) +Author: + 654wak654 +------------------------------------------- */ +#define MAP(ARR,CODE) ARR = ARR apply {CODE} + +/* ------------------------------------------- +Macro: FILTER() +Description: + Filters an array based on given code, then assigns the resulting array + to the original +Parameters: + ARRAY - Array to be filtered + CODE - Condition to pick elements +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + FILTER(_array,_x % 2 == 0) + // _array is now [2, 4, 8]; + (end) +Author: + Commy2 +------------------------------------------- */ +#define FILTER(ARR,CODE) ARR = ARR select {CODE} + +/* ------------------------------------------- +Macro: UNIQUE() +Description: + Removes duplicate values in given array +Parameters: + ARRAY - The array to be modified +Example: + (begin example) + _someArray = [4, 4, 5, 5, 5, 2]; + UNIQUE(_someArray); + // _someArray is now [4, 5, 2] + (end) +Author: + Commy2 +------------------------------------------- */ +#define UNIQUE(ARR) ARR = ARR arrayIntersect ARR + +/* ------------------------------------------- +Macro: INTERSECTION() +Description: + Finds unique common elements between two arrays and assigns them + to the first array +Parameters: + ARRAY0 - The array to be modified + ARRAY1 - The array to find intersections with +Example: + (begin example) + _someArray = [1, 2, 3, 4, 5, 5]; + _anotherArray = [4, 5, 6, 7]; + INTERSECTION(_someArray,_anotherArray); + // _someArray is now [4, 5] + (end) +Author: + 654wak654 +------------------------------------------- */ +#define INTERSECTION(ARG0,ARG1) ARG0 = ARG0 arrayIntersect (ARG1) + +/* ------------------------------------------- +Macro: ISNILS() + +Description: + Sets a variable with a value, but only if it is undefined. + +Parameters: + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + +Examples: + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { VARIABLE = DEFAULT_VALUE } +#define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) +#define ISNILS3(var1,var2,var3) ISNILS(DOUBLES(var1,var2),var3) +#define ISNIL(var1,var2) ISNILS2(PREFIX,COMPONENT,var1,var2) +#define ISNILMAIN(var1,var2) ISNILS3(PREFIX,var1,var2) + +#define CREATELOGICS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"] +#define CREATELOGICLOCALS(var1,var2) var1##_##var2 = "LOGIC" createVehicleLocal [0, 0, 0] +#define CREATELOGICGLOBALS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"]; publicVariable QUOTE(DOUBLES(var1,var2)) +#define CREATELOGICGLOBALTESTS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit [QUOTE(DOUBLES(ADDON,logic)), [0, 0, 0], [], 0, "NONE"] + +#define GETVARS(var1,var2,var3) (var1##_##var2 getVariable #var3) +#define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) + +#ifndef PATHTO_SYS + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3.sqf +#endif +#ifndef PATHTOF_SYS + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#ifndef PATHTOF2_SYS + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_T(var1) PATHTOF_SYS(PREFIX,COMPONENT_T,var1) +#define PATHTO_M(var1) PATHTOF_SYS(PREFIX,COMPONENT_M,var1) +#define PATHTO_S(var1) PATHTOF_SYS(PREFIX,COMPONENT_S,var1) +#define PATHTO_C(var1) PATHTOF_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_F(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) + +// Already quoted "" +#define QPATHTO_R(var1) QUOTE(PATHTO_R(var1)) +#define QPATHTO_T(var1) QUOTE(PATHTO_T(var1)) +#define QPATHTO_M(var1) QUOTE(PATHTO_M(var1)) +#define QPATHTO_S(var1) QUOTE(PATHTO_S(var1)) +#define QPATHTO_C(var1) QUOTE(PATHTO_C(var1)) +#define QPATHTO_F(var1) QUOTE(PATHTO_F(var1)) + +// This only works for binarized configs after recompiling the pbos +// TODO: Reduce amount of calls / code.. +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 +#define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) + +#define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') +#define COMPILE_FILE_CFG_SYS(var1,var2,var3) COMPILE_FILE2_CFG_SYS('PATHTO_SYS(var1,var2,var3)') + +#define SETVARS(var1,var2) var1##_##var2 setVariable +#define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) +#define GVARMAINS(var1,var2) var1##_##var2 +#define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = + +// Compile-Once, JIT: On first use. +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } + +// Compile-Once, at Macro. As opposed to Compile-Once, on first use. +#define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)) + +#define LSTR(var1) TRIPLES(ADDON,STR,var1) + +#ifndef DEBUG_SETTINGS + #define DEBUG_SETTINGS [false, true, false] +#endif + +#define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) + +// ************************************* +// User Functions +#define CFGSETTINGS CFGSETTINGSS(PREFIX,COMPONENT) +#define PATHTO(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) +#define PATHTOF(var1) PATHTOF_SYS(PREFIX,COMPONENT,var1) +#define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#define QPATHTOF(var1) QUOTE(PATHTOF(var1)) +#define QPATHTOEF(var1,var2) QUOTE(PATHTOEF(var1,var2)) + +#define COMPILE_FILE(var1) COMPILE_FILE_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE_CFG(var1) COMPILE_FILE_CFG_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE2(var1) COMPILE_FILE2_SYS('var1') +#define COMPILE_FILE2_CFG(var1) COMPILE_FILE2_CFG_SYS('var1') + +#define COMPILE_SCRIPT(var1) compileScript ['PATHTO_SYS(PREFIX,COMPONENT_F,var1)'] + + +#define VERSIONING_SYS(var1) class CfgSettings \ +{ \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ +}; + +#define VERSIONING VERSIONING_SYS(PREFIX) + +/* ------------------------------------------- +Macro: GVAR() + Get full variable identifier for a global variable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVAR(var1) DOUBLES(ADDON,var1) +#define EGVAR(var1,var2) TRIPLES(PREFIX,var1,var2) +#define QGVAR(var1) QUOTE(GVAR(var1)) +#define QEGVAR(var1,var2) QUOTE(EGVAR(var1,var2)) +#define QQGVAR(var1) QUOTE(QGVAR(var1)) +#define QQEGVAR(var1,var2) QUOTE(QEGVAR(var1,var2)) + +/* ------------------------------------------- +Macro: GVARMAIN() + Get full variable identifier for a global variable owned by this addon. + +Parameters: + VARIABLE - Partial name of global variable owned by this addon [Any]. + +Example: + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVARMAIN(var1) GVARMAINS(PREFIX,var1) +#define QGVARMAIN(var1) QUOTE(GVARMAIN(var1)) +#define QQGVARMAIN(var1) QUOTE(QGVARMAIN(var1)) +// TODO: What's this? +#define SETTINGS DOUBLES(PREFIX,settings) +#define CREATELOGIC CREATELOGICS(PREFIX,COMPONENT) +#define CREATELOGICGLOBAL CREATELOGICGLOBALS(PREFIX,COMPONENT) +#define CREATELOGICGLOBALTEST CREATELOGICGLOBALTESTS(PREFIX,COMPONENT) +#define CREATELOGICLOCAL CREATELOGICLOCALS(PREFIX,COMPONENT) +#define CREATELOGICMAIN CREATELOGICS(PREFIX,MAINLOGIC) +#define GETVAR(var1) GETVARS(PREFIX,COMPONENT,var1) +#define SETVAR SETVARS(PREFIX,COMPONENT) +#define SETVARMAIN SETVARMAINS(PREFIX) +#define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; + +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ +//#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) + +#ifdef DISABLE_COMPILE_CACHE + #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' + #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' +#else + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW +#endif + +/* ------------------------------------------- +Macro: PATHTO_FNC() + +Description: + Defines a function inside CfgFunctions. + + Full file path in addons: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + // file name: fnc_addPerFrameHandler.sqf + class CfgFunctions { + class CBA { + class Misc { + PATHTO_FNC(addPerFrameHandler); + }; + }; + }; + // -> CBA_fnc_addPerFrameHandler + (end) + +Author: + dixon13, commy2 + ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + +#define PATHTO_FNC(func) class func {\ + file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ + RECOMPILE;\ +} + +#define FUNC(var1) TRIPLES(ADDON,fnc,var1) +#define FUNCMAIN(var1) TRIPLES(PREFIX,fnc,var1) +#define FUNC_INNER(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) +#define EFUNC(var1,var2) FUNC_INNER(var1,var2) +#define QFUNC(var1) QUOTE(FUNC(var1)) +#define QFUNCMAIN(var1) QUOTE(FUNCMAIN(var1)) +#define QFUNC_INNER(var1,var2) QUOTE(FUNC_INNER(var1,var2)) +#define QEFUNC(var1,var2) QUOTE(EFUNC(var1,var2)) +#define QQFUNC(var1) QUOTE(QFUNC(var1)) +#define QQFUNCMAIN(var1) QUOTE(QFUNCMAIN(var1)) +#define QQFUNC_INNER(var1,var2) QUOTE(QFUNC_INNER(var1,var2)) +#define QQEFUNC(var1,var2) QUOTE(QEFUNC(var1,var2)) + +#ifndef PRELOAD_ADDONS + #define PRELOAD_ADDONS class CfgAddons \ +{ \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ +} +#endif + +/* ------------------------------------------- +Macros: ARG_#() + Select from list of array arguments + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Rommel +------------------------------------------- */ +#define ARG_1(A,B) ((A) select (B)) +#define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) +#define ARG_3(A,B,C,D) (ARG_1(ARG_2(A,B,C),D)) +#define ARG_4(A,B,C,D,E) (ARG_1(ARG_3(A,B,C,D),E)) +#define ARG_5(A,B,C,D,E,F) (ARG_1(ARG_4(A,B,C,D,E),F)) +#define ARG_6(A,B,C,D,E,F,G) (ARG_1(ARG_5(A,B,C,D,E,F),G)) +#define ARG_7(A,B,C,D,E,F,G,H) (ARG_1(ARG_6(A,B,C,D,E,E,F,G),H)) +#define ARG_8(A,B,C,D,E,F,G,H,I) (ARG_1(ARG_7(A,B,C,D,E,E,F,G,H),I)) + +/* ------------------------------------------- +Macros: ARR_#() + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Nou +------------------------------------------- */ +#define ARR_1(ARG1) ARG1 +#define ARR_2(ARG1,ARG2) ARG1, ARG2 +#define ARR_3(ARG1,ARG2,ARG3) ARG1, ARG2, ARG3 +#define ARR_4(ARG1,ARG2,ARG3,ARG4) ARG1, ARG2, ARG3, ARG4 +#define ARR_5(ARG1,ARG2,ARG3,ARG4,ARG5) ARG1, ARG2, ARG3, ARG4, ARG5 +#define ARR_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 +#define ARR_7(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 +#define ARR_8(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 + +/* ------------------------------------------- +Macros: FORMAT_#(STR, ARG1) + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + STRING - string used by format + VARIABLE(1-8) - elements for usage in format + +Author: + Nou & Sickboy +------------------------------------------- */ +#define FORMAT_1(STR,ARG1) format[STR, ARG1] +#define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] +#define FORMAT_3(STR,ARG1,ARG2,ARG3) format[STR, ARG1, ARG2, ARG3] +#define FORMAT_4(STR,ARG1,ARG2,ARG3,ARG4) format[STR, ARG1, ARG2, ARG3, ARG4] +#define FORMAT_5(STR,ARG1,ARG2,ARG3,ARG4,ARG5) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5] +#define FORMAT_6(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6] +#define FORMAT_7(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7] +#define FORMAT_8(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8] + +// CONTROL(46) 12 +#define DISPLAY(A) (findDisplay A) +#define CONTROL(A) DISPLAY(A) displayCtrl + +/* ------------------------------------------- +Macros: IS_x() + Checking the data types of variables. + + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. + +Parameters: + VARIABLE - Variable to check if it is of a particular type [Any, not nil] + +Author: + Spooner +------------------------------------------- */ +#define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then {false} else {(VAR) isEqualType TYPE}) +#define IS_ARRAY(VAR) IS_META_SYS(VAR,[]) +#define IS_BOOL(VAR) IS_META_SYS(VAR,false) +#define IS_CODE(VAR) IS_META_SYS(VAR,{}) +#define IS_CONFIG(VAR) IS_META_SYS(VAR,configNull) +#define IS_CONTROL(VAR) IS_META_SYS(VAR,controlNull) +#define IS_DISPLAY(VAR) IS_META_SYS(VAR,displayNull) +#define IS_GROUP(VAR) IS_META_SYS(VAR,grpNull) +#define IS_OBJECT(VAR) IS_META_SYS(VAR,objNull) +#define IS_SCALAR(VAR) IS_META_SYS(VAR,0) +#define IS_SCRIPT(VAR) IS_META_SYS(VAR,scriptNull) +#define IS_SIDE(VAR) IS_META_SYS(VAR,west) +#define IS_STRING(VAR) IS_META_SYS(VAR,"STRING") +#define IS_TEXT(VAR) IS_META_SYS(VAR,text "") +#define IS_LOCATION(VAR) IS_META_SYS(VAR,locationNull) + +#define IS_BOOLEAN(VAR) IS_BOOL(VAR) +#define IS_FUNCTION(VAR) IS_CODE(VAR) +#define IS_INTEGER(VAR) (if (IS_SCALAR(VAR)) then {floor (VAR) == (VAR)} else {false}) +#define IS_NUMBER(VAR) IS_SCALAR(VAR) + +#define FLOAT_TO_STRING(num) (if (_this == 0) then {"0"} else {str parseNumber (str (_this % _this) + str floor abs _this) + "." + (str (abs _this - floor abs _this) select [2]) + "0"}) + +/* ------------------------------------------- +Macro: SCRIPT() + Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. + +Parameters: + NAME - Name of script [Indentifier] + +Example: + (begin example) + SCRIPT(eradicateMuppets); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif + +/* ------------------------------------------- +Macros: EXPLODE_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Splitting an ARRAY into a number of variables (A, B, C, etc). + + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + +Parameters: + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] + +Example: + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) + +Author: + Spooner +------------------------------------------- */ +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] +#define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) + +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] +#define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) + +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] +#define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] +#define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) + +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] +#define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) + +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] +#define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) + +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] +#define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) + +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] +#define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) + +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] +#define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) + + #define LLSTRING(var1) localize QUOTE(TRIPLES(STR,ADDON,var1)) + #define LELSTRING(var1,var2) localize QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) +#endif + + +/* ------------------------------------------- +Group: Managing Function Parameters +------------------------------------------- */ + +/* ------------------------------------------- +Macros: PARAMS_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Setting variables based on parameters passed to a function. + + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + +Parameters: + A..H - Name of variable to read from _this [Identifier] + +Example: + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define PARAMS_1(A) EXPLODE_1_PVT(_this,A) +#define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) +#define PARAMS_3(A,B,C) EXPLODE_3_PVT(_this,A,B,C) +#define PARAMS_4(A,B,C,D) EXPLODE_4_PVT(_this,A,B,C,D) +#define PARAMS_5(A,B,C,D,E) EXPLODE_5_PVT(_this,A,B,C,D,E) +#define PARAMS_6(A,B,C,D,E,F) EXPLODE_6_PVT(_this,A,B,C,D,E,F) +#define PARAMS_7(A,B,C,D,E,F,G) EXPLODE_7_PVT(_this,A,B,C,D,E,F,G) +#define PARAMS_8(A,B,C,D,E,F,G,H) EXPLODE_8_PVT(_this,A,B,C,D,E,F,G,H) +#define PARAMS_9(A,B,C,D,E,F,G,H,I) EXPLODE_9_PVT(_this,A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: DEFAULT_PARAM() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. + +Parameters: + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + +Example: + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + +/* ------------------------------------------- +Macro: KEY_PARAM() + Get value from key in _this list, return default when key is not included in list. + +Parameters: + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] + +Example: + + +Author: + Muzzleflash +------------------------------------------- */ +#define KEY_PARAM(KEY,NAME,DEF_VALUE) \ + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + +/* ------------------------------------------- +Group: Assertions +------------------------------------------- */ + +#define ASSERTION_ERROR(MESSAGE) ERROR_WITH_TITLE("Assertion failed!",MESSAGE) + +/* ------------------------------------------- +Macro: ASSERT_TRUE() + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_TRUE(CONDITION,MESSAGE) \ + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_FALSE() + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_FALSE(CONDITION,MESSAGE) \ + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } + +/* ------------------------------------------- +Macro: ASSERT_OP() + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_DEFINED() + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_DEFINED(VARIABLE,MESSAGE) \ + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED_AND_OP() + Tests that A and B are defined and (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch, PabstMirror +------------------------------------------- */ +#define TEST_DEFINED_AND_OP(A,OPERATOR,B,MESSAGE) \ + if (isNil #A) then { \ + TEST_FAIL('(A is not defined) ' + (MESSAGE)); \ + } else { \ + if (isNil #B) then { \ + TEST_FAIL('(B is not defined) ' + (MESSAGE)); \ + } else { \ + if ((A) OPERATOR (B)) then { \ + TEST_SUCCESS('(A OPERATOR B) ' + (MESSAGE)) \ + } else { \ + TEST_FAIL('(A OPERATOR B) ' + (MESSAGE)) \ + }; }; }; + + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Managing Deprecation +------------------------------------------- */ + +/* ------------------------------------------- +Macro: DEPRECATE_SYS() + Allow deprecation of a function that has been renamed. + + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } + +/* ------------------------------------------- +Macro: DEPRECATE() + Allow deprecation of a function, in the current component, that has been renamed. + + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + +/* ------------------------------------------- +Macro: OBSOLETE_SYS() + Replace a function that has become obsolete. + + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, and runs the command function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } + +/* ------------------------------------------- +Macro: OBSOLETE() + Replace a function, in the current component, that has become obsolete. + + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. + + Shows a warning in RPT each time the deprecated function is used. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + +#define BWC_CONFIG(NAME) class NAME { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ +} + +// XEH Specific +#define XEH_CLASS CBA_Extended_EventHandlers +#define XEH_CLASS_BASE DOUBLES(XEH_CLASS,base) +#define XEH_DISABLED class EventHandlers { class XEH_CLASS {}; }; SLX_XEH_DISABLED = 1 +#define XEH_ENABLED class EventHandlers { class XEH_CLASS { EXTENDED_EVENTHANDLERS }; }; SLX_XEH_DISABLED = 0 + +// TODO: These are actually outdated; _Once ? +#define XEH_PRE_INIT QUOTE(call COMPILE_FILE(XEH_PreInit_Once)) +#define XEH_PRE_CINIT QUOTE(call COMPILE_FILE(XEH_PreClientInit_Once)) +#define XEH_PRE_SINIT QUOTE(call COMPILE_FILE(XEH_PreServerInit_Once)) + +#define XEH_POST_INIT QUOTE(call COMPILE_FILE(XEH_PostInit_Once)) +#define XEH_POST_CINIT QUOTE(call COMPILE_FILE(XEH_PostClientInit_Once)) +#define XEH_POST_SINIT QUOTE(call COMPILE_FILE(XEH_PostServerInit_Once)) + +/* ------------------------------------------- +Macro: IS_ADMIN + Check if the local machine is an admin in the multiplayer environment. + + Reports 'true' for logged and voted in admins. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin + systemChat str IS_ADMIN; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' + +/* ------------------------------------------- +Macro: IS_ADMIN_LOGGED + Check if the local machine is a logged in admin in the multiplayer environment. + + Reports 'false' if the player was voted to be the admin. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin and entered in the server password + systemChat str IS_ADMIN_LOGGED; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' + +/* ------------------------------------------- +Macro: FILE_EXISTS + Check if a file exists + + Reports "false" if the file does not exist. + +Parameters: + FILE - Path to the file + +Example: + (begin example) + // print "true" if file exists + systemChat str FILE_EXISTS("\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/arma/server/include/x/cba/addons/xeh/script_xeh.hpp b/arma/server/include/x/cba/addons/xeh/script_xeh.hpp new file mode 100644 index 0000000..2eba000 --- /dev/null +++ b/arma/server/include/x/cba/addons/xeh/script_xeh.hpp @@ -0,0 +1,118 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ +///////////////////////////////////////////////////////////////////////////////// +// MACRO: EXTENDED_EVENTHANDLERS +// Add all XEH event handlers +///////////////////////////////////////////////////////////////////////////////// + +#define EXTENDED_EVENTHANDLERS init = "call cba_xeh_fnc_init"; \ +fired = "call cba_xeh_fnc_fired"; \ +animChanged = "call cba_xeh_fnc_animChanged"; \ +animDone = "call cba_xeh_fnc_animDone"; \ +animStateChanged = "call cba_xeh_fnc_animStateChanged"; \ +containerClosed = "call cba_xeh_fnc_containerClosed"; \ +containerOpened = "call cba_xeh_fnc_containerOpened"; \ +controlsShifted = "call cba_xeh_fnc_controlsShifted"; \ +dammaged = "call cba_xeh_fnc_dammaged"; \ +engine = "call cba_xeh_fnc_engine"; \ +epeContact = "call cba_xeh_fnc_epeContact"; \ +epeContactEnd = "call cba_xeh_fnc_epeContactEnd"; \ +epeContactStart = "call cba_xeh_fnc_epeContactStart"; \ +explosion = "call cba_xeh_fnc_explosion"; \ +firedNear = "call cba_xeh_fnc_firedNear"; \ +fuel = "call cba_xeh_fnc_cba_xeh_fuel"; \ +gear = "call cba_xeh_fnc_gear"; \ +getIn = "call cba_xeh_fnc_getIn"; \ +getInMan = "call cba_xeh_fnc_getInMan"; \ +getOut = "call cba_xeh_fnc_getOut"; \ +getOutMan = "call cba_xeh_fnc_getOutMan"; \ +handleHeal = "call cba_xeh_fnc_handleHeal"; \ +hit = "call cba_xeh_fnc_hit"; \ +hitPart = "call cba_xeh_fnc_hitPart"; \ +incomingMissile = "call cba_xeh_fnc_incomingMissile"; \ +inventoryClosed = "call cba_xeh_fnc_inventoryClosed"; \ +inventoryOpened = "call cba_xeh_fnc_inventoryOpened"; \ +killed = "call cba_xeh_fnc_killed"; \ +landedTouchDown = "call cba_xeh_fnc_landedTouchDown"; \ +landedStopped = "call cba_xeh_fnc_landedStopped"; \ +local = "call cba_xeh_fnc_local"; \ +respawn = "call cba_xeh_fnc_respawn"; \ +put = "call cba_xeh_fnc_put"; \ +take = "call cba_xeh_fnc_take"; \ +seatSwitched = "call cba_xeh_fnc_seatSwitched"; \ +seatSwitchedMan = "call cba_xeh_fnc_seatSwitchedMan"; \ +soundPlayed = "call cba_xeh_fnc_soundPlayed"; \ +weaponAssembled = "call cba_xeh_fnc_weaponAssembled"; \ +weaponDisassembled = "call cba_xeh_fnc_weaponDisassembled"; \ +weaponDeployed = "call cba_xeh_fnc_weaponDeployed"; \ +weaponRested = "call cba_xeh_fnc_weaponRested"; \ +reloaded = "call cba_xeh_fnc_reloaded"; \ +firedMan = "call cba_xeh_fnc_firedMan"; \ +turnIn = "call cba_xeh_fnc_turnIn"; \ +turnOut = "call cba_xeh_fnc_turnOut"; \ +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; \ +gestureChanged = "call cba_xeh_fnc_gestureChanged"; \ +gestureDone = "call cba_xeh_fnc_gestureDone"; + +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. +*/ + +#define DELETE_EVENTHANDLERS init = ""; \ +fired = ""; \ +animChanged = ""; \ +animDone = ""; \ +animStateChanged = ""; \ +containerClosed = ""; \ +containerOpened = ""; \ +controlsShifted = ""; \ +dammaged = ""; \ +engine = ""; \ +epeContact = ""; \ +epeContactEnd = ""; \ +epeContactStart = ""; \ +explosion = ""; \ +firedNear = ""; \ +fuel = ""; \ +gear = ""; \ +getIn = ""; \ +getInMan = ""; \ +getOut = ""; \ +getOutMan = ""; \ +handleHeal = ""; \ +hit = ""; \ +hitPart = ""; \ +incomingMissile = ""; \ +inventoryClosed = ""; \ +inventoryOpened = ""; \ +killed = ""; \ +landedTouchDown = ""; \ +landedStopped = ""; \ +local = ""; \ +respawn = ""; \ +put = ""; \ +take = ""; \ +seatSwitched = ""; \ +seatSwitchedMan = ""; \ +soundPlayed = ""; \ +weaponAssembled = ""; \ +weaponDisassembled = ""; \ +weaponDeployed = ""; \ +weaponRested = ""; \ +reloaded = ""; \ +firedMan = ""; \ +turnIn = ""; \ +turnOut = ""; \ +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; \ +gestureChanged = ""; \ +gestureDone = "" diff --git a/arma/server/meta.cpp b/arma/server/meta.cpp new file mode 100644 index 0000000..eed91f1 --- /dev/null +++ b/arma/server/meta.cpp @@ -0,0 +1,4 @@ +protocol = 1; +publishedid = MOD_ID; +name = "forge-server"; +timestamp = 5250140732737923549; diff --git a/arma/server/mod.cpp b/arma/server/mod.cpp new file mode 100644 index 0000000..0455a32 --- /dev/null +++ b/arma/server/mod.cpp @@ -0,0 +1,15 @@ +dir = "@forge_server"; +author = "J.Schmidt"; +name = "Forge Server"; +description = "Forge Server - Version 1.0.0"; +overview = ""; +overviewPicture = "title_ca.paa"; +picture = "title_ca.paa"; +logoSmall = "icon_64_ca.paa"; +logo = "icon_128_ca.paa"; +logoOver = "icon_128_highlight_ca.paa"; +tooltip = "Forge Server"; +tooltipOwned = "IDS Owned"; +action = "https://innovativedevsolutions.org"; +actionName = "Website"; +dlcColor[] = {0.45, 0.47, 0.41, 1}; diff --git a/arma/server/server.code-workspace b/arma/server/server.code-workspace new file mode 100644 index 0000000..ceb7f29 --- /dev/null +++ b/arma/server/server.code-workspace @@ -0,0 +1,24 @@ +{ + "folders": [ + { + "path": ".", + }, + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config", + }, + }, +} diff --git a/arma/server/surrealdb/AllInOne.bat b/arma/server/surrealdb/AllInOne.bat new file mode 100644 index 0000000..5a1cb80 --- /dev/null +++ b/arma/server/surrealdb/AllInOne.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0UpdateMe.bat" +call "%~dp0RunMe.bat" diff --git a/arma/server/surrealdb/README.md b/arma/server/surrealdb/README.md new file mode 100644 index 0000000..d1d8a16 --- /dev/null +++ b/arma/server/surrealdb/README.md @@ -0,0 +1,74 @@ +# Forge SurrealDB + +Forge uses SurrealDB as the durable database for the server extension. These +helpers install the SurrealDB CLI and start a local RocksDB-backed Forge +database from this directory. + +These scripts are for local development and single-host Forge servers. For a +public or shared production host, change the root password and review bind, +firewall, TLS, backup, and upgrade policy before exposing the database. + +## Windows + +Install or update SurrealDB: + +```bat +UpdateMe.bat +``` + +If this is the first install and the terminal cannot find `surreal` after the +script finishes, open a new terminal so Windows reloads `PATH`. + +Start Forge's local database: + +```bat +RunMe.bat +``` + +Install and start in one step: + +```bat +AllInOne.bat +``` + +## Linux or macOS + +Install SurrealDB: + +```bash +./setup.sh +``` + +Start Forge's local database: + +```bash +./run.sh +``` + +Update SurrealDB: + +```bash +./update.sh +``` + +## Manual Command + +The run scripts execute: + +```bash +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db +``` + +The database files are created under `arma/server/surrealdb/forge.db`. + +Forge's extension config should match the local SurrealDB server: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` diff --git a/arma/server/surrealdb/RunMe.bat b/arma/server/surrealdb/RunMe.bat new file mode 100644 index 0000000..b9f1310 --- /dev/null +++ b/arma/server/surrealdb/RunMe.bat @@ -0,0 +1,3 @@ +@echo off +cd /d "%~dp0" +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db diff --git a/arma/server/surrealdb/UpdateMe.bat b/arma/server/surrealdb/UpdateMe.bat new file mode 100644 index 0000000..4d21b22 --- /dev/null +++ b/arma/server/surrealdb/UpdateMe.bat @@ -0,0 +1,14 @@ +@echo off +where surreal >nul 2>nul +if %errorlevel% equ 0 ( + surreal upgrade + surreal version +) else ( + powershell -NoProfile -ExecutionPolicy Bypass -Command "iwr https://windows.surrealdb.com -useb | iex" + where surreal >nul 2>nul + if %errorlevel% equ 0 ( + surreal version + ) else ( + echo SurrealDB install finished. Open a new terminal if the surreal command is not available yet. + ) +) diff --git a/arma/server/surrealdb/run.sh b/arma/server/surrealdb/run.sh new file mode 100644 index 0000000..05e07b6 --- /dev/null +++ b/arma/server/surrealdb/run.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" + +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db diff --git a/arma/server/surrealdb/setup.sh b/arma/server/surrealdb/setup.sh new file mode 100644 index 0000000..f66603c --- /dev/null +++ b/arma/server/surrealdb/setup.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v surreal >/dev/null 2>&1; then + surreal version + exit 0 +fi + +if command -v brew >/dev/null 2>&1; then + brew install surrealdb/tap/surreal +else + curl -sSf https://install.surrealdb.com | sh +fi + +surreal version diff --git a/arma/server/surrealdb/update.sh b/arma/server/surrealdb/update.sh new file mode 100644 index 0000000..6053e58 --- /dev/null +++ b/arma/server/surrealdb/update.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v brew >/dev/null 2>&1; then + brew upgrade surrealdb/tap/surreal || brew install surrealdb/tap/surreal +else + curl -sSf https://install.surrealdb.com | sh +fi + +surreal version diff --git a/arma/server/title_ca.paa b/arma/server/title_ca.paa new file mode 100644 index 0000000..f46f6d0 Binary files /dev/null and b/arma/server/title_ca.paa differ diff --git a/arma/server/tools/config_style_checker.py b/arma/server/tools/config_style_checker.py new file mode 100644 index 0000000..2332750 --- /dev/null +++ b/arma/server/tools/config_style_checker.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + reIsClass = re.compile(r'^\s*class(.*)') + reIsClassInherit = re.compile(r'^\s*class(.*):') + reIsClassBody = re.compile(r'^\s*class(.*){') + reBadColon = re.compile(r'\s*class (.*) :') + reSpaceAfterColon = re.compile(r'\s*class (.*): ') + reSpaceBeforeCurly = re.compile(r'\s*class (.*) {') + reClassSingleLine = re.compile(r'\s*class (.*)[{;]') + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + + file.seek(0) + for lineNumber, line in enumerate(file.readlines()): + if reIsClass.match(line): + if reBadColon.match(line): + print(f"WARNING: bad class colon {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + if reIsClassInherit.match(line): + if not reSpaceAfterColon.match(line): + print(f"WARNING: bad class missing space after colon {filepath} Line number: {lineNumber+1}") + if reIsClassBody.match(line): + if not reSpaceBeforeCurly.match(line): + print(f"WARNING: bad class inherit missing space before curly braces {filepath} Line number: {lineNumber+1}") + if not reClassSingleLine.match(line): + print(f"WARNING: bad class braces placement {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.rvmat'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cfg'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/arma/server/tools/release.bat b/arma/server/tools/release.bat new file mode 100644 index 0000000..667a74c --- /dev/null +++ b/arma/server/tools/release.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_minor.rhai +hemtt release diff --git a/arma/server/tools/release_patch.bat b/arma/server/tools/release_patch.bat new file mode 100644 index 0000000..ec4db02 --- /dev/null +++ b/arma/server/tools/release_patch.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_patch.rhai +hemtt release diff --git a/arma/ui.7z b/arma/ui.7z new file mode 100644 index 0000000..dd6a9c3 Binary files /dev/null and b/arma/ui.7z differ diff --git a/bin/icom/Cargo.toml b/bin/icom/Cargo.toml new file mode 100644 index 0000000..528ec1a --- /dev/null +++ b/bin/icom/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "forge-icom" +version = "0.1.0" +edition = "2024" +build = "build.rs" + +[lib] +name = "forge_icom" +path = "src/lib.rs" + +[[bin]] +name = "forge-icom" +path = "src/main.rs" + +[dependencies] +chrono = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +tokio = { workspace = true } +toml = "0.9.8" +uuid = { workspace = true } + +[build-dependencies] +winres = "0.1" diff --git a/bin/icom/README.md b/bin/icom/README.md new file mode 100644 index 0000000..df1fa5f --- /dev/null +++ b/bin/icom/README.md @@ -0,0 +1,399 @@ +# Forge ICOM Server (Internal Communication) + +A standalone TCP server for inter-Arma3-server communication. ICOM enables multiple Arma 3 servers to communicate with each other, facilitating cross-server events like mission spawning, supply drops, and military reports. + +## Architecture + +``` +[Arma Server 1] <---> [Forge ICOM] <---> [Arma Server 2] + (Extension) (TCP 9090) (Extension) + Client Client +``` + +Each Arma server's extension connects to the ICOM server as a client. ICOM routes messages between servers based on target IDs or broadcasts to all connected servers. + +## Configuration + +The ICOM server can be configured using a `config.toml` file. Create one from the example: + +```powershell +cp bin/icom/config.example.toml config.toml +``` + +Place `config.toml` in the same directory as the `forge-icom` executable or in the current working directory. + +### Configuration Options + +```toml +[server] +# Host to bind to +# "0.0.0.0" = All interfaces (allows remote connections) +# "127.0.0.1" = Localhost only +host = "0.0.0.0" + +# Port to listen on +port = 9090 +``` + +**Defaults**: If no config file is found, defaults to `0.0.0.0:9090`. + +## Building + +```powershell +# Build release binary +cargo build --release -p forge-icom + +# The executable will be at: +# target/release/forge-icom.exe (Windows) +``` + +## Running + +```powershell +# Run the ICOM server +./target/release/forge-icom.exe + +# Or during development +cargo run -p forge-icom +``` + +The server will listen on `0.0.0.0:9090` by default. + +## Design Philosophy + +### Generic Event System + +ICOM uses a **generic event-based architecture** instead of predefined message types. This means: + +- ✅ **Flexibility**: Add new event types without changing the ICOM server code +- ✅ **Simplicity**: Only one `Event` message type instead of multiple specialized types +- ✅ **Decoupled**: ICOM doesn't need to know about your game logic +- ✅ **Future-proof**: Easy to extend as your needs evolve + +ICOM simply routes events between servers - your application logic determines what each event means. + +## Message Protocol + +All messages are JSON objects sent as newline-delimited strings. Each message has a `type` field that determines its structure. + +### Register + +First message from each Arma server to identify itself: + +```json +{ + "type": "register", + "server_id": "server_1" +} +``` + +Response: + +```json +{ + "type": "registered", + "session_id": "uuid-here" +} +``` + +### Event (Send to Specific Server) + +Send an event with arbitrary JSON data to a specific server: + +```json +{ + "type": "event", + "target_server": "server_2", + "event_name": "supply_drop", + "data": { + "coords": [1234.5, 5678.9, 0.0], + "supplies": ["ammo_box", "medical_supplies"] + } +} +``` + +Another example: + +```json +{ + "type": "event", + "target_server": "server_2", + "event_name": "spawn_mission", + "data": { + "mission_type": "convoy_ambush", + "difficulty": "hard", + "location": [1234, 5678, 0] + } +} +``` + +### Broadcast + +Send event to all connected servers (except sender): + +```json +{ + "type": "broadcast", + "event_name": "global_alert", + "data": { + "message": "Nuclear strike incoming!", + "severity": "critical" + } +} +``` + +### Acknowledgment + +Response to successful message delivery: + +```json +{ + "type": "ack", + "message_id": null, + "success": true, + "error": null +} +``` + +Error response: + +```json +{ + "type": "ack", + "message_id": null, + "success": false, + "error": "Target server 'server_3' not found" +} +``` + +## Integration with Arma Extension + +### Client Library + +The `forge-icom` crate includes a `client` module that provides a high-level API for connecting to ICOM: + +```rust +use forge_icom::client::IComClient; +use forge_icom::Message; +use serde_json::json; + +// Connect and register (automatically handles registration) +let client = IComClient::connect("127.0.0.1:9090", "server_1".to_string()).await?; + +// Send event to another server +client.send_event( + "server_2", + "supply_drop", + json!({ + "coords": [1234.5, 5678.9, 0.0], + "supplies": ["ammo", "medical"] + }) +).await?; + +// Broadcast to all servers +client.broadcast( + "global_alert", + json!({"message": "Server restart in 5 minutes"}) +).await?; + +// Listen for incoming events +client.listen_for_events(|msg| { + match msg { + Message::Event { event_name, data, .. } => { + // Forward to Arma via callback + } + _ => {} + } + Ok(()) +}).await?; +``` + +### Extension Integration + +The Forge server extension includes full ICOM integration: + +1. **Initialization**: Connect with `icom:connect` after the ICOM hub is running. +2. **Event Listener**: Spawns background task to receive events continuously +3. **Callback System**: Forwards events to Arma via CBA event handlers +4. **Extension Commands**: Provides SQF commands to send/receive events + +**Important Notes**: + +- The extension uses `try_read()` to avoid deadlocks when accessing context from async tasks +- Broadcast events are **not** sent back to the originating server +- Connection is initiated through the `icom:connect` extension command. + +### SQF Usage + +#### Connecting to ICOM + +```sqf +// Connect manually (if not using automatic startup connection) +private _result = "forge_server" callExtension ["icom:connect", ["127.0.0.1:9090", "server_1"]]; +systemChat _result; // "Connection initiated" or "ERROR: Already connected" +``` + +#### Sending Events + +```sqf +// Send event to specific server +private _data = createHashMapFromArray [ + ["coords", [1234, 5678, 0]], + ["supplies", ["ammo_box", "medical_supplies"]] +]; +"forge_server" callExtension ["icom:send_event", ["server_2", "supply_drop", (toJSON _data)]]; + +// Spawn mission on another server +private _missionData = createHashMapFromArray [ + ["mission_type", "convoy_ambush"], + ["difficulty", "hard"], + ["location", [1234, 5678, 0]] +]; +"forge_server" callExtension ["icom:send_event", ["server_2", "spawn_mission", (toJSON _missionData)]]; + +// Broadcast to all servers (except sender) +private _alertData = createHashMapFromArray [ + ["message", "Nuclear strike incoming!"], + ["severity", "critical"] +]; +"forge_server" callExtension ["icom:broadcast", ["global_alert", (toJSON _alertData)]]; +``` + +#### Receiving Events + +Handle incoming events with a CBA event handler: + +```sqf +["forge_icom_event", { + params ["_eventName", "_data"]; + + switch (_eventName) do { + case "supply_drop": { + private _coords = _data get "coords"; + private _supplies = _data get "supplies"; + // Create supply drop at coordinates + [_coords, _supplies] call YourMod_fnc_createSupplyDrop; + }; + case "spawn_mission": { + private _missionType = _data get "mission_type"; + private _location = _data get "location"; + // Spawn the mission + [_missionType, _location] call YourMod_fnc_spawnMission; + }; + case "global_alert": { + private _message = _data get "message"; + // Show alert to all players + [_message] remoteExec ["hint", 0]; + }; + default { + diag_log format ["[ICOM] Unhandled event: %1", _eventName]; + }; + }; +}] call CBA_fnc_addEventHandler; +``` + +## Production Deployment + +### As Windows Service + +You can run ICOM as a Windows service using tools like NSSM: + +```powershell +# Install NSSM +winget install NSSM.NSSM + +# Create service +nssm install ForgeICOM "C:\path\to\forge-icom.exe" +nssm start ForgeICOM +``` + +### Docker (for Linux servers) + +```dockerfile +FROM rust:1.70 as builder +WORKDIR /app +COPY . . +RUN cargo build --release -p forge-icom + +FROM debian:bookworm-slim +COPY --from=builder /app/target/release/forge-icom /usr/local/bin/ +EXPOSE 9090 +CMD ["forge-icom"] +``` + +```bash +docker build -t forge-icom . +docker run -d -p 9090:9090 --name forge-icom forge-icom +``` + +## Features + +- **Async I/O**: Non-blocking message handling using Tokio +- **Multiple connections**: Handle dozens of Arma servers simultaneously +- **Generic event system**: Send arbitrary JSON data without predefined message types +- **Message routing**: Direct events to specific servers or broadcast to all +- **Session management**: Track connected servers with UUIDs +- **Duplicate connection handling**: Automatically replaces old connections when server reconnects +- **Automatic cleanup**: Remove disconnected servers from registry +- **Graceful error handling**: Clients continue running even when target servers are offline + +## Testing + +### Running Examples + +```powershell +# Terminal 1: Start ICOM server +cargo run --bin forge-icom + +# Terminal 2: Start server_1 (listener) +cargo run --example server_1_client + +# Terminal 3: Start server_2 (sender) +cargo run --example server_2_client +``` + +You should see events flow from server_2 → ICOM → server_1. + +### Test with Extension + +1. Start ICOM server +2. Start Arma 3 server with Forge extension +3. In Arma, connect manually (if needed): + ```sqf + "forge_server" callExtension ["icom:connect", ["127.0.0.1:9090", "server_1"]] + ``` +4. Set up CBA event handler in mission init: + ```sqf + ["forge_icom_event", { + params ["_eventName", "_data"]; + systemChat format ["ICOM Event: %1", _eventName]; + }] call CBA_fnc_addEventHandler; + ``` +5. Run example sender client to test event reception: + ```powershell + cargo run --example server_2_client + ``` +6. Check logs at `@forge_server/logs/icom.log` to verify events are received + +## Next Steps + +1. **Run the examples** to see the system in action +2. **Add CBA event handler** in your mission to process `forge_icom_event` +3. **Define your event types** (supply_drop, spawn_mission, etc.) based on your needs +4. **Test with multiple Arma servers** locally +5. **Deploy ICOM server** to production (Windows Service or Docker) +6. **Configure server IDs** in extension config for each server + +## Monitoring + +The ICOM server logs all important events to stdout: + +- 🔥 Server startup +- 📡 New connections +- ✅ Server registrations +- 📢 Broadcast messages +- 📨 Message forwarding +- 🗑️ Server disconnections +- ❌ Errors + +Consider redirecting output to a file or logging service for production. diff --git a/bin/icom/assets/forge.ico b/bin/icom/assets/forge.ico new file mode 100644 index 0000000..17687c0 Binary files /dev/null and b/bin/icom/assets/forge.ico differ diff --git a/bin/icom/assets/forge.png b/bin/icom/assets/forge.png new file mode 100644 index 0000000..19914b3 Binary files /dev/null and b/bin/icom/assets/forge.png differ diff --git a/bin/icom/build.rs b/bin/icom/build.rs new file mode 100644 index 0000000..2aa37e8 --- /dev/null +++ b/bin/icom/build.rs @@ -0,0 +1,7 @@ +fn main() { + if cfg!(target_os = "windows") { + let mut res = winres::WindowsResource::new(); + res.set_icon("assets/forge.ico"); + res.compile().unwrap(); + } +} diff --git a/bin/icom/config.example.toml b/bin/icom/config.example.toml new file mode 100644 index 0000000..39bbe18 --- /dev/null +++ b/bin/icom/config.example.toml @@ -0,0 +1,22 @@ +# Forge ICOM Server Configuration +# Copy this file to config.toml and modify as needed +# Place this file in the same directory as the forge-icom executable + +[server] +# Host to bind to +# - "0.0.0.0" = All network interfaces (default, allows remote connections) +# - "127.0.0.1" = Localhost only (for local testing) +host = "0.0.0.0" + +# Port to listen on +port = 9090 + +# Example configurations for different environments: + +# Development (localhost only) +# host = "127.0.0.1" +# port = 9090 + +# Production (all interfaces, custom port) +# host = "0.0.0.0" +# port = 19090 diff --git a/bin/icom/examples/server_1_client.rs b/bin/icom/examples/server_1_client.rs new file mode 100644 index 0000000..e9358ff --- /dev/null +++ b/bin/icom/examples/server_1_client.rs @@ -0,0 +1,41 @@ +use forge_icom::{Message, client::IComClient}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + println!("Server 1 - ICOM Client"); + println!("Connecting to ICOM server...\n"); + + // Connect to ICOM as server_1 + let client = IComClient::connect("127.0.0.1:9090", "server_1".to_string()).await?; + println!("Registered as 'server_1'."); + + println!("Listening for incoming messages...\n"); + + // Listen for incoming messages indefinitely + client + .listen_for_events(|msg| { + match msg { + Message::Event { + event_name, data, .. + } => { + println!("EVENT: {}", event_name); + println!("Data: {:#?}", data); + println!(); + } + Message::Ack { .. } => { + // Ignore acks in listener mode + } + Message::Error { message } => { + eprintln!("Error: {}", message); + } + _ => { + println!("Received: {:?}", msg); + println!(); + } + } + Ok(()) + }) + .await?; + + Ok(()) +} diff --git a/bin/icom/examples/server_2_client.rs b/bin/icom/examples/server_2_client.rs new file mode 100644 index 0000000..6d7d266 --- /dev/null +++ b/bin/icom/examples/server_2_client.rs @@ -0,0 +1,79 @@ +use forge_icom::client::IComClient; +use serde_json::json; + +#[tokio::main] +async fn main() -> Result<(), Box> { + println!("Server 2 - ICOM Client"); + println!("Connecting to ICOM server...\n"); + + // Connect to ICOM as server_2 + let client = IComClient::connect("127.0.0.1:9090", "server_2".to_string()).await?; + + println!("\nSending messages to server_1...\n"); + + // Wait a moment for server_2 to be ready + tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; + + // Example: Supply drop event + println!("Sending supply drop event..."); + match client + .send_event( + "server_1", + "supply_drop", + json!({ + "coords": [1234.5, 5678.9, 0.0], + "supplies": ["ammo_box", "medical_supplies"] + }), + ) + .await + { + Ok(_) => println!("Supply drop event sent\n"), + Err(e) => println!("Supply drop failed: {}\n", e), + } + + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + + // Example: Mission spawn event + println!("Sending mission spawn event..."); + match client + .send_event( + "server_1", + "spawn_mission", + json!({ + "mission_type": "convoy_ambush", + "difficulty": "hard", + "location": [1234, 5678, 0] + }), + ) + .await + { + Ok(_) => println!("Mission spawn event sent\n"), + Err(e) => println!("Mission spawn failed: {}\n", e), + } + + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + + // Example: Broadcast event + println!("Broadcasting event..."); + match client + .broadcast( + "global_alert", + json!({ + "message": "Nuclear strike incoming!", + "severity": "critical" + }), + ) + .await + { + Ok(_) => println!("Broadcast sent\n"), + Err(e) => println!("Broadcast failed: {}\n", e), + } + + println!("All messages sent (check above for any failures)!"); + println!("Press Ctrl+C to exit"); + + // Keep running to receive any responses + tokio::time::sleep(tokio::time::Duration::from_secs(3)).await; + + Ok(()) +} diff --git a/bin/icom/examples/server_3_client.rs b/bin/icom/examples/server_3_client.rs new file mode 100644 index 0000000..98a807a --- /dev/null +++ b/bin/icom/examples/server_3_client.rs @@ -0,0 +1,41 @@ +use forge_icom::{Message, client::IComClient}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + println!("Server 3 - ICOM Client"); + println!("Connecting to ICOM server...\n"); + + // Connect to ICOM as server_3 + let client = IComClient::connect("127.0.0.1:9090", "server_3".to_string()).await?; + println!("Registered as 'server_3'."); + + println!("Listening for incoming messages...\n"); + + // Listen for incoming messages indefinitely + client + .listen_for_events(|msg| { + match msg { + Message::Event { + event_name, data, .. + } => { + println!("EVENT: {}", event_name); + println!("Data: {:#?}", data); + println!(); + } + Message::Ack { .. } => { + // Ignore acks in listener mode + } + Message::Error { message } => { + eprintln!("Error: {}", message); + } + _ => { + println!("Received: {:?}", msg); + println!(); + } + } + Ok(()) + }) + .await?; + + Ok(()) +} diff --git a/bin/icom/src/client.rs b/bin/icom/src/client.rs new file mode 100644 index 0000000..b993bdf --- /dev/null +++ b/bin/icom/src/client.rs @@ -0,0 +1,306 @@ +//! Forge Internal Communication (ICOM) Client Library +//! +//! This library provides a client for connecting to the Forge ICOM Server +//! and sending/receiving events between Arma 3 servers. +//! +//! # Overview +//! +//! The ICOM client handles: +//! - **Connection Management**: Connects to ICOM server and maintains persistent connection +//! - **Registration**: Identifies itself with a unique server ID +//! - **Event Sending**: Send events to specific servers or broadcast to all +//! - **Event Listening**: Continuously listen for incoming events from other servers +//! +//! # Usage +//! +//! ```no_run +//! use forge_icom::client::IComClient; +//! use serde_json::json; +//! +//! #[tokio::main] +//! async fn main() -> Result<(), Box> { +//! // Connect and register +//! let client = IComClient::connect("127.0.0.1:9090", "server_1".to_string()).await?; +//! +//! // Send an event to another server +//! client.send_event( +//! "server_2", +//! "supply_drop", +//! json!({"coords": [1234, 5678, 0]}) +//! ).await?; +//! +//! // Listen for incoming events +//! client.listen_for_events(|msg| { +//! // Handle event... +//! Ok(()) +//! }).await?; +//! +//! Ok(()) +//! } +//! ``` + +pub use crate::Message; +use std::sync::Arc; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::net::TcpStream; +use tokio::sync::Mutex; + +/// ICOM client for connecting to the Forge ICOM Server +/// +/// The client maintains a persistent TCP connection to the ICOM server and uses +/// separate reader/writer halves wrapped in Arc> to allow safe concurrent +/// access from multiple tasks. +/// +/// # Thread Safety +/// +/// The client is designed to be safely shared across multiple async tasks. The +/// internal reader and writer are protected by mutexes, allowing concurrent +/// send/receive operations. +pub struct IComClient { + writer: Arc>, + reader: Arc>>, + server_id: String, +} + +impl IComClient { + /// Connect to the ICOM server and register + /// + /// Establishes a TCP connection to the ICOM server, sends a registration message, + /// and waits for confirmation before returning. If registration fails, an error + /// is returned. + /// + /// # Arguments + /// + /// * `icom_addr` - Address of the ICOM server (e.g., "127.0.0.1:9090") + /// * `server_id` - Unique identifier for this server (e.g., "server_1", "server_2") + /// + /// # Returns + /// + /// Returns a connected and registered `IComClient` on success, or an error if + /// connection or registration fails. + /// + /// # Example + /// + /// ```no_run + /// use forge_icom::client::IComClient; + /// + /// # async fn example() -> Result<(), Box> { + /// let client = IComClient::connect("127.0.0.1:9090", "server_1".to_string()).await?; + /// # Ok(()) + /// # } + /// ``` + pub async fn connect( + icom_addr: &str, + server_id: String, + ) -> Result> { + let stream = TcpStream::connect(icom_addr).await?; + let (reader, writer) = stream.into_split(); + + let client = Self { + writer: Arc::new(Mutex::new(writer)), + reader: Arc::new(Mutex::new(BufReader::new(reader))), + server_id: server_id.clone(), + }; + + // Register with ICOM + let register_msg = Message::Register { + server_id: server_id.clone(), + }; + client.send_message(®ister_msg).await?; + + // Wait for registration confirmation + let response = client.receive_message().await?; + match response { + Message::Registered { .. } => Ok(client), + _ => Err("Failed to register with ICOM".into()), + } + } + + /// Send a message to ICOM + /// + /// Internal method that serializes a message to JSON and sends it over the wire, + /// terminated with a newline character. + async fn send_message(&self, msg: &Message) -> Result<(), Box> { + let json = serde_json::to_string(msg)?; + let mut writer = self.writer.lock().await; + writer.write_all(json.as_bytes()).await?; + writer.write_all(b"\n").await?; + Ok(()) + } + + /// Receive a message from ICOM + /// + /// Internal method that reads a line-delimited JSON message from the server + /// and deserializes it into a Message enum. + async fn receive_message(&self) -> Result> { + let mut reader = self.reader.lock().await; + let mut line = String::new(); + reader.read_line(&mut line).await?; + let msg = serde_json::from_str(&line)?; + Ok(msg) + } + + /// Send an event to another server + /// + /// Sends a custom event with arbitrary JSON data to a specific server connected + /// to the ICOM hub. The method waits for an acknowledgment from the server before + /// returning. + /// + /// # Arguments + /// + /// * `target_server` - ID of the target server (must be currently connected) + /// * `event_name` - Name of the event (e.g., "supply_drop", "spawn_mission") + /// * `data` - Arbitrary JSON data for the event + /// + /// # Returns + /// + /// Returns `Ok(())` if the event was successfully sent and acknowledged, or an + /// error if the target server is not found or communication fails. + /// + /// # Example + /// + /// ```no_run + /// use forge_icom::client::IComClient; + /// use serde_json::json; + /// + /// # async fn example(client: &IComClient) -> Result<(), Box> { + /// client.send_event( + /// "server_2", + /// "supply_drop", + /// json!({ + /// "coords": [1234.5, 5678.9, 0.0], + /// "supplies": ["ammo", "medical"] + /// }) + /// ).await?; + /// # Ok(()) + /// # } + /// ``` + pub async fn send_event( + &self, + target_server: &str, + event_name: &str, + data: serde_json::Value, + ) -> Result<(), Box> { + let msg = Message::Event { + target_server: target_server.to_string(), + event_name: event_name.to_string(), + data, + }; + self.send_message(&msg).await?; + + // Wait for acknowledgment + let ack = self.receive_message().await?; + match ack { + Message::Ack { success: true, .. } => Ok(()), + Message::Ack { error: Some(e), .. } => Err(e.into()), + _ => Err("Unexpected response".into()), + } + } + + /// Broadcast an event to all servers + /// + /// Sends an event to all servers currently connected to the ICOM hub, except + /// the sender itself. The method waits for an acknowledgment before returning. + /// + /// # Arguments + /// + /// * `event_name` - Name of the event (e.g., "global_alert", "server_restart") + /// * `data` - Arbitrary JSON data for the event + /// + /// # Returns + /// + /// Returns `Ok(())` if the broadcast was successfully sent and acknowledged, + /// or an error if communication fails. + /// + /// # Example + /// + /// ```no_run + /// use forge_icom::client::IComClient; + /// use serde_json::json; + /// + /// # async fn example(client: &IComClient) -> Result<(), Box> { + /// client.broadcast( + /// "global_alert", + /// json!({ + /// "message": "Nuclear strike incoming!", + /// "severity": "critical" + /// }) + /// ).await?; + /// # Ok(()) + /// # } + /// ``` + pub async fn broadcast( + &self, + event_name: &str, + data: serde_json::Value, + ) -> Result<(), Box> { + let msg = Message::Broadcast { + event_name: event_name.to_string(), + data, + }; + self.send_message(&msg).await?; + + // Wait for acknowledgment + let ack = self.receive_message().await?; + match ack { + Message::Ack { success: true, .. } => Ok(()), + Message::Ack { error: Some(e), .. } => Err(e.into()), + _ => Err("Unexpected response".into()), + } + } + + /// Start listening for incoming messages from other servers + /// + /// Enters an infinite loop that continuously receives messages from the ICOM server + /// and passes them to the provided handler function. This method blocks until an + /// error occurs or the connection is closed. + /// + /// # Arguments + /// + /// * `handler` - Callback function invoked for each received message. Should return + /// `Ok(())` to continue listening, or an error to stop. + /// + /// # Returns + /// + /// Returns an error if the connection is lost or if the handler returns an error. + /// + /// # Example + /// + /// ```no_run + /// use forge_icom::client::IComClient; + /// use forge_icom::Message; + /// + /// # async fn example(client: &IComClient) -> Result<(), Box> { + /// client.listen_for_events(|msg| { + /// match msg { + /// Message::Event { event_name, data, .. } => { + /// println!("Received event: {} with data: {:?}", event_name, data); + /// } + /// _ => {} + /// } + /// Ok(()) + /// }).await?; + /// # Ok(()) + /// # } + /// ``` + pub async fn listen_for_events( + &self, + mut handler: F, + ) -> Result<(), Box> + where + F: FnMut(Message) -> Result<(), Box>, + { + loop { + let msg = self.receive_message().await?; + handler(msg)?; + } + } + + /// Get the server ID for this client + /// + /// Returns the unique identifier this client registered with when connecting + /// to the ICOM server. + pub fn server_id(&self) -> &str { + &self.server_id + } +} diff --git a/bin/icom/src/config.rs b/bin/icom/src/config.rs new file mode 100644 index 0000000..0f3a353 --- /dev/null +++ b/bin/icom/src/config.rs @@ -0,0 +1,91 @@ +/// Configuration management for ICOM server. +use serde::Deserialize; +use std::fs; +use std::path::PathBuf; + +/// ICOM server configuration. +#[derive(Debug, Clone, Deserialize, Default)] +pub struct Config { + /// Server bind address configuration + #[serde(default)] + pub server: ServerConfig, +} + +/// Server bind configuration. +#[derive(Debug, Clone, Deserialize)] +pub struct ServerConfig { + /// Host to bind to (e.g., "0.0.0.0" for all interfaces, "127.0.0.1" for localhost only) + #[serde(default = "default_host")] + pub host: String, + /// Port to listen on + #[serde(default = "default_port")] + pub port: u16, +} + +impl Default for ServerConfig { + fn default() -> Self { + Self { + host: default_host(), + port: default_port(), + } + } +} + +impl ServerConfig { + /// Returns the full bind address as "host:port" + pub fn bind_address(&self) -> String { + format!("{}:{}", self.host, self.port) + } +} + +fn default_host() -> String { + "0.0.0.0".to_string() +} + +fn default_port() -> u16 { + 9090 +} + +/// Loads configuration from config.toml with graceful fallback to defaults. +/// +/// Looks for config.toml in: +/// 1. Current directory +/// 2. Executable directory +/// +/// If no config file is found, uses default values. +pub fn load() -> Config { + // Try current directory first + let config_path = PathBuf::from("config.toml"); + + let config_path = if config_path.exists() { + config_path + } else { + // Try executable directory + std::env::current_exe() + .ok() + .and_then(|exe| exe.parent().map(|dir| dir.join("config.toml"))) + .filter(|p| p.exists()) + .unwrap_or_else(|| PathBuf::from("config.toml")) + }; + + match fs::read_to_string(&config_path) { + Ok(contents) => { + println!("Loading config from: {}", config_path.display()); + match toml::from_str::(&contents) { + Ok(config) => { + println!("Configuration loaded successfully"); + config + } + Err(e) => { + eprintln!("Failed to parse config.toml: {}", e); + eprintln!("Using default configuration"); + Config::default() + } + } + } + Err(_) => { + println!("No config.toml found, using defaults"); + Config::default() + } + } +} diff --git a/bin/icom/src/lib.rs b/bin/icom/src/lib.rs new file mode 100644 index 0000000..2984380 --- /dev/null +++ b/bin/icom/src/lib.rs @@ -0,0 +1,37 @@ +//! Forge Internal Communication (ICOM) - Message Types +//! +//! This library exposes the shared `Message` enum used for communication +//! between the ICOM server and clients. + +use serde::{Deserialize, Serialize}; + +pub mod client; + +/// Message types for inter-server communication via ICOM +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum Message { + /// Register a server with a unique ID + Register { server_id: String }, + /// Server successfully registered + Registered { session_id: String }, + /// Send event to specific server + Event { + target_server: String, + event_name: String, + data: serde_json::Value, + }, + /// Broadcast event to all servers (except sender) + Broadcast { + event_name: String, + data: serde_json::Value, + }, + /// Response/acknowledgment + Ack { + message_id: Option, + success: bool, + error: Option, + }, + /// Error message + Error { message: String }, +} diff --git a/bin/icom/src/main.rs b/bin/icom/src/main.rs new file mode 100644 index 0000000..9166726 --- /dev/null +++ b/bin/icom/src/main.rs @@ -0,0 +1,350 @@ +//! Forge ICOM (Internal Communication) Server +//! +//! A centralized hub server that enables real-time communication between multiple +//! Arma 3 game servers. The server maintains persistent connections with each game +//! server and routes events between them. +//! +//! # Architecture +//! +//! - **TCP Server**: Listens on port 9090 for incoming connections +//! - **Server Registry**: Maintains a map of connected servers by their ID +//! - **Message Router**: Forwards events to specific servers or broadcasts to all +//! - **Session Management**: Handles registration, disconnection, and duplicate connections +//! +//! # Protocol +//! +//! Communication uses line-delimited JSON messages. Each message is a JSON object +//! terminated with a newline character (`\n`). +//! +//! ## Message Types +//! +//! - **Register**: Client identifies itself with a server_id +//! - **Event**: Send event to a specific server +//! - **Broadcast**: Send event to all connected servers +//! - **Ack**: Acknowledgment of message receipt +//! - **Error**: Error notification +//! +//! # Usage +//! +//! ```bash +//! # Start the ICOM server +//! cargo run --bin forge-icom +//! ``` +//! +//! The server will listen on `0.0.0.0:9090` and accept connections from game servers. + +use forge_icom::Message; +use std::collections::HashMap; +use std::net::SocketAddr; +use std::sync::Arc; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::sync::{RwLock, mpsc, oneshot}; +use uuid::Uuid; + +mod config; + +/// Represents a connected Arma server +/// +/// Each connected server has: +/// - A unique server_id chosen by the client +/// - The socket address they connected from +/// - A message sender channel for outgoing messages +/// - A kill switch to terminate old connections when server reconnects +#[allow(dead_code)] +struct ServerConnection { + server_id: String, + addr: SocketAddr, + tx: mpsc::UnboundedSender, + kill_tx: oneshot::Sender<()>, +} + +/// Shared state across all connections +/// +/// The registry is wrapped in Arc> to allow safe concurrent access +/// from multiple connection handler tasks. +type ServerRegistry = Arc>>; + +/// Main entry point for the ICOM server +/// +/// Initializes the TCP listener and spawns a new task for each incoming connection. +/// The server runs indefinitely until interrupted (Ctrl+C) or encounters a fatal error. +/// +/// # Connection Handling +/// +/// Each connection is handled independently in its own async task, allowing the server +/// to manage many simultaneous connections efficiently. +#[tokio::main] +async fn main() -> Result<(), Box> { + println!("🔥 Forge ICOM Server starting..."); + println!(); + + // Load configuration + let config = config::load(); + let addr = config.server.bind_address(); + + println!(); + println!("Binding to {}", addr); + let listener = TcpListener::bind(&addr).await?; + println!("Server ready - listening for connections"); + + let registry: ServerRegistry = Arc::new(RwLock::new(HashMap::new())); + + loop { + let (socket, addr) = listener.accept().await?; + println!("New connection from {}", addr); + + let registry = Arc::clone(®istry); + tokio::spawn(async move { + if let Err(e) = handle_connection(socket, addr, registry).await { + eprintln!("Error handling connection from {}: {}", addr, e); + } + }); + } +} + +/// Handle an individual client connection +/// +/// This function manages the lifecycle of a single server connection: +/// +/// 1. Splits the socket into reader/writer for bidirectional communication +/// 2. Creates channels for outgoing messages and connection termination +/// 3. Spawns a writer task to handle outgoing messages asynchronously +/// 4. Enters a loop reading incoming messages and dispatching them +/// 5. Cleans up when the connection closes or is terminated +/// +/// # Arguments +/// +/// * `socket` - The TCP socket for this connection +/// * `addr` - The client's socket address +/// * `registry` - Shared registry of all connected servers +/// +/// # Duplicate Connections +/// +/// If a server with the same ID connects while already registered, the old +/// connection is terminated via its kill switch, allowing seamless reconnection. +async fn handle_connection( + socket: TcpStream, + addr: SocketAddr, + registry: ServerRegistry, +) -> Result<(), Box> { + let (reader, mut writer) = socket.into_split(); + let mut reader = BufReader::new(reader); + + // Create channel for outgoing messages + let (tx, mut rx) = mpsc::unbounded_channel::(); + + // Create kill switch channel + let (kill_tx, mut kill_rx) = oneshot::channel::<()>(); + + // Spawn task to handle outgoing messages + let writer_handle = tokio::spawn(async move { + while let Some(msg) = rx.recv().await { + if let Err(e) = writer.write_all(msg.as_bytes()).await { + eprintln!("Failed to write message: {}", e); + break; + } + if let Err(e) = writer.write_all(b"\n").await { + eprintln!("Failed to write newline: {}", e); + break; + } + } + }); + + let mut server_id: Option = None; + let mut line = String::new(); + let mut kill_tx = Some(kill_tx); + + loop { + line.clear(); + + let read_future = reader.read_line(&mut line); + + tokio::select! { + _ = &mut kill_rx => { + println!("Connection replaced by new session: {}", addr); + break; + } + res = read_future => { + match res { + Ok(0) => { + println!("Connection closed by {}", addr); + break; + } + Ok(_) => { + let trimmed = line.trim(); + if trimmed.is_empty() { + continue; + } + + match serde_json::from_str::(trimmed) { + Ok(msg) => { + match handle_message(msg, &mut server_id, addr, &tx, ®istry, &mut kill_tx).await { + Ok(_) => {} + Err(e) => { + let error_msg = Message::Error { + message: e.to_string(), + }; + let _ = tx.send(serde_json::to_string(&error_msg)?); + } + } + } + Err(e) => { + eprintln!("Failed to parse message from {}: {}", addr, e); + let error_msg = Message::Error { + message: format!("Invalid JSON: {}", e), + }; + let _ = tx.send(serde_json::to_string(&error_msg)?); + } + } + } + Err(e) => { + eprintln!("Error reading from {}: {}", addr, e); + break; + } + } + } + } + } + + // Cleanup on disconnect + if let Some(id) = server_id { + let mut registry = registry.write().await; + registry.remove(&id); + println!("Unregistered server: {}", id); + } + + writer_handle.abort(); + Ok(()) +} + +/// Process a received message and route it appropriately +/// +/// This function implements the core message routing logic: +/// +/// - **Register**: Adds the server to the registry with a new session ID +/// - **Event**: Forwards the event to the target server (or returns error if not found) +/// - **Broadcast**: Sends the event to all registered servers except the sender +/// - **Other**: Echoes back unhandled message types +/// +/// # Arguments +/// +/// * `msg` - The parsed message to handle +/// * `server_id` - Mutable reference to this connection's server ID (set on registration) +/// * `addr` - The client's socket address (for logging) +/// * `tx` - Channel sender for outgoing messages to this connection +/// * `registry` - Shared registry of all connected servers +/// * `kill_tx` - Kill switch for terminating this connection (consumed on registration) +/// +/// # Returns +/// +/// Returns `Ok(())` on success, or an error if message processing fails. +async fn handle_message( + msg: Message, + server_id: &mut Option, + addr: SocketAddr, + tx: &mpsc::UnboundedSender, + registry: &ServerRegistry, + kill_tx: &mut Option>, +) -> Result<(), Box> { + match msg { + Message::Register { server_id: id } => { + // Register the server + let session_id = Uuid::new_v4().to_string(); + + // Take kill_tx + let ktx = kill_tx + .take() + .ok_or("Cannot register twice or kill handle missing")?; + + let conn = ServerConnection { + server_id: id.clone(), + addr, + tx: tx.clone(), + kill_tx: ktx, + }; + + { + let mut registry = registry.write().await; + if let Some(old) = registry.insert(id.clone(), conn) { + println!("Disconnecting old session for {}", id); + let _ = old.kill_tx.send(()); + } + } + + *server_id = Some(id.clone()); + println!("Registered server: {} (session: {})", id, session_id); + + // Send acknowledgment + let response = Message::Registered { session_id }; + tx.send(serde_json::to_string(&response)?)?; + } + + Message::Broadcast { event_name, data } => { + // Broadcast to all servers except sender + let registry = registry.read().await; + let sender_id = server_id.as_ref(); + + println!("Broadcasting '{}' from {:?}", event_name, sender_id); + + for (id, conn) in registry.iter() { + if sender_id.map(|s| s == id).unwrap_or(false) { + continue; // Skip sender + } + + let event = Message::Event { + target_server: id.clone(), + event_name: event_name.clone(), + data: data.clone(), + }; + + if let Err(e) = conn.tx.send(serde_json::to_string(&event)?) { + eprintln!("Failed to send to {}: {}", id, e); + } + } + + // Ack to sender + let ack = Message::Ack { + message_id: None, + success: true, + error: None, + }; + tx.send(serde_json::to_string(&ack)?)?; + } + + Message::Event { + ref target_server, .. + } => { + // Forward to specific server + let registry = registry.read().await; + + if let Some(target) = registry.get(target_server) { + println!("Forwarding message to {}", target_server); + target.tx.send(serde_json::to_string(&msg)?)?; + + // Ack to sender + let ack = Message::Ack { + message_id: None, + success: true, + error: None, + }; + tx.send(serde_json::to_string(&ack)?)?; + } else { + let error = format!("Target server '{}' not found", target_server); + let ack = Message::Ack { + message_id: None, + success: false, + error: Some(error), + }; + tx.send(serde_json::to_string(&ack)?)?; + } + } + + _ => { + // Echo back unhandled messages + tx.send(serde_json::to_string(&msg)?)?; + } + } + + Ok(()) +} diff --git a/build-arma.ps1 b/build-arma.ps1 new file mode 100644 index 0000000..612f650 --- /dev/null +++ b/build-arma.ps1 @@ -0,0 +1,98 @@ +#!/usr/bin/env pwsh +<# +.SYNOPSIS + Build both arma/client and arma/server using hemtt + +.DESCRIPTION + This script runs hemtt build for both the client and server Arma mods. + It changes to each directory and runs the build command. + +.PARAMETER Target + Specify which target to build: 'client', 'server', or 'both' (default) + +.PARAMETER BuildUI + Rebuild the web UI bundles before running the client build. + +.EXAMPLE + .\build-arma.ps1 + Builds both client and server + +.EXAMPLE + .\build-arma.ps1 -Target client + Builds only the client + +.EXAMPLE + .\build-arma.ps1 -Target client -BuildUI + Rebuilds web UI bundles and then builds the client +#> + +param( + [Parameter(Mandatory=$false)] + [ValidateSet('client', 'server', 'both')] + [string]$Target = 'both', + + [Parameter(Mandatory=$false)] + [switch]$BuildUI +) + +$ErrorActionPreference = "Stop" +$scriptDir = $PSScriptRoot + +function Build-WebUIAssets { + Write-Host "`n=== Building Web UI Bundles ===" -ForegroundColor Cyan + + Push-Location $scriptDir + try { + & npm run build:webui + if ($LASTEXITCODE -ne 0) { + throw "Web UI bundle build failed with exit code $LASTEXITCODE" + } + Write-Host "✓ Web UI bundles built successfully" -ForegroundColor Green + } + finally { + Pop-Location + } +} + +function Build-HemttProject { + param( + [string]$ProjectPath, + [string]$ProjectName + ) + + Write-Host "`n=== Building $ProjectName ===" -ForegroundColor Cyan + + Push-Location $ProjectPath + try { + & hemtt utils fnl && hemtt build + if ($LASTEXITCODE -ne 0) { + throw "hemtt build failed for $ProjectName with exit code $LASTEXITCODE" + } + Write-Host "✓ $ProjectName build successful" -ForegroundColor Green + } + finally { + Pop-Location + } +} + +$clientPath = Join-Path $scriptDir "arma\client" +$serverPath = Join-Path $scriptDir "arma\server" + +try { + if ($Target -eq 'client' -or $Target -eq 'both') { + if ($BuildUI) { + Build-WebUIAssets + } + Build-HemttProject -ProjectPath $clientPath -ProjectName "Client" + } + + if ($Target -eq 'server' -or $Target -eq 'both') { + Build-HemttProject -ProjectPath $serverPath -ProjectName "Server" + } + + Write-Host "`n=== Build Complete ===" -ForegroundColor Green +} +catch { + Write-Host "`n✗ Build failed: $_" -ForegroundColor Red + exit 1 +} diff --git a/docs/ACTOR_USAGE_GUIDE.md b/docs/ACTOR_USAGE_GUIDE.md new file mode 100644 index 0000000..5d55248 --- /dev/null +++ b/docs/ACTOR_USAGE_GUIDE.md @@ -0,0 +1,143 @@ +# Actor Usage Guide + +The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization. + +## Storage Model + +Actor data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "loadout": {}, + "position": [1234.5, 6789.0, 0.0], + "direction": 90.0, + "stance": "STAND", + "email": "0160000000@spearnet.mil", + "phone_number": "0160000000", + "state": "HEALTHY", + "holster": true, + "rank": null, + "organization": "default" +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument and must be a 17-digit Steam + UID. +- `name` is optional, but cannot be empty when set and cannot exceed 50 + characters. +- `position` must be three finite numbers when set. +- `direction` must be in the `0.0 <= direction < 360.0` range. +- `email` must contain `@` and end with `.mil` when set. +- `phone_number` must start with `0160` and be 10 digits when set. +- Empty `phone_number`, `email`, or `organization` fields are filled on create. + +## Commands + +All commands are called on the `actor` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `actor:get` | `uid` | Actor JSON. If no actor exists, returns a default actor but does not persist it. | +| `actor:create` | `uid`, `actor_json` | Persisted actor JSON. | +| `actor:update` | `uid`, `patch_json` | Updated actor JSON. | +| `actor:exists` | `uid` | `true` or `false`. | +| `actor:delete` | `uid` | `OK`. | + +## Create an Actor + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _actor = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["loadout", getUnitLoadout player], + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["email", ""], + ["phone_number", ""], + ["state", "HEALTHY"], + ["holster", true], + ["organization", "default"] +]; + +private _result = "forge_server" callExtension ["actor:create", [ + getPlayerUID player, + toJSON _actor +]]; +``` + +## New Player Bootstrap + +The server actor store treats a player with no persisted actor as a new player. +After `actor:create` succeeds, the actor store runs onboarding once for that UID: + +- Initializes the player's phone state. +- Sends a Field Commander email from `field_commander` with the `Job Orientation` + subject and the generated phone number and email address. +- Sends two Field Commander text messages with the first-day instructions. +- Initializes the player's bank account if needed and adds `$2,000` to the bank + balance. + +This bootstrap is tied to persistent actor creation, not hot-state hydration, so +returning players and repaired partial actor records do not receive the welcome +messages or starting money again. + +## Update an Actor + +`actor:update` accepts a JSON object containing only fields to change. + +```sqf +private _patch = createHashMapFromArray [ + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["loadout", getUnitLoadout player] +]; + +private _result = "forge_server" callExtension ["actor:update", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +Supported patch fields are `name`, `position`, `direction`, `stance`, `email`, +`phone_number`, `state`, `holster`, `rank`, `organization`, and `loadout`. +`uid` is ignored. + +## Hot State + +The `actor:hot:*` commands keep a runtime copy of actor data and write it back +only when `actor:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `actor:hot:init` | `uid` | Actor JSON from durable storage. | +| `actor:hot:get` | `uid` | Actor JSON. | +| `actor:hot:keys` | none | JSON array of hot actor UIDs. | +| `actor:hot:override` | `uid`, `actor_json` | Actor JSON. | +| `actor:hot:save` | `uid` | Current hot actor JSON and async durable save. | +| `actor:hot:remove` | `uid` | `OK`. | + +Use hot state for frequently updated session data such as position and loadout. +Use durable commands for account creation and administrative changes. + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor error: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` diff --git a/docs/BANK_USAGE_GUIDE.md b/docs/BANK_USAGE_GUIDE.md new file mode 100644 index 0000000..5953c6f --- /dev/null +++ b/docs/BANK_USAGE_GUIDE.md @@ -0,0 +1,190 @@ +# Bank Usage Guide + +The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, PIN validation, and PIN +changes. + +## Storage Model + +Bank data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "bank": 1000.0, + "cash": 250.0, + "earnings": 0.0, + "pin": 1234, + "transactions": [] +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument. +- `name` cannot be empty. +- `bank` and `cash` cannot be negative. +- `pin` must be a four-digit number. +- Durable `bank:get` requires an existing bank account. + +## Durable Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `bank:create` | `uid`, `bank_json` | Persisted bank JSON. | +| `bank:get` | `uid` | Bank JSON. | +| `bank:update` | `uid`, `patch_json` | Updated bank JSON. | +| `bank:exists` | `uid` | `true` or `false`. | +| `bank:delete` | `uid` | `OK`. | + +## Create an Account + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _account = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["bank", 0], + ["cash", 0], + ["earnings", 0], + ["pin", 1234], + ["transactions", []] +]; + +private _result = "forge_server" callExtension ["bank:create", [ + getPlayerUID player, + toJSON _account +]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `bank:hot:init` | `uid` | Bank JSON loaded into hot state. | +| `bank:hot:get` | `uid` | Bank JSON. | +| `bank:hot:override` | `uid`, `bank_json` | Bank JSON. | +| `bank:hot:patch` | `uid`, `patch_json` | `{ account, patch }`. | +| `bank:hot:deposit` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:withdraw` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:deposit_earnings` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:transfer` | `source_uid`, `target_uid`, `amount`, `context_json` | Transfer result JSON. | +| `bank:hot:charge_checkout` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:validate_pin` | `uid`, `pin`, `context_json` | `{}` on success. | +| `bank:hot:change_pin` | `uid`, `current_pin`, `new_pin`, `context_json` | `{ account, patch }`. | +| `bank:hot:save` | `uid` | Current hot bank JSON and async durable save. | +| `bank:hot:remove` | `uid` | `OK`. | + +Use hot-state commands for UI workflows. They return patch objects so the UI can +update only changed fields. + +## Deposit and Withdraw + +ATM sessions require `atmAuthorized: true`. Full bank sessions can set +`mode: "bank"`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "atm"], + ["atmAuthorized", true] +]; + +private _deposit = "forge_server" callExtension ["bank:hot:deposit", [ + getPlayerUID player, + "100", + toJSON _context +]]; + +private _withdraw = "forge_server" callExtension ["bank:hot:withdraw", [ + getPlayerUID player, + "50", + toJSON _context +]]; +``` + +## Transfer + +Transfers are only available from the full bank interface. `fromField` can be +`bank` or `cash`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false], + ["fromField", "bank"] +]; + +private _result = "forge_server" callExtension ["bank:hot:transfer", [ + getPlayerUID player, + _targetUid, + "250", + toJSON _context +]]; +``` + +## Checkout Charge + +Checkout charging supports `sourceField: "cash"` or `sourceField: "bank"`. +Set `commit` to `false` to preview the patch without saving. + +```sqf +private _context = createHashMapFromArray [ + ["sourceField", "bank"], + ["commit", true] +]; + +private _result = "forge_server" callExtension ["bank:hot:charge_checkout", [ + getPlayerUID player, + "125", + toJSON _context +]]; +``` + +## PIN Validation + +PIN entry is only valid in ATM mode. + +```sqf +private _context = createHashMapFromArray [["mode", "atm"]]; + +private _result = "forge_server" callExtension ["bank:hot:validate_pin", [ + getPlayerUID player, + "1234", + toJSON _context +]]; +``` + +## PIN Changes + +PIN changes require the current PIN and a different four-digit new PIN. The +command is only valid from the full bank interface. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false] +]; + +private _result = "forge_server" callExtension ["bank:hot:change_pin", [ + getPlayerUID player, + "1234", + "5678", + toJSON _context +]]; +``` + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["bank:hot:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Bank error: %1", _payload]; +}; + +private _bank = fromJSON _payload; +``` diff --git a/docs/CAD_USAGE_GUIDE.md b/docs/CAD_USAGE_GUIDE.md new file mode 100644 index 0000000..e8e3663 --- /dev/null +++ b/docs/CAD_USAGE_GUIDE.md @@ -0,0 +1,191 @@ +# CAD Usage Guide + +The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle. + +## Data Model + +Most CAD records are flexible JSON objects. The service normalizes important +IDs and returns structured mutation results for higher-level workflows. + +Common generated IDs: + +- Orders: `cad-order:` +- Requests: `cad-request:` +- Assignments usually share a task ID or order ID. + +## Commands + +### Activity + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:activity:append` | `activity_json` | `OK`. | +| `cad:activity:recent` | `limit` | Recent activity array JSON. | + +### Assignments + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:assignments:list` | none | Assignment array JSON. | +| `cad:assignments:assign` | `entry_id`, `assignment_json` | Assignment mutation result JSON. | +| `cad:assignments:acknowledge` | `entry_id`, `patch_json` | Assignment mutation result JSON. | +| `cad:assignments:decline` | `entry_id`, `patch_json` | Assignment mutation result JSON and removes assignment. | +| `cad:assignments:upsert` | `entry_id`, `assignment_json` | `OK`. | +| `cad:assignments:delete` | `entry_id` | `OK`. | + +### Orders + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:orders:list` | none | Order array JSON. | +| `cad:orders:create` | `order_seed_json` | Dispatch order mutation result JSON. | +| `cad:orders:create_from_context` | `context_json` | Dispatch order mutation result JSON. | +| `cad:orders:close` | `entry_id` | Dispatch order mutation result JSON and removes order/assignment. | +| `cad:orders:upsert` | `entry_id`, `order_json` | `OK`. | +| `cad:orders:delete` | `entry_id` | `OK`. | + +### Requests + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:requests:list` | none | Request array JSON. | +| `cad:requests:submit` | `request_json` | Request mutation result JSON. | +| `cad:requests:submit_from_context` | `context_json` | Request mutation result JSON. | +| `cad:requests:close` | `entry_id` | Request mutation result JSON and removes request. | +| `cad:requests:upsert` | `entry_id`, `request_json` | `OK`. | +| `cad:requests:delete` | `entry_id` | `OK`. | + +### Profiles and Views + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:profiles:list` | none | Profile array JSON. | +| `cad:profiles:update_from_context` | `context_json` | Profile mutation result JSON. | +| `cad:profiles:upsert` | `entry_id`, `profile_json` | `OK`. | +| `cad:profiles:delete` | `entry_id` | `OK`. | +| `cad:groups:build` | `groups_seed_json` | Group array JSON. | +| `cad:view:hydrate` | `hydrate_seed_json` | Hydrated CAD payload JSON. | + +## Submit a Support Request + +```sqf +private _fields = createHashMapFromArray [ + ["pickup_location", "Grid 123456"], + ["precedence", "urgent"], + ["security", "secure"] +]; + +private _context = createHashMapFromArray [ + ["type", "medevac_9line"], + ["fields", _fields], + ["groupId", "alpha"], + ["groupCallsign", "Alpha 1-1"], + ["submittedByUid", getPlayerUID player], + ["submittedByName", name player], + ["priority", "emergency"], + ["position", getPosATL player], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [ + toJSON _context +]]; +``` + +Supported priority values are `routine`, `priority`, and `emergency`. Unknown +values normalize to `priority`. + +## Create a Dispatch Order + +```sqf +private _context = createHashMapFromArray [ + ["assigneeGroupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["targetGroupId", "alpha"], + ["targetGroupCallsign", "Alpha 1-1"], + ["targetPosition", getPosATL player], + ["createdByUid", getPlayerUID player], + ["createdByName", name player], + ["requestId", "cad-request:1"], + ["requestType", "logreq"], + ["requestTitle", "LOGREQ | Alpha 1-1"], + ["requestSummary", "Ammo resupply requested"], + ["requestFields", createHashMap], + ["note", "Support Alpha 1-1 at current position."], + ["priority", "priority"], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:orders:create_from_context", [ + toJSON _context +]]; +``` + +## Assignment Workflow + +Task contracts have two separate phases. Dispatch assignment reserves a +contract for a group and sets the CAD assignment state to `assigned`, but it +does not accept or start the task. The assigned group leader must acknowledge +the assignment before task ownership is bound and task logic starts. If the +leader declines, the CAD assignment is removed and the contract returns to the +open board. Task status follows the same lifecycle: `available` on creation, +`assigned` after dispatch assignment, and `active` after acknowledgement. + +```sqf +private _assignment = createHashMapFromArray [ + ["groupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["assignedByUid", getPlayerUID player], + ["assignedByName", name player], + ["assignedAt", diag_tickTime], + ["state", "assigned"] +]; + +"forge_server" callExtension ["cad:assignments:assign", [ + "task-123", + toJSON _assignment +]]; + +private _ack = createHashMapFromArray [ + ["state", "acknowledged"], + ["acknowledgedByUid", getPlayerUID player], + ["acknowledgedAt", diag_tickTime] +]; + +"forge_server" callExtension ["cad:assignments:acknowledge", [ + "task-123", + toJSON _ack +]]; +``` + +## Hydrate the CAD UI + +```sqf +private _session = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["orgId", "default"], + ["isDispatcher", true], + ["groupId", "alpha"], + ["isLeader", true] +]; + +private _seed = createHashMapFromArray [ + ["groups", _liveGroups], + ["activeTasks", _activeTasks], + ["session", _session] +]; + +private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["CAD error: %1", _payload]; +}; +``` diff --git a/docs/CLIENT_ACTOR_USAGE_GUIDE.md b/docs/CLIENT_ACTOR_USAGE_GUIDE.md new file mode 100644 index 0000000..dfda823 --- /dev/null +++ b/docs/CLIENT_ACTOR_USAGE_GUIDE.md @@ -0,0 +1,98 @@ +# Client Actor Usage Guide + +The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs. + +## Open the Actor Menu + +```sqf +call forge_client_actor_fnc_openUI; +``` + +The actor menu opens `RscActorMenu`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_actor_fnc_handleUIEvents`. + +## Repository + +`forge_client_actor_fnc_initRepository` creates `GVAR(ActorRepository)`. + +The repository: + +- requests actor initialization from the server +- saves actor state through the server actor addon +- caches client-visible actor fields +- applies position, direction, stance, rank, and loadout on JIP sync when the + relevant settings allow it +- provides nearby interaction actions to the browser UI + +Initialize actor state through the repository: + +```sqf +GVAR(ActorRepository) call ["init", []]; +``` + +Save actor state through the server: + +```sqf +GVAR(ActorRepository) call ["save", [true]]; +``` + +## Nearby Actions + +The menu asks for nearby actions with: + +```text +actor::get::actions +``` + +The repository scans objects within 5 meters and returns actions based on +mission object variables: + +| Variable | Action | +| --- | --- | +| `isStore` | store | +| `isAtm` | ATM | +| `isBank` | bank | +| `isGarage` | garage | +| `garageType` | garage subtype | +| `isLocker` | virtual arsenal action when VA is enabled | +| `deviceType` | device action placeholder | +| nearby player unit | player interaction placeholder | + +The response is pushed into the browser with `updateAvailableActions(...)`. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `actor::get::actions` | Refresh nearby actions. | +| `actor::close::menu` | Close actor menu. | +| `actor::open::atm` | Open bank UI in ATM mode. | +| `actor::open::bank` | Open bank UI in bank mode. | +| `actor::open::cad` | Open CAD UI. | +| `actor::open::garage` | Open garage UI. | +| `actor::open::vgarage` | Open virtual garage. | +| `actor::open::org` | Open organization UI. | +| `actor::open::vlocker` | Open ACE arsenal on `FORGE_Locker_Box`. | +| `actor::open::phone` | Open phone UI. | +| `actor::open::store` | Open store UI. | + +Device and player interaction events currently display placeholder feedback. + +## Authoritative State + +Actor persistence is server-owned. The client repository requests and displays +actor data, but actor creation, durable updates, and hot-state behavior are +handled by the server actor addon and extension. + +## Related Guides + +- [Actor Usage Guide](./ACTOR_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Client Organization Usage Guide](./CLIENT_ORG_USAGE_GUIDE.md) +- [Client Phone Usage Guide](./CLIENT_PHONE_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) diff --git a/docs/CLIENT_BANK_USAGE_GUIDE.md b/docs/CLIENT_BANK_USAGE_GUIDE.md new file mode 100644 index 0000000..8339b18 --- /dev/null +++ b/docs/CLIENT_BANK_USAGE_GUIDE.md @@ -0,0 +1,89 @@ +# Client Bank Usage Guide + +The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser. + +## Open Bank UI + +Open full bank mode: + +```sqf +call forge_client_bank_fnc_openUI; +``` + +Open ATM mode: + +```sqf +[true] call forge_client_bank_fnc_openUI; +``` + +The open function creates `RscBank`, sets the bridge mode to `bank` or `atm`, +loads `ui/_site/index.html`, and routes browser events through +`forge_client_bank_fnc_handleUIEvents`. + +## Bridge and Repository + +`forge_client_bank_fnc_initRepository` tracks account load and cached account +state. + +`forge_client_bank_fnc_initUIBridge` owns: + +- active browser control tracking +- bank/ATM mode +- browser ready handling +- account hydrate and sync responses +- deposit, withdrawal, transfer, earnings deposit, credit repayment, PIN + validation, and PIN change requests +- browser notice delivery + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `bank::ready` | Mark browser ready and request hydrate from the server. | +| `bank::refresh` | Request fresh bank hydrate data. | +| `bank::deposit::request` | Forward deposit amount to the server. | +| `bank::withdraw::request` | Forward withdrawal amount to the server. | +| `bank::transfer::request` | Forward target, source field, and amount. | +| `bank::depositEarnings::request` | Request earnings deposit. | +| `bank::repayCreditLine::request` | Request credit-line repayment. | +| `bank::pin::request` | Forward PIN validation request. | +| `bank::pin::change::request` | Forward current and new PIN values for a PIN change. | +| `bank::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +The bridge sends: + +| Event | Purpose | +| --- | --- | +| `bank::hydrate` | Full session/account payload. | +| `bank::sync` | Account patch or sync data. | +| `bank::notice` | UI-visible notice payload. | + +## Request Flow + +Example deposit flow: + +1. Browser sends `bank::deposit::request` with an `amount`. +2. Client bridge calls the server bank request event. +3. Server bank addon validates the request and calls bank hot-state logic. +4. Server response is caught by the client post-init event handlers. +5. Client bridge sends `bank::sync` or `bank::notice` back to the browser. + +## Authoritative State + +Balances, PIN authorization, transfers, checkout charges, credit lines, and +persistence are server-owned. The client should only display account data and +request mutations through server events. + +PIN changes are available from the full bank UI only. The browser validates the +current, new, and confirmation fields, but the server extension remains +authoritative and persists the updated PIN. + +## Related Guides + +- [Bank Usage Guide](./BANK_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) diff --git a/docs/CLIENT_CAD_USAGE_GUIDE.md b/docs/CLIENT_CAD_USAGE_GUIDE.md new file mode 100644 index 0000000..1af8a96 --- /dev/null +++ b/docs/CLIENT_CAD_USAGE_GUIDE.md @@ -0,0 +1,111 @@ +# Client CAD Usage Guide + +The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows. + +## Open CAD UI + +```sqf +call forge_client_cad_fnc_openUI; +``` + +The CAD UI opens `RscMapUI` and loads separate browser controls for: + +- top bar +- bottom bar +- side panel +- dispatcher board + +The native Arma map remains part of the same display. + +## Repository and Bridge + +`forge_client_cad_fnc_initRepository` caches the hydrated CAD payload, +selected mode, dispatch view, session data, groups, tasks, requests, and +assignments. + +`forge_client_cad_fnc_initUIBridge` owns: + +- ready state for side panel, top bar, and dispatcher board +- operations vs dispatch mode +- board vs map dispatch view +- hydrate requests +- task assignment, acknowledge, and decline requests +- dispatch order create/close requests +- support request submit/close requests +- group status, role, and profile requests +- map focus actions + +## Map Focus Behavior + +CAD list entries can drive the native map position without duplicating map +logic in the browser UI. In operations mode, assigned or accepted task cards, +roster member cards, and support request cards send focus events. In dispatch +map mode, group, contract, and support request cards use the same focus path. + +Task and support request focus uses the stored record position. Roster member +focus uses the member position included in the hydrated group roster. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `cad::topbar::ready` | Mark top bar ready and push top bar state. | +| `cad::ready` | Mark side panel ready and request hydrate. | +| `cad::dispatcher::ready` | Mark dispatcher board ready and push hydrate data. | +| `cad::mode::set` | Switch between operations and dispatch mode. | +| `cad::dispatchView::set` | Switch dispatch board/map view. | +| `cad::refresh` | Request fresh CAD hydrate data. | +| `cad::tasks::assign` | Assign a task to a group. | +| `cad::tasks::acknowledge` | Acknowledge assigned task. | +| `cad::tasks::decline` | Decline assigned task. | +| `cad::dispatchOrder::create` | Create dispatch order. | +| `cad::dispatchOrder::close` | Close dispatch order. | +| `cad::supportRequest::submit` | Submit support request. | +| `cad::supportRequest::close` | Close support request. | +| `cad::groups::status` | Update group status. | +| `cad::groups::role` | Update group role. | +| `cad::groups::profile` | Update status and role together. | +| `cad::groups::focus` | Center map on a group. | +| `cad::members::focus` | Center map on a group member. | +| `cad::tasks::focus` | Center map on a task. | +| `cad::requests::focus` | Center map on a support request. | +| `map::zoomIn` | Zoom native map in. | +| `map::zoomOut` | Zoom native map out. | +| `map::search` | Placeholder status update. | +| `map::close` | Dispose bridge state and close the display. | + +## Response Events + +The bridge pushes: + +| Event | Purpose | +| --- | --- | +| `cad::hydrate` | Full hydrated CAD payload to the side panel. | +| `cad::assignment::response` | Task assignment/acknowledge/decline result. | +| `cad::group::response` | Group status/role/profile result. | +| `cad::request::response` | Support request result. | + +Dispatcher board controls also receive direct `ExecJS` status and hydrate +calls. + +## Task Compatibility + +CAD task visibility depends on server-side task catalog entries. Tasks created +through Eden Forge task modules or `forge_server_task_fnc_startTask` are the +normal CAD-compatible task sources because they register task catalog data. + +Direct handler or task-function calls only work with CAD when the task catalog +entry already exists. + +## Authorization Notes + +Only dispatcher sessions can enter dispatch mode. If the hydrated session is +not a dispatcher, the bridge forces the UI back to operations mode. + +## Related Guides + +- [CAD Usage Guide](./CAD_USAGE_GUIDE.md) +- [Task Usage Guide](./TASK_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) diff --git a/docs/CLIENT_COMMON_USAGE_GUIDE.md b/docs/CLIENT_COMMON_USAGE_GUIDE.md new file mode 100644 index 0000000..754d6c8 --- /dev/null +++ b/docs/CLIENT_COMMON_USAGE_GUIDE.md @@ -0,0 +1,92 @@ +# Client Common Usage Guide + +The client `common` addon contains shared browser UI bridge declarations and +common client-side browser integration patterns. + +## Purpose + +Use `forge_client_common` when a browser-backed feature UI needs reusable +screen lifecycle behavior: + +- active browser control tracking +- browser ready state +- pending event queues +- `ExecJS` payload delivery +- shared bridge object inheritance through `createHashMapObject` + +Feature addons still own their app-specific events and server RPC mapping. + +## Shared Bridge + +Initialize the bridge declarations with: + +```sqf +private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge; +private _bridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; +``` + +Feature bridges can inherit from the shared declaration: + +```sqf +GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _bridgeDeclaration], + ["#type", "MyUIBridgeBaseClass"], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self call ["setActiveBrowserControl", [_control]]; + _self call ["sendEvent", ["myAddon::hydrate", createHashMap, _control]]; + }] +]; +``` + +## Event Delivery + +`sendEvent` builds this payload: + +```json +{ + "event": "myAddon::event", + "data": {} +} +``` + +If the browser control is missing or not ready, the payload is queued on the +screen object. When the screen marks ready, `flushPendingEvents` delivers the +queue. + +## Screen Lifecycle + +The shared screen object tracks: + +| Field | Purpose | +| --- | --- | +| `control` | Active browser control. | +| `readyState` | Whether the browser app has sent its ready event. | +| `pendingEvents` | Outbound events waiting for a ready browser. | + +Call `handleClose` or `dispose` when a display closes so stale controls and +queued events are cleared. + +## Current Consumers + +The common bridge pattern is used by the newer bank, CAD, garage, and +organization client bridges. Store currently keeps its own bridge object and +browser bridge function names. + +## Usage Rules + +- Keep bridge inheritance in feature addons thin and explicit. +- Keep shared code generic; do not add bank, CAD, org, or store-specific logic + to `common`. +- Prefer namespaced events such as `garage::sync`. +- Send hash maps or arrays that can be safely serialized with `toJSON`. +- Avoid direct extension calls from the client bridge; send CBA server events. + +## Related Guides + +- [Client Usage Guide](./CLIENT_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Organization Usage Guide](./CLIENT_ORG_USAGE_GUIDE.md) diff --git a/docs/CLIENT_GARAGE_USAGE_GUIDE.md b/docs/CLIENT_GARAGE_USAGE_GUIDE.md new file mode 100644 index 0000000..f076ac1 --- /dev/null +++ b/docs/CLIENT_GARAGE_USAGE_GUIDE.md @@ -0,0 +1,114 @@ +# Client Garage Usage Guide + +The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view. + +## Open Garage UI + +```sqf +call forge_client_garage_fnc_openUI; +``` + +The garage UI opens `RscGarage`, loads `ui/_site/index.html`, and routes +browser events through `forge_client_garage_fnc_handleUIEvents`. + +## Open Virtual Garage + +```sqf +call forge_client_garage_fnc_openVG; +``` + +The virtual garage resolves the active interaction object near the player, +discovers nearby `garage*` markers placed in Eden, chooses the matching spawn +lane for the selected vehicle type, opens the BIS garage interface, and +restricts the available vehicle lists from the virtual garage repository. When +the BIS garage closes, only the vehicle selected in that virtual garage session +is finalized and spawned onto the resolved lane. + +## Client Services + +| Service | Purpose | +| --- | --- | +| `GarageRepository` | Player garage view state. | +| `VGRepository` | Virtual garage unlock view state. | +| `GarageHelperService` | Vehicle names, hit points, and payload helpers. | +| `GarageContextService` | Nearby/current vehicle context. | +| `GaragePayloadService` | Browser hydrate payload construction. | +| `GarageActionService` | Store/retrieve request handling and selected nearby vehicle refuel/repair request forwarding. | +| `GarageUIBridge` | Browser ready, hydrate, and sync delivery. | + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `garage::ready` | Mark browser ready and send `garage::hydrate`. | +| `garage::refresh` | Send current garage payload as `garage::sync`. | +| `garage::vehicle::retrieve::request` | Forward retrieve request through the action service. | +| `garage::vehicle::store::request` | Forward store request through the action service. | +| `garage::vehicle::refuel::request` | Forward selected nearby vehicle refuel request to the server economy service. | +| `garage::vehicle::repair::request` | Forward selected nearby vehicle repair request to the server economy service. | +| `garage::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `garage::hydrate` | Initial vehicle and session payload. | +| `garage::sync` | Refreshed vehicle payload. | +| `garage::service::success` | Browser notice for accepted refuel/rearm/repair requests. | +| `garage::service::failure` | Browser notice for rejected refuel/rearm/repair requests. | + +Server action responses are handled by the action service and notification +flow. + +## Vehicle Service + +The selected vehicle detail panel includes refuel, rearm, and repair actions for nearby +world vehicles. Stored records must be retrieved first because server economy +services operate on live vehicle objects, not stored garage records. + +Refuel requests use the server economy `RefuelService` event. Rearm requests +use `RearmService`. Repair requests use `RepairService`. These services are +billed by the server economy addon through organization funds. + +## Mission Setup + +Garage interactions are normally surfaced through the actor menu when nearby +objects have garage variables such as: + +```sqf +_object setVariable ["isGarage", true, true]; +_object setVariable ["garageType", "cars", true]; +``` + +When using the server garage auto-init flow, editor-placed objects whose +variable names contain `garage` are marked as garage interaction points and +their `garageType` can be inferred from the name. + +Virtual garage spawn lanes are resolved from empty markers placed in Eden. The +marker name should contain `garage` and one of the six supported category names: +`cars`, `armor`, `helis`, `planes`, `naval`, or `other`. Markers are matched to +the nearby interaction object by proximity, and names that include the garage +object's variable name are preferred when multiple garages exist. + +Vehicle spawning is strict by category. If the active garage site does not have +a matching local marker for the vehicle category being retrieved or spawned from +the virtual garage, the request is blocked and the player is shown a message. + +Nearby world vehicles are not used as virtual garage spawn candidates. They are +only checked to determine whether the resolved spawn position is blocked. If +any vehicle is within 5 meters of the spawn marker when the virtual garage is +opened, the session is blocked and the player is shown a warning. + +## Authoritative State + +The client gathers vehicle context and sends store/retrieve requests. Stored +vehicle state, validation, spawning, removal, and persistence are owned by the +server garage addon and extension. + +## Related Guides + +- [Garage Usage Guide](./GARAGE_USAGE_GUIDE.md) +- [Client Actor Usage Guide](./CLIENT_ACTOR_USAGE_GUIDE.md) +- [Client Notifications Usage Guide](./CLIENT_NOTIFICATIONS_USAGE_GUIDE.md) diff --git a/docs/CLIENT_LOCKER_USAGE_GUIDE.md b/docs/CLIENT_LOCKER_USAGE_GUIDE.md new file mode 100644 index 0000000..dc8d724 --- /dev/null +++ b/docs/CLIENT_LOCKER_USAGE_GUIDE.md @@ -0,0 +1,87 @@ +# Client Locker Usage Guide + +The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state. + +## Repositories + +`forge_client_locker_fnc_initRepository` creates `GVAR(LockerRepository)`. + +`forge_client_locker_fnc_initVARepository` creates `GVAR(VARepository)`. + +Initialize locker state: + +```sqf +GVAR(LockerRepository) call ["init", []]; +GVAR(VARepository) call ["init", []]; +``` + +## Locker Container Flow + +The repository searches mission namespace variables whose names contain +`locker` and refer to objects. For each server/mission locker object, it creates +a local `Box_NATO_Equip_F` at the same position and attaches container event +handlers. + +On container open: + +- the local container is cleared +- cached locker items are inserted into the container +- over-capacity warnings are emitted when the item count is above 25 + +On container close: + +- cargo, nested container items, and weapon attachments are read back +- the new locker map is sent to the server with the override request +- the local repository cache is updated + +## Virtual Arsenal Flow + +The virtual arsenal repository creates a local `FORGE_Locker_Box` and requests +virtual arsenal unlocks from the server. + +As sync data arrives, it applies unlocks through ACE Arsenal: + +| Data key | Client behavior | +| --- | --- | +| `items` | Add virtual items. | +| `weapons` | Add virtual weapons. | +| `magazines` | Add virtual magazines. | +| `backpacks` | Add virtual backpacks. | + +The actor menu opens the virtual locker with: + +```sqf +[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox; +``` + +## Server Events + +The client repository sends requests for: + +- locker initialization +- locker save +- locker override after container close +- virtual arsenal initialization +- virtual arsenal save + +The server locker addon and extension own the saved locker and virtual arsenal +state. + +## Mission Setup + +Mission locker objects must be placed into `missionNamespace` with a variable +name containing `locker`. The client creates local interactive containers from +those authoritative mission objects. + +Example: + +```sqf +missionNamespace setVariable ["forge_locker_alpha", _lockerObject, true]; +``` + +## Related Guides + +- [Locker Usage Guide](./LOCKER_USAGE_GUIDE.md) +- [Owned Storage Usage Guide](./OWNED_STORAGE_USAGE_GUIDE.md) +- [Client Actor Usage Guide](./CLIENT_ACTOR_USAGE_GUIDE.md) diff --git a/docs/CLIENT_MAIN_USAGE_GUIDE.md b/docs/CLIENT_MAIN_USAGE_GUIDE.md new file mode 100644 index 0000000..0ac8fbf --- /dev/null +++ b/docs/CLIENT_MAIN_USAGE_GUIDE.md @@ -0,0 +1,48 @@ +# Client Main Usage Guide + +The client `main` addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons. + +## Purpose + +Use `forge_client_main` as the foundation dependency for client addons that +need Forge macros, function naming, settings, or mod-level configuration. + +Feature logic should stay in the owning addon. `main` should remain limited to +shared client configuration and compile infrastructure. + +## Key Files + +| File | Purpose | +| --- | --- | +| `script_mod.hpp` | Client mod identity. | +| `script_version.hpp` | Client mod version values. | +| `script_macros.hpp` | Shared client macros. | +| `CfgSettings.hpp` | Client CBA settings. | +| `config.cpp` | Addon config and mod wiring. | + +## Dependency Pattern + +Feature addons normally depend on `forge_client_main` in their `config.cpp`. + +```cpp +class forge_client_example { + requiredAddons[] = { + "forge_client_main" + }; +}; +``` + +## Usage Notes + +- Put domain UI, repositories, and event handling in feature addons. +- Put reusable browser bridge behavior in `forge_client_common`. +- Put server-only behavior in `arma/server/addons`. +- Keep settings in `CfgSettings.hpp` when they apply to the client mod as a + whole or to a client feature toggle. + +## Related Guides + +- [Client Usage Guide](./CLIENT_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) +- [Development Guide](./DEVELOPMENT_GUIDE.md) diff --git a/docs/CLIENT_NOTIFICATIONS_USAGE_GUIDE.md b/docs/CLIENT_NOTIFICATIONS_USAGE_GUIDE.md new file mode 100644 index 0000000..e102583 --- /dev/null +++ b/docs/CLIENT_NOTIFICATIONS_USAGE_GUIDE.md @@ -0,0 +1,74 @@ +# Client Notifications Usage Guide + +The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules. + +## Runtime Behavior + +The notification display is created during client initialization. The browser +HUD sends: + +```text +notifications::ready +``` + +When that event is received, `NotificationService` initializes and sends a +startup notification. + +## Create a Notification + +Use the notification service when available: + +```sqf +GVAR(NotificationService) call ["create", [ + "success", + "Title", + "Notification text.", + 4000 +]]; +``` + +Arguments: + +| Argument | Purpose | +| --- | --- | +| `_type` | Notification type, such as `success`, `info`, `warning`, or `error`. | +| `_title` | Notification title. | +| `_content` | Notification body text. | +| `_duration` | Display duration in milliseconds. | + +The service dispatches a browser `forge:notify` custom event. + +## CBA Event Surface + +Other addons can use the client notification event: + +```sqf +["forge_client_notifications_recieveNotification", [ + "warning", + "Garage", + "Vehicle spawn position is blocked.", + 3000 +]] call CBA_fnc_localEvent; +``` + +The event payload is: + +```sqf +[_type, _title, _content, _duration] +``` + +## Usage Rules + +- Use the shared notification service instead of opening separate transient + browser UIs. +- Keep server-driven player feedback short and actionable. +- Treat notification state as transient client UI state. +- Do not use notifications as the only record of durable domain changes. + +## Related Guides + +- [Client Usage Guide](./CLIENT_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) diff --git a/docs/CLIENT_ORG_USAGE_GUIDE.md b/docs/CLIENT_ORG_USAGE_GUIDE.md new file mode 100644 index 0000000..2340a03 --- /dev/null +++ b/docs/CLIENT_ORG_USAGE_GUIDE.md @@ -0,0 +1,131 @@ +# Client Organization Usage Guide + +The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display. + +Organization registration requires $50,000 in personal funds. The server org +addon enforces and charges the fee; the browser only displays the requirement +and submits the registration request. + +## Open Organization UI + +```sqf +call forge_client_org_fnc_openUI; +``` + +The UI opens `RscOrg`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_org_fnc_handleUIEvents`. + +## Repository and Bridge + +`forge_client_org_fnc_initRepository` caches organization portal state. + +`forge_client_org_fnc_initUIBridge` owns: + +- active browser control tracking +- portal hydrate requests +- create/login response routing +- leave and disband requests +- credit-line assignment requests +- payroll and treasury transfer requests +- invite, accept invite, and decline invite requests +- targeted browser response events + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `org::ready` | Mark browser ready and request `org::sync`. | +| `org::login::request` | Request portal hydrate as `org::login::success`. | +| `org::create::request` | Validate org name and request creation on server. | +| `org::disband::request` | Request disband on server. | +| `org::leave::request` | Request leave on server. | +| `org::credit::request` | Request credit-line assignment. | +| `org::payroll::request` | Request payroll payout from the organization treasury. | +| `org::transfer::request` | Request treasury transfer to a member. | +| `org::invite::request` | Request member invite. | +| `org::invite::accept` | Accept invite by org ID. | +| `org::invite::decline` | Decline invite by org ID. | +| `org::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `org::sync` | Full portal sync payload. | +| `org::login::success` | Login hydrate payload. | +| `org::create::success` | Creation hydrate payload. | +| `org::create::failure` | Creation validation or server failure. | +| `org::disband::success` | Requester disband success. | +| `org::disband::failure` | Disband failure. | +| `org::portal::revoked` | Portal state revoked by someone else's disband action. | +| `org::leave::success` | Leave success. | +| `org::leave::failure` | Leave failure. | +| `org::credit::success` | Credit-line request success. | +| `org::credit::failure` | Credit-line request failure. | +| `org::member::creditUpdated` | Targeted member credit-line patch. | +| `org::invite::success` | Invite success. | +| `org::invite::failure` | Invite failure. | +| `org::invite::decision::success` | Invite accept/decline success. | +| `org::invite::decision::failure` | Invite accept/decline failure. | + +## Request Examples + +Create organization request payload: + +```json +{ + "orgName": "Example Logistics" +} +``` + +Credit-line request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 2500 +} +``` + +Payroll request payload: + +```json +{ + "amount": 1000 +} +``` + +Treasury transfer request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 1000 +} +``` + +Invite request payload: + +```json +{ + "targetUid": "76561198000000000", + "targetName": "Player Name" +} +``` + +## Authoritative State + +Organization funds, reputation, membership, invites, credit lines, assets, +fleet, and persistence are server-owned. The client portal only displays and +requests changes. + +## Related Guides + +- [Organization Usage Guide](./ORG_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) diff --git a/docs/CLIENT_PHONE_USAGE_GUIDE.md b/docs/CLIENT_PHONE_USAGE_GUIDE.md new file mode 100644 index 0000000..f085d7d --- /dev/null +++ b/docs/CLIENT_PHONE_USAGE_GUIDE.md @@ -0,0 +1,108 @@ +# Client Phone Usage Guide + +The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms. + +## Open Phone UI + +```sqf +call forge_client_phone_fnc_openUI; +``` + +The phone UI creates `RscPhone`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_phone_fnc_handleUIEvents`. + +## State Ownership + +Contacts, messages, and emails are server-owned and requested through the +server phone addon. + +Local utility app state is stored in `profileNamespace`: + +- notes +- calendar events +- world clocks +- alarms +- theme/preferences + +## Phone Repository + +`forge_client_phone_fnc_initRepository` creates `GVAR(PhoneRepository)`. + +The phone repository owns local notes, events, clocks, alarms, and settings +helpers. +Contacts, messages, and emails continue to use server-backed request/response +events. + +## Browser Events + +### Session and Preferences + +| Event | Client behavior | +| --- | --- | +| `phone::get::player` | Send player UID to browser with `setPlayerUid`. | +| `phone::get::theme` | Send saved light/dark theme to browser. | +| `phone::set::theme` | Save theme preference to `profileNamespace`. | + +### Contacts + +| Event | Client behavior | +| --- | --- | +| `phone::get::contacts` | Load cached contacts and request server refresh. | +| `phone::refresh::contacts` | Request contacts from server. | +| `phone::add::contact` | Add contact by phone number. | +| `phone::add::contact::by::phone` | Add contact by phone number. | +| `phone::add::contact::by::email` | Add contact by email. | +| `phone::remove::contact` | Remove contact by UID. | + +### Messages + +| Event | Client behavior | +| --- | --- | +| `phone::get::messages` | Request messages from server. | +| `phone::get::message::thread` | Request thread with another UID. | +| `phone::send::message` | Send SMS through server. | +| `phone::mark::message::read` | Mark message read on server. | +| `phone::delete::message` | Delete message on server. | + +### Email + +| Event | Client behavior | +| --- | --- | +| `phone::get::emails` | Request emails from server. | +| `phone::send::email` | Send email through server. | +| `phone::mark::email::read` | Mark email read on server. | +| `phone::delete::email` | Delete email on server. | + +### Local Utility Apps + +| Event | Client behavior | +| --- | --- | +| `phone::get::notes` | Load local notes. | +| `phone::save::note` | Save local note. | +| `phone::delete::note` | Delete local note. | +| `phone::get::events` | Load local calendar events. | +| `phone::save::event` | Save local calendar event. | +| `phone::delete::event` | Delete local calendar event. | +| `phone::get::clocks` | Load local world clocks. | +| `phone::save::clock` | Save local world clock. | +| `phone::delete::clock` | Delete local world clock. | +| `phone::get::alarms` | Load local alarms. | +| `phone::save::alarm` | Save local alarm. | +| `phone::delete::alarm` | Delete local alarm. | +| `phone::toggle::alarm` | Toggle local alarm enabled state. | + +## Usage Rules + +- Send contact, message, and email mutations to the server phone addon. +- Keep local-only utility apps in `profileNamespace` until they are migrated to + server-backed storage. +- Do not treat local phone utility state as shared multiplayer state. +- Validate required UID, phone, email, subject, and message fields before + sending server requests. + +## Related Guides + +- [Phone Usage Guide](./PHONE_USAGE_GUIDE.md) +- [Client Notifications Usage Guide](./CLIENT_NOTIFICATIONS_USAGE_GUIDE.md) diff --git a/docs/CLIENT_STORE_USAGE_GUIDE.md b/docs/CLIENT_STORE_USAGE_GUIDE.md new file mode 100644 index 0000000..3078d3c --- /dev/null +++ b/docs/CLIENT_STORE_USAGE_GUIDE.md @@ -0,0 +1,92 @@ +# Client Store Usage Guide + +The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests. + +## Open Store UI + +```sqf +call forge_client_store_fnc_openUI; +``` + +The UI opens `RscStore`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_store_fnc_handleUIEvents`. + +## Bridge + +`forge_client_store_fnc_initUIBridge` owns: + +- browser control lookup +- store hydrate requests +- category requests +- checkout requests +- category hydrate/failure responses +- checkout success/failure responses +- store config refresh after successful checkout + +Store currently uses its own `StoreUIBridge.receive(...)` browser bridge rather +than the shared `ForgeBridge.receive(...)` delivery used by newer bridges. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `store::ready` | Request store hydrate from the server. | +| `store::category::request` | Request catalog items for a category. | +| `store::checkout::request` | Forward checkout JSON to the server. | +| `store::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `store::hydrate` | Initial storefront/session/config payload. | +| `store::config::hydrate` | Refreshed payment/source config. | +| `store::category::hydrate` | Category catalog payload. | +| `store::category::failure` | Category request failure. | +| `store::checkout::success` | Checkout success payload. | +| `store::checkout::failure` | Checkout failure payload. | + +## Category Requests + +Category requests require a non-empty category value. + +```json +{ + "category": "weapons" +} +``` + +The client lowercases the category before forwarding it to the server store +addon. + +## Checkout Requests + +Checkout requests send a serialized checkout payload: + +```json +{ + "checkoutJson": "{\"items\":[],\"paymentSource\":\"cash\"}" +} +``` + +The client only forwards the checkout data. The server store addon and +extension validate prices, inventory grants, payment source authorization, and +integration with bank, organization, locker, and garage state. + +After a successful checkout, the client asks the server for a fresh store config +payload so payment-source balances and permissions stay current. + +## Authoritative State + +Catalog data, prices, checkout validation, money movement, organization funds, +credit lines, locker grants, garage grants, and persistence are server-owned. + +## Related Guides + +- [Store Usage Guide](./STORE_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client Organization Usage Guide](./CLIENT_ORG_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) diff --git a/docs/CLIENT_USAGE_GUIDE.md b/docs/CLIENT_USAGE_GUIDE.md new file mode 100644 index 0000000..23f74f1 --- /dev/null +++ b/docs/CLIENT_USAGE_GUIDE.md @@ -0,0 +1,125 @@ +# Client Usage Guide + +Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons. + +Use this guide as the entry point for client-side integration. Domain data, +validation, persistence, rewards, ownership, and checkout behavior remain +server-side responsibilities. + +## Client Responsibilities + +- Open Arma displays and `CT_WEBBROWSER` controls. +- Load browser UI assets from each addon's `ui/_site` folder. +- Receive browser alerts through `JSDialog` handlers. +- Translate browser events into local actions or CBA server events. +- Cache display state in client repositories. +- Push server responses back into browser UIs with `ExecJS`. +- Provide local-only utility state where the feature is intentionally local. + +## Authoritative Boundaries + +Client repositories are view state. They are useful for rendering, local UI +decisions, and short-lived session behavior, but they should not be treated as +durable state. + +Authoritative state lives in: + +- server SQF addons for mission and player workflow ownership +- the `forge_server` extension for durable and hot-state domain logic +- SurrealDB where the extension persists durable domain records + +## Common Runtime Flow + +Most browser-backed client addons follow this shape: + +1. The addon creates a display, finds a browser control, and registers a + `JSDialog` event handler. +2. The browser loads an HTML entrypoint from `ui/_site`. +3. The browser sends JSON alerts with an `event` name and `data` payload. +4. `fnc_handleUIEvents.sqf` parses the alert and routes the event. +5. A bridge object or repository sends a CBA server event when server data is + needed. +6. Server responses are caught in `XEH_postInitClient.sqf`. +7. The bridge sends browser update events back through `ExecJS`. + +Browser alert payload: + +```json +{ + "event": "module::action", + "data": {} +} +``` + +## Open UI Entry Points + +| UI | Entry point | +| --- | --- | +| Actor menu | `call forge_client_actor_fnc_openUI;` | +| Bank | `call forge_client_bank_fnc_openUI;` | +| ATM | `[true] call forge_client_bank_fnc_openUI;` | +| CAD | `call forge_client_cad_fnc_openUI;` | +| Garage | `call forge_client_garage_fnc_openUI;` | +| Virtual garage | `call forge_client_garage_fnc_openVG;` | +| Organization portal | `call forge_client_org_fnc_openUI;` | +| Phone | `call forge_client_phone_fnc_openUI;` | +| Store | `call forge_client_store_fnc_openUI;` | + +Notifications are normally opened during client initialization and then updated +through the notification event/service. + +## Addon Guides + +- [Client Main Usage Guide](./CLIENT_MAIN_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) +- [Client Actor Usage Guide](./CLIENT_ACTOR_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Client Notifications Usage Guide](./CLIENT_NOTIFICATIONS_USAGE_GUIDE.md) +- [Client Organization Usage Guide](./CLIENT_ORG_USAGE_GUIDE.md) +- [Client Phone Usage Guide](./CLIENT_PHONE_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) + +## Extension Calls + +Client addons should usually call server SQF events, not the `forge_server` +extension directly. The server addon owns validation context and converts the +request into extension commands. + +Example: + +```sqf +[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent); +``` + +Direct extension calls from client code bypass server authorization boundaries +and should be avoided. + +## Browser Bridge Notes + +`forge_client_common_fnc_initWebUIBridge` provides reusable bridge and screen +objects for newer browser UIs. It queues outbound events until a browser screen +is ready, then delivers payloads through: + +```sqf +_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]]; +``` + +Feature addons still own their event names, request payloads, and response +mapping. + +## Development Checklist + +- Keep feature-specific behavior in the owning addon. +- Send authoritative changes to the server addon. +- Use namespaced browser events such as `bank::deposit::request`. +- Treat `profileNamespace` as local player preference or utility state only. +- Make browser-ready events request the current server state before rendering + stale data. +- Queue or ignore bridge responses when the display is closed. +- Keep mission object setup on the mission/server side and client display logic + on the client side. diff --git a/docs/DEVELOPMENT_GUIDE.md b/docs/DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000..ce7f54e --- /dev/null +++ b/docs/DEVELOPMENT_GUIDE.md @@ -0,0 +1,134 @@ +# Development Guide + +This guide covers the usual path for adding or changing a Forge module. + +## Local Checks + +Before running storage-backed workflows locally, complete +[SurrealDB Setup](./surrealdb-setup.md). A local or dedicated server launch must +have SurrealDB running and a `config.toml` beside `forge_server_x64.dll` that +matches the running database. + +Run these before pushing Rust or extension changes: + +```powershell +cargo fmt --check +cargo check +cargo test +cargo build +cargo clippy --all-targets --all-features -- -D warnings +``` + +Run this after changing browser UI sources: + +```powershell +npm run build:webui +``` + +Build Arma packages with: + +```powershell +.\build-arma.ps1 +``` + +## Module Boundaries + +Keep each layer responsible for one kind of work: + +| Layer | Owns | Avoid | +| --- | --- | --- | +| `lib/models` | Data structures, serde defaults, validation helpers. | Database calls, SQF-specific context. | +| `lib/repositories` | Repository traits and in-memory stores. | SurrealDB-specific code. | +| `lib/services` | Business rules, workflow orchestration, structured results. | Arma engine calls, extension transport details. | +| `arma/server/extension` | Command parsing, context resolution, SurrealDB implementations, serialization to SQF. | Business rules that belong in services. | +| `arma/server/addons` | Server SQF lifecycle, game-object integration, calls into `forge_server`. | Direct database logic. | +| `arma/client/addons` | Client UI, keybinds, local UI events. | Authoritative persistence. | + +## Adding a Domain Module + +1. Add the model in `lib/models/src/.rs`. +2. Export the model from `lib/models/src/lib.rs`. +3. Add repository traits in `lib/repositories/src/.rs`. +4. Add in-memory repository support if the service needs tests or hot state. +5. Export the traits from `lib/repositories/src/lib.rs`. +6. Add service logic in `lib/services/src/.rs`. +7. Add focused unit tests for service behavior. +8. Export the service from `lib/services/src/lib.rs`. +9. Add a SurrealDB schema module under `arma/server/extension/src/schema`. +10. Add the concrete storage adapter under `arma/server/extension/src/storage`. +11. Register the storage adapter in `arma/server/extension/src/storage.rs`. +12. Add an extension command group under `arma/server/extension/src/.rs`. +13. Register the command group in `arma/server/extension/src/lib.rs`. +14. Add server addon functions under `arma/server/addons/` if SQF needs a module-level API. +15. Add client addon or browser UI files under `arma/client/addons/` if the module has player-facing UI. +16. Add documentation in `docs/` and module-level READMEs. + +## Extension Command Rules + +Commands should return one of these forms: + +- JSON string for structured results. +- `"true"` or `"false"` for simple existence and boolean operations. +- `"OK"` for successful destructive operations with no response body. +- `"Error: "` for failures. + +Prefer stable JSON shapes over ad hoc strings. SQF callers should always check +for the `"Error:"` prefix before parsing JSON. + +Example: + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor request failed: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` + +## Persistence Rules + +SurrealDB is the durable store. Keep database-specific mapping in the extension +storage adapters, not in services or repository traits. + +When changing persisted data: + +- Update or add the matching `.surql` schema module. +- Update the concrete storage adapter. +- Preserve existing records when possible through serde defaults or migration + logic. +- Add tests at the service level for behavior, and add storage tests only when + database mapping is the risk. + +## Hot-State Rules + +Use hot state for data that is read or mutated frequently during a player +session. Hot-state modules usually provide: + +- `init` to load durable state into memory. +- `get` to read the runtime copy. +- `override` or focused mutation commands to update the runtime copy. +- `save` to write the runtime copy back to SurrealDB. +- `remove` to evict the runtime copy. + +Do not assume hot state is durable until `save` succeeds. + +## Web UI Rules + +Browser UI source files live under each client addon. Built assets usually land +under that addon's `ui/_site` directory. + +Use the existing common bridge in `arma/client/addons/common` when a UI needs +to send events back to SQF. Keep UI state and rendering in JavaScript, and keep +server-authoritative decisions in server SQF or Rust services. + +## Documentation Checklist + +When adding or changing a module, update: + +- `docs/MODULE_REFERENCE.md` for framework-level inventory. +- A module-specific README in the addon directory when SQF or UI usage changes. +- `arma/server/docs/api-reference.md` when extension commands change. +- Existing usage guides when payload shapes or workflows change. diff --git a/docs/ECONOMY_USAGE_GUIDE.md b/docs/ECONOMY_USAGE_GUIDE.md new file mode 100644 index 0000000..eefa8cc --- /dev/null +++ b/docs/ECONOMY_USAGE_GUIDE.md @@ -0,0 +1,95 @@ +# Economy Usage Guide + +The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied. + +## Dependencies + +- `forge_server_common` for logging, formatting, and player lookup. +- `forge_server_bank` for personal medical billing. +- `forge_server_org` for organization-funded services and medical fallback + debt. +- `forge_client_actor` and `forge_client_notifications` for targeted client + responses. + +## Fuel + +Fuel is organization-funded. + +When refueling stops, `fnc_initFEconomyStore.sqf` calculates the fuel delta and +cost, charges the player's organization through `OrgStore chargeCheckout`, and +syncs the organization patch to online members. If organization funds cannot +cover the refuel, the vehicle is rolled back to the fuel level it had when the +session started. + +Garage UI refuel requests use the server `RefuelService` event. The fuel store +calculates missing fuel from the vehicle config `fuelCapacity`, charges the +player's organization, and fills the vehicle only after the organization charge +succeeds. + +## Repair + +Repair is organization-funded. + +Use the repair service event: + +```sqf +[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service repair cost. +The target is only repaired after the organization charge succeeds. + +The client garage UI forwards selected nearby vehicle repair requests through +the same event. + +## Rearm + +Rearm is organization-funded. + +Use the rearm service event: + +```sqf +[QEGVAR(economy,RearmService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service rearm cost. +The target is only rearmed after the organization charge succeeds. +`setVehicleAmmo` has global effects, but the ammo is only added to local +turrets, so the service broadcasts the ammo reset after billing succeeds. + +The client garage UI forwards selected nearby vehicle rearm requests through +the same event. + +## Medical + +Medical is player-funded first. + +When a heal is requested, `fnc_initMEconomyStore.sqf` uses this billing order: + +1. Charge the player's bank balance when it can cover the medical fee. +2. Otherwise charge the player's cash when it can cover the fee. +3. If neither personal balance can cover the fee, charge organization funds. +4. When organization funds cover the fallback charge, record the same amount as + debt on the player's organization credit line. + +The heal only completes after one of those charges succeeds. If personal +billing is unavailable, the heal does not fall back to organization funds +because the server cannot verify that the player is unable to cover the fee. + +## Medical Debt Repayment + +Medical fallback debt uses the existing organization credit-line repayment +flow. The organization treasury is reduced when the service is rendered, and +the player's credit-line `amount_due` increases by the medical fee. When the +player repays through the bank credit-line repayment action, player bank funds +are moved back into the organization treasury. + +## Hot-Cache Boundary + +The economy addon should stay server-authoritative for world effects such as +vehicle fuel, vehicle repair, healing, respawn placement, and death inventory +movement. Bank and organization balances should continue to mutate through the +extension-backed hot-cache services. diff --git a/docs/FRAMEWORK_ARCHITECTURE.md b/docs/FRAMEWORK_ARCHITECTURE.md new file mode 100644 index 0000000..08f4529 --- /dev/null +++ b/docs/FRAMEWORK_ARCHITECTURE.md @@ -0,0 +1,145 @@ +# Framework Architecture + +Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI. + +## Runtime Flow + +![Architectural Flow Diagram](architecture-flow.svg) + +```text +Arma client UI or SQF action + -> client addon bridge + -> server addon function + -> forge_server callExtension command + -> extension command group + -> forge-services domain service + -> forge-repositories trait + -> SurrealDB repository implementation + -> SurrealDB +``` + +For small payloads, server SQF calls `forge_server` directly through the +extension bridge. For large payloads, `arma/server/addons/extension` stages +request and response chunks through the extension transport module. + +## Main Layers + +### Client Addons + +Client addons live under `arma/client/addons`. They own local player UX, +keybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs +durable or authoritative state, it routes work to the matching server addon +instead of touching persistence directly. + +### Server Addons + +Server addons live under `arma/server/addons`. They own server-side SQF +initialization, game-object integration, validation near the Arma runtime, and +calls into the Rust extension. The `extension` addon is the shared bridge for +`callExtension` and transport handling. + +### Rust Extension + +The server extension lives under `arma/server/extension`. It registers the +`forge_server` command groups, loads configuration, initializes SurrealDB, and +maps SQF command inputs into service calls. + +The extension should stay thin: + +- Parse and validate command arguments that arrive from SQF. +- Resolve Arma-specific context such as player UID when required. +- Call the matching service. +- Serialize the service result back to JSON or a simple string. + +### Shared Rust Crates + +The `lib` workspace contains reusable Rust crates: + +- `forge-models`: shared domain structs and serialization rules. +- `forge-repositories`: storage-agnostic repository traits and in-memory + implementations used by tests and hot-state services. +- `forge-services`: domain behavior, validation, and mutation workflows. +- `forge-shared`: cross-crate helpers. + +### Persistence + +Durable storage is SurrealDB. Schema modules live under +`arma/server/extension/src/schema`, and concrete SurrealDB repository +implementations live under `arma/server/extension/src/storage`. + +Repository traits stay in `lib/repositories` so service logic remains testable +without a database. + +## Hot State + +Several domains have `hot` command groups. Hot state keeps a runtime copy of +frequently accessed data in memory, then saves it back to durable storage when +requested. This is useful for player state that changes often during a session. + +Typical hot-state flow: + +```text +actor:hot:init +actor:hot:get +actor:hot:override +actor:hot:save +actor:hot:remove +``` + +Use hot state for session workflows. Use normal domain commands for direct +durable CRUD operations. + +## Transport Layer + +The transport layer exists because Arma extension calls have practical payload +size limits. It provides chunked request and response handling while still +routing to the same domain command groups. + +Common direct command: + +```sqf +"forge_server" callExtension ["status", []]; +``` + +Common transport path: + +```text +server addon fnc_extCall + -> transport:request:append + -> transport:invoke_stored + -> transport:response:get +``` + +## Configuration + +The server extension reads `config.toml` next to the extension DLL. The current +persistence section is: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +`config.toml` is a launch prerequisite for server owners and developers. The +file must exist beside `forge_server_x64.dll`, and SurrealDB must already be +running at the configured endpoint before starting a Forge-enabled dedicated +server or local multiplayer test. Clients and mission designers do not run this +configuration unless they are hosting locally, but the server they connect to +must have it in place. + +For install links and role-based setup guidance, see +[SurrealDB Setup](./surrealdb-setup.md). + +Check persistence readiness before issuing commands that require storage: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` diff --git a/docs/GARAGE_USAGE_GUIDE.md b/docs/GARAGE_USAGE_GUIDE.md new file mode 100644 index 0000000..de9ef66 --- /dev/null +++ b/docs/GARAGE_USAGE_GUIDE.md @@ -0,0 +1,212 @@ +# Garage Usage Guide + +The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage. + +## Storage Model + +Garage data is persisted through SurrealDB by the server extension. + +```json +{ + "plate-uuid": { + "plate": "plate-uuid", + "classname": "B_Quadbike_01_F", + "fuel": 1.0, + "damage": 0.0, + "hit_points": { + "names": ["hitengine"], + "selections": ["engine_hitpoint"], + "values": [0.0] + } + } +} +``` + +Rules validated by the Rust service: + +- A player garage can contain up to 5 vehicles. +- `garage:add` generates a UUID plate automatically. +- `fuel`, `damage`, and every hit point value must be between `0.0` and `1.0`. +- `hit_points.names`, `hit_points.selections`, and `hit_points.values` must have + the same length. +- `garage:get`, `garage:patch`, and `garage:remove` require an existing garage. +- `garage:add` creates an empty garage automatically when one does not exist. + +## Commands + +All commands are called on the `garage` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `garage:create` | `uid` | Empty vehicle map as JSON. | +| `garage:get` | `uid` | Vehicle map as JSON. | +| `garage:add` | `uid`, `vehicle_json` | Updated vehicle map as JSON. | +| `garage:update` | `uid`, `vehicles_json` | Replaced vehicle map as JSON. | +| `garage:patch` | `uid`, `patch_json` | Updated vehicle map as JSON. | +| `garage:remove` | `uid`, `remove_json` | Updated vehicle map as JSON. | +| `garage:delete` | `uid` | `OK`. | +| `garage:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Garage error: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +## Add a Vehicle + +`garage:add` requires `classname`, `fuel`, `damage`, and `hit_points`. + +```sqf +private _hitPointData = getAllHitPointsDamage _vehicle; +private _hitPoints = createHashMapFromArray [ + ["names", _hitPointData select 0], + ["selections", _hitPointData select 1], + ["values", _hitPointData select 2] +]; + +private _vehicleData = createHashMapFromArray [ + ["classname", typeOf _vehicle], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle], + ["hit_points", _hitPoints] +]; + +private _result = "forge_server" callExtension ["garage:add", [ + getPlayerUID player, + toJSON _vehicleData +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store vehicle: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +The returned value is a hash map keyed by generated plate. To find the newly +stored vehicle, compare returned keys before and after the add, or search by +classname if your workflow guarantees a unique pending vehicle. + +```sqf +private _storedPlate = ""; +{ + private _vehicleRecord = _garage get _x; + if ((_vehicleRecord get "classname") == typeOf _vehicle) then { + _storedPlate = _x; + }; +} forEach keys _garage; +``` + +## Patch a Vehicle + +`garage:patch` updates selected fields for one plate. The `plate` field is +required. `fuel`, `damage`, and `hit_points` are optional. + +```sqf +private _patch = createHashMapFromArray [ + ["plate", _vehicle getVariable ["forge_garage_plate", ""]], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle] +]; + +private _result = "forge_server" callExtension ["garage:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove a Vehicle + +`garage:remove` expects JSON with a `plate` field. + +```sqf +private _remove = createHashMapFromArray [ + ["plate", _plate] +]; + +private _result = "forge_server" callExtension ["garage:remove", [ + getPlayerUID player, + toJSON _remove +]]; +``` + +## Spawn a Stored Vehicle + +```sqf +fnc_spawnGarageVehicle = { + params ["_plate"]; + + private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load garage: %1", _payload]; + objNull + }; + + private _garage = fromJSON _payload; + private _vehicleData = _garage getOrDefault [_plate, createHashMap]; + if (_vehicleData isEqualTo createHashMap) exitWith { + hint "Vehicle plate was not found in your garage."; + objNull + }; + + private _vehicle = (_vehicleData get "classname") createVehicle (player getPos [10, getDir player]); + _vehicle setFuel (_vehicleData getOrDefault ["fuel", 1]); + _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]); + _vehicle setVariable ["forge_garage_plate", _plate, true]; + + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _names = _hitPoints getOrDefault ["names", []]; + private _values = _hitPoints getOrDefault ["values", []]; + + { + _vehicle setHitPointDamage [_x, _values select _forEachIndex]; + } forEach _names; + + private _remove = createHashMapFromArray [["plate", _plate]]; + "forge_server" callExtension ["garage:remove", [getPlayerUID player, toJSON _remove]]; + + _vehicle +}; +``` + +## Hot State + +The `garage:hot:*` commands keep a runtime copy of a player's garage and write +it back only when `garage:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `garage:hot:init` | `uid` | Vehicle map as JSON. | +| `garage:hot:get` | `uid` | Vehicle map as JSON. | +| `garage:hot:override` | `uid`, `vehicles_json` | Vehicle map as JSON. | +| `garage:hot:add` | `uid`, `vehicle_json` | Vehicle map as JSON. | +| `garage:hot:remove_vehicle` | `uid`, `remove_json` | Vehicle map as JSON. | +| `garage:hot:save` | `uid` | Current hot vehicle map as JSON. | +| `garage:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy vehicle workflows. Use the durable commands for +simple store/retrieve operations. + +## Best Practices + +- Store the generated plate on spawned vehicles with `setVariable`. +- Use `garage:patch` for frequent fuel and damage syncs. +- Use `garage:update` only when replacing the whole vehicle map intentionally. +- Do not delete the world vehicle until `garage:add` succeeds. +- Treat vehicle maps as hash maps keyed by plate, not arrays. diff --git a/docs/GIT_WORKFLOW.md b/docs/GIT_WORKFLOW.md new file mode 100644 index 0000000..e56de08 --- /dev/null +++ b/docs/GIT_WORKFLOW.md @@ -0,0 +1,141 @@ +# Git Workflow + +This repository uses `master` as the clean framework branch. Mission folders are +kept off `master` so the framework can be versioned without bundling local test +missions or playable mission copies. + +## Branch Roles + +- `master`: framework source, addon code, Rust extension code, docs, tooling, + and release tags. +- `missions/local-mission-copies`: local mission folders used for testing and + mission iteration. This branch is not pushed unless intentionally needed. +- `archive/pre-v0.1-history`: read-only archive of the previous full `master` + history before the `v0.1.0` baseline cleanup. + +## Daily Framework Work + +Start from the clean framework branch. + +```powershell +git switch master +git pull +git status --short --branch +``` + +Create a short-lived feature branch for framework work. + +```powershell +git switch -c feature/garage-marker-selection +``` + +Make the change, validate it, then commit. + +```powershell +git status --short --branch +git add arma/client/addons/garage/functions/fnc_initContextService.sqf +git commit -m "Improve garage spawn marker selection" +``` + +Merge the work back into `master`. Squash merges keep future `master` history +compact. + +```powershell +git switch master +git merge --squash feature/garage-marker-selection +git commit -m "Improve garage spawn marker selection" +git push +``` + +Remove the local feature branch when it is no longer needed. + +```powershell +git branch -D feature/garage-marker-selection +``` + +## Mission Work + +Switch to the local mission branch before editing mission folders. + +```powershell +git switch missions/local-mission-copies +git status --short --branch +``` + +Mission folders currently tracked on that branch: + +```text +arma/forge_framework.Malden +arma/forge_pmc_simulator.Tanoa +arma/forge_pmc_simulator_v2.Tanoa +``` + +Commit mission-only changes on the mission branch. + +```powershell +git add arma/forge_pmc_simulator.Tanoa +git commit -m "Update PMC simulator mission setup" +``` + +Do not merge the mission branch into `master`. If a mission change becomes +framework code, copy only the reusable files or logic onto a framework feature +branch created from `master`. + +Example: + +```powershell +git switch master +git switch -c feature/cad-on-demand-task-request + +# Bring over only the framework files needed from the mission branch. +git checkout missions/local-mission-copies -- arma/client/addons/cad/functions/fnc_initUIBridge.sqf +git checkout missions/local-mission-copies -- arma/server/addons/cad/XEH_preInit.sqf + +git add arma/client/addons/cad/functions/fnc_initUIBridge.sqf arma/server/addons/cad/XEH_preInit.sqf +git commit -m "Add CAD on-demand mission task request bridge" +``` + +## Release Versioning + +Use tags to mark framework releases. + +Version guideline: + +- Patch, such as `v0.1.1`: fixes and small compatible changes. +- Minor, such as `v0.2.0`: new modules or features. +- Major, such as `v1.0.0`: stable release line or breaking changes. + +Create a release tag from `master`. + +```powershell +git switch master +git pull +git status --short --branch +git tag -a v0.1.1 -m "v0.1.1" +git push origin master +git push origin v0.1.1 +``` + +## Safety Checks + +Before committing on `master`, check that no mission folders are staged. + +```powershell +git status --short --branch +``` + +On `master`, these paths should not appear: + +```text +arma/forge_framework.Malden +arma/forge_pmc_simulator.Tanoa +arma/forge_pmc_simulator_v2.Tanoa +``` + +If mission files appear while on `master`, stop and switch to the mission +branch before continuing. + +```powershell +git switch missions/local-mission-copies +``` + diff --git a/docs/ICOM_USAGE_GUIDE.md b/docs/ICOM_USAGE_GUIDE.md new file mode 100644 index 0000000..36a3bb0 --- /dev/null +++ b/docs/ICOM_USAGE_GUIDE.md @@ -0,0 +1,195 @@ +# ICOM Usage Guide + +ICOM is the Forge inter-server communication helper. It lets multiple Arma 3 +servers exchange generic JSON events through a central TCP hub instead of +connecting directly to each other. + +## Runtime Shape + +```text +Arma server SQF + -> forge_server extension icom:* command + -> ICOM client inside the extension + -> forge-icom TCP hub + -> target server extension + -> forge_icom_event CBA server event +``` + +The ICOM hub lives in `bin/icom`. The Arma server extension integrates with it +through `arma/server/extension/src/icom.rs`. + +## Components + +| Component | Path | Role | +| --- | --- | --- | +| ICOM hub binary | `bin/icom` | Standalone TCP router for connected servers. | +| ICOM client library | `bin/icom/src/client.rs` | Rust client used by the Forge server extension and examples. | +| Extension command group | `arma/server/extension/src/icom.rs` | Exposes `icom:*` commands to SQF and forwards inbound events to Arma. | +| SQF callback bridge | `arma/server/addons/main/XEH_preInit.sqf` | Receives extension callbacks and re-emits `forge_icom_event` through CBA. | + +## Build and Run the Hub + +Build the release binary: + +```powershell +cargo build --release -p forge-icom +``` + +Run it during development: + +```powershell +cargo run -p forge-icom +``` + +The default bind address is `0.0.0.0:9090`. + +## Hub Configuration + +Copy `bin/icom/config.example.toml` to `config.toml` beside the `forge-icom` +executable or into the working directory used to launch it. + +```toml +[server] +host = "0.0.0.0" +port = 9090 +``` + +Use `127.0.0.1` for same-machine testing. Use `0.0.0.0` when remote Arma +servers need to connect, and secure the port at the firewall or host network +layer. + +## Extension Commands + +ICOM commands are exposed through the `icom` command group in `forge_server`. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `icom:connect` | `address`, `server_id` | `Connection initiated` or `ERROR: Already connected`. | +| `icom:send_event` | `target_server`, `event_name`, `data_json` | `OK` or `ERROR: `. | +| `icom:broadcast` | `event_name`, `data_json` | `OK` or `ERROR: `. | + +The current extension connects when `icom:connect` is called. Start the ICOM hub +first, then connect each Arma server with a unique `server_id`. + +```sqf +private _result = "forge_server" callExtension [ + "icom:connect", + ["127.0.0.1:9090", "server_1"] +]; +diag_log format ["[ICOM] Connect result: %1", _result select 0]; +``` + +## Send an Event + +Send a targeted event to one connected server: + +```sqf +private _data = createHashMapFromArray [ + ["coords", [1234, 5678, 0]], + ["supplies", ["ammo_box", "medical_supplies"]] +]; + +"forge_server" callExtension [ + "icom:send_event", + ["server_2", "supply_drop", toJSON _data] +]; +``` + +Broadcast to every connected server except the sender: + +```sqf +private _alert = createHashMapFromArray [ + ["message", "Server restart in 5 minutes"], + ["severity", "warning"] +]; + +"forge_server" callExtension [ + "icom:broadcast", + ["global_alert", toJSON _alert] +]; +``` + +## Receive Events + +Inbound ICOM events are forwarded to SQF as the CBA server event +`forge_icom_event`. + +```sqf +["forge_icom_event", { + params ["_eventName", "_data"]; + + switch (_eventName) do { + case "supply_drop": { + private _coords = _data getOrDefault ["coords", []]; + private _supplies = _data getOrDefault ["supplies", []]; + diag_log format ["[ICOM] Supply drop at %1: %2", _coords, _supplies]; + }; + case "global_alert": { + private _message = _data getOrDefault ["message", ""]; + if (_message isNotEqualTo "") then { + [_message] remoteExec ["hint", 0]; + }; + }; + default { + diag_log format ["[ICOM] Unhandled event: %1 | %2", _eventName, _data]; + }; + }; +}] call CBA_fnc_addEventHandler; +``` + +## Message Protocol + +The hub uses newline-delimited JSON. The first message from each client is a +registration payload: + +```json +{ + "type": "register", + "server_id": "server_1" +} +``` + +Targeted events use `type: "event"`: + +```json +{ + "type": "event", + "target_server": "server_2", + "event_name": "supply_drop", + "data": { + "coords": [1234, 5678, 0] + } +} +``` + +Broadcasts use `type: "broadcast"` and are routed to all connected servers +except the sender. + +## Operational Notes + +- Server IDs must be unique. If the same ID reconnects, the hub replaces the old + connection. +- Event names are mission/application contracts. ICOM only routes them; it does + not validate gameplay meaning. +- Always send valid JSON in the `data_json` argument. +- `icom:send_event` and `icom:broadcast` return quickly after scheduling async + work in the extension. Check extension and ICOM hub logs for delivery errors. +- Keep event payloads small and stable. Use IDs or compact data where possible. + +## Testing + +Start the hub: + +```powershell +cargo run -p forge-icom +``` + +Run example clients in separate terminals: + +```powershell +cargo run -p forge-icom --example server_1_client +cargo run -p forge-icom --example server_2_client +``` + +For Arma testing, start the hub, connect the server with `icom:connect`, register +a `forge_icom_event` handler, then send an event from another connected server. diff --git a/docs/LOCKER_USAGE_GUIDE.md b/docs/LOCKER_USAGE_GUIDE.md new file mode 100644 index 0000000..4424596 --- /dev/null +++ b/docs/LOCKER_USAGE_GUIDE.md @@ -0,0 +1,203 @@ +# Locker Usage Guide + +The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +[Owned Storage Usage Guide](./OWNED_STORAGE_USAGE_GUIDE.md). + +## Storage Model + +Locker data is persisted through SurrealDB by the server extension. + +```json +{ + "arifle_MX_F": { + "category": "weapon", + "classname": "arifle_MX_F", + "amount": 1 + } +} +``` + +Rules validated by the Rust service: + +- A locker can contain up to 25 unique classnames. +- `category` and `classname` cannot be empty. +- `amount` must be greater than `0`. +- `locker:add` creates an empty locker automatically when one does not exist. +- `locker:get`, `locker:patch`, and `locker:remove` require an existing locker. +- `locker:remove` takes the classname directly, not a JSON object. + +## Commands + +All commands are called on the `locker` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `locker:create` | `uid` | Empty item map as JSON. | +| `locker:get` | `uid` | Item map as JSON. | +| `locker:add` | `uid`, `item_json` | Updated item map as JSON. | +| `locker:update` | `uid`, `items_json` | Replaced item map as JSON. | +| `locker:patch` | `uid`, `patch_json` | Updated item map as JSON. | +| `locker:remove` | `uid`, `classname` | Updated item map as JSON. | +| `locker:delete` | `uid` | `OK`. | +| `locker:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Locker error: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Add an Item + +`locker:add` creates or overwrites one classname entry. + +```sqf +private _item = createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] +]; + +private _result = "forge_server" callExtension ["locker:add", [ + getPlayerUID player, + toJSON _item +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store item: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Patch an Amount + +`locker:patch` currently patches the `amount` field for an existing classname. + +```sqf +private _patch = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["amount", 5] +]; + +private _result = "forge_server" callExtension ["locker:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove an Item + +`locker:remove` takes the classname as the second argument. + +```sqf +private _result = "forge_server" callExtension ["locker:remove", [ + getPlayerUID player, + "arifle_MX_F" +]]; +``` + +## Retrieve an Item + +```sqf +fnc_retrieveLockerItem = { + params ["_classname"]; + + private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load locker: %1", _payload]; + false + }; + + private _locker = fromJSON _payload; + private _item = _locker getOrDefault [_classname, createHashMap]; + if (_item isEqualTo createHashMap) exitWith { + hint "Item was not found in your locker."; + false + }; + + private _amount = _item getOrDefault ["amount", 0]; + if (_amount <= 0) exitWith { + hint "Item is out of stock."; + false + }; + + if !(player canAdd _classname) exitWith { + hint "Not enough inventory space."; + false + }; + + player addItem _classname; + + if (_amount > 1) then { + private _patch = createHashMapFromArray [ + ["classname", _classname], + ["amount", _amount - 1] + ]; + "forge_server" callExtension ["locker:patch", [getPlayerUID player, toJSON _patch]]; + } else { + "forge_server" callExtension ["locker:remove", [getPlayerUID player, _classname]]; + }; + + true +}; +``` + +## Replace the Whole Locker + +`locker:update` replaces the whole item map. Use it for explicit bulk syncs, +not single-item changes. + +```sqf +private _items = createHashMapFromArray [ + ["arifle_MX_F", createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] + ]] +]; + +private _result = "forge_server" callExtension ["locker:update", [ + getPlayerUID player, + toJSON _items +]]; +``` + +## Hot State + +The `locker:hot:*` commands keep a runtime copy of a player's locker and write +it back only when `locker:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `locker:hot:init` | `uid` | Item map as JSON. | +| `locker:hot:get` | `uid` | Item map as JSON. | +| `locker:hot:override` | `uid`, `items_json` | Item map as JSON. | +| `locker:hot:save` | `uid` | Current hot item map as JSON. | +| `locker:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy locker workflows. Use the durable commands for +simple item deposits and withdrawals. + +## Best Practices + +- Keep categories normalized, for example `weapon`, `magazine`, `item`, or + `backpack`. +- Use `locker:patch` for quantity changes. +- Use `locker:remove` when quantity reaches zero. +- Treat the locker response as a hash map keyed by classname. +- Check capacity before bulk operations that may exceed 25 unique items. diff --git a/docs/MISSION_DESIGNER_GUIDE.md b/docs/MISSION_DESIGNER_GUIDE.md new file mode 100644 index 0000000..f659210 --- /dev/null +++ b/docs/MISSION_DESIGNER_GUIDE.md @@ -0,0 +1,750 @@ +# Mission Designer Guide + +Build playable Forge missions in Eden with the required interaction objects, +garage markers, and CAD-compatible task modules. + +This guide focuses on editor placement and mission validation. Framework +internals, extension commands, and persistence details are covered in the +developer-oriented module guides. + +## Core Rule + +Most Forge systems become available to players through nearby Eden objects. +Place the object, give it the correct variable name in Eden, and the server +initializer marks it with the runtime variable the actor menu scans for. + +Players must be within 5 meters of the object for the actor menu to offer the +action. + +## Interaction Objects + +Use the object's Eden variable name, not its display name. The matching is +case-sensitive in some initializers, so use lower-case names. + +![Bank object variable name field](images/eden/bank_obj_var.jpg) + +| System | Eden Object Variable Name | Runtime Variable | Player Action | Notes | +| --- | --- | --- | --- | --- | +| Bank | name contains `bank` | `isBank = true` | Full bank UI | Allows full banking workflows, including PIN changes. | +| ATM | name contains `atm` | `isAtm = true` | ATM bank UI | ATM mode requires PIN authorization and does not allow PIN changes. | +| Store | name contains `store` | `isStore = true` | Store UI | Store catalog and checkout behavior are configured server-side. | +| Garage | name contains `garage` | `isGarage = true` | Garage UI and virtual garage | Include a garage category in the name or set `garageType` manually. | +| Locker | name contains `locker` | local `isLocker = true` | Virtual arsenal action | The server hides the editor object; each client creates a local locker at the same position. | + +Recommended object names: + +```text +atm +bank +store +locker +garage_hq +garage_hq_2 +``` + +The example mission uses short lower-case names. Keep single-use objects simple, +add an index when there may be multiple copies, and include a site label for +garage objects so related spawn markers can share the same prefix. + +Avoid using `forge_locker_box` as an editor-placed locker variable name. That +name is reserved by the client-side virtual arsenal box. + +## Manual Object Variables + +The automatic initializers are the normal path. If a mission script creates +interaction objects dynamically, set the same variables manually: + +```sqf +_bankLaptop setVariable ["isBank", true, true]; +_atmTerminal setVariable ["isAtm", true, true]; +_storeCounter setVariable ["isStore", true, true]; +_garageTerminal setVariable ["isGarage", true, true]; +_garageTerminal setVariable ["garageType", "cars", true]; +``` + +Supported garage types are: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +## Garage Markers + +Garage interaction objects open the garage UI. Vehicle spawn positions come +from Eden markers. + +![Garage object placement](images/eden/garage_obj.jpg) + +![Garage object variable name](images/eden/garage_obj_var.jpg) + +![Garage category spawn markers](images/eden/garage_spawn_mrkrs.jpg) + +![Garage spawn marker variable name](images/eden/garage_spawn_1_mrkr_var.jpg) + +Additional garage sites use the same pattern: place another garage interaction +object, give it a `garage` variable name that identifies the site, then place +matching category spawn markers near that garage. + +![Second garage object placement](images/eden/garage_obj_2.jpg) + +![Second garage object variable name](images/eden/garage_obj_2_var.jpg) + +![Second garage site spawn markers](images/eden/garage_spawn_2_mrkrs.jpg) + +Create empty markers near each garage site. Marker names must contain `garage` +and one supported garage category: + +```text +garage_hq_cars +garage_hq_armor +garage_hq_helis +garage_hq_helis_1 +garage_hq_planes +garage_hq_naval +garage_hq_other +``` + +This convention keeps the site and category visible in the marker name: +`garage_hq_planes` is the planes spawn marker for `garage_hq`, while +`garage_hq_2` can use another nearby set of `garage_hq_*` category markers for +the second HQ garage area. If two garage objects of the same category are close +to each other, include the full object name in the marker prefix, such as +`garage_hq_2_planes`. + +Use these rules: + +1. Put the marker where the vehicle should spawn. +2. Rotate the marker to control spawn heading. +3. Keep the marker close to the matching garage object. +4. Include the garage object's variable name when multiple garages exist at + different sites. +5. Do not allow parked vehicles to block the marker. If a vehicle is within 5 + meters of the spawn position, the virtual garage blocks the session. + +Vehicle spawning is strict by category. A garage without a matching category +marker cannot spawn that vehicle category. + +## Store Setup + +Store objects only unlock the store UI. The actual item catalog, prices, +payment source handling, locker grants, and garage unlocks are server-owned. + +![Store object placement](images/eden/store_obj.jpg) + +![Store object variable name](images/eden/store_obj_var.jpg) + +Minimum Eden setup: + +1. Place a terminal, table, NPC, or other object players can stand near. +2. Set its Eden variable name to something containing `store`. +3. Test that the actor menu shows the store action within 5 meters. + +## Bank and ATM Setup + +Bank and ATM objects intentionally expose different workflows. + +![Bank object placement](images/eden/bank_obj.jpg) + +![Bank object variable name](images/eden/bank_obj_var.jpg) + +![ATM object placement](images/eden/atm_obj.jpg) + +![ATM object variable name](images/eden/atm_obj_var.jpg) + +Use a `bank` object for the full bank interface: + +- account view +- transfers +- earnings deposit +- PIN change + +Use an `atm` object for ATM access: + +- PIN-gated account access +- ATM-mode banking actions +- no PIN change + +Minimum Eden setup: + +1. Place one or more bank laptops or terminals with variable names containing + `bank`. +2. Place one or more ATM objects with variable names containing `atm`. +3. Keep the object accessible so players can stand within 5 meters. + +## Locker Setup + +Locker objects are slightly different from other interaction objects. The +server finds editor-placed objects whose variable names contain `locker`, hides +those global objects, and each client creates a local locker object at the same +position. + +![Locker object placement](images/eden/locker_obj.jpg) + +![Locker object variable name](images/eden/locker_obj_var.jpg) + +Minimum Eden setup: + +1. Place a container object where the locker should appear. +2. Set its Eden variable name to something containing `locker`. +3. Do not use `forge_locker_box`. +4. Test that the local locker appears and opens the virtual arsenal action. + +## Medical Spawn Setup + +The medical economy store discovers up to eleven medical spawn objects by exact +mission namespace variable name: + +- `med_spawn` +- `med_spawn_1` +- `med_spawn_2` +- continuing through `med_spawn_10` + +These objects are used for medical respawn placement and occupancy checks. + +![Medical spawn object placement](images/eden/med_spawn_obj.jpg) + +![Medical spawn object variable name](images/eden/med_spawn_obj_var.jpg) + +Minimum Eden setup: + +1. Place an object at each medical respawn position. +2. Set the first object's Eden variable name to `med_spawn`. +3. Set additional medical spawns to `med_spawn_1`, `med_spawn_2`, and so on. +4. Keep each spawn position clear enough for a revived player to occupy. + +## CAD Access + +The CAD UI is currently opened from the actor menu action path, but there is no +server initializer that marks Eden objects as dedicated CAD terminals. If a +mission needs a CAD terminal object, wire it through mission script or a custom +interaction that calls: + +```sqf +[] spawn forge_client_cad_fnc_openUI; +``` + +Tasks show in CAD only when they are created through a CAD-compatible task +creation path. + +## CEO and Dispatch Slots + +Forge grants dispatch-board permissions from the player's Eden unit variable +name when that player belongs to the default organization. + +Use these exact lower-case variable names: + +| Slot | Eden Unit Variable Name | Permissions | +| --- | --- | --- | +| CEO | `ceo` | Can administer the default organization, use default organization funds where supported, and use the CAD dispatch board. | +| Dispatch | `dispatch` | Can use the CAD dispatch board. | + +![CEO unit placement](images/eden/ceo_unit.jpg) + +![CEO unit variable name](images/eden/ceo_unit_var.jpg) + +![Dispatch unit placement](images/eden/dispatch_unit.jpg) + +![Dispatch unit variable name](images/eden/dispatch_unit_var.jpg) + +The CEO slot is intentionally broader than the dispatch slot. Use it for the +player who should administrate the default organization. Use the dispatch slot +for players who need dispatcher tools without default organization +administration rights. + +## Task and CAD Setup + +Mission designers should use Forge Eden task modules for CAD-visible work. +Those modules delegate to `forge_server_task_fnc_startTask`, which creates the +BIS task, registers the Forge task catalog entry, sets active task state, and +dispatches the task handler. + +Use the Arma 3 `Create Task` module when you need a standard BIS map task +alongside Forge task handling. Use Forge task modules for CAD-visible task +contracts and runtime task logic. + +![Arma 3 Create Task module placement](images/eden/create_task_mod.jpg) + +![Arma 3 Create Task module parameters](images/eden/create_task_mod_params.jpg) + +![Attack task module placement](images/eden/attack_task_mod.jpg) + +![Attack task module parameters](images/eden/attack_task_mod_params.jpg) + +![Attack task target sync](images/eden/attack_task_tgts.jpg) + +![CAD visible task](images/eden/cad-visible-task.jpg) + +CAD-compatible task creation paths: + +| Path | CAD Compatible | Use When | +| --- | --- | --- | +| Forge Eden task modules | Yes | Normal mission-designer workflow. | +| `forge_server_task_fnc_startTask` | Yes | Scripted or generated mission content. | +| Dynamic mission manager attack tasks | Yes | Server-generated attack missions. | +| `forge_server_task_fnc_handler` directly | Only if catalog and BIS task already exist | Advanced scripted flows. | +| Direct task function calls | No by default | Custom server-owned flows that do not need CAD assignment. | + +General task rules: + +1. Give every task a unique `TaskID`. +2. Set success and fail limits explicitly. +3. Use area markers for zone fields. +4. Use Forge grouping modules where required. +5. Sync task modules to real world objects, units, vehicles, or grouping + modules. +6. To chain tasks, set `Prerequisite Task IDs` on the dependent task module to + a comma-separated list of task IDs that must succeed first. +7. Reward class fields use comma-separated class names without brackets, such + as `ItemGPS, FirstAidKit`. Existing SQF array strings such as + `["ItemGPS","FirstAidKit"]` still work for older missions. +8. Test that unchained tasks appear in CAD immediately and chained tasks appear + only after their prerequisite tasks succeed. + +Task chaining uses only task IDs. The dependent task is still registered during +mission setup, but it stays hidden from CAD, cannot be assigned, and does not +start its task logic until every prerequisite task has completed successfully. +If any prerequisite task fails or never completes, the dependent task remains +locked. + +Zone fields that must reference area markers: + +![Task marker fields](images/eden/create_task_mod_params.jpg) + +| Field | Used By | Marker Requirement | +| --- | --- | --- | +| `DefenseZone` | Defend Task | Rectangle or ellipse area marker. | +| `DeliveryZone` | Delivery Task | Rectangle or ellipse area marker. | +| `ExtZone` | Hostage and HVT capture tasks | Rectangle or ellipse area marker. | +| `CBRNZone` | Hostage CBRN variant | Rectangle or ellipse area marker. | + +## Task Module Setup Guides + +Use these task sections as the setup guide and capture plan. Save any new +screenshots under `docus/public/images/eden/` with the listed filenames. + +### Attack Task + +Use `FORGE_Module_Attack` when players need to eliminate hostile units or +vehicles. + +Existing screenshots: + +- `attack_task_mod.jpg` - Attack task module placement. +- `attack_task_mod_params.jpg` - Attack task module attributes. +- `attack_task_tgts.jpg` - Attack task synced to target units or vehicles. + +Setup: + +1. Place the enemy units or vehicles. +2. Place `FORGE_Module_Attack`. +3. Set a unique `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be killed. +5. Set `LimitFail` if the mission should fail after too many losses. +6. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +7. Set `Prerequisite Task IDs` only if this attack task should unlock after + other tasks succeed. +8. Sync the attack module directly to the target units or vehicles. + +Validation: + +- The task appears in CAD after creation. +- Killing the configured number of targets succeeds the task. +- `TimeLimit` uses seconds; `0` disables the timer. + +### Destroy Task + +Use `FORGE_Module_Destroy` when players must destroy objects, vehicles, or +units. + +![Destroy task module placement](images/eden/destroy_task_mod.jpg) + +![Destroy task module parameters](images/eden/destroy_task_mod_params.jpg) + +![Destroy task target sync](images/eden/destroy_task_tgts.jpg) + +Setup: + +1. Place the objects, vehicles, or units that must be destroyed. +2. Place `FORGE_Module_Destroy`. +3. Set a unique `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be destroyed. +5. Set `LimitFail` if the mission should fail after too many protected losses + or failed conditions. +6. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +7. Set `Prerequisite Task IDs` only if this destroy task should unlock after + other tasks succeed. +8. Sync the destroy module directly to the targets. + +Validation: + +- The module reads direct syncs only. +- Destroying the configured number of targets succeeds the task. +- `TimeLimit` uses seconds; `0` disables the timer. + +### Defuse Task + +Use `FORGE_Module_Defuse` when players must defuse explosives while optionally +protecting other entities. + +![Defuse task module placement](images/eden/defuse_task_mod.jpg) + +![Defuse task module parameters](images/eden/defuse_task_mod_params.jpg) + +![Explosive Entities grouping module](images/eden/defuse_explosives_mod.jpg) + +![Protected Entities grouping module](images/eden/defuse_protected_mod.jpg) + +The Defuse task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Defuse Task] --> [Explosive Entities] --> explosive objects +[Defuse Task] --> [Protected Entities] --> protected objects, vehicles, or units +``` + +Setup: + +1. Place the explosive objects that players must defuse. +2. Place `FORGE_Module_Explosives`. +3. Sync each explosive object to `FORGE_Module_Explosives`. +4. Place any objects, vehicles, or units that must survive. +5. Place `FORGE_Module_Protected` when protected entities are part of the task. +6. Sync each protected entity to `FORGE_Module_Protected`. +7. Place `FORGE_Module_Defuse`. +8. Set a unique `TaskID`. +9. Set `LimitSuccess` to the number of explosives that must be defused. +10. Set `LimitFail` to the number of protected entities that can be lost before + failure. +11. Set `TimeLimit` to the IED countdown in seconds. +12. Set reward funds, rating gain/loss, and end-state behavior. +13. Set `Prerequisite Task IDs` only if this defuse task should unlock after + other tasks succeed. +14. Sync `FORGE_Module_Defuse` to `FORGE_Module_Explosives`. +15. Sync `FORGE_Module_Defuse` to `FORGE_Module_Protected` if used. + +Validation: + +- The defuse task reads grouped entities, not direct object syncs. +- The ACE defuse event resolves the correct IED for the task. +- Defuse `TimeLimit` is the IED countdown and should be greater than `0`. + +### Delivery Task + +Use `FORGE_Module_Delivery` when players must move cargo objects into a +delivery zone. + +![Delivery task module placement](images/eden/delivery_task_mod.jpg) + +![Delivery task module parameters](images/eden/delivery_task_mod_params.jpg) + +![Cargo Entities grouping module](images/eden/delivery_cargo_mod.jpg) + +![Delivery area marker placement](images/eden/delivery_zone_mrkr.jpg) + +![Delivery marker name](images/eden/delivery_zone_mrkr_var.jpg) + +The Delivery task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Delivery Task] --> [Cargo Entities] --> cargo objects +``` + +Setup: + +1. Place the cargo objects. +2. Create a rectangle or ellipse area marker for the delivery zone. +3. Place `FORGE_Module_Cargo`. +4. Sync each cargo object to `FORGE_Module_Cargo`. +5. Place `FORGE_Module_Delivery`. +6. Set a unique `TaskID`. +7. Set `DeliveryZone` to the delivery marker name. +8. Set `LimitSuccess` to the number of cargo objects that must arrive. +9. Set `LimitFail` to the number of cargo objects that can be damaged past the + fail threshold. +10. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +11. Set `Prerequisite Task IDs` only if this delivery task should unlock after + other tasks succeed. +12. Sync `FORGE_Module_Delivery` to `FORGE_Module_Cargo`. + +Validation: + +- `DeliveryZone` must be an area marker, not an icon marker. +- The runtime checks cargo with `inArea DeliveryZone`. +- The task succeeds only after the configured cargo count reaches the zone. + +### Hostage Task + +Use `FORGE_Module_Hostage` when players must rescue hostage units and move them +to an extraction zone. + +![Hostage task module placement](images/eden/hostage_task_mod.jpg) + +![Hostage task module parameters](images/eden/hostage_task_mod_params.jpg) + +![Hostage Entities grouping module](images/eden/hostage_entities_mod.jpg) + +![Shooter Entities grouping module](images/eden/hostage_shooters_mod.jpg) + +![Hostage extraction area marker placement](images/eden/hostage_ext_zone_mrkr.jpg) + +![Hostage extraction marker name](images/eden/hostage_ext_zone_mrkr_var.jpg) + +The Hostage task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Hostage Task] --> [Hostage Entities] --> hostage units +[Hostage Task] --> [Shooter Entities] --> hostile shooter units +``` + +Setup: + +1. Place the hostage AI units. +2. Place the hostile shooter AI units. +3. Create a rectangle or ellipse area marker for the extraction zone. +4. If using the CBRN variant, create a rectangle or ellipse area marker for + `CBRNZone`. +5. Place `FORGE_Module_Hostages`. +6. Sync the hostage units to `FORGE_Module_Hostages`. +7. Place `FORGE_Module_Shooters`. +8. Sync the shooter units to `FORGE_Module_Shooters`. +9. Place `FORGE_Module_Hostage`. +10. Set a unique `TaskID`. +11. Set `ExtZone` to the extraction marker name. +12. Set `LimitSuccess` to the number of hostages that must be rescued. +13. Set `LimitFail` to the number of hostages that can be lost before failure. +14. Enable `CBRN Attack` or `Execution` when that mission variant is needed. +15. If `CBRN Attack` is enabled, set `CBRNZone`. +16. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +17. Set `Prerequisite Task IDs` only if this hostage task should unlock after + other tasks succeed. +18. Sync `FORGE_Module_Hostage` to `FORGE_Module_Hostages`. +19. Sync `FORGE_Module_Hostage` to `FORGE_Module_Shooters`. + +Validation: + +- `ExtZone` and `CBRNZone` must be area markers. +- Hostage and shooter grouping modules should sync to real units only. +- The hostage timer waits until the assigned group leader acknowledges the + task. + +### HVT Task + +Use `FORGE_Module_HVT` when players must capture or eliminate high-value target +units. The `HVT Task` example below shows an elimination task. The `HVT Task 1` +example shows a capture/extract task. + +Eliminate HVT example: + +![HVT eliminate task module placement](images/eden/hvt_task_mod.jpg) + +![HVT eliminate task module parameters](images/eden/hvt_task_mod_params.jpg) + +Capture HVT example: + +![HVT capture task module placement](images/eden/hvt_capture_task_mod.jpg) + +![HVT capture task module parameters](images/eden/hvt_capture_task_mod_params.jpg) + +![HVT capture extraction area marker placement](images/eden/hvt_ext_zone_mrkr.jpg) + +![HVT capture extraction marker name](images/eden/hvt_ext_zone_mrkr_var.jpg) + +The HVT task screenshots show the direct HVT unit sync for both eliminate and +capture examples. + +Setup: + +1. Place the HVT unit or units. +2. Place `FORGE_Module_HVT`. +3. Set a unique `TaskID`. +4. For kill/eliminate missions, set `Capture HVT` to `False` and + `Eliminate HVT` to `True`. +5. For capture/extract missions, set `Capture HVT` to `True` and + `Eliminate HVT` to `False`. +6. If using capture mode, create a rectangle or ellipse area marker for the + extraction zone and set `ExtZone` to that marker name. +7. Set `LimitSuccess` to the number of HVTs that must be captured or + eliminated. +8. Set `LimitFail` if the mission should fail after too many HVT deaths in + capture mode. +9. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +10. Set `Prerequisite Task IDs` only if this HVT task should unlock after other + tasks succeed. +11. Sync the HVT module directly to the HVT unit or units. + +Validation: + +- Capture mode requires `ExtZone`; elimination mode does not. +- `ExtZone` must be an area marker. +- The HVT timer waits until the assigned group leader acknowledges the task. + +### Defend Task + +Use `FORGE_Module_Defend` when players must hold an area against spawned enemy +waves. + +![Defend task module placement](images/eden/defend_task_mod.jpg) + +![Defend task module parameters](images/eden/defend_task_mod_params.jpg) + +![Defense area marker placement](images/eden/defend_zone_mrkr.jpg) + +![Defense marker name](images/eden/defend_zone_mrkr_var.jpg) + +The Defend task screenshots show module placement, marker setup, enemy wave +templates, and the required sync layout. + +Setup: + +1. Create a rectangle or ellipse area marker for the defense zone. +2. Place `FORGE_Module_Defend`. +3. Set a unique `TaskID`. +4. Set `DefenseZone` to the defense marker name. +5. Set `DefendTime` to how long the area must be held. +6. Set `WaveCount`. +7. Set `WaveCooldown`. +8. Set `MinBlufor` to the minimum number of friendly players or units required + in the zone. +9. Place one or more enemy groups or units to use as wave templates. +10. Sync any unit from each enemy group to the defend module. +11. Set reward funds, rating gain/loss, and end-state behavior. +12. Set `Prerequisite Task IDs` only if this defend task should unlock after + other tasks succeed. + +Validation: + +- `DefenseZone` must be an area marker. +- Syncing one unit from an enemy group makes the whole group available as a + wave composition. +- If no enemy units are synced, the task falls back to default CSAT infantry + waves. +- The timer, waves, and empty-zone failure checks start after enough BLUFOR + enter the zone. + +## Task Module Quick Reference + +| Task Module | Sync Target | Required Marker | +| --- | --- | --- | +| `FORGE_Module_Attack` | Target units or vehicles | None | +| `FORGE_Module_Destroy` | Target objects, vehicles, or units | None | +| `FORGE_Module_Defuse` | `FORGE_Module_Explosives`, optionally `FORGE_Module_Protected` | None | +| `FORGE_Module_Delivery` | `FORGE_Module_Cargo` | `DeliveryZone` | +| `FORGE_Module_Hostage` | `FORGE_Module_Hostages` and `FORGE_Module_Shooters` | `ExtZone`, optional `CBRNZone` | +| `FORGE_Module_HVT` | HVT units | `ExtZone` when capture mode is enabled | +| `FORGE_Module_Defend` | Optional enemy units as wave templates | `DefenseZone` | + +## Mission Manager Blacklist Markers + +The dynamic mission generator avoids rectangle and ellipse area markers whose +marker name or marker text starts with `blklist`. + +Use blacklist area markers to keep generated missions out of bases, spawn +areas, training zones, or protected set pieces. + +![Blacklist marker placement](images/eden/blacklist_mrkr.jpg) + +![Blacklist marker variable name](images/eden/blacklist_mrkr_var.jpg) + +Setup: + +1. Create a rectangle or ellipse area marker over the area to exclude. +2. Set the marker variable name or marker text to start with `blklist`. +3. Give the marker real size so the generator can test candidate positions + against the area. + +## Task Setup Checklist + +Before publishing a mission, verify: + +- Every task has a unique `TaskID`. +- Every configured marker name exists in Eden. +- Zone markers are area markers, not icon-only markers. +- Grouping modules are synced in the correct direction. +- Success and fail limits match the number of required entities. +- Reward funds and rating changes are intentional. +- Unchained tasks appear in CAD when created. +- Chained tasks remain hidden until all prerequisite task IDs succeed. +- Assigned CAD tasks can be acknowledged, declined, and completed. + +## Mission Validation Checklist + +Run this checklist in a local multiplayer test: + +- Stand within 5 meters of each bank object and verify the full bank action. +- Stand within 5 meters of each ATM and verify ATM mode. +- Confirm PIN changes are only available from the full bank interface. +- Stand near each store object and complete a test checkout. +- Stand near each locker and verify the local locker/arsenal opens. +- Open each garage and retrieve/store a vehicle. +- Open each virtual garage category and confirm the correct spawn marker is + used. +- Block a garage spawn marker with a vehicle and confirm the warning appears. +- Create each mission task and confirm CAD visibility. +- Assign a task in CAD and verify the player flow through completion or failure. + +## Eden Screenshot Set + +The live docs should include real Eden screenshots for mission designers. When +capturing them, save the images under `docus/public/images/eden/` and use these +filenames so the docs can reference stable assets: + +| File | Capture | +| --- | --- | +| `bank_obj.jpg`, `bank_obj_var.jpg` | Bank object placement and variable name. | +| `atm_obj.jpg`, `atm_obj_var.jpg` | ATM object placement and variable name. | +| `store_obj.jpg`, `store_obj_var.jpg` | Store object placement and variable name. | +| `locker_obj.jpg`, `locker_obj_var.jpg` | Locker container placement and variable name. | +| `garage_obj.jpg`, `garage_obj_var.jpg` | Garage interaction object placement and variable name. | +| `garage_spawn_mrkrs.jpg`, `garage_spawn_1_mrkr_var.jpg` | Garage category spawn markers and marker variable naming. | +| `garage_obj_2.jpg`, `garage_obj_2_var.jpg`, `garage_spawn_2_mrkrs.jpg` | Additional garage site placement, variable name, and spawn markers. | +| `med_spawn_obj.jpg`, `med_spawn_obj_var.jpg` | Medical spawn object placement and variable name. | +| `ceo_unit.jpg`, `ceo_unit_var.jpg` | CEO playable unit placement and variable name. | +| `dispatch_unit.jpg`, `dispatch_unit_var.jpg` | Dispatch playable unit placement and variable name. | +| `blacklist_mrkr.jpg`, `blacklist_mrkr_var.jpg` | Mission-manager blacklist marker placement and marker variable naming. | +| `create_task_mod.jpg`, `create_task_mod_params.jpg` | Arma 3 Create Task module placement and parameters. | +| `attack_task_mod.jpg`, `attack_task_mod_params.jpg`, `attack_task_tgts.jpg` | Attack task module placement, parameters, and target sync. | +| `destroy_task_mod.jpg`, `destroy_task_mod_params.jpg`, `destroy_task_tgts.jpg` | Destroy task module placement, parameters, and target sync. | +| `defuse_task_mod.jpg`, `defuse_task_mod_params.jpg` | Defuse task module placement and parameters. | +| `defuse_explosives_mod.jpg`, `defuse_protected_mod.jpg` | Defuse grouping modules for explosive and protected entities. | +| `delivery_task_mod.jpg`, `delivery_task_mod_params.jpg`, `delivery_cargo_mod.jpg` | Delivery task module, parameters, and Cargo Entities grouping module. | +| `delivery_zone_mrkr.jpg`, `delivery_zone_mrkr_var.jpg` | Delivery area marker placement and marker name. | +| `hostage_task_mod.jpg`, `hostage_task_mod_params.jpg` | Hostage task module placement and parameters. | +| `hostage_entities_mod.jpg`, `hostage_shooters_mod.jpg` | Hostage grouping modules for hostage and shooter units. | +| `hostage_ext_zone_mrkr.jpg`, `hostage_ext_zone_mrkr_var.jpg` | Hostage extraction marker placement and marker name. | +| Hostage CBRN marker | Use the same extraction-marker capture pattern if a separate CBRN screenshot is ever needed. | +| `hvt_task_mod.jpg`, `hvt_task_mod_params.jpg` | HVT eliminate task module placement and parameters. | +| `hvt_capture_task_mod.jpg`, `hvt_capture_task_mod_params.jpg` | HVT capture task module placement and parameters. | +| `hvt_ext_zone_mrkr.jpg`, `hvt_ext_zone_mrkr_var.jpg` | HVT capture extraction marker placement and marker name. | +| `defend_task_mod.jpg`, `defend_task_mod_params.jpg` | Defend task module placement, parameters, wave templates, and sync. | +| `defend_zone_mrkr.jpg`, `defend_zone_mrkr_var.jpg` | Defense area marker placement and marker name. | +| `cad-visible-task.jpg` | In-game CAD showing a task created from the Eden module. | + +Use screenshots that show the Eden left-side entity list, the selected object's +attributes panel, and the map placement where possible. Crop only enough to +remove unrelated mission content. + +## Related Guides + +- [Task Usage Guide](./TASK_USAGE_GUIDE.md) +- [Client Actor Usage Guide](./CLIENT_ACTOR_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Store Usage Guide](./STORE_USAGE_GUIDE.md) +- [Bank Usage Guide](./BANK_USAGE_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) diff --git a/docs/MODULE_REFERENCE.md b/docs/MODULE_REFERENCE.md new file mode 100644 index 0000000..b673b08 --- /dev/null +++ b/docs/MODULE_REFERENCE.md @@ -0,0 +1,221 @@ +# Module Reference + +This reference lists the main Forge modules and where each layer lives. + +## Directory Map + +```text +arma/client/addons/ Client-side Arma addons and browser UIs +arma/server/addons/ Server-side Arma addons and extension bridge +arma/server/extension/ Rust arma-rs extension and SurrealDB adapters +bin/icom/ Interprocess communication helper +lib/models/ Shared domain data models +lib/repositories/ Repository traits and in-memory stores +lib/services/ Domain services and workflow logic +lib/shared/ Cross-crate helpers +tools/ Web UI build tooling +docs/ Framework-level documentation +``` + +## Gameplay Domains + +| Domain | Purpose | Client addon | Server addon | Service/model layer | Extension group | +| --- | --- | --- | --- | --- | --- | +| Actor | Player identity, loadout, position, status, contact identifiers, and persistent character data. | `arma/client/addons/actor` | `arma/server/addons/actor` | `lib/models/src/actor.rs`, `lib/services/src/actor.rs` | `actor:*` | +| Bank | Player accounts, cash/bank balances, PIN validation and changes, transfers, checkout charging, and transaction context. | `arma/client/addons/bank` | `arma/server/addons/bank` | `lib/models/src/bank.rs`, `lib/services/src/bank.rs` | `bank:*`, `bank:hot:*` | +| CAD | Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views. | `arma/client/addons/cad` | `arma/server/addons/cad` | `lib/models/src/cad.rs`, `lib/services/src/cad.rs` | `cad:*` | +| Garage | Player vehicle storage with plate IDs, fuel, damage, and hit point state. | `arma/client/addons/garage` | `arma/server/addons/garage` | `lib/models/src/garage.rs`, `lib/services/src/garage.rs` | `garage:*`, `garage:hot:*` | +| Locker | Player item storage keyed by classname with category and amount. | `arma/client/addons/locker` | `arma/server/addons/locker` | `lib/models/src/locker.rs`, `lib/services/src/locker.rs` | `locker:*`, `locker:hot:*` | +| Organization | Player organizations, membership, treasury, credit lines, shared assets, and fleet data. | `arma/client/addons/org` | `arma/server/addons/org` | `lib/models/src/org.rs`, `lib/services/src/org.rs` | `org:*`, `org:hot:*` | +| Phone | Contacts, messages, and email state. | `arma/client/addons/phone` | `arma/server/addons/phone` | `lib/models/src/phone.rs`, `lib/services/src/phone.rs` | `phone:*` | +| Store | Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration. | `arma/client/addons/store` | `arma/server/addons/store` | `lib/models/src/store.rs`, `lib/services/src/store.rs` | `store:checkout` | +| Task | Server-owned mission/task flows, catalog, ownership, status, participant tracking, rewards, and defuse counters. | none | `arma/server/addons/task` | `lib/models/src/task.rs`, `lib/services/src/task.rs` | `task:*` | +| Owned Garage | Organization or owner-scoped vehicle unlock storage. | via garage/org UI | server extension only | `lib/models/src/v_garage.rs`, `lib/services/src/v_garage.rs` | `owned:garage:*` | +| Owned Locker | Organization or owner-scoped arsenal unlock storage. | via locker/org UI | server extension only | `lib/models/src/v_locker.rs`, `lib/services/src/v_locker.rs` | `owned:locker:*` | + +Server and extension guides: +[Actor](./ACTOR_USAGE_GUIDE.md), +[Bank](./BANK_USAGE_GUIDE.md), +[CAD](./CAD_USAGE_GUIDE.md), +[Economy](./ECONOMY_USAGE_GUIDE.md), +[Garage](./GARAGE_USAGE_GUIDE.md), +[Locker](./LOCKER_USAGE_GUIDE.md), +[Organization](./ORG_USAGE_GUIDE.md), +[Owned Storage](./OWNED_STORAGE_USAGE_GUIDE.md), +[Phone](./PHONE_USAGE_GUIDE.md), +[Store](./STORE_USAGE_GUIDE.md), +[Task](./TASK_USAGE_GUIDE.md). + +Client guides: +[Client Overview](./CLIENT_USAGE_GUIDE.md), +[Main](./CLIENT_MAIN_USAGE_GUIDE.md), +[Common](./CLIENT_COMMON_USAGE_GUIDE.md), +[Actor](./CLIENT_ACTOR_USAGE_GUIDE.md), +[Bank](./CLIENT_BANK_USAGE_GUIDE.md), +[CAD](./CLIENT_CAD_USAGE_GUIDE.md), +[Garage](./CLIENT_GARAGE_USAGE_GUIDE.md), +[Locker](./CLIENT_LOCKER_USAGE_GUIDE.md), +[Notifications](./CLIENT_NOTIFICATIONS_USAGE_GUIDE.md), +[Organization](./CLIENT_ORG_USAGE_GUIDE.md), +[Phone](./CLIENT_PHONE_USAGE_GUIDE.md), +[Store](./CLIENT_STORE_USAGE_GUIDE.md). + +## Infrastructure Modules + +| Module | Purpose | Location | +| --- | --- | --- | +| `common` | Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces. | `arma/client/addons/common`, `arma/server/addons/common` | +| `extension` | Server SQF bridge around `forge_server` extension calls and chunked transport. | `arma/server/addons/extension` | +| `main` | Mod-level configuration, pre-init wiring, and server/client startup glue. | `arma/client/addons/main`, `arma/server/addons/main` | +| `economy` | Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank/cash first, then organization funds with repayable member debt when personal funds cannot cover the bill. | `arma/server/addons/economy` | +| `notifications` | Client notification UI, sounds, and UI event handling. | `arma/client/addons/notifications` | +| `icom` | Rust helper for interprocess communication and event broadcasting. | `bin/icom`, `arma/server/extension/src/icom.rs` | +| `terrain` | Extension-side terrain export helper. | `arma/server/extension/src/terrain.rs` | +| `transport` | Chunked request/response handling for large extension payloads. | `arma/server/extension/src/transport.rs` | +| `surreal` | SurrealDB connection lifecycle and status reporting. | `arma/server/extension/src/surreal.rs` | + +## Extension Command Groups + +Commands are invoked with: + +```sqf +"forge_server" callExtension ["group:command", [_arg1, _arg2]]; +``` + +Nested groups use additional `:` separators, for example +`bank:hot:deposit`. + +### Core + +| Command | Purpose | +| --- | --- | +| `version` | Return the extension version string. | +| `status` | Return SurrealDB connection state. | +| `surreal:status` | Return SurrealDB connection state directly from the Surreal module. | + +### Actor + +| Command | Purpose | +| --- | --- | +| `actor:get` | Fetch actor data for a resolved player UID. | +| `actor:create` | Create actor data from JSON. | +| `actor:update` | Apply actor JSON updates. | +| `actor:exists` | Return `true` or `false`. | +| `actor:delete` | Delete actor data. | +| `actor:hot:init`, `actor:hot:get`, `actor:hot:keys`, `actor:hot:override`, `actor:hot:save`, `actor:hot:remove` | Manage actor hot state. | + +See [Actor Usage Guide](./ACTOR_USAGE_GUIDE.md) for examples. + +### Bank + +| Command | Purpose | +| --- | --- | +| `bank:get`, `bank:create`, `bank:update`, `bank:exists`, `bank:delete` | Durable bank CRUD. | +| `bank:hot:init`, `bank:hot:get`, `bank:hot:override`, `bank:hot:patch`, `bank:hot:save`, `bank:hot:remove` | Manage bank hot state. | +| `bank:hot:deposit`, `bank:hot:withdraw`, `bank:hot:deposit_earnings`, `bank:hot:transfer` | Mutate hot bank balances with operation context. | +| `bank:hot:charge_checkout` | Charge a checkout against hot bank state. | +| `bank:hot:validate_pin`, `bank:hot:change_pin` | Validate and update PINs for bank operations. | + +See [Bank Usage Guide](./BANK_USAGE_GUIDE.md) for examples. + +### Garage + +| Command | Purpose | +| --- | --- | +| `garage:create`, `garage:get`, `garage:add`, `garage:update`, `garage:patch`, `garage:remove`, `garage:delete`, `garage:exists` | Durable player garage operations. | +| `garage:hot:init`, `garage:hot:get`, `garage:hot:override`, `garage:hot:add`, `garage:hot:remove_vehicle`, `garage:hot:save`, `garage:hot:remove` | Manage player garage hot state. | + +See [Garage Usage Guide](./GARAGE_USAGE_GUIDE.md) for examples. + +### Locker + +| Command | Purpose | +| --- | --- | +| `locker:create`, `locker:get`, `locker:add`, `locker:update`, `locker:patch`, `locker:remove`, `locker:delete`, `locker:exists` | Durable player locker operations. | +| `locker:hot:init`, `locker:hot:get`, `locker:hot:override`, `locker:hot:save`, `locker:hot:remove` | Manage player locker hot state. | + +See [Locker Usage Guide](./LOCKER_USAGE_GUIDE.md) for examples. + +### Organization + +| Command | Purpose | +| --- | --- | +| `org:get`, `org:create`, `org:update`, `org:exists`, `org:delete` | Durable organization CRUD. | +| `org:assets:get`, `org:assets:update` | Manage organization assets. | +| `org:fleet:get`, `org:fleet:update` | Manage organization fleet entries. | +| `org:members:get`, `org:members:add`, `org:members:remove` | Manage organization membership. | +| `org:hot:*` | Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove. | + +See [Org Usage Guide](./ORG_USAGE_GUIDE.md) for examples. + +### Phone + +| Command | Purpose | +| --- | --- | +| `phone:init` | Initialize phone state for a UID. | +| `phone:contacts:list`, `phone:contacts:add`, `phone:contacts:remove` | Manage contacts. | +| `phone:messages:list`, `phone:messages:thread`, `phone:messages:send`, `phone:messages:mark_read`, `phone:messages:delete` | Manage messages. | +| `phone:emails:list`, `phone:emails:send`, `phone:emails:mark_read`, `phone:emails:delete` | Manage emails. | +| `phone:remove` | Remove phone state for a UID. | + +See [Phone Usage Guide](./PHONE_USAGE_GUIDE.md) for examples. + +### CAD + +| Command Group | Purpose | +| --- | --- | +| `cad:activity:append`, `cad:activity:recent` | Append and read recent activity. | +| `cad:assignments:list`, `cad:assignments:assign`, `cad:assignments:acknowledge`, `cad:assignments:decline`, `cad:assignments:upsert`, `cad:assignments:delete` | Manage dispatch assignments. | +| `cad:orders:list`, `cad:orders:create`, `cad:orders:create_from_context`, `cad:orders:close`, `cad:orders:upsert`, `cad:orders:delete` | Manage orders. | +| `cad:requests:list`, `cad:requests:submit`, `cad:requests:submit_from_context`, `cad:requests:close`, `cad:requests:upsert`, `cad:requests:delete` | Manage requests. | +| `cad:profiles:list`, `cad:profiles:update_from_context`, `cad:profiles:upsert`, `cad:profiles:delete` | Manage profiles. | +| `cad:groups:build` | Build grouped CAD state. | +| `cad:view:hydrate` | Build the dispatcher view model. | + +See [CAD Usage Guide](./CAD_USAGE_GUIDE.md) for examples. + +### Task + +| Command Group | Purpose | +| --- | --- | +| `task:reset` | Reset task state. | +| `task:catalog:active`, `task:catalog:get`, `task:catalog:upsert`, `task:catalog:delete` | Manage task catalog entries. | +| `task:ownership:bind`, `task:ownership:release`, `task:ownership:accept`, `task:ownership:reward_context` | Manage task ownership and rewards. | +| `task:status:set`, `task:status:get`, `task:status:clear` | Manage task status. | +| `task:defuse:increment`, `task:defuse:get` | Manage defuse counters. | +| `task:clear` | Clear task state. | + +See [Task Usage Guide](./TASK_USAGE_GUIDE.md) for examples. + +### Owned Storage + +| Command Group | Purpose | +| --- | --- | +| `owned:garage:create`, `owned:garage:fetch`, `owned:garage:get`, `owned:garage:add`, `owned:garage:remove`, `owned:garage:delete`, `owned:garage:exists` | Owner-scoped vehicle storage. | +| `owned:garage:hot:*` | Owner-scoped vehicle hot state. | +| `owned:locker:create`, `owned:locker:fetch`, `owned:locker:get`, `owned:locker:add`, `owned:locker:remove`, `owned:locker:delete`, `owned:locker:exists` | Owner-scoped item storage. | +| `owned:locker:hot:*` | Owner-scoped item hot state. | + +See [Owned Storage Usage Guide](./OWNED_STORAGE_USAGE_GUIDE.md) for examples. + +### Other Extension Groups + +| Command Group | Purpose | +| --- | --- | +| `store:checkout` | Run store checkout behavior. | +| `icom:connect`, `icom:broadcast`, `icom:send_event` | ICOM connection and event forwarding. See [ICOM Usage Guide](./ICOM_USAGE_GUIDE.md). | +| `terrain:exportSVG` | Export terrain data as SVG. | +| `transport:invoke`, `transport:invoke_stored` | Invoke commands through transport. | +| `transport:request:append`, `transport:request:clear` | Manage stored request chunks. | +| `transport:response:get`, `transport:response:clear` | Manage stored response chunks. | + +## Rust Crates + +| Crate | Role | +| --- | --- | +| `forge-models` | Domain models and validation. Keep these serializable and free of persistence details. | +| `forge-repositories` | Repository traits and in-memory implementations. Keep these storage-agnostic. | +| `forge-services` | Business rules and workflows. Depend on repository traits, not concrete databases. | +| `forge-shared` | Cross-crate helpers. Keep dependencies light. | +| `forge-server` | Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters. | +| `forge-icom` | ICom helper binary and client library. | diff --git a/docs/ORG_USAGE_GUIDE.md b/docs/ORG_USAGE_GUIDE.md new file mode 100644 index 0000000..a4571a4 --- /dev/null +++ b/docs/ORG_USAGE_GUIDE.md @@ -0,0 +1,239 @@ +# Organization Usage Guide + +The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows. + +## Storage Model + +Core organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {} +} +``` + +Hot organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {}, + "assets": {}, + "fleet": {}, + "members": {}, + "pending_invites": {} +} +``` + +Rules validated by the Rust service: + +- `id` must be non-empty and contain only alphanumeric characters or `_`. +- `owner` must be `server` or a 17-digit Steam UID. +- `name` cannot be empty, cannot exceed 100 characters, and cannot contain + control characters. +- `funds`, reputation, and credit line amounts cannot be negative. +- Player registration is rejected when the player already belongs to a + non-default organization. +- Player registration through the server org addon requires a $50,000 personal + funds registration fee. The fee is charged from the player's bank balance + first, then on-hand cash if needed. + +## Durable Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `org:create` | `org_id`, `org_json` | Organization JSON. | +| `org:get` | `org_id` | Organization JSON. | +| `org:update` | `org_id`, `patch_json` | Updated organization JSON. | +| `org:exists` | `org_id` | `true` or `false`. | +| `org:delete` | `org_id` | `OK`. | +| `org:assets:get` | `org_id` | Asset map JSON. | +| `org:assets:update` | `org_id`, `assets_json` | Updated asset map JSON. | +| `org:fleet:get` | `org_id` | Fleet map JSON. | +| `org:fleet:update` | `org_id`, `fleet_json` | Updated fleet map JSON. | +| `org:members:get` | `org_id` | Member array JSON. | +| `org:members:add` | `org_id`, `member_uid` | `OK`. | +| `org:members:remove` | `org_id`, `member_uid` | `OK`. | + +## Create an Organization + +The command key is authoritative for `id`. + +```sqf +private _org = createHashMapFromArray [ + ["id", _orgId], + ["owner", getPlayerUID player], + ["name", "Spearnet Logistics"], + ["funds", 0], + ["reputation", 0], + ["credit_lines", createHashMap] +]; + +private _result = "forge_server" callExtension ["org:create", [ + _orgId, + toJSON _org +]]; +``` + +## Update Organization Funds + +```sqf +private _patch = createHashMapFromArray [ + ["funds", 5000], + ["reputation", 10] +]; + +private _result = "forge_server" callExtension ["org:update", [ + _orgId, + toJSON _patch +]]; +``` + +Supported durable patch fields are `id`, `owner`, `name`, `funds`, +`reputation`, and `credit_lines`. + +## Assets and Fleet + +Assets are grouped by category, then classname. + +```sqf +private _assets = createHashMapFromArray [ + ["ammo", createHashMapFromArray [ + ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [ + ["classname", "ACE_30Rnd_65x39_caseless_mag"], + ["type", "ammo"], + ["quantity", 20] + ]] + ]] +]; + +"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]]; +``` + +Fleet is keyed by an internal fleet entry ID. + +```sqf +private _fleet = createHashMapFromArray [ + ["B_Truck_01_transport_F_0", createHashMapFromArray [ + ["classname", "B_Truck_01_transport_F"], + ["name", "Transport Truck"], + ["type", "cars"], + ["status", "Ready"], + ["damage", "0%"] + ]] +]; + +"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `org:hot:init` | `org_id` | Hot organization JSON. | +| `org:hot:get` | `org_id` | Hot organization JSON. | +| `org:hot:override` | `org_id`, `hot_org_json` | Hot organization JSON. | +| `org:hot:ensure_member` | `context_json` | Hot organization JSON. | +| `org:hot:member_invites` | `member_uid` | Invite array JSON. | +| `org:hot:register` | `context_json` | Register result JSON. | +| `org:hot:invite_member` | `context_json` | Invite result JSON. | +| `org:hot:accept_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:decline_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:assign_credit_line` | `context_json` | Mutation result JSON. | +| `org:hot:repay_credit_line` | `context_json` | Repayment result JSON. | +| `org:hot:charge_checkout` | `context_json` | Mutation result JSON. | +| `org:hot:add_assets` | `context_json`, `assets_json` | Mutation result JSON. | +| `org:hot:add_fleet` | `context_json`, `fleet_json` | Mutation result JSON. | +| `org:hot:leave` | `context_json` | Leave result JSON. | +| `org:hot:disband` | `context_json` | Disband result JSON. | +| `org:hot:save` | `org_id` | Current hot organization JSON and async durable save. | +| `org:hot:remove` | `org_id` | `OK`. | + +## Register from UI Context + +The server-side `forge_server_org` registration flow charges the $50,000 +registration fee before completing organization creation. If the organization +service rejects the registration, the bank charge is refunded. + +```sqf +private _context = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["orgName", "Spearnet Logistics"], + ["existingOrgId", "default"] +]; + +private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]]; +``` + +## Invite and Accept + +```sqf +private _invite = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["targetUid", _targetUid], + ["targetName", _targetName], + ["targetOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]]; + +private _decision = createHashMapFromArray [ + ["requesterUid", _targetUid], + ["requesterName", _targetName], + ["orgId", _orgId], + ["existingOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]]; +``` + +## Credit Line Checkout + +```sqf +private _credit = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["memberUid", _memberUid], + ["memberName", _memberName], + ["amount", 1000] +]; + +"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]]; + +private _charge = createHashMapFromArray [ + ["requesterUid", _memberUid], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["source", "credit_line"], + ["amount", 250], + ["commit", true] +]; + +"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Organization error: %1", _payload]; +}; +``` diff --git a/docs/OWNED_STORAGE_USAGE_GUIDE.md b/docs/OWNED_STORAGE_USAGE_GUIDE.md new file mode 100644 index 0000000..1cc5223 --- /dev/null +++ b/docs/OWNED_STORAGE_USAGE_GUIDE.md @@ -0,0 +1,158 @@ +# Owned Storage Usage Guide + +Owned storage covers the `owned:locker` and `owned:garage` extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances. + +Use these modules for virtual arsenal and virtual garage unlocks. Use +[Locker Usage Guide](./LOCKER_USAGE_GUIDE.md) and +[Garage Usage Guide](./GARAGE_USAGE_GUIDE.md) for physical inventory and stored +vehicle instances. + +## Owned Locker Model + +```json +{ + "items": ["FirstAidKit"], + "weapons": ["arifle_MX_F"], + "magazines": ["30Rnd_65x39_caseless_black_mag"], + "backpacks": ["B_AssaultPack_rgr"] +} +``` + +Supported owned locker categories: + +- `items` +- `weapons` +- `magazines` +- `backpacks` + +New owned lockers are created with default unlocks from the Rust model. + +## Owned Garage Model + +```json +{ + "cars": ["B_Quadbike_01_F"], + "armor": [], + "helis": [], + "planes": [], + "naval": [], + "other": [] +} +``` + +Supported owned garage categories: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +The durable `owned:garage:remove` command currently accepts `heli` for the +helicopter category. Add, get, and hot remove accept `helis`. + +New owned garages are created with default unlocks from the Rust model. + +## Owned Locker Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:locker:create` | `uid` | Full owned locker JSON. | +| `owned:locker:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:get` | `uid`, `category` | Category classname array JSON. | +| `owned:locker:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:locker:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:locker:delete` | `uid` | `OK`. | +| `owned:locker:exists` | `uid` | `true` or `false`. | + +## Owned Garage Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:garage:create` | `uid` | Full owned garage JSON. | +| `owned:garage:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:get` | `uid`, `category` | Category classname array JSON. | +| `owned:garage:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:delete` | `uid` | `OK`. | +| `owned:garage:exists` | `uid` | `true` or `false`. | + +## Add Virtual Arsenal Unlocks + +```sqf +private _classes = ["arifle_MX_F", "hgun_P07_F"]; + +private _result = "forge_server" callExtension ["owned:locker:add", [ + getPlayerUID player, + "weapons", + toJSON _classes +]]; +``` + +## Add Virtual Garage Unlocks + +```sqf +private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"]; + +private _result = "forge_server" callExtension ["owned:garage:add", [ + getPlayerUID player, + "cars", + toJSON _classes +]]; +``` + +## Remove an Unlock + +```sqf +"forge_server" callExtension ["owned:locker:remove", [ + getPlayerUID player, + "weapons", + "arifle_MX_F" +]]; + +"forge_server" callExtension ["owned:garage:remove", [ + getPlayerUID player, + "cars", + "B_Quadbike_01_F" +]]; +``` + +## Hot-State Commands + +Both owned storage modules support hot state. + +Owned locker: + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:locker:hot:init` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:locker:hot:override` | `uid`, `locker_json` | Full owned locker JSON. | +| `owned:locker:hot:save` | `uid` | Current hot owned locker JSON and async durable save. | +| `owned:locker:hot:remove` | `uid` | `OK`. | + +Owned garage: + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:garage:hot:init` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:garage:hot:override` | `uid`, `garage_json` | Full owned garage JSON. | +| `owned:garage:hot:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:hot:remove_item` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:hot:save` | `uid` | Current hot owned garage JSON and async durable save. | +| `owned:garage:hot:remove` | `uid` | `OK`. | + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Owned storage error: %1", _payload]; +}; +``` diff --git a/docs/PHONE_USAGE_GUIDE.md b/docs/PHONE_USAGE_GUIDE.md new file mode 100644 index 0000000..6cd0829 --- /dev/null +++ b/docs/PHONE_USAGE_GUIDE.md @@ -0,0 +1,136 @@ +# Phone Usage Guide + +The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB. + +## Storage Model + +```json +{ + "contacts": ["76561198000000000", "field_commander"], + "messages": [ + { + "id": "phone-message:sender:receiver:1", + "from": "sender", + "to": "receiver", + "message": "Text body", + "timestamp": 123.45, + "read": false + } + ], + "emails": [ + { + "id": "phone-email:sender:receiver:2", + "from": "sender", + "to": "receiver", + "subject": "Subject", + "body": "Email body", + "timestamp": 123.45, + "read": false + } + ] +} +``` + +Rules validated by the Rust service: + +- UID arguments cannot be empty. +- Message and email bodies cannot be empty. +- Empty email subjects become `No subject`. +- Player messages and emails cannot target `field_commander`. +- `field_commander` can send messages or emails to players. +- Deleting a message or email removes it only from the requesting UID's index. + +## Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `phone:init` | `uid` | Full phone payload. | +| `phone:contacts:list` | `uid` | Contact UID array. | +| `phone:contacts:add` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:contacts:remove` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:messages:list` | `uid` | Message array. | +| `phone:messages:thread` | `uid`, `other_uid` | Message array for both participants. | +| `phone:messages:send` | `from_uid`, `to_uid`, `message`, `timestamp` | Message JSON. | +| `phone:messages:mark_read` | `uid`, `message_id` | `true` or `false`. | +| `phone:messages:delete` | `uid`, `message_id` | `true` or `false`. | +| `phone:emails:list` | `uid` | Email array. | +| `phone:emails:send` | `from_uid`, `to_uid`, `subject`, `body`, `timestamp` | Email JSON. | +| `phone:emails:mark_read` | `uid`, `email_id` | `true` or `false`. | +| `phone:emails:delete` | `uid`, `email_id` | `true` or `false`. | +| `phone:remove` | `uid` | `OK`. | + +## Initialize Phone State + +`phone:init` creates phone state if needed and seeds self-contact plus +`field_commander`. + +```sqf +private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Phone init failed: %1", _payload]; +}; + +private _phone = fromJSON _payload; +``` + +## Send a Message + +```sqf +private _timestamp = str diag_tickTime; + +private _result = "forge_server" callExtension ["phone:messages:send", [ + getPlayerUID player, + _targetUid, + "Move to checkpoint Alpha.", + _timestamp +]]; +``` + +## Read a Conversation + +```sqf +private _result = "forge_server" callExtension ["phone:messages:thread", [ + getPlayerUID player, + _otherUid +]]; + +private _messages = fromJSON (_result select 0); +``` + +## Send an Email + +```sqf +private _result = "forge_server" callExtension ["phone:emails:send", [ + getPlayerUID player, + _targetUid, + "Supply Request", + "Requesting resupply at grid 123456.", + str diag_tickTime +]]; +``` + +## Mark and Delete Records + +```sqf +"forge_server" callExtension ["phone:messages:mark_read", [ + getPlayerUID player, + _messageId +]]; + +"forge_server" callExtension ["phone:emails:delete", [ + getPlayerUID player, + _emailId +]]; +``` + +## Error Handling + +```sqf +private _payload = (_result select 0); +if (_payload find "Error:" == 0) then { + systemChat format ["Phone error: %1", _payload]; +}; +``` diff --git a/docs/PLAYER_GUIDE.md b/docs/PLAYER_GUIDE.md new file mode 100644 index 0000000..ccfa656 --- /dev/null +++ b/docs/PLAYER_GUIDE.md @@ -0,0 +1,324 @@ +# Player Guide + +Use this guide as the player-facing overview for Forge systems. It explains +what players interact with during normal missions, how task assignment works, +and what persistent storage limits apply. + +## Opening Forge Interactions + +Most Forge actions are opened from the actor interaction menu while standing +near a configured mission object. + +![Custom interaction menu](images/player/interaction_menu.jpg) + +Press `Tab` by default to open the custom interaction menu. Server settings or +local keybind changes may use a different key. + +Known current behavior: after closing the custom interaction menu, players may +need to press `Tab` twice before it opens again. Treat this as a temporary +workaround until the interaction menu focus behavior is investigated further. + +Players usually need to be within 5 meters of an interaction object such as a +bank terminal, ATM, store counter, garage terminal, or locker. + +## CAD and Tasks + +CAD is the main task and dispatch system. It is used for mission contracts, +group status, support requests, dispatch orders, and task assignment. + +![CAD operations task board](images/player/cad_ops_board.jpg) + +Player workflow: + +1. Open CAD from the available interaction path. +2. Review available or assigned tasks. +3. If a dispatcher assigns a task to your group, the group leader must + acknowledge or decline it. +4. Once acknowledged, the task becomes active for the assigned group. +5. Complete the task objective shown by CAD, map task state, and mission + instructions. + +Map focus behavior: + +- Click an assigned or accepted task in the operations task board to center the + map on that task. +- Click a roster member to center the map on that player. +- Click a support request to center the map on the request location. +- Dispatch map mode supports the same focus behavior for groups, contracts, + and support requests. + +Dispatch workflow: + +![CAD dispatch board](images/player/cad_dispatch_board.jpg) + +1. Open CAD with a dispatcher-enabled slot or permission. +2. Use dispatch mode to review groups, open contracts, assigned contracts, and + support requests. +3. Assign available contracts to active groups. +4. Send dispatch orders or close completed orders as needed. +5. Track group status and recent CAD activity. + +Dispatch access: + +- The CEO slot can administer the default organization and use CAD dispatch + permissions. +- The Dispatch slot grants CAD dispatch permissions without default + organization administration rights. +- Players who are the CEO or owner of their own organization also receive CAD + dispatch permissions. + +Important task behavior: + +- CAD assignment reserves a task for a group. +- The task starts after the assigned group leader acknowledges it. +- If the leader declines, the task returns to the open contract board. +- Some task timers wait for group-leader acknowledgment before counting down. + +## Phone + +The phone provides contacts, messages, email, mobile bank access, and local +utility apps. + +![Phone home screen](images/player/phone_home.jpg) + +### Contacts + +Use Contacts to keep track of other players by phone number or email address. +Adding contacts makes it easier to start messages and emails without manually +entering recipient details every time. + +![Phone contacts screen](images/player/phone_contacts.jpg) + +### Messages + +Messages are short player-to-player conversations. Use Messages to start or +continue a conversation with a contact, read incoming messages, mark messages as +read, or delete messages you no longer need. + +![Phone messages screen](images/player/phone_messages.jpg) + +![Example phone message conversation](images/player/phone_message_example.jpg) + +### Email + +Email is used for longer player-to-player communication. Use Email to send a +subject and body to another player, read incoming mail, mark email as read, or +delete old email. + +![Phone email screen](images/player/phone_email.jpg) + +![Example phone email](images/player/phone_email_example.jpg) + +### Wallet + +Wallet is the phone version of the bank app. Use it to refresh your account +view, check your available balance, review cash and pending earnings, deposit all +pending earnings, and pay your organization credit line when payment is due. + +![Phone wallet app](images/player/phone_wallet.jpg) + +Deposit Earnings deposits the full pending earnings amount. Players do not enter +a custom amount for that action. + +### Local Phone Apps + +Notes, calendar events, clocks, alarms, and theme preferences are local utility +features. They are saved for the local player profile and should not be treated +as shared multiplayer data. + +## Bank and ATM + +Bank and ATM access are separate. + +Use a bank object for full banking: + +![Bank app](images/player/bank_app.jpg) + +- view account information +- transfer funds +- deposit earnings +- change PIN + +Use an ATM for limited account access: + +![ATM PIN screen](images/player/atm_app_pin.jpg) + +![ATM home screen](images/player/atm_app_home.jpg) + +- PIN-gated account actions +- ATM banking workflows +- no PIN changes + +If a PIN prompt appears, enter the correct PIN before attempting account +actions. + +## Organizations + +Players start in the default organization. A player can create a player-owned +organization only if they have `$50,000` available for the registration fee. +Organization access depends on the player's role. + +![Organization home screen](images/player/org_home.jpg) + +![Organization registration screen](images/player/org_registration.jpg) + +Default organization: + +- The `ceo` slot can administer the default organization. +- The `dispatch` slot receives CAD dispatch permissions, but does not receive + default organization administration rights. + +Player-owned organizations: + +![Organization dashboard](images/player/org_dashboard.jpg) + +![Organization treasury screen](images/player/org_treasury.jpg) + +- The player who created the organization is its owner or CEO. +- The owner can administer the organization, including treasury and roster + actions exposed by the organization interface. +- Organization owners can invite players, manage members, assign credit lines, + transfer funds or run payroll when funds are available, and disband the + organization. +- Organization owners can use organization funds for supported store purchases. +- Members may receive assigned credit lines, accept or decline organization + invites, and leave the organization. +- The organization CEO or owner cannot leave their own organization directly. + They must disband the organization if they want to leave it. + +Organization actions are server-authoritative. If an organization action fails, +check that the player has the correct role, the player or organization has +enough funds, and the target player is eligible for the action. + +## Store + +Stores sell unlocks and equipment through the configured server-side catalog. + +![Store catalog](images/player/store_catalog.jpg) + +Store purchases may grant: + +- items or equipment added to the locker +- matching gear unlocks in the virtual arsenal +- vehicle unlocks in the virtual garage +- other mission-configured rewards + +Store purchases are server-authoritative. If a purchase succeeds, the relevant +bank, locker, virtual arsenal, virtual garage, or organization state updates +from the server. + +![Store checkout result](images/player/store_checkout.jpg) + +Vehicle purchases unlock the vehicle in the virtual garage. They do not place a +physical vehicle into the player's 5-slot garage. Use the virtual garage to +spawn an unlocked vehicle, and use the garage to store or retrieve live world +vehicles. + +## Locker and Virtual Arsenal + +The locker is personal item storage. + +![Locker storage](images/player/locker.jpg) + +Locker rules: + +- Up to 25 items can be stored. +- The locker saves when the locker container is closed. +- Over-capacity storage can warn or fail depending on server handling. + +The virtual arsenal is locked down. Players only see gear they have been +granted or have unlocked through systems such as the store. The virtual arsenal +is not intended to expose the full unrestricted Arma arsenal. + +![Virtual arsenal unlocks](images/player/virtual_arsenal.jpg) + +## Garage and Virtual Garage + +The garage stores physical player vehicles that have been saved from the world. + +![Garage dashboard](images/player/garage.jpg) + +Garage rules: + +- Up to 5 vehicles can be stored. +- Stored vehicles can be retrieved from a garage interaction point. +- Retrieved vehicles become live world vehicles again. +- Vehicle service actions operate on live nearby vehicles, not vehicles that + are still stored. + +The virtual garage is locked down. Players only see vehicles they have been +granted or have unlocked through systems such as the store. Virtual garage +unlocks are separate from the 5 physical vehicle slots in the garage. The +virtual garage uses mission-configured spawn lanes, and spawning may be blocked +if the spawn position is occupied. + +![Virtual garage unlocks](images/player/virtual_garage.jpg) + +## Economy Services + +Economy services are server-controlled. Charges must succeed before the world +effect is applied. + +![Garage service controls](images/player/garage.jpg) + +### Medical + +Medical services are player-funded first. + +![Medical respawn screen](images/player/medical_respawn.jpg) + +Billing order: + +1. Player bank balance. +2. Player cash. +3. Organization funds, when allowed by the server. +4. Organization credit-line debt for the player when organization fallback is + used. + +Medical respawn placement uses mission-configured medical spawn objects. + +### Refuel + +Refuel service is organization-funded. If the organization cannot cover the +cost, the vehicle is not refueled or the fuel level is rolled back. + +Refuel is available from the garage app dashboard shown above. + +### Repair + +Repair service is organization-funded. The repair is only applied after the +organization charge succeeds. + +Repair is available from the garage app dashboard shown above. + +### Rearm + +If the mission exposes rearm service through the economy or support workflow, +expect it to follow the same server-authoritative pattern: the service request +must be accepted and billed before equipment or vehicle state changes are +applied. + +Rearm is available from the garage app dashboard shown above. + +## Common Player Checks + +If a system does not appear or does not work: + +- Move closer to the interaction object. +- Confirm you are using the correct object type, such as ATM vs bank. +- Confirm your group leader has acknowledged an assigned CAD task. +- Confirm the needed store unlock has been purchased before checking VA or VG. +- Confirm the garage spawn point is clear before using the virtual garage. +- Confirm your player, cash, bank, or organization funds can cover the service. + +## Related Guides + +- [Mission Designer Guide](./MISSION_DESIGNER_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) +- [Client Phone Usage Guide](./CLIENT_PHONE_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Organization Usage Guide](./ORG_USAGE_GUIDE.md) +- [Store Usage Guide](./STORE_USAGE_GUIDE.md) +- [Economy Usage Guide](./ECONOMY_USAGE_GUIDE.md) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..5258bd5 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,79 @@ +# Forge Documentation + +Forge is split into Arma client addons, Arma server addons, a Rust server +extension, shared Rust domain crates, and web UI build tooling. This directory +collects framework-level documentation for those pieces. + +## Launch Prerequisites + +Before starting a Forge-enabled dedicated server or local multiplayer test, +server owners and developers must: + +1. Start SurrealDB. +2. Place `config.toml` beside `forge_server_x64.dll`. +3. Keep the `config.toml` SurrealDB endpoint, namespace, database, username, + and password aligned with the running database. + +Mission designers and players do not need to run SurrealDB unless they are +hosting locally, but the server they join must have these prerequisites ready. +See [SurrealDB Setup](./surrealdb-setup.md) for the full setup path. + +## Start Here + +- [Framework Architecture](./FRAMEWORK_ARCHITECTURE.md): how SQF, web UIs, + Rust services, repositories, and SurrealDB fit together. +- [Module Reference](./MODULE_REFERENCE.md): module inventory for gameplay + domains, extension command groups, client addons, server addons, and Rust + crates. +- [Development Guide](./DEVELOPMENT_GUIDE.md): how to add or change a module + without breaking the framework boundaries. +- [Git Workflow](./GIT_WORKFLOW.md): branch roles, mission branch usage, and + release tagging. +- [Mission Designer Guide](./MISSION_DESIGNER_GUIDE.md): how to place Eden + objects, garage markers, and CAD-compatible task modules for playable + missions. +- [Player Guide](./PLAYER_GUIDE.md): how players use CAD, phone, bank, store, + locker, garage, and economy services during missions. +- [SurrealDB Setup](./surrealdb-setup.md): where to get SurrealDB or + Surrealist and how to connect Forge to it for local or live use. + +## Server and Extension Usage Guides + +- [Actor Usage Guide](./ACTOR_USAGE_GUIDE.md) +- [Bank Usage Guide](./BANK_USAGE_GUIDE.md) +- [CAD Usage Guide](./CAD_USAGE_GUIDE.md) +- [Economy Usage Guide](./ECONOMY_USAGE_GUIDE.md) +- [Garage Usage Guide](./GARAGE_USAGE_GUIDE.md) +- [ICOM Usage Guide](./ICOM_USAGE_GUIDE.md) +- [Locker Usage Guide](./LOCKER_USAGE_GUIDE.md) +- [Organization Usage Guide](./ORG_USAGE_GUIDE.md) +- [Owned Storage Usage Guide](./OWNED_STORAGE_USAGE_GUIDE.md) +- [Phone Usage Guide](./PHONE_USAGE_GUIDE.md) +- [Store Usage Guide](./STORE_USAGE_GUIDE.md) +- [Task Usage Guide](./TASK_USAGE_GUIDE.md) + +## Client Usage Guides + +- [Client Usage Guide](./CLIENT_USAGE_GUIDE.md) +- [Client Main Usage Guide](./CLIENT_MAIN_USAGE_GUIDE.md) +- [Client Common Usage Guide](./CLIENT_COMMON_USAGE_GUIDE.md) +- [Client Actor Usage Guide](./CLIENT_ACTOR_USAGE_GUIDE.md) +- [Client Bank Usage Guide](./CLIENT_BANK_USAGE_GUIDE.md) +- [Client CAD Usage Guide](./CLIENT_CAD_USAGE_GUIDE.md) +- [Client Garage Usage Guide](./CLIENT_GARAGE_USAGE_GUIDE.md) +- [Client Locker Usage Guide](./CLIENT_LOCKER_USAGE_GUIDE.md) +- [Client Notifications Usage Guide](./CLIENT_NOTIFICATIONS_USAGE_GUIDE.md) +- [Client Organization Usage Guide](./CLIENT_ORG_USAGE_GUIDE.md) +- [Client Phone Usage Guide](./CLIENT_PHONE_USAGE_GUIDE.md) +- [Client Store Usage Guide](./CLIENT_STORE_USAGE_GUIDE.md) + +## Related Documentation + +- [Server Extension Docs](../arma/server/docs/README.md) +- [Server Extension API Reference](../arma/server/docs/api-reference.md) +- [Server Extension Usage Examples](../arma/server/docs/usage-examples.md) +- [Client Addon Docs](../arma/client/docs/README.md) +- [Shared Rust Libraries](../lib/README.md) +- [Repository Crate](../lib/repositories/README.md) +- [Service Crate](../lib/services/README.md) +- [Model Crate](../lib/models/README.md) diff --git a/docs/STORE_USAGE_GUIDE.md b/docs/STORE_USAGE_GUIDE.md new file mode 100644 index 0000000..f947863 --- /dev/null +++ b/docs/STORE_USAGE_GUIDE.md @@ -0,0 +1,151 @@ +# Store Usage Guide + +The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks. + +## Server SQF Module + +The server addon uses two long-lived module objects: + +- `StorefrontStore` is the storefront workflow facade. It builds hydrate + payloads, validates checkout requests, calls the Rust `store:checkout` + command, syncs UI patches, and asks related module stores to save hot state. +- `StoreCatalogService` scans configured item and vehicle categories, builds + catalog responses, resolves checkout entries, and calculates authoritative + prices. + +Editor-placed store entities are initialized by `fnc_initStore` during store +post-init. The initializer matches non-null mission namespace objects whose +variable names contain `store` and sets `isStore = true`, following the same +pattern used by garage entities. + +## Checkout Model + +`store:checkout` accepts one JSON context. + +```json +{ + "requesterUid": "76561198000000000", + "requesterName": "Player Name", + "orgId": "default", + "requesterIsDefaultOrgCeo": false, + "paymentMethod": "bank", + "items": [ + { + "classname": "arifle_MX_F", + "category": "weapon", + "priceValue": 500, + "quantity": 1 + } + ], + "vehicles": [ + { + "classname": "B_Quadbike_01_F", + "category": "cars", + "priceValue": 1500 + } + ] +} +``` + +Rules validated by the Rust service: + +- `requesterUid` is required. +- At least one item or vehicle is required. +- The checkout total must be greater than zero. +- Item categories must be `item`, `attachment`, `weapon`, `magazine`, or + `backpack`. +- Vehicle categories must be `cars`, `armor`, `helis`, `planes`, `naval`, or + `other`. +- Payment method must be `cash`, `bank`, `org_funds`, or `credit_line`. +- Player locker capacity cannot exceed 25 unique items after checkout. +- Organization funds can only be charged by the org owner or the default org + CEO flag. + +## Command + +| Command | Arguments | Returns | +| --- | --- | --- | +| `store:checkout` | `checkout_json` | Checkout result JSON. | + +## Result Model + +```json +{ + "chargedTotal": 2000.0, + "paymentMethod": "bank", + "message": "Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).", + "lockerGranted": [], + "vehicleGranted": [], + "lockerPatch": {}, + "vaPatch": {}, + "vgaragePatch": {}, + "bankPatch": {}, + "orgPatch": {}, + "orgTargetUids": [] +} +``` + +Patch fields are intended for UI updates after checkout. The service commits +all grants and payment changes together, and attempts rollback if a later write +fails. + +## Player Bank Checkout + +```sqf +private _item = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["category", "weapon"], + ["priceValue", 500], + ["quantity", 1] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [_item]], + ["vehicles", []] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Organization Funds Checkout + +When `paymentMethod` is `org_funds`, vehicles are also added to the +organization fleet patch. + +```sqf +private _vehicle = createHashMapFromArray [ + ["classname", "B_Quadbike_01_F"], + ["category", "cars"], + ["priceValue", 1500] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "org_funds"], + ["items", []], + ["vehicles", [_vehicle]] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Checkout failed: %1", _payload]; +}; + +private _checkoutResult = fromJSON _payload; +``` diff --git a/docs/SURREALDB_SETUP.md b/docs/SURREALDB_SETUP.md new file mode 100644 index 0000000..b26119c --- /dev/null +++ b/docs/SURREALDB_SETUP.md @@ -0,0 +1,140 @@ +# SurrealDB Setup + +Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config. + +## Launch Requirement + +Before launching an Arma server or local multiplayer test with Forge enabled: + +1. Start SurrealDB and confirm it is listening on the endpoint Forge will use. +2. Copy `arma/server/extension/config.example.toml` to `config.toml` beside + `forge_server_x64.dll`. +3. Make sure `config.toml` matches the running SurrealDB endpoint, namespace, + database, username, and password. + +Server owners and developers must do this before starting the dedicated server +or hosting a test session. Mission designers and players do not need their own +SurrealDB instance unless they are running the server locally, but the server +they connect to must have SurrealDB running and configured. + +If SurrealDB is not running, or if `config.toml` points at the wrong endpoint +or credentials, persistence-backed systems such as actors, bank accounts, +garages, lockers, organizations, phone data, stores, and tasks will not be +ready for normal gameplay. + +## Choose the Right Path + +### Developer or Server Operator + +Use this path if you are building Forge, running a local test server, or +hosting the live Arma server. + +Official SurrealDB resources: + +- [SurrealDB install page](https://surrealdb.com/install) +- [SurrealDB CLI `start` reference](https://surrealdb.com/docs/surrealdb/cli/start) + +Forge also includes helper scripts under `arma/server/surrealdb`: + +```powershell +cd arma/server/surrealdb +.\UpdateMe.bat +.\RunMe.bat +``` + +On Linux or macOS: + +```bash +cd arma/server/surrealdb +./setup.sh +./run.sh +``` + +Install SurrealDB with the official method for your platform: + +```powershell +# Windows +iwr https://windows.surrealdb.com -useb | iex +``` + +```bash +# macOS +brew install surrealdb/tap/surreal +``` + +```bash +# Linux +curl -sSf https://install.surrealdb.com | sh +``` + +For Forge, start a persistent local database instead of the default in-memory +mode: + +```powershell +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db +``` + +`root`/`root` is only the local development default. For a public or shared +server, set a real password and keep `config.toml` aligned. + +Then copy `arma/server/extension/config.example.toml` to `config.toml` next to +`forge_server_x64.dll` and keep the values aligned with the database you +started: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +Before starting the game server, confirm SurrealDB is still running. After +launching the Arma server: + +1. Let the extension connect and apply the Forge schema modules. +2. Verify the connection state: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's `config.toml`. + +### Mission Designer or Community Manager/Leader + +Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code. + +Official SurrealDB resources: + +- [Surrealist installation](https://surrealdb.com/docs/surrealist/installation) +- [Surrealist web app](https://app.surrealdb.com) +- [Surrealist local database serving](https://surrealdb.com/docs/surrealist/concepts/local-database-serving) + +Recommended approach: + +1. Install **Surrealist Desktop**. It is the better fit for Forge because the + official docs note that the web app can be limited when connecting to + `localhost` or non-HTTPS endpoints. +2. Connect Surrealist to the same database Forge uses. +3. Use the values from the server's `config.toml`: + +```text +Endpoint: http://127.0.0.1:8000 +Namespace: forge +Database: main +Username: root +Password: root +``` + +If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +`surreal` executable is installed and available on your `PATH`. diff --git a/docs/TASK_USAGE_GUIDE.md b/docs/TASK_USAGE_GUIDE.md new file mode 100644 index 0000000..e971204 --- /dev/null +++ b/docs/TASK_USAGE_GUIDE.md @@ -0,0 +1,585 @@ +# Task Usage Guide + +The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants. + +The server addon at `arma/server/addons/task` also owns task execution: +creating BIS tasks, registering task entities, tracking participants, binding +task ownership, applying player/org rewards, and clearing task state when a +task completes. + +Runtime dependencies: + +- `forge_server_extension` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_bank` +- `forge_server_org` +- `forge_client_notifications` + +## Data Model + +Catalog entries are flexible JSON objects. The service normalizes these fields +when a catalog entry is inserted or ownership changes: + +- `taskId` +- `taskID` +- `accepted` +- `requesterUid` +- `orgID` +- `prerequisiteTaskIds` + +Ownership context: + +```json +{ + "requesterUid": "76561198000000000", + "orgId": "default" +} +``` + +## Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `task:reset` | none | `true`. | +| `task:catalog:active` | none | Active catalog entry array JSON. | +| `task:catalog:get` | `task_id` | Catalog entry JSON or `null`. | +| `task:catalog:upsert` | `task_id`, `entry_json` | Stored catalog entry JSON. | +| `task:catalog:delete` | `task_id` | `true`. | +| `task:ownership:bind` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:release` | `task_id` | Ownership mutation result JSON. | +| `task:ownership:accept` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:reward_context` | `task_id` | Reward context JSON. | +| `task:status:set` | `task_id`, `status` | `true`. | +| `task:status:get` | `task_id` | Status string JSON. | +| `task:status:clear` | `task_id` | `true`. | +| `task:defuse:increment` | `task_id` | New counter value JSON. | +| `task:defuse:get` | `task_id` | Counter value JSON. | +| `task:clear` | `task_id` | `true`. | + +## Upsert a Catalog Entry + +```sqf +private _entry = createHashMapFromArray [ + ["title", "Destroy Cache"], + ["description", "Destroy the enemy supply cache."], + ["reward", 1500] +]; + +private _result = "forge_server" callExtension ["task:catalog:upsert", [ + "task-cache-1", + toJSON _entry +]]; +``` + +## Mark a Task Active + +```sqf +"forge_server" callExtension ["task:status:set", [ + "task-cache-1", + "active" +]]; + +private _active = "forge_server" callExtension ["task:catalog:active", []]; +``` + +Completed statuses `succeeded` and `failed` are also stored as completed status +fallbacks. Clearing status removes active and completed state. + +## Accept a Task + +```sqf +private _ownership = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", "default"] +]; + +private _result = "forge_server" callExtension ["task:ownership:accept", [ + "task-cache-1", + toJSON _ownership +]]; +``` + +`task:ownership:accept` fails if the task is not active or another requester +already accepted it. + +## Rewards + +```sqf +private _result = "forge_server" callExtension ["task:ownership:reward_context", [ + "task-cache-1" +]]; + +private _context = fromJSON (_result select 0); +``` + +The reward context contains `requesterUid` and `orgId`. + +## Server Task Flows + +The task addon provides these server-owned task flows: + +- `attack` +- `defend` +- `defuse` +- `delivery` +- `destroy` +- `hostage` +- `hvt` + +Mission designers can create tasks in four ways: + +- Eden modules for editor-authored tasks. +- `forge_server_task_fnc_startTask` for script-authored tasks. +- `forge_server_task_fnc_handler` for pre-registered entities with reputation + gating and ownership binding. This path expects the BIS task and catalog + entry to already exist if map-task and CAD visibility are required. +- Direct task function calls for server-owned or mission-authored flows that + intentionally fall back to the `default` org. This path expects the BIS task + to already exist if map-task visibility is required. + +The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path. + +## CAD Compatibility + +CAD hydrates assignable tasks from `TaskStore.getActiveTaskCatalog`. A task must +have a catalog entry and a task status of `available`, `assigned`, or `active` +before CAD can show it. +CAD assignment only reserves a task for a group. The task is accepted and task +logic starts after the assigned group leader acknowledges the assignment. If +the leader declines, the CAD assignment is removed and the task returns to the +open contract board. + +CAD-compatible creation paths: + +- Eden modules: compatible because they delegate to + `forge_server_task_fnc_startTask`. +- `forge_server_task_fnc_startTask`: compatible because it registers the + catalog entry, creates the BIS task, and dispatches through the handler. +- Dynamic mission manager attack tasks: compatible because the mission manager + uses `forge_server_task_fnc_startTask`. + +Limited or incompatible paths: + +- `forge_server_task_fnc_handler`: only compatible if a catalog entry was + already registered elsewhere. The handler sets available status and ownership, + but it does not create the BIS task shown in the map task tab or upsert the + catalog entry. +- Direct task function calls: not CAD-compatible by default. They bypass + `startTask` and usually do not register the task catalog entry or active + status that CAD hydrates from. They also only call `BIS_fnc_taskSetState` at + completion/failure; they do not create the BIS task first. + +## BIS Map Task Prerequisite + +Only the Eden task modules and `forge_server_task_fnc_startTask` create the BIS +task automatically through `BIS_fnc_taskCreate`. + +If a mission uses `forge_server_task_fnc_handler` directly or calls a task flow +function such as `forge_server_task_fnc_attack`, the mission must create a BIS +task with the same task ID before the Forge task completes. Otherwise the +success/failure `BIS_fnc_taskSetState` call has no visible map task to update. + +That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted `BIS_fnc_taskCreate` call. `forge_server_task_fnc_startTask` is the +preferred Forge path because it handles BIS task creation, Forge catalog +registration, entity registration, and handler dispatch together. + +## Eden Modules + +Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules. + +Available task modules: + +- `FORGE_Module_Attack`: sync directly to target units or vehicles. +- `FORGE_Module_Destroy`: sync directly to objects, vehicles, or units. +- `FORGE_Module_Defuse`: sync to `FORGE_Module_Explosives` and optionally + `FORGE_Module_Protected`. +- `FORGE_Module_Delivery`: sync to `FORGE_Module_Cargo`; the cargo module syncs + to cargo objects. +- `FORGE_Module_Hostage`: sync to `FORGE_Module_Hostages` and + `FORGE_Module_Shooters`. +- `FORGE_Module_HVT`: sync directly to HVT units. +- `FORGE_Module_Defend`: configure the defense marker and wave settings; sync + enemy units to use their groups as wave templates. + +These modules delegate to `forge_server_task_fnc_startTask`. + +Each task module also includes an optional chain field: + +- `Prerequisite Task IDs`: comma-separated task IDs that must succeed first. + +## Mission Designer Guide + +This section is the practical Eden setup guide for mission designers. + +### General Rules + +Use these rules for every Forge task: + +1. Give every task a unique `TaskID`. +2. Use area markers for zone-style fields such as: + - `DefenseZone` + - `DeliveryZone` + - `ExtZone` + - `CBRNZone` +3. Prefer `RECTANGLE` or `ELLIPSE` markers with real size. +4. Set success and fail limits explicitly instead of relying on defaults. +5. If a task uses a timer, the countdown now waits until the assigned group + leader acknowledges the task. +6. Grouping modules such as `Explosive Entities`, `Protected Entities`, + `Cargo`, `Hostages`, and `Shooters` should be synced to real world objects, + not other logic modules. +7. To chain tasks, set `Prerequisite Task IDs` on the dependent task module. + Use comma-separated IDs such as `attack_01, delivery_02`. The dependent + task stays hidden from CAD and cannot be assigned until every listed task + succeeds. +8. Reward class fields accept comma-separated class names without brackets, + such as `ItemGPS, FirstAidKit`. Legacy SQF array strings such as + `["ItemGPS","FirstAidKit"]` are still supported. + +### Attack Task + +Use `FORGE_Module_Attack` when players need to eliminate hostile units or +vehicles. + +Setup: + +1. Place the enemy units or vehicles. +2. Place `FORGE_Module_Attack`. +3. Set `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be killed. +5. Set `LimitFail` if you want a fail threshold. +6. Set rewards, rating, and optional `TimeLimit`. +7. Sync the attack module directly to the target units or vehicles. + +Notes: + +- This module reads its synced entities directly. +- `TimeLimit` uses seconds. `0` means no limit. + +### Destroy Task + +Use `FORGE_Module_Destroy` when players must destroy objects, vehicles, or +units. + +Setup: + +1. Place the objects, vehicles, or units that must be destroyed. +2. Place `FORGE_Module_Destroy`. +3. Set `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be destroyed. +5. Set `LimitFail` if the mission should fail after too many losses. +6. Set rewards, rating, and optional `TimeLimit`. +7. Sync the destroy module directly to the targets. + +Notes: + +- This module reads its synced entities directly. +- `TimeLimit` uses seconds. `0` means no limit. + +### Defuse Task + +Use `FORGE_Module_Defuse` when players must defuse one or more explosives while +protecting other entities. + +Required module layout: + +```text +[Defuse Task] --> [Explosive Entities] --> explosive objects +[Defuse Task] --> [Protected Entities] --> protected objects/vehicles/units +``` + +Setup: + +1. Place the explosive objects that players must defuse. +2. Place `FORGE_Module_Explosives`. +3. Sync each explosive object to `FORGE_Module_Explosives`. +4. Place the objects, vehicles, or units that must survive. +5. Place `FORGE_Module_Protected`. +6. Sync each protected entity to `FORGE_Module_Protected`. +7. Place `FORGE_Module_Defuse`. +8. Set `TaskID`. +9. Set `LimitSuccess` to the number of explosives that must be defused. +10. Set `LimitFail` to the number of protected entities that can be lost before failure. +11. Set `TimeLimit` to the IED countdown in seconds. This is per-IED countdown behavior, not a global mission timer. +12. Set rewards, rating, and end-state options. +13. Sync `FORGE_Module_Defuse` to `FORGE_Module_Explosives`. +14. Sync `FORGE_Module_Defuse` to `FORGE_Module_Protected`. + +Notes: + +- The module reads grouped objects from the `Explosive Entities` and + `Protected Entities` modules, not from direct object syncs. +- Logic objects are filtered out already, so only real explosives and protected + entities are counted. +- The ACE defuse event is wired to the task system and resolves IEDs back to + the correct task. + +### Delivery Task + +Use `FORGE_Module_Delivery` when players must move cargo into a delivery zone. + +Required module layout: + +```text +[Delivery Task] --> [Cargo] --> cargo objects +``` + +Setup: + +1. Place the cargo objects. +2. Create an area marker for the delivery zone. +3. Place `FORGE_Module_Cargo`. +4. Sync each cargo object to `FORGE_Module_Cargo`. +5. Place `FORGE_Module_Delivery`. +6. Set `TaskID`. +7. Set `DeliveryZone` to the marker name. +8. Set `LimitSuccess` to the number of cargo objects that must arrive. +9. Set `LimitFail` to the number of cargo objects that can be damaged past the fail threshold. +10. Set rewards, rating, and optional `TimeLimit`. +11. Sync `FORGE_Module_Delivery` to `FORGE_Module_Cargo`. + +Notes: + +- The runtime checks `inArea DeliveryZone`, so the zone must be an area marker. + +### Hostage Task + +Use `FORGE_Module_Hostage` when players must rescue hostages and move them to +an extraction zone. + +Required module layout: + +```text +[Hostage Task] --> [Hostage Entities] --> hostage units +[Hostage Task] --> [Shooter Entities] --> hostile shooter units +``` + +Setup: + +1. Place the hostage AI units. +2. Place the hostile shooter AI units. +3. Create an area marker for the extraction zone. +4. If using the CBRN variant, create an area marker for the `CBRNZone`. +5. Place `FORGE_Module_Hostages`. +6. Sync the hostage units to `FORGE_Module_Hostages`. +7. Place `FORGE_Module_Shooters`. +8. Sync the shooter units to `FORGE_Module_Shooters`. +9. Place `FORGE_Module_Hostage`. +10. Set `TaskID`. +11. Set `ExtZone` to the extraction marker name. +12. Set `LimitSuccess` to the number of hostages that must be rescued. +13. Set `LimitFail` to the number of hostages that can be lost before failure. +14. Set `Execution` or `CBRN` as needed for the mission variant. +15. If `CBRN` is enabled, set `CBRNZone`. +16. Set rewards, rating, and optional `TimeLimit`. +17. Sync `FORGE_Module_Hostage` to `FORGE_Module_Hostages`. +18. Sync `FORGE_Module_Hostage` to `FORGE_Module_Shooters`. + +Notes: + +- Hostages and shooters are filtered to real units only. +- Hostages are protected immediately on task registration to avoid startup race conditions. +- The hostage timer now waits until the assigned group leader acknowledges the + task before counting down. +- `ExtZone` is checked with `inArea`, so it must be an area marker. + +### HVT Task + +Use `FORGE_Module_HVT` when players must capture or eliminate a high-value +target. + +Setup: + +1. Place the HVT unit or units. +2. If using capture mode, create an area marker for the extraction zone. +3. Place `FORGE_Module_HVT`. +4. Set `TaskID`. +5. Set `CaptureHVT` as needed: + - enabled for capture/extract + - disabled for kill/eliminate +6. If using capture mode, set `ExtZone` to the extraction marker name. +7. Set `LimitSuccess` to the number of HVTs that must be captured or eliminated. +8. Set `LimitFail` if the mission should fail after too many HVT deaths in capture mode. +9. Set rewards, rating, and optional `TimeLimit`. +10. Sync the HVT module directly to the HVT unit or units. + +Notes: + +- Capture mode uses `ExtZone` with `inArea`, so use an area marker. +- Elimination mode does not require an extraction zone. +- The HVT timer now waits until the assigned group leader acknowledges the task + before counting down. + +### Defend Task + +Use `FORGE_Module_Defend` when players must hold an area against spawned enemy +waves. + +Setup: + +1. Create an area marker for the defense zone. +2. Place `FORGE_Module_Defend`. +3. Set `TaskID`. +4. Set `DefenseZone` to the defense marker name. +5. Set `DefendTime` to how long the area must be held. +6. Set `WaveCount`. +7. Set `WaveCooldown`. +8. Set `MinBlufor` to the minimum number of friendlies required in the zone. +9. Place one or more enemy groups or units to use as wave templates. +10. Sync any unit from each enemy group to the defend module. +11. Set rewards, rating, and end-state options. + +Notes: + +- Synced enemy units are treated as templates. Syncing one unit from a group + makes the whole group available as a wave composition. +- If no enemy units are synced, the defend task falls back to default CSAT + infantry waves. +- The defend task waits for the required number of BLUFOR to enter the zone + before the timer, waves, and empty-zone failure checks begin. +- `DefenseZone` must be an area marker. + +### Quick Reference + +Use direct syncs: + +- `Attack Task` -> target units/vehicles +- `Destroy Task` -> target objects/vehicles/units +- `HVT Task` -> HVT units + +Use grouping modules: + +- `Defuse Task` -> `Explosive Entities`, `Protected Entities` +- `Delivery Task` -> `Cargo` +- `Hostage Task` -> `Hostage Entities`, `Shooter Entities` + +Use area markers: + +- `DefenseZone` +- `DeliveryZone` +- `ExtZone` +- `CBRNZone` + +## Scripted Start Task + +Use `forge_server_task_fnc_startTask` when creating tasks from modules, +mission scripts, or generated mission-manager content. It registers task +entities, creates the BIS task, stores the catalog entry, then dispatches +through `forge_server_task_fnc_handler`. + +```sqf +[ + "attack", + "compound_attack_01", + getPosATL leader1, + "Attack: East Compound", + "Eliminate all hostile forces.", + createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", 3], + ["prerequisiteTaskIds", ["recon_01"]], + ["funds", 50000], + ["ratingFail", -10], + ["ratingSuccess", 20], + ["timeLimit", 900] + ], + 0, + getPlayerUID player, + "script" +] call forge_server_task_fnc_startTask; +``` + +## Chained Tasks + +Use `prerequisiteTaskIds` when a task should stay hidden until one or more +other tasks succeed. The task is still registered during mission setup, but it +is stored with `locked` status, filtered out of CAD, blocked from assignment, +and its task logic does not start until every prerequisite task has completed +with `succeeded`. + +```sqf +[ + "delivery", + "supply_delivery_02", + getMarkerPos "delivery_zone_02", + "Deliver Medical Supplies", + "Move the cargo into the marked delivery area.", + createHashMapFromArray [["cargo", [cargoBox1, cargoBox2]]], + createHashMapFromArray [ + ["deliveryZone", "delivery_zone_02"], + ["limitSuccess", 2], + ["prerequisiteTaskIds", ["compound_attack_01"]], + ["funds", 30000] + ] +] call forge_server_task_fnc_startTask; +``` + +Notes: + +- `prerequisiteTaskIds` accepts either a string or an array of task ID strings. +- All prerequisite tasks must succeed before the chained task unlocks. +- If a prerequisite fails or never completes, the chained task remains locked. + +## Handler Calls + +Use `forge_server_task_fnc_handler` directly when the task entities are already +registered and you want reputation gating plus ownership binding. Create the +BIS task and catalog entry separately if this task should appear in the map +task tab or CAD: + +```sqf +[ + "delivery", + ["delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900], + 250, + getPlayerUID player +] call forge_server_task_fnc_handler; +``` + +## Direct Task Calls + +Direct task function calls still work for mission-authored or server-owned +tasks, but they do not provide a requester UID. Ownership falls back to the +`default` org. Create the BIS task separately if this task should appear in the +map task tab. + +## Timer Semantics + +Task time limits use `0` for no limit: + +- attack `timeLimit` +- destroy `timeLimit` +- delivery `timeLimit` +- hostage `timeLimit` +- HVT `timeLimit` + +Positive values are measured in seconds. Do not pass `-1` as a no-limit value; +the task runtime treats any non-zero task time limit as active. + +Defuse IED timers are different. `iedTimer` must be greater than `0`, because +IEDs are expected to have an active countdown. The Eden defuse module defaults +to `300` seconds. + +## Defuse Counter + +```sqf +"forge_server" callExtension ["task:defuse:increment", ["task-cache-1"]]; +private _count = "forge_server" callExtension ["task:defuse:get", ["task-cache-1"]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Task error: %1", _payload]; +}; +``` diff --git a/docs/surrealdb-setup.md b/docs/surrealdb-setup.md new file mode 100644 index 0000000..b26119c --- /dev/null +++ b/docs/surrealdb-setup.md @@ -0,0 +1,140 @@ +# SurrealDB Setup + +Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config. + +## Launch Requirement + +Before launching an Arma server or local multiplayer test with Forge enabled: + +1. Start SurrealDB and confirm it is listening on the endpoint Forge will use. +2. Copy `arma/server/extension/config.example.toml` to `config.toml` beside + `forge_server_x64.dll`. +3. Make sure `config.toml` matches the running SurrealDB endpoint, namespace, + database, username, and password. + +Server owners and developers must do this before starting the dedicated server +or hosting a test session. Mission designers and players do not need their own +SurrealDB instance unless they are running the server locally, but the server +they connect to must have SurrealDB running and configured. + +If SurrealDB is not running, or if `config.toml` points at the wrong endpoint +or credentials, persistence-backed systems such as actors, bank accounts, +garages, lockers, organizations, phone data, stores, and tasks will not be +ready for normal gameplay. + +## Choose the Right Path + +### Developer or Server Operator + +Use this path if you are building Forge, running a local test server, or +hosting the live Arma server. + +Official SurrealDB resources: + +- [SurrealDB install page](https://surrealdb.com/install) +- [SurrealDB CLI `start` reference](https://surrealdb.com/docs/surrealdb/cli/start) + +Forge also includes helper scripts under `arma/server/surrealdb`: + +```powershell +cd arma/server/surrealdb +.\UpdateMe.bat +.\RunMe.bat +``` + +On Linux or macOS: + +```bash +cd arma/server/surrealdb +./setup.sh +./run.sh +``` + +Install SurrealDB with the official method for your platform: + +```powershell +# Windows +iwr https://windows.surrealdb.com -useb | iex +``` + +```bash +# macOS +brew install surrealdb/tap/surreal +``` + +```bash +# Linux +curl -sSf https://install.surrealdb.com | sh +``` + +For Forge, start a persistent local database instead of the default in-memory +mode: + +```powershell +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db +``` + +`root`/`root` is only the local development default. For a public or shared +server, set a real password and keep `config.toml` aligned. + +Then copy `arma/server/extension/config.example.toml` to `config.toml` next to +`forge_server_x64.dll` and keep the values aligned with the database you +started: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +Before starting the game server, confirm SurrealDB is still running. After +launching the Arma server: + +1. Let the extension connect and apply the Forge schema modules. +2. Verify the connection state: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's `config.toml`. + +### Mission Designer or Community Manager/Leader + +Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code. + +Official SurrealDB resources: + +- [Surrealist installation](https://surrealdb.com/docs/surrealist/installation) +- [Surrealist web app](https://app.surrealdb.com) +- [Surrealist local database serving](https://surrealdb.com/docs/surrealist/concepts/local-database-serving) + +Recommended approach: + +1. Install **Surrealist Desktop**. It is the better fit for Forge because the + official docs note that the web app can be limited when connecting to + `localhost` or non-HTTPS endpoints. +2. Connect Surrealist to the same database Forge uses. +3. Use the values from the server's `config.toml`: + +```text +Endpoint: http://127.0.0.1:8000 +Namespace: forge +Database: main +Username: root +Password: root +``` + +If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +`surreal` executable is installed and available on your `PATH`. diff --git a/docus/.gitignore b/docus/.gitignore new file mode 100644 index 0000000..a76c8dc --- /dev/null +++ b/docus/.gitignore @@ -0,0 +1,5 @@ +.nuxt +.output +.data +.nitro +node_modules diff --git a/docus/README.md b/docus/README.md new file mode 100644 index 0000000..b3bfdc7 --- /dev/null +++ b/docus/README.md @@ -0,0 +1,37 @@ +# Forge Docs + +This directory contains the online documentation site for the Forge framework. +The site is built with Nuxt and Docus, and its content is generated from the +repository's source markdown files. + +## Local Development + +Install dependencies: + +```powershell +npm install +``` + +Start the docs site: + +```powershell +npm run dev +``` + +The content tree is refreshed automatically from: + +- `docs/` +- `arma/server/docs/` + +## Production Build + +```powershell +npm run build +``` + +Use these environment variables when deploying to a custom host: + +- `DOCS_BASE_URL` +- `DOCS_SITE_URL` +- `DOCS_REPO_URL` +- `DOCS_REPO_BRANCH` diff --git a/docus/app.config.ts b/docus/app.config.ts new file mode 100644 index 0000000..616995a --- /dev/null +++ b/docus/app.config.ts @@ -0,0 +1,34 @@ +const repoUrl = + process.env.DOCS_REPO_URL || + 'https://github.com/InnovativeDevSolutions/forge'; +const repoBranch = process.env.DOCS_REPO_BRANCH || 'master'; +const siteUrl = + process.env.DOCS_SITE_URL || + 'https://innovativedevsolutions.github.io/forge'; + +export default defineAppConfig({ + site: { + name: 'Forge Framework', + description: + 'Persistent Arma 3 framework with Rust services, SurrealDB storage, and browser-backed client UIs.', + url: siteUrl, + socials: { + github: 'InnovativeDevSolutions/forge' + } + }, + github: { + url: repoUrl, + branch: repoBranch, + rootDir: 'docus' + }, + footer: { + credits: 'Copyright © 2025-2026 Forge Framework', + links: [ + { + icon: 'simple-icons:github', + href: repoUrl, + target: '_blank' + } + ] + } +}); diff --git a/docus/content/1.getting-started/.navigation.yml b/docus/content/1.getting-started/.navigation.yml new file mode 100644 index 0000000..dacc69b --- /dev/null +++ b/docus/content/1.getting-started/.navigation.yml @@ -0,0 +1,2 @@ +title: Getting Started +icon: i-lucide-rocket diff --git a/docus/content/1.getting-started/0.index.md b/docus/content/1.getting-started/0.index.md new file mode 100644 index 0000000..9dcbe74 --- /dev/null +++ b/docus/content/1.getting-started/0.index.md @@ -0,0 +1,120 @@ +--- +title: Getting Started +description: Use this section as the main entry point for the Forge framework. +--- + +Forge combines: + +- Arma 3 client addons for UX and browser-hosted interfaces +- Arma 3 server addons for mission integration and authoritative flow control +- a Rust server extension for command routing and persistence +- shared Rust crates for models, repositories, and services +- SurrealDB for durable storage + +## Launch Prerequisites + +Before starting a Forge-enabled dedicated server or local multiplayer test, +server owners and developers must start SurrealDB and make sure +`config.toml` is beside `forge_server_x64.dll`. The config values must match +the running SurrealDB endpoint, namespace, database, username, and password. + +Mission designers and players do not need their own SurrealDB instance unless +they are hosting locally, but the server they join must have these prerequisites +ready. + +## Common Commands + +```powershell +cargo test +npm run build:webui +.\build-arma.ps1 +``` + +## Start Here + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-network + title: Architecture + to: /getting-started/architecture + --- + Understand how SQF, Rust services, SurrealDB, and browser UIs fit together. + ::: + + :::u-page-card + --- + icon: i-lucide-boxes + title: Module Reference + to: /getting-started/module-reference + --- + Review gameplay domains, infrastructure modules, and extension command groups. + ::: + + :::u-page-card + --- + icon: i-lucide-wrench + title: Development Guide + to: /getting-started/development + --- + See the rules for adding modules and changing boundaries without regressions. + ::: + + :::u-page-card + --- + icon: i-lucide-map + title: Mission Designer Guide + to: /getting-started/mission-designer + --- + Place Eden interaction objects, garage markers, and Forge task modules for + playable missions. + ::: + + :::u-page-card + --- + icon: i-lucide-user-round-check + title: Player Guide + to: /getting-started/player-guide + --- + Learn the player-facing CAD, phone, bank, store, locker, garage, and economy + workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-database + title: SurrealDB Setup + to: /getting-started/surrealdb-setup + --- + Install SurrealDB, match Forge config values, and choose the right setup path + for developers or admin-facing roles. + ::: + + :::u-page-card + --- + icon: i-lucide-server-cog + title: Server Extension + to: /server-extension + --- + Follow the extension architecture, API surface, and SQF usage examples. + ::: + + :::u-page-card + --- + icon: i-lucide-layers-3 + title: Server Modules + to: /server-modules + --- + Dive into the actor, bank, CAD, garage, locker, organization, phone, store, + task, and owned-storage guides. + ::: + + :::u-page-card + --- + icon: i-lucide-monitor-smartphone + title: Client Addons + to: /client-addons + --- + Explore the client bridge model and addon-specific browser integration rules. + ::: +:: diff --git a/docus/content/1.getting-started/1.architecture.md b/docus/content/1.getting-started/1.architecture.md new file mode 100644 index 0000000..f0c9c4a --- /dev/null +++ b/docus/content/1.getting-started/1.architecture.md @@ -0,0 +1,144 @@ +--- +title: "Framework Architecture" +description: "Forge is organized around domain modules. A domain usually has SQF addon entry points, Rust models, repository traits, service logic, extension command handlers, and optional browser UI." +--- + +## Runtime Flow + +![Architectural Flow Diagram](architecture-flow.svg) + +```text +Arma client UI or SQF action + -> client addon bridge + -> server addon function + -> forge_server callExtension command + -> extension command group + -> forge-services domain service + -> forge-repositories trait + -> SurrealDB repository implementation + -> SurrealDB +``` + +For small payloads, server SQF calls `forge_server` directly through the +extension bridge. For large payloads, `arma/server/addons/extension` stages +request and response chunks through the extension transport module. + +## Main Layers + +### Client Addons + +Client addons live under `arma/client/addons`. They own local player UX, +keybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs +durable or authoritative state, it routes work to the matching server addon +instead of touching persistence directly. + +### Server Addons + +Server addons live under `arma/server/addons`. They own server-side SQF +initialization, game-object integration, validation near the Arma runtime, and +calls into the Rust extension. The `extension` addon is the shared bridge for +`callExtension` and transport handling. + +### Rust Extension + +The server extension lives under `arma/server/extension`. It registers the +`forge_server` command groups, loads configuration, initializes SurrealDB, and +maps SQF command inputs into service calls. + +The extension should stay thin: + +- Parse and validate command arguments that arrive from SQF. +- Resolve Arma-specific context such as player UID when required. +- Call the matching service. +- Serialize the service result back to JSON or a simple string. + +### Shared Rust Crates + +The `lib` workspace contains reusable Rust crates: + +- `forge-models`: shared domain structs and serialization rules. +- `forge-repositories`: storage-agnostic repository traits and in-memory + implementations used by tests and hot-state services. +- `forge-services`: domain behavior, validation, and mutation workflows. +- `forge-shared`: cross-crate helpers. + +### Persistence + +Durable storage is SurrealDB. Schema modules live under +`arma/server/extension/src/schema`, and concrete SurrealDB repository +implementations live under `arma/server/extension/src/storage`. + +Repository traits stay in `lib/repositories` so service logic remains testable +without a database. + +## Hot State + +Several domains have `hot` command groups. Hot state keeps a runtime copy of +frequently accessed data in memory, then saves it back to durable storage when +requested. This is useful for player state that changes often during a session. + +Typical hot-state flow: + +```text +actor:hot:init +actor:hot:get +actor:hot:override +actor:hot:save +actor:hot:remove +``` + +Use hot state for session workflows. Use normal domain commands for direct +durable CRUD operations. + +## Transport Layer + +The transport layer exists because Arma extension calls have practical payload +size limits. It provides chunked request and response handling while still +routing to the same domain command groups. + +Common direct command: + +```sqf +"forge_server" callExtension ["status", []]; +``` + +Common transport path: + +```text +server addon fnc_extCall + -> transport:request:append + -> transport:invoke_stored + -> transport:response:get +``` + +## Configuration + +The server extension reads `config.toml` next to the extension DLL. The current +persistence section is: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +`config.toml` is a launch prerequisite for server owners and developers. The +file must exist beside `forge_server_x64.dll`, and SurrealDB must already be +running at the configured endpoint before starting a Forge-enabled dedicated +server or local multiplayer test. Clients and mission designers do not run this +configuration unless they are hosting locally, but the server they connect to +must have it in place. + +For install links and role-based setup guidance, see +[SurrealDB Setup](/getting-started/surrealdb-setup). + +Check persistence readiness before issuing commands that require storage: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` diff --git a/docus/content/1.getting-started/2.module-reference.md b/docus/content/1.getting-started/2.module-reference.md new file mode 100644 index 0000000..2143339 --- /dev/null +++ b/docus/content/1.getting-started/2.module-reference.md @@ -0,0 +1,222 @@ +--- +title: "Module Reference" +description: "This reference lists the main Forge modules and where each layer lives." +--- + +## Directory Map + +```text +arma/client/addons/ Client-side Arma addons and browser UIs +arma/server/addons/ Server-side Arma addons and extension bridge +arma/server/extension/ Rust arma-rs extension and SurrealDB adapters +bin/icom/ Interprocess communication helper +lib/models/ Shared domain data models +lib/repositories/ Repository traits and in-memory stores +lib/services/ Domain services and workflow logic +lib/shared/ Cross-crate helpers +tools/ Web UI build tooling +docs/ Framework-level documentation +``` + +## Gameplay Domains + +| Domain | Purpose | Client addon | Server addon | Service/model layer | Extension group | +| --- | --- | --- | --- | --- | --- | +| Actor | Player identity, loadout, position, status, contact identifiers, and persistent character data. | `arma/client/addons/actor` | `arma/server/addons/actor` | `lib/models/src/actor.rs`, `lib/services/src/actor.rs` | `actor:*` | +| Bank | Player accounts, cash/bank balances, PIN validation and changes, transfers, checkout charging, and transaction context. | `arma/client/addons/bank` | `arma/server/addons/bank` | `lib/models/src/bank.rs`, `lib/services/src/bank.rs` | `bank:*`, `bank:hot:*` | +| CAD | Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views. | `arma/client/addons/cad` | `arma/server/addons/cad` | `lib/models/src/cad.rs`, `lib/services/src/cad.rs` | `cad:*` | +| Garage | Player vehicle storage with plate IDs, fuel, damage, and hit point state. | `arma/client/addons/garage` | `arma/server/addons/garage` | `lib/models/src/garage.rs`, `lib/services/src/garage.rs` | `garage:*`, `garage:hot:*` | +| Locker | Player item storage keyed by classname with category and amount. | `arma/client/addons/locker` | `arma/server/addons/locker` | `lib/models/src/locker.rs`, `lib/services/src/locker.rs` | `locker:*`, `locker:hot:*` | +| Organization | Player organizations, membership, treasury, credit lines, shared assets, and fleet data. | `arma/client/addons/org` | `arma/server/addons/org` | `lib/models/src/org.rs`, `lib/services/src/org.rs` | `org:*`, `org:hot:*` | +| Phone | Contacts, messages, and email state. | `arma/client/addons/phone` | `arma/server/addons/phone` | `lib/models/src/phone.rs`, `lib/services/src/phone.rs` | `phone:*` | +| Store | Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration. | `arma/client/addons/store` | `arma/server/addons/store` | `lib/models/src/store.rs`, `lib/services/src/store.rs` | `store:checkout` | +| Task | Server-owned mission/task flows, catalog, ownership, status, participant tracking, rewards, and defuse counters. | none | `arma/server/addons/task` | `lib/models/src/task.rs`, `lib/services/src/task.rs` | `task:*` | +| Owned Garage | Organization or owner-scoped vehicle unlock storage. | via garage/org UI | server extension only | `lib/models/src/v_garage.rs`, `lib/services/src/v_garage.rs` | `owned:garage:*` | +| Owned Locker | Organization or owner-scoped arsenal unlock storage. | via locker/org UI | server extension only | `lib/models/src/v_locker.rs`, `lib/services/src/v_locker.rs` | `owned:locker:*` | + +Server and extension guides: +[Actor](/server-modules/actor), +[Bank](/server-modules/bank), +[CAD](/server-modules/cad), +[Economy](/server-modules/economy), +[Garage](/server-modules/garage), +[Locker](/server-modules/locker), +[Organization](/server-modules/organization), +[Owned Storage](/server-modules/owned-storage), +[Phone](/server-modules/phone), +[Store](/server-modules/store), +[Task](/server-modules/task). + +Client guides: +[Client Overview](/client-addons), +[Main](/client-addons/main), +[Common](/client-addons/common), +[Actor](/client-addons/actor), +[Bank](/client-addons/bank), +[CAD](/client-addons/cad), +[Garage](/client-addons/garage), +[Locker](/client-addons/locker), +[Notifications](/client-addons/notifications), +[Organization](/client-addons/organization), +[Phone](/client-addons/phone), +[Store](/client-addons/store). + +## Infrastructure Modules + +| Module | Purpose | Location | +| --- | --- | --- | +| `common` | Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces. | `arma/client/addons/common`, `arma/server/addons/common` | +| `extension` | Server SQF bridge around `forge_server` extension calls and chunked transport. | `arma/server/addons/extension` | +| `main` | Mod-level configuration, pre-init wiring, and server/client startup glue. | `arma/client/addons/main`, `arma/server/addons/main` | +| `economy` | Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank/cash first, then organization funds with repayable member debt when personal funds cannot cover the bill. | `arma/server/addons/economy` | +| `notifications` | Client notification UI, sounds, and UI event handling. | `arma/client/addons/notifications` | +| `icom` | Rust helper for interprocess communication and event broadcasting. | `bin/icom`, `arma/server/extension/src/icom.rs` | +| `terrain` | Extension-side terrain export helper. | `arma/server/extension/src/terrain.rs` | +| `transport` | Chunked request/response handling for large extension payloads. | `arma/server/extension/src/transport.rs` | +| `surreal` | SurrealDB connection lifecycle and status reporting. | `arma/server/extension/src/surreal.rs` | + +## Extension Command Groups + +Commands are invoked with: + +```sqf +"forge_server" callExtension ["group:command", [_arg1, _arg2]]; +``` + +Nested groups use additional `:` separators, for example +`bank:hot:deposit`. + +### Core + +| Command | Purpose | +| --- | --- | +| `version` | Return the extension version string. | +| `status` | Return SurrealDB connection state. | +| `surreal:status` | Return SurrealDB connection state directly from the Surreal module. | + +### Actor + +| Command | Purpose | +| --- | --- | +| `actor:get` | Fetch actor data for a resolved player UID. | +| `actor:create` | Create actor data from JSON. | +| `actor:update` | Apply actor JSON updates. | +| `actor:exists` | Return `true` or `false`. | +| `actor:delete` | Delete actor data. | +| `actor:hot:init`, `actor:hot:get`, `actor:hot:keys`, `actor:hot:override`, `actor:hot:save`, `actor:hot:remove` | Manage actor hot state. | + +See [Actor Usage Guide](/server-modules/actor) for examples. + +### Bank + +| Command | Purpose | +| --- | --- | +| `bank:get`, `bank:create`, `bank:update`, `bank:exists`, `bank:delete` | Durable bank CRUD. | +| `bank:hot:init`, `bank:hot:get`, `bank:hot:override`, `bank:hot:patch`, `bank:hot:save`, `bank:hot:remove` | Manage bank hot state. | +| `bank:hot:deposit`, `bank:hot:withdraw`, `bank:hot:deposit_earnings`, `bank:hot:transfer` | Mutate hot bank balances with operation context. | +| `bank:hot:charge_checkout` | Charge a checkout against hot bank state. | +| `bank:hot:validate_pin`, `bank:hot:change_pin` | Validate and update PINs for bank operations. | + +See [Bank Usage Guide](/server-modules/bank) for examples. + +### Garage + +| Command | Purpose | +| --- | --- | +| `garage:create`, `garage:get`, `garage:add`, `garage:update`, `garage:patch`, `garage:remove`, `garage:delete`, `garage:exists` | Durable player garage operations. | +| `garage:hot:init`, `garage:hot:get`, `garage:hot:override`, `garage:hot:add`, `garage:hot:remove_vehicle`, `garage:hot:save`, `garage:hot:remove` | Manage player garage hot state. | + +See [Garage Usage Guide](/server-modules/garage) for examples. + +### Locker + +| Command | Purpose | +| --- | --- | +| `locker:create`, `locker:get`, `locker:add`, `locker:update`, `locker:patch`, `locker:remove`, `locker:delete`, `locker:exists` | Durable player locker operations. | +| `locker:hot:init`, `locker:hot:get`, `locker:hot:override`, `locker:hot:save`, `locker:hot:remove` | Manage player locker hot state. | + +See [Locker Usage Guide](/server-modules/locker) for examples. + +### Organization + +| Command | Purpose | +| --- | --- | +| `org:get`, `org:create`, `org:update`, `org:exists`, `org:delete` | Durable organization CRUD. | +| `org:assets:get`, `org:assets:update` | Manage organization assets. | +| `org:fleet:get`, `org:fleet:update` | Manage organization fleet entries. | +| `org:members:get`, `org:members:add`, `org:members:remove` | Manage organization membership. | +| `org:hot:*` | Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove. | + +See [Org Usage Guide](/server-modules/organization) for examples. + +### Phone + +| Command | Purpose | +| --- | --- | +| `phone:init` | Initialize phone state for a UID. | +| `phone:contacts:list`, `phone:contacts:add`, `phone:contacts:remove` | Manage contacts. | +| `phone:messages:list`, `phone:messages:thread`, `phone:messages:send`, `phone:messages:mark_read`, `phone:messages:delete` | Manage messages. | +| `phone:emails:list`, `phone:emails:send`, `phone:emails:mark_read`, `phone:emails:delete` | Manage emails. | +| `phone:remove` | Remove phone state for a UID. | + +See [Phone Usage Guide](/server-modules/phone) for examples. + +### CAD + +| Command Group | Purpose | +| --- | --- | +| `cad:activity:append`, `cad:activity:recent` | Append and read recent activity. | +| `cad:assignments:list`, `cad:assignments:assign`, `cad:assignments:acknowledge`, `cad:assignments:decline`, `cad:assignments:upsert`, `cad:assignments:delete` | Manage dispatch assignments. | +| `cad:orders:list`, `cad:orders:create`, `cad:orders:create_from_context`, `cad:orders:close`, `cad:orders:upsert`, `cad:orders:delete` | Manage orders. | +| `cad:requests:list`, `cad:requests:submit`, `cad:requests:submit_from_context`, `cad:requests:close`, `cad:requests:upsert`, `cad:requests:delete` | Manage requests. | +| `cad:profiles:list`, `cad:profiles:update_from_context`, `cad:profiles:upsert`, `cad:profiles:delete` | Manage profiles. | +| `cad:groups:build` | Build grouped CAD state. | +| `cad:view:hydrate` | Build the dispatcher view model. | + +See [CAD Usage Guide](/server-modules/cad) for examples. + +### Task + +| Command Group | Purpose | +| --- | --- | +| `task:reset` | Reset task state. | +| `task:catalog:active`, `task:catalog:get`, `task:catalog:upsert`, `task:catalog:delete` | Manage task catalog entries. | +| `task:ownership:bind`, `task:ownership:release`, `task:ownership:accept`, `task:ownership:reward_context` | Manage task ownership and rewards. | +| `task:status:set`, `task:status:get`, `task:status:clear` | Manage task status. | +| `task:defuse:increment`, `task:defuse:get` | Manage defuse counters. | +| `task:clear` | Clear task state. | + +See [Task Usage Guide](/server-modules/task) for examples. + +### Owned Storage + +| Command Group | Purpose | +| --- | --- | +| `owned:garage:create`, `owned:garage:fetch`, `owned:garage:get`, `owned:garage:add`, `owned:garage:remove`, `owned:garage:delete`, `owned:garage:exists` | Owner-scoped vehicle storage. | +| `owned:garage:hot:*` | Owner-scoped vehicle hot state. | +| `owned:locker:create`, `owned:locker:fetch`, `owned:locker:get`, `owned:locker:add`, `owned:locker:remove`, `owned:locker:delete`, `owned:locker:exists` | Owner-scoped item storage. | +| `owned:locker:hot:*` | Owner-scoped item hot state. | + +See [Owned Storage Usage Guide](/server-modules/owned-storage) for examples. + +### Other Extension Groups + +| Command Group | Purpose | +| --- | --- | +| `store:checkout` | Run store checkout behavior. | +| `icom:connect`, `icom:broadcast`, `icom:send_event` | ICOM connection and event forwarding. See [ICOM Usage Guide](/server-extension/icom). | +| `terrain:exportSVG` | Export terrain data as SVG. | +| `transport:invoke`, `transport:invoke_stored` | Invoke commands through transport. | +| `transport:request:append`, `transport:request:clear` | Manage stored request chunks. | +| `transport:response:get`, `transport:response:clear` | Manage stored response chunks. | + +## Rust Crates + +| Crate | Role | +| --- | --- | +| `forge-models` | Domain models and validation. Keep these serializable and free of persistence details. | +| `forge-repositories` | Repository traits and in-memory implementations. Keep these storage-agnostic. | +| `forge-services` | Business rules and workflows. Depend on repository traits, not concrete databases. | +| `forge-shared` | Cross-crate helpers. Keep dependencies light. | +| `forge-server` | Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters. | +| `forge-icom` | ICom helper binary and client library. | diff --git a/docus/content/1.getting-started/3.development.md b/docus/content/1.getting-started/3.development.md new file mode 100644 index 0000000..d9bd7e0 --- /dev/null +++ b/docus/content/1.getting-started/3.development.md @@ -0,0 +1,135 @@ +--- +title: "Development Guide" +description: "This guide covers the usual path for adding or changing a Forge module." +--- + +## Local Checks + +Before running storage-backed workflows locally, complete +[SurrealDB Setup](/getting-started/surrealdb-setup). A local or dedicated server launch must +have SurrealDB running and a `config.toml` beside `forge_server_x64.dll` that +matches the running database. + +Run these before pushing Rust or extension changes: + +```powershell +cargo fmt --check +cargo check +cargo test +cargo build +cargo clippy --all-targets --all-features -- -D warnings +``` + +Run this after changing browser UI sources: + +```powershell +npm run build:webui +``` + +Build Arma packages with: + +```powershell +.\build-arma.ps1 +``` + +## Module Boundaries + +Keep each layer responsible for one kind of work: + +| Layer | Owns | Avoid | +| --- | --- | --- | +| `lib/models` | Data structures, serde defaults, validation helpers. | Database calls, SQF-specific context. | +| `lib/repositories` | Repository traits and in-memory stores. | SurrealDB-specific code. | +| `lib/services` | Business rules, workflow orchestration, structured results. | Arma engine calls, extension transport details. | +| `arma/server/extension` | Command parsing, context resolution, SurrealDB implementations, serialization to SQF. | Business rules that belong in services. | +| `arma/server/addons` | Server SQF lifecycle, game-object integration, calls into `forge_server`. | Direct database logic. | +| `arma/client/addons` | Client UI, keybinds, local UI events. | Authoritative persistence. | + +## Adding a Domain Module + +1. Add the model in `lib/models/src/.rs`. +2. Export the model from `lib/models/src/lib.rs`. +3. Add repository traits in `lib/repositories/src/.rs`. +4. Add in-memory repository support if the service needs tests or hot state. +5. Export the traits from `lib/repositories/src/lib.rs`. +6. Add service logic in `lib/services/src/.rs`. +7. Add focused unit tests for service behavior. +8. Export the service from `lib/services/src/lib.rs`. +9. Add a SurrealDB schema module under `arma/server/extension/src/schema`. +10. Add the concrete storage adapter under `arma/server/extension/src/storage`. +11. Register the storage adapter in `arma/server/extension/src/storage.rs`. +12. Add an extension command group under `arma/server/extension/src/.rs`. +13. Register the command group in `arma/server/extension/src/lib.rs`. +14. Add server addon functions under `arma/server/addons/` if SQF needs a module-level API. +15. Add client addon or browser UI files under `arma/client/addons/` if the module has player-facing UI. +16. Add documentation in `docs/` and module-level READMEs. + +## Extension Command Rules + +Commands should return one of these forms: + +- JSON string for structured results. +- `"true"` or `"false"` for simple existence and boolean operations. +- `"OK"` for successful destructive operations with no response body. +- `"Error: "` for failures. + +Prefer stable JSON shapes over ad hoc strings. SQF callers should always check +for the `"Error:"` prefix before parsing JSON. + +Example: + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor request failed: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` + +## Persistence Rules + +SurrealDB is the durable store. Keep database-specific mapping in the extension +storage adapters, not in services or repository traits. + +When changing persisted data: + +- Update or add the matching `.surql` schema module. +- Update the concrete storage adapter. +- Preserve existing records when possible through serde defaults or migration + logic. +- Add tests at the service level for behavior, and add storage tests only when + database mapping is the risk. + +## Hot-State Rules + +Use hot state for data that is read or mutated frequently during a player +session. Hot-state modules usually provide: + +- `init` to load durable state into memory. +- `get` to read the runtime copy. +- `override` or focused mutation commands to update the runtime copy. +- `save` to write the runtime copy back to SurrealDB. +- `remove` to evict the runtime copy. + +Do not assume hot state is durable until `save` succeeds. + +## Web UI Rules + +Browser UI source files live under each client addon. Built assets usually land +under that addon's `ui/_site` directory. + +Use the existing common bridge in `arma/client/addons/common` when a UI needs +to send events back to SQF. Keep UI state and rendering in JavaScript, and keep +server-authoritative decisions in server SQF or Rust services. + +## Documentation Checklist + +When adding or changing a module, update: + +- `docs/MODULE_REFERENCE.md` for framework-level inventory. +- A module-specific README in the addon directory when SQF or UI usage changes. +- `arma/server/docs/api-reference.md` when extension commands change. +- Existing usage guides when payload shapes or workflows change. diff --git a/docus/content/1.getting-started/4.mission-designer.md b/docus/content/1.getting-started/4.mission-designer.md new file mode 100644 index 0000000..2db17c5 --- /dev/null +++ b/docus/content/1.getting-started/4.mission-designer.md @@ -0,0 +1,750 @@ +--- +title: "Mission Designer Guide" +description: "Build playable Forge missions in Eden with the required interaction objects, garage markers, and CAD-compatible task modules." +--- + +This guide focuses on editor placement and mission validation. Framework +internals, extension commands, and persistence details are covered in the +developer-oriented module guides. + +## Core Rule + +Most Forge systems become available to players through nearby Eden objects. +Place the object, give it the correct variable name in Eden, and the server +initializer marks it with the runtime variable the actor menu scans for. + +Players must be within 5 meters of the object for the actor menu to offer the +action. + +## Interaction Objects + +Use the object's Eden variable name, not its display name. The matching is +case-sensitive in some initializers, so use lower-case names. + +![Bank object variable name field](images/eden/bank_obj_var.jpg) + +| System | Eden Object Variable Name | Runtime Variable | Player Action | Notes | +| --- | --- | --- | --- | --- | +| Bank | name contains `bank` | `isBank = true` | Full bank UI | Allows full banking workflows, including PIN changes. | +| ATM | name contains `atm` | `isAtm = true` | ATM bank UI | ATM mode requires PIN authorization and does not allow PIN changes. | +| Store | name contains `store` | `isStore = true` | Store UI | Store catalog and checkout behavior are configured server-side. | +| Garage | name contains `garage` | `isGarage = true` | Garage UI and virtual garage | Include a garage category in the name or set `garageType` manually. | +| Locker | name contains `locker` | local `isLocker = true` | Virtual arsenal action | The server hides the editor object; each client creates a local locker at the same position. | + +Recommended object names: + +```text +atm +bank +store +locker +garage_hq +garage_hq_2 +``` + +The example mission uses short lower-case names. Keep single-use objects simple, +add an index when there may be multiple copies, and include a site label for +garage objects so related spawn markers can share the same prefix. + +Avoid using `forge_locker_box` as an editor-placed locker variable name. That +name is reserved by the client-side virtual arsenal box. + +## Manual Object Variables + +The automatic initializers are the normal path. If a mission script creates +interaction objects dynamically, set the same variables manually: + +```sqf +_bankLaptop setVariable ["isBank", true, true]; +_atmTerminal setVariable ["isAtm", true, true]; +_storeCounter setVariable ["isStore", true, true]; +_garageTerminal setVariable ["isGarage", true, true]; +_garageTerminal setVariable ["garageType", "cars", true]; +``` + +Supported garage types are: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +## Garage Markers + +Garage interaction objects open the garage UI. Vehicle spawn positions come +from Eden markers. + +![Garage object placement](images/eden/garage_obj.jpg) + +![Garage object variable name](images/eden/garage_obj_var.jpg) + +![Garage category spawn markers](images/eden/garage_spawn_mrkrs.jpg) + +![Garage spawn marker variable name](images/eden/garage_spawn_1_mrkr_var.jpg) + +Additional garage sites use the same pattern: place another garage interaction +object, give it a `garage` variable name that identifies the site, then place +matching category spawn markers near that garage. + +![Second garage object placement](images/eden/garage_obj_2.jpg) + +![Second garage object variable name](images/eden/garage_obj_2_var.jpg) + +![Second garage site spawn markers](images/eden/garage_spawn_2_mrkrs.jpg) + +Create empty markers near each garage site. Marker names must contain `garage` +and one supported garage category: + +```text +garage_hq_cars +garage_hq_armor +garage_hq_helis +garage_hq_helis_1 +garage_hq_planes +garage_hq_naval +garage_hq_other +``` + +This convention keeps the site and category visible in the marker name: +`garage_hq_planes` is the planes spawn marker for `garage_hq`, while +`garage_hq_2` can use another nearby set of `garage_hq_*` category markers for +the second HQ garage area. If two garage objects of the same category are close +to each other, include the full object name in the marker prefix, such as +`garage_hq_2_planes`. + +Use these rules: + +1. Put the marker where the vehicle should spawn. +2. Rotate the marker to control spawn heading. +3. Keep the marker close to the matching garage object. +4. Include the garage object's variable name when multiple garages exist at + different sites. +5. Do not allow parked vehicles to block the marker. If a vehicle is within 5 + meters of the spawn position, the virtual garage blocks the session. + +Vehicle spawning is strict by category. A garage without a matching category +marker cannot spawn that vehicle category. + +## Store Setup + +Store objects only unlock the store UI. The actual item catalog, prices, +payment source handling, locker grants, and garage unlocks are server-owned. + +![Store object placement](images/eden/store_obj.jpg) + +![Store object variable name](images/eden/store_obj_var.jpg) + +Minimum Eden setup: + +1. Place a terminal, table, NPC, or other object players can stand near. +2. Set its Eden variable name to something containing `store`. +3. Test that the actor menu shows the store action within 5 meters. + +## Bank and ATM Setup + +Bank and ATM objects intentionally expose different workflows. + +![Bank object placement](images/eden/bank_obj.jpg) + +![Bank object variable name](images/eden/bank_obj_var.jpg) + +![ATM object placement](images/eden/atm_obj.jpg) + +![ATM object variable name](images/eden/atm_obj_var.jpg) + +Use a `bank` object for the full bank interface: + +- account view +- transfers +- earnings deposit +- PIN change + +Use an `atm` object for ATM access: + +- PIN-gated account access +- ATM-mode banking actions +- no PIN change + +Minimum Eden setup: + +1. Place one or more bank laptops or terminals with variable names containing + `bank`. +2. Place one or more ATM objects with variable names containing `atm`. +3. Keep the object accessible so players can stand within 5 meters. + +## Locker Setup + +Locker objects are slightly different from other interaction objects. The +server finds editor-placed objects whose variable names contain `locker`, hides +those global objects, and each client creates a local locker object at the same +position. + +![Locker object placement](images/eden/locker_obj.jpg) + +![Locker object variable name](images/eden/locker_obj_var.jpg) + +Minimum Eden setup: + +1. Place a container object where the locker should appear. +2. Set its Eden variable name to something containing `locker`. +3. Do not use `forge_locker_box`. +4. Test that the local locker appears and opens the virtual arsenal action. + +## Medical Spawn Setup + +The medical economy store discovers up to eleven medical spawn objects by exact +mission namespace variable name: + +- `med_spawn` +- `med_spawn_1` +- `med_spawn_2` +- continuing through `med_spawn_10` + +These objects are used for medical respawn placement and occupancy checks. + +![Medical spawn object placement](images/eden/med_spawn_obj.jpg) + +![Medical spawn object variable name](images/eden/med_spawn_obj_var.jpg) + +Minimum Eden setup: + +1. Place an object at each medical respawn position. +2. Set the first object's Eden variable name to `med_spawn`. +3. Set additional medical spawns to `med_spawn_1`, `med_spawn_2`, and so on. +4. Keep each spawn position clear enough for a revived player to occupy. + +## CAD Access + +The CAD UI is currently opened from the actor menu action path, but there is no +server initializer that marks Eden objects as dedicated CAD terminals. If a +mission needs a CAD terminal object, wire it through mission script or a custom +interaction that calls: + +```sqf +[] spawn forge_client_cad_fnc_openUI; +``` + +Tasks show in CAD only when they are created through a CAD-compatible task +creation path. + +## CEO and Dispatch Slots + +Forge grants dispatch-board permissions from the player's Eden unit variable +name when that player belongs to the default organization. + +Use these exact lower-case variable names: + +| Slot | Eden Unit Variable Name | Permissions | +| --- | --- | --- | +| CEO | `ceo` | Can administer the default organization, use default organization funds where supported, and use the CAD dispatch board. | +| Dispatch | `dispatch` | Can use the CAD dispatch board. | + +![CEO unit placement](images/eden/ceo_unit.jpg) + +![CEO unit variable name](images/eden/ceo_unit_var.jpg) + +![Dispatch unit placement](images/eden/dispatch_unit.jpg) + +![Dispatch unit variable name](images/eden/dispatch_unit_var.jpg) + +The CEO slot is intentionally broader than the dispatch slot. Use it for the +player who should administrate the default organization. Use the dispatch slot +for players who need dispatcher tools without default organization +administration rights. + +## Task and CAD Setup + +Mission designers should use Forge Eden task modules for CAD-visible work. +Those modules delegate to `forge_server_task_fnc_startTask`, which creates the +BIS task, registers the Forge task catalog entry, sets active task state, and +dispatches the task handler. + +Use the Arma 3 `Create Task` module when you need a standard BIS map task +alongside Forge task handling. Use Forge task modules for CAD-visible task +contracts and runtime task logic. + +![Arma 3 Create Task module placement](images/eden/create_task_mod.jpg) + +![Arma 3 Create Task module parameters](images/eden/create_task_mod_params.jpg) + +![Attack task module placement](images/eden/attack_task_mod.jpg) + +![Attack task module parameters](images/eden/attack_task_mod_params.jpg) + +![Attack task target sync](images/eden/attack_task_tgts.jpg) + +![CAD visible task](images/eden/cad-visible-task.jpg) + +CAD-compatible task creation paths: + +| Path | CAD Compatible | Use When | +| --- | --- | --- | +| Forge Eden task modules | Yes | Normal mission-designer workflow. | +| `forge_server_task_fnc_startTask` | Yes | Scripted or generated mission content. | +| Dynamic mission manager attack tasks | Yes | Server-generated attack missions. | +| `forge_server_task_fnc_handler` directly | Only if catalog and BIS task already exist | Advanced scripted flows. | +| Direct task function calls | No by default | Custom server-owned flows that do not need CAD assignment. | + +General task rules: + +1. Give every task a unique `TaskID`. +2. Set success and fail limits explicitly. +3. Use area markers for zone fields. +4. Use Forge grouping modules where required. +5. Sync task modules to real world objects, units, vehicles, or grouping + modules. +6. To chain tasks, set `Prerequisite Task IDs` on the dependent task module to + a comma-separated list of task IDs that must succeed first. +7. Reward class fields use comma-separated class names without brackets, such + as `ItemGPS, FirstAidKit`. Existing SQF array strings such as + `["ItemGPS","FirstAidKit"]` still work for older missions. +8. Test that unchained tasks appear in CAD immediately and chained tasks appear + only after their prerequisite tasks succeed. + +Task chaining uses only task IDs. The dependent task is still registered during +mission setup, but it stays hidden from CAD, cannot be assigned, and does not +start its task logic until every prerequisite task has completed successfully. +If any prerequisite task fails or never completes, the dependent task remains +locked. + +Zone fields that must reference area markers: + +![Task marker fields](images/eden/create_task_mod_params.jpg) + +| Field | Used By | Marker Requirement | +| --- | --- | --- | +| `DefenseZone` | Defend Task | Rectangle or ellipse area marker. | +| `DeliveryZone` | Delivery Task | Rectangle or ellipse area marker. | +| `ExtZone` | Hostage and HVT capture tasks | Rectangle or ellipse area marker. | +| `CBRNZone` | Hostage CBRN variant | Rectangle or ellipse area marker. | + +## Task Module Setup Guides + +Use these task sections as the setup guide and capture plan. Save any new +screenshots under `docus/public/images/eden/` with the listed filenames. + +### Attack Task + +Use `FORGE_Module_Attack` when players need to eliminate hostile units or +vehicles. + +Existing screenshots: + +- `attack_task_mod.jpg` - Attack task module placement. +- `attack_task_mod_params.jpg` - Attack task module attributes. +- `attack_task_tgts.jpg` - Attack task synced to target units or vehicles. + +Setup: + +1. Place the enemy units or vehicles. +2. Place `FORGE_Module_Attack`. +3. Set a unique `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be killed. +5. Set `LimitFail` if the mission should fail after too many losses. +6. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +7. Set `Prerequisite Task IDs` only if this attack task should unlock after + other tasks succeed. +8. Sync the attack module directly to the target units or vehicles. + +Validation: + +- The task appears in CAD after creation. +- Killing the configured number of targets succeeds the task. +- `TimeLimit` uses seconds; `0` disables the timer. + +### Destroy Task + +Use `FORGE_Module_Destroy` when players must destroy objects, vehicles, or +units. + +![Destroy task module placement](images/eden/destroy_task_mod.jpg) + +![Destroy task module parameters](images/eden/destroy_task_mod_params.jpg) + +![Destroy task target sync](images/eden/destroy_task_tgts.jpg) + +Setup: + +1. Place the objects, vehicles, or units that must be destroyed. +2. Place `FORGE_Module_Destroy`. +3. Set a unique `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be destroyed. +5. Set `LimitFail` if the mission should fail after too many protected losses + or failed conditions. +6. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +7. Set `Prerequisite Task IDs` only if this destroy task should unlock after + other tasks succeed. +8. Sync the destroy module directly to the targets. + +Validation: + +- The module reads direct syncs only. +- Destroying the configured number of targets succeeds the task. +- `TimeLimit` uses seconds; `0` disables the timer. + +### Defuse Task + +Use `FORGE_Module_Defuse` when players must defuse explosives while optionally +protecting other entities. + +![Defuse task module placement](images/eden/defuse_task_mod.jpg) + +![Defuse task module parameters](images/eden/defuse_task_mod_params.jpg) + +![Explosive Entities grouping module](images/eden/defuse_explosives_mod.jpg) + +![Protected Entities grouping module](images/eden/defuse_protected_mod.jpg) + +The Defuse task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Defuse Task] --> [Explosive Entities] --> explosive objects +[Defuse Task] --> [Protected Entities] --> protected objects, vehicles, or units +``` + +Setup: + +1. Place the explosive objects that players must defuse. +2. Place `FORGE_Module_Explosives`. +3. Sync each explosive object to `FORGE_Module_Explosives`. +4. Place any objects, vehicles, or units that must survive. +5. Place `FORGE_Module_Protected` when protected entities are part of the task. +6. Sync each protected entity to `FORGE_Module_Protected`. +7. Place `FORGE_Module_Defuse`. +8. Set a unique `TaskID`. +9. Set `LimitSuccess` to the number of explosives that must be defused. +10. Set `LimitFail` to the number of protected entities that can be lost before + failure. +11. Set `TimeLimit` to the IED countdown in seconds. +12. Set reward funds, rating gain/loss, and end-state behavior. +13. Set `Prerequisite Task IDs` only if this defuse task should unlock after + other tasks succeed. +14. Sync `FORGE_Module_Defuse` to `FORGE_Module_Explosives`. +15. Sync `FORGE_Module_Defuse` to `FORGE_Module_Protected` if used. + +Validation: + +- The defuse task reads grouped entities, not direct object syncs. +- The ACE defuse event resolves the correct IED for the task. +- Defuse `TimeLimit` is the IED countdown and should be greater than `0`. + +### Delivery Task + +Use `FORGE_Module_Delivery` when players must move cargo objects into a +delivery zone. + +![Delivery task module placement](images/eden/delivery_task_mod.jpg) + +![Delivery task module parameters](images/eden/delivery_task_mod_params.jpg) + +![Cargo Entities grouping module](images/eden/delivery_cargo_mod.jpg) + +![Delivery area marker placement](images/eden/delivery_zone_mrkr.jpg) + +![Delivery marker name](images/eden/delivery_zone_mrkr_var.jpg) + +The Delivery task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Delivery Task] --> [Cargo Entities] --> cargo objects +``` + +Setup: + +1. Place the cargo objects. +2. Create a rectangle or ellipse area marker for the delivery zone. +3. Place `FORGE_Module_Cargo`. +4. Sync each cargo object to `FORGE_Module_Cargo`. +5. Place `FORGE_Module_Delivery`. +6. Set a unique `TaskID`. +7. Set `DeliveryZone` to the delivery marker name. +8. Set `LimitSuccess` to the number of cargo objects that must arrive. +9. Set `LimitFail` to the number of cargo objects that can be damaged past the + fail threshold. +10. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +11. Set `Prerequisite Task IDs` only if this delivery task should unlock after + other tasks succeed. +12. Sync `FORGE_Module_Delivery` to `FORGE_Module_Cargo`. + +Validation: + +- `DeliveryZone` must be an area marker, not an icon marker. +- The runtime checks cargo with `inArea DeliveryZone`. +- The task succeeds only after the configured cargo count reaches the zone. + +### Hostage Task + +Use `FORGE_Module_Hostage` when players must rescue hostage units and move them +to an extraction zone. + +![Hostage task module placement](images/eden/hostage_task_mod.jpg) + +![Hostage task module parameters](images/eden/hostage_task_mod_params.jpg) + +![Hostage Entities grouping module](images/eden/hostage_entities_mod.jpg) + +![Shooter Entities grouping module](images/eden/hostage_shooters_mod.jpg) + +![Hostage extraction area marker placement](images/eden/hostage_ext_zone_mrkr.jpg) + +![Hostage extraction marker name](images/eden/hostage_ext_zone_mrkr_var.jpg) + +The Hostage task screenshots show both module placement and the required sync +layout. + +Required module layout: + +```text +[Hostage Task] --> [Hostage Entities] --> hostage units +[Hostage Task] --> [Shooter Entities] --> hostile shooter units +``` + +Setup: + +1. Place the hostage AI units. +2. Place the hostile shooter AI units. +3. Create a rectangle or ellipse area marker for the extraction zone. +4. If using the CBRN variant, create a rectangle or ellipse area marker for + `CBRNZone`. +5. Place `FORGE_Module_Hostages`. +6. Sync the hostage units to `FORGE_Module_Hostages`. +7. Place `FORGE_Module_Shooters`. +8. Sync the shooter units to `FORGE_Module_Shooters`. +9. Place `FORGE_Module_Hostage`. +10. Set a unique `TaskID`. +11. Set `ExtZone` to the extraction marker name. +12. Set `LimitSuccess` to the number of hostages that must be rescued. +13. Set `LimitFail` to the number of hostages that can be lost before failure. +14. Enable `CBRN Attack` or `Execution` when that mission variant is needed. +15. If `CBRN Attack` is enabled, set `CBRNZone`. +16. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +17. Set `Prerequisite Task IDs` only if this hostage task should unlock after + other tasks succeed. +18. Sync `FORGE_Module_Hostage` to `FORGE_Module_Hostages`. +19. Sync `FORGE_Module_Hostage` to `FORGE_Module_Shooters`. + +Validation: + +- `ExtZone` and `CBRNZone` must be area markers. +- Hostage and shooter grouping modules should sync to real units only. +- The hostage timer waits until the assigned group leader acknowledges the + task. + +### HVT Task + +Use `FORGE_Module_HVT` when players must capture or eliminate high-value target +units. The `HVT Task` example below shows an elimination task. The `HVT Task 1` +example shows a capture/extract task. + +Eliminate HVT example: + +![HVT eliminate task module placement](images/eden/hvt_task_mod.jpg) + +![HVT eliminate task module parameters](images/eden/hvt_task_mod_params.jpg) + +Capture HVT example: + +![HVT capture task module placement](images/eden/hvt_capture_task_mod.jpg) + +![HVT capture task module parameters](images/eden/hvt_capture_task_mod_params.jpg) + +![HVT capture extraction area marker placement](images/eden/hvt_ext_zone_mrkr.jpg) + +![HVT capture extraction marker name](images/eden/hvt_ext_zone_mrkr_var.jpg) + +The HVT task screenshots show the direct HVT unit sync for both eliminate and +capture examples. + +Setup: + +1. Place the HVT unit or units. +2. Place `FORGE_Module_HVT`. +3. Set a unique `TaskID`. +4. For kill/eliminate missions, set `Capture HVT` to `False` and + `Eliminate HVT` to `True`. +5. For capture/extract missions, set `Capture HVT` to `True` and + `Eliminate HVT` to `False`. +6. If using capture mode, create a rectangle or ellipse area marker for the + extraction zone and set `ExtZone` to that marker name. +7. Set `LimitSuccess` to the number of HVTs that must be captured or + eliminated. +8. Set `LimitFail` if the mission should fail after too many HVT deaths in + capture mode. +9. Set reward funds, rating gain/loss, end-state behavior, and optional + `TimeLimit`. +10. Set `Prerequisite Task IDs` only if this HVT task should unlock after other + tasks succeed. +11. Sync the HVT module directly to the HVT unit or units. + +Validation: + +- Capture mode requires `ExtZone`; elimination mode does not. +- `ExtZone` must be an area marker. +- The HVT timer waits until the assigned group leader acknowledges the task. + +### Defend Task + +Use `FORGE_Module_Defend` when players must hold an area against spawned enemy +waves. + +![Defend task module placement](images/eden/defend_task_mod.jpg) + +![Defend task module parameters](images/eden/defend_task_mod_params.jpg) + +![Defense area marker placement](images/eden/defend_zone_mrkr.jpg) + +![Defense marker name](images/eden/defend_zone_mrkr_var.jpg) + +The Defend task screenshots show module placement, marker setup, enemy wave +templates, and the required sync layout. + +Setup: + +1. Create a rectangle or ellipse area marker for the defense zone. +2. Place `FORGE_Module_Defend`. +3. Set a unique `TaskID`. +4. Set `DefenseZone` to the defense marker name. +5. Set `DefendTime` to how long the area must be held. +6. Set `WaveCount`. +7. Set `WaveCooldown`. +8. Set `MinBlufor` to the minimum number of friendly players or units required + in the zone. +9. Place one or more enemy groups or units to use as wave templates. +10. Sync any unit from each enemy group to the defend module. +11. Set reward funds, rating gain/loss, and end-state behavior. +12. Set `Prerequisite Task IDs` only if this defend task should unlock after + other tasks succeed. + +Validation: + +- `DefenseZone` must be an area marker. +- Syncing one unit from an enemy group makes the whole group available as a + wave composition. +- If no enemy units are synced, the task falls back to default CSAT infantry + waves. +- The timer, waves, and empty-zone failure checks start after enough BLUFOR + enter the zone. + +## Task Module Quick Reference + +| Task Module | Sync Target | Required Marker | +| --- | --- | --- | +| `FORGE_Module_Attack` | Target units or vehicles | None | +| `FORGE_Module_Destroy` | Target objects, vehicles, or units | None | +| `FORGE_Module_Defuse` | `FORGE_Module_Explosives`, optionally `FORGE_Module_Protected` | None | +| `FORGE_Module_Delivery` | `FORGE_Module_Cargo` | `DeliveryZone` | +| `FORGE_Module_Hostage` | `FORGE_Module_Hostages` and `FORGE_Module_Shooters` | `ExtZone`, optional `CBRNZone` | +| `FORGE_Module_HVT` | HVT units | `ExtZone` when capture mode is enabled | +| `FORGE_Module_Defend` | Optional enemy units as wave templates | `DefenseZone` | + +## Mission Manager Blacklist Markers + +The dynamic mission generator avoids rectangle and ellipse area markers whose +marker name or marker text starts with `blklist`. + +Use blacklist area markers to keep generated missions out of bases, spawn +areas, training zones, or protected set pieces. + +![Blacklist marker placement](images/eden/blacklist_mrkr.jpg) + +![Blacklist marker variable name](images/eden/blacklist_mrkr_var.jpg) + +Setup: + +1. Create a rectangle or ellipse area marker over the area to exclude. +2. Set the marker variable name or marker text to start with `blklist`. +3. Give the marker real size so the generator can test candidate positions + against the area. + +## Task Setup Checklist + +Before publishing a mission, verify: + +- Every task has a unique `TaskID`. +- Every configured marker name exists in Eden. +- Zone markers are area markers, not icon-only markers. +- Grouping modules are synced in the correct direction. +- Success and fail limits match the number of required entities. +- Reward funds and rating changes are intentional. +- Unchained tasks appear in CAD when created. +- Chained tasks remain hidden until all prerequisite task IDs succeed. +- Assigned CAD tasks can be acknowledged, declined, and completed. + +## Mission Validation Checklist + +Run this checklist in a local multiplayer test: + +- Stand within 5 meters of each bank object and verify the full bank action. +- Stand within 5 meters of each ATM and verify ATM mode. +- Confirm PIN changes are only available from the full bank interface. +- Stand near each store object and complete a test checkout. +- Stand near each locker and verify the local locker/arsenal opens. +- Open each garage and retrieve/store a vehicle. +- Open each virtual garage category and confirm the correct spawn marker is + used. +- Block a garage spawn marker with a vehicle and confirm the warning appears. +- Create each mission task and confirm CAD visibility. +- Assign a task in CAD and verify the player flow through completion or failure. + +## Eden Screenshot Set + +The live docs should include real Eden screenshots for mission designers. When +capturing them, save the images under `docus/public/images/eden/` and use these +filenames so the docs can reference stable assets: + +| File | Capture | +| --- | --- | +| `bank_obj.jpg`, `bank_obj_var.jpg` | Bank object placement and variable name. | +| `atm_obj.jpg`, `atm_obj_var.jpg` | ATM object placement and variable name. | +| `store_obj.jpg`, `store_obj_var.jpg` | Store object placement and variable name. | +| `locker_obj.jpg`, `locker_obj_var.jpg` | Locker container placement and variable name. | +| `garage_obj.jpg`, `garage_obj_var.jpg` | Garage interaction object placement and variable name. | +| `garage_spawn_mrkrs.jpg`, `garage_spawn_1_mrkr_var.jpg` | Garage category spawn markers and marker variable naming. | +| `garage_obj_2.jpg`, `garage_obj_2_var.jpg`, `garage_spawn_2_mrkrs.jpg` | Additional garage site placement, variable name, and spawn markers. | +| `med_spawn_obj.jpg`, `med_spawn_obj_var.jpg` | Medical spawn object placement and variable name. | +| `ceo_unit.jpg`, `ceo_unit_var.jpg` | CEO playable unit placement and variable name. | +| `dispatch_unit.jpg`, `dispatch_unit_var.jpg` | Dispatch playable unit placement and variable name. | +| `blacklist_mrkr.jpg`, `blacklist_mrkr_var.jpg` | Mission-manager blacklist marker placement and marker variable naming. | +| `create_task_mod.jpg`, `create_task_mod_params.jpg` | Arma 3 Create Task module placement and parameters. | +| `attack_task_mod.jpg`, `attack_task_mod_params.jpg`, `attack_task_tgts.jpg` | Attack task module placement, parameters, and target sync. | +| `destroy_task_mod.jpg`, `destroy_task_mod_params.jpg`, `destroy_task_tgts.jpg` | Destroy task module placement, parameters, and target sync. | +| `defuse_task_mod.jpg`, `defuse_task_mod_params.jpg` | Defuse task module placement and parameters. | +| `defuse_explosives_mod.jpg`, `defuse_protected_mod.jpg` | Defuse grouping modules for explosive and protected entities. | +| `delivery_task_mod.jpg`, `delivery_task_mod_params.jpg`, `delivery_cargo_mod.jpg` | Delivery task module, parameters, and Cargo Entities grouping module. | +| `delivery_zone_mrkr.jpg`, `delivery_zone_mrkr_var.jpg` | Delivery area marker placement and marker name. | +| `hostage_task_mod.jpg`, `hostage_task_mod_params.jpg` | Hostage task module placement and parameters. | +| `hostage_entities_mod.jpg`, `hostage_shooters_mod.jpg` | Hostage grouping modules for hostage and shooter units. | +| `hostage_ext_zone_mrkr.jpg`, `hostage_ext_zone_mrkr_var.jpg` | Hostage extraction marker placement and marker name. | +| Hostage CBRN marker | Use the same extraction-marker capture pattern if a separate CBRN screenshot is ever needed. | +| `hvt_task_mod.jpg`, `hvt_task_mod_params.jpg` | HVT eliminate task module placement and parameters. | +| `hvt_capture_task_mod.jpg`, `hvt_capture_task_mod_params.jpg` | HVT capture task module placement and parameters. | +| `hvt_ext_zone_mrkr.jpg`, `hvt_ext_zone_mrkr_var.jpg` | HVT capture extraction marker placement and marker name. | +| `defend_task_mod.jpg`, `defend_task_mod_params.jpg` | Defend task module placement, parameters, wave templates, and sync. | +| `defend_zone_mrkr.jpg`, `defend_zone_mrkr_var.jpg` | Defense area marker placement and marker name. | +| `cad-visible-task.jpg` | In-game CAD showing a task created from the Eden module. | + +Use screenshots that show the Eden left-side entity list, the selected object's +attributes panel, and the map placement where possible. Crop only enough to +remove unrelated mission content. + +## Related Guides + +- [Task Usage Guide](/server-modules/task) +- [Client Actor Usage Guide](/client-addons/actor) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Store Usage Guide](/server-modules/store) +- [Bank Usage Guide](/server-modules/bank) +- [Client CAD Usage Guide](/client-addons/cad) diff --git a/docus/content/1.getting-started/5.player-guide.md b/docus/content/1.getting-started/5.player-guide.md new file mode 100644 index 0000000..cba668d --- /dev/null +++ b/docus/content/1.getting-started/5.player-guide.md @@ -0,0 +1,323 @@ +--- +title: "Player Guide" +description: "Use this guide as the player-facing overview for Forge systems. It explains what players interact with during normal missions, how task assignment works, and what persistent storage limits apply." +--- + +## Opening Forge Interactions + +Most Forge actions are opened from the actor interaction menu while standing +near a configured mission object. + +![Custom interaction menu](images/player/interaction_menu.jpg) + +Press `Tab` by default to open the custom interaction menu. Server settings or +local keybind changes may use a different key. + +Known current behavior: after closing the custom interaction menu, players may +need to press `Tab` twice before it opens again. Treat this as a temporary +workaround until the interaction menu focus behavior is investigated further. + +Players usually need to be within 5 meters of an interaction object such as a +bank terminal, ATM, store counter, garage terminal, or locker. + +## CAD and Tasks + +CAD is the main task and dispatch system. It is used for mission contracts, +group status, support requests, dispatch orders, and task assignment. + +![CAD operations task board](images/player/cad_ops_board.jpg) + +Player workflow: + +1. Open CAD from the available interaction path. +2. Review available or assigned tasks. +3. If a dispatcher assigns a task to your group, the group leader must + acknowledge or decline it. +4. Once acknowledged, the task becomes active for the assigned group. +5. Complete the task objective shown by CAD, map task state, and mission + instructions. + +Map focus behavior: + +- Click an assigned or accepted task in the operations task board to center the + map on that task. +- Click a roster member to center the map on that player. +- Click a support request to center the map on the request location. +- Dispatch map mode supports the same focus behavior for groups, contracts, + and support requests. + +Dispatch workflow: + +![CAD dispatch board](images/player/cad_dispatch_board.jpg) + +1. Open CAD with a dispatcher-enabled slot or permission. +2. Use dispatch mode to review groups, open contracts, assigned contracts, and + support requests. +3. Assign available contracts to active groups. +4. Send dispatch orders or close completed orders as needed. +5. Track group status and recent CAD activity. + +Dispatch access: + +- The CEO slot can administer the default organization and use CAD dispatch + permissions. +- The Dispatch slot grants CAD dispatch permissions without default + organization administration rights. +- Players who are the CEO or owner of their own organization also receive CAD + dispatch permissions. + +Important task behavior: + +- CAD assignment reserves a task for a group. +- The task starts after the assigned group leader acknowledges it. +- If the leader declines, the task returns to the open contract board. +- Some task timers wait for group-leader acknowledgment before counting down. + +## Phone + +The phone provides contacts, messages, email, mobile bank access, and local +utility apps. + +![Phone home screen](images/player/phone_home.jpg) + +### Contacts + +Use Contacts to keep track of other players by phone number or email address. +Adding contacts makes it easier to start messages and emails without manually +entering recipient details every time. + +![Phone contacts screen](images/player/phone_contacts.jpg) + +### Messages + +Messages are short player-to-player conversations. Use Messages to start or +continue a conversation with a contact, read incoming messages, mark messages as +read, or delete messages you no longer need. + +![Phone messages screen](images/player/phone_messages.jpg) + +![Example phone message conversation](images/player/phone_message_example.jpg) + +### Email + +Email is used for longer player-to-player communication. Use Email to send a +subject and body to another player, read incoming mail, mark email as read, or +delete old email. + +![Phone email screen](images/player/phone_email.jpg) + +![Example phone email](images/player/phone_email_example.jpg) + +### Wallet + +Wallet is the phone version of the bank app. Use it to refresh your account +view, check your available balance, review cash and pending earnings, deposit all +pending earnings, and pay your organization credit line when payment is due. + +![Phone wallet app](images/player/phone_wallet.jpg) + +Deposit Earnings deposits the full pending earnings amount. Players do not enter +a custom amount for that action. + +### Local Phone Apps + +Notes, calendar events, clocks, alarms, and theme preferences are local utility +features. They are saved for the local player profile and should not be treated +as shared multiplayer data. + +## Bank and ATM + +Bank and ATM access are separate. + +Use a bank object for full banking: + +![Bank app](images/player/bank_app.jpg) + +- view account information +- transfer funds +- deposit earnings +- change PIN + +Use an ATM for limited account access: + +![ATM PIN screen](images/player/atm_app_pin.jpg) + +![ATM home screen](images/player/atm_app_home.jpg) + +- PIN-gated account actions +- ATM banking workflows +- no PIN changes + +If a PIN prompt appears, enter the correct PIN before attempting account +actions. + +## Organizations + +Players start in the default organization. A player can create a player-owned +organization only if they have `$50,000` available for the registration fee. +Organization access depends on the player's role. + +![Organization home screen](images/player/org_home.jpg) + +![Organization registration screen](images/player/org_registration.jpg) + +Default organization: + +- The `ceo` slot can administer the default organization. +- The `dispatch` slot receives CAD dispatch permissions, but does not receive + default organization administration rights. + +Player-owned organizations: + +![Organization dashboard](images/player/org_dashboard.jpg) + +![Organization treasury screen](images/player/org_treasury.jpg) + +- The player who created the organization is its owner or CEO. +- The owner can administer the organization, including treasury and roster + actions exposed by the organization interface. +- Organization owners can invite players, manage members, assign credit lines, + transfer funds or run payroll when funds are available, and disband the + organization. +- Organization owners can use organization funds for supported store purchases. +- Members may receive assigned credit lines, accept or decline organization + invites, and leave the organization. +- The organization CEO or owner cannot leave their own organization directly. + They must disband the organization if they want to leave it. + +Organization actions are server-authoritative. If an organization action fails, +check that the player has the correct role, the player or organization has +enough funds, and the target player is eligible for the action. + +## Store + +Stores sell unlocks and equipment through the configured server-side catalog. + +![Store catalog](images/player/store_catalog.jpg) + +Store purchases may grant: + +- items or equipment added to the locker +- matching gear unlocks in the virtual arsenal +- vehicle unlocks in the virtual garage +- other mission-configured rewards + +Store purchases are server-authoritative. If a purchase succeeds, the relevant +bank, locker, virtual arsenal, virtual garage, or organization state updates +from the server. + +![Store checkout result](images/player/store_checkout.jpg) + +Vehicle purchases unlock the vehicle in the virtual garage. They do not place a +physical vehicle into the player's 5-slot garage. Use the virtual garage to +spawn an unlocked vehicle, and use the garage to store or retrieve live world +vehicles. + +## Locker and Virtual Arsenal + +The locker is personal item storage. + +![Locker storage](images/player/locker.jpg) + +Locker rules: + +- Up to 25 items can be stored. +- The locker saves when the locker container is closed. +- Over-capacity storage can warn or fail depending on server handling. + +The virtual arsenal is locked down. Players only see gear they have been +granted or have unlocked through systems such as the store. The virtual arsenal +is not intended to expose the full unrestricted Arma arsenal. + +![Virtual arsenal unlocks](images/player/virtual_arsenal.jpg) + +## Garage and Virtual Garage + +The garage stores physical player vehicles that have been saved from the world. + +![Garage dashboard](images/player/garage.jpg) + +Garage rules: + +- Up to 5 vehicles can be stored. +- Stored vehicles can be retrieved from a garage interaction point. +- Retrieved vehicles become live world vehicles again. +- Vehicle service actions operate on live nearby vehicles, not vehicles that + are still stored. + +The virtual garage is locked down. Players only see vehicles they have been +granted or have unlocked through systems such as the store. Virtual garage +unlocks are separate from the 5 physical vehicle slots in the garage. The +virtual garage uses mission-configured spawn lanes, and spawning may be blocked +if the spawn position is occupied. + +![Virtual garage unlocks](images/player/virtual_garage.jpg) + +## Economy Services + +Economy services are server-controlled. Charges must succeed before the world +effect is applied. + +![Garage service controls](images/player/garage.jpg) + +### Medical + +Medical services are player-funded first. + +![Medical respawn screen](images/player/medical_respawn.jpg) + +Billing order: + +1. Player bank balance. +2. Player cash. +3. Organization funds, when allowed by the server. +4. Organization credit-line debt for the player when organization fallback is + used. + +Medical respawn placement uses mission-configured medical spawn objects. + +### Refuel + +Refuel service is organization-funded. If the organization cannot cover the +cost, the vehicle is not refueled or the fuel level is rolled back. + +Refuel is available from the garage app dashboard shown above. + +### Repair + +Repair service is organization-funded. The repair is only applied after the +organization charge succeeds. + +Repair is available from the garage app dashboard shown above. + +### Rearm + +If the mission exposes rearm service through the economy or support workflow, +expect it to follow the same server-authoritative pattern: the service request +must be accepted and billed before equipment or vehicle state changes are +applied. + +Rearm is available from the garage app dashboard shown above. + +## Common Player Checks + +If a system does not appear or does not work: + +- Move closer to the interaction object. +- Confirm you are using the correct object type, such as ATM vs bank. +- Confirm your group leader has acknowledged an assigned CAD task. +- Confirm the needed store unlock has been purchased before checking VA or VG. +- Confirm the garage spawn point is clear before using the virtual garage. +- Confirm your player, cash, bank, or organization funds can cover the service. + +## Related Guides + +- [Mission Designer Guide](/getting-started/mission-designer) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Phone Usage Guide](/client-addons/phone) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Organization Usage Guide](/server-modules/organization) +- [Store Usage Guide](/server-modules/store) +- [Economy Usage Guide](/server-modules/economy) diff --git a/docus/content/1.getting-started/6.surrealdb-setup.md b/docus/content/1.getting-started/6.surrealdb-setup.md new file mode 100644 index 0000000..abf2272 --- /dev/null +++ b/docus/content/1.getting-started/6.surrealdb-setup.md @@ -0,0 +1,139 @@ +--- +title: "SurrealDB Setup" +description: "Forge uses SurrealDB for durable storage. The Rust server extension connects to SurrealDB on startup and applies Forge schema modules automatically, so setup comes down to running a reachable database and matching the Forge config." +--- + +## Launch Requirement + +Before launching an Arma server or local multiplayer test with Forge enabled: + +1. Start SurrealDB and confirm it is listening on the endpoint Forge will use. +2. Copy `arma/server/extension/config.example.toml` to `config.toml` beside + `forge_server_x64.dll`. +3. Make sure `config.toml` matches the running SurrealDB endpoint, namespace, + database, username, and password. + +Server owners and developers must do this before starting the dedicated server +or hosting a test session. Mission designers and players do not need their own +SurrealDB instance unless they are running the server locally, but the server +they connect to must have SurrealDB running and configured. + +If SurrealDB is not running, or if `config.toml` points at the wrong endpoint +or credentials, persistence-backed systems such as actors, bank accounts, +garages, lockers, organizations, phone data, stores, and tasks will not be +ready for normal gameplay. + +## Choose the Right Path + +### Developer or Server Operator + +Use this path if you are building Forge, running a local test server, or +hosting the live Arma server. + +Official SurrealDB resources: + +- [SurrealDB install page](https://surrealdb.com/install) +- [SurrealDB CLI `start` reference](https://surrealdb.com/docs/surrealdb/cli/start) + +Forge also includes helper scripts under `arma/server/surrealdb`: + +```powershell +cd arma/server/surrealdb +.\UpdateMe.bat +.\RunMe.bat +``` + +On Linux or macOS: + +```bash +cd arma/server/surrealdb +./setup.sh +./run.sh +``` + +Install SurrealDB with the official method for your platform: + +```powershell +# Windows +iwr https://windows.surrealdb.com -useb | iex +``` + +```bash +# macOS +brew install surrealdb/tap/surreal +``` + +```bash +# Linux +curl -sSf https://install.surrealdb.com | sh +``` + +For Forge, start a persistent local database instead of the default in-memory +mode: + +```powershell +surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb://forge.db +``` + +`root`/`root` is only the local development default. For a public or shared +server, set a real password and keep `config.toml` aligned. + +Then copy `arma/server/extension/config.example.toml` to `config.toml` next to +`forge_server_x64.dll` and keep the values aligned with the database you +started: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +Before starting the game server, confirm SurrealDB is still running. After +launching the Arma server: + +1. Let the extension connect and apply the Forge schema modules. +2. Verify the connection state: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's `config.toml`. + +### Mission Designer or Community Manager/Leader + +Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code. + +Official SurrealDB resources: + +- [Surrealist installation](https://surrealdb.com/docs/surrealist/installation) +- [Surrealist web app](https://app.surrealdb.com) +- [Surrealist local database serving](https://surrealdb.com/docs/surrealist/concepts/local-database-serving) + +Recommended approach: + +1. Install **Surrealist Desktop**. It is the better fit for Forge because the + official docs note that the web app can be limited when connecting to + `localhost` or non-HTTPS endpoints. +2. Connect Surrealist to the same database Forge uses. +3. Use the values from the server's `config.toml`: + +```text +Endpoint: http://127.0.0.1:8000 +Namespace: forge +Database: main +Username: root +Password: root +``` + +If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +`surreal` executable is installed and available on your `PATH`. diff --git a/docus/content/2.server-extension/.navigation.yml b/docus/content/2.server-extension/.navigation.yml new file mode 100644 index 0000000..ffa50ff --- /dev/null +++ b/docus/content/2.server-extension/.navigation.yml @@ -0,0 +1,2 @@ +title: Forge Server Extension +icon: i-lucide-server-cog diff --git a/docus/content/2.server-extension/0.index.md b/docus/content/2.server-extension/0.index.md new file mode 100644 index 0000000..6e8f284 --- /dev/null +++ b/docus/content/2.server-extension/0.index.md @@ -0,0 +1,48 @@ +--- +title: "Forge Server Extension" +description: "Forge Server is an arma-rs extension for Arma 3 server-side persistence and domain services. It exposes game-facing commands and stores durable state in SurrealDB." +--- + +## Architecture + +SQF modules call `forge_server` through `fnc_extCall`. Small requests use the +direct `callExtension` path, while large payloads are staged through the +transport layer. + +```text +SQF module + -> extension bridge + -> domain command + -> service layer + -> repository + -> SurrealDB +``` + +## Configuration + +Copy `config.example.toml` to `config.toml` next to the extension DLL before +launching a Forge-enabled server. SurrealDB must also be running before the +server starts, and the values in `config.toml` must match that database. + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +Players and mission designers do not need this file unless they are hosting +locally. Server owners and developers do. + +For install links and Forge-specific setup steps, see +[SurrealDB Setup](/getting-started/surrealdb-setup). + +## References + +- [API Reference](/server-extension/api-reference) +- [Usage Examples](/server-extension/usage-examples) +- [ICOM Usage Guide](/server-extension/icom) +- [Framework Module Guides](/getting-started) diff --git a/docus/content/2.server-extension/1.api-reference.md b/docus/content/2.server-extension/1.api-reference.md new file mode 100644 index 0000000..261121a --- /dev/null +++ b/docus/content/2.server-extension/1.api-reference.md @@ -0,0 +1,50 @@ +--- +title: "Forge Server API Reference" +description: "The Forge server extension exposes domain-oriented commands through `callExtension`. Persistent data is stored through the configured SurrealDB connection and schema modules." +--- + +## Core Commands + +```sqf +"forge_server" callExtension ["version", []]; +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +`status` and `surreal:status` return `initializing`, `connected`, or `failed`. + +## Domain Commands + +Game systems should call the domain APIs instead of raw database operations: + +- `actor:*` +- `bank:*` +- `garage:*` +- `locker:*` +- `org:*` +- `phone:*` +- `store:*` +- `task:*` +- `cad:*` +- `icom:*` +- `owned:garage:*` +- `owned:locker:*` +- `transport:*` + +Large request and response payloads are routed through the transport layer when +needed by `forge_server_addons_extension_fnc_extCall`. + +## Module Guides + +- [Actor](/server-modules/actor) +- [Bank](/server-modules/bank) +- [CAD](/server-modules/cad) +- [Economy](/server-modules/economy) +- [Garage](/server-modules/garage) +- [Locker](/server-modules/locker) +- [Organization](/server-modules/organization) +- [Owned Storage](/server-modules/owned-storage) +- [Phone](/server-modules/phone) +- [Store](/server-modules/store) +- [Task](/server-modules/task) +- [ICOM](/server-extension/icom) diff --git a/docus/content/2.server-extension/2.usage-examples.md b/docus/content/2.server-extension/2.usage-examples.md new file mode 100644 index 0000000..e3824cf --- /dev/null +++ b/docus/content/2.server-extension/2.usage-examples.md @@ -0,0 +1,47 @@ +--- +title: "Forge Server Usage Examples" +description: "These examples use the domain command surface exposed by the extension. Persistence is handled by the server through SurrealDB." +--- + +## Status Check + +```sqf +["status", []] call forge_server_extension_fnc_extCall params ["_status", "_ok"]; +if (_ok && {_status isEqualTo "connected"}) then { + systemChat "Forge persistence is online."; +}; +``` + +## Actor Fetch + +```sqf +private _uid = getPlayerUID player; +["actor:get", [_uid]] call forge_server_extension_fnc_extCall params ["_payload", "_ok"]; +if (_ok) then { + private _actor = fromJSON _payload; + systemChat format ["Loaded actor %1", _actor getOrDefault ["uid", _uid]]; +}; +``` + +## Store Checkout + +```sqf +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [ + createHashMapFromArray [ + ["classname", "FirstAidKit"], + ["category", "item"], + ["priceValue", 50], + ["quantity", 2] + ] + ]], + ["vehicles", []] +]; + +["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall; +``` diff --git a/docus/content/2.server-extension/3.common.md b/docus/content/2.server-extension/3.common.md new file mode 100644 index 0000000..380ddea --- /dev/null +++ b/docus/content/2.server-extension/3.common.md @@ -0,0 +1,100 @@ +--- +title: "Forge Server Common" +description: "The common addon provides shared SQF utilities used by server-side Forge addons. It contains lightweight helpers only; gameplay domain state belongs in the specific domain addons or the Rust extension." +--- + +## Dependencies +- `forge_server_main` + +## Main Components +- `fnc_baseStore.sqf` provides shared hash-map object behavior such as JSON + conversion. +- `fnc_eventBus.sqf` provides a framework-wide in-process event bus for + cross-addon notifications. +- `fnc_log.sqf` standardizes server log messages. +- `fnc_getPlayer.sqf` resolves online players by UID. +- `fnc_formatNumber.sqf` formats numeric values for notifications and UI text. +- `fnc_generateHash.sqf` and `fnc_generateSecureData.sqf` provide hashing and + random data helpers. +- `fnc_timeToSeconds.sqf` converts time values into seconds. + +## Notes +Keep this addon free of domain-specific behavior. If a helper needs actor, +bank, org, task, store, or CAD state, it belongs in that addon instead. + +## Event Bus +The event bus is initialized as `forge_server_common_EventBus` during store +bootstrap. It is synchronous and in-process: listeners run immediately when an +event is emitted. + +### Event Naming +Use lower-case dot-separated names: + +- `..` for domain events, such as `cad.assignment.assigned` +- `.` for simple lifecycle events, such as `task.started` + +Prefer past-tense action names for events that report completed state changes: +`created`, `started`, `assigned`, `acknowledged`, `declined`, `completed`, +`failed`, `cleared`, `updated`, `closed`. + +Payloads should be hash maps and should include stable identifiers first: +`taskID`, `requestID`, `groupID`, `uid`, `orgID`, or `accountID` as appropriate. +The event bus adds `event`, `source`, and `timestamp` when the event is emitted. + +### Current Events +Task lifecycle: +- `task.created` +- `task.started` +- `task.completed` +- `task.failed` +- `task.cleared` + +Task rewards and notifications: +- `task.reward.requested` +- `task.reward.applied` +- `task.reward.failed` +- `task.rating.applied` +- `task.rating.failed` +- `task.notification.requested` +- `task.reward.notification.requested` + +CAD state: +- `cad.assignment.assigned` +- `cad.assignment.created` +- `cad.assignment.acknowledged` +- `cad.assignment.declined` +- `cad.assignment.closed` +- `cad.request.submitted` +- `cad.request.closed` +- `cad.group.updated` + +Client sync and notification requests: +- `notification.requested` +- `bank.account.sync.requested` +- `org.sync.requested` +- `locker.sync.requested` +- `locker.va.sync.requested` +- `garage.vgarage.sync.requested` + +### Example + +Register a listener, emit an event, then remove the listener when it is no longer needed: + +```sqf +private _token = EGVAR(common,EventBus) call ["on", [ + "task.completed", + { + params ["_event"]; + ["INFO", format ["Task completed: %1", _event getOrDefault ["taskID", ""]]] call EFUNC(common,log); + }, + "example" +]]; + +EGVAR(common,EventBus) call ["emit", [ + "task.completed", + createHashMapFromArray [["taskID", "task_001"]], + createHashMapFromArray [["source", "task"]] +]]; + +EGVAR(common,EventBus) call ["off", [_token]]; +``` diff --git a/docus/content/2.server-extension/4.icom.md b/docus/content/2.server-extension/4.icom.md new file mode 100644 index 0000000..778e75d --- /dev/null +++ b/docus/content/2.server-extension/4.icom.md @@ -0,0 +1,194 @@ +--- +title: "ICOM Usage Guide" +description: "ICOM is the Forge inter-server communication helper. It lets multiple Arma 3 servers exchange generic JSON events through a central TCP hub instead of connecting directly to each other." +--- + +## Runtime Shape + +```text +Arma server SQF + -> forge_server extension icom:* command + -> ICOM client inside the extension + -> forge-icom TCP hub + -> target server extension + -> forge_icom_event CBA server event +``` + +The ICOM hub lives in `bin/icom`. The Arma server extension integrates with it +through `arma/server/extension/src/icom.rs`. + +## Components + +| Component | Path | Role | +| --- | --- | --- | +| ICOM hub binary | `bin/icom` | Standalone TCP router for connected servers. | +| ICOM client library | `bin/icom/src/client.rs` | Rust client used by the Forge server extension and examples. | +| Extension command group | `arma/server/extension/src/icom.rs` | Exposes `icom:*` commands to SQF and forwards inbound events to Arma. | +| SQF callback bridge | `arma/server/addons/main/XEH_preInit.sqf` | Receives extension callbacks and re-emits `forge_icom_event` through CBA. | + +## Build and Run the Hub + +Build the release binary: + +```powershell +cargo build --release -p forge-icom +``` + +Run it during development: + +```powershell +cargo run -p forge-icom +``` + +The default bind address is `0.0.0.0:9090`. + +## Hub Configuration + +Copy `bin/icom/config.example.toml` to `config.toml` beside the `forge-icom` +executable or into the working directory used to launch it. + +```toml +[server] +host = "0.0.0.0" +port = 9090 +``` + +Use `127.0.0.1` for same-machine testing. Use `0.0.0.0` when remote Arma +servers need to connect, and secure the port at the firewall or host network +layer. + +## Extension Commands + +ICOM commands are exposed through the `icom` command group in `forge_server`. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `icom:connect` | `address`, `server_id` | `Connection initiated` or `ERROR: Already connected`. | +| `icom:send_event` | `target_server`, `event_name`, `data_json` | `OK` or `ERROR: `. | +| `icom:broadcast` | `event_name`, `data_json` | `OK` or `ERROR: `. | + +The current extension connects when `icom:connect` is called. Start the ICOM hub +first, then connect each Arma server with a unique `server_id`. + +```sqf +private _result = "forge_server" callExtension [ + "icom:connect", + ["127.0.0.1:9090", "server_1"] +]; +diag_log format ["[ICOM] Connect result: %1", _result select 0]; +``` + +## Send an Event + +Send a targeted event to one connected server: + +```sqf +private _data = createHashMapFromArray [ + ["coords", [1234, 5678, 0]], + ["supplies", ["ammo_box", "medical_supplies"]] +]; + +"forge_server" callExtension [ + "icom:send_event", + ["server_2", "supply_drop", toJSON _data] +]; +``` + +Broadcast to every connected server except the sender: + +```sqf +private _alert = createHashMapFromArray [ + ["message", "Server restart in 5 minutes"], + ["severity", "warning"] +]; + +"forge_server" callExtension [ + "icom:broadcast", + ["global_alert", toJSON _alert] +]; +``` + +## Receive Events + +Inbound ICOM events are forwarded to SQF as the CBA server event +`forge_icom_event`. + +```sqf +["forge_icom_event", { + params ["_eventName", "_data"]; + + switch (_eventName) do { + case "supply_drop": { + private _coords = _data getOrDefault ["coords", []]; + private _supplies = _data getOrDefault ["supplies", []]; + diag_log format ["[ICOM] Supply drop at %1: %2", _coords, _supplies]; + }; + case "global_alert": { + private _message = _data getOrDefault ["message", ""]; + if (_message isNotEqualTo "") then { + [_message] remoteExec ["hint", 0]; + }; + }; + default { + diag_log format ["[ICOM] Unhandled event: %1 | %2", _eventName, _data]; + }; + }; +}] call CBA_fnc_addEventHandler; +``` + +## Message Protocol + +The hub uses newline-delimited JSON. The first message from each client is a +registration payload: + +```json +{ + "type": "register", + "server_id": "server_1" +} +``` + +Targeted events use `type: "event"`: + +```json +{ + "type": "event", + "target_server": "server_2", + "event_name": "supply_drop", + "data": { + "coords": [1234, 5678, 0] + } +} +``` + +Broadcasts use `type: "broadcast"` and are routed to all connected servers +except the sender. + +## Operational Notes + +- Server IDs must be unique. If the same ID reconnects, the hub replaces the old + connection. +- Event names are mission/application contracts. ICOM only routes them; it does + not validate gameplay meaning. +- Always send valid JSON in the `data_json` argument. +- `icom:send_event` and `icom:broadcast` return quickly after scheduling async + work in the extension. Check extension and ICOM hub logs for delivery errors. +- Keep event payloads small and stable. Use IDs or compact data where possible. + +## Testing + +Start the hub: + +```powershell +cargo run -p forge-icom +``` + +Run example clients in separate terminals: + +```powershell +cargo run -p forge-icom --example server_1_client +cargo run -p forge-icom --example server_2_client +``` + +For Arma testing, start the hub, connect the server with `icom:connect`, register +a `forge_icom_event` handler, then send an event from another connected server. diff --git a/docus/content/3.server-modules/.navigation.yml b/docus/content/3.server-modules/.navigation.yml new file mode 100644 index 0000000..b3ef48f --- /dev/null +++ b/docus/content/3.server-modules/.navigation.yml @@ -0,0 +1,2 @@ +title: Server Modules +icon: i-lucide-layers-3 diff --git a/docus/content/3.server-modules/0.index.md b/docus/content/3.server-modules/0.index.md new file mode 100644 index 0000000..ae13769 --- /dev/null +++ b/docus/content/3.server-modules/0.index.md @@ -0,0 +1,114 @@ +--- +title: Server Module Guides +description: These pages document the authoritative server-side workflows in Forge. +--- + +Most modules follow the same shape: + +1. Server SQF gathers game context and validates mission/runtime assumptions. +2. The `forge_server` extension routes the request into the matching command group. +3. Services apply business rules through storage-agnostic repository traits. +4. The extension persists durable state through SurrealDB adapters when needed. + +## Gameplay Domains + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-user-round + title: Actor + to: /server-modules/actor + --- + Persistent player identity, position, loadout, contact fields, and hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-wallet + title: Bank + to: /server-modules/bank + --- + Player funds, transfers, PIN validation, checkout charging, and bank hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-map + title: CAD + to: /server-modules/cad + --- + Dispatch requests, assignments, profiles, grouped state, and hydrated views. + ::: + + :::u-page-card + --- + icon: i-lucide-ambulance + title: Economy + to: /server-modules/economy + --- + Fuel, service, and medical charging rules across player and organization funds. + ::: + + :::u-page-card + --- + icon: i-lucide-car-front + title: Garage + to: /server-modules/garage + --- + Vehicle storage, hot-state updates, and persistence of vehicle condition. + ::: + + :::u-page-card + --- + icon: i-lucide-package + title: Locker + to: /server-modules/locker + --- + Player inventory storage, unique item limits, and locker hot-state behavior. + ::: + + :::u-page-card + --- + icon: i-lucide-building-2 + title: Organization + to: /server-modules/organization + --- + Membership, treasury, shared assets, fleet, and organization hot workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-key-round + title: Owned Storage + to: /server-modules/owned-storage + --- + Owner-scoped locker and vehicle unlock storage used by org-linked features. + ::: + + :::u-page-card + --- + icon: i-lucide-smartphone + title: Phone + to: /server-modules/phone + --- + Contacts, message threads, and email state for in-game phone workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-shopping-cart + title: Store + to: /server-modules/store + --- + Checkout orchestration across pricing, grants, payment sources, and rollback. + ::: + + :::u-page-card + --- + icon: i-lucide-flag + title: Task + to: /server-modules/task + --- + Task catalog, ownership, status transitions, defuse counters, and rewards. + ::: +:: diff --git a/docus/content/3.server-modules/1.actor.md b/docus/content/3.server-modules/1.actor.md new file mode 100644 index 0000000..c32c383 --- /dev/null +++ b/docus/content/3.server-modules/1.actor.md @@ -0,0 +1,142 @@ +--- +title: "Actor Usage Guide" +description: "The actor module stores persistent player character data: identity, loadout, position, direction, stance, contact fields, state, holster status, rank, and organization." +--- + +## Storage Model + +Actor data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "loadout": {}, + "position": [1234.5, 6789.0, 0.0], + "direction": 90.0, + "stance": "STAND", + "email": "0160000000@spearnet.mil", + "phone_number": "0160000000", + "state": "HEALTHY", + "holster": true, + "rank": null, + "organization": "default" +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument and must be a 17-digit Steam + UID. +- `name` is optional, but cannot be empty when set and cannot exceed 50 + characters. +- `position` must be three finite numbers when set. +- `direction` must be in the `0.0 <= direction < 360.0` range. +- `email` must contain `@` and end with `.mil` when set. +- `phone_number` must start with `0160` and be 10 digits when set. +- Empty `phone_number`, `email`, or `organization` fields are filled on create. + +## Commands + +All commands are called on the `actor` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `actor:get` | `uid` | Actor JSON. If no actor exists, returns a default actor but does not persist it. | +| `actor:create` | `uid`, `actor_json` | Persisted actor JSON. | +| `actor:update` | `uid`, `patch_json` | Updated actor JSON. | +| `actor:exists` | `uid` | `true` or `false`. | +| `actor:delete` | `uid` | `OK`. | + +## Create an Actor + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _actor = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["loadout", getUnitLoadout player], + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["email", ""], + ["phone_number", ""], + ["state", "HEALTHY"], + ["holster", true], + ["organization", "default"] +]; + +private _result = "forge_server" callExtension ["actor:create", [ + getPlayerUID player, + toJSON _actor +]]; +``` + +## New Player Bootstrap + +The server actor store treats a player with no persisted actor as a new player. +After `actor:create` succeeds, the actor store runs onboarding once for that UID: + +- Initializes the player's phone state. +- Sends a Field Commander email from `field_commander` with the `Job Orientation` + subject and the generated phone number and email address. +- Sends two Field Commander text messages with the first-day instructions. +- Initializes the player's bank account if needed and adds `$2,000` to the bank + balance. + +This bootstrap is tied to persistent actor creation, not hot-state hydration, so +returning players and repaired partial actor records do not receive the welcome +messages or starting money again. + +## Update an Actor + +`actor:update` accepts a JSON object containing only fields to change. + +```sqf +private _patch = createHashMapFromArray [ + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["loadout", getUnitLoadout player] +]; + +private _result = "forge_server" callExtension ["actor:update", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +Supported patch fields are `name`, `position`, `direction`, `stance`, `email`, +`phone_number`, `state`, `holster`, `rank`, `organization`, and `loadout`. +`uid` is ignored. + +## Hot State + +The `actor:hot:*` commands keep a runtime copy of actor data and write it back +only when `actor:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `actor:hot:init` | `uid` | Actor JSON from durable storage. | +| `actor:hot:get` | `uid` | Actor JSON. | +| `actor:hot:keys` | none | JSON array of hot actor UIDs. | +| `actor:hot:override` | `uid`, `actor_json` | Actor JSON. | +| `actor:hot:save` | `uid` | Current hot actor JSON and async durable save. | +| `actor:hot:remove` | `uid` | `OK`. | + +Use hot state for frequently updated session data such as position and loadout. +Use durable commands for account creation and administrative changes. + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor error: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` diff --git a/docus/content/3.server-modules/10.store.md b/docus/content/3.server-modules/10.store.md new file mode 100644 index 0000000..4148d87 --- /dev/null +++ b/docus/content/3.server-modules/10.store.md @@ -0,0 +1,150 @@ +--- +title: "Store Usage Guide" +description: "The store module processes checkout requests. It charges a payment source and grants purchased items to the player locker, virtual arsenal locker, and virtual garage unlocks." +--- + +## Server SQF Module + +The server addon uses two long-lived module objects: + +- `StorefrontStore` is the storefront workflow facade. It builds hydrate + payloads, validates checkout requests, calls the Rust `store:checkout` + command, syncs UI patches, and asks related module stores to save hot state. +- `StoreCatalogService` scans configured item and vehicle categories, builds + catalog responses, resolves checkout entries, and calculates authoritative + prices. + +Editor-placed store entities are initialized by `fnc_initStore` during store +post-init. The initializer matches non-null mission namespace objects whose +variable names contain `store` and sets `isStore = true`, following the same +pattern used by garage entities. + +## Checkout Model + +`store:checkout` accepts one JSON context. + +```json +{ + "requesterUid": "76561198000000000", + "requesterName": "Player Name", + "orgId": "default", + "requesterIsDefaultOrgCeo": false, + "paymentMethod": "bank", + "items": [ + { + "classname": "arifle_MX_F", + "category": "weapon", + "priceValue": 500, + "quantity": 1 + } + ], + "vehicles": [ + { + "classname": "B_Quadbike_01_F", + "category": "cars", + "priceValue": 1500 + } + ] +} +``` + +Rules validated by the Rust service: + +- `requesterUid` is required. +- At least one item or vehicle is required. +- The checkout total must be greater than zero. +- Item categories must be `item`, `attachment`, `weapon`, `magazine`, or + `backpack`. +- Vehicle categories must be `cars`, `armor`, `helis`, `planes`, `naval`, or + `other`. +- Payment method must be `cash`, `bank`, `org_funds`, or `credit_line`. +- Player locker capacity cannot exceed 25 unique items after checkout. +- Organization funds can only be charged by the org owner or the default org + CEO flag. + +## Command + +| Command | Arguments | Returns | +| --- | --- | --- | +| `store:checkout` | `checkout_json` | Checkout result JSON. | + +## Result Model + +```json +{ + "chargedTotal": 2000.0, + "paymentMethod": "bank", + "message": "Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).", + "lockerGranted": [], + "vehicleGranted": [], + "lockerPatch": {}, + "vaPatch": {}, + "vgaragePatch": {}, + "bankPatch": {}, + "orgPatch": {}, + "orgTargetUids": [] +} +``` + +Patch fields are intended for UI updates after checkout. The service commits +all grants and payment changes together, and attempts rollback if a later write +fails. + +## Player Bank Checkout + +```sqf +private _item = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["category", "weapon"], + ["priceValue", 500], + ["quantity", 1] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [_item]], + ["vehicles", []] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Organization Funds Checkout + +When `paymentMethod` is `org_funds`, vehicles are also added to the +organization fleet patch. + +```sqf +private _vehicle = createHashMapFromArray [ + ["classname", "B_Quadbike_01_F"], + ["category", "cars"], + ["priceValue", 1500] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "org_funds"], + ["items", []], + ["vehicles", [_vehicle]] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Checkout failed: %1", _payload]; +}; + +private _checkoutResult = fromJSON _payload; +``` diff --git a/docus/content/3.server-modules/11.task.md b/docus/content/3.server-modules/11.task.md new file mode 100644 index 0000000..f9731f3 --- /dev/null +++ b/docus/content/3.server-modules/11.task.md @@ -0,0 +1,584 @@ +--- +title: "Task Usage Guide" +description: "The task module stores transient mission task metadata for active server or mission lifecycle workflows. SQF still owns Arma-only runtime state such as objects and participants." +--- + +The server addon at `arma/server/addons/task` also owns task execution: +creating BIS tasks, registering task entities, tracking participants, binding +task ownership, applying player/org rewards, and clearing task state when a +task completes. + +Runtime dependencies: + +- `forge_server_extension` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_bank` +- `forge_server_org` +- `forge_client_notifications` + +## Data Model + +Catalog entries are flexible JSON objects. The service normalizes these fields +when a catalog entry is inserted or ownership changes: + +- `taskId` +- `taskID` +- `accepted` +- `requesterUid` +- `orgID` +- `prerequisiteTaskIds` + +Ownership context: + +```json +{ + "requesterUid": "76561198000000000", + "orgId": "default" +} +``` + +## Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `task:reset` | none | `true`. | +| `task:catalog:active` | none | Active catalog entry array JSON. | +| `task:catalog:get` | `task_id` | Catalog entry JSON or `null`. | +| `task:catalog:upsert` | `task_id`, `entry_json` | Stored catalog entry JSON. | +| `task:catalog:delete` | `task_id` | `true`. | +| `task:ownership:bind` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:release` | `task_id` | Ownership mutation result JSON. | +| `task:ownership:accept` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:reward_context` | `task_id` | Reward context JSON. | +| `task:status:set` | `task_id`, `status` | `true`. | +| `task:status:get` | `task_id` | Status string JSON. | +| `task:status:clear` | `task_id` | `true`. | +| `task:defuse:increment` | `task_id` | New counter value JSON. | +| `task:defuse:get` | `task_id` | Counter value JSON. | +| `task:clear` | `task_id` | `true`. | + +## Upsert a Catalog Entry + +```sqf +private _entry = createHashMapFromArray [ + ["title", "Destroy Cache"], + ["description", "Destroy the enemy supply cache."], + ["reward", 1500] +]; + +private _result = "forge_server" callExtension ["task:catalog:upsert", [ + "task-cache-1", + toJSON _entry +]]; +``` + +## Mark a Task Active + +```sqf +"forge_server" callExtension ["task:status:set", [ + "task-cache-1", + "active" +]]; + +private _active = "forge_server" callExtension ["task:catalog:active", []]; +``` + +Completed statuses `succeeded` and `failed` are also stored as completed status +fallbacks. Clearing status removes active and completed state. + +## Accept a Task + +```sqf +private _ownership = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", "default"] +]; + +private _result = "forge_server" callExtension ["task:ownership:accept", [ + "task-cache-1", + toJSON _ownership +]]; +``` + +`task:ownership:accept` fails if the task is not active or another requester +already accepted it. + +## Rewards + +```sqf +private _result = "forge_server" callExtension ["task:ownership:reward_context", [ + "task-cache-1" +]]; + +private _context = fromJSON (_result select 0); +``` + +The reward context contains `requesterUid` and `orgId`. + +## Server Task Flows + +The task addon provides these server-owned task flows: + +- `attack` +- `defend` +- `defuse` +- `delivery` +- `destroy` +- `hostage` +- `hvt` + +Mission designers can create tasks in four ways: + +- Eden modules for editor-authored tasks. +- `forge_server_task_fnc_startTask` for script-authored tasks. +- `forge_server_task_fnc_handler` for pre-registered entities with reputation + gating and ownership binding. This path expects the BIS task and catalog + entry to already exist if map-task and CAD visibility are required. +- Direct task function calls for server-owned or mission-authored flows that + intentionally fall back to the `default` org. This path expects the BIS task + to already exist if map-task visibility is required. + +The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path. + +## CAD Compatibility + +CAD hydrates assignable tasks from `TaskStore.getActiveTaskCatalog`. A task must +have a catalog entry and a task status of `available`, `assigned`, or `active` +before CAD can show it. +CAD assignment only reserves a task for a group. The task is accepted and task +logic starts after the assigned group leader acknowledges the assignment. If +the leader declines, the CAD assignment is removed and the task returns to the +open contract board. + +CAD-compatible creation paths: + +- Eden modules: compatible because they delegate to + `forge_server_task_fnc_startTask`. +- `forge_server_task_fnc_startTask`: compatible because it registers the + catalog entry, creates the BIS task, and dispatches through the handler. +- Dynamic mission manager attack tasks: compatible because the mission manager + uses `forge_server_task_fnc_startTask`. + +Limited or incompatible paths: + +- `forge_server_task_fnc_handler`: only compatible if a catalog entry was + already registered elsewhere. The handler sets available status and ownership, + but it does not create the BIS task shown in the map task tab or upsert the + catalog entry. +- Direct task function calls: not CAD-compatible by default. They bypass + `startTask` and usually do not register the task catalog entry or active + status that CAD hydrates from. They also only call `BIS_fnc_taskSetState` at + completion/failure; they do not create the BIS task first. + +## BIS Map Task Prerequisite + +Only the Eden task modules and `forge_server_task_fnc_startTask` create the BIS +task automatically through `BIS_fnc_taskCreate`. + +If a mission uses `forge_server_task_fnc_handler` directly or calls a task flow +function such as `forge_server_task_fnc_attack`, the mission must create a BIS +task with the same task ID before the Forge task completes. Otherwise the +success/failure `BIS_fnc_taskSetState` call has no visible map task to update. + +That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted `BIS_fnc_taskCreate` call. `forge_server_task_fnc_startTask` is the +preferred Forge path because it handles BIS task creation, Forge catalog +registration, entity registration, and handler dispatch together. + +## Eden Modules + +Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules. + +Available task modules: + +- `FORGE_Module_Attack`: sync directly to target units or vehicles. +- `FORGE_Module_Destroy`: sync directly to objects, vehicles, or units. +- `FORGE_Module_Defuse`: sync to `FORGE_Module_Explosives` and optionally + `FORGE_Module_Protected`. +- `FORGE_Module_Delivery`: sync to `FORGE_Module_Cargo`; the cargo module syncs + to cargo objects. +- `FORGE_Module_Hostage`: sync to `FORGE_Module_Hostages` and + `FORGE_Module_Shooters`. +- `FORGE_Module_HVT`: sync directly to HVT units. +- `FORGE_Module_Defend`: configure the defense marker and wave settings; sync + enemy units to use their groups as wave templates. + +These modules delegate to `forge_server_task_fnc_startTask`. + +Each task module also includes an optional chain field: + +- `Prerequisite Task IDs`: comma-separated task IDs that must succeed first. + +## Mission Designer Guide + +This section is the practical Eden setup guide for mission designers. + +### General Rules + +Use these rules for every Forge task: + +1. Give every task a unique `TaskID`. +2. Use area markers for zone-style fields such as: + - `DefenseZone` + - `DeliveryZone` + - `ExtZone` + - `CBRNZone` +3. Prefer `RECTANGLE` or `ELLIPSE` markers with real size. +4. Set success and fail limits explicitly instead of relying on defaults. +5. If a task uses a timer, the countdown now waits until the assigned group + leader acknowledges the task. +6. Grouping modules such as `Explosive Entities`, `Protected Entities`, + `Cargo`, `Hostages`, and `Shooters` should be synced to real world objects, + not other logic modules. +7. To chain tasks, set `Prerequisite Task IDs` on the dependent task module. + Use comma-separated IDs such as `attack_01, delivery_02`. The dependent + task stays hidden from CAD and cannot be assigned until every listed task + succeeds. +8. Reward class fields accept comma-separated class names without brackets, + such as `ItemGPS, FirstAidKit`. Legacy SQF array strings such as + `["ItemGPS","FirstAidKit"]` are still supported. + +### Attack Task + +Use `FORGE_Module_Attack` when players need to eliminate hostile units or +vehicles. + +Setup: + +1. Place the enemy units or vehicles. +2. Place `FORGE_Module_Attack`. +3. Set `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be killed. +5. Set `LimitFail` if you want a fail threshold. +6. Set rewards, rating, and optional `TimeLimit`. +7. Sync the attack module directly to the target units or vehicles. + +Notes: + +- This module reads its synced entities directly. +- `TimeLimit` uses seconds. `0` means no limit. + +### Destroy Task + +Use `FORGE_Module_Destroy` when players must destroy objects, vehicles, or +units. + +Setup: + +1. Place the objects, vehicles, or units that must be destroyed. +2. Place `FORGE_Module_Destroy`. +3. Set `TaskID`. +4. Set `LimitSuccess` to the number of targets that must be destroyed. +5. Set `LimitFail` if the mission should fail after too many losses. +6. Set rewards, rating, and optional `TimeLimit`. +7. Sync the destroy module directly to the targets. + +Notes: + +- This module reads its synced entities directly. +- `TimeLimit` uses seconds. `0` means no limit. + +### Defuse Task + +Use `FORGE_Module_Defuse` when players must defuse one or more explosives while +protecting other entities. + +Required module layout: + +```text +[Defuse Task] --> [Explosive Entities] --> explosive objects +[Defuse Task] --> [Protected Entities] --> protected objects/vehicles/units +``` + +Setup: + +1. Place the explosive objects that players must defuse. +2. Place `FORGE_Module_Explosives`. +3. Sync each explosive object to `FORGE_Module_Explosives`. +4. Place the objects, vehicles, or units that must survive. +5. Place `FORGE_Module_Protected`. +6. Sync each protected entity to `FORGE_Module_Protected`. +7. Place `FORGE_Module_Defuse`. +8. Set `TaskID`. +9. Set `LimitSuccess` to the number of explosives that must be defused. +10. Set `LimitFail` to the number of protected entities that can be lost before failure. +11. Set `TimeLimit` to the IED countdown in seconds. This is per-IED countdown behavior, not a global mission timer. +12. Set rewards, rating, and end-state options. +13. Sync `FORGE_Module_Defuse` to `FORGE_Module_Explosives`. +14. Sync `FORGE_Module_Defuse` to `FORGE_Module_Protected`. + +Notes: + +- The module reads grouped objects from the `Explosive Entities` and + `Protected Entities` modules, not from direct object syncs. +- Logic objects are filtered out already, so only real explosives and protected + entities are counted. +- The ACE defuse event is wired to the task system and resolves IEDs back to + the correct task. + +### Delivery Task + +Use `FORGE_Module_Delivery` when players must move cargo into a delivery zone. + +Required module layout: + +```text +[Delivery Task] --> [Cargo] --> cargo objects +``` + +Setup: + +1. Place the cargo objects. +2. Create an area marker for the delivery zone. +3. Place `FORGE_Module_Cargo`. +4. Sync each cargo object to `FORGE_Module_Cargo`. +5. Place `FORGE_Module_Delivery`. +6. Set `TaskID`. +7. Set `DeliveryZone` to the marker name. +8. Set `LimitSuccess` to the number of cargo objects that must arrive. +9. Set `LimitFail` to the number of cargo objects that can be damaged past the fail threshold. +10. Set rewards, rating, and optional `TimeLimit`. +11. Sync `FORGE_Module_Delivery` to `FORGE_Module_Cargo`. + +Notes: + +- The runtime checks `inArea DeliveryZone`, so the zone must be an area marker. + +### Hostage Task + +Use `FORGE_Module_Hostage` when players must rescue hostages and move them to +an extraction zone. + +Required module layout: + +```text +[Hostage Task] --> [Hostage Entities] --> hostage units +[Hostage Task] --> [Shooter Entities] --> hostile shooter units +``` + +Setup: + +1. Place the hostage AI units. +2. Place the hostile shooter AI units. +3. Create an area marker for the extraction zone. +4. If using the CBRN variant, create an area marker for the `CBRNZone`. +5. Place `FORGE_Module_Hostages`. +6. Sync the hostage units to `FORGE_Module_Hostages`. +7. Place `FORGE_Module_Shooters`. +8. Sync the shooter units to `FORGE_Module_Shooters`. +9. Place `FORGE_Module_Hostage`. +10. Set `TaskID`. +11. Set `ExtZone` to the extraction marker name. +12. Set `LimitSuccess` to the number of hostages that must be rescued. +13. Set `LimitFail` to the number of hostages that can be lost before failure. +14. Set `Execution` or `CBRN` as needed for the mission variant. +15. If `CBRN` is enabled, set `CBRNZone`. +16. Set rewards, rating, and optional `TimeLimit`. +17. Sync `FORGE_Module_Hostage` to `FORGE_Module_Hostages`. +18. Sync `FORGE_Module_Hostage` to `FORGE_Module_Shooters`. + +Notes: + +- Hostages and shooters are filtered to real units only. +- Hostages are protected immediately on task registration to avoid startup race conditions. +- The hostage timer now waits until the assigned group leader acknowledges the + task before counting down. +- `ExtZone` is checked with `inArea`, so it must be an area marker. + +### HVT Task + +Use `FORGE_Module_HVT` when players must capture or eliminate a high-value +target. + +Setup: + +1. Place the HVT unit or units. +2. If using capture mode, create an area marker for the extraction zone. +3. Place `FORGE_Module_HVT`. +4. Set `TaskID`. +5. Set `CaptureHVT` as needed: + - enabled for capture/extract + - disabled for kill/eliminate +6. If using capture mode, set `ExtZone` to the extraction marker name. +7. Set `LimitSuccess` to the number of HVTs that must be captured or eliminated. +8. Set `LimitFail` if the mission should fail after too many HVT deaths in capture mode. +9. Set rewards, rating, and optional `TimeLimit`. +10. Sync the HVT module directly to the HVT unit or units. + +Notes: + +- Capture mode uses `ExtZone` with `inArea`, so use an area marker. +- Elimination mode does not require an extraction zone. +- The HVT timer now waits until the assigned group leader acknowledges the task + before counting down. + +### Defend Task + +Use `FORGE_Module_Defend` when players must hold an area against spawned enemy +waves. + +Setup: + +1. Create an area marker for the defense zone. +2. Place `FORGE_Module_Defend`. +3. Set `TaskID`. +4. Set `DefenseZone` to the defense marker name. +5. Set `DefendTime` to how long the area must be held. +6. Set `WaveCount`. +7. Set `WaveCooldown`. +8. Set `MinBlufor` to the minimum number of friendlies required in the zone. +9. Place one or more enemy groups or units to use as wave templates. +10. Sync any unit from each enemy group to the defend module. +11. Set rewards, rating, and end-state options. + +Notes: + +- Synced enemy units are treated as templates. Syncing one unit from a group + makes the whole group available as a wave composition. +- If no enemy units are synced, the defend task falls back to default CSAT + infantry waves. +- The defend task waits for the required number of BLUFOR to enter the zone + before the timer, waves, and empty-zone failure checks begin. +- `DefenseZone` must be an area marker. + +### Quick Reference + +Use direct syncs: + +- `Attack Task` -> target units/vehicles +- `Destroy Task` -> target objects/vehicles/units +- `HVT Task` -> HVT units + +Use grouping modules: + +- `Defuse Task` -> `Explosive Entities`, `Protected Entities` +- `Delivery Task` -> `Cargo` +- `Hostage Task` -> `Hostage Entities`, `Shooter Entities` + +Use area markers: + +- `DefenseZone` +- `DeliveryZone` +- `ExtZone` +- `CBRNZone` + +## Scripted Start Task + +Use `forge_server_task_fnc_startTask` when creating tasks from modules, +mission scripts, or generated mission-manager content. It registers task +entities, creates the BIS task, stores the catalog entry, then dispatches +through `forge_server_task_fnc_handler`. + +```sqf +[ + "attack", + "compound_attack_01", + getPosATL leader1, + "Attack: East Compound", + "Eliminate all hostile forces.", + createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", 3], + ["prerequisiteTaskIds", ["recon_01"]], + ["funds", 50000], + ["ratingFail", -10], + ["ratingSuccess", 20], + ["timeLimit", 900] + ], + 0, + getPlayerUID player, + "script" +] call forge_server_task_fnc_startTask; +``` + +## Chained Tasks + +Use `prerequisiteTaskIds` when a task should stay hidden until one or more +other tasks succeed. The task is still registered during mission setup, but it +is stored with `locked` status, filtered out of CAD, blocked from assignment, +and its task logic does not start until every prerequisite task has completed +with `succeeded`. + +```sqf +[ + "delivery", + "supply_delivery_02", + getMarkerPos "delivery_zone_02", + "Deliver Medical Supplies", + "Move the cargo into the marked delivery area.", + createHashMapFromArray [["cargo", [cargoBox1, cargoBox2]]], + createHashMapFromArray [ + ["deliveryZone", "delivery_zone_02"], + ["limitSuccess", 2], + ["prerequisiteTaskIds", ["compound_attack_01"]], + ["funds", 30000] + ] +] call forge_server_task_fnc_startTask; +``` + +Notes: + +- `prerequisiteTaskIds` accepts either a string or an array of task ID strings. +- All prerequisite tasks must succeed before the chained task unlocks. +- If a prerequisite fails or never completes, the chained task remains locked. + +## Handler Calls + +Use `forge_server_task_fnc_handler` directly when the task entities are already +registered and you want reputation gating plus ownership binding. Create the +BIS task and catalog entry separately if this task should appear in the map +task tab or CAD: + +```sqf +[ + "delivery", + ["delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900], + 250, + getPlayerUID player +] call forge_server_task_fnc_handler; +``` + +## Direct Task Calls + +Direct task function calls still work for mission-authored or server-owned +tasks, but they do not provide a requester UID. Ownership falls back to the +`default` org. Create the BIS task separately if this task should appear in the +map task tab. + +## Timer Semantics + +Task time limits use `0` for no limit: + +- attack `timeLimit` +- destroy `timeLimit` +- delivery `timeLimit` +- hostage `timeLimit` +- HVT `timeLimit` + +Positive values are measured in seconds. Do not pass `-1` as a no-limit value; +the task runtime treats any non-zero task time limit as active. + +Defuse IED timers are different. `iedTimer` must be greater than `0`, because +IEDs are expected to have an active countdown. The Eden defuse module defaults +to `300` seconds. + +## Defuse Counter + +```sqf +"forge_server" callExtension ["task:defuse:increment", ["task-cache-1"]]; +private _count = "forge_server" callExtension ["task:defuse:get", ["task-cache-1"]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Task error: %1", _payload]; +}; +``` diff --git a/docus/content/3.server-modules/2.bank.md b/docus/content/3.server-modules/2.bank.md new file mode 100644 index 0000000..90c51c8 --- /dev/null +++ b/docus/content/3.server-modules/2.bank.md @@ -0,0 +1,188 @@ +--- +title: "Bank Usage Guide" +description: "The bank module stores player account balances, earnings, PINs, and transaction strings. The hot-state API also owns the active banking workflows used by the UI: deposit, withdraw, transfer, checkout charge, PIN validation, and PIN changes." +--- + +## Storage Model + +Bank data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "bank": 1000.0, + "cash": 250.0, + "earnings": 0.0, + "pin": 1234, + "transactions": [] +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument. +- `name` cannot be empty. +- `bank` and `cash` cannot be negative. +- `pin` must be a four-digit number. +- Durable `bank:get` requires an existing bank account. + +## Durable Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `bank:create` | `uid`, `bank_json` | Persisted bank JSON. | +| `bank:get` | `uid` | Bank JSON. | +| `bank:update` | `uid`, `patch_json` | Updated bank JSON. | +| `bank:exists` | `uid` | `true` or `false`. | +| `bank:delete` | `uid` | `OK`. | + +## Create an Account + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _account = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["bank", 0], + ["cash", 0], + ["earnings", 0], + ["pin", 1234], + ["transactions", []] +]; + +private _result = "forge_server" callExtension ["bank:create", [ + getPlayerUID player, + toJSON _account +]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `bank:hot:init` | `uid` | Bank JSON loaded into hot state. | +| `bank:hot:get` | `uid` | Bank JSON. | +| `bank:hot:override` | `uid`, `bank_json` | Bank JSON. | +| `bank:hot:patch` | `uid`, `patch_json` | `{ account, patch }`. | +| `bank:hot:deposit` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:withdraw` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:deposit_earnings` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:transfer` | `source_uid`, `target_uid`, `amount`, `context_json` | Transfer result JSON. | +| `bank:hot:charge_checkout` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:validate_pin` | `uid`, `pin`, `context_json` | `{}` on success. | +| `bank:hot:change_pin` | `uid`, `current_pin`, `new_pin`, `context_json` | `{ account, patch }`. | +| `bank:hot:save` | `uid` | Current hot bank JSON and async durable save. | +| `bank:hot:remove` | `uid` | `OK`. | + +Use hot-state commands for UI workflows. They return patch objects so the UI can +update only changed fields. + +## Deposit and Withdraw + +ATM sessions require `atmAuthorized: true`. Full bank sessions can set +`mode: "bank"`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "atm"], + ["atmAuthorized", true] +]; + +private _deposit = "forge_server" callExtension ["bank:hot:deposit", [ + getPlayerUID player, + "100", + toJSON _context +]]; + +private _withdraw = "forge_server" callExtension ["bank:hot:withdraw", [ + getPlayerUID player, + "50", + toJSON _context +]]; +``` + +## Transfer + +Transfers are only available from the full bank interface. `fromField` can be +`bank` or `cash`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false], + ["fromField", "bank"] +]; + +private _result = "forge_server" callExtension ["bank:hot:transfer", [ + getPlayerUID player, + _targetUid, + "250", + toJSON _context +]]; +``` + +## Checkout Charge + +Checkout charging supports `sourceField: "cash"` or `sourceField: "bank"`. +Set `commit` to `false` to preview the patch without saving. + +```sqf +private _context = createHashMapFromArray [ + ["sourceField", "bank"], + ["commit", true] +]; + +private _result = "forge_server" callExtension ["bank:hot:charge_checkout", [ + getPlayerUID player, + "125", + toJSON _context +]]; +``` + +## PIN Validation + +PIN entry is only valid in ATM mode. + +```sqf +private _context = createHashMapFromArray [["mode", "atm"]]; + +private _result = "forge_server" callExtension ["bank:hot:validate_pin", [ + getPlayerUID player, + "1234", + toJSON _context +]]; +``` + +## PIN Changes + +PIN changes require the current PIN and a different four-digit new PIN. The +command is only valid from the full bank interface. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false] +]; + +private _result = "forge_server" callExtension ["bank:hot:change_pin", [ + getPlayerUID player, + "1234", + "5678", + toJSON _context +]]; +``` + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["bank:hot:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Bank error: %1", _payload]; +}; + +private _bank = fromJSON _payload; +``` diff --git a/docus/content/3.server-modules/3.cad.md b/docus/content/3.server-modules/3.cad.md new file mode 100644 index 0000000..c10f700 --- /dev/null +++ b/docus/content/3.server-modules/3.cad.md @@ -0,0 +1,189 @@ +--- +title: "CAD Usage Guide" +description: "The CAD module stores transient operational state for dispatch activity, assignments, dispatch orders, support requests, group profiles, grouped views, and hydrated UI payloads. CAD state is in-memory and follows the active server or mission lifecycle." +--- + +## Data Model + +Most CAD records are flexible JSON objects. The service normalizes important +IDs and returns structured mutation results for higher-level workflows. + +Common generated IDs: + +- Orders: `cad-order:` +- Requests: `cad-request:` +- Assignments usually share a task ID or order ID. + +## Commands + +### Activity + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:activity:append` | `activity_json` | `OK`. | +| `cad:activity:recent` | `limit` | Recent activity array JSON. | + +### Assignments + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:assignments:list` | none | Assignment array JSON. | +| `cad:assignments:assign` | `entry_id`, `assignment_json` | Assignment mutation result JSON. | +| `cad:assignments:acknowledge` | `entry_id`, `patch_json` | Assignment mutation result JSON. | +| `cad:assignments:decline` | `entry_id`, `patch_json` | Assignment mutation result JSON and removes assignment. | +| `cad:assignments:upsert` | `entry_id`, `assignment_json` | `OK`. | +| `cad:assignments:delete` | `entry_id` | `OK`. | + +### Orders + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:orders:list` | none | Order array JSON. | +| `cad:orders:create` | `order_seed_json` | Dispatch order mutation result JSON. | +| `cad:orders:create_from_context` | `context_json` | Dispatch order mutation result JSON. | +| `cad:orders:close` | `entry_id` | Dispatch order mutation result JSON and removes order/assignment. | +| `cad:orders:upsert` | `entry_id`, `order_json` | `OK`. | +| `cad:orders:delete` | `entry_id` | `OK`. | + +### Requests + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:requests:list` | none | Request array JSON. | +| `cad:requests:submit` | `request_json` | Request mutation result JSON. | +| `cad:requests:submit_from_context` | `context_json` | Request mutation result JSON. | +| `cad:requests:close` | `entry_id` | Request mutation result JSON and removes request. | +| `cad:requests:upsert` | `entry_id`, `request_json` | `OK`. | +| `cad:requests:delete` | `entry_id` | `OK`. | + +### Profiles and Views + +| Command | Arguments | Returns | +| --- | --- | --- | +| `cad:profiles:list` | none | Profile array JSON. | +| `cad:profiles:update_from_context` | `context_json` | Profile mutation result JSON. | +| `cad:profiles:upsert` | `entry_id`, `profile_json` | `OK`. | +| `cad:profiles:delete` | `entry_id` | `OK`. | +| `cad:groups:build` | `groups_seed_json` | Group array JSON. | +| `cad:view:hydrate` | `hydrate_seed_json` | Hydrated CAD payload JSON. | + +## Submit a Support Request + +```sqf +private _fields = createHashMapFromArray [ + ["pickup_location", "Grid 123456"], + ["precedence", "urgent"], + ["security", "secure"] +]; + +private _context = createHashMapFromArray [ + ["type", "medevac_9line"], + ["fields", _fields], + ["groupId", "alpha"], + ["groupCallsign", "Alpha 1-1"], + ["submittedByUid", getPlayerUID player], + ["submittedByName", name player], + ["priority", "emergency"], + ["position", getPosATL player], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [ + toJSON _context +]]; +``` + +Supported priority values are `routine`, `priority`, and `emergency`. Unknown +values normalize to `priority`. + +## Create a Dispatch Order + +```sqf +private _context = createHashMapFromArray [ + ["assigneeGroupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["targetGroupId", "alpha"], + ["targetGroupCallsign", "Alpha 1-1"], + ["targetPosition", getPosATL player], + ["createdByUid", getPlayerUID player], + ["createdByName", name player], + ["requestId", "cad-request:1"], + ["requestType", "logreq"], + ["requestTitle", "LOGREQ | Alpha 1-1"], + ["requestSummary", "Ammo resupply requested"], + ["requestFields", createHashMap], + ["note", "Support Alpha 1-1 at current position."], + ["priority", "priority"], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:orders:create_from_context", [ + toJSON _context +]]; +``` + +## Assignment Workflow + +Task contracts have two separate phases. Dispatch assignment reserves a +contract for a group and sets the CAD assignment state to `assigned`, but it +does not accept or start the task. The assigned group leader must acknowledge +the assignment before task ownership is bound and task logic starts. If the +leader declines, the CAD assignment is removed and the contract returns to the +open board. Task status follows the same lifecycle: `available` on creation, +`assigned` after dispatch assignment, and `active` after acknowledgement. + +```sqf +private _assignment = createHashMapFromArray [ + ["groupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["assignedByUid", getPlayerUID player], + ["assignedByName", name player], + ["assignedAt", diag_tickTime], + ["state", "assigned"] +]; + +"forge_server" callExtension ["cad:assignments:assign", [ + "task-123", + toJSON _assignment +]]; + +private _ack = createHashMapFromArray [ + ["state", "acknowledged"], + ["acknowledgedByUid", getPlayerUID player], + ["acknowledgedAt", diag_tickTime] +]; + +"forge_server" callExtension ["cad:assignments:acknowledge", [ + "task-123", + toJSON _ack +]]; +``` + +## Hydrate the CAD UI + +```sqf +private _session = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["orgId", "default"], + ["isDispatcher", true], + ["groupId", "alpha"], + ["isLeader", true] +]; + +private _seed = createHashMapFromArray [ + ["groups", _liveGroups], + ["activeTasks", _activeTasks], + ["session", _session] +]; + +private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["CAD error: %1", _payload]; +}; +``` diff --git a/docus/content/3.server-modules/4.economy.md b/docus/content/3.server-modules/4.economy.md new file mode 100644 index 0000000..6a3df06 --- /dev/null +++ b/docus/content/3.server-modules/4.economy.md @@ -0,0 +1,93 @@ +--- +title: "Economy Usage Guide" +description: "The economy server addon owns Arma-world service behavior for fuel, medical, and repair interactions. It does not own money state. Money mutations go through extension-backed bank and organization hot state before the world effect is applied." +--- + +## Dependencies + +- `forge_server_common` for logging, formatting, and player lookup. +- `forge_server_bank` for personal medical billing. +- `forge_server_org` for organization-funded services and medical fallback + debt. +- `forge_client_actor` and `forge_client_notifications` for targeted client + responses. + +## Fuel + +Fuel is organization-funded. + +When refueling stops, `fnc_initFEconomyStore.sqf` calculates the fuel delta and +cost, charges the player's organization through `OrgStore chargeCheckout`, and +syncs the organization patch to online members. If organization funds cannot +cover the refuel, the vehicle is rolled back to the fuel level it had when the +session started. + +Garage UI refuel requests use the server `RefuelService` event. The fuel store +calculates missing fuel from the vehicle config `fuelCapacity`, charges the +player's organization, and fills the vehicle only after the organization charge +succeeds. + +## Repair + +Repair is organization-funded. + +Use the repair service event: + +```sqf +[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service repair cost. +The target is only repaired after the organization charge succeeds. + +The client garage UI forwards selected nearby vehicle repair requests through +the same event. + +## Rearm + +Rearm is organization-funded. + +Use the rearm service event: + +```sqf +[QEGVAR(economy,RearmService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service rearm cost. +The target is only rearmed after the organization charge succeeds. +`setVehicleAmmo` has global effects, but the ammo is only added to local +turrets, so the service broadcasts the ammo reset after billing succeeds. + +The client garage UI forwards selected nearby vehicle rearm requests through +the same event. + +## Medical + +Medical is player-funded first. + +When a heal is requested, `fnc_initMEconomyStore.sqf` uses this billing order: + +1. Charge the player's bank balance when it can cover the medical fee. +2. Otherwise charge the player's cash when it can cover the fee. +3. If neither personal balance can cover the fee, charge organization funds. +4. When organization funds cover the fallback charge, record the same amount as + debt on the player's organization credit line. + +The heal only completes after one of those charges succeeds. If personal +billing is unavailable, the heal does not fall back to organization funds +because the server cannot verify that the player is unable to cover the fee. + +## Medical Debt Repayment + +Medical fallback debt uses the existing organization credit-line repayment +flow. The organization treasury is reduced when the service is rendered, and +the player's credit-line `amount_due` increases by the medical fee. When the +player repays through the bank credit-line repayment action, player bank funds +are moved back into the organization treasury. + +## Hot-Cache Boundary + +The economy addon should stay server-authoritative for world effects such as +vehicle fuel, vehicle repair, healing, respawn placement, and death inventory +movement. Bank and organization balances should continue to mutate through the +extension-backed hot-cache services. diff --git a/docus/content/3.server-modules/5.garage.md b/docus/content/3.server-modules/5.garage.md new file mode 100644 index 0000000..4af5e42 --- /dev/null +++ b/docus/content/3.server-modules/5.garage.md @@ -0,0 +1,211 @@ +--- +title: "Garage Usage Guide" +description: "The garage module stores physical player vehicles. Each record keeps the vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit point damage." +--- + +## Storage Model + +Garage data is persisted through SurrealDB by the server extension. + +```json +{ + "plate-uuid": { + "plate": "plate-uuid", + "classname": "B_Quadbike_01_F", + "fuel": 1.0, + "damage": 0.0, + "hit_points": { + "names": ["hitengine"], + "selections": ["engine_hitpoint"], + "values": [0.0] + } + } +} +``` + +Rules validated by the Rust service: + +- A player garage can contain up to 5 vehicles. +- `garage:add` generates a UUID plate automatically. +- `fuel`, `damage`, and every hit point value must be between `0.0` and `1.0`. +- `hit_points.names`, `hit_points.selections`, and `hit_points.values` must have + the same length. +- `garage:get`, `garage:patch`, and `garage:remove` require an existing garage. +- `garage:add` creates an empty garage automatically when one does not exist. + +## Commands + +All commands are called on the `garage` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `garage:create` | `uid` | Empty vehicle map as JSON. | +| `garage:get` | `uid` | Vehicle map as JSON. | +| `garage:add` | `uid`, `vehicle_json` | Updated vehicle map as JSON. | +| `garage:update` | `uid`, `vehicles_json` | Replaced vehicle map as JSON. | +| `garage:patch` | `uid`, `patch_json` | Updated vehicle map as JSON. | +| `garage:remove` | `uid`, `remove_json` | Updated vehicle map as JSON. | +| `garage:delete` | `uid` | `OK`. | +| `garage:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Garage error: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +## Add a Vehicle + +`garage:add` requires `classname`, `fuel`, `damage`, and `hit_points`. + +```sqf +private _hitPointData = getAllHitPointsDamage _vehicle; +private _hitPoints = createHashMapFromArray [ + ["names", _hitPointData select 0], + ["selections", _hitPointData select 1], + ["values", _hitPointData select 2] +]; + +private _vehicleData = createHashMapFromArray [ + ["classname", typeOf _vehicle], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle], + ["hit_points", _hitPoints] +]; + +private _result = "forge_server" callExtension ["garage:add", [ + getPlayerUID player, + toJSON _vehicleData +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store vehicle: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +The returned value is a hash map keyed by generated plate. To find the newly +stored vehicle, compare returned keys before and after the add, or search by +classname if your workflow guarantees a unique pending vehicle. + +```sqf +private _storedPlate = ""; +{ + private _vehicleRecord = _garage get _x; + if ((_vehicleRecord get "classname") == typeOf _vehicle) then { + _storedPlate = _x; + }; +} forEach keys _garage; +``` + +## Patch a Vehicle + +`garage:patch` updates selected fields for one plate. The `plate` field is +required. `fuel`, `damage`, and `hit_points` are optional. + +```sqf +private _patch = createHashMapFromArray [ + ["plate", _vehicle getVariable ["forge_garage_plate", ""]], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle] +]; + +private _result = "forge_server" callExtension ["garage:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove a Vehicle + +`garage:remove` expects JSON with a `plate` field. + +```sqf +private _remove = createHashMapFromArray [ + ["plate", _plate] +]; + +private _result = "forge_server" callExtension ["garage:remove", [ + getPlayerUID player, + toJSON _remove +]]; +``` + +## Spawn a Stored Vehicle + +```sqf +fnc_spawnGarageVehicle = { + params ["_plate"]; + + private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load garage: %1", _payload]; + objNull + }; + + private _garage = fromJSON _payload; + private _vehicleData = _garage getOrDefault [_plate, createHashMap]; + if (_vehicleData isEqualTo createHashMap) exitWith { + hint "Vehicle plate was not found in your garage."; + objNull + }; + + private _vehicle = (_vehicleData get "classname") createVehicle (player getPos [10, getDir player]); + _vehicle setFuel (_vehicleData getOrDefault ["fuel", 1]); + _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]); + _vehicle setVariable ["forge_garage_plate", _plate, true]; + + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _names = _hitPoints getOrDefault ["names", []]; + private _values = _hitPoints getOrDefault ["values", []]; + + { + _vehicle setHitPointDamage [_x, _values select _forEachIndex]; + } forEach _names; + + private _remove = createHashMapFromArray [["plate", _plate]]; + "forge_server" callExtension ["garage:remove", [getPlayerUID player, toJSON _remove]]; + + _vehicle +}; +``` + +## Hot State + +The `garage:hot:*` commands keep a runtime copy of a player's garage and write +it back only when `garage:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `garage:hot:init` | `uid` | Vehicle map as JSON. | +| `garage:hot:get` | `uid` | Vehicle map as JSON. | +| `garage:hot:override` | `uid`, `vehicles_json` | Vehicle map as JSON. | +| `garage:hot:add` | `uid`, `vehicle_json` | Vehicle map as JSON. | +| `garage:hot:remove_vehicle` | `uid`, `remove_json` | Vehicle map as JSON. | +| `garage:hot:save` | `uid` | Current hot vehicle map as JSON. | +| `garage:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy vehicle workflows. Use the durable commands for +simple store/retrieve operations. + +## Best Practices + +- Store the generated plate on spawned vehicles with `setVariable`. +- Use `garage:patch` for frequent fuel and damage syncs. +- Use `garage:update` only when replacing the whole vehicle map intentionally. +- Do not delete the world vehicle until `garage:add` succeeds. +- Treat vehicle maps as hash maps keyed by plate, not arrays. diff --git a/docus/content/3.server-modules/6.locker.md b/docus/content/3.server-modules/6.locker.md new file mode 100644 index 0000000..bcda611 --- /dev/null +++ b/docus/content/3.server-modules/6.locker.md @@ -0,0 +1,202 @@ +--- +title: "Locker Usage Guide" +description: "The locker module stores physical player inventory items by classname. It is separate from the virtual arsenal unlock module documented in [Owned Storage Usage Guide](/server-modules/owned-storage)." +--- + +## Storage Model + +Locker data is persisted through SurrealDB by the server extension. + +```json +{ + "arifle_MX_F": { + "category": "weapon", + "classname": "arifle_MX_F", + "amount": 1 + } +} +``` + +Rules validated by the Rust service: + +- A locker can contain up to 25 unique classnames. +- `category` and `classname` cannot be empty. +- `amount` must be greater than `0`. +- `locker:add` creates an empty locker automatically when one does not exist. +- `locker:get`, `locker:patch`, and `locker:remove` require an existing locker. +- `locker:remove` takes the classname directly, not a JSON object. + +## Commands + +All commands are called on the `locker` group. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `locker:create` | `uid` | Empty item map as JSON. | +| `locker:get` | `uid` | Item map as JSON. | +| `locker:add` | `uid`, `item_json` | Updated item map as JSON. | +| `locker:update` | `uid`, `items_json` | Replaced item map as JSON. | +| `locker:patch` | `uid`, `patch_json` | Updated item map as JSON. | +| `locker:remove` | `uid`, `classname` | Updated item map as JSON. | +| `locker:delete` | `uid` | `OK`. | +| `locker:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Locker error: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Add an Item + +`locker:add` creates or overwrites one classname entry. + +```sqf +private _item = createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] +]; + +private _result = "forge_server" callExtension ["locker:add", [ + getPlayerUID player, + toJSON _item +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store item: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Patch an Amount + +`locker:patch` currently patches the `amount` field for an existing classname. + +```sqf +private _patch = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["amount", 5] +]; + +private _result = "forge_server" callExtension ["locker:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove an Item + +`locker:remove` takes the classname as the second argument. + +```sqf +private _result = "forge_server" callExtension ["locker:remove", [ + getPlayerUID player, + "arifle_MX_F" +]]; +``` + +## Retrieve an Item + +```sqf +fnc_retrieveLockerItem = { + params ["_classname"]; + + private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load locker: %1", _payload]; + false + }; + + private _locker = fromJSON _payload; + private _item = _locker getOrDefault [_classname, createHashMap]; + if (_item isEqualTo createHashMap) exitWith { + hint "Item was not found in your locker."; + false + }; + + private _amount = _item getOrDefault ["amount", 0]; + if (_amount <= 0) exitWith { + hint "Item is out of stock."; + false + }; + + if !(player canAdd _classname) exitWith { + hint "Not enough inventory space."; + false + }; + + player addItem _classname; + + if (_amount > 1) then { + private _patch = createHashMapFromArray [ + ["classname", _classname], + ["amount", _amount - 1] + ]; + "forge_server" callExtension ["locker:patch", [getPlayerUID player, toJSON _patch]]; + } else { + "forge_server" callExtension ["locker:remove", [getPlayerUID player, _classname]]; + }; + + true +}; +``` + +## Replace the Whole Locker + +`locker:update` replaces the whole item map. Use it for explicit bulk syncs, +not single-item changes. + +```sqf +private _items = createHashMapFromArray [ + ["arifle_MX_F", createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] + ]] +]; + +private _result = "forge_server" callExtension ["locker:update", [ + getPlayerUID player, + toJSON _items +]]; +``` + +## Hot State + +The `locker:hot:*` commands keep a runtime copy of a player's locker and write +it back only when `locker:hot:save` runs. + +| Command | Arguments | Returns | +| --- | --- | --- | +| `locker:hot:init` | `uid` | Item map as JSON. | +| `locker:hot:get` | `uid` | Item map as JSON. | +| `locker:hot:override` | `uid`, `items_json` | Item map as JSON. | +| `locker:hot:save` | `uid` | Current hot item map as JSON. | +| `locker:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy locker workflows. Use the durable commands for +simple item deposits and withdrawals. + +## Best Practices + +- Keep categories normalized, for example `weapon`, `magazine`, `item`, or + `backpack`. +- Use `locker:patch` for quantity changes. +- Use `locker:remove` when quantity reaches zero. +- Treat the locker response as a hash map keyed by classname. +- Check capacity before bulk operations that may exceed 25 unique items. diff --git a/docus/content/3.server-modules/7.organization.md b/docus/content/3.server-modules/7.organization.md new file mode 100644 index 0000000..5f04e95 --- /dev/null +++ b/docus/content/3.server-modules/7.organization.md @@ -0,0 +1,238 @@ +--- +title: "Organization Usage Guide" +description: "The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. Hot-state commands support the active organization UI workflows." +--- + +## Storage Model + +Core organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {} +} +``` + +Hot organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {}, + "assets": {}, + "fleet": {}, + "members": {}, + "pending_invites": {} +} +``` + +Rules validated by the Rust service: + +- `id` must be non-empty and contain only alphanumeric characters or `_`. +- `owner` must be `server` or a 17-digit Steam UID. +- `name` cannot be empty, cannot exceed 100 characters, and cannot contain + control characters. +- `funds`, reputation, and credit line amounts cannot be negative. +- Player registration is rejected when the player already belongs to a + non-default organization. +- Player registration through the server org addon requires a $50,000 personal + funds registration fee. The fee is charged from the player's bank balance + first, then on-hand cash if needed. + +## Durable Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `org:create` | `org_id`, `org_json` | Organization JSON. | +| `org:get` | `org_id` | Organization JSON. | +| `org:update` | `org_id`, `patch_json` | Updated organization JSON. | +| `org:exists` | `org_id` | `true` or `false`. | +| `org:delete` | `org_id` | `OK`. | +| `org:assets:get` | `org_id` | Asset map JSON. | +| `org:assets:update` | `org_id`, `assets_json` | Updated asset map JSON. | +| `org:fleet:get` | `org_id` | Fleet map JSON. | +| `org:fleet:update` | `org_id`, `fleet_json` | Updated fleet map JSON. | +| `org:members:get` | `org_id` | Member array JSON. | +| `org:members:add` | `org_id`, `member_uid` | `OK`. | +| `org:members:remove` | `org_id`, `member_uid` | `OK`. | + +## Create an Organization + +The command key is authoritative for `id`. + +```sqf +private _org = createHashMapFromArray [ + ["id", _orgId], + ["owner", getPlayerUID player], + ["name", "Spearnet Logistics"], + ["funds", 0], + ["reputation", 0], + ["credit_lines", createHashMap] +]; + +private _result = "forge_server" callExtension ["org:create", [ + _orgId, + toJSON _org +]]; +``` + +## Update Organization Funds + +```sqf +private _patch = createHashMapFromArray [ + ["funds", 5000], + ["reputation", 10] +]; + +private _result = "forge_server" callExtension ["org:update", [ + _orgId, + toJSON _patch +]]; +``` + +Supported durable patch fields are `id`, `owner`, `name`, `funds`, +`reputation`, and `credit_lines`. + +## Assets and Fleet + +Assets are grouped by category, then classname. + +```sqf +private _assets = createHashMapFromArray [ + ["ammo", createHashMapFromArray [ + ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [ + ["classname", "ACE_30Rnd_65x39_caseless_mag"], + ["type", "ammo"], + ["quantity", 20] + ]] + ]] +]; + +"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]]; +``` + +Fleet is keyed by an internal fleet entry ID. + +```sqf +private _fleet = createHashMapFromArray [ + ["B_Truck_01_transport_F_0", createHashMapFromArray [ + ["classname", "B_Truck_01_transport_F"], + ["name", "Transport Truck"], + ["type", "cars"], + ["status", "Ready"], + ["damage", "0%"] + ]] +]; + +"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `org:hot:init` | `org_id` | Hot organization JSON. | +| `org:hot:get` | `org_id` | Hot organization JSON. | +| `org:hot:override` | `org_id`, `hot_org_json` | Hot organization JSON. | +| `org:hot:ensure_member` | `context_json` | Hot organization JSON. | +| `org:hot:member_invites` | `member_uid` | Invite array JSON. | +| `org:hot:register` | `context_json` | Register result JSON. | +| `org:hot:invite_member` | `context_json` | Invite result JSON. | +| `org:hot:accept_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:decline_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:assign_credit_line` | `context_json` | Mutation result JSON. | +| `org:hot:repay_credit_line` | `context_json` | Repayment result JSON. | +| `org:hot:charge_checkout` | `context_json` | Mutation result JSON. | +| `org:hot:add_assets` | `context_json`, `assets_json` | Mutation result JSON. | +| `org:hot:add_fleet` | `context_json`, `fleet_json` | Mutation result JSON. | +| `org:hot:leave` | `context_json` | Leave result JSON. | +| `org:hot:disband` | `context_json` | Disband result JSON. | +| `org:hot:save` | `org_id` | Current hot organization JSON and async durable save. | +| `org:hot:remove` | `org_id` | `OK`. | + +## Register from UI Context + +The server-side `forge_server_org` registration flow charges the $50,000 +registration fee before completing organization creation. If the organization +service rejects the registration, the bank charge is refunded. + +```sqf +private _context = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["orgName", "Spearnet Logistics"], + ["existingOrgId", "default"] +]; + +private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]]; +``` + +## Invite and Accept + +```sqf +private _invite = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["targetUid", _targetUid], + ["targetName", _targetName], + ["targetOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]]; + +private _decision = createHashMapFromArray [ + ["requesterUid", _targetUid], + ["requesterName", _targetName], + ["orgId", _orgId], + ["existingOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]]; +``` + +## Credit Line Checkout + +```sqf +private _credit = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["memberUid", _memberUid], + ["memberName", _memberName], + ["amount", 1000] +]; + +"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]]; + +private _charge = createHashMapFromArray [ + ["requesterUid", _memberUid], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["source", "credit_line"], + ["amount", 250], + ["commit", true] +]; + +"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Organization error: %1", _payload]; +}; +``` diff --git a/docus/content/3.server-modules/8.owned-storage.md b/docus/content/3.server-modules/8.owned-storage.md new file mode 100644 index 0000000..44a38ff --- /dev/null +++ b/docus/content/3.server-modules/8.owned-storage.md @@ -0,0 +1,157 @@ +--- +title: "Owned Storage Usage Guide" +description: "Owned storage covers the `owned:locker` and `owned:garage` extension command groups. These modules store unlock lists rather than physical item or vehicle instances." +--- + +Use these modules for virtual arsenal and virtual garage unlocks. Use +[Locker Usage Guide](/server-modules/locker) and +[Garage Usage Guide](/server-modules/garage) for physical inventory and stored +vehicle instances. + +## Owned Locker Model + +```json +{ + "items": ["FirstAidKit"], + "weapons": ["arifle_MX_F"], + "magazines": ["30Rnd_65x39_caseless_black_mag"], + "backpacks": ["B_AssaultPack_rgr"] +} +``` + +Supported owned locker categories: + +- `items` +- `weapons` +- `magazines` +- `backpacks` + +New owned lockers are created with default unlocks from the Rust model. + +## Owned Garage Model + +```json +{ + "cars": ["B_Quadbike_01_F"], + "armor": [], + "helis": [], + "planes": [], + "naval": [], + "other": [] +} +``` + +Supported owned garage categories: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +The durable `owned:garage:remove` command currently accepts `heli` for the +helicopter category. Add, get, and hot remove accept `helis`. + +New owned garages are created with default unlocks from the Rust model. + +## Owned Locker Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:locker:create` | `uid` | Full owned locker JSON. | +| `owned:locker:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:get` | `uid`, `category` | Category classname array JSON. | +| `owned:locker:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:locker:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:locker:delete` | `uid` | `OK`. | +| `owned:locker:exists` | `uid` | `true` or `false`. | + +## Owned Garage Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:garage:create` | `uid` | Full owned garage JSON. | +| `owned:garage:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:get` | `uid`, `category` | Category classname array JSON. | +| `owned:garage:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:delete` | `uid` | `OK`. | +| `owned:garage:exists` | `uid` | `true` or `false`. | + +## Add Virtual Arsenal Unlocks + +```sqf +private _classes = ["arifle_MX_F", "hgun_P07_F"]; + +private _result = "forge_server" callExtension ["owned:locker:add", [ + getPlayerUID player, + "weapons", + toJSON _classes +]]; +``` + +## Add Virtual Garage Unlocks + +```sqf +private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"]; + +private _result = "forge_server" callExtension ["owned:garage:add", [ + getPlayerUID player, + "cars", + toJSON _classes +]]; +``` + +## Remove an Unlock + +```sqf +"forge_server" callExtension ["owned:locker:remove", [ + getPlayerUID player, + "weapons", + "arifle_MX_F" +]]; + +"forge_server" callExtension ["owned:garage:remove", [ + getPlayerUID player, + "cars", + "B_Quadbike_01_F" +]]; +``` + +## Hot-State Commands + +Both owned storage modules support hot state. + +Owned locker: + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:locker:hot:init` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:locker:hot:override` | `uid`, `locker_json` | Full owned locker JSON. | +| `owned:locker:hot:save` | `uid` | Current hot owned locker JSON and async durable save. | +| `owned:locker:hot:remove` | `uid` | `OK`. | + +Owned garage: + +| Command | Arguments | Returns | +| --- | --- | --- | +| `owned:garage:hot:init` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:garage:hot:override` | `uid`, `garage_json` | Full owned garage JSON. | +| `owned:garage:hot:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:hot:remove_item` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:hot:save` | `uid` | Current hot owned garage JSON and async durable save. | +| `owned:garage:hot:remove` | `uid` | `OK`. | + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Owned storage error: %1", _payload]; +}; +``` diff --git a/docus/content/3.server-modules/9.phone.md b/docus/content/3.server-modules/9.phone.md new file mode 100644 index 0000000..7c8d311 --- /dev/null +++ b/docus/content/3.server-modules/9.phone.md @@ -0,0 +1,136 @@ +--- +title: "Phone Usage Guide" +description: "The phone module stores contacts, messages, and emails for each UID. It is a server-extension state module backed by SurrealDB." +--- + +## Storage Model + +```json +{ + "contacts": ["76561198000000000", "field_commander"], + "messages": [ + { + "id": "phone-message:sender:receiver:1", + "from": "sender", + "to": "receiver", + "message": "Text body", + "timestamp": 123.45, + "read": false + } + ], + "emails": [ + { + "id": "phone-email:sender:receiver:2", + "from": "sender", + "to": "receiver", + "subject": "Subject", + "body": "Email body", + "timestamp": 123.45, + "read": false + } + ] +} +``` + +Rules validated by the Rust service: + +- UID arguments cannot be empty. +- Message and email bodies cannot be empty. +- Empty email subjects become `No subject`. +- Player messages and emails cannot target `field_commander`. +- `field_commander` can send messages or emails to players. +- Deleting a message or email removes it only from the requesting UID's index. + +## Commands + +| Command | Arguments | Returns | +| --- | --- | --- | +| `phone:init` | `uid` | Full phone payload. | +| `phone:contacts:list` | `uid` | Contact UID array. | +| `phone:contacts:add` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:contacts:remove` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:messages:list` | `uid` | Message array. | +| `phone:messages:thread` | `uid`, `other_uid` | Message array for both participants. | +| `phone:messages:send` | `from_uid`, `to_uid`, `message`, `timestamp` | Message JSON. | +| `phone:messages:mark_read` | `uid`, `message_id` | `true` or `false`. | +| `phone:messages:delete` | `uid`, `message_id` | `true` or `false`. | +| `phone:emails:list` | `uid` | Email array. | +| `phone:emails:send` | `from_uid`, `to_uid`, `subject`, `body`, `timestamp` | Email JSON. | +| `phone:emails:mark_read` | `uid`, `email_id` | `true` or `false`. | +| `phone:emails:delete` | `uid`, `email_id` | `true` or `false`. | +| `phone:remove` | `uid` | `OK`. | + +## Initialize Phone State + +`phone:init` creates phone state if needed and seeds self-contact plus +`field_commander`. + +```sqf +private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Phone init failed: %1", _payload]; +}; + +private _phone = fromJSON _payload; +``` + +## Send a Message + +```sqf +private _timestamp = str diag_tickTime; + +private _result = "forge_server" callExtension ["phone:messages:send", [ + getPlayerUID player, + _targetUid, + "Move to checkpoint Alpha.", + _timestamp +]]; +``` + +## Read a Conversation + +```sqf +private _result = "forge_server" callExtension ["phone:messages:thread", [ + getPlayerUID player, + _otherUid +]]; + +private _messages = fromJSON (_result select 0); +``` + +## Send an Email + +```sqf +private _result = "forge_server" callExtension ["phone:emails:send", [ + getPlayerUID player, + _targetUid, + "Supply Request", + "Requesting resupply at grid 123456.", + str diag_tickTime +]]; +``` + +## Mark and Delete Records + +```sqf +"forge_server" callExtension ["phone:messages:mark_read", [ + getPlayerUID player, + _messageId +]]; + +"forge_server" callExtension ["phone:emails:delete", [ + getPlayerUID player, + _emailId +]]; +``` + +## Error Handling + +```sqf +private _payload = (_result select 0); +if (_payload find "Error:" == 0) then { + systemChat format ["Phone error: %1", _payload]; +}; +``` diff --git a/docus/content/4.client-addons/.navigation.yml b/docus/content/4.client-addons/.navigation.yml new file mode 100644 index 0000000..340afa1 --- /dev/null +++ b/docus/content/4.client-addons/.navigation.yml @@ -0,0 +1,2 @@ +title: Client Addons +icon: i-lucide-monitor-smartphone diff --git a/docus/content/4.client-addons/0.index.md b/docus/content/4.client-addons/0.index.md new file mode 100644 index 0000000..6bb93b6 --- /dev/null +++ b/docus/content/4.client-addons/0.index.md @@ -0,0 +1,124 @@ +--- +title: "Client Usage Guide" +description: "Forge Client contains the Arma client-side addons that open player interfaces, handle browser events, cache client-visible state, and forward authoritative requests to the server addons." +--- + +Use this guide as the entry point for client-side integration. Domain data, +validation, persistence, rewards, ownership, and checkout behavior remain +server-side responsibilities. + +## Client Responsibilities + +- Open Arma displays and `CT_WEBBROWSER` controls. +- Load browser UI assets from each addon's `ui/_site` folder. +- Receive browser alerts through `JSDialog` handlers. +- Translate browser events into local actions or CBA server events. +- Cache display state in client repositories. +- Push server responses back into browser UIs with `ExecJS`. +- Provide local-only utility state where the feature is intentionally local. + +## Authoritative Boundaries + +Client repositories are view state. They are useful for rendering, local UI +decisions, and short-lived session behavior, but they should not be treated as +durable state. + +Authoritative state lives in: + +- server SQF addons for mission and player workflow ownership +- the `forge_server` extension for durable and hot-state domain logic +- SurrealDB where the extension persists durable domain records + +## Common Runtime Flow + +Most browser-backed client addons follow this shape: + +1. The addon creates a display, finds a browser control, and registers a + `JSDialog` event handler. +2. The browser loads an HTML entrypoint from `ui/_site`. +3. The browser sends JSON alerts with an `event` name and `data` payload. +4. `fnc_handleUIEvents.sqf` parses the alert and routes the event. +5. A bridge object or repository sends a CBA server event when server data is + needed. +6. Server responses are caught in `XEH_postInitClient.sqf`. +7. The bridge sends browser update events back through `ExecJS`. + +Browser alert payload: + +```json +{ + "event": "module::action", + "data": {} +} +``` + +## Open UI Entry Points + +| UI | Entry point | +| --- | --- | +| Actor menu | `call forge_client_actor_fnc_openUI;` | +| Bank | `call forge_client_bank_fnc_openUI;` | +| ATM | `[true] call forge_client_bank_fnc_openUI;` | +| CAD | `call forge_client_cad_fnc_openUI;` | +| Garage | `call forge_client_garage_fnc_openUI;` | +| Virtual garage | `call forge_client_garage_fnc_openVG;` | +| Organization portal | `call forge_client_org_fnc_openUI;` | +| Phone | `call forge_client_phone_fnc_openUI;` | +| Store | `call forge_client_store_fnc_openUI;` | + +Notifications are normally opened during client initialization and then updated +through the notification event/service. + +## Addon Guides + +- [Client Main Usage Guide](/client-addons/main) +- [Client Common Usage Guide](/client-addons/common) +- [Client Actor Usage Guide](/client-addons/actor) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Notifications Usage Guide](/client-addons/notifications) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Phone Usage Guide](/client-addons/phone) +- [Client Store Usage Guide](/client-addons/store) + +## Extension Calls + +Client addons should usually call server SQF events, not the `forge_server` +extension directly. The server addon owns validation context and converts the +request into extension commands. + +Example: + +```sqf +[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent); +``` + +Direct extension calls from client code bypass server authorization boundaries +and should be avoided. + +## Browser Bridge Notes + +`forge_client_common_fnc_initWebUIBridge` provides reusable bridge and screen +objects for newer browser UIs. It queues outbound events until a browser screen +is ready, then delivers payloads through: + +```sqf +_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]]; +``` + +Feature addons still own their event names, request payloads, and response +mapping. + +## Development Checklist + +- Keep feature-specific behavior in the owning addon. +- Send authoritative changes to the server addon. +- Use namespaced browser events such as `bank::deposit::request`. +- Treat `profileNamespace` as local player preference or utility state only. +- Make browser-ready events request the current server state before rendering + stale data. +- Queue or ignore bridge responses when the display is closed. +- Keep mission object setup on the mission/server side and client display logic + on the client side. diff --git a/docus/content/4.client-addons/1.main.md b/docus/content/4.client-addons/1.main.md new file mode 100644 index 0000000..88d0ce4 --- /dev/null +++ b/docus/content/4.client-addons/1.main.md @@ -0,0 +1,48 @@ +--- +title: "Client Main Usage Guide" +description: "The client `main` addon provides the shared mod identity, version metadata, CBA settings, and macro foundation used by the Forge client addons." +--- + +## Purpose + +Use `forge_client_main` as the foundation dependency for client addons that +need Forge macros, function naming, settings, or mod-level configuration. + +Feature logic should stay in the owning addon. `main` should remain limited to +shared client configuration and compile infrastructure. + +## Key Files + +| File | Purpose | +| --- | --- | +| `script_mod.hpp` | Client mod identity. | +| `script_version.hpp` | Client mod version values. | +| `script_macros.hpp` | Shared client macros. | +| `CfgSettings.hpp` | Client CBA settings. | +| `config.cpp` | Addon config and mod wiring. | + +## Dependency Pattern + +Feature addons normally depend on `forge_client_main` in their `config.cpp`. + +```cpp +class forge_client_example { + requiredAddons[] = { + "forge_client_main" + }; +}; +``` + +## Usage Notes + +- Put domain UI, repositories, and event handling in feature addons. +- Put reusable browser bridge behavior in `forge_client_common`. +- Put server-only behavior in `arma/server/addons`. +- Keep settings in `CfgSettings.hpp` when they apply to the client mod as a + whole or to a client feature toggle. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Common Usage Guide](/client-addons/common) +- [Development Guide](/getting-started/development) diff --git a/docus/content/4.client-addons/10.phone.md b/docus/content/4.client-addons/10.phone.md new file mode 100644 index 0000000..88aa8e1 --- /dev/null +++ b/docus/content/4.client-addons/10.phone.md @@ -0,0 +1,107 @@ +--- +title: "Client Phone Usage Guide" +description: "The client phone addon provides the in-game phone UI for contacts, SMS messages, email, and local utility apps such as notes, calendar events, world clocks, and alarms." +--- + +## Open Phone UI + +```sqf +call forge_client_phone_fnc_openUI; +``` + +The phone UI creates `RscPhone`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_phone_fnc_handleUIEvents`. + +## State Ownership + +Contacts, messages, and emails are server-owned and requested through the +server phone addon. + +Local utility app state is stored in `profileNamespace`: + +- notes +- calendar events +- world clocks +- alarms +- theme/preferences + +## Phone Repository + +`forge_client_phone_fnc_initRepository` creates `GVAR(PhoneRepository)`. + +The phone repository owns local notes, events, clocks, alarms, and settings +helpers. +Contacts, messages, and emails continue to use server-backed request/response +events. + +## Browser Events + +### Session and Preferences + +| Event | Client behavior | +| --- | --- | +| `phone::get::player` | Send player UID to browser with `setPlayerUid`. | +| `phone::get::theme` | Send saved light/dark theme to browser. | +| `phone::set::theme` | Save theme preference to `profileNamespace`. | + +### Contacts + +| Event | Client behavior | +| --- | --- | +| `phone::get::contacts` | Load cached contacts and request server refresh. | +| `phone::refresh::contacts` | Request contacts from server. | +| `phone::add::contact` | Add contact by phone number. | +| `phone::add::contact::by::phone` | Add contact by phone number. | +| `phone::add::contact::by::email` | Add contact by email. | +| `phone::remove::contact` | Remove contact by UID. | + +### Messages + +| Event | Client behavior | +| --- | --- | +| `phone::get::messages` | Request messages from server. | +| `phone::get::message::thread` | Request thread with another UID. | +| `phone::send::message` | Send SMS through server. | +| `phone::mark::message::read` | Mark message read on server. | +| `phone::delete::message` | Delete message on server. | + +### Email + +| Event | Client behavior | +| --- | --- | +| `phone::get::emails` | Request emails from server. | +| `phone::send::email` | Send email through server. | +| `phone::mark::email::read` | Mark email read on server. | +| `phone::delete::email` | Delete email on server. | + +### Local Utility Apps + +| Event | Client behavior | +| --- | --- | +| `phone::get::notes` | Load local notes. | +| `phone::save::note` | Save local note. | +| `phone::delete::note` | Delete local note. | +| `phone::get::events` | Load local calendar events. | +| `phone::save::event` | Save local calendar event. | +| `phone::delete::event` | Delete local calendar event. | +| `phone::get::clocks` | Load local world clocks. | +| `phone::save::clock` | Save local world clock. | +| `phone::delete::clock` | Delete local world clock. | +| `phone::get::alarms` | Load local alarms. | +| `phone::save::alarm` | Save local alarm. | +| `phone::delete::alarm` | Delete local alarm. | +| `phone::toggle::alarm` | Toggle local alarm enabled state. | + +## Usage Rules + +- Send contact, message, and email mutations to the server phone addon. +- Keep local-only utility apps in `profileNamespace` until they are migrated to + server-backed storage. +- Do not treat local phone utility state as shared multiplayer state. +- Validate required UID, phone, email, subject, and message fields before + sending server requests. + +## Related Guides + +- [Phone Usage Guide](/server-modules/phone) +- [Client Notifications Usage Guide](/client-addons/notifications) diff --git a/docus/content/4.client-addons/11.store.md b/docus/content/4.client-addons/11.store.md new file mode 100644 index 0000000..dcb5131 --- /dev/null +++ b/docus/content/4.client-addons/11.store.md @@ -0,0 +1,91 @@ +--- +title: "Client Store Usage Guide" +description: "The client store addon provides the storefront browser UI for catalog browsing, category hydration, payment source display, cart handling, and checkout requests." +--- + +## Open Store UI + +```sqf +call forge_client_store_fnc_openUI; +``` + +The UI opens `RscStore`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_store_fnc_handleUIEvents`. + +## Bridge + +`forge_client_store_fnc_initUIBridge` owns: + +- browser control lookup +- store hydrate requests +- category requests +- checkout requests +- category hydrate/failure responses +- checkout success/failure responses +- store config refresh after successful checkout + +Store currently uses its own `StoreUIBridge.receive(...)` browser bridge rather +than the shared `ForgeBridge.receive(...)` delivery used by newer bridges. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `store::ready` | Request store hydrate from the server. | +| `store::category::request` | Request catalog items for a category. | +| `store::checkout::request` | Forward checkout JSON to the server. | +| `store::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `store::hydrate` | Initial storefront/session/config payload. | +| `store::config::hydrate` | Refreshed payment/source config. | +| `store::category::hydrate` | Category catalog payload. | +| `store::category::failure` | Category request failure. | +| `store::checkout::success` | Checkout success payload. | +| `store::checkout::failure` | Checkout failure payload. | + +## Category Requests + +Category requests require a non-empty category value. + +```json +{ + "category": "weapons" +} +``` + +The client lowercases the category before forwarding it to the server store +addon. + +## Checkout Requests + +Checkout requests send a serialized checkout payload: + +```json +{ + "checkoutJson": "{\"items\":[],\"paymentSource\":\"cash\"}" +} +``` + +The client only forwards the checkout data. The server store addon and +extension validate prices, inventory grants, payment source authorization, and +integration with bank, organization, locker, and garage state. + +After a successful checkout, the client asks the server for a fresh store config +payload so payment-source balances and permissions stay current. + +## Authoritative State + +Catalog data, prices, checkout validation, money movement, organization funds, +credit lines, locker grants, garage grants, and persistence are server-owned. + +## Related Guides + +- [Store Usage Guide](/server-modules/store) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Garage Usage Guide](/client-addons/garage) diff --git a/docus/content/4.client-addons/2.common.md b/docus/content/4.client-addons/2.common.md new file mode 100644 index 0000000..d39d959 --- /dev/null +++ b/docus/content/4.client-addons/2.common.md @@ -0,0 +1,92 @@ +--- +title: "Client Common Usage Guide" +description: "The client `common` addon contains shared browser UI bridge declarations and common client-side browser integration patterns." +--- + +## Purpose + +Use `forge_client_common` when a browser-backed feature UI needs reusable +screen lifecycle behavior: + +- active browser control tracking +- browser ready state +- pending event queues +- `ExecJS` payload delivery +- shared bridge object inheritance through `createHashMapObject` + +Feature addons still own their app-specific events and server RPC mapping. + +## Shared Bridge + +Initialize the bridge declarations with: + +```sqf +private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge; +private _bridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; +``` + +Feature bridges can inherit from the shared declaration: + +```sqf +GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _bridgeDeclaration], + ["#type", "MyUIBridgeBaseClass"], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self call ["setActiveBrowserControl", [_control]]; + _self call ["sendEvent", ["myAddon::hydrate", createHashMap, _control]]; + }] +]; +``` + +## Event Delivery + +`sendEvent` builds this payload: + +```json +{ + "event": "myAddon::event", + "data": {} +} +``` + +If the browser control is missing or not ready, the payload is queued on the +screen object. When the screen marks ready, `flushPendingEvents` delivers the +queue. + +## Screen Lifecycle + +The shared screen object tracks: + +| Field | Purpose | +| --- | --- | +| `control` | Active browser control. | +| `readyState` | Whether the browser app has sent its ready event. | +| `pendingEvents` | Outbound events waiting for a ready browser. | + +Call `handleClose` or `dispose` when a display closes so stale controls and +queued events are cleared. + +## Current Consumers + +The common bridge pattern is used by the newer bank, CAD, garage, and +organization client bridges. Store currently keeps its own bridge object and +browser bridge function names. + +## Usage Rules + +- Keep bridge inheritance in feature addons thin and explicit. +- Keep shared code generic; do not add bank, CAD, org, or store-specific logic + to `common`. +- Prefer namespaced events such as `garage::sync`. +- Send hash maps or arrays that can be safely serialized with `toJSON`. +- Avoid direct extension calls from the client bridge; send CBA server events. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Organization Usage Guide](/client-addons/organization) diff --git a/docus/content/4.client-addons/3.actor.md b/docus/content/4.client-addons/3.actor.md new file mode 100644 index 0000000..e09086c --- /dev/null +++ b/docus/content/4.client-addons/3.actor.md @@ -0,0 +1,97 @@ +--- +title: "Client Actor Usage Guide" +description: "The client actor addon owns the player interaction menu and client-side actor repository. It is the main launcher for nearby player actions and other Forge client UIs." +--- + +## Open the Actor Menu + +```sqf +call forge_client_actor_fnc_openUI; +``` + +The actor menu opens `RscActorMenu`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_actor_fnc_handleUIEvents`. + +## Repository + +`forge_client_actor_fnc_initRepository` creates `GVAR(ActorRepository)`. + +The repository: + +- requests actor initialization from the server +- saves actor state through the server actor addon +- caches client-visible actor fields +- applies position, direction, stance, rank, and loadout on JIP sync when the + relevant settings allow it +- provides nearby interaction actions to the browser UI + +Initialize actor state through the repository: + +```sqf +GVAR(ActorRepository) call ["init", []]; +``` + +Save actor state through the server: + +```sqf +GVAR(ActorRepository) call ["save", [true]]; +``` + +## Nearby Actions + +The menu asks for nearby actions with: + +```text +actor::get::actions +``` + +The repository scans objects within 5 meters and returns actions based on +mission object variables: + +| Variable | Action | +| --- | --- | +| `isStore` | store | +| `isAtm` | ATM | +| `isBank` | bank | +| `isGarage` | garage | +| `garageType` | garage subtype | +| `isLocker` | virtual arsenal action when VA is enabled | +| `deviceType` | device action placeholder | +| nearby player unit | player interaction placeholder | + +The response is pushed into the browser with `updateAvailableActions(...)`. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `actor::get::actions` | Refresh nearby actions. | +| `actor::close::menu` | Close actor menu. | +| `actor::open::atm` | Open bank UI in ATM mode. | +| `actor::open::bank` | Open bank UI in bank mode. | +| `actor::open::cad` | Open CAD UI. | +| `actor::open::garage` | Open garage UI. | +| `actor::open::vgarage` | Open virtual garage. | +| `actor::open::org` | Open organization UI. | +| `actor::open::vlocker` | Open ACE arsenal on `FORGE_Locker_Box`. | +| `actor::open::phone` | Open phone UI. | +| `actor::open::store` | Open store UI. | + +Device and player interaction events currently display placeholder feedback. + +## Authoritative State + +Actor persistence is server-owned. The client repository requests and displays +actor data, but actor creation, durable updates, and hot-state behavior are +handled by the server actor addon and extension. + +## Related Guides + +- [Actor Usage Guide](/server-modules/actor) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Phone Usage Guide](/client-addons/phone) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/content/4.client-addons/4.bank.md b/docus/content/4.client-addons/4.bank.md new file mode 100644 index 0000000..62cc68a --- /dev/null +++ b/docus/content/4.client-addons/4.bank.md @@ -0,0 +1,88 @@ +--- +title: "Client Bank Usage Guide" +description: "The client bank addon opens the bank and ATM browser UI, forwards banking requests to the server bank addon, and pushes account updates back into the browser." +--- + +## Open Bank UI + +Open full bank mode: + +```sqf +call forge_client_bank_fnc_openUI; +``` + +Open ATM mode: + +```sqf +[true] call forge_client_bank_fnc_openUI; +``` + +The open function creates `RscBank`, sets the bridge mode to `bank` or `atm`, +loads `ui/_site/index.html`, and routes browser events through +`forge_client_bank_fnc_handleUIEvents`. + +## Bridge and Repository + +`forge_client_bank_fnc_initRepository` tracks account load and cached account +state. + +`forge_client_bank_fnc_initUIBridge` owns: + +- active browser control tracking +- bank/ATM mode +- browser ready handling +- account hydrate and sync responses +- deposit, withdrawal, transfer, earnings deposit, credit repayment, PIN + validation, and PIN change requests +- browser notice delivery + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `bank::ready` | Mark browser ready and request hydrate from the server. | +| `bank::refresh` | Request fresh bank hydrate data. | +| `bank::deposit::request` | Forward deposit amount to the server. | +| `bank::withdraw::request` | Forward withdrawal amount to the server. | +| `bank::transfer::request` | Forward target, source field, and amount. | +| `bank::depositEarnings::request` | Request earnings deposit. | +| `bank::repayCreditLine::request` | Request credit-line repayment. | +| `bank::pin::request` | Forward PIN validation request. | +| `bank::pin::change::request` | Forward current and new PIN values for a PIN change. | +| `bank::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +The bridge sends: + +| Event | Purpose | +| --- | --- | +| `bank::hydrate` | Full session/account payload. | +| `bank::sync` | Account patch or sync data. | +| `bank::notice` | UI-visible notice payload. | + +## Request Flow + +Example deposit flow: + +1. Browser sends `bank::deposit::request` with an `amount`. +2. Client bridge calls the server bank request event. +3. Server bank addon validates the request and calls bank hot-state logic. +4. Server response is caught by the client post-init event handlers. +5. Client bridge sends `bank::sync` or `bank::notice` back to the browser. + +## Authoritative State + +Balances, PIN authorization, transfers, checkout charges, credit lines, and +persistence are server-owned. The client should only display account data and +request mutations through server events. + +PIN changes are available from the full bank UI only. The browser validates the +current, new, and confirmation fields, but the server extension remains +authoritative and persists the updated PIN. + +## Related Guides + +- [Bank Usage Guide](/server-modules/bank) +- [Client Common Usage Guide](/client-addons/common) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/content/4.client-addons/5.cad.md b/docus/content/4.client-addons/5.cad.md new file mode 100644 index 0000000..57bc7b2 --- /dev/null +++ b/docus/content/4.client-addons/5.cad.md @@ -0,0 +1,110 @@ +--- +title: "Client CAD Usage Guide" +description: "The client CAD addon provides the map and dispatch UI for groups, active tasks, task assignment, dispatch orders, support requests, and task acknowledge/decline workflows." +--- + +## Open CAD UI + +```sqf +call forge_client_cad_fnc_openUI; +``` + +The CAD UI opens `RscMapUI` and loads separate browser controls for: + +- top bar +- bottom bar +- side panel +- dispatcher board + +The native Arma map remains part of the same display. + +## Repository and Bridge + +`forge_client_cad_fnc_initRepository` caches the hydrated CAD payload, +selected mode, dispatch view, session data, groups, tasks, requests, and +assignments. + +`forge_client_cad_fnc_initUIBridge` owns: + +- ready state for side panel, top bar, and dispatcher board +- operations vs dispatch mode +- board vs map dispatch view +- hydrate requests +- task assignment, acknowledge, and decline requests +- dispatch order create/close requests +- support request submit/close requests +- group status, role, and profile requests +- map focus actions + +## Map Focus Behavior + +CAD list entries can drive the native map position without duplicating map +logic in the browser UI. In operations mode, assigned or accepted task cards, +roster member cards, and support request cards send focus events. In dispatch +map mode, group, contract, and support request cards use the same focus path. + +Task and support request focus uses the stored record position. Roster member +focus uses the member position included in the hydrated group roster. + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `cad::topbar::ready` | Mark top bar ready and push top bar state. | +| `cad::ready` | Mark side panel ready and request hydrate. | +| `cad::dispatcher::ready` | Mark dispatcher board ready and push hydrate data. | +| `cad::mode::set` | Switch between operations and dispatch mode. | +| `cad::dispatchView::set` | Switch dispatch board/map view. | +| `cad::refresh` | Request fresh CAD hydrate data. | +| `cad::tasks::assign` | Assign a task to a group. | +| `cad::tasks::acknowledge` | Acknowledge assigned task. | +| `cad::tasks::decline` | Decline assigned task. | +| `cad::dispatchOrder::create` | Create dispatch order. | +| `cad::dispatchOrder::close` | Close dispatch order. | +| `cad::supportRequest::submit` | Submit support request. | +| `cad::supportRequest::close` | Close support request. | +| `cad::groups::status` | Update group status. | +| `cad::groups::role` | Update group role. | +| `cad::groups::profile` | Update status and role together. | +| `cad::groups::focus` | Center map on a group. | +| `cad::members::focus` | Center map on a group member. | +| `cad::tasks::focus` | Center map on a task. | +| `cad::requests::focus` | Center map on a support request. | +| `map::zoomIn` | Zoom native map in. | +| `map::zoomOut` | Zoom native map out. | +| `map::search` | Placeholder status update. | +| `map::close` | Dispose bridge state and close the display. | + +## Response Events + +The bridge pushes: + +| Event | Purpose | +| --- | --- | +| `cad::hydrate` | Full hydrated CAD payload to the side panel. | +| `cad::assignment::response` | Task assignment/acknowledge/decline result. | +| `cad::group::response` | Group status/role/profile result. | +| `cad::request::response` | Support request result. | + +Dispatcher board controls also receive direct `ExecJS` status and hydrate +calls. + +## Task Compatibility + +CAD task visibility depends on server-side task catalog entries. Tasks created +through Eden Forge task modules or `forge_server_task_fnc_startTask` are the +normal CAD-compatible task sources because they register task catalog data. + +Direct handler or task-function calls only work with CAD when the task catalog +entry already exists. + +## Authorization Notes + +Only dispatcher sessions can enter dispatch mode. If the hydrated session is +not a dispatcher, the bridge forces the UI back to operations mode. + +## Related Guides + +- [CAD Usage Guide](/server-modules/cad) +- [Task Usage Guide](/server-modules/task) +- [Client Common Usage Guide](/client-addons/common) diff --git a/docus/content/4.client-addons/6.garage.md b/docus/content/4.client-addons/6.garage.md new file mode 100644 index 0000000..492dfda --- /dev/null +++ b/docus/content/4.client-addons/6.garage.md @@ -0,0 +1,113 @@ +--- +title: "Client Garage Usage Guide" +description: "The client garage addon provides player vehicle storage UI, vehicle store/retrieve actions, selected nearby vehicle service requests, vehicle context building, and the virtual garage view." +--- + +## Open Garage UI + +```sqf +call forge_client_garage_fnc_openUI; +``` + +The garage UI opens `RscGarage`, loads `ui/_site/index.html`, and routes +browser events through `forge_client_garage_fnc_handleUIEvents`. + +## Open Virtual Garage + +```sqf +call forge_client_garage_fnc_openVG; +``` + +The virtual garage resolves the active interaction object near the player, +discovers nearby `garage*` markers placed in Eden, chooses the matching spawn +lane for the selected vehicle type, opens the BIS garage interface, and +restricts the available vehicle lists from the virtual garage repository. When +the BIS garage closes, only the vehicle selected in that virtual garage session +is finalized and spawned onto the resolved lane. + +## Client Services + +| Service | Purpose | +| --- | --- | +| `GarageRepository` | Player garage view state. | +| `VGRepository` | Virtual garage unlock view state. | +| `GarageHelperService` | Vehicle names, hit points, and payload helpers. | +| `GarageContextService` | Nearby/current vehicle context. | +| `GaragePayloadService` | Browser hydrate payload construction. | +| `GarageActionService` | Store/retrieve request handling and selected nearby vehicle refuel/repair request forwarding. | +| `GarageUIBridge` | Browser ready, hydrate, and sync delivery. | + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `garage::ready` | Mark browser ready and send `garage::hydrate`. | +| `garage::refresh` | Send current garage payload as `garage::sync`. | +| `garage::vehicle::retrieve::request` | Forward retrieve request through the action service. | +| `garage::vehicle::store::request` | Forward store request through the action service. | +| `garage::vehicle::refuel::request` | Forward selected nearby vehicle refuel request to the server economy service. | +| `garage::vehicle::repair::request` | Forward selected nearby vehicle repair request to the server economy service. | +| `garage::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `garage::hydrate` | Initial vehicle and session payload. | +| `garage::sync` | Refreshed vehicle payload. | +| `garage::service::success` | Browser notice for accepted refuel/rearm/repair requests. | +| `garage::service::failure` | Browser notice for rejected refuel/rearm/repair requests. | + +Server action responses are handled by the action service and notification +flow. + +## Vehicle Service + +The selected vehicle detail panel includes refuel, rearm, and repair actions for nearby +world vehicles. Stored records must be retrieved first because server economy +services operate on live vehicle objects, not stored garage records. + +Refuel requests use the server economy `RefuelService` event. Rearm requests +use `RearmService`. Repair requests use `RepairService`. These services are +billed by the server economy addon through organization funds. + +## Mission Setup + +Garage interactions are normally surfaced through the actor menu when nearby +objects have garage variables such as: + +```sqf +_object setVariable ["isGarage", true, true]; +_object setVariable ["garageType", "cars", true]; +``` + +When using the server garage auto-init flow, editor-placed objects whose +variable names contain `garage` are marked as garage interaction points and +their `garageType` can be inferred from the name. + +Virtual garage spawn lanes are resolved from empty markers placed in Eden. The +marker name should contain `garage` and one of the six supported category names: +`cars`, `armor`, `helis`, `planes`, `naval`, or `other`. Markers are matched to +the nearby interaction object by proximity, and names that include the garage +object's variable name are preferred when multiple garages exist. + +Vehicle spawning is strict by category. If the active garage site does not have +a matching local marker for the vehicle category being retrieved or spawned from +the virtual garage, the request is blocked and the player is shown a message. + +Nearby world vehicles are not used as virtual garage spawn candidates. They are +only checked to determine whether the resolved spawn position is blocked. If +any vehicle is within 5 meters of the spawn marker when the virtual garage is +opened, the session is blocked and the player is shown a warning. + +## Authoritative State + +The client gathers vehicle context and sends store/retrieve requests. Stored +vehicle state, validation, spawning, removal, and persistence are owned by the +server garage addon and extension. + +## Related Guides + +- [Garage Usage Guide](/server-modules/garage) +- [Client Actor Usage Guide](/client-addons/actor) +- [Client Notifications Usage Guide](/client-addons/notifications) diff --git a/docus/content/4.client-addons/7.locker.md b/docus/content/4.client-addons/7.locker.md new file mode 100644 index 0000000..5ac9a83 --- /dev/null +++ b/docus/content/4.client-addons/7.locker.md @@ -0,0 +1,87 @@ +--- +title: "Client Locker Usage Guide" +description: "The client locker addon manages personal locker display state, local locker container behavior, and virtual arsenal unlock state." +--- + +## Repositories + +`forge_client_locker_fnc_initRepository` creates `GVAR(LockerRepository)`. + +`forge_client_locker_fnc_initVARepository` creates `GVAR(VARepository)`. + +Initialize locker state: + +```sqf +GVAR(LockerRepository) call ["init", []]; +GVAR(VARepository) call ["init", []]; +``` + +## Locker Container Flow + +The repository searches mission namespace variables whose names contain +`locker` and refer to objects. For each server/mission locker object, it creates +a local `Box_NATO_Equip_F` at the same position and attaches container event +handlers. + +On container open: + +- the local container is cleared +- cached locker items are inserted into the container +- over-capacity warnings are emitted when the item count is above 25 + +On container close: + +- cargo, nested container items, and weapon attachments are read back +- the new locker map is sent to the server with the override request +- the local repository cache is updated + +## Virtual Arsenal Flow + +The virtual arsenal repository creates a local `FORGE_Locker_Box` and requests +virtual arsenal unlocks from the server. + +As sync data arrives, it applies unlocks through ACE Arsenal: + +| Data key | Client behavior | +| --- | --- | +| `items` | Add virtual items. | +| `weapons` | Add virtual weapons. | +| `magazines` | Add virtual magazines. | +| `backpacks` | Add virtual backpacks. | + +The actor menu opens the virtual locker with: + +```sqf +[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox; +``` + +## Server Events + +The client repository sends requests for: + +- locker initialization +- locker save +- locker override after container close +- virtual arsenal initialization +- virtual arsenal save + +The server locker addon and extension own the saved locker and virtual arsenal +state. + +## Mission Setup + +Mission locker objects must be placed into `missionNamespace` with a variable +name containing `locker`. The client creates local interactive containers from +those authoritative mission objects. + +Example: + +```sqf +missionNamespace setVariable ["forge_locker_alpha", _lockerObject, true]; +``` + +## Related Guides + +- [Locker Usage Guide](/server-modules/locker) +- [Owned Storage Usage Guide](/server-modules/owned-storage) +- [Client Actor Usage Guide](/client-addons/actor) diff --git a/docus/content/4.client-addons/8.notifications.md b/docus/content/4.client-addons/8.notifications.md new file mode 100644 index 0000000..e2874e7 --- /dev/null +++ b/docus/content/4.client-addons/8.notifications.md @@ -0,0 +1,74 @@ +--- +title: "Client Notifications Usage Guide" +description: "The client notifications addon owns the notification HUD, notification sound, and local notification service used by Forge client and server modules." +--- + +## Runtime Behavior + +The notification display is created during client initialization. The browser +HUD sends: + +```text +notifications::ready +``` + +When that event is received, `NotificationService` initializes and sends a +startup notification. + +## Create a Notification + +Use the notification service when available: + +```sqf +GVAR(NotificationService) call ["create", [ + "success", + "Title", + "Notification text.", + 4000 +]]; +``` + +Arguments: + +| Argument | Purpose | +| --- | --- | +| `_type` | Notification type, such as `success`, `info`, `warning`, or `error`. | +| `_title` | Notification title. | +| `_content` | Notification body text. | +| `_duration` | Display duration in milliseconds. | + +The service dispatches a browser `forge:notify` custom event. + +## CBA Event Surface + +Other addons can use the client notification event: + +```sqf +["forge_client_notifications_recieveNotification", [ + "warning", + "Garage", + "Vehicle spawn position is blocked.", + 3000 +]] call CBA_fnc_localEvent; +``` + +The event payload is: + +```sqf +[_type, _title, _content, _duration] +``` + +## Usage Rules + +- Use the shared notification service instead of opening separate transient + browser UIs. +- Keep server-driven player feedback short and actionable. +- Treat notification state as transient client UI state. +- Do not use notifications as the only record of durable domain changes. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/content/4.client-addons/9.organization.md b/docus/content/4.client-addons/9.organization.md new file mode 100644 index 0000000..5d85a8a --- /dev/null +++ b/docus/content/4.client-addons/9.organization.md @@ -0,0 +1,130 @@ +--- +title: "Client Organization Usage Guide" +description: "The client organization addon provides the organization portal UI and browser bridge for login, registration, membership, invites, credit lines, leave and disband flows, assets, fleet, and treasury display." +--- + +Organization registration requires $50,000 in personal funds. The server org +addon enforces and charges the fee; the browser only displays the requirement +and submits the registration request. + +## Open Organization UI + +```sqf +call forge_client_org_fnc_openUI; +``` + +The UI opens `RscOrg`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_org_fnc_handleUIEvents`. + +## Repository and Bridge + +`forge_client_org_fnc_initRepository` caches organization portal state. + +`forge_client_org_fnc_initUIBridge` owns: + +- active browser control tracking +- portal hydrate requests +- create/login response routing +- leave and disband requests +- credit-line assignment requests +- payroll and treasury transfer requests +- invite, accept invite, and decline invite requests +- targeted browser response events + +## Browser Events + +| Event | Client behavior | +| --- | --- | +| `org::ready` | Mark browser ready and request `org::sync`. | +| `org::login::request` | Request portal hydrate as `org::login::success`. | +| `org::create::request` | Validate org name and request creation on server. | +| `org::disband::request` | Request disband on server. | +| `org::leave::request` | Request leave on server. | +| `org::credit::request` | Request credit-line assignment. | +| `org::payroll::request` | Request payroll payout from the organization treasury. | +| `org::transfer::request` | Request treasury transfer to a member. | +| `org::invite::request` | Request member invite. | +| `org::invite::accept` | Accept invite by org ID. | +| `org::invite::decline` | Decline invite by org ID. | +| `org::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| --- | --- | +| `org::sync` | Full portal sync payload. | +| `org::login::success` | Login hydrate payload. | +| `org::create::success` | Creation hydrate payload. | +| `org::create::failure` | Creation validation or server failure. | +| `org::disband::success` | Requester disband success. | +| `org::disband::failure` | Disband failure. | +| `org::portal::revoked` | Portal state revoked by someone else's disband action. | +| `org::leave::success` | Leave success. | +| `org::leave::failure` | Leave failure. | +| `org::credit::success` | Credit-line request success. | +| `org::credit::failure` | Credit-line request failure. | +| `org::member::creditUpdated` | Targeted member credit-line patch. | +| `org::invite::success` | Invite success. | +| `org::invite::failure` | Invite failure. | +| `org::invite::decision::success` | Invite accept/decline success. | +| `org::invite::decision::failure` | Invite accept/decline failure. | + +## Request Examples + +Create organization request payload: + +```json +{ + "orgName": "Example Logistics" +} +``` + +Credit-line request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 2500 +} +``` + +Payroll request payload: + +```json +{ + "amount": 1000 +} +``` + +Treasury transfer request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 1000 +} +``` + +Invite request payload: + +```json +{ + "targetUid": "76561198000000000", + "targetName": "Player Name" +} +``` + +## Authoritative State + +Organization funds, reputation, membership, invites, credit lines, assets, +fleet, and persistence are server-owned. The client portal only displays and +requests changes. + +## Related Guides + +- [Organization Usage Guide](/server-modules/organization) +- [Client Common Usage Guide](/client-addons/common) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/content/index.md b/docus/content/index.md new file mode 100644 index 0000000..dee8f26 --- /dev/null +++ b/docus/content/index.md @@ -0,0 +1,200 @@ +--- +seo: + title: Forge Framework Documentation + description: Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs. +--- + +::u-page-hero +#title +Forge Framework Documentation + +#description +Forge is a persistent Arma 3 framework that combines SQF addons, a Rust +`arma-rs` extension, SurrealDB persistence, shared domain crates, and +browser-backed player interfaces. + +Use these docs to understand the runtime architecture, extension API surface, +server gameplay modules, and client addon integration patterns. + +Server owners and developers must start SurrealDB and place a matching +`config.toml` beside `forge_server_x64.dll` before launching a +Forge-enabled server or local multiplayer test. + +#links + :::u-button + --- + color: primary + size: xl + to: /getting-started + trailing-icon: i-lucide-arrow-right + --- + Start here + ::: + + :::u-button + --- + color: neutral + icon: simple-icons-github + size: xl + to: https://github.com/InnovativeDevSolutions/forge + variant: outline + --- + View source + ::: +:: + +::u-page-section +#title +What Forge Covers + +#features + :::u-page-feature + --- + icon: i-lucide-boxes + --- + #title + Domain [Modules]{.text-primary} + + #description + Actor, bank, CAD, garage, locker, organization, phone, store, task, and + owned-storage workflows share a consistent service and extension model. + ::: + + :::u-page-feature + --- + icon: i-lucide-server + --- + #title + Rust [Extension]{.text-primary} + + #description + The server extension keeps command parsing thin, routes domain requests into + services, and persists durable state through SurrealDB. + ::: + + :::u-page-feature + --- + icon: i-lucide-database-zap + --- + #title + Durable [Persistence]{.text-primary} + + #description + Repository traits stay storage-agnostic while concrete adapters in the + extension handle schema and database mapping. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + --- + #title + Browser [UIs]{.text-primary} + + #description + Client addons host web-based interfaces inside Arma displays and synchronize + state through namespaced browser bridge events. + ::: + + :::u-page-feature + --- + icon: i-lucide-arrow-left-right + --- + #title + Transport [Layer]{.text-primary} + + #description + Large payloads move through chunked request and response transport while + smaller commands still use direct `callExtension` paths. + ::: + + :::u-page-feature + --- + icon: i-lucide-wrench + --- + #title + Development [Workflow]{.text-primary} + + #description + The docs cover module boundaries, local validation checks, and where new + domain logic belongs across Rust, SQF, and web UI layers. + ::: +:: + +::u-page-section +#title +Documentation Areas + +#features + :::u-page-feature + --- + icon: i-lucide-rocket + to: /getting-started + --- + #title + [Getting Started]{.text-primary} + + #description + Framework overview, architecture, module reference, and development rules. + ::: + + :::u-page-feature + --- + icon: i-lucide-map + to: /getting-started/mission-designer + --- + #title + Mission [Designers]{.text-primary} + + #description + Eden object placement, garage markers, and CAD-compatible task setup. + ::: + + :::u-page-feature + --- + icon: i-lucide-server-cog + to: /server-extension + --- + #title + Server [Extension]{.text-primary} + + #description + Extension architecture, command surface, and SQF usage examples. + ::: + + :::u-page-feature + --- + icon: i-lucide-network + to: /server-extension/icom + --- + #title + ICOM [Events]{.text-primary} + + #description + Inter-server event routing through the Forge ICOM hub and extension commands. + ::: + + :::u-page-feature + --- + icon: i-lucide-layers-3 + to: /server-modules + --- + #title + Server [Modules]{.text-primary} + + #description + Gameplay-domain usage guides for persistence, hot state, and command flows. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + to: /client-addons + --- + #title + Client [Addons]{.text-primary} + + #description + Browser bridge, client UX entry points, and addon-specific event contracts. + ::: +:: diff --git a/docus/dist/200.html b/docus/dist/200.html new file mode 100644 index 0000000..bae9fea --- /dev/null +++ b/docus/dist/200.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/docus/dist/404.html b/docus/dist/404.html new file mode 100644 index 0000000..7ba1d99 --- /dev/null +++ b/docus/dist/404.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/docus/dist/__nuxt_content/docs/sql_dump.txt b/docus/dist/__nuxt_content/docs/sql_dump.txt new file mode 100644 index 0000000..e8da7ab --- /dev/null +++ b/docus/dist/__nuxt_content/docs/sql_dump.txt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docus/dist/__nuxt_content/landing/sql_dump.txt b/docus/dist/__nuxt_content/landing/sql_dump.txt new file mode 100644 index 0000000..7342896 --- /dev/null +++ b/docus/dist/__nuxt_content/landing/sql_dump.txt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docus/dist/_nuxt/-nV3O3Hd.js b/docus/dist/_nuxt/-nV3O3Hd.js new file mode 100644 index 0000000..767ee53 --- /dev/null +++ b/docus/dist/_nuxt/-nV3O3Hd.js @@ -0,0 +1 @@ +const o={or:"या",error:{title:"पृष्ठ नहीं मिला",description:"हमें खुशी है, लेकिन आप जो पृष्ठ खोज रहे हैं वह मौजूद नहीं है।"}},a={copy:{page:"पृष्ठ कॉपी करें",link:"Markdown पृष्ठ कॉपी करें",view:"Markdown के रूप में देखें",gpt:"ChatGPT में खोलें",claude:"Claude में खोलें"},links:"समुदाय",toc:"इस पृष्ठ पर",menu:"मेनू",report:"समस्या की रिपोर्ट करें",edit:"इस पृष्ठ को संपादित करें"},e={copyLogo:"लोगो कॉपी करें",copyWordmark:"वर्डमार्क कॉपी करें",downloadLogo:"लोगो डाउनलोड करें",downloadWordmark:"वर्डमार्क डाउनलोड करें",brandAssets:"ब्रांड एसेट्स",logoCopied:"लोगो कॉपी हो गया",wordmarkCopied:"वर्डमार्क कॉपी हो गया",logoDownloaded:"लोगो डाउनलोड हो गया",wordmarkDownloaded:"वर्डमार्क डाउनलोड हो गया",copyLogoFailed:"लोगो कॉपी नहीं हो सका",copyWordmarkFailed:"वर्डमार्क कॉपी नहीं हो सका"},n={title:"AI से पूछें",placeholder:"सवाल पूछें...",tooltip:"AI से सवाल पूछें",tryAsking:"सवाल पूछने की कोशिश करें",askAnything:"कुछ भी पूछें...",clearChat:"चैट हटाएँ",close:"बंद करें",expand:"विस्तार करें",collapse:"छोटा करें",thinking:"सोच रहे हैं...",askMeAnything:"कुछ भी पूछें",askMeAnythingDescription:"डॉक्यूमेंट नेविगेट करने, अवधारणाओं को समझने और जवाब खोजने में मदद पाएँ।",faq:"अक्सर पूछे जाने वाले सवाल",chatCleared:"रीफ़्रेश करने पर चैट साफ़ हो जाती है",lineBreak:"लाइन ब्रेक",explainWithAi:"AI से समझाएँ",toolListPages:"लिस्ट किए गए डॉक्यूमेंट पेज",toolReadPage:"पढ़ें",loading:{searching:"डॉक्यूमेंट खोजना",reading:"दस्तावेज़ों के माध्यम से पढ़ना",analyzing:"कंटेंट का विश्लेषण करना",finding:"सबसे अच्छा जवाब ढूँढना",finished:"इस्तेमाल किए गए स्रोत"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/2h0Q0JkN.js b/docus/dist/_nuxt/2h0Q0JkN.js new file mode 100644 index 0000000..cf08205 --- /dev/null +++ b/docus/dist/_nuxt/2h0Q0JkN.js @@ -0,0 +1 @@ +import{a0 as g,a1 as f,aQ as b,e as r,ac as t,s as e,af as v,B as y,ab as x,q as d,c as u,am as p,o as h}from"./B3fabVUf.js";const k={slots:{base:["relative text-xl text-highlighted font-bold mt-8 mb-3 scroll-mt-[calc(32px+45px+var(--ui-header-height))] lg:scroll-mt-[calc(32px+var(--ui-header-height))] [&>a]:focus-visible:outline-primary [&>a>code]:border-dashed hover:[&>a>code]:border-primary hover:[&>a>code]:text-primary [&>a>code]:text-lg/6 [&>a>code]:font-bold","[&>a>code]:transition-colors"],leading:["absolute -ms-8 top-0.5 opacity-0 group-hover:opacity-100 group-focus:opacity-100 p-1 bg-elevated hover:text-primary rounded-md hidden lg:flex text-muted","transition"],leadingIcon:"size-4 shrink-0",link:"group lg:ps-2 lg:-ms-2"}},C=["id"],q=["href"],_={__name:"ProseH3",props:{id:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const l=a,i=g(),s=f("prose.h3",l),{headings:n}=b().public?.mdc||{},o=u(()=>p({extend:p(k),...i.ui?.prose?.h3||{}})()),m=u(()=>l.id&&typeof n?.anchorLinks=="object"&&n.anchorLinks.h3);return(c,B)=>(h(),r("h3",{id:a.id,class:t(o.value.base({class:[e(s)?.base,l.class]}))},[a.id&&m.value?(h(),r("a",{key:0,href:`#${a.id}`,class:t(o.value.link({class:e(s)?.link}))},[v("span",{class:t(o.value.leading({class:e(s)?.leading}))},[y(x,{name:e(i).ui.icons.hash,class:t(o.value.leadingIcon({class:e(s)?.leadingIcon}))},null,8,["name","class"])],2),d(c.$slots,"default")],10,q)):d(c.$slots,"default",{key:1})],10,C))}};export{_ as default}; diff --git a/docus/dist/_nuxt/4YIHfatS.js b/docus/dist/_nuxt/4YIHfatS.js new file mode 100644 index 0000000..b728358 --- /dev/null +++ b/docus/dist/_nuxt/4YIHfatS.js @@ -0,0 +1 @@ +import{a0 as n,a1 as i,e as p,q as c,ac as u,s as d,c as m,am as t,o as f}from"./B3fabVUf.js";const _={base:"py-3 px-4 text-sm align-top border-e border-b first:border-s border-muted [&_code]:text-xs/5 [&_p]:my-0 [&_p]:leading-6 [&_ul]:my-0 [&_ol]:my-0 [&_ul]:ps-4.5 [&_ol]:ps-4.5 [&_li]:leading-6 [&_li]:my-0.5",variants:{align:{left:"text-left",center:"text-center",right:"text-right"}},defaultVariants:{align:"left"}},b={__name:"ProseTd",props:{align:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const e=s,a=n(),r=i("prose.td",e),l=m(()=>t({extend:t(_),...a.ui?.prose?.td||{}}));return(o,g)=>(f(),p("td",{class:u(l.value({align:e.align,class:[d(r)?.base,e.class]}))},[c(o.$slots,"default")],2))}};export{b as default}; diff --git a/docus/dist/_nuxt/AFG10c_a.js b/docus/dist/_nuxt/AFG10c_a.js new file mode 100644 index 0000000..5e10698 --- /dev/null +++ b/docus/dist/_nuxt/AFG10c_a.js @@ -0,0 +1 @@ +import{c as q,s as e,Z as G,Q as le,$ as be,a0 as H,aF as Ve,a2 as ye,aG as We,a4 as ie,o as s,e as w,B as v,p as b,q as I,a as k,ab as X,ac as f,ad as Ne,m as B,f as x,af as O,ah as M,ag as K,F as R,r as Y,ai as He,aH as V,W as Ee,D as ze,aj as Se,a7 as ke,a8 as Ae,aa as Oe,aw as fe,ax as pe,an as de,ao as he,a9 as Pe,v as J,aI as Ge,_ as Xe,a1 as Q,a3 as Be,aJ as Ye,aK as Je,aL as Qe,al as $e,am as F,P as ne,aM as Ze,aN as _e,d as se,aO as xe,aP as et,aQ as tt,aR as at,aS as oe,ak as re,aT as Ie,aU as De,w as Ue,aV as it,aW as lt,aX as nt,aY as st,X as ot,aZ as rt,a_ as ct,a$ as ut,b0 as Ke,b1 as me,b2 as dt,az as qe,b3 as gt,b4 as ft,b5 as pt,b6 as Te,b7 as Ce,b8 as ht,b9 as mt,ba as vt,bb as bt}from"./B3fabVUf.js";import{_ as yt}from"./DJxuwfoz.js";import{u as kt,_ as xt}from"./n8vERajx.js";import{_ as It}from"./Dq00p3Sb.js";import"./BN_7HF1G.js";function wt(t){const g=q(()=>e(t)),a=q(()=>new Intl.Collator("en",{usage:"search",...g.value}));return{startsWith:(l,i)=>i.length===0?!0:(l=l.normalize("NFC"),i=i.normalize("NFC"),a.value.compare(l.slice(0,i.length),i)===0),endsWith:(l,i)=>i.length===0?!0:(l=l.normalize("NFC"),i=i.normalize("NFC"),a.value.compare(l.slice(-i.length),i)===0),contains:(l,i)=>{if(i.length===0)return!0;l=l.normalize("NFC"),i=i.normalize("NFC");let p=0;const m=i.length;for(;p+m<=l.length;p++){const r=l.slice(p,p+m);if(a.value.compare(i,r)===0)return!0}return!1}}}function Lt(){const{contains:t,startsWith:g}=wt({sensitivity:"base"});function a(l,i){return t(l,i)?t(i,l)?0:g(l,i)?1:2:null}function h(l,i,p){if(typeof l!="object"||l===null)return a(String(l),i);let m=null;for(const r of p){const d=G(l,r);if(d==null)continue;const y=Array.isArray(d)?d.map(String):[String(d)];for(const S of y){const A=a(S,i);if(A!==null&&(m===null||Ar.score-d.score),m.map(({item:r})=>r)}function u(l,i,p){return i?l.map(m=>{const r=[];for(const d of m){if(d==null)continue;if(p.isStructural?.(d)){r.push({item:d,score:-1});continue}const y=h(d,i,p.fields);y!==null&&r.push({item:d,score:y})}return r.sort((d,y)=>d.score-y.score),r.map(({item:d})=>d)}).filter(m=>m.some(r=>!p.isStructural?.(r))):l}return{score:a,scoreItem:h,filter:o,filterGroups:u}}const Fe={__name:"UDropdownMenuContent",props:{items:{type:null,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0},sub:{type:Boolean,required:!1},labelKey:{type:null,required:!0},descriptionKey:{type:null,required:!0},checkedIcon:{type:null,required:!1},loadingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0},size:{type:null,required:!1},filter:{type:[Boolean,Object],required:!1},filterFields:{type:Array,required:!1},ignoreFilter:{type:Boolean,required:!1},searchTerm:{type:String,required:!1},class:{type:null,required:!1},ui:{type:null,required:!0},uiOverride:{type:null,required:!1},loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1}},emits:["update:searchTerm","escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(t,{emit:g}){const a=t,h=g,o=le(),{t:u,dir:l}=be(),i=H(),{filterGroups:p}=Lt(),m=J(""),r=q({get:()=>a.searchTerm??m.value,set:$=>{m.value=$,h("update:searchTerm",$)}}),d=de(()=>he(a.filter,{placeholder:u("dropdownMenu.search"),variant:"none"})),y=Ve(de(()=>a.portal)),S=ye(We(a,"sub","items","portal","labelKey","descriptionKey","checkedIcon","loadingIcon","externalIcon","size","filter","filterFields","ignoreFilter","searchTerm","class","ui","uiOverride"),h),A=()=>Pe(o,["default"]),[j,D]=ie(),U=q(()=>l.value==="rtl"?i.ui.icons.chevronLeft:i.ui.icons.chevronRight),L=q(()=>a.items?.length?Ge(a.items)?a.items:[a.items]:[]),_=$=>!!$.type&&["label","separator"].includes($.type),Z=q(()=>{if(!a.filter||a.ignoreFilter||!r.value)return L.value;const $=Array.isArray(a.filterFields)&&a.filterFields.length?a.filterFields:[a.labelKey];return p(L.value,r.value,{fields:$,isStructural:_})}),E=q(()=>Z.value.some($=>$.some(W=>!_(W))));return($,W)=>(s(),w(R,null,[v(e(j),null,{default:b(({item:c,active:P,index:n})=>[I($.$slots,c.slot||"item",{item:c,index:n,ui:t.ui},()=>[I($.$slots,c.slot?`${c.slot}-leading`:"item-leading",{item:c,active:P,index:n,ui:t.ui},()=>[c.loading?(s(),k(X,{key:0,name:t.loadingIcon||e(i).ui.icons.loading,"data-slot":"itemLeadingIcon",class:f(t.ui.itemLeadingIcon({class:[t.uiOverride?.itemLeadingIcon,c.ui?.itemLeadingIcon],color:c?.color,loading:!0}))},null,8,["name","class"])):c.icon?(s(),k(X,{key:1,name:c.icon,"data-slot":"itemLeadingIcon",class:f(t.ui.itemLeadingIcon({class:[t.uiOverride?.itemLeadingIcon,c.ui?.itemLeadingIcon],color:c?.color,active:P}))},null,8,["name","class"])):c.avatar?(s(),k(Ne,B({key:2,size:c.ui?.itemLeadingAvatarSize||t.uiOverride?.itemLeadingAvatarSize||t.ui.itemLeadingAvatarSize()},c.avatar,{"data-slot":"itemLeadingAvatar",class:t.ui.itemLeadingAvatar({class:[t.uiOverride?.itemLeadingAvatar,c.ui?.itemLeadingAvatar],active:P})}),null,16,["size","class"])):x("",!0)]),e(G)(c,a.labelKey)||o[c.slot?`${c.slot}-label`:"item-label"]||e(G)(c,a.descriptionKey)||o[c.slot?`${c.slot}-description`:"item-description"]?(s(),w("span",{key:0,"data-slot":"itemWrapper",class:f(t.ui.itemWrapper({class:[t.uiOverride?.itemWrapper,c.ui?.itemWrapper]}))},[O("span",{"data-slot":"itemLabel",class:f(t.ui.itemLabel({class:[t.uiOverride?.itemLabel,c.ui?.itemLabel],active:P}))},[I($.$slots,c.slot?`${c.slot}-label`:"item-label",{item:c,active:P,index:n},()=>[M(K(e(G)(c,a.labelKey)),1)]),c.target==="_blank"&&t.externalIcon!==!1?(s(),k(X,{key:0,name:typeof t.externalIcon=="string"?t.externalIcon:e(i).ui.icons.external,"data-slot":"itemLabelExternalIcon",class:f(t.ui.itemLabelExternalIcon({class:[t.uiOverride?.itemLabelExternalIcon,c.ui?.itemLabelExternalIcon],color:c?.color,active:P}))},null,8,["name","class"])):x("",!0)],2),e(G)(c,a.descriptionKey)||o[c.slot?`${c.slot}-description`:"item-description"]?(s(),w("span",{key:0,"data-slot":"itemDescription",class:f(t.ui.itemDescription({class:[t.uiOverride?.itemDescription,c.ui?.itemDescription]}))},[I($.$slots,c.slot?`${c.slot}-description`:"item-description",{item:c,active:P,index:n},()=>[M(K(e(G)(c,a.descriptionKey)),1)])],2)):x("",!0)],2)):x("",!0),O("span",{"data-slot":"itemTrailing",class:f(t.ui.itemTrailing({class:[t.uiOverride?.itemTrailing,c.ui?.itemTrailing]}))},[I($.$slots,c.slot?`${c.slot}-trailing`:"item-trailing",{item:c,active:P,index:n,ui:t.ui},()=>[c.children?.length?(s(),k(X,{key:0,name:U.value,"data-slot":"itemTrailingIcon",class:f(t.ui.itemTrailingIcon({class:[t.uiOverride?.itemTrailingIcon,c.ui?.itemTrailingIcon],color:c?.color,active:P}))},null,8,["name","class"])):c.kbds?.length?(s(),w("span",{key:1,"data-slot":"itemTrailingKbds",class:f(t.ui.itemTrailingKbds({class:[t.uiOverride?.itemTrailingKbds,c.ui?.itemTrailingKbds]}))},[(s(!0),w(R,null,Y(c.kbds,(T,C)=>(s(),k(He,B({key:C,size:c.ui?.itemTrailingKbdsSize||t.uiOverride?.itemTrailingKbdsSize||t.ui.itemTrailingKbdsSize()},{ref_for:!0},typeof T=="string"?{value:T}:T),null,16,["size"]))),128))],2)):x("",!0)]),v(e(V).ItemIndicator,{"as-child":""},{default:b(()=>[v(X,{name:t.checkedIcon||e(i).ui.icons.check,"data-slot":"itemTrailingIcon",class:f(t.ui.itemTrailingIcon({class:[t.uiOverride?.itemTrailingIcon,c.ui?.itemTrailingIcon],color:c?.color}))},null,8,["name","class"])]),_:2},1024)],2)])]),_:3}),v(e(V).Portal,fe(pe(e(y))),{default:b(()=>[(s(),k(Ee(t.sub?e(V).SubContent:e(V).Content),B({"data-slot":"content",class:t.ui.content({class:[t.uiOverride?.content,a.class]})},e(S)),{default:b(()=>[t.filter?(s(),k(e(V).Filter,{key:0,modelValue:r.value,"onUpdate:modelValue":W[1]||(W[1]=c=>r.value=c),"as-child":""},{default:b(()=>[v(yt,B({autofocus:"",autocomplete:"off",size:t.size},d.value,{"data-slot":"input",class:t.ui.input({class:t.uiOverride?.input}),onChange:W[0]||(W[0]=ze(()=>{},["stop"]))}),null,16,["size","class"])]),_:1},8,["modelValue"])):x("",!0),I($.$slots,"content-top",{sub:t.sub??!1}),!r.value||E.value?(s(),w("div",{key:1,role:"presentation","data-slot":"viewport",class:f(t.ui.viewport({class:t.uiOverride?.viewport}))},[(s(!0),w(R,null,Y(Z.value,(c,P)=>(s(),k(e(V).Group,{key:`group-${P}`,"data-slot":"group",class:f(t.ui.group({class:t.uiOverride?.group}))},{default:b(()=>[(s(!0),w(R,null,Y(c,(n,T)=>(s(),w(R,{key:`group-${P}-${T}`},[n.type==="label"?(s(),k(e(V).Label,{key:0,"data-slot":"label",class:f(t.ui.label({class:[t.uiOverride?.label,n.ui?.label,n.class]}))},{default:b(()=>[v(e(D),{item:n,index:T},null,8,["item","index"])]),_:2},1032,["class"])):n.type==="separator"?(s(),k(e(V).Separator,{key:1,"data-slot":"separator",class:f(t.ui.separator({class:[t.uiOverride?.separator,n.ui?.separator,n.class]}))},null,8,["class"])):n?.children?.length?(s(),k(e(V).Sub,{key:2,open:n.open,"default-open":n.defaultOpen},{default:b(()=>[v(e(V).SubTrigger,{as:"button",type:"button",disabled:n.disabled,"text-value":e(G)(n,a.labelKey),"data-slot":"item",class:f(t.ui.item({class:[t.uiOverride?.item,n.ui?.item,n.class],color:n?.color}))},{default:b(()=>[v(e(D),{item:n,index:T},null,8,["item","index"])]),_:2},1032,["disabled","text-value","class"]),v(Fe,B({sub:"",class:n.ui?.content,ui:t.ui,"ui-override":t.uiOverride,portal:t.portal,items:n.children,align:"start","align-offset":-4,"side-offset":3,"label-key":t.labelKey,"description-key":t.descriptionKey,"checked-icon":t.checkedIcon,"loading-icon":t.loadingIcon,"external-icon":t.externalIcon,size:t.size,filter:n.filter,"filter-fields":n.filterFields||t.filterFields,"ignore-filter":n.ignoreFilter??t.ignoreFilter},{ref_for:!0},n.content),Se({_:2},[Y(A(),(C,N)=>({name:N,fn:b(z=>[I($.$slots,N,B({ref_for:!0},z))])}))]),1040,["class","ui","ui-override","portal","items","label-key","description-key","checked-icon","loading-icon","external-icon","size","filter","filter-fields","ignore-filter"])]),_:2},1032,["open","default-open"])):n.type==="checkbox"?(s(),k(e(V).CheckboxItem,{key:3,"model-value":n.checked,disabled:n.disabled,"text-value":e(G)(n,a.labelKey),"data-slot":"item",class:f(t.ui.item({class:[t.uiOverride?.item,n.ui?.item,n.class],color:n?.color})),"onUpdate:modelValue":n.onUpdateChecked,onSelect:n.onSelect},{default:b(()=>[v(e(D),{item:n,index:T},null,8,["item","index"])]),_:2},1032,["model-value","disabled","text-value","class","onUpdate:modelValue","onSelect"])):(s(),k(ke,B({key:4,ref_for:!0},e(Ae)(n),{custom:""}),{default:b(({active:C,...N})=>[v(e(V).Item,{"as-child":"",disabled:n.disabled,"text-value":e(G)(n,a.labelKey),onSelect:n.onSelect},{default:b(()=>[v(Oe,B({ref_for:!0},N,{"data-slot":"item",class:t.ui.item({class:[t.uiOverride?.item,n.ui?.item,n.class],color:n?.color,active:C})}),{default:b(()=>[v(e(D),{item:n,active:C,index:T},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1032,["disabled","text-value","onSelect"])]),_:2},1040))],64))),128))]),_:2},1032,["class"]))),128))],2)):x("",!0),r.value&&!E.value?(s(),w("div",{key:2,"data-slot":"empty",class:f(t.ui.empty({class:t.uiOverride?.empty}))},[I($.$slots,"empty",{searchTerm:r.value},()=>[M(K(e(u)("dropdownMenu.noMatch",{searchTerm:r.value})),1)])],2)):x("",!0),I($.$slots,"default"),I($.$slots,"content-bottom",{sub:t.sub??!1})]),_:3},16,["class"]))]),_:3},16)],64))}},$t={slots:{content:"min-w-32 bg-default shadow-lg rounded-md ring ring-default overflow-hidden data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-dropdown-menu-content-transform-origin) flex flex-col",input:"border-b border-default",empty:"text-center text-muted",viewport:"relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1",arrow:"fill-bg stroke-default",group:"p-1 isolate",label:"w-full flex items-center font-semibold text-highlighted",separator:"-mx-1 my-1 h-px bg-border",item:"group relative w-full flex items-start select-none outline-none before:absolute before:z-[-1] before:inset-px before:rounded-md data-disabled:cursor-not-allowed data-disabled:opacity-75",itemLeadingIcon:"shrink-0",itemLeadingAvatar:"shrink-0",itemLeadingAvatarSize:"",itemTrailing:"ms-auto inline-flex gap-1.5 items-center",itemTrailingIcon:"shrink-0",itemTrailingKbds:"hidden lg:inline-flex items-center shrink-0",itemTrailingKbdsSize:"",itemWrapper:"flex-1 flex flex-col text-start min-w-0",itemLabel:"truncate",itemDescription:"truncate text-muted",itemLabelExternalIcon:"inline-block size-3 align-top text-dimmed"},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},active:{true:{item:"text-highlighted before:bg-elevated",itemLeadingIcon:"text-default"},false:{item:["text-default data-highlighted:text-highlighted data-[state=open]:text-highlighted data-highlighted:before:bg-elevated/50 data-[state=open]:before:bg-elevated/50","transition-colors before:transition-colors"],itemLeadingIcon:["text-dimmed group-data-highlighted:text-default group-data-[state=open]:text-default","transition-colors"]}},loading:{true:{itemLeadingIcon:"animate-spin"}},size:{xs:{label:"p-1 text-xs gap-1",item:"p-1 text-xs gap-1",empty:"p-2 text-xs",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemTrailingIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},sm:{label:"p-1.5 text-xs gap-1.5",item:"p-1.5 text-xs gap-1.5",empty:"p-2.5 text-xs",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemTrailingIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},md:{label:"p-1.5 text-sm gap-1.5",item:"p-1.5 text-sm gap-1.5",empty:"p-2.5 text-sm",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemTrailingIcon:"size-5",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"md"},lg:{label:"p-2 text-sm gap-2",item:"p-2 text-sm gap-2",empty:"p-3 text-sm",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemTrailingIcon:"size-5",itemTrailingKbds:"gap-1",itemTrailingKbdsSize:"md"},xl:{label:"p-2 text-base gap-2",item:"p-2 text-base gap-2",empty:"p-3 text-base",itemLeadingIcon:"size-6",itemLeadingAvatarSize:"xs",itemTrailingIcon:"size-6",itemTrailingKbds:"gap-1",itemTrailingKbdsSize:"lg"}}},compoundVariants:[{color:"primary",active:!1,class:{item:"text-primary data-highlighted:text-primary data-highlighted:before:bg-primary/10 data-[state=open]:before:bg-primary/10",itemLeadingIcon:"text-primary/75 group-data-highlighted:text-primary group-data-[state=open]:text-primary"}},{color:"secondary",active:!1,class:{item:"text-secondary data-highlighted:text-secondary data-highlighted:before:bg-secondary/10 data-[state=open]:before:bg-secondary/10",itemLeadingIcon:"text-secondary/75 group-data-highlighted:text-secondary group-data-[state=open]:text-secondary"}},{color:"success",active:!1,class:{item:"text-success data-highlighted:text-success data-highlighted:before:bg-success/10 data-[state=open]:before:bg-success/10",itemLeadingIcon:"text-success/75 group-data-highlighted:text-success group-data-[state=open]:text-success"}},{color:"info",active:!1,class:{item:"text-info data-highlighted:text-info data-highlighted:before:bg-info/10 data-[state=open]:before:bg-info/10",itemLeadingIcon:"text-info/75 group-data-highlighted:text-info group-data-[state=open]:text-info"}},{color:"warning",active:!1,class:{item:"text-warning data-highlighted:text-warning data-highlighted:before:bg-warning/10 data-[state=open]:before:bg-warning/10",itemLeadingIcon:"text-warning/75 group-data-highlighted:text-warning group-data-[state=open]:text-warning"}},{color:"error",active:!1,class:{item:"text-error data-highlighted:text-error data-highlighted:before:bg-error/10 data-[state=open]:before:bg-error/10",itemLeadingIcon:"text-error/75 group-data-highlighted:text-error group-data-[state=open]:text-error"}},{color:"primary",active:!0,class:{item:"text-primary before:bg-primary/10",itemLeadingIcon:"text-primary"}},{color:"secondary",active:!0,class:{item:"text-secondary before:bg-secondary/10",itemLeadingIcon:"text-secondary"}},{color:"success",active:!0,class:{item:"text-success before:bg-success/10",itemLeadingIcon:"text-success"}},{color:"info",active:!0,class:{item:"text-info before:bg-info/10",itemLeadingIcon:"text-info"}},{color:"warning",active:!0,class:{item:"text-warning before:bg-warning/10",itemLeadingIcon:"text-warning"}},{color:"error",active:!0,class:{item:"text-error before:bg-error/10",itemLeadingIcon:"text-error"}}],defaultVariants:{size:"md"}},qt={__name:"UDropdownMenu",props:$e({size:{type:null,required:!1},items:{type:null,required:!1},checkedIcon:{type:null,required:!1},loadingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},content:{type:Object,required:!1},arrow:{type:[Boolean,Object],required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},filter:{type:[Boolean,Object],required:!1,default:!1},filterFields:{type:Array,required:!1},ignoreFilter:{type:Boolean,required:!1,default:!1},disabled:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},modal:{type:Boolean,required:!1,default:!0}},{searchTerm:{type:String,default:""},searchTermModifiers:{}}),emits:$e(["update:open"],["update:searchTerm"]),setup(t,{emit:g}){const a=t,h=g,o=le(),u=Xe(t,"searchTerm",{type:String,default:""}),l=H(),i=Q("dropdownMenu",a),p=ye(Be(a,"defaultOpen","open","modal"),h),m=de(()=>he(a.content,{side:"bottom",sideOffset:8,collisionPadding:8})),r=de(()=>he(a.arrow,{rounded:!0})),d=()=>Pe(o,["default"]),y=q(()=>F({extend:F($t),...l.ui?.dropdownMenu||{}})({size:a.size}));return(S,A)=>(s(),k(e(Qe),fe(pe(e(p))),{default:b(({open:j})=>[o.default?(s(),k(e(Ye),{key:0,"as-child":"",class:f(a.class),disabled:t.disabled},{default:b(()=>[I(S.$slots,"default",{open:j})]),_:2},1032,["class","disabled"])):x("",!0),v(Fe,B({"search-term":u.value,"onUpdate:searchTerm":A[0]||(A[0]=D=>u.value=D),class:y.value.content({class:[!o.default&&a.class,e(i)?.content]}),ui:y.value,"ui-override":e(i)},m.value,{items:t.items,portal:t.portal,"label-key":t.labelKey,"description-key":t.descriptionKey,"checked-icon":t.checkedIcon,"loading-icon":t.loadingIcon,"external-icon":t.externalIcon,size:t.size,filter:t.filter,"filter-fields":t.filterFields,"ignore-filter":t.ignoreFilter}),Se({default:b(()=>[t.arrow?(s(),k(e(Je),B({key:0},r.value,{"data-slot":"arrow",class:y.value.arrow({class:e(i)?.arrow})}),null,16,["class"])):x("",!0)]),_:2},[Y(d(),(D,U)=>({name:U,fn:b(L=>[I(S.$slots,U,fe(pe(L)))])}))]),1040,["search-term","class","ui","ui-override","items","portal","label-key","description-key","checked-icon","loading-icon","external-icon","size","filter","filter-fields","ignore-filter"])]),_:3},16))}},Tt={base:"relative",variants:{size:{xs:"",sm:"",md:"",lg:"",xl:""},orientation:{horizontal:"inline-flex -space-x-px",vertical:"flex flex-col -space-y-px"}}},Ct={__name:"UFieldGroup",props:{as:{type:null,required:!1},size:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const g=t,a=H(),h=Q("fieldGroup",g),o=q(()=>F({extend:F(Tt),...a.ui?.fieldGroup||{}}));return Ze(_e,q(()=>({orientation:g.orientation,size:g.size}))),(u,l)=>(s(),k(e(ne),{as:t.as,"data-orientation":t.orientation,class:f(o.value({orientation:t.orientation,class:[e(h)?.base,g.class]}))},{default:b(()=>[I(u.$slots,"default")]),_:3},8,["as","data-orientation","class"]))}},zt=se({__name:"DocsPageHeaderLinks",setup(t){const g=xe(),a=et(),h=tt().app?.baseURL||"/",{copy:o,copied:u}=at(),{t:l}=oe(),i=q(()=>`${window?.location?.origin}${h}raw${g.path}.md`),p=[[{label:l("docs.copy.link"),icon:"i-lucide-link",onSelect(){o(i.value)}},{label:l("docs.copy.view"),icon:"i-simple-icons:markdown",target:"_blank",to:i.value},{label:l("docs.copy.gpt"),icon:"i-simple-icons:openai",target:"_blank",to:`https://chatgpt.com/?hints=search&q=${encodeURIComponent(`Read ${i.value} so I can ask questions about it.`)}`},{label:l("docs.copy.claude"),icon:"i-simple-icons:anthropic",target:"_blank",to:`https://claude.ai/new?q=${encodeURIComponent(`Read ${i.value} so I can ask questions about it.`)}`}],[{label:"Copy MCP Server URL",icon:"i-lucide-link",onSelect(){o(`${window?.location?.origin}${h}mcp`),a.add({title:"Copied to clipboard",icon:"i-lucide-check-circle"})}},{label:"Add MCP Server",icon:"i-simple-icons:cursor",target:"_blank",to:"/mcp/deeplink"}]];async function m(){const r=await $fetch(`/raw${g.path}.md`);o(r)}return(r,d)=>{const y=re,S=qt,A=Ct;return s(),k(A,{size:"sm"},{default:b(()=>[v(y,{label:e(l)("docs.copy.page"),icon:e(u)?"i-lucide-check":"i-lucide-copy",color:"neutral",variant:"soft",ui:{leadingIcon:"text-neutral size-3.5"},onClick:m},null,8,["label","icon"]),v(S,{size:"sm",items:p,content:{align:"end",side:"bottom",sideOffset:8}},{default:b(()=>[v(y,{icon:"i-lucide-chevron-down",color:"neutral",variant:"soft",class:"border-l border-muted"})]),_:1})]),_:1})}}}),St=Object.assign(zt,{__name:"DocsPageHeaderLinks"}),At={slots:{root:"relative border-b border-default py-8",container:"",wrapper:"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4",headline:"mb-2.5 text-sm font-semibold text-primary flex items-center gap-1.5",title:"text-3xl sm:text-4xl text-pretty font-bold text-highlighted",description:"text-lg text-pretty text-muted",links:"flex flex-wrap items-center gap-1.5"},variants:{title:{true:{description:"mt-4"}}}},Ot={__name:"UPageHeader",props:{as:{type:null,required:!1},headline:{type:String,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},links:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const g=t,a=le(),h=H(),o=Q("pageHeader",g),u=q(()=>F({extend:F(At),...h.ui?.pageHeader||{}})({title:!!g.title||!!a.title}));return(l,i)=>(s(),k(e(ne),{as:t.as,"data-slot":"root",class:f(u.value.root({class:[e(o)?.root,g.class]}))},{default:b(()=>[t.headline||a.headline?(s(),w("div",{key:0,"data-slot":"headline",class:f(u.value.headline({class:e(o)?.headline}))},[I(l.$slots,"headline",{},()=>[M(K(t.headline),1)])],2)):x("",!0),O("div",{"data-slot":"container",class:f(u.value.container({class:e(o)?.container}))},[O("div",{"data-slot":"wrapper",class:f(u.value.wrapper({class:e(o)?.wrapper}))},[t.title||a.title?(s(),w("h1",{key:0,"data-slot":"title",class:f(u.value.title({class:e(o)?.title}))},[I(l.$slots,"title",{},()=>[M(K(t.title),1)])],2)):x("",!0),t.links?.length||a.links?(s(),w("div",{key:1,"data-slot":"links",class:f(u.value.links({class:e(o)?.links}))},[I(l.$slots,"links",{},()=>[(s(!0),w(R,null,Y(t.links,(p,m)=>(s(),k(re,B({key:m,color:"neutral",variant:"outline"},{ref_for:!0},p),null,16))),128))])],2)):x("",!0)],2),t.description||a.description?(s(),w("div",{key:0,"data-slot":"description",class:f(u.value.description({class:e(o)?.description}))},[I(l.$slots,"description",{},()=>[M(K(t.description),1)])],2)):x("",!0),I(l.$slots,"default")],2)]),_:3},8,["as","class"]))}},Pt={slots:{root:"grid grid-cols-1 sm:grid-cols-2 gap-8",link:["group block px-6 py-8 rounded-lg border border-default hover:bg-elevated/50 focus-visible:outline-primary","transition-colors"],linkLeading:["inline-flex items-center rounded-full p-1.5 bg-elevated group-hover:bg-primary/10 ring ring-accented mb-4 group-hover:ring-primary/50","transition"],linkLeadingIcon:["size-5 shrink-0 text-highlighted group-hover:text-primary","transition-[color,translate]"],linkTitle:"font-medium text-[15px] text-highlighted mb-1 truncate",linkDescription:"text-sm text-muted line-clamp-2"},variants:{direction:{left:{linkLeadingIcon:["group-active:-translate-x-0.5"]},right:{link:"text-end",linkLeadingIcon:["group-active:translate-x-0.5"]}}}},Bt={key:1,class:"hidden sm:block"},Dt=Object.assign({inheritAttrs:!1},{__name:"UContentSurround",props:{as:{type:null,required:!1},prevIcon:{type:null,required:!1},nextIcon:{type:null,required:!1},surround:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const g=t,{dir:a}=be(),h=H(),o=Q("contentSurround",g),[u,l]=ie({props:{link:Object,icon:String,direction:String}}),i=q(()=>F({extend:F(Pt),...h.ui?.contentSurround||{}})()),p=q(()=>g.prevIcon||(a.value==="rtl"?h.ui.icons.arrowRight:h.ui.icons.arrowLeft)),m=q(()=>g.nextIcon||(a.value==="rtl"?h.ui.icons.arrowLeft:h.ui.icons.arrowRight));return(r,d)=>(s(),w(R,null,[v(e(u),null,{default:b(({link:y,icon:S,direction:A})=>[y?(s(),k(ke,{key:0,to:y.path,raw:"","data-slot":"link",class:f(i.value.link({class:[e(o)?.link,y.ui?.link,y.class],direction:A}))},{default:b(()=>[I(r.$slots,"link",{link:y,ui:i.value},()=>[O("div",{"data-slot":"linkLeading",class:f(i.value.linkLeading({class:[e(o)?.linkLeading,y.ui?.linkLeading]}))},[I(r.$slots,"link-leading",{link:y,ui:i.value},()=>[v(X,{name:y.icon||S,"data-slot":"linkLeadingIcon",class:f(i.value.linkLeadingIcon({class:[e(o)?.linkLeadingIcon,y.ui?.linkLeadingIcon],direction:A}))},null,8,["name","class"])])],2),O("p",{"data-slot":"linkTitle",class:f(i.value.linkTitle({class:[e(o)?.linkTitle,y.ui?.linkTitle]}))},[I(r.$slots,"link-title",{link:y,ui:i.value},()=>[M(K(y.title),1)])],2),O("p",{"data-slot":"linkDescription",class:f(i.value.linkDescription({class:[e(o)?.linkDescription,y.ui?.linkDescription]}))},[I(r.$slots,"link-description",{link:y,ui:i.value},()=>[M(K(y.description),1)])],2)])]),_:2},1032,["to","class"])):(s(),w("span",Bt," "))]),_:3}),t.surround?(s(),k(e(ne),B({key:0,as:t.as},r.$attrs,{"data-slot":"root",class:i.value.root({class:[e(o)?.root,g.class]})}),{default:b(()=>[v(e(l),{link:t.surround[0],icon:p.value,direction:"left"},null,8,["link","icon"]),v(e(l),{link:t.surround[1],icon:m.value,direction:"right"},null,8,["link","icon"])]),_:1},16,["as","class"])):x("",!0)],64))}}),Ut={base:"mt-8 pb-24 space-y-12"},Kt={__name:"UPageBody",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const g=t,a=H(),h=Q("pageBody",g),o=q(()=>F({extend:F(Ut),...a.ui?.pageBody||{}}));return(u,l)=>(s(),k(e(ne),{as:t.as,class:f(o.value({class:[e(h)?.base,g.class]}))},{default:b(()=>[I(u.$slots,"default")]),_:3},8,["as","class"]))}},Ft={slots:{root:"flex flex-col gap-3",title:"text-sm font-semibold flex items-center gap-1.5",list:"flex flex-col gap-2",item:"relative",link:"group text-sm flex items-center gap-1.5 focus-visible:outline-primary",linkLeadingIcon:"size-5 shrink-0",linkLabel:"truncate",linkLabelExternalIcon:"size-3 absolute top-0 text-dimmed"},variants:{active:{true:{link:"text-primary font-medium"},false:{link:["text-muted hover:text-default","transition-colors"]}}}},Rt={__name:"UPageLinks",props:{as:{type:null,required:!1,default:"nav"},title:{type:String,required:!1},links:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const g=t,a=le(),h=H(),o=Q("pageLinks",g),u=q(()=>F({extend:F(Ft),...h.ui?.pageLinks||{}})());return(l,i)=>(s(),k(e(ne),{as:t.as,"data-slot":"root",class:f(u.value.root({class:[e(o)?.root,g.class]}))},{default:b(()=>[t.title||a.title?(s(),w("p",{key:0,"data-slot":"title",class:f(u.value.title({class:e(o)?.title}))},[I(l.$slots,"title",{},()=>[M(K(t.title),1)])],2)):x("",!0),O("ul",{"data-slot":"list",class:f(u.value.list({class:e(o)?.list}))},[(s(!0),w(R,null,Y(t.links,(p,m)=>(s(),w("li",{key:m,"data-slot":"item",class:f(u.value.item({class:[e(o)?.item,p.ui?.item]}))},[v(ke,B({ref_for:!0},e(Ae)(p),{custom:""}),{default:b(({active:r,...d})=>[v(Oe,B({ref_for:!0},d,{"data-slot":"link",class:u.value.link({class:[e(o)?.link,p.ui?.link,p.class],active:r})}),{default:b(()=>[I(l.$slots,"link",{link:p,active:r,ui:u.value},()=>[I(l.$slots,"link-leading",{link:p,active:r,ui:u.value},()=>[p.icon?(s(),k(X,{key:0,name:p.icon,"data-slot":"linkLeadingIcon",class:f(u.value.linkLeadingIcon({class:[e(o)?.linkLeadingIcon,p.ui?.linkLeadingIcon],active:r}))},null,8,["name","class"])):x("",!0)]),p.label||a["link-label"]?(s(),w("span",{key:0,"data-slot":"linkLabel",class:f(u.value.linkLabel({class:[e(o)?.linkLabel,p.ui?.linkLabel],active:r}))},[I(l.$slots,"link-label",{link:p,active:r},()=>[M(K(p.label),1)]),p.target==="_blank"?(s(),k(X,{key:0,name:e(h).ui.icons.external,"data-slot":"linkLabelExternalIcon",class:f(u.value.linkLabelExternalIcon({class:[e(o)?.linkLabelExternalIcon,p.ui?.linkLabelExternalIcon],active:r}))},null,8,["name","class"])):x("",!0)],2)):x("",!0),I(l.$slots,"link-trailing",{link:p,active:r})])]),_:2},1040,["class"])]),_:2},1040)],2))),128))],2)]),_:3},8,["as","class"]))}},Mt={key:0,class:"space-y-6"},jt=se({__name:"DocsAsideRightBottom",setup(t){const a=xe().path,h=H(),{t:o}=oe(),{isEnabled:u,open:l}=Ie(),i=q(()=>u.value&&h.assistant?.explainWithAi!==!1),p=q(()=>h.assistant?.icons?.explain||"i-lucide-brain");return(m,r)=>{const d=De,y=Rt,S=re;return e(h).toc?.bottom?.links?.length||e(i)?(s(),w("div",Mt,[v(d,{type:"dashed"}),e(h).toc?.bottom?.links?.length?(s(),k(y,{key:0,title:e(h).toc?.bottom?.title||e(o)("docs.links"),links:e(h).toc?.bottom?.links},null,8,["title","links"])):x("",!0),e(h).toc?.bottom?.links?.length&&e(i)?(s(),k(d,{key:1,type:"dashed"})):x("",!0),e(i)?(s(),k(S,{key:2,icon:e(p),label:e(o)("assistant.explainWithAi"),size:"sm",variant:"link",class:"p-0 text-sm",color:"neutral",onClick:r[0]||(r[0]=A=>e(l)(`Explain the page ${e(a)}`,!0))},null,8,["icon","label"])):x("",!0)])):x("",!0)}}}),Re=Object.assign(jt,{__name:"DocsAsideRightBottom"});function Vt(){const t=J(),g=J([]),a=J([]);function h(u){u.forEach(l=>{const i=l.target.id;i&&(l.isIntersecting?g.value=[...g.value,i]:g.value=g.value.filter(p=>p!==i))})}function o(u){u.forEach(l=>{t.value&&t.value.observe(l)})}return Ue(g,(u,l)=>{u.length===0?a.value=l:a.value=u}),it(()=>t.value=new IntersectionObserver(h)),lt(()=>t.value?.disconnect()),{visibleHeadings:g,activeHeadings:a,updateHeadings:o}}const Wt={slots:{root:"sticky top-(--ui-header-height) z-10 bg-default/75 lg:bg-[initial] backdrop-blur -mx-4 px-4 sm:px-6 sm:-mx-6 lg:ms-0 overflow-y-auto max-h-[calc(100vh-var(--ui-header-height))]",container:"pt-4 sm:pt-6 pb-2.5 sm:pb-4.5 lg:py-8 border-b border-dashed border-default lg:border-0 flex flex-col",top:"",bottom:"hidden lg:flex lg:flex-col gap-6",trigger:"group text-sm font-semibold flex-1 flex items-center gap-1.5 py-1.5 -mt-1.5 focus-visible:outline-primary",title:"truncate",trailing:"ms-auto inline-flex gap-1.5 items-center",trailingIcon:"size-5 transform transition-transform duration-200 shrink-0 group-data-[state=open]:rotate-180 lg:hidden",content:"relative data-[state=open]:animate-[collapsible-down_200ms_ease-out] data-[state=closed]:animate-[collapsible-up_200ms_ease-out] overflow-hidden focus:outline-none",list:"min-w-0",listWithChildren:"ms-3",item:"min-w-0",itemWithChildren:"",link:"group relative text-sm flex items-center focus-visible:outline-primary py-1",linkText:"truncate",indicator:"",indicatorLine:"",indicatorActive:""},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},highlightColor:{primary:{indicatorActive:"bg-primary"},secondary:{indicatorActive:"bg-secondary"},success:{indicatorActive:"bg-success"},info:{indicatorActive:"bg-info"},warning:{indicatorActive:"bg-warning"},error:{indicatorActive:"bg-error"},neutral:{indicatorActive:"bg-inverted"}},active:{false:{link:["text-muted hover:text-default","transition-colors"]}},highlight:{true:""},highlightVariant:{straight:"",circuit:""},body:{true:{bottom:"mt-6"}}},compoundVariants:[{color:"primary",active:!0,class:{link:"text-primary"}},{color:"secondary",active:!0,class:{link:"text-secondary"}},{color:"success",active:!0,class:{link:"text-success"}},{color:"info",active:!0,class:{link:"text-info"}},{color:"warning",active:!0,class:{link:"text-warning"}},{color:"error",active:!0,class:{link:"text-error"}},{color:"neutral",active:!0,class:{link:"text-highlighted"}},{highlight:!0,highlightVariant:"straight",class:{list:"ms-2.5 ps-4 border-s border-default",item:"-ms-px",indicator:"absolute ms-2.5 transition-[translate,height] duration-200 h-(--indicator-size) translate-y-(--indicator-position) w-px rounded-full",indicatorLine:"hidden",indicatorActive:"w-full h-full"}},{highlight:!0,highlightVariant:"circuit",class:{list:"ps-6.5",item:"-ms-px",itemWithChildren:"ps-px",indicator:"absolute ms-2.5 start-0 top-0 rtl:-scale-x-100",indicatorLine:"absolute inset-0 bg-(--ui-border)",indicatorActive:"absolute w-full h-(--indicator-size) translate-y-(--indicator-position) transition-[translate,height] duration-200 ease-out"}}],defaultVariants:{color:"primary",highlightColor:"primary",highlightVariant:"straight"}},Nt=["href","onClick"],Me=Object.assign({inheritAttrs:!1},{__name:"UContentToc",props:{as:{type:null,required:!1,default:"nav"},trailingIcon:{type:null,required:!1},title:{type:String,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},highlightColor:{type:null,required:!1},highlightVariant:{type:null,required:!1},links:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1}},emits:["update:open","move"],setup(t,{emit:g}){const a=t,h=g,o=le(),u=ye(Be(a,"as","open","defaultOpen"),h),{t:l}=be(),i=nt(),p=H(),m=Q("contentToc",a),{activeHeadings:r,updateHeadings:d}=Vt(),[y,S]=ie({props:{links:Array,level:Number}}),[A,j]=ie(),[D,U]=ie(),L=q(()=>F({extend:F(Wt),...p.ui?.contentToc||{}})({color:a.color,highlight:a.highlight,highlightVariant:a.highlightVariant,highlightColor:a.highlightColor||a.color}));function _(n){const T=encodeURIComponent(n);i.push(`#${T}`),h("move",n)}function Z(n){return n.flatMap(T=>[T,...T.children?Z(T.children):[]])}function E(n,T=0){return n.flatMap(C=>[{link:C,level:T},...C.children?E(C.children,T+1):[]])}const $=1.75,W=q(()=>{if(!r.value?.length)return;const T=Z(a.links||[]).findIndex(C=>r.value.includes(C.id));return{"--indicator-size":`${$*r.value.length}rem`,"--indicator-position":T>=0?`${T*$}rem`:"0rem"}}),c=q(()=>{if(!a.highlight||a.highlightVariant!=="circuit"||!a.links?.length)return;const n=E(a.links),C=$*16,N=n.length*C,z=.5,ee=10.5;let te="",ce=z,ue=0;n.forEach((we,ge)=>{const ae=we.level>0?ee:z,Le=ue+C;ge===0&&(te+=`M${ae} ${ue}`,ce=ae),ae!==ce&&(te+=` L${ae} ${ue+6}`,ce=ae),te+=` L${ce} ${Le-(ge`);return{width:"0.75rem",height:`${n.length*$}rem`,maskImage:`url("data:image/svg+xml,${je}")`}}),P=st();return P.hooks.hook("page:loading:end",()=>{const n=Array.from(document.querySelectorAll("h2, h3"));d(n)}),P.hooks.hook("page:transition:finish",()=>{const n=Array.from(document.querySelectorAll("h2, h3"));d(n)}),(n,T)=>(s(),w(R,null,[v(e(y),null,{default:b(({links:C,level:N})=>[O("ul",{class:f(N>0?L.value.listWithChildren({class:e(m)?.listWithChildren}):L.value.list({class:e(m)?.list}))},[(s(!0),w(R,null,Y(C,(z,ee)=>(s(),w("li",{key:ee,class:f(z.children&&z.children.length>0?L.value.itemWithChildren({class:[e(m)?.itemWithChildren,z.ui?.itemWithChildren]}):L.value.item({class:[e(m)?.item,z.ui?.item]}))},[O("a",{href:`#${z.id}`,"data-slot":"link",class:f(L.value.link({class:[e(m)?.link,z.ui?.link,z.class],active:e(r).includes(z.id)})),onClick:ze(te=>_(z.id),["prevent"])},[I(n.$slots,"link",{link:z},()=>[O("span",{"data-slot":"linkText",class:f(L.value.linkText({class:[e(m)?.linkText,z.ui?.linkText]}))},K(z.text),3)])],10,Nt),z.children?.length?(s(),k(e(S),{key:0,links:z.children,level:N+1},null,8,["links","level"])):x("",!0)],2))),128))],2)]),_:3}),v(e(A),null,{default:b(({open:C})=>[I(n.$slots,"leading",{open:C,ui:L.value}),O("span",{"data-slot":"title",class:f(L.value.title({class:e(m)?.title}))},[I(n.$slots,"default",{open:C},()=>[M(K(t.title||e(l)("contentToc.title")),1)])],2),O("span",{"data-slot":"trailing",class:f(L.value.trailing({class:e(m)?.trailing}))},[I(n.$slots,"trailing",{open:C,ui:L.value},()=>[v(X,{name:t.trailingIcon||e(p).ui.icons.chevronDown,"data-slot":"trailingIcon",class:f(L.value.trailingIcon({class:e(m)?.trailingIcon}))},null,8,["name","class"])])],2)]),_:3}),v(e(D),null,{default:b(()=>[t.highlight?(s(),w("div",{key:0,"data-slot":"indicator",class:f(L.value.indicator({class:e(m)?.indicator})),style:ot({...W.value,...c.value||{}})},[O("div",{"data-slot":"indicatorLine",class:f(L.value.indicatorLine({class:e(m)?.indicatorLine}))},null,2),W.value?(s(),w("div",{key:0,"data-slot":"indicatorActive",class:f(L.value.indicatorActive({class:e(m)?.indicatorActive}))},null,2)):x("",!0)],6)):x("",!0),I(n.$slots,"content",{links:t.links},()=>[v(e(S),{links:t.links,level:0},null,8,["links"])])]),_:3}),v(e(ut),B({...e(u),...n.$attrs},{"default-open":t.defaultOpen,"data-slot":"root",class:L.value.root({class:[e(m)?.root,a.class]})}),{default:b(({open:C})=>[O("div",{"data-slot":"container",class:f(L.value.container({class:e(m)?.container}))},[o.top?(s(),w("div",{key:0,"data-slot":"top",class:f(L.value.top({class:e(m)?.top}))},[I(n.$slots,"top",{links:t.links})],2)):x("",!0),t.links?.length?(s(),w(R,{key:1},[v(e(rt),{"data-slot":"trigger",class:f(L.value.trigger({class:"lg:hidden"}))},{default:b(()=>[v(e(j),{open:C},null,8,["open"])]),_:2},1032,["class"]),v(e(ct),{"data-slot":"content",class:f(L.value.content({class:[e(m)?.content,"lg:hidden"]}))},{default:b(()=>[v(e(U))]),_:1},8,["class"]),O("p",{"data-slot":"trigger",class:f(L.value.trigger({class:"hidden lg:flex"}))},[v(e(j),{open:C},null,8,["open"])],2),O("div",{"data-slot":"content",class:f(L.value.content({class:[e(m)?.content,"hidden lg:flex"]}))},[v(e(U))],2)],64)):x("",!0),o.bottom?(s(),w("div",{key:2,"data-slot":"bottom",class:f(L.value.bottom({class:e(m)?.bottom,body:!!o.top||!!t.links?.length}))},[I(n.$slots,"bottom",{links:t.links})],2)):x("",!0)],2)]),_:3},16,["default-open","class"])],64))}}),Ht={key:0,class:"lg:hidden sticky top-(--ui-header-height) z-10 bg-default/75 backdrop-blur -mx-4 p-2 border-b border-dashed border-default flex justify-between"},Et=se({__name:"DocsAsideMobileBar",props:{links:{}},setup(t){const{subNavigationMode:g,sidebarNavigation:a,currentSection:h}=Ke(),{t:o}=oe(),u=me("contentNavigation"),l=me("contentToc"),i=J(!1),p=J(!1);return(m,r)=>{const d=re,y=gt,S=dt,A=Re,j=Me;return e(g)?(s(),w("div",Ht,[v(S,{open:e(i),"onUpdate:open":r[0]||(r[0]=D=>qe(i)?i.value=D:null),direction:"left",title:e(h)?.title,handle:!1,inset:"",side:"left",ui:{content:"w-full max-w-2/3"}},{body:b(()=>[v(y,{navigation:e(a),highlight:e(u).highlight??!0,"highlight-color":e(u).highlightColor,variant:e(u).variant??"link",color:e(u).color,"default-open":"","trailing-icon":"i-lucide-chevron-right",ui:{linkTrailingIcon:"group-data-[state=open]:rotate-90"}},null,8,["navigation","highlight","highlight-color","variant","color"])]),default:b(()=>[v(d,{label:e(o)("docs.menu"),icon:"i-lucide-text-align-start",color:"neutral",variant:"link",size:"xs","aria-label":e(o)("docs.menu")},null,8,["label","aria-label"])]),_:1},8,["open","title"]),v(S,{open:e(p),"onUpdate:open":r[1]||(r[1]=D=>qe(p)?p.value=D:null),direction:"right",handle:!1,inset:"",side:"right","no-body-styles":"",ui:{content:"w-full max-w-2/3"}},{body:b(()=>[t.links?.length?(s(),k(j,{key:0,highlight:e(l).highlight??!0,"highlight-color":e(l).highlightColor,"highlight-variant":e(l).highlightVariant,color:e(l).color,links:t.links,open:!0,"default-open":"",ui:{root:"!mx-0 !px-1 top-0 overflow-visible",container:"!pt-0 border-b-0",trailingIcon:"hidden",bottom:"flex flex-col"}},{bottom:b(()=>[v(A)]),_:1},8,["highlight","highlight-color","highlight-variant","color","links"])):x("",!0)]),default:b(()=>[v(d,{label:e(o)("docs.toc"),"trailing-icon":"i-lucide-chevron-right",color:"neutral",variant:"link",size:"xs","aria-label":e(o)("docs.toc")},null,8,["label","aria-label"])]),_:1},8,["open"])])):x("",!0)}}}),Gt=Object.assign(Et,{__name:"DocsAsideMobileBar"}),Xt=se({__name:"DocsAsideRight",props:{page:{}},setup(t){const g=t,a=q(()=>g.page?.body?.toc?.links||[]),{shouldPushContent:h}=Ie(),{subNavigationMode:o}=Ke(),u=H(),{t:l}=oe(),i=me("contentToc");return(p,m)=>{const r=Re,d=Me,y=Gt;return s(),w("div",null,[e(a).length&&!e(h)?(s(),k(d,{key:0,highlight:e(i).highlight??!0,"highlight-color":e(i).highlightColor,"highlight-variant":e(i).highlightVariant,color:e(i).color,title:e(u).toc?.title||e(l)("docs.toc"),links:e(a),class:f({"hidden lg:block":e(o)})},{bottom:b(()=>[v(r)]),_:1},8,["highlight","highlight-color","highlight-variant","color","title","links","class"])):x("",!0),v(y,{links:e(a)},null,8,["links"])])}}}),Yt=Object.assign(Xt,{__name:"DocsAsideRight"});function ve(t,g,a){if(!(!t?.length||!g)){for(const h of t)if(h.children){for(const u of h.children){const l=u.stem?.endsWith("/index");if(u.path===g&&!l)return h.title}const o=ve(h.children,g);if(o)return o}}}const Jt=t=>{const g=void 0;g&&g.node.res.setHeader("x-nitro-prerender",[g.node.res.getHeader("x-nitro-prerender"),t].filter(Boolean).join(","))},Qt={class:"flex items-center gap-2 text-sm text-muted"},ia=se({__name:"[...slug]",async setup(t){let g,a;const h=xe(),{locale:o,isEnabled:u,t:l}=oe(),i=H(),p=ft("navigation"),{shouldPushContent:m}=Ie(),r=q(()=>u.value?`docs_${o.value}`:"docs"),[{data:d},{data:y}]=([g,a]=pt(()=>Promise.all([Te(Ce(h.path),()=>ht(r.value).path(h.path).first(),"$FMwJADWsY_"),Te(`${Ce(h.path)}-surround`,()=>mt(r.value,h.path,{fields:["description"]}))])),g=await g,a(),g);if(!d.value)throw vt({statusCode:404,statusMessage:"Page not found",fatal:!0});const S=d.value.seo?.title||d.value.title,A=d.value.seo?.description||d.value.description,j=J(ve(p?.value,d.value?.path)),D=q(()=>bt(p?.value,d.value?.path||""));kt({title:S,description:A,type:"article",modifiedAt:d.value.modifiedAt,breadcrumbs:D}),Ue(()=>p?.value,()=>{j.value=ve(p?.value,d.value?.path)||j.value});const U=q(()=>i.github?i.github:null),L=q(()=>{if(U.value)return[U.value.url,"edit",U.value.branch,U.value.rootDir,"content",`${d.value?.stem}.${d.value?.extension}`].filter(Boolean).join("/")});return Jt(`/raw${h.path}.md`),(_,Z)=>{const E=re,$=St,W=Ot,c=xt,P=De,n=Dt,T=Kt,C=Yt,N=It;return e(d)?(s(),k(N,{key:`page-${e(m)}`},{right:b(()=>[v(C,{page:e(d)},null,8,["page"])]),default:b(()=>[v(W,{title:e(d).title,description:e(d).description,headline:e(j),ui:{wrapper:"flex-row items-center flex-wrap justify-between"}},{links:b(()=>[(s(!0),w(R,null,Y(e(d).links,(z,ee)=>(s(),k(E,B({key:ee,size:"sm"},{ref_for:!0},z),null,16))),128)),v($)]),_:1},8,["title","description","headline"]),v(T,null,{default:b(()=>[e(d)?(s(),k(c,{key:0,value:e(d)},null,8,["value"])):x("",!0),e(U)?(s(),k(P,{key:1},{default:b(()=>[O("div",Qt,[v(E,{variant:"link",color:"neutral",to:e(L),target:"_blank",icon:"i-lucide-pen",ui:{leadingIcon:"size-4"}},{default:b(()=>[M(K(e(l)("docs.edit")),1)]),_:1},8,["to"]),e(U)?.url?(s(),w(R,{key:0},[O("span",null,K(e(l)("common.or")),1),v(E,{variant:"link",color:"neutral",to:`${e(U).url}/issues/new/choose`,target:"_blank",icon:"i-lucide-alert-circle",ui:{leadingIcon:"size-4"}},{default:b(()=>[M(K(e(l)("docs.report")),1)]),_:1},8,["to"])],64)):x("",!0)])]),_:1})):x("",!0),v(n,{surround:e(y)},null,8,["surround"])]),_:1})]),_:1})):x("",!0)}}});export{ia as default}; diff --git a/docus/dist/_nuxt/B2gqyXxK.js b/docus/dist/_nuxt/B2gqyXxK.js new file mode 100644 index 0000000..83d0330 --- /dev/null +++ b/docus/dist/_nuxt/B2gqyXxK.js @@ -0,0 +1,9 @@ +import{bK as q,bL as M,bM as R,G as U,H as B,bN as E,bO as _,d as D,o as g,a as x,p as m,q as W,m as P,s as a,W as I,bP as N,bQ as O,c as C,a0 as j,a1 as V,a4 as z,ar as G,e as A,B as f,bR as H,F as X,v as F,bS as $,bT as Q,bU as S,bV as Z,ac as k,f as T,bW as K,aQ as J,am as L,bX as Y}from"./B3fabVUf.js";var ee=0;function te(s){const i=new WeakMap,r=q();function c(n){if(s.mode!=="popLayout")return;const d=n.offsetParent,y=d instanceof HTMLElement&&d.offsetWidth||0,l={height:n.offsetHeight||0,width:n.offsetWidth||0,top:n.offsetTop,left:n.offsetLeft,right:0};l.right=y-l.width-l.left;const p=s.anchorX==="left"?`left: ${l.left}px`:`right: ${l.right}px`,h=`pop-${ee++}`;n.dataset.motionPopId=h;const e=document.createElement("style");r.value.nonce&&(e.nonce=r.value.nonce),i.set(n,e),document.head.appendChild(e),e.sheet&&e.sheet.insertRule(` + [data-motion-pop-id="${h}"] { + position: absolute !important; + width: ${l.width}px !important; + height: ${l.height}px !important; + top: ${l.top}px !important; + ${p} !important; + } + `)}function v(n){const d=i.get(n);d&&(i.delete(n),M.render(()=>{document.head.removeChild(d)}))}return{addPopStyle:c,removePopStyle:v}}var oe=0;function ae(s){const i=String(oe++),r=new Map,{addPopStyle:c,removePopStyle:v}=te(s);function n(e){const t=[],o=E.get(e);o&&e.getAttribute(_.motionAttribute)===i&&t.push(o);const u=Array.from(e.querySelectorAll(`[${_.motionAttribute}="${i}"]`));for(const w of u){const b=E.get(w);b&&t.push(b)}return t}function d(e,t){const o=r.get(e);o&&(o.remaining.delete(t),o.remaining.size===0&&l(o))}const y={initial:s.initial,custom:s.custom,presenceId:i,onMotionExitComplete:d};R(y),U(()=>{y.initial=void 0});function l(e){v(e.el),e.states.forEach(t=>{t.getSnapshot(t.options,!1)}),e.done(),r.delete(e.el),e.el?.isConnected?e.states[0]?.didUpdate():e.states.forEach(t=>{t.unmount()}),s.onExitComplete?.()}function p(e,t){n(e).forEach(o=>{o.setActive("exit",!1),o.getSnapshot(o.options,!0)}),t()}function h(e,t){y.custom=s.custom;const o=e,u=n(o);if(u.length===0){t(),s.onExitComplete?.();return}const w={remaining:new Set(u),states:u,done:t,el:o};r.set(o,w),c(o),u.forEach(b=>{b.presenceContainer=o,b.setActive("exit",!0),b.getSnapshot(b.options,!1)}),u[0]?.didUpdate()}return B(()=>{r.forEach(e=>{e.states.forEach(t=>{t.unmount()})}),r.clear()}),{enter:p,exit:h}}var ne=D({name:"AnimatePresence",inheritAttrs:!0,__name:"AnimatePresence",props:{mode:{default:"sync"},initial:{type:Boolean,default:!0},as:{},custom:{},onExitComplete:{},anchorX:{default:"left"}},setup(s){const i=s,{enter:r,exit:c}=ae(i),v=C(()=>i.mode!=="wait"?{tag:i.as}:{mode:i.mode==="wait"?"out-in":void 0});return(n,d)=>(g(),x(I(n.mode==="wait"?N:O),P(v.value,{appear:"",css:!1,onLeave:a(c),onEnter:a(r)}),{default:m(()=>[W(n.$slots,"default")]),_:3},16,["onLeave","onEnter"]))}}),se=ne;const ie={slots:{base:"rounded-md w-full",overlay:"fixed inset-0 bg-default/75 backdrop-blur-sm will-change-opacity",content:"fixed inset-0 flex items-center justify-center cursor-zoom-out focus:outline-none",zoomedImage:"w-full h-auto max-w-[95vw] max-h-[95vh] object-contain rounded-md"},variants:{zoom:{true:"will-change-transform"},open:{true:""}},compoundVariants:[{zoom:!0,open:!1,class:"cursor-zoom-in"}]},le=["onClick"],ue=Object.assign({inheritAttrs:!1},{__name:"ProseImg",props:{src:{type:String,required:!0},alt:{type:String,required:!0},width:{type:[String,Number],required:!1},height:{type:[String,Number],required:!1},class:{type:null,required:!1},zoom:{type:Boolean,required:!1,default:!0},ui:{type:Object,required:!1}},setup(s){const i=s,r=j(),c=V("prose.img",i),[v,n]=z(),[d,y]=z(),l=F(!1),p=C(()=>L({extend:L(ie),...r.ui?.prose?.img||{}})({zoom:i.zoom,open:l.value})),h=C(()=>K(i.src,J().app.baseURL)),e=C(()=>`${h.value}::${Y()}`);return i.zoom&&G(window,"scroll",()=>{l.value=!1}),(t,o)=>(g(),A(X,null,[f(a(v),null,{default:m(()=>[(g(),x(I(a($)),P({src:h.value,alt:s.alt,width:s.width,height:s.height},t.$attrs,{class:p.value.base({class:[a(c)?.base,i.class]})}),null,16,["src","alt","width","height","class"]))]),_:1}),f(a(d),null,{default:m(()=>[(g(),x(I(a($)),P({src:h.value,alt:s.alt},t.$attrs,{class:p.value.zoomedImage({class:[a(c)?.zoomedImage]})}),null,16,["src","alt","class"]))]),_:1}),s.zoom?(g(),x(a(H),{key:0,open:l.value,"onUpdate:open":o[0]||(o[0]=u=>l.value=u),modal:!1},{default:m(({close:u})=>[f(a(Q),{"as-child":""},{default:m(()=>[f(a(S),{"layout-id":e.value,"as-child":"",transition:{type:"spring",bounce:.15,duration:.5,ease:"easeInOut"}},{default:m(()=>[f(a(n))]),_:1},8,["layout-id"])]),_:1}),f(a(Z),null,{default:m(()=>[f(a(se),null,{default:m(()=>[l.value?(g(),x(a(S),{key:0,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},class:k(p.value.overlay({class:[a(c)?.overlay]}))},null,8,["class"])):T("",!0),l.value?(g(),A("div",{key:1,class:k(p.value.content({class:[a(c)?.content]})),onClick:u},[f(a(S),{"as-child":"","layout-id":e.value,transition:{type:"spring",bounce:.15,duration:.5,ease:"easeInOut"}},{default:m(()=>[f(a(y))]),_:1},8,["layout-id"])],10,le)):T("",!0)]),_:2},1024)]),_:2},1024)]),_:1},8,["open"])):(g(),x(a(n),{key:1}))],64))}});export{ue as default}; diff --git a/docus/dist/_nuxt/B3fabVUf.js b/docus/dist/_nuxt/B3fabVUf.js new file mode 100644 index 0000000..2999e23 --- /dev/null +++ b/docus/dist/_nuxt/B3fabVUf.js @@ -0,0 +1,41 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AFG10c_a.js","./DJxuwfoz.js","./n8vERajx.js","./BN_7HF1G.js","./Dq00p3Sb.js","./DzNJTbjO.js","./vaS8Rkl_.js","./Cf5i2Hk_.js","./Jc8Ntx_l.js","./CCiWmQwn.js","./CgQMWAWA.js","./DewHeYIb.js","./B6bUjJBd.js","./C-sCiTCq.js","./jpB_SM9d.js","./C5B99YjC.js","./Bnc4fItI.js","./B91fwRQf.js","./BnW3dU0n.js","./BLnzyn6S.js","./LZNkr4Qo.js","./C3Ly8WAT.js","./CG1YvYVw.js","./BnHu5O7o.js","./DXQrCARz.js","./C0AA5UMg.js","./CxBf5103.js"])))=>i.map(i=>d[i]); +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const u of r)if(u.type==="childList")for(const a of u.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&o(a)}).observe(document,{childList:!0,subtree:!0});function n(r){const u={};return r.integrity&&(u.integrity=r.integrity),r.referrerPolicy&&(u.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?u.credentials="include":r.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function o(r){if(r.ep)return;r.ep=!0;const u=n(r);fetch(r.href,u)}})();function bd(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Xe={},fu=[],io=()=>{},mg=()=>!1,Ja=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zi=e=>e.startsWith("onUpdate:"),Bt=Object.assign,Ed=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},r2=Object.prototype.hasOwnProperty,ot=(e,t)=>r2.call(e,t),De=Array.isArray,pu=e=>Iu(e)==="[object Map]",gg=e=>Iu(e)==="[object Set]",ip=e=>Iu(e)==="[object Date]",u2=e=>Iu(e)==="[object RegExp]",_e=e=>typeof e=="function",pt=e=>typeof e=="string",Dn=e=>typeof e=="symbol",Qe=e=>e!==null&&typeof e=="object",Cd=e=>(Qe(e)||_e(e))&&_e(e.then)&&_e(e.catch),vg=Object.prototype.toString,Iu=e=>vg.call(e),a2=e=>Iu(e).slice(8,-1),xd=e=>Iu(e)==="[object Object]",Xi=e=>pt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Or=bd(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ji=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},s2=/-\w/g,Ft=Ji(e=>e.replace(s2,t=>t.slice(1).toUpperCase())),i2=/\B([A-Z])/g,Lo=Ji(e=>e.replace(i2,"-$1").toLowerCase()),Qi=Ji(e=>e.charAt(0).toUpperCase()+e.slice(1)),hu=Ji(e=>e?`on${Qi(e)}`:""),Vt=(e,t)=>!Object.is(e,t),ya=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:o,value:n})},l2=e=>{const t=parseFloat(e);return isNaN(t)?e:t},bg=e=>{const t=pt(e)?Number(e):NaN;return isNaN(t)?e:t};let lp;const el=()=>lp||(lp=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function mn(e){if(De(e)){const t={};for(let n=0;n{if(n){const o=n.split(d2);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function U(e){let t="";if(pt(e))t=e;else if(De(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Fe=e=>pt(e)?e:e==null?"":De(e)||Qe(e)&&(e.toString===vg||!_e(e.toString))?Cg(e)?Fe(e.value):JSON.stringify(e,xg,2):String(e),xg=(e,t)=>Cg(t)?xg(e,t.value):pu(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[o,r],u)=>(n[Rl(o,u)+" =>"]=r,n),{})}:gg(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Rl(n))}:Dn(t)?Rl(t):Qe(t)&&!De(t)&&!xd(t)?String(t):t,Rl=(e,t="")=>{var n;return Dn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Wt;class wg{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Wt,!t&&Wt&&(this.index=(Wt.scopes||(Wt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Wt=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,o;for(n=0,o=this.effects.length;n0)return;if(Ea){let t=Ea;for(Ea=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ba;){let t=ba;for(ba=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(o){e||(e=o)}t=n}}if(e)throw e}function _g(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function kg(e){let t,n=e.depsTail,o=n;for(;o;){const r=o.prevDep;o.version===-1?(o===n&&(n=r),Bd(o),v2(o)):t=o,o.dep.activeLink=o.prevActiveLink,o.prevActiveLink=void 0,o=r}e.deps=t,e.depsTail=n}function $c(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Sg(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Sg(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ta)||(e.globalVersion=Ta,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!$c(e))))return;e.flags|=2;const t=e.dep,n=ct,o=Vn;ct=e,Vn=!0;try{_g(e);const r=e.fn(e._value);(t.version===0||Vt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ct=n,Vn=o,kg(e),e.flags&=-3}}function Bd(e,t=!1){const{dep:n,prevSub:o,nextSub:r}=e;if(o&&(o.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=o,e.nextSub=void 0),n.subs===e&&(n.subs=o,!o&&n.computed)){n.computed.flags&=-5;for(let u=n.computed.deps;u;u=u.nextDep)Bd(u,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function v2(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Vn=!0;const Tg=[];function Fo(){Tg.push(Vn),Vn=!1}function Po(){const e=Tg.pop();Vn=e===void 0?!0:e}function cp(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ct;ct=void 0;try{t()}finally{ct=n}}}let Ta=0;class y2{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class tl{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ct||!Vn||ct===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ct)n=this.activeLink=new y2(ct,this),ct.deps?(n.prevDep=ct.depsTail,ct.depsTail.nextDep=n,ct.depsTail=n):ct.deps=ct.depsTail=n,Fg(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const o=n.nextDep;o.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=o),n.prevDep=ct.depsTail,n.nextDep=void 0,ct.depsTail.nextDep=n,ct.depsTail=n,ct.deps===n&&(ct.deps=o)}return n}trigger(t){this.version++,Ta++,this.notify(t)}notify(t){Dd();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ad()}}}function Fg(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let o=t.deps;o;o=o.nextDep)Fg(o)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const pi=new WeakMap,Ir=Symbol(""),Nc=Symbol(""),Fa=Symbol("");function Gt(e,t,n){if(Vn&&ct){let o=pi.get(e);o||pi.set(e,o=new Map);let r=o.get(n);r||(o.set(n,r=new tl),r.map=o,r.key=n),r.track()}}function Bo(e,t,n,o,r,u){const a=pi.get(e);if(!a){Ta++;return}const s=i=>{i&&i.trigger()};if(Dd(),t==="clear")a.forEach(s);else{const i=De(e),c=i&&Xi(n);if(i&&n==="length"){const l=Number(o);a.forEach((d,p)=>{(p==="length"||p===Fa||!Dn(p)&&p>=l)&&s(d)})}else switch((n!==void 0||a.has(void 0))&&s(a.get(n)),c&&s(a.get(Fa)),t){case"add":i?c&&s(a.get("length")):(s(a.get(Ir)),pu(e)&&s(a.get(Nc)));break;case"delete":i||(s(a.get(Ir)),pu(e)&&s(a.get(Nc)));break;case"set":pu(e)&&s(a.get(Ir));break}}Ad()}function b2(e,t){const n=pi.get(e);return n&&n.get(t)}function nu(e){const t=He(e);return t===e?t:(Gt(t,"iterate",Fa),xn(e)?t:t.map(Un))}function nl(e){return Gt(e=He(e),"iterate",Fa),e}function ro(e,t){return fo(e)?Du(ur(e)?Un(t):t):Un(t)}const E2={__proto__:null,[Symbol.iterator](){return ql(this,Symbol.iterator,e=>ro(this,e))},concat(...e){return nu(this).concat(...e.map(t=>De(t)?nu(t):t))},entries(){return ql(this,"entries",e=>(e[1]=ro(this,e[1]),e))},every(e,t){return bo(this,"every",e,t,void 0,arguments)},filter(e,t){return bo(this,"filter",e,t,n=>n.map(o=>ro(this,o)),arguments)},find(e,t){return bo(this,"find",e,t,n=>ro(this,n),arguments)},findIndex(e,t){return bo(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return bo(this,"findLast",e,t,n=>ro(this,n),arguments)},findLastIndex(e,t){return bo(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return bo(this,"forEach",e,t,void 0,arguments)},includes(...e){return $l(this,"includes",e)},indexOf(...e){return $l(this,"indexOf",e)},join(e){return nu(this).join(e)},lastIndexOf(...e){return $l(this,"lastIndexOf",e)},map(e,t){return bo(this,"map",e,t,void 0,arguments)},pop(){return Qu(this,"pop")},push(...e){return Qu(this,"push",e)},reduce(e,...t){return dp(this,"reduce",e,t)},reduceRight(e,...t){return dp(this,"reduceRight",e,t)},shift(){return Qu(this,"shift")},some(e,t){return bo(this,"some",e,t,void 0,arguments)},splice(...e){return Qu(this,"splice",e)},toReversed(){return nu(this).toReversed()},toSorted(e){return nu(this).toSorted(e)},toSpliced(...e){return nu(this).toSpliced(...e)},unshift(...e){return Qu(this,"unshift",e)},values(){return ql(this,"values",e=>ro(this,e))}};function ql(e,t,n){const o=nl(e),r=o[t]();return o!==e&&!xn(e)&&(r._next=r.next,r.next=()=>{const u=r._next();return u.done||(u.value=n(u.value)),u}),r}const C2=Array.prototype;function bo(e,t,n,o,r,u){const a=nl(e),s=a!==e&&!xn(e),i=a[t];if(i!==C2[t]){const d=i.apply(e,u);return s?Un(d):d}let c=n;a!==e&&(s?c=function(d,p){return n.call(this,ro(e,d),p,e)}:n.length>2&&(c=function(d,p){return n.call(this,d,p,e)}));const l=i.call(a,c,o);return s&&r?r(l):l}function dp(e,t,n,o){const r=nl(e),u=r!==e&&!xn(e);let a=n,s=!1;r!==e&&(u?(s=o.length===0,a=function(c,l,d){return s&&(s=!1,c=ro(e,c)),n.call(this,c,ro(e,l),d,e)}):n.length>3&&(a=function(c,l,d){return n.call(this,c,l,d,e)}));const i=r[t](a,...o);return s?ro(e,i):i}function $l(e,t,n){const o=He(e);Gt(o,"iterate",Fa);const r=o[t](...n);return(r===-1||r===!1)&&ul(n[0])?(n[0]=He(n[0]),o[t](...n)):r}function Qu(e,t,n=[]){Fo(),Dd();const o=He(e)[t].apply(e,n);return Ad(),Po(),o}const x2=bd("__proto__,__v_isRef,__isVue"),Pg=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Dn));function w2(e){Dn(e)||(e=String(e));const t=He(this);return Gt(t,"has",e),t.hasOwnProperty(e)}class Mg{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,o){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,u=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return u;if(n==="__v_raw")return o===(r?u?$g:qg:u?Lg:Rg).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(o)?t:void 0;const a=De(t);if(!r){let i;if(a&&(i=E2[n]))return i;if(n==="hasOwnProperty")return w2}const s=Reflect.get(t,n,rt(t)?t:o);if((Dn(n)?Pg.has(n):x2(n))||(r||Gt(t,"get",n),u))return s;if(rt(s)){const i=a&&Xi(n)?s:s.value;return r&&Qe(i)?Mo(i):i}return Qe(s)?r?Mo(s):_t(s):s}}class Og extends Mg{constructor(t=!1){super(!1,t)}set(t,n,o,r){let u=t[n];const a=De(t)&&Xi(n);if(!this._isShallow){const c=fo(u);if(!xn(o)&&!fo(o)&&(u=He(u),o=He(o)),!a&&rt(u)&&!rt(o))return c||(u.value=o),!0}const s=a?Number(n)e,Cs=e=>Reflect.getPrototypeOf(e);function k2(e,t,n){return function(...o){const r=this.__v_raw,u=He(r),a=pu(u),s=e==="entries"||e===Symbol.iterator&&a,i=e==="keys"&&a,c=r[e](...o),l=n?jc:t?Du:Un;return!t&&Gt(u,"iterate",i?Nc:Ir),Bt(Object.create(c),{next(){const{value:d,done:p}=c.next();return p?{value:d,done:p}:{value:s?[l(d[0]),l(d[1])]:l(d),done:p}}})}}function xs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function S2(e,t){const n={get(r){const u=this.__v_raw,a=He(u),s=He(r);e||(Vt(r,s)&&Gt(a,"get",r),Gt(a,"get",s));const{has:i}=Cs(a),c=t?jc:e?Du:Un;if(i.call(a,r))return c(u.get(r));if(i.call(a,s))return c(u.get(s));u!==a&&u.get(r)},get size(){const r=this.__v_raw;return!e&&Gt(He(r),"iterate",Ir),r.size},has(r){const u=this.__v_raw,a=He(u),s=He(r);return e||(Vt(r,s)&&Gt(a,"has",r),Gt(a,"has",s)),r===s?u.has(r):u.has(r)||u.has(s)},forEach(r,u){const a=this,s=a.__v_raw,i=He(s),c=t?jc:e?Du:Un;return!e&&Gt(i,"iterate",Ir),s.forEach((l,d)=>r.call(u,c(l),c(d),a))}};return Bt(n,e?{add:xs("add"),set:xs("set"),delete:xs("delete"),clear:xs("clear")}:{add(r){const u=He(this),a=Cs(u),s=He(r),i=!t&&!xn(r)&&!fo(r)?s:r;return a.has.call(u,i)||Vt(r,i)&&a.has.call(u,r)||Vt(s,i)&&a.has.call(u,s)||(u.add(i),Bo(u,"add",i,i)),this},set(r,u){!t&&!xn(u)&&!fo(u)&&(u=He(u));const a=He(this),{has:s,get:i}=Cs(a);let c=s.call(a,r);c||(r=He(r),c=s.call(a,r));const l=i.call(a,r);return a.set(r,u),c?Vt(u,l)&&Bo(a,"set",r,u):Bo(a,"add",r,u),this},delete(r){const u=He(this),{has:a,get:s}=Cs(u);let i=a.call(u,r);i||(r=He(r),i=a.call(u,r)),s&&s.call(u,r);const c=u.delete(r);return i&&Bo(u,"delete",r,void 0),c},clear(){const r=He(this),u=r.size!==0,a=r.clear();return u&&Bo(r,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=k2(r,e,t)}),n}function ol(e,t){const n=S2(e,t);return(o,r,u)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?o:Reflect.get(ot(n,r)&&r in o?n:o,r,u)}const T2={get:ol(!1,!1)},F2={get:ol(!1,!0)},P2={get:ol(!0,!1)},M2={get:ol(!0,!0)},Rg=new WeakMap,Lg=new WeakMap,qg=new WeakMap,$g=new WeakMap;function O2(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function I2(e){return e.__v_skip||!Object.isExtensible(e)?0:O2(a2(e))}function _t(e){return fo(e)?e:rl(e,!1,D2,T2,Rg)}function Pn(e){return rl(e,!1,B2,F2,Lg)}function Mo(e){return rl(e,!0,A2,P2,qg)}function Br(e){return rl(e,!0,_2,M2,$g)}function rl(e,t,n,o,r){if(!Qe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const u=I2(e);if(u===0)return e;const a=r.get(e);if(a)return a;const s=new Proxy(e,u===2?o:n);return r.set(e,s),s}function ur(e){return fo(e)?ur(e.__v_raw):!!(e&&e.__v_isReactive)}function fo(e){return!!(e&&e.__v_isReadonly)}function xn(e){return!!(e&&e.__v_isShallow)}function ul(e){return e?!!e.__v_raw:!1}function He(e){const t=e&&e.__v_raw;return t?He(t):e}function _d(e){return!ot(e,"__v_skip")&&Object.isExtensible(e)&&yg(e,"__v_skip",!0),e}const Un=e=>Qe(e)?_t(e):e,Du=e=>Qe(e)?Mo(e):e;function rt(e){return e?e.__v_isRef===!0:!1}function R(e){return Ng(e,!1)}function Me(e){return Ng(e,!0)}function Ng(e,t){return rt(e)?e:new R2(e,t)}class R2{constructor(t,n){this.dep=new tl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:He(t),this._value=n?t:Un(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,o=this.__v_isShallow||xn(t)||fo(t);t=o?t:He(t),Vt(t,n)&&(this._rawValue=t,this._value=o?t:Un(t),this.dep.trigger())}}function jg(e){e.dep&&e.dep.trigger()}function f(e){return rt(e)?e.value:e}function ke(e){return _e(e)?e():f(e)}const L2={get:(e,t,n)=>t==="__v_raw"?e:f(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return rt(r)&&!rt(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function Vg(e){return ur(e)?e:new Proxy(e,L2)}class q2{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new tl,{get:o,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=o,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function es(e){return new q2(e)}function mt(e){const t=De(e)?new Array(e.length):{};for(const n in e)t[n]=zg(e,n);return t}class $2{constructor(t,n,o){this._object=t,this._defaultValue=o,this.__v_isRef=!0,this._value=void 0,this._key=Dn(n)?n:String(n),this._raw=He(t);let r=!0,u=t;if(!De(t)||Dn(this._key)||!Xi(this._key))do r=!ul(u)||xn(u);while(r&&(u=u.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=f(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&rt(this._raw[this._key])){const n=this._object[this._key];if(rt(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return b2(this._raw,this._key)}}class N2{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Ye(e,t,n){return rt(e)?e:_e(e)?new N2(e):Qe(e)&&arguments.length>1?zg(e,t,n):R(e)}function zg(e,t,n){return new $2(e,t,n)}class j2{constructor(t,n,o){this.fn=t,this.setter=n,this._value=void 0,this.dep=new tl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ta-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=o}notify(){if(this.flags|=16,!(this.flags&8)&&ct!==this)return Bg(this,!0),!0}get value(){const t=this.dep.track();return Sg(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function V2(e,t,n=!1){let o,r;return _e(e)?o=e:(o=e.get,r=e.set),new j2(o,r,n)}const ws={},hi=new WeakMap;let _r;function z2(e,t=!1,n=_r){if(n){let o=hi.get(n);o||hi.set(n,o=[]),o.push(e)}}function U2(e,t,n=Xe){const{immediate:o,deep:r,once:u,scheduler:a,augmentJob:s,call:i}=n,c=C=>r?C:xn(C)||r===!1||r===0?tr(C,1):tr(C);let l,d,p,h,m=!1,g=!1;if(rt(e)?(d=()=>e.value,m=xn(e)):ur(e)?(d=()=>c(e),m=!0):De(e)?(g=!0,m=e.some(C=>ur(C)||xn(C)),d=()=>e.map(C=>{if(rt(C))return C.value;if(ur(C))return c(C);if(_e(C))return i?i(C,2):C()})):_e(e)?t?d=i?()=>i(e,2):e:d=()=>{if(p){Fo();try{p()}finally{Po()}}const C=_r;_r=l;try{return i?i(e,3,[h]):e(h)}finally{_r=C}}:d=io,t&&r){const C=d,w=r===!0?1/0:r;d=()=>tr(C(),w)}const y=ho(),E=()=>{l.stop(),y&&y.active&&Ed(y.effects,l)};if(u&&t){const C=t;t=(...w)=>{C(...w),E()}}let b=g?new Array(e.length).fill(ws):ws;const v=C=>{if(!(!(l.flags&1)||!l.dirty&&!C))if(t){const w=l.run();if(r||m||(g?w.some((B,x)=>Vt(B,b[x])):Vt(w,b))){p&&p();const B=_r;_r=l;try{const x=[w,b===ws?void 0:g&&b[0]===ws?[]:b,h];b=w,i?i(t,3,x):t(...x)}finally{_r=B}}}else l.run()};return s&&s(v),l=new Dg(d),l.scheduler=a?()=>a(v,!1):v,h=C=>z2(C,!1,l),p=l.onStop=()=>{const C=hi.get(l);if(C){if(i)i(C,4);else for(const w of C)w();hi.delete(l)}},t?o?v(!0):b=l.run():a?a(v.bind(null,!0),!0):l.run(),E.pause=l.pause.bind(l),E.resume=l.resume.bind(l),E.stop=E,E}function tr(e,t=1/0,n){if(t<=0||!Qe(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,rt(e))tr(e.value,t,n);else if(De(e))for(let o=0;o{tr(o,t,n)});else if(xd(e)){for(const o in e)tr(e[o],t,n);for(const o of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,o)&&tr(e[o],t,n)}return e}function ts(e,t,n,o){try{return o?e(...o):e()}catch(r){Ru(r,t,n)}}function Hn(e,t,n,o){if(_e(e)){const r=ts(e,t,n,o);return r&&Cd(r)&&r.catch(u=>{Ru(u,t,n)}),r}if(De(e)){const r=[];for(let u=0;u>>1,r=nn[o],u=Ma(r);u=Ma(n)?nn.push(e):nn.splice(K2(t),0,e),e.flags|=1,Hg()}}function Hg(){mi||(mi=Ug.then(Kg))}function Pa(e){De(e)?mu.push(...e):Qo&&e.id===-1?Qo.splice(uu+1,0,e):e.flags&1||(mu.push(e),e.flags|=1),Hg()}function fp(e,t,n=to+1){for(;nMa(n)-Ma(o));if(mu.length=0,Qo){Qo.push(...t);return}for(Qo=t,uu=0;uue.id==null?e.flags&2?-1:1/0:e.id;function Kg(e){try{for(to=0;to{o._d&&xi(-1);const u=vi(t);let a;try{a=e(...r)}finally{vi(u),o._d&&xi(1)}return a};return o._n=!0,o._c=!0,o._d=!0,o}function no(e,t,n,o){const r=e.dirs,u=t&&t.dirs;for(let a=0;a1)return n&&_e(t)?t.call(o&&o.proxy):t}}function Lu(){return!!(We()||Rr)}const W2=Symbol.for("v-scx"),G2=()=>Ue(W2);function Ze(e,t){return ns(e,null,t)}function Gg(e,t){return ns(e,null,{flush:"post"})}function Yg(e,t){return ns(e,null,{flush:"sync"})}function ye(e,t,n){return ns(e,t,n)}function ns(e,t,n=Xe){const{immediate:o,deep:r,flush:u,once:a}=n,s=Bt({},n),i=t&&o||!t&&u!=="post";let c;if(zr){if(u==="sync"){const h=G2();c=h.__watcherHandles||(h.__watcherHandles=[])}else if(!i){const h=()=>{};return h.stop=io,h.resume=io,h.pause=io,h}}const l=zt;s.call=(h,m,g)=>Hn(h,l,m,g);let d=!1;u==="post"?s.scheduler=h=>{kt(h,l&&l.suspense)}:u!=="sync"&&(d=!0,s.scheduler=(h,m)=>{m?h():kd(h)}),s.augmentJob=h=>{t&&(h.flags|=4),d&&(h.flags|=2,l&&(h.id=l.uid,h.i=l))};const p=U2(e,t,s);return zr&&(c?c.push(p):i&&p()),p}function Y2(e,t,n){const o=this.proxy,r=pt(e)?e.includes(".")?Zg(o,e):()=>o[e]:e.bind(o,o);let u;_e(t)?u=t:(u=t.handler,n=t);const a=qu(this),s=ns(r,u.bind(o),n);return a(),s}function Zg(e,t){const n=t.split(".");return()=>{let o=e;for(let r=0;re.__isTeleport,Tr=e=>e&&(e.disabled||e.disabled===""),Z2=e=>e&&(e.defer||e.defer===""),pp=e=>typeof SVGElement<"u"&&e instanceof SVGElement,hp=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Vc=(e,t)=>{const n=e&&e.to;return pt(n)?t?t(n):null:n},X2={name:"Teleport",__isTeleport:!0,process(e,t,n,o,r,u,a,s,i,c){const{mc:l,pc:d,pbc:p,o:{insert:h,querySelector:m,createText:g,createComment:y}}=c,E=Tr(t.props);let{dynamicChildren:b}=t;const v=(B,x,_)=>{B.shapeFlag&16&&l(B.children,x,_,r,u,a,s,i)},C=(B=t)=>{const x=Tr(B.props),_=B.target=Vc(B.props,m),S=zc(_,B,g,h);_&&(a!=="svg"&&pp(_)?a="svg":a!=="mathml"&&hp(_)&&(a="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(_),x||(v(B,_,S),fa(B,!1)))},w=B=>{const x=()=>{yr.get(B)===x&&(yr.delete(B),Tr(B.props)&&(v(B,n,B.anchor),fa(B,!0)),C(B))};yr.set(B,x),kt(x,u)};if(e==null){const B=t.el=g(""),x=t.anchor=g("");if(h(B,n,o),h(x,n,o),Z2(t.props)||u&&u.pendingBranch){w(t);return}E&&(v(t,n,x),fa(t,!0)),C()}else{t.el=e.el;const B=t.anchor=e.anchor,x=yr.get(e);if(x){x.flags|=8,yr.delete(e),w(t);return}t.targetStart=e.targetStart;const _=t.target=e.target,S=t.targetAnchor=e.targetAnchor,O=Tr(e.props),H=O?n:_,N=O?B:S;if(a==="svg"||pp(_)?a="svg":(a==="mathml"||hp(_))&&(a="mathml"),b?(p(e.dynamicChildren,b,H,r,u,a,s),Id(e,t,!0)):i||d(e,t,H,N,r,u,a,s,!1),E)O?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Ds(t,n,B,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const J=t.target=Vc(t.props,m);J&&Ds(t,J,null,c,0)}else O&&Ds(t,_,S,c,1);fa(t,E)}},remove(e,t,n,{um:o,o:{remove:r}},u){const{shapeFlag:a,children:s,anchor:i,targetStart:c,targetAnchor:l,target:d,props:p}=e;let h=u||!Tr(p);const m=yr.get(e);if(m&&(m.flags|=8,yr.delete(e),h=!1),d&&(r(c),r(l)),u&&r(i),a&16)for(let g=0;g{e.isMounted=!0}),mo(()=>{e.isUnmounting=!0}),e}const kn=[Function,Array],ev={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:kn,onEnter:kn,onAfterEnter:kn,onEnterCancelled:kn,onBeforeLeave:kn,onLeave:kn,onAfterLeave:kn,onLeaveCancelled:kn,onBeforeAppear:kn,onAppear:kn,onAfterAppear:kn,onAppearCancelled:kn},tv=e=>{const t=e.subTree;return t.component?tv(t.component):t},Q2={name:"BaseTransition",props:ev,setup(e,{slots:t}){const n=We(),o=Qg();return()=>{const r=t.default&&Sd(t.default(),!0);if(!r||!r.length)return;const u=nv(r),a=He(e),{mode:s}=a;if(o.isLeaving)return Nl(u);const i=mp(u);if(!i)return Nl(u);let c=Oa(i,a,o,n,d=>c=d);i.type!==bt&&lr(i,c);let l=n.subTree&&mp(n.subTree);if(l&&l.type!==bt&&!jn(l,i)&&tv(n).type!==bt){let d=Oa(l,a,o,n);if(lr(l,d),s==="out-in"&&i.type!==bt)return o.isLeaving=!0,d.afterLeave=()=>{o.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,l=void 0},Nl(u);s==="in-out"&&i.type!==bt?d.delayLeave=(p,h,m)=>{const g=ov(o,l);g[String(l.key)]=l,p[oo]=()=>{h(),p[oo]=void 0,delete c.delayedLeave,l=void 0},c.delayedLeave=()=>{m(),delete c.delayedLeave,l=void 0}}:l=void 0}else l&&(l=void 0);return u}}};function nv(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==bt){t=n;break}}return t}const eC=Q2;function ov(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function Oa(e,t,n,o,r){const{appear:u,mode:a,persisted:s=!1,onBeforeEnter:i,onEnter:c,onAfterEnter:l,onEnterCancelled:d,onBeforeLeave:p,onLeave:h,onAfterLeave:m,onLeaveCancelled:g,onBeforeAppear:y,onAppear:E,onAfterAppear:b,onAppearCancelled:v}=t,C=String(e.key),w=ov(n,e),B=(S,O)=>{S&&Hn(S,o,9,O)},x=(S,O)=>{const H=O[1];B(S,O),De(S)?S.every(N=>N.length<=1)&&H():S.length<=1&&H()},_={mode:a,persisted:s,beforeEnter(S){let O=i;if(!n.isMounted)if(u)O=y||i;else return;S[oo]&&S[oo](!0);const H=w[C];H&&jn(e,H)&&H.el[oo]&&H.el[oo](),B(O,[S])},enter(S){if(w[C]===e)return;let O=c,H=l,N=d;if(!n.isMounted)if(u)O=E||c,H=b||l,N=v||d;else return;let J=!1;S[ea]=$=>{J||(J=!0,$?B(N,[S]):B(H,[S]),_.delayedLeave&&_.delayedLeave(),S[ea]=void 0)};const G=S[ea].bind(null,!1);O?x(O,[S,G]):G()},leave(S,O){const H=String(e.key);if(S[ea]&&S[ea](!0),n.isUnmounting)return O();B(p,[S]);let N=!1;S[oo]=G=>{N||(N=!0,O(),G?B(g,[S]):B(m,[S]),S[oo]=void 0,w[H]===e&&delete w[H])};const J=S[oo].bind(null,!1);w[H]=e,h?x(h,[S,J]):J()},clone(S){const O=Oa(S,t,n,o,r);return r&&r(O),O}};return _}function Nl(e){if(rs(e))return e=An(e),e.children=null,e}function mp(e){if(!rs(e))return Jg(e.type)&&e.children?nv(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&_e(n.default))return n.default()}}function lr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,lr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Sd(e,t=!1,n){let o=[],r=0;for(let u=0;u1)for(let u=0;un.value,set:u=>n.value=u})}return n}function gp(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const yi=new WeakMap;function gu(e,t,n,o,r=!1){if(De(e)){e.forEach((g,y)=>gu(g,t&&(De(t)?t[y]:t),n,o,r));return}if(So(o)&&!r){o.shapeFlag&512&&o.type.__asyncResolved&&o.component.subTree.component&&gu(e,t,n,o.component.subTree);return}const u=o.shapeFlag&4?qd(o.component):o.el,a=r?null:u,{i:s,r:i}=e,c=t&&t.r,l=s.refs===Xe?s.refs={}:s.refs,d=s.setupState,p=He(d),h=d===Xe?mg:g=>gp(l,g)?!1:ot(p,g),m=(g,y)=>!(y&&gp(l,y));if(c!=null&&c!==i){if(vp(t),pt(c))l[c]=null,h(c)&&(d[c]=null);else if(rt(c)){const g=t;m(c,g.k)&&(c.value=null),g.k&&(l[g.k]=null)}}if(_e(i))ts(i,s,12,[a,l]);else{const g=pt(i),y=rt(i);if(g||y){const E=()=>{if(e.f){const b=g?h(i)?d[i]:l[i]:m()||!e.k?i.value:l[e.k];if(r)De(b)&&Ed(b,u);else if(De(b))b.includes(u)||b.push(u);else if(g)l[i]=[u],h(i)&&(d[i]=l[i]);else{const v=[u];m(i,e.k)&&(i.value=v),e.k&&(l[e.k]=v)}}else g?(l[i]=a,h(i)&&(d[i]=a)):y&&(m(i,e.k)&&(i.value=a),e.k&&(l[e.k]=a))};if(a){const b=()=>{E(),yi.delete(e)};b.id=-1,yi.set(e,b),kt(b,n)}else vp(e),E()}}}function vp(e){const t=yi.get(e);t&&(t.flags|=8,yi.delete(e))}let yp=!1;const ou=()=>{yp||(console.error("Hydration completed but contains mismatches."),yp=!0)},tC=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",nC=e=>e.namespaceURI.includes("MathML"),As=e=>{if(e.nodeType===1){if(tC(e))return"svg";if(nC(e))return"mathml"}},lu=e=>e.nodeType===8;function oC(e){const{mt:t,p:n,o:{patchProp:o,createText:r,nextSibling:u,parentNode:a,remove:s,insert:i,createComment:c}}=e,l=(v,C)=>{if(!C.hasChildNodes()){n(null,v,C),gi(),C._vnode=v;return}d(C.firstChild,v,null,null,null),gi(),C._vnode=v},d=(v,C,w,B,x,_=!1)=>{_=_||!!C.dynamicChildren;const S=lu(v)&&v.data==="[",O=()=>g(v,C,w,B,x,S),{type:H,ref:N,shapeFlag:J,patchFlag:G}=C;let $=v.nodeType;C.el=v,G===-2&&(_=!1,C.dynamicChildren=null);let I=null;switch(H){case Lr:$!==3?C.children===""?(i(C.el=r(""),a(v),v),I=v):I=O():(v.data!==C.children&&(ou(),v.data=C.children),I=u(v));break;case bt:b(v)?(I=u(v),E(C.el=v.content.firstChild,v,w)):$!==8||S?I=O():I=u(v);break;case Qs:if(S&&(v=u(v),$=v.nodeType),$===1||$===3){I=v;const W=!C.children.length;for(let K=0;K{_=_||!!C.dynamicChildren;const{type:S,props:O,patchFlag:H,shapeFlag:N,dirs:J,transition:G}=C,$=S==="input"||S==="option";if($||H!==-1){J&&no(C,null,w,"created");let I=!1;if(b(v)){I=Iv(null,G)&&w&&w.vnode.props&&w.vnode.props.appear;const K=v.content.firstChild;if(I){const de=K.getAttribute("class");de&&(K.$cls=de),G.beforeEnter(K)}E(K,v,w),C.el=v=K}if(N&16&&!(O&&(O.innerHTML||O.textContent))){let K=h(v.firstChild,C,v,w,B,x,_);for(;K;){Bs(v,1)||ou();const de=K;K=K.nextSibling,s(de)}}else if(N&8){let K=C.children;K[0]===` +`&&(v.tagName==="PRE"||v.tagName==="TEXTAREA")&&(K=K.slice(1));const{textContent:de}=v;de!==K&&de!==K.replace(/\r\n|\r/g,` +`)&&(Bs(v,0)||ou(),v.textContent=C.children)}if(O){if($||!_||H&48){const K=v.tagName.includes("-");for(const de in O)($&&(de.endsWith("value")||de==="indeterminate")||Ja(de)&&!Or(de)||de[0]==="."||K&&!Or(de))&&o(v,de,null,O[de],void 0,w)}else if(O.onClick)o(v,"onClick",null,O.onClick,void 0,w);else if(H&4&&ur(O.style))for(const K in O.style)O.style[K]}let W;(W=O&&O.onVnodeBeforeMount)&&pn(W,w,C),J&&no(C,null,w,"beforeMount"),((W=O&&O.onVnodeMounted)||J||I)&&$v(()=>{W&&pn(W,w,C),I&&G.enter(v),J&&no(C,null,w,"mounted")},B)}return v.nextSibling},h=(v,C,w,B,x,_,S)=>{S=S||!!C.dynamicChildren;const O=C.children,H=O.length;for(let N=0;N{const{slotScopeIds:S}=C;S&&(x=x?x.concat(S):S);const O=a(v),H=h(u(v),C,O,w,B,x,_);return H&&lu(H)&&H.data==="]"?u(C.anchor=H):(ou(),i(C.anchor=c("]"),O,H),H)},g=(v,C,w,B,x,_)=>{if(Bs(v.parentElement,1)||ou(),C.el=null,_){const H=y(v);for(;;){const N=u(v);if(N&&N!==H)s(N);else break}}const S=u(v),O=a(v);return s(v),n(null,C,O,S,w,B,As(O),x),w&&(w.vnode.el=C.el,il(w,C.el)),S},y=(v,C="[",w="]")=>{let B=0;for(;v;)if(v=u(v),v&&lu(v)&&(v.data===C&&B++,v.data===w)){if(B===0)return u(v);B--}return v},E=(v,C,w)=>{const B=C.parentNode;B&&B.replaceChild(v,C);let x=w;for(;x;)x.vnode.el===C&&(x.vnode.el=x.subTree.el=v),x=x.parent},b=v=>v.nodeType===1&&v.tagName==="TEMPLATE";return[l,d]}const bp="data-allow-mismatch",rC={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Bs(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(bp);)e=e.parentElement;const n=e&&e.getAttribute(bp);if(n==null)return!1;if(n==="")return!0;{const o=n.split(",");return t===0&&o.includes("children")?!0:o.includes(rC[t])}}el().requestIdleCallback;el().cancelIdleCallback;function uC(e,t){if(lu(e)&&e.data==="["){let n=1,o=e.nextSibling;for(;o;){if(o.nodeType===1){if(t(o)===!1)break}else if(lu(o))if(o.data==="]"){if(--n===0)break}else o.data==="["&&n++;o=o.nextSibling}}else t(e)}const So=e=>!!e.type.__asyncLoader;function Ae(e){_e(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:o,delay:r=200,hydrate:u,timeout:a,suspensible:s=!0,onError:i}=e;let c=null,l,d=0;const p=()=>(d++,c=null,h()),h=()=>{let m;return c||(m=c=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),i)return new Promise((y,E)=>{i(g,()=>y(p()),()=>E(g),d+1)});throw g}).then(g=>m!==c&&c?c:(g&&(g.__esModule||g[Symbol.toStringTag]==="Module")&&(g=g.default),l=g,g)))};return L({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(m,g,y){let E=!1;(g.bu||(g.bu=[])).push(()=>E=!0);const b=()=>{E||y()},v=u?()=>{const C=u(b,w=>uC(m,w));C&&(g.bum||(g.bum=[])).push(C)}:b;l?v():h().then(()=>!g.isUnmounted&&v())},get __asyncResolved(){return l},setup(){const m=zt;if(Fd(m),l)return()=>_s(l,m);const g=v=>{c=null,Ru(v,m,13,!o)};if(s&&m.suspense||zr)return h().then(v=>()=>_s(v,m)).catch(v=>(g(v),()=>o?q(o,{error:v}):null));const y=R(!1),E=R(),b=R(!!r);return r&&setTimeout(()=>{b.value=!1},r),a!=null&&setTimeout(()=>{if(!y.value&&!E.value){const v=new Error(`Async component timed out after ${a}ms.`);g(v),E.value=v}},a),h().then(()=>{y.value=!0,m.parent&&rs(m.parent.vnode)&&m.parent.update()}).catch(v=>{g(v),E.value=v}),()=>{if(y.value&&l)return _s(l,m);if(E.value&&o)return q(o,{error:E.value});if(n&&!b.value)return _s(n,m)}}})}function _s(e,t){const{ref:n,props:o,children:r,ce:u}=t.vnode,a=q(e,o,r);return a.ref=n,a.ce=u,delete t.vnode.ce,a}const rs=e=>e.type.__isKeepAlive,aC={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=We(),o=n.ctx;if(!o.renderer)return()=>{const b=t.default&&t.default();return b&&b.length===1?b[0]:b};const r=new Map,u=new Set;let a=null;const s=n.suspense,{renderer:{p:i,m:c,um:l,o:{createElement:d}}}=o,p=d("div");o.activate=(b,v,C,w,B)=>{const x=b.component;c(b,v,C,0,s),i(x.vnode,b,v,C,x,s,w,b.slotScopeIds,B),kt(()=>{x.isDeactivated=!1,x.a&&ya(x.a);const _=b.props&&b.props.onVnodeMounted;_&&pn(_,x.parent,b)},s)},o.deactivate=b=>{const v=b.component;Ei(v.m),Ei(v.a),c(b,p,null,1,s),kt(()=>{v.da&&ya(v.da);const C=b.props&&b.props.onVnodeUnmounted;C&&pn(C,v.parent,b),v.isDeactivated=!0},s)};function h(b){jl(b),l(b,n,s,!0)}function m(b){r.forEach((v,C)=>{const w=Zc(So(v)?v.type.__asyncResolved||{}:v.type);w&&!b(w)&&g(C)})}function g(b){const v=r.get(b);v&&(!a||!jn(v,a))?h(v):a&&jl(a),r.delete(b),u.delete(b)}ye(()=>[e.include,e.exclude],([b,v])=>{b&&m(C=>pa(b,C)),v&&m(C=>!pa(v,C))},{flush:"post",deep:!0});let y=null;const E=()=>{y!=null&&(Ci(n.subTree.type)?kt(()=>{r.set(y,ks(n.subTree))},n.subTree.suspense):r.set(y,ks(n.subTree)))};return $e(E),Gr(E),mo(()=>{r.forEach(b=>{const{subTree:v,suspense:C}=n,w=ks(v);if(b.type===w.type&&b.key===w.key){jl(w);const B=w.component.da;B&&kt(B,C);return}h(b)})}),()=>{if(y=null,!t.default)return a=null;const b=t.default(),v=b[0];if(b.length>1)return a=null,b;if(!Vr(v)||!(v.shapeFlag&4)&&!(v.shapeFlag&128))return a=null,v;let C=ks(v);if(C.type===bt)return a=null,C;const w=C.type,B=Zc(So(C)?C.type.__asyncResolved||{}:w),{include:x,exclude:_,max:S}=e;if(x&&(!B||!pa(x,B))||_&&B&&pa(_,B))return C.shapeFlag&=-257,a=C,v;const O=C.key==null?w:C.key,H=r.get(O);return C.el&&(C=An(C),v.shapeFlag&128&&(v.ssContent=C)),y=O,H?(C.el=H.el,C.component=H.component,C.transition&&lr(C,C.transition),C.shapeFlag|=512,u.delete(O),u.add(O)):(u.add(O),S&&u.size>parseInt(S,10)&&g(u.values().next().value)),C.shapeFlag|=256,a=C,Ci(v.type)?v:C}}},sC=aC;function pa(e,t){return De(e)?e.some(n=>pa(n,t)):pt(e)?e.split(",").includes(t):u2(e)?(e.lastIndex=0,e.test(t)):!1}function uv(e,t){sv(e,"a",t)}function av(e,t){sv(e,"da",t)}function sv(e,t,n=zt){const o=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(al(t,o,n),n){let r=n.parent;for(;r&&r.parent;)rs(r.parent.vnode)&&iC(o,t,n,r),r=r.parent}}function iC(e,t,n,o){const r=al(t,e,o,!0);Ht(()=>{Ed(o[t],r)},n)}function jl(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ks(e){return e.shapeFlag&128?e.ssContent:e}function al(e,t,n=zt,o=!1){if(n){const r=n[e]||(n[e]=[]),u=t.__weh||(t.__weh=(...a)=>{Fo();const s=qu(n),i=Hn(t,n,e,a);return s(),Po(),i});return o?r.unshift(u):r.push(u),u}}const qo=e=>(t,n=zt)=>{(!zr||e==="sp")&&al(e,(...o)=>t(...o),n)},Pd=qo("bm"),$e=qo("m"),iv=qo("bu"),Gr=qo("u"),mo=qo("bum"),Ht=qo("um"),lC=qo("sp"),cC=qo("rtg"),dC=qo("rtc");function lv(e,t=zt){al("ec",e,t)}const cv="components";function Ep(e,t){return fv(cv,e,!0,t)||e}const dv=Symbol.for("v-ndc");function Rt(e){return pt(e)?fv(cv,e,!1)||e:e||dv}function fv(e,t,n=!0,o=!1){const r=on||zt;if(r){const u=r.type;{const s=Zc(u,!1);if(s&&(s===t||s===Ft(t)||s===Qi(Ft(t))))return u}const a=Cp(r[e]||u[e],t)||Cp(r.appContext[e],t);return!a&&o?u:a}}function Cp(e,t){return e&&(e[t]||e[Ft(t)]||e[Qi(Ft(t))])}function yt(e,t,n,o){let r;const u=n,a=De(e);if(a||pt(e)){const s=a&&ur(e);let i=!1,c=!1;s&&(i=!xn(e),c=fo(e),e=nl(e)),r=new Array(e.length);for(let l=0,d=e.length;lt(s,i,void 0,u));else{const s=Object.keys(e);r=new Array(s.length);for(let i=0,c=s.length;i{const u=o.fn(...r);return u&&(u.key=o.key),u}:o.fn)}return e}function P(e,t,n={},o,r){if(on.ce||on.parent&&So(on.parent)&&on.parent.ce){const c=Object.keys(n).length>0;return t!=="default"&&(n.name=t),D(),k(Ce,null,[q("slot",n,o&&o())],c?-2:64)}let u=e[t];u&&u._c&&(u._d=!1),D();const a=u&&pv(u(n)),s=n.key||a&&a.key,i=k(Ce,{key:(s&&!Dn(s)?s:`_${t}`)+(!a&&o?"_fb":"")},a||(o?o():[]),a&&e._===1?64:-2);return!r&&i.scopeId&&(i.slotScopeIds=[i.scopeId+"-s"]),u&&u._c&&(u._d=!0),i}function pv(e){return e.some(t=>Vr(t)?!(t.type===bt||t.type===Ce&&!pv(t.children)):!0)?e:null}function as(e,t){const n={};for(const o in e)n[hu(o)]=e[o];return n}const Uc=e=>e?zv(e)?qd(e):Uc(e.parent):null,Ca=Bt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Uc(e.parent),$root:e=>Uc(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ev(e),$forceUpdate:e=>e.f||(e.f=()=>{kd(e.update)}),$nextTick:e=>e.n||(e.n=Oe.bind(e.proxy)),$watch:e=>Y2.bind(e)}),Vl=(e,t)=>e!==Xe&&!e.__isScriptSetup&&ot(e,t),fC={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:o,data:r,props:u,accessCache:a,type:s,appContext:i}=e;if(t[0]!=="$"){const p=a[t];if(p!==void 0)switch(p){case 1:return o[t];case 2:return r[t];case 4:return n[t];case 3:return u[t]}else{if(Vl(o,t))return a[t]=1,o[t];if(r!==Xe&&ot(r,t))return a[t]=2,r[t];if(ot(u,t))return a[t]=3,u[t];if(n!==Xe&&ot(n,t))return a[t]=4,n[t];Hc&&(a[t]=0)}}const c=Ca[t];let l,d;if(c)return t==="$attrs"&&Gt(e.attrs,"get",""),c(e);if((l=s.__cssModules)&&(l=l[t]))return l;if(n!==Xe&&ot(n,t))return a[t]=4,n[t];if(d=i.config.globalProperties,ot(d,t))return d[t]},set({_:e},t,n){const{data:o,setupState:r,ctx:u}=e;return Vl(r,t)?(r[t]=n,!0):o!==Xe&&ot(o,t)?(o[t]=n,!0):ot(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(u[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,props:u,type:a}},s){let i;return!!(n[s]||e!==Xe&&s[0]!=="$"&&ot(e,s)||Vl(t,s)||ot(u,s)||ot(o,s)||ot(Ca,s)||ot(r.config.globalProperties,s)||(i=a.__cssModules)&&i[s])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ot(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function qt(){return mv().slots}function hv(){return mv().attrs}function mv(e){const t=We();return t.setupContext||(t.setupContext=Hv(t))}function Ia(e){return De(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function gv(e,t){const n=Ia(e);for(const o in t){if(o.startsWith("__skip"))continue;let r=n[o];r?De(r)||_e(r)?r=n[o]={type:r,default:t[o]}:r.default=t[o]:r===null&&(r=n[o]={default:t[o]}),r&&t[`__skip_${o}`]&&(r.skipFactory=!0)}return n}function vv(e,t){return!e||!t?e||t:De(e)&&De(t)?e.concat(t):Bt({},Ia(e),Ia(t))}function yv(e){const t=We(),n=zr;let o=e();La(),n&&yu(!1);const r=()=>{qu(t),n&&yu(!0)},u=()=>{We()!==t&&t.scope.off(),La(),n&&yu(!1)};return Cd(o)&&(o=o.catch(a=>{throw r(),Promise.resolve().then(()=>Promise.resolve().then(u)),a})),[o,()=>{r(),Promise.resolve().then(u)}]}let Hc=!0;function pC(e){const t=Ev(e),n=e.proxy,o=e.ctx;Hc=!1,t.beforeCreate&&xp(t.beforeCreate,e,"bc");const{data:r,computed:u,methods:a,watch:s,provide:i,inject:c,created:l,beforeMount:d,mounted:p,beforeUpdate:h,updated:m,activated:g,deactivated:y,beforeDestroy:E,beforeUnmount:b,destroyed:v,unmounted:C,render:w,renderTracked:B,renderTriggered:x,errorCaptured:_,serverPrefetch:S,expose:O,inheritAttrs:H,components:N,directives:J,filters:G}=t;if(c&&hC(c,o,null),a)for(const W in a){const K=a[W];_e(K)&&(o[W]=K.bind(n))}if(r){const W=r.call(n,n);Qe(W)&&(e.data=_t(W))}if(Hc=!0,u)for(const W in u){const K=u[W],de=_e(K)?K.bind(n,n):_e(K.get)?K.get.bind(n,n):io,le=!_e(K)&&_e(K.set)?K.set.bind(n):io,ut=F({get:de,set:le});Object.defineProperty(o,W,{enumerable:!0,configurable:!0,get:()=>ut.value,set:Ve=>ut.value=Ve})}if(s)for(const W in s)bv(s[W],o,n,W);if(i){const W=_e(i)?i.call(n):i;Reflect.ownKeys(W).forEach(K=>{Pt(K,W[K])})}l&&xp(l,e,"c");function I(W,K){De(K)?K.forEach(de=>W(de.bind(n))):K&&W(K.bind(n))}if(I(Pd,d),I($e,p),I(iv,h),I(Gr,m),I(uv,g),I(av,y),I(lv,_),I(dC,B),I(cC,x),I(mo,b),I(Ht,C),I(lC,S),De(O))if(O.length){const W=e.exposed||(e.exposed={});O.forEach(K=>{Object.defineProperty(W,K,{get:()=>n[K],set:de=>n[K]=de,enumerable:!0})})}else e.exposed||(e.exposed={});w&&e.render===io&&(e.render=w),H!=null&&(e.inheritAttrs=H),N&&(e.components=N),J&&(e.directives=J),S&&Fd(e)}function hC(e,t,n=io){De(e)&&(e=Kc(e));for(const o in e){const r=e[o];let u;Qe(r)?"default"in r?u=Ue(r.from||o,r.default,!0):u=Ue(r.from||o):u=Ue(r),rt(u)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>u.value,set:a=>u.value=a}):t[o]=u}}function xp(e,t,n){Hn(De(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,n)}function bv(e,t,n,o){let r=o.includes(".")?Zg(n,o):()=>n[o];if(pt(e)){const u=t[e];_e(u)&&ye(r,u)}else if(_e(e))ye(r,e.bind(n));else if(Qe(e))if(De(e))e.forEach(u=>bv(u,t,n,o));else{const u=_e(e.handler)?e.handler.bind(n):t[e.handler];_e(u)&&ye(r,u,e)}}function Ev(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:r,optionsCache:u,config:{optionMergeStrategies:a}}=e.appContext,s=u.get(t);let i;return s?i=s:!r.length&&!n&&!o?i=t:(i={},r.length&&r.forEach(c=>bi(i,c,a,!0)),bi(i,t,a)),Qe(t)&&u.set(t,i),i}function bi(e,t,n,o=!1){const{mixins:r,extends:u}=t;u&&bi(e,u,n,!0),r&&r.forEach(a=>bi(e,a,n,!0));for(const a in t)if(!(o&&a==="expose")){const s=mC[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const mC={data:wp,props:Dp,emits:Dp,methods:ha,computed:ha,beforeCreate:en,created:en,beforeMount:en,mounted:en,beforeUpdate:en,updated:en,beforeDestroy:en,beforeUnmount:en,destroyed:en,unmounted:en,activated:en,deactivated:en,errorCaptured:en,serverPrefetch:en,components:ha,directives:ha,watch:vC,provide:wp,inject:gC};function wp(e,t){return t?e?function(){return Bt(_e(e)?e.call(this,this):e,_e(t)?t.call(this,this):t)}:t:e}function gC(e,t){return ha(Kc(e),Kc(t))}function Kc(e){if(De(e)){const t={};for(let n=0;n{let l,d=Xe,p;return Yg(()=>{const h=e[r];Vt(l,h)&&(l=h,c())}),{get(){return i(),n.get?n.get(l):l},set(h){const m=n.set?n.set(h):h;if(!Vt(m,l)&&!(d!==Xe&&Vt(h,d)))return;const g=o.vnode.props;g&&(t in g||r in g||u in g)&&(`onUpdate:${t}`in g||`onUpdate:${r}`in g||`onUpdate:${u}`in g)||(l=h,c()),o.emit(`update:${t}`,m),Vt(h,m)&&Vt(h,d)&&!Vt(m,p)&&c(),d=h,p=m}}});return s[Symbol.iterator]=()=>{let i=0;return{next(){return i<2?{value:i++?a||Xe:s,done:!1}:{done:!0}}}},s}const wv=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ft(t)}Modifiers`]||e[`${Lo(t)}Modifiers`];function EC(e,t,...n){if(e.isUnmounted)return;const o=e.vnode.props||Xe;let r=n;const u=t.startsWith("update:"),a=u&&wv(o,t.slice(7));a&&(a.trim&&(r=n.map(l=>pt(l)?l.trim():l)),a.number&&(r=n.map(l2)));let s,i=o[s=hu(t)]||o[s=hu(Ft(t))];!i&&u&&(i=o[s=hu(Lo(t))]),i&&Hn(i,e,6,r);const c=o[s+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,Hn(c,e,6,r)}}const CC=new WeakMap;function Dv(e,t,n=!1){const o=n?CC:t.emitsCache,r=o.get(e);if(r!==void 0)return r;const u=e.emits;let a={},s=!1;if(!_e(e)){const i=c=>{const l=Dv(c,t,!0);l&&(s=!0,Bt(a,l))};!n&&t.mixins.length&&t.mixins.forEach(i),e.extends&&i(e.extends),e.mixins&&e.mixins.forEach(i)}return!u&&!s?(Qe(e)&&o.set(e,null),null):(De(u)?u.forEach(i=>a[i]=null):Bt(a,u),Qe(e)&&o.set(e,a),a)}function sl(e,t){return!e||!Ja(t)?!1:(t=t.slice(2).replace(/Once$/,""),ot(e,t[0].toLowerCase()+t.slice(1))||ot(e,Lo(t))||ot(e,t))}function zl(e){const{type:t,vnode:n,proxy:o,withProxy:r,propsOptions:[u],slots:a,attrs:s,emit:i,render:c,renderCache:l,props:d,data:p,setupState:h,ctx:m,inheritAttrs:g}=e,y=vi(e);let E,b;try{if(n.shapeFlag&4){const C=r||o,w=C;E=En(c.call(w,C,l,d,h,p,m)),b=s}else{const C=t;E=En(C.length>1?C(d,{attrs:s,slots:a,emit:i}):C(d,null)),b=t.props?s:wC(s)}}catch(C){xa.length=0,Ru(C,e,1),E=q(bt)}let v=E;if(b&&g!==!1){const C=Object.keys(b),{shapeFlag:w}=v;C.length&&w&7&&(u&&C.some(Zi)&&(b=DC(b,u)),v=An(v,b,!1,!0))}return n.dirs&&(v=An(v,null,!1,!0),v.dirs=v.dirs?v.dirs.concat(n.dirs):n.dirs),n.transition&&lr(v,n.transition),E=v,vi(y),E}function xC(e,t=!0){let n;for(let o=0;o{let t;for(const n in e)(n==="class"||n==="style"||Ja(n))&&((t||(t={}))[n]=e[n]);return t},DC=(e,t)=>{const n={};for(const o in e)(!Zi(o)||!(o.slice(9)in t))&&(n[o]=e[o]);return n};function AC(e,t,n){const{props:o,children:r,component:u}=e,{props:a,children:s,patchFlag:i}=t,c=u.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&i>=0){if(i&1024)return!0;if(i&16)return o?Ap(o,a,c):!!a;if(i&8){const l=t.dynamicProps;for(let d=0;dObject.create(Bv),kv=e=>Object.getPrototypeOf(e)===Bv;function BC(e,t,n,o=!1){const r={},u=_v();e.propsDefaults=Object.create(null),Sv(e,t,r,u);for(const a in e.propsOptions[0])a in r||(r[a]=void 0);n?e.props=o?r:Pn(r):e.type.props?e.props=r:e.props=u,e.attrs=u}function _C(e,t,n,o){const{props:r,attrs:u,vnode:{patchFlag:a}}=e,s=He(r),[i]=e.propsOptions;let c=!1;if((o||a>0)&&!(a&16)){if(a&8){const l=e.vnode.dynamicProps;for(let d=0;d{i=!0;const[p,h]=Tv(d,t,!0);Bt(a,p),h&&s.push(...h)};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}if(!u&&!i)return Qe(e)&&o.set(e,fu),fu;if(De(u))for(let l=0;le==="_"||e==="_ctx"||e==="$stable",Od=e=>De(e)?e.map(En):[En(e)],SC=(e,t,n)=>{if(t._n)return t;const o=A((...r)=>Od(t(...r)),n);return o._c=!1,o},Fv=(e,t,n)=>{const o=e._ctx;for(const r in e){if(Md(r))continue;const u=e[r];if(_e(u))t[r]=SC(r,u,o);else if(u!=null){const a=Od(u);t[r]=()=>a}}},Pv=(e,t)=>{const n=Od(t);e.slots.default=()=>n},Mv=(e,t,n)=>{for(const o in t)(n||!Md(o))&&(e[o]=t[o])},TC=(e,t,n)=>{const o=e.slots=_v();if(e.vnode.shapeFlag&32){const r=t._;r?(Mv(o,t,n),n&&yg(o,"_",r,!0)):Fv(t,o)}else t&&Pv(e,t)},FC=(e,t,n)=>{const{vnode:o,slots:r}=e;let u=!0,a=Xe;if(o.shapeFlag&32){const s=t._;s?n&&s===1?u=!1:Mv(r,t,n):(u=!t.$stable,Fv(t,r)),a=t}else t&&(Pv(e,t),a={default:1});if(u)for(const s in r)!Md(s)&&a[s]==null&&delete r[s]},kt=$v;function PC(e){return Ov(e)}function MC(e){return Ov(e,oC)}function Ov(e,t){const n=el();n.__VUE__=!0;const{insert:o,remove:r,patchProp:u,createElement:a,createText:s,createComment:i,setText:c,setElementText:l,parentNode:d,nextSibling:p,setScopeId:h=io,insertStaticContent:m}=e,g=(T,M,V,te=null,X=null,z=null,ue=void 0,oe=null,ee=!!M.dynamicChildren)=>{if(T===M)return;T&&!jn(T,M)&&(te=Z(T),Ve(T,X,z,!0),T=null),M.patchFlag===-2&&(ee=!1,M.dynamicChildren=null);const{type:Q,ref:fe,shapeFlag:ie}=M;switch(Q){case Lr:y(T,M,V,te);break;case bt:E(T,M,V,te);break;case Qs:T==null&&b(M,V,te,ue);break;case Ce:N(T,M,V,te,X,z,ue,oe,ee);break;default:ie&1?w(T,M,V,te,X,z,ue,oe,ee):ie&6?J(T,M,V,te,X,z,ue,oe,ee):(ie&64||ie&128)&&Q.process(T,M,V,te,X,z,ue,oe,ee,Ee)}fe!=null&&X?gu(fe,T&&T.ref,z,M||T,!M):fe==null&&T&&T.ref!=null&&gu(T.ref,null,z,T,!0)},y=(T,M,V,te)=>{if(T==null)o(M.el=s(M.children),V,te);else{const X=M.el=T.el;M.children!==T.children&&c(X,M.children)}},E=(T,M,V,te)=>{T==null?o(M.el=i(M.children||""),V,te):M.el=T.el},b=(T,M,V,te)=>{[T.el,T.anchor]=m(T.children,M,V,te,T.el,T.anchor)},v=({el:T,anchor:M},V,te)=>{let X;for(;T&&T!==M;)X=p(T),o(T,V,te),T=X;o(M,V,te)},C=({el:T,anchor:M})=>{let V;for(;T&&T!==M;)V=p(T),r(T),T=V;r(M)},w=(T,M,V,te,X,z,ue,oe,ee)=>{if(M.type==="svg"?ue="svg":M.type==="math"&&(ue="mathml"),T==null)B(M,V,te,X,z,ue,oe,ee);else{const Q=T.el&&T.el._isVueCE?T.el:null;try{Q&&Q._beginPatch(),S(T,M,X,z,ue,oe,ee)}finally{Q&&Q._endPatch()}}},B=(T,M,V,te,X,z,ue,oe)=>{let ee,Q;const{props:fe,shapeFlag:ie,transition:ge,dirs:Be}=T;if(ee=T.el=a(T.type,z,fe&&fe.is,fe),ie&8?l(ee,T.children):ie&16&&_(T.children,ee,null,te,X,Ul(T,z),ue,oe),Be&&no(T,null,te,"created"),x(ee,T,T.scopeId,ue,te),fe){for(const et in fe)et!=="value"&&!Or(et)&&u(ee,et,null,fe[et],z,te);"value"in fe&&u(ee,"value",null,fe.value,z),(Q=fe.onVnodeBeforeMount)&&pn(Q,te,T)}Be&&no(T,null,te,"beforeMount");const Le=Iv(X,ge);Le&&ge.beforeEnter(ee),o(ee,M,V),((Q=fe&&fe.onVnodeMounted)||Le||Be)&&kt(()=>{Q&&pn(Q,te,T),Le&&ge.enter(ee),Be&&no(T,null,te,"mounted")},X)},x=(T,M,V,te,X)=>{if(V&&h(T,V),te)for(let z=0;z{for(let Q=ee;Q{const oe=M.el=T.el;let{patchFlag:ee,dynamicChildren:Q,dirs:fe}=M;ee|=T.patchFlag&16;const ie=T.props||Xe,ge=M.props||Xe;let Be;if(V&&br(V,!1),(Be=ge.onVnodeBeforeUpdate)&&pn(Be,V,M,T),fe&&no(M,T,V,"beforeUpdate"),V&&br(V,!0),(ie.innerHTML&&ge.innerHTML==null||ie.textContent&&ge.textContent==null)&&l(oe,""),Q?O(T.dynamicChildren,Q,oe,V,te,Ul(M,X),z):ue||K(T,M,oe,null,V,te,Ul(M,X),z,!1),ee>0){if(ee&16)H(oe,ie,ge,V,X);else if(ee&2&&ie.class!==ge.class&&u(oe,"class",null,ge.class,X),ee&4&&u(oe,"style",ie.style,ge.style,X),ee&8){const Le=M.dynamicProps;for(let et=0;et{Be&&pn(Be,V,M,T),fe&&no(M,T,V,"updated")},te)},O=(T,M,V,te,X,z,ue)=>{for(let oe=0;oe{if(M!==V){if(M!==Xe)for(const z in M)!Or(z)&&!(z in V)&&u(T,z,M[z],null,X,te);for(const z in V){if(Or(z))continue;const ue=V[z],oe=M[z];ue!==oe&&z!=="value"&&u(T,z,oe,ue,X,te)}"value"in V&&u(T,"value",M.value,V.value,X)}},N=(T,M,V,te,X,z,ue,oe,ee)=>{const Q=M.el=T?T.el:s(""),fe=M.anchor=T?T.anchor:s("");let{patchFlag:ie,dynamicChildren:ge,slotScopeIds:Be}=M;Be&&(oe=oe?oe.concat(Be):Be),T==null?(o(Q,V,te),o(fe,V,te),_(M.children||[],V,fe,X,z,ue,oe,ee)):ie>0&&ie&64&&ge&&T.dynamicChildren&&T.dynamicChildren.length===ge.length?(O(T.dynamicChildren,ge,V,X,z,ue,oe),(M.key!=null||X&&M===X.subTree)&&Id(T,M,!0)):K(T,M,V,fe,X,z,ue,oe,ee)},J=(T,M,V,te,X,z,ue,oe,ee)=>{M.slotScopeIds=oe,T==null?M.shapeFlag&512?X.ctx.activate(M,V,te,ue,ee):G(M,V,te,X,z,ue,ee):$(T,M,ee)},G=(T,M,V,te,X,z,ue)=>{const oe=T.component=UC(T,te,X);if(rs(T)&&(oe.ctx.renderer=Ee),HC(oe,!1,ue),oe.asyncDep){if(X&&X.registerDep(oe,I,ue),!T.el){const ee=oe.subTree=q(bt);E(null,ee,M,V),T.placeholder=ee.el}}else I(oe,T,M,V,X,z,ue)},$=(T,M,V)=>{const te=M.component=T.component;if(AC(T,M,V))if(te.asyncDep&&!te.asyncResolved){W(te,M,V);return}else te.next=M,te.update();else M.el=T.el,te.vnode=M},I=(T,M,V,te,X,z,ue)=>{const oe=()=>{if(T.isMounted){let{next:ie,bu:ge,u:Be,parent:Le,vnode:et}=T;{const Qt=Rv(T);if(Qt){ie&&(ie.el=et.el,W(T,ie,ue)),Qt.asyncDep.then(()=>{kt(()=>{T.isUnmounted||Q()},X)});return}}let tt=ie,gt;br(T,!1),ie?(ie.el=et.el,W(T,ie,ue)):ie=et,ge&&ya(ge),(gt=ie.props&&ie.props.onVnodeBeforeUpdate)&&pn(gt,Le,ie,et),br(T,!0);const at=zl(T),cn=T.subTree;T.subTree=at,g(cn,at,d(cn.el),Z(cn),T,X,z),ie.el=at.el,tt===null&&il(T,at.el),Be&&kt(Be,X),(gt=ie.props&&ie.props.onVnodeUpdated)&&kt(()=>pn(gt,Le,ie,et),X)}else{let ie;const{el:ge,props:Be}=M,{bm:Le,m:et,parent:tt,root:gt,type:at}=T,cn=So(M);if(br(T,!1),Le&&ya(Le),!cn&&(ie=Be&&Be.onVnodeBeforeMount)&&pn(ie,tt,M),br(T,!0),ge&&Ge){const Qt=()=>{T.subTree=zl(T),Ge(ge,T.subTree,T,X,null)};cn&&at.__asyncHydrate?at.__asyncHydrate(ge,T,Qt):Qt()}else{gt.ce&>.ce._hasShadowRoot()&>.ce._injectChildStyle(at,T.parent?T.parent.type:void 0);const Qt=T.subTree=zl(T);g(null,Qt,V,te,T,X,z),M.el=Qt.el}if(et&&kt(et,X),!cn&&(ie=Be&&Be.onVnodeMounted)){const Qt=M;kt(()=>pn(ie,tt,Qt),X)}(M.shapeFlag&256||tt&&So(tt.vnode)&&tt.vnode.shapeFlag&256)&&T.a&&kt(T.a,X),T.isMounted=!0,M=V=te=null}};T.scope.on();const ee=T.effect=new Dg(oe);T.scope.off();const Q=T.update=ee.run.bind(ee),fe=T.job=ee.runIfDirty.bind(ee);fe.i=T,fe.id=T.uid,ee.scheduler=()=>kd(fe),br(T,!0),Q()},W=(T,M,V)=>{M.component=T;const te=T.vnode.props;T.vnode=M,T.next=null,_C(T,M.props,te,V),FC(T,M.children,V),Fo(),fp(T),Po()},K=(T,M,V,te,X,z,ue,oe,ee=!1)=>{const Q=T&&T.children,fe=T?T.shapeFlag:0,ie=M.children,{patchFlag:ge,shapeFlag:Be}=M;if(ge>0){if(ge&128){le(Q,ie,V,te,X,z,ue,oe,ee);return}else if(ge&256){de(Q,ie,V,te,X,z,ue,oe,ee);return}}Be&8?(fe&16&&ze(Q,X,z),ie!==Q&&l(V,ie)):fe&16?Be&16?le(Q,ie,V,te,X,z,ue,oe,ee):ze(Q,X,z,!0):(fe&8&&l(V,""),Be&16&&_(ie,V,te,X,z,ue,oe,ee))},de=(T,M,V,te,X,z,ue,oe,ee)=>{T=T||fu,M=M||fu;const Q=T.length,fe=M.length,ie=Math.min(Q,fe);let ge;for(ge=0;gefe?ze(T,X,z,!0,!1,ie):_(M,V,te,X,z,ue,oe,ee,ie)},le=(T,M,V,te,X,z,ue,oe,ee)=>{let Q=0;const fe=M.length;let ie=T.length-1,ge=fe-1;for(;Q<=ie&&Q<=ge;){const Be=T[Q],Le=M[Q]=ee?Do(M[Q]):En(M[Q]);if(jn(Be,Le))g(Be,Le,V,null,X,z,ue,oe,ee);else break;Q++}for(;Q<=ie&&Q<=ge;){const Be=T[ie],Le=M[ge]=ee?Do(M[ge]):En(M[ge]);if(jn(Be,Le))g(Be,Le,V,null,X,z,ue,oe,ee);else break;ie--,ge--}if(Q>ie){if(Q<=ge){const Be=ge+1,Le=Bege)for(;Q<=ie;)Ve(T[Q],X,z,!0),Q++;else{const Be=Q,Le=Q,et=new Map;for(Q=Le;Q<=ge;Q++){const Kt=M[Q]=ee?Do(M[Q]):En(M[Q]);Kt.key!=null&&et.set(Kt.key,Q)}let tt,gt=0;const at=ge-Le+1;let cn=!1,Qt=0;const yn=new Array(at);for(Q=0;Q=at){Ve(Kt,X,z,!0);continue}let Qn;if(Kt.key!=null)Qn=et.get(Kt.key);else for(tt=Le;tt<=ge;tt++)if(yn[tt-Le]===0&&jn(Kt,M[tt])){Qn=tt;break}Qn===void 0?Ve(Kt,X,z,!0):(yn[Qn-Le]=Q+1,Qn>=Qt?Qt=Qn:cn=!0,g(Kt,M[Qn],V,null,X,z,ue,oe,ee),gt++)}const vr=cn?OC(yn):fu;for(tt=vr.length-1,Q=at-1;Q>=0;Q--){const Kt=Le+Q,Qn=M[Kt],ap=M[Kt+1],sp=Kt+1{const{el:z,type:ue,transition:oe,children:ee,shapeFlag:Q}=T;if(Q&6){ut(T.component.subTree,M,V,te);return}if(Q&128){T.suspense.move(M,V,te);return}if(Q&64){ue.move(T,M,V,Ee);return}if(ue===Ce){o(z,M,V);for(let ie=0;ieoe.enter(z),X);else{const{leave:ie,delayLeave:ge,afterLeave:Be}=oe,Le=()=>{T.ctx.isUnmounted?r(z):o(z,M,V)},et=()=>{z._isLeaving&&z[oo](!0),ie(z,()=>{Le(),Be&&Be()})};ge?ge(z,Le,et):et()}else o(z,M,V)},Ve=(T,M,V,te=!1,X=!1)=>{const{type:z,props:ue,ref:oe,children:ee,dynamicChildren:Q,shapeFlag:fe,patchFlag:ie,dirs:ge,cacheIndex:Be,memo:Le}=T;if(ie===-2&&(X=!1),oe!=null&&(Fo(),gu(oe,null,V,T,!0),Po()),Be!=null&&(M.renderCache[Be]=void 0),fe&256){M.ctx.deactivate(T);return}const et=fe&1&&ge,tt=!So(T);let gt;if(tt&&(gt=ue&&ue.onVnodeBeforeUnmount)&&pn(gt,M,T),fe&6)Ne(T.component,V,te);else{if(fe&128){T.suspense.unmount(V,te);return}et&&no(T,null,M,"beforeUnmount"),fe&64?T.type.remove(T,M,V,Ee,te):Q&&!Q.hasOnce&&(z!==Ce||ie>0&&ie&64)?ze(Q,M,V,!1,!0):(z===Ce&&ie&384||!X&&fe&16)&&ze(ee,M,V),te&&ht(T)}const at=Le!=null&&Be==null;(tt&&(gt=ue&&ue.onVnodeUnmounted)||et||at)&&kt(()=>{gt&&pn(gt,M,T),et&&no(T,null,M,"unmounted"),at&&(T.el=null)},V)},ht=T=>{const{type:M,el:V,anchor:te,transition:X}=T;if(M===Ce){Dt(V,te);return}if(M===Qs){C(T);return}const z=()=>{r(V),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(T.shapeFlag&1&&X&&!X.persisted){const{leave:ue,delayLeave:oe}=X,ee=()=>ue(V,z);oe?oe(T.el,z,ee):ee()}else z()},Dt=(T,M)=>{let V;for(;T!==M;)V=p(T),r(T),T=V;r(M)},Ne=(T,M,V)=>{const{bum:te,scope:X,job:z,subTree:ue,um:oe,m:ee,a:Q}=T;Ei(ee),Ei(Q),te&&ya(te),X.stop(),z&&(z.flags|=8,Ve(ue,T,M,V)),oe&&kt(oe,M),kt(()=>{T.isUnmounted=!0},M)},ze=(T,M,V,te=!1,X=!1,z=0)=>{for(let ue=z;ue{if(T.shapeFlag&6)return Z(T.component.subTree);if(T.shapeFlag&128)return T.suspense.next();const M=p(T.anchor||T.el),V=M&&M[Xg];return V?p(V):M};let ce=!1;const se=(T,M,V)=>{let te;T==null?M._vnode&&(Ve(M._vnode,null,null,!0),te=M._vnode.component):g(M._vnode||null,T,M,null,null,null,V),M._vnode=T,ce||(ce=!0,fp(te),gi(),ce=!1)},Ee={p:g,um:Ve,m:ut,r:ht,mt:G,mc:_,pc:K,pbc:O,n:Z,o:e};let Te,Ge;return t&&([Te,Ge]=t(Ee)),{render:se,hydrate:Te,createApp:bC(se,Te)}}function Ul({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function br({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Iv(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Id(e,t,n=!1){const o=e.children,r=t.children;if(De(o)&&De(r))for(let u=0;u>1,e[n[s]]0&&(t[o]=n[u-1]),n[u]=o)}}for(u=n.length,a=n[u-1];u-- >0;)n[u]=a,a=t[a];return n}function Rv(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Rv(t)}function Ei(e){if(e)for(let t=0;te.__isSuspense;let Gc=0;const IC={name:"Suspense",__isSuspense:!0,process(e,t,n,o,r,u,a,s,i,c){if(e==null)RC(t,n,o,r,u,a,s,i,c);else{if(u&&u.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}LC(e,t,n,o,r,a,s,i,c)}},hydrate:qC,normalize:$C},Rd=IC;function Ra(e,t){const n=e.props&&e.props[t];_e(n)&&n()}function RC(e,t,n,o,r,u,a,s,i){const{p:c,o:{createElement:l}}=i,d=l("div"),p=e.suspense=qv(e,r,o,t,d,n,u,a,s,i);c(null,p.pendingBranch=e.ssContent,d,null,o,p,u,a),p.deps>0?(Ra(e,"onPending"),Ra(e,"onFallback"),c(null,e.ssFallback,t,n,o,null,u,a),vu(p,e.ssFallback)):p.resolve(!1,!0)}function LC(e,t,n,o,r,u,a,s,{p:i,um:c,o:{createElement:l}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const p=t.ssContent,h=t.ssFallback,{activeBranch:m,pendingBranch:g,isInFallback:y,isHydrating:E}=d;if(g)d.pendingBranch=p,jn(g,p)?(i(g,p,d.hiddenContainer,null,r,d,u,a,s),d.deps<=0?d.resolve():y&&(E||(i(m,h,n,o,r,null,u,a,s),vu(d,h)))):(d.pendingId=Gc++,E?(d.isHydrating=!1,d.activeBranch=g):c(g,r,d),d.deps=0,d.effects.length=0,d.hiddenContainer=l("div"),y?(i(null,p,d.hiddenContainer,null,r,d,u,a,s),d.deps<=0?d.resolve():(i(m,h,n,o,r,null,u,a,s),vu(d,h))):m&&jn(m,p)?(i(m,p,n,o,r,d,u,a,s),d.resolve(!0)):(i(null,p,d.hiddenContainer,null,r,d,u,a,s),d.deps<=0&&d.resolve()));else if(m&&jn(m,p))i(m,p,n,o,r,d,u,a,s),vu(d,p);else if(Ra(t,"onPending"),d.pendingBranch=p,p.shapeFlag&512?d.pendingId=p.component.suspenseId:d.pendingId=Gc++,i(null,p,d.hiddenContainer,null,r,d,u,a,s),d.deps<=0)d.resolve();else{const{timeout:b,pendingId:v}=d;b>0?setTimeout(()=>{d.pendingId===v&&d.fallback(h)},b):b===0&&d.fallback(h)}}function qv(e,t,n,o,r,u,a,s,i,c,l=!1){const{p:d,m:p,um:h,n:m,o:{parentNode:g,remove:y}}=c;let E;const b=NC(e);b&&t&&t.pendingBranch&&(E=t.pendingId,t.deps++);const v=e.props?bg(e.props.timeout):void 0,C=u,w={vnode:e,parent:t,parentComponent:n,namespace:a,container:o,hiddenContainer:r,deps:0,pendingId:Gc++,timeout:typeof v=="number"?v:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!l,isHydrating:l,isUnmounted:!1,effects:[],resolve(B=!1,x=!1){const{vnode:_,activeBranch:S,pendingBranch:O,pendingId:H,effects:N,parentComponent:J,container:G,isInFallback:$}=w;let I=!1;w.isHydrating?w.isHydrating=!1:B||(I=S&&O.transition&&O.transition.mode==="out-in",I&&(S.transition.afterLeave=()=>{H===w.pendingId&&(p(O,G,u===C?m(S):u,0),Pa(N),$&&_.ssFallback&&(_.ssFallback.el=null))}),S&&!w.isFallbackMountPending&&(g(S.el)===G&&(u=m(S)),h(S,J,w,!0),!I&&$&&_.ssFallback&&kt(()=>_.ssFallback.el=null,w)),I||p(O,G,u,0)),w.isFallbackMountPending=!1,vu(w,O),w.pendingBranch=null,w.isInFallback=!1;let W=w.parent,K=!1;for(;W;){if(W.pendingBranch){W.effects.push(...N),K=!0;break}W=W.parent}!K&&!I&&Pa(N),w.effects=[],b&&t&&t.pendingBranch&&E===t.pendingId&&(t.deps--,t.deps===0&&!x&&t.resolve()),Ra(_,"onResolve")},fallback(B){if(!w.pendingBranch)return;const{vnode:x,activeBranch:_,parentComponent:S,container:O,namespace:H}=w;Ra(x,"onFallback");const N=m(_),J=()=>{w.isFallbackMountPending=!1,w.isInFallback&&(d(null,B,O,N,S,null,H,s,i),vu(w,B))},G=B.transition&&B.transition.mode==="out-in";G&&(w.isFallbackMountPending=!0,_.transition.afterLeave=J),w.isInFallback=!0,h(_,S,null,!0),G||J()},move(B,x,_){w.activeBranch&&p(w.activeBranch,B,x,_),w.container=B},next(){return w.activeBranch&&m(w.activeBranch)},registerDep(B,x,_){const S=!!w.pendingBranch;S&&w.deps++;const O=B.vnode.el;B.asyncDep.catch(H=>{Ru(H,B,0)}).then(H=>{if(B.isUnmounted||w.isUnmounted||w.pendingId!==B.suspenseId)return;La(),B.asyncResolved=!0;const{vnode:N}=B;Yc(B,H),O&&(N.el=O);const J=!O&&B.subTree.el;x(B,N,g(O||B.subTree.el),O?null:m(B.subTree),w,a,_),J&&(N.placeholder=null,y(J)),il(B,N.el),S&&--w.deps===0&&w.resolve()})},unmount(B,x){w.isUnmounted=!0,w.activeBranch&&h(w.activeBranch,n,B,x),w.pendingBranch&&h(w.pendingBranch,n,B,x)}};return w}function qC(e,t,n,o,r,u,a,s,i){const c=t.suspense=qv(t,o,n,e.parentNode,document.createElement("div"),null,r,u,a,s,!0),l=i(e,c.pendingBranch=t.ssContent,n,c,u,a);return c.deps===0&&c.resolve(!1,!0),l}function $C(e){const{shapeFlag:t,children:n}=e,o=t&32;e.ssContent=_p(o?n.default:n),e.ssFallback=o?_p(n.fallback):q(bt)}function _p(e){let t;if(_e(e)){const n=jr&&e._c;n&&(e._d=!1,D()),e=e(),n&&(e._d=!0,t=Yt,Nv())}return De(e)&&(e=xC(e)),e=En(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function $v(e,t){t&&t.pendingBranch?De(e)?t.effects.push(...e):t.effects.push(e):Pa(e)}function vu(e,t){e.activeBranch=t;const{vnode:n,parentComponent:o}=e;let r=t.el;for(;!r&&t.component;)t=t.component.subTree,r=t.el;n.el=r,o&&o.subTree===n&&(o.vnode.el=r,il(o,r))}function NC(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const Ce=Symbol.for("v-fgt"),Lr=Symbol.for("v-txt"),bt=Symbol.for("v-cmt"),Qs=Symbol.for("v-stc"),xa=[];let Yt=null;function D(e=!1){xa.push(Yt=e?null:[])}function Nv(){xa.pop(),Yt=xa[xa.length-1]||null}let jr=1;function xi(e,t=!1){jr+=e,e<0&&Yt&&t&&(Yt.hasOnce=!0)}function jv(e){return e.dynamicChildren=jr>0?Yt||fu:null,Nv(),jr>0&&Yt&&Yt.push(e),e}function re(e,t,n,o,r,u){return jv(je(e,t,n,o,r,u,!0))}function k(e,t,n,o,r){return jv(q(e,t,n,o,r,!0))}function Vr(e){return e?e.__v_isVNode===!0:!1}function jn(e,t){return e.type===t.type&&e.key===t.key}const Vv=({key:e})=>e??null,ei=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?pt(e)||rt(e)||_e(e)?{i:on,r:e,k:t,f:!!n}:e:null);function je(e,t=null,n=null,o=0,r=null,u=e===Ce?0:1,a=!1,s=!1){const i={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Vv(t),ref:t&&ei(t),scopeId:Wg,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:u,patchFlag:o,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:on};return s?(Ld(i,n),u&128&&e.normalize(i)):n&&(i.shapeFlag|=pt(n)?8:16),jr>0&&!a&&Yt&&(i.patchFlag>0||u&6)&&i.patchFlag!==32&&Yt.push(i),i}const q=jC;function jC(e,t=null,n=null,o=0,r=null,u=!1){if((!e||e===dv)&&(e=bt),Vr(e)){const s=An(e,t,!0);return n&&Ld(s,n),jr>0&&!u&&Yt&&(s.shapeFlag&6?Yt[Yt.indexOf(e)]=s:Yt.push(s)),s.patchFlag=-2,s}if(GC(e)&&(e=e.__vccOpts),t){t=xe(t);let{class:s,style:i}=t;s&&!pt(s)&&(t.class=U(s)),Qe(i)&&(ul(i)&&!De(i)&&(i=Bt({},i)),t.style=mn(i))}const a=pt(e)?1:Ci(e)?128:Jg(e)?64:Qe(e)?4:_e(e)?2:0;return je(e,t,n,o,r,a,u,!0)}function xe(e){return e?ul(e)||kv(e)?Bt({},e):e:null}function An(e,t,n=!1,o=!1){const{props:r,ref:u,patchFlag:a,children:s,transition:i}=e,c=t?j(r||{},t):r,l={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Vv(c),ref:t&&t.ref?n&&u?De(u)?u.concat(ei(t)):[u,ei(t)]:ei(t):u,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ce?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:i,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&An(e.ssContent),ssFallback:e.ssFallback&&An(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return i&&o&&lr(l,i.clone(l)),l}function Ke(e=" ",t=0){return q(Lr,null,e,t)}function Y(e="",t=!1){return t?(D(),k(bt,null,e)):q(bt,null,e)}function En(e){return e==null||typeof e=="boolean"?q(bt):De(e)?q(Ce,null,e.slice()):Vr(e)?Do(e):q(Lr,null,String(e))}function Do(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:An(e)}function Ld(e,t){let n=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(De(t))n=16;else if(typeof t=="object")if(o&65){const r=t.default;r&&(r._c&&(r._d=!1),Ld(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!kv(t)?t._ctx=on:r===3&&on&&(on.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else _e(t)?(t={default:t,_ctx:on},n=32):(t=String(t),o&64?(n=16,t=[Ke(t)]):n=8);e.children=t,e.shapeFlag|=n}function j(...e){const t={};for(let n=0;nzt||on;let wi,yu;{const e=el(),t=(n,o)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(o),u=>{r.length>1?r.forEach(a=>a(u)):r[0](u)}};wi=t("__VUE_INSTANCE_SETTERS__",n=>zt=n),yu=t("__VUE_SSR_SETTERS__",n=>zr=n)}const qu=e=>{const t=zt;return wi(e),e.scope.on(),()=>{e.scope.off(),wi(t)}},La=()=>{zt&&zt.scope.off(),wi(null)};function zv(e){return e.vnode.shapeFlag&4}let zr=!1;function HC(e,t=!1,n=!1){t&&yu(t);const{props:o,children:r}=e.vnode,u=zv(e);BC(e,o,u,t),TC(e,r,n||t);const a=u?KC(e,t):void 0;return t&&yu(!1),a}function KC(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,fC);const{setup:o}=n;if(o){Fo();const r=e.setupContext=o.length>1?Hv(e):null,u=qu(e),a=ts(o,e,0,[e.props,r]),s=Cd(a);if(Po(),u(),(s||e.sp)&&!So(e)&&Fd(e),s){if(a.then(La,La),t)return a.then(i=>{Yc(e,i)}).catch(i=>{Ru(i,e,0)});e.asyncDep=a}else Yc(e,a)}else Uv(e)}function Yc(e,t,n){_e(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Qe(t)&&(e.setupState=Vg(t)),Uv(e)}function Uv(e,t,n){const o=e.type;e.render||(e.render=o.render||io);{const r=qu(e);Fo();try{pC(e)}finally{Po(),r()}}}const WC={get(e,t){return Gt(e,"get",""),e[t]}};function Hv(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,WC),slots:e.slots,emit:e.emit,expose:t}}function qd(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Vg(_d(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ca)return Ca[n](e)},has(t,n){return n in t||n in Ca}})):e.proxy}function Zc(e,t=!0){return _e(e)?e.displayName||e.name:e.name||t&&e.__name}function GC(e){return _e(e)&&"__vccOpts"in e}const F=(e,t)=>V2(e,t,zr);function qe(e,t,n){try{xi(-1);const o=arguments.length;return o===2?Qe(t)&&!De(t)?Vr(t)?q(e,null,[t]):q(e,t):q(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):o===3&&Vr(n)&&(n=[n]),q(e,t,n))}finally{xi(1)}}function YU(e,t,n,o){const r=n[o];if(r&&YC(r,e))return r;const u=t();return u.memo=e.slice(),u.cacheIndex=o,n[o]=u}function YC(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let o=0;o0&&Yt&&Yt.push(e),!0}const ZC="3.5.32";let Xc;const kp=typeof window<"u"&&window.trustedTypes;if(kp)try{Xc=kp.createPolicy("vue",{createHTML:e=>e})}catch{}const Kv=Xc?e=>Xc.createHTML(e):e=>e,XC="http://www.w3.org/2000/svg",JC="http://www.w3.org/1998/Math/MathML",wo=typeof document<"u"?document:null,Sp=wo&&wo.createElement("template"),QC={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t==="svg"?wo.createElementNS(XC,e):t==="mathml"?wo.createElementNS(JC,e):n?wo.createElement(e,{is:n}):wo.createElement(e);return e==="select"&&o&&o.multiple!=null&&r.setAttribute("multiple",o.multiple),r},createText:e=>wo.createTextNode(e),createComment:e=>wo.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wo.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,o,r,u){const a=n?n.previousSibling:t.lastChild;if(r&&(r===u||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===u||!(r=r.nextSibling)););else{Sp.innerHTML=Kv(o==="svg"?`${e}`:o==="mathml"?`${e}`:e);const s=Sp.content;if(o==="svg"||o==="mathml"){const i=s.firstChild;for(;i.firstChild;)s.appendChild(i.firstChild);s.removeChild(i)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ho="transition",ta="animation",Au=Symbol("_vtc"),Wv={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Gv=Bt({},ev,Wv),ex=e=>(e.displayName="Transition",e.props=Gv,e),tx=ex((e,{slots:t})=>qe(eC,Yv(e),t)),Er=(e,t=[])=>{De(e)?e.forEach(n=>n(...t)):e&&e(...t)},Tp=e=>e?De(e)?e.some(t=>t.length>1):e.length>1:!1;function Yv(e){const t={};for(const N in e)N in Wv||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:o,duration:r,enterFromClass:u=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:i=u,appearActiveClass:c=a,appearToClass:l=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=nx(r),g=m&&m[0],y=m&&m[1],{onBeforeEnter:E,onEnter:b,onEnterCancelled:v,onLeave:C,onLeaveCancelled:w,onBeforeAppear:B=E,onAppear:x=b,onAppearCancelled:_=v}=t,S=(N,J,G,$)=>{N._enterCancelled=$,Yo(N,J?l:s),Yo(N,J?c:a),G&&G()},O=(N,J)=>{N._isLeaving=!1,Yo(N,d),Yo(N,h),Yo(N,p),J&&J()},H=N=>(J,G)=>{const $=N?x:b,I=()=>S(J,N,G);Er($,[J,I]),Fp(()=>{Yo(J,N?i:u),eo(J,N?l:s),Tp($)||Pp(J,o,g,I)})};return Bt(t,{onBeforeEnter(N){Er(E,[N]),eo(N,u),eo(N,a)},onBeforeAppear(N){Er(B,[N]),eo(N,i),eo(N,c)},onEnter:H(!1),onAppear:H(!0),onLeave(N,J){N._isLeaving=!0;const G=()=>O(N,J);eo(N,d),N._enterCancelled?(eo(N,p),Jc(N)):(Jc(N),eo(N,p)),Fp(()=>{N._isLeaving&&(Yo(N,d),eo(N,h),Tp(C)||Pp(N,o,y,G))}),Er(C,[N,G])},onEnterCancelled(N){S(N,!1,void 0,!0),Er(v,[N])},onAppearCancelled(N){S(N,!0,void 0,!0),Er(_,[N])},onLeaveCancelled(N){O(N),Er(w,[N])}})}function nx(e){if(e==null)return null;if(Qe(e))return[Hl(e.enter),Hl(e.leave)];{const t=Hl(e);return[t,t]}}function Hl(e){return bg(e)}function eo(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Au]||(e[Au]=new Set)).add(t)}function Yo(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[Au];n&&(n.delete(t),n.size||(e[Au]=void 0))}function Fp(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ox=0;function Pp(e,t,n,o){const r=e._endId=++ox,u=()=>{r===e._endId&&o()};if(n!=null)return setTimeout(u,n);const{type:a,timeout:s,propCount:i}=Zv(e,t);if(!a)return o();const c=a+"end";let l=0;const d=()=>{e.removeEventListener(c,p),u()},p=h=>{h.target===e&&++l>=i&&d()};setTimeout(()=>{l(n[m]||"").split(", "),r=o(`${Ho}Delay`),u=o(`${Ho}Duration`),a=Mp(r,u),s=o(`${ta}Delay`),i=o(`${ta}Duration`),c=Mp(s,i);let l=null,d=0,p=0;t===Ho?a>0&&(l=Ho,d=a,p=u.length):t===ta?c>0&&(l=ta,d=c,p=i.length):(d=Math.max(a,c),l=d>0?a>c?Ho:ta:null,p=l?l===Ho?u.length:i.length:0);const h=l===Ho&&/\b(?:transform|all)(?:,|$)/.test(o(`${Ho}Property`).toString());return{type:l,timeout:d,propCount:p,hasTransform:h}}function Mp(e,t){for(;e.lengthOp(n)+Op(e[o])))}function Op(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Jc(e){return(e?e.ownerDocument:document).body.offsetHeight}function rx(e,t,n){const o=e[Au];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ip=Symbol("_vod"),ux=Symbol("_vsh"),ax=Symbol(""),sx=/(?:^|;)\s*display\s*:/;function ix(e,t,n){const o=e.style,r=pt(n);let u=!1;if(n&&!r){if(t)if(pt(t))for(const a of t.split(";")){const s=a.slice(0,a.indexOf(":")).trim();n[s]==null&&ti(o,s,"")}else for(const a in t)n[a]==null&&ti(o,a,"");for(const a in n)a==="display"&&(u=!0),ti(o,a,n[a])}else if(r){if(t!==n){const a=o[ax];a&&(n+=";"+a),o.cssText=n,u=sx.test(n)}}else t&&e.removeAttribute("style");Ip in e&&(e[Ip]=u?o.display:"",e[ux]&&(o.display="none"))}const Rp=/\s*!important$/;function ti(e,t,n){if(De(n))n.forEach(o=>ti(e,t,o));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const o=lx(e,t);Rp.test(n)?e.setProperty(Lo(o),n.replace(Rp,""),"important"):e[o]=n}}const Lp=["Webkit","Moz","ms"],Kl={};function lx(e,t){const n=Kl[t];if(n)return n;let o=Ft(t);if(o!=="filter"&&o in e)return Kl[t]=o;o=Qi(o);for(let r=0;rWl||(hx.then(()=>Wl=0),Wl=Date.now());function gx(e,t){const n=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=n.attached)return;Hn(vx(o,n.value),t,5,[o])};return n.value=e,n.attached=mx(),n}function vx(e,t){if(De(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(o=>r=>!r._stopped&&o&&o(r))}else return t}const zp=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,yx=(e,t,n,o,r,u)=>{const a=r==="svg";t==="class"?rx(e,o,a):t==="style"?ix(e,n,o):Ja(t)?Zi(t)||fx(e,t,n,o,u):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):bx(e,t,o,a))?(Np(e,t,o),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&$p(e,t,o,a,u,t!=="value")):e._isVueCE&&(Ex(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!pt(o)))?Np(e,Ft(t),o,u,t):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),$p(e,t,o,a))};function bx(e,t,n,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&zp(t)&&_e(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return zp(t)&&pt(n)?!1:t in e}function Ex(e,t){const n=e._def.props;if(!n)return!1;const o=Ft(t);return Array.isArray(n)?n.some(r=>Ft(r)===o):Object.keys(n).some(r=>Ft(r)===o)}const Xv=new WeakMap,Jv=new WeakMap,Di=Symbol("_moveCb"),Up=Symbol("_enterCb"),Cx=e=>(delete e.props.mode,e),xx=Cx({name:"TransitionGroup",props:Bt({},Gv,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=We(),o=Qg();let r,u;return Gr(()=>{if(!r.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!Bx(r[0].el,n.vnode.el,a)){r=[];return}r.forEach(wx),r.forEach(Dx);const s=r.filter(Ax);Jc(n.vnode.el),s.forEach(i=>{const c=i.el,l=c.style;eo(c,a),l.transform=l.webkitTransform=l.transitionDuration="";const d=c[Di]=p=>{p&&p.target!==c||(!p||p.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",d),c[Di]=null,Yo(c,a))};c.addEventListener("transitionend",d)}),r=[]}),()=>{const a=He(e),s=Yv(a);let i=a.tag||Ce;if(r=[],u)for(let c=0;c{s.split(/\s+/).forEach(i=>i&&o.classList.remove(i))}),n.split(/\s+/).forEach(s=>s&&o.classList.add(s)),o.style.display="none";const u=t.nodeType===1?t:t.parentNode;u.appendChild(o);const{hasTransform:a}=Zv(o);return u.removeChild(o),a}const _x=["ctrl","shift","alt","meta"],kx={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>_x.some(n=>e[`${n}Key`]&&!t.includes(n))},On=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),o=t.join(".");return n[o]||(n[o]=((r,...u)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),o=t.join(".");return n[o]||(n[o]=(r=>{if(!("key"in r))return;const u=Lo(r.key);if(t.some(a=>a===u||Sx[a]===u))return e(r)}))},ey=Bt({patchProp:yx},QC);let wa,Hp=!1;function Tx(){return wa||(wa=PC(ey))}function Fx(){return wa=Hp?wa:MC(ey),Hp=!0,wa}const Px=((...e)=>{const t=Tx().createApp(...e),{mount:n}=t;return t.mount=o=>{const r=ny(o);if(!r)return;const u=t._component;!_e(u)&&!u.render&&!u.template&&(u.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const a=n(r,!1,ty(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),a},t}),Mx=((...e)=>{const t=Fx().createApp(...e),{mount:n}=t;return t.mount=o=>{const r=ny(o);if(r)return n(r,!0,ty(r))},t});function ty(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ny(e){return pt(e)?document.querySelector(e):e}const Ox=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Ix=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Rx=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Lx(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){qx(e);return}return t}function qx(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function $x(e,t={}){if(typeof e!="string")return e;if(e[0]==='"'&&e[e.length-1]==='"'&&e.indexOf("\\")===-1)return e.slice(1,-1);const n=e.trim();if(n.length<=9)switch(n.toLowerCase()){case"true":return!0;case"false":return!1;case"undefined":return;case"null":return null;case"nan":return Number.NaN;case"infinity":return Number.POSITIVE_INFINITY;case"-infinity":return Number.NEGATIVE_INFINITY}if(!Rx.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(Ox.test(e)||Ix.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Lx)}return JSON.parse(e)}catch(o){if(t.strict)throw o;return e}}const oy=/#/g,ry=/&/g,uy=/\//g,Nx=/=/g,jx=/\?/g,ll=/\+/g,Vx=/%5e/gi,zx=/%60/gi,Ux=/%7c/gi,Hx=/%20/gi,Kx=/%2f/gi,Wx=/%252f/gi;function ay(e){return encodeURI(""+e).replace(Ux,"|")}function Qc(e){return ay(typeof e=="string"?e:JSON.stringify(e)).replace(ll,"%2B").replace(Hx,"+").replace(oy,"%23").replace(ry,"%26").replace(zx,"`").replace(Vx,"^").replace(uy,"%2F")}function Gl(e){return Qc(e).replace(Nx,"%3D")}function Nd(e){return ay(e).replace(oy,"%23").replace(jx,"%3F").replace(Wx,"%2F").replace(ry,"%26").replace(ll,"%2B")}function Kp(e){return Nd(e).replace(uy,"%2F")}function qa(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function Gx(e){return qa(e.replace(Kx,"%252F"))}function Yx(e){return qa(e.replace(ll," "))}function Zx(e){return qa(e.replace(ll," "))}function jd(e=""){const t=Object.create(null);e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const o=n.match(/([^=]+)=?(.*)/)||[];if(o.length<2)continue;const r=Yx(o[1]);if(r==="__proto__"||r==="constructor")continue;const u=Zx(o[2]||"");t[r]===void 0?t[r]=u:Array.isArray(t[r])?t[r].push(u):t[r]=[t[r],u]}return t}function Xx(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${Gl(e)}=${Qc(n)}`).join("&"):`${Gl(e)}=${Qc(t)}`:Gl(e)}function Jx(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>Xx(t,e[t])).filter(Boolean).join("&")}const Qx=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,sy=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,e5=/^([/\\]\s*){2,}[^/\\]/,t5=/^[\s\0]*(blob|data|javascript|vbscript):$/i,n5=/\/$|\/\?|\/#/,o5=/^\.?\//;function Ln(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?Qx.test(e):sy.test(e)||(t.acceptRelative?e5.test(e):!1)}function r5(e){return!!e&&t5.test(e)}function e0(e="",t){return t?n5.test(e):e.endsWith("/")}function Bu(e="",t){if(!t)return(e0(e)?e.slice(0,-1):e)||"/";if(!e0(e,!0))return e||"/";let n=e,o="";const r=e.indexOf("#");r!==-1&&(n=e.slice(0,r),o=e.slice(r));const[u,...a]=n.split("?");return((u.endsWith("/")?u.slice(0,-1):u)||"/")+(a.length>0?`?${a.join("?")}`:"")+o}function Vd(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(e0(e,!0))return e||"/";let n=e,o="";const r=e.indexOf("#");if(r!==-1&&(n=e.slice(0,r),o=e.slice(r),!n))return o;const[u,...a]=n.split("?");return u+"/"+(a.length>0?`?${a.join("?")}`:"")+o}function u5(e=""){return e.startsWith("/")}function iy(e=""){return u5(e)?e:"/"+e}function a5(e,t){if(cy(t)||Ln(e))return e;const n=Bu(t);if(e.startsWith(n)){const o=e[n.length];if(!o||o==="/"||o==="?")return e}return cr(n,e)}function Wp(e,t){if(cy(t))return e;const n=Bu(t);if(!e.startsWith(n))return e;const o=e[n.length];if(o&&o!=="/"&&o!=="?")return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function ly(e,t){const n=cl(e),o={...jd(n.search),...t};return n.search=Jx(o),c5(n)}function cy(e){return!e||e==="/"}function s5(e){return e&&e!=="/"}function cr(e,...t){let n=e||"";for(const o of t.filter(r=>s5(r)))if(n){const r=o.replace(o5,"");n=Vd(n)+r}else n=o;return n}function dy(...e){const t=/\/(?!\/)/,n=e.filter(Boolean),o=[];let r=0;for(const a of n)if(!(!a||a==="/")){for(const[s,i]of a.split(t).entries())if(!(!i||i===".")){if(i===".."){if(o.length===1&&Ln(o[0]))continue;o.pop(),r--;continue}if(s===1&&o[o.length-1]?.endsWith(":/")){o[o.length-1]+="/"+i;continue}o.push(i),r++}}let u=o.join("/");return r>=0?n[0]?.startsWith("/")&&!u.startsWith("/")?u="/"+u:n[0]?.startsWith("./")&&!u.startsWith("./")&&(u="./"+u):u="../".repeat(-1*r)+u,n[n.length-1]?.endsWith("/")&&!u.endsWith("/")&&(u+="/"),u}function i5(e){return l5(e,"https://")}function l5(e,t){let n=e.match(sy);return n||(n=e.match(/^\/{2,}/)),n?t+e.slice(n[0].length):t+e}function fy(e,t){return qa(Bu(e))===qa(Bu(t))}const py=Symbol.for("ufo:protocolRelative");function cl(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,d,p=""]=n;return{protocol:d.toLowerCase(),pathname:p,href:d+p,auth:"",host:"",search:"",hash:""}}if(!Ln(e,{acceptRelative:!0}))return Gp(e);const[,o="",r,u=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[];let[,a="",s=""]=u.match(/([^#/?]*)(.*)?/)||[];o==="file:"&&(s=s.replace(/\/(?=[A-Za-z]:)/,""));const{pathname:i,search:c,hash:l}=Gp(s);return{protocol:o.toLowerCase(),auth:r?r.slice(0,Math.max(0,r.length-1)):"",host:a,pathname:i,search:c,hash:l,[py]:!o}}function Gp(e=""){const[t="",n="",o=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:o}}function c5(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",o=e.hash||"",r=e.auth?e.auth+"@":"",u=e.host||"";return(e.protocol||e[py]?(e.protocol||"")+"//":"")+r+u+t+n+o}class d5 extends Error{constructor(t,n){super(t,n),this.name="FetchError",n?.cause&&!this.cause&&(this.cause=n.cause)}}function f5(e){const t=e.error?.message||e.error?.toString()||"",n=e.request?.method||e.options?.method||"GET",o=e.request?.url||String(e.request)||"/",r=`[${n}] ${JSON.stringify(o)}`,u=e.response?`${e.response.status} ${e.response.statusText}`:"",a=`${r}: ${u}${t?` ${t}`:""}`,s=new d5(a,e.error?{cause:e.error}:void 0);for(const i of["request","options","response"])Object.defineProperty(s,i,{get(){return e[i]}});for(const[i,c]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(s,i,{get(){return e.response&&e.response[c]}});return s}const p5=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function Yp(e="GET"){return p5.has(e.toUpperCase())}function h5(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer||e instanceof FormData||e instanceof URLSearchParams?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const m5=new Set(["image/svg","application/xml","application/xhtml","application/html"]),g5=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function v5(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return g5.test(t)?"json":t==="text/event-stream"?"stream":m5.has(t)||t.startsWith("text/")?"text":"blob"}function y5(e,t,n,o){const r=b5(t?.headers??e?.headers,n?.headers,o);let u;return(n?.query||n?.params||t?.params||t?.query)&&(u={...n?.params,...n?.query,...t?.params,...t?.query}),{...n,...t,query:u,params:u,headers:r}}function b5(e,t,n){if(!t)return new n(e);const o=new n(t);if(e)for(const[r,u]of Symbol.iterator in e||Array.isArray(e)?e:new n(e))o.set(r,u);return o}async function Ss(e,t){if(t)if(Array.isArray(t))for(const n of t)await n(e);else await t(e)}const E5=new Set([408,409,425,429,500,502,503,504]),C5=new Set([101,204,205,304]);function hy(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:o=globalThis.AbortController}=e;async function r(s){const i=s.error&&s.error.name==="AbortError"&&!s.options.timeout||!1;if(s.options.retry!==!1&&!i){let l;typeof s.options.retry=="number"?l=s.options.retry:l=Yp(s.options.method)?0:1;const d=s.response&&s.response.status||500;if(l>0&&(Array.isArray(s.options.retryStatusCodes)?s.options.retryStatusCodes.includes(d):E5.has(d))){const p=typeof s.options.retryDelay=="function"?s.options.retryDelay(s):s.options.retryDelay||0;return p>0&&await new Promise(h=>setTimeout(h,p)),u(s.request,{...s.options,retry:l-1})}}const c=f5(s);throw Error.captureStackTrace&&Error.captureStackTrace(c,u),c}const u=async function(i,c={}){const l={request:i,options:y5(i,c,e.defaults,n),response:void 0,error:void 0};if(l.options.method&&(l.options.method=l.options.method.toUpperCase()),l.options.onRequest&&(await Ss(l,l.options.onRequest),l.options.headers instanceof n||(l.options.headers=new n(l.options.headers||{}))),typeof l.request=="string"&&(l.options.baseURL&&(l.request=a5(l.request,l.options.baseURL)),l.options.query&&(l.request=ly(l.request,l.options.query),delete l.options.query),"query"in l.options&&delete l.options.query,"params"in l.options&&delete l.options.params),l.options.body&&Yp(l.options.method))if(h5(l.options.body)){const h=l.options.headers.get("content-type");typeof l.options.body!="string"&&(l.options.body=h==="application/x-www-form-urlencoded"?new URLSearchParams(l.options.body).toString():JSON.stringify(l.options.body)),h||l.options.headers.set("content-type","application/json"),l.options.headers.has("accept")||l.options.headers.set("accept","application/json")}else("pipeTo"in l.options.body&&typeof l.options.body.pipeTo=="function"||typeof l.options.body.pipe=="function")&&("duplex"in l.options||(l.options.duplex="half"));let d;if(!l.options.signal&&l.options.timeout){const h=new o;d=setTimeout(()=>{const m=new Error("[TimeoutError]: The operation was aborted due to timeout");m.name="TimeoutError",m.code=23,h.abort(m)},l.options.timeout),l.options.signal=h.signal}try{l.response=await t(l.request,l.options)}catch(h){return l.error=h,l.options.onRequestError&&await Ss(l,l.options.onRequestError),await r(l)}finally{d&&clearTimeout(d)}if((l.response.body||l.response._bodyInit)&&!C5.has(l.response.status)&&l.options.method!=="HEAD"){const h=(l.options.parseResponse?"json":l.options.responseType)||v5(l.response.headers.get("content-type")||"");switch(h){case"json":{const m=await l.response.text(),g=l.options.parseResponse||$x;l.response._data=g(m);break}case"stream":{l.response._data=l.response.body||l.response._bodyInit;break}default:l.response._data=await l.response[h]()}}return l.options.onResponse&&await Ss(l,l.options.onResponse),!l.options.ignoreResponseError&&l.response.status>=400&&l.response.status<600?(l.options.onResponseError&&await Ss(l,l.options.onResponseError),await r(l)):l.response},a=async function(i,c){return(await u(i,c))._data};return a.raw=u,a.native=(...s)=>t(...s),a.create=(s={},i={})=>hy({...e,...i,defaults:{...e.defaults,...i.defaults,...s}}),a}const Ai=(function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")})(),x5=Ai.fetch?(...e)=>Ai.fetch(...e):()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!")),w5=Ai.Headers,D5=Ai.AbortController,A5=hy({fetch:x5,Headers:w5,AbortController:D5}),B5=A5,_5=()=>window?.__NUXT__?.config||window?.useNuxtApp?.().payload?.config,zd=()=>_5().app,k5=()=>zd().baseURL,S5=()=>zd().buildAssetsDir,Ud=(...e)=>dy(my(),S5(),...e),my=(...e)=>{const t=zd(),n=t.cdnURL||t.baseURL;return e.length?dy(n,...e):n};globalThis.__buildAssetsURL=Ud,globalThis.__publicAssetsURL=my;globalThis.$fetch||(globalThis.$fetch=B5.create({baseURL:k5()}));"global"in globalThis||(globalThis.global=globalThis);function t0(e,t={},n){for(const o in e){const r=e[o],u=n?`${n}:${o}`:o;typeof r=="object"&&r!==null?t0(r,t,u):typeof r=="function"&&(t[u]=r)}return t}const gy=(()=>{if(console.createTask)return console.createTask;const e={run:t=>t()};return()=>e})();function vy(e,t,n,o){for(let r=n;re[r](...t)):e[r](...t);if(u&&typeof u.then=="function")return Promise.resolve(u).then(()=>vy(e,t,r+1,o))}catch(u){return Promise.reject(u)}}function T5(e,t,n){if(e.length>0)return vy(e,t,0,gy(n))}function F5(e,t,n){if(e.length>0){const o=gy(n);return Promise.all(e.map(r=>o.run(()=>r(...t))))}}function Yl(e,t){for(const n of[...e])n(t)}var P5=class{_hooks;_before;_after;_deprecatedHooks;_deprecatedMessages;constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(e,t,n={}){if(!e||typeof t!="function")return()=>{};const o=e;let r;for(;this._deprecatedHooks[e];)r=this._deprecatedHooks[e],e=r.to;if(r&&!n.allowDeprecated){let u=r.message;u||(u=`${o} hook has been deprecated`+(r.to?`, please use ${r.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(u)||(console.warn(u),this._deprecatedMessages.add(u))}if(!t.name)try{Object.defineProperty(t,"name",{get:()=>"_"+e.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[e]=this._hooks[e]||[],this._hooks[e].push(t),()=>{t&&(this.removeHook(e,t),t=void 0)}}hookOnce(e,t){let n,o=(...r)=>(typeof n=="function"&&n(),n=void 0,o=void 0,t(...r));return n=this.hook(e,o),n}removeHook(e,t){const n=this._hooks[e];if(n){const o=n.indexOf(t);o!==-1&&n.splice(o,1),n.length===0&&(this._hooks[e]=void 0)}}clearHook(e){this._hooks[e]=void 0}deprecateHook(e,t){this._deprecatedHooks[e]=typeof t=="string"?{to:t}:t;const n=this._hooks[e]||[];this._hooks[e]=void 0;for(const o of n)this.hook(e,o)}deprecateHooks(e){for(const t in e)this.deprecateHook(t,e[t])}addHooks(e){const t=t0(e),n=Object.keys(t).map(o=>this.hook(o,t[o]));return()=>{for(const o of n)o();n.length=0}}removeHooks(e){const t=t0(e);for(const n in t)this.removeHook(n,t[n])}removeAllHooks(){this._hooks={}}callHook(e,...t){return this.callHookWith(T5,e,t)}callHookParallel(e,...t){return this.callHookWith(F5,e,t)}callHookWith(e,t,n){const o=this._before||this._after?{name:t,args:n,context:{}}:void 0;this._before&&Yl(this._before,o);const r=e(this._hooks[t]?[...this._hooks[t]]:[],n,t);return r instanceof Promise?r.finally(()=>{this._after&&o&&Yl(this._after,o)}):(this._after&&o&&Yl(this._after,o),r)}beforeEach(e){return this._before=this._before||[],this._before.push(e),()=>{if(this._before!==void 0){const t=this._before.indexOf(e);t!==-1&&this._before.splice(t,1)}}}afterEach(e){return this._after=this._after||[],this._after.push(e),()=>{if(this._after!==void 0){const t=this._after.indexOf(e);t!==-1&&this._after.splice(t,1)}}}};function yy(){return new P5}function M5(e={}){let t,n=!1;const o=a=>{if(t&&t!==a)throw new Error("Context conflict")};let r;if(e.asyncContext){const a=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;a?r=new a:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const u=()=>{if(r){const a=r.getStore();if(a!==void 0)return a}return t};return{use:()=>{const a=u();if(a===void 0)throw new Error("Context is not available");return a},tryUse:()=>u(),set:(a,s)=>{s||o(a),t=a,n=!0},unset:()=>{t=void 0,n=!1},call:(a,s)=>{o(a),t=a;try{return r?r.run(a,s):s()}finally{n||(t=void 0)}},async callAsync(a,s){t=a;const i=()=>{t=a},c=()=>t===a?i:void 0;n0.add(c);try{const l=r?r.run(a,s):s();return n||(t=void 0),await l}finally{n0.delete(c)}}}}function O5(e={}){const t={};return{get(n,o={}){return t[n]||(t[n]=M5({...e,...o})),t[n]}}}const Bi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},Zp="__unctx__",I5=Bi[Zp]||(Bi[Zp]=O5()),R5=(e,t={})=>I5.get(e,t),Xp="__unctx_async_handlers__",n0=Bi[Xp]||(Bi[Xp]=new Set);function qr(e){const t=[];for(const r of n0){const u=r();u&&t.push(u)}const n=()=>{for(const r of t)r()};let o=e();return o&&typeof o=="object"&&"catch"in o&&(o=o.catch(r=>{throw n(),r})),[o,n]}const Jp=!1,Qp=!1,L5=!1,eh={id:"__nuxt-loader"},q5={componentName:"NuxtLink",prefetch:!0,prefetchOn:{visibility:!0}},$5={deep:!1},N5={},j5="#__nuxt",by="nuxt-app",th=36e5,V5="vite:preloadError";function Ey(e=by){return R5(e,{asyncContext:!1})}const z5="__nuxt_plugin";function U5(e){let t=0;const n={_id:e.id||by||"nuxt-app",_scope:Qa(),provide:void 0,versions:{get nuxt(){return"4.4.2"},get vue(){return n.vueApp.version}},payload:Pn({...e.ssrContext?.payload||{},data:Pn({}),state:_t({}),once:new Set,_errors:Pn({})}),static:{data:{}},runWithContext(r){return n._scope.active&&!ho()?n._scope.run(()=>nh(n,r)):nh(n,r)},isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let r=!1;return()=>{if(!r&&(r=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:Pn({}),_state:Pn({}),_payloadRevivers:{},...e};{const r=window.__NUXT__;if(r)for(const u in r)switch(u){case"data":case"state":case"_errors":Object.assign(n.payload[u],r[u]);break;default:n.payload[u]=r[u]}}n.hooks=yy(),n.hook=n.hooks.hook;{const r=n.hooks.callHook;n.hooks.callHook=(u,...a)=>Promise.resolve().then(()=>r(u,...a))}n.callHook=n.hooks.callHook,n.provide=(r,u)=>{const a="$"+r;Ts(n,a,u),Ts(n.vueApp.config.globalProperties,a,u)},Ts(n.vueApp,"$nuxt",n),Ts(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener(V5,u=>{n.callHook("app:chunkError",{error:u.payload}),u.payload.message.includes("Unable to preload CSS")&&u.preventDefault()}),window.useNuxtApp||=Re;const r=n.hook("app:error",(...u)=>{console.error("[nuxt] error caught during app initialization",...u)});n.hook("app:mounted",r)}const o=n.payload.config;return n.provide("config",o),n}function H5(e,t){t.hooks&&e.hooks.addHooks(t.hooks)}async function K5(e,t){if(typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const o in n)e.provide(o,n[o])}}async function W5(e,t){const n=new Set,o=[],r=[];let u,a=0;async function s(i){const c=i.dependsOn?.filter(l=>t.some(d=>d._name===l)&&!n.has(l))??[];if(c.length>0)o.push([new Set(c),i]);else{const l=K5(e,i).then(async()=>{i._name&&(n.add(i._name),await Promise.all(o.map(async([d,p])=>{d.has(i._name)&&(d.delete(i._name),d.size===0&&(a++,await s(p)))})))}).catch(d=>{if(!i.parallel&&!e.payload.error)throw d;u||=d});i.parallel?r.push(l):await l}}for(const i of t)H5(e,i);for(const i of t)await s(i);if(await Promise.all(r),a)for(let i=0;i{}),e,{[z5]:!0,_name:t})}function nh(e,t,n){const o=()=>t();return Ey(e._id).set(e),e.vueApp.runWithContext(o)}function Cy(e){let t;return Lu()&&(t=We()?.appContext.app.$nuxt),t||=Ey(e).tryUse(),t||null}function Re(e){const t=Cy(e);if(!t)throw new Error("[nuxt] instance unavailable");return t}function Bn(e){return Re().$config}function Ts(e,t,n){Object.defineProperty(e,t,{get:()=>n})}function Zl(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function o0(e,t,n=".",o){if(!Zl(t))return o0(e,{},n,o);const r={...t};for(const u of Object.keys(e)){if(u==="__proto__"||u==="constructor")continue;const a=e[u];a!=null&&(o&&o(r,u,a,n)||(Array.isArray(a)&&Array.isArray(r[u])?r[u]=[...a,...r[u]]:Zl(a)&&Zl(r[u])?r[u]=o0(a,r[u],(n?`${n}.`:"")+u.toString(),o):r[u]=a))}return r}function xy(e){return(...t)=>t.reduce((n,o)=>o0(n,o,"",e),{})}const wt=xy(),G5=xy((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function Y5(e,t){try{return t in e}catch{return!1}}class oh extends Error{static __h3_error__=!0;statusCode=500;fatal=!1;unhandled=!1;statusMessage;data;cause;constructor(t,n={}){super(t,n),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:r0(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=wy(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}function Z5(e){if(typeof e=="string")return new oh(e);if(X5(e))return e;const t=new oh(e.message??e.statusMessage??"",{cause:e.cause||e});if(Y5(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=r0(e.statusCode,t.statusCode):e.status&&(t.statusCode=r0(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;wy(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function X5(e){return e?.constructor?.__h3_error__===!0}function J5(e){const t={};for(const n in e.node.req.headers){const o=e.node.req.headers[n];t[n]=Array.isArray(o)?o.filter(Boolean).join(", "):o}return t}const Q5=/[^\u0009\u0020-\u007E]/g;function wy(e=""){return e.replace(Q5,"")}function r0(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Dy=Symbol("layout-meta"),Oo=Symbol("route");import.meta.url.replace(/\/app\/.*$/,"/");const Xt=()=>Re()?.$router,Yn=()=>Lu()?Ue(Oo,Re()._route):Re()._route;const ew=(e,t,n={})=>{const o=Re(),r=n.global||typeof e!="string",u=typeof e!="string"?e:t;if(!u){console.warn("[nuxt] No route middleware passed to `addRouteMiddleware`.",e);return}r?o._middleware.global.push(u):o._middleware.named[e]=u},tw=()=>{try{if(Re()._processingMiddleware)return!0}catch{return!1}return!1},dl=(e,t)=>{e||="/";const n=typeof e=="string"?e:"path"in e?u0(e):Xt().resolve(e).href;if(t?.open){const{target:c="_blank",windowFeatures:l={}}=t.open,d=[];for(const[p,h]of Object.entries(l))h!==void 0&&d.push(`${p.toLowerCase()}=${h}`);return open(n,c,d.join(", ")),Promise.resolve()}const o=Ln(n,{acceptRelative:!0}),r=t?.external||o;if(r){if(!t?.external)throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const{protocol:c}=new URL(n,window.location.href);if(c&&r5(c))throw new Error(`Cannot navigate to a URL with '${c}' protocol.`)}const u=tw();if(!r&&u){if(t?.replace){if(typeof e=="string"){const{pathname:c,search:l,hash:d}=cl(e);return{path:c,...l&&{query:jd(l)},...d&&{hash:d},replace:!0}}return{...e,replace:!0}}return e}const a=Xt(),s=Re();if(r)return s._scope.stop(),t?.replace?location.replace(n):location.href=n,u?s.isHydrating?new Promise(()=>{}):!1:Promise.resolve();const i=typeof e=="string"?Ay(e):e;return t?.replace?a.replace(i):a.push(i)};function u0(e){return ly(e.path||"",e.query||{})+(e.hash||"")}function Ay(e){const t=cl(e);return Nd(Gx(t.pathname))+t.search+t.hash}const By="__nuxt_error",fl=()=>Ye(Re().payload,"error"),kr=e=>{const t=ar(e);try{const n=fl();Re().hooks.callHook("app:error",t),n.value||=t}catch{throw t}return t},_y=async(e={})=>{const t=Re(),n=fl();t.callHook("app:error:cleared",e),e.redirect&&await Xt().replace(e.redirect),n.value=void 0},ky=e=>!!e&&typeof e=="object"&&By in e,ar=e=>{typeof e!="string"&&e.statusText&&(e.message??=e.statusText);const t=Z5(e);return Object.defineProperty(t,By,{value:!0,configurable:!1,writable:!1}),Object.defineProperty(t,"status",{get:()=>t.statusCode,configurable:!0}),Object.defineProperty(t,"statusText",{get:()=>t.statusMessage,configurable:!0}),t};function nw(e){return Uint8Array.fromBase64(e).buffer}function ow(e){return Uint8Array.from(Buffer.from(e,"base64")).buffer}function rw(e){const t=atob(e),n=t.length,o=new Uint8Array(n);for(let r=0;r=c)throw new Error("Invalid input");l[p]=u(i[d+1])}}else{const c=new Array(i.length);o[a]=c;for(let l=0;l`${ko(e)}=${t}`}},refresh:{metaKey:"http-equiv",unpack:{entrySeparator:";",resolve:({key:e,value:t})=>e==="seconds"?`${t}`:void 0}},robots:{unpack:{entrySeparator:", ",resolve:({key:e,value:t})=>typeof t=="boolean"?ko(e):`${ko(e)}:${t}`}},contentSecurityPolicy:{metaKey:"http-equiv",unpack:{entrySeparator:"; ",resolve:({key:e,value:t})=>`${ko(e)} ${t}`}},charset:{}};function ko(e){const t=e.replace(/([A-Z])/g,"-$1").toLowerCase(),n=t.indexOf("-");return n===-1?t:$a.META.has(t.slice(0,n))||$a.OG.has(t.slice(0,n))?e.replace(/([A-Z])/g,":$1").toLowerCase():t}function Ty(e){return Object.fromEntries(Object.entries(e).filter(([t,n])=>String(n)!=="false"&&t))}function s0(e){return Array.isArray(e)?e.map(s0):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([t,n])=>[ko(t),s0(n)]))}function Fy(e,t={}){const{entrySeparator:n="",keyValueSeparator:o="",wrapValue:r,resolve:u}=t;return Object.entries(e).map(([a,s])=>{if(u){const c=u({key:a,value:s});if(c!==void 0)return c}const i=typeof s=="object"?Fy(s,t):typeof s=="number"?s.toString():typeof s=="string"&&r?`${r}${s.replace(new RegExp(r,"g"),`\\${r}`)}${r}`:s;return`${a}${o}${i}`}).join(n)}function rh(e,t){const n=Ty(t),o=ko(e),r=Py(o);if(!Hd.has(o))return[{[r]:o,...n}];const u=Object.fromEntries(Object.entries(n).map(([a,s])=>[`${e}${a==="url"?"":`${a[0].toUpperCase()}${a.slice(1)}`}`,s]));return _i(u||{}).sort((a,s)=>(a[r]?.length||0)-(s[r]?.length||0))}function Py(e){if(Sy[e]?.metaKey==="http-equiv"||$a.HTTP_EQUIV.has(e))return"http-equiv";const t=ko(e),n=t.indexOf(":");return n===-1?"name":$a.OG.has(t.slice(0,n))?"property":"name"}function Dw(e){return ww[e]||ko(e)}function Aw(e,t){return t==="refresh"?`${e.seconds};url=${e.url}`:Fy(s0(e),{keyValueSeparator:"=",entrySeparator:", ",resolve:({value:n,key:o})=>n===null?"":typeof n=="boolean"?o:void 0,...Sy[t]?.unpack})}function _i(e){const t=[],n={};for(const[r,u]of Object.entries(e)){if(Array.isArray(u)){if(r==="themeColor"){u.forEach(a=>{typeof a=="object"&&a!==null&&t.push({name:"theme-color",...a})});continue}for(const a of u)if(typeof a=="object"&&a!==null){const s=[],i=[];for(const[c,l]of Object.entries(a)){const d=`${r}${c==="url"?"":`:${c}`}`,p=_i({[d]:l});(c==="url"?s:i).push(...p)}t.push(...s,...i)}else t.push(...typeof a=="string"?_i({[r]:a}):rh(r,a));continue}if(typeof u=="object"&&u)if($a.MEDIA.has(r)){const a=r.startsWith("twitter")?"twitter":"og",s=r.replace(/^(og|twitter)/,"").toLowerCase(),i=a==="twitter"?"name":"property";u.url&&t.push({[i]:`${a}:${s}`,content:u.url}),u.secureUrl&&t.push({[i]:`${a}:${s}:secure_url`,content:u.secureUrl});for(const[c,l]of Object.entries(u))c!=="url"&&c!=="secureUrl"&&t.push({[i]:`${a}:${s}:${c}`,content:l})}else Hd.has(ko(r))?t.push(...rh(r,u)):n[r]=Ty(u);else n[r]=u}const o=Object.entries(n).map(([r,u])=>{if(r==="charset")return{charset:u===null?"_null":u};const a=Py(r),s=Dw(r),i=u===null?"_null":typeof u=="object"?Aw(u,r):typeof u=="number"?u.toString():u;return a==="http-equiv"?{"http-equiv":s,content:i}:{[a]:s,content:i}});return[...t,...o].map(r=>"content"in r&&r.content==="_null"?{...r,content:null}:r)}const Bw={key:"flatMeta",hooks:{"entries:normalize":e=>{const t=[];e.tags=e.tags.map(n=>n.tag!=="_flatMeta"?n:(t.push(_i(n.props).map(o=>({...n,tag:"meta",props:o}))),!1)).filter(Boolean).concat(...t)}}},_w=["name","property","http-equiv"],kw=new Set(["viewport","description","keywords","robots"]);function My(e){const t=e.split(":");return t.length?Hd.has(t[1]):!1}function i0(e){const{props:t,tag:n}=e;if(Ew.has(n))return n;if(n==="link"&&t.rel==="canonical")return"canonical";if(n==="link"&&t.rel==="alternate"){const o=t.hreflang||t.type;if(o)return`alternate:${o}`}if(t.charset)return"charset";if(e.tag==="meta"){for(const o of _w)if(t[o]!==void 0){const r=t[o],u=r&&typeof r=="string"&&r.includes(":"),a=r&&kw.has(r),i=!(u||a)&&e.key?`:key:${e.key}`:"";return`${n}:${r}${i}`}}if(e.key)return`${n}:key:${e.key}`;if(t.id)return`${n}:id:${t.id}`;if(n==="link"&&t.rel==="alternate")return`alternate:${t.href||""}`;if(yw.has(n)){const o=e.textContent||e.innerHTML;if(o)return`${n}:content:${o}`}}function Oy(e){const t=e._h||e._d;if(t)return t;const n=e.textContent||e.innerHTML;return n||`${e.tag}:${Object.entries(e.props).map(([o,r])=>`${o}:${String(r)}`).join(",")}`}function ki(e,t,n){typeof e==="function"&&(!n||n!=="titleTemplate"&&!(n[0]==="o"&&n[1]==="n"))&&(e=e());const r=t?t(n,e):e;if(Array.isArray(r))return r.map(u=>ki(u,t));if(r?.constructor===Object){const u={};for(const a of Object.keys(r))u[a]=ki(r[a],t,a);return u}return r}function Sw(e,t){const n=e==="style"?new Map:new Set;function o(r){if(r==null||r===void 0)return;const u=String(r).trim();if(u)if(e==="style"){const[a,...s]=u.split(":").map(i=>i?i.trim():"");a&&s.length&&n.set(a,s.join(":"))}else u.split(" ").filter(Boolean).forEach(a=>n.add(a))}return typeof t=="string"?e==="style"?t.split(";").forEach(o):o(t):Array.isArray(t)?t.forEach(r=>o(r)):t&&typeof t=="object"&&Object.entries(t).forEach(([r,u])=>{u&&u!=="false"&&(e==="style"?n.set(String(r).trim(),String(u)):o(r))}),n}function Iy(e,t){if(e.props=e.props||{},!t)return e;if(e.tag==="templateParams")return e.props=t,e;const n=a0.has(e.tag)||e.tag==="htmlAttrs"||e.tag==="bodyAttrs";return Object.entries(t).forEach(([o,r])=>{if(o==="__proto__"||o==="constructor"||o==="prototype")return;if(r===null){e.props[o]=null;return}if(o==="class"||o==="style"){e.props[o]=Sw(o,r);return}if(Cw.has(o)){if((o==="textContent"||o==="innerHTML")&&typeof r=="object"){let c=t.type;if(t.type||(c="application/json"),!c?.endsWith("json")&&c!=="speculationrules")return;t.type=c,e.props.type=c,e[o]=JSON.stringify(r)}else e[o]=r;return}const u=o.startsWith("data-"),a=n&&!u?o.toLowerCase():o,s=String(r),i=e.tag==="meta"&&a==="content";s==="true"||s===""?e.props[a]=u||i?s:!0:!r&&u&&s==="false"?e.props[a]="false":r!==void 0&&(e.props[a]=r)}),e}function Tw(e,t){const n=typeof t=="object"&&typeof t!="function"?t:{[e==="script"||e==="noscript"||e==="style"?"innerHTML":"textContent"]:t},o=Iy({tag:e,props:{}},n);return o.key&&vw.has(o.tag)&&(o.props["data-hid"]=o._h=o.key),o.tag==="script"&&typeof o.innerHTML=="object"&&(o.innerHTML=JSON.stringify(o.innerHTML),o.props.type=o.props.type||"application/json"),Array.isArray(o.props.content)?o.props.content.map(r=>({...o,props:{...o.props,content:r}})):o}function Fw(e,t){if(!e)return[];typeof e=="function"&&(e=e());const n=(r,u)=>{for(let a=0;a{if(u!==void 0)for(const a of Array.isArray(u)?u:[u])o.push(Tw(r,a))}),o.flat()}const uh=(e,t)=>e._w===t._w?e._p-t._p:e._w-t._w,ah={base:-10,title:10},Pw={critical:-8,high:-1,low:2},sh={meta:{"content-security-policy":-30,charset:-20,viewport:-15},link:{preconnect:20,stylesheet:60,preload:70,modulepreload:70,prefetch:90,"dns-prefetch":90,prerender:90},script:{async:30,defer:80,sync:50},style:{imported:40,sync:60}},Mw=/@import/,na=e=>e===""||e===!0;function Ow(e,t){if(typeof t.tagPriority=="number")return t.tagPriority;let n=100;const o=Pw[t.tagPriority]||0,r=e.resolvedOptions.disableCapoSorting?{link:{},script:{},style:{}}:sh;if(t.tag in ah)n=ah[t.tag];else if(t.tag==="meta"){const u=t.props["http-equiv"]==="content-security-policy"?"content-security-policy":t.props.charset?"charset":t.props.name==="viewport"?"viewport":null;u&&(n=sh.meta[u])}else if(t.tag==="link"&&t.props.rel)n=r.link[t.props.rel];else if(t.tag==="script"){const u=String(t.props.type);na(t.props.async)?n=r.script.async:t.props.src&&!na(t.props.defer)&&!na(t.props.async)&&u!=="module"&&!u.endsWith("json")||t.innerHTML&&!u.endsWith("json")?n=r.script.sync:(na(t.props.defer)&&t.props.src&&!na(t.props.async)||u==="module")&&(n=r.script.defer)}else t.tag==="style"&&(n=t.innerHTML&&Mw.test(t.innerHTML)?r.style.imported:r.style.sync);return(n||100)+o}function ih(e,t){const n=typeof t=="function"?t(e):t,o=n.key||String(e.plugins.size+1);e.plugins.get(o)||(e.plugins.set(o,n),e.hooks.addHooks(n.hooks||{}))}function Iw(e={}){const t=yy();t.addHooks(e.hooks||{});const n=!e.document,o=new Map,r=new Map,u=new Set,a={_entryCount:1,plugins:r,dirty:!1,resolvedOptions:e,hooks:t,ssr:n,entries:o,headEntries(){return[...o.values()]},use:s=>ih(a,s),push(s,i){const c={...i||{}};delete c.head;const l=c._index??a._entryCount++,d={_i:l,input:s,options:c},p={_poll(h=!1){a.dirty=!0,!h&&u.add(l),t.callHook("entries:updated",a)},dispose(){o.delete(l)&&a.invalidate()},patch(h){(!c.mode||c.mode==="server"&&n||c.mode==="client"&&!n)&&(d.input=h,o.set(l,d),p._poll())}};return p.patch(s),p},async resolveTags(){const s={tagMap:new Map,tags:[],entries:[...a.entries.values()]};for(await t.callHook("entries:resolve",s);u.size;){const p=u.values().next().value;u.delete(p);const h=o.get(p);if(h){const m={tags:Fw(h.input,e.propResolvers||[]).map(g=>Object.assign(g,h.options)),entry:h};await t.callHook("entries:normalize",m),h._tags=m.tags.map((g,y)=>(g._w=Ow(a,g),g._p=(h._i<<10)+y,g._d=i0(g),g._d||(g._h=Oy(g)),g))}}let i=!1;s.entries.flatMap(p=>(p._tags||[]).map(h=>({...h,props:{...h.props}}))).sort(uh).reduce((p,h)=>{const m=h._d||h._h;if(!p.has(m))return p.set(m,h);const g=p.get(m);if((h?.tagDuplicateStrategy||(xw.has(h.tag)?"merge":null)||(h.key&&h.key===g.key?"merge":null))==="merge"){const E={...g.props};Object.entries(h.props).forEach(([b,v])=>E[b]=b==="style"?new Map([...g.props.style||new Map,...v]):b==="class"?new Set([...g.props.class||new Set,...v]):v),p.set(m,{...h,props:E})}else h._p>>10===g._p>>10&&h.tag==="meta"&&My(m)?(p.set(m,Object.assign([...Array.isArray(g)?g:[g],h],h)),i=!0):(h._w===g._w?h._p>g._p:h?._wih(a,s)),a.hooks.callHook("init",a),e.init?.forEach(s=>s&&a.push(s)),a}const Rw=(e,t)=>rt(t)?ke(t):t,Kd="usehead";function Lw(e){return{install(n){n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(Kd,e)}}.install}function Ry(){if(Lu()){const e=Ue(Kd);if(e)return e}throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.")}function Ly(e,t={}){const n=t.head||Ry();return n.ssr?n.push(e||{},t):qw(n,e,t)}function qw(e,t,n={}){const o=R(!1);let r;return Ze(()=>{const a=o.value?{}:ki(t,Rw);r?r.patch(a):r=e.push(a,n)}),We()&&(mo(()=>{r.dispose()}),av(()=>{o.value=!0}),uv(()=>{o.value=!1})),r}function $w(e={},t={}){(t.head||Ry()).use(Bw);const{title:o,titleTemplate:r,...u}=e;return Ly({title:o,titleTemplate:r,_flatMeta:u},t)}function qy(e){const t=e||Re();return t.ssrContext?.head||t.runWithContext(()=>{if(Lu()){const n=Ue(Kd);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function Wd(e,t={}){const n=t.head||qy(t.nuxt);return Ly(e,{head:n,...t})}function $y(e,t={}){const n=t.head||qy(t.nuxt);return $w(e,{head:n,...t})}const Nw=(()=>{const e={prerender:!0},t={},n={payload:!1};return(o,r)=>{let u=[];r.charCodeAt(r.length-1)===47&&(r=r.slice(0,-1)||"/"),r==="/__nuxt_content/docs/sql_dump.txt"?u.unshift({data:e}):r==="/__nuxt_content/landing/sql_dump.txt"?u.unshift({data:e}):r==="/_nuxt"&&u.unshift({data:t});let a=r.split("/"),s=a.length;return s>1&&(a[1]==="__nuxt_content"?u.unshift({data:n,params:{_:a.slice(2).join("/")}}):a[1]==="_og"&&s>2&&(a[2]==="d"?u.unshift({data:t,params:{_:a.slice(3).join("/")}}):a[2]==="r"?u.unshift({data:t,params:{_:a.slice(3).join("/")}}):a[2]==="s"&&u.unshift({data:t,params:{_:a.slice(3).join("/")}}))),u}})(),Ny=e=>wt({},...Nw("",e).map(t=>t.data).reverse()),jw=Ny;let ni;function Vw(){return ni=$fetch(Ud(`builds/meta/${Bn().app.buildId}.json`),{responseType:"json"}),ni.catch(e=>{console.error("[nuxt] Error fetching app manifest.",e)}),ni}function Gd(){return ni||Vw()}function pl(e){const t=typeof e=="string"?e:e.path;try{return jw(t)}catch(n){return console.error("[nuxt] Error matching route rules.",n),{}}}async function lh(e,t={}){if(await Hw(e)){const n=await Uw(e,t);return await jy(n)||null}return null}const zw="_payload.json";async function Uw(e,t={}){const n=new URL(e,"http://localhost");if(n.host!=="localhost"||Ln(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const o=Bn(),r=t.hash||(t.fresh?Date.now():o.app.buildId),u=o.app.cdnURL,a=u&&await Kw(e)?u:o.app.baseURL;return cr(a,n.pathname,zw+(r?`?${r}`:""))}async function jy(e){const t=fetch(e,{cache:"force-cache"}).then(n=>n.text().then(Uy));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}function Vy(e){if(e.redirect)return!1;if(e.prerender)return!0}async function zy(e){return e=e==="/"?e:e.replace(/\/$/,""),(await Gd()).prerendered.includes(e)}async function Hw(e=Yn().path){const t=pl({path:e});if(t.ssr===!1)return!1;const n=Vy(t);return n!==void 0?n:t.payload?!0:await zy(e)}async function Kw(e=Yn().path){const t=Vy(pl({path:e}));return t!==void 0?t:await zy(e)}let Cr=null;async function Ww(){if(Cr)return Cr;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await Uy(e.textContent||""),n=e.dataset.src?await jy(e.dataset.src):void 0;return Cr={...t,...n,...window.__NUXT__},Cr.config?.public&&(Cr.config.public=_t(Cr.config.public)),Cr}async function Uy(e){return await mw(e,Re()._payloadRevivers)}function Gw(e,t){Re()._payloadRevivers[e]=t}function ch(e){try{return JSON.parse(e)}catch{return e}}const Hy=[["NuxtError",e=>ar(e)],["EmptyShallowRef",e=>Me(e==="_"?void 0:e==="0n"?BigInt(0):ch(e))],["EmptyRef",e=>R(e==="_"?void 0:e==="0n"?BigInt(0):ch(e))],["ShallowRef",e=>Me(e)],["ShallowReactive",e=>Pn(e)],["Ref",e=>R(e)],["Reactive",e=>_t(e)]];Hy.push(["Island",({key:e,params:t,result:n})=>{const o=Re();return o.isHydrating||(o.payload.data[e]||=$fetch(`/__nuxt_island/${e}.json`,{responseType:"json",...t?{params:t}:{}}).then(r=>(o.payload.data[e]=r,r))),{html:"",...n}}]);const Yw=vn({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const[o,r]of Hy)Gw(o,r);Object.assign(e.payload,([t,n]=qr(()=>e.runWithContext(Ww)),t=await t,n(),t)),delete window.__NUXT__}});async function Yd(e,t={}){const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const o={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",o),!!o.shouldRender)return e._domUpdatePromise||(e._domUpdatePromise=new Promise(async r=>{const u=new Map,a=new Promise(h=>{e.resolveTags().then(m=>{h(m.map(g=>{const y=u.get(g._d)||0,E={tag:g,id:(y?`${g._d}:${y}`:g._d)||g._h,shouldRender:!0};return g._d&&My(g._d)&&u.set(g._d,y+1),E}))})});let s=e._dom;if(!s){s={title:n.title,elMap:new Map().set("htmlAttrs",n.documentElement).set("bodyAttrs",n.body)};for(const h of["body","head"]){const m=n[h]?.children;for(const g of m){const y=g.tagName.toLowerCase();if(!a0.has(y))continue;const E=Iy({tag:y,props:{}},{innerHTML:g.innerHTML,...g.getAttributeNames().reduce((b,v)=>(b[v]=g.getAttribute(v),b),{})||{}});if(E.key=g.getAttribute("data-hid")||void 0,E._d=i0(E)||Oy(E),s.elMap.has(E._d)){let b=1,v=E._d;for(;s.elMap.has(v);)v=`${E._d}:${b++}`;s.elMap.set(v,g)}else s.elMap.set(E._d,g)}}}s.pendingSideEffects={...s.sideEffects},s.sideEffects={};function i(h,m,g){const y=`${h}:${m}`;s.sideEffects[y]=g,delete s.pendingSideEffects[y]}function c({id:h,$el:m,tag:g}){const y=g.tag.endsWith("Attrs");s.elMap.set(h,m),y||(g.textContent&&g.textContent!==m.textContent&&(m.textContent=g.textContent),g.innerHTML&&g.innerHTML!==m.innerHTML&&(m.innerHTML=g.innerHTML),i(h,"el",()=>{m?.remove(),s.elMap.delete(h)}));for(const E in g.props){if(!Object.prototype.hasOwnProperty.call(g.props,E))continue;const b=g.props[E];if(E.startsWith("on")&&typeof b=="function"){const C=m?.dataset;if(C&&C[`${E}fired`]){const w=E.slice(0,-5);b.call(m,new Event(w.substring(2)))}m.getAttribute(`data-${E}`)!==""&&((g.tag==="bodyAttrs"?n.defaultView:m).addEventListener(E.substring(2),b.bind(m)),m.setAttribute(`data-${E}`,""));continue}const v=`attr:${E}`;if(E==="class"){if(!b)continue;for(const C of b)y&&i(h,`${v}:${C}`,()=>m.classList.remove(C)),!m.classList.contains(C)&&m.classList.add(C)}else if(E==="style"){if(!b)continue;for(const[C,w]of b)i(h,`${v}:${C}`,()=>{m.style.removeProperty(C)}),m.style.setProperty(C,w)}else b!==!1&&b!==null&&(m.getAttribute(E)!==b&&m.setAttribute(E,b===!0?"":String(b)),y&&i(h,v,()=>m.removeAttribute(E)))}}const l=[],d={bodyClose:void 0,bodyOpen:void 0,head:void 0},p=await a;for(const h of p){const{tag:m,shouldRender:g,id:y}=h;if(g){if(m.tag==="title"){n.title=m.textContent,i("title","",()=>n.title=s.title);continue}h.$el=h.$el||s.elMap.get(y),h.$el?c(h):a0.has(m.tag)&&l.push(h)}}for(const h of l){const m=h.tag.tagPosition||"head";h.$el=n.createElement(h.tag.tag),c(h),d[m]=d[m]||n.createDocumentFragment(),d[m].appendChild(h.$el)}for(const h of p)await e.hooks.callHook("dom:renderTag",h,n,i);d.head&&n.head.appendChild(d.head),d.bodyOpen&&n.body.insertBefore(d.bodyOpen,n.body.firstChild),d.bodyClose&&n.body.appendChild(d.bodyClose);for(const h in s.pendingSideEffects)s.pendingSideEffects[h]();e._dom=s,await e.hooks.callHook("dom:rendered",{renders:p}),r()}).finally(()=>{e._domUpdatePromise=void 0,e.dirty=!1})),e._domUpdatePromise}function Zw(e={}){const t=e.domOptions?.render||Yd;e.document=e.document||(typeof window<"u"?document:void 0);const n=e.document?.head.querySelector('script[id="unhead:payload"]')?.innerHTML||!1;return Iw({...e,plugins:[...e.plugins||[],{key:"client",hooks:{"entries:updated":t}}],init:[n?JSON.parse(n):!1,...e.init||[]]})}function Xw(e,t){let n=0;return()=>{const o=++n;t(()=>{n===o&&e()})}}function Jw(e={}){const t=Zw({domOptions:{render:Xw(()=>Yd(t),n=>setTimeout(n,0))},...e});return t.install=Lw(t),t}const Qw={disableDefaults:!0},eD=vn({name:"nuxt:head",enforce:"pre",setup(e){const t=Jw(Qw);e.vueApp.use(t);{let n=!0;const o=async()=>{n=!1,await Yd(t)};t.hooks.hook("dom:beforeRender",r=>{r.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||o()}),e.hooks.hook("app:error",o),e.hooks.hook("app:suspense:resolve",o)}}});const au=typeof document<"u";function Ky(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function tD(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Ky(e.default)}const nt=Object.assign;function Xl(e,t){const n={};for(const o in t){const r=t[o];n[o]=Kn(r)?r.map(e):e(r)}return n}const Da=()=>{},Kn=Array.isArray;function dh(e,t){const n={};for(const o in e)n[o]=o in t?t[o]:e[o];return n}let Ct=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const Wy=Symbol("");Ct.MATCHER_NOT_FOUND+"",Ct.NAVIGATION_GUARD_REDIRECT+"",Ct.NAVIGATION_ABORTED+"",Ct.NAVIGATION_CANCELLED+"",Ct.NAVIGATION_DUPLICATED+"";function _u(e,t){return nt(new Error,{type:e,[Wy]:!0},t)}function Eo(e,t){return e instanceof Error&&Wy in e&&(t==null||!!(e.type&t))}const nD=["params","query","hash"];function oD(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of nD)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}const rD=Symbol(""),fh=Symbol(""),Zd=Symbol(""),Xd=Symbol(""),l0=Symbol("");function Gy(e){return Ue(Xd)}const uD={trailing:!0};function aD(e,t=25,n={}){if(n={...uD,...n},!Number.isFinite(t))throw new TypeError("Expected `wait` to be a finite number");let o,r,u=[],a,s;const i=(d,p)=>(a=sD(e,d,p),a.finally(()=>{if(a=null,n.trailing&&s&&!r){const h=i(d,s);return s=null,h}}),a),c=function(...d){return n.trailing&&(s=d),a||new Promise(p=>{const h=!r&&n.leading;clearTimeout(r),r=setTimeout(()=>{r=null;const m=n.leading?o:i(this,d);s=null;for(const g of u)g(m);u=[]},t),h?(o=i(this,d),p(o)):u.push(p)})},l=d=>{d&&(clearTimeout(d),r=null)};return c.isPending=()=>!!r,c.cancel=()=>{l(r),u=[],s=null},c.flush=()=>{if(l(r),!s||a)return;const d=s;return s=null,i(this,d)},c}async function sD(e,t,n){return await e.apply(t,n)}const Yy=/#/g,iD=/&/g,lD=/\//g,cD=/=/g,dD=/\?/g,Zy=/\+/g,fD=/%5B/g,pD=/%5D/g,Xy=/%5E/g,hD=/%60/g,Jy=/%7B/g,mD=/%7C/g,Qy=/%7D/g,gD=/%20/g;function Jd(e){return e==null?"":encodeURI(""+e).replace(mD,"|").replace(fD,"[").replace(pD,"]")}function vD(e){return Jd(e).replace(Jy,"{").replace(Qy,"}").replace(Xy,"^")}function c0(e){return Jd(e).replace(Zy,"%2B").replace(gD,"+").replace(Yy,"%23").replace(iD,"%26").replace(hD,"`").replace(Jy,"{").replace(Qy,"}").replace(Xy,"^")}function yD(e){return c0(e).replace(cD,"%3D")}function bD(e){return Jd(e).replace(Yy,"%23").replace(dD,"%3F")}function ED(e){return bD(e).replace(lD,"%2F")}function Na(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const CD=/\/$/,xD=e=>e.replace(CD,"");function Jl(e,t,n="/"){let o,r={},u="",a="";const s=t.indexOf("#");let i=t.indexOf("?");return i=s>=0&&i>s?-1:i,i>=0&&(o=t.slice(0,i),u=t.slice(i,s>0?s:t.length),r=e(u.slice(1))),s>=0&&(o=o||t.slice(0,s),a=t.slice(s,t.length)),o=BD(o??t,n),{fullPath:o+u+a,path:o,query:r,hash:Na(a)}}function wD(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function ph(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function DD(e,t,n){const o=t.matched.length-1,r=n.matched.length-1;return o>-1&&o===r&&ku(t.matched[o],n.matched[r])&&e3(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function ku(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function e3(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!AD(e[n],t[n]))return!1;return!0}function AD(e,t){return Kn(e)?hh(e,t):Kn(t)?hh(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function hh(e,t){return Kn(t)?e.length===t.length&&e.every((n,o)=>n===t[o]):e.length===1&&e[0]===t}function BD(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),o=e.split("/"),r=o[o.length-1];(r===".."||r===".")&&o.push("");let u=n.length-1,a,s;for(a=0;a1&&u--;else break;return n.slice(0,u).join("/")+"/"+o.slice(a).join("/")}const Fn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let d0=(function(e){return e.pop="pop",e.push="push",e})({}),Ql=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function _D(e){if(!e)if(au){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),xD(e)}const kD=/^[^#]+#/;function SD(e,t){return e.replace(kD,"#")+t}function TD(e,t){const n=document.documentElement.getBoundingClientRect(),o=e.getBoundingClientRect();return{behavior:t.behavior,left:o.left-n.left-(t.left||0),top:o.top-n.top-(t.top||0)}}const hl=()=>({left:window.scrollX,top:window.scrollY});function FD(e){let t;if("el"in e){const n=e.el,o=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?o?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=TD(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function mh(e,t){return(history.state?history.state.position-t:-1)+e}const f0=new Map;function PD(e,t){f0.set(e,t)}function MD(e){const t=f0.get(e);return f0.delete(e),t}function OD(e){return typeof e=="string"||e&&typeof e=="object"}function t3(e){return typeof e=="string"||typeof e=="symbol"}function ID(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;or&&c0(r)):[o&&c0(o)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+n,r!=null&&(t+="="+r))})}return t}function RD(e){const t={};for(const n in e){const o=e[n];o!==void 0&&(t[n]=Kn(o)?o.map(r=>r==null?null:""+r):o==null?o:""+o)}return t}function oa(){let e=[];function t(o){return e.push(o),()=>{const r=e.indexOf(o);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function er(e,t,n,o,r,u=a=>a()){const a=o&&(o.enterCallbacks[r]=o.enterCallbacks[r]||[]);return()=>new Promise((s,i)=>{const c=p=>{p===!1?i(_u(Ct.NAVIGATION_ABORTED,{from:n,to:t})):p instanceof Error?i(p):OD(p)?i(_u(Ct.NAVIGATION_GUARD_REDIRECT,{from:t,to:p})):(a&&o.enterCallbacks[r]===a&&typeof p=="function"&&a.push(p),s())},l=u(()=>e.call(o&&o.instances[r],t,n,c));let d=Promise.resolve(l);e.length<3&&(d=d.then(c)),d.catch(p=>i(p))})}function ec(e,t,n,o,r=u=>u()){const u=[];for(const a of e)for(const s in a.components){let i=a.components[s];if(!(t!=="beforeRouteEnter"&&!a.instances[s]))if(Ky(i)){const c=(i.__vccOpts||i)[t];c&&u.push(er(c,n,o,a,s,r))}else{let c=i();u.push(()=>c.then(l=>{if(!l)throw new Error(`Couldn't resolve component "${s}" at "${a.path}"`);const d=tD(l)?l.default:l;a.mods[s]=l,a.components[s]=d;const p=(d.__vccOpts||d)[t];return p&&er(p,n,o,a,s,r)()}))}}return u}function LD(e,t){const n=[],o=[],r=[],u=Math.max(t.matched.length,e.matched.length);for(let a=0;aku(c,s))?o.push(s):n.push(s));const i=e.matched[a];i&&(t.matched.find(c=>ku(c,i))||r.push(i))}return[n,o,r]}let qD=()=>location.protocol+"//"+location.host;function n3(e,t){const{pathname:n,search:o,hash:r}=t,u=e.indexOf("#");if(u>-1){let a=r.includes(e.slice(u))?e.slice(u).length:1,s=r.slice(a);return s[0]!=="/"&&(s="/"+s),ph(s,"")}return ph(n,e)+o+r}function $D(e,t,n,o){let r=[],u=[],a=null;const s=({state:p})=>{const h=n3(e,location),m=n.value,g=t.value;let y=0;if(p){if(n.value=h,t.value=p,a&&a===m){a=null;return}y=g?p.position-g.position:0}else o(h);r.forEach(E=>{E(n.value,m,{delta:y,type:d0.pop,direction:y?y>0?Ql.forward:Ql.back:Ql.unknown})})};function i(){a=n.value}function c(p){r.push(p);const h=()=>{const m=r.indexOf(p);m>-1&&r.splice(m,1)};return u.push(h),h}function l(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(nt({},p.state,{scroll:hl()}),"")}}function d(){for(const p of u)p();u=[],window.removeEventListener("popstate",s),window.removeEventListener("pagehide",l),document.removeEventListener("visibilitychange",l)}return window.addEventListener("popstate",s),window.addEventListener("pagehide",l),document.addEventListener("visibilitychange",l),{pauseListeners:i,listen:c,destroy:d}}function vh(e,t,n,o=!1,r=!1){return{back:e,current:t,forward:n,replaced:o,position:window.history.length,scroll:r?hl():null}}function ND(e){const{history:t,location:n}=window,o={value:n3(e,n)},r={value:t.state};r.value||u(o.value,{back:null,current:o.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function u(i,c,l){const d=e.indexOf("#"),p=d>-1?(n.host&&document.querySelector("base")?e:e.slice(d))+i:qD()+e+i;try{t[l?"replaceState":"pushState"](c,"",p),r.value=c}catch(h){console.error(h),n[l?"replace":"assign"](p)}}function a(i,c){u(i,nt({},t.state,vh(r.value.back,i,r.value.forward,!0),c,{position:r.value.position}),!0),o.value=i}function s(i,c){const l=nt({},r.value,t.state,{forward:i,scroll:hl()});u(l.current,l,!0),u(i,nt({},vh(o.value,i,null),{position:l.position+1},c),!1),o.value=i}return{location:o,state:r,push:s,replace:a}}function jD(e){e=_D(e);const t=ND(e),n=$D(e,t.state,t.location,t.replace);function o(u,a=!0){a||n.pauseListeners(),history.go(u)}const r=nt({location:"",base:e,go:o,createHref:SD.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let Fr=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Ot=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Ot||{});const VD={type:Fr.Static,value:""},zD=/[a-zA-Z0-9_]/;function UD(e){if(!e)return[[]];if(e==="/")return[[VD]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${n})/"${c}": ${h}`)}let n=Ot.Static,o=n;const r=[];let u;function a(){u&&r.push(u),u=[]}let s=0,i,c="",l="";function d(){c&&(n===Ot.Static?u.push({type:Fr.Static,value:c}):n===Ot.Param||n===Ot.ParamRegExp||n===Ot.ParamRegExpEnd?(u.length>1&&(i==="*"||i==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),u.push({type:Fr.Param,value:c,regexp:l,repeatable:i==="*"||i==="+",optional:i==="*"||i==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=i}for(;st.length?t.length===1&&t[0]===tn.Static+tn.Segment?1:-1:0}function o3(e,t){let n=0;const o=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const YD={strict:!1,end:!0,sensitive:!1};function ZD(e,t,n){const o=WD(UD(e.path),n),r=nt(o,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function XD(e,t){const n=[],o=new Map;t=dh(YD,t);function r(d){return o.get(d)}function u(d,p,h){const m=!h,g=Ch(d);g.aliasOf=h&&h.record;const y=dh(t,d),E=[g];if("alias"in d){const C=typeof d.alias=="string"?[d.alias]:d.alias;for(const w of C)E.push(Ch(nt({},g,{components:h?h.record.components:g.components,path:w,aliasOf:h?h.record:g})))}let b,v;for(const C of E){const{path:w}=C;if(p&&w[0]!=="/"){const B=p.record.path,x=B[B.length-1]==="/"?"":"/";C.path=p.record.path+(w&&x+w)}if(b=ZD(C,p,y),h?h.alias.push(b):(v=v||b,v!==b&&v.alias.push(b),m&&d.name&&!xh(b)&&a(d.name)),r3(b)&&i(b),g.children){const B=g.children;for(let x=0;x{a(v)}:Da}function a(d){if(t3(d)){const p=o.get(d);p&&(o.delete(d),n.splice(n.indexOf(p),1),p.children.forEach(a),p.alias.forEach(a))}else{const p=n.indexOf(d);p>-1&&(n.splice(p,1),d.record.name&&o.delete(d.record.name),d.children.forEach(a),d.alias.forEach(a))}}function s(){return n}function i(d){const p=eA(d,n);n.splice(p,0,d),d.record.name&&!xh(d)&&o.set(d.record.name,d)}function c(d,p){let h,m={},g,y;if("name"in d&&d.name){if(h=o.get(d.name),!h)throw _u(Ct.MATCHER_NOT_FOUND,{location:d});y=h.record.name,m=nt(Eh(p.params,h.keys.filter(v=>!v.optional).concat(h.parent?h.parent.keys.filter(v=>v.optional):[]).map(v=>v.name)),d.params&&Eh(d.params,h.keys.map(v=>v.name))),g=h.stringify(m)}else if(d.path!=null)g=d.path,h=n.find(v=>v.re.test(g)),h&&(m=h.parse(g),y=h.record.name);else{if(h=p.name?o.get(p.name):n.find(v=>v.re.test(p.path)),!h)throw _u(Ct.MATCHER_NOT_FOUND,{location:d,currentLocation:p});y=h.record.name,m=nt({},p.params,d.params),g=h.stringify(m)}const E=[];let b=h;for(;b;)E.unshift(b.record),b=b.parent;return{name:y,path:g,params:m,matched:E,meta:QD(E)}}e.forEach(d=>u(d));function l(){n.length=0,o.clear()}return{addRoute:u,resolve:c,removeRoute:a,clearRoutes:l,getRoutes:s,getRecordMatcher:r}}function Eh(e,t){const n={};for(const o of t)o in e&&(n[o]=e[o]);return n}function Ch(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:JD(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function JD(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const o in e.components)t[o]=typeof n=="object"?n[o]:n;return t}function xh(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function QD(e){return e.reduce((t,n)=>nt(t,n.meta),{})}function eA(e,t){let n=0,o=t.length;for(;n!==o;){const u=n+o>>1;o3(e,t[u])<0?o=u:n=u+1}const r=tA(e);return r&&(o=t.lastIndexOf(r,o-1)),o}function tA(e){let t=e;for(;t=t.parent;)if(r3(t)&&o3(e,t)===0)return t}function r3({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function wh(e){const t=Ue(Zd),n=Ue(Xd),o=F(()=>{const i=f(e.to);return t.resolve(i)}),r=F(()=>{const{matched:i}=o.value,{length:c}=i,l=i[c-1],d=n.matched;if(!l||!d.length)return-1;const p=d.findIndex(ku.bind(null,l));if(p>-1)return p;const h=Dh(i[c-2]);return c>1&&Dh(l)===h&&d[d.length-1].path!==h?d.findIndex(ku.bind(null,i[c-2])):p}),u=F(()=>r.value>-1&&aA(n.params,o.value.params)),a=F(()=>r.value>-1&&r.value===n.matched.length-1&&e3(n.params,o.value.params));function s(i={}){if(uA(i)){const c=t[f(e.replace)?"replace":"push"](f(e.to)).catch(Da);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:o,href:F(()=>o.value.href),isActive:u,isExactActive:a,navigate:s}}function nA(e){return e.length===1?e[0]:e}const oA=L({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:wh,setup(e,{slots:t}){const n=_t(wh(e)),{options:o}=Ue(Zd),r=F(()=>({[Ah(e.activeClass,o.linkActiveClass,"router-link-active")]:n.isActive,[Ah(e.exactActiveClass,o.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const u=t.default&&nA(t.default(n));return e.custom?u:qe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},u)}}}),rA=oA;function uA(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function aA(e,t){for(const n in t){const o=t[n],r=e[n];if(typeof o=="string"){if(o!==r)return!1}else if(!Kn(r)||r.length!==o.length||o.some((u,a)=>u.valueOf()!==r[a].valueOf()))return!1}return!0}function Dh(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ah=(e,t,n)=>e??t??n,sA=L({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const o=Ue(l0),r=F(()=>e.route||o.value),u=Ue(fh,0),a=F(()=>{let c=f(u);const{matched:l}=r.value;let d;for(;(d=l[c])&&!d.components;)c++;return c}),s=F(()=>r.value.matched[a.value]);Pt(fh,F(()=>a.value+1)),Pt(rD,s),Pt(l0,r);const i=R();return ye(()=>[i.value,s.value,e.name],([c,l,d],[p,h,m])=>{l&&(l.instances[d]=c,h&&h!==l&&c&&c===p&&(l.leaveGuards.size||(l.leaveGuards=h.leaveGuards),l.updateGuards.size||(l.updateGuards=h.updateGuards))),c&&l&&(!h||!ku(l,h)||!p)&&(l.enterCallbacks[d]||[]).forEach(g=>g(c))},{flush:"post"}),()=>{const c=r.value,l=e.name,d=s.value,p=d&&d.components[l];if(!p)return Bh(n.default,{Component:p,route:c});const h=d.props[l],m=h?h===!0?c.params:typeof h=="function"?h(c):h:null,y=qe(p,nt({},m,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(d.instances[l]=null)},ref:i}));return Bh(n.default,{Component:y,route:c})||y}}});function Bh(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const u3=sA;function iA(e){const t=XD(e.routes,e),n=e.parseQuery||ID,o=e.stringifyQuery||gh,r=e.history,u=oa(),a=oa(),s=oa(),i=Me(Fn);let c=Fn;au&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const l=Xl.bind(null,Z=>""+Z),d=Xl.bind(null,ED),p=Xl.bind(null,Na);function h(Z,ce){let se,Ee;return t3(Z)?(se=t.getRecordMatcher(Z),Ee=ce):Ee=Z,t.addRoute(Ee,se)}function m(Z){const ce=t.getRecordMatcher(Z);ce&&t.removeRoute(ce)}function g(){return t.getRoutes().map(Z=>Z.record)}function y(Z){return!!t.getRecordMatcher(Z)}function E(Z,ce){if(ce=nt({},ce||i.value),typeof Z=="string"){const M=Jl(n,Z,ce.path),V=t.resolve({path:M.path},ce),te=r.createHref(M.fullPath);return nt(M,V,{params:p(V.params),hash:Na(M.hash),redirectedFrom:void 0,href:te})}let se;if(Z.path!=null)se=nt({},Z,{path:Jl(n,Z.path,ce.path).path});else{const M=nt({},Z.params);for(const V in M)M[V]==null&&delete M[V];se=nt({},Z,{params:d(M)}),ce.params=d(ce.params)}const Ee=t.resolve(se,ce),Te=Z.hash||"";Ee.params=l(p(Ee.params));const Ge=wD(o,nt({},Z,{hash:vD(Te),path:Ee.path})),T=r.createHref(Ge);return nt({fullPath:Ge,hash:Te,query:o===gh?RD(Z.query):Z.query||{}},Ee,{redirectedFrom:void 0,href:T})}function b(Z){return typeof Z=="string"?Jl(n,Z,i.value.path):nt({},Z)}function v(Z,ce){if(c!==Z)return _u(Ct.NAVIGATION_CANCELLED,{from:ce,to:Z})}function C(Z){return x(Z)}function w(Z){return C(nt(b(Z),{replace:!0}))}function B(Z,ce){const se=Z.matched[Z.matched.length-1];if(se&&se.redirect){const{redirect:Ee}=se;let Te=typeof Ee=="function"?Ee(Z,ce):Ee;return typeof Te=="string"&&(Te=Te.includes("?")||Te.includes("#")?Te=b(Te):{path:Te},Te.params={}),nt({query:Z.query,hash:Z.hash,params:Te.path!=null?{}:Z.params},Te)}}function x(Z,ce){const se=c=E(Z),Ee=i.value,Te=Z.state,Ge=Z.force,T=Z.replace===!0,M=B(se,Ee);if(M)return x(nt(b(M),{state:typeof M=="object"?nt({},Te,M.state):Te,force:Ge,replace:T}),ce||se);const V=se;V.redirectedFrom=ce;let te;return!Ge&&DD(o,Ee,se)&&(te=_u(Ct.NAVIGATION_DUPLICATED,{to:V,from:Ee}),ut(Ee,Ee,!0,!1)),(te?Promise.resolve(te):O(V,Ee)).catch(X=>Eo(X)?Eo(X,Ct.NAVIGATION_GUARD_REDIRECT)?X:le(X):K(X,V,Ee)).then(X=>{if(X){if(Eo(X,Ct.NAVIGATION_GUARD_REDIRECT))return x(nt({replace:T},b(X.to),{state:typeof X.to=="object"?nt({},Te,X.to.state):Te,force:Ge}),ce||V)}else X=N(V,Ee,!0,T,Te);return H(V,Ee,X),X})}function _(Z,ce){const se=v(Z,ce);return se?Promise.reject(se):Promise.resolve()}function S(Z){const ce=Dt.values().next().value;return ce&&typeof ce.runWithContext=="function"?ce.runWithContext(Z):Z()}function O(Z,ce){let se;const[Ee,Te,Ge]=LD(Z,ce);se=ec(Ee.reverse(),"beforeRouteLeave",Z,ce);for(const M of Ee)M.leaveGuards.forEach(V=>{se.push(er(V,Z,ce))});const T=_.bind(null,Z,ce);return se.push(T),ze(se).then(()=>{se=[];for(const M of u.list())se.push(er(M,Z,ce));return se.push(T),ze(se)}).then(()=>{se=ec(Te,"beforeRouteUpdate",Z,ce);for(const M of Te)M.updateGuards.forEach(V=>{se.push(er(V,Z,ce))});return se.push(T),ze(se)}).then(()=>{se=[];for(const M of Ge)if(M.beforeEnter)if(Kn(M.beforeEnter))for(const V of M.beforeEnter)se.push(er(V,Z,ce));else se.push(er(M.beforeEnter,Z,ce));return se.push(T),ze(se)}).then(()=>(Z.matched.forEach(M=>M.enterCallbacks={}),se=ec(Ge,"beforeRouteEnter",Z,ce,S),se.push(T),ze(se))).then(()=>{se=[];for(const M of a.list())se.push(er(M,Z,ce));return se.push(T),ze(se)}).catch(M=>Eo(M,Ct.NAVIGATION_CANCELLED)?M:Promise.reject(M))}function H(Z,ce,se){s.list().forEach(Ee=>S(()=>Ee(Z,ce,se)))}function N(Z,ce,se,Ee,Te){const Ge=v(Z,ce);if(Ge)return Ge;const T=ce===Fn,M=au?history.state:{};se&&(Ee||T?r.replace(Z.fullPath,nt({scroll:T&&M&&M.scroll},Te)):r.push(Z.fullPath,Te)),i.value=Z,ut(Z,ce,se,T),le()}let J;function G(){J||(J=r.listen((Z,ce,se)=>{if(!Ne.listening)return;const Ee=E(Z),Te=B(Ee,Ne.currentRoute.value);if(Te){x(nt(Te,{replace:!0,force:!0}),Ee).catch(Da);return}c=Ee;const Ge=i.value;au&&PD(mh(Ge.fullPath,se.delta),hl()),O(Ee,Ge).catch(T=>Eo(T,Ct.NAVIGATION_ABORTED|Ct.NAVIGATION_CANCELLED)?T:Eo(T,Ct.NAVIGATION_GUARD_REDIRECT)?(x(nt(b(T.to),{force:!0}),Ee).then(M=>{Eo(M,Ct.NAVIGATION_ABORTED|Ct.NAVIGATION_DUPLICATED)&&!se.delta&&se.type===d0.pop&&r.go(-1,!1)}).catch(Da),Promise.reject()):(se.delta&&r.go(-se.delta,!1),K(T,Ee,Ge))).then(T=>{T=T||N(Ee,Ge,!1),T&&(se.delta&&!Eo(T,Ct.NAVIGATION_CANCELLED)?r.go(-se.delta,!1):se.type===d0.pop&&Eo(T,Ct.NAVIGATION_ABORTED|Ct.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),H(Ee,Ge,T)}).catch(Da)}))}let $=oa(),I=oa(),W;function K(Z,ce,se){le(Z);const Ee=I.list();return Ee.length?Ee.forEach(Te=>Te(Z,ce,se)):console.error(Z),Promise.reject(Z)}function de(){return W&&i.value!==Fn?Promise.resolve():new Promise((Z,ce)=>{$.add([Z,ce])})}function le(Z){return W||(W=!Z,G(),$.list().forEach(([ce,se])=>Z?se(Z):ce()),$.reset()),Z}function ut(Z,ce,se,Ee){const{scrollBehavior:Te}=e;if(!au||!Te)return Promise.resolve();const Ge=!se&&MD(mh(Z.fullPath,0))||(Ee||!se)&&history.state&&history.state.scroll||null;return Oe().then(()=>Te(Z,ce,Ge)).then(T=>T&&FD(T)).catch(T=>K(T,Z,ce))}const Ve=Z=>r.go(Z);let ht;const Dt=new Set,Ne={currentRoute:i,listening:!0,addRoute:h,removeRoute:m,clearRoutes:t.clearRoutes,hasRoute:y,getRoutes:g,resolve:E,options:e,push:C,replace:w,go:Ve,back:()=>Ve(-1),forward:()=>Ve(1),beforeEach:u.add,beforeResolve:a.add,afterEach:s.add,onError:I.add,isReady:de,install(Z){Z.component("RouterLink",rA),Z.component("RouterView",u3),Z.config.globalProperties.$router=Ne,Object.defineProperty(Z.config.globalProperties,"$route",{enumerable:!0,get:()=>f(i)}),au&&!ht&&i.value===Fn&&(ht=!0,C(r.location).catch(Ee=>{}));const ce={};for(const Ee in Fn)Object.defineProperty(ce,Ee,{get:()=>i.value[Ee],enumerable:!0});Z.provide(Zd,Ne),Z.provide(Xd,Pn(ce)),Z.provide(l0,i);const se=Z.unmount;Dt.add(Z),Z.unmount=function(){Dt.delete(Z),Dt.size<1&&(c=Fn,J&&J(),J=null,i.value=Fn,ht=!1,W=!1),se()}}};function ze(Z){return Z.reduce((ce,se)=>ce.then(()=>S(se)),Promise.resolve())}return Ne}const lA=/(:\w+)\([^)]+\)/g,cA=/(:\w+)[?+*]/g,dA=/:\w+/g,fA=(e,t)=>t.path.replace(lA,"$1").replace(cA,"$1").replace(dA,n=>e.params[n.slice(1)]?.toString()||""),p0=(e,t)=>{const n=e.route.matched.find(r=>r.components?.default===e.Component.type),o=t??n?.meta.key??(n&&fA(e.route,n));return typeof o=="function"?o(e.route):o},pA=(e,t)=>({default:()=>e?qe(sC,e===!0?{}:e,t):t});function a3(e){return Array.isArray(e)?e:[e]}const hA="modulepreload",mA=function(e,t){return new URL(e,t).href},_h={},ne=function(t,n,o){let r=Promise.resolve();if(n&&n.length>0){let c=function(l){return Promise.all(l.map(d=>Promise.resolve(d).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};const a=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),i=s?.nonce||s?.getAttribute("nonce");r=c(n.map(l=>{if(l=mA(l,o),l in _h)return;_h[l]=!0;const d=l.endsWith(".css"),p=d?'[rel="stylesheet"]':"";if(o)for(let m=a.length-1;m>=0;m--){const g=a[m];if(g.href===l&&(!d||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${p}`))return;const h=document.createElement("link");if(h.rel=d?"stylesheet":hA,d||(h.as="script"),h.crossOrigin="",h.href=l,i&&h.setAttribute("nonce",i),document.head.appendChild(h),d)return new Promise((m,g)=>{h.addEventListener("load",m),h.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${l}`)))})}))}function u(a){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=a,window.dispatchEvent(s),!s.defaultPrevented)throw a}return r.then(a=>{for(const s of a||[])s.status==="rejected"&&u(s.reason);return t().catch(u)})},gA={layout:"docs"},tc=[{name:"lang-slug",path:"/:lang?/:slug(.*)*",meta:gA||{},component:()=>ne(()=>import("./AFG10c_a.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url)},{name:"index",path:"/",component:()=>ne(()=>import("./DzNJTbjO.js"),__vite__mapDeps([5,2,3]),import.meta.url)}],s3=(e,t)=>({default:()=>e?qe(tx,e===!0?{}:e,t):t.default?.()}),vA=/(:\w+)\([^)]+\)/g,yA=/(:\w+)[?+*]/g,bA=/:\w+/g;function kh(e){const t=e?.meta.key??e.path.replace(vA,"$1").replace(yA,"$1").replace(bA,n=>e.params[n.slice(1)]?.toString()||"");return typeof t=="function"?t(e):t}function EA(e,t){return e===t||t===Fn?!1:kh(e)!==kh(t)?!0:!e.matched.every((o,r)=>o.components&&o.components.default===t.matched[r]?.components?.default)}function Sh(e){return Array.isArray(e)?e:[e]}function i3(e){const t=[];for(const n of e)n&&t.push({...n,onAfterLeave:n.onAfterLeave?Sh(n.onAfterLeave):void 0,onBeforeLeave:n.onBeforeLeave?Sh(n.onBeforeLeave):void 0});return wt(...t)}const CA={scrollBehavior(e,t,n){const o=Re(),r=Xt().options?.scrollBehaviorType??"auto";return e.path.replace(/\/$/,"")===t.path.replace(/\/$/,"")?t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:l3(e.hash),behavior:r}:!1:(typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop)===!1?!1:t===Fn?Th(e,t,n,r):new Promise(a=>{const s=()=>{requestAnimationFrame(()=>a(Th(e,t,n,r)))};o.hooks.hookOnce("page:loading:end",()=>{const i=o["~transitionPromise"];i?i.then(s):s()})})}};function l3(e){try{const t=document.querySelector(e);if(t)return(Number.parseFloat(getComputedStyle(t).scrollMarginTop)||0)+(Number.parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop)||0)}catch{}return 0}function Th(e,t,n,o){if(n)return n;const r=EA(e,t);return e.hash?{el:e.hash,top:l3(e.hash),behavior:r?o:"instant"}:{left:0,top:0}}const xA={hashMode:!1,scrollBehaviorType:"auto"},Ko={...xA,...CA},wA=async(e,t)=>{let n,o;if(!e.meta?.validate)return;const r=([n,o]=qr(()=>Promise.resolve(e.meta.validate(e))),n=await n,o(),n);if(r===!0)return;const u=ar({fatal:!0,status:r&&(r.status||r.statusCode)||404,statusText:r&&(r.statusText||r.statusMessage)||`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}});return typeof window<"u"&&window.history.pushState({},"",t.fullPath),u};function Nn(e){if(typeof e!="object")return e;var t,n,o=Object.prototype.toString.call(e);if(o==="[object Object]"){if(e.constructor!==Object&&typeof e.constructor=="function"){n=new e.constructor;for(t in e)e.hasOwnProperty(t)&&n[t]!==e[t]&&(n[t]=Nn(e[t]))}else{n={};for(t in e)t==="__proto__"?Object.defineProperty(n,t,{value:Nn(e[t]),configurable:!0,enumerable:!0,writable:!0}):n[t]=Nn(e[t])}return n}if(o==="[object Array]"){for(t=e.length,n=Array(t);t--;)n[t]=Nn(e[t]);return n}return o==="[object Set]"?(n=new Set,e.forEach(function(r){n.add(Nn(r))}),n):o==="[object Map]"?(n=new Map,e.forEach(function(r,u){n.set(Nn(u),Nn(r))}),n):o==="[object Date]"?new Date(+e):o==="[object RegExp]"?(n=new RegExp(e.source,e.flags),n.lastIndex=e.lastIndex,n):o==="[object DataView]"?new e.constructor(Nn(e.buffer)):o==="[object ArrayBuffer]"?e.slice(0):o.slice(-6)==="Array]"?new e.constructor(e):e}var Qd={};const Fh=Qd.DOCS_REPO_URL||"https://github.com/InnovativeDevSolutions/forge",DA=Qd.DOCS_REPO_BRANCH||"master",AA=Qd.DOCS_SITE_URL||"https://innovativedevsolutions.github.io",BA={site:{name:"Forge Framework",description:"Persistent Arma 3 framework with Rust services, SurrealDB storage, and browser-backed client UIs.",url:AA,socials:{github:"InnovativeDevSolutions/forge"}},github:{url:Fh,branch:DA,rootDir:"docus"},footer:{credits:"Copyright © 2025-2026 Forge Framework",links:[{icon:"simple-icons:github",href:Fh,target:"_blank"}]}},_A={docus:{locale:"en",colorMode:""},ui:{colors:{primary:"emerald",neutral:"zinc"},commandPalette:{slots:{item:"items-center",input:"[&_.iconify]:size-4 [&_.iconify]:mx-0.5",itemLeadingIcon:"size-4 mx-0.5"}},contentToc:{defaultVariants:{highlight:!0}},contentNavigation:{slots:{linkLeadingIcon:"size-4 mr-1",linkTrailing:"hidden"},defaultVariants:{variant:"link",highlight:!0}},navigationMenu:{defaultVariants:{variant:"pill",highlight:!0}},pageLinks:{slots:{linkLeadingIcon:"size-4",linkLabelExternalIcon:"size-2.5"}}}},kA={nuxt:{},header:{title:"forge-docus"},seo:{titleTemplate:"%s - forge-docus",title:"forge-docus",description:""},github:{owner:"IDSolutions",name:"forge",url:"https://innovativedevsolutions.org/IDSolutions/forge",branch:"docus"},ui:{colors:{primary:"green",secondary:"blue",success:"green",info:"blue",warning:"yellow",error:"red",neutral:"slate"},icons:{arrowDown:"i-lucide-arrow-down",arrowLeft:"i-lucide-arrow-left",arrowRight:"i-lucide-arrow-right",arrowUp:"i-lucide-arrow-up",caution:"i-lucide-circle-alert",check:"i-lucide-check",chevronDoubleLeft:"i-lucide-chevrons-left",chevronDoubleRight:"i-lucide-chevrons-right",chevronDown:"i-lucide-chevron-down",chevronLeft:"i-lucide-chevron-left",chevronRight:"i-lucide-chevron-right",chevronUp:"i-lucide-chevron-up",close:"i-lucide-x",copy:"i-lucide-copy",copyCheck:"i-lucide-copy-check",dark:"i-lucide-moon",drag:"i-lucide-grip-vertical",ellipsis:"i-lucide-ellipsis",error:"i-lucide-circle-x",external:"i-lucide-arrow-up-right",eye:"i-lucide-eye",eyeOff:"i-lucide-eye-off",file:"i-lucide-file",folder:"i-lucide-folder",folderOpen:"i-lucide-folder-open",hash:"i-lucide-hash",info:"i-lucide-info",light:"i-lucide-sun",loading:"i-lucide-loader-circle",menu:"i-lucide-menu",minus:"i-lucide-minus",panelClose:"i-lucide-panel-left-close",panelOpen:"i-lucide-panel-left-open",plus:"i-lucide-plus",reload:"i-lucide-rotate-ccw",search:"i-lucide-search",stop:"i-lucide-square",success:"i-lucide-circle-check",system:"i-lucide-monitor",tip:"i-lucide-lightbulb",upload:"i-lucide-upload",warning:"i-lucide-triangle-alert"},tv:{twMergeConfig:{}}},icon:{provider:"iconify",class:"",aliases:{},iconifyApiEndpoint:"https://api.iconify.design",localApiEndpoint:"/api/_nuxt_icon",fallbackToApi:!0,cssSelectorPrefix:"i-",cssWherePseudo:!0,cssLayer:"base",mode:"css",attrs:{"aria-hidden":!0},collections:["academicons","akar-icons","ant-design","arcticons","basil","bi","bitcoin-icons","bpmn","brandico","bx","bxl","bxs","bytesize","carbon","catppuccin","cbi","charm","ci","cib","cif","cil","circle-flags","circum","clarity","codex","codicon","covid","cryptocurrency","cryptocurrency-color","cuida","dashicons","devicon","devicon-plain","dinkie-icons","duo-icons","ei","el","emojione","emojione-monotone","emojione-v1","entypo","entypo-social","eos-icons","ep","et","eva","f7","fa","fa-brands","fa-regular","fa-solid","fa6-brands","fa6-regular","fa6-solid","fa7-brands","fa7-regular","fa7-solid","fad","famicons","fe","feather","file-icons","flag","flagpack","flat-color-icons","flat-ui","flowbite","fluent","fluent-color","fluent-emoji","fluent-emoji-flat","fluent-emoji-high-contrast","fluent-mdl2","fontelico","fontisto","formkit","foundation","fxemoji","gala","game-icons","garden","geo","gg","gis","gravity-ui","gridicons","grommet-icons","guidance","healthicons","heroicons","heroicons-outline","heroicons-solid","hugeicons","humbleicons","ic","icomoon-free","icon-park","icon-park-outline","icon-park-solid","icon-park-twotone","iconamoon","iconoir","icons8","il","ion","iwwa","ix","jam","la","lets-icons","line-md","lineicons","logos","ls","lsicon","lucide","lucide-lab","mage","majesticons","maki","map","marketeq","material-icon-theme","material-symbols","material-symbols-light","mdi","mdi-light","medical-icon","memory","meteocons","meteor-icons","mi","mingcute","mono-icons","mynaui","nimbus","nonicons","noto","noto-v1","nrk","octicon","oi","ooui","openmoji","oui","pajamas","pepicons","pepicons-pencil","pepicons-pop","pepicons-print","ph","picon","pixel","pixelarticons","prime","proicons","ps","qlementine-icons","quill","radix-icons","raphael","ri","rivet-icons","roentgen","si","si-glyph","sidekickicons","simple-icons","simple-line-icons","skill-icons","solar","stash","streamline","streamline-block","streamline-color","streamline-cyber","streamline-cyber-color","streamline-emojis","streamline-flex","streamline-flex-color","streamline-freehand","streamline-freehand-color","streamline-kameleon-color","streamline-logos","streamline-pixel","streamline-plump","streamline-plump-color","streamline-sharp","streamline-sharp-color","streamline-stickies-color","streamline-ultimate","streamline-ultimate-color","subway","svg-spinners","system-uicons","tabler","tdesign","teenyicons","temaki","token","token-branded","topcoat","twemoji","typcn","uil","uim","uis","uit","uiw","unjs","vaadin","vs","vscode-icons","websymbol","weui","whh","wi","wpf","zmdi","zondicons","custom"],fetchTimeout:1500,customCollections:["custom","custom"]}},c3=G5(BA,_A,kA);function Pe(){const e=Re();return e._appConfig||=_t(c3),e._appConfig}function ss(){const t=Pe().docus?.colorMode;return{forced:t==="light"||t==="dark"?t:void 0}}const SA=e=>{const{forced:t}=ss();t&&(e.meta.colorMode=t)},TA=e=>{const t=pl({path:e.path});if(t.redirect){const n=t.redirect.includes("#")?t.redirect:t.redirect+e.hash;return Ln(n,{acceptRelative:!0})?(window.location.href=n,!1):n}},FA=[wA,SA,TA],h0={};function PA(e,t,n){const{pathname:o,search:r,hash:u}=t,a=e.indexOf("#");if(a>-1){const c=u.includes(e.slice(a))?e.slice(a).length:1;let l=u.slice(c);return l[0]!=="/"&&(l="/"+l),Wp(l,"")}const s=Wp(o,e),i=!n||fy(s,n)?s:n;return i+(i.includes("?")?"":r)+u}const MA=vn({name:"nuxt:router",enforce:"pre",async setup(e){let t,n,o=Bn().app.baseURL;const r=Ko.history?.(o)??jD(o),u=Ko.routes?([t,n]=qr(()=>Ko.routes(tc)),t=await t,n(),t??tc):tc;let a;const s=iA({...Ko,scrollBehavior:(E,b,v)=>{if(b===Fn){a=v;return}if(Ko.scrollBehavior){if(s.options.scrollBehavior=Ko.scrollBehavior,"scrollRestoration"in window.history){const C=s.beforeEach(()=>{C(),window.history.scrollRestoration="manual"})}return Ko.scrollBehavior(E,Fn,a||v)}},history:r,routes:u});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(s);const i=Me(s.currentRoute.value);s.afterEach((E,b)=>{i.value=b}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>i.value});const c=PA(o,window.location,e.payload.path),l=Me(s.currentRoute.value),d=()=>{l.value=s.currentRoute.value};s.afterEach((E,b)=>{E.matched.at(-1)?.components?.default===b.matched.at(-1)?.components?.default&&d()});const p={sync:d};for(const E in l.value)Object.defineProperty(p,E,{get:()=>l.value[E],enumerable:!0});e._route=Pn(p),e._middleware||={global:[],named:{}};const h=fl();s.afterEach(async(E,b,v)=>{delete e._processingMiddleware,!e.isHydrating&&h.value&&await e.runWithContext(_y),v&&await e.callHook("page:loading:end")});try{[t,n]=qr(()=>s.isReady()),await t,n()}catch(E){[t,n]=qr(()=>e.runWithContext(()=>kr(E))),await t,n()}const m=c!==s.currentRoute.value.fullPath?s.resolve(c):s.currentRoute.value,g=e.isHydrating&&e.payload.prerenderedAt&&e.payload.path&&c!==e.payload.path&&fy(s.currentRoute.value.path,e.payload.path);d();const y=e.payload.state._layout;return s.beforeEach(async(E,b)=>{await e.callHook("page:loading:start"),E.meta=_t(E.meta),e.isHydrating&&y&&!fo(E.meta.layout)&&(E.meta.layout=y),e._processingMiddleware=!0;{const v=new Set([...FA,...e._middleware.global]);for(const w of E.matched){const B=w.meta.middleware;if(B)for(const x of a3(B))v.add(x)}const C=pl({path:E.path});if(C.appMiddleware)for(const w in C.appMiddleware)C.appMiddleware[w]?v.add(w):v.delete(w);for(const w of v){const B=typeof w=="string"?e._middleware.named[w]||await h0[w]?.().then(x=>x.default||x):w;if(!B)throw new Error(`Unknown route middleware: '${w}'.`);try{const x=await e.runWithContext(()=>B(E,b));if(!e.payload.serverRendered&&e.isHydrating&&(x===!1||x instanceof Error)){const _=x||ar({status:404,statusText:`Page Not Found: ${c}`});return await e.runWithContext(()=>kr(_)),!1}if(x===!0)continue;if(x===!1)return x;if(x)return ky(x)&&x.fatal&&await e.runWithContext(()=>kr(x)),x}catch(x){const _=ar(x);return _.fatal&&await e.runWithContext(()=>kr(_)),_}}}}),s.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")}),s.afterEach(E=>{if(E.matched.length===0&&!h.value)return e.runWithContext(()=>kr(ar({status:404,fatal:!1,statusText:`Page not found: ${E.fullPath}`,data:{path:E.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{if("name"in m&&(m.name=void 0),g){const E=s.resolve(e.payload.path);"name"in E&&(E.name=void 0),await s.replace({...E,force:!0}),e.hooks.hookOnce("app:suspense:resolve",async()=>{await s.replace({...m,force:!0})})}else await s.replace({...m,force:!0});s.options.scrollBehavior=Ko.scrollBehavior}catch(E){await e.runWithContext(()=>kr(E))}}),{provide:{router:s}}}});function Si(e){return typeof e=="string"?`'${e}'`:new OA().serialize(e)}const OA=(function(){class e{#e=new Map;compare(n,o){const r=typeof n,u=typeof o;return r==="string"&&u==="string"?n.localeCompare(o):r==="number"&&u==="number"?n-o:String.prototype.localeCompare.call(this.serialize(n,!0),this.serialize(o,!0))}serialize(n,o){if(n===null)return"null";switch(typeof n){case"string":return o?n:`'${n}'`;case"bigint":return`${n}n`;case"object":return this.$object(n);case"function":return this.$function(n)}return String(n)}serializeObject(n){const o=Object.prototype.toString.call(n);if(o!=="[object Object]")return this.serializeBuiltInType(o.length<10?`unknown:${o}`:o.slice(8,-1),n);const r=n.constructor,u=r===Object||r===void 0?"":r.name;if(u!==""&&globalThis[u]===r)return this.serializeBuiltInType(u,n);if(typeof n.toJSON=="function"){const a=n.toJSON();return u+(a!==null&&typeof a=="object"?this.$object(a):`(${this.serialize(a)})`)}return this.serializeObjectEntries(u,Object.entries(n))}serializeBuiltInType(n,o){const r=this["$"+n];if(r)return r.call(this,o);if(typeof o?.entries=="function")return this.serializeObjectEntries(n,o.entries());throw new Error(`Cannot serialize ${n}`)}serializeObjectEntries(n,o){const r=Array.from(o).sort((a,s)=>this.compare(a[0],s[0]));let u=`${n}{`;for(let a=0;athis.compare(o,r)))}`}$Map(n){return this.serializeObjectEntries("Map",n.entries())}}for(const t of["Error","RegExp","URL"])e.prototype["$"+t]=function(n){return`${t}(${n})`};for(const t of["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"])e.prototype["$"+t]=function(n){return`${t}[${n.join(",")}]`};for(const t of["BigInt64Array","BigUint64Array"])e.prototype["$"+t]=function(n){return`${t}[${n.join("n,")}${n.length>0?"n":""}]`};return e})();function Ur(e,t){return e===t||Si(e)===Si(t)}const IA=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],RA=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],LA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",xr=[];class qA{_data=new Fs;_hash=new Fs([...IA]);_nDataBytes=0;_minBufferSize=0;finalize(t){t&&this._append(t);const n=this._nDataBytes*8,o=this._data.sigBytes*8;return this._data.words[o>>>5]|=128<<24-o%32,this._data.words[(o+64>>>9<<4)+14]=Math.floor(n/4294967296),this._data.words[(o+64>>>9<<4)+15]=n,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(t,n){const o=this._hash.words;let r=o[0],u=o[1],a=o[2],s=o[3],i=o[4],c=o[5],l=o[6],d=o[7];for(let p=0;p<64;p++){if(p<16)xr[p]=t[n+p]|0;else{const v=xr[p-15],C=(v<<25|v>>>7)^(v<<14|v>>>18)^v>>>3,w=xr[p-2],B=(w<<15|w>>>17)^(w<<13|w>>>19)^w>>>10;xr[p]=C+xr[p-7]+B+xr[p-16]}const h=i&c^~i&l,m=r&u^r&a^u&a,g=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),y=(i<<26|i>>>6)^(i<<21|i>>>11)^(i<<7|i>>>25),E=d+y+h+RA[p]+xr[p],b=g+m;d=l,l=c,c=i,i=s+E|0,s=a,a=u,u=r,r=E+b|0}o[0]=o[0]+r|0,o[1]=o[1]+u|0,o[2]=o[2]+a|0,o[3]=o[3]+s|0,o[4]=o[4]+i|0,o[5]=o[5]+c|0,o[6]=o[6]+l|0,o[7]=o[7]+d|0}_append(t){typeof t=="string"&&(t=Fs.fromUtf8(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes}_process(t){let n,o=this._data.sigBytes/64;t?o=Math.ceil(o):o=Math.max((o|0)-this._minBufferSize,0);const r=o*16,u=Math.min(r*4,this._data.sigBytes);if(r){for(let a=0;a>>2]|=(n.charCodeAt(u)&255)<<24-u%4*8;return new d3(r,o)}toBase64(){const t=[];for(let n=0;n>>2]>>>24-n%4*8&255,r=this.words[n+1>>>2]>>>24-(n+1)%4*8&255,u=this.words[n+2>>>2]>>>24-(n+2)%4*8&255,a=o<<16|r<<8|u;for(let s=0;s<4&&n*8+s*6>>6*(3-s)&63))}return t.join("")}concat(t){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let n=0;n>>2]>>>24-n%4*8&255;this.words[this.sigBytes+n>>>2]|=o<<24-(this.sigBytes+n)%4*8}else for(let n=0;n>>2]=t.words[n>>>2];this.sigBytes+=t.sigBytes}};function $A(e){return new qA().finalize(e).toBase64()}function su(e){return $A(Si(e))}const f3=Symbol.for("nuxt:client-only"),ef=L({name:"ClientOnly",inheritAttrs:!1,props:["fallback","placeholder","placeholderTag","fallbackTag"],setup(e,{slots:t,attrs:n}){const o=Me(!1);$e(()=>{o.value=!0});const r=We();return r&&(r._nuxtClientOnly=!0),Pt(f3,!0),()=>{if(o.value){const i=t.default?.();return i&&i.length===1?[An(i[0],n)]:i}const u=t.fallback||t.placeholder;if(u)return qe(u);const a=e.fallback||e.placeholder||"",s=e.fallbackTag||e.placeholderTag||"span";return re(s,n,a)}}}),m0=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),NA=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),ml=e=>{const t=Re();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{m0(()=>e())}):m0(()=>e())};function p3(e){return Object.defineProperty(function(){throw new Error(`[nuxt] \`${e.name}\` is a compiler macro and cannot be called at runtime.`)},"__nuxt_factory",{enumerable:!1,get:()=>e.factory})}const h3=p3({name:"createUseAsyncData",factory(e={}){function t(...n){const o=typeof n[n.length-1]=="string"?n.pop():void 0;jA(n[0],n[1])&&n.unshift(o);let[r,u,a={}]=n,s=!1;const i=F(()=>ke(r));if(typeof i.value!="string")throw new TypeError("[nuxt] [useAsyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [useAsyncData] handler must be a function.");const c=typeof e=="function",l=Re(),d=c?e(a):e;if(!c)for(const b in d)d[b]!==void 0&&a[b]===void 0&&(a[b]=d[b]);if(a.server??=!0,a.default??=zA,a.getCachedData??=v3,a.lazy??=!1,a.immediate??=!0,a.deep??=$5.deep,a.dedupe??="cancel",c)for(const b in d)d[b]!==void 0&&(a[b]=d[b]);l._asyncData[i.value];function p(){const b={cause:"initial",dedupe:a.dedupe};return l._asyncData[i.value]?._init||(b.cachedData=a.getCachedData(i.value,l,{cause:"initial"}),l._asyncData[i.value]=Ph(l,i.value,u,a,b.cachedData)),()=>l._asyncData[i.value].execute(b)}const h=p(),m=l._asyncData[i.value];m._deps++;const g=a.server!==!1&&l.payload.serverRendered;{let b=function(_){const S=l._asyncData[_];S?._deps&&(S._deps--,S._deps===0&&S?._off())};const v=We();if(v&&g&&a.immediate&&!v.sp&&(v.sp=[]),v&&!v._nuxtOnBeforeMountCbs){v._nuxtOnBeforeMountCbs=[];const _=v._nuxtOnBeforeMountCbs;Pd(()=>{_.forEach(S=>{S()}),_.splice(0,_.length)}),Ht(()=>_.splice(0,_.length))}const C=v&&(v._nuxtClientOnly||Ue(f3,!1));g&&l.isHydrating&&(m.error.value||m.data.value!==void 0)?m.status.value=m.error.value?"error":"success":v&&(!C&&l.payload.serverRendered&&l.isHydrating||a.lazy)&&a.immediate?v._nuxtOnBeforeMountCbs.push(h):a.immediate&&m.status.value!=="success"&&h();const w=ho(),B=ye(i,(_,S)=>{if((_||S)&&_!==S){s=!0;const O=l._asyncData[S]?.data.value!==void 0,H=l._asyncDataPromises[S]!==void 0,N={cause:"initial",dedupe:a.dedupe};if(!l._asyncData[_]?._init){let J;S&&O?J=l._asyncData[S].data.value:(J=a.getCachedData(_,l,{cause:"initial"}),N.cachedData=J),l._asyncData[_]=Ph(l,_,u,a,J)}l._asyncData[_]._deps++,S&&b(S),(a.immediate||O||H)&&l._asyncData[_].execute(N),Pa(()=>{s=!1})}},{flush:"sync"}),x=a.watch?ye(a.watch,()=>{s||(l._asyncData[i.value]?._execute.isPending()&&Pa(()=>{l._asyncData[i.value]?._execute.flush()}),l._asyncData[i.value]?._execute({cause:"watch",dedupe:a.dedupe}))}):()=>{};w&&ir(()=>{B(),x(),b(i.value)})}const y={data:Ps(()=>l._asyncData[i.value]?.data),pending:Ps(()=>l._asyncData[i.value]?.pending),status:Ps(()=>l._asyncData[i.value]?.status),error:Ps(()=>l._asyncData[i.value]?.error),refresh:(...b)=>l._asyncData[i.value]?._init?l._asyncData[i.value].execute(...b):p()(),execute:(...b)=>y.refresh(...b),clear:()=>{const b=l._asyncData[i.value];if(b?._abortController)try{b._abortController.abort(new DOMException("AsyncData aborted by user.","AbortError"))}finally{b._abortController=void 0}g3(l,i.value)}},E=Promise.resolve(l._asyncDataPromises[i.value]).then(()=>y);return Object.assign(E,y),Object.defineProperties(E,{then:{enumerable:!0,value:E.then.bind(E)},catch:{enumerable:!0,value:E.catch.bind(E)},finally:{enumerable:!0,value:E.finally.bind(E)}}),E}return t}}),tf=h3.__nuxt_factory(),m3=h3.__nuxt_factory({lazy:!0,_functionName:"useLazyAsyncData"});function Ps(e){return F({get(){return e()?.value},set(t){const n=e();n&&(n.value=t)}})}function jA(e,t){return!(typeof e=="string"||typeof e=="object"&&e!==null||typeof e=="function"&&typeof t=="function")}function g3(e,t){t in e.payload.data&&(e.payload.data[t]=void 0),t in e.payload._errors&&(e.payload._errors[t]=void 0),e._asyncData[t]&&(e._asyncData[t].data.value=f(e._asyncData[t]._default()),e._asyncData[t].error.value=void 0,e._asyncData[t].status.value="idle"),t in e._asyncDataPromises&&(e._asyncDataPromises[t]=void 0)}function VA(e,t){const n={};for(const o of t)n[o]=e[o];return n}function Ph(e,t,n,o,r){e.payload._errors[t]??=void 0;const u=o.getCachedData!==v3,a=n,s=o.deep?R:Me,i=r!==void 0,c=e.hook("app:data:refresh",async d=>{(!d||d.includes(t))&&await l.execute({cause:"refresh:hook"})}),l={data:s(i?r:o.default()),pending:F(()=>l.status.value==="pending"),error:Ye(e.payload._errors,t),status:Me("idle"),execute:(...d)=>{const[p,h=void 0]=d,m=p&&h===void 0&&typeof p=="object"?p:{};if(e._asyncDataPromises[t]&&(m.dedupe??o.dedupe)==="defer")return e._asyncDataPromises[t];{const E="cachedData"in m?m.cachedData:o.getCachedData(t,e,{cause:m.cause??"refresh:manual"});if(E!==void 0)return e.payload.data[t]=l.data.value=E,l.error.value=void 0,l.status.value="success",Promise.resolve(E)}l._abortController&&l._abortController.abort(new DOMException("AsyncData request cancelled by deduplication","AbortError")),l._abortController=new AbortController,l.status.value="pending";const g=new AbortController,y=new Promise((E,b)=>{try{const v=m.timeout??o.timeout,C=UA([l._abortController?.signal,m?.signal],g.signal,v);if(C.aborted){const w=C.reason;b(w instanceof Error?w:new DOMException(String(w??"Aborted"),"AbortError"));return}return C.addEventListener("abort",()=>{const w=C.reason;b(w instanceof Error?w:new DOMException(String(w??"Aborted"),"AbortError"))},{once:!0,signal:g.signal}),Promise.resolve(a(e,{signal:C})).then(E,b)}catch(v){b(v)}}).then(async E=>{let b=E;o.transform&&(b=await o.transform(E)),o.pick&&(b=VA(b,o.pick)),e.payload.data[t]=b,l.data.value=b,l.error.value=void 0,l.status.value="success"}).catch(E=>{if(e._asyncDataPromises[t]&&e._asyncDataPromises[t]!==y||l._abortController?.signal.aborted)return e._asyncDataPromises[t];if(typeof DOMException<"u"&&E instanceof DOMException&&E.name==="AbortError")return l.status.value="idle",e._asyncDataPromises[t];l.error.value=ar(E),l.data.value=f(o.default()),l.status.value="error"}).finally(()=>{g.abort(),delete e._asyncDataPromises[t]});return e._asyncDataPromises[t]=y,e._asyncDataPromises[t]},_execute:aD((...d)=>l.execute(...d),0,{leading:!0}),_default:o.default,_deps:0,_init:!0,_hash:void 0,_off:()=>{c(),e._asyncData[t]?._init&&(e._asyncData[t]._init=!1),u||Oe(()=>{e._asyncData[t]?._init||(g3(e,t),l.execute=()=>Promise.resolve())})}};return l}const zA=()=>{},v3=(e,t,n)=>{if(t.isHydrating)return t.payload.data[e];if(n.cause!=="refresh:manual"&&n.cause!=="refresh:hook")return t.static.data[e]};function UA(e,t,n){const o=e.filter(a=>!!a);if(typeof n=="number"&&n>=0){const a=AbortSignal.timeout?.(n);a&&o.push(a)}if(AbortSignal.any)return AbortSignal.any(o);const r=new AbortController;for(const a of o)if(a.aborted){const s=a.reason??new DOMException("Aborted","AbortError");try{r.abort(s)}catch{r.abort()}return r.signal}const u=()=>{const s=o.find(i=>i.aborted)?.reason??new DOMException("Aborted","AbortError");try{r.abort(s)}catch{r.abort()}};for(const a of o)a.addEventListener?.("abort",u,{once:!0,signal:t});return r.signal}const HA="$s";function nr(...e){const t=typeof e[e.length-1]=="string"?e.pop():void 0;typeof e[0]!="string"&&e.unshift(t);const[n,o]=e;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const r=HA+n,u=Re(),a=Ye(u.payload.state,r);if(o&&(u._state[r]??={_default:o}),a.value===void 0&&o){const s=o();if(rt(s))return u.payload.state[r]=s,s;a.value=s}return a}function KA(e){const t=[ke(e.method)?.toUpperCase()||"GET",ke(e.baseURL)];for(const n of[e.query||e.params]){const o=ke(n);if(!o)continue;const r={};for(const[u,a]of Object.entries(o))r[ke(u)]=ke(a);t.push(r)}if(e.body){const n=ke(e.body);if(!n)t.push(su(n));else if(n instanceof ArrayBuffer)t.push(su(Object.fromEntries([...new Uint8Array(n).entries()].map(([o,r])=>[o,r.toString()]))));else if(n instanceof FormData){const o={};for(const r of n.entries()){const[u,a]=r;o[u]=a instanceof File?a.name:a}t.push(su(o))}else if(xd(n))t.push(su(_t(n)));else try{t.push(su(n))}catch{console.warn("[useFetch] Failed to hash body",n)}}return t}const y3=p3({name:"createUseFetch",factory(e={}){function t(n,o,r){const[u={},a]=typeof o=="string"?[{},o]:[o,r],s=F(()=>ke(n)),i=F(()=>ke(u.key)||"$f"+su([a,typeof s.value=="string"?s.value:"",...KA(u)]));if(!u.baseURL&&typeof s.value=="string"&&s.value[0]==="/"&&s.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const c=typeof e=="function"?e(u):e,{server:l,lazy:d,default:p,transform:h,pick:m,watch:g,immediate:y,getCachedData:E,deep:b,dedupe:v,timeout:C,...w}={...typeof e=="function"?{}:c,...u,...typeof e=="function"?c:{}},B=_t({...N5,...w,cache:typeof w.cache=="boolean"?void 0:w.cache}),x={server:l,lazy:d,default:p,transform:h,pick:m,immediate:y,getCachedData:E,deep:b,dedupe:v,timeout:C,watch:g===!1?[]:[...g||[],B]};return tf(g===!1?i.value:i,(S,{signal:O})=>(u.$fetch||globalThis.$fetch)(s.value,{signal:O,...B}),x)}return t}});y3.__nuxt_factory();y3.__nuxt_factory({lazy:!0,_functionName:"useLazyFetch"});const WA=(()=>{const e=function(){};return e.prototype=Object.create(null),e})();function GA(e,t){if(typeof e!="string")throw new TypeError("argument str must be a string");const n=new WA,o=t||{},r=o.decode||YA;let u=0;for(;uJA(decodeURIComponent(e)),encode:e=>{if(typeof e!="string"||e==="undefined")return encodeURIComponent(JSON.stringify(e));try{if(typeof JSON.parse(e)!="string")return encodeURIComponent(JSON.stringify(e))}catch{}return encodeURIComponent(e)},refresh:!1},Os=globalThis.cookieStore;function e9(e,t){const n={...QA,...t};n.filter??=c=>c===e;const o=Oh(n)||{};let r;n.maxAge!==void 0?r=n.maxAge*1e3:n.expires&&(r=n.expires.getTime()-Date.now());const u=r!==void 0&&r<=0,a=u||o[e]===void 0||o[e]===null,s=Nn(u?void 0:o[e]??n.default?.()),i=r&&!u?o9(s,r,n.watch&&n.watch!=="shallow"):R(s);{let c=null;try{!Os&&typeof BroadcastChannel<"u"&&(c=new BroadcastChannel(`nuxt:cookies:${e}`))}catch{}const l=(m=!1)=>{!m&&(n.readonly||Ur(i.value,o[e]))||(n9(e,i.value,n),o[e]=Nn(i.value),c?.postMessage({value:n.encode(i.value)}))},d=m=>{const g=m.refresh?Oh(n)?.[e]:n.decode(m.value);p=!0,i.value=g,o[e]=Nn(g),Oe(()=>{p=!1})};let p=!1;const h=!!ho();if(h&&ir(()=>{p=!0,l(),c?.close()}),Os){const m=g=>{const y=g.changed.find(b=>b.name===e),E=g.deleted.find(b=>b.name===e);y&&d({value:y.value}),E&&d({value:null})};Os.addEventListener("change",m),h&&ir(()=>Os.removeEventListener("change",m))}else c&&(c.onmessage=({data:m})=>d(m));n.watch&&ye(i,()=>{p||l(n.refresh)},{deep:n.watch!=="shallow"}),a&&l(a)}return i}function Oh(e={}){return GA(document.cookie,e)}function t9(e,t,n={}){return t==null?Mh(e,t,{...n,maxAge:-1}):Mh(e,t,n)}function n9(e,t,n={}){document.cookie=t9(e,t,n)}const Ih=2147483647;function o9(e,t,n){let o,r,u=0;const a=n?R(e):{value:e};return ho()&&ir(()=>{r?.(),clearTimeout(o)}),es((s,i)=>{n&&(r=ye(a,i));function c(){const d=t-u,p=d{if(u+=p,u4)return Promise.all(r).then(()=>b3(e,t));t._routePreloaded.add(n);for(const u of o){const a=u.components?.default;if(typeof a!="function")continue;const s=Promise.resolve(a()).catch(()=>{}).finally(()=>r.splice(r.indexOf(s),1));r.push(s)}await Promise.all(r)}function u9(e={}){const t=e.path||window.location.pathname;let n={};try{n=JSON.parse(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||n?.path!==t||n?.expirese.find(t=>t!==void 0);function s9(e){const t=e.componentName||"NuxtLink";function n(u){return typeof u=="string"&&u.startsWith("#")}function o(u,a,s){const i=s??e.trailingSlash;if(!u||i!=="append"&&i!=="remove")return u;if(typeof u=="string")return Is(u,i);const c="path"in u&&u.path!==void 0?u.path:a(u).path;return{...u,name:void 0,path:Is(c,i)}}function r(u){const a=Xt(),s=Bn(),i=F(()=>!!f(u.target)&&f(u.target)!=="_self"),c=F(()=>{const y=f(u.to)||f(u.href)||"";return typeof y=="string"&&Ln(y,{acceptRelative:!0})}),l=Ep("RouterLink"),d=l&&typeof l!="string"?l.useLink:void 0,p=F(()=>{if(f(u.external))return!0;const y=f(u.to)||f(u.href)||"";return typeof y=="object"?!1:y===""||c.value}),h=F(()=>{const y=f(u.to)||f(u.href)||"";return p.value?y:o(y,a.resolve,f(u.trailingSlash))}),m=p.value?void 0:d?.({...u,to:h,viewTransition:f(u.viewTransition)}),g=F(()=>{const y=f(u.trailingSlash)??e.trailingSlash;if(!h.value||c.value||n(h.value))return h.value;if(p.value){const E=typeof h.value=="object"&&"path"in h.value?u0(h.value):h.value,b=typeof E=="object"?a.resolve(E).href:E;return Is(b,y)}return typeof h.value=="object"?a.resolve(h.value)?.href??null:Is(cr(s.app.baseURL,h.value),y)});return{to:h,hasTarget:i,isAbsoluteUrl:c,isExternal:p,href:g,isActive:m?.isActive??F(()=>h.value===a.currentRoute.value.path),isExactActive:m?.isExactActive??F(()=>h.value===a.currentRoute.value.path),route:m?.route??F(()=>a.resolve(h.value)),async navigate(y){await dl(g.value,{replace:f(u.replace),external:p.value||i.value})}}}return L({name:t,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},prefetchOn:{type:[String,Object],default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1},trailingSlash:{type:String,default:void 0,required:!1}},useLink:r,setup(u,{slots:a}){const s=Xt(),{to:i,href:c,navigate:l,isExternal:d,hasTarget:p,isAbsoluteUrl:h}=r(u),m=Me(!1),g=R(null),y=v=>{g.value=u.custom?v?.$el?.nextElementSibling:v?.$el};function E(v){return!m.value&&(typeof u.prefetchOn=="string"?u.prefetchOn===v:u.prefetchOn?.[v]??e.prefetchOn?.[v])&&(u.prefetch??e.prefetch)!==!1&&u.noPrefetch!==!0&&u.target!=="_blank"&&!c9()}async function b(v=Re()){if(m.value)return;m.value=!0;const C=typeof i.value=="string"?i.value:d.value?u0(i.value):s.resolve(i.value).fullPath,w=d.value?new URL(C,window.location.href).href:C;await Promise.all([v.hooks.callHook("link:prefetch",w)?.catch(()=>{}),!d.value&&!p.value&&b3(i.value,s).catch(()=>{})])}if(E("visibility")){const v=Re();let C,w=null;$e(()=>{const B=i9();ml(()=>{C=m0(()=>{g?.value?.tagName&&(w=B.observe(g.value,async()=>{w?.(),w=null,await b(v)}))})})}),mo(()=>{C&&NA(C),w?.(),w=null})}return()=>{if(!d.value&&!p.value&&!n(i.value)){const w={ref:y,to:i.value,activeClass:u.activeClass||e.activeClass,exactActiveClass:u.exactActiveClass||e.exactActiveClass,replace:u.replace,ariaCurrentValue:u.ariaCurrentValue,custom:u.custom};return u.custom||(E("interaction")&&(w.onPointerenter=b.bind(null,void 0),w.onFocus=b.bind(null,void 0)),m.value&&(w.class=u.prefetchedClass||e.prefetchedClass),w.rel=u.rel||void 0),qe(Ep("RouterLink"),w,a.default)}const v=u.target||null,C=a9(u.noRel?"":u.rel,e.externalRelAttribute,h.value||p.value?"noopener noreferrer":"")||null;return u.custom?a.default?a.default({href:c.value,navigate:l,prefetch:b,get route(){if(!c.value)return;const w=new URL(c.value,window.location.href);return{path:w.pathname,fullPath:w.pathname,get query(){return jd(w.search)},hash:w.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:c.value}},rel:C,target:v,isExternal:d.value||p.value,isActive:!1,isExactActive:!1}):null:qe("a",{ref:g,href:c.value||null,rel:C,target:v,onClick:async w=>{if(!(d.value||p.value)){w.preventDefault();try{const B=Ay(c.value);return await(u.replace?s.replace(B):s.push(B))}finally{if(n(i.value)){const B=i.value.slice(1);let x=B;try{x=decodeURIComponent(B)}catch{}document.getElementById(x)?.focus()}}}}},a.default?.())}}})}const nf=s9(q5);function Is(e,t){const n=t==="append"?Vd:Bu;return Ln(e)&&!e.startsWith("http")?e:n(e,!0)}function i9(){const e=Re();if(e._observer)return e._observer;let t=null;const n=new Map,o=(u,a)=>(t||=new IntersectionObserver(s=>{for(const i of s){const c=n.get(i.target);(i.isIntersecting||i.intersectionRatio>0)&&c&&c()}}),n.set(u,a),t.observe(u),()=>{n.delete(u),t?.unobserve(u),n.size===0&&(t?.disconnect(),t=null)});return e._observer={observe:o}}const l9=/2g/;function c9(){const e=navigator.connection;return!!(e&&(e.saveData||l9.test(e.effectiveType)))}function d9(e){typeof e.indexable<"u"&&(e.indexable=String(e.indexable)!=="false"),typeof e.trailingSlash<"u"&&!e.trailingSlash&&(e.trailingSlash=String(e.trailingSlash)!=="false"),e.url&&!Ln(String(e.url),{acceptRelative:!0,strict:!1})&&(e.url=i5(String(e.url)));const t=Object.keys(e).sort((o,r)=>o.localeCompare(r)),n={};for(const o of t)n[o]=e[o];return n}function f9(e){const n=[];function o(u){if(!u||typeof u!="object"||Object.keys(u).length===0)return()=>{};u._context;const a={};for(const s in u){const i=u[s];typeof i<"u"&&i!==""&&(a[s]=i)}return Object.keys(a).filter(s=>!s.startsWith("_")).length===0?()=>{}:(n.push(a),()=>{const s=n.indexOf(a);s!==-1&&n.splice(s,1)})}function r(u){const a={};u?.debug&&(a._context={}),a._priority={};for(const s in n.sort((i,c)=>(i._priority||0)-(c._priority||0)))for(const i in n[s]){const c=i,l=u?.resolveRefs?ke(n[s][i]):n[s][i];!i.startsWith("_")&&typeof l<"u"&&l!==""&&(a[i]=l,typeof n[s]._priority<"u"&&n[s]._priority!==-1&&(a._priority[c]=n[s]._priority),u?.debug&&(a._context[c]=n[s]._context?.[c]||n[s]._context||"anonymous"))}return u?.skipNormalize?a:d9(a)}return{stack:n,push:o,get:r}}const p9=vn({name:"nuxt-site-config:init",enforce:"pre",async setup(e){const t=f9(),n=nr("site-config");{const o=n.value||window.__NUXT_SITE_CONFIG__||{};for(const r in o)r[0]!=="_"&&t.push({[r]:o[r],_priority:o._priority?.[r]||-1})}return{provide:{nuxtSiteConfig:t}}}}),h9=vn({name:"nuxt:payload",setup(e){const t=new Set;Xt().beforeResolve(async(n,o)=>{if(n.path===o.path)return;const r=await lh(n.path);if(r){for(const u of t)delete e.static.data[u];for(const u in r.data)u in e.static.data||t.add(u),e.static.data[u]=r.data[u]}}),ml(()=>{e.hooks.hook("link:prefetch",async n=>{const{hostname:o}=new URL(n,window.location.href);o===window.location.hostname&&await lh(n).catch(()=>{console.warn("[nuxt] Error preloading payload for",n)})}),navigator.connection?.effectiveType!=="slow-2g"&&setTimeout(Gd,1e3)})}}),m9=vn(()=>{const e=Xt();ml(()=>{e.beforeResolve(async()=>{await new Promise(t=>{setTimeout(t,100),requestAnimationFrame(()=>{setTimeout(t,0)})})})})}),g9=vn(e=>{let t;async function n(){let o;try{o=await Gd()}catch(r){const u=r;if(!("status"in u&&(u.status===404||u.status===403)))throw u}t&&clearTimeout(t),t=setTimeout(n,th);try{const r=await $fetch(Ud("builds/latest.json")+`?${Date.now()}`);r.id!==o?.id&&(e.hooks.callHook("app:manifest:update",r),t&&clearTimeout(t))}catch{}}ml(()=>{t=setTimeout(n,th)})}),v9=vn({name:"nuxt:chunk-reload",setup(e){const t=Xt(),n=Bn(),o=new Set;t.beforeEach(()=>{o.clear()}),e.hook("app:chunkError",({error:u})=>{o.add(u)});function r(u){const a=cr(n.app.baseURL,u.fullPath);u9({path:a,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(r)}),t.onError((u,a)=>{o.has(u)&&r(a)})}}),y9="__NUXT_COLOR_MODE__",nc="nuxt-color-mode",b9="localStorage",Co=window[y9]||{},E9=vn(e=>{const t=nr("color-mode",()=>_t({preference:Co.preference,value:Co.value,unknown:!1,forced:!1})).value;Xt().afterEach(u=>{const a=u.meta.colorMode;a&&a!=="system"?(t.value=a,t.forced=!0):(a==="system"&&console.warn("You cannot force the colorMode to system at the page level."),t.forced=!1,t.value=t.preference==="system"?Co.getColorScheme():t.preference)});let n;function o(){n||!window.matchMedia||(n=window.matchMedia("(prefers-color-scheme: dark)"),n.addEventListener("change",()=>{!t.forced&&t.preference==="system"&&(t.value=Co.getColorScheme())}))}function r(u,a){switch(u){case"cookie":window.document.cookie=nc+"="+a;break;case"sessionStorage":window.sessionStorage?.setItem(nc,a);break;default:window.localStorage?.setItem(nc,a)}}ye(()=>t.preference,u=>{t.forced||(u==="system"?(t.value=Co.getColorScheme(),o()):t.value=u,r(b9,u))},{immediate:!0}),ye(()=>t.value,(u,a)=>{let s;s=window.document.createElement("style"),s.appendChild(document.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),window.document.head.appendChild(s),Co.removeColorScheme(a),Co.addColorScheme(u),window.getComputedStyle(s).opacity,document.head.removeChild(s)}),t.preference==="system"&&o(),e.hook("app:mounted",()=>{t.unknown&&(t.preference=Co.preference,t.value=Co.value,t.unknown=!1)}),e.provide("colorMode",t)}),E3=/^[a-z0-9]+(-[a-z0-9]+)*$/,is=(e,t,n,o="")=>{const r=e.split(":");if(e.slice(0,1)==="@"){if(r.length<2||r.length>3)return null;o=r.shift().slice(1)}if(r.length>3||!r.length)return null;if(r.length>1){const s=r.pop(),i=r.pop(),c={provider:r.length>0?r[0]:o,prefix:i,name:s};return t&&!oi(c)?null:c}const u=r[0],a=u.split("-");if(a.length>1){const s={provider:o,prefix:a.shift(),name:a.join("-")};return t&&!oi(s)?null:s}if(n&&o===""){const s={provider:o,prefix:"",name:u};return t&&!oi(s,n)?null:s}return null},oi=(e,t)=>e?!!((t&&e.prefix===""||e.prefix)&&e.name):!1,C3=Object.freeze({left:0,top:0,width:16,height:16}),Ti=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),$u=Object.freeze({...C3,...Ti}),g0=Object.freeze({...$u,body:"",hidden:!1});function C9(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const o=((e.rotate||0)+(t.rotate||0))%4;return o&&(n.rotate=o),n}function Rh(e,t){const n=C9(e,t);for(const o in g0)o in Ti?o in e&&!(o in n)&&(n[o]=Ti[o]):o in t?n[o]=t[o]:o in e&&(n[o]=e[o]);return n}function x9(e,t){const n=e.icons,o=e.aliases||Object.create(null),r=Object.create(null);function u(a){if(n[a])return r[a]=[];if(!(a in r)){r[a]=null;const s=o[a]&&o[a].parent,i=s&&u(s);i&&(r[a]=[s].concat(i))}return r[a]}return Object.keys(n).concat(Object.keys(o)).forEach(u),r}function w9(e,t,n){const o=e.icons,r=e.aliases||Object.create(null);let u={};function a(s){u=Rh(o[s]||r[s],u)}return a(t),n.forEach(a),Rh(e,u)}function x3(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(r=>{t(r,null),n.push(r)});const o=x9(e);for(const r in o){const u=o[r];u&&(t(r,w9(e,r,u)),n.push(r))}return n}const D9={provider:"",aliases:{},not_found:{},...C3};function oc(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function w3(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!oc(e,D9))return null;const n=t.icons;for(const r in n){const u=n[r];if(!r||typeof u.body!="string"||!oc(u,g0))return null}const o=t.aliases||Object.create(null);for(const r in o){const u=o[r],a=u.parent;if(!r||typeof a!="string"||!n[a]&&!o[a]||!oc(u,g0))return null}return t}const Lh=Object.create(null);function A9(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function Hr(e,t){const n=Lh[e]||(Lh[e]=Object.create(null));return n[t]||(n[t]=A9(e,t))}function D3(e,t){return w3(t)?x3(t,(n,o)=>{o?e.icons[n]=o:e.missing.add(n)}):[]}function B9(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let ja=!1;function A3(e){return typeof e=="boolean"&&(ja=e),ja}function of(e){const t=typeof e=="string"?is(e,!0,ja):e;if(t){const n=Hr(t.provider,t.prefix),o=t.name;return n.icons[o]||(n.missing.has(o)?null:void 0)}}function Va(e,t){const n=is(e,!0,ja);if(!n)return!1;const o=Hr(n.provider,n.prefix);return t?B9(o,n.name,t):(o.missing.add(n.name),!0)}function _9(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),ja&&!t&&!e.prefix){let r=!1;return w3(e)&&(e.prefix="",x3(e,(u,a)=>{Va(u,a)&&(r=!0)})),r}const n=e.prefix;if(!oi({prefix:n,name:"a"}))return!1;const o=Hr(t,n);return!!D3(o,e)}function v0(e){const t=of(e);return t&&{...$u,...t}}const B3=Object.freeze({width:null,height:null}),_3=Object.freeze({...B3,...Ti}),k9=/(-?[0-9.]*[0-9]+[0-9.]*)/g,S9=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function qh(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const o=e.split(k9);if(o===null||!o.length)return e;const r=[];let u=o.shift(),a=S9.test(u);for(;;){if(a){const s=parseFloat(u);isNaN(s)?r.push(u):r.push(Math.ceil(s*t*n)/n)}else r.push(u);if(u=o.shift(),u===void 0)return r.join("");a=!a}}function T9(e,t="defs"){let n="";const o=e.indexOf("<"+t);for(;o>=0;){const r=e.indexOf(">",o),u=e.indexOf("",u);if(a===-1)break;n+=e.slice(r+1,u).trim(),e=e.slice(0,o).trim()+e.slice(a+1)}return{defs:n,content:e}}function F9(e,t){return e?""+e+""+t:t}function P9(e,t,n){const o=T9(e);return F9(o.defs,t+o.content+n)}const M9=e=>e==="unset"||e==="undefined"||e==="none";function O9(e,t){const n={...$u,...e},o={..._3,...t},r={left:n.left,top:n.top,width:n.width,height:n.height};let u=n.body;[n,o].forEach(g=>{const y=[],E=g.hFlip,b=g.vFlip;let v=g.rotate;E?b?v+=2:(y.push("translate("+(r.width+r.left).toString()+" "+(0-r.top).toString()+")"),y.push("scale(-1 1)"),r.top=r.left=0):b&&(y.push("translate("+(0-r.left).toString()+" "+(r.height+r.top).toString()+")"),y.push("scale(1 -1)"),r.top=r.left=0);let C;switch(v<0&&(v-=Math.floor(v/4)*4),v=v%4,v){case 1:C=r.height/2+r.top,y.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:y.unshift("rotate(180 "+(r.width/2+r.left).toString()+" "+(r.height/2+r.top).toString()+")");break;case 3:C=r.width/2+r.left,y.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}v%2===1&&(r.left!==r.top&&(C=r.left,r.left=r.top,r.top=C),r.width!==r.height&&(C=r.width,r.width=r.height,r.height=C)),y.length&&(u=P9(u,'',""))});const a=o.width,s=o.height,i=r.width,c=r.height;let l,d;a===null?(d=s===null?"1em":s==="auto"?c:s,l=qh(d,i/c)):(l=a==="auto"?i:a,d=s===null?qh(l,c/i):s==="auto"?c:s);const p={},h=(g,y)=>{M9(y)||(p[g]=y.toString())};h("width",l),h("height",d);const m=[r.left,r.top,i,c];return p.viewBox=m.join(" "),{attributes:p,viewBox:m,body:u}}const I9=/\sid="(\S+)"/g,R9="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let L9=0;function q9(e,t=R9){const n=[];let o;for(;o=I9.exec(e);)n.push(o[1]);if(!n.length)return e;const r="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(u=>{const a=typeof t=="function"?t(u):t+(L9++).toString(),s=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+s+')([")]|\\.[a-z])',"g"),"$1"+a+r+"$3")}),e=e.replace(new RegExp(r,"g"),""),e}const y0=Object.create(null);function k3(e,t){y0[e]=t}function b0(e){return y0[e]||y0[""]}function rf(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const gl=Object.create(null),ra=["https://api.simplesvg.com","https://api.unisvg.com"],ri=[];for(;ra.length>0;)ra.length===1||Math.random()>.5?ri.push(ra.shift()):ri.push(ra.pop());gl[""]=rf({resources:["https://api.iconify.design"].concat(ri)});function S3(e,t){const n=rf(t);return n===null?!1:(gl[e]=n,!0)}function vl(e){return gl[e]}function $9(){return Object.keys(gl)}const N9=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let Fi=N9();function j9(e){Fi=e}function V9(){return Fi}function z9(e,t){const n=vl(e);if(!n)return 0;let o;if(!n.maxURL)o=0;else{let r=0;n.resources.forEach(a=>{r=Math.max(r,a.length)});const u=t+".json?icons=";o=n.maxURL-r-n.path.length-u.length}return o}function U9(e){return e===404}const H9=(e,t,n)=>{const o=[],r=z9(e,t),u="icons";let a={type:u,provider:e,prefix:t,icons:[]},s=0;return n.forEach((i,c)=>{s+=i.length+1,s>=r&&c>0&&(o.push(a),a={type:u,provider:e,prefix:t,icons:[]},s=i.length),a.icons.push(i)}),o.push(a),o};function K9(e){if(typeof e=="string"){const t=vl(e);if(t)return t.path}return"/"}const W9=(e,t,n)=>{if(!Fi){n("abort",424);return}let o=K9(t.provider);switch(t.type){case"icons":{const u=t.prefix,s=t.icons.join(","),i=new URLSearchParams({icons:s});o+=u+".json?"+i.toString();break}case"custom":{const u=t.uri;o+=u.slice(0,1)==="/"?u.slice(1):u;break}default:n("abort",400);return}let r=503;Fi(e+o).then(u=>{const a=u.status;if(a!==200){setTimeout(()=>{n(U9(a)?"abort":"next",a)});return}return r=501,u.json()}).then(u=>{if(typeof u!="object"||u===null){setTimeout(()=>{u===404?n("abort",u):n("next",r)});return}setTimeout(()=>{n("success",u)})}).catch(()=>{n("next",r)})},G9={prepare:H9,send:W9};function Y9(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((r,u)=>r.provider!==u.provider?r.provider.localeCompare(u.provider):r.prefix!==u.prefix?r.prefix.localeCompare(u.prefix):r.name.localeCompare(u.name));let o={provider:"",prefix:"",name:""};return e.forEach(r=>{if(o.name===r.name&&o.prefix===r.prefix&&o.provider===r.provider)return;o=r;const u=r.provider,a=r.prefix,s=r.name,i=n[u]||(n[u]=Object.create(null)),c=i[a]||(i[a]=Hr(u,a));let l;s in c.icons?l=t.loaded:a===""||c.missing.has(s)?l=t.missing:l=t.pending;const d={provider:u,prefix:a,name:s};l.push(d)}),t}function T3(e,t){e.forEach(n=>{const o=n.loaderCallbacks;o&&(n.loaderCallbacks=o.filter(r=>r.id!==t))})}function Z9(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const o=e.provider,r=e.prefix;t.forEach(u=>{const a=u.icons,s=a.pending.length;a.pending=a.pending.filter(i=>{if(i.prefix!==r)return!0;const c=i.name;if(e.icons[c])a.loaded.push({provider:o,prefix:r,name:c});else if(e.missing.has(c))a.missing.push({provider:o,prefix:r,name:c});else return n=!0,!0;return!1}),a.pending.length!==s&&(n||T3([e],u.id),u.callback(a.loaded.slice(0),a.missing.slice(0),a.pending.slice(0),u.abort))})}))}let X9=0;function J9(e,t,n){const o=X9++,r=T3.bind(null,n,o);if(!t.pending.length)return r;const u={id:o,icons:t,callback:e,abort:r};return n.forEach(a=>{(a.loaderCallbacks||(a.loaderCallbacks=[])).push(u)}),r}function Q9(e,t=!0,n=!1){const o=[];return e.forEach(r=>{const u=typeof r=="string"?is(r,t,n):r;u&&o.push(u)}),o}var eB={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function tB(e,t,n,o){const r=e.resources.length,u=e.random?Math.floor(Math.random()*r):e.index;let a;if(e.random){let B=e.resources.slice(0);for(a=[];B.length>1;){const x=Math.floor(Math.random()*B.length);a.push(B[x]),B=B.slice(0,x).concat(B.slice(x+1))}a=a.concat(B)}else a=e.resources.slice(u).concat(e.resources.slice(0,u));const s=Date.now();let i="pending",c=0,l,d=null,p=[],h=[];typeof o=="function"&&h.push(o);function m(){d&&(clearTimeout(d),d=null)}function g(){i==="pending"&&(i="aborted"),m(),p.forEach(B=>{B.status==="pending"&&(B.status="aborted")}),p=[]}function y(B,x){x&&(h=[]),typeof B=="function"&&h.push(B)}function E(){return{startTime:s,payload:t,status:i,queriesSent:c,queriesPending:p.length,subscribe:y,abort:g}}function b(){i="failed",h.forEach(B=>{B(void 0,l)})}function v(){p.forEach(B=>{B.status==="pending"&&(B.status="aborted")}),p=[]}function C(B,x,_){const S=x!=="success";switch(p=p.filter(O=>O!==B),i){case"pending":break;case"failed":if(S||!e.dataAfterTimeout)return;break;default:return}if(x==="abort"){l=_,b();return}if(S){l=_,p.length||(a.length?w():b());return}if(m(),v(),!e.random){const O=e.resources.indexOf(B.resource);O!==-1&&O!==e.index&&(e.index=O)}i="completed",h.forEach(O=>{O(_)})}function w(){if(i!=="pending")return;m();const B=a.shift();if(B===void 0){if(p.length){d=setTimeout(()=>{m(),i==="pending"&&(v(),b())},e.timeout);return}b();return}const x={status:"pending",resource:B,callback:(_,S)=>{C(x,_,S)}};p.push(x),c++,d=setTimeout(w,e.rotate),n(B,t,x.callback)}return setTimeout(w),E}function F3(e){const t={...eB,...e};let n=[];function o(){n=n.filter(s=>s().status==="pending")}function r(s,i,c){const l=tB(t,s,i,(d,p)=>{o(),c&&c(d,p)});return n.push(l),l}function u(s){return n.find(i=>s(i))||null}return{query:r,find:u,setIndex:s=>{t.index=s},getIndex:()=>t.index,cleanup:o}}function $h(){}const rc=Object.create(null);function nB(e){if(!rc[e]){const t=vl(e);if(!t)return;const n=F3(t),o={config:t,redundancy:n};rc[e]=o}return rc[e]}function P3(e,t,n){let o,r;if(typeof e=="string"){const u=b0(e);if(!u)return n(void 0,424),$h;r=u.send;const a=nB(e);a&&(o=a.redundancy)}else{const u=rf(e);if(u){o=F3(u);const a=e.resources?e.resources[0]:"",s=b0(a);s&&(r=s.send)}}return!o||!r?(n(void 0,424),$h):o.query(t,r,n)().abort}function Nh(){}function oB(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,Z9(e)}))}function rB(e){const t=[],n=[];return e.forEach(o=>{(o.match(E3)?t:n).push(o)}),{valid:t,invalid:n}}function ua(e,t,n){function o(){const r=e.pendingIcons;t.forEach(u=>{r&&r.delete(u),e.icons[u]||e.missing.add(u)})}if(n&&typeof n=="object")try{if(!D3(e,n).length){o();return}}catch(r){console.error(r)}o(),oB(e)}function jh(e,t){e instanceof Promise?e.then(n=>{t(n)}).catch(()=>{t(null)}):t(e)}function uB(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:o}=e,r=e.iconsToLoad;if(delete e.iconsToLoad,!r||!r.length)return;const u=e.loadIcon;if(e.loadIcons&&(r.length>1||!u)){jh(e.loadIcons(r,o,n),l=>{ua(e,r,l)});return}if(u){r.forEach(l=>{const d=u(l,o,n);jh(d,p=>{const h=p?{prefix:o,icons:{[l]:p}}:null;ua(e,[l],h)})});return}const{valid:a,invalid:s}=rB(r);if(s.length&&ua(e,s,null),!a.length)return;const i=o.match(E3)?b0(n):null;if(!i){ua(e,a,null);return}i.prepare(n,o,a).forEach(l=>{P3(n,l,d=>{ua(e,l.icons,d)})})}))}const M3=(e,t)=>{const n=Q9(e,!0,A3()),o=Y9(n);if(!o.pending.length){let i=!0;return t&&setTimeout(()=>{i&&t(o.loaded,o.missing,o.pending,Nh)}),()=>{i=!1}}const r=Object.create(null),u=[];let a,s;return o.pending.forEach(i=>{const{provider:c,prefix:l}=i;if(l===s&&c===a)return;a=c,s=l,u.push(Hr(c,l));const d=r[c]||(r[c]=Object.create(null));d[l]||(d[l]=[])}),o.pending.forEach(i=>{const{provider:c,prefix:l,name:d}=i,p=Hr(c,l),h=p.pendingIcons||(p.pendingIcons=new Set);h.has(d)||(h.add(d),r[c][l].push(d))}),u.forEach(i=>{const c=r[i.provider][i.prefix];c.length&&uB(i,c)}),t?J9(t,o,u):Nh},aB=e=>new Promise((t,n)=>{const o=typeof e=="string"?is(e,!0):e;if(!o){n(e);return}M3([o||e],r=>{if(r.length&&o){const u=of(o);if(u){t({...$u,...u});return}}n(e)})});function sB(e,t,n){Hr("",t).loadIcons=e}function iB(e,t){const n={...e};for(const o in t){const r=t[o],u=typeof r;o in B3?(r===null||r&&(u==="string"||u==="number"))&&(n[o]=r):u===typeof n[o]&&(n[o]=o==="rotate"?r%4:r)}return n}const lB=/[\s,]+/;function cB(e,t){t.split(lB).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function dB(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function o(r){for(;r<0;)r+=4;return r%4}if(n===""){const r=parseInt(e);return isNaN(r)?0:o(r)}else if(n!==e){let r=0;switch(n){case"%":r=25;break;case"deg":r=90}if(r){let u=parseFloat(e.slice(0,e.length-n.length));return isNaN(u)?0:(u=u/r,u%1===0?o(u):0)}}return t}function fB(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const o in t)n+=" "+o+'="'+t[o]+'"';return'"+e+""}function pB(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function hB(e){return"data:image/svg+xml,"+pB(e)}function mB(e){return'url("'+hB(e)+'")'}const Vh={..._3,inline:!1},gB={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},vB={display:"inline-block"},E0={backgroundColor:"currentColor"},O3={backgroundColor:"transparent"},zh={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Uh={webkitMask:E0,mask:E0,background:O3};for(const e in Uh){const t=Uh[e];for(const n in zh)t[e+n]=zh[n]}const ui={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";ui[e+"-flip"]=t,ui[e.slice(0,1)+"-flip"]=t,ui[e+"Flip"]=t});function Hh(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Kh=(e,t)=>{const n=iB(Vh,t),o={...gB},r=t.mode||"svg",u={},a=t.style,s=typeof a=="object"&&!(a instanceof Array)?a:{};for(let g in t){const y=t[g];if(y!==void 0)switch(g){case"icon":case"style":case"onLoad":case"mode":case"ssr":break;case"inline":case"hFlip":case"vFlip":n[g]=y===!0||y==="true"||y===1;break;case"flip":typeof y=="string"&&cB(n,y);break;case"color":u.color=y;break;case"rotate":typeof y=="string"?n[g]=dB(y):typeof y=="number"&&(n[g]=y);break;case"ariaHidden":case"aria-hidden":y!==!0&&y!=="true"&&delete o["aria-hidden"];break;default:{const E=ui[g];E?(y===!0||y==="true"||y===1)&&(n[E]=!0):Vh[g]===void 0&&(o[g]=y)}}}const i=O9(e,n),c=i.attributes;if(n.inline&&(u.verticalAlign="-0.125em"),r==="svg"){o.style={...u,...s},Object.assign(o,c);let g=0,y=t.id;return typeof y=="string"&&(y=y.replace(/-/g,"_")),o.innerHTML=q9(i.body,y?()=>y+"ID"+g++:"iconifyVue"),qe("svg",o)}const{body:l,width:d,height:p}=e,h=r==="mask"||(r==="bg"?!1:l.indexOf("currentColor")!==-1),m=fB(l,{...c,width:d+"",height:p+""});return o.style={...u,"--svg":mB(m),width:Hh(c.width),height:Hh(c.height),...vB,...h?E0:O3,...s},qe("span",o)};A3(!0);k3("",G9);if(typeof document<"u"&&typeof window<"u"){const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(o=>{try{(typeof o!="object"||o===null||o instanceof Array||typeof o.icons!="object"||typeof o.prefix!="string"||!_9(o))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const o="IconifyProviders["+n+"] is invalid.";try{const r=t[n];if(typeof r!="object"||!r||r.resources===void 0)continue;S3(n,r)||console.error(o)}catch{console.error(o)}}}}const yB={...$u,body:""},bB=L((e,{emit:t})=>{const n=R(null);function o(){n.value&&(n.value.abort?.(),n.value=null)}const r=R(!!e.ssr),u=R(""),a=Me(null);function s(){const c=e.icon;if(typeof c=="object"&&c!==null&&typeof c.body=="string")return u.value="",{data:c};let l;if(typeof c!="string"||(l=is(c,!1,!0))===null)return null;let d=of(l);if(!d){const m=n.value;return(!m||m.name!==c)&&(d===null?n.value={name:c}:n.value={name:c,abort:M3([l],i)}),null}o(),u.value!==c&&(u.value=c,Oe(()=>{t("load",c)}));const p=e.customise;if(p){d=Object.assign({},d);const m=p(d.body,l.name,l.prefix,l.provider);typeof m=="string"&&(d.body=m)}const h=["iconify"];return l.prefix!==""&&h.push("iconify--"+l.prefix),l.provider!==""&&h.push("iconify--"+l.provider),{data:d,classes:h}}function i(){const c=s();c?c.data!==a.value?.data&&(a.value=c):a.value=null}return r.value?i():$e(()=>{r.value=!0,i()}),ye(()=>e.icon,i),Ht(o),()=>{const c=a.value;if(!c)return Kh(yB,e);let l=e;return c.classes&&(l={...e,class:c.classes.join(" ")}),Kh({...$u,...c.data},l)}},{props:["icon","mode","ssr","width","height","style","color","inline","rotate","hFlip","horizontalFlip","vFlip","verticalFlip","flip","id","ariaHidden","customise","title"],emits:["load"]}),Wh={getAPIConfig:vl,setAPIModule:k3,sendAPIQuery:P3,setFetch:j9,getFetch:V9,listAPIProviders:$9},EB=vn({name:"@nuxt/icon",setup(){const e=Bn(),t=Pe().icon;Wh.setFetch($fetch.native);const n=[];if(t.provider==="server"){const r=e.app?.baseURL?.replace(/\/$/,"")??"";n.push(r+(t.localApiEndpoint||"/api/_nuxt_icon")),(t.fallbackToApi===!0||t.fallbackToApi==="client-only")&&n.push(t.iconifyApiEndpoint)}else t.provider==="none"?Wh.setFetch(()=>Promise.resolve(new Response)):n.push(t.iconifyApiEndpoint);async function o(r,u){try{const a=await $fetch(n[0]+"/"+u+".json",{query:{icons:r.join(",")}});if(!a||a.prefix!==u||!a.icons)throw new Error("Invalid data"+JSON.stringify(a));return a}catch(a){return console.error("Failed to load custom icons",a),null}}S3("",{resources:n});for(const r of t.customCollections||[])r&&sB(o,r)}}),CB=Ae(()=>ne(()=>import("./CDym3zc6.js"),[],import.meta.url).then(e=>e.default||e.default||e)),xB=Ae(()=>ne(()=>import("./CfPbqwDO.js"),[],import.meta.url).then(e=>e.default||e.default||e)),wB=Ae(()=>ne(()=>import("./CB6Z2s81.js"),[],import.meta.url).then(e=>e.default||e.default||e)),DB=Ae(()=>ne(()=>import("./vaS8Rkl_.js"),__vite__mapDeps([6,7,3]),import.meta.url).then(e=>e.default||e.default||e)),AB=Ae(()=>ne(()=>import("./CSimry40.js"),[],import.meta.url).then(e=>e.default||e.default||e)),BB=Ae(()=>ne(()=>import("./Jc8Ntx_l.js"),__vite__mapDeps([8,7,3]),import.meta.url).then(e=>e.default||e.default||e)),_B=Ae(()=>ne(()=>import("./CCiWmQwn.js"),__vite__mapDeps([9,7,3]),import.meta.url).then(e=>e.default||e.default||e)),kB=Ae(()=>ne(()=>import("./Bzhn7Nlk.js"),[],import.meta.url).then(e=>e.default||e.default||e)),SB=Ae(()=>ne(()=>import("./CamoC0EK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),TB=Ae(()=>ne(()=>import("./FyXvkSrC.js"),[],import.meta.url).then(e=>e.default||e.default||e)),FB=Ae(()=>ne(()=>import("./CgQMWAWA.js"),__vite__mapDeps([10,11,12,13]),import.meta.url).then(e=>e.default||e.default||e)),PB=Ae(()=>ne(()=>import("./C-sCiTCq.js"),[],import.meta.url).then(e=>e.default||e.default||e)),MB=Ae(()=>ne(()=>import("./DHP-KcjK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),OB=Ae(()=>ne(()=>import("./jpB_SM9d.js"),__vite__mapDeps([14,15,12,13]),import.meta.url).then(e=>e.default||e.default||e)),IB=Ae(()=>ne(()=>import("./CFKlwMFM.js"),[],import.meta.url).then(e=>e.default||e.default||e)),RB=Ae(()=>ne(()=>import("./BlIgAVvl.js"),[],import.meta.url).then(e=>e.default||e.default||e)),LB=Ae(()=>ne(()=>import("./Bnc4fItI.js"),__vite__mapDeps([16,7,3]),import.meta.url).then(e=>e.default||e.default||e)),qB=Ae(()=>ne(()=>import("./CsIQayK_.js"),[],import.meta.url).then(e=>e.default||e.default||e)),$B=Ae(()=>ne(()=>import("./D5E4Znt1.js"),[],import.meta.url).then(e=>e.default||e.default||e)),NB=Ae(()=>ne(()=>import("./p9GVdgbx.js"),[],import.meta.url).then(e=>e.default||e.default||e)),jB=Ae(()=>ne(()=>import("./2h0Q0JkN.js"),[],import.meta.url).then(e=>e.default||e.default||e)),VB=Ae(()=>ne(()=>import("./D5DWQP-B.js"),[],import.meta.url).then(e=>e.default||e.default||e)),zB=Ae(()=>ne(()=>import("./C8791Vr7.js"),[],import.meta.url).then(e=>e.default||e.default||e)),UB=Ae(()=>ne(()=>import("./CTU5hS66.js"),[],import.meta.url).then(e=>e.default||e.default||e)),HB=Ae(()=>ne(()=>import("./B2gqyXxK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),KB=Ae(()=>ne(()=>import("./Y2TJq070.js"),[],import.meta.url).then(e=>e.default||e.default||e)),WB=Ae(()=>ne(()=>import("./B4xqMpdT.js"),[],import.meta.url).then(e=>e.default||e.default||e)),GB=Ae(()=>ne(()=>import("./CGXzuCYy.js"),[],import.meta.url).then(e=>e.default||e.default||e)),YB=Ae(()=>ne(()=>import("./DB_5vY_E.js"),[],import.meta.url).then(e=>e.default||e.default||e)),ZB=Ae(()=>ne(()=>import("./B91fwRQf.js"),__vite__mapDeps([17,13]),import.meta.url).then(e=>e.default||e.default||e)),XB=Ae(()=>ne(()=>import("./BvtDsFck.js"),[],import.meta.url).then(e=>e.default||e.default||e)),JB=Ae(()=>ne(()=>import("./ICECbu1X.js"),[],import.meta.url).then(e=>e.default||e.default||e)),QB=Ae(()=>ne(()=>import("./qDOTQ2yj.js"),[],import.meta.url).then(e=>e.default||e.default||e)),e_=Ae(()=>ne(()=>import("./BKwruWNQ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),t_=Ae(()=>ne(()=>import("./BnW3dU0n.js"),__vite__mapDeps([18,11,12]),import.meta.url).then(e=>e.default||e.default||e)),n_=Ae(()=>ne(()=>import("./BXokzvm8.js"),[],import.meta.url).then(e=>e.default||e.default||e)),o_=Ae(()=>ne(()=>import("./C6Z5zZ8h.js"),[],import.meta.url).then(e=>e.default||e.default||e)),r_=Ae(()=>ne(()=>import("./4YIHfatS.js"),[],import.meta.url).then(e=>e.default||e.default||e)),u_=Ae(()=>ne(()=>import("./D_gYX37v.js"),[],import.meta.url).then(e=>e.default||e.default||e)),a_=Ae(()=>ne(()=>import("./CSnfmutH.js"),[],import.meta.url).then(e=>e.default||e.default||e)),s_=Ae(()=>ne(()=>import("./DLv9Mxsp.js"),[],import.meta.url).then(e=>e.default||e.default||e)),i_=Ae(()=>ne(()=>import("./CFOqH6J8.js"),[],import.meta.url).then(e=>e.default||e.default||e)),l_=Ae(()=>ne(()=>import("./BLnzyn6S.js"),__vite__mapDeps([19,7,3,8]),import.meta.url).then(e=>e.default||e.default||e)),c_=Ae(()=>ne(()=>import("./LZNkr4Qo.js"),__vite__mapDeps([20,7,3,8]),import.meta.url).then(e=>e.default||e.default||e)),d_=Ae(()=>ne(()=>import("./C3Ly8WAT.js"),__vite__mapDeps([21,7,3,8]),import.meta.url).then(e=>e.default||e.default||e)),f_=Ae(()=>ne(()=>import("./CG1YvYVw.js"),__vite__mapDeps([22,7,3,8]),import.meta.url).then(e=>e.default||e.default||e)),p_=Ae(()=>ne(()=>import("./BfXwXGCj.js"),[],import.meta.url).then(e=>e.default||e.default||e)),h_=Ae(()=>ne(()=>import("./Czt-ZuAe.js"),[],import.meta.url).then(e=>e.default||e.default||e)),m_=Ae(()=>ne(()=>Promise.resolve().then(()=>zO),void 0,import.meta.url).then(e=>e.default||e.default||e)),g_=[["ProseA",CB],["ProseAccordion",xB],["ProseAccordionItem",wB],["ProseBadge",DB],["ProseBlockquote",AB],["ProseCallout",BB],["ProseCard",_B],["ProseCardGroup",kB],["ProseCode",SB],["ProseCodeCollapse",TB],["ProseCodeGroup",FB],["ProseCodeIcon",PB],["ProseCodePreview",MB],["ProseCodeTree",OB],["ProseCollapsible",IB],["ProseEm",RB],["ProseField",LB],["ProseFieldGroup",qB],["ProseH1",$B],["ProseH2",NB],["ProseH3",jB],["ProseH4",VB],["ProseHr",zB],["ProseIcon",UB],["ProseImg",HB],["ProseKbd",KB],["ProseLi",WB],["ProseOl",GB],["ProseP",YB],["ProsePre",ZB],["ProseScript",XB],["ProseSteps",JB],["ProseStrong",QB],["ProseTable",e_],["ProseTabs",t_],["ProseTabsItem",n_],["ProseTbody",o_],["ProseTd",r_],["ProseTh",u_],["ProseThead",a_],["ProseTr",s_],["ProseUl",i_],["ProseCaution",l_],["ProseNote",c_],["ProseTip",d_],["ProseWarning",f_],["ProseH5",p_],["ProseH6",h_],["Icon",m_]],v_=vn({name:"nuxt:global-components",setup(e){for(const[t,n]of g_)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),or={default:Ae(()=>ne(()=>import("./BnHu5O7o.js"),__vite__mapDeps([23,24]),import.meta.url).then(e=>e.default||e)),docs:Ae(()=>ne(()=>import("./C0AA5UMg.js"),__vite__mapDeps([25,4,24]),import.meta.url).then(e=>e.default||e))},y_=vn({name:"nuxt:prefetch",setup(e){const t=Xt();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{const o=n?.meta?.layout;o&&typeof or[o]=="function"&&await or[o]()})}),e.hooks.hook("link:prefetch",n=>{if(Ln(n))return;const o=t.resolve(n);if(!o)return;const r=o.meta.layout;let u=a3(o.meta.middleware);u=u.filter(a=>typeof a=="string");for(const a of u)typeof h0[a]=="function"&&h0[a]();typeof r=="string"&&r in or&&r9(or[r])})}});var Rs={inherit:"inherit",current:"currentcolor",transparent:"transparent",black:"#000",white:"#fff",slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"},red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"}};const b_=[50,100,200,300,400,500,600,700,800,900,950];function E_(e,t){return e in Rs&&typeof Rs[e]=="object"&&t in Rs[e]?Rs[e][t]:""}function C_(e,t,n){const o=n?`${n}-`:"";return`${b_.map(r=>`--ui-color-${e}-${r}: var(--${o}color-${t==="neutral"?"old-neutral":t}-${r}, ${E_(t,r)});`).join(` + `)}`}function Gh(e,t){return`--ui-${e}: var(--ui-color-${e}-${t});`}const x_=vn(()=>{const e=Pe(),t=Re(),n=F(()=>{const{neutral:r,...u}=e.ui.colors,a=e.ui.prefix;return`@layer theme { + :root, :host { + ${Object.entries(e.ui.colors).map(([s,i])=>C_(s,i,a)).join(` + `)} + } + :root, :host, .light { + ${Object.keys(u).map(s=>Gh(s,500)).join(` + `)} + } + .dark { + ${Object.keys(u).map(s=>Gh(s,400)).join(` + `)} + } +}`}),o={style:[{innerHTML:()=>n.value,tagPriority:-2,id:"nuxt-ui-colors"}]};if(t.isHydrating&&!t.payload.serverRendered){const r=document.createElement("style");r.innerHTML=n.value,r.setAttribute("data-nuxt-ui-colors",""),document.head.appendChild(r),o.script=[{innerHTML:"document.head.removeChild(document.querySelector('[data-nuxt-ui-colors]'))"}]}Wd(o)}),bn={fatal:0,error:0,warn:1,log:2,info:3,success:3,fail:3,debug:4,trace:5,verbose:Number.POSITIVE_INFINITY},Yh={silent:{level:-1},fatal:{level:bn.fatal},error:{level:bn.error},warn:{level:bn.warn},log:{level:bn.log},info:{level:bn.info},success:{level:bn.success},fail:{level:bn.fail},ready:{level:bn.info},start:{level:bn.info},box:{level:bn.info},debug:{level:bn.debug},trace:{level:bn.trace},verbose:{level:bn.verbose}};function uc(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function C0(e,t,n=".",o){if(!uc(t))return C0(e,{},n);const r=Object.assign({},t);for(const u in e){if(u==="__proto__"||u==="constructor")continue;const a=e[u];a!=null&&(Array.isArray(a)&&Array.isArray(r[u])?r[u]=[...a,...r[u]]:uc(a)&&uc(r[u])?r[u]=C0(a,r[u],(n?`${n}.`:"")+u.toString()):r[u]=a)}return r}function w_(e){return(...t)=>t.reduce((n,o)=>C0(n,o,""),{})}const D_=w_();function A_(e){return Object.prototype.toString.call(e)==="[object Object]"}function B_(e){return!(!A_(e)||!e.message&&!e.args||e.stack)}let ac=!1;const Zh=[];class Ut{options;_lastLog;_mockFn;constructor(t={}){const n=t.types||Yh;this.options=D_({...t,defaults:{...t.defaults},level:sc(t.level,n),reporters:[...t.reporters||[]]},{types:Yh,throttle:1e3,throttleMin:5,formatOptions:{date:!0,colors:!1,compact:!0}});for(const o in n){const r={type:o,...this.options.defaults,...n[o]};this[o]=this._wrapLogFn(r),this[o].raw=this._wrapLogFn(r,!0)}this.options.mockFn&&this.mockTypes(),this._lastLog={}}get level(){return this.options.level}set level(t){this.options.level=sc(t,this.options.types,this.options.level)}prompt(t,n){if(!this.options.prompt)throw new Error("prompt is not supported!");return this.options.prompt(t,n)}create(t){const n=new Ut({...this.options,...t});return this._mockFn&&n.mockTypes(this._mockFn),n}withDefaults(t){return this.create({...this.options,defaults:{...this.options.defaults,...t}})}withTag(t){return this.withDefaults({tag:this.options.defaults.tag?this.options.defaults.tag+":"+t:t})}addReporter(t){return this.options.reporters.push(t),this}removeReporter(t){if(t){const n=this.options.reporters.indexOf(t);if(n!==-1)return this.options.reporters.splice(n,1)}else this.options.reporters.splice(0);return this}setReporters(t){return this.options.reporters=Array.isArray(t)?t:[t],this}wrapAll(){this.wrapConsole(),this.wrapStd()}restoreAll(){this.restoreConsole(),this.restoreStd()}wrapConsole(){for(const t in this.options.types)console["__"+t]||(console["__"+t]=console[t]),console[t]=this[t].raw}restoreConsole(){for(const t in this.options.types)console["__"+t]&&(console[t]=console["__"+t],delete console["__"+t])}wrapStd(){this._wrapStream(this.options.stdout,"log"),this._wrapStream(this.options.stderr,"log")}_wrapStream(t,n){t&&(t.__write||(t.__write=t.write),t.write=o=>{this[n].raw(String(o).trim())})}restoreStd(){this._restoreStream(this.options.stdout),this._restoreStream(this.options.stderr)}_restoreStream(t){t&&t.__write&&(t.write=t.__write,delete t.__write)}pauseLogs(){ac=!0}resumeLogs(){ac=!1;const t=Zh.splice(0);for(const n of t)n[0]._logFn(n[1],n[2])}mockTypes(t){const n=t||this.options.mockFn;if(this._mockFn=n,typeof n=="function")for(const o in this.options.types)this[o]=n(o,this.options.types[o])||this[o],this[o].raw=this[o]}_wrapLogFn(t,n){return(...o)=>{if(ac){Zh.push([this,t,o,n]);return}return this._logFn(t,o,n)}}_logFn(t,n,o){if((t.level||0)>this.level)return!1;const r={date:new Date,args:[],...t,level:sc(t.level,this.options.types)};!o&&n.length===1&&B_(n[0])?Object.assign(r,n[0]):r.args=[...n],r.message&&(r.args.unshift(r.message),delete r.message),r.additional&&(Array.isArray(r.additional)||(r.additional=r.additional.split(` +`)),r.args.push(` +`+r.additional.join(` +`)),delete r.additional),r.type=typeof r.type=="string"?r.type.toLowerCase():"log",r.tag=typeof r.tag=="string"?r.tag:"";const u=(s=!1)=>{const i=(this._lastLog.count||0)-this.options.throttleMin;if(this._lastLog.object&&i>0){const c=[...this._lastLog.object.args];i>1&&c.push(`(repeated ${i} times)`),this._log({...this._lastLog.object,args:c}),this._lastLog.count=1}s&&(this._lastLog.object=r,this._log(r))};clearTimeout(this._lastLog.timeout);const a=this._lastLog.time&&r.date?r.date.getTime()-this._lastLog.time.getTime():0;if(this._lastLog.time=r.date,athis.options.throttleMin)){this._lastLog.timeout=setTimeout(u,this.options.throttle);return}}catch{}u(!0)}_log(t){for(const n of this.options.reporters)n.log(t,{options:this.options})}}function sc(e,t={},n=3){return e===void 0?n:typeof e=="number"?e:t[e]&&t[e].level!==void 0?t[e].level:n}Ut.prototype.add=Ut.prototype.addReporter;Ut.prototype.remove=Ut.prototype.removeReporter;Ut.prototype.clear=Ut.prototype.removeReporter;Ut.prototype.withScope=Ut.prototype.withTag;Ut.prototype.mock=Ut.prototype.mockTypes;Ut.prototype.pause=Ut.prototype.pauseLogs;Ut.prototype.resume=Ut.prototype.resumeLogs;function __(e={}){return new Ut(e)}class k_{options;defaultColor;levelColorMap;typeColorMap;constructor(t){this.options={...t},this.defaultColor="#7f8c8d",this.levelColorMap={0:"#c0392b",1:"#f39c12",3:"#00BCD4"},this.typeColorMap={success:"#2ecc71"}}_getLogFn(t){return t<1?console.__error||console.error:t===1?console.__warn||console.warn:console.__log||console.log}log(t){const n=this._getLogFn(t.level),o=t.type==="log"?"":t.type,r=t.tag||"",a=` + background: ${this.typeColorMap[t.type]||this.levelColorMap[t.level]||this.defaultColor}; + border-radius: 0.5em; + color: white; + font-weight: bold; + padding: 2px 0.5em; + `,s=`%c${[r,o].filter(Boolean).join(":")}`;typeof t.args[0]=="string"?n(`${s}%c ${t.args[0]}`,a,"",...t.args.slice(1)):n(s,a,...t.args)}}function S_(e={}){return __({reporters:e.reporters||[new k_({})],prompt(n,o={}){return o.type==="confirm"?Promise.resolve(confirm(n)):Promise.resolve(prompt(n))},...e})}const T_=S_(),F_=T_.withTag("Docus"),Xh=Object.assign({"../../i18n/locales/ar.json":()=>ne(()=>import("./Ds9OA60O.js"),[],import.meta.url),"../../i18n/locales/be.json":()=>ne(()=>import("./CI43exTt.js"),[],import.meta.url),"../../i18n/locales/bg.json":()=>ne(()=>import("./FIW8Ti8B.js"),[],import.meta.url),"../../i18n/locales/bn.json":()=>ne(()=>import("./CuQFqh_W.js"),[],import.meta.url),"../../i18n/locales/ca.json":()=>ne(()=>import("./zNu3OsYz.js"),[],import.meta.url),"../../i18n/locales/ckb.json":()=>ne(()=>import("./C2GbCjp9.js"),[],import.meta.url),"../../i18n/locales/cs.json":()=>ne(()=>import("./Dcswgw4K.js"),[],import.meta.url),"../../i18n/locales/da.json":()=>ne(()=>import("./Du9oxZzF.js"),[],import.meta.url),"../../i18n/locales/de.json":()=>ne(()=>import("./BosS-MS4.js"),[],import.meta.url),"../../i18n/locales/el.json":()=>ne(()=>import("./Bkurqz2d.js"),[],import.meta.url),"../../i18n/locales/en.json":()=>ne(()=>import("./DOelY9Nb.js"),[],import.meta.url),"../../i18n/locales/es.json":()=>ne(()=>import("./DVlZI4kn.js"),[],import.meta.url),"../../i18n/locales/et.json":()=>ne(()=>import("./C1fSKR9D.js"),[],import.meta.url),"../../i18n/locales/fi.json":()=>ne(()=>import("./DvjBH7HE.js"),[],import.meta.url),"../../i18n/locales/fr.json":()=>ne(()=>import("./DuhoAnL7.js"),[],import.meta.url),"../../i18n/locales/he.json":()=>ne(()=>import("./Bqoc_FpL.js"),[],import.meta.url),"../../i18n/locales/hi.json":()=>ne(()=>import("./-nV3O3Hd.js"),[],import.meta.url),"../../i18n/locales/hy.json":()=>ne(()=>import("./DEklDIUE.js"),[],import.meta.url),"../../i18n/locales/id.json":()=>ne(()=>import("./CArNbJ6I.js"),[],import.meta.url),"../../i18n/locales/it.json":()=>ne(()=>import("./BeOsfPZ5.js"),[],import.meta.url),"../../i18n/locales/ja.json":()=>ne(()=>import("./uN6OGCoe.js"),[],import.meta.url),"../../i18n/locales/kk.json":()=>ne(()=>import("./Y1bVb6fC.js"),[],import.meta.url),"../../i18n/locales/km.json":()=>ne(()=>import("./Crnsupp9.js"),[],import.meta.url),"../../i18n/locales/ko.json":()=>ne(()=>import("./D-lyTl4E.js"),[],import.meta.url),"../../i18n/locales/ky.json":()=>ne(()=>import("./DxN8ZPeP.js"),[],import.meta.url),"../../i18n/locales/lb.json":()=>ne(()=>import("./BRj7a3jo.js"),[],import.meta.url),"../../i18n/locales/ms.json":()=>ne(()=>import("./CsxHJ_Yb.js"),[],import.meta.url),"../../i18n/locales/nb.json":()=>ne(()=>import("./D0RjKS9E.js"),[],import.meta.url),"../../i18n/locales/nl.json":()=>ne(()=>import("./Dme4Sp_Z.js"),[],import.meta.url),"../../i18n/locales/pl.json":()=>ne(()=>import("./BscxgZ9w.js"),[],import.meta.url),"../../i18n/locales/pt-BR.json":()=>ne(()=>import("./BOynLmEf.js"),[],import.meta.url),"../../i18n/locales/ro.json":()=>ne(()=>import("./C919_JS_.js"),[],import.meta.url),"../../i18n/locales/ru.json":()=>ne(()=>import("./CrCM1jgP.js"),[],import.meta.url),"../../i18n/locales/si.json":()=>ne(()=>import("./BePYYsBE.js"),[],import.meta.url),"../../i18n/locales/sl.json":()=>ne(()=>import("./C8-8Pk2V.js"),[],import.meta.url),"../../i18n/locales/sv.json":()=>ne(()=>import("./D_wlStJ8.js"),[],import.meta.url),"../../i18n/locales/tr.json":()=>ne(()=>import("./B7V4_Oof.js"),[],import.meta.url),"../../i18n/locales/uk.json":()=>ne(()=>import("./BlxJeUnt.js"),[],import.meta.url),"../../i18n/locales/ur.json":()=>ne(()=>import("./ClE5p2_s.js"),[],import.meta.url),"../../i18n/locales/vi.json":()=>ne(()=>import("./DbjiwLiW.js"),[],import.meta.url),"../../i18n/locales/zh-CN.json":()=>ne(()=>import("./PB_A7Nh4.js"),[],import.meta.url)}),P_=vn(async()=>{let e,t;const n=Re(),o=n.$config.public.i18n;if(!o){const u=Pe().docus.locale||"en";let a=u,s;const i=`../../i18n/locales/${u}.json`,c=Xh[i];if(c)s=([e,t]=qr(()=>c()),e=await e,t(),e).default;else{F_.warn(`Missing locale file for "${u}". Falling back to "en".`),a="en";const d=Xh["../../i18n/locales/en.json"];d?s=([e,t]=qr(()=>d()),e=await e,t(),e).default:s={}}n.provide("locale",a),n.provide("localeMessages",s);return}ew(r=>{if(r.path==="/"){const u=e9("i18n_redirected").value||o.defaultLocale||"en";return dl(`/${u}`)}})}),M_=[Yw,eD,MA,p9,h9,m9,g9,v9,E9,EB,v_,y_,x_,P_];function O_(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function I_(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:o=500,resetDelay:r=400}=e,u=e.estimatedProgress||O_,a=Re(),s=Me(0),i=Me(!1),c=Me(!1);let l=!1,d,p,h,m;const g=(x={})=>{v(),c.value=!1,y(0,x)};function y(x=0,_={}){if(a.isHydrating)return;if(x>=100)return b({force:_.force});C(),s.value=x<0?0:x;const S=_.force?0:n;S?p=setTimeout(()=>{i.value=!0,w()},S):(i.value=!0,w())}function E(){h=setTimeout(()=>{i.value=!1,m=setTimeout(()=>{s.value=0},r)},o)}function b(x={}){s.value=100,l=!0,C(),v(),x.error&&(c.value=!0),x.force?(s.value=0,i.value=!1):E()}function v(){clearTimeout(h),clearTimeout(m)}function C(){clearTimeout(p),cancelAnimationFrame(d)}function w(){l=!1;let x;function _(S){if(l)return;x??=S;const O=S-x;s.value=Math.max(0,Math.min(100,u(t,O))),d=requestAnimationFrame(_)}d=requestAnimationFrame(_)}let B=()=>{};{const x=a.hook("page:loading:start",()=>{g()}),_=a.hook("page:loading:end",()=>{b()}),S=a.hook("vue:error",()=>b());B=()=>{S(),x(),_(),C()}}return{_cleanup:B,progress:F(()=>s.value),isLoading:F(()=>i.value),error:F(()=>c.value),start:g,set:y,finish:b,clear:C}}function R_(e={}){const t=Re(),n=t._loadingIndicator||=I_(e);return ho()&&(t._loadingIndicatorDeps||=0,t._loadingIndicatorDeps++,ir(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const L_=L({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},hideDelay:{type:Number,default:500},resetDelay:{type:Number,default:400},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},errorColor:{type:String,default:"repeating-linear-gradient(to right,#f87171 0%,#ef4444 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:o,isLoading:r,error:u,start:a,finish:s,clear:i}=R_({duration:e.duration,throttle:e.throttle,hideDelay:e.hideDelay,resetDelay:e.resetDelay,estimatedProgress:e.estimatedProgress});return n({progress:o,isLoading:r,error:u,start:a,finish:s,clear:i}),()=>qe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:r.value?1:0,background:u.value?e.errorColor:e.color||void 0,backgroundSize:`${o.value>0?100/o.value*100:0}% auto`,transform:`scaleX(${o.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}});function lt(e,t){const n=typeof e=="string"&&!t?`${e}Context`:t,o=Symbol(n);return[a=>{const s=Ue(o,a);if(s||s===null)return s;throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},a=>(Pt(o,a),a)]}function dt(){let e=document.activeElement;if(e==null)return null;for(;e!=null&&e.shadowRoot!=null&&e.shadowRoot.activeElement!=null;)e=e.shadowRoot.activeElement;return e}function I3(e,t,n){const o=n.originalEvent.target,r=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(r)}function yl(e){return e==null}function q_(e,t){return yl(e)?!1:Array.isArray(e)?e.some(n=>Ur(n,t)):Ur(e,t)}function uf(e){return e?e.flatMap(t=>t.type===Ce?uf(t.children):[t]):[]}const $_=["INPUT","TEXTAREA"];function za(e,t,n,o={}){if(!t||o.enableIgnoredElement&&$_.includes(t.nodeName))return null;const{arrowKeyOptions:r="both",attributeName:u="[data-reka-collection-item]",itemsArray:a=[],loop:s=!0,dir:i="ltr",preventScroll:c=!0,focus:l=!1}=o,[d,p,h,m,g,y]=[e.key==="ArrowRight",e.key==="ArrowLeft",e.key==="ArrowUp",e.key==="ArrowDown",e.key==="Home",e.key==="End"],E=h||m,b=d||p;if(!g&&!y&&(!E&&!b||r==="vertical"&&b||r==="horizontal"&&E))return null;const v=n?Array.from(n.querySelectorAll(u)):a;if(!v.length)return null;c&&e.preventDefault();let C=null;return b||E?C=R3(v,t,{goForward:E?m:i==="ltr"?d:p,loop:s}):g?C=v.at(0)||null:y&&(C=v.at(-1)||null),l&&C?.focus(),C}function R3(e,t,n,o=e.includes(t)?e.length:e.length+1){if(--o===0)return null;const r=e.indexOf(t);let u;if(r===-1?u=n.goForward?0:e.length-1:u=n.goForward?r+1:r-1,!n.loop&&(u<0||u>=e.length))return null;const a=(u+e.length)%e.length,s=e[a];return s?s.hasAttribute("disabled")&&s.getAttribute("disabled")!=="false"?R3(e,s,n,o):s:null}const[L3,N_]=lt("ConfigProvider");var j_=L({inheritAttrs:!1,__name:"ConfigProvider",props:{dir:{type:String,required:!1,default:"ltr"},locale:{type:String,required:!1,default:"en"},scrollBody:{type:[Boolean,Object],required:!1,default:!0},nonce:{type:String,required:!1,default:void 0},useId:{type:Function,required:!1,default:void 0}},setup(e){const t=e,{dir:n,locale:o,scrollBody:r,nonce:u}=mt(t);return N_({dir:n,locale:o,scrollBody:r,nonce:u,useId:t.useId}),(a,s)=>P(a.$slots,"default")}}),V_=j_;function z_(e,t){var n;const o=Me();return Ze(()=>{o.value=e()},{...t,flush:(n=t?.flush)!==null&&n!==void 0?n:"sync"}),Mo(o)}function U_(e,t,n={}){let o,r,u,a=!0;const s=()=>{a=!0,u()};ye(e,s,{flush:"sync",...n});const i=typeof t=="function"?t:t.get,c=typeof t=="function"?void 0:t.set,l=es((d,p)=>(r=d,u=p,{get(){return a&&(o=i(o),a=!1),r(),o},set(h){c?.(h)}}));return l.trigger=s,l}function $o(e,t){return ho()?(ir(e,t),!0):!1}function H_(){const e=new Set,t=u=>{e.delete(u)};return{on:u=>{e.add(u);const a=()=>t(u);return $o(a),{off:a}},off:t,trigger:(...u)=>Promise.all(Array.from(e).map(a=>a(...u))),clear:()=>{e.clear()}}}function K_(e){let t=!1,n;const o=Qa(!0);return((...r)=>(t||(n=o.run(()=>e(...r)),t=!0),n))}const ic=new WeakMap,W_=(...e)=>{var t;const n=e[0],o=(t=We())===null||t===void 0?void 0:t.proxy,r=o??ho();if(r==null&&!Lu())throw new Error("injectLocal must be called in setup");return r&&ic.has(r)&&n in ic.get(r)?ic.get(r)[n]:Ue(...e)},gn=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const x0=e=>typeof e<"u",G_=e=>e!=null,Y_=Object.prototype.toString,Z_=e=>Y_.call(e)==="[object Object]",Kr=()=>{},Jh=X_();function X_(){var e,t,n;return gn&&!!(!((e=window)===null||e===void 0||(e=e.navigator)===null||e===void 0)&&e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window)===null||t===void 0||(t=t.navigator)===null||t===void 0?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test((n=window)===null||n===void 0?void 0:n.navigator.userAgent))}function q3(...e){if(e.length!==1)return Ye(...e);const t=e[0];return typeof t=="function"?Mo(es(()=>({get:t,set:Kr}))):R(t)}function af(e,t){function n(...o){return new Promise((r,u)=>{Promise.resolve(e(()=>t.apply(this,o),{fn:t,thisArg:this,args:o})).then(r).catch(u)})}return n}const $3=e=>e();function J_(e,t={}){let n,o,r=Kr;const u=i=>{clearTimeout(i),r(),r=Kr};let a;return i=>{const c=ke(e),l=ke(t.maxWait);return n&&u(n),c<=0||l!==void 0&&l<=0?(o&&(u(o),o=void 0),Promise.resolve(i())):new Promise((d,p)=>{r=t.rejectOnCancel?p:d,a=i,l&&!o&&(o=setTimeout(()=>{n&&u(n),o=void 0,d(a())},l)),n=setTimeout(()=>{o&&u(o),o=void 0,d(i())},c)})}}function Q_(...e){let t=0,n,o=!0,r=Kr,u,a,s,i,c;!rt(e[0])&&typeof e[0]=="object"?{delay:a,trailing:s=!0,leading:i=!0,rejectOnCancel:c=!1}=e[0]:[a,s=!0,i=!0,c=!1]=e;const l=()=>{n&&(clearTimeout(n),n=void 0,r(),r=Kr)};return p=>{const h=ke(a),m=Date.now()-t,g=()=>u=p();return l(),h<=0?(t=Date.now(),g()):(m>h?(t=Date.now(),(i||!o)&&g()):s&&(u=new Promise((y,E)=>{r=c?E:y,n=setTimeout(()=>{t=Date.now(),o=!0,y(g()),l()},Math.max(0,h-m))})),!i&&!n&&(n=setTimeout(()=>o=!0,h)),o=!1,u)}}function ek(e=$3,t={}){const{initialState:n="active"}=t,o=q3(n==="active");function r(){o.value=!1}function u(){o.value=!0}return{isActive:Mo(o),pause:r,resume:u,eventFilter:(...s)=>{o.value&&e(...s)}}}function tk(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const o=t;t=void 0,o&&await o},n}function Qh(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function ai(e){return Array.isArray(e)?e:[e]}function nk(e){const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))}const ok=/-(\w)/g,rk=nk(e=>e.replace(ok,(t,n)=>n?n.toUpperCase():""));function N3(e){return We()}function Nu(e){if(!gn)return e;let t=0,n,o;const r=()=>{t-=1,o&&t<=0&&(o.stop(),n=void 0,o=void 0)};return((...u)=>(t+=1,o||(o=Qa(!0),n=o.run(()=>e(...u))),$o(r),n))}function uk(e,t){if(typeof Symbol<"u"){const n={...e};return Object.defineProperty(n,Symbol.iterator,{enumerable:!1,value(){let o=0;return{next:()=>({value:t[o++],done:o>t.length})}}}),n}else return Object.assign([...t],e)}function ak(e){return _t(rt(e)?new Proxy({},{get(t,n,o){return f(Reflect.get(e.value,n,o))},set(t,n,o){return rt(e.value[n])&&!rt(o)?e.value[n].value=o:e.value[n]=o,!0},deleteProperty(t,n){return Reflect.deleteProperty(e.value,n)},has(t,n){return Reflect.has(e.value,n)},ownKeys(){return Object.keys(e.value)},getOwnPropertyDescriptor(){return{enumerable:!0,configurable:!0}}}):e)}function j3(e){return ak(F(e))}function No(e,...t){const n=t.flat(),o=n[0];return j3(()=>Object.fromEntries(typeof o=="function"?Object.entries(mt(e)).filter(([r,u])=>!o(ke(u),r)):Object.entries(mt(e)).filter(r=>!n.includes(r[0]))))}function Jt(e,...t){const n=t.flat(),o=n[0];return j3(()=>Object.fromEntries(typeof o=="function"?Object.entries(mt(e)).filter(([r,u])=>o(ke(u),r)):n.map(r=>[r,q3(e,r)])))}function bl(e,t=1e4){return es((n,o)=>{let r=ke(e),u;const a=()=>setTimeout(()=>{r=ke(e),o()},ke(t));return $o(()=>{clearTimeout(u)}),{get(){return n(),r},set(s){r=s,o(),clearTimeout(u),u=a()}}})}function V3(e,t=200,n={}){return af(J_(t,n),e)}function sk(e,t=200,n=!1,o=!0,r=!1){return af(Q_(t,n,o,r),e)}function XU(e,t=200,n=!0,o=!0){if(t<=0)return e;const r=R(ke(e)),u=sk(()=>{r.value=e.value},t,n,o);return ye(e,()=>u()),r}function ik(e,t,n={}){const{eventFilter:o=$3,...r}=n;return ye(e,af(o,t),r)}function e4(e,t,n={}){const{eventFilter:o,initialState:r="active",...u}=n,{eventFilter:a,pause:s,resume:i,isActive:c}=ek(o,{initialState:r});return{stop:ik(e,t,{...u,eventFilter:a}),pause:s,resume:i,isActive:c}}function lk(e,t,...[n]){const{flush:o="sync",deep:r=!1,immediate:u=!0,direction:a="both",transform:s={}}=n||{},i=[],c="ltr"in s&&s.ltr||(p=>p),l="rtl"in s&&s.rtl||(p=>p);return(a==="both"||a==="ltr")&&i.push(e4(e,p=>{i.forEach(h=>h.pause()),t.value=c(p),i.forEach(h=>h.resume())},{flush:o,deep:r,immediate:u})),(a==="both"||a==="rtl")&&i.push(e4(t,p=>{i.forEach(h=>h.pause()),e.value=l(p),i.forEach(h=>h.resume())},{flush:o,deep:r,immediate:u})),()=>{i.forEach(p=>p.stop())}}function ck(e,t){N3()&&mo(e,t)}function z3(e,t=!0,n){N3()?$e(e,n):t?e():Oe(e)}function El(e,t,n={}){const{immediate:o=!0,immediateCallback:r=!1}=n,u=Me(!1);let a;function s(){a&&(clearTimeout(a),a=void 0)}function i(){u.value=!1,s()}function c(...l){r&&e(),s(),u.value=!0,a=setTimeout(()=>{u.value=!1,a=void 0,e(...l)},ke(t))}return o&&(u.value=!0,gn&&c()),$o(i),{isPending:Br(u),start:c,stop:i}}function dk(e=1e3,t={}){const{controls:n=!1,callback:o}=t,r=El(o??Kr,e,t),u=F(()=>!r.isPending.value);return n?{ready:u,...r}:u}function fk(e,t,n){return ye(e,t,{...n,immediate:!0})}function To(e={}){const{inheritAttrs:t=!0}=e,n=Me(),o=L({setup(u,{slots:a}){return()=>{n.value=a.default}}}),r=L({inheritAttrs:t,props:e.props,setup(u,{attrs:a,slots:s}){return()=>{var i;if(!n.value)throw new Error("[VueUse] Failed to find the definition of reusable template");const c=(i=n.value)===null||i===void 0?void 0:i.call(n,{...e.props==null?pk(a):u,$slots:s});return t&&c?.length===1?c[0]:c}}});return uk({define:o,reuse:r},[o,r])}function pk(e){const t={};for(const n in e)t[rk(n)]=e[n];return t}const Zn=gn?window:void 0,U3=gn?window.navigator:void 0;function an(e){var t;const n=ke(e);return(t=n?.$el)!==null&&t!==void 0?t:n}function At(...e){const t=(o,r,u,a)=>(o.addEventListener(r,u,a),()=>o.removeEventListener(r,u,a)),n=F(()=>{const o=ai(ke(e[0])).filter(r=>r!=null);return o.every(r=>typeof r!="string")?o:void 0});return fk(()=>{var o,r;return[(o=(r=n.value)===null||r===void 0?void 0:r.map(u=>an(u)))!==null&&o!==void 0?o:[Zn].filter(u=>u!=null),ai(ke(n.value?e[1]:e[0])),ai(f(n.value?e[2]:e[1])),ke(n.value?e[3]:e[2])]},([o,r,u,a],s,i)=>{if(!o?.length||!r?.length||!u?.length)return;const c=Z_(a)?{...a}:a,l=o.flatMap(d=>r.flatMap(p=>u.map(h=>t(d,p,h,c))));i(()=>{l.forEach(d=>d())})},{flush:"post"})}function H3(){const e=Me(!1),t=We();return t&&$e(()=>{e.value=!0},t),e}function ls(e){const t=H3();return F(()=>(t.value,!!e()))}function K3(e,t,n={}){const{window:o=Zn,...r}=n;let u;const a=ls(()=>o&&"MutationObserver"in o),s=()=>{u&&(u.disconnect(),u=void 0)},i=ye(F(()=>{const d=ai(ke(e)).map(an).filter(G_);return new Set(d)}),d=>{s(),a.value&&d.size&&(u=new MutationObserver(t),d.forEach(p=>u.observe(p,r)))},{immediate:!0,flush:"post"}),c=()=>u?.takeRecords(),l=()=>{i(),s()};return $o(l),{isSupported:a,stop:l,takeRecords:c}}function hk(e,t,n={}){const{window:o=Zn,document:r=o?.document,flush:u="sync"}=n;if(!o||!r)return Kr;let a;const s=l=>{a?.(),a=l},i=Ze(()=>{const l=an(e);if(l){const{stop:d}=K3(r,p=>{p.map(h=>[...h.removedNodes]).flat().some(h=>h===l||h.contains(l))&&t(p)},{window:o,childList:!0,subtree:!0});s(d)}},{flush:u}),c=()=>{i(),s()};return $o(c),c}function mk(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function sf(...e){let t,n,o={};e.length===3?(t=e[0],n=e[1],o=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],o=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Zn,eventName:u="keydown",passive:a=!1,dedupe:s=!1}=o,i=mk(t);return At(r,u,l=>{l.repeat&&ke(s)||i(l)&&n(l)},a)}function JU(e={}){var t;const{window:n=Zn,deep:o=!0,triggerOnRemoval:r=!1}=e,u=(t=e.document)!==null&&t!==void 0?t:n?.document,a=()=>{let c=u?.activeElement;if(o)for(var l;c?.shadowRoot;)c=c==null||(l=c.shadowRoot)===null||l===void 0?void 0:l.activeElement;return c},s=Me(),i=()=>{s.value=a()};if(n){const c={capture:!0,passive:!0};At(n,"blur",l=>{l.relatedTarget===null&&i()},c),At(n,"focus",i,c)}return r&&hk(s,i,{document:u}),i(),s}function W3(e,t={}){const{immediate:n=!0,fpsLimit:o=null,window:r=Zn,once:u=!1}=t,a=Me(!1),s=F(()=>{const h=ke(o);return h?1e3/h:null});let i=0,c=null;function l(h){if(!a.value||!r)return;i||(i=h);const m=h-i;if(s.value&&mn&&"matchMedia"in n&&typeof n.matchMedia=="function"),u=Me(typeof o=="number"),a=Me(),s=Me(!1),i=c=>{s.value=c.matches};return Ze(()=>{if(u.value){u.value=!r.value,s.value=ke(e).split(",").some(c=>{const l=c.includes("not all"),d=c.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),p=c.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let h=!!(d||p);return d&&h&&(h=o>=Qh(d[1])),p&&h&&(h=o<=Qh(p[1])),l?!h:h});return}r.value&&(a.value=n.matchMedia(ke(e)),s.value=a.value.matches)}),At(a,"change",i,{passive:!0}),F(()=>s.value)}function t4(e,t={}){const{controls:n=!1,navigator:o=U3}=t,r=ls(()=>o&&"permissions"in o),u=Me(),a=typeof e=="string"?{name:e}:e,s=Me(),i=()=>{var l,d;s.value=(l=(d=u.value)===null||d===void 0?void 0:d.state)!==null&&l!==void 0?l:"prompt"};At(u,"change",i,{passive:!0});const c=tk(async()=>{if(r.value){if(!u.value)try{u.value=await o.permissions.query(a)}catch{u.value=void 0}finally{i()}if(n)return He(u.value)}});return c(),n?{state:s,isSupported:r,query:c}:s}function QU(e={}){const{navigator:t=U3,read:n=!1,source:o,copiedDuring:r=1500,legacy:u=!1}=e,a=ls(()=>t&&"clipboard"in t),s=t4("clipboard-read"),i=t4("clipboard-write"),c=F(()=>a.value||u),l=Me(""),d=Me(!1),p=El(()=>d.value=!1,r,{immediate:!1});async function h(){let b=!(a.value&&E(s.value));if(!b)try{l.value=await t.clipboard.readText()}catch{b=!0}b&&(l.value=y())}c.value&&n&&At(["copy","cut"],h,{passive:!0});async function m(b=ke(o)){if(c.value&&b!=null){let v=!(a.value&&E(i.value));if(!v)try{await t.clipboard.writeText(b)}catch{v=!0}v&&g(b),l.value=b,d.value=!0,p.start()}}function g(b){const v=document.createElement("textarea");v.value=b,v.style.position="absolute",v.style.opacity="0",v.setAttribute("readonly",""),document.body.appendChild(v),v.select(),document.execCommand("copy"),v.remove()}function y(){var b,v,C;return(b=(v=document)===null||v===void 0||(C=v.getSelection)===null||C===void 0||(C=C.call(v))===null||C===void 0?void 0:C.toString())!==null&&b!==void 0?b:""}function E(b){return b==="granted"||b==="prompt"}return{isSupported:c,text:Mo(l),copied:Mo(d),copy:m}}function bk(e){return JSON.parse(JSON.stringify(e))}function Ek(e){const t=We(),n=U_(()=>null,()=>t.proxy.$el);return Gr(n.trigger),$e(n.trigger),n}function Ua(e,t,n={}){const{window:o=Zn,...r}=n;let u;const a=ls(()=>o&&"ResizeObserver"in o),s=()=>{u&&(u.disconnect(),u=void 0)},i=ye(F(()=>{const l=ke(e);return Array.isArray(l)?l.map(d=>an(d)):[an(l)]}),l=>{if(s(),a.value&&o){u=new ResizeObserver(t);for(const d of l)d&&u.observe(d,r)}},{immediate:!0,flush:"post"}),c=()=>{s(),i()};return $o(c),{isSupported:a,stop:c}}const Ck={page:e=>[e.pageX,e.pageY],client:e=>[e.clientX,e.clientY],screen:e=>[e.screenX,e.screenY],movement:e=>e instanceof MouseEvent?[e.movementX,e.movementY]:null};function xk(e={}){const{type:t="page",touch:n=!0,resetOnTouchEnds:o=!1,initialValue:r={x:0,y:0},window:u=Zn,target:a=u,scroll:s=!0,eventFilter:i}=e;let c=null,l=0,d=0;const p=Me(r.x),h=Me(r.y),m=Me(null),g=typeof t=="function"?t:Ck[t],y=x=>{const _=g(x);c=x,_&&([p.value,h.value]=_,m.value="mouse"),u&&(l=u.scrollX,d=u.scrollY)},E=x=>{if(x.touches.length>0){const _=g(x.touches[0]);_&&([p.value,h.value]=_,m.value="touch")}},b=()=>{if(!c||!u)return;const x=g(c);c instanceof MouseEvent&&x&&(p.value=x[0]+u.scrollX-l,h.value=x[1]+u.scrollY-d)},v=()=>{p.value=r.x,h.value=r.y},C=i?x=>i(()=>y(x),{}):x=>y(x),w=i?x=>i(()=>E(x),{}):x=>E(x),B=i?()=>i(()=>b(),{}):()=>b();if(a){const x={passive:!0};At(a,["mousemove","dragover"],C,x),n&&t!=="movement"&&(At(a,["touchstart","touchmove"],w,x),o&&At(a,"touchend",v,x)),s&&t==="page"&&At(u,"scroll",B,x)}return{x:p,y:h,sourceType:m}}function eH(e,t={}){const{windowResize:n=!0,windowScroll:o=!0,handleOutside:r=!0,window:u=Zn}=t,a=t.type||"page",{x:s,y:i,sourceType:c}=xk(t),l=Me(e??u?.document.body),d=Me(0),p=Me(0),h=Me(0),m=Me(0),g=Me(0),y=Me(0),E=Me(!0);function b(){if(!u)return;const w=an(l);if(!(!w||!(w instanceof Element)))for(const B of w.getClientRects()){const{left:x,top:_,width:S,height:O}=B;h.value=x+(a==="page"?u.pageXOffset:0),m.value=_+(a==="page"?u.pageYOffset:0),g.value=O,y.value=S;const H=s.value-h.value,N=i.value-m.value;if(E.value=S===0||O===0||H<0||N<0||H>S||N>O,(r||!E.value)&&(d.value=H,p.value=N),!E.value)break}}const v=[];function C(){v.forEach(w=>w()),v.length=0}if(z3(()=>{b()}),u){const{stop:w}=Ua(l,b),{stop:B}=K3(l,b,{attributeFilter:["style","class"]}),x=ye([l,s,i],b);v.push(w,B,x),At(document,"mouseleave",()=>E.value=!0,{passive:!0}),o&&v.push(At("scroll",b,{capture:!0,passive:!0})),n&&v.push(At("resize",b,{passive:!0}))}return{x:s,y:i,sourceType:c,elementX:d,elementY:p,elementPositionX:h,elementPositionY:m,elementHeight:g,elementWidth:y,isOutside:E,stop:C}}function tH(e=Ek()){const t=Me(),n=()=>{const o=an(e);o&&(t.value=o.parentElement)};return z3(n),ye(()=>ke(e),n),t}function Lt(e,t,n,o={}){var r,u;const{clone:a=!1,passive:s=!1,eventName:i,deep:c=!1,defaultValue:l,shouldEmit:d}=o,p=We(),h=n||p?.emit||(p==null||(r=p.$emit)===null||r===void 0?void 0:r.bind(p))||(p==null||(u=p.proxy)===null||u===void 0||(u=u.$emit)===null||u===void 0?void 0:u.bind(p?.proxy));let m=i;t||(t="modelValue"),m=m||`update:${t.toString()}`;const g=b=>a?typeof a=="function"?a(b):bk(b):b,y=()=>x0(e[t])?g(e[t]):l,E=b=>{d?d(b)&&h(m,b):h(m,b)};if(s){const b=R(y());let v=!1;return ye(()=>e[t],C=>{v||(v=!0,b.value=g(C),Oe(()=>v=!1))}),ye(b,C=>{!v&&(C!==e[t]||c)&&E(C)},{deep:c}),b}else return F({get(){return y()},set(b){E(b)}})}const wk=Nu(()=>{const e=R(new Map),t=R(),n=F(()=>{for(const a of e.value.values())if(a)return!0;return!1}),o=L3({scrollBody:R(!0)});let r=null;const u=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.documentElement.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",Jh&&r?.(),t.value=void 0};return ye(n,(a,s)=>{if(!gn)return;if(!a){s&&u();return}t.value===void 0&&(t.value=document.body.style.overflow);const i=window.innerWidth-document.documentElement.clientWidth,c={padding:i,margin:0},l=o.scrollBody?.value?typeof o.scrollBody.value=="object"?wt({padding:o.scrollBody.value.padding===!0?i:o.scrollBody.value.padding,margin:o.scrollBody.value.margin===!0?i:o.scrollBody.value.margin},c):c:{padding:0,margin:0};i>0&&(document.body.style.paddingRight=typeof l.padding=="number"?`${l.padding}px`:String(l.padding),document.body.style.marginRight=typeof l.margin=="number"?`${l.margin}px`:String(l.margin),document.documentElement.style.setProperty("--scrollbar-width",`${i}px`),document.body.style.overflow="hidden"),Jh&&(r=At(document,"touchmove",d=>Dk(d),{passive:!1})),Oe(()=>{n.value&&(document.body.style.pointerEvents="none",document.body.style.overflow="hidden")})},{immediate:!0,flush:"sync"}),e});function lf(e){const t=Math.random().toString(36).substring(2,7),n=wk();n.value.set(t,e??!1);const o=F({get:()=>n.value.get(t)??!1,set:r=>n.value.set(t,r)});return ck(()=>{n.value.delete(t)}),o}function G3(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}function ju(e){const t=L3({dir:R("ltr")});return F(()=>e?.value||t.dir?.value||"ltr")}function Xn(e){const t=We(),n=t?.type.emits,o={};return n?.length||console.warn(`No emitted event found. Please check component: ${t?.type.__name}`),n?.forEach(r=>{o[hu(Ft(r))]=(...u)=>e(r,...u)}),o}let lc=0;function Y3(){Ze(e=>{if(!gn)return;const t=document.querySelectorAll("[data-reka-focus-guard]");document.body.insertAdjacentElement("afterbegin",t[0]??n4()),document.body.insertAdjacentElement("beforeend",t[1]??n4()),lc++,e(()=>{lc===1&&document.querySelectorAll("[data-reka-focus-guard]").forEach(n=>n.remove()),lc--})})}function n4(){const e=document.createElement("span");return e.setAttribute("data-reka-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}function ae(){const e=We(),t=R(),n=F(()=>o());Gr(()=>{n.value!==o()&&jg(t)});function o(){return t.value&&"$el"in t.value&&["#text","#comment"].includes(t.value.$el.nodeName)?t.value.$el.nextElementSibling:an(t)}const r=Object.assign({},e.exposed),u={};for(const s in e.props)Object.defineProperty(u,s,{enumerable:!0,configurable:!0,get:()=>e.props[s]});if(Object.keys(r).length>0)for(const s in r)Object.defineProperty(u,s,{enumerable:!0,configurable:!0,get:()=>r[s]});Object.defineProperty(u,"$el",{enumerable:!0,configurable:!0,get:()=>e.vnode.el}),e.exposed=u;function a(s){if(t.value=s,!!s&&(Object.defineProperty(u,"$el",{enumerable:!0,configurable:!0,get:()=>s instanceof Element?s:s.$el}),!(s instanceof Element)&&!Object.prototype.hasOwnProperty.call(s,"$el"))){const i=s.$.exposed,c=Object.assign({},u);for(const l in i)Object.defineProperty(c,l,{enumerable:!0,configurable:!0,get:()=>i[l]});e.exposed=c}}return{forwardRef:a,currentRef:t,currentElement:n}}function ln(e){const t=We(),n=Object.keys(t?.type.props??{}).reduce((r,u)=>{const a=(t?.type.props[u]).default;return a!==void 0&&(r[u]=a),r},{}),o=Ye(e);return F(()=>{const r={},u=t?.vnode.props??{};return Object.keys(u).forEach(a=>{r[Ft(a)]=u[a]}),Object.keys({...n,...r}).reduce((a,s)=>(o.value[s]!==void 0&&(a[s]=o.value[s]),a),{})})}function it(e,t){const n=ln(e),o=t?Xn(t):{};return F(()=>({...n.value,...o}))}function Z3(e,t){const n=bl(!1,300);$o(()=>{n.value=!1});const o=R(null),r=H_();function u(){o.value=null,n.value=!1}function a(s,i){if(!i)return;const c=s.currentTarget,l={x:s.clientX,y:s.clientY},d=Ak(l,c.getBoundingClientRect()),p=Bk(l,d,1),h=_k(i.getBoundingClientRect()),m=Sk([...p,...h]);o.value=m,n.value=!0}return Ze(s=>{if(e.value&&t.value){const i=l=>a(l,t.value),c=l=>a(l,e.value);e.value.addEventListener("pointerleave",i),t.value.addEventListener("pointerleave",c),s(()=>{e.value?.removeEventListener("pointerleave",i),t.value?.removeEventListener("pointerleave",c)})}}),Ze(s=>{if(o.value){const i=c=>{if(!o.value||!(c.target instanceof Element))return;const l=c.target,d={x:c.clientX,y:c.clientY},p=e.value?.contains(l)||t.value?.contains(l),h=!kk(d,o.value),m=!!l.closest("[data-grace-area-trigger]");p?u():(h||m)&&(u(),r.trigger())};e.value?.ownerDocument.addEventListener("pointermove",i),s(()=>e.value?.ownerDocument.removeEventListener("pointermove",i))}}),{isPointerInTransit:n,onPointerExit:r.on}}function Ak(e,t){const n=Math.abs(t.top-e.y),o=Math.abs(t.bottom-e.y),r=Math.abs(t.right-e.x),u=Math.abs(t.left-e.x);switch(Math.min(n,o,r,u)){case u:return"left";case r:return"right";case n:return"top";case o:return"bottom";default:throw new Error("unreachable")}}function Bk(e,t,n=5){const o=[];switch(t){case"top":o.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":o.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":o.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":o.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return o}function _k(e){const{top:t,right:n,bottom:o,left:r}=e;return[{x:r,y:t},{x:n,y:t},{x:n,y:o},{x:r,y:o}]}function kk(e,t){const{x:n,y:o}=e;let r=!1;for(let u=0,a=t.length-1;uo!=l>o&&n<(c-s)*(o-i)/(l-i)+s&&(r=!r)}return r}function Sk(e){const t=e.slice();return t.sort((n,o)=>n.xo.x?1:n.yo.y?1:0),Tk(t)}function Tk(e){if(e.length<=1)return e.slice();const t=[];for(let o=0;o=2;){const u=t[t.length-1],a=t[t.length-2];if((u.x-a.x)*(r.y-a.y)>=(u.y-a.y)*(r.x-a.x))t.pop();else break}t.push(r)}t.pop();const n=[];for(let o=e.length-1;o>=0;o--){const r=e[o];for(;n.length>=2;){const u=n[n.length-1],a=n[n.length-2];if((u.x-a.x)*(r.y-a.y)>=(u.y-a.y)*(r.x-a.x))n.pop();else break}n.push(r)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var Fk=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},ru=new WeakMap,Ls=new WeakMap,qs={},cc=0,X3=function(e){return e&&(e.host||X3(e.parentNode))},Pk=function(e,t){return t.map(function(n){if(e.contains(n))return n;var o=X3(n);return o&&e.contains(o)?o:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},Mk=function(e,t,n,o){var r=Pk(t,Array.isArray(e)?e:[e]);qs[n]||(qs[n]=new WeakMap);var u=qs[n],a=[],s=new Set,i=new Set(r),c=function(d){!d||s.has(d)||(s.add(d),c(d.parentNode))};r.forEach(c);var l=function(d){!d||i.has(d)||Array.prototype.forEach.call(d.children,function(p){if(s.has(p))l(p);else try{var h=p.getAttribute(o),m=h!==null&&h!=="false",g=(ru.get(p)||0)+1,y=(u.get(p)||0)+1;ru.set(p,g),u.set(p,y),a.push(p),g===1&&m&&Ls.set(p,!0),y===1&&p.setAttribute(n,"true"),m||p.setAttribute(o,"true")}catch(E){console.error("aria-hidden: cannot operate on ",p,E)}})};return l(t),s.clear(),cc++,function(){a.forEach(function(d){var p=ru.get(d)-1,h=u.get(d)-1;ru.set(d,p),u.set(d,h),p||(Ls.has(d)||d.removeAttribute(o),Ls.delete(d)),h||d.removeAttribute(n)}),cc--,cc||(ru=new WeakMap,ru=new WeakMap,Ls=new WeakMap,qs={})}},J3=function(e,t,n){n===void 0&&(n="data-aria-hidden");var o=Array.from(Array.isArray(e)?e:[e]),r=Fk(e);return r?(o.push.apply(o,Array.from(r.querySelectorAll("[aria-live], script"))),Mk(o,r,n,"aria-hidden")):function(){return null}};function cf(e){let t;ye(()=>an(e),n=>{let o=!1;try{o=!!n?.closest("[popover]:not(:popover-open)")}catch{}n&&!o?t=J3(n):t&&t()}),Ht(()=>{t&&t()})}function sn(e,t="reka"){if(e)return e;let n;return n=Td?.(),t?`${t}-${n}`:n}function Ok(e){const t=R(),n=F(()=>t.value?.width??0),o=F(()=>t.value?.height??0);return $e(()=>{const r=an(e);if(r){t.value={width:r.offsetWidth,height:r.offsetHeight};const u=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const s=a[0];let i,c;if("borderBoxSize"in s){const l=s.borderBoxSize,d=Array.isArray(l)?l[0]:l;i=d.inlineSize,c=d.blockSize}else i=r.offsetWidth,c=r.offsetHeight;t.value={width:i,height:c}});return u.observe(r,{box:"border-box"}),()=>u.unobserve(r)}else t.value=void 0}),{width:n,height:o}}function Ik(e,t){const n=R(e);function o(u){return t[n.value][u]??n.value}return{state:n,dispatch:u=>{n.value=o(u)}}}function Rk(e){const t=bl("",1e3);return{search:t,handleTypeaheadSearch:(r,u)=>{t.value=t.value+r;{const a=dt(),s=u.map(p=>({...p,textValue:p.value?.textValue??p.ref.textContent?.trim()??""})),i=s.find(p=>p.ref===a),c=s.map(p=>p.textValue),l=qk(c,t.value,i?.textValue),d=s.find(p=>p.textValue===l);return d&&d.ref.focus(),d?.ref}},resetTypeahead:()=>{t.value=""}}}function Lk(e,t){return e.map((n,o)=>e[(t+o)%e.length])}function qk(e,t,n){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,u=n?e.indexOf(n):-1;let a=Lk(e,Math.max(u,0));r.length===1&&(a=a.filter(c=>c!==n));const i=a.find(c=>c.toLowerCase().startsWith(r.toLowerCase()));return i!==n?i:void 0}function $k(e,t){const n=R({}),o=R("none"),r=R(e),u=e.value?"mounted":"unmounted";let a;const s=t.value?.ownerDocument.defaultView??Zn,{state:i,dispatch:c}=Ik(u,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),l=y=>{if(gn){const E=new CustomEvent(y,{bubbles:!1,cancelable:!1});t.value?.dispatchEvent(E)}};ye(e,async(y,E)=>{const b=E!==y;if(await Oe(),b){const v=o.value,C=$s(t.value);y?(c("MOUNT"),l("enter"),C==="none"&&l("after-enter")):C==="none"||C==="undefined"||n.value?.display==="none"?(c("UNMOUNT"),l("leave"),l("after-leave")):E&&v!==C?(c("ANIMATION_OUT"),l("leave")):(c("UNMOUNT"),l("after-leave"))}},{immediate:!0});const d=y=>{const E=$s(t.value),b=E.includes(CSS.escape(y.animationName)),v=i.value==="mounted"?"enter":"leave";if(y.target===t.value&&b&&(l(`after-${v}`),c("ANIMATION_END"),!r.value)){const C=t.value.style.animationFillMode;t.value.style.animationFillMode="forwards",a=s?.setTimeout(()=>{t.value?.style.animationFillMode==="forwards"&&(t.value.style.animationFillMode=C)})}y.target===t.value&&E==="none"&&c("ANIMATION_END")},p=y=>{y.target===t.value&&(o.value=$s(t.value))},h=ye(t,(y,E)=>{y?(n.value=getComputedStyle(y),y.addEventListener("animationstart",p),y.addEventListener("animationcancel",d),y.addEventListener("animationend",d)):(c("ANIMATION_END"),a!==void 0&&s?.clearTimeout(a),E?.removeEventListener("animationstart",p),E?.removeEventListener("animationcancel",d),E?.removeEventListener("animationend",d))},{immediate:!0}),m=ye(i,()=>{const y=$s(t.value);o.value=i.value==="mounted"?y:"none"});return Ht(()=>{h(),m()}),{isPresent:F(()=>["mounted","unmountSuspended"].includes(i.value))}}function $s(e){return e&&getComputedStyle(e).animationName||"none"}var _n=L({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(e,{slots:t,expose:n}){const{present:o,forceMount:r}=mt(e),u=R(),{isPresent:a}=$k(o,u);n({present:a});let s=t.default({present:a.value});s=uf(s||[]);const i=We();if(s&&s?.length>1){const c=i?.parent?.type.name?`<${i.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${c}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(l=>` - ${l}`).join(` +`)].join(` +`))}return()=>r.value||o.value||a.value?qe(t.default({present:a.value})[0],{ref:c=>{const l=an(c);return typeof l?.hasAttribute>"u"||(l?.hasAttribute("data-reka-popper-content-wrapper")?u.value=l.firstElementChild:u.value=l),l}}):null}});const Ha=L({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{if(!n.default)return null;const o=uf(n.default()),r=o.findIndex(i=>i.type!==bt);if(r===-1)return o;const u=o[r];delete u.props?.ref;const a=u.props?j(t,u.props):t,s=An({...u,props:{}},a);return o.length===1?s:(o[r]=s,o)}}}),Nk=["area","img","input"],we=L({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:n}){const o=e.asChild?"template":e.as;return typeof o=="string"&&Nk.includes(o)?()=>qe(o,t):o!=="template"?()=>qe(e.as,t,{default:n.default}):()=>qe(Ha,t,{default:n.default})}});function w0(){const e=R(),t=F(()=>["#text","#comment"].includes(e.value?.$el.nodeName)?e.value?.$el.nextElementSibling:an(e));return{primitiveElement:e,currentElement:t}}const[Q3,jk]=lt("CollapsibleRoot");var Vk=L({__name:"CollapsibleRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:open"],setup(e,{expose:t,emit:n}){const o=e,u=Lt(o,"open",n,{defaultValue:o.defaultOpen,passive:o.open===void 0}),{disabled:a,unmountOnHide:s}=mt(o);return jk({contentId:"",disabled:a,open:u,unmountOnHide:s,onOpenToggle:()=>{a.value||(u.value=!u.value)}}),t({open:u}),ae(),(i,c)=>(D(),k(f(we),{as:i.as,"as-child":o.asChild,"data-state":f(u)?"open":"closed","data-disabled":f(a)?"":void 0},{default:A(()=>[P(i.$slots,"default",{open:f(u)})]),_:3},8,["as","as-child","data-state","data-disabled"]))}}),zk=Vk,Uk=L({inheritAttrs:!1,__name:"CollapsibleContent",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["contentFound"],setup(e,{emit:t}){const n=e,o=t,r=Q3();r.contentId||=sn(void 0,"reka-collapsible-content");const u=R(),{forwardRef:a,currentElement:s}=ae(),i=R(0),c=R(0),l=F(()=>r.open.value),d=R(l.value),p=R();ye(()=>[l.value,u.value?.present],async()=>{await Oe();const m=s.value;if(!m)return;p.value=p.value||{transitionDuration:m.style.transitionDuration,animationName:m.style.animationName},m.style.transitionDuration="0s",m.style.animationName="none";const g=m.getBoundingClientRect();c.value=g.height,i.value=g.width,d.value||(m.style.transitionDuration=p.value.transitionDuration,m.style.animationName=p.value.animationName)},{immediate:!0});const h=F(()=>d.value&&r.open.value);return $e(()=>{requestAnimationFrame(()=>{d.value=!1})}),At(s,"beforematch",m=>{requestAnimationFrame(()=>{r.onOpenToggle(),o("contentFound")})}),(m,g)=>(D(),k(f(_n),{ref_key:"presentRef",ref:u,present:m.forceMount||f(r).open.value,"force-mount":!0},{default:A(({present:y})=>[q(f(we),j(m.$attrs,{id:f(r).contentId,ref:f(a),"as-child":n.asChild,as:m.as,hidden:y?void 0:f(r).unmountOnHide.value?"":"until-found","data-state":h.value?void 0:f(r).open.value?"open":"closed","data-disabled":f(r).disabled?.value?"":void 0,style:{"--reka-collapsible-content-height":`${c.value}px`,"--reka-collapsible-content-width":`${i.value}px`}}),{default:A(()=>[!f(r).unmountOnHide.value||y?P(m.$slots,"default",{key:0}):Y("v-if",!0)]),_:2},1040,["id","as-child","as","hidden","data-state","data-disabled","style"])]),_:3},8,["present"]))}}),Hk=Uk,Kk=L({__name:"CollapsibleTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e;ae();const n=Q3();return(o,r)=>(D(),k(f(we),{type:o.as==="button"?"button":void 0,as:o.as,"as-child":t.asChild,"aria-controls":f(n).contentId,"aria-expanded":f(n).open.value,"data-state":f(n).open.value?"open":"closed","data-disabled":f(n).disabled?.value?"":void 0,disabled:f(n).disabled?.value,onClick:f(n).onOpenToggle},{default:A(()=>[P(o.$slots,"default")]),_:3},8,["type","as","as-child","aria-controls","aria-expanded","data-state","data-disabled","disabled","onClick"]))}}),Wk=Kk;function Gk({type:e,defaultValue:t,modelValue:n}){const o=n||t;return n!==void 0||t!==void 0?Array.isArray(o)?"multiple":"single":e??"single"}function Yk({type:e,defaultValue:t,modelValue:n}){return e||Gk({type:e,defaultValue:t,modelValue:n})}function Zk({type:e,defaultValue:t}){return t!==void 0?t:e==="single"?void 0:[]}function Xk(e,t){const n=F(()=>Yk(e)),o=Lt(e,"modelValue",t,{defaultValue:Zk(e),passive:e.modelValue===void 0,deep:!0});function r(a){if(n.value==="single")o.value=Ur(a,o.value)?void 0:a;else{const s=Array.isArray(o.value)?[...o.value||[]]:[o.value].filter(Boolean);if(q_(s,a)){const i=s.findIndex(c=>Ur(c,a));s.splice(i,1)}else s.push(a);o.value=s}}const u=F(()=>n.value==="single");return{modelValue:o,changeModelValue:r,isSingle:u}}const[df,Jk]=lt("AccordionRoot");var Qk=L({__name:"AccordionRoot",props:{collapsible:{type:Boolean,required:!1,default:!1},disabled:{type:Boolean,required:!1,default:!1},dir:{type:String,required:!1},orientation:{type:String,required:!1,default:"vertical"},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},type:{type:String,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=t,{dir:r,disabled:u,unmountOnHide:a}=mt(n),s=ju(r),{modelValue:i,changeModelValue:c,isSingle:l}=Xk(n,o),{forwardRef:d,currentElement:p}=ae();return Jk({disabled:u,direction:s,orientation:n.orientation,parentElement:p,isSingle:l,collapsible:n.collapsible,modelValue:i,changeModelValue:c,unmountOnHide:a}),(h,m)=>(D(),k(f(we),{ref:f(d),"as-child":h.asChild,as:h.as},{default:A(()=>[P(h.$slots,"default",{modelValue:f(i)})]),_:3},8,["as-child","as"]))}}),D0=Qk,A0=(function(e){return e.Open="open",e.Closed="closed",e})(A0||{});const[e1,e7]=lt("AccordionItem");var t7=L({__name:"AccordionItem",props:{disabled:{type:Boolean,required:!1},value:{type:String,required:!0},unmountOnHide:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e,{expose:t}){const n=e,o=df(),r=F(()=>o.isSingle.value?n.value===o.modelValue.value:Array.isArray(o.modelValue.value)&&o.modelValue.value.includes(n.value)),u=F(()=>o.disabled.value||n.disabled),a=F(()=>u.value?"":void 0),s=F(()=>r.value?A0.Open:A0.Closed);t({open:r,dataDisabled:a});const{currentRef:i,currentElement:c}=ae();e7({open:r,dataState:s,disabled:u,dataDisabled:a,triggerId:"",currentRef:i,currentElement:c,value:F(()=>n.value)});function l(d){const p=d.target;if(Array.from(o.parentElement.value?.querySelectorAll("[data-reka-collection-item]")??[]).findIndex(g=>g===p)===-1)return null;za(d,p,o.parentElement.value,{arrowKeyOptions:o.orientation,dir:o.direction.value,focus:!0})}return(d,p)=>(D(),k(f(zk),{"data-orientation":f(o).orientation,"data-disabled":a.value,"data-state":s.value,disabled:u.value,open:r.value,as:n.as,"as-child":n.asChild,"unmount-on-hide":n.unmountOnHide??f(o).unmountOnHide.value,onKeydown:$d(l,["up","down","left","right","home","end"])},{default:A(()=>[P(d.$slots,"default",{open:r.value})]),_:3},8,["data-orientation","data-disabled","data-state","disabled","open","as","as-child","unmount-on-hide"]))}}),t1=t7,n7=L({__name:"AccordionContent",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=df(),o=e1();return ae(),(r,u)=>(D(),k(f(Hk),{role:"region","as-child":t.asChild,as:r.as,"force-mount":t.forceMount,"aria-labelledby":f(o).triggerId,"data-state":f(o).dataState.value,"data-disabled":f(o).dataDisabled.value,"data-orientation":f(n).orientation,style:{"--reka-accordion-content-width":"var(--reka-collapsible-content-width)","--reka-accordion-content-height":"var(--reka-collapsible-content-height)"},onContentFound:u[0]||(u[0]=a=>f(n).changeModelValue(f(o).value.value))},{default:A(()=>[P(r.$slots,"default")]),_:3},8,["as-child","as","force-mount","aria-labelledby","data-state","data-disabled","data-orientation"]))}}),n1=n7,o7=L({__name:"AccordionTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=df(),o=e1();o.triggerId||=sn(void 0,"reka-accordion-trigger");function r(){const u=n.isSingle.value&&o.open.value&&!n.collapsible;o.disabled.value||u||n.changeModelValue(o.value.value)}return(u,a)=>(D(),k(f(Wk),{id:f(o).triggerId,ref:f(o).currentRef,"data-reka-collection-item":"",as:t.as,"as-child":t.asChild,"aria-disabled":f(o).disabled.value||void 0,"aria-expanded":f(o).open.value||!1,"data-disabled":f(o).dataDisabled.value,"data-orientation":f(n).orientation,"data-state":f(o).dataState.value,disabled:f(o).disabled.value,onClick:r},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["id","as","as-child","aria-disabled","aria-expanded","data-disabled","data-orientation","data-state","disabled"]))}}),B0=o7;const[go,r7]=lt("DialogRoot");var u7=L({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=Lt(n,"open",t,{defaultValue:n.defaultOpen,passive:n.open===void 0}),u=R(),a=R(),{modal:s}=mt(n);return r7({open:r,modal:s,openModal:()=>{r.value=!0},onOpenChange:i=>{r.value=i},onOpenToggle:()=>{r.value=!r.value},contentId:"",titleId:"",descriptionId:"",triggerElement:u,contentElement:a}),(i,c)=>P(i.$slots,"default",{open:f(r),close:()=>r.value=!1})}}),o1=u7,a7=L({__name:"DialogClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e;ae();const n=go();return(o,r)=>(D(),k(f(we),j(t,{type:o.as==="button"?"button":void 0,onClick:r[0]||(r[0]=u=>f(n).onOpenChange(!1))}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["type"]))}}),r1=a7;const s7="dismissableLayer.pointerDownOutside",i7="dismissableLayer.focusOutside";function u1(e,t){if(!(t instanceof Element))return!1;const n=t.closest("[data-dismissable-layer]"),o=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),r=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&(o===n||r.indexOf(o){});return Ze(a=>{if(!gn||!ke(n))return;const s=async c=>{const l=c.target;if(!(!t?.value||!l)){if(u1(t.value,l)){r.value=!1;return}if(c.target&&!r.value){let p=function(){I3(s7,e,d)};const d={originalEvent:c};c.pointerType==="touch"?(o.removeEventListener("click",u.value),u.value=p,o.addEventListener("click",u.value,{once:!0})):p()}else o.removeEventListener("click",u.value);r.value=!1}},i=window.setTimeout(()=>{o.addEventListener("pointerdown",s)},0);a(()=>{window.clearTimeout(i),o.removeEventListener("pointerdown",s),o.removeEventListener("click",u.value)})}),{onPointerDownCapture:()=>{ke(n)&&(r.value=!0)}}}function c7(e,t,n=!0){const o=t?.value?.ownerDocument??globalThis?.document,r=R(!1);return Ze(u=>{if(!gn||!ke(n))return;const a=async s=>{if(!t?.value)return;await Oe(),await Oe();const i=s.target;!t.value||!i||u1(t.value,i)||s.target&&!r.value&&I3(i7,e,{originalEvent:s})};o.addEventListener("focusin",a),u(()=>o.removeEventListener("focusin",a))}),{onFocusCapture:()=>{ke(n)&&(r.value=!0)},onBlurCapture:()=>{ke(n)&&(r.value=!1)}}}const fn=_t({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,originalBodyPointerEvents:void 0,branches:new Set});var d7=L({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r,currentElement:u}=ae(),a=F(()=>u.value?.ownerDocument??globalThis.document),s=F(()=>fn.layersRoot),i=F(()=>u.value?Array.from(s.value).indexOf(u.value):-1),c=F(()=>fn.layersWithOutsidePointerEventsDisabled.size>0),l=F(()=>{const h=Array.from(s.value),[m]=[...fn.layersWithOutsidePointerEventsDisabled].slice(-1),g=h.indexOf(m);return i.value>=g}),d=l7(async h=>{const m=[...fn.branches].some(g=>g?.contains(h.target));!l.value||m||(o("pointerDownOutside",h),o("interactOutside",h),await Oe(),h.defaultPrevented||o("dismiss"))},u),p=c7(h=>{[...fn.branches].some(g=>g?.contains(h.target))||(o("focusOutside",h),o("interactOutside",h),h.defaultPrevented||o("dismiss"))},u);return sf("Escape",h=>{i.value===s.value.size-1&&(o("escapeKeyDown",h),h.defaultPrevented||o("dismiss"))}),Ze(h=>{u.value&&(n.disableOutsidePointerEvents&&(fn.layersWithOutsidePointerEventsDisabled.size===0&&(fn.originalBodyPointerEvents=a.value.body.style.pointerEvents,a.value.body.style.pointerEvents="none"),fn.layersWithOutsidePointerEventsDisabled.add(u.value)),s.value.add(u.value),h(()=>{n.disableOutsidePointerEvents&&fn.layersWithOutsidePointerEventsDisabled.size===1&&!yl(fn.originalBodyPointerEvents)&&(a.value.body.style.pointerEvents=fn.originalBodyPointerEvents)}))}),Ze(h=>{h(()=>{u.value&&(s.value.delete(u.value),fn.layersWithOutsidePointerEventsDisabled.delete(u.value))})}),(h,m)=>(D(),k(f(we),{ref:f(r),"as-child":h.asChild,as:h.as,"data-dismissable-layer":"",style:mn({pointerEvents:c.value?l.value?"auto":"none":void 0}),onFocusCapture:f(p).onFocusCapture,onBlurCapture:f(p).onBlurCapture,onPointerdownCapture:f(d).onPointerDownCapture},{default:A(()=>[P(h.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),Vu=d7,f7=L({__name:"DismissableLayerBranch",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=ae();return $e(()=>{fn.branches.add(o.value)}),Ht(()=>{fn.branches.delete(o.value)}),(r,u)=>(D(),k(f(we),j({ref:f(n)},t),{default:A(()=>[P(r.$slots,"default")]),_:3},16))}}),p7=f7;const h7=K_(()=>R([]));function m7(){const e=h7();return{add(t){const n=e.value[0];t!==n&&n?.pause(),e.value=o4(e.value,t),e.value.unshift(t)},remove(t){e.value=o4(e.value,t),e.value[0]?.resume()}}}function o4(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}const dc="focusScope.autoFocusOnMount",fc="focusScope.autoFocusOnUnmount",r4={bubbles:!1,cancelable:!0};function si(e,{select:t=!1}={}){const n=dt();for(const o of e)if(Zo(o,{select:t}),dt()!==n)return!0}function g7(e){const t=ff(e),n=u4(t,e),o=u4(t.reverse(),e);return[n,o]}function ff(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const r=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||r?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function u4(e,t){for(const n of e)if(!v7(n,{upTo:t}))return n}function v7(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function y7(e){return e instanceof HTMLInputElement&&"select"in e}function Zo(e,{select:t=!1}={}){if(e&&e.focus){const n=dt();e.focus({preventScroll:!0}),e!==n&&y7(e)&&t&&e.select()}}var b7=L({__name:"FocusScope",props:{loop:{type:Boolean,required:!1,default:!1},trapped:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,o=t,{currentRef:r,currentElement:u}=ae(),a=R(null),s=m7(),i=_t({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});Ze(l=>{if(!gn)return;const d=u.value;if(!n.trapped)return;function p(y){if(i.paused||!d)return;const E=y.target;d.contains(E)?a.value=E:Zo(a.value,{select:!0})}function h(y){if(i.paused||!d)return;const E=y.relatedTarget;E!==null&&(d.contains(E)||Zo(a.value,{select:!0}))}function m(y){const E=a.value;if(E===null||!y.some(C=>C.removedNodes.length>0))return;d.contains(E)||Zo(d)}document.addEventListener("focusin",p),document.addEventListener("focusout",h);const g=new MutationObserver(m);d&&g.observe(d,{childList:!0,subtree:!0}),l(()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",h),g.disconnect()})}),Ze(async l=>{const d=u.value;if(await Oe(),!d)return;s.add(i);const p=dt();if(!d.contains(p)){const m=new CustomEvent(dc,r4);d.addEventListener(dc,g=>o("mountAutoFocus",g)),d.dispatchEvent(m),m.defaultPrevented||(si(ff(d),{select:!0}),dt()===p&&Zo(d))}l(()=>{d.removeEventListener(dc,y=>o("mountAutoFocus",y));const m=new CustomEvent(fc,r4),g=y=>{o("unmountAutoFocus",y)};d.addEventListener(fc,g),d.dispatchEvent(m),setTimeout(()=>{m.defaultPrevented||Zo(p??document.body,{select:!0}),d.removeEventListener(fc,g),s.remove(i)},0)})});function c(l){if(!n.loop&&!n.trapped||i.paused)return;const d=l.key==="Tab"&&!l.altKey&&!l.ctrlKey&&!l.metaKey,p=dt();if(d&&p){const h=l.currentTarget,[m,g]=g7(h);m&&g?!l.shiftKey&&p===g?(l.preventDefault(),n.loop&&Zo(m,{select:!0})):l.shiftKey&&p===m&&(l.preventDefault(),n.loop&&Zo(g,{select:!0})):p===h&&l.preventDefault()}}return(l,d)=>(D(),k(f(we),{ref_key:"currentRef",ref:r,tabindex:"-1","as-child":l.asChild,as:l.as,onKeydown:c},{default:A(()=>[P(l.$slots,"default")]),_:3},8,["as-child","as"]))}}),pf=b7;const E7="menu.itemSelect",_0=["Enter"," "],C7=["ArrowDown","PageUp","Home"],a1=["ArrowUp","PageDown","End"],x7=[...C7,...a1],w7={ltr:[..._0,"ArrowRight"],rtl:[..._0,"ArrowLeft"]},D7={ltr:["ArrowLeft"],rtl:["ArrowRight"]};function hf(e){return e?"open":"closed"}function Pi(e){return e==="indeterminate"}function mf(e){return Pi(e)?"indeterminate":e?"checked":"unchecked"}function A7(e){const t=dt();for(const n of e)if(n===t||(n.focus(),dt()!==t))return}function B7(e,t){const{x:n,y:o}=e;let r=!1;for(let u=0,a=t.length-1;uo!=l>o&&n<(c-s)*(o-i)/(l-i)+s&&(r=!r)}return r}function _7(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return B7(n,t)}function Su(e){return e.pointerType==="mouse"}var k7=L({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=go(),{forwardRef:u,currentElement:a}=ae();return r.titleId||=sn(void 0,"reka-dialog-title"),r.descriptionId||=sn(void 0,"reka-dialog-description"),$e(()=>{r.contentElement=a,dt()!==document.body&&(r.triggerElement.value=dt())}),(s,i)=>(D(),k(f(pf),{"as-child":"",loop:"",trapped:n.trapFocus,onMountAutoFocus:i[5]||(i[5]=c=>o("openAutoFocus",c)),onUnmountAutoFocus:i[6]||(i[6]=c=>o("closeAutoFocus",c))},{default:A(()=>[q(f(Vu),j({id:f(r).contentId,ref:f(u),as:s.as,"as-child":s.asChild,"disable-outside-pointer-events":s.disableOutsidePointerEvents,role:"dialog","aria-describedby":f(r).descriptionId,"aria-labelledby":f(r).titleId,"data-state":f(hf)(f(r).open.value)},s.$attrs,{onDismiss:i[0]||(i[0]=c=>f(r).onOpenChange(!1)),onEscapeKeyDown:i[1]||(i[1]=c=>o("escapeKeyDown",c)),onFocusOutside:i[2]||(i[2]=c=>o("focusOutside",c)),onInteractOutside:i[3]||(i[3]=c=>o("interactOutside",c)),onPointerDownOutside:i[4]||(i[4]=c=>o("pointerDownOutside",c))}),{default:A(()=>[P(s.$slots,"default")]),_:3},16,["id","as","as-child","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped"]))}}),s1=k7,S7=L({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=go(),u=Xn(o),{forwardRef:a,currentElement:s}=ae();return cf(s),(i,c)=>(D(),k(s1,j({...n,...f(u)},{ref:f(a),"trap-focus":f(r).open.value,"disable-outside-pointer-events":!0,onCloseAutoFocus:c[0]||(c[0]=l=>{l.defaultPrevented||(l.preventDefault(),f(r).triggerElement.value?.focus())}),onPointerDownOutside:c[1]||(c[1]=l=>{const d=l.detail.originalEvent,p=d.button===0&&d.ctrlKey===!0;(d.button===2||p)&&l.preventDefault()}),onFocusOutside:c[2]||(c[2]=l=>{l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16,["trap-focus"]))}}),T7=S7,F7=L({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=Xn(t);ae();const u=go(),a=R(!1),s=R(!1);return(i,c)=>(D(),k(s1,j({...n,...f(r)},{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:c[0]||(c[0]=l=>{l.defaultPrevented||(a.value||f(u).triggerElement.value?.focus(),l.preventDefault()),a.value=!1,s.value=!1}),onInteractOutside:c[1]||(c[1]=l=>{l.defaultPrevented||(a.value=!0,l.detail.originalEvent.type==="pointerdown"&&(s.value=!0));const d=l.target;f(u).triggerElement.value?.contains(d)&&l.preventDefault(),l.detail.originalEvent.type==="focusin"&&s.value&&l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16))}}),P7=F7,M7=L({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=go(),u=Xn(o),{forwardRef:a}=ae();return(s,i)=>(D(),k(f(_n),{present:s.forceMount||f(r).open.value},{default:A(()=>[f(r).modal.value?(D(),k(T7,j({key:0,ref:f(a)},{...n,...f(u),...s.$attrs}),{default:A(()=>[P(s.$slots,"default")]),_:3},16)):(D(),k(P7,j({key:1,ref:f(a)},{...n,...f(u),...s.$attrs}),{default:A(()=>[P(s.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),i1=M7,O7=L({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(e){const t=e;ae();const n=go();return(o,r)=>(D(),k(f(we),j(t,{id:f(n).descriptionId}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["id"]))}}),bu=O7,I7=L({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=go();return lf(!0),ae(),(n,o)=>(D(),k(f(we),{as:n.as,"as-child":n.asChild,"data-state":f(t).open.value?"open":"closed",style:{"pointer-events":"auto"}},{default:A(()=>[P(n.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),R7=I7,L7=L({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=go(),{forwardRef:n}=ae();return(o,r)=>f(t)?.modal.value?(D(),k(f(_n),{key:0,present:o.forceMount||f(t).open.value},{default:A(()=>[q(R7,j(o.$attrs,{ref:f(n),as:o.as,"as-child":o.asChild}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["as","as-child"])]),_:3},8,["present"])):Y("v-if",!0)}}),k0=L7,q7=L({__name:"Teleport",props:{to:{type:null,required:!1,default:"body"},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=H3();return(n,o)=>f(t)||n.forceMount?(D(),k(os,{key:0,to:n.to,disabled:n.disabled,defer:n.defer},[P(n.$slots,"default")],8,["to","disabled","defer"])):Y("v-if",!0)}}),zu=q7,$7=L({__name:"DialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),l1=$7,N7=L({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(e){const t=e,n=go();return ae(),(o,r)=>(D(),k(f(we),j(t,{id:f(n).titleId}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["id"]))}}),Eu=N7,j7=L({__name:"DialogTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=go(),{forwardRef:o,currentElement:r}=ae();return n.contentId||=sn(void 0,"reka-dialog-content"),$e(()=>{n.triggerElement.value=r.value}),(u,a)=>(D(),k(f(we),j(t,{ref:f(o),type:u.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":f(n).open.value||!1,"aria-controls":f(n).open.value?f(n).contentId:void 0,"data-state":f(n).open.value?"open":"closed",onClick:f(n).onOpenToggle}),{default:A(()=>[P(u.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),c1=j7;const a4="data-reka-collection-item";function vo(e={}){const{key:t="",isProvider:n=!1}=e,o=`${t}CollectionProvider`;let r;n?(r={collectionRef:R(),itemMap:R(new Map)},Pt(o,r)):r=Ue(o);const u=(l=!1)=>{const d=r.collectionRef.value;if(!d)return[];const p=Array.from(d.querySelectorAll(`[${a4}]`)),m=Array.from(r.itemMap.value.values()).sort((g,y)=>p.indexOf(g.ref)-p.indexOf(y.ref));return l?m:m.filter(g=>g.ref.dataset.disabled!=="")},a=L({name:"CollectionSlot",inheritAttrs:!1,setup(l,{slots:d,attrs:p}){const{primitiveElement:h,currentElement:m}=w0();return ye(m,()=>{r.collectionRef.value=m.value}),()=>qe(Ha,{ref:h,...p},d)}}),s=L({name:"CollectionItem",inheritAttrs:!1,props:{value:{validator:()=>!0}},setup(l,{slots:d,attrs:p}){const{primitiveElement:h,currentElement:m}=w0();return Ze(g=>{if(m.value){const y=_d(m.value);r.itemMap.value.set(y,{ref:m.value,value:l.value}),g(()=>r.itemMap.value.delete(y))}}),()=>qe(Ha,{...p,[a4]:"",ref:h},d)}}),i=F(()=>Array.from(r.itemMap.value.values())),c=F(()=>r.itemMap.value.size);return{getItems:u,reactiveItems:i,itemMapSize:c,CollectionSlot:a,CollectionItem:s}}var V7=L({__name:"VisuallyHidden",props:{feature:{type:String,required:!1,default:"focusable"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){return(t,n)=>(D(),k(f(we),{as:t.as,"as-child":t.asChild,"aria-hidden":t.feature==="focusable"?"true":void 0,"data-hidden":t.feature==="fully-hidden"?"":void 0,tabindex:t.feature==="fully-hidden"?"-1":void 0,style:{position:"absolute",border:0,width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",clipPath:"inset(50%)",whiteSpace:"nowrap",wordWrap:"normal",top:"-1px",left:"-1px"}},{default:A(()=>[P(t.$slots,"default")]),_:3},8,["as","as-child","aria-hidden","data-hidden","tabindex"]))}}),Yr=V7;const z7="rovingFocusGroup.onEntryFocus",U7={bubbles:!1,cancelable:!0},H7={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function K7(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function nH(e,t,n){const o=K7(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(o))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(o)))return H7[o]}function W7(e,t=!1){const n=dt();for(const o of e)if(o===n||(o.focus({preventScroll:t}),dt()!==n))return}function oH(e,t){return e.map((n,o)=>e[(t+o)%e.length])}const[d1,G7]=lt("PopperRoot");var Y7=L({inheritAttrs:!1,__name:"PopperRoot",setup(e){const t=R();return G7({anchor:t,onAnchorChange:n=>t.value=n}),(n,o)=>P(n.$slots,"default")}}),cs=Y7,Z7=L({__name:"PopperAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=ae(),r=d1();return Gg(()=>{r.onAnchorChange(t.reference??o.value)}),(u,a)=>(D(),k(f(we),{ref:f(n),as:u.as,"as-child":u.asChild},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["as","as-child"]))}}),ds=Z7;const X7={key:0,d:"M0 0L6 6L12 0"},J7={key:1,d:"M0 0L4.58579 4.58579C5.36683 5.36683 6.63316 5.36684 7.41421 4.58579L12 0"};var Q7=L({__name:"Arrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(we),j(t,{width:n.width,height:n.height,viewBox:n.asChild?void 0:"0 0 12 6",preserveAspectRatio:n.asChild?void 0:"none"}),{default:A(()=>[P(n.$slots,"default",{},()=>[n.rounded?(D(),re("path",J7)):(D(),re("path",X7))])]),_:3},16,["width","height","viewBox","preserveAspectRatio"]))}}),eS=Q7;function tS(e){return e!==null}function nS(e){return{name:"transformOrigin",options:e,fn(t){const{placement:n,rects:o,middlewareData:r}=t,a=r.arrow?.centerOffset!==0,s=a?0:e.arrowWidth,i=a?0:e.arrowHeight,[c,l]=S0(n),d={start:"0%",center:"50%",end:"100%"}[l],p=(r.arrow?.x??0)+s/2,h=(r.arrow?.y??0)+i/2;let m="",g="";return c==="bottom"?(m=a?d:`${p}px`,g=`${-i}px`):c==="top"?(m=a?d:`${p}px`,g=`${o.floating.height+i}px`):c==="right"?(m=`${-i}px`,g=a?d:`${h}px`):c==="left"&&(m=`${o.floating.width+i}px`,g=a?d:`${h}px`),{data:{x:m,y:g}}}}}function S0(e){const[t,n="center"]=e.split("-");return[t,n]}const oS=["top","right","bottom","left"],dr=Math.min,Cn=Math.max,Mi=Math.round,Ns=Math.floor,lo=e=>({x:e,y:e}),rS={left:"right",right:"left",bottom:"top",top:"bottom"};function T0(e,t,n){return Cn(e,dr(t,n))}function Io(e,t){return typeof e=="function"?e(t):e}function Ro(e){return e.split("-")[0]}function Uu(e){return e.split("-")[1]}function gf(e){return e==="x"?"y":"x"}function vf(e){return e==="y"?"height":"width"}function so(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function yf(e){return gf(so(e))}function uS(e,t,n){n===void 0&&(n=!1);const o=Uu(e),r=yf(e),u=vf(r);let a=r==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return t.reference[u]>t.floating[u]&&(a=Oi(a)),[a,Oi(a)]}function aS(e){const t=Oi(e);return[F0(e),t,F0(t)]}function F0(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const s4=["left","right"],i4=["right","left"],sS=["top","bottom"],iS=["bottom","top"];function lS(e,t,n){switch(e){case"top":case"bottom":return n?t?i4:s4:t?s4:i4;case"left":case"right":return t?sS:iS;default:return[]}}function cS(e,t,n,o){const r=Uu(e);let u=lS(Ro(e),n==="start",o);return r&&(u=u.map(a=>a+"-"+r),t&&(u=u.concat(u.map(F0)))),u}function Oi(e){const t=Ro(e);return rS[t]+e.slice(t.length)}function dS(e){return{top:0,right:0,bottom:0,left:0,...e}}function f1(e){return typeof e!="number"?dS(e):{top:e,right:e,bottom:e,left:e}}function Ii(e){const{x:t,y:n,width:o,height:r}=e;return{width:o,height:r,top:n,left:t,right:t+o,bottom:n+r,x:t,y:n}}function l4(e,t,n){let{reference:o,floating:r}=e;const u=so(t),a=yf(t),s=vf(a),i=Ro(t),c=u==="y",l=o.x+o.width/2-r.width/2,d=o.y+o.height/2-r.height/2,p=o[s]/2-r[s]/2;let h;switch(i){case"top":h={x:l,y:o.y-r.height};break;case"bottom":h={x:l,y:o.y+o.height};break;case"right":h={x:o.x+o.width,y:d};break;case"left":h={x:o.x-r.width,y:d};break;default:h={x:o.x,y:o.y}}switch(Uu(t)){case"start":h[a]-=p*(n&&c?-1:1);break;case"end":h[a]+=p*(n&&c?-1:1);break}return h}async function fS(e,t){var n;t===void 0&&(t={});const{x:o,y:r,platform:u,rects:a,elements:s,strategy:i}=e,{boundary:c="clippingAncestors",rootBoundary:l="viewport",elementContext:d="floating",altBoundary:p=!1,padding:h=0}=Io(t,e),m=f1(h),y=s[p?d==="floating"?"reference":"floating":d],E=Ii(await u.getClippingRect({element:(n=await(u.isElement==null?void 0:u.isElement(y)))==null||n?y:y.contextElement||await(u.getDocumentElement==null?void 0:u.getDocumentElement(s.floating)),boundary:c,rootBoundary:l,strategy:i})),b=d==="floating"?{x:o,y:r,width:a.floating.width,height:a.floating.height}:a.reference,v=await(u.getOffsetParent==null?void 0:u.getOffsetParent(s.floating)),C=await(u.isElement==null?void 0:u.isElement(v))?await(u.getScale==null?void 0:u.getScale(v))||{x:1,y:1}:{x:1,y:1},w=Ii(u.convertOffsetParentRelativeRectToViewportRelativeRect?await u.convertOffsetParentRelativeRectToViewportRelativeRect({elements:s,rect:b,offsetParent:v,strategy:i}):b);return{top:(E.top-w.top+m.top)/C.y,bottom:(w.bottom-E.bottom+m.bottom)/C.y,left:(E.left-w.left+m.left)/C.x,right:(w.right-E.right+m.right)/C.x}}const pS=50,hS=async(e,t,n)=>{const{placement:o="bottom",strategy:r="absolute",middleware:u=[],platform:a}=n,s=a.detectOverflow?a:{...a,detectOverflow:fS},i=await(a.isRTL==null?void 0:a.isRTL(t));let c=await a.getElementRects({reference:e,floating:t,strategy:r}),{x:l,y:d}=l4(c,o,i),p=o,h=0;const m={};for(let g=0;g({name:"arrow",options:e,async fn(t){const{x:n,y:o,placement:r,rects:u,platform:a,elements:s,middlewareData:i}=t,{element:c,padding:l=0}=Io(e,t)||{};if(c==null)return{};const d=f1(l),p={x:n,y:o},h=yf(r),m=vf(h),g=await a.getDimensions(c),y=h==="y",E=y?"top":"left",b=y?"bottom":"right",v=y?"clientHeight":"clientWidth",C=u.reference[m]+u.reference[h]-p[h]-u.floating[m],w=p[h]-u.reference[h],B=await(a.getOffsetParent==null?void 0:a.getOffsetParent(c));let x=B?B[v]:0;(!x||!await(a.isElement==null?void 0:a.isElement(B)))&&(x=s.floating[v]||u.floating[m]);const _=C/2-w/2,S=x/2-g[m]/2-1,O=dr(d[E],S),H=dr(d[b],S),N=O,J=x-g[m]-H,G=x/2-g[m]/2+_,$=T0(N,G,J),I=!i.arrow&&Uu(r)!=null&&G!==$&&u.reference[m]/2-(GG<=0)){var H,N;const G=(((H=u.flip)==null?void 0:H.index)||0)+1,$=x[G];if($&&(!(d==="alignment"?b!==so($):!1)||O.every(K=>so(K.placement)===b?K.overflows[0]>0:!0)))return{data:{index:G,overflows:O},reset:{placement:$}};let I=(N=O.filter(W=>W.overflows[0]<=0).sort((W,K)=>W.overflows[1]-K.overflows[1])[0])==null?void 0:N.placement;if(!I)switch(h){case"bestFit":{var J;const W=(J=O.filter(K=>{if(B){const de=so(K.placement);return de===b||de==="y"}return!0}).map(K=>[K.placement,K.overflows.filter(de=>de>0).reduce((de,le)=>de+le,0)]).sort((K,de)=>K[1]-de[1])[0])==null?void 0:J[0];W&&(I=W);break}case"initialPlacement":I=s;break}if(r!==I)return{reset:{placement:I}}}return{}}}};function c4(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function d4(e){return oS.some(t=>e[t]>=0)}const vS=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n,platform:o}=t,{strategy:r="referenceHidden",...u}=Io(e,t);switch(r){case"referenceHidden":{const a=await o.detectOverflow(t,{...u,elementContext:"reference"}),s=c4(a,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:d4(s)}}}case"escaped":{const a=await o.detectOverflow(t,{...u,altBoundary:!0}),s=c4(a,n.floating);return{data:{escapedOffsets:s,escaped:d4(s)}}}default:return{}}}}},p1=new Set(["left","top"]);async function yS(e,t){const{placement:n,platform:o,elements:r}=e,u=await(o.isRTL==null?void 0:o.isRTL(r.floating)),a=Ro(n),s=Uu(n),i=so(n)==="y",c=p1.has(a)?-1:1,l=u&&i?-1:1,d=Io(t,e);let{mainAxis:p,crossAxis:h,alignmentAxis:m}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m=="number"&&(h=s==="end"?m*-1:m),i?{x:h*l,y:p*c}:{x:p*c,y:h*l}}const bS=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,o;const{x:r,y:u,placement:a,middlewareData:s}=t,i=await yS(t,e);return a===((n=s.offset)==null?void 0:n.placement)&&(o=s.arrow)!=null&&o.alignmentOffset?{}:{x:r+i.x,y:u+i.y,data:{...i,placement:a}}}}},ES=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:o,placement:r,platform:u}=t,{mainAxis:a=!0,crossAxis:s=!1,limiter:i={fn:E=>{let{x:b,y:v}=E;return{x:b,y:v}}},...c}=Io(e,t),l={x:n,y:o},d=await u.detectOverflow(t,c),p=so(Ro(r)),h=gf(p);let m=l[h],g=l[p];if(a){const E=h==="y"?"top":"left",b=h==="y"?"bottom":"right",v=m+d[E],C=m-d[b];m=T0(v,m,C)}if(s){const E=p==="y"?"top":"left",b=p==="y"?"bottom":"right",v=g+d[E],C=g-d[b];g=T0(v,g,C)}const y=i.fn({...t,[h]:m,[p]:g});return{...y,data:{x:y.x-n,y:y.y-o,enabled:{[h]:a,[p]:s}}}}}},CS=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:o,placement:r,rects:u,middlewareData:a}=t,{offset:s=0,mainAxis:i=!0,crossAxis:c=!0}=Io(e,t),l={x:n,y:o},d=so(r),p=gf(d);let h=l[p],m=l[d];const g=Io(s,t),y=typeof g=="number"?{mainAxis:g,crossAxis:0}:{mainAxis:0,crossAxis:0,...g};if(i){const v=p==="y"?"height":"width",C=u.reference[p]-u.floating[v]+y.mainAxis,w=u.reference[p]+u.reference[v]-y.mainAxis;hw&&(h=w)}if(c){var E,b;const v=p==="y"?"width":"height",C=p1.has(Ro(r)),w=u.reference[d]-u.floating[v]+(C&&((E=a.offset)==null?void 0:E[d])||0)+(C?0:y.crossAxis),B=u.reference[d]+u.reference[v]+(C?0:((b=a.offset)==null?void 0:b[d])||0)-(C?y.crossAxis:0);mB&&(m=B)}return{[p]:h,[d]:m}}}},xS=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,o;const{placement:r,rects:u,platform:a,elements:s}=t,{apply:i=()=>{},...c}=Io(e,t),l=await a.detectOverflow(t,c),d=Ro(r),p=Uu(r),h=so(r)==="y",{width:m,height:g}=u.floating;let y,E;d==="top"||d==="bottom"?(y=d,E=p===(await(a.isRTL==null?void 0:a.isRTL(s.floating))?"start":"end")?"left":"right"):(E=d,y=p==="end"?"top":"bottom");const b=g-l.top-l.bottom,v=m-l.left-l.right,C=dr(g-l[y],b),w=dr(m-l[E],v),B=!t.middlewareData.shift;let x=C,_=w;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(_=v),(o=t.middlewareData.shift)!=null&&o.enabled.y&&(x=b),B&&!p){const O=Cn(l.left,0),H=Cn(l.right,0),N=Cn(l.top,0),J=Cn(l.bottom,0);h?_=m-2*(O!==0||H!==0?O+H:Cn(l.left,l.right)):x=g-2*(N!==0||J!==0?N+J:Cn(l.top,l.bottom))}await i({...t,availableWidth:_,availableHeight:x});const S=await a.getDimensions(s.floating);return m!==S.width||g!==S.height?{reset:{rects:!0}}:{}}}};function Cl(){return typeof window<"u"}function Zr(e){return bf(e)?(e.nodeName||"").toLowerCase():"#document"}function wn(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function yo(e){var t;return(t=(bf(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function bf(e){return Cl()?e instanceof Node||e instanceof wn(e).Node:!1}function Wn(e){return Cl()?e instanceof Element||e instanceof wn(e).Element:!1}function jo(e){return Cl()?e instanceof HTMLElement||e instanceof wn(e).HTMLElement:!1}function f4(e){return!Cl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof wn(e).ShadowRoot}function fs(e){const{overflow:t,overflowX:n,overflowY:o,display:r}=Gn(e);return/auto|scroll|overlay|hidden|clip/.test(t+o+n)&&r!=="inline"&&r!=="contents"}function wS(e){return/^(table|td|th)$/.test(Zr(e))}function xl(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const DS=/transform|translate|scale|rotate|perspective|filter/,AS=/paint|layout|strict|content/,wr=e=>!!e&&e!=="none";let pc;function Ef(e){const t=Wn(e)?Gn(e):e;return wr(t.transform)||wr(t.translate)||wr(t.scale)||wr(t.rotate)||wr(t.perspective)||!Cf()&&(wr(t.backdropFilter)||wr(t.filter))||DS.test(t.willChange||"")||AS.test(t.contain||"")}function BS(e){let t=fr(e);for(;jo(t)&&!Tu(t);){if(Ef(t))return t;if(xl(t))return null;t=fr(t)}return null}function Cf(){return pc==null&&(pc=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),pc}function Tu(e){return/^(html|body|#document)$/.test(Zr(e))}function Gn(e){return wn(e).getComputedStyle(e)}function wl(e){return Wn(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function fr(e){if(Zr(e)==="html")return e;const t=e.assignedSlot||e.parentNode||f4(e)&&e.host||yo(e);return f4(t)?t.host:t}function h1(e){const t=fr(e);return Tu(t)?e.ownerDocument?e.ownerDocument.body:e.body:jo(t)&&fs(t)?t:h1(t)}function Ka(e,t,n){var o;t===void 0&&(t=[]),n===void 0&&(n=!0);const r=h1(e),u=r===((o=e.ownerDocument)==null?void 0:o.body),a=wn(r);if(u){const s=P0(a);return t.concat(a,a.visualViewport||[],fs(r)?r:[],s&&n?Ka(s):[])}else return t.concat(r,Ka(r,[],n))}function P0(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function m1(e){const t=Gn(e);let n=parseFloat(t.width)||0,o=parseFloat(t.height)||0;const r=jo(e),u=r?e.offsetWidth:n,a=r?e.offsetHeight:o,s=Mi(n)!==u||Mi(o)!==a;return s&&(n=u,o=a),{width:n,height:o,$:s}}function xf(e){return Wn(e)?e:e.contextElement}function Cu(e){const t=xf(e);if(!jo(t))return lo(1);const n=t.getBoundingClientRect(),{width:o,height:r,$:u}=m1(t);let a=(u?Mi(n.width):n.width)/o,s=(u?Mi(n.height):n.height)/r;return(!a||!Number.isFinite(a))&&(a=1),(!s||!Number.isFinite(s))&&(s=1),{x:a,y:s}}const _S=lo(0);function g1(e){const t=wn(e);return!Cf()||!t.visualViewport?_S:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function kS(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==wn(e)?!1:t}function Wr(e,t,n,o){t===void 0&&(t=!1),n===void 0&&(n=!1);const r=e.getBoundingClientRect(),u=xf(e);let a=lo(1);t&&(o?Wn(o)&&(a=Cu(o)):a=Cu(e));const s=kS(u,n,o)?g1(u):lo(0);let i=(r.left+s.x)/a.x,c=(r.top+s.y)/a.y,l=r.width/a.x,d=r.height/a.y;if(u){const p=wn(u),h=o&&Wn(o)?wn(o):o;let m=p,g=P0(m);for(;g&&o&&h!==m;){const y=Cu(g),E=g.getBoundingClientRect(),b=Gn(g),v=E.left+(g.clientLeft+parseFloat(b.paddingLeft))*y.x,C=E.top+(g.clientTop+parseFloat(b.paddingTop))*y.y;i*=y.x,c*=y.y,l*=y.x,d*=y.y,i+=v,c+=C,m=wn(g),g=P0(m)}}return Ii({width:l,height:d,x:i,y:c})}function Dl(e,t){const n=wl(e).scrollLeft;return t?t.left+n:Wr(yo(e)).left+n}function v1(e,t){const n=e.getBoundingClientRect(),o=n.left+t.scrollLeft-Dl(e,n),r=n.top+t.scrollTop;return{x:o,y:r}}function SS(e){let{elements:t,rect:n,offsetParent:o,strategy:r}=e;const u=r==="fixed",a=yo(o),s=t?xl(t.floating):!1;if(o===a||s&&u)return n;let i={scrollLeft:0,scrollTop:0},c=lo(1);const l=lo(0),d=jo(o);if((d||!d&&!u)&&((Zr(o)!=="body"||fs(a))&&(i=wl(o)),d)){const h=Wr(o);c=Cu(o),l.x=h.x+o.clientLeft,l.y=h.y+o.clientTop}const p=a&&!d&&!u?v1(a,i):lo(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-i.scrollLeft*c.x+l.x+p.x,y:n.y*c.y-i.scrollTop*c.y+l.y+p.y}}function TS(e){return Array.from(e.getClientRects())}function FS(e){const t=yo(e),n=wl(e),o=e.ownerDocument.body,r=Cn(t.scrollWidth,t.clientWidth,o.scrollWidth,o.clientWidth),u=Cn(t.scrollHeight,t.clientHeight,o.scrollHeight,o.clientHeight);let a=-n.scrollLeft+Dl(e);const s=-n.scrollTop;return Gn(o).direction==="rtl"&&(a+=Cn(t.clientWidth,o.clientWidth)-r),{width:r,height:u,x:a,y:s}}const p4=25;function PS(e,t){const n=wn(e),o=yo(e),r=n.visualViewport;let u=o.clientWidth,a=o.clientHeight,s=0,i=0;if(r){u=r.width,a=r.height;const l=Cf();(!l||l&&t==="fixed")&&(s=r.offsetLeft,i=r.offsetTop)}const c=Dl(o);if(c<=0){const l=o.ownerDocument,d=l.body,p=getComputedStyle(d),h=l.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,m=Math.abs(o.clientWidth-d.clientWidth-h);m<=p4&&(u-=m)}else c<=p4&&(u+=c);return{width:u,height:a,x:s,y:i}}function MS(e,t){const n=Wr(e,!0,t==="fixed"),o=n.top+e.clientTop,r=n.left+e.clientLeft,u=jo(e)?Cu(e):lo(1),a=e.clientWidth*u.x,s=e.clientHeight*u.y,i=r*u.x,c=o*u.y;return{width:a,height:s,x:i,y:c}}function h4(e,t,n){let o;if(t==="viewport")o=PS(e,n);else if(t==="document")o=FS(yo(e));else if(Wn(t))o=MS(t,n);else{const r=g1(e);o={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return Ii(o)}function y1(e,t){const n=fr(e);return n===t||!Wn(n)||Tu(n)?!1:Gn(n).position==="fixed"||y1(n,t)}function OS(e,t){const n=t.get(e);if(n)return n;let o=Ka(e,[],!1).filter(s=>Wn(s)&&Zr(s)!=="body"),r=null;const u=Gn(e).position==="fixed";let a=u?fr(e):e;for(;Wn(a)&&!Tu(a);){const s=Gn(a),i=Ef(a);!i&&s.position==="fixed"&&(r=null),(u?!i&&!r:!i&&s.position==="static"&&!!r&&(r.position==="absolute"||r.position==="fixed")||fs(a)&&!i&&y1(e,a))?o=o.filter(l=>l!==a):r=s,a=fr(a)}return t.set(e,o),o}function IS(e){let{element:t,boundary:n,rootBoundary:o,strategy:r}=e;const a=[...n==="clippingAncestors"?xl(t)?[]:OS(t,this._c):[].concat(n),o],s=h4(t,a[0],r);let i=s.top,c=s.right,l=s.bottom,d=s.left;for(let p=1;p{a(!1,1e-7)},1e3)}x===1&&!E1(c,e.getBoundingClientRect())&&a(),C=!1}try{n=new IntersectionObserver(w,{...v,root:r.ownerDocument})}catch{n=new IntersectionObserver(w,v)}n.observe(e)}return a(!0),u}function VS(e,t,n,o){o===void 0&&(o={});const{ancestorScroll:r=!0,ancestorResize:u=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:i=!1}=o,c=xf(e),l=r||u?[...c?Ka(c):[],...t?Ka(t):[]]:[];l.forEach(E=>{r&&E.addEventListener("scroll",n,{passive:!0}),u&&E.addEventListener("resize",n)});const d=c&&s?jS(c,n):null;let p=-1,h=null;a&&(h=new ResizeObserver(E=>{let[b]=E;b&&b.target===c&&h&&t&&(h.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{var v;(v=h)==null||v.observe(t)})),n()}),c&&!i&&h.observe(c),t&&h.observe(t));let m,g=i?Wr(e):null;i&&y();function y(){const E=Wr(e);g&&!E1(g,E)&&n(),g=E,m=requestAnimationFrame(y)}return n(),()=>{var E;l.forEach(b=>{r&&b.removeEventListener("scroll",n),u&&b.removeEventListener("resize",n)}),d?.(),(E=h)==null||E.disconnect(),h=null,i&&cancelAnimationFrame(m)}}const zS=bS,US=ES,g4=gS,HS=xS,KS=vS,WS=mS,GS=CS,YS=(e,t,n)=>{const o=new Map,r={platform:NS,...n},u={...r.platform,_c:o};return hS(e,t,{...r,platform:u})};function ZS(e){return e!=null&&typeof e=="object"&&"$el"in e}function M0(e){if(ZS(e)){const t=e.$el;return bf(t)&&Zr(t)==="#comment"?null:t}return e}function iu(e){return typeof e=="function"?e():f(e)}function XS(e){return{name:"arrow",options:e,fn(t){const n=M0(iu(e.element));return n==null?{}:WS({element:n,padding:e.padding}).fn(t)}}}function C1(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function v4(e,t){const n=C1(e);return Math.round(t*n)/n}function JS(e,t,n){n===void 0&&(n={});const o=n.whileElementsMounted,r=F(()=>{var x;return(x=iu(n.open))!=null?x:!0}),u=F(()=>iu(n.middleware)),a=F(()=>{var x;return(x=iu(n.placement))!=null?x:"bottom"}),s=F(()=>{var x;return(x=iu(n.strategy))!=null?x:"absolute"}),i=F(()=>{var x;return(x=iu(n.transform))!=null?x:!0}),c=F(()=>M0(e.value)),l=F(()=>M0(t.value)),d=R(0),p=R(0),h=R(s.value),m=R(a.value),g=Me({}),y=R(!1),E=F(()=>{const x={position:h.value,left:"0",top:"0"};if(!l.value)return x;const _=v4(l.value,d.value),S=v4(l.value,p.value);return i.value?{...x,transform:"translate("+_+"px, "+S+"px)",...C1(l.value)>=1.5&&{willChange:"transform"}}:{position:h.value,left:_+"px",top:S+"px"}});let b;function v(){if(c.value==null||l.value==null)return;const x=r.value;YS(c.value,l.value,{middleware:u.value,placement:a.value,strategy:s.value}).then(_=>{d.value=_.x,p.value=_.y,h.value=_.strategy,m.value=_.placement,g.value=_.middlewareData,y.value=x!==!1})}function C(){typeof b=="function"&&(b(),b=void 0)}function w(){if(C(),o===void 0){v();return}if(c.value!=null&&l.value!=null){b=o(c.value,l.value,v);return}}function B(){r.value||(y.value=!1)}return ye([u,a,s,r],v,{flush:"sync"}),ye([c,l],w,{flush:"sync"}),ye(r,B,{flush:"sync"}),ho()&&ir(C),{x:Br(d),y:Br(p),strategy:Br(h),placement:Br(m),middlewareData:Br(g),isPositioned:Br(y),floatingStyles:E,update:v}}const x1={side:"bottom",sideOffset:0,sideFlip:!0,align:"center",alignOffset:0,alignFlip:!0,arrowPadding:0,hideShiftedArrow:!0,avoidCollisions:!0,collisionBoundary:()=>[],collisionPadding:0,sticky:"partial",hideWhenDetached:!1,positionStrategy:"fixed",updatePositionStrategy:"optimized",prioritizePosition:!1},[QS,eT]=lt("PopperContent");var tT=L({inheritAttrs:!1,__name:"PopperContent",props:gv({side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...x1}),emits:["placed"],setup(e,{emit:t}){const n=e,o=t,r=d1(),{forwardRef:u,currentElement:a}=ae(),s=R(),i=R(),{width:c,height:l}=Ok(i),d=F(()=>n.side+(n.align!=="center"?`-${n.align}`:"")),p=F(()=>typeof n.collisionPadding=="number"?n.collisionPadding:{top:0,right:0,bottom:0,left:0,...n.collisionPadding}),h=F(()=>Array.isArray(n.collisionBoundary)?n.collisionBoundary:[n.collisionBoundary]),m=F(()=>({padding:p.value,boundary:h.value.filter(tS),altBoundary:h.value.length>0})),g=F(()=>({mainAxis:n.sideFlip,crossAxis:n.alignFlip})),y=z_(()=>[zS({mainAxis:n.sideOffset+l.value,alignmentAxis:n.alignOffset}),n.prioritizePosition&&n.avoidCollisions&&g4({...m.value,...g.value}),n.avoidCollisions&&US({mainAxis:!0,crossAxis:!!n.prioritizePosition,limiter:n.sticky==="partial"?GS():void 0,...m.value}),!n.prioritizePosition&&n.avoidCollisions&&g4({...m.value,...g.value}),HS({...m.value,apply:({elements:N,rects:J,availableWidth:G,availableHeight:$})=>{const{width:I,height:W}=J.reference,K=N.floating.style;K.setProperty("--reka-popper-available-width",`${G}px`),K.setProperty("--reka-popper-available-height",`${$}px`),K.setProperty("--reka-popper-anchor-width",`${I}px`),K.setProperty("--reka-popper-anchor-height",`${W}px`)}}),i.value&&XS({element:i.value,padding:n.arrowPadding}),nS({arrowWidth:c.value,arrowHeight:l.value}),n.hideWhenDetached&&KS({strategy:"referenceHidden",...m.value})]),E=F(()=>n.reference??r.anchor.value),{floatingStyles:b,placement:v,isPositioned:C,middlewareData:w}=JS(E,s,{strategy:n.positionStrategy,placement:d,whileElementsMounted:(...N)=>VS(...N,{layoutShift:!n.disableUpdateOnLayoutShift,animationFrame:n.updatePositionStrategy==="always"}),middleware:y}),B=F(()=>S0(v.value)[0]),x=F(()=>S0(v.value)[1]);Gg(()=>{C.value&&o("placed")});const _=F(()=>{const N=w.value.arrow?.centerOffset!==0;return n.hideShiftedArrow&&N}),S=R("");Ze(()=>{a.value&&(S.value=window.getComputedStyle(a.value).zIndex)});const O=F(()=>w.value.arrow?.x??0),H=F(()=>w.value.arrow?.y??0);return eT({placedSide:B,onArrowChange:N=>i.value=N,arrowX:O,arrowY:H,shouldHideArrow:_}),(N,J)=>(D(),re("div",{ref_key:"floatingRef",ref:s,"data-reka-popper-content-wrapper":"",style:mn({...f(b),transform:f(C)?f(b).transform:"translate(0, -200%)",minWidth:"max-content",zIndex:S.value,"--reka-popper-transform-origin":[f(w).transformOrigin?.x,f(w).transformOrigin?.y].join(" "),...f(w).hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}})},[q(f(we),j({ref:f(u)},N.$attrs,{"as-child":n.asChild,as:N.as,"data-side":B.value,"data-align":x.value,style:{animation:f(C)?void 0:"none"}}),{default:A(()=>[P(N.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","style"])],4))}}),Al=tT;const nT={top:"bottom",right:"left",bottom:"top",left:"right"};var oT=L({inheritAttrs:!1,__name:"PopperArrow",props:{width:{type:Number,required:!1},height:{type:Number,required:!1},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const{forwardRef:t}=ae(),n=QS(),o=F(()=>nT[n.placedSide.value]);return(r,u)=>(D(),re("span",{ref:a=>{f(n).onArrowChange(a)},style:mn({position:"absolute",left:f(n).arrowX?.value?`${f(n).arrowX?.value}px`:void 0,top:f(n).arrowY?.value?`${f(n).arrowY?.value}px`:void 0,[o.value]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[f(n).placedSide.value],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[f(n).placedSide.value],visibility:f(n).shouldHideArrow.value?"hidden":void 0})},[q(eS,j(r.$attrs,{ref:f(t),style:{display:"block"},as:r.as,"as-child":r.asChild,rounded:r.rounded,width:r.width,height:r.height}),{default:A(()=>[P(r.$slots,"default")]),_:3},16,["as","as-child","rounded","width","height"])],4))}}),Bl=oT;const[rH,rT]=lt("RovingFocusGroup");var uT=L({__name:"RovingFocusGroup",props:{orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!1},currentTabStopId:{type:[String,null],required:!1},defaultCurrentTabStopId:{type:String,required:!1},preventScrollOnEntryFocus:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["entryFocus","update:currentTabStopId"],setup(e,{expose:t,emit:n}){const o=e,r=n,{loop:u,orientation:a,dir:s}=mt(o),i=ju(s),c=Lt(o,"currentTabStopId",r,{defaultValue:o.defaultCurrentTabStopId,passive:o.currentTabStopId===void 0}),l=R(!1),d=R(!1),p=R(0),{getItems:h,CollectionSlot:m}=vo({isProvider:!0});function g(E){const b=!d.value;if(E.currentTarget&&E.target===E.currentTarget&&b&&!l.value){const v=new CustomEvent(z7,U7);if(E.currentTarget.dispatchEvent(v),r("entryFocus",v),!v.defaultPrevented){const C=h().map(S=>S.ref).filter(S=>S.dataset.disabled!==""),w=C.find(S=>S.getAttribute("data-active")===""),B=C.find(S=>S.getAttribute("data-highlighted")===""),x=C.find(S=>S.id===c.value),_=[w,B,x,...C].filter(Boolean);W7(_,o.preventScrollOnEntryFocus)}}d.value=!1}function y(){setTimeout(()=>{d.value=!1},1)}return t({getItems:h}),rT({loop:u,dir:i,orientation:a,currentTabStopId:c,onItemFocus:E=>{c.value=E},onItemShiftTab:()=>{l.value=!0},onFocusableItemAdd:()=>{p.value++},onFocusableItemRemove:()=>{p.value--}}),(E,b)=>(D(),k(f(m),null,{default:A(()=>[q(f(we),{tabindex:l.value||p.value===0?-1:0,"data-orientation":f(a),as:E.as,"as-child":E.asChild,dir:f(i),style:{outline:"none"},onMousedown:b[0]||(b[0]=v=>d.value=!0),onMouseup:y,onFocus:g,onBlur:b[1]||(b[1]=v=>l.value=!1)},{default:A(()=>[P(E.$slots,"default")]),_:3},8,["tabindex","data-orientation","as","as-child","dir"])]),_:3}))}}),aT=uT,sT=L({__name:"MenuAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(ds),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),wf=sT,iT=L({__name:"MenuArrow",props:{width:{type:Number,required:!1},height:{type:Number,required:!1},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(Bl),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),w1=iT;function lT(){const e=R(!1);return $e(()=>{At("keydown",()=>{e.value=!0},{capture:!0,passive:!0}),At(["pointerdown","pointermove"],()=>{e.value=!1},{capture:!0,passive:!0})}),e}const cT=Nu(lT),[Xr,D1]=lt(["MenuRoot","MenuSub"],"MenuContext"),[Hu,dT]=lt("MenuRoot");var fT=L({__name:"MenuRoot",props:{open:{type:Boolean,required:!1,default:!1},dir:{type:String,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,{modal:r,dir:u}=mt(n),a=ju(u),s=Lt(n,"open",o),i=R(),c=cT();return D1({open:s,onOpenChange:l=>{s.value=l},content:i,onContentChange:l=>{i.value=l}}),dT({onClose:()=>{s.value=!1},isUsingKeyboardRef:c,dir:a,modal:r}),(l,d)=>(D(),k(f(cs),null,{default:A(()=>[P(l.$slots,"default")]),_:3}))}}),A1=fT;const[ps,pT]=lt("MenuContent");var hT=L({__name:"MenuContentImpl",props:gv({loop:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},disableOutsideScroll:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...x1}),emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus","dismiss"],setup(e,{emit:t}){const n=e,o=t,r=Xr(),u=Hu(),{trapFocus:a,disableOutsidePointerEvents:s,loop:i}=mt(n);Y3(),lf(s.value);const c=R(""),l=R(0),d=R(0),p=R(null),h=R("right"),m=R(0),g=R(null),y=R(),{forwardRef:E,currentElement:b}=ae(),{handleTypeaheadSearch:v}=Rk(),C=R();function w($){const I=za($,C.value||dt(),b.value,{loop:i.value,arrowKeyOptions:"vertical",dir:u?.dir.value,focus:!1,attributeName:"[data-reka-collection-item]:not([data-disabled])"});I&&(C.value=I,I.scrollIntoView({block:"nearest"}))}function B(){C.value&&C.value.click()}const x=R(),_=R();ye(C,$=>{_.value&&($===void 0||$!==_.value.trigger.value)&&(_.value.onOpenChange(!1),_.value=void 0)}),ye(b,$=>{r.onContentChange($)}),Ht(()=>{window.clearTimeout(l.value)});function S($){return h.value===p.value?.side&&_7($,p.value?.area)}async function O($){o("openAutoFocus",$),!$.defaultPrevented&&($.preventDefault(),b.value?.focus({preventScroll:!0}))}function H($){if($.defaultPrevented)return;const I=$.target,W=I.closest("[data-reka-menu-content]")===$.currentTarget,K=["input","textarea"].includes(I.tagName.toLowerCase()),de=$.ctrlKey||$.altKey||$.metaKey,le=$.key.length===1,ut=za($,dt(),b.value,{loop:i.value,arrowKeyOptions:"vertical",dir:u?.dir.value,focus:!0,attributeName:"[data-reka-collection-item]:not([data-disabled])"});if(ut)return ut?.focus();if($.code==="Space")return;const Ve=y.value?.getItems()??[];if(W&&($.key==="Tab"&&$.preventDefault(),!de&&le&&!K&&v($.key,Ve)),$.target!==b.value||!x7.includes($.key))return;$.preventDefault();const ht=[...Ve.map(Dt=>Dt.ref)];a1.includes($.key)&&ht.reverse(),A7(ht)}function N($){$?.currentTarget?.contains?.($.target)||(window.clearTimeout(l.value),c.value="")}function J($){if(!Su($))return;const I=$.target,W=m.value!==$.clientX;if($?.currentTarget?.contains(I)&&W){const K=$.clientX>m.value?"right":"left";h.value=K,m.value=$.clientX}}function G($){Su($)&&x.value&&x.value.focus()}return pT({onItemEnter:$=>!!S($),onItemLeave:$=>{if(S($))return;["INPUT","TEXTAREA"].includes(dt()?.tagName||"")||b.value?.focus(),g.value=null},onTriggerLeave:$=>!!S($),searchRef:c,highlightedElement:C,onKeydownNavigation:w,onKeydownEnter:B,filterElement:x,onFilterElementChange:$=>{x.value=$},activeSubmenuContext:_,pointerGraceTimerRef:d,onPointerGraceIntentChange:$=>{p.value=$}}),($,I)=>(D(),k(f(pf),{"as-child":"",trapped:f(a),onMountAutoFocus:O,onUnmountAutoFocus:I[7]||(I[7]=W=>o("closeAutoFocus",W))},{default:A(()=>[q(f(Vu),{"as-child":"","disable-outside-pointer-events":f(s),onEscapeKeyDown:I[2]||(I[2]=W=>o("escapeKeyDown",W)),onPointerDownOutside:I[3]||(I[3]=W=>o("pointerDownOutside",W)),onFocusOutside:I[4]||(I[4]=W=>o("focusOutside",W)),onInteractOutside:I[5]||(I[5]=W=>o("interactOutside",W)),onDismiss:I[6]||(I[6]=W=>o("dismiss"))},{default:A(()=>[q(f(aT),{ref_key:"rovingFocusGroupRef",ref:y,"current-tab-stop-id":g.value,"onUpdate:currentTabStopId":I[0]||(I[0]=W=>g.value=W),"as-child":"",orientation:"vertical",dir:f(u).dir.value,loop:f(i),onEntryFocus:I[1]||(I[1]=W=>{o("entryFocus",W),f(u).isUsingKeyboardRef.value||W.preventDefault()})},{default:A(()=>[q(f(Al),{ref:f(E),role:"menu",as:$.as,"as-child":$.asChild,"aria-orientation":"vertical","data-reka-menu-content":"","data-state":f(hf)(f(r).open.value),dir:f(u).dir.value,side:$.side,"side-offset":$.sideOffset,align:$.align,"align-offset":$.alignOffset,"avoid-collisions":$.avoidCollisions,"collision-boundary":$.collisionBoundary,"collision-padding":$.collisionPadding,"arrow-padding":$.arrowPadding,"prioritize-position":$.prioritizePosition,"position-strategy":$.positionStrategy,"update-position-strategy":$.updatePositionStrategy,sticky:$.sticky,"hide-when-detached":$.hideWhenDetached,reference:$.reference,onKeydown:H,onBlur:N,onPointermove:J,onPointerenter:G},{default:A(()=>[P($.$slots,"default")]),_:3},8,["as","as-child","data-state","dir","side","side-offset","align","align-offset","avoid-collisions","collision-boundary","collision-padding","arrow-padding","prioritize-position","position-strategy","update-position-strategy","sticky","hide-when-detached","reference"])]),_:3},8,["current-tab-stop-id","dir","loop"])]),_:3},8,["disable-outside-pointer-events"])]),_:3},8,["trapped"]))}}),Df=hT,mT=L({inheritAttrs:!1,__name:"MenuItemImpl",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=ps(),{forwardRef:o,currentElement:r}=ae(),{CollectionItem:u}=vo(),a=R(!1),s=F(()=>a.value||n.highlightedElement.value===r.value);async function i(l){if(!(l.defaultPrevented||!Su(l))){if(t.disabled)n.onItemLeave(l);else if(!n.onItemEnter(l)){const p=l.currentTarget;n.highlightedElement.value=p,["INPUT","TEXTAREA"].includes(dt()?.tagName||"")||p.focus({preventScroll:!0})}}}async function c(l){await Oe(),!l.defaultPrevented&&Su(l)&&n.onItemLeave(l)}return(l,d)=>(D(),k(f(u),{value:{textValue:l.textValue}},{default:A(()=>[q(f(we),j({ref:f(o),role:"menuitem",tabindex:"-1"},l.$attrs,{as:l.as,"as-child":l.asChild,"aria-disabled":l.disabled||void 0,"data-disabled":l.disabled?"":void 0,"data-highlighted":s.value?"":void 0,onPointermove:i,onPointerleave:c,onFocus:d[0]||(d[0]=async p=>{await Oe(),!(p.defaultPrevented||l.disabled)&&(a.value=!0,f(n).highlightedElement.value=p.currentTarget)}),onBlur:d[1]||(d[1]=async p=>{await Oe(),!p.defaultPrevented&&(a.value=!1)})}),{default:A(()=>[P(l.$slots,"default")]),_:3},16,["as","as-child","aria-disabled","data-disabled","data-highlighted"])]),_:3},8,["value"]))}}),B1=mT,gT=L({__name:"MenuItem",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r,currentElement:u}=ae(),a=Hu(),s=ps(),i=R(!1);async function c(){const l=u.value;if(!n.disabled&&l){const d=new CustomEvent(E7,{bubbles:!0,cancelable:!0});o("select",d),await Oe(),d.defaultPrevented?i.value=!1:a.onClose()}}return(l,d)=>(D(),k(B1,j(n,{ref:f(r),onClick:c,onPointerdown:d[0]||(d[0]=()=>{i.value=!0}),onPointerup:d[1]||(d[1]=async p=>{await Oe(),!p.defaultPrevented&&(i.value||p.currentTarget?.click())}),onKeydown:d[2]||(d[2]=async p=>{const h=f(s).searchRef.value!=="";l.disabled||h&&p.key===" "||f(_0).includes(p.key)&&(p.currentTarget.click(),p.preventDefault())})}),{default:A(()=>[P(l.$slots,"default")]),_:3},16))}}),_l=gT;const[vT,_1]=lt(["MenuCheckboxItem","MenuRadioItem"],"MenuItemIndicatorContext");var yT=L({__name:"MenuItemIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=vT({modelValue:R(!1)});return(n,o)=>(D(),k(f(_n),{present:n.forceMount||f(Pi)(f(t).modelValue.value)||f(t).modelValue.value===!0},{default:A(()=>[q(f(we),{as:n.as,"as-child":n.asChild,"data-state":f(mf)(f(t).modelValue.value)},{default:A(()=>[P(n.$slots,"default")]),_:3},8,["as","as-child","data-state"])]),_:3},8,["present"]))}}),k1=yT,bT=L({__name:"MenuCheckboxItem",props:{modelValue:{type:[Boolean,String],required:!1,default:!1},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select","update:modelValue"],setup(e,{emit:t}){const n=e,o=t,r=No(n,["modelValue"]),u=ln(r),a=Lt(n,"modelValue",o);return _1({modelValue:a}),(s,i)=>(D(),k(_l,j({role:"menuitemcheckbox"},f(u),{"aria-checked":f(Pi)(f(a))?"mixed":f(a),"data-state":f(mf)(f(a)),onSelect:i[0]||(i[0]=async c=>{o("select",c),f(Pi)(f(a))?a.value=!0:a.value=!f(a)})}),{default:A(()=>[P(s.$slots,"default",{modelValue:f(a)})]),_:3},16,["aria-checked","data-state"]))}}),S1=bT,ET=L({__name:"MenuRootContentModal",props:{loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=it(n,o),u=Xr(),{forwardRef:a,currentElement:s}=ae();return cf(s),(i,c)=>(D(),k(Df,j(f(r),{ref:f(a),"trap-focus":f(u).open.value,"disable-outside-pointer-events":f(u).open.value,"disable-outside-scroll":!0,onDismiss:c[0]||(c[0]=l=>f(u).onOpenChange(!1)),onFocusOutside:c[1]||(c[1]=On(l=>o("focusOutside",l),["prevent"]))}),{default:A(()=>[P(i.$slots,"default")]),_:3},16,["trap-focus","disable-outside-pointer-events"]))}}),CT=ET,xT=L({__name:"MenuRootContentNonModal",props:{loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t),u=Xr();return(a,s)=>(D(),k(Df,j(f(r),{"trap-focus":!1,"disable-outside-pointer-events":!1,"disable-outside-scroll":!1,onDismiss:s[0]||(s[0]=i=>f(u).onOpenChange(!1))}),{default:A(()=>[P(a.$slots,"default")]),_:3},16))}}),wT=xT,DT=L({__name:"MenuContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t),u=Xr(),a=Hu();return(s,i)=>(D(),k(f(_n),{present:s.forceMount||f(u).open.value},{default:A(()=>[f(a).modal.value?(D(),k(CT,me(j({key:0},{...s.$attrs,...f(r)})),{default:A(()=>[P(s.$slots,"default")]),_:3},16)):(D(),k(wT,me(j({key:1},{...s.$attrs,...f(r)})),{default:A(()=>[P(s.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),T1=DT;const[AT,BT]=lt("MenuGroup");var _T=L({__name:"MenuGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=sn(void 0,"reka-menu-group");return BT({id:n}),(o,r)=>(D(),k(f(we),j({role:"group"},t,{"aria-labelledby":f(n)}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["aria-labelledby"]))}}),Af=_T,kT=L({__name:"MenuLabel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},setup(e){const t=e,n=AT({id:""});return(o,r)=>(D(),k(f(we),j(t,{id:f(n).id||void 0}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["id"]))}}),F1=kT,ST=L({__name:"MenuPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),P1=ST;const[TT,FT]=lt("MenuRadioGroup");var PT=L({__name:"MenuRadioGroup",props:{modelValue:{type:null,required:!1,default:""},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=t,r=No(n,["modelValue"]),u=ln(r),a=Lt(n,"modelValue",o);return FT({modelValue:a,onValueChange:s=>{a.value=s}}),(s,i)=>(D(),k(Af,me(xe(f(u))),{default:A(()=>[P(s.$slots,"default",{modelValue:f(a)})]),_:3},16))}}),M1=PT,MT=L({__name:"MenuRadioItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,r=No(n,["value"]),u=ln(r),{value:a}=mt(n),s=TT(),i=F(()=>s.modelValue.value===a?.value);return _1({modelValue:i}),(c,l)=>(D(),k(_l,j({role:"menuitemradio"},f(u),{"aria-checked":i.value,"data-state":f(mf)(i.value),onSelect:l[0]||(l[0]=async d=>{o("select",d),f(s).onValueChange(f(a))})}),{default:A(()=>[P(c.$slots,"default")]),_:3},16,["aria-checked","data-state"]))}}),O1=MT,OT=L({__name:"MenuSeparator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(we),j(t,{role:"separator","aria-orientation":"horizontal"}),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),I1=OT;const[Bf,IT]=lt("MenuSub");var RT=L({__name:"MenuSub",props:{open:{type:Boolean,required:!1,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=Lt(n,"open",t,{defaultValue:!1,passive:n.open===void 0}),u=Xr(),a=R(),s=R();return Ze(i=>{u?.open.value===!1&&(r.value=!1),i(()=>r.value=!1)}),D1({open:r,onOpenChange:i=>{r.value=i},content:s,onContentChange:i=>{s.value=i}}),IT({triggerId:"",contentId:"",trigger:a,onTriggerChange:i=>{a.value=i}}),(i,c)=>(D(),k(f(cs),null,{default:A(()=>[P(i.$slots,"default")]),_:3}))}}),R1=RT,LT=L({__name:"MenuSubContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1,default:!0},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t),u=Xr(),a=Hu(),s=Bf(),i=ps(),{forwardRef:c,currentElement:l}=ae();return s.contentId||=sn(void 0,"reka-menu-sub-content"),(d,p)=>(D(),k(f(_n),{present:d.forceMount||f(u).open.value},{default:A(()=>[q(Df,j(f(r),{id:f(s).contentId,ref:f(c),"aria-labelledby":f(s).triggerId,align:"start",side:f(a).dir.value==="rtl"?"left":"right","disable-outside-pointer-events":!1,"disable-outside-scroll":!1,"trap-focus":!1,onOpenAutoFocus:p[0]||(p[0]=On(h=>{f(a).isUsingKeyboardRef.value&&f(l)?.focus()},["prevent"])),onCloseAutoFocus:p[1]||(p[1]=On(()=>{},["prevent"])),onFocusOutside:p[2]||(p[2]=h=>{if(h.defaultPrevented)return;const m=f(i).filterElement.value?.contains(h.target);h.target!==f(s).trigger.value&&!m&&f(u).onOpenChange(!1)}),onEscapeKeyDown:p[3]||(p[3]=h=>{f(a).onClose(),h.preventDefault()}),onKeydown:p[4]||(p[4]=h=>{const m=h.currentTarget?.contains(h.target),g=f(D7)[f(a).dir.value].includes(h.key);m&&g&&(f(u).onOpenChange(!1),f(i).filterElement.value?(f(i).filterElement.value.focus(),f(i).highlightedElement.value=f(s).trigger.value,f(s).trigger.value?.scrollIntoView({block:"nearest"})):f(s).trigger.value?.focus(),h.preventDefault())})}),{default:A(()=>[P(d.$slots,"default")]),_:3},16,["id","aria-labelledby","side"])]),_:3},8,["present"]))}}),L1=LT,qT=L({__name:"MenuSubTrigger",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=Xr(),o=Hu(),r=Bf(),u=ps();ye(n.open,d=>{d?u.activeSubmenuContext.value={onOpenChange:n.onOpenChange,trigger:r.trigger}:u.activeSubmenuContext.value?.trigger.value===r.trigger.value&&(u.activeSubmenuContext.value=void 0)});const a=R(null);r.triggerId||=sn(void 0,"reka-menu-sub-trigger");function s(){a.value&&window.clearTimeout(a.value),a.value=null}Ht(()=>{s()});function i(d){!Su(d)||u.onItemEnter(d)||!t.disabled&&!n.open.value&&!a.value&&(u.onPointerGraceIntentChange(null),a.value=window.setTimeout(()=>{n.onOpenChange(!0),s()},100))}async function c(d){if(!Su(d))return;s();const p=n.content.value?.getBoundingClientRect();if(p?.width){const h=n.content.value?.dataset.side,m=h==="right",g=m?-5:5,y=p[m?"left":"right"],E=p[m?"right":"left"];u.onPointerGraceIntentChange({area:[{x:d.clientX+g,y:d.clientY},{x:y,y:p.top},{x:E,y:p.top},{x:E,y:p.bottom},{x:y,y:p.bottom}],side:h}),window.clearTimeout(u.pointerGraceTimerRef.value),u.pointerGraceTimerRef.value=window.setTimeout(()=>u.onPointerGraceIntentChange(null),300)}else{if(u.onTriggerLeave(d))return;u.onPointerGraceIntentChange(null)}}async function l(d){const p=u.searchRef.value!=="";t.disabled||p&&d.key===" "||w7[o.dir.value].includes(d.key)&&(n.onOpenChange(!0),await Oe(),n.content.value?.focus(),d.preventDefault())}return(d,p)=>(D(),k(wf,{"as-child":""},{default:A(()=>[q(B1,j(t,{id:f(r).triggerId,ref:h=>{f(r)?.onTriggerChange(h?.$el)},"aria-haspopup":"menu","aria-expanded":f(n).open.value,"aria-controls":f(r).contentId,"data-state":f(hf)(f(n).open.value),onClick:p[0]||(p[0]=async h=>{t.disabled||h.defaultPrevented||(h.currentTarget.focus(),f(n).open.value||f(n).onOpenChange(!0))}),onPointermove:i,onPointerleave:c,onKeydown:l}),{default:A(()=>[P(d.$slots,"default")]),_:3},16,["id","aria-expanded","aria-controls","data-state"])]),_:3}))}}),q1=qT,$T=L({__name:"ContextMenuArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(w1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),NT=$T,jT=L({__name:"ContextMenuCheckboxItem",props:{modelValue:{type:[Boolean,String],required:!1},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select","update:modelValue"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(S1),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),VT=jT;const[$1,zT]=lt("ContextMenuRoot");var UT=L({inheritAttrs:!1,__name:"ContextMenuRoot",props:{pressOpenDelay:{type:Number,required:!1,default:700},dir:{type:String,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,{dir:r,modal:u,pressOpenDelay:a}=mt(n);ae();const s=ju(r),i=R(!1);return zT({open:i,onOpenChange:l=>{i.value=l},dir:s,modal:u,triggerElement:R(),pressOpenDelay:a}),ye(i,l=>{o("update:open",l)}),(l,d)=>(D(),k(f(A1),{open:i.value,"onUpdate:open":d[0]||(d[0]=p=>i.value=p),dir:f(s),modal:f(u)},{default:A(()=>[P(l.$slots,"default")]),_:3},8,["open","dir","modal"]))}}),N1=UT,HT=L({__name:"ContextMenuContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},sideFlip:{type:Boolean,required:!1},alignOffset:{type:Number,required:!1,default:0},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1,default:!0},collisionBoundary:{type:null,required:!1,default:()=>[]},collisionPadding:{type:[Number,Object],required:!1,default:0},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1,default:"partial"},hideWhenDetached:{type:Boolean,required:!1,default:!1},positionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t);ae();const u=$1(),a=R(!1);return(s,i)=>(D(),k(f(T1),j(f(r),{side:"right","side-offset":2,align:"start","update-position-strategy":"always",style:{"--reka-context-menu-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-context-menu-content-available-width":"var(--reka-popper-available-width)","--reka-context-menu-content-available-height":"var(--reka-popper-available-height)","--reka-context-menu-trigger-width":"var(--reka-popper-anchor-width)","--reka-context-menu-trigger-height":"var(--reka-popper-anchor-height)"},onCloseAutoFocus:i[0]||(i[0]=c=>{!c.defaultPrevented&&a.value&&c.preventDefault(),a.value=!1}),onInteractOutside:i[1]||(i[1]=c=>{c.detail.originalEvent.button===2&&c.target===f(u).triggerElement.value&&c.preventDefault(),!c.defaultPrevented&&!f(u).modal.value&&(a.value=!0)})}),{default:A(()=>[P(s.$slots,"default")]),_:3},16))}}),KT=HT,WT=L({__name:"ContextMenuGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(Af),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),GT=WT,YT=L({__name:"ContextMenuItem",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(_l),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),ZT=YT,XT=L({__name:"ContextMenuItemIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(k1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),JT=XT,QT=L({__name:"ContextMenuLabel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(F1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),e8=QT,t8=L({__name:"ContextMenuPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(P1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),n8=t8,o8=L({__name:"ContextMenuRadioGroup",props:{modelValue:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(M1),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),r8=o8,u8=L({__name:"ContextMenuRadioItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(O1),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),a8=u8,s8=L({__name:"ContextMenuSeparator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(I1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),i8=s8,l8=L({__name:"ContextMenuSub",props:{defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t;ae();const r=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0});return(u,a)=>(D(),k(f(R1),{open:f(r),"onUpdate:open":a[0]||(a[0]=s=>rt(r)?r.value=s:null)},{default:A(()=>[P(u.$slots,"default",{open:f(r)})]),_:3},8,["open"]))}}),c8=l8,d8=L({__name:"ContextMenuSubContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t);return ae(),(u,a)=>(D(),k(f(L1),j(f(r),{style:{"--reka-context-menu-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-context-menu-content-available-width":"var(--reka-popper-available-width)","--reka-context-menu-content-available-height":"var(--reka-popper-available-height)","--reka-context-menu-trigger-width":"var(--reka-popper-anchor-width)","--reka-context-menu-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),f8=d8,p8=L({__name:"ContextMenuSubTrigger",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(q1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),h8=p8;function y4(e){return e.pointerType!=="mouse"}var m8=L({inheritAttrs:!1,__name:"ContextMenuTrigger",props:{disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,{disabled:n}=mt(t),{forwardRef:o,currentElement:r}=ae(),u=$1(),a=R({x:0,y:0}),s=F(()=>({getBoundingClientRect:()=>({width:0,height:0,left:a.value.x,right:a.value.x,top:a.value.y,bottom:a.value.y,...a.value})})),i=R(0);function c(){window.clearTimeout(i.value)}function l(m){a.value={x:m.clientX,y:m.clientY},u.onOpenChange(!0)}async function d(m){n.value||(await Oe(),m.defaultPrevented||(c(),l(m),m.preventDefault()))}async function p(m){n.value||(await Oe(),y4(m)&&!m.defaultPrevented&&(c(),i.value=window.setTimeout(()=>l(m),u.pressOpenDelay.value)))}async function h(m){n.value||(await Oe(),y4(m)&&!m.defaultPrevented&&c())}return $e(()=>{r.value&&(u.triggerElement.value=r.value)}),(m,g)=>(D(),re(Ce,null,[q(f(wf),{as:"template",reference:s.value},null,8,["reference"]),q(f(we),j({ref:f(o),as:m.as,"as-child":m.asChild,"data-state":f(u).open.value?"open":"closed","data-disabled":f(n)?"":void 0,style:{WebkitTouchCallout:"none",pointerEvents:"auto"}},m.$attrs,{onContextmenu:d,onPointerdown:p,onPointermove:h,onPointercancel:h,onPointerup:h}),{default:A(()=>[P(m.$slots,"default")]),_:3},16,["as","as-child","data-state","data-disabled"])],64))}}),j1=m8;const[Jr,g8]=lt("PopoverRoot");var v8=L({__name:"PopoverRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},modal:{type:Boolean,required:!1,default:!1}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,{modal:r}=mt(n),u=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0});return g8({contentId:"",triggerId:"",modal:r,open:u,onOpenChange:i=>{u.value=i},onOpenToggle:()=>{u.value=!u.value},triggerElement:R(),hasCustomAnchor:R(!1)}),(i,c)=>(D(),k(f(cs),null,{default:A(()=>[P(i.$slots,"default",{open:f(u),close:()=>u.value=!1})]),_:3}))}}),y8=v8,b8=L({__name:"PopoverAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;ae();const n=Jr();return Pd(()=>{n.hasCustomAnchor.value=!0}),Ht(()=>{n.hasCustomAnchor.value=!1}),(o,r)=>(D(),k(f(ds),me(xe(t)),{default:A(()=>[P(o.$slots,"default")]),_:3},16))}}),E8=b8,C8=L({__name:"PopoverArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(Bl),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),x8=C8,w8=L({__name:"PopoverClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e;ae();const n=Jr();return(o,r)=>(D(),k(f(we),{type:o.as==="button"?"button":void 0,as:o.as,"as-child":t.asChild,onClick:r[0]||(r[0]=u=>f(n).onOpenChange(!1))},{default:A(()=>[P(o.$slots,"default")]),_:3},8,["type","as","as-child"]))}}),D8=w8,A8=L({__name:"PopoverContentImpl",props:{trapFocus:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=ln(No(n,"trapFocus","disableOutsidePointerEvents")),{forwardRef:u}=ae(),a=Jr();return Y3(),(s,i)=>(D(),k(f(pf),{"as-child":"",loop:"",trapped:s.trapFocus,onMountAutoFocus:i[5]||(i[5]=c=>o("openAutoFocus",c)),onUnmountAutoFocus:i[6]||(i[6]=c=>o("closeAutoFocus",c))},{default:A(()=>[q(f(Vu),{"as-child":"","disable-outside-pointer-events":s.disableOutsidePointerEvents,onPointerDownOutside:i[0]||(i[0]=c=>o("pointerDownOutside",c)),onInteractOutside:i[1]||(i[1]=c=>o("interactOutside",c)),onEscapeKeyDown:i[2]||(i[2]=c=>o("escapeKeyDown",c)),onFocusOutside:i[3]||(i[3]=c=>o("focusOutside",c)),onDismiss:i[4]||(i[4]=c=>f(a).onOpenChange(!1))},{default:A(()=>[q(f(Al),j(f(r),{id:f(a).contentId,ref:f(u),"data-state":f(a).open.value?"open":"closed","aria-labelledby":f(a).triggerId,style:{"--reka-popover-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-popover-content-available-width":"var(--reka-popper-available-width)","--reka-popover-content-available-height":"var(--reka-popper-available-height)","--reka-popover-trigger-width":"var(--reka-popper-anchor-width)","--reka-popover-trigger-height":"var(--reka-popper-anchor-height)"},role:"dialog"}),{default:A(()=>[P(s.$slots,"default")]),_:3},16,["id","data-state","aria-labelledby"])]),_:3},8,["disable-outside-pointer-events"])]),_:3},8,["trapped"]))}}),V1=A8,B8=L({__name:"PopoverContentModal",props:{side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Jr(),u=R(!1);lf(!0);const a=it(n,o),{forwardRef:s,currentElement:i}=ae();return cf(i),(c,l)=>(D(),k(V1,j(f(a),{ref:f(s),"trap-focus":f(r).open.value,"disable-outside-pointer-events":"",onCloseAutoFocus:l[0]||(l[0]=On(d=>{o("closeAutoFocus",d),u.value||f(r).triggerElement.value?.focus()},["prevent"])),onPointerDownOutside:l[1]||(l[1]=d=>{o("pointerDownOutside",d);const p=d.detail.originalEvent,h=p.button===0&&p.ctrlKey===!0,m=p.button===2||h;u.value=m}),onFocusOutside:l[2]||(l[2]=On(()=>{},["prevent"]))}),{default:A(()=>[P(c.$slots,"default")]),_:3},16,["trap-focus"]))}}),_8=B8,k8=L({__name:"PopoverContentNonModal",props:{side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Jr(),u=R(!1),a=R(!1),s=it(n,o);return(i,c)=>(D(),k(V1,j(f(s),{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:c[0]||(c[0]=l=>{o("closeAutoFocus",l),l.defaultPrevented||(u.value||f(r).triggerElement.value?.focus(),l.preventDefault()),u.value=!1,a.value=!1}),onInteractOutside:c[1]||(c[1]=async l=>{o("interactOutside",l),l.defaultPrevented||(u.value=!0,l.detail.originalEvent.type==="pointerdown"&&(a.value=!0));const d=l.target;f(r).triggerElement.value?.contains(d)&&l.preventDefault(),l.detail.originalEvent.type==="focusin"&&a.value&&l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16))}}),S8=k8,T8=L({__name:"PopoverContent",props:{forceMount:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Jr(),u=it(n,o),{forwardRef:a}=ae();return r.contentId||=sn(void 0,"reka-popover-content"),(s,i)=>(D(),k(f(_n),{present:s.forceMount||f(r).open.value},{default:A(()=>[f(r).modal.value?(D(),k(_8,j({key:0},f(u),{ref:f(a)}),{default:A(()=>[P(s.$slots,"default")]),_:3},16)):(D(),k(S8,j({key:1},f(u),{ref:f(a)}),{default:A(()=>[P(s.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),F8=T8,P8=L({__name:"PopoverPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),M8=P8,O8=L({__name:"PopoverTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=Jr(),{forwardRef:o,currentElement:r}=ae();return n.triggerId||=sn(void 0,"reka-popover-trigger"),$e(()=>{n.triggerElement.value=r.value}),(u,a)=>(D(),k(Rt(f(n).hasCustomAnchor.value?f(we):f(ds)),{"as-child":""},{default:A(()=>[q(f(we),{id:f(n).triggerId,ref:f(o),type:u.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":f(n).open.value,"aria-controls":f(n).contentId,"data-state":f(n).open.value?"open":"closed",as:u.as,"as-child":t.asChild,onClick:f(n).onOpenToggle},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["id","type","aria-expanded","aria-controls","data-state","as","as-child","onClick"])]),_:3}))}}),I8=O8,R8=L({__name:"DropdownMenuArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(w1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),L8=R8,q8=L({__name:"DropdownMenuCheckboxItem",props:{modelValue:{type:[Boolean,String],required:!1},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select","update:modelValue"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(S1),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),$8=q8;const[z1,N8]=lt("DropdownMenuRoot");var j8=L({__name:"DropdownMenuRoot",props:{defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1,default:void 0},dir:{type:String,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t;ae();const r=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0}),u=R(),{modal:a,dir:s}=mt(n),i=ju(s);return N8({open:r,onOpenChange:c=>{r.value=c},onOpenToggle:()=>{r.value=!r.value},triggerId:"",triggerElement:u,contentId:"",modal:a,dir:i}),(c,l)=>(D(),k(f(A1),{open:f(r),"onUpdate:open":l[0]||(l[0]=d=>rt(r)?r.value=d:null),dir:f(i),modal:f(a)},{default:A(()=>[P(c.$slots,"default",{open:f(r)})]),_:3},8,["open","dir","modal"]))}}),V8=j8,z8=L({__name:"DropdownMenuContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t);ae();const u=z1(),a=R(!1);function s(i){i.defaultPrevented||(a.value||setTimeout(()=>{u.triggerElement.value?.focus()},0),a.value=!1,i.preventDefault())}return u.contentId||=sn(void 0,"reka-dropdown-menu-content"),(i,c)=>(D(),k(f(T1),j(f(r),{id:f(u).contentId,"aria-labelledby":f(u)?.triggerId,style:{"--reka-dropdown-menu-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-dropdown-menu-content-available-width":"var(--reka-popper-available-width)","--reka-dropdown-menu-content-available-height":"var(--reka-popper-available-height)","--reka-dropdown-menu-trigger-width":"var(--reka-popper-anchor-width)","--reka-dropdown-menu-trigger-height":"var(--reka-popper-anchor-height)"},onCloseAutoFocus:s,onInteractOutside:c[0]||(c[0]=l=>{if(l.defaultPrevented)return;const d=l.detail.originalEvent,p=d.button===0&&d.ctrlKey===!0,h=d.button===2||p;(!f(u).modal.value||h)&&(a.value=!0),f(u).triggerElement.value?.contains(l.target)&&l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16,["id","aria-labelledby"]))}}),U8=z8,H8=L({__name:"DropdownMenuFilter",props:{modelValue:{type:String,required:!1},autoFocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"input"}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,r=Lt(n,"modelValue",t,{defaultValue:"",passive:n.modelValue===void 0}),u=Hu(),a=ps(),s=Bf(null);ye(r,m=>{a.searchRef.value=m??""},{immediate:!0});const{primitiveElement:i,currentElement:c}=w0(),l=F(()=>n.disabled||!1),d=R();Yg(()=>d.value=a.highlightedElement.value?.id),$e(()=>{a.onFilterElementChange(c.value),setTimeout(()=>{n.autoFocus&&(!s||u.isUsingKeyboardRef.value)&&c.value?.focus()},1)}),Ht(()=>{a.onFilterElementChange(void 0),a.searchRef.value=""});function p(m){if(l.value)return;const g=m.target;r.value=g.value,a.searchRef.value=g.value}function h(m){l.value||(["ArrowDown","ArrowUp","Home","End"].includes(m.key)?(m.preventDefault(),a.onKeydownNavigation(m)):m.key==="Enter"?(m.preventDefault(),a.onKeydownEnter(m)):m.key==="Escape"&&r.value&&(m.stopPropagation(),r.value="",a.searchRef.value=""))}return(m,g)=>(D(),k(f(we),{ref_key:"primitiveElement",ref:i,as:m.as,"as-child":m.asChild,value:f(r),disabled:l.value?"":void 0,"data-disabled":l.value?"":void 0,"aria-disabled":l.value?!0:void 0,"aria-activedescendant":d.value,type:"text",role:"searchbox",onInput:p,onKeydown:h},{default:A(()=>[P(m.$slots,"default",{modelValue:f(r)})]),_:3},8,["as","as-child","value","disabled","data-disabled","aria-disabled","aria-activedescendant"]))}}),K8=H8,W8=L({__name:"DropdownMenuGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(Af),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),G8=W8,Y8=L({__name:"DropdownMenuItem",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(_l),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),Z8=Y8,X8=L({__name:"DropdownMenuItemIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(k1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),J8=X8,Q8=L({__name:"DropdownMenuLabel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(F1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),eF=Q8,tF=L({__name:"DropdownMenuPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(P1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),nF=tF,oF=L({__name:"DropdownMenuRadioGroup",props:{modelValue:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,r=Xn(t);return ae(),(u,a)=>(D(),k(f(M1),me(xe({...n,...f(r)})),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),rF=oF,uF=L({__name:"DropdownMenuRadioItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const r=it(e,t);return ae(),(u,a)=>(D(),k(f(O1),me(xe(f(r))),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),aF=uF,sF=L({__name:"DropdownMenuSeparator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(I1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),iF=sF,lF=L({__name:"DropdownMenuSub",props:{defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=Lt(n,"open",t,{passive:n.open===void 0,defaultValue:n.defaultOpen??!1});return ae(),(u,a)=>(D(),k(f(R1),{open:f(r),"onUpdate:open":a[0]||(a[0]=s=>rt(r)?r.value=s:null)},{default:A(()=>[P(u.$slots,"default",{open:f(r)})]),_:3},8,["open"]))}}),cF=lF,dF=L({__name:"DropdownMenuSubContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const r=it(e,t);return ae(),(u,a)=>(D(),k(f(L1),j(f(r),{style:{"--reka-dropdown-menu-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-dropdown-menu-content-available-width":"var(--reka-popper-available-width)","--reka-dropdown-menu-content-available-height":"var(--reka-popper-available-height)","--reka-dropdown-menu-trigger-width":"var(--reka-popper-anchor-width)","--reka-dropdown-menu-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:A(()=>[P(u.$slots,"default")]),_:3},16))}}),fF=dF,pF=L({__name:"DropdownMenuSubTrigger",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(q1),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),hF=pF,mF=L({__name:"DropdownMenuTrigger",props:{disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=z1(),{forwardRef:o,currentElement:r}=ae();return $e(()=>{n.triggerElement=r}),n.triggerId||=sn(void 0,"reka-dropdown-menu-trigger"),(u,a)=>(D(),k(f(wf),{"as-child":""},{default:A(()=>[q(f(we),{id:f(n).triggerId,ref:f(o),type:u.as==="button"?"button":void 0,"as-child":t.asChild,as:u.as,"aria-haspopup":"menu","aria-expanded":f(n).open.value,"aria-controls":f(n).open.value?f(n).contentId:void 0,"data-disabled":u.disabled?"":void 0,disabled:u.disabled,"data-state":f(n).open.value?"open":"closed",onClick:a[0]||(a[0]=async s=>{!u.disabled&&s.button===0&&s.ctrlKey===!1&&(f(n)?.onOpenToggle(),await Oe(),f(n).open.value&&s.preventDefault())}),onKeydown:a[1]||(a[1]=$d(s=>{u.disabled||(["Enter"," "].includes(s.key)&&f(n).onOpenToggle(),s.key==="ArrowDown"&&f(n).onOpenChange(!0),["Enter"," ","ArrowDown"].includes(s.key)&&s.preventDefault())},["enter","space","arrow-down"]))},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["id","type","as-child","as","aria-expanded","aria-controls","data-disabled","disabled","data-state"])]),_:3}))}}),gF=mF,vF=L({__name:"HoverCardArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(Bl),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),yF=vF;const[_f,bF]=lt("HoverCardRoot");var EF=L({__name:"HoverCardRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},openDelay:{type:Number,required:!1,default:700},closeDelay:{type:Number,required:!1,default:300}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,{openDelay:r,closeDelay:u}=mt(n);ae();const a=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0}),s=R(0),i=R(0),c=R(!1),l=R(!1),d=R(!1),p=R();function h(){clearTimeout(i.value),s.value=window.setTimeout(()=>a.value=!0,r.value)}function m(){clearTimeout(s.value),!c.value&&!l.value&&(i.value=window.setTimeout(()=>a.value=!1,u.value))}function g(){a.value=!1}return bF({open:a,onOpenChange(y){a.value=y},onOpen:h,onClose:m,onDismiss:g,hasSelectionRef:c,isPointerDownOnContentRef:l,isPointerInTransitRef:d,triggerElement:p}),(y,E)=>(D(),k(f(cs),null,{default:A(()=>[P(y.$slots,"default",{open:f(a)})]),_:3}))}}),CF=EF;function O0(e){return t=>t.pointerType==="touch"?void 0:e()}function xF(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;n.nextNode();)t.push(n.currentNode);return t}var wF=L({__name:"HoverCardContentImpl",props:{side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=e,o=t,r=ln(n),{forwardRef:u,currentElement:a}=ae(),s=_f(),{isPointerInTransit:i,onPointerExit:c}=Z3(s.triggerElement,a);lk(s.isPointerInTransitRef,i,{direction:"rtl"}),c(()=>{s.onClose()});const l=R(!1);let d;Ze(h=>{if(l.value){const m=document.body;d=m.style.userSelect||m.style.webkitUserSelect,m.style.userSelect="none",m.style.webkitUserSelect="none",h(()=>{m.style.userSelect=d,m.style.webkitUserSelect=d})}});function p(){l.value=!1,s.isPointerDownOnContentRef.value=!1,Oe(()=>{document.getSelection()?.toString()!==""&&(s.hasSelectionRef.value=!0)})}return $e(()=>{a.value&&(document.addEventListener("pointerup",p),xF(a.value).forEach(m=>m.setAttribute("tabindex","-1"))),At(window,"scroll",h=>{h.target?.contains(s.triggerElement.value)&&s.onDismiss()},{capture:!0})}),Ht(()=>{document.removeEventListener("pointerup",p),s.hasSelectionRef.value=!1,s.isPointerDownOnContentRef.value=!1}),(h,m)=>(D(),k(f(Vu),{"as-child":"","disable-outside-pointer-events":!1,onEscapeKeyDown:m[1]||(m[1]=g=>o("escapeKeyDown",g)),onPointerDownOutside:m[2]||(m[2]=g=>o("pointerDownOutside",g)),onFocusOutside:m[3]||(m[3]=On(g=>o("focusOutside",g),["prevent"])),onDismiss:f(s).onDismiss},{default:A(()=>[q(f(Al),j({...f(r),...h.$attrs},{ref:f(u),"data-state":f(s).open.value?"open":"closed",style:{userSelect:l.value?"text":void 0,WebkitUserSelect:l.value?"text":void 0,"--reka-hover-card-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-hover-card-content-available-width":"var(--reka-popper-available-width)","--reka-hover-card-content-available-height":"var(--reka-popper-available-height)","--reka-hover-card-trigger-width":"var(--reka-popper-anchor-width)","--reka-hover-card-trigger-height":"var(--reka-popper-anchor-height)"},onPointerdown:m[0]||(m[0]=g=>{g.currentTarget.contains(g.target)&&(l.value=!0),f(s).hasSelectionRef.value=!1,f(s).isPointerDownOnContentRef.value=!0})}),{default:A(()=>[P(h.$slots,"default")]),_:3},16,["data-state","style"])]),_:3},8,["onDismiss"]))}}),DF=wF,AF=L({__name:"HoverCardContent",props:{forceMount:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const r=it(e,t),{forwardRef:u}=ae(),a=_f();return(s,i)=>(D(),k(f(_n),{present:s.forceMount||f(a).open.value},{default:A(()=>[q(DF,j(f(r),{ref:f(u),onPointerenter:i[0]||(i[0]=c=>f(O0)(f(a).onOpen)(c))}),{default:A(()=>[P(s.$slots,"default")]),_:3},16)]),_:3},8,["present"]))}}),BF=AF,_F=L({__name:"HoverCardPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),kF=_F,SF=L({__name:"HoverCardTrigger",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"a"}},setup(e){const{forwardRef:t,currentElement:n}=ae(),o=_f();o.triggerElement=n;function r(){setTimeout(()=>{!o.isPointerInTransitRef.value&&!o.open.value&&o.onClose()},0)}return(u,a)=>(D(),k(f(ds),{"as-child":"",reference:u.reference},{default:A(()=>[q(f(we),{ref:f(t),"as-child":u.asChild,as:u.as,"data-state":f(o).open.value?"open":"closed","data-grace-area-trigger":"",onPointerenter:a[0]||(a[0]=s=>f(O0)(f(o).onOpen)(s)),onPointerleave:a[1]||(a[1]=s=>f(O0)(r)(s)),onFocus:a[2]||(a[2]=s=>f(o).onOpen()),onBlur:a[3]||(a[3]=s=>f(o).onClose())},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["as-child","as","data-state"])]),_:3},8,["reference"]))}}),TF=SF;function kl(e){return e?"open":"closed"}function U1(e,t){return`${e}-trigger-${t}`}function kf(e,t){return`${e}-content-${t}`}const FF="navigationMenu.linkSelect",Aa="navigationMenu.rootContentDismiss";function I0(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const r=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||r?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function H1(e){const t=dt();return e.some(n=>n===t?!0:(n.focus(),dt()!==t))}function PF(e){return e.forEach(t=>{t.dataset.tabindex=t.getAttribute("tabindex")||"",t.setAttribute("tabindex","-1")}),()=>{e.forEach(t=>{const n=t.dataset.tabindex;t.setAttribute("tabindex",n)})}}function K1(e){return t=>t.pointerType==="mouse"?e(t):void 0}const[Qr,MF]=lt(["NavigationMenuRoot","NavigationMenuSub"],"NavigationMenuContext");var OF=L({__name:"NavigationMenuRoot",props:{modelValue:{type:String,required:!1,default:void 0},defaultValue:{type:String,required:!1},dir:{type:String,required:!1},orientation:{type:String,required:!1,default:"horizontal"},delayDuration:{type:Number,required:!1,default:200},skipDelayDuration:{type:Number,required:!1,default:300},disableClickTrigger:{type:Boolean,required:!1,default:!1},disableHoverTrigger:{type:Boolean,required:!1,default:!1},disablePointerLeaveClose:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"nav"}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,r=Lt(n,"modelValue",t,{defaultValue:n.defaultValue??"",passive:n.modelValue===void 0}),u=R(""),{forwardRef:a,currentElement:s}=ae(),i=R(),c=R(),l=R(),{getItems:d,CollectionSlot:p}=vo({key:"NavigationMenu",isProvider:!0}),{delayDuration:h,skipDelayDuration:m,dir:g,disableClickTrigger:y,disableHoverTrigger:E,unmountOnHide:b}=mt(n),v=ju(g),C=bl(!1,m),w=F(()=>r.value!==""||C.value?150:h.value),B=V3(_=>{typeof _=="string"&&(u.value=r.value,r.value=_)},w);Ze(()=>{if(!r.value)return;const _=d().map(S=>S.ref);l.value=_.find(S=>S.id.includes(r.value))}),At(s,Aa,x),MF({isRootMenu:!0,modelValue:r,previousValue:u,baseId:sn(void 0,"reka-navigation-menu"),disableClickTrigger:y,disableHoverTrigger:E,dir:v,unmountOnHide:b,orientation:n.orientation,rootNavigationMenu:s,indicatorTrack:i,activeTrigger:l,onIndicatorTrackChange:_=>{i.value=_},viewport:c,onViewportChange:_=>{c.value=_},onTriggerEnter:_=>{B(_)},onTriggerLeave:()=>{C.value=!0,B("")},onContentEnter:()=>{B()},onContentLeave:()=>{n.disablePointerLeaveClose||B("")},onItemSelect:_=>{u.value=r.value,r.value=_},onItemDismiss:x});function x(){u.value=r.value,r.value=""}return(_,S)=>(D(),k(f(p),null,{default:A(()=>[q(f(we),{ref:f(a),as:_.as,"as-child":_.asChild,"data-orientation":_.orientation,dir:f(v),"data-reka-navigation-menu":""},{default:A(()=>[P(_.$slots,"default",{modelValue:f(r)})]),_:3},8,["as","as-child","data-orientation","dir"])]),_:3}))}}),IF=OF;const[Sf,RF]=lt("NavigationMenuItem");var LF=L({__name:"NavigationMenuItem",props:{value:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"li"}},setup(e){const t=e;ae();const{getItems:n}=vo({key:"NavigationMenu"}),o=Qr(),r=sn(t.value),u=R(),a=R(),s=kf(o.baseId,r);let i=()=>({});const c=R(!1);async function l(m="start"){const g=document.getElementById(s);if(g){i();const y=I0(g);y.length&&H1(m==="start"?y:y.reverse())}}function d(){const m=document.getElementById(s);if(m){const g=I0(m);g.length&&(i=PF(g))}}RF({value:r,contentId:s,triggerRef:u,focusProxyRef:a,wasEscapeCloseRef:c,onEntryKeyDown:l,onFocusProxyEnter:l,onContentFocusOutside:d,onRootContentClose:d});function p(){o.onItemDismiss(),u.value?.focus()}function h(m){const g=dt();if(m.keyCode===32||m.key==="Enter")if(o.modelValue.value===r){p(),m.preventDefault();return}else{m.target.click(),m.preventDefault();return}const y=n().filter(b=>b.ref.parentElement?.hasAttribute("data-menu-item")).map(b=>b.ref);if(!y.includes(g))return;const E=za(m,g,void 0,{itemsArray:y,loop:!1});E&&E?.focus(),m.preventDefault(),m.stopPropagation()}return(m,g)=>(D(),k(f(we),{"as-child":m.asChild,as:m.as,"data-menu-item":"",onKeydown:$d(h,["up","down","left","right","home","end","space"])},{default:A(()=>[P(m.$slots,"default")]),_:3},8,["as-child","as"]))}}),qF=LF,$F=L({__name:"NavigationMenuContentImpl",props:{disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=e,o=t,{getItems:r}=vo({key:"NavigationMenu"}),{forwardRef:u,currentElement:a}=ae(),s=Qr(),i=Sf(),c=U1(s.baseId,i.value),l=kf(s.baseId,i.value),d=R(null),p=F(()=>{const b=r().map(_=>_.ref.id.split("trigger-")[1]);s.dir.value==="rtl"&&b.reverse();const v=b.indexOf(s.modelValue.value),C=b.indexOf(s.previousValue.value),w=i.value===s.modelValue.value,B=C===b.indexOf(i.value);if(!w&&!B)return d.value;const x=(()=>{if(v!==C){if(w&&C!==-1)return v>C?"from-end":"from-start";if(B&&v!==-1)return v>C?"to-start":"to-end"}return null})();return d.value=x,x});function h(b){if(o("focusOutside",b),o("interactOutside",b),b.detail.originalEvent.target.hasAttribute("data-navigation-menu-trigger")&&b.preventDefault(),!b.defaultPrevented){i.onContentFocusOutside();const C=b.target;s.rootNavigationMenu?.value?.contains(C)&&b.preventDefault()}}function m(b){if(o("pointerDownOutside",b),!b.defaultPrevented){const v=b.target,C=r().some(B=>B.ref.contains(v)),w=s.isRootMenu&&s.viewport.value?.contains(v);(C||w||!s.isRootMenu)&&b.preventDefault()}}Ze(b=>{const v=a.value;if(s.isRootMenu&&v){const C=()=>{s.onItemDismiss(),i.onRootContentClose(),v.contains(dt())&&i.triggerRef.value?.focus()};v.addEventListener(Aa,C),b(()=>v.removeEventListener(Aa,C))}});function g(b){o("escapeKeyDown",b),b.defaultPrevented||(s.onItemDismiss(),i.triggerRef?.value?.focus(),i.wasEscapeCloseRef.value=!0)}function y(b){if(b.target.closest("[data-reka-navigation-menu]")!==s.rootNavigationMenu.value)return;const v=b.altKey||b.ctrlKey||b.metaKey,C=b.key==="Tab"&&!v,w=I0(b.currentTarget);if(C){const x=dt(),_=w.findIndex(H=>H===x),O=b.shiftKey?w.slice(0,_).reverse():w.slice(_+1,w.length);if(H1(O))b.preventDefault();else{i.focusProxyRef.value?.focus();return}}za(b,dt(),void 0,{itemsArray:w,loop:!1,enableIgnoredElement:!0})?.focus()}function E(){const b=new Event(Aa,{bubbles:!0,cancelable:!0});a.value?.dispatchEvent(b)}return(b,v)=>(D(),k(f(Vu),j({id:f(l),ref:f(u),"aria-labelledby":f(c),"data-motion":p.value,"data-state":f(kl)(f(s).modelValue.value===f(i).value),"data-orientation":f(s).orientation},n,{onKeydown:y,onEscapeKeyDown:g,onPointerDownOutside:m,onFocusOutside:h,onDismiss:E}),{default:A(()=>[P(b.$slots,"default")]),_:3},16,["id","aria-labelledby","data-motion","data-state","data-orientation"]))}}),NF=$F,jF=L({inheritAttrs:!1,__name:"NavigationMenuContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=e,o=t,r=it(No(n,"forceMount"),o),{forwardRef:u}=ae(),a=Qr(),s=Sf(),i=F(()=>s.value===a.modelValue.value),c=F(()=>a.viewport.value&&!a.modelValue.value&&a.previousValue.value?a.previousValue.value===s.value:!1);return(l,d)=>(D(),k(os,{to:f(gn)&&f(a).viewport.value?f(a).viewport.value:"body",disabled:f(gn)&&f(a).viewport.value?!f(a).viewport.value:!0},[q(f(_n),{present:l.forceMount||i.value||c.value,"force-mount":!f(a).unmountOnHide.value},{default:A(({present:p})=>[q(NF,j({ref:f(u),"data-state":f(kl)(i.value),style:{pointerEvents:!i.value&&f(a).isRootMenu?"none":void 0}},{...l.$attrs,...f(r)},{hidden:!p,onPointerenter:d[0]||(d[0]=h=>f(a).onContentEnter(f(s).value)),onPointerleave:d[1]||(d[1]=h=>f(K1)(()=>f(a).onContentLeave())(h)),onPointerDownOutside:d[2]||(d[2]=h=>o("pointerDownOutside",h)),onFocusOutside:d[3]||(d[3]=h=>o("focusOutside",h)),onInteractOutside:d[4]||(d[4]=h=>o("interactOutside",h))}),{default:A(()=>[P(l.$slots,"default")]),_:2},1040,["data-state","style","hidden"])]),_:3},8,["present","force-mount"])],8,["to","disabled"]))}}),VF=jF,zF=L({inheritAttrs:!1,__name:"NavigationMenuIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n}=ae(),o=Qr(),r=R(),u=F(()=>o.orientation==="horizontal"),a=F(()=>!!o.modelValue.value),{activeTrigger:s}=o;function i(){s.value&&(r.value={size:u.value?s.value.offsetWidth:s.value.offsetHeight,position:u.value?s.value.offsetLeft:s.value.offsetTop})}return Ze(()=>{o.modelValue.value&&i()}),Ua(s,i),Ua(o.indicatorTrack,i),(c,l)=>f(o).indicatorTrack.value?(D(),k(os,{key:0,to:f(o).indicatorTrack.value},[q(f(_n),{present:c.forceMount||a.value},{default:A(()=>[q(f(we),j({ref:f(n),"aria-hidden":"true","data-state":a.value?"visible":"hidden","data-orientation":f(o).orientation,"as-child":t.asChild,as:c.as,style:{...r.value?{"--reka-navigation-menu-indicator-size":`${r.value.size}px`,"--reka-navigation-menu-indicator-position":`${r.value.position}px`}:{}}},c.$attrs),{default:A(()=>[P(c.$slots,"default")]),_:3},16,["data-state","data-orientation","as-child","as","style"])]),_:3},8,["present"])],8,["to"])):Y("v-if",!0)}}),UF=zF,HF=L({__name:"NavigationMenuLink",props:{active:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"a"}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,{CollectionItem:r}=vo({key:"NavigationMenu"});ae();async function u(a){const s=new CustomEvent(FF,{bubbles:!0,cancelable:!0,detail:{originalEvent:a}});if(o("select",s),!s.defaultPrevented&&!a.metaKey){const i=new CustomEvent(Aa,{bubbles:!0,cancelable:!0});a.target?.dispatchEvent(i)}}return(a,s)=>(D(),k(f(r),null,{default:A(()=>[q(f(we),{as:a.as,"data-active":a.active?"":void 0,"aria-current":a.active?"page":void 0,"as-child":n.asChild,onClick:u},{default:A(()=>[P(a.$slots,"default")]),_:3},8,["as","data-active","aria-current","as-child"])]),_:3}))}}),mc=HF,KF=L({inheritAttrs:!1,__name:"NavigationMenuList",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"ul"}},setup(e){const t=e,n=Qr(),{forwardRef:o,currentElement:r}=ae();return $e(()=>{n.onIndicatorTrackChange(r.value)}),(u,a)=>(D(),k(f(we),{ref:f(o),style:{position:"relative"}},{default:A(()=>[q(f(we),j(u.$attrs,{"as-child":t.asChild,as:u.as,"data-orientation":f(n).orientation}),{default:A(()=>[P(u.$slots,"default")]),_:3},16,["as-child","as","data-orientation"])]),_:3},512))}}),WF=KF;const GF=["aria-owns"];var YF=L({inheritAttrs:!1,__name:"NavigationMenuTrigger",props:{disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=Qr(),o=Sf(),{CollectionItem:r}=vo({key:"NavigationMenu"}),{forwardRef:u,currentElement:a}=ae(),s=R(""),i=R(""),c=bl(!1,300),l=R(!1),d=F(()=>o.value===n.modelValue.value);$e(()=>{o.triggerRef=a,s.value=U1(n.baseId,o.value),i.value=kf(n.baseId,o.value)});function p(){n.disableHoverTrigger.value||(l.value=!1,o.wasEscapeCloseRef.value=!1)}function h(v){if(!n.disableHoverTrigger.value&&v.pointerType==="mouse"){if(t.disabled||l.value||o.wasEscapeCloseRef.value||c.value)return;n.onTriggerEnter(o.value),c.value=!0}}function m(v){if(!n.disableHoverTrigger.value&&v.pointerType==="mouse"){if(t.disabled)return;n.onTriggerLeave(),c.value=!1}}function g(v){(!("pointerType"in v)||v.pointerType==="mouse")&&n.disableClickTrigger.value||c.value||(d.value?n.onItemSelect(""):n.onItemSelect(o.value),l.value=d.value)}function y(v){const w={horizontal:"ArrowDown",vertical:n.dir.value==="rtl"?"ArrowLeft":"ArrowRight"}[n.orientation];d.value&&v.key===w&&(o.onEntryKeyDown(),v.preventDefault(),v.stopPropagation())}function E(v){o.focusProxyRef.value=an(v)}function b(v){const C=document.getElementById(o.contentId),w=v.relatedTarget,B=w===a.value,x=C?.contains(w);(B||!x)&&o.onFocusProxyEnter(B?"start":"end")}return(v,C)=>(D(),re(Ce,null,[q(f(r),null,{default:A(()=>[q(f(we),j({id:s.value,ref:f(u),disabled:v.disabled,"data-disabled":v.disabled?"":void 0,"data-state":f(kl)(d.value),"data-navigation-menu-trigger":"","aria-expanded":d.value,"aria-controls":i.value,"as-child":t.asChild,as:v.as},v.$attrs,{onPointerenter:p,onPointermove:h,onPointerleave:m,onClick:g,onKeydown:y}),{default:A(()=>[P(v.$slots,"default")]),_:3},16,["id","disabled","data-disabled","data-state","aria-expanded","aria-controls","as-child","as"])]),_:3}),d.value?(D(),re(Ce,{key:0},[q(f(Yr),{ref:E,"aria-hidden":"true",tabindex:0,onFocus:b}),f(n).viewport?(D(),re("span",{key:0,"aria-owns":i.value},null,8,GF)):Y("v-if",!0)],64)):Y("v-if",!0)],64))}}),ZF=YF,XF=L({inheritAttrs:!1,__name:"NavigationMenuViewport",props:{forceMount:{type:Boolean,required:!1},align:{type:String,required:!1,default:"center"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=ae(),r=Qr(),{activeTrigger:u,rootNavigationMenu:a,modelValue:s}=r,i=R(),c=R(),l=F(()=>!!r.modelValue.value);ye(o,()=>{r.onViewportChange(o.value)});const d=R();ye([s,l],()=>{Oe(()=>{o.value&&requestAnimationFrame(()=>{const h=o.value?.querySelector("[data-state=open]");d.value=h})})},{immediate:!0});function p(){if(d.value&&u.value&&a.value){const h=document.documentElement.offsetWidth,m=document.documentElement.offsetHeight,g=a.value.getBoundingClientRect(),y=u.value.getBoundingClientRect(),{offsetWidth:E,offsetHeight:b}=d.value,v=y.left-g.left,C=y.top-g.top;let w=null,B=null;switch(t.align){case"start":w=v,B=C;break;case"end":w=v-E+y.width,B=C-b+y.height;break;default:w=v-E/2+y.width/2,B=C-b/2+y.height/2}const x=10;w+g.lefth-x&&(w-=_-h+x,wm-x&&(B-=S-m+x,B{d.value&&(i.value={width:d.value.offsetWidth,height:d.value.offsetHeight},p())}),Ua([globalThis.document?.body,a],()=>{p()}),(h,m)=>(D(),k(f(_n),{present:h.forceMount||l.value,"force-mount":!f(r).unmountOnHide.value,onAfterLeave:m[2]||(m[2]=()=>{i.value=void 0,c.value=void 0})},{default:A(({present:g})=>[q(f(we),j(h.$attrs,{ref:f(n),as:h.as,"as-child":h.asChild,"data-state":f(kl)(l.value),"data-orientation":f(r).orientation,style:{pointerEvents:!l.value&&f(r).isRootMenu?"none":void 0,"--reka-navigation-menu-viewport-width":i.value?`${i.value?.width}px`:void 0,"--reka-navigation-menu-viewport-height":i.value?`${i.value?.height}px`:void 0,"--reka-navigation-menu-viewport-left":c.value?`${c.value?.left}px`:void 0,"--reka-navigation-menu-viewport-top":c.value?`${c.value?.top}px`:void 0},hidden:!g,onPointerenter:m[0]||(m[0]=y=>f(r).onContentEnter(f(r).modelValue.value)),onPointerleave:m[1]||(m[1]=y=>f(K1)(()=>f(r).onContentLeave())(y))}),{default:A(()=>[P(h.$slots,"default")]),_:2},1040,["as","as-child","data-state","data-orientation","style","hidden"])]),_:3},8,["present","force-mount"]))}}),JF=XF;const Wa=100,[QF,eP]=lt("ProgressRoot"),Ri=e=>typeof e=="number";function tP(e,t){return yl(e)||Ri(e)&&!Number.isNaN(e)&&e<=t&&e>=0?e:(console.error(`Invalid prop \`value\` of value \`${e}\` supplied to \`ProgressRoot\`. The \`value\` prop must be: + - a positive number + - less than the value passed to \`max\` (or ${Wa} if no \`max\` prop is set) + - \`null\` or \`undefined\` if the progress is indeterminate. + +Defaulting to \`null\`.`),null)}function nP(e){return Ri(e)&&!Number.isNaN(e)&&e>0?e:(console.error(`Invalid prop \`max\` of value \`${e}\` supplied to \`ProgressRoot\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Wa}\`.`),Wa)}var oP=L({__name:"ProgressRoot",props:{modelValue:{type:[Number,null],required:!1},max:{type:Number,required:!1,default:Wa},getValueLabel:{type:Function,required:!1,default:(e,t)=>Ri(e)?`${Math.round(e/t*Wa)}%`:void 0},getValueText:{type:Function,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue","update:max"],setup(e,{emit:t}){const n=e,o=t;ae();const r=Lt(n,"modelValue",o,{passive:n.modelValue===void 0}),u=Lt(n,"max",o,{passive:n.max===void 0});ye(()=>r.value,async s=>{const i=tP(s,n.max);i!==s&&(await Oe(),r.value=i)},{immediate:!0}),ye(()=>n.max,s=>{const i=nP(n.max);i!==s&&(u.value=i)},{immediate:!0});const a=F(()=>yl(r.value)?"indeterminate":r.value===u.value?"complete":"loading");return eP({modelValue:r,max:u,progressState:a}),(s,i)=>(D(),k(f(we),{"as-child":s.asChild,as:s.as,"aria-valuemax":f(u),"aria-valuemin":0,"aria-valuenow":Ri(f(r))?f(r):void 0,"aria-valuetext":s.getValueText?.(f(r),f(u)),"aria-label":s.getValueLabel(f(r),f(u)),role:"progressbar","data-state":a.value,"data-value":f(r)??void 0,"data-max":f(u)},{default:A(()=>[P(s.$slots,"default",{modelValue:f(r)})]),_:3},8,["as-child","as","aria-valuemax","aria-valuenow","aria-valuetext","aria-label","data-state","data-value","data-max"]))}}),rP=oP,uP=L({__name:"ProgressIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=QF();return ae(),(o,r)=>(D(),k(f(we),j(t,{"data-state":f(n).progressState.value,"data-value":f(n).modelValue?.value??void 0,"data-max":f(n).max.value}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["data-state","data-value","data-max"]))}}),aP=uP,sP=L({__name:"BaseSeparator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=["horizontal","vertical"];function o(s){return n.includes(s)}const r=F(()=>o(t.orientation)?t.orientation:"horizontal"),u=F(()=>r.value==="vertical"?t.orientation:void 0),a=F(()=>t.decorative?{role:"none"}:{"aria-orientation":u.value,role:"separator"});return(s,i)=>(D(),k(f(we),j({as:s.as,"as-child":s.asChild,"data-orientation":r.value},a.value),{default:A(()=>[P(s.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),iP=sP,lP=L({__name:"Separator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(iP,me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),cP=lP,dP=L({__name:"ToastAnnounceExclude",props:{altText:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){return(t,n)=>(D(),k(f(we),{as:t.as,"as-child":t.asChild,"data-reka-toast-announce-exclude":"","data-reka-toast-announce-alt":t.altText||void 0},{default:A(()=>[P(t.$slots,"default")]),_:3},8,["as","as-child","data-reka-toast-announce-alt"]))}}),W1=dP;const[Sl,fP]=lt("ToastProvider");var pP=L({inheritAttrs:!1,__name:"ToastProvider",props:{label:{type:String,required:!1,default:"Notification"},duration:{type:Number,required:!1,default:5e3},disableSwipe:{type:Boolean,required:!1},swipeDirection:{type:String,required:!1,default:"right"},swipeThreshold:{type:Number,required:!1,default:50}},setup(e){const t=e,{label:n,duration:o,disableSwipe:r,swipeDirection:u,swipeThreshold:a}=mt(t);vo({isProvider:!0});const s=R(),i=R(0),c=R(!1),l=R(!1);if(t.label&&typeof t.label=="string"&&!t.label.trim()){const d="Invalid prop `label` supplied to `ToastProvider`. Expected non-empty `string`.";throw new Error(d)}return fP({label:n,duration:o,disableSwipe:r,swipeDirection:u,swipeThreshold:a,toastCount:i,viewport:s,onViewportChange(d){s.value=d},onToastAdd(){i.value++},onToastRemove(){i.value--},isFocusedToastEscapeKeyDownRef:c,isClosePausedRef:l}),(d,p)=>P(d.$slots,"default")}}),hP=pP,mP=L({__name:"ToastAnnounce",setup(e){const t=Sl(),n=dk(1e3),o=R(!1);return W3(()=>{o.value=!0}),(r,u)=>f(n)||o.value?(D(),k(f(Yr),{key:0,feature:"fully-hidden"},{default:A(()=>[Ke(Fe(f(t).label.value)+" ",1),P(r.$slots,"default")]),_:3})):Y("v-if",!0)}}),gP=mP;const vP="toast.swipeStart",yP="toast.swipeMove",bP="toast.swipeCancel",EP="toast.swipeEnd",R0="toast.viewportPause",L0="toast.viewportResume";function js(e,t,n){const o=n.originalEvent.currentTarget,r=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(r)}function b4(e,t,n=0){const o=Math.abs(e.x),r=Math.abs(e.y),u=o>r;return t==="left"||t==="right"?u&&o>n:!u&&r>n}function CP(e){return e.nodeType===e.ELEMENT_NODE}function G1(e){const t=[];return Array.from(e.childNodes).forEach(o=>{if(o.nodeType===o.TEXT_NODE&&o.textContent&&t.push(o.textContent),CP(o)){const r=o.ariaHidden||o.hidden||o.style.display==="none",u=o.dataset.rekaToastAnnounceExclude==="";if(!r)if(u){const a=o.dataset.rekaToastAnnounceAlt;a&&t.push(a)}else t.push(...G1(o))}}),t}const[xP,wP]=lt("ToastRoot");var DP=L({inheritAttrs:!1,__name:"ToastRootImpl",props:{type:{type:String,required:!1},open:{type:Boolean,required:!1,default:!1},duration:{type:Number,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"li"}},emits:["close","escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r,currentElement:u}=ae(),{CollectionItem:a}=vo(),s=Sl(),i=R(null),c=R(null),l=F(()=>typeof n.duration=="number"?n.duration:s.duration.value),d=R(0),p=R(l.value),h=R(0),m=R(l.value),g=W3(()=>{const v=new Date().getTime()-d.value;m.value=Math.max(p.value-v,0)},{fpsLimit:60});function y(v){v<=0||v===Number.POSITIVE_INFINITY||gn&&(window.clearTimeout(h.value),d.value=new Date().getTime(),h.value=window.setTimeout(E,v))}function E(v){const C=v?.pointerType==="";u.value?.contains(dt())&&C&&s.viewport.value?.focus(),C&&(s.isClosePausedRef.value=!1),o("close")}const b=F(()=>u.value?G1(u.value):null);if(n.type&&!["foreground","background"].includes(n.type)){const v="Invalid prop `type` supplied to `Toast`. Expected `foreground | background`.";throw new Error(v)}return Ze(v=>{const C=s.viewport.value;if(C){const w=()=>{y(p.value),g.resume(),o("resume")},B=()=>{const x=new Date().getTime()-d.value;p.value=p.value-x,window.clearTimeout(h.value),g.pause(),o("pause")};return C.addEventListener(R0,B),C.addEventListener(L0,w),()=>{C.removeEventListener(R0,B),C.removeEventListener(L0,w)}}}),ye(()=>[n.open,l.value],()=>{p.value=l.value,n.open&&!s.isClosePausedRef.value&&y(l.value)},{immediate:!0}),sf("Escape",v=>{o("escapeKeyDown",v),v.defaultPrevented||(s.isFocusedToastEscapeKeyDownRef.value=!0,E())}),$e(()=>{s.onToastAdd()}),Ht(()=>{s.onToastRemove()}),wP({onClose:E}),(v,C)=>(D(),re(Ce,null,[b.value?(D(),k(gP,{key:0,role:"alert","aria-live":v.type==="foreground"?"assertive":"polite"},{default:A(()=>[Ke(Fe(b.value),1)]),_:1},8,["aria-live"])):Y("v-if",!0),f(s).viewport.value?(D(),k(os,{key:1,to:f(s).viewport.value},[q(f(a),null,{default:A(()=>[q(f(we),j({ref:f(r),tabindex:"0"},v.$attrs,{as:v.as,"as-child":v.asChild,"data-state":v.open?"open":"closed","data-swipe-direction":f(s).swipeDirection.value,style:f(s).disableSwipe.value?void 0:{userSelect:"none",touchAction:"none"},onPointerdown:C[0]||(C[0]=On(w=>{f(s).disableSwipe.value||(i.value={x:w.clientX,y:w.clientY})},["left"])),onPointermove:C[1]||(C[1]=w=>{if(f(s).disableSwipe.value||!i.value)return;const B=w.clientX-i.value.x,x=w.clientY-i.value.y,_=!!c.value,S=["left","right"].includes(f(s).swipeDirection.value),O=["left","up"].includes(f(s).swipeDirection.value)?Math.min:Math.max,H=S?O(0,B):0,N=S?0:O(0,x),J=w.pointerType==="touch"?10:2,G={x:H,y:N},$={originalEvent:w,delta:G};_?(c.value=G,f(js)(f(yP),I=>o("swipeMove",I),$)):f(b4)(G,f(s).swipeDirection.value,J)?(c.value=G,f(js)(f(vP),I=>o("swipeStart",I),$),w.target.setPointerCapture(w.pointerId)):(Math.abs(B)>J||Math.abs(x)>J)&&(i.value=null)}),onPointerup:C[2]||(C[2]=w=>{if(f(s).disableSwipe.value)return;const B=c.value,x=w.target;if(x.hasPointerCapture(w.pointerId)&&x.releasePointerCapture(w.pointerId),c.value=null,i.value=null,B){const _=w.currentTarget,S={originalEvent:w,delta:B};f(b4)(B,f(s).swipeDirection.value,f(s).swipeThreshold.value)?f(js)(f(EP),O=>o("swipeEnd",O),S):f(js)(f(bP),O=>o("swipeCancel",O),S),_?.addEventListener("click",O=>O.preventDefault(),{once:!0})}})}),{default:A(()=>[P(v.$slots,"default",{remaining:m.value,duration:l.value})]),_:3},16,["as","as-child","data-state","data-swipe-direction","style"])]),_:3})],8,["to"])):Y("v-if",!0)],64))}}),AP=DP,BP=L({__name:"ToastClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=xP(),{forwardRef:o}=ae();return(r,u)=>(D(),k(W1,{"as-child":""},{default:A(()=>[q(f(we),j(t,{ref:f(o),type:r.as==="button"?"button":void 0,onClick:f(n).onClose}),{default:A(()=>[P(r.$slots,"default")]),_:3},16,["type","onClick"])]),_:3}))}}),Y1=BP,_P=L({__name:"ToastAction",props:{altText:{type:String,required:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){if(!e.altText)throw new Error("Missing prop `altText` expected on `ToastAction`");const{forwardRef:n}=ae();return(o,r)=>o.altText?(D(),k(W1,{key:0,"alt-text":o.altText,"as-child":""},{default:A(()=>[q(Y1,{ref:f(n),as:o.as,"as-child":o.asChild},{default:A(()=>[P(o.$slots,"default")]),_:3},8,["as","as-child"])]),_:3},8,["alt-text"])):Y("v-if",!0)}}),E4=_P,kP=L({__name:"ToastDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(we),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),SP=kP,TP=L({__name:"ToastPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),FP=TP,PP=L({__name:"ToastRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!0},forceMount:{type:Boolean,required:!1},type:{type:String,required:!1,default:"foreground"},open:{type:Boolean,required:!1,default:void 0},duration:{type:Number,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"li"}},emits:["escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd","update:open"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r}=ae(),u=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0});return(a,s)=>(D(),k(f(_n),{present:a.forceMount||f(u)},{default:A(()=>[q(AP,j({ref:f(r),open:f(u),type:a.type,as:a.as,"as-child":a.asChild,duration:a.duration},a.$attrs,{onClose:s[0]||(s[0]=i=>u.value=!1),onPause:s[1]||(s[1]=i=>o("pause")),onResume:s[2]||(s[2]=i=>o("resume")),onEscapeKeyDown:s[3]||(s[3]=i=>o("escapeKeyDown",i)),onSwipeStart:s[4]||(s[4]=i=>{o("swipeStart",i),i.defaultPrevented||i.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:s[5]||(s[5]=i=>{if(o("swipeMove",i),!i.defaultPrevented){const{x:c,y:l}=i.detail.delta,d=i.currentTarget;d.setAttribute("data-swipe","move"),d.style.setProperty("--reka-toast-swipe-move-x",`${c}px`),d.style.setProperty("--reka-toast-swipe-move-y",`${l}px`)}}),onSwipeCancel:s[6]||(s[6]=i=>{if(o("swipeCancel",i),!i.defaultPrevented){const c=i.currentTarget;c.setAttribute("data-swipe","cancel"),c.style.removeProperty("--reka-toast-swipe-move-x"),c.style.removeProperty("--reka-toast-swipe-move-y"),c.style.removeProperty("--reka-toast-swipe-end-x"),c.style.removeProperty("--reka-toast-swipe-end-y")}}),onSwipeEnd:s[7]||(s[7]=i=>{if(o("swipeEnd",i),!i.defaultPrevented){const{x:c,y:l}=i.detail.delta,d=i.currentTarget;d.setAttribute("data-swipe","end"),d.style.removeProperty("--reka-toast-swipe-move-x"),d.style.removeProperty("--reka-toast-swipe-move-y"),d.style.setProperty("--reka-toast-swipe-end-x",`${c}px`),d.style.setProperty("--reka-toast-swipe-end-y",`${l}px`),u.value=!1}})}),{default:A(({remaining:i,duration:c})=>[P(a.$slots,"default",{remaining:i,duration:c,open:f(u)})]),_:3},16,["open","type","as","as-child","duration"])]),_:3},8,["present"]))}}),MP=PP,OP=L({__name:"ToastTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(we),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),IP=OP,RP=L({__name:"FocusProxy",emits:["focusFromOutsideViewport"],setup(e,{emit:t}){const n=t,o=Sl();return(r,u)=>(D(),k(f(Yr),{tabindex:"0",style:{position:"fixed"},onFocus:u[0]||(u[0]=a=>{const s=a.relatedTarget;!f(o).viewport.value?.contains(s)&&n("focusFromOutsideViewport")})},{default:A(()=>[P(r.$slots,"default")]),_:3}))}}),C4=RP,LP=L({inheritAttrs:!1,__name:"ToastViewport",props:{hotkey:{type:Array,required:!1,default:()=>["F8"]},label:{type:[String,Function],required:!1,default:"Notifications ({hotkey})"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"ol"}},setup(e){const t=e,{hotkey:n,label:o}=mt(t),{forwardRef:r,currentElement:u}=ae(),{CollectionSlot:a,getItems:s}=vo(),i=Sl(),c=F(()=>i.toastCount.value>0),l=R(),d=R(),p=F(()=>n.value.join("+").replace(/Key/g,"").replace(/Digit/g,""));sf(n.value,()=>{u.value.focus()}),$e(()=>{i.onViewportChange(u.value)}),Ze(m=>{const g=u.value;if(c.value&&g){const y=()=>{if(!i.isClosePausedRef.value){const w=new CustomEvent(R0);g.dispatchEvent(w),i.isClosePausedRef.value=!0}},E=()=>{if(i.isClosePausedRef.value){const w=new CustomEvent(L0);g.dispatchEvent(w),i.isClosePausedRef.value=!1}},b=w=>{!g.contains(w.relatedTarget)&&E()},v=()=>{g.contains(dt())||E()},C=w=>{const B=w.altKey||w.ctrlKey||w.metaKey;if(w.key==="Tab"&&!B){const _=dt(),S=w.shiftKey;if(w.target===g&&S){l.value?.focus();return}const N=h({tabbingDirection:S?"backwards":"forwards"}),J=N.findIndex(G=>G===_);si(N.slice(J+1))?w.preventDefault():S?l.value?.focus():d.value?.focus()}};g.addEventListener("focusin",y),g.addEventListener("focusout",b),g.addEventListener("pointermove",y),g.addEventListener("pointerleave",v),g.addEventListener("keydown",C),window.addEventListener("blur",y),window.addEventListener("focus",E),m(()=>{g.removeEventListener("focusin",y),g.removeEventListener("focusout",b),g.removeEventListener("pointermove",y),g.removeEventListener("pointerleave",v),g.removeEventListener("keydown",C),window.removeEventListener("blur",y),window.removeEventListener("focus",E)})}});function h({tabbingDirection:m}){const y=s().map(E=>E.ref).map(E=>{const b=[E,...ff(E)];return m==="forwards"?b:b.reverse()});return(m==="forwards"?y.reverse():y).flat()}return(m,g)=>(D(),k(f(p7),{role:"region","aria-label":typeof f(o)=="string"?f(o).replace("{hotkey}",p.value):f(o)(p.value),tabindex:"-1",style:mn({pointerEvents:c.value?void 0:"none"})},{default:A(()=>[c.value?(D(),k(C4,{key:0,ref:y=>{l.value=f(an)(y)},onFocusFromOutsideViewport:g[0]||(g[0]=()=>{const y=h({tabbingDirection:"forwards"});f(si)(y)})},null,512)):Y("v-if",!0),q(f(a),null,{default:A(()=>[q(f(we),j({ref:f(r),tabindex:"-1",as:m.as,"as-child":m.asChild},m.$attrs),{default:A(()=>[P(m.$slots,"default")]),_:3},16,["as","as-child"])]),_:3}),c.value?(D(),k(C4,{key:1,ref:y=>{d.value=f(an)(y)},onFocusFromOutsideViewport:g[1]||(g[1]=()=>{const y=h({tabbingDirection:"backwards"});f(si)(y)})},null,512)):Y("v-if",!0)]),_:3},8,["aria-label","style"]))}}),qP=LP,$P=L({__name:"TooltipArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return ae(),(n,o)=>(D(),k(f(Bl),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),NP=$P;const[hs,jP]=lt("TooltipProvider");var VP=L({inheritAttrs:!1,__name:"TooltipProvider",props:{delayDuration:{type:Number,required:!1,default:700},skipDelayDuration:{type:Number,required:!1,default:300},disableHoverableContent:{type:Boolean,required:!1,default:!1},disableClosingTrigger:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:!1},content:{type:Object,required:!1}},setup(e){const t=e,{delayDuration:n,skipDelayDuration:o,disableHoverableContent:r,disableClosingTrigger:u,ignoreNonKeyboardFocus:a,disabled:s,content:i}=mt(t);ae();const c=R(!0),l=R(!1),{start:d,stop:p}=El(()=>{c.value=!0},o,{immediate:!1});return jP({isOpenDelayed:c,delayDuration:n,onOpen(){p(),c.value=!1},onClose(){d()},isPointerInTransitRef:l,disableHoverableContent:r,disableClosingTrigger:u,disabled:s,ignoreNonKeyboardFocus:a,content:i}),(h,m)=>P(h.$slots,"default")}}),zP=VP;const Z1="tooltip.open",[Tl,UP]=lt("TooltipRoot");var HP=L({__name:"TooltipRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},delayDuration:{type:Number,required:!1,default:void 0},disableHoverableContent:{type:Boolean,required:!1,default:void 0},disableClosingTrigger:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1,default:void 0},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t;ae();const r=hs(),u=F(()=>n.disableHoverableContent??r.disableHoverableContent.value),a=F(()=>n.disableClosingTrigger??r.disableClosingTrigger.value),s=F(()=>n.disabled??r.disabled.value),i=F(()=>n.delayDuration??r.delayDuration.value),c=F(()=>n.ignoreNonKeyboardFocus??r.ignoreNonKeyboardFocus.value),l=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0});ye(l,v=>{r.onClose&&(v?(r.onOpen(),document.dispatchEvent(new CustomEvent(Z1))):r.onClose())});const d=R(!1),p=R(),h=F(()=>l.value?d.value?"delayed-open":"instant-open":"closed"),{start:m,stop:g}=El(()=>{d.value=!0,l.value=!0},i,{immediate:!1});function y(){g(),d.value=!1,l.value=!0}function E(){g(),l.value=!1}function b(){m()}return UP({contentId:"",open:l,stateAttribute:h,trigger:p,onTriggerChange(v){p.value=v},onTriggerEnter(){r.isOpenDelayed.value?b():y()},onTriggerLeave(){u.value?E():g()},onOpen:y,onClose:E,disableHoverableContent:u,disableClosingTrigger:a,disabled:s,ignoreNonKeyboardFocus:c}),(v,C)=>(D(),k(f(cs),null,{default:A(()=>[P(v.$slots,"default",{open:f(l)})]),_:3}))}}),KP=HP,WP=L({__name:"TooltipContentImpl",props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1,default:void 0},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1,default:void 0},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1,default:void 0},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,r=Tl(),u=hs(),{forwardRef:a,currentElement:s}=ae(),i=F(()=>n.ariaLabel||s.value?.textContent),c=F(()=>{const{ariaLabel:l,...d}=n;return wt(d,u.content.value??{},{side:"top",sideOffset:0,align:"center",avoidCollisions:!0,collisionBoundary:[],collisionPadding:0,arrowPadding:0,sticky:"partial",hideWhenDetached:!1})});return $e(()=>{At(window,"scroll",l=>{l.target?.contains(r.trigger.value)&&r.onClose()},{capture:!0}),At(window,Z1,r.onClose)}),(l,d)=>(D(),k(f(Vu),{"as-child":"","disable-outside-pointer-events":!1,onEscapeKeyDown:d[0]||(d[0]=p=>o("escapeKeyDown",p)),onPointerDownOutside:d[1]||(d[1]=p=>{f(r).disableClosingTrigger.value&&f(r).trigger.value?.contains(p.target)&&p.preventDefault(),o("pointerDownOutside",p)}),onFocusOutside:d[2]||(d[2]=On(()=>{},["prevent"])),onDismiss:d[3]||(d[3]=p=>f(r).onClose())},{default:A(()=>[q(f(Al),j({ref:f(a),"data-state":f(r).stateAttribute.value},{...l.$attrs,...c.value},{style:{"--reka-tooltip-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-tooltip-content-available-width":"var(--reka-popper-available-width)","--reka-tooltip-content-available-height":"var(--reka-popper-available-height)","--reka-tooltip-trigger-width":"var(--reka-popper-anchor-width)","--reka-tooltip-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:A(()=>[P(l.$slots,"default"),q(f(Yr),{id:f(r).contentId,role:"tooltip"},{default:A(()=>[Ke(Fe(i.value),1)]),_:1},8,["id"])]),_:3},16,["data-state"])]),_:3}))}}),X1=WP,GP=L({__name:"TooltipContentHoverable",props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},setup(e){const n=ln(e),{forwardRef:o,currentElement:r}=ae(),{trigger:u,onClose:a}=Tl(),s=hs(),{isPointerInTransit:i,onPointerExit:c}=Z3(u,r);return s.isPointerInTransitRef=i,c(()=>{a()}),(l,d)=>(D(),k(X1,j({ref:f(o)},f(n)),{default:A(()=>[P(l.$slots,"default")]),_:3},16))}}),YP=GP,ZP=L({__name:"TooltipContent",props:{forceMount:{type:Boolean,required:!1},ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,r=Tl(),u=it(n,o),{forwardRef:a}=ae();return(s,i)=>(D(),k(f(_n),{present:s.forceMount||f(r).open.value},{default:A(()=>[(D(),k(Rt(f(r).disableHoverableContent.value?X1:YP),j({ref:f(a)},f(u)),{default:A(()=>[P(s.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),XP=ZP,JP=L({__name:"TooltipPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(zu),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),QP=JP,eM=L({__name:"TooltipTrigger",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=Tl(),o=hs();n.contentId||=sn(void 0,"reka-tooltip-content");const{forwardRef:r,currentElement:u}=ae(),a=R(!1),s=R(!1),i=F(()=>n.disabled.value?{}:{click:g,focus:h,pointermove:d,pointerleave:p,pointerdown:l,blur:m});$e(()=>{n.onTriggerChange(u.value)});function c(){setTimeout(()=>{a.value=!1},1)}function l(){n.open&&!n.disableClosingTrigger.value&&n.onClose(),a.value=!0,document.addEventListener("pointerup",c,{once:!0})}function d(y){y.pointerType!=="touch"&&!s.value&&!o.isPointerInTransitRef.value&&(n.onTriggerEnter(),s.value=!0)}function p(){n.onTriggerLeave(),s.value=!1}function h(y){a.value||n.ignoreNonKeyboardFocus.value&&!y.target.matches?.(":focus-visible")||n.onOpen()}function m(){n.onClose()}function g(){n.disableClosingTrigger.value||n.onClose()}return(y,E)=>(D(),k(f(ds),{"as-child":"",reference:y.reference},{default:A(()=>[q(f(we),j({ref:f(r),"aria-describedby":f(n).open.value?f(n).contentId:void 0,"data-state":f(n).stateAttribute.value,as:y.as,"as-child":t.asChild,"data-grace-area-trigger":""},as(i.value)),{default:A(()=>[P(y.$slots,"default")]),_:3},16,["aria-describedby","data-state","as","as-child"])]),_:3},8,["reference"]))}}),tM=eM;function nM(e,t){const n=q0(e),o=q0(t);return J1(n,o)}function J1(e,t){const n=[],o=new Set([...Object.keys(e.props||{}),...Object.keys(t.props||{})]);if(e.props&&t.props)for(const r of o){const u=e.props[r],a=t.props[r];u&&a?n.push(...J1(e.props?.[r],t.props?.[r])):(u||a)&&n.push(new x4((a||u).key,u?"removed":"added",a,u))}return o.size===0&&e.hash!==t.hash&&n.push(new x4((t||e).key,"changed",t,e)),n}function q0(e,t=""){if(e&&typeof e!="object")return new w4(t,e,Si(e));const n={},o=[];for(const r in e)n[r]=q0(e[r],t?`${t}.${r}`:r),o.push(n[r].hash);return new w4(t,e,`{${o.join(":")}}`,n)}class x4{constructor(t,n,o,r){this.key=t,this.type=n,this.newValue=o,this.oldValue=r}toString(){return this.toJSON()}toJSON(){switch(this.type){case"added":return`Added \`${this.key}\``;case"removed":return`Removed \`${this.key}\``;case"changed":return`Changed \`${this.key}\` from \`${this.oldValue?.toString()||"-"}\` to \`${this.newValue.toString()}\``}}}class w4{constructor(t,n,o,r){this.key=t,this.value=n,this.hash=o,this.props=r}toString(){return this.props?`{${Object.keys(this.props).join(",")}}`:JSON.stringify(this.value)}toJSON(){const t=this.key||".";return this.props?`${t}({${Object.keys(this.props).join(",")}})`:`${t}(${this.value})`}}function Q1(e,t,n=0){const o={[t?.labelAttribute||"title"]:"label",path:"to"},r=Object.keys(e).reduce((a,s)=>{if(e[s]){const i=o[s]||s;a[i]=e[s]}return a},{});return(typeof t?.deep>"u"||nQ1(a,t,n+1)):r.children=[],r}function ms(e,t){const n={...e};for(const o of t)delete n[o];return n}function jt(e,t,n){typeof t=="string"&&(t=t.split(".").map(r=>{const u=Number(r);return Number.isNaN(u)?r:u}));let o=e;for(const r of t){if(o==null)return n;o=o[r]}return o!==void 0?o:n}function uH(e){const t=Number.parseFloat(e);return Number.isNaN(t)?e:t}function eb(e){return Array.isArray(e[0])}function Li(e,t){return!e&&!t?"":[...Array.isArray(e)?e:[e],t].filter(Boolean)}function $0(e){return e.map(t=>{if(!t.children||typeof t.children=="string")return t.children||"";if(Array.isArray(t.children))return $0(t.children);if(t.children.default)return $0(t.children.default())}).join("")}function oM(e,t){return Object.entries(e).reduce((n,[o,r])=>(n[o]=typeof r=="function"?r({class:t?.[o]}):r,n),{...t||{}})}function D4(e,t){if(e?.startsWith("/")&&!e.startsWith("//")){const n=iy(Vd(t||"/"));if(n!=="/"&&!e.startsWith(n))return cr(n,e)}return e}const[rM]=lt("UTheme","RootContext");function Et(e,t){const{ui:n}=rM({ui:F(()=>({}))});return F(()=>{const o=jt(n.value,e)||{};return wt(t.ui??{},o)})}function uM(){const e=R(!1),t=Pe();function n(u,a,s){const i=[...new Set([s?.title,...u.titles].filter(Boolean))];return{prefix:i?.length?i.join(" > ")+" >":void 0,label:u.id===a.path?a.title:u.title,suffix:u.content.replaceAll("<","<").replaceAll(">",">"),to:u.id,icon:a.icon||s?.icon||(u.level>1?t.ui.icons.hash:t.ui.icons.file),level:u.level}}function o(u,a,s){return u.flatMap(i=>i.children?.length?o(i.children,a,i):a?.filter(c=>c.id===i.path||c.id.startsWith(`${i.path}#`))?.map(c=>n(c,i,s))||[])}function r(u,a){return u?a:a?.filter(s=>s.level===1)}return{open:e,mapFile:n,mapNavigationItems:o,postFilter:r}}const aM=Nu(uM);function sM(e){return(t,n)=>iM(t,n,f(e))}function iM(e,t,n){return jt(n,`messages.${e}`,e).replace(/\{(\w+)\}/g,(r,u)=>`${t?.[u]??`{${u}}`}`)}function lM(e){const t=F(()=>f(e).name),n=F(()=>f(e).code),o=F(()=>f(e).dir);return{lang:t,code:n,dir:o,locale:rt(e)?e:R(e),t:sM(e)}}function be(e){return wt(e,{dir:"ltr"})}const Fu=be({name:"English",code:"en",messages:{alert:{close:"Close"},authForm:{hidePassword:"Hide password",showPassword:"Show password",submit:"Continue"},banner:{close:"Close"},calendar:{nextMonth:"Next month",nextYear:"Next year",prevMonth:"Previous month",prevYear:"Previous year"},carousel:{dots:"Choose slide to display",goto:"Go to slide {slide}",next:"Next",prev:"Prev"},chatPrompt:{placeholder:"Type your message here…"},chatPromptSubmit:{label:"Send prompt"},colorMode:{dark:"Dark",light:"Light",switchToDark:"Switch to dark mode",switchToLight:"Switch to light mode",system:"System"},commandPalette:{back:"Back",close:"Close",noData:"No data",noMatch:"No matching data",placeholder:"Type a command or search…"},contentSearch:{links:"Links",theme:"Theme"},contentSearchButton:{label:"Search…"},contentToc:{title:"On this page"},dropdownMenu:{noMatch:"No matching data",search:"Search…"},dashboardSearch:{theme:"Theme"},dashboardSearchButton:{label:"Search…"},dashboardSidebarCollapse:{collapse:"Collapse sidebar",expand:"Expand sidebar"},dashboardSidebarToggle:{close:"Close sidebar",open:"Open sidebar"},error:{clear:"Back to home"},fileUpload:{removeFile:"Remove {filename}"},header:{close:"Close menu",open:"Open menu"},inputMenu:{create:'Create "{label}"',noData:"No data",noMatch:"No matching data"},inputNumber:{decrement:"Decrement",increment:"Increment"},modal:{close:"Close"},pricingTable:{caption:"Pricing plan comparison"},prose:{codeCollapse:{closeText:"Collapse",name:"code",openText:"Expand"},collapsible:{closeText:"Hide",name:"properties",openText:"Show"},pre:{copy:"Copy code to clipboard"}},chatReasoning:{thinking:"Thinking...",thought:"Thought",thoughtFor:"Thought for {duration}"},sidebar:{close:"Close",toggle:"Toggle"},selectMenu:{create:'Create "{label}"',noData:"No data",noMatch:"No matching data",search:"Search…"},slideover:{close:"Close"},table:{noData:"No data"},toast:{close:"Close"}}}),tb=Symbol.for("nuxt-ui.locale-context"),cM=e=>{const t=e||Ye(Ue(tb,Fu));return lM(F(()=>t.value||Fu))},Vo=Nu(cM);var dM=/\s+/g,fM=e=>typeof e!="string"||!e?e:e.replace(dM," ").trim(),qi=(...e)=>{const t=[],n=o=>{if(!o&&o!==0&&o!==0n)return;if(Array.isArray(o)){for(let u=0,a=o.length;u0?fM(t.join(" ")):void 0},A4=e=>e===!1?"false":e===!0?"true":e===0?"0":e,dn=e=>{if(!e||typeof e!="object")return!0;for(const t in e)return!1;return!0},pM=(e,t)=>{if(e===t)return!0;if(!e||!t)return!1;const n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(let r=0;r{for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)){const o=t[n];n in e?e[n]=qi(e[n],o):e[n]=o}return e},nb=(e,t)=>{for(let n=0;n{const t=[];nb(e,t);const n=[];for(let o=0;o{const n={};for(const o in e){const r=e[o];if(o in t){const u=t[o];Array.isArray(r)||Array.isArray(u)?n[o]=ob(u,r):typeof r=="object"&&typeof u=="object"&&r&&u?n[o]=N0(r,u):n[o]=u+" "+r}else n[o]=r}for(const o in t)o in e||(n[o]=t[o]);return n},mM={twMerge:!0,twMergeConfig:{}};function gM(){let e=null,t={},n=!1;return{get cachedTwMerge(){return e},set cachedTwMerge(o){e=o},get cachedTwMergeConfig(){return t},set cachedTwMergeConfig(o){t=o},get didTwMergeConfigChange(){return n},set didTwMergeConfigChange(o){n=o},reset(){e=null,t={},n=!1}}}var Ao=gM(),vM=e=>{const t=(o,r)=>{const{extend:u=null,slots:a={},variants:s={},compoundVariants:i=[],compoundSlots:c=[],defaultVariants:l={}}=o,d={...mM,...r},p=u?.base?qi(u.base,o?.base):o?.base,h=u?.variants&&!dn(u.variants)?N0(s,u.variants):s,m=u?.defaultVariants&&!dn(u.defaultVariants)?{...u.defaultVariants,...l}:l;!dn(d.twMergeConfig)&&!pM(d.twMergeConfig,Ao.cachedTwMergeConfig)&&(Ao.didTwMergeConfigChange=!0,Ao.cachedTwMergeConfig=d.twMergeConfig);const g=dn(u?.slots),y=dn(a)?{}:{base:qi(o?.base,g&&u?.base),...a},E=g?y:hM({...u?.slots},dn(y)?{base:o?.base}:y),b=dn(u?.compoundVariants)?i:ob(u?.compoundVariants,i),v=w=>{if(dn(h)&&dn(a)&&g)return e(p,w?.class,w?.className)(d);if(b&&!Array.isArray(b))throw new TypeError(`The "compoundVariants" prop must be an array. Received: ${typeof b}`);if(c&&!Array.isArray(c))throw new TypeError(`The "compoundSlots" prop must be an array. Received: ${typeof c}`);const B=(G,$=h,I=null,W=null)=>{const K=$[G];if(!K||dn(K))return null;const de=W?.[G]??w?.[G];if(de===null)return null;const le=A4(de);if(typeof le=="object")return null;const ut=m?.[G],Ve=le??A4(ut);return K[Ve||"false"]},x=()=>{if(!h)return null;const G=Object.keys(h),$=[];for(let I=0;I{if(!h||typeof h!="object")return null;const I=[];for(const W in h){const K=B(W,h,G,$),de=G==="base"&&typeof K=="string"?K:K&&K[G];de&&I.push(de)}return I},S={};for(const G in w){const $=w[G];$!==void 0&&(S[G]=$)}const O=(G,$)=>{const I=typeof w?.[G]=="object"?{[G]:w[G]?.initial}:{};return{...m,...S,...I,...$}},H=(G=[],$)=>{const I=[],W=G.length;for(let K=0;K{const $=H(b,G);if(!Array.isArray($))return $;const I={},W=e;for(let K=0;K<$.length;K++){const de=$[K];if(typeof de=="string")I.base=W(I.base,de)(d);else if(typeof de=="object")for(const le in de)I[le]=W(I[le],de[le])(d)}return I},J=G=>{if(c.length<1)return null;const $={},I=O(null,G);for(let W=0;W{const K=N(W),de=J(W);return $(E[I],_(I,W),K?K[I]:void 0,de?de[I]:void 0,W?.class,W?.className)(d)}}return G}return e(p,x(),H(b),w?.class,w?.className)(d)},C=()=>{if(!(!h||typeof h!="object"))return Object.keys(h)};return v.variantKeys=C(),v.extend=u,v.base=p,v.slots=E,v.variants=h,v.defaultVariants=m,v.compoundSlots=c,v.compoundVariants=b,v};return{tv:t,createTV:o=>(r,u)=>t(r,u?N0(o,u):o)}};const yM=(e,t)=>{const n=new Array(e.length+t.length);for(let o=0;o({classGroupId:e,validator:t}),rb=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),$i="-",B4=[],EM="arbitrary..",CM=e=>{const t=wM(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:a=>{if(a.startsWith("[")&&a.endsWith("]"))return xM(a);const s=a.split($i),i=s[0]===""&&s.length>1?1:0;return ub(s,i,t)},getConflictingClassGroupIds:(a,s)=>{if(s){const i=o[a],c=n[a];return i?c?yM(c,i):i:c||B4}return n[a]||B4}}},ub=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;const r=e[t],u=n.nextPart.get(r);if(u){const c=ub(e,t+1,u);if(c)return c}const a=n.validators;if(a===null)return;const s=t===0?e.join($i):e.slice(t).join($i),i=a.length;for(let c=0;ce.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),n=t.indexOf(":"),o=t.slice(0,n);return o?EM+o:void 0})(),wM=e=>{const{theme:t,classGroups:n}=e;return DM(n,t)},DM=(e,t)=>{const n=rb();for(const o in e){const r=e[o];Tf(r,n,o,t)}return n},Tf=(e,t,n,o)=>{const r=e.length;for(let u=0;u{if(typeof e=="string"){BM(e,t,n);return}if(typeof e=="function"){_M(e,t,n,o);return}kM(e,t,n,o)},BM=(e,t,n)=>{const o=e===""?t:ab(t,e);o.classGroupId=n},_M=(e,t,n,o)=>{if(SM(e)){Tf(e(o),t,n,o);return}t.validators===null&&(t.validators=[]),t.validators.push(bM(n,e))},kM=(e,t,n,o)=>{const r=Object.entries(e),u=r.length;for(let a=0;a{let n=e;const o=t.split($i),r=o.length;for(let u=0;u"isThemeGetter"in e&&e.isThemeGetter===!0,TM=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=Object.create(null),o=Object.create(null);const r=(u,a)=>{n[u]=a,t++,t>e&&(t=0,o=n,n=Object.create(null))};return{get(u){let a=n[u];if(a!==void 0)return a;if((a=o[u])!==void 0)return r(u,a),a},set(u,a){u in n?n[u]=a:r(u,a)}}},j0="!",_4=":",FM=[],k4=(e,t,n,o,r)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:o,isExternal:r}),PM=e=>{const{prefix:t,experimentalParseClassName:n}=e;let o=r=>{const u=[];let a=0,s=0,i=0,c;const l=r.length;for(let g=0;gi?c-i:void 0;return k4(u,h,p,m)};if(t){const r=t+_4,u=o;o=a=>a.startsWith(r)?u(a.slice(r.length)):k4(FM,!1,a,void 0,!0)}if(n){const r=o;o=u=>n({className:u,parseClassName:r})}return o},MM=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((n,o)=>{t.set(n,1e6+o)}),n=>{const o=[];let r=[];for(let u=0;u0&&(r.sort(),o.push(...r),r=[]),o.push(a)):r.push(a)}return r.length>0&&(r.sort(),o.push(...r)),o}},OM=e=>({cache:TM(e.cacheSize),parseClassName:PM(e),sortModifiers:MM(e),...CM(e)}),IM=/\s+/,RM=(e,t)=>{const{parseClassName:n,getClassGroupId:o,getConflictingClassGroupIds:r,sortModifiers:u}=t,a=[],s=e.trim().split(IM);let i="";for(let c=s.length-1;c>=0;c-=1){const l=s[c],{isExternal:d,modifiers:p,hasImportantModifier:h,baseClassName:m,maybePostfixModifierPosition:g}=n(l);if(d){i=l+(i.length>0?" "+i:i);continue}let y=!!g,E=o(y?m.substring(0,g):m);if(!E){if(!y){i=l+(i.length>0?" "+i:i);continue}if(E=o(m),!E){i=l+(i.length>0?" "+i:i);continue}y=!1}const b=p.length===0?"":p.length===1?p[0]:u(p).join(":"),v=h?b+j0:b,C=v+E;if(a.indexOf(C)>-1)continue;a.push(C);const w=r(E,y);for(let B=0;B0?" "+i:i)}return i},LM=(...e)=>{let t=0,n,o,r="";for(;t{if(typeof e=="string")return e;let t,n="";for(let o=0;o{let n,o,r,u;const a=i=>{const c=t.reduce((l,d)=>d(l),e());return n=OM(c),o=n.cache.get,r=n.cache.set,u=s,s(i)},s=i=>{const c=o(i);if(c)return c;const l=RM(i,n);return r(i,l),l};return u=a,(...i)=>u(LM(...i))},qM=[],Mt=e=>{const t=n=>n[e]||qM;return t.isThemeGetter=!0,t},ib=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,lb=/^\((?:(\w[\w-]*):)?(.+)\)$/i,$M=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,NM=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,jM=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,VM=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,zM=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,UM=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Wo=e=>$M.test(e),Ie=e=>!!e&&!Number.isNaN(Number(e)),Go=e=>!!e&&Number.isInteger(Number(e)),gc=e=>e.endsWith("%")&&Ie(e.slice(0,-1)),xo=e=>NM.test(e),cb=()=>!0,HM=e=>jM.test(e)&&!VM.test(e),Ff=()=>!1,KM=e=>zM.test(e),WM=e=>UM.test(e),GM=e=>!pe(e)&&!ve(e),YM=e=>mr(e,pb,Ff),pe=e=>ib.test(e),Dr=e=>mr(e,hb,HM),S4=e=>mr(e,oO,Ie),ZM=e=>mr(e,gb,cb),XM=e=>mr(e,mb,Ff),T4=e=>mr(e,db,Ff),JM=e=>mr(e,fb,WM),Vs=e=>mr(e,vb,KM),ve=e=>lb.test(e),aa=e=>eu(e,hb),QM=e=>eu(e,mb),F4=e=>eu(e,db),eO=e=>eu(e,pb),tO=e=>eu(e,fb),zs=e=>eu(e,vb,!0),nO=e=>eu(e,gb,!0),mr=(e,t,n)=>{const o=ib.exec(e);return o?o[1]?t(o[1]):n(o[2]):!1},eu=(e,t,n=!1)=>{const o=lb.exec(e);return o?o[1]?t(o[1]):n:!1},db=e=>e==="position"||e==="percentage",fb=e=>e==="image"||e==="url",pb=e=>e==="length"||e==="size"||e==="bg-size",hb=e=>e==="length",oO=e=>e==="number",mb=e=>e==="family-name",gb=e=>e==="number"||e==="weight",vb=e=>e==="shadow",z0=()=>{const e=Mt("color"),t=Mt("font"),n=Mt("text"),o=Mt("font-weight"),r=Mt("tracking"),u=Mt("leading"),a=Mt("breakpoint"),s=Mt("container"),i=Mt("spacing"),c=Mt("radius"),l=Mt("shadow"),d=Mt("inset-shadow"),p=Mt("text-shadow"),h=Mt("drop-shadow"),m=Mt("blur"),g=Mt("perspective"),y=Mt("aspect"),E=Mt("ease"),b=Mt("animate"),v=()=>["auto","avoid","all","avoid-page","page","left","right","column"],C=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],w=()=>[...C(),ve,pe],B=()=>["auto","hidden","clip","visible","scroll"],x=()=>["auto","contain","none"],_=()=>[ve,pe,i],S=()=>[Wo,"full","auto",..._()],O=()=>[Go,"none","subgrid",ve,pe],H=()=>["auto",{span:["full",Go,ve,pe]},Go,ve,pe],N=()=>[Go,"auto",ve,pe],J=()=>["auto","min","max","fr",ve,pe],G=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],$=()=>["start","end","center","stretch","center-safe","end-safe"],I=()=>["auto",..._()],W=()=>[Wo,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",..._()],K=()=>[Wo,"screen","full","dvw","lvw","svw","min","max","fit",..._()],de=()=>[Wo,"screen","full","lh","dvh","lvh","svh","min","max","fit",..._()],le=()=>[e,ve,pe],ut=()=>[...C(),F4,T4,{position:[ve,pe]}],Ve=()=>["no-repeat",{repeat:["","x","y","space","round"]}],ht=()=>["auto","cover","contain",eO,YM,{size:[ve,pe]}],Dt=()=>[gc,aa,Dr],Ne=()=>["","none","full",c,ve,pe],ze=()=>["",Ie,aa,Dr],Z=()=>["solid","dashed","dotted","double"],ce=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],se=()=>[Ie,gc,F4,T4],Ee=()=>["","none",m,ve,pe],Te=()=>["none",Ie,ve,pe],Ge=()=>["none",Ie,ve,pe],T=()=>[Ie,ve,pe],M=()=>[Wo,"full",..._()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[xo],breakpoint:[xo],color:[cb],container:[xo],"drop-shadow":[xo],ease:["in","out","in-out"],font:[GM],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[xo],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[xo],shadow:[xo],spacing:["px",Ie],text:[xo],"text-shadow":[xo],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",Wo,pe,ve,y]}],container:["container"],columns:[{columns:[Ie,pe,ve,s]}],"break-after":[{"break-after":v()}],"break-before":[{"break-before":v()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:w()}],overflow:[{overflow:B()}],"overflow-x":[{"overflow-x":B()}],"overflow-y":[{"overflow-y":B()}],overscroll:[{overscroll:x()}],"overscroll-x":[{"overscroll-x":x()}],"overscroll-y":[{"overscroll-y":x()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:S()}],"inset-x":[{"inset-x":S()}],"inset-y":[{"inset-y":S()}],start:[{"inset-s":S(),start:S()}],end:[{"inset-e":S(),end:S()}],"inset-bs":[{"inset-bs":S()}],"inset-be":[{"inset-be":S()}],top:[{top:S()}],right:[{right:S()}],bottom:[{bottom:S()}],left:[{left:S()}],visibility:["visible","invisible","collapse"],z:[{z:[Go,"auto",ve,pe]}],basis:[{basis:[Wo,"full","auto",s,..._()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[Ie,Wo,"auto","initial","none",pe]}],grow:[{grow:["",Ie,ve,pe]}],shrink:[{shrink:["",Ie,ve,pe]}],order:[{order:[Go,"first","last","none",ve,pe]}],"grid-cols":[{"grid-cols":O()}],"col-start-end":[{col:H()}],"col-start":[{"col-start":N()}],"col-end":[{"col-end":N()}],"grid-rows":[{"grid-rows":O()}],"row-start-end":[{row:H()}],"row-start":[{"row-start":N()}],"row-end":[{"row-end":N()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":J()}],"auto-rows":[{"auto-rows":J()}],gap:[{gap:_()}],"gap-x":[{"gap-x":_()}],"gap-y":[{"gap-y":_()}],"justify-content":[{justify:[...G(),"normal"]}],"justify-items":[{"justify-items":[...$(),"normal"]}],"justify-self":[{"justify-self":["auto",...$()]}],"align-content":[{content:["normal",...G()]}],"align-items":[{items:[...$(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...$(),{baseline:["","last"]}]}],"place-content":[{"place-content":G()}],"place-items":[{"place-items":[...$(),"baseline"]}],"place-self":[{"place-self":["auto",...$()]}],p:[{p:_()}],px:[{px:_()}],py:[{py:_()}],ps:[{ps:_()}],pe:[{pe:_()}],pbs:[{pbs:_()}],pbe:[{pbe:_()}],pt:[{pt:_()}],pr:[{pr:_()}],pb:[{pb:_()}],pl:[{pl:_()}],m:[{m:I()}],mx:[{mx:I()}],my:[{my:I()}],ms:[{ms:I()}],me:[{me:I()}],mbs:[{mbs:I()}],mbe:[{mbe:I()}],mt:[{mt:I()}],mr:[{mr:I()}],mb:[{mb:I()}],ml:[{ml:I()}],"space-x":[{"space-x":_()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":_()}],"space-y-reverse":["space-y-reverse"],size:[{size:W()}],"inline-size":[{inline:["auto",...K()]}],"min-inline-size":[{"min-inline":["auto",...K()]}],"max-inline-size":[{"max-inline":["none",...K()]}],"block-size":[{block:["auto",...de()]}],"min-block-size":[{"min-block":["auto",...de()]}],"max-block-size":[{"max-block":["none",...de()]}],w:[{w:[s,"screen",...W()]}],"min-w":[{"min-w":[s,"screen","none",...W()]}],"max-w":[{"max-w":[s,"screen","none","prose",{screen:[a]},...W()]}],h:[{h:["screen","lh",...W()]}],"min-h":[{"min-h":["screen","lh","none",...W()]}],"max-h":[{"max-h":["screen","lh",...W()]}],"font-size":[{text:["base",n,aa,Dr]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,nO,ZM]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",gc,pe]}],"font-family":[{font:[QM,XM,t]}],"font-features":[{"font-features":[pe]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[r,ve,pe]}],"line-clamp":[{"line-clamp":[Ie,"none",ve,S4]}],leading:[{leading:[u,..._()]}],"list-image":[{"list-image":["none",ve,pe]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",ve,pe]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:le()}],"text-color":[{text:le()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Z(),"wavy"]}],"text-decoration-thickness":[{decoration:[Ie,"from-font","auto",ve,Dr]}],"text-decoration-color":[{decoration:le()}],"underline-offset":[{"underline-offset":[Ie,"auto",ve,pe]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:_()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ve,pe]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ve,pe]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:ut()}],"bg-repeat":[{bg:Ve()}],"bg-size":[{bg:ht()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Go,ve,pe],radial:["",ve,pe],conic:[Go,ve,pe]},tO,JM]}],"bg-color":[{bg:le()}],"gradient-from-pos":[{from:Dt()}],"gradient-via-pos":[{via:Dt()}],"gradient-to-pos":[{to:Dt()}],"gradient-from":[{from:le()}],"gradient-via":[{via:le()}],"gradient-to":[{to:le()}],rounded:[{rounded:Ne()}],"rounded-s":[{"rounded-s":Ne()}],"rounded-e":[{"rounded-e":Ne()}],"rounded-t":[{"rounded-t":Ne()}],"rounded-r":[{"rounded-r":Ne()}],"rounded-b":[{"rounded-b":Ne()}],"rounded-l":[{"rounded-l":Ne()}],"rounded-ss":[{"rounded-ss":Ne()}],"rounded-se":[{"rounded-se":Ne()}],"rounded-ee":[{"rounded-ee":Ne()}],"rounded-es":[{"rounded-es":Ne()}],"rounded-tl":[{"rounded-tl":Ne()}],"rounded-tr":[{"rounded-tr":Ne()}],"rounded-br":[{"rounded-br":Ne()}],"rounded-bl":[{"rounded-bl":Ne()}],"border-w":[{border:ze()}],"border-w-x":[{"border-x":ze()}],"border-w-y":[{"border-y":ze()}],"border-w-s":[{"border-s":ze()}],"border-w-e":[{"border-e":ze()}],"border-w-bs":[{"border-bs":ze()}],"border-w-be":[{"border-be":ze()}],"border-w-t":[{"border-t":ze()}],"border-w-r":[{"border-r":ze()}],"border-w-b":[{"border-b":ze()}],"border-w-l":[{"border-l":ze()}],"divide-x":[{"divide-x":ze()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":ze()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...Z(),"hidden","none"]}],"divide-style":[{divide:[...Z(),"hidden","none"]}],"border-color":[{border:le()}],"border-color-x":[{"border-x":le()}],"border-color-y":[{"border-y":le()}],"border-color-s":[{"border-s":le()}],"border-color-e":[{"border-e":le()}],"border-color-bs":[{"border-bs":le()}],"border-color-be":[{"border-be":le()}],"border-color-t":[{"border-t":le()}],"border-color-r":[{"border-r":le()}],"border-color-b":[{"border-b":le()}],"border-color-l":[{"border-l":le()}],"divide-color":[{divide:le()}],"outline-style":[{outline:[...Z(),"none","hidden"]}],"outline-offset":[{"outline-offset":[Ie,ve,pe]}],"outline-w":[{outline:["",Ie,aa,Dr]}],"outline-color":[{outline:le()}],shadow:[{shadow:["","none",l,zs,Vs]}],"shadow-color":[{shadow:le()}],"inset-shadow":[{"inset-shadow":["none",d,zs,Vs]}],"inset-shadow-color":[{"inset-shadow":le()}],"ring-w":[{ring:ze()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:le()}],"ring-offset-w":[{"ring-offset":[Ie,Dr]}],"ring-offset-color":[{"ring-offset":le()}],"inset-ring-w":[{"inset-ring":ze()}],"inset-ring-color":[{"inset-ring":le()}],"text-shadow":[{"text-shadow":["none",p,zs,Vs]}],"text-shadow-color":[{"text-shadow":le()}],opacity:[{opacity:[Ie,ve,pe]}],"mix-blend":[{"mix-blend":[...ce(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ce()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[Ie]}],"mask-image-linear-from-pos":[{"mask-linear-from":se()}],"mask-image-linear-to-pos":[{"mask-linear-to":se()}],"mask-image-linear-from-color":[{"mask-linear-from":le()}],"mask-image-linear-to-color":[{"mask-linear-to":le()}],"mask-image-t-from-pos":[{"mask-t-from":se()}],"mask-image-t-to-pos":[{"mask-t-to":se()}],"mask-image-t-from-color":[{"mask-t-from":le()}],"mask-image-t-to-color":[{"mask-t-to":le()}],"mask-image-r-from-pos":[{"mask-r-from":se()}],"mask-image-r-to-pos":[{"mask-r-to":se()}],"mask-image-r-from-color":[{"mask-r-from":le()}],"mask-image-r-to-color":[{"mask-r-to":le()}],"mask-image-b-from-pos":[{"mask-b-from":se()}],"mask-image-b-to-pos":[{"mask-b-to":se()}],"mask-image-b-from-color":[{"mask-b-from":le()}],"mask-image-b-to-color":[{"mask-b-to":le()}],"mask-image-l-from-pos":[{"mask-l-from":se()}],"mask-image-l-to-pos":[{"mask-l-to":se()}],"mask-image-l-from-color":[{"mask-l-from":le()}],"mask-image-l-to-color":[{"mask-l-to":le()}],"mask-image-x-from-pos":[{"mask-x-from":se()}],"mask-image-x-to-pos":[{"mask-x-to":se()}],"mask-image-x-from-color":[{"mask-x-from":le()}],"mask-image-x-to-color":[{"mask-x-to":le()}],"mask-image-y-from-pos":[{"mask-y-from":se()}],"mask-image-y-to-pos":[{"mask-y-to":se()}],"mask-image-y-from-color":[{"mask-y-from":le()}],"mask-image-y-to-color":[{"mask-y-to":le()}],"mask-image-radial":[{"mask-radial":[ve,pe]}],"mask-image-radial-from-pos":[{"mask-radial-from":se()}],"mask-image-radial-to-pos":[{"mask-radial-to":se()}],"mask-image-radial-from-color":[{"mask-radial-from":le()}],"mask-image-radial-to-color":[{"mask-radial-to":le()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":C()}],"mask-image-conic-pos":[{"mask-conic":[Ie]}],"mask-image-conic-from-pos":[{"mask-conic-from":se()}],"mask-image-conic-to-pos":[{"mask-conic-to":se()}],"mask-image-conic-from-color":[{"mask-conic-from":le()}],"mask-image-conic-to-color":[{"mask-conic-to":le()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:ut()}],"mask-repeat":[{mask:Ve()}],"mask-size":[{mask:ht()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",ve,pe]}],filter:[{filter:["","none",ve,pe]}],blur:[{blur:Ee()}],brightness:[{brightness:[Ie,ve,pe]}],contrast:[{contrast:[Ie,ve,pe]}],"drop-shadow":[{"drop-shadow":["","none",h,zs,Vs]}],"drop-shadow-color":[{"drop-shadow":le()}],grayscale:[{grayscale:["",Ie,ve,pe]}],"hue-rotate":[{"hue-rotate":[Ie,ve,pe]}],invert:[{invert:["",Ie,ve,pe]}],saturate:[{saturate:[Ie,ve,pe]}],sepia:[{sepia:["",Ie,ve,pe]}],"backdrop-filter":[{"backdrop-filter":["","none",ve,pe]}],"backdrop-blur":[{"backdrop-blur":Ee()}],"backdrop-brightness":[{"backdrop-brightness":[Ie,ve,pe]}],"backdrop-contrast":[{"backdrop-contrast":[Ie,ve,pe]}],"backdrop-grayscale":[{"backdrop-grayscale":["",Ie,ve,pe]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[Ie,ve,pe]}],"backdrop-invert":[{"backdrop-invert":["",Ie,ve,pe]}],"backdrop-opacity":[{"backdrop-opacity":[Ie,ve,pe]}],"backdrop-saturate":[{"backdrop-saturate":[Ie,ve,pe]}],"backdrop-sepia":[{"backdrop-sepia":["",Ie,ve,pe]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":_()}],"border-spacing-x":[{"border-spacing-x":_()}],"border-spacing-y":[{"border-spacing-y":_()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",ve,pe]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[Ie,"initial",ve,pe]}],ease:[{ease:["linear","initial",E,ve,pe]}],delay:[{delay:[Ie,ve,pe]}],animate:[{animate:["none",b,ve,pe]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[g,ve,pe]}],"perspective-origin":[{"perspective-origin":w()}],rotate:[{rotate:Te()}],"rotate-x":[{"rotate-x":Te()}],"rotate-y":[{"rotate-y":Te()}],"rotate-z":[{"rotate-z":Te()}],scale:[{scale:Ge()}],"scale-x":[{"scale-x":Ge()}],"scale-y":[{"scale-y":Ge()}],"scale-z":[{"scale-z":Ge()}],"scale-3d":["scale-3d"],skew:[{skew:T()}],"skew-x":[{"skew-x":T()}],"skew-y":[{"skew-y":T()}],transform:[{transform:[ve,pe,"","none","gpu","cpu"]}],"transform-origin":[{origin:w()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:M()}],"translate-x":[{"translate-x":M()}],"translate-y":[{"translate-y":M()}],"translate-z":[{"translate-z":M()}],"translate-none":["translate-none"],accent:[{accent:le()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:le()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ve,pe]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":_()}],"scroll-mx":[{"scroll-mx":_()}],"scroll-my":[{"scroll-my":_()}],"scroll-ms":[{"scroll-ms":_()}],"scroll-me":[{"scroll-me":_()}],"scroll-mbs":[{"scroll-mbs":_()}],"scroll-mbe":[{"scroll-mbe":_()}],"scroll-mt":[{"scroll-mt":_()}],"scroll-mr":[{"scroll-mr":_()}],"scroll-mb":[{"scroll-mb":_()}],"scroll-ml":[{"scroll-ml":_()}],"scroll-p":[{"scroll-p":_()}],"scroll-px":[{"scroll-px":_()}],"scroll-py":[{"scroll-py":_()}],"scroll-ps":[{"scroll-ps":_()}],"scroll-pe":[{"scroll-pe":_()}],"scroll-pbs":[{"scroll-pbs":_()}],"scroll-pbe":[{"scroll-pbe":_()}],"scroll-pt":[{"scroll-pt":_()}],"scroll-pr":[{"scroll-pr":_()}],"scroll-pb":[{"scroll-pb":_()}],"scroll-pl":[{"scroll-pl":_()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ve,pe]}],fill:[{fill:["none",...le()]}],"stroke-w":[{stroke:[Ie,aa,Dr,S4]}],stroke:[{stroke:["none",...le()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},rO=(e,{cacheSize:t,prefix:n,experimentalParseClassName:o,extend:r={},override:u={}})=>(ma(e,"cacheSize",t),ma(e,"prefix",n),ma(e,"experimentalParseClassName",o),Us(e.theme,u.theme),Us(e.classGroups,u.classGroups),Us(e.conflictingClassGroups,u.conflictingClassGroups),Us(e.conflictingClassGroupModifiers,u.conflictingClassGroupModifiers),ma(e,"orderSensitiveModifiers",u.orderSensitiveModifiers),Hs(e.theme,r.theme),Hs(e.classGroups,r.classGroups),Hs(e.conflictingClassGroups,r.conflictingClassGroups),Hs(e.conflictingClassGroupModifiers,r.conflictingClassGroupModifiers),yb(e,r,"orderSensitiveModifiers"),e),ma=(e,t,n)=>{n!==void 0&&(e[t]=n)},Us=(e,t)=>{if(t)for(const n in t)ma(e,n,t[n])},Hs=(e,t)=>{if(t)for(const n in t)yb(e,t,n)},yb=(e,t,n)=>{const o=t[n];o!==void 0&&(e[n]=e[n]?e[n].concat(o):o)},uO=(e,...t)=>typeof e=="function"?V0(z0,e,...t):V0(()=>rO(z0(),e),...t),aO=V0(z0);var sO=e=>dn(e)?aO:uO({...e,extend:{theme:e.theme,classGroups:e.classGroups,conflictingClassGroupModifiers:e.conflictingClassGroupModifiers,conflictingClassGroups:e.conflictingClassGroups,...e.extend}}),iO=(e,t)=>{const n=qi(e);return!n||!(t?.twMerge??!0)?n:((!Ao.cachedTwMerge||Ao.didTwMergeConfigChange)&&(Ao.didTwMergeConfigChange=!1,Ao.cachedTwMerge=sO(Ao.cachedTwMergeConfig)),Ao.cachedTwMerge(n)||void 0)},lO=(...e)=>t=>iO(e,t),{createTV:cO}=vM(lO);const dO=c3,Se=cO(dO.ui?.tv);function bb(e){const t=Pe(),n=F(()=>ke(e)),o=F(()=>n.value.icon&&n.value.leading||n.value.icon&&!n.value.trailing||n.value.loading&&!n.value.trailing||!!n.value.leadingIcon),r=F(()=>n.value.icon&&n.value.trailing||n.value.loading&&n.value.trailing||!!n.value.trailingIcon),u=F(()=>n.value.loading?n.value.loadingIcon||t.ui.icons.loading:n.value.leadingIcon||n.value.icon),a=F(()=>n.value.loading&&!o.value?n.value.loadingIcon||t.ui.icons.loading:n.value.trailingIcon||n.value.icon);return{isLeading:o,isTrailing:r,leadingIconName:u,trailingIconName:a}}const fO=Symbol("nuxt-ui.field-group");function Eb(e){const t=Ue(fO,void 0);return{orientation:F(()=>t?.value.orientation),size:F(()=>e?.size??t?.value.size)}}const pO=Symbol("nuxt-ui.form-options"),hO=Symbol("nuxt-ui.form-events"),P4=Symbol("nuxt-ui.form-field"),mO=Symbol("nuxt-ui.input-id"),gO=Symbol("nuxt-ui.form-loading");function aH(e,t){const n=Ue(pO,void 0),o=Ue(hO,void 0),r=Ue(P4,void 0),u=Ue(mO,void 0);Pt(P4,void 0),r&&u&&(t?.bind===!1?u.value=void 0:e?.id&&(u.value=e?.id));function a(d,p,h){o&&r&&p&&o.emit({type:d,name:p,eager:h})}function s(){a("blur",r?.value.name)}function i(){a("focus",r?.value.name)}function c(){a("change",r?.value.name)}const l=V3(()=>{a("input",r?.value.name,r?.value.eagerValidation)},r?.value.validateOnInputDelay??n?.value.validateOnInputDelay??0);return{id:F(()=>e?.id??u?.value),name:F(()=>e?.name??r?.value.name),size:F(()=>e?.size??r?.value.size),color:F(()=>r?.value.error?"error":e?.color),highlight:F(()=>r?.value.error?!0:e?.highlight),disabled:F(()=>n?.value.disabled||e?.disabled),emitFormBlur:s,emitFormInput:l,emitFormChange:c,emitFormFocus:i,ariaAttrs:F(()=>{if(!r?.value)return;const d=["error","hint","description","help"].filter(h=>r?.value?.[h]).map(h=>`${r?.value.ariaId}-${h}`)||[],p={"aria-invalid":!!r?.value.error};return d.length>0&&(p["aria-describedby"]=d.join(" ")),p})}}const vO=["active","activeClass","ariaCurrentValue","as","disabled","download","exact","exactActiveClass","exactHash","exactQuery","external","form","formaction","formenctype","formmethod","formnovalidate","formtarget","href","hreflang","inactiveClass","media","noPrefetch","noRel","onClick","ping","prefetch","prefetchOn","prefetchedClass","referrerpolicy","rel","replace","target","title","to","trailingSlash","type","viewTransition"];function xu(e){const t=Object.keys(e),n=t.filter(u=>u.startsWith("aria-")),o=t.filter(u=>u.startsWith("data-")),r=[...vO,...n,...o];return Jt(e,...r)}function yO(e,t){const n=nM(e,t).reduce((u,a)=>(a.type==="added"&&u.add(a.key),u),new Set),o=Object.fromEntries(Object.entries(e).filter(([u])=>!n.has(u))),r=Object.fromEntries(Object.entries(t).filter(([u])=>!n.has(u)));return Ur(o,r)}const bO=Object.freeze({left:0,top:0,width:16,height:16}),Cb=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),Pf=Object.freeze({...bO,...Cb});Object.freeze({...Pf,body:"",hidden:!1});function EO(e){const[t,n,o,r]=e;if(o!==r){const u=Math.max(o,r);return[t-(u-o)/2,n-(u-r)/2,u,u]}return e}const CO=/(-?[0-9.]*[0-9]+[0-9.]*)/g,xO=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function U0(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const o=e.split(CO);if(o===null||!o.length)return e;const r=[];let u=o.shift(),a=xO.test(u);for(;;){if(a){const s=parseFloat(u);isNaN(s)?r.push(u):r.push(Math.ceil(s*t*n)/n)}else r.push(u);if(u=o.shift(),u===void 0)return r.join("");a=!a}}const wO=Object.freeze({width:null,height:null}),DO=Object.freeze({...wO,...Cb});function AO(e,t="defs"){let n="";const o=e.indexOf("<"+t);for(;o>=0;){const r=e.indexOf(">",o),u=e.indexOf("",u);if(a===-1)break;n+=e.slice(r+1,u).trim(),e=e.slice(0,o).trim()+e.slice(a+1)}return{defs:n,content:e}}function BO(e,t){return e?""+e+""+t:t}function _O(e,t,n){const o=AO(e);return BO(o.defs,t+o.content+n)}const kO=e=>e==="unset"||e==="undefined"||e==="none";function SO(e,t){const n={...Pf,...e},o={...DO,...t},r={left:n.left,top:n.top,width:n.width,height:n.height};let u=n.body;[n,o].forEach(g=>{const y=[],E=g.hFlip,b=g.vFlip;let v=g.rotate;E?b?v+=2:(y.push("translate("+(r.width+r.left).toString()+" "+(0-r.top).toString()+")"),y.push("scale(-1 1)"),r.top=r.left=0):b&&(y.push("translate("+(0-r.left).toString()+" "+(r.height+r.top).toString()+")"),y.push("scale(1 -1)"),r.top=r.left=0);let C;switch(v<0&&(v-=Math.floor(v/4)*4),v=v%4,v){case 1:C=r.height/2+r.top,y.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:y.unshift("rotate(180 "+(r.width/2+r.left).toString()+" "+(r.height/2+r.top).toString()+")");break;case 3:C=r.width/2+r.left,y.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}v%2===1&&(r.left!==r.top&&(C=r.left,r.left=r.top,r.top=C),r.width!==r.height&&(C=r.width,r.width=r.height,r.height=C)),y.length&&(u=_O(u,'',""))});const a=o.width,s=o.height,i=r.width,c=r.height;let l,d;a===null?(d=s===null?"1em":s==="auto"?c:s,l=U0(d,i/c)):(l=a==="auto"?i:a,d=s===null?U0(l,c/i):s==="auto"?c:s);const p={},h=(g,y)=>{kO(y)||(p[g]=y.toString())};h("width",l),h("height",d);const m=[r.left,r.top,i,c];return p.viewBox=m.join(" "),{attributes:p,viewBox:m,body:u}}function TO(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function FO(e){return"data:image/svg+xml,"+TO(e)}function PO(e){return'url("'+FO(e)+'")'}function MO(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const o in t)n+=" "+o+'="'+t[o]+'"';return'"+e+""}function OO(e){const t={display:"inline-block",width:"1em",height:"1em"},n=e.varName;switch(e.pseudoSelector&&(t.content="''"),e.mode){case"background":n&&(t["background-image"]="var(--"+n+")"),t["background-repeat"]="no-repeat",t["background-size"]="100% 100%";break;case"mask":t["background-color"]="currentColor",n&&(t["mask-image"]=t["-webkit-mask-image"]="var(--"+n+")"),t["mask-repeat"]=t["-webkit-mask-repeat"]="no-repeat",t["mask-size"]=t["-webkit-mask-size"]="100% 100%";break}return t}function IO(e,t){const n={},o=t.varName,r=SO(e);let u=r.viewBox;u[2]!==u[3]&&(t.forceSquare?u=EO(u):n.width=U0("1em",u[2]/u[3]));const a=PO(MO(r.body.replace(/currentColor/g,t.color||"black"),{viewBox:`${u[0]} ${u[1]} ${u[2]} ${u[3]}`,width:`${u[2]}`,height:`${u[3]}`}));if(o)n["--"+o]=a;else switch(t.mode){case"background":n["background-image"]=a;break;case"mask":n["mask-image"]=n["-webkit-mask-image"]=a;break}return n}const vc={selectorStart:{compressed:"{",compact:" {",expanded:" {"},selectorEnd:{compressed:"}",compact:`; } +`,expanded:`; +} +`},rule:{compressed:"{key}:",compact:" {key}: ",expanded:` + {key}: `}};function RO(e,t="expanded"){const n=[];for(let o=0;o"},"arrow-left-right":{"width":24,"height":24,"body":""},"arrow-right":{"width":24,"height":24,"body":""},"boxes":{"width":24,"height":24,"body":""},"building-2":{"width":24,"height":24,"body":""},"car-front":{"width":24,"height":24,"body":""},"database":{"width":24,"height":24,"body":""},"database-zap":{"width":24,"height":24,"body":""},"flag":{"width":24,"height":24,"body":""},"key-round":{"width":24,"height":24,"body":""},"layers-3":{"width":24,"height":24,"body":"","hidden":true},"map":{"width":24,"height":24,"body":""},"monitor-smartphone":{"width":24,"height":24,"body":""},"network":{"width":24,"height":24,"body":""},"package":{"width":24,"height":24,"body":""},"rocket":{"width":24,"height":24,"body":""},"server":{"width":24,"height":24,"body":""},"server-cog":{"width":24,"height":24,"body":""},"shopping-cart":{"width":24,"height":24,"body":""},"smartphone":{"width":24,"height":24,"body":""},"user-round":{"width":24,"height":24,"body":""},"wallet":{"width":24,"height":24,"body":""},"wrench":{"width":24,"height":24,"body":""}}},{"prefix":"simple-icons","icons":{"github":{"width":24,"height":24,"body":""}}},{"prefix":"custom","icons":{"ai":{"width":20,"height":20,"body":"artificial-intelligence"}}}]');for(const n of t)for(const[o,r]of Object.entries(n.icons))e(n.prefix?n.prefix+":"+o:o,r);M4=!0}async function qO(e,t){if(!e)return null;xb(Va);const n=v0(e);return n||(await aB(e).catch(()=>(console.warn(`[Icon] failed to load icon \`${e}\``),null)),v0(e))}function wb(e){const t=Pe().icon,n=(t.collections||[]).sort((o,r)=>r.length-o.length);return F(()=>{const o=e(),r=o.startsWith(t.cssSelectorPrefix)?o.slice(t.cssSelectorPrefix.length):o,u=t.aliases?.[r]||r;if(!u.includes(":")){const a=n.find(s=>u.startsWith(s+"-"));return a?a+":"+u.slice(a.length+1):u}return u})}function Db(e,t){if(e!==!1)return e===!0||e===null?t:e}let sa;function $O(e){return e.replace(/([^\w-])/g,"\\$1")}function NO(){if(sa)return sa;sa=new Set;const e=n=>{if(n=n.replace(/^:where\((.*)\)$/,"$1").trim(),n.startsWith("."))return n},t=n=>{if(n?.length)for(const o of n){o?.cssRules&&t(o.cssRules);const r=o?.selectorText;if(typeof r=="string"){const u=e(r);u&&sa.add(u)}}};if(typeof document<"u")for(const n of document.styleSheets)try{const o=n.cssRules||n.rules;t(o)}catch{}return sa}const jO=L({name:"NuxtIconCss",props:{name:{type:String,required:!0},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e){const t=Re(),n=Pe().icon,o=F(()=>e.name?n.cssSelectorPrefix+e.name:"");function r(s){if(!s)return;const i=v0(s);if(i)return i;const c=t.payload?.data?.[s];if(c)return Va(s,c),c}const u=F(()=>"."+$O(o.value));function a(s,i=!0){let c=u.value;n.cssWherePseudo&&(c=`:where(${c})`);const l=LO(s,{iconSelector:c,format:"compressed",customise:Db(e.customize,n.customize)});return n.cssLayer&&i?`@layer ${n.cssLayer} { ${l} }`:l}{const s=NO();async function i(c){if(s.has(u.value)||typeof document>"u")return;const l=document.createElement("style");l.textContent=a(c);const d=document.head.querySelector('style, link[rel="stylesheet"]');d?document.head.insertBefore(l,d):document.head.appendChild(l),s.add(u.value)}ye(()=>e.name,()=>{if(s.has(u.value))return;const c=r(e.name);c?i(c):qO(e.name).then(l=>{l&&i(l)}).catch(()=>null)},{immediate:!0})}return()=>qe("span",{class:["iconify",o.value]})}}),VO=L({name:"NuxtIconSvg",props:{name:{type:String,required:!0},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e,{slots:t}){const n=Re(),o=Pe().icon,r=wb(()=>e.name),u="i-"+r.value;if(r.value){const a=n.payload.data[u];a?Va(r.value,a):xb(Va)}return()=>qe(bB,{icon:r.value,ssr:!0,customise:Db(e.customize,o.customize)},t)}}),Ab=L({name:"NuxtIcon",props:{name:{type:String,required:!0},mode:{type:String,required:!1,default:null},size:{type:[Number,String],required:!1,default:null},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e,{slots:t}){const n=Re(),o=Pe().icon,r=wb(()=>e.name),u=F(()=>n.vueApp?.component(r.value)||((e.mode||o.mode)==="svg"?VO:jO)),a=F(()=>{const s=e.size||o.size;return s?{fontSize:Number.isNaN(+s)?s:s+"px"}:null});return()=>qe(u.value,{...o.attrs,name:r.value,class:o.class,style:a.value,customize:e.customize},t)}}),zO=Object.freeze(Object.defineProperty({__proto__:null,default:Ab},Symbol.toStringTag,{value:"Module"})),st={__name:"UIcon",props:{name:{type:null,required:!0},mode:{type:String,required:!1},size:{type:[String,Number],required:!1},customize:{type:[Function,Boolean,null],required:!1}},setup(e){const n=ln(Jt(e,"mode","size","customize"));return(o,r)=>{const u=Ab;return typeof e.name=="string"?(D(),k(u,j({key:0,name:e.name},f(n)),null,16,["name"])):(D(),k(Rt(e.name),{key:1}))}}};async function UO(e,t){return await HO(t).catch(o=>(console.error("Failed to get image meta for "+t,o+""),{width:0,height:0,ratio:0}))}async function HO(e){if(typeof Image>"u")throw new TypeError("Image not supported");return new Promise((t,n)=>{const o=new Image;o.onload=()=>{const r={width:o.width,height:o.height,ratio:o.width/o.height};t(r)},o.onerror=r=>n(r),o.src=e})}function O4(e){return(t=>t!==void 0?e[t]||t:e.missingValue)}function KO(e={}){const t=e.formatter,n=e.keyMap&&typeof e.keyMap!="function"?O4(e.keyMap):e.keyMap,o={};for(const r in e.valueMap){const u=r,a=e.valueMap[u];o[u]=typeof a=="object"?O4(a):a}return r=>{const u=[];for(const a in r){const s=a;if(typeof r[s]>"u")continue;const i=typeof o[s]=="function"?o[s](r[s]):r[s];u.push([n?n(s):s,i])}return t?u.map(a=>t(...a)).join(e.joinWith??"&"):new URLSearchParams(u).toString()}}function WO(e=""){if(e===void 0||!e.length)return[];const t=new Set;for(const n of e.split(" ")){const o=Number.parseInt(n.replace("x",""));o&&t.add(o)}return Array.from(t)}function GO(e){if(e.length===0)throw new Error("`densities` must not be empty, configure to `1` to render regular size only (DPR 1.0)")}function Pu(e=""){if(typeof e=="number")return e;if(typeof e=="string"&&e.replace("px","").match(/^\d+$/g))return Number.parseInt(e,10)}function YO(e){const t={};if(typeof e=="string")for(const n of e.split(/[\s,]+/).filter(o=>o)){const o=n.split(":");o.length!==2?t["1px"]=o[0].trim():t[o[0].trim()]=o[1].trim()}else Object.assign(t,e);return t}function ZO(e){const t={options:e},n=(r,u={})=>Bb(t,r,u),o=((r,u,a)=>n(r,wt({modifiers:u},a)).url);for(const r in e.presets)o[r]=((u,a,s)=>o(u,a,{...e.presets[r],...s}));return o.options=e,o.getImage=n,o.getMeta=((r,u)=>XO(t,r,u)),o.getSizes=((r,u)=>QO(t,r,u)),t.$img=o,o}async function XO(e,t,n){const o=Bb(e,t,{...n});return typeof o.getMeta=="function"?await o.getMeta():await UO(e,o.url)}function Bb(e,t,n){if(t&&typeof t!="string")throw new TypeError(`input must be a string (received ${typeof t}: ${JSON.stringify(t)})`);if(!t||t.startsWith("data:"))return{url:t};const{setup:o,defaults:r}=JO(e,n.provider||e.options.provider),u=o(),a=_b(e,n.preset);if(t=Ln(t)?t:iy(t),!u.supportsAlias){for(const l in e.options.alias)if(t.startsWith(l)){const d=e.options.alias[l];d&&(t=cr(d,t.slice(l.length)))}}if(u.validateDomains&&Ln(t)){const l=cl(t).host;if(!e.options.domains.find(d=>d===l))return{url:t}}const s=wt(n,a,r),i={...s,modifiers:{...s.modifiers,width:s.modifiers?.width?Pu(s.modifiers.width):void 0,height:s.modifiers?.height?Pu(s.modifiers.height):void 0}},c=u.getImage(t,i,e);return c.format||=i.modifiers.format||"",c}function JO(e,t){const n=e.options.providers[t];if(!n)throw new Error("Unknown provider: "+t);return n}function _b(e,t){if(!t)return{};if(!e.options.presets[t])throw new Error("Unknown preset: "+t);return e.options.presets[t]}function QO(e,t,n){const o=_b(e,n.preset),r=wt(n,o),u=Pu(r.modifiers?.width),a=Pu(r.modifiers?.height),s=r.sizes?YO(r.sizes):{},i=r.densities?.trim(),c=i?WO(i):e.options.densities;GO(c);const l=u&&a?a/u:0,d=[],p=[];if(Object.keys(s).length>=1){for(const E in s){const b=I4(E,String(s[E]),a,l,e);if(b!==void 0){d.push({size:b.size,screenMaxWidth:b.screenMaxWidth,media:`(max-width: ${b.screenMaxWidth}px)`});for(const v of c)p.push({width:b._cWidth*v,src:R4(e,t,n,b,v)})}}eI(d)}else for(const E of c){const b=Object.keys(s)[0];let v=b?I4(b,String(s[b]),a,l,e):void 0;v===void 0&&(v={size:"",screenMaxWidth:0,_cWidth:n.modifiers?.width,_cHeight:n.modifiers?.height}),p.push({width:E,src:R4(e,t,n,v,E)})}tI(p);const h=p[p.length-1],m=d.length?d.map(E=>`${E.media?E.media+" ":""}${E.size}`).join(", "):void 0,g=m?"w":"x",y=p.map(E=>`${E.src} ${E.width}${g}`).join(", ");return{sizes:m,srcset:y,src:h?.src}}function I4(e,t,n,o,r){const u=r.options.screens&&r.options.screens[e]||Number.parseInt(e),a=t.endsWith("vw");if(!a&&/^\d+$/.test(t)&&(t=t+"px"),!a&&!t.endsWith("px"))return;let s=Number.parseInt(t);if(!u||!s)return;a&&(s=Math.round(s/100*u));const i=o?Math.round(s*o):n;return{size:t,screenMaxWidth:u,_cWidth:s,_cHeight:i}}function R4(e,t,n,o,r){return e.$img(t,{...n.modifiers,width:o._cWidth?o._cWidth*r:void 0,height:o._cHeight?o._cHeight*r:void 0},n)}function eI(e){e.sort((n,o)=>n.screenMaxWidth-o.screenMaxWidth);let t=null;for(let n=e.length-1;n>=0;n--){const o=e[n];o.media===t&&e.splice(n,1),t=o.media}for(let n=0;nn.width-o.width);let t=null;for(let n=e.length-1;n>=0;n--){const o=e[n];o.width===t&&e.splice(n,1),t=o.width}}function nI(e){let t;return()=>t||(t=typeof e=="function"?e():e,t)}const oI=KO({keyMap:{format:"f",width:"w",height:"h",resize:"s",quality:"q",background:"b",position:"pos"},formatter:(e,t)=>Kp(e)+"_"+Kp(t.toString())}),rI=nI({validateDomains:!0,supportsAlias:!0,getImage(e,{modifiers:t,baseURL:n},o){t.width&&t.height&&(t.resize=`${t.width}x${t.height}`,delete t.width,delete t.height);const r=oI(t)||"_";return n||(n=cr(o.options.nuxt.baseURL,"/_ipx")),{url:cr(n,r,Nd(e).replace(/\/{2,}/g,"/"))}}}),uI={screens:{sm:640,md:768,lg:1024,xl:1280,"2xl":1536},presets:{},provider:"ipxStatic",domains:[],alias:{},densities:[1,2],format:["webp"],provider:"ipxStatic",providers:{ipxStatic:{setup:rI,defaults:{}}}},kb=e=>{const t=Bn(),n=Re();return n.$img||n._img||(n._img=ZO({...uI,event:n.ssrContext?.event,nuxt:{baseURL:t.app.baseURL},runtimeConfig:t}))};function aI(e){performance?.mark?.("mark_feature_usage",{detail:{feature:e}})}const sI=e=>{const t=kb(),n=F(()=>({provider:e.provider,preset:e.preset})),o=F(()=>({width:Pu(e.width),height:Pu(e.height),crossorigin:e.crossorigin===!0?"anonymous":e.crossorigin||void 0,nonce:e.nonce})),r=F(()=>({...e.modifiers,width:e.width,height:e.height,format:e.format,quality:e.quality||t.options.quality,background:e.background,fit:e.fit}));return{providerOptions:n,normalizedAttrs:o,imageModifiers:r}},iI=["src"],lI={__name:"NuxtImg",props:{custom:{type:Boolean,required:!1},placeholder:{type:[Boolean,String,Number,Array],required:!1},placeholderClass:{type:String,required:!1},src:{type:String,required:!1},format:{type:String,required:!1},quality:{type:[String,Number],required:!1},background:{type:String,required:!1},fit:{type:String,required:!1},modifiers:{type:Object,required:!1},preset:{type:String,required:!1},provider:{type:null,required:!1},sizes:{type:[String,Object],required:!1},densities:{type:String,required:!1},preload:{type:[Boolean,Object],required:!1},width:{type:[String,Number],required:!1},height:{type:[String,Number],required:!1},crossorigin:{type:[String,Boolean],required:!1},nonce:{type:String,required:!1}},emits:["load","error"],setup(e,{expose:t,emit:n}){const o=e,r=n,u=kb(),{providerOptions:a,normalizedAttrs:s,imageModifiers:i}=sI(o),c=F(()=>u.getSizes(o.src,{...a.value,sizes:o.sizes,densities:o.densities,modifiers:i.value})),l=R(!1),d=hv(),p=F(()=>({...s.value,"data-nuxt-img":"",...!o.placeholder||l.value?{sizes:c.value.sizes,srcset:c.value.srcset}:{},...d})),h=F(()=>{if(l.value)return!1;const b=o.placeholder===""?[10,10]:o.placeholder;if(!b)return!1;if(typeof b=="string")return b;const[v=10,C=v,w=50,B=3]=Array.isArray(b)?b:typeof b=="number"?[b]:[];return u(o.src,{...i.value,width:v,height:C,quality:w,blur:B},a.value)}),m=F(()=>o.sizes?c.value.src:u(o.src,i.value,a.value)),g=F(()=>h.value||m.value),y=Re().isHydrating,E=rv("imgEl");return t({imgEl:E}),$e(()=>{if(h.value||o.custom){const b=new Image;m.value&&(b.src=m.value),o.sizes&&(b.sizes=c.value.sizes||"",b.srcset=c.value.srcset),b.decode?b.decode().then(()=>{l.value=!0,r("load",new Event("load"))}).catch(v=>{r("error",v)}):(b.onload=v=>{l.value=!0,r("load",v)},b.onerror=v=>{r("error",v)}),aI("nuxt-image");return}E.value&&(E.value.complete&&y&&(E.value.getAttribute("data-error")?r("error",new Event("error")):r("load",new Event("load"))),E.value.onload=b=>{r("load",b)},E.value.onerror=b=>{r("error",b)})}),(b,v)=>e.custom?P(b.$slots,"default",me(j({key:1},{imgAttrs:p.value,isLoaded:l.value,src:g.value}))):(D(),re("img",j({key:0,ref_key:"imgEl",ref:E,class:h.value?e.placeholderClass:void 0},p.value,{src:g.value}),null,16,iI))}},H0=Object.assign(lI,{__name:"NuxtImg"}),L4=Symbol("nuxt-ui.avatar-group");function Sb(e){const t=Ue(L4,void 0),n=F(()=>e.size??t?.value.size);return Pt(L4,F(()=>({size:n.value}))),{size:n}}const cI={slots:{root:"relative inline-flex items-center justify-center shrink-0",base:"rounded-full ring ring-bg flex items-center justify-center text-inverted font-medium whitespace-nowrap"},variants:{color:{primary:"bg-primary",secondary:"bg-secondary",success:"bg-success",info:"bg-info",warning:"bg-warning",error:"bg-error",neutral:"bg-inverted"},size:{"3xs":"h-[4px] min-w-[4px] text-[4px]","2xs":"h-[5px] min-w-[5px] text-[5px]",xs:"h-[6px] min-w-[6px] text-[6px]",sm:"h-[7px] min-w-[7px] text-[7px]",md:"h-[8px] min-w-[8px] text-[8px]",lg:"h-[9px] min-w-[9px] text-[9px]",xl:"h-[10px] min-w-[10px] text-[10px]","2xl":"h-[11px] min-w-[11px] text-[11px]","3xl":"h-[12px] min-w-[12px] text-[12px]"},position:{"top-right":"top-0 right-0","bottom-right":"bottom-0 right-0","top-left":"top-0 left-0","bottom-left":"bottom-0 left-0"},inset:{false:""},standalone:{false:"absolute"}},compoundVariants:[{position:"top-right",inset:!1,class:"-translate-y-1/2 translate-x-1/2 transform"},{position:"bottom-right",inset:!1,class:"translate-y-1/2 translate-x-1/2 transform"},{position:"top-left",inset:!1,class:"-translate-y-1/2 -translate-x-1/2 transform"},{position:"bottom-left",inset:!1,class:"translate-y-1/2 -translate-x-1/2 transform"}],defaultVariants:{size:"md",color:"primary",position:"top-right"}},Tb=Object.assign({inheritAttrs:!1},{__name:"UChip",props:vv({as:{type:null,required:!1},text:{type:[String,Number],required:!1},color:{type:null,required:!1},size:{type:null,required:!1},position:{type:null,required:!1},inset:{type:Boolean,required:!1,default:!1},standalone:{type:Boolean,required:!1,default:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},{show:{type:Boolean,default:!0},showModifiers:{}}),emits:["update:show"],setup(e){const t=e,n=xv(e,"show",{type:Boolean,default:!0}),{size:o}=Sb(t),r=Pe(),u=Et("chip",t),a=F(()=>Se({extend:Se(cI),...r.ui?.chip||{}})({color:t.color,size:o.value,position:t.position,inset:t.inset,standalone:t.standalone}));return(s,i)=>(D(),k(f(we),{as:e.as,"data-slot":"root",class:U(a.value.root({class:[f(u)?.root,t.class]}))},{default:A(()=>[q(f(Ha),me(xe(s.$attrs)),{default:A(()=>[P(s.$slots,"default")]),_:3},16),n.value?(D(),re("span",{key:0,"data-slot":"base",class:U(a.value.base({class:f(u)?.base}))},[P(s.$slots,"content",{},()=>[Ke(Fe(e.text),1)])],2)):Y("",!0)]),_:3},8,["as","class"]))}}),dI={slots:{root:"inline-flex items-center justify-center shrink-0 select-none rounded-full align-middle bg-elevated",image:"h-full w-full rounded-[inherit] object-cover",fallback:"font-medium leading-none text-muted truncate",icon:"text-muted shrink-0"},variants:{size:{"3xs":{root:"size-4 text-[8px]"},"2xs":{root:"size-5 text-[10px]"},xs:{root:"size-6 text-xs"},sm:{root:"size-7 text-sm"},md:{root:"size-8 text-base"},lg:{root:"size-9 text-lg"},xl:{root:"size-10 text-xl"},"2xl":{root:"size-11 text-[22px]"},"3xl":{root:"size-12 text-2xl"}}},defaultVariants:{size:"md"}},Ku=Object.assign({inheritAttrs:!1},{__name:"UAvatar",props:{as:{type:null,required:!1},src:{type:String,required:!1},alt:{type:String,required:!1},icon:{type:null,required:!1},text:{type:String,required:!1},size:{type:null,required:!1},chip:{type:[Boolean,Object],required:!1},class:{type:null,required:!1},style:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,n=F(()=>typeof t.as=="string"||typeof t.as?.render=="function"?{root:t.as}:wt(t.as,{root:"span"})),o=F(()=>t.text||(t.alt||"").split(" ").map(p=>p.charAt(0)).join("").substring(0,2)),r=Pe(),u=Et("avatar",t),{size:a}=Sb(t),s=F(()=>Se({extend:Se(dI),...r.ui?.avatar||{}})({size:a.value})),i=F(()=>s.value.root({class:[u.value?.root,t.class]})),c=F(()=>{const p=i.value.split(" ").find(h=>/^size-\d+$/.test(h));if(p){const h=Number.parseFloat(p.split("-")[1]??"");if(!Number.isNaN(h))return h*4}return null}),l=R(!1);ye(()=>t.src,()=>{l.value&&(l.value=!1)});function d(){l.value=!0}return(p,h)=>(D(),k(Rt(t.chip?Tb:f(we)),j({as:n.value.root},t.chip?typeof t.chip=="object"?{inset:!0,...t.chip}:{inset:!0}:{},{"data-slot":"root",class:i.value,style:t.style}),{default:A(()=>[e.src&&!l.value?(D(),k(Rt(n.value.img||f(H0)),j({key:0,src:e.src,alt:e.alt,width:c.value,height:c.value},p.$attrs,{"data-slot":"image",class:s.value.image({class:f(u)?.image}),onError:d}),null,16,["src","alt","width","height","class"])):(D(),k(f(Ha),me(j({key:1},p.$attrs)),{default:A(()=>[P(p.$slots,"default",{},()=>[e.icon?(D(),k(st,{key:0,name:e.icon,"data-slot":"icon",class:U(s.value.icon({class:f(u)?.icon}))},null,8,["name","class"])):(D(),re("span",{key:1,"data-slot":"fallback",class:U(s.value.fallback({class:f(u)?.fallback}))},Fe(o.value||" "),3))])]),_:3},16))]),_:3},16,["as","class","style"]))}}),_o={__name:"ULinkBase",props:{as:{type:String,required:!1,default:"button"},type:{type:String,required:!1,default:"button"},disabled:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},href:{type:String,required:!1},navigate:{type:Function,required:!1},target:{type:[String,Object,null],required:!1},rel:{type:[String,Object,null],required:!1},active:{type:Boolean,required:!1},isExternal:{type:Boolean,required:!1}},setup(e){const t=e;function n(o){if(t.disabled){o.stopPropagation(),o.preventDefault();return}if(t.onClick)for(const r of Array.isArray(t.onClick)?t.onClick:[t.onClick])r(o);t.href&&t.navigate&&!t.isExternal&&t.navigate(o)}return(o,r)=>(D(),k(f(we),j(e.href?{as:"a",href:e.disabled?void 0:e.href,"aria-disabled":e.disabled?"true":void 0,role:e.disabled?"link":void 0,tabindex:e.disabled?-1:void 0}:e.as==="button"?{as:e.as,type:e.type,disabled:e.disabled}:{as:e.as},{rel:e.rel,target:e.target,onClick:n}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["rel","target"]))}},fI={base:"focus-visible:outline-primary",variants:{active:{true:"text-primary",false:"text-muted"},disabled:{true:"cursor-not-allowed opacity-75"}},compoundVariants:[{active:!1,disabled:!1,class:["hover:text-default","transition-colors"]}]},$r=Object.assign({inheritAttrs:!1},{__name:"ULink",props:{as:{type:null,required:!1,default:"button"},type:{type:null,required:!1,default:"button"},disabled:{type:Boolean,required:!1},active:{type:Boolean,required:!1,default:void 0},exact:{type:Boolean,required:!1},exactQuery:{type:[Boolean,String],required:!1},exactHash:{type:Boolean,required:!1},inactiveClass:{type:String,required:!1},custom:{type:Boolean,required:!1},raw:{type:Boolean,required:!1},class:{type:null,required:!1},to:{type:null,required:!1},href:{type:null,required:!1},external:{type:Boolean,required:!1},target:{type:[String,Object,null],required:!1},rel:{type:[String,Object,null],required:!1},noRel:{type:Boolean,required:!1},prefetchedClass:{type:String,required:!1},prefetch:{type:Boolean,required:!1},prefetchOn:{type:[String,Object],required:!1},noPrefetch:{type:Boolean,required:!1},trailingSlash:{type:String,required:!1},activeClass:{type:String,required:!1},exactActiveClass:{type:String,required:!1},ariaCurrentValue:{type:String,required:!1,default:"page"},viewTransition:{type:Boolean,required:!1},replace:{type:Boolean,required:!1}},setup(e){const t=e,n=Yn(),o=Pe(),r=ln(No(t,"as","type","disabled","active","exact","exactQuery","exactHash","activeClass","inactiveClass","to","href","raw","custom","class")),u=F(()=>Se({extend:Se(fI),...wt({variants:{active:{true:Li(o.ui?.link?.variants?.active?.true,t.activeClass),false:Li(o.ui?.link?.variants?.active?.false,t.inactiveClass)}}},o.ui?.link||{})})),a=F(()=>t.to??t.href);function s({route:c,isActive:l,isExactActive:d}){if(t.active!==void 0)return t.active;if(t.exactQuery==="partial"){if(!yO(c.query,n.query))return!1}else if(t.exactQuery===!0&&!Ur(c.query,n.query))return!1;return t.exactHash&&c.hash!==n.hash?!1:!!(t.exact&&d||!t.exact&&l)}function i({route:c,isActive:l,isExactActive:d}){const p=s({route:c,isActive:l,isExactActive:d});return t.raw?[t.class,p?t.activeClass:t.inactiveClass]:u.value({class:t.class,active:p,disabled:t.disabled})}return(c,l)=>{const d=nf;return D(),k(d,j(f(r),{to:a.value,custom:""}),{default:A(({href:p,navigate:h,route:m,isActive:g,isExactActive:y,...E})=>[e.custom?P(c.$slots,"default",me(j({key:0},{...c.$attrs,...e.exact&&y?{"aria-current":t.ariaCurrentValue}:{},as:e.as,type:e.type,disabled:e.disabled,href:p,navigate:h,rel:E.rel,target:E.target,isExternal:E.isExternal,active:s({route:m,isActive:g,isExactActive:y})}))):(D(),k(_o,j({key:1},{...c.$attrs,...e.exact&&y?{"aria-current":t.ariaCurrentValue}:{},as:e.as,type:e.type,disabled:e.disabled,href:p,navigate:h,rel:E.rel,target:E.target,isExternal:E.isExternal},{class:i({route:m,isActive:g,isExactActive:y})}),{default:A(()=>[P(c.$slots,"default",{active:s({route:m,isActive:g,isExactActive:y})})]),_:2},1040,["class"]))]),_:3},16,["to"])}}}),pI={slots:{base:["rounded-md font-medium inline-flex items-center disabled:cursor-not-allowed aria-disabled:cursor-not-allowed disabled:opacity-75 aria-disabled:opacity-75","transition-colors"],label:"truncate",leadingIcon:"shrink-0",leadingAvatar:"shrink-0",leadingAvatarSize:"",trailingIcon:"shrink-0"},variants:{fieldGroup:{horizontal:"not-only:first:rounded-e-none not-only:last:rounded-s-none not-last:not-first:rounded-none focus-visible:z-[1]",vertical:"not-only:first:rounded-b-none not-only:last:rounded-t-none not-last:not-first:rounded-none focus-visible:z-[1]"},color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{solid:"",outline:"",soft:"",subtle:"",ghost:"",link:""},size:{xs:{base:"px-2 py-1 text-xs gap-1",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},sm:{base:"px-2.5 py-1.5 text-xs gap-1.5",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},md:{base:"px-2.5 py-1.5 text-sm gap-1.5",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},lg:{base:"px-3 py-2 text-sm gap-2",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},xl:{base:"px-3 py-2 text-base gap-2",leadingIcon:"size-6",leadingAvatarSize:"xs",trailingIcon:"size-6"}},block:{true:{base:"w-full justify-center",trailingIcon:"ms-auto"}},square:{true:""},leading:{true:""},trailing:{true:""},loading:{true:""},active:{true:{base:""},false:{base:""}}},compoundVariants:[{color:"primary",variant:"solid",class:"text-inverted bg-primary hover:bg-primary/75 active:bg-primary/75 disabled:bg-primary aria-disabled:bg-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"},{color:"secondary",variant:"solid",class:"text-inverted bg-secondary hover:bg-secondary/75 active:bg-secondary/75 disabled:bg-secondary aria-disabled:bg-secondary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-secondary"},{color:"success",variant:"solid",class:"text-inverted bg-success hover:bg-success/75 active:bg-success/75 disabled:bg-success aria-disabled:bg-success focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-success"},{color:"info",variant:"solid",class:"text-inverted bg-info hover:bg-info/75 active:bg-info/75 disabled:bg-info aria-disabled:bg-info focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-info"},{color:"warning",variant:"solid",class:"text-inverted bg-warning hover:bg-warning/75 active:bg-warning/75 disabled:bg-warning aria-disabled:bg-warning focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-warning"},{color:"error",variant:"solid",class:"text-inverted bg-error hover:bg-error/75 active:bg-error/75 disabled:bg-error aria-disabled:bg-error focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-error"},{color:"primary",variant:"outline",class:"ring ring-inset ring-primary/50 text-primary hover:bg-primary/10 active:bg-primary/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-primary"},{color:"secondary",variant:"outline",class:"ring ring-inset ring-secondary/50 text-secondary hover:bg-secondary/10 active:bg-secondary/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-secondary"},{color:"success",variant:"outline",class:"ring ring-inset ring-success/50 text-success hover:bg-success/10 active:bg-success/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-success"},{color:"info",variant:"outline",class:"ring ring-inset ring-info/50 text-info hover:bg-info/10 active:bg-info/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-info"},{color:"warning",variant:"outline",class:"ring ring-inset ring-warning/50 text-warning hover:bg-warning/10 active:bg-warning/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-warning"},{color:"error",variant:"outline",class:"ring ring-inset ring-error/50 text-error hover:bg-error/10 active:bg-error/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-error"},{color:"primary",variant:"soft",class:"text-primary bg-primary/10 hover:bg-primary/15 active:bg-primary/15 focus:outline-none focus-visible:bg-primary/15 disabled:bg-primary/10 aria-disabled:bg-primary/10"},{color:"secondary",variant:"soft",class:"text-secondary bg-secondary/10 hover:bg-secondary/15 active:bg-secondary/15 focus:outline-none focus-visible:bg-secondary/15 disabled:bg-secondary/10 aria-disabled:bg-secondary/10"},{color:"success",variant:"soft",class:"text-success bg-success/10 hover:bg-success/15 active:bg-success/15 focus:outline-none focus-visible:bg-success/15 disabled:bg-success/10 aria-disabled:bg-success/10"},{color:"info",variant:"soft",class:"text-info bg-info/10 hover:bg-info/15 active:bg-info/15 focus:outline-none focus-visible:bg-info/15 disabled:bg-info/10 aria-disabled:bg-info/10"},{color:"warning",variant:"soft",class:"text-warning bg-warning/10 hover:bg-warning/15 active:bg-warning/15 focus:outline-none focus-visible:bg-warning/15 disabled:bg-warning/10 aria-disabled:bg-warning/10"},{color:"error",variant:"soft",class:"text-error bg-error/10 hover:bg-error/15 active:bg-error/15 focus:outline-none focus-visible:bg-error/15 disabled:bg-error/10 aria-disabled:bg-error/10"},{color:"primary",variant:"subtle",class:"text-primary ring ring-inset ring-primary/25 bg-primary/10 hover:bg-primary/15 active:bg-primary/15 disabled:bg-primary/10 aria-disabled:bg-primary/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary"},{color:"secondary",variant:"subtle",class:"text-secondary ring ring-inset ring-secondary/25 bg-secondary/10 hover:bg-secondary/15 active:bg-secondary/15 disabled:bg-secondary/10 aria-disabled:bg-secondary/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-secondary"},{color:"success",variant:"subtle",class:"text-success ring ring-inset ring-success/25 bg-success/10 hover:bg-success/15 active:bg-success/15 disabled:bg-success/10 aria-disabled:bg-success/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-success"},{color:"info",variant:"subtle",class:"text-info ring ring-inset ring-info/25 bg-info/10 hover:bg-info/15 active:bg-info/15 disabled:bg-info/10 aria-disabled:bg-info/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-info"},{color:"warning",variant:"subtle",class:"text-warning ring ring-inset ring-warning/25 bg-warning/10 hover:bg-warning/15 active:bg-warning/15 disabled:bg-warning/10 aria-disabled:bg-warning/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-warning"},{color:"error",variant:"subtle",class:"text-error ring ring-inset ring-error/25 bg-error/10 hover:bg-error/15 active:bg-error/15 disabled:bg-error/10 aria-disabled:bg-error/10 focus:outline-none focus-visible:ring-2 focus-visible:ring-error"},{color:"primary",variant:"ghost",class:"text-primary hover:bg-primary/10 active:bg-primary/10 focus:outline-none focus-visible:bg-primary/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"secondary",variant:"ghost",class:"text-secondary hover:bg-secondary/10 active:bg-secondary/10 focus:outline-none focus-visible:bg-secondary/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"success",variant:"ghost",class:"text-success hover:bg-success/10 active:bg-success/10 focus:outline-none focus-visible:bg-success/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"info",variant:"ghost",class:"text-info hover:bg-info/10 active:bg-info/10 focus:outline-none focus-visible:bg-info/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"warning",variant:"ghost",class:"text-warning hover:bg-warning/10 active:bg-warning/10 focus:outline-none focus-visible:bg-warning/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"error",variant:"ghost",class:"text-error hover:bg-error/10 active:bg-error/10 focus:outline-none focus-visible:bg-error/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent"},{color:"primary",variant:"link",class:"text-primary hover:text-primary/75 active:text-primary/75 disabled:text-primary aria-disabled:text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary"},{color:"secondary",variant:"link",class:"text-secondary hover:text-secondary/75 active:text-secondary/75 disabled:text-secondary aria-disabled:text-secondary focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-secondary"},{color:"success",variant:"link",class:"text-success hover:text-success/75 active:text-success/75 disabled:text-success aria-disabled:text-success focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-success"},{color:"info",variant:"link",class:"text-info hover:text-info/75 active:text-info/75 disabled:text-info aria-disabled:text-info focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-info"},{color:"warning",variant:"link",class:"text-warning hover:text-warning/75 active:text-warning/75 disabled:text-warning aria-disabled:text-warning focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-warning"},{color:"error",variant:"link",class:"text-error hover:text-error/75 active:text-error/75 disabled:text-error aria-disabled:text-error focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-error"},{color:"neutral",variant:"solid",class:"text-inverted bg-inverted hover:bg-inverted/90 active:bg-inverted/90 disabled:bg-inverted aria-disabled:bg-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-inverted"},{color:"neutral",variant:"outline",class:"ring ring-inset ring-accented text-default bg-default hover:bg-elevated active:bg-elevated disabled:bg-default aria-disabled:bg-default focus:outline-none focus-visible:ring-2 focus-visible:ring-inverted"},{color:"neutral",variant:"soft",class:"text-default bg-elevated hover:bg-accented/75 active:bg-accented/75 focus:outline-none focus-visible:bg-accented/75 disabled:bg-elevated aria-disabled:bg-elevated"},{color:"neutral",variant:"subtle",class:"ring ring-inset ring-accented text-default bg-elevated hover:bg-accented/75 active:bg-accented/75 disabled:bg-elevated aria-disabled:bg-elevated focus:outline-none focus-visible:ring-2 focus-visible:ring-inverted"},{color:"neutral",variant:"ghost",class:"text-default hover:bg-elevated active:bg-elevated focus:outline-none focus-visible:bg-elevated hover:disabled:bg-transparent dark:hover:disabled:bg-transparent hover:aria-disabled:bg-transparent dark:hover:aria-disabled:bg-transparent"},{color:"neutral",variant:"link",class:"text-muted hover:text-default active:text-default disabled:text-muted aria-disabled:text-muted focus:outline-none focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-inverted"},{size:"xs",square:!0,class:"p-1"},{size:"sm",square:!0,class:"p-1.5"},{size:"md",square:!0,class:"p-1.5"},{size:"lg",square:!0,class:"p-2"},{size:"xl",square:!0,class:"p-2"},{loading:!0,leading:!0,class:{leadingIcon:"animate-spin"}},{loading:!0,leading:!1,trailing:!0,class:{trailingIcon:"animate-spin"}}],defaultVariants:{color:"primary",variant:"solid",size:"md"}},hn={__name:"UButton",props:{label:{type:String,required:!1},color:{type:null,required:!1},activeColor:{type:null,required:!1},variant:{type:null,required:!1},activeVariant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},block:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},as:{type:null,required:!1},type:{type:null,required:!1},disabled:{type:Boolean,required:!1},active:{type:Boolean,required:!1},exact:{type:Boolean,required:!1},exactQuery:{type:[Boolean,String],required:!1},exactHash:{type:Boolean,required:!1},inactiveClass:{type:String,required:!1},to:{type:null,required:!1},href:{type:null,required:!1},external:{type:Boolean,required:!1},target:{type:[String,Object,null],required:!1},rel:{type:[String,Object,null],required:!1},noRel:{type:Boolean,required:!1},prefetchedClass:{type:String,required:!1},prefetch:{type:Boolean,required:!1},prefetchOn:{type:[String,Object],required:!1},noPrefetch:{type:Boolean,required:!1},trailingSlash:{type:String,required:!1},activeClass:{type:String,required:!1},exactActiveClass:{type:String,required:!1},ariaCurrentValue:{type:String,required:!1},viewTransition:{type:Boolean,required:!1},replace:{type:Boolean,required:!1}},setup(e){const t=e,n=qt(),o=Pe(),r=Et("button",t),{orientation:u,size:a}=Eb(t),s=ln(xu(t)),i=R(!1),c=Ue(gO,void 0);async function l(E){i.value=!0;const b=Array.isArray(t.onClick)?t.onClick:[t.onClick];try{await Promise.all(b.map(v=>v?.(E)))}finally{i.value=!1}}const d=F(()=>t.loading||t.loadingAuto&&(i.value||c?.value&&t.type==="submit")),{isLeading:p,isTrailing:h,leadingIconName:m,trailingIconName:g}=bb(F(()=>({...t,loading:d.value}))),y=F(()=>Se({extend:Se(pI),...wt({variants:{active:{true:{base:Li(o.ui?.button?.variants?.active?.true?.base,t.activeClass)},false:{base:Li(o.ui?.button?.variants?.active?.false?.base,t.inactiveClass)}}}},o.ui?.button||{})})({color:t.color,variant:t.variant,size:a.value,loading:d.value,block:t.block,square:t.square||!n.default&&!t.label,leading:p.value,trailing:h.value,fieldGroup:u.value}));return(E,b)=>(D(),k($r,j({type:e.type,disabled:e.disabled||d.value},f(ms)(f(s),["type","disabled","onClick"]),{custom:""}),{default:A(({active:v,...C})=>[q(_o,j(C,{"data-slot":"base",class:y.value.base({class:[f(r)?.base,t.class],active:v,...v&&e.activeVariant?{variant:e.activeVariant}:{},...v&&e.activeColor?{color:e.activeColor}:{}}),onClick:l}),{default:A(()=>[P(E.$slots,"leading",{ui:y.value},()=>[f(p)&&f(m)?(D(),k(st,{key:0,name:f(m),"data-slot":"leadingIcon",class:U(y.value.leadingIcon({class:f(r)?.leadingIcon,active:v}))},null,8,["name","class"])):e.avatar?(D(),k(Ku,j({key:1,size:f(r)?.leadingAvatarSize||y.value.leadingAvatarSize()},e.avatar,{"data-slot":"leadingAvatar",class:y.value.leadingAvatar({class:f(r)?.leadingAvatar,active:v})}),null,16,["size","class"])):Y("",!0)]),P(E.$slots,"default",{ui:y.value},()=>[e.label!==void 0&&e.label!==null?(D(),re("span",{key:0,"data-slot":"label",class:U(y.value.label({class:f(r)?.label,active:v}))},Fe(e.label),3)):Y("",!0)]),P(E.$slots,"trailing",{ui:y.value},()=>[f(h)&&f(g)?(D(),k(st,{key:0,name:f(g),"data-slot":"trailingIcon",class:U(y.value.trailingIcon({class:f(r)?.trailingIcon,active:v}))},null,8,["name","class"])):Y("",!0)])]),_:2},1040,["class"])]),_:3},16,["type","disabled"]))}},sH=Object.freeze(Object.defineProperty({__proto__:null,default:hn},Symbol.toStringTag,{value:"Module"})),Ks={meta:"",ctrl:"",alt:"",win:"⊞",command:"⌘",shift:"⇧",control:"⌃",option:"⌥",enter:"↵",delete:"⌦",backspace:"⌫",escape:"Esc",tab:"⇥",capslock:"⇪",arrowup:"↑",arrowright:"→",arrowdown:"↓",arrowleft:"←",pageup:"⇞",pagedown:"⇟",home:"↖",end:"↘"},hI=()=>{const e=F(()=>navigator&&navigator.userAgent&&navigator.userAgent.match(/Macintosh;/)),t=_t({meta:" ",alt:" ",ctrl:" "});$e(()=>{t.meta=e.value?Ks.command:"Ctrl",t.ctrl=e.value?Ks.control:"Ctrl",t.alt=e.value?Ks.option:"Alt"});function n(o){if(o)return["meta","alt","ctrl"].includes(o)?t[o]:Ks[o]||o}return{macOS:e,getKbdKey:n}},mI=Nu(hI),gI={base:"inline-flex items-center justify-center px-1 rounded-sm font-medium font-sans uppercase",variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{solid:"",outline:"",soft:"",subtle:""},size:{sm:"h-4 min-w-[16px] text-[10px]",md:"h-5 min-w-[20px] text-[11px]",lg:"h-6 min-w-[24px] text-[12px]"}},compoundVariants:[{color:"primary",variant:"solid",class:"text-inverted bg-primary"},{color:"secondary",variant:"solid",class:"text-inverted bg-secondary"},{color:"success",variant:"solid",class:"text-inverted bg-success"},{color:"info",variant:"solid",class:"text-inverted bg-info"},{color:"warning",variant:"solid",class:"text-inverted bg-warning"},{color:"error",variant:"solid",class:"text-inverted bg-error"},{color:"primary",variant:"outline",class:"ring ring-inset ring-primary/50 text-primary"},{color:"secondary",variant:"outline",class:"ring ring-inset ring-secondary/50 text-secondary"},{color:"success",variant:"outline",class:"ring ring-inset ring-success/50 text-success"},{color:"info",variant:"outline",class:"ring ring-inset ring-info/50 text-info"},{color:"warning",variant:"outline",class:"ring ring-inset ring-warning/50 text-warning"},{color:"error",variant:"outline",class:"ring ring-inset ring-error/50 text-error"},{color:"primary",variant:"soft",class:"text-primary bg-primary/10"},{color:"secondary",variant:"soft",class:"text-secondary bg-secondary/10"},{color:"success",variant:"soft",class:"text-success bg-success/10"},{color:"info",variant:"soft",class:"text-info bg-info/10"},{color:"warning",variant:"soft",class:"text-warning bg-warning/10"},{color:"error",variant:"soft",class:"text-error bg-error/10"},{color:"primary",variant:"subtle",class:"text-primary ring ring-inset ring-primary/25 bg-primary/10"},{color:"secondary",variant:"subtle",class:"text-secondary ring ring-inset ring-secondary/25 bg-secondary/10"},{color:"success",variant:"subtle",class:"text-success ring ring-inset ring-success/25 bg-success/10"},{color:"info",variant:"subtle",class:"text-info ring ring-inset ring-info/25 bg-info/10"},{color:"warning",variant:"subtle",class:"text-warning ring ring-inset ring-warning/25 bg-warning/10"},{color:"error",variant:"subtle",class:"text-error ring ring-inset ring-error/25 bg-error/10"},{color:"neutral",variant:"solid",class:"text-inverted bg-inverted"},{color:"neutral",variant:"outline",class:"ring ring-inset ring-accented text-default bg-default"},{color:"neutral",variant:"soft",class:"text-default bg-elevated"},{color:"neutral",variant:"subtle",class:"ring ring-inset ring-accented text-default bg-elevated"}],defaultVariants:{variant:"outline",color:"neutral",size:"md"}},Mf={__name:"UKbd",props:{as:{type:null,required:!1,default:"kbd"},value:{type:null,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},size:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,{getKbdKey:n}=mI(),o=Pe(),r=Et("kbd",t),u=F(()=>Se({extend:Se(gI),...o.ui?.kbd||{}}));return(a,s)=>(D(),k(f(we),{as:e.as,class:U(u.value({class:[f(r)?.base,t.class],color:t.color,variant:t.variant,size:t.size}))},{default:A(()=>[P(a.$slots,"default",{},()=>[Ke(Fe(f(n)(e.value)),1)])]),_:3},8,["as","class"]))}},Fb=Symbol("nuxt-ui.portal-target");function tu(e){const t=Ue(Fb,void 0),n=F(()=>e.value===!0?t?.value:e.value),o=F(()=>typeof n.value=="boolean"?!n.value:!1),r=F(()=>typeof n.value=="boolean"?"body":n.value);return F(()=>({to:r.value,disabled:o.value}))}const vI={slots:{content:"flex items-center gap-1 bg-default text-highlighted shadow-sm rounded-sm ring ring-default h-6 px-2.5 py-1 text-xs select-none data-[state=delayed-open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-tooltip-content-transform-origin) pointer-events-auto",arrow:"fill-bg stroke-default",text:"truncate",kbds:"hidden lg:inline-flex items-center shrink-0 gap-0.5 not-first-of-type:before:content-['·'] not-first-of-type:before:me-0.5",kbdsSize:"sm"}},Pb={__name:"UTooltip",props:{text:{type:String,required:!1},kbds:{type:Array,required:!1},content:{type:Object,required:!1},arrow:{type:[Boolean,Object],required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},reference:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},delayDuration:{type:Number,required:!1},disableHoverableContent:{type:Boolean,required:!1},disableClosingTrigger:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},ignoreNonKeyboardFocus:{type:Boolean,required:!1}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=Pe(),a=Et("tooltip",n),s=hs(),i=it(Jt(n,"defaultOpen","open","delayDuration","disableHoverableContent","disableClosingTrigger","ignoreNonKeyboardFocus"),o),c=tu(Ye(()=>n.portal)),l=Ye(()=>wt(n.content,s.content.value,{side:"bottom",sideOffset:8,collisionPadding:8})),d=Ye(()=>wt(n.arrow,{rounded:!0})),p=F(()=>Se({extend:Se(vI),...u.ui?.tooltip||{}})({side:l.value.side}));return(h,m)=>(D(),k(f(KP),j(f(i),{disabled:!(e.text||e.kbds?.length||r.content)||n.disabled}),{default:A(({open:g})=>[r.default||e.reference?(D(),k(f(tM),j({key:0},h.$attrs,{"as-child":"",reference:e.reference,class:n.class}),{default:A(()=>[P(h.$slots,"default",{open:g})]),_:2},1040,["reference","class"])):Y("",!0),q(f(QP),me(xe(f(c))),{default:A(()=>[q(f(XP),j(l.value,{"data-slot":"content",class:p.value.content({class:[!r.default&&n.class,f(a)?.content]})}),{default:A(()=>[P(h.$slots,"content",{ui:p.value},()=>[e.text?(D(),re("span",{key:0,"data-slot":"text",class:U(p.value.text({class:f(a)?.text}))},Fe(e.text),3)):Y("",!0),e.kbds?.length?(D(),re("span",{key:1,"data-slot":"kbds",class:U(p.value.kbds({class:f(a)?.kbds}))},[(D(!0),re(Ce,null,yt(e.kbds,(y,E)=>(D(),k(Mf,j({key:E,size:f(a)?.kbdsSize||p.value.kbdsSize()},{ref_for:!0},typeof y=="string"?{value:y}:y),null,16,["size"]))),128))],2)):Y("",!0)]),e.arrow?(D(),k(f(NP),j({key:0},d.value,{"data-slot":"arrow",class:p.value.arrow({class:f(a)?.arrow})}),null,16,["class"])):Y("",!0)]),_:3},16,["class"])]),_:3},16)]),_:3},16,["disabled"]))}},yI={slots:{base:"",label:"",trailing:"hidden lg:flex items-center gap-0.5 ms-auto"},variants:{collapsed:{true:{label:"hidden",trailing:"lg:hidden"}}}},Mb=Object.assign({inheritAttrs:!1},{__name:"UContentSearchButton",props:{icon:{type:null,required:!1},label:{type:String,required:!1},color:{type:null,required:!1,default:"neutral"},variant:{type:null,required:!1},collapsed:{type:Boolean,required:!1,default:!0},tooltip:{type:[Boolean,Object],required:!1,default:!1},kbds:{type:Array,required:!1,default:()=>["meta","k"]},ui:{type:Object,required:!1},class:{type:null,required:!1},activeColor:{type:null,required:!1},activeVariant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},block:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},as:{type:null,required:!1},type:{type:null,required:!1},disabled:{type:Boolean,required:!1},exactActiveClass:{type:String,required:!1},viewTransition:{type:Boolean,required:!1}},setup(e){const t=e,n=qt(),[o,r]=To(),u=()=>ms(n,["trailing"]),a=ln(No(t,"icon","label","variant","collapsed","tooltip","kbds","class","ui")),s=Ye(()=>wt(typeof t.tooltip=="boolean"?{}:t.tooltip,{delayDuration:0,content:{side:"right"}})),{t:i}=Vo(),{open:c}=aM(),l=Pe(),d=Et("contentSearchButton",t),p=F(()=>Se({extend:Se(yI),...l.ui?.contentSearchButton||{}})({collapsed:t.collapsed}));return(h,m)=>(D(),re(Ce,null,[q(f(o),null,{default:A(()=>[q(hn,j({icon:e.icon||f(l).ui.icons.search,label:e.label||f(i)("contentSearchButton.label"),variant:e.variant||(e.collapsed?"ghost":"outline")},{...f(a),...e.collapsed?{square:!0,"aria-label":e.label||f(i)("contentSearchButton.label")}:{},...h.$attrs},{class:p.value.base({class:[f(d)?.base,t.class]}),ui:f(oM)(p.value,f(d)),onClick:m[0]||(m[0]=g=>c.value=!0)}),us({trailing:A(({ui:g})=>[je("div",{"data-slot":"trailing",class:U(p.value.trailing({class:f(d)?.trailing}))},[P(h.$slots,"trailing",{ui:g},()=>[e.kbds?.length?(D(!0),re(Ce,{key:0},yt(e.kbds,(y,E)=>(D(),k(Mf,j({key:E,variant:"subtle"},{ref_for:!0},typeof y=="string"?{value:y}:y),null,16))),128)):Y("",!0)])],2)]),_:2},[yt(u(),(g,y)=>({name:y,fn:A(E=>[P(h.$slots,y,me(xe(E)))])}))]),1040,["icon","label","variant","class","ui"])]),_:3}),e.collapsed&&e.tooltip?(D(),k(Pb,j({key:0,text:e.label||f(i)("contentSearchButton.label")},s.value),{default:A(()=>[q(f(r))]),_:1},16,["text"])):(D(),k(f(r),{key:1}))],64))}}),Wu=(e,t)=>{const n=e.__vccOpts||e;for(const[o,r]of t)n[o]=r;return n},bI={};function EI(e,t){const n=Mb;return D(),k(n,{collapsed:!1,class:"w-full",variant:"soft",ui:{leadingIcon:"size-4 mr-1"}})}const CI=Object.assign(Wu(bI,[["render",EI]]),{__name:"AppHeaderCenter"}),xI=Object.assign({inheritAttrs:!1},{__name:"UColorModeImage",props:{dark:{type:String,required:!0},light:{type:String,required:!0}},setup(e){const t=e,n=F(()=>D4(t.light,Bn().app.baseURL)),o=F(()=>D4(t.dark,Bn().app.baseURL));return(r,u)=>(D(),re(Ce,null,[(D(),k(Rt(f(H0)),j({src:n.value,class:"dark:hidden"},r.$attrs),null,16,["src"])),(D(),k(Rt(f(H0)),j({src:o.value,class:"hidden dark:block"},r.$attrs),null,16,["src"]))],64))}}),qn={Root:N1,Trigger:j1,Portal:n8,Content:KT,Arrow:NT,Item:ZT,Group:GT,Separator:i8,CheckboxItem:VT,ItemIndicator:JT,Label:e8,RadioGroup:r8,RadioItem:a8,Sub:c8,SubContent:f8,SubTrigger:h8},iH={Root:V8,Trigger:gF,Portal:nF,Content:U8,Arrow:L8,Item:Z8,Group:G8,Separator:iF,CheckboxItem:$8,ItemIndicator:J8,Label:eF,RadioGroup:rF,RadioItem:aF,Sub:cF,SubContent:fF,SubTrigger:hF,Filter:K8},wI={Root:CF,Trigger:TF,Portal:kF,Content:BF,Arrow:yF},DI={Root:y8,Trigger:I8,Portal:M8,Content:F8,Arrow:x8,Close:D8,Anchor:E8},Ob={__name:"UContextMenuContent",props:{items:{type:null,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0},sub:{type:Boolean,required:!1},labelKey:{type:null,required:!0},descriptionKey:{type:null,required:!0},checkedIcon:{type:null,required:!1},loadingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0},class:{type:null,required:!1},ui:{type:null,required:!0},uiOverride:{type:null,required:!1},loop:{type:Boolean,required:!1},sideFlip:{type:Boolean,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=qt(),{dir:u}=Vo(),a=Pe(),s=tu(Ye(()=>n.portal)),i=it(No(n,"sub","items","portal","labelKey","descriptionKey","checkedIcon","loadingIcon","externalIcon","class","ui","uiOverride"),o),c=()=>ms(r,["default"]),[l,d]=To(),p=F(()=>u.value==="rtl"?a.ui.icons.chevronLeft:a.ui.icons.chevronRight),h=F(()=>n.items?.length?eb(n.items)?n.items:[n.items]:[]);return(m,g)=>(D(),re(Ce,null,[q(f(l),null,{default:A(({item:y,active:E,index:b})=>[P(m.$slots,y.slot||"item",{item:y,index:b,ui:e.ui},()=>[P(m.$slots,y.slot?`${y.slot}-leading`:"item-leading",{item:y,active:E,index:b,ui:e.ui},()=>[y.loading?(D(),k(st,{key:0,name:e.loadingIcon||f(a).ui.icons.loading,"data-slot":"itemLeadingIcon",class:U(e.ui.itemLeadingIcon({class:[e.uiOverride?.itemLeadingIcon,y.ui?.itemLeadingIcon],color:y?.color,loading:!0}))},null,8,["name","class"])):y.icon?(D(),k(st,{key:1,name:y.icon,"data-slot":"itemLeadingIcon",class:U(e.ui.itemLeadingIcon({class:[e.uiOverride?.itemLeadingIcon,y.ui?.itemLeadingIcon],color:y?.color,active:E}))},null,8,["name","class"])):y.avatar?(D(),k(Ku,j({key:2,size:y.ui?.itemLeadingAvatarSize||e.uiOverride?.itemLeadingAvatarSize||e.ui.itemLeadingAvatarSize()},y.avatar,{"data-slot":"itemLeadingAvatar",class:e.ui.itemLeadingAvatar({class:[e.uiOverride?.itemLeadingAvatar,y.ui?.itemLeadingAvatar],active:E})}),null,16,["size","class"])):Y("",!0)]),f(jt)(y,n.labelKey)||r[y.slot?`${y.slot}-label`:"item-label"]||f(jt)(y,n.descriptionKey)||r[y.slot?`${y.slot}-description`:"item-description"]?(D(),re("span",{key:0,"data-slot":"itemWrapper",class:U(e.ui.itemWrapper({class:[e.uiOverride?.itemWrapper,y.ui?.itemWrapper]}))},[je("span",{"data-slot":"itemLabel",class:U(e.ui.itemLabel({class:[e.uiOverride?.itemLabel,y.ui?.itemLabel],active:E}))},[P(m.$slots,y.slot?`${y.slot}-label`:"item-label",{item:y,active:E,index:b},()=>[Ke(Fe(f(jt)(y,n.labelKey)),1)]),y.target==="_blank"&&e.externalIcon!==!1?(D(),k(st,{key:0,name:typeof e.externalIcon=="string"?e.externalIcon:f(a).ui.icons.external,"data-slot":"itemLabelExternalIcon",class:U(e.ui.itemLabelExternalIcon({class:[e.uiOverride?.itemLabelExternalIcon,y.ui?.itemLabelExternalIcon],color:y?.color,active:E}))},null,8,["name","class"])):Y("",!0)],2),f(jt)(y,n.descriptionKey)||r[y.slot?`${y.slot}-description`:"item-description"]?(D(),re("span",{key:0,"data-slot":"itemDescription",class:U(e.ui.itemDescription({class:[e.uiOverride?.itemDescription,y.ui?.itemDescription]}))},[P(m.$slots,y.slot?`${y.slot}-description`:"item-description",{item:y,active:E,index:b},()=>[Ke(Fe(f(jt)(y,n.descriptionKey)),1)])],2)):Y("",!0)],2)):Y("",!0),je("span",{"data-slot":"itemTrailing",class:U(e.ui.itemTrailing({class:[e.uiOverride?.itemTrailing,y.ui?.itemTrailing]}))},[P(m.$slots,y.slot?`${y.slot}-trailing`:"item-trailing",{item:y,active:E,index:b,ui:e.ui},()=>[y.children?.length?(D(),k(st,{key:0,name:p.value,"data-slot":"itemTrailingIcon",class:U(e.ui.itemTrailingIcon({class:[e.uiOverride?.itemTrailingIcon,y.ui?.itemTrailingIcon],color:y?.color,active:E}))},null,8,["name","class"])):y.kbds?.length?(D(),re("span",{key:1,"data-slot":"itemTrailingKbds",class:U(e.ui.itemTrailingKbds({class:[e.uiOverride?.itemTrailingKbds,y.ui?.itemTrailingKbds]}))},[(D(!0),re(Ce,null,yt(y.kbds,(v,C)=>(D(),k(Mf,j({key:C,size:y.ui?.itemTrailingKbdsSize||e.uiOverride?.itemTrailingKbdsSize||e.ui.itemTrailingKbdsSize()},{ref_for:!0},typeof v=="string"?{value:v}:v),null,16,["size"]))),128))],2)):Y("",!0)]),q(f(qn).ItemIndicator,{"as-child":""},{default:A(()=>[q(st,{name:e.checkedIcon||f(a).ui.icons.check,"data-slot":"itemTrailingIcon",class:U(e.ui.itemTrailingIcon({class:[e.uiOverride?.itemTrailingIcon,y.ui?.itemTrailingIcon],color:y?.color}))},null,8,["name","class"])]),_:2},1024)],2)])]),_:3}),q(f(qn).Portal,me(xe(f(s))),{default:A(()=>[(D(),k(Rt(e.sub?f(qn).SubContent:f(qn).Content),j({"data-slot":"content",class:e.ui.content({class:[e.uiOverride?.content,n.class]})},f(i)),{default:A(()=>[P(m.$slots,"content-top",{sub:e.sub??!1}),je("div",{role:"presentation","data-slot":"viewport",class:U(e.ui.viewport({class:e.uiOverride?.viewport}))},[(D(!0),re(Ce,null,yt(h.value,(y,E)=>(D(),k(f(qn).Group,{key:`group-${E}`,"data-slot":"group",class:U(e.ui.group({class:e.uiOverride?.group}))},{default:A(()=>[(D(!0),re(Ce,null,yt(y,(b,v)=>(D(),re(Ce,{key:`group-${E}-${v}`},[b.type==="label"?(D(),k(f(qn).Label,{key:0,"data-slot":"label",class:U(e.ui.label({class:[e.uiOverride?.label,b.ui?.label,b.class]}))},{default:A(()=>[q(f(d),{item:b,index:v},null,8,["item","index"])]),_:2},1032,["class"])):b.type==="separator"?(D(),k(f(qn).Separator,{key:1,"data-slot":"separator",class:U(e.ui.separator({class:[e.uiOverride?.separator,b.ui?.separator,b.class]}))},null,8,["class"])):b?.children?.length?(D(),k(f(qn).Sub,{key:2,open:b.open,"default-open":b.defaultOpen},{default:A(()=>[q(f(qn).SubTrigger,{as:"button",type:"button",disabled:b.disabled,"text-value":f(jt)(b,n.labelKey),"data-slot":"item",class:U(e.ui.item({class:[e.uiOverride?.item,b.ui?.item,b.class],color:b?.color}))},{default:A(()=>[q(f(d),{item:b,index:v},null,8,["item","index"])]),_:2},1032,["disabled","text-value","class"]),q(Ob,j({sub:"",class:b.ui?.content,ui:e.ui,"ui-override":e.uiOverride,portal:e.portal,items:b.children,"align-offset":-4,"label-key":e.labelKey,"description-key":e.descriptionKey,"checked-icon":e.checkedIcon,"loading-icon":e.loadingIcon,"external-icon":e.externalIcon},{ref_for:!0},b.content),us({_:2},[yt(c(),(C,w)=>({name:w,fn:A(B=>[P(m.$slots,w,j({ref_for:!0},B))])}))]),1040,["class","ui","ui-override","portal","items","label-key","description-key","checked-icon","loading-icon","external-icon"])]),_:2},1032,["open","default-open"])):b.type==="checkbox"?(D(),k(f(qn).CheckboxItem,{key:3,"model-value":b.checked,disabled:b.disabled,"text-value":f(jt)(b,n.labelKey),"data-slot":"item",class:U(e.ui.item({class:[e.uiOverride?.item,b.ui?.item,b.class],color:b?.color})),"onUpdate:modelValue":b.onUpdateChecked,onSelect:b.onSelect},{default:A(()=>[q(f(d),{item:b,index:v},null,8,["item","index"])]),_:2},1032,["model-value","disabled","text-value","class","onUpdate:modelValue","onSelect"])):(D(),k($r,j({key:4,ref_for:!0},f(xu)(b),{custom:""}),{default:A(({active:C,...w})=>[q(f(qn).Item,{"as-child":"",disabled:b.disabled,"text-value":f(jt)(b,n.labelKey),onSelect:b.onSelect},{default:A(()=>[q(_o,j({ref_for:!0},w,{"data-slot":"item",class:e.ui.item({class:[e.uiOverride?.item,b.ui?.item,b.class],active:C,color:b?.color})}),{default:A(()=>[q(f(d),{item:b,active:C,index:v},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1032,["disabled","text-value","onSelect"])]),_:2},1040))],64))),128))]),_:2},1032,["class"]))),128))],2),P(m.$slots,"default"),P(m.$slots,"content-bottom",{sub:e.sub??!1})]),_:3},16,["class"]))]),_:3},16)],64))}},AI={slots:{content:"min-w-32 bg-default shadow-lg rounded-md ring ring-default overflow-hidden data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-context-menu-content-transform-origin) flex flex-col",viewport:"relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1",group:"p-1 isolate",label:"w-full flex items-center font-semibold text-highlighted",separator:"-mx-1 my-1 h-px bg-border",item:"group relative w-full flex items-start select-none outline-none before:absolute before:z-[-1] before:inset-px before:rounded-md data-disabled:cursor-not-allowed data-disabled:opacity-75",itemLeadingIcon:"shrink-0",itemLeadingAvatar:"shrink-0",itemLeadingAvatarSize:"",itemTrailing:"ms-auto inline-flex gap-1.5 items-center",itemTrailingIcon:"shrink-0",itemTrailingKbds:"hidden lg:inline-flex items-center shrink-0",itemTrailingKbdsSize:"",itemWrapper:"flex-1 flex flex-col text-start min-w-0",itemLabel:"truncate",itemDescription:"truncate text-muted",itemLabelExternalIcon:"inline-block size-3 align-top text-dimmed"},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},active:{true:{item:"text-highlighted before:bg-elevated",itemLeadingIcon:"text-default"},false:{item:["text-default data-highlighted:text-highlighted data-[state=open]:text-highlighted data-highlighted:before:bg-elevated/50 data-[state=open]:before:bg-elevated/50","transition-colors before:transition-colors"],itemLeadingIcon:["text-dimmed group-data-highlighted:text-default group-data-[state=open]:text-default","transition-colors"]}},loading:{true:{itemLeadingIcon:"animate-spin"}},size:{xs:{label:"p-1 text-xs gap-1",item:"p-1 text-xs gap-1",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemTrailingIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},sm:{label:"p-1.5 text-xs gap-1.5",item:"p-1.5 text-xs gap-1.5",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemTrailingIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},md:{label:"p-1.5 text-sm gap-1.5",item:"p-1.5 text-sm gap-1.5",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemTrailingIcon:"size-5",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"md"},lg:{label:"p-2 text-sm gap-2",item:"p-2 text-sm gap-2",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemTrailingIcon:"size-5",itemTrailingKbds:"gap-1",itemTrailingKbdsSize:"md"},xl:{label:"p-2 text-base gap-2",item:"p-2 text-base gap-2",itemLeadingIcon:"size-6",itemLeadingAvatarSize:"xs",itemTrailingIcon:"size-6",itemTrailingKbds:"gap-1",itemTrailingKbdsSize:"lg"}}},compoundVariants:[{color:"primary",active:!1,class:{item:"text-primary data-highlighted:text-primary data-highlighted:before:bg-primary/10 data-[state=open]:before:bg-primary/10",itemLeadingIcon:"text-primary/75 group-data-highlighted:text-primary group-data-[state=open]:text-primary"}},{color:"secondary",active:!1,class:{item:"text-secondary data-highlighted:text-secondary data-highlighted:before:bg-secondary/10 data-[state=open]:before:bg-secondary/10",itemLeadingIcon:"text-secondary/75 group-data-highlighted:text-secondary group-data-[state=open]:text-secondary"}},{color:"success",active:!1,class:{item:"text-success data-highlighted:text-success data-highlighted:before:bg-success/10 data-[state=open]:before:bg-success/10",itemLeadingIcon:"text-success/75 group-data-highlighted:text-success group-data-[state=open]:text-success"}},{color:"info",active:!1,class:{item:"text-info data-highlighted:text-info data-highlighted:before:bg-info/10 data-[state=open]:before:bg-info/10",itemLeadingIcon:"text-info/75 group-data-highlighted:text-info group-data-[state=open]:text-info"}},{color:"warning",active:!1,class:{item:"text-warning data-highlighted:text-warning data-highlighted:before:bg-warning/10 data-[state=open]:before:bg-warning/10",itemLeadingIcon:"text-warning/75 group-data-highlighted:text-warning group-data-[state=open]:text-warning"}},{color:"error",active:!1,class:{item:"text-error data-highlighted:text-error data-highlighted:before:bg-error/10 data-[state=open]:before:bg-error/10",itemLeadingIcon:"text-error/75 group-data-highlighted:text-error group-data-[state=open]:text-error"}},{color:"primary",active:!0,class:{item:"text-primary before:bg-primary/10",itemLeadingIcon:"text-primary"}},{color:"secondary",active:!0,class:{item:"text-secondary before:bg-secondary/10",itemLeadingIcon:"text-secondary"}},{color:"success",active:!0,class:{item:"text-success before:bg-success/10",itemLeadingIcon:"text-success"}},{color:"info",active:!0,class:{item:"text-info before:bg-info/10",itemLeadingIcon:"text-info"}},{color:"warning",active:!0,class:{item:"text-warning before:bg-warning/10",itemLeadingIcon:"text-warning"}},{color:"error",active:!0,class:{item:"text-error before:bg-error/10",itemLeadingIcon:"text-error"}}],defaultVariants:{size:"md"}},BI={__name:"UContextMenu",props:{size:{type:null,required:!1},items:{type:null,required:!1},checkedIcon:{type:null,required:!1},loadingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},content:{type:Object,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},disabled:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},pressOpenDelay:{type:Number,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=Pe(),a=Et("contextMenu",n),s=it(Jt(n,"modal"),o),i=Ye(()=>n.content),c=()=>ms(r,["default"]),l=F(()=>Se({extend:Se(AI),...u.ui?.contextMenu||{}})({size:n.size}));return(d,p)=>(D(),k(f(N1),me(xe(f(s))),{default:A(()=>[r.default?(D(),k(f(j1),{key:0,"as-child":"",disabled:e.disabled,class:U(n.class)},{default:A(()=>[P(d.$slots,"default")]),_:3},8,["disabled","class"])):Y("",!0),q(Ob,j({class:l.value.content({class:[!r.default&&n.class,f(a)?.content]}),ui:l.value,"ui-override":f(a)},i.value,{items:e.items,portal:e.portal,"label-key":e.labelKey,"description-key":e.descriptionKey,"checked-icon":e.checkedIcon,"loading-icon":e.loadingIcon,"external-icon":e.externalIcon}),us({_:2},[yt(c(),(h,m)=>({name:m,fn:A(g=>[P(d.$slots,m,me(xe(g)))])}))]),1040,["class","ui","ui-override","items","portal","label-key","description-key","checked-icon","loading-icon","external-icon"])]),_:3},16))}},Ib=()=>nr("color-mode").value,Rb=Symbol("nuxt-ui.toast-max");function Lb(){const e=nr("toasts",()=>[]),t=Ue(Rb,void 0),n=R(!1),o=[],r=()=>`${Date.now()}-${Math.random().toString(36).slice(2,9)}`;async function u(){if(!(n.value||o.length===0)){for(n.value=!0;o.length>0;){const l=o.shift();await Oe(),e.value=[...e.value,l].slice(-(t?.value??5))}n.value=!1}}function a(l){const d={id:r(),open:!0,...l},p=e.value.findIndex(h=>h.id===d.id);return p!==-1?(e.value[p]={...e.value[p],...d,_duplicate:(e.value[p]._duplicate||0)+1},d):(o.push(d),u(),d)}function s(l,d){const p=e.value.findIndex(h=>h.id===l);p!==-1&&(e.value[p]={...e.value[p],...d,duration:d.duration,open:!0,_updated:!0},Oe(()=>{const h=e.value.findIndex(m=>m.id===l);h!==-1&&e.value[h]._updated&&(e.value[h]={...e.value[h],_updated:void 0})}))}function i(l){const d=e.value.findIndex(p=>p.id===l);d!==-1&&e.value[d]._updated||(d!==-1&&(e.value[d]={...e.value[d],open:!1}),setTimeout(()=>{e.value=e.value.filter(p=>p.id!==l)},200))}function c(){e.value=[]}return{toasts:e,add:a,update:s,remove:i,clear:c}}const Gu=()=>{const e=Bn().public,t=Re(),n=R(!!e.i18n);if(!n.value){const a=t.$locale||"en",s=t.$localeMessages||{};return{isEnabled:n,locale:R(a),locales:[],localePath:i=>i,switchLocalePath:()=>{},t:i=>i.split(".").reduce((l,d)=>l?.[d],s)}}const o=t.$i18n?.locale||R("en"),r=t.$i18n?.t||(a=>a),u=e.docus?.filteredLocales||[];return{isEnabled:n,locale:o,locales:u,t:r,localePath:t.$localePath||(a=>a),switchLocalePath:t.$switchLocalePath||(()=>"")}};function q4(e){return e.toLowerCase().endsWith(".svg")}function $4(e){const t=e.match(/\.([a-z0-9]+)(?:\?|$)/i);return t?.[1]?`.${t[1].toLowerCase()}`:".png"}function _I(e,t){let n=e.replace(/fill="(black|white|#[0-9a-fA-F]{3,8}|rgba?\([^)]+\))"/g,'fill="currentColor"');return t&&(n=n.replace(/]*>)/,`$1${t}`)),n}async function ia(e,t){try{const n=new URL(e,window.location.origin).href,o=await fetch(n);if(!o.ok)return null;const r=await o.text();return _I(r,t)}catch{return null}}async function yc(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}function N4(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(n)}function j4(e,t){const n=document.createElement("a");n.href=e,n.download=t,document.body.appendChild(n),n.click(),document.body.removeChild(n)}const kI=()=>{const e=Pe(),t=Ib(),n=Lb(),{t:o}=Gu(),r=F(()=>!!(e.header?.logo?.light||e.header?.logo?.dark)),u=F(()=>e.header?.logo?.display||"logo"),a=F(()=>{const S=e.header?.logo;return S?t.value==="dark"?S.dark||S.light||"":S.light||S.dark||"":""}),s=F(()=>{const S=e.header?.logo?.wordmark;return!!(S?.light||S?.dark)}),i=F(()=>{const S=e.header?.logo?.wordmark;return S?t.value==="dark"?S.dark||S.light||"":S.light||S.dark||"":""}),c=F(()=>{const S=e.header?.logo;return S?u.value==="wordmark"&&s.value?S.wordmark?.light||S.wordmark?.dark||S.light||S.dark||"":S.light||S.dark||"":""}),l=F(()=>{const S=e.header?.logo;return S?u.value==="wordmark"&&s.value?S.wordmark?.dark||S.wordmark?.light||S.dark||S.light||"":S.dark||S.light||"":""}),d=F(()=>e.header?.logo?.favicon||"/favicon.ico"),p=F(()=>e.header?.logo?.alt||e.header?.title||""),h=F(()=>e.header?.title||p.value||""),m=F(()=>{const S=h.value;return S?S.toLowerCase().replace(/\s+/g,"-"):"logo"}),g=F(()=>{const S=h.value;return S?`${S} Logo`:"Logo"}),y=F(()=>{const S=h.value;return S?`${S} Wordmark`:"Wordmark"}),E=F(()=>q4(a.value)),b=F(()=>q4(i.value));async function v(){if(!E.value)return;const S=await ia(a.value,g.value);if(!S){n.add({title:o("logo.copyLogoFailed"),icon:"i-lucide-circle-x",color:"error"});return}const O=await yc(S);n.add(O?{title:o("logo.logoCopied"),icon:"i-lucide-circle-check",color:"success"}:{title:o("logo.copyLogoFailed"),icon:"i-lucide-circle-x",color:"error"})}async function C(){if(!b.value)return;const S=await ia(i.value,y.value);if(!S){n.add({title:o("logo.copyWordmarkFailed"),icon:"i-lucide-circle-x",color:"error"});return}const O=await yc(S);n.add(O?{title:o("logo.wordmarkCopied"),icon:"i-lucide-circle-check",color:"success"}:{title:o("logo.copyWordmarkFailed"),icon:"i-lucide-circle-x",color:"error"})}async function w(){const S=a.value;if(E.value){const O=await ia(S,g.value);if(!O)return;N4(new Blob([O],{type:"image/svg+xml"}),`${m.value}-logo.svg`)}else j4(S,`${m.value}-logo${$4(S)}`);n.add({title:o("logo.logoDownloaded"),icon:"i-lucide-download",color:"success"})}async function B(){const S=i.value;if(b.value){const O=await ia(S,y.value);if(!O)return;N4(new Blob([O],{type:"image/svg+xml"}),`${m.value}-wordmark.svg`)}else j4(S,`${m.value}-wordmark${$4(S)}`);n.add({title:o("logo.wordmarkDownloaded"),icon:"i-lucide-download",color:"success"})}const x=F(()=>e.header?.logo?.brandAssetsUrl||""),_=F(()=>{if(!r.value)return[];const S=[];E.value&&S.push({label:o("logo.copyLogo"),icon:"i-lucide-copy",onSelect:v}),s.value&&b.value&&S.push({label:o("logo.copyWordmark"),icon:"i-lucide-copy",onSelect:C});const O=[{label:o("logo.downloadLogo"),icon:"i-lucide-download",onSelect:w}];s.value&&O.push({label:o("logo.downloadWordmark"),icon:"i-lucide-download",onSelect:B});const H=[];return S.length&&H.push(S),H.push(O),x.value&&H.push([{label:o("logo.brandAssets"),icon:"i-lucide-palette",onSelect(){window.open(x.value,"_blank")}}]),H});return{hasLogo:r,displayMode:u,currentLogoUrl:a,headerLightUrl:c,headerDarkUrl:l,hasWordmark:s,currentWordmarkUrl:i,faviconUrl:d,logoAlt:p,contextMenuItems:_,copyLogo:v,downloadLogo:w,copyWordmark:C,downloadWordmark:B,copyTextToClipboard:yc,fetchSvgContent:ia}},SI={key:1},TI=L({__name:"AppHeaderLogo",setup(e){const t=Pe(),{hasLogo:n,headerLightUrl:o,headerDarkUrl:r,contextMenuItems:u}=kI();return(a,s)=>{const i=xI,c=BI;return f(n)?(D(),k(c,{key:0,items:f(u)},{default:A(()=>[q(i,{light:f(o),dark:f(r),alt:f(t).header?.logo?.alt||f(t).header?.title,class:U(["h-6 w-auto shrink-0",f(t).header?.logo?.class])},null,8,["light","dark","alt","class"])]),_:1},8,["items"])):(D(),re("span",SI,Fe(f(t).header?.title||"{appConfig.header.title}"),1))}}}),FI=Object.assign(TI,{__name:"AppHeaderLogo"});function qb(e){const t=_t({});return Ze(()=>{const n=Re().$nuxtSiteConfig.get(wt({resolveRefs:!0},e));t&&n&&Object.assign(t,n)}),delete t._priority,t}const PI=L({__name:"AppHeaderLeft",setup(e){const t=Pe(),n=qb(),{localePath:o}=Gu(),r=t.header?.title||n.name;return(u,a)=>{const s=FI,i=nf;return D(),k(i,{to:f(o)("/"),"aria-label":f(r)},{default:A(()=>[q(s,{class:"h-6 w-auto shrink-0"})]),_:1},8,["to","aria-label"])}}}),MI=Object.assign(PI,{__name:"AppHeaderLeft"}),OI={};function II(e,t){return D(),re("div")}const RI=Object.assign(Wu(OI,[["render",II]]),{__name:"AppHeaderCTA"}),LI={};function qI(e,t){return D(),re("div")}const $b=Object.assign(Wu(LI,[["render",qI]]),{__name:"AssistantChat"}),Nb=Object.freeze(Object.defineProperty({__proto__:null,default:$b},Symbol.toStringTag,{value:"Module"}));function Fl(e,t={}){const n=e.detail.originalEvent,o=n.target;if(!o?.isConnected){e.preventDefault();return}t.scrollable&&(n.offsetX>o.clientWidth||n.offsetY>o.clientHeight)&&e.preventDefault()}const $I={slots:{content:"bg-default shadow-lg rounded-md ring ring-default data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-popover-content-transform-origin) focus:outline-none pointer-events-auto",arrow:"fill-bg stroke-default"}},jb={__name:"UPopover",props:{mode:{type:null,required:!1,default:"click"},content:{type:Object,required:!1},arrow:{type:[Boolean,Object],required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},reference:{type:null,required:!1},dismissible:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:null,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},modal:{type:Boolean,required:!1},openDelay:{type:Number,required:!1,default:0},closeDelay:{type:Number,required:!1,default:0}},emits:["close:prevent","update:open"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=Pe(),a=Et("popover",n),s=n.mode==="hover"?Jt(n,"defaultOpen","open","openDelay","closeDelay"):Jt(n,"defaultOpen","open","modal"),i=it(s,o),c=tu(Ye(()=>n.portal)),l=Ye(()=>wt(n.content,{side:"bottom",sideOffset:8,collisionPadding:8})),d=F(()=>n.dismissible?{pointerDownOutside:Fl}:["interactOutside","escapeKeyDown"].reduce((y,E)=>(y[E]=b=>{b.preventDefault(),o("close:prevent")},y),{})),p=Ye(()=>wt(n.arrow,{rounded:!0})),h=F(()=>Se({extend:Se($I),...u.ui?.popover||{}})({side:l.value.side})),m=F(()=>n.mode==="hover"?wI:DI);return(g,y)=>(D(),k(f(m).Root,me(xe(f(i))),{default:A(({open:E,close:b})=>[r.default||e.reference?(D(),k(f(m).Trigger,{key:0,"as-child":"",reference:e.reference,class:U(n.class)},{default:A(()=>[P(g.$slots,"default",{open:E})]),_:2},1032,["reference","class"])):Y("",!0),"Anchor"in m.value&&r.anchor?(D(),k(f(m).Anchor,{key:1,"as-child":""},{default:A(()=>[P(g.$slots,"anchor",me(xe(b?{close:b}:{})))]),_:2},1024)):Y("",!0),q(f(m).Portal,me(xe(f(c))),{default:A(()=>[q(f(m).Content,j(l.value,{"data-slot":"content",class:h.value.content({class:[!r.default&&n.class,f(a)?.content]})},as(d.value)),{default:A(()=>[P(g.$slots,"content",me(xe(b?{close:b}:{}))),e.arrow?(D(),k(f(m).Arrow,j({key:0},p.value,{"data-slot":"arrow",class:h.value.arrow({class:f(a)?.arrow})}),null,16,["class"])):Y("",!0)]),_:2},1040,["class"])]),_:2},1040)]),_:3},16))}},NI={class:"text-lg"},jI={class:"flex flex-col"},VI={class:"text-sm"},zI={class:"size-5 text-center"},UI=L({__name:"LanguageSelect",setup(e){const{locale:t,locales:n,switchLocalePath:o}=Gu();function r(u){const a={ar:"sa",bn:"bd",ca:"es",ckb:"iq",cs:"cz",da:"dk",el:"gr",en:"gb",et:"ee",he:"il",hi:"in",hy:"am",ja:"jp",kk:"kz",km:"kh",ko:"kr",ky:"kg",lb:"lu",ms:"my",nb:"no",sl:"si",sv:"se",uk:"ua",ur:"pk",vi:"vn",es:"es",id:"id"},s=u.split("-")[0]?.toLowerCase()||u;return(a[s]||u.replace(/^.*-/,"").slice(0,2)).toUpperCase().split("").map(c=>String.fromCodePoint(127397+c.charCodeAt(0))).join("")}return(u,a)=>{const s=hn,i=nf,c=jb;return D(),k(c,{content:{align:"end"}},{content:A(()=>[je("ul",jI,[(D(!0),re(Ce,null,yt(f(n),l=>(D(),re("li",{key:l.code},[q(i,{class:"flex justify-between py-1.5 px-2 gap-1 hover:bg-muted",to:f(o)(l.code),"aria-label":l.name},{default:A(()=>[je("span",VI,Fe(l.name),1),je("span",zI,Fe(r(l.code)),1)]),_:2},1032,["to","aria-label"])]))),128))])]),default:A(()=>[q(s,{color:"neutral",variant:"ghost",class:"size-8"},{trailing:A(()=>[je("span",NI,Fe(r(f(t))),1)]),_:1})]),_:1})}}}),HI=Object.assign(UI,{__name:"LanguageSelect"}),KI={slots:{root:"flex items-center align-center text-center",border:"",container:"font-medium text-default flex",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xs",label:"text-sm"},variants:{color:{primary:{border:"border-primary"},secondary:{border:"border-secondary"},success:{border:"border-success"},info:{border:"border-info"},warning:{border:"border-warning"},error:{border:"border-error"},neutral:{border:"border-default"}},orientation:{horizontal:{root:"w-full flex-row",border:"w-full",container:"mx-3 whitespace-nowrap"},vertical:{root:"h-full flex-col",border:"h-full",container:"my-2"}},size:{xs:"",sm:"",md:"",lg:"",xl:""},type:{solid:{border:"border-solid"},dashed:{border:"border-dashed"},dotted:{border:"border-dotted"}}},compoundVariants:[{orientation:"horizontal",size:"xs",class:{border:"border-t"}},{orientation:"horizontal",size:"sm",class:{border:"border-t-[2px]"}},{orientation:"horizontal",size:"md",class:{border:"border-t-[3px]"}},{orientation:"horizontal",size:"lg",class:{border:"border-t-[4px]"}},{orientation:"horizontal",size:"xl",class:{border:"border-t-[5px]"}},{orientation:"vertical",size:"xs",class:{border:"border-s"}},{orientation:"vertical",size:"sm",class:{border:"border-s-[2px]"}},{orientation:"vertical",size:"md",class:{border:"border-s-[3px]"}},{orientation:"vertical",size:"lg",class:{border:"border-s-[4px]"}},{orientation:"vertical",size:"xl",class:{border:"border-s-[5px]"}}],defaultVariants:{color:"neutral",size:"xs",type:"solid"}},Vb={__name:"USeparator",props:{as:{type:null,required:!1},label:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},size:{type:null,required:!1},type:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},class:{type:null,required:!1},ui:{type:null,required:!1},decorative:{type:Boolean,required:!1}},setup(e){const t=e,n=qt(),o=Pe(),r=Et("separator",t),u=ln(Jt(t,"as","decorative","orientation")),a=F(()=>Se({extend:Se(KI),...o.ui?.separator||{}})({color:t.color,orientation:t.orientation,size:t.size,type:t.type}));return(s,i)=>(D(),k(f(cP),j(f(u),{"data-slot":"root",class:a.value.root({class:[f(r)?.root,t.class]})}),{default:A(()=>[je("div",{"data-slot":"border",class:U(a.value.border({class:f(r)?.border}))},null,2),e.label||e.icon||e.avatar||n.default?(D(),re(Ce,{key:0},[je("div",{"data-slot":"container",class:U(a.value.container({class:f(r)?.container}))},[P(s.$slots,"default",{ui:a.value},()=>[e.label?(D(),re("span",{key:0,"data-slot":"label",class:U(a.value.label({class:f(r)?.label}))},Fe(e.label),3)):e.icon?(D(),k(st,{key:1,name:e.icon,"data-slot":"icon",class:U(a.value.icon({class:f(r)?.icon}))},null,8,["name","class"])):e.avatar?(D(),k(Ku,j({key:2,size:f(r)?.avatarSize||a.value.avatarSize()},e.avatar,{"data-slot":"avatar",class:a.value.avatar({class:f(r)?.avatar})}),null,16,["size","class"])):Y("",!0)])],2),je("div",{"data-slot":"border",class:U(a.value.border({class:f(r)?.border}))},null,2)],64)):Y("",!0)]),_:3},16,["class"]))}},zb=Object.assign({inheritAttrs:!1},{__name:"UColorModeButton",props:{color:{type:null,required:!1,default:"neutral"},variant:{type:null,required:!1,default:"ghost"},label:{type:String,required:!1},activeColor:{type:null,required:!1},activeVariant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},block:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},as:{type:null,required:!1},type:{type:null,required:!1},disabled:{type:Boolean,required:!1},exactActiveClass:{type:String,required:!1},viewTransition:{type:Boolean,required:!1}},setup(e){const t=e,{t:n}=Vo(),o=Ib(),r=Pe(),u=Et("button",t),a=ln(No(t,"icon")),s=F({get(){return o.value==="dark"},set(i){o.preference=i?"dark":"light"}});return(i,c)=>(D(),k(hn,j({...f(a),"aria-label":s.value?f(n)("colorMode.switchToLight"):f(n)("colorMode.switchToDark"),...i.$attrs},{onClick:c[0]||(c[0]=l=>s.value=!s.value)}),{leading:A(({ui:l})=>[q(st,{class:U(l.leadingIcon({class:[f(u)?.leadingIcon,"hidden dark:inline-block"]})),name:f(r).ui.icons.dark},null,8,["class","name"]),q(st,{class:U(l.leadingIcon({class:[f(u)?.leadingIcon,"dark:hidden"]})),name:f(r).ui.icons.light},null,8,["class","name"])]),_:1},16))}});function gs(e,t){const n=typeof e=="string"&&!t?`${e}Context`:t,o=Symbol(n);return[a=>{const s=Ue(o,a);if(s===void 0)throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`);return s},a=>(Pt(o,a),a),o]}function WI(e,t){const{layoutGroup:n,presenceContext:o,config:r}=t,u=n.id&&e.layoutId?`${n.id}-${e.layoutId}`:e.layoutId||void 0;return{...e,layoutId:u,transition:e.transition??r.transition,layoutGroup:n,motionConfig:r,inViewOptions:e.inViewOptions??r.inViewOptions,presenceContext:o,initial:o.initial===!1?o.initial:e.initial===!0?void 0:e.initial}}function Of(e,t){e.indexOf(t)===-1&&e.push(t)}function Ni(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const po=(e,t,n)=>n>t?t:n{};const pr={},Ub=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function Hb(e){return typeof e=="object"&&e!==null}const Kb=e=>/^0[^.\s]+$/u.test(e);function Wb(e){let t;return()=>(t===void 0&&(t=e()),t)}const In=e=>e,GI=(e,t)=>n=>t(e(n)),vs=(...e)=>e.reduce(GI),Ga=(e,t,n)=>{const o=t-e;return o===0?1:(n-e)/o};class Rf{constructor(){this.subscriptions=[]}add(t){return Of(this.subscriptions,t),()=>Ni(this.subscriptions,t)}notify(t,n,o){const r=this.subscriptions.length;if(r)if(r===1)this.subscriptions[0](t,n,o);else for(let u=0;ue*1e3,Mn=e=>e/1e3;function Gb(e,t){return t?e*(1e3/t):0}const Yb=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,YI=1e-7,ZI=12;function XI(e,t,n,o,r){let u,a,s=0;do a=t+(n-t)/2,u=Yb(a,o,r)-e,u>0?n=a:t=a;while(Math.abs(u)>YI&&++sXI(u,0,1,e,n);return u=>u===0||u===1?u:Yb(r(u),t,o)}const Zb=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,Xb=e=>t=>1-e(1-t),Jb=ys(.33,1.53,.69,.99),Lf=Xb(Jb),Qb=Zb(Lf),e6=e=>e>=1?1:(e*=2)<1?.5*Lf(e):.5*(2-Math.pow(2,-10*(e-1))),qf=e=>1-Math.sin(Math.acos(e)),t6=Xb(qf),n6=Zb(qf),JI=ys(.42,0,1,1),QI=ys(0,0,.58,1),o6=ys(.42,0,.58,1),eR=e=>Array.isArray(e)&&typeof e[0]!="number",r6=e=>Array.isArray(e)&&typeof e[0]=="number",tR={linear:In,easeIn:JI,easeInOut:o6,easeOut:QI,circIn:qf,circInOut:n6,circOut:t6,backIn:Lf,backInOut:Qb,backOut:Jb,anticipate:e6},nR=e=>typeof e=="string",V4=e=>{if(r6(e)){If(e.length===4);const[t,n,o,r]=e;return ys(t,n,o,r)}else if(nR(e))return tR[e];return e},Ws=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function oR(e,t){let n=new Set,o=new Set,r=!1,u=!1;const a=new WeakSet;let s={delta:0,timestamp:0,isProcessing:!1};function i(l){a.has(l)&&(c.schedule(l),e()),l(s)}const c={schedule:(l,d=!1,p=!1)=>{const m=p&&r?n:o;return d&&a.add(l),m.add(l),l},cancel:l=>{o.delete(l),a.delete(l)},process:l=>{if(s=l,r){u=!0;return}r=!0;const d=n;n=o,o=d,n.forEach(i),n.clear(),r=!1,u&&(u=!1,c.process(l))}};return c}const rR=40;function u6(e,t){let n=!1,o=!0;const r={delta:0,timestamp:0,isProcessing:!1},u=()=>n=!0,a=Ws.reduce((v,C)=>(v[C]=oR(u),v),{}),{setup:s,read:i,resolveKeyframes:c,preUpdate:l,update:d,preRender:p,render:h,postRender:m}=a,g=()=>{const v=pr.useManualTiming,C=v?r.timestamp:performance.now();n=!1,v||(r.delta=o?1e3/60:Math.max(Math.min(C-r.timestamp,rR),1)),r.timestamp=C,r.isProcessing=!0,s.process(r),i.process(r),c.process(r),l.process(r),d.process(r),p.process(r),h.process(r),m.process(r),r.isProcessing=!1,n&&t&&(o=!1,e(g))},y=()=>{n=!0,o=!0,r.isProcessing||e(g)};return{schedule:Ws.reduce((v,C)=>{const w=a[C];return v[C]=(B,x=!1,_=!1)=>(n||y(),w.schedule(B,x,_)),v},{}),cancel:v=>{for(let C=0;C(ii===void 0&&rn.set(Nt.isProcessing||pr.useManualTiming?Nt.timestamp:performance.now()),ii),set:e=>{ii=e,queueMicrotask(uR)}},a6=e=>t=>typeof t=="string"&&t.startsWith(e),$f=a6("--"),aR=a6("var(--"),Nf=e=>aR(e)?sR.test(e.split("/*")[0].trim()):!1,sR=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function z4(e){return typeof e!="string"?!1:e.split("/*")[0].includes("var(--")}const Yu={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},Ya={...Yu,transform:e=>po(0,1,e)},Gs={...Yu,default:1},Ba=e=>Math.round(e*1e5)/1e5,jf=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function iR(e){return e==null}const lR=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Vf=(e,t)=>n=>!!(typeof n=="string"&&lR.test(n)&&n.startsWith(e)||t&&!iR(n)&&Object.prototype.hasOwnProperty.call(n,t)),s6=(e,t,n)=>o=>{if(typeof o!="string")return o;const[r,u,a,s]=o.match(jf);return{[e]:parseFloat(r),[t]:parseFloat(u),[n]:parseFloat(a),alpha:s!==void 0?parseFloat(s):1}},cR=e=>po(0,255,e),Ec={...Yu,transform:e=>Math.round(cR(e))},Pr={test:Vf("rgb","red"),parse:s6("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:o=1})=>"rgba("+Ec.transform(e)+", "+Ec.transform(t)+", "+Ec.transform(n)+", "+Ba(Ya.transform(o))+")"};function dR(e){let t="",n="",o="",r="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),o=e.substring(5,7),r=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),o=e.substring(3,4),r=e.substring(4,5),t+=t,n+=n,o+=o,r+=r),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(o,16),alpha:r?parseInt(r,16)/255:1}}const K0={test:Vf("#"),parse:dR,transform:Pr.transform},bs=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Xo=bs("deg"),co=bs("%"),he=bs("px"),fR=bs("vh"),pR=bs("vw"),U4={...co,parse:e=>co.parse(e)/100,transform:e=>co.transform(e*100)},cu={test:Vf("hsl","hue"),parse:s6("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:o=1})=>"hsla("+Math.round(e)+", "+co.transform(Ba(t))+", "+co.transform(Ba(n))+", "+Ba(Ya.transform(o))+")"},Tt={test:e=>Pr.test(e)||K0.test(e)||cu.test(e),parse:e=>Pr.test(e)?Pr.parse(e):cu.test(e)?cu.parse(e):K0.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?Pr.transform(e):cu.transform(e),getAnimatableNone:e=>{const t=Tt.parse(e);return t.alpha=0,Tt.transform(t)}},hR=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function mR(e){return isNaN(e)&&typeof e=="string"&&(e.match(jf)?.length||0)+(e.match(hR)?.length||0)>0}const i6="number",l6="color",gR="var",vR="var(",H4="${}",yR=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Mu(e){const t=e.toString(),n=[],o={color:[],number:[],var:[]},r=[];let u=0;const s=t.replace(yR,i=>(Tt.test(i)?(o.color.push(u),r.push(l6),n.push(Tt.parse(i))):i.startsWith(vR)?(o.var.push(u),r.push(gR),n.push(i)):(o.number.push(u),r.push(i6),n.push(parseFloat(i))),++u,H4)).split(H4);return{values:n,split:s,indexes:o,types:r}}function bR(e){return Mu(e).values}function c6({split:e,types:t}){const n=e.length;return o=>{let r="";for(let u=0;utypeof e=="number"?0:Tt.test(e)?Tt.getAnimatableNone(e):e,xR=(e,t)=>typeof e=="number"?t?.trim().endsWith("/")?e:0:CR(e);function wR(e){const t=Mu(e);return c6(t)(t.values.map((o,r)=>xR(o,t.split[r])))}const zn={test:mR,parse:bR,createTransformer:ER,getAnimatableNone:wR};function Cc(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function DR({hue:e,saturation:t,lightness:n,alpha:o}){e/=360,t/=100,n/=100;let r=0,u=0,a=0;if(!t)r=u=a=n;else{const s=n<.5?n*(1+t):n+t-n*t,i=2*n-s;r=Cc(i,s,e+1/3),u=Cc(i,s,e),a=Cc(i,s,e-1/3)}return{red:Math.round(r*255),green:Math.round(u*255),blue:Math.round(a*255),alpha:o}}function ji(e,t){return n=>n>0?t:e}const ft=(e,t,n)=>e+(t-e)*n,xc=(e,t,n)=>{const o=e*e,r=n*(t*t-o)+o;return r<0?0:Math.sqrt(r)},AR=[K0,Pr,cu],BR=e=>AR.find(t=>t.test(e));function K4(e){const t=BR(e);if(!t)return!1;let n=t.parse(e);return t===cu&&(n=DR(n)),n}const W4=(e,t)=>{const n=K4(e),o=K4(t);if(!n||!o)return ji(e,t);const r={...n};return u=>(r.red=xc(n.red,o.red,u),r.green=xc(n.green,o.green,u),r.blue=xc(n.blue,o.blue,u),r.alpha=ft(n.alpha,o.alpha,u),Pr.transform(r))},W0=new Set(["none","hidden"]);function _R(e,t){return W0.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function kR(e,t){return n=>ft(e,t,n)}function zf(e){return typeof e=="number"?kR:typeof e=="string"?Nf(e)?ji:Tt.test(e)?W4:FR:Array.isArray(e)?d6:typeof e=="object"?Tt.test(e)?W4:SR:ji}function d6(e,t){const n=[...e],o=n.length,r=e.map((u,a)=>zf(u)(u,t[a]));return u=>{for(let a=0;a{for(const u in o)n[u]=o[u](r);return n}}function TR(e,t){const n=[],o={color:0,var:0,number:0};for(let r=0;r{const n=zn.createTransformer(t),o=Mu(e),r=Mu(t);return o.indexes.var.length===r.indexes.var.length&&o.indexes.color.length===r.indexes.color.length&&o.indexes.number.length>=r.indexes.number.length?W0.has(e)&&!r.values.length||W0.has(t)&&!o.values.length?_R(e,t):vs(d6(TR(o,r),r.values),n):ji(e,t)};function f6(e,t,n){return typeof e=="number"&&typeof t=="number"&&typeof n=="number"?ft(e,t,n):zf(e)(e,t)}const PR=e=>{const t=({timestamp:n})=>e(n);return{start:(n=!0)=>Je.update(t,n),stop:()=>hr(t),now:()=>Nt.isProcessing?Nt.timestamp:rn.now()}},p6=(e,t,n=10)=>{let o="";const r=Math.max(Math.round(t/n),2);for(let u=0;u=Vi?1/0:t}function MR(e,t=100,n){const o=n({...e,keyframes:[0,t]}),r=Math.min(Uf(o),Vi);return{type:"keyframes",ease:u=>o.next(r*u).value/t,duration:Mn(r)}}const xt={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1};function G0(e,t){return e*Math.sqrt(1-t*t)}const OR=12;function IR(e,t,n){let o=n;for(let r=1;r{const l=c*a,d=l*e,p=l-n,h=G0(c,a),m=Math.exp(-d);return wc-p/h*m},u=c=>{const d=c*a*e,p=d*n+n,h=Math.pow(a,2)*Math.pow(c,2)*e,m=Math.exp(-d),g=G0(Math.pow(c,2),a);return(-r(c)+wc>0?-1:1)*((p-h)*m)/g}):(r=c=>{const l=Math.exp(-c*e),d=(c-n)*e+1;return-wc+l*d},u=c=>{const l=Math.exp(-c*e),d=(n-c)*(e*e);return l*d});const s=5/e,i=IR(r,u,s);if(e=Rn(e),isNaN(i))return{stiffness:xt.stiffness,damping:xt.damping,duration:e};{const c=Math.pow(i,2)*o;return{stiffness:c,damping:a*2*Math.sqrt(o*c),duration:e}}}const LR=["duration","bounce"],qR=["stiffness","damping","mass"];function G4(e,t){return t.some(n=>e[n]!==void 0)}function $R(e){let t={velocity:xt.velocity,stiffness:xt.stiffness,damping:xt.damping,mass:xt.mass,isResolvedFromDuration:!1,...e};if(!G4(e,qR)&&G4(e,LR))if(t.velocity=0,e.visualDuration){const n=e.visualDuration,o=2*Math.PI/(n*1.2),r=o*o,u=2*po(.05,1,1-(e.bounce||0))*Math.sqrt(r);t={...t,mass:xt.mass,stiffness:r,damping:u}}else{const n=RR({...e,velocity:0});t={...t,...n,mass:xt.mass},t.isResolvedFromDuration=!0}return t}function zi(e=xt.visualDuration,t=xt.bounce){const n=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:o,restDelta:r}=n;const u=n.keyframes[0],a=n.keyframes[n.keyframes.length-1],s={done:!1,value:u},{stiffness:i,damping:c,mass:l,duration:d,velocity:p,isResolvedFromDuration:h}=$R({...n,velocity:-Mn(n.velocity||0)}),m=p||0,g=c/(2*Math.sqrt(i*l)),y=a-u,E=Mn(Math.sqrt(i/l)),b=Math.abs(y)<5;o||(o=b?xt.restSpeed.granular:xt.restSpeed.default),r||(r=b?xt.restDelta.granular:xt.restDelta.default);let v,C,w,B,x,_;if(g<1)w=G0(E,g),B=(m+g*E*y)/w,v=O=>{const H=Math.exp(-g*E*O);return a-H*(B*Math.sin(w*O)+y*Math.cos(w*O))},x=g*E*B+y*w,_=g*E*y-B*w,C=O=>Math.exp(-g*E*O)*(x*Math.sin(w*O)+_*Math.cos(w*O));else if(g===1){v=H=>a-Math.exp(-E*H)*(y+(m+E*y)*H);const O=m+E*y;C=H=>Math.exp(-E*H)*(E*O*H-m)}else{const O=E*Math.sqrt(g*g-1);v=G=>{const $=Math.exp(-g*E*G),I=Math.min(O*G,300);return a-$*((m+g*E*y)*Math.sinh(I)+O*y*Math.cosh(I))/O};const H=(m+g*E*y)/O,N=g*E*H-y*O,J=g*E*y-H*O;C=G=>{const $=Math.exp(-g*E*G),I=Math.min(O*G,300);return $*(N*Math.sinh(I)+J*Math.cosh(I))}}const S={calculatedDuration:h&&d||null,velocity:O=>Rn(C(O)),next:O=>{if(!h&&g<1){const N=Math.exp(-g*E*O),J=Math.sin(w*O),G=Math.cos(w*O),$=a-N*(B*J+y*G),I=Rn(N*(x*J+_*G));return s.done=Math.abs(I)<=o&&Math.abs(a-$)<=r,s.value=s.done?a:$,s}const H=v(O);if(h)s.done=O>=d;else{const N=Rn(C(O));s.done=Math.abs(N)<=o&&Math.abs(a-H)<=r}return s.value=s.done?a:H,s},toString:()=>{const O=Math.min(Uf(S),Vi),H=p6(N=>S.next(O*N).value,O,30);return O+"ms "+H},toTransition:()=>{}};return S}zi.applyToOptions=e=>{const t=MR(e,100,zi);return e.ease=t.ease,e.duration=Rn(t.duration),e.type="keyframes",e};const NR=5;function h6(e,t,n){const o=Math.max(t-NR,0);return Gb(n-e(o),t-o)}function Y0({keyframes:e,velocity:t=0,power:n=.8,timeConstant:o=325,bounceDamping:r=10,bounceStiffness:u=500,modifyTarget:a,min:s,max:i,restDelta:c=.5,restSpeed:l}){const d=e[0],p={done:!1,value:d},h=_=>s!==void 0&&_i,m=_=>s===void 0?i:i===void 0||Math.abs(s-_)-g*Math.exp(-_/o),v=_=>E+b(_),C=_=>{const S=b(_),O=v(_);p.done=Math.abs(S)<=c,p.value=p.done?E:O};let w,B;const x=_=>{h(p.value)&&(w=_,B=zi({keyframes:[p.value,m(p.value)],velocity:h6(v,_,p.value),damping:r,stiffness:u,restDelta:c,restSpeed:l}))};return x(0),{calculatedDuration:null,next:_=>{let S=!1;return!B&&w===void 0&&(S=!0,C(_),x(_)),w!==void 0&&_>=w?B.next(_-w):(!S&&C(_),p)}}}function jR(e,t,n){const o=[],r=n||pr.mix||f6,u=e.length-1;for(let a=0;at[0];if(u===2&&t[0]===t[1])return()=>t[1];const a=e[0]===e[1];e[0]>e[u-1]&&(e=[...e].reverse(),t=[...t].reverse());const s=jR(t,o,r),i=s.length,c=l=>{if(a&&l1)for(;dc(po(e[0],e[u-1],l)):c}function zR(e,t){const n=e[e.length-1];for(let o=1;o<=t;o++){const r=Ga(0,t,o);e.push(ft(n,1,r))}}function UR(e){const t=[0];return zR(t,e.length-1),t}function HR(e,t){return e.map(n=>n*t)}function KR(e,t){return e.map(()=>t||o6).splice(0,e.length-1)}function _a({duration:e=300,keyframes:t,times:n,ease:o="easeInOut"}){const r=eR(o)?o.map(V4):V4(o),u={done:!1,value:t[0]},a=HR(n&&n.length===t.length?n:UR(t),e),s=VR(a,t,{ease:Array.isArray(r)?r:KR(t,r)});return{calculatedDuration:e,next:i=>(u.value=s(i),u.done=i>=e,u)}}const WR=e=>e!==null;function Pl(e,{repeat:t,repeatType:n="loop"},o,r=1){const u=e.filter(WR),s=r<0||t&&n!=="loop"&&t%2===1?0:u.length-1;return!s||o===void 0?u[s]:o}const GR={decay:Y0,inertia:Y0,tween:_a,keyframes:_a,spring:zi};function m6(e){typeof e.type=="string"&&(e.type=GR[e.type])}class Hf{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,n){return this.finished.then(t,n)}}const YR=e=>e/100;class Ui extends Hf{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.delayState={done:!1,value:void 0},this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==rn.now()&&this.tick(rn.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;m6(t);const{type:n=_a,repeat:o=0,repeatDelay:r=0,repeatType:u,velocity:a=0}=t;let{keyframes:s}=t;const i=n||_a;i!==_a&&typeof s[0]!="number"&&(this.mixKeyframes=vs(YR,f6(s[0],s[1])),s=[0,100]);const c=i({...t,keyframes:s});u==="mirror"&&(this.mirroredGenerator=i({...t,keyframes:[...s].reverse(),velocity:-a})),c.calculatedDuration===null&&(c.calculatedDuration=Uf(c));const{calculatedDuration:l}=c;this.calculatedDuration=l,this.resolvedDuration=l+r,this.totalDuration=this.resolvedDuration*(o+1)-r,this.generator=c}updateTime(t){const n=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(t,n=!1){const{generator:o,totalDuration:r,mixKeyframes:u,mirroredGenerator:a,resolvedDuration:s,calculatedDuration:i}=this;if(this.startTime===null)return o.next(0);const{delay:c=0,keyframes:l,repeat:d,repeatType:p,repeatDelay:h,type:m,onUpdate:g,finalKeyframe:y}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-r/this.speed,this.startTime)),n?this.currentTime=t:this.updateTime(t);const E=this.currentTime-c*(this.playbackSpeed>=0?1:-1),b=this.playbackSpeed>=0?E<0:E>r;this.currentTime=Math.max(E,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=r);let v=this.currentTime,C=o;if(d){const _=Math.min(this.currentTime,r)/s;let S=Math.floor(_),O=_%1;!O&&_>=1&&(O=1),O===1&&S--,S=Math.min(S,d+1),S%2&&(p==="reverse"?(O=1-O,h&&(O-=h/s)):p==="mirror"&&(C=a)),v=po(0,1,O)*s}let w;b?(this.delayState.value=l[0],w=this.delayState):w=C.next(v),u&&!b&&(w.value=u(w.value));let{done:B}=w;!b&&i!==null&&(B=this.playbackSpeed>=0?this.currentTime>=r:this.currentTime<=0);const x=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&B);return x&&m!==Y0&&(w.value=Pl(l,this.options,y,this.speed)),g&&g(w.value),x&&this.finish(),w}then(t,n){return this.finished.then(t,n)}get duration(){return Mn(this.calculatedDuration)}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Mn(t)}get time(){return Mn(this.currentTime)}set time(t){t=Rn(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=t,this.tick(t))}getGeneratorVelocity(){const t=this.currentTime;if(t<=0)return this.options.velocity||0;if(this.generator.velocity)return this.generator.velocity(t);const n=this.generator.next(t).value;return h6(o=>this.generator.next(o).value,t,n)}get speed(){return this.playbackSpeed}set speed(t){const n=this.playbackSpeed!==t;n&&this.driver&&this.updateTime(rn.now()),this.playbackSpeed=t,n&&this.driver&&(this.time=Mn(this.currentTime))}play(){if(this.isStopped)return;const{driver:t=PR,startTime:n}=this.options;this.driver||(this.driver=t(r=>this.tick(r))),this.options.onPlay?.();const o=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=o):this.holdTime!==null?this.startTime=o-this.holdTime:this.startTime||(this.startTime=n??o),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(rn.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),t.observe(this)}}function ZR(e){for(let t=1;te*180/Math.PI,Z0=e=>{const t=Mr(Math.atan2(e[1],e[0]));return X0(t)},XR={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:Z0,rotateZ:Z0,skewX:e=>Mr(Math.atan(e[1])),skewY:e=>Mr(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},X0=e=>(e=e%360,e<0&&(e+=360),e),Y4=Z0,Z4=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),X4=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),JR={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Z4,scaleY:X4,scale:e=>(Z4(e)+X4(e))/2,rotateX:e=>X0(Mr(Math.atan2(e[6],e[5]))),rotateY:e=>X0(Mr(Math.atan2(-e[2],e[0]))),rotateZ:Y4,rotate:Y4,skewX:e=>Mr(Math.atan(e[4])),skewY:e=>Mr(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function J0(e){return e.includes("scale")?1:0}function Q0(e,t){if(!e||e==="none")return J0(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let o,r;if(n)o=JR,r=n;else{const s=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);o=XR,r=s}if(!r)return J0(t);const u=o[t],a=r[1].split(",").map(eL);return typeof u=="function"?u(a):a[u]}const QR=(e,t)=>{const{transform:n="none"}=getComputedStyle(e);return Q0(n,t)};function eL(e){return parseFloat(e.trim())}const Zu=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Xu=new Set(Zu),J4=e=>e===Yu||e===he,tL=new Set(["x","y","z"]),nL=Zu.filter(e=>!tL.has(e));function oL(e){const t=[];return nL.forEach(n=>{const o=e.getValue(n);o!==void 0&&(t.push([n,o.get()]),o.set(n.startsWith("scale")?1:0))}),t}const rr={width:({x:e},{paddingLeft:t="0",paddingRight:n="0",boxSizing:o})=>{const r=e.max-e.min;return o==="border-box"?r:r-parseFloat(t)-parseFloat(n)},height:({y:e},{paddingTop:t="0",paddingBottom:n="0",boxSizing:o})=>{const r=e.max-e.min;return o==="border-box"?r:r-parseFloat(t)-parseFloat(n)},top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>Q0(t,"x"),y:(e,{transform:t})=>Q0(t,"y")};rr.translateX=rr.x;rr.translateY=rr.y;const Nr=new Set;let ed=!1,td=!1,nd=!1;function g6(){if(td){const e=Array.from(Nr).filter(o=>o.needsMeasurement),t=new Set(e.map(o=>o.element)),n=new Map;t.forEach(o=>{const r=oL(o);r.length&&(n.set(o,r),o.render())}),e.forEach(o=>o.measureInitialState()),t.forEach(o=>{o.render();const r=n.get(o);r&&r.forEach(([u,a])=>{o.getValue(u)?.set(a)})}),e.forEach(o=>o.measureEndState()),e.forEach(o=>{o.suspendedScrollY!==void 0&&window.scrollTo(0,o.suspendedScrollY)})}td=!1,ed=!1,Nr.forEach(e=>e.complete(nd)),Nr.clear()}function v6(){Nr.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(td=!0)})}function rL(){nd=!0,v6(),g6(),nd=!1}class Kf{constructor(t,n,o,r,u,a=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=n,this.name=o,this.motionValue=r,this.element=u,this.isAsync=a}scheduleResolve(){this.state="scheduled",this.isAsync?(Nr.add(this),ed||(ed=!0,Je.read(v6),Je.resolveKeyframes(g6))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:n,element:o,motionValue:r}=this;if(t[0]===null){const u=r?.get(),a=t[t.length-1];if(u!==void 0)t[0]=u;else if(o&&n){const s=o.readValue(n,a);s!=null&&(t[0]=s)}t[0]===void 0&&(t[0]=a),r&&u===void 0&&r.set(t[0])}ZR(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),Nr.delete(this)}cancel(){this.state==="scheduled"&&(Nr.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const uL=e=>e.startsWith("--");function y6(e,t,n){uL(t)?e.style.setProperty(t,n):e.style[t]=n}const aL={};function b6(e,t){const n=Wb(e);return()=>aL[t]??n()}const sL=b6(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),E6=b6(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),ga=([e,t,n,o])=>`cubic-bezier(${e}, ${t}, ${n}, ${o})`,Q4={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:ga([0,.65,.55,1]),circOut:ga([.55,0,1,.45]),backIn:ga([.31,.01,.66,-.59]),backOut:ga([.33,1.53,.69,.99])};function C6(e,t){if(e)return typeof e=="function"?E6()?p6(e,t):"ease-out":r6(e)?ga(e):Array.isArray(e)?e.map(n=>C6(n,t)||Q4.easeOut):Q4[e]}function iL(e,t,n,{delay:o=0,duration:r=300,repeat:u=0,repeatType:a="loop",ease:s="easeOut",times:i}={},c=void 0){const l={[t]:n};i&&(l.offset=i);const d=C6(s,r);Array.isArray(d)&&(l.easing=d);const p={delay:o,duration:r,easing:Array.isArray(d)?"linear":d,fill:"both",iterations:u+1,direction:a==="reverse"?"alternate":"normal"};return c&&(p.pseudoElement=c),e.animate(l,p)}function x6(e){return typeof e=="function"&&"applyToOptions"in e}function lL({type:e,...t}){return x6(e)&&E6()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class w6 extends Hf{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!t)return;const{element:n,name:o,keyframes:r,pseudoElement:u,allowFlatten:a=!1,finalKeyframe:s,onComplete:i}=t;this.isPseudoElement=!!u,this.allowFlatten=a,this.options=t,If(typeof t.type!="string");const c=lL(t);this.animation=iL(n,o,r,c,u),c.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!u){const l=Pl(r,this.options,s,this.speed);this.updateMotionValue&&this.updateMotionValue(l),y6(n,o,l),this.animation.cancel()}i?.(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){const t=this.options?.element;!this.isPseudoElement&&t?.isConnected&&this.animation.commitStyles?.()}get duration(){const t=this.animation.effect?.getComputedTiming?.().duration||0;return Mn(Number(t))}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Mn(t)}get time(){return Mn(Number(this.animation.currentTime)||0)}set time(t){const n=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=Rn(t),n&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(t){this.manualStartTime=this.animation.startTime=t}attachTimeline({timeline:t,rangeStart:n,rangeEnd:o,observe:r}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,t&&sL()?(this.animation.timeline=t,n&&(this.animation.rangeStart=n),o&&(this.animation.rangeEnd=o),In):r(this)}}const D6={anticipate:e6,backInOut:Qb,circInOut:n6};function cL(e){return e in D6}function dL(e){typeof e.ease=="string"&&cL(e.ease)&&(e.ease=D6[e.ease])}const Dc=10;class fL extends w6{constructor(t){dL(t),m6(t),super(t),t.startTime!==void 0&&t.autoplay!==!1&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:n,onUpdate:o,onComplete:r,element:u,...a}=this.options;if(!n)return;if(t!==void 0){n.set(t);return}const s=new Ui({...a,autoplay:!1}),i=Math.max(Dc,rn.now()-this.startTime),c=po(0,Dc,i-Dc),l=s.sample(i).value,{name:d}=this.options;u&&d&&y6(u,d,l),n.setWithVelocity(s.sample(Math.max(0,i-c)).value,l,c),s.stop()}}const em=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(zn.test(e)||e==="0")&&!e.startsWith("url("));function pL(e){const t=e[0];if(e.length===1)return!0;for(let n=0;nObject.hasOwnProperty.call(Element.prototype,"animate"));function bL(e){const{motionValue:t,name:n,repeatDelay:o,repeatType:r,damping:u,type:a,keyframes:s}=e;if(!(t?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:c,transformTemplate:l}=t.owner.getProps();return yL()&&n&&(A6.has(n)||vL.has(n)&&gL(s))&&(n!=="transform"||!l)&&!c&&!o&&r!=="mirror"&&u!==0&&a!=="inertia"}const EL=40;class CL extends Hf{constructor({autoplay:t=!0,delay:n=0,type:o="keyframes",repeat:r=0,repeatDelay:u=0,repeatType:a="loop",keyframes:s,name:i,motionValue:c,element:l,...d}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=rn.now();const p={autoplay:t,delay:n,type:o,repeat:r,repeatDelay:u,repeatType:a,name:i,motionValue:c,element:l,...d},h=l?.KeyframeResolver||Kf;this.keyframeResolver=new h(s,(m,g,y)=>this.onKeyframesResolved(m,g,p,!y),i,c,l),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(t,n,o,r){this.keyframeResolver=void 0;const{name:u,type:a,velocity:s,delay:i,isHandoff:c,onUpdate:l}=o;this.resolvedAt=rn.now();let d=!0;hL(t,u,a,s)||(d=!1,(pr.instantAnimations||!i)&&l?.(Pl(t,o,n)),t[0]=t[t.length-1],od(o),o.repeat=0);const h={startTime:r?this.resolvedAt?this.resolvedAt-this.createdAt>EL?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...o,keyframes:t},m=d&&!c&&bL(h),g=h.motionValue?.owner?.current;let y;if(m)try{y=new fL({...h,element:g})}catch{y=new Ui(h)}else y=new Ui(h);y.finished.then(()=>{this.notifyFinished()}).catch(In),this.pendingTimeline&&(this.stopTimeline=y.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=y}get finished(){return this._animation?this.animation.finished:this._finished}then(t,n){return this.finished.finally(t).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),rL()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}function B6(e,t,n,o=0,r=1){const u=Array.from(e).sort((c,l)=>c.sortNodePosition(l)).indexOf(t),a=e.size,s=(a-1)*o;return typeof n=="function"?n(u,a):r===1?u*o:s-u*o}const xL=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function wL(e){const t=xL.exec(e);if(!t)return[,];const[,n,o,r]=t;return[`--${n??o}`,r]}function _6(e,t,n=1){const[o,r]=wL(e);if(!o)return;const u=window.getComputedStyle(t).getPropertyValue(o);if(u){const a=u.trim();return Ub(a)?parseFloat(a):a}return Nf(r)?_6(r,t,n+1):r}const DL={type:"spring",stiffness:500,damping:25,restSpeed:10},AL=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),BL={type:"keyframes",duration:.8},_L={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},kL=(e,{keyframes:t})=>t.length>2?BL:Xu.has(e)?e.startsWith("scale")?AL(t[1]):DL:_L;function k6(e,t){if(e?.inherit&&t){const{inherit:n,...o}=e;return{...t,...o}}return e}function Wf(e,t){const n=e?.[t]??e?.default??e;return n!==e?k6(n,e):n}const SL=new Set(["when","delay","delayChildren","staggerChildren","staggerDirection","repeat","repeatType","repeatDelay","from","elapsed"]);function TL(e){for(const t in e)if(!SL.has(t))return!0;return!1}const Gf=(e,t,n,o={},r,u)=>a=>{const s=Wf(o,e)||{},i=s.delay||o.delay||0;let{elapsed:c=0}=o;c=c-Rn(i);const l={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...s,delay:-c,onUpdate:p=>{t.set(p),s.onUpdate&&s.onUpdate(p)},onComplete:()=>{a(),s.onComplete&&s.onComplete()},name:e,motionValue:t,element:u?void 0:r};TL(s)||Object.assign(l,kL(e,l)),l.duration&&(l.duration=Rn(l.duration)),l.repeatDelay&&(l.repeatDelay=Rn(l.repeatDelay)),l.from!==void 0&&(l.keyframes[0]=l.from);let d=!1;if((l.type===!1||l.duration===0&&!l.repeatDelay)&&(od(l),l.delay===0&&(d=!0)),(pr.instantAnimations||pr.skipAnimations||r?.shouldSkipAnimations)&&(d=!0,od(l),l.delay=0),l.allowFlatten=!s.type&&!s.ease,d&&!u&&t.get()!==void 0){const p=Pl(l.keyframes,s);if(p!==void 0){Je.update(()=>{l.onUpdate(p),l.onComplete()});return}}return s.isSync?new Ui(l):new CL(l)};function tm(e){const t=[{},{}];return e?.values.forEach((n,o)=>{t[0][o]=n.get(),t[1][o]=n.getVelocity()}),t}function S6(e,t,n,o){if(typeof t=="function"){const[r,u]=tm(o);t=t(n!==void 0?n:e.custom,r,u)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[r,u]=tm(o);t=t(n!==void 0?n:e.custom,r,u)}return t}function wu(e,t,n){const o=e.getProps();return S6(o,t,n!==void 0?n:o.custom,e)}const T6=new Set(["width","height","top","left","right","bottom",...Zu]),nm=30,FL=e=>!isNaN(parseFloat(e));class PL{constructor(t,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=o=>{const r=rn.now();if(this.updatedAt!==r&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(o),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const u of this.dependents)u.dirty()},this.hasAnimated=!1,this.setCurrent(t),this.owner=n.owner}setCurrent(t){this.current=t,this.updatedAt=rn.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=FL(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new Rf);const o=this.events[t].add(n);return t==="change"?()=>{o(),Je.read(()=>{this.events.change.getSize()||this.stop()})}:o}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t){this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t)}setWithVelocity(t,n,o){this.set(n),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-o}jump(t,n=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=rn.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>nm)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,nm);return Gb(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function Ou(e,t){return new PL(e,t)}const ML=e=>Array.isArray(e);function OL(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,Ou(n))}function IL(e){return ML(e)?e[e.length-1]||0:e}function RL(e,t){const n=wu(e,t);let{transitionEnd:o={},transition:r={},...u}=n||{};u={...u,...o};for(const a in u){const s=IL(u[a]);OL(e,a,s)}}const Zt=e=>!!(e&&e.getVelocity);function LL(e){return!!(Zt(e)&&e.add)}function rd(e,t){const n=e.getValue("willChange");if(LL(n))return n.add(t);if(!n&&pr.WillChange){const o=new pr.WillChange("auto");e.addValue("willChange",o),o.add(t)}}function Yf(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}const qL="framerAppearId",$L="data-"+Yf(qL);function F6(e){return e.props[$L]}function NL({protectedKeys:e,needsAnimating:t},n){const o=e.hasOwnProperty(n)&&t[n]!==!0;return t[n]=!1,o}function P6(e,t,{delay:n=0,transitionOverride:o,type:r}={}){let{transition:u,transitionEnd:a,...s}=t;const i=e.getDefaultTransition();u=u?k6(u,i):i;const c=u?.reduceMotion;o&&(u=o);const l=[],d=r&&e.animationState&&e.animationState.getState()[r];for(const p in s){const h=e.getValue(p,e.latestValues[p]??null),m=s[p];if(m===void 0||d&&NL(d,p))continue;const g={delay:n,...Wf(u||{},p)},y=h.get();if(y!==void 0&&!h.isAnimating()&&!Array.isArray(m)&&m===y&&!g.velocity){Je.update(()=>h.set(m));continue}let E=!1;if(window.MotionHandoffAnimation){const C=F6(e);if(C){const w=window.MotionHandoffAnimation(C,p,Je);w!==null&&(g.startTime=w,E=!0)}}rd(e,p);const b=c??e.shouldReduceMotion;h.start(Gf(p,h,m,b&&T6.has(p)?{type:!1}:g,e,E));const v=h.animation;v&&l.push(v)}if(a){const p=()=>Je.update(()=>{a&&RL(e,a)});l.length?Promise.all(l).then(p):p()}return l}function ud(e,t,n={}){const o=wu(e,t,n.type==="exit"?e.presenceContext?.custom:void 0);let{transition:r=e.getDefaultTransition()||{}}=o||{};n.transitionOverride&&(r=n.transitionOverride);const u=o?()=>Promise.all(P6(e,o,n)):()=>Promise.resolve(),a=e.variantChildren&&e.variantChildren.size?(i=0)=>{const{delayChildren:c=0,staggerChildren:l,staggerDirection:d}=r;return jL(e,t,i,c,l,d,n)}:()=>Promise.resolve(),{when:s}=r;if(s){const[i,c]=s==="beforeChildren"?[u,a]:[a,u];return i().then(()=>c())}else return Promise.all([u(),a(n.delay)])}function jL(e,t,n=0,o=0,r=0,u=1,a){const s=[];for(const i of e.variantChildren)i.notify("AnimationStart",t),s.push(ud(i,t,{...a,delay:n+(typeof o=="function"?0:o)+B6(e.variantChildren,i,o,r,u)}).then(()=>i.notify("AnimationComplete",t)));return Promise.all(s)}function VL(e,t,n={}){e.notify("AnimationStart",t);let o;if(Array.isArray(t)){const r=t.map(u=>ud(e,u,n));o=Promise.all(r)}else if(typeof t=="string")o=ud(e,t,n);else{const r=typeof t=="function"?wu(e,t,n.custom):t;o=Promise.all(P6(e,r,n))}return o.then(()=>{e.notify("AnimationComplete",t)})}const zL={test:e=>e==="auto",parse:e=>e},M6=e=>t=>t.test(e),O6=[Yu,he,co,Xo,pR,fR,zL],om=e=>O6.find(M6(e));function UL(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||Kb(e):!0}const HL=new Set(["brightness","contrast","saturate","opacity"]);function KL(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[o]=n.match(jf)||[];if(!o)return e;const r=n.replace(o,"");let u=HL.has(t)?1:0;return o!==n&&(u*=100),t+"("+u+r+")"}const WL=/\b([a-z-]*)\(.*?\)/gu,ad={...zn,getAnimatableNone:e=>{const t=e.match(WL);return t?t.map(KL).join(" "):e}},sd={...zn,getAnimatableNone:e=>{const t=zn.parse(e);return zn.createTransformer(e)(t.map(o=>typeof o=="number"?0:typeof o=="object"?{...o,alpha:1}:o))}},rm={...Yu,transform:Math.round},GL={rotate:Xo,rotateX:Xo,rotateY:Xo,rotateZ:Xo,scale:Gs,scaleX:Gs,scaleY:Gs,scaleZ:Gs,skew:Xo,skewX:Xo,skewY:Xo,distance:he,translateX:he,translateY:he,translateZ:he,x:he,y:he,z:he,perspective:he,transformPerspective:he,opacity:Ya,originX:U4,originY:U4,originZ:he},Zf={borderWidth:he,borderTopWidth:he,borderRightWidth:he,borderBottomWidth:he,borderLeftWidth:he,borderRadius:he,borderTopLeftRadius:he,borderTopRightRadius:he,borderBottomRightRadius:he,borderBottomLeftRadius:he,width:he,maxWidth:he,height:he,maxHeight:he,top:he,right:he,bottom:he,left:he,inset:he,insetBlock:he,insetBlockStart:he,insetBlockEnd:he,insetInline:he,insetInlineStart:he,insetInlineEnd:he,padding:he,paddingTop:he,paddingRight:he,paddingBottom:he,paddingLeft:he,paddingBlock:he,paddingBlockStart:he,paddingBlockEnd:he,paddingInline:he,paddingInlineStart:he,paddingInlineEnd:he,margin:he,marginTop:he,marginRight:he,marginBottom:he,marginLeft:he,marginBlock:he,marginBlockStart:he,marginBlockEnd:he,marginInline:he,marginInlineStart:he,marginInlineEnd:he,fontSize:he,backgroundPositionX:he,backgroundPositionY:he,...GL,zIndex:rm,fillOpacity:Ya,strokeOpacity:Ya,numOctaves:rm},YL={...Zf,color:Tt,backgroundColor:Tt,outlineColor:Tt,fill:Tt,stroke:Tt,borderColor:Tt,borderTopColor:Tt,borderRightColor:Tt,borderBottomColor:Tt,borderLeftColor:Tt,filter:ad,WebkitFilter:ad,mask:sd,WebkitMask:sd},I6=e=>YL[e],ZL=new Set([ad,sd]);function R6(e,t){let n=I6(e);return ZL.has(n)||(n=zn),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const XL=new Set(["auto","none","0"]);function JL(e,t,n){let o=0,r;for(;o{t.getValue(s).set(i)}),this.resolveNoneKeyframes()}}function L6(e,t,n){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e=="string"){let o=document;const r=n?.[e]??o.querySelectorAll(e);return r?Array.from(r):[]}return Array.from(e).filter(o=>o!=null)}const q6=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function eq(e){return Hb(e)&&"offsetHeight"in e&&!("ownerSVGElement"in e)}const{schedule:$6}=u6(queueMicrotask,!1),tq={y:!1};function nq(){return tq.y}function N6(e,t){const n=L6(e),o=new AbortController,r={passive:!0,...t,signal:o.signal};return[n,r,()=>o.abort()]}function oq(e){return!(e.pointerType==="touch"||nq())}function rq(e,t,n={}){const[o,r,u]=N6(e,n);return o.forEach(a=>{let s=!1,i=!1,c;const l=()=>{a.removeEventListener("pointerleave",m)},d=y=>{c&&(c(y),c=void 0),l()},p=y=>{s=!1,window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p),i&&(i=!1,d(y))},h=()=>{s=!0,window.addEventListener("pointerup",p,r),window.addEventListener("pointercancel",p,r)},m=y=>{if(y.pointerType!=="touch"){if(s){i=!0;return}d(y)}},g=y=>{if(!oq(y))return;i=!1;const E=t(a,y);typeof E=="function"&&(c=E,a.addEventListener("pointerleave",m,r))};a.addEventListener("pointerenter",g,r),a.addEventListener("pointerdown",h,r)}),u}const j6=(e,t)=>t?e===t?!0:j6(e,t.parentElement):!1,uq=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,aq=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function sq(e){return aq.has(e.tagName)||e.isContentEditable===!0}const li=new WeakSet;function um(e){return t=>{t.key==="Enter"&&e(t)}}function Ac(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const iq=(e,t)=>{const n=e.currentTarget;if(!n)return;const o=um(()=>{if(li.has(n))return;Ac(n,"down");const r=um(()=>{Ac(n,"up")}),u=()=>Ac(n,"cancel");n.addEventListener("keyup",r,t),n.addEventListener("blur",u,t)});n.addEventListener("keydown",o,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",o),t)};function am(e){return uq(e)&&!0}const sm=new WeakSet;function lq(e,t,n={}){const[o,r,u]=N6(e,n),a=s=>{const i=s.currentTarget;if(!am(s)||sm.has(s))return;li.add(i),n.stopPropagation&&sm.add(s);const c=t(i,s),l=(h,m)=>{window.removeEventListener("pointerup",d),window.removeEventListener("pointercancel",p),li.has(i)&&li.delete(i),am(h)&&typeof c=="function"&&c(h,{success:m})},d=h=>{l(h,i===window||i===document||n.useGlobalTarget||j6(i,h.target))},p=h=>{l(h,!1)};window.addEventListener("pointerup",d,r),window.addEventListener("pointercancel",p,r)};return o.forEach(s=>{(n.useGlobalTarget?window:s).addEventListener("pointerdown",a,r),eq(s)&&(s.addEventListener("focus",c=>iq(c,r)),!sq(s)&&!s.hasAttribute("tabindex")&&(s.tabIndex=0))}),u}function V6(e){return Hb(e)&&"ownerSVGElement"in e}function cq(e){return V6(e)&&e.tagName==="svg"}const dq=[...O6,Tt,zn],fq=e=>dq.find(M6(e)),im=()=>({translate:0,scale:1,origin:0,originPoint:0}),du=()=>({x:im(),y:im()}),lm=()=>({min:0,max:0}),It=()=>({x:lm(),y:lm()}),pq=new WeakMap;function Xf(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function Ml(e){return typeof e=="string"||Array.isArray(e)}const hq=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],mq=["initial",...hq];function z6(e){return Xf(e.animate)||mq.some(t=>Ml(e[t]))}function gq(e){return!!(z6(e)||e.variants)}function vq(e,t,n){for(const o in t){const r=t[o],u=n[o];if(Zt(r))e.addValue(o,r);else if(Zt(u))e.addValue(o,Ou(r,{owner:e}));else if(u!==r)if(e.hasValue(o)){const a=e.getValue(o);a.liveStyle===!0?a.jump(r):a.hasAnimated||a.set(r)}else{const a=e.getStaticValue(o);e.addValue(o,Ou(a!==void 0?a:r,{owner:e}))}}for(const o in n)t[o]===void 0&&e.removeValue(o);return t}const id={current:null},U6={current:!1},yq=typeof window<"u";function bq(){if(U6.current=!0,!!yq)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>id.current=e.matches;e.addEventListener("change",t),t()}else id.current=!1}const cm=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let dm={};class Eq{scrapeMotionValuesFromProps(t,n,o){return{}}constructor({parent:t,props:n,presenceContext:o,reducedMotionConfig:r,skipAnimations:u,blockInitialAnimation:a,visualState:s},i={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=Kf,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const h=rn.now();this.renderScheduledAtthis.bindToMotionValue(o,n)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(U6.current||bq(),this.shouldReduceMotion=id.current),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,this.parent?.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){this.projection&&this.projection.unmount(),hr(this.notifyUpdate),hr(this.render),this.valueSubscriptions.forEach(t=>t()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const n=this.features[t];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(t){this.children.add(t),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(t)}removeChild(t){this.children.delete(t),this.enteringChildren&&this.enteringChildren.delete(t)}bindToMotionValue(t,n){if(this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)(),n.accelerate&&A6.has(t)&&this.current instanceof HTMLElement){const{factory:a,keyframes:s,times:i,ease:c,duration:l}=n.accelerate,d=new w6({element:this.current,name:t,keyframes:s,times:i,ease:c,duration:Rn(l)}),p=a(d);this.valueSubscriptions.set(t,()=>{p(),d.cancel()});return}const o=Xu.has(t);o&&this.onBindTransform&&this.onBindTransform();const r=n.on("change",a=>{this.latestValues[t]=a,this.props.onUpdate&&Je.preRender(this.notifyUpdate),o&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let u;typeof window<"u"&&window.MotionCheckAppearSync&&(u=window.MotionCheckAppearSync(this,t,n)),this.valueSubscriptions.set(t,()=>{r(),u&&u(),n.owner&&n.stop()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in dm){const n=dm[t];if(!n)continue;const{isEnabled:o,Feature:r}=n;if(!this.features[t]&&r&&o(this.props)&&(this.features[t]=new r(this)),this.features[t]){const u=this.features[t];u.isMounted?u.update():(u.mount(),u.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):It()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let o=0;on.variantChildren.delete(t)}addValue(t,n){const o=this.values.get(t);n!==o&&(o&&this.removeValue(t),this.bindToMotionValue(t,n),this.values.set(t,n),this.latestValues[t]=n.get())}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let o=this.values.get(t);return o===void 0&&n!==void 0&&(o=Ou(n===null?void 0:n,{owner:this}),this.addValue(t,o)),o}readValue(t,n){let o=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return o!=null&&(typeof o=="string"&&(Ub(o)||Kb(o))?o=parseFloat(o):!fq(o)&&zn.test(n)&&(o=R6(t,n)),this.setBaseTarget(t,Zt(o)?o.get():o)),Zt(o)?o.get():o}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){const{initial:n}=this.props;let o;if(typeof n=="string"||typeof n=="object"){const u=S6(this.props,n,this.presenceContext?.custom);u&&(o=u[t])}if(n&&o!==void 0)return o;const r=this.getBaseTargetFromProps(this.props,t);return r!==void 0&&!Zt(r)?r:this.initialValues[t]!==void 0&&o===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new Rf),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}scheduleRenderMicrotask(){$6.render(this.render)}}class H6 extends Eq{constructor(){super(...arguments),this.KeyframeResolver=QL}sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){const o=t.style;return o?o[n]:void 0}removeValueFromRenderState(t,{vars:n,style:o}){delete n[t],delete o[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;Zt(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}function K6({top:e,left:t,right:n,bottom:o}){return{x:{min:t,max:n},y:{min:e,max:o}}}function Cq({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function xq(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),o=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:o.y,right:o.x}}function Bc(e){return e===void 0||e===1}function ld({scale:e,scaleX:t,scaleY:n}){return!Bc(e)||!Bc(t)||!Bc(n)}function Sr(e){return ld(e)||W6(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function W6(e){return fm(e.x)||fm(e.y)}function fm(e){return e&&e!=="0%"}function Hi(e,t,n){const o=e-n,r=t*o;return n+r}function pm(e,t,n,o,r){return r!==void 0&&(e=Hi(e,r,o)),Hi(e,n,o)+t}function cd(e,t=0,n=1,o,r){e.min=pm(e.min,t,n,o,r),e.max=pm(e.max,t,n,o,r)}function G6(e,{x:t,y:n}){cd(e.x,t.translate,t.scale,t.originPoint),cd(e.y,n.translate,n.scale,n.originPoint)}const hm=.999999999999,mm=1.0000000000001;function wq(e,t,n,o=!1){const r=n.length;if(!r)return;t.x=t.y=1;let u,a;for(let s=0;shm&&(t.x=1),t.yhm&&(t.y=1)}function uo(e,t){e.min+=t,e.max+=t}function gm(e,t,n,o,r=.5){const u=ft(e.min,e.max,r);cd(e,t,n,u,o)}function vm(e,t){return typeof e=="string"?parseFloat(e)/100*(t.max-t.min):e}function ci(e,t,n){const o=n??e;gm(e.x,vm(t.x,o.x),t.scaleX,t.scale,t.originX),gm(e.y,vm(t.y,o.y),t.scaleY,t.scale,t.originY)}function Y6(e,t){return K6(xq(e.getBoundingClientRect(),t))}function Dq(e,t,n){const o=Y6(e,n),{scroll:r}=t;return r&&(uo(o.x,r.offset.x),uo(o.y,r.offset.y)),o}const Aq={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Bq=Zu.length;function _q(e,t,n){let o="",r=!0;for(let u=0;u{if(!t.target)return e;if(typeof e=="string")if(he.test(e))e=parseFloat(e);else return e;const n=ym(e,t.target.x),o=ym(e,t.target.y);return`${n}% ${o}%`}},X6={correct:(e,{treeScale:t,projectionDelta:n})=>{const o=e,r=zn.parse(e);if(r.length>5)return o;const u=zn.createTransformer(e),a=typeof r[0]!="number"?1:0,s=n.x.scale*t.x,i=n.y.scale*t.y;r[0+a]/=s,r[1+a]/=i;const c=ft(s,i,.5);return typeof r[2+a]=="number"&&(r[2+a]/=c),typeof r[3+a]=="number"&&(r[3+a]/=c),u(r)}},Za={borderRadius:{...ao,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:ao,borderTopRightRadius:ao,borderBottomLeftRadius:ao,borderBottomRightRadius:ao,boxShadow:X6};function J6(e){for(const t in e)Za[t]=e[t],$f(t)&&(Za[t].isCSSVariable=!0)}function kq(e,{layout:t,layoutId:n}){return Xu.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!Za[e]||e==="opacity")}function Q6(e,t,n){const o=e.style,r=t?.style,u={};if(!o)return u;for(const a in o)(Zt(o[a])||r&&Zt(r[a])||kq(a,e)||n?.getValue(a)?.liveStyle!==void 0)&&(u[a]=o[a]);return u}function Sq(e){return window.getComputedStyle(e)}class Tq extends H6{constructor(){super(...arguments),this.type="html",this.renderInstance=Z6}readValueFromInstance(t,n){if(Xu.has(n))return this.projection?.isProjecting?J0(n):QR(t,n);{const o=Sq(t),r=($f(n)?o.getPropertyValue(n):o[n])||0;return typeof r=="string"?r.trim():r}}measureInstanceViewportBox(t,{transformPagePoint:n}){return Y6(t,n)}build(t,n,o){Jf(t,n,o.transformTemplate)}scrapeMotionValuesFromProps(t,n,o){return Q6(t,n,o)}}const Fq={offset:"stroke-dashoffset",array:"stroke-dasharray"},Pq={offset:"strokeDashoffset",array:"strokeDasharray"};function Mq(e,t,n=1,o=0,r=!0){e.pathLength=1;const u=r?Fq:Pq;e[u.offset]=`${-o}`,e[u.array]=`${t} ${n}`}const Oq=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function eE(e,{attrX:t,attrY:n,attrScale:o,pathLength:r,pathSpacing:u=1,pathOffset:a=0,...s},i,c,l){if(Jf(e,s,c),i){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:d,style:p}=e;d.transform&&(p.transform=d.transform,delete d.transform),(p.transform||d.transformOrigin)&&(p.transformOrigin=d.transformOrigin??"50% 50%",delete d.transformOrigin),p.transform&&(p.transformBox=l?.transformBox??"fill-box",delete d.transformBox);for(const h of Oq)d[h]!==void 0&&(p[h]=d[h],delete d[h]);t!==void 0&&(d.x=t),n!==void 0&&(d.y=n),o!==void 0&&(d.scale=o),r!==void 0&&Mq(d,r,u,a,!1)}const Qf=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),tE=e=>typeof e=="string"&&e.toLowerCase()==="svg";function Iq(e,t,n,o){Z6(e,t,void 0,o);for(const r in t.attrs)e.setAttribute(Qf.has(r)?r:Yf(r),t.attrs[r])}function Rq(e,t,n){const o=Q6(e,t,n);for(const r in e)if(Zt(e[r])||Zt(t[r])){const u=Zu.indexOf(r)!==-1?"attr"+r.charAt(0).toUpperCase()+r.substring(1):r;o[u]=e[r]}return o}class Lq extends H6{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=It}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(Xu.has(n)){const o=I6(n);return o&&o.default||0}return n=Qf.has(n)?n:Yf(n),t.getAttribute(n)}scrapeMotionValuesFromProps(t,n,o){return Rq(t,n,o)}build(t,n,o){eE(t,n,this.isSVGTag,o.transformTemplate,o.style)}renderInstance(t,n,o,r){Iq(t,n,o,r)}mount(t){this.isSVGTag=tE(t.tagName),super.mount(t)}}function dd(e,t){e.min=t.min,e.max=t.max}function $n(e,t){dd(e.x,t.x),dd(e.y,t.y)}function bm(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}const nE=1e-4,qq=1-nE,$q=1+nE,oE=.01,Nq=0-oE,jq=0+oE;function un(e){return e.max-e.min}function Vq(e,t,n){return Math.abs(e-t)<=n}function Em(e,t,n,o=.5){e.origin=o,e.originPoint=ft(t.min,t.max,e.origin),e.scale=un(n)/un(t),e.translate=ft(n.min,n.max,e.origin)-e.originPoint,(e.scale>=qq&&e.scale<=$q||isNaN(e.scale))&&(e.scale=1),(e.translate>=Nq&&e.translate<=jq||isNaN(e.translate))&&(e.translate=0)}function ka(e,t,n,o){Em(e.x,t.x,n.x,o?o.originX:void 0),Em(e.y,t.y,n.y,o?o.originY:void 0)}function Cm(e,t,n,o=0){const r=o?ft(n.min,n.max,o):n.min;e.min=r+t.min,e.max=e.min+un(t)}function zq(e,t,n,o){Cm(e.x,t.x,n.x,o?.x),Cm(e.y,t.y,n.y,o?.y)}function xm(e,t,n,o=0){const r=o?ft(n.min,n.max,o):n.min;e.min=t.min-r,e.max=e.min+un(t)}function Ki(e,t,n,o){xm(e.x,t.x,n.x,o?.x),xm(e.y,t.y,n.y,o?.y)}function wm(e,t,n,o,r){return e-=t,e=Hi(e,1/n,o),r!==void 0&&(e=Hi(e,1/r,o)),e}function Uq(e,t=0,n=1,o=.5,r,u=e,a=e){if(co.test(t)&&(t=parseFloat(t),t=ft(a.min,a.max,t/100)-a.min),typeof t!="number")return;let s=ft(u.min,u.max,o);e===u&&(s-=t),e.min=wm(e.min,t,n,s,r),e.max=wm(e.max,t,n,s,r)}function Dm(e,t,[n,o,r],u,a){Uq(e,t[n],t[o],t[r],t.scale,u,a)}const Hq=["x","scaleX","originX"],Kq=["y","scaleY","originY"];function Am(e,t,n,o){Dm(e.x,t,Hq,n?n.x:void 0,o?o.x:void 0),Dm(e.y,t,Kq,n?n.y:void 0,o?o.y:void 0)}function Bm(e){return e.translate===0&&e.scale===1}function rE(e){return Bm(e.x)&&Bm(e.y)}function _m(e,t){return e.min===t.min&&e.max===t.max}function Wq(e,t){return _m(e.x,t.x)&&_m(e.y,t.y)}function km(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function uE(e,t){return km(e.x,t.x)&&km(e.y,t.y)}function Sm(e){return un(e.x)/un(e.y)}function Tm(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function Tn(e){return[e("x"),e("y")]}function Gq(e,t,n){let o="";const r=e.x.translate/t.x,u=e.y.translate/t.y,a=n?.z||0;if((r||u||a)&&(o=`translate3d(${r}px, ${u}px, ${a}px) `),(t.x!==1||t.y!==1)&&(o+=`scale(${1/t.x}, ${1/t.y}) `),n){const{transformPerspective:c,rotate:l,rotateX:d,rotateY:p,skewX:h,skewY:m}=n;c&&(o=`perspective(${c}px) ${o}`),l&&(o+=`rotate(${l}deg) `),d&&(o+=`rotateX(${d}deg) `),p&&(o+=`rotateY(${p}deg) `),h&&(o+=`skewX(${h}deg) `),m&&(o+=`skewY(${m}deg) `)}const s=e.x.scale*t.x,i=e.y.scale*t.y;return(s!==1||i!==1)&&(o+=`scale(${s}, ${i})`),o||"none"}const aE=["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"],Yq=aE.length,Fm=e=>typeof e=="string"?parseFloat(e):e,Pm=e=>typeof e=="number"||he.test(e);function Zq(e,t,n,o,r,u){r?(e.opacity=ft(0,n.opacity??1,Xq(o)),e.opacityExit=ft(t.opacity??1,0,Jq(o))):u&&(e.opacity=ft(t.opacity??1,n.opacity??1,o));for(let a=0;aot?1:n(Ga(e,t,o))}function Qq(e,t,n){const o=Zt(e)?e:Ou(e);return o.start(Gf("",o,t,n)),o.animation}function e$(e,t,n,o={passive:!0}){return e.addEventListener(t,n,o),()=>e.removeEventListener(t,n)}const t$=(e,t)=>e.depth-t.depth;class n${constructor(){this.children=[],this.isDirty=!1}add(t){Of(this.children,t),this.isDirty=!0}remove(t){Ni(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(t$),this.isDirty=!1,this.children.forEach(t)}}function o$(e,t){const n=rn.now(),o=({timestamp:r})=>{const u=r-n;u>=t&&(hr(o),e(u-t))};return Je.setup(o,!0),()=>hr(o)}function _c(e){return Zt(e)?e.get():e}class r${constructor(){this.members=[]}add(t){Of(this.members,t);for(let n=this.members.length-1;n>=0;n--){const o=this.members[n];if(o===t||o===this.lead||o===this.prevLead)continue;const r=o.instance;(!r||r.isConnected===!1)&&!o.snapshot&&(Ni(this.members,o),o.unmount())}t.scheduleRender()}remove(t){if(Ni(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){for(let n=this.members.indexOf(t)-1;n>=0;n--){const o=this.members[n];if(o.isPresent!==!1&&o.instance?.isConnected!==!1)return this.promote(o),!0}return!1}promote(t,n){const o=this.lead;if(t!==o&&(this.prevLead=o,this.lead=t,t.show(),o)){o.updateSnapshot(),t.scheduleRender();const{layoutDependency:r}=o.options,{layoutDependency:u}=t.options;(r===void 0||r!==u)&&(t.resumeFrom=o,n&&(o.preserveOpacity=!0),o.snapshot&&(t.snapshot=o.snapshot,t.snapshot.latestValues=o.animationValues||o.latestValues),t.root?.isUpdating&&(t.isLayoutDirty=!0)),t.options.crossfade===!1&&o.hide()}}exitAnimationComplete(){this.members.forEach(t=>{t.options.onExitComplete?.(),t.resumingFrom?.options.onExitComplete?.()})}scheduleRender(){this.members.forEach(t=>t.instance&&t.scheduleRender(!1))}removeLeadSnapshot(){this.lead?.snapshot&&(this.lead.snapshot=void 0)}}const di={hasAnimatedSinceResize:!0,hasEverUpdated:!1},kc=["","X","Y","Z"],u$=1e3;let a$=0;function Sc(e,t,n,o){const{latestValues:r}=t;r[e]&&(n[e]=r[e],t.setStaticValue(e,0),o&&(o[e]=0))}function iE(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=F6(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:r,layoutId:u}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",Je,!(r||u))}const{parent:o}=e;o&&!o.hasCheckedOptimisedAppear&&iE(o)}function lE({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:o,resetTransform:r}){return class{constructor(a={},s=t?.()){this.id=a$++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(l$),this.nodes.forEach(m$),this.nodes.forEach(g$),this.nodes.forEach(c$)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=a,this.root=s?s.root||s:this,this.path=s?[...s.path,s]:[],this.parent=s,this.depth=s?s.depth+1:0;for(let i=0;ithis.root.updateBlockedByResize=!1;Je.read(()=>{d=window.innerWidth}),e(a,()=>{const h=window.innerWidth;h!==d&&(d=h,this.root.updateBlockedByResize=!0,l&&l(),l=o$(p,250),di.hasAnimatedSinceResize&&(di.hasAnimatedSinceResize=!1,this.nodes.forEach(Rm)))})}s&&this.root.registerSharedNode(s,this),this.options.animate!==!1&&c&&(s||i)&&this.addEventListener("didUpdate",({delta:l,hasLayoutChanged:d,hasRelativeLayoutChanged:p,layout:h})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const m=this.options.transition||c.getDefaultTransition()||C$,{onLayoutAnimationStart:g,onLayoutAnimationComplete:y}=c.getProps(),E=!this.targetLayout||!uE(this.targetLayout,h),b=!d&&p;if(this.options.layoutRoot||this.resumeFrom||b||d&&(E||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const v={...Wf(m,"layout"),onPlay:g,onComplete:y};(c.shouldReduceMotion||this.options.layoutRoot)&&(v.delay=0,v.type=!1),this.startAnimation(v),this.setAnimationOrigin(l,b)}else d||Rm(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=h})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const a=this.getStack();a&&a.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),hr(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(v$),this.animationId++)}getTransformTemplate(){const{visualElement:a}=this.options;return a&&a.getProps().transformTemplate}willUpdate(a=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&iE(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let l=0;l{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!un(this.snapshot.measuredBox.x)&&!un(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let i=0;i{const w=C/1e3;Lm(d.x,a.x,w),Lm(d.y,a.y,w),this.setTargetDelta(d),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Ki(p,this.layout.layoutBox,this.relativeParent.layout.layoutBox,this.options.layoutAnchor||void 0),b$(this.relativeTarget,this.relativeTargetOrigin,p,w),v&&Wq(this.relativeTarget,v)&&(this.isProjectionDirty=!1),v||(v=It()),$n(v,this.relativeTarget)),g&&(this.animationValues=l,Zq(l,c,this.latestValues,w,b,E)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=w},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(a){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(hr(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=Je.update(()=>{di.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=Ou(0)),this.motionValue.jump(0,!1),this.currentAnimation=Qq(this.motionValue,[0,1e3],{...a,velocity:0,isSync:!0,onUpdate:s=>{this.mixTargetDelta(s),a.onUpdate&&a.onUpdate(s)},onStop:()=>{},onComplete:()=>{a.onComplete&&a.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const a=this.getStack();a&&a.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(u$),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const a=this.getLead();let{targetWithTransforms:s,target:i,layout:c,latestValues:l}=a;if(!(!s||!i||!c)){if(this!==a&&this.layout&&c&&cE(this.options.animationType,this.layout.layoutBox,c.layoutBox)){i=this.target||It();const d=un(this.layout.layoutBox.x);i.x.min=a.target.x.min,i.x.max=i.x.min+d;const p=un(this.layout.layoutBox.y);i.y.min=a.target.y.min,i.y.max=i.y.min+p}$n(s,i),ci(s,l),ka(this.projectionDeltaWithTransform,this.layoutCorrected,s,l)}}registerSharedNode(a,s){this.sharedNodes.has(a)||this.sharedNodes.set(a,new r$),this.sharedNodes.get(a).add(s);const c=s.options.initialPromotionConfig;s.promote({transition:c?c.transition:void 0,preserveFollowOpacity:c&&c.shouldPreserveFollowOpacity?c.shouldPreserveFollowOpacity(s):void 0})}isLead(){const a=this.getStack();return a?a.lead===this:!0}getLead(){const{layoutId:a}=this.options;return a?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:a}=this.options;return a?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:a}=this.options;if(a)return this.root.sharedNodes.get(a)}promote({needsReset:a,transition:s,preserveFollowOpacity:i}={}){const c=this.getStack();c&&c.promote(this,i),a&&(this.projectionDelta=void 0,this.needsReset=!0),s&&this.setOptions({transition:s})}relegate(){const a=this.getStack();return a?a.relegate(this):!1}resetSkewAndRotation(){const{visualElement:a}=this.options;if(!a)return;let s=!1;const{latestValues:i}=a;if((i.z||i.rotate||i.rotateX||i.rotateY||i.rotateZ||i.skewX||i.skewY)&&(s=!0),!s)return;const c={};i.z&&Sc("z",a,c,this.animationValues);for(let l=0;la.currentAnimation?.stop()),this.root.nodes.forEach(Om),this.root.sharedNodes.clear()}}}function s$(e){e.updateLayout()}function i$(e){const t=e.resumeFrom?.snapshot||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:o}=e.layout,{animationType:r}=e.options,u=t.source!==e.layout.source;if(r==="size")Tn(l=>{const d=u?t.measuredBox[l]:t.layoutBox[l],p=un(d);d.min=n[l].min,d.max=d.min+p});else if(r==="x"||r==="y"){const l=r==="x"?"y":"x";dd(u?t.measuredBox[l]:t.layoutBox[l],n[l])}else cE(r,t.layoutBox,n)&&Tn(l=>{const d=u?t.measuredBox[l]:t.layoutBox[l],p=un(n[l]);d.max=d.min+p,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[l].max=e.relativeTarget[l].min+p)});const a=du();ka(a,n,t.layoutBox);const s=du();u?ka(s,e.applyTransform(o,!0),t.measuredBox):ka(s,n,t.layoutBox);const i=!rE(a);let c=!1;if(!e.resumeFrom){const l=e.getClosestProjectingParent();if(l&&!l.resumeFrom){const{snapshot:d,layout:p}=l;if(d&&p){const h=e.options.layoutAnchor||void 0,m=It();Ki(m,t.layoutBox,d.layoutBox,h);const g=It();Ki(g,n,p.layoutBox,h),uE(m,g)||(c=!0),l.options.layoutRoot&&(e.relativeTarget=g,e.relativeTargetOrigin=m,e.relativeParent=l)}}}e.notifyListeners("didUpdate",{layout:n,snapshot:t,delta:s,layoutDelta:a,hasLayoutChanged:i,hasRelativeLayoutChanged:c})}else if(e.isLead()){const{onExitComplete:n}=e.options;n&&n()}e.options.transition=void 0}function l$(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function c$(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function d$(e){e.clearSnapshot()}function Om(e){e.clearMeasurements()}function f$(e){e.isLayoutDirty=!0,e.updateLayout()}function Im(e){e.isLayoutDirty=!1}function p$(e){e.isAnimationBlocked&&e.layout&&!e.isLayoutDirty&&(e.snapshot=e.layout,e.isLayoutDirty=!0)}function h$(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function Rm(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function m$(e){e.resolveTargetDelta()}function g$(e){e.calcProjection()}function v$(e){e.resetSkewAndRotation()}function y$(e){e.removeLeadSnapshot()}function Lm(e,t,n){e.translate=ft(t.translate,0,n),e.scale=ft(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function qm(e,t,n,o){e.min=ft(t.min,n.min,o),e.max=ft(t.max,n.max,o)}function b$(e,t,n,o){qm(e.x,t.x,n.x,o),qm(e.y,t.y,n.y,o)}function E$(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const C$={duration:.45,ease:[.4,0,.1,1]},$m=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),Nm=$m("applewebkit/")&&!$m("chrome/")?Math.round:In;function jm(e){e.min=Nm(e.min),e.max=Nm(e.max)}function x$(e){jm(e.x),jm(e.y)}function cE(e,t,n){return e==="position"||e==="preserve-aspect"&&!Vq(Sm(t),Sm(n),.2)}function w$(e){return e!==e.root&&e.scroll?.wasRoot}const D$=lE({attachResizeListener:(e,t)=>e$(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body?.scrollLeft||0,y:document.documentElement.scrollTop||document.body?.scrollTop||0}),checkIsScrollRoot:()=>!0}),Tc={current:void 0},A$=lE({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!Tc.current){const e=new D$({});e.mount(window),e.setOptions({layoutScroll:!0}),Tc.current=e}return Tc.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),B$={some:0,all:1};function _$(e,t,{root:n,margin:o,amount:r="some"}={}){const u=L6(e),a=new WeakMap,s=c=>{c.forEach(l=>{const d=a.get(l.target);if(l.isIntersecting!==!!d)if(l.isIntersecting){const p=t(l.target,l);typeof p=="function"?a.set(l.target,p):i.unobserve(l.target)}else typeof d=="function"&&(d(l),a.delete(l.target))})},i=new IntersectionObserver(s,{root:n,rootMargin:o,threshold:typeof r=="number"?r:B$[r]});return u.forEach(c=>i.observe(c)),()=>i.disconnect()}const Vm=(e,t)=>Math.abs(e-t);function k$(e,t){const n=Vm(e.x,t.x),o=Vm(e.y,t.y);return Math.sqrt(n**2+o**2)}function dE({current:e}){return e?e.ownerDocument.defaultView:null}function fd(e){if(e)return e.nodeType===3||e.nodeType===8?fd(e.nextSibling):e}const[S$,T$]=gs("Motion"),[F$]=gs("LayoutGroup"),P$={reducedMotion:"never",transition:void 0,nonce:void 0},[M$]=gs("MotionConfig");function O$(){return M$(F(()=>P$))}const I$={motionAttribute:"data-ap"},pd=[];function fE(e){for(const t of e)t&&!pd.includes(t)&&pd.push(t)}function pE(e,t,n){if(Array.isArray(e))return e.reduce((o,r)=>{const u=pE(r,t,n);return u?{...o,...u}:o},{});if(typeof e=="object")return e;if(e&&t){const o=t[e];return typeof o=="function"?o(n):o}}function R$(e,t,n){const o=pE(e,t,n);if(!o)return;const{transition:r,transitionEnd:u,...a}=o;return{...a,...u}}function L$(e,t){const n=(e.initial===void 0&&e.variants?t?.initial:e.initial)===!1?["initial","animate"]:["initial"],o=e.custom??e.presenceContext?.custom;return n.reduce((r,u)=>({...r,...R$(e[u]||t?.[u],e.variants,o)}),{})}function hE(e,t){const n=t?.length;if(n!==e.length)return!1;for(let o=0;o{const n=this.options[t];return Ml(n)||t==="initial"&&n===!1?n:this.parent?.context[t]}})),this._context}updateFeatures(){if(this.visualElement)for(const e of pd){this.features.has(e.key)||this.features.set(e.key,new e(this));const t=this.features.get(e.key);this.isMounted()&&(t.isMount?t.update():(t.mount(),t.isMount=!0))}}updateOptions(e){this.options=e,this.visualElement?.update({...this.options,whileTap:this.options.whilePress},this.options.presenceContext??null)}mount(e){zm.set(e,this),this.element=e;const t=this.options.presenceContext?.presenceId;t!==void 0&&e.setAttribute(I$.motionAttribute,t),this.visualElement?.mount(e),this.updateFeatures()}beforeUnmount(){this.getSnapshot(this.options,!1)}unmount(){this.parent?.children?.delete(this),zm.delete(this.element),this.features.forEach(e=>e.unmount?.()),this.visualElement?.unmount()}beforeUpdate(){this.getSnapshot(this.options,void 0)}update(){this.updateFeatures(),this.didUpdate()}tryExitComplete(){this.isExiting||this.options?.layoutId&&this.visualElement.projection?.currentAnimation?.state==="running"||this.options.presenceContext?.onMotionExitComplete?.(this.presenceContainer,this)}setActive(e,t){e==="exit"&&t&&(this.isExiting=!0),this.visualElement?.animationState?.setActive(e,t).then(()=>{e==="exit"&&t&&(this.isExiting=!1,this.options?.layoutId?Je.postRender(()=>this.tryExitComplete()):this.tryExitComplete())})}isMounted(){return!!this.element}initVisualElement(e){this.visualElement||(this.visualElement=e(this.options.as,{presenceContext:this.options.presenceContext??null,parent:this.parent?.visualElement,props:{...this.options,whileTap:this.options.whilePress},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{...this.latestValues}},reducedMotionConfig:this.options.motionConfig?.reducedMotion}),this.visualElement.parent?.addChild(this.visualElement),this.isMounted()&&this.visualElement.mount(this.element))}getSnapshot(e,t){}didUpdate(){}},zo=class{constructor(e){this.state=e}mount(){}unmount(){}update(){}};const gE=["initial","animate","exit","whileHover","whileDrag","whileFocus","whilePress"];var N$=gE.length;function vE(e){if(!e)return;if(!e.isControllingVariants){const n=e.parent?vE(e.parent)||{}:{};return e.props.initial!==void 0&&(n.initial=e.props.initial),n}const t={};for(let n=0;nPromise.all(t.map(({animation:n,options:o})=>VL(e,n,o)))}function H$(e){let t=U$(e),n=Um(),o=!0;const r=i=>(c,l)=>{const d=wu(e,l,i==="exit"?e.presenceContext?.custom:void 0);if(d){const{transition:p,transitionEnd:h,...m}=d;c={...c,...m,...h}}return c};function u(i){t=i(e)}function a(i){const{props:c}=e,l=vE(e.parent)||{},d=[],p=new Set;let h={},m=1/0;for(let y=0;ym&&C,S=!1;const O=Array.isArray(v)?v:[v];let H=O.reduce(r(E),{});w===!1&&(H={});const{prevResolvedValues:N={}}=b,J={...N,...H},G=I=>{_=!0,p.has(I)&&(S=!0,p.delete(I)),b.needsAnimating[I]=!0;const W=e.getValue(I);W&&(W.liveStyle=!1)};for(const I in J){const W=H[I],K=N[I];if(Object.hasOwnProperty.call(h,I))continue;let de=!1;Hm(W)&&Hm(K)?de=!hE(W,K):de=W!==K,de?W!=null?G(I):p.add(I):W!==void 0&&p.has(I)?G(I):b.protectedKeys[I]=!0}b.prevProp=v,b.prevResolvedValues=H,b.isActive&&(h={...h,...H}),o&&e.blockInitialAnimation&&(_=!1);const $=B&&x;_&&(!$||S)&&d.push(...O.map(I=>{const W={type:E};if(typeof I=="string"&&o&&!$&&e.manuallyAnimateOnMount&&e.parent){const{parent:K}=e,de=wu(K,I);if(K.enteringChildren&&de){const{delayChildren:le}=de.transition||{};W.delay=B6(K.enteringChildren,e,le)}}return{animation:I,options:W}}))}if(p.size){const y={};if(typeof c.initial!="boolean"){const E=wu(e,Array.isArray(c.initial)?c.initial[0]:c.initial);E&&E.transition&&(y.transition=E.transition)}p.forEach(E=>{const b=e.getBaseTarget(E),v=e.getValue(E);v&&(v.liveStyle=!0),y[E]=b??null}),d.push({animation:y})}let g=!!d.length;return o&&(c.initial===!1||c.initial===c.animate)&&!e.manuallyAnimateOnMount&&(g=!1),o=!1,g?t(d):Promise.resolve()}function s(i,c){if(n[i].isActive===c)return Promise.resolve();e.variantChildren?.forEach(d=>{d.animationState?.setActive(i,c)}),n[i].isActive=c;const l=a(i);for(const d in n)n[d].protectedKeys={};return l}return{animateChanges:a,setActive:s,setAnimateFunction:u,getState:()=>n,reset:()=>{n=Um(),o=!0}}}function bE(e){return e.style.display==="none"||e.offsetParent===null&&window.getComputedStyle(e).position!=="fixed"}var K$=class extends zo{static#e=this.key="animation";constructor(e){super(e);const t=e.visualElement;t.animationState||=H$(t)}updateAnimationControlsSubscription(){const{animate:e}=this.state.options;Xf(e)&&(this.unmountControls=e.subscribe(this.state.visualElement))}mount(){bE(this.state.element)?this.state.setActive("exit",!0):this.state.visualElement.animationState?.animateChanges(),this.updateAnimationControlsSubscription()}update(){this.state.visualElement.animationState?.animateChanges();const{animate:e}=this.state.visualElement.getProps(),{animate:t}=this.state.visualElement.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){this.state.visualElement.animationState.reset(),this.unmountControls?.()}};function W$(e,t){return mE(e)?new Lq(t):new Tq(t)}function Km(e){return{point:{x:e.pageX,y:e.pageY}}}var G$=class extends zo{static#e=this.key="press";constructor(e){super(e)}isActive(){const{whilePress:e,onPress:t,onPressCancel:n,onPressStart:o}=this.state.options;return!!(e||t||n||o)}register(){const e=this.state.element;!e||!this.isActive()||(this.removePress?.(),this.removePress=lq(e,(t,n)=>{const o=this.state.options;return this.state.setActive("whilePress",!0),o.onPressStart&&Je.postRender(()=>o.onPressStart(n,Km(n))),(r,{success:u})=>{this.state.setActive("whilePress",!1);const a=u?"onPress":"onPressCancel",s=this.state.options[a];s&&Je.postRender(()=>s(r,Km(r)))}},{useGlobalTarget:this.state.options.globalPressTarget}))}mount(){this.register()}update(){const e=this.state.visualElement.prevProps;!(e?.whilePress||e?.whileTap||e?.onPress||e?.onPressCancel||e?.onPressStart)&&this.isActive()&&this.register()}unmount(){this.removePress?.(),this.removePress=void 0}};function EE(e){return e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1}function Xa(e,t="page"){return{point:{x:e[`${t}X`],y:e[`${t}Y`]}}}function Y$(e){return t=>EE(t)&&e(t,Xa(t))}var Z$=class extends zo{static#e=this.key="hover";constructor(e){super(e)}isActive(){const{whileHover:e,onHoverStart:t,onHoverEnd:n}=this.state.options;return!!(e||t||n)}register(){const e=this.state.element;!e||!this.isActive()||(this.removeHover?.(),this.removeHover=rq(e,(t,n)=>{const o=this.state.options;return this.state.setActive("whileHover",!0),o.onHoverStart&&Je.postRender(()=>o.onHoverStart(n,Xa(n))),r=>{this.state.setActive("whileHover",!1);const u=this.state.options.onHoverEnd;u&&Je.postRender(()=>u(r,Xa(r)))}}))}mount(){this.register()}update(){const e=this.state.visualElement.prevProps;!(e?.whileHover||e?.onHoverStart||e?.onHoverEnd)&&this.isActive()&&this.register()}unmount(){this.removeHover?.(),this.removeHover=void 0}},X$=class extends zo{static#e=this.key="inView";constructor(e){super(e)}isActive(){const{whileInView:e,onViewportEnter:t,onViewportLeave:n}=this.state.options;return!!(e||t||n)}startObserver(){const e=this.state.element;if(!e||!this.isActive())return;this.removeObserver?.();const{once:t,...n}=this.state.options.inViewOptions||{};this.removeObserver=_$(e,(o,r)=>{const u=this.state.options;if(this.state.setActive("whileInView",!0),u.onViewportEnter&&Je.postRender(()=>u.onViewportEnter(r)),!t)return()=>{this.state.setActive("whileInView",!1);const a=this.state.options.onViewportLeave;a&&Je.postRender(()=>a(r))}},n)}mount(){this.startObserver()}update(){const{props:e,prevProps:t}=this.state.visualElement;["amount","margin","root"].some(n=>e.inViewOptions?.[n]!==t?.inViewOptions?.[n])&&this.startObserver()}unmount(){this.removeObserver?.(),this.removeObserver=void 0}};function Wi(e,t,n,o={passive:!0}){return e.addEventListener(t,n,o),()=>e.removeEventListener(t,n)}var J$=class extends zo{static#e=this.key="focus";constructor(e){super(e),this.isFocused=!1}onFocus(){let e=!1;try{e=this.state.element.matches(":focus-visible")}catch{e=!0}e&&(this.state.setActive("whileFocus",!0),this.isFocused=!0)}onBlur(){this.isFocused&&(this.state.setActive("whileFocus",!1),this.isFocused=!1)}mount(){const e=this.state.element;this.removeFocus=vs(Wi(e,"focus",()=>this.onFocus()),Wi(e,"blur",()=>this.onBlur()))}unmount(){this.removeFocus?.(),this.removeFocus=void 0}};function CE(e){if(e)return e.options.allowProjection!==!1?e.projection:CE(e.parent)}const xE={borderRadius:{...ao,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:ao,borderTopRightRadius:ao,borderBottomLeftRadius:ao,borderBottomRightRadius:ao,boxShadow:X6};function va(e){return typeof e=="object"&&e!==null&&"nodeType"in e}const Q$=typeof window>"u";var eN=class extends zo{static#e=this.key="projection";constructor(e){super(e),J6(xE),Q$||this.initProjection()}initProjection(){const e=this.state.options;this.state.visualElement.projection=new A$(this.state.visualElement.latestValues,e["data-framer-portal-id"]?void 0:CE(this.state.visualElement.parent)),this.projection=this.state.visualElement.projection,this.projection.isPresent=!0,this.setOptions()}setOptions(){const e=this.state.options,{layoutId:t,layout:n,drag:o=!1,dragConstraints:r=!1}=e;this.projection?.setOptions({layout:n,layoutId:t,alwaysMeasureLayout:!!t||!!o||r&&va(r),visualElement:this.state.visualElement,animationType:typeof e.layout=="string"?e.layout:"both",layoutRoot:e.layoutRoot,layoutScroll:e.layoutScroll,crossfade:e.crossfade,onExitComplete:()=>{!this.projection?.isPresent&&this.state.options.layoutId&&!this.state.isExiting&&queueMicrotask(()=>{this.state.options.presenceContext?.onMotionExitComplete?.(this.state.presenceContainer,this.state)})}})}update(){this.setOptions()}mount(){this.projection?.mount(this.state.element)}};function Sa(e,t,n,o){return Wi(e,t,Y$(n),o)}var Wm=new Set(["auto","scroll"]),wE=class{constructor(e,t,{transformPagePoint:n,contextWindow:o,dragSnapToOrigin:r=!1,element:u}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.onElementScroll=l=>{this.handleScroll(l.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const l=Pc(this.lastMoveEventInfo,this.history),d=this.startEvent!==null,p=k$(l.offset,{x:0,y:0})>=3;if(!d&&!p)return;const{point:h}=l,{timestamp:m}=Nt;this.history.push({...h,timestamp:m});const{onStart:g,onMove:y}=this.handlers;d||(g&&g(this.lastMoveEvent,l),this.startEvent=this.lastMoveEvent),y&&y(this.lastMoveEvent,l)},this.handlePointerMove=(l,d)=>{this.lastMoveEvent=l,this.lastMoveEventInfo=Fc(d,this.transformPagePoint),Je.update(this.updatePoint,!0)},this.handlePointerUp=(l,d)=>{this.end();const{onEnd:p,onSessionEnd:h,resumeAnimation:m}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&m&&m(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const g=Pc(l.type==="pointercancel"?this.lastMoveEventInfo:Fc(d,this.transformPagePoint),this.history);this.startEvent&&p&&p(l,g),h&&h(l,g)},!EE(e))return;this.dragSnapToOrigin=r,this.handlers=t,this.transformPagePoint=n,this.contextWindow=o||window;const a=Fc(Xa(e),this.transformPagePoint),{point:s}=a,{timestamp:i}=Nt;this.history=[{...s,timestamp:i}];const{onSessionStart:c}=t;c&&c(e,Pc(a,this.history)),this.removeListeners=vs(Sa(this.contextWindow,"pointermove",this.handlePointerMove),Sa(this.contextWindow,"pointerup",this.handlePointerUp),Sa(this.contextWindow,"pointercancel",this.handlePointerUp)),u&&this.startScrollTracking(u)}isScrollable(e){const t=window.getComputedStyle(e);return t.overflow==="auto"||t.overflow==="scroll"||t.overflowX==="auto"||t.overflowX==="scroll"||t.overflowY==="auto"||t.overflowY==="scroll"}startScrollTracking(e){let t=e.parentElement;for(;t;){const n=getComputedStyle(t);(Wm.has(n.overflowX)||Wm.has(n.overflowY))&&this.scrollPositions.set(t,{x:t.scrollLeft,y:t.scrollTop}),t=t.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0,passive:!0}),window.addEventListener("scroll",this.onWindowScroll,{passive:!0}),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(e){const t=this.scrollPositions.get(e);if(!t)return;const n=e===window,o=n?{x:window.scrollX,y:window.scrollY}:{x:e.scrollLeft,y:e.scrollTop},r={x:o.x-t.x,y:o.y-t.y};r.x===0&&r.y===0||(n?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=r.x,this.lastMoveEventInfo.point.y+=r.y):this.history.length>0&&(this.history[0].x-=r.x,this.history[0].y-=r.y),this.scrollPositions.set(e,o),Je.update(this.updatePoint,!0))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners?.(),this.scrollPositions.clear(),hr(this.updatePoint)}};function Fc(e,t){return t?{point:t(e.point)}:e}function Gm(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Pc({point:e},t){return{point:e,delta:Gm(e,DE(t)),offset:Gm(e,tN(t)),velocity:nN(t,.1)}}function tN(e){return e[0]}function DE(e){return e[e.length-1]}function nN(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,o=null;const r=DE(e);for(;n>=0&&(o=e[n],!(r.timestamp-o.timestamp>Rn(t)));)n--;if(!o)return{x:0,y:0};const u=Mn(r.timestamp-o.timestamp);if(u===0)return{x:0,y:0};const a={x:(r.x-o.x)/u,y:(r.y-o.y)/u};return a.x===1/0&&(a.x=0),a.y===1/0&&(a.y=0),a}function Ym(e){return(t,n)=>{e&&Je.postRender(()=>e(t,n))}}var oN=class extends zo{constructor(...e){super(...e),this.removePointerDownListener=In}static#e=this.key="pan";onPointerDown(e){this.session=new wE(e,this.createPanHandlers(),{transformPagePoint:this.state.visualElement.getTransformPagePoint(),contextWindow:dE(this.state.visualElement)})}createPanHandlers(){return{onSessionStart:Ym((e,t)=>{const{onPanSessionStart:n}=this.state.options;n&&n(e,t)}),onStart:Ym((e,t)=>{const{onPanStart:n}=this.state.options;n&&n(e,t)}),onMove:(e,t)=>{const{onPan:n}=this.state.options;n&&n(e,t)},onEnd:(e,t)=>{const{onPanEnd:n}=this.state.options;delete this.session,n&&Je.postRender(()=>n(e,t))}}}mount(){this.removePointerDownListener=Sa(this.state.element,"pointerdown",this.onPointerDown.bind(this))}update(){}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}};function AE(e){let t=null;return()=>{const n=()=>{t=null};return t===null?(t=e,n):!1}}var Zm=AE("dragHorizontal"),Xm=AE("dragVertical");function rN(e){let t=!1;if(e==="y")t=Xm();else if(e==="x")t=Zm();else{const n=Zm(),o=Xm();n&&o?t=()=>{n(),o()}:(n&&n(),o&&o())}return t}function uN(e,{min:t,max:n},o){return t!==void 0&&en&&(e=o?ft(n,e,o.max):Math.min(e,n)),e}const hd=.35;function aN(e,{top:t,left:n,bottom:o,right:r}){return{x:Jm(e.x,n,r),y:Jm(e.y,t,o)}}function Jm(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function sN(e=hd){return e===!1?e=0:e===!0&&(e=hd),{x:Qm(e,"left","right"),y:Qm(e,"top","bottom")}}function Qm(e,t,n){return{min:eg(e,t),max:eg(e,n)}}function eg(e,t){return typeof e=="number"?e:e[t]||0}function iN(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}function lN(e,t){return{x:tg(e.x,t.x),y:tg(e.y,t.y)}}function tg(e,t){let n=t.min-e.min,o=t.max-e.max;return t.max-t.mino?n=Ga(t.min,t.max-o,e.min):o>r&&(n=Ga(e.min,e.max-r,t.min)),po(0,1,n)}const dN=new WeakMap;var fN=class{constructor(e){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=It(),this.state=e}get visualElement(){return this.state.visualElement}start(e,{snapToCursor:t=!1}={}){const n=i=>{t?this.stopAnimation():this.pauseAnimation(),t&&this.snapToCursor(Xa(i,"page").point)},o=(i,c)=>{this.stopAnimation();const{drag:l,dragPropagation:d,onDragStart:p}=this.getProps();l&&!d&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=rN(l),!this.openGlobalLock)||(this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Tn(h=>{let m=this.getAxisMotionValue(h).get()||0;if(co.test(m)){const{projection:g}=this.visualElement;if(g&&g.layout){const y=g.layout.layoutBox[h];y&&(m=un(y)*(parseFloat(m)/100))}}this.originPoint[h]=m}),p&&Je.postRender(()=>p(i,c)),rd(this.visualElement,"transform"),this.state.setActive("whileDrag",!0))},r=(i,c)=>{const{dragPropagation:l,dragDirectionLock:d,onDirectionLock:p,onDrag:h}=this.getProps();if(!l&&!this.openGlobalLock)return;const{offset:m}=c;if(d&&this.currentDirection===null){this.currentDirection=pN(m),this.currentDirection!==null&&p&&p(this.currentDirection);return}this.updateAxis("x",c.point,m),this.updateAxis("y",c.point,m),this.visualElement.render(),h&&h(i,c)},u=(i,c)=>this.stop(i,c),a=()=>Tn(i=>this.getAnimationState(i)==="paused"&&this.getAxisMotionValue(i).animation?.play()),{dragSnapToOrigin:s}=this.getProps();this.panSession=new wE(e,{onSessionStart:n,onStart:o,onMove:r,onSessionEnd:u,resumeAnimation:a},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:s,contextWindow:dE(this.visualElement),element:this.state.element})}stop(e,t){const n=this.isDragging;if(this.cancel(),!n)return;const{velocity:o}=t;this.startAnimation(o);const{onDragEnd:r}=this.getProps();r&&Je.postRender(()=>r(e,t))}cancel(){this.isDragging=!1;const{projection:e}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:t}=this.getProps();!t&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),this.state.setActive("whileDrag",!1)}updateAxis(e,t,n){const{drag:o}=this.getProps();if(!n||!Ys(e,o,this.currentDirection))return;const r=this.getAxisMotionValue(e);let u=this.originPoint[e]+n[e];this.constraints&&this.constraints[e]&&(u=uN(u,this.constraints[e],this.elastic[e])),r.set(u)}resolveConstraints(){const{dragConstraints:e,dragElastic:t}=this.getProps(),n=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,o=this.constraints;e&&va(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):e&&n?this.constraints=aN(n.layoutBox,e):this.constraints=!1,this.elastic=sN(t),o!==this.constraints&&n&&this.constraints&&!this.hasMutatedConstraints&&Tn(r=>{this.constraints!==!1&&this.getAxisMotionValue(r)&&(this.constraints[r]=iN(n.layoutBox[r],this.constraints[r]))})}resolveRefConstraints(){const{dragConstraints:e,onMeasureDragConstraints:t}=this.getProps();if(!e||!va(e))return!1;const n=e,{projection:o}=this.visualElement;if(!o||!o.layout)return!1;const r=Dq(n,o.root,this.visualElement.getTransformPagePoint());let u=lN(o.layout.layoutBox,r);if(t){const a=t(Cq(u));this.hasMutatedConstraints=!!a,a&&(u=K6(a))}return u}startAnimation(e){const{drag:t,dragMomentum:n,dragElastic:o,dragTransition:r,dragSnapToOrigin:u,onDragTransitionEnd:a}=this.getProps(),s=this.constraints||{},i=Tn(c=>{if(!Ys(c,t,this.currentDirection))return;let l=s&&s[c]||{};u&&(l={min:0,max:0});const d=o?200:1e6,p=o?40:1e7,h={type:"inertia",velocity:n?e[c]:0,bounceStiffness:d,bounceDamping:p,timeConstant:750,restDelta:1,restSpeed:10,...r,...l};return this.startAxisValueAnimation(c,h)});return Promise.all(i).then(a)}startAxisValueAnimation(e,t){const n=this.getAxisMotionValue(e);return rd(this.visualElement,e),n.start(Gf(e,n,0,t,this.visualElement,!1))}stopAnimation(){this.visualElement.projection?.isPresent&&Tn(e=>this.getAxisMotionValue(e).stop())}pauseAnimation(){Tn(e=>this.getAxisMotionValue(e).animation?.pause())}getAnimationState(e){return this.getAxisMotionValue(e).animation?.state}getAxisMotionValue(e){const t=`_drag${e.toUpperCase()}`,n=this.visualElement.getProps();return n[t]||this.visualElement.getValue(e,(n.initial?n.initial[e]:void 0)||0)}snapToCursor(e){Tn(t=>{const{drag:n}=this.getProps();if(!Ys(t,n,this.currentDirection))return;const{projection:o}=this.visualElement,r=this.getAxisMotionValue(t);if(o&&o.layout){const{min:u,max:a}=o.layout.layoutBox[t];r.set(e[t]-ft(u,a,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:e,dragConstraints:t}=this.getProps(),{projection:n}=this.visualElement;if(!va(t)||!n||!this.constraints)return;this.stopAnimation();const o={x:0,y:0};Tn(u=>{const a=this.getAxisMotionValue(u);if(a&&this.constraints!==!1){const s=a.get();o[u]=cN({min:s,max:s},this.constraints[u])}});const{transformTemplate:r}=this.visualElement.getProps();this.state.element.style.transform=r?r({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Tn(u=>{if(!Ys(u,e,null))return;const a=this.getAxisMotionValue(u),{min:s,max:i}=this.constraints[u];a.set(ft(s,i,o[u]))})}addListeners(){if(!this.state.element)return;dN.set(this.visualElement,this);const e=this.state.element,t=Sa(e,"pointerdown",s=>{const{drag:i,dragListener:c=!0}=this.getProps();i&&c&&this.start(s)}),n=()=>{const{dragConstraints:s}=this.getProps();va(s)&&(this.constraints=this.resolveRefConstraints())},{projection:o}=this.visualElement,r=o.addEventListener("measure",n);o&&!o.layout&&(o.root&&o.root.updateScroll(),o.updateLayout()),Je.read(n);const u=Wi(window,"resize",()=>this.scalePositionWithinConstraints()),a=o.addEventListener("didUpdate",(({delta:s,hasLayoutChanged:i})=>{this.isDragging&&i&&(Tn(c=>{const l=this.getAxisMotionValue(c);l&&(this.originPoint[c]+=s[c].translate,l.set(l.get()+s[c].translate))}),this.visualElement.render())}));return()=>{u(),t(),r(),a&&a()}}getProps(){const e=this.visualElement.getProps(),{drag:t=!1,dragDirectionLock:n=!1,dragPropagation:o=!1,dragConstraints:r=!1,dragElastic:u=hd,dragMomentum:a=!0}=e;return{...e,drag:t,dragDirectionLock:n,dragPropagation:o,dragConstraints:r,dragElastic:u,dragMomentum:a}}};function Ys(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function pN(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}var hN=class extends zo{static#e=this.key="drag";constructor(e){super(e),this.removeGroupControls=In,this.removeListeners=In,this.controls=new fN(e)}mount(){const{dragControls:e}=this.state.options;e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||In}unmount(){this.removeGroupControls(),this.removeListeners()}},la=!1,mN=class extends zo{static#e=this.key="layout";constructor(e){super(e),this.hasMountSettled=!1,J6(xE),e.getSnapshot=this.getSnapshot.bind(this),e.didUpdate=this.didUpdate.bind(this)}updatePrevLead(e){const t=e.getStack();t?.prevLead&&!t.prevLead.snapshot&&(t.prevLead.willUpdate(),la=!0)}didUpdate(){la&&(this.state.options.layout||this.state.options.layoutId||this.state.options.drag)&&(la=!1,this.state.visualElement.projection?.root?.didUpdate())}mount(){const e=this.state.options,t=this.state.options.layoutGroup;if(e.layout||e.layoutId){const n=this.state.visualElement.projection;if(e.layoutId){const o=!bE(this.state.element);n.isPresent=o,o?n.promote():n.relegate(),this.updatePrevLead(n)}t?.group?.add(n),di.hasEverUpdated=!0}this.didUpdate(),Je.postRender(()=>{this.hasMountSettled=!0})}unmount(){const e=this.state.options.layoutGroup,t=this.state.visualElement.projection;t&&(e?.group&&(this.state.options.layout||this.state.options.layoutId)&&e.group.remove(t),this.state.options.layoutId&&(la=!0),this.didUpdate())}getSnapshot(e,t){const n=this.state.visualElement.projection,{drag:o,layoutDependency:r,layout:u,layoutId:a}=e;if(!n||!u&&!a&&!o||!this.hasMountSettled)return;la=!0;const s=this.state.options;(o||s.layoutDependency!==r||r===void 0||x0(t)&&n.isPresent!==t)&&n.willUpdate(),x0(t)&&t!==n.isPresent&&(n.isPresent=t,t?(n.promote(),this.updatePrevLead(n)):n.relegate())}};const gN={renderer:W$,features:[K$,G$,Z$,X$,J$,eN,oN,hN,mN]},[vN]=gs("LazyMotionContext"),[yN,cH]=gs("AnimatePresenceContext");function bN(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}function BE(){return{transform:{},transformOrigin:{},style:{},vars:{}}}function EN(){return{...BE(),attrs:{}}}function CN(e){const t=BE();Jf(t,e);const n={...t.style};for(const o in t.vars)n[o]=t.vars[o];return Object.keys(n).length===0?null:n}function xN(e,t,n){const o=EN();eE(o,e,tE(t),void 0,n);const r={};for(const u in o.attrs){const a=Qf.has(u)?u:bN(u);r[a]=o.attrs[u]}return{attrs:r,style:{...o.style,...o.vars}}}function wN(e,t){const n=S$(null),o=F$({}),r=O$(),u=yN({}),a=vN({features:R({}),strict:!1}),s=hv();function i(){return WI(e,{layoutGroup:o,presenceContext:u,config:r.value})}function c(){return{...s,...i()}}const l=new $$(c(),n);T$(l),t&&l.initVisualElement(t),ye(a.features,h=>{h.features?.length&&fE(h.features),h.renderer&&l.initVisualElement(h.renderer),l.updateFeatures()},{immediate:!0,flush:"pre"});function d(){const h=l.type==="svg",m={...s};Object.keys(s).forEach(b=>{Zt(s[b])&&(m[b]=s[b].get())});const g=l.visualElement?.latestValues||l.latestValues;let y={...e.style,...h?{}:g};for(const b in y)Zt(y[b])&&(y[b]=y[b].get());if(h){const{attrs:b,style:v}=xN({...g,...y},l.options.as,e.style);Object.assign(m,b),y=v}e.drag&&e.dragListener!==!1&&Object.assign(y,{userSelect:"none",WebkitUserSelect:"none",WebkitTouchCallout:"none",touchAction:e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`});const E=CN(y);return E&&(m.style=E),m}const p=We().proxy;return $e(()=>{const h=fd(p.$el);l.mount(h)}),mo(()=>l.beforeUnmount()),Ht(()=>{fd(p.$el)?.isConnected||l.unmount()}),iv(()=>{l.beforeUpdate(),l.updateOptions(c())}),Gr(()=>{l.update()}),{getProps:i,getAttrs:d,layoutGroup:o,state:l}}const DN={ignoreStrict:{type:Boolean},forwardMotionProps:{type:Boolean,default:!1},asChild:{type:Boolean,default:!1},whileDrag:{type:[String,Array,Object]},whileHover:{type:[String,Array,Object]},whilePress:{type:[String,Array,Object]},whileInView:{type:[String,Array,Object]},whileFocus:{type:[String,Array,Object]},custom:{type:[String,Number,Object,Array]},initial:{type:[String,Array,Object,Boolean],default:void 0},animate:{type:[String,Array,Object],default:void 0},exit:{type:[String,Array,Object]},variants:{type:Object},inherit:{type:Boolean},style:{type:Object},transformTemplate:{type:Function},transition:{type:Object},onAnimationComplete:{type:Function},onUpdate:{type:Function},layout:{type:[Boolean,String],default:!1},layoutId:{type:String,default:void 0},layoutScroll:{type:Boolean,default:!1},layoutRoot:{type:Boolean,default:!1},"data-framer-portal-id":{type:String},crossfade:{type:Boolean,default:!0},layoutDependency:{type:null,default:void 0},onBeforeLayoutMeasure:{type:Function},onLayoutMeasure:{type:Function},onLayoutAnimationStart:{type:Function},onLayoutAnimationComplete:{type:Function},globalPressTarget:{type:Boolean},onPressStart:{type:Function},onPress:{type:Function},onPressCancel:{type:Function},onHoverStart:{type:Function},onHoverEnd:{type:Function},inViewOptions:{type:Object},onViewportEnter:{type:Function},onViewportLeave:{type:Function},drag:{type:[Boolean,String]},dragSnapToOrigin:{type:Boolean},dragDirectionLock:{type:Boolean},dragPropagation:{type:Boolean},dragConstraints:{type:[Boolean,Object]},dragElastic:{type:[Boolean,Number,Object],default:.5},dragMomentum:{type:Boolean,default:!0},dragTransition:{type:Object},dragListener:{type:Boolean,default:!0},dragControls:{type:Object},onDragStart:{type:Function},onDragEnd:{type:Function},onDrag:{type:Function},onDirectionLock:{type:Function},onDragTransitionEnd:{type:Function},onMeasureDragConstraints:{type:Function},onPanSessionStart:{type:Function},onPanStart:{type:Function},onPan:{type:Function},onPanEnd:{type:Function}};var AN=new Map,BN=new Map;function _N(e){if(!Array.isArray(e))return[e];const t=[];for(const n of e)Array.isArray(n)?t.push(...n):t.push(n);return t}var kN=["area","img","input"];function SN(e,t,n){if(typeof e=="string"&&kN.includes(e))return qe(e,t);if(e==="template"){if(!n.default)return null;const o=_N(n.default()),r=o.findIndex(i=>i.type!==bt);if(r===-1)return o;const u=o[r];delete u.props?.ref;const a=u.props?j(t,u.props):t;t.class&&u.props?.class&&delete u.props.class;const s=An(u,a);for(const i in a)i.startsWith("on")&&(s.props||={},s.props[i]=a[i]);return o.length===1?s:(o[r]=s,o)}return null}function ng(e,t={}){const n=typeof e=="string",o=n?e:e.name||"",r=t.renderer?AN:BN;if(n&&r?.has(e))return r.get(e);const u=L({inheritAttrs:!1,props:{...DN,as:{type:[String,Object],default:e||"div"}},name:o?`motion.${o}`:"Motion",setup(a,{slots:s}){const{getProps:i,getAttrs:c,state:l}=wN(a,t.renderer);function d(){const p=l.element;if((typeof a.as!="object"||a.asChild)&&p){const{style:h}=c();if(h)for(const[m,g]of Object.entries(h))p.style[m]=g}}return()=>{const p=i(),h=c(),m=a.asChild?"template":a.as,g={...a.forwardMotionProps?p:{},...h,onVnodeUpdated:d},y=SN(m,g,s);return y!==null?y:qe(m,{...g},s)}}});return n&&r?.set(e,u),u}function TN(e){const t=e?.renderer;return fE(e?.features||[]),new Proxy({},{get(n,o){return o==="create"?(r,u)=>ng(r,{...u,renderer:t}):ng(o,{renderer:t})}})}const fi=TN(gN),dH=fi.create("div"),FN={xmlns:"http://www.w3.org/2000/svg",class:"size-5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},PN=L({__name:"IconMenuToggle",props:{open:{type:Boolean}},setup(e){const t=e,n={normal:{rotate:0,y:0,opacity:1},close:r=>{const u=r;return{rotate:u===1?45:u===3?-45:0,y:u===1?6:u===3?-6:0,opacity:u===2?0:1,transition:{type:"spring",stiffness:260,damping:20}}}},o=F(()=>t.open?"close":"normal");return(r,u)=>{const a=hn;return D(),k(a,{size:"sm",variant:"ghost",color:"neutral",class:"-me-1.5",square:""},{default:A(()=>[(D(),re("svg",FN,[q(f(fi).line,{x1:"4",y1:"6",x2:"20",y2:"6",variants:n,animate:f(o),custom:1,class:"outline-none"},null,8,["animate"]),q(f(fi).line,{x1:"4",y1:"12",x2:"20",y2:"12",variants:n,animate:f(o),custom:2,class:"outline-none"},null,8,["animate"]),q(f(fi).line,{x1:"4",y1:"18",x2:"20",y2:"18",variants:n,animate:f(o),custom:3,class:"outline-none"},null,8,["animate"])]))]),_:1})}}}),MN=Object.assign(PN,{__name:"IconMenuToggle"}),ON={slots:{base:"font-medium inline-flex items-center",label:"truncate",leadingIcon:"shrink-0",leadingAvatar:"shrink-0",leadingAvatarSize:"",trailingIcon:"shrink-0"},variants:{fieldGroup:{horizontal:"not-only:first:rounded-e-none not-only:last:rounded-s-none not-last:not-first:rounded-none focus-visible:z-[1]",vertical:"not-only:first:rounded-b-none not-only:last:rounded-t-none not-last:not-first:rounded-none focus-visible:z-[1]"},color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{solid:"",outline:"",soft:"",subtle:""},size:{xs:{base:"text-[8px]/3 px-1 py-0.5 gap-1 rounded-sm",leadingIcon:"size-3",leadingAvatarSize:"3xs",trailingIcon:"size-3"},sm:{base:"text-[10px]/3 px-1.5 py-1 gap-1 rounded-sm",leadingIcon:"size-3",leadingAvatarSize:"3xs",trailingIcon:"size-3"},md:{base:"text-xs px-2 py-1 gap-1 rounded-md",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},lg:{base:"text-sm px-2 py-1 gap-1.5 rounded-md",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},xl:{base:"text-base px-2.5 py-1 gap-1.5 rounded-md",leadingIcon:"size-6",leadingAvatarSize:"2xs",trailingIcon:"size-6"}},square:{true:""}},compoundVariants:[{color:"primary",variant:"solid",class:"bg-primary text-inverted"},{color:"secondary",variant:"solid",class:"bg-secondary text-inverted"},{color:"success",variant:"solid",class:"bg-success text-inverted"},{color:"info",variant:"solid",class:"bg-info text-inverted"},{color:"warning",variant:"solid",class:"bg-warning text-inverted"},{color:"error",variant:"solid",class:"bg-error text-inverted"},{color:"primary",variant:"outline",class:"text-primary ring ring-inset ring-primary/50"},{color:"secondary",variant:"outline",class:"text-secondary ring ring-inset ring-secondary/50"},{color:"success",variant:"outline",class:"text-success ring ring-inset ring-success/50"},{color:"info",variant:"outline",class:"text-info ring ring-inset ring-info/50"},{color:"warning",variant:"outline",class:"text-warning ring ring-inset ring-warning/50"},{color:"error",variant:"outline",class:"text-error ring ring-inset ring-error/50"},{color:"primary",variant:"soft",class:"bg-primary/10 text-primary"},{color:"secondary",variant:"soft",class:"bg-secondary/10 text-secondary"},{color:"success",variant:"soft",class:"bg-success/10 text-success"},{color:"info",variant:"soft",class:"bg-info/10 text-info"},{color:"warning",variant:"soft",class:"bg-warning/10 text-warning"},{color:"error",variant:"soft",class:"bg-error/10 text-error"},{color:"primary",variant:"subtle",class:"bg-primary/10 text-primary ring ring-inset ring-primary/25"},{color:"secondary",variant:"subtle",class:"bg-secondary/10 text-secondary ring ring-inset ring-secondary/25"},{color:"success",variant:"subtle",class:"bg-success/10 text-success ring ring-inset ring-success/25"},{color:"info",variant:"subtle",class:"bg-info/10 text-info ring ring-inset ring-info/25"},{color:"warning",variant:"subtle",class:"bg-warning/10 text-warning ring ring-inset ring-warning/25"},{color:"error",variant:"subtle",class:"bg-error/10 text-error ring ring-inset ring-error/25"},{color:"neutral",variant:"solid",class:"text-inverted bg-inverted"},{color:"neutral",variant:"outline",class:"ring ring-inset ring-accented text-default bg-default"},{color:"neutral",variant:"soft",class:"text-default bg-elevated"},{color:"neutral",variant:"subtle",class:"ring ring-inset ring-accented text-default bg-elevated"},{size:"xs",square:!0,class:"p-0.5"},{size:"sm",square:!0,class:"p-1"},{size:"md",square:!0,class:"p-1"},{size:"lg",square:!0,class:"p-1"},{size:"xl",square:!0,class:"p-1"}],defaultVariants:{color:"primary",variant:"solid",size:"md"}},_E={__name:"UBadge",props:{as:{type:null,required:!1,default:"span"},label:{type:[String,Number],required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1}},setup(e){const t=e,n=qt(),o=Pe(),r=Et("badge",t),{orientation:u,size:a}=Eb(t),{isLeading:s,isTrailing:i,leadingIconName:c,trailingIconName:l}=bb(t),d=F(()=>Se({extend:Se(ON),...o.ui?.badge||{}})({color:t.color,variant:t.variant,size:a.value||t.size,square:t.square||!n.default&&!t.label,fieldGroup:u.value}));return(p,h)=>(D(),k(f(we),{as:e.as,"data-slot":"base",class:U(d.value.base({class:[f(r)?.base,t.class]}))},{default:A(()=>[P(p.$slots,"leading",{ui:d.value},()=>[f(s)&&f(c)?(D(),k(st,{key:0,name:f(c),"data-slot":"leadingIcon",class:U(d.value.leadingIcon({class:f(r)?.leadingIcon}))},null,8,["name","class"])):e.avatar?(D(),k(Ku,j({key:1,size:f(r)?.leadingAvatarSize||d.value.leadingAvatarSize()},e.avatar,{"data-slot":"leadingAvatar",class:d.value.leadingAvatar({class:f(r)?.leadingAvatar})}),null,16,["size","class"])):Y("",!0)]),P(p.$slots,"default",{ui:d.value},()=>[e.label!==void 0&&e.label!==null?(D(),re("span",{key:0,"data-slot":"label",class:U(d.value.label({class:f(r)?.label}))},Fe(e.label),3)):Y("",!0)]),P(p.$slots,"trailing",{ui:d.value},()=>[f(i)&&f(l)?(D(),k(st,{key:0,name:f(l),"data-slot":"trailingIcon",class:U(d.value.trailingIcon({class:f(r)?.trailingIcon}))},null,8,["name","class"])):Y("",!0)])]),_:3},8,["as","class"]))}},IN={slots:{root:"",content:"data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out] overflow-hidden focus:outline-none",list:"isolate -mx-2.5 -mt-1.5",item:"",listWithChildren:"ms-5 border-s border-default",itemWithChildren:"flex flex-col data-[state=open]:mb-1.5",trigger:"font-semibold",link:"group relative w-full px-2.5 py-1.5 before:inset-y-px before:inset-x-0 flex items-center gap-1.5 text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2",linkLeadingIcon:"shrink-0 size-5",linkTrailing:"ms-auto inline-flex gap-1.5 items-center",linkTrailingBadge:"shrink-0",linkTrailingBadgeSize:"sm",linkTrailingIcon:"size-5 transform transition-transform duration-200 shrink-0 group-data-[state=open]:rotate-180",linkTitle:"truncate",linkTitleExternalIcon:"size-3 align-top text-dimmed"},variants:{color:{primary:{trigger:"focus-visible:ring-primary",link:"focus-visible:before:ring-primary"},secondary:{trigger:"focus-visible:ring-secondary",link:"focus-visible:before:ring-secondary"},success:{trigger:"focus-visible:ring-success",link:"focus-visible:before:ring-success"},info:{trigger:"focus-visible:ring-info",link:"focus-visible:before:ring-info"},warning:{trigger:"focus-visible:ring-warning",link:"focus-visible:before:ring-warning"},error:{trigger:"focus-visible:ring-error",link:"focus-visible:before:ring-error"},neutral:{trigger:"focus-visible:ring-inverted",link:"focus-visible:before:ring-inverted"}},highlightColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{pill:"",link:""},active:{true:{link:"font-medium"},false:{link:"text-muted",linkLeadingIcon:"text-dimmed"}},disabled:{true:{trigger:"data-[state=open]:text-highlighted"}},highlight:{true:{}},level:{true:{item:"ps-1.5 -ms-px",itemWithChildren:"ps-1.5 -ms-px"}}},compoundVariants:[{highlight:!0,level:!0,class:{link:["after:absolute after:-left-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full","after:transition-colors"]}},{disabled:!1,active:!1,variant:"pill",class:{link:["hover:text-highlighted hover:before:bg-elevated/50 data-[state=open]:text-highlighted","transition-colors before:transition-colors"],linkLeadingIcon:["group-hover:text-default group-data-[state=open]:text-default","transition-colors"]}},{color:"primary",variant:"pill",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"pill",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"pill",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"pill",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"pill",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"pill",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"pill",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{variant:"pill",active:!0,highlight:!1,class:{link:"before:bg-elevated"}},{variant:"pill",active:!0,highlight:!0,disabled:!1,class:{link:["hover:before:bg-elevated/50","before:transition-colors"]}},{disabled:!1,active:!1,variant:"link",class:{link:["hover:text-highlighted data-[state=open]:text-highlighted","transition-colors"],linkLeadingIcon:["group-hover:text-default group-data-[state=open]:text-default","transition-colors"]}},{color:"primary",variant:"link",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"link",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"link",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"link",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"link",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"link",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"link",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{highlightColor:"primary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-primary"}},{highlightColor:"secondary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-secondary"}},{highlightColor:"success",highlight:!0,level:!0,active:!0,class:{link:"after:bg-success"}},{highlightColor:"info",highlight:!0,level:!0,active:!0,class:{link:"after:bg-info"}},{highlightColor:"warning",highlight:!0,level:!0,active:!0,class:{link:"after:bg-warning"}},{highlightColor:"error",highlight:!0,level:!0,active:!0,class:{link:"after:bg-error"}},{highlightColor:"neutral",highlight:!0,level:!0,active:!0,class:{link:"after:bg-inverted"}}],defaultVariants:{color:"primary",highlightColor:"primary",variant:"pill"}},kE=Object.assign({inheritAttrs:!1},{__name:"UContentNavigation",props:{as:{type:null,required:!1,default:"nav"},defaultOpen:{type:Boolean,required:!1,default:void 0},trailingIcon:{type:null,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},highlight:{type:Boolean,required:!1,default:!1},highlightColor:{type:null,required:!1},collapsible:{type:Boolean,required:!1,default:!0},level:{type:Number,required:!1,default:0},navigation:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},type:{type:String,required:!1,default:"multiple"},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=it(Jt(n,"collapsible","type","unmountOnHide"),o),a=Yn(),s=Pe(),i=Et("contentNavigation",n),[c,l]=To(),d=F(()=>Se({extend:Se(IN),...s.ui?.contentNavigation||{}})({color:n.color,variant:n.variant,highlight:n.highlight,highlightColor:n.highlightColor||n.color})),p=F(()=>n.disabled||n.type==="multiple"&&n.collapsible===!1);function h(g,y){return g.children?.length?g.children.some(E=>h(E,y)):y===g.path}const m=F(()=>{if(n.defaultOpen===!1)return;if(n.defaultOpen===void 0)return n.type==="single"?"0":n.navigation?.map((y,E)=>y.defaultOpen!==!1&&String(E)).filter(Boolean);const g=n.navigation?.reduce((y,E,b)=>(h(E,a.path)&&y.push(String(b)),y),[])||[];return n.type==="multiple"?g:g[0]});return(g,y)=>(D(),re(Ce,null,[q(f(c),null,{default:A(({link:E,active:b})=>[P(g.$slots,"link",{link:E,active:b,ui:d.value},()=>[P(g.$slots,"link-leading",{link:E,active:b,ui:d.value},()=>[E.icon?(D(),k(st,{key:0,name:E.icon,"data-slot":"linkLeadingIcon",class:U(d.value.linkLeadingIcon({class:[f(i)?.linkLeadingIcon,E.ui?.linkLeadingIcon],active:b}))},null,8,["name","class"])):Y("",!0)]),E.title||r["link-title"]?(D(),re("span",{key:0,"data-slot":"linkTitle",class:U(d.value.linkTitle({class:[f(i)?.linkTitle,E.ui?.linkTitle],active:b}))},[P(g.$slots,"link-title",{link:E,active:b,ui:d.value},()=>[Ke(Fe(E.title),1)]),E.target==="_blank"?(D(),k(st,{key:0,name:f(s).ui.icons.external,"data-slot":"linkTitleExternalIcon",class:U(d.value.linkTitleExternalIcon({class:[f(i)?.linkTitleExternalIcon,E.ui?.linkTitleExternalIcon],active:b}))},null,8,["name","class"])):Y("",!0)],2)):Y("",!0),E.badge||E.badge===0||E.children?.length&&!p.value||E.trailingIcon||r["link-trailing"]?(D(),re("span",{key:1,"data-slot":"linkTrailing",class:U(d.value.linkTrailing({class:[f(i)?.linkTrailing,E.ui?.linkTrailing]}))},[P(g.$slots,"link-trailing",{link:E,active:b,ui:d.value},()=>[E.badge||E.badge===0?(D(),k(_E,j({key:0,color:"neutral",variant:"outline",size:f(i)?.linkTrailingBadgeSize||d.value.linkTrailingBadgeSize()},typeof E.badge=="string"||typeof E.badge=="number"?{label:E.badge}:E.badge,{"data-slot":"linkTrailingBadge",class:d.value.linkTrailingBadge({class:f(i)?.linkTrailingBadge})}),null,16,["size","class"])):Y("",!0),E.children?.length&&!p.value?(D(),k(st,{key:1,name:E.trailingIcon||e.trailingIcon||f(s).ui.icons.chevronDown,"data-slot":"linkTrailingIcon",class:U(d.value.linkTrailingIcon({class:[f(i)?.linkTrailingIcon,E.ui?.linkTrailingIcon]}))},null,8,["name","class"])):E.trailingIcon?(D(),k(st,{key:2,name:E.trailingIcon,"data-slot":"linkTrailingIcon",class:U(d.value.linkTrailingIcon({class:[f(i)?.linkTrailingIcon,E.ui?.linkTrailingIcon]}))},null,8,["name","class"])):Y("",!0)])],2)):Y("",!0)])]),_:3}),q(f(we),j({as:e.as},g.$attrs,{"as-child":e.level>0,"data-slot":"root",class:d.value.root({class:[f(i)?.root,n.class]})}),{default:A(()=>[q(f(D0),j({as:"ul",disabled:p.value},f(u),{"default-value":m.value,class:e.level>0?d.value.listWithChildren({class:f(i)?.listWithChildren}):d.value.list({class:f(i)?.list})}),{default:A(()=>[(D(!0),re(Ce,null,yt(e.navigation,(E,b)=>(D(),re(Ce,{key:b},[E.children?.length?(D(),k(f(t1),{key:0,as:"li",disabled:!!E.disabled,"data-slot":"itemWithChildren",class:U(d.value.itemWithChildren({class:[f(i)?.itemWithChildren,E.ui?.itemWithChildren],level:e.level>0})),value:String(b)},{default:A(()=>[q(f(B0),{as:"button",class:U([d.value.link({class:[f(i)?.link,E.ui?.link,E.class],active:E.active,disabled:!!E.disabled||p.value}),d.value.trigger({class:[f(i)?.trigger,E.ui?.trigger],disabled:!!E.disabled||p.value})])},{default:A(()=>[q(f(l),{link:E,active:E.active||!1},null,8,["link","active"])]),_:2},1032,["class"]),q(f(n1),{"data-slot":"content",class:U(d.value.content({class:[f(i)?.content,E.ui?.content]}))},{default:A(()=>[q(kE,j({ref_for:!0},f(u),{navigation:E.children,"default-open":e.defaultOpen,level:e.level+1,"trailing-icon":e.trailingIcon,color:e.color,variant:e.variant,highlight:e.highlight,"highlight-color":e.highlightColor,ui:f(i)}),us({_:2},[yt(r,(v,C)=>({name:C,fn:A(w=>[P(g.$slots,C,j({ref_for:!0},{...w,link:w.link}))])}))]),1040,["navigation","default-open","level","trailing-icon","color","variant","highlight","highlight-color","ui"])]),_:2},1032,["class"])]),_:2},1032,["disabled","class","value"])):(D(),re("li",{key:1,"data-slot":"item",class:U(d.value.item({class:[f(i)?.item,E.ui?.item],level:e.level>0}))},[q($r,j({ref_for:!0},f(xu)(f(Q1)(E)),{custom:""}),{default:A(({active:v,...C})=>[q(_o,j({ref_for:!0},C,{"data-slot":"link",class:d.value.link({class:[f(i)?.link,E.ui?.link,E.class],active:v,disabled:!!E.disabled,level:e.level>0})}),{default:A(()=>[q(f(l),{link:E,active:v},null,8,["link","active"])]),_:2},1040,["class"])]),_:2},1040)],2))],64))),128))]),_:3},16,["disabled","default-value","class"])]),_:3},16,["as","as-child","class"])],64))}});function SE(e){const t=Pe();return F(()=>t.ui?.[e]?.defaultVariants||{})}const RN=L({__name:"AppHeaderBody",setup(e){const t=Ue("navigation"),n=SE("contentNavigation");return(o,r)=>{const u=kE;return D(),k(u,{highlight:f(n).highlight??!0,"highlight-color":f(n).highlightColor,variant:f(n).variant??"link",color:f(n).color,navigation:f(t)},null,8,["highlight","highlight-color","variant","color","navigation"])}}}),LN=Object.assign(RN,{__name:"AppHeaderBody"}),qN={slots:{root:"relative flex gap-1.5 [&>div]:min-w-0",list:"isolate min-w-0",label:"w-full flex items-center gap-1.5 font-semibold text-xs/5 text-highlighted px-2.5 py-1.5",item:"min-w-0",link:"group relative w-full flex items-center gap-1.5 font-medium text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none dark:focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2",linkLeadingIcon:"shrink-0 size-5",linkLeadingAvatar:"shrink-0",linkLeadingAvatarSize:"2xs",linkLeadingChipSize:"sm",linkTrailing:"group ms-auto inline-flex gap-1.5 items-center",linkTrailingBadge:"shrink-0",linkTrailingBadgeSize:"sm",linkTrailingIcon:"size-5 transform shrink-0 group-data-[state=open]:rotate-180 transition-transform duration-200",linkLabel:"truncate",linkLabelExternalIcon:"inline-block size-3 align-top text-dimmed",childList:"isolate",childLabel:"text-xs text-highlighted",childItem:"",childLink:"group relative size-full flex items-start text-start text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none dark:focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2",childLinkWrapper:"min-w-0",childLinkIcon:"size-5 shrink-0",childLinkLabel:"truncate",childLinkLabelExternalIcon:"inline-block size-3 align-top text-dimmed",childLinkDescription:"text-muted",separator:"px-2 h-px bg-border",viewportWrapper:"absolute top-full left-0 flex w-full",viewport:"relative overflow-hidden bg-default shadow-lg rounded-md ring ring-default h-(--reka-navigation-menu-viewport-height) w-full transition-[width,height,left,right] duration-200 origin-[top_center] data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] z-1",content:"",indicator:"absolute left-0 data-[state=visible]:animate-[fade-in_100ms_ease-out] data-[state=hidden]:animate-[fade-out_100ms_ease-in] data-[state=hidden]:opacity-0 bottom-0 z-2 w-(--reka-navigation-menu-indicator-size) translate-x-(--reka-navigation-menu-indicator-position) flex h-2.5 items-end justify-center overflow-hidden transition-[translate,width] duration-200",arrow:"relative top-[50%] size-2.5 rotate-45 border border-default bg-default z-1 rounded-xs"},variants:{color:{primary:{link:"focus-visible:before:ring-primary",childLink:"focus-visible:before:ring-primary"},secondary:{link:"focus-visible:before:ring-secondary",childLink:"focus-visible:before:ring-secondary"},success:{link:"focus-visible:before:ring-success",childLink:"focus-visible:before:ring-success"},info:{link:"focus-visible:before:ring-info",childLink:"focus-visible:before:ring-info"},warning:{link:"focus-visible:before:ring-warning",childLink:"focus-visible:before:ring-warning"},error:{link:"focus-visible:before:ring-error",childLink:"focus-visible:before:ring-error"},neutral:{link:"focus-visible:before:ring-inverted",childLink:"focus-visible:before:ring-inverted"}},highlightColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{pill:"",link:""},orientation:{horizontal:{root:"items-center justify-between",list:"flex items-center",item:"py-2",link:"px-2.5 py-1.5 before:inset-x-px before:inset-y-0",childList:"grid p-2",childLink:"px-3 py-2 gap-2 before:inset-x-px before:inset-y-0",childLinkLabel:"font-medium",content:"absolute top-0 left-0 w-full max-h-[70vh] overflow-y-auto"},vertical:{root:"flex-col",link:"flex-row px-2.5 py-1.5 before:inset-y-px before:inset-x-0",childLabel:"px-1.5 py-0.5",childLink:"p-1.5 gap-1.5 before:inset-y-px before:inset-x-0"}},contentOrientation:{horizontal:{viewportWrapper:"justify-center",content:"data-[motion=from-start]:animate-[enter-from-left_200ms_ease] data-[motion=from-end]:animate-[enter-from-right_200ms_ease] data-[motion=to-start]:animate-[exit-to-left_200ms_ease] data-[motion=to-end]:animate-[exit-to-right_200ms_ease]"},vertical:{viewport:"sm:w-(--reka-navigation-menu-viewport-width) left-(--reka-navigation-menu-viewport-left) rtl:left-auto rtl:right-[calc(100%-var(--reka-navigation-menu-viewport-left)-var(--reka-navigation-menu-viewport-width))]"}},active:{true:{childLink:"before:bg-elevated text-highlighted",childLinkIcon:"text-default"},false:{link:"text-muted",linkLeadingIcon:"text-dimmed",childLink:["hover:before:bg-elevated/50 text-default hover:text-highlighted","transition-colors before:transition-colors"],childLinkIcon:["text-dimmed group-hover:text-default","transition-colors"]}},disabled:{true:{link:"cursor-not-allowed opacity-75"}},highlight:{true:""},level:{true:""},collapsed:{true:""}},compoundVariants:[{orientation:"horizontal",contentOrientation:"horizontal",class:{childList:"grid-cols-2 gap-2"}},{orientation:"horizontal",contentOrientation:"vertical",class:{childList:"gap-1",content:"w-60"}},{orientation:"vertical",collapsed:!1,class:{childList:"ms-5 border-s border-default",childItem:"ps-1.5 -ms-px",content:"data-[state=open]:animate-[collapsible-down_200ms_ease-out] data-[state=closed]:animate-[collapsible-up_200ms_ease-out] overflow-hidden"}},{orientation:"vertical",collapsed:!0,class:{link:"px-1.5",linkLabel:"hidden",linkTrailing:"hidden",content:"shadow-sm rounded-sm min-h-6 p-1"}},{orientation:"horizontal",highlight:!0,class:{link:["after:absolute after:-bottom-2 after:inset-x-2.5 after:block after:h-px after:rounded-full","after:transition-colors"]}},{orientation:"vertical",highlight:!0,level:!0,class:{link:["after:absolute after:-start-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full","after:transition-colors"]}},{disabled:!1,active:!1,variant:"pill",class:{link:["hover:text-highlighted hover:before:bg-elevated/50","transition-colors before:transition-colors"],linkLeadingIcon:["group-hover:text-default","transition-colors"]}},{disabled:!1,active:!1,variant:"pill",orientation:"horizontal",class:{link:"data-[state=open]:text-highlighted",linkLeadingIcon:"group-data-[state=open]:text-default"}},{disabled:!1,variant:"pill",highlight:!0,orientation:"horizontal",class:{link:"data-[state=open]:before:bg-elevated/50"}},{disabled:!1,variant:"pill",highlight:!1,active:!1,orientation:"horizontal",class:{link:"data-[state=open]:before:bg-elevated/50"}},{color:"primary",variant:"pill",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"pill",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"pill",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"pill",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"pill",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"pill",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"pill",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{variant:"pill",active:!0,highlight:!1,class:{link:"before:bg-elevated"}},{variant:"pill",active:!0,highlight:!0,disabled:!1,class:{link:["hover:before:bg-elevated/50","before:transition-colors"]}},{disabled:!1,active:!1,variant:"link",class:{link:["hover:text-highlighted","transition-colors"],linkLeadingIcon:["group-hover:text-default","transition-colors"]}},{disabled:!1,active:!1,variant:"link",orientation:"horizontal",class:{link:"data-[state=open]:text-highlighted",linkLeadingIcon:"group-data-[state=open]:text-default"}},{color:"primary",variant:"link",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"link",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"link",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"link",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"link",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"link",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"link",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{highlightColor:"primary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-primary"}},{highlightColor:"secondary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-secondary"}},{highlightColor:"success",highlight:!0,level:!0,active:!0,class:{link:"after:bg-success"}},{highlightColor:"info",highlight:!0,level:!0,active:!0,class:{link:"after:bg-info"}},{highlightColor:"warning",highlight:!0,level:!0,active:!0,class:{link:"after:bg-warning"}},{highlightColor:"error",highlight:!0,level:!0,active:!0,class:{link:"after:bg-error"}},{highlightColor:"neutral",highlight:!0,level:!0,active:!0,class:{link:"after:bg-inverted"}}],defaultVariants:{color:"primary",highlightColor:"primary",variant:"pill"}},$N=Object.assign({inheritAttrs:!1},{__name:"UNavigationMenu",props:{as:{type:null,required:!1},type:{type:null,required:!1,default:"multiple"},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},trailingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},items:{type:null,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},collapsed:{type:Boolean,required:!1},tooltip:{type:[Boolean,Object],required:!1},popover:{type:[Boolean,Object],required:!1},highlight:{type:Boolean,required:!1},highlightColor:{type:null,required:!1},content:{type:Object,required:!1},contentOrientation:{type:null,required:!1,default:"horizontal"},arrow:{type:Boolean,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1},delayDuration:{type:Number,required:!1,default:0},disableClickTrigger:{type:Boolean,required:!1},disableHoverTrigger:{type:Boolean,required:!1},skipDelayDuration:{type:Number,required:!1},disablePointerLeaveClose:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},disabled:{type:Boolean,required:!1},collapsible:{type:Boolean,required:!1,default:!0}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=Pe(),a=Et("navigationMenu",n),s=it(F(()=>({as:n.as,delayDuration:n.delayDuration,skipDelayDuration:n.skipDelayDuration,orientation:n.orientation,disableClickTrigger:n.disableClickTrigger,disableHoverTrigger:n.disableHoverTrigger,disablePointerLeaveClose:n.disablePointerLeaveClose,unmountOnHide:n.unmountOnHide})),o),i=it(Jt(n,"collapsible","disabled","type","unmountOnHide"),o),c=Ye(()=>n.content),l=Ye(()=>wt(typeof n.tooltip=="boolean"?{}:n.tooltip,{...n.orientation==="vertical"&&{delayDuration:0,content:{side:"right"}}})),d=Ye(()=>wt(typeof n.popover=="boolean"?{}:n.popover,{mode:"hover",content:{side:"right",align:"start",alignOffset:2}})),[p,h]=To(),[m,g]=To({props:{item:Object,index:Number,level:Number,listIndex:Number}}),y=F(()=>Se({extend:Se(qN),...u.ui?.navigationMenu||{}})({orientation:n.orientation,contentOrientation:n.orientation==="vertical"?void 0:n.contentOrientation,collapsed:n.collapsed,color:n.color,variant:n.variant,highlight:n.highlight,highlightColor:n.highlightColor||n.color})),E=F(()=>n.items?.length?eb(n.items)?n.items:[n.items]:[]);function b(w,B,x,_){const S=E.value.length>1?`group-${_}-`:"";return jt(w,n.valueKey)??(x>0?`${S}item-${x}-${B}`:`${S}item-${B}`)}function v(w,B=0,x=0){const _=w.reduce((S,O,H)=>((O.defaultOpen||O.open)&&S.push(b(O,H,B,x)),S),[]);return n.type==="single"?_[0]:_}function C(w,B){B.children?.length&&(n.orientation==="horizontal"?w.preventDefault():n.orientation==="vertical"&&!n.collapsed&&(w.preventDefault(),w.stopPropagation()))}return(w,B)=>(D(),re(Ce,null,[q(f(p),null,{default:A(({item:x,active:_,index:S})=>[P(w.$slots,x.slot||"item",{item:x,index:S,active:_,ui:y.value},()=>[P(w.$slots,x.slot?`${x.slot}-leading`:"item-leading",{item:x,active:_,index:S,ui:y.value},()=>[x.avatar?(D(),k(Ku,j({key:0,size:x.ui?.linkLeadingAvatarSize||f(a)?.linkLeadingAvatarSize||y.value.linkLeadingAvatarSize()},x.avatar,{"data-slot":"linkLeadingAvatar",class:y.value.linkLeadingAvatar({class:[f(a)?.linkLeadingAvatar,x.ui?.linkLeadingAvatar],active:_,disabled:!!x.disabled})}),null,16,["size","class"])):x.icon&&x.chip?(D(),k(Tb,j({key:1,size:x.ui?.linkLeadingChipSize||f(a)?.linkLeadingChipSize||y.value.linkLeadingChipSize(),inset:""},typeof x.chip=="object"?x.chip:{},{"data-slot":"linkLeadingChip"}),{default:A(()=>[q(st,{name:x.icon,"data-slot":"linkLeadingIcon",class:U(y.value.linkLeadingIcon({class:[f(a)?.linkLeadingIcon,x.ui?.linkLeadingIcon],active:_,disabled:!!x.disabled}))},null,8,["name","class"])]),_:2},1040,["size"])):x.icon?(D(),k(st,{key:2,name:x.icon,"data-slot":"linkLeadingIcon",class:U(y.value.linkLeadingIcon({class:[f(a)?.linkLeadingIcon,x.ui?.linkLeadingIcon],active:_,disabled:!!x.disabled}))},null,8,["name","class"])):Y("",!0)]),f(jt)(x,n.labelKey)||r[x.slot?`${x.slot}-label`:"item-label"]?(D(),re("span",{key:0,"data-slot":"linkLabel",class:U(y.value.linkLabel({class:[f(a)?.linkLabel,x.ui?.linkLabel]}))},[P(w.$slots,x.slot?`${x.slot}-label`:"item-label",{item:x,active:_,index:S},()=>[Ke(Fe(f(jt)(x,n.labelKey)),1)]),x.target==="_blank"&&e.externalIcon!==!1?(D(),k(st,{key:0,name:typeof e.externalIcon=="string"?e.externalIcon:f(u).ui.icons.external,"data-slot":"linkLabelExternalIcon",class:U(y.value.linkLabelExternalIcon({class:[f(a)?.linkLabelExternalIcon,x.ui?.linkLabelExternalIcon],active:_}))},null,8,["name","class"])):Y("",!0)],2)):Y("",!0),x.badge||x.badge===0||e.orientation==="horizontal"&&(x.children?.length||r[x.slot?`${x.slot}-content`:"item-content"])||e.orientation==="vertical"&&x.children?.length||x.trailingIcon||r[x.slot?`${x.slot}-trailing`:"item-trailing"]?(D(),k(Rt(e.orientation==="vertical"&&x.children?.length&&!e.collapsed?f(B0):"span"),{key:1,as:e.orientation==="vertical"&&x.children?.length&&!e.collapsed?"span":void 0,"data-slot":"linkTrailing",class:U(y.value.linkTrailing({class:[f(a)?.linkTrailing,x.ui?.linkTrailing]})),onClick:O=>C(O,x)},{default:A(()=>[P(w.$slots,x.slot?`${x.slot}-trailing`:"item-trailing",{item:x,active:_,index:S,ui:y.value},()=>[x.badge||x.badge===0?(D(),k(_E,j({key:0,color:"neutral",variant:"outline",size:x.ui?.linkTrailingBadgeSize||f(a)?.linkTrailingBadgeSize||y.value.linkTrailingBadgeSize()},typeof x.badge=="string"||typeof x.badge=="number"?{label:x.badge}:x.badge,{"data-slot":"linkTrailingBadge",class:y.value.linkTrailingBadge({class:[f(a)?.linkTrailingBadge,x.ui?.linkTrailingBadge]})}),null,16,["size","class"])):Y("",!0),e.orientation==="horizontal"&&(x.children?.length||r[x.slot?`${x.slot}-content`:"item-content"])||e.orientation==="vertical"&&x.children?.length?(D(),k(st,{key:1,name:x.trailingIcon||e.trailingIcon||f(u).ui.icons.chevronDown,"data-slot":"linkTrailingIcon",class:U(y.value.linkTrailingIcon({class:[f(a)?.linkTrailingIcon,x.ui?.linkTrailingIcon],active:_}))},null,8,["name","class"])):x.trailingIcon?(D(),k(st,{key:2,name:x.trailingIcon,"data-slot":"linkTrailingIcon",class:U(y.value.linkTrailingIcon({class:[f(a)?.linkTrailingIcon,x.ui?.linkTrailingIcon],active:_}))},null,8,["name","class"])):Y("",!0)])]),_:2},1032,["as","class","onClick"])):Y("",!0)])]),_:3}),q(f(m),null,{default:A(({item:x,index:_,level:S=0,listIndex:O=0})=>[(D(),k(Rt(e.orientation==="vertical"&&!e.collapsed?f(t1):f(qF)),j({as:"li"},e.orientation==="vertical"&&!e.collapsed?{disabled:!!x.disabled}:{},{value:b(x,_,S,O)}),{default:A(()=>[e.orientation==="vertical"&&x.type==="label"&&!e.collapsed?(D(),re("div",{key:0,"data-slot":"label",class:U(y.value.label({class:[f(a)?.label,x.ui?.label,x.class]}))},[q(f(h),{item:x,index:_},null,8,["item","index"])],2)):x.type!=="label"?(D(),k($r,j({key:1},e.orientation==="vertical"&&x.children?.length&&!e.collapsed&&x.type==="trigger"?{}:f(xu)(x),{custom:""}),{default:A(({active:H,...N})=>[(D(),k(Rt(e.orientation==="horizontal"&&(x.children?.length||r[x.slot?`${x.slot}-content`:"item-content"])?f(ZF):e.orientation==="vertical"&&x.children?.length&&!e.collapsed&&!N.href?f(B0):f(mc)),{"as-child":"",active:H||x.active,disabled:x.disabled,onSelect:x.onSelect},{default:A(()=>[e.orientation==="vertical"&&e.collapsed&&x.children?.length&&(n.popover||x.popover)?(D(),k(jb,j({key:0},{...d.value,...typeof x.popover=="boolean"?{}:x.popover||{}},{ui:{content:y.value.content({class:[f(a)?.content,x.ui?.content]})}}),{content:A(({close:J})=>[P(w.$slots,x.slot?`${x.slot}-content`:"item-content",{item:x,active:H||x.active,index:_,ui:y.value,close:J},()=>[je("ul",{"data-slot":"childList",class:U(y.value.childList({class:[f(a)?.childList,x.ui?.childList]}))},[je("li",{"data-slot":"childLabel",class:U(y.value.childLabel({class:[f(a)?.childLabel,x.ui?.childLabel]}))},Fe(f(jt)(x,n.labelKey)),3),(D(!0),re(Ce,null,yt(x.children,(G,$)=>(D(),re("li",{key:$,"data-slot":"childItem",class:U(y.value.childItem({class:[f(a)?.childItem,x.ui?.childItem]}))},[q($r,j({ref_for:!0},f(xu)(G),{custom:""}),{default:A(({active:I,...W})=>[q(f(mc),{"as-child":"",active:I,onSelect:G.onSelect},{default:A(()=>[q(_o,j({ref_for:!0},W,{"data-slot":"childLink",class:y.value.childLink({class:[f(a)?.childLink,x.ui?.childLink,G.class],active:I})}),{default:A(()=>[G.icon?(D(),k(st,{key:0,name:G.icon,"data-slot":"childLinkIcon",class:U(y.value.childLinkIcon({class:[f(a)?.childLinkIcon,x.ui?.childLinkIcon],active:I}))},null,8,["name","class"])):Y("",!0),je("span",{"data-slot":"childLinkLabel",class:U(y.value.childLinkLabel({class:[f(a)?.childLinkLabel,x.ui?.childLinkLabel],active:I}))},[Ke(Fe(f(jt)(G,n.labelKey))+" ",1),G.target==="_blank"&&e.externalIcon!==!1?(D(),k(st,{key:0,name:typeof e.externalIcon=="string"?e.externalIcon:f(u).ui.icons.external,"data-slot":"childLinkLabelExternalIcon",class:U(y.value.childLinkLabelExternalIcon({class:[f(a)?.childLinkLabelExternalIcon,x.ui?.childLinkLabelExternalIcon],active:I}))},null,8,["name","class"])):Y("",!0)],2)]),_:2},1040,["class"])]),_:2},1032,["active","onSelect"])]),_:2},1040)],2))),128))],2)])]),default:A(()=>[q(_o,j(N,{"data-slot":"link",class:y.value.link({class:[f(a)?.link,x.ui?.link,x.class],active:H||x.active,disabled:!!x.disabled,level:S>0})}),{default:A(()=>[q(f(h),{item:x,active:H||x.active,index:_},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1040,["ui"])):e.orientation==="vertical"&&e.collapsed&&(n.tooltip||x.tooltip)||e.orientation==="horizontal"&&x.tooltip?(D(),k(Pb,j({key:1,text:f(jt)(x,n.labelKey)},{...l.value,...typeof x.tooltip=="boolean"?{}:x.tooltip||{}}),{default:A(()=>[q(_o,j(N,{"data-slot":"link",class:y.value.link({class:[f(a)?.link,x.ui?.link,x.class],active:H||x.active,disabled:!!x.disabled,level:S>0})}),{default:A(()=>[q(f(h),{item:x,active:H||x.active,index:_},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1040,["text"])):(D(),k(_o,j({key:2},N,{"data-slot":"link",class:y.value.link({class:[f(a)?.link,x.ui?.link,x.class],active:H||x.active,disabled:!!x.disabled,level:e.orientation==="horizontal"||S>0})}),{default:A(()=>[q(f(h),{item:x,active:H||x.active,index:_},null,8,["item","active","index"])]),_:2},1040,["class"]))]),_:2},1064,["active","disabled","onSelect"])),e.orientation==="horizontal"&&(x.children?.length||r[x.slot?`${x.slot}-content`:"item-content"])?(D(),k(f(VF),j({key:0},c.value,{"data-slot":"content",class:y.value.content({class:[f(a)?.content,x.ui?.content]})}),{default:A(()=>[P(w.$slots,x.slot?`${x.slot}-content`:"item-content",{item:x,active:H||x.active,index:_,ui:y.value},()=>[je("ul",{"data-slot":"childList",class:U(y.value.childList({class:[f(a)?.childList,x.ui?.childList]}))},[(D(!0),re(Ce,null,yt(x.children,(J,G)=>(D(),re("li",{key:G,"data-slot":"childItem",class:U(y.value.childItem({class:[f(a)?.childItem,x.ui?.childItem]}))},[q($r,j({ref_for:!0},f(xu)(J),{custom:""}),{default:A(({active:$,...I})=>[q(f(mc),{"as-child":"",active:$,onSelect:J.onSelect},{default:A(()=>[q(_o,j({ref_for:!0},I,{"data-slot":"childLink",class:y.value.childLink({class:[f(a)?.childLink,x.ui?.childLink,J.class],active:$})}),{default:A(()=>[J.icon?(D(),k(st,{key:0,name:J.icon,"data-slot":"childLinkIcon",class:U(y.value.childLinkIcon({class:[f(a)?.childLinkIcon,x.ui?.childLinkIcon],active:$}))},null,8,["name","class"])):Y("",!0),je("div",{"data-slot":"childLinkWrapper",class:U(y.value.childLinkWrapper({class:[f(a)?.childLinkWrapper,x.ui?.childLinkWrapper]}))},[je("p",{"data-slot":"childLinkLabel",class:U(y.value.childLinkLabel({class:[f(a)?.childLinkLabel,x.ui?.childLinkLabel],active:$}))},[Ke(Fe(f(jt)(J,n.labelKey))+" ",1),J.target==="_blank"&&e.externalIcon!==!1?(D(),k(st,{key:0,name:typeof e.externalIcon=="string"?e.externalIcon:f(u).ui.icons.external,"data-slot":"childLinkLabelExternalIcon",class:U(y.value.childLinkLabelExternalIcon({class:[f(a)?.childLinkLabelExternalIcon,x.ui?.childLinkLabelExternalIcon],active:$}))},null,8,["name","class"])):Y("",!0)],2),J.description?(D(),re("p",{key:0,"data-slot":"childLinkDescription",class:U(y.value.childLinkDescription({class:[f(a)?.childLinkDescription,x.ui?.childLinkDescription],active:$}))},Fe(J.description),3)):Y("",!0)],2)]),_:2},1040,["class"])]),_:2},1032,["active","onSelect"])]),_:2},1040)],2))),128))],2)])]),_:2},1040,["class"])):Y("",!0)]),_:2},1040)):Y("",!0),e.orientation==="vertical"&&x.children?.length&&!e.collapsed?(D(),k(f(n1),{key:2,"data-slot":"content",class:U(y.value.content({class:[f(a)?.content,x.ui?.content]}))},{default:A(()=>[q(f(D0),j({...f(i),defaultValue:v(x.children,S+1,O)},{as:"ul","data-slot":"childList",class:y.value.childList({class:[f(a)?.childList,x.ui?.childList]})}),{default:A(()=>[(D(!0),re(Ce,null,yt(x.children,(H,N)=>(D(),k(f(g),{key:N,item:H,index:N,level:S+1,"list-index":O,"data-slot":"childItem",class:U(y.value.childItem({class:[f(a)?.childItem,H.ui?.childItem]}))},null,8,["item","index","level","list-index","class"]))),128))]),_:2},1040,["class"])]),_:2},1032,["class"])):Y("",!0)]),_:2},1040,["value"]))]),_:3}),q(f(IF),j({...f(s),...e.orientation==="horizontal"?{modelValue:e.modelValue,defaultValue:e.defaultValue}:{},...w.$attrs},{"data-collapsed":e.collapsed,"data-slot":"root",class:y.value.root({class:[f(a)?.root,n.class]})}),{default:A(()=>[P(w.$slots,"list-leading"),(D(!0),re(Ce,null,yt(E.value,(x,_)=>(D(),re(Ce,{key:`list-${_}`},[(D(),k(Rt(e.orientation==="vertical"?f(D0):f(WF)),j({ref_for:!0},e.orientation==="vertical"&&!e.collapsed?{...f(i),modelValue:e.modelValue,defaultValue:e.defaultValue??v(x,0,_)}:{},{as:"ul","data-slot":"list",class:y.value.list({class:f(a)?.list})}),{default:A(()=>[(D(!0),re(Ce,null,yt(x,(S,O)=>(D(),k(f(g),{key:`list-${_}-${O}`,item:S,index:O,"list-index":_,"data-slot":"item",class:U(y.value.item({class:[f(a)?.item,S.ui?.item]}))},null,8,["item","index","list-index","class"]))),128))]),_:2},1040,["class"])),e.orientation==="vertical"&&_[je("div",{"data-slot":"arrow",class:U(y.value.arrow({class:f(a)?.arrow}))},null,2)]),_:1},8,["class"])):Y("",!0),q(f(JF),{"data-slot":"viewport",class:U(y.value.viewport({class:f(a)?.viewport}))},null,8,["class"])],2)):Y("",!0)]),_:3},16,["data-collapsed","class"])],64))}}),NN={};function jN(e,t){return D(),re("div")}const VN=Object.assign(Wu(NN,[["render",jN]]),{__name:"AppHeaderBottomRight"}),zN={base:"w-full max-w-(--ui-container) mx-auto px-4 sm:px-6 lg:px-8"},ep={__name:"UContainer",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,n=Pe(),o=Et("container",t),r=F(()=>Se({extend:Se(zN),...n.ui?.container||{}}));return(u,a)=>(D(),k(f(we),{as:e.as,class:U(r.value({class:[f(o)?.base,t.class]}))},{default:A(()=>[P(u.$slots,"default")]),_:3},8,["as","class"]))}};function UN(e){let t=e;for(;t.children?.length;)t=t.children[0];return t.path}function tp(e){const t=Yn(),n=Pe(),o=e??Ue("navigation"),r=F(()=>t.meta.layout==="docs"),u=F(()=>{if(r.value)return n.navigation?.sub}),a=F(()=>{if(!(!u.value||!o?.value))return o.value.find(c=>t.path===c.path||t.path.startsWith(c.path+"/"))}),s=F(()=>!u.value||!o?.value?[]:o.value.filter(c=>c.children?.length).map(c=>({label:c.title,icon:c.icon,to:UN(c),active:t.path===c.path||t.path.startsWith(c.path+"/")}))),i=F(()=>u.value&&a.value?a.value.children||[]:o?.value||[]);return{subNavigationMode:u,sections:s,currentSection:a,sidebarNavigation:i}}const HN=L({__name:"AppHeaderBottom",setup(e){const{sections:t}=tp(),n=SE("navigationMenu");return(o,r)=>{const u=Vb,a=$N,s=VN,i=ep;return D(),re(Ce,null,[q(u,{class:"hidden lg:flex"}),q(i,{class:"hidden lg:flex items-center justify-between"},{default:A(()=>[q(a,{items:f(t),highlight:f(n).highlight??!0,"highlight-color":f(n).highlightColor,variant:f(n).variant??"pill",color:f(n).color,class:"-mx-2.5 -mb-px"},null,8,["items","highlight","highlight-color","variant","color"]),q(s)]),_:1})],64)}}}),KN=Object.assign(HN,{__name:"AppHeaderBottom"}),WN={slots:{overlay:"fixed inset-0 bg-elevated/75",content:"fixed bg-default divide-y divide-default sm:ring ring-default sm:shadow-lg flex flex-col focus:outline-none",header:"flex items-center gap-1.5 p-4 sm:px-6 min-h-(--ui-header-height)",wrapper:"",body:"flex-1 overflow-y-auto p-4 sm:p-6",footer:"flex items-center gap-1.5 p-4 sm:px-6",title:"text-highlighted font-semibold",description:"mt-1 text-muted text-sm",close:"absolute top-4 end-4"},variants:{side:{top:{content:""},right:{content:"max-w-md"},bottom:{content:""},left:{content:"max-w-md"}},inset:{true:{content:"rounded-lg"}},transition:{true:{overlay:"data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]"}}},compoundVariants:[{side:"top",inset:!0,class:{content:"max-h-[calc(100%-2rem)] inset-x-4 top-4"}},{side:"top",inset:!1,class:{content:"max-h-full inset-x-0 top-0"}},{side:"right",inset:!0,class:{content:"w-[calc(100%-2rem)] inset-y-4 right-4"}},{side:"right",inset:!1,class:{content:"w-full inset-y-0 right-0"}},{side:"bottom",inset:!0,class:{content:"max-h-[calc(100%-2rem)] inset-x-4 bottom-4"}},{side:"bottom",inset:!1,class:{content:"max-h-full inset-x-0 bottom-0"}},{side:"left",inset:!0,class:{content:"w-[calc(100%-2rem)] inset-y-4 left-4"}},{side:"left",inset:!1,class:{content:"w-full inset-y-0 left-0"}},{transition:!0,side:"top",class:{content:"data-[state=open]:animate-[slide-in-from-top_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-top_200ms_ease-in-out]"}},{transition:!0,side:"right",class:{content:"data-[state=open]:animate-[slide-in-from-right_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-right_200ms_ease-in-out]"}},{transition:!0,side:"bottom",class:{content:"data-[state=open]:animate-[slide-in-from-bottom_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-bottom_200ms_ease-in-out]"}},{transition:!0,side:"left",class:{content:"data-[state=open]:animate-[slide-in-from-left_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-left_200ms_ease-in-out]"}}]},GN={__name:"USlideover",props:{title:{type:String,required:!1},description:{type:String,required:!1},content:{type:Object,required:!1},overlay:{type:Boolean,required:!1,default:!0},transition:{type:Boolean,required:!1,default:!0},side:{type:null,required:!1,default:"right"},inset:{type:Boolean,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},dismissible:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["after:leave","after:enter","close:prevent","update:open"],setup(e,{emit:t}){const n=e,o=t,r=qt(),{t:u}=Vo(),a=Pe(),s=Et("slideover",n),i=it(Jt(n,"open","defaultOpen","modal"),o),c=tu(Ye(()=>n.portal)),l=Ye(()=>n.content),d=F(()=>n.dismissible?{pointerDownOutside:Fl}:["interactOutside","escapeKeyDown"].reduce((m,g)=>(m[g]=y=>{y.preventDefault(),o("close:prevent")},m),{})),p=F(()=>Se({extend:Se(WN),...a.ui?.slideover||{}})({transition:n.transition,side:n.side,inset:n.inset}));return(h,m)=>(D(),k(f(o1),me(xe(f(i))),{default:A(({open:g,close:y})=>[r.default?(D(),k(f(c1),{key:0,"as-child":"",class:U(n.class)},{default:A(()=>[P(h.$slots,"default",{open:g})]),_:2},1032,["class"])):Y("",!0),q(f(l1),me(xe(f(c))),{default:A(()=>[e.overlay?(D(),k(f(k0),{key:0,"data-slot":"overlay",class:U(p.value.overlay({class:f(s)?.overlay}))},null,8,["class"])):Y("",!0),q(f(i1),j({"data-side":e.side,"data-slot":"content",class:p.value.content({class:[!r.default&&n.class,f(s)?.content]})},l.value,{onAfterEnter:m[0]||(m[0]=E=>o("after:enter")),onAfterLeave:m[1]||(m[1]=E=>o("after:leave"))},as(d.value)),{default:A(()=>[!e.title&&!r.title||!e.description&&!r.description||r.content?(D(),k(f(Yr),{key:0},{default:A(()=>[!e.title&&!r.title?(D(),k(f(Eu),{key:0})):r.content?(D(),k(f(Eu),{key:1},{default:A(()=>[P(h.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3})):Y("",!0),!e.description&&!r.description?(D(),k(f(bu),{key:2})):r.content?(D(),k(f(bu),{key:3},{default:A(()=>[P(h.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3})):Y("",!0)]),_:3})):Y("",!0),P(h.$slots,"content",{close:y},()=>[r.header||e.title||r.title||e.description||r.description||n.close||r.close?(D(),re("div",{key:0,"data-slot":"header",class:U(p.value.header({class:f(s)?.header}))},[P(h.$slots,"header",{close:y},()=>[je("div",{"data-slot":"wrapper",class:U(p.value.wrapper({class:f(s)?.wrapper}))},[e.title||r.title?(D(),k(f(Eu),{key:0,"data-slot":"title",class:U(p.value.title({class:f(s)?.title}))},{default:A(()=>[P(h.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3},8,["class"])):Y("",!0),e.description||r.description?(D(),k(f(bu),{key:1,"data-slot":"description",class:U(p.value.description({class:f(s)?.description}))},{default:A(()=>[P(h.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3},8,["class"])):Y("",!0)],2),P(h.$slots,"actions"),n.close||r.close?(D(),k(f(r1),{key:0,"as-child":""},{default:A(()=>[P(h.$slots,"close",{ui:p.value},()=>[n.close?(D(),k(hn,j({key:0,icon:e.closeIcon||f(a).ui.icons.close,color:"neutral",variant:"ghost","aria-label":f(u)("slideover.close")},typeof n.close=="object"?n.close:{},{"data-slot":"close",class:p.value.close({class:f(s)?.close})}),null,16,["icon","aria-label","class"])):Y("",!0)])]),_:2},1024)):Y("",!0)])],2)):Y("",!0),je("div",{"data-slot":"body",class:U(p.value.body({class:f(s)?.body}))},[P(h.$slots,"body",{close:y})],2),r.footer?(D(),re("div",{key:1,"data-slot":"footer",class:U(p.value.footer({class:f(s)?.footer}))},[P(h.$slots,"footer",{close:y})],2)):Y("",!0)])]),_:2},1040,["data-side","class"])]),_:2},1040)]),_:3},16))}},YN={slots:{overlay:"fixed inset-0",content:"bg-default divide-y divide-default flex flex-col focus:outline-none",header:"flex items-center gap-1.5 p-4 sm:px-6 min-h-(--ui-header-height)",wrapper:"",body:"flex-1 p-4 sm:p-6",footer:"flex items-center gap-1.5 p-4 sm:px-6",title:"text-highlighted font-semibold",description:"mt-1 text-muted text-sm",close:"absolute top-4 end-4"},variants:{transition:{true:{overlay:"data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]",content:"data-[state=open]:animate-[scale-in_200ms_ease-out] data-[state=closed]:animate-[scale-out_200ms_ease-in]"}},fullscreen:{true:{content:"inset-0"},false:{content:"w-[calc(100vw-2rem)] max-w-lg rounded-lg shadow-lg ring ring-default"}},overlay:{true:{overlay:"bg-elevated/75"}},scrollable:{true:{overlay:"overflow-y-auto",content:"relative"},false:{content:"fixed",body:"overflow-y-auto"}}},compoundVariants:[{scrollable:!0,fullscreen:!1,class:{overlay:"grid place-items-center p-4 sm:py-8"}},{scrollable:!1,fullscreen:!1,class:{content:"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 max-h-[calc(100dvh-2rem)] sm:max-h-[calc(100dvh-4rem)] overflow-hidden"}}]},ZN={__name:"UModal",props:{title:{type:String,required:!1},description:{type:String,required:!1},content:{type:Object,required:!1},overlay:{type:Boolean,required:!1,default:!0},scrollable:{type:Boolean,required:!1},transition:{type:Boolean,required:!1,default:!0},fullscreen:{type:Boolean,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},dismissible:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["after:leave","after:enter","close:prevent","update:open"],setup(e,{emit:t}){const n=e,o=t,r=qt(),{t:u}=Vo(),a=Pe(),s=Et("modal",n),i=it(Jt(n,"open","defaultOpen","modal"),o),c=tu(Ye(()=>n.portal)),l=Ye(()=>n.content),d=F(()=>n.dismissible?{pointerDownOutside:g=>Fl(g,{scrollable:n.scrollable})}:["interactOutside","escapeKeyDown"].reduce((y,E)=>(y[E]=b=>{b.preventDefault(),o("close:prevent")},y),{})),[p,h]=To(),m=F(()=>Se({extend:Se(YN),...a.ui?.modal||{}})({transition:n.transition,fullscreen:n.fullscreen,overlay:n.overlay,scrollable:n.scrollable}));return(g,y)=>(D(),k(f(o1),me(xe(f(i))),{default:A(({open:E,close:b})=>[q(f(p),null,{default:A(()=>[q(f(i1),j({"data-slot":"content",class:m.value.content({class:[!r.default&&n.class,f(s)?.content]})},l.value,{onAfterEnter:y[0]||(y[0]=v=>o("after:enter")),onAfterLeave:y[1]||(y[1]=v=>o("after:leave"))},as(d.value)),{default:A(()=>[!e.title&&!r.title||!e.description&&!r.description||r.content?(D(),k(f(Yr),{key:0},{default:A(()=>[!e.title&&!r.title?(D(),k(f(Eu),{key:0})):r.content?(D(),k(f(Eu),{key:1},{default:A(()=>[P(g.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3})):Y("",!0),!e.description&&!r.description?(D(),k(f(bu),{key:2})):r.content?(D(),k(f(bu),{key:3},{default:A(()=>[P(g.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3})):Y("",!0)]),_:3})):Y("",!0),P(g.$slots,"content",{close:b},()=>[r.header||e.title||r.title||e.description||r.description||n.close||r.close?(D(),re("div",{key:0,"data-slot":"header",class:U(m.value.header({class:f(s)?.header}))},[P(g.$slots,"header",{close:b},()=>[je("div",{"data-slot":"wrapper",class:U(m.value.wrapper({class:f(s)?.wrapper}))},[e.title||r.title?(D(),k(f(Eu),{key:0,"data-slot":"title",class:U(m.value.title({class:f(s)?.title}))},{default:A(()=>[P(g.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3},8,["class"])):Y("",!0),e.description||r.description?(D(),k(f(bu),{key:1,"data-slot":"description",class:U(m.value.description({class:f(s)?.description}))},{default:A(()=>[P(g.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3},8,["class"])):Y("",!0)],2),P(g.$slots,"actions"),n.close||r.close?(D(),k(f(r1),{key:0,"as-child":""},{default:A(()=>[P(g.$slots,"close",{ui:m.value},()=>[n.close?(D(),k(hn,j({key:0,icon:e.closeIcon||f(a).ui.icons.close,color:"neutral",variant:"ghost","aria-label":f(u)("modal.close")},typeof n.close=="object"?n.close:{},{"data-slot":"close",class:m.value.close({class:f(s)?.close})}),null,16,["icon","aria-label","class"])):Y("",!0)])]),_:2},1024)):Y("",!0)])],2)):Y("",!0),r.body?(D(),re("div",{key:1,"data-slot":"body",class:U(m.value.body({class:f(s)?.body}))},[P(g.$slots,"body",{close:b})],2)):Y("",!0),r.footer?(D(),re("div",{key:2,"data-slot":"footer",class:U(m.value.footer({class:f(s)?.footer}))},[P(g.$slots,"footer",{close:b})],2)):Y("",!0)])]),_:2},1040,["class"])]),_:2},1024),r.default?(D(),k(f(c1),{key:0,"as-child":"",class:U(n.class)},{default:A(()=>[P(g.$slots,"default",{open:E})]),_:2},1032,["class"])):Y("",!0),q(f(l1),me(xe(f(c))),{default:A(()=>[e.scrollable?(D(),k(f(k0),{key:0,"data-slot":"overlay",class:U(m.value.overlay({class:f(s)?.overlay}))},{default:A(()=>[q(f(h))]),_:1},8,["class"])):(D(),re(Ce,{key:1},[e.overlay?(D(),k(f(k0),{key:0,"data-slot":"overlay",class:U(m.value.overlay({class:f(s)?.overlay}))},null,8,["class"])):Y("",!0),q(f(h))],64))]),_:1},16)]),_:3},16))}};function np(e,t){const n=typeof e=="string"&&!t?`${e}Context`:t,o=Symbol(n);return[a=>{const s=Ue(o,a);if(s||s===null)return s;throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},a=>(Pt(o,a),a)]}function sr(){let e=document.activeElement;if(e==null)return null;for(;e!=null&&e.shadowRoot!=null&&e.shadowRoot.activeElement!=null;)e=e.shadowRoot.activeElement;return e}function TE(e,t,n){const o=n.originalEvent.target,r=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(r)}function XN(e){return e==null}function JN(e,t){return ho()?(ir(e,t),!0):!1}function QN(e){let t=!1,n;const o=Qa(!0);return((...r)=>(t||(n=o.run(()=>e(...r)),t=!0),n))}const gr=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ej=e=>typeof e<"u",tj=Object.prototype.toString,nj=e=>tj.call(e)==="[object Object]",og=oj();function oj(){var e,t,n;return gr&&!!(!((e=window)===null||e===void 0||(e=e.navigator)===null||e===void 0)&&e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window)===null||t===void 0||(t=t.navigator)===null||t===void 0?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test((n=window)===null||n===void 0?void 0:n.navigator.userAgent))}function Mc(e){return Array.isArray(e)?e:[e]}function rj(e){return We()}function uj(e){if(!gr)return e;let t=0,n,o;const r=()=>{t-=1,o&&t<=0&&(o.stop(),n=void 0,o=void 0)};return((...u)=>(t+=1,o||(o=Qa(!0),n=o.run(()=>e(...u))),JN(r),n))}function aj(e,t){rj()&&mo(e,t)}function sj(e,t,n){return ye(e,t,{...n,immediate:!0})}const op=gr?window:void 0;function Ol(e){var t;const n=ke(e);return(t=n?.$el)!==null&&t!==void 0?t:n}function FE(...e){const t=(o,r,u,a)=>(o.addEventListener(r,u,a),()=>o.removeEventListener(r,u,a)),n=F(()=>{const o=Mc(ke(e[0])).filter(r=>r!=null);return o.every(r=>typeof r!="string")?o:void 0});return sj(()=>{var o,r;return[(o=(r=n.value)===null||r===void 0?void 0:r.map(u=>Ol(u)))!==null&&o!==void 0?o:[op].filter(u=>u!=null),Mc(ke(n.value?e[1]:e[0])),Mc(f(n.value?e[2]:e[1])),ke(n.value?e[3]:e[2])]},([o,r,u,a],s,i)=>{if(!o?.length||!r?.length||!u?.length)return;const c=nj(a)?{...a}:a,l=o.flatMap(d=>r.flatMap(p=>u.map(h=>t(d,p,h,c))));i(()=>{l.forEach(d=>d())})},{flush:"post"})}function ij(){const e=Me(!1),t=We();return t&&$e(()=>{e.value=!0},t),e}function lj(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function cj(...e){let t,n,o={};e.length===3?(t=e[0],n=e[1],o=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],o=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=op,eventName:u="keydown",passive:a=!1,dedupe:s=!1}=o,i=lj(t);return FE(r,u,l=>{l.repeat&&ke(s)||i(l)&&n(l)},a)}function dj(e){return JSON.parse(JSON.stringify(e))}function fj(e,t,n,o={}){var r,u;const{clone:a=!1,passive:s=!1,eventName:i,deep:c=!1,defaultValue:l,shouldEmit:d}=o,p=We(),h=n||p?.emit||(p==null||(r=p.$emit)===null||r===void 0?void 0:r.bind(p))||(p==null||(u=p.proxy)===null||u===void 0||(u=u.$emit)===null||u===void 0?void 0:u.bind(p?.proxy));let m=i;m=m||`update:${t.toString()}`;const g=b=>a?typeof a=="function"?a(b):dj(b):b,y=()=>ej(e[t])?g(e[t]):l,E=b=>{d?d(b)&&h(m,b):h(m,b)};if(s){const b=R(y());let v=!1;return ye(()=>e[t],C=>{v||(v=!0,b.value=g(C),Oe(()=>v=!1))}),ye(b,C=>{!v&&(C!==e[t]||c)&&E(C)},{deep:c}),b}else return F({get(){return y()},set(b){E(b)}})}function rp(e){return e?e.flatMap(t=>t.type===Ce?rp(t.children):[t]):[]}const[pj]=np("ConfigProvider"),hj=uj(()=>{const e=R(new Map),t=R(),n=F(()=>{for(const a of e.value.values())if(a)return!0;return!1}),o=pj({scrollBody:R(!0)});let r=null;const u=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.documentElement.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",og&&r?.(),t.value=void 0};return ye(n,(a,s)=>{if(!gr)return;if(!a){s&&u();return}t.value===void 0&&(t.value=document.body.style.overflow);const i=window.innerWidth-document.documentElement.clientWidth,c={padding:i,margin:0},l=o.scrollBody?.value?typeof o.scrollBody.value=="object"?wt({padding:o.scrollBody.value.padding===!0?i:o.scrollBody.value.padding,margin:o.scrollBody.value.margin===!0?i:o.scrollBody.value.margin},c):c:{padding:0,margin:0};i>0&&(document.body.style.paddingRight=typeof l.padding=="number"?`${l.padding}px`:String(l.padding),document.body.style.marginRight=typeof l.margin=="number"?`${l.margin}px`:String(l.margin),document.documentElement.style.setProperty("--scrollbar-width",`${i}px`),document.body.style.overflow="hidden"),og&&(r=FE(document,"touchmove",d=>gj(d),{passive:!1})),Oe(()=>{n.value&&(document.body.style.pointerEvents="none",document.body.style.overflow="hidden")})},{immediate:!0,flush:"sync"}),e});function mj(e){const t=Math.random().toString(36).substring(2,7),n=hj();n.value.set(t,e);const o=F({get:()=>n.value.get(t)??!1,set:r=>n.value.set(t,r)});return aj(()=>{n.value.delete(t)}),o}function PE(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}function Il(e){const t=We(),n=t?.type.emits,o={};return n?.length||console.warn(`No emitted event found. Please check component: ${t?.type.__name}`),n?.forEach(r=>{o[hu(Ft(r))]=(...u)=>e(r,...u)}),o}function Jn(){const e=We(),t=R(),n=F(()=>o());Gr(()=>{n.value!==o()&&jg(t)});function o(){return t.value&&"$el"in t.value&&["#text","#comment"].includes(t.value.$el.nodeName)?t.value.$el.nextElementSibling:Ol(t)}const r=Object.assign({},e.exposed),u={};for(const s in e.props)Object.defineProperty(u,s,{enumerable:!0,configurable:!0,get:()=>e.props[s]});if(Object.keys(r).length>0)for(const s in r)Object.defineProperty(u,s,{enumerable:!0,configurable:!0,get:()=>r[s]});Object.defineProperty(u,"$el",{enumerable:!0,configurable:!0,get:()=>e.vnode.el}),e.exposed=u;function a(s){if(t.value=s,!!s&&(Object.defineProperty(u,"$el",{enumerable:!0,configurable:!0,get:()=>s instanceof Element?s:s.$el}),!(s instanceof Element)&&!Object.hasOwn(s,"$el"))){const i=s.$.exposed,c=Object.assign({},u);for(const l in i)Object.defineProperty(c,l,{enumerable:!0,configurable:!0,get:()=>i[l]});e.exposed=c}}return{forwardRef:a,currentRef:t,currentElement:n}}function vj(e){const t=We(),n=Object.keys(t?.type.props??{}).reduce((r,u)=>{const a=(t?.type.props[u]).default;return a!==void 0&&(r[u]=a),r},{}),o=Ye(e);return F(()=>{const r={},u=t?.vnode.props??{};return Object.keys(u).forEach(a=>{r[Ft(a)]=u[a]}),Object.keys({...n,...r}).reduce((a,s)=>(o.value[s]!==void 0&&(a[s]=o.value[s]),a),{})})}function yj(e,t){const n=vj(e),o=t?Il(t):{};return F(()=>({...n.value,...o}))}function bj(e){let t;ye(()=>Ol(e),n=>{let o=!1;try{o=!!n?.closest("[popover]:not(:popover-open)")}catch{}n&&!o?t=J3(n):t&&t()}),Ht(()=>{t&&t()})}function md(e,t="reka"){let n;return n=Td?.(),t?`${t}-${n}`:n}function Ej(e,t){const n=R(e);function o(u){return t[n.value][u]??n.value}return{state:n,dispatch:u=>{n.value=o(u)}}}function Cj(e,t){const n=R({}),o=R("none"),r=R(e),u=e.value?"mounted":"unmounted";let a;const s=t.value?.ownerDocument.defaultView??op,{state:i,dispatch:c}=Ej(u,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),l=y=>{if(gr){const E=new CustomEvent(y,{bubbles:!1,cancelable:!1});t.value?.dispatchEvent(E)}};ye(e,async(y,E)=>{const b=E!==y;if(await Oe(),b){const v=o.value,C=Zs(t.value);y?(c("MOUNT"),l("enter"),C==="none"&&l("after-enter")):C==="none"||C==="undefined"||n.value?.display==="none"?(c("UNMOUNT"),l("leave"),l("after-leave")):E&&v!==C?(c("ANIMATION_OUT"),l("leave")):(c("UNMOUNT"),l("after-leave"))}},{immediate:!0});const d=y=>{const E=Zs(t.value),b=E.includes(CSS.escape(y.animationName)),v=i.value==="mounted"?"enter":"leave";if(y.target===t.value&&b&&(l(`after-${v}`),c("ANIMATION_END"),!r.value)){const C=t.value.style.animationFillMode;t.value.style.animationFillMode="forwards",a=s?.setTimeout(()=>{t.value?.style.animationFillMode==="forwards"&&(t.value.style.animationFillMode=C)})}y.target===t.value&&E==="none"&&c("ANIMATION_END")},p=y=>{y.target===t.value&&(o.value=Zs(t.value))},h=ye(t,(y,E)=>{y?(n.value=getComputedStyle(y),y.addEventListener("animationstart",p),y.addEventListener("animationcancel",d),y.addEventListener("animationend",d)):(c("ANIMATION_END"),a!==void 0&&s?.clearTimeout(a),E?.removeEventListener("animationstart",p),E?.removeEventListener("animationcancel",d),E?.removeEventListener("animationend",d))},{immediate:!0}),m=ye(i,()=>{const y=Zs(t.value);o.value=i.value==="mounted"?y:"none"});return Ht(()=>{h(),m()}),{isPresent:F(()=>["mounted","unmountSuspended"].includes(i.value))}}function Zs(e){return e&&getComputedStyle(e).animationName||"none"}var ME=L({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(e,{slots:t,expose:n}){const{present:o,forceMount:r}=mt(e),u=R(),{isPresent:a}=Cj(o,u);n({present:a});let s=t.default({present:a.value});s=rp(s||[]);const i=We();if(s&&s?.length>1){const c=i?.parent?.type.name?`<${i.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${c}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(l=>` - ${l}`).join(` +`)].join(` +`))}return()=>r.value||o.value||a.value?qe(t.default({present:a.value})[0],{ref:c=>{const l=Ol(c);return typeof l?.hasAttribute>"u"||(l?.hasAttribute("data-reka-popper-content-wrapper")?u.value=l.firstElementChild:u.value=l),l}}):null}});const xj=L({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{if(!n.default)return null;const o=rp(n.default()),r=o.findIndex(i=>i.type!==bt);if(r===-1)return o;const u=o[r];delete u.props?.ref;const a=u.props?j(t,u.props):t,s=An({...u,props:{}},a);return o.length===1?s:(o[r]=s,o)}}}),wj=["area","img","input"],Ju=L({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:n}){const o=e.asChild?"template":e.as;return typeof o=="string"&&wj.includes(o)?()=>qe(o,t):o!=="template"?()=>qe(e.as,t,{default:n.default}):()=>qe(xj,t,{default:n.default})}}),[Uo,Dj]=np("DialogRoot");var Aj=L({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=fj(n,"open",t,{defaultValue:n.defaultOpen,passive:n.open===void 0}),u=R(),a=R(),{modal:s}=mt(n);return Dj({open:r,modal:s,openModal:()=>{r.value=!0},onOpenChange:i=>{r.value=i},onOpenToggle:()=>{r.value=!r.value},contentId:"",titleId:"",descriptionId:"",triggerElement:u,contentElement:a}),(i,c)=>P(i.$slots,"default",{open:f(r),close:()=>r.value=!1})}}),Bj=Aj;const _j="dismissableLayer.pointerDownOutside",kj="dismissableLayer.focusOutside";function OE(e,t){if(!(t instanceof Element))return!1;const n=t.closest("[data-dismissable-layer]"),o=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),r=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&(o===n||r.indexOf(o){});return Ze(a=>{if(!gr||!ke(n))return;const s=async c=>{const l=c.target;if(!(!t?.value||!l)){if(OE(t.value,l)){r.value=!1;return}if(c.target&&!r.value){let p=function(){TE(_j,e,d)};const d={originalEvent:c};c.pointerType==="touch"?(o.removeEventListener("click",u.value),u.value=p,o.addEventListener("click",u.value,{once:!0})):p()}else o.removeEventListener("click",u.value);r.value=!1}},i=window.setTimeout(()=>{o.addEventListener("pointerdown",s)},0);a(()=>{window.clearTimeout(i),o.removeEventListener("pointerdown",s),o.removeEventListener("click",u.value)})}),{onPointerDownCapture:()=>{ke(n)&&(r.value=!0)}}}function Tj(e,t,n=!0){const o=t?.value?.ownerDocument??globalThis?.document,r=R(!1);return Ze(u=>{if(!gr||!ke(n))return;const a=async s=>{if(!t?.value)return;await Oe(),await Oe();const i=s.target;!t.value||!i||OE(t.value,i)||s.target&&!r.value&&TE(kj,e,{originalEvent:s})};o.addEventListener("focusin",a),u(()=>o.removeEventListener("focusin",a))}),{onFocusCapture:()=>{ke(n)&&(r.value=!0)},onBlurCapture:()=>{ke(n)&&(r.value=!1)}}}const Sn=_t({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,originalBodyPointerEvents:void 0,branches:new Set});var Fj=L({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r,currentElement:u}=Jn(),a=F(()=>u.value?.ownerDocument??globalThis.document),s=F(()=>Sn.layersRoot),i=F(()=>u.value?Array.from(s.value).indexOf(u.value):-1),c=F(()=>Sn.layersWithOutsidePointerEventsDisabled.size>0),l=F(()=>{const h=Array.from(s.value),[m]=[...Sn.layersWithOutsidePointerEventsDisabled].slice(-1),g=h.indexOf(m);return i.value>=g}),d=Sj(async h=>{const m=[...Sn.branches].some(g=>g?.contains(h.target));!l.value||m||(o("pointerDownOutside",h),o("interactOutside",h),await Oe(),h.defaultPrevented||o("dismiss"))},u),p=Tj(h=>{[...Sn.branches].some(g=>g?.contains(h.target))||(o("focusOutside",h),o("interactOutside",h),h.defaultPrevented||o("dismiss"))},u);return cj("Escape",h=>{i.value===s.value.size-1&&(o("escapeKeyDown",h),h.defaultPrevented||o("dismiss"))}),Ze(h=>{u.value&&(n.disableOutsidePointerEvents&&(Sn.layersWithOutsidePointerEventsDisabled.size===0&&(Sn.originalBodyPointerEvents=a.value.body.style.pointerEvents,a.value.body.style.pointerEvents="none"),Sn.layersWithOutsidePointerEventsDisabled.add(u.value)),s.value.add(u.value),h(()=>{n.disableOutsidePointerEvents&&Sn.layersWithOutsidePointerEventsDisabled.size===1&&!XN(Sn.originalBodyPointerEvents)&&(a.value.body.style.pointerEvents=Sn.originalBodyPointerEvents)}))}),Ze(h=>{h(()=>{u.value&&(s.value.delete(u.value),Sn.layersWithOutsidePointerEventsDisabled.delete(u.value))})}),(h,m)=>(D(),k(f(Ju),{ref:f(r),"as-child":h.asChild,as:h.as,"data-dismissable-layer":"",style:mn({pointerEvents:c.value?l.value?"auto":"none":void 0}),onFocusCapture:f(p).onFocusCapture,onBlurCapture:f(p).onBlurCapture,onPointerdownCapture:f(d).onPointerDownCapture},{default:A(()=>[P(h.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),Pj=Fj;const Mj=QN(()=>R([]));function Oj(){const e=Mj();return{add(t){const n=e.value[0];t!==n&&n?.pause(),e.value=rg(e.value,t),e.value.unshift(t)},remove(t){e.value=rg(e.value,t),e.value[0]?.resume()}}}function rg(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}const Oc="focusScope.autoFocusOnMount",Ic="focusScope.autoFocusOnUnmount",ug={bubbles:!1,cancelable:!0};function Ij(e,{select:t=!1}={}){const n=sr();for(const o of e)if(Jo(o,{select:t}),sr()!==n)return!0}function Rj(e){const t=IE(e),n=ag(t,e),o=ag(t.reverse(),e);return[n,o]}function IE(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const r=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||r?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function ag(e,t){for(const n of e)if(!Lj(n,{upTo:t}))return n}function Lj(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function qj(e){return e instanceof HTMLInputElement&&"select"in e}function Jo(e,{select:t=!1}={}){if(e&&e.focus){const n=sr();e.focus({preventScroll:!0}),e!==n&&qj(e)&&t&&e.select()}}var $j=L({__name:"FocusScope",props:{loop:{type:Boolean,required:!1,default:!1},trapped:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,o=t,{currentRef:r,currentElement:u}=Jn(),a=R(null),s=Oj(),i=_t({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});Ze(l=>{if(!gr)return;const d=u.value;if(!n.trapped)return;function p(y){if(i.paused||!d)return;const E=y.target;d.contains(E)?a.value=E:Jo(a.value,{select:!0})}function h(y){if(i.paused||!d)return;const E=y.relatedTarget;E!==null&&(d.contains(E)||Jo(a.value,{select:!0}))}function m(y){const E=a.value;if(E===null||!y.some(C=>C.removedNodes.length>0))return;d.contains(E)||Jo(d)}document.addEventListener("focusin",p),document.addEventListener("focusout",h);const g=new MutationObserver(m);d&&g.observe(d,{childList:!0,subtree:!0}),l(()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",h),g.disconnect()})}),Ze(async l=>{const d=u.value;if(await Oe(),!d)return;s.add(i);const p=sr();if(!d.contains(p)){const m=new CustomEvent(Oc,ug);d.addEventListener(Oc,g=>o("mountAutoFocus",g)),d.dispatchEvent(m),m.defaultPrevented||(Ij(IE(d),{select:!0}),sr()===p&&Jo(d))}l(()=>{d.removeEventListener(Oc,y=>o("mountAutoFocus",y));const m=new CustomEvent(Ic,ug),g=y=>{o("unmountAutoFocus",y)};d.addEventListener(Ic,g),d.dispatchEvent(m),setTimeout(()=>{m.defaultPrevented||Jo(p??document.body,{select:!0}),d.removeEventListener(Ic,g),s.remove(i)},0)})});function c(l){if(!n.loop&&!n.trapped||i.paused)return;const d=l.key==="Tab"&&!l.altKey&&!l.ctrlKey&&!l.metaKey,p=sr();if(d&&p){const h=l.currentTarget,[m,g]=Rj(h);m&&g?!l.shiftKey&&p===g?(l.preventDefault(),n.loop&&Jo(m,{select:!0})):l.shiftKey&&p===m&&(l.preventDefault(),n.loop&&Jo(g,{select:!0})):p===h&&l.preventDefault()}}return(l,d)=>(D(),k(f(Ju),{ref_key:"currentRef",ref:r,tabindex:"-1","as-child":l.asChild,as:l.as,onKeydown:c},{default:A(()=>[P(l.$slots,"default")]),_:3},8,["as-child","as"]))}}),Nj=$j;function jj(e){return e?"open":"closed"}var Vj=L({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Uo(),{forwardRef:u,currentElement:a}=Jn();return r.titleId||=md(void 0,"reka-dialog-title"),r.descriptionId||=md(void 0,"reka-dialog-description"),$e(()=>{r.contentElement=a,sr()!==document.body&&(r.triggerElement.value=sr())}),(s,i)=>(D(),k(f(Nj),{"as-child":"",loop:"",trapped:n.trapFocus,onMountAutoFocus:i[5]||(i[5]=c=>o("openAutoFocus",c)),onUnmountAutoFocus:i[6]||(i[6]=c=>o("closeAutoFocus",c))},{default:A(()=>[q(f(Pj),j({id:f(r).contentId,ref:f(u),as:s.as,"as-child":s.asChild,"disable-outside-pointer-events":s.disableOutsidePointerEvents,role:"dialog","aria-describedby":f(r).descriptionId,"aria-labelledby":f(r).titleId,"data-state":f(jj)(f(r).open.value)},s.$attrs,{onDismiss:i[0]||(i[0]=c=>f(r).onOpenChange(!1)),onEscapeKeyDown:i[1]||(i[1]=c=>o("escapeKeyDown",c)),onFocusOutside:i[2]||(i[2]=c=>o("focusOutside",c)),onInteractOutside:i[3]||(i[3]=c=>o("interactOutside",c)),onPointerDownOutside:i[4]||(i[4]=c=>o("pointerDownOutside",c))}),{default:A(()=>[P(s.$slots,"default")]),_:3},16,["id","as","as-child","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped"]))}}),RE=Vj,zj=L({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Uo(),u=Il(o),{forwardRef:a,currentElement:s}=Jn();return bj(s),(i,c)=>(D(),k(RE,j({...n,...f(u)},{ref:f(a),"trap-focus":f(r).open.value,"disable-outside-pointer-events":!0,onCloseAutoFocus:c[0]||(c[0]=l=>{l.defaultPrevented||(l.preventDefault(),f(r).triggerElement.value?.focus())}),onPointerDownOutside:c[1]||(c[1]=l=>{const d=l.detail.originalEvent,p=d.button===0&&d.ctrlKey===!0;(d.button===2||p)&&l.preventDefault()}),onFocusOutside:c[2]||(c[2]=l=>{l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16,["trap-focus"]))}}),Uj=zj,Hj=L({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=Il(t);Jn();const u=Uo(),a=R(!1),s=R(!1);return(i,c)=>(D(),k(RE,j({...n,...f(r)},{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:c[0]||(c[0]=l=>{l.defaultPrevented||(a.value||f(u).triggerElement.value?.focus(),l.preventDefault()),a.value=!1,s.value=!1}),onInteractOutside:c[1]||(c[1]=l=>{l.defaultPrevented||(a.value=!0,l.detail.originalEvent.type==="pointerdown"&&(s.value=!0));const d=l.target;f(u).triggerElement.value?.contains(d)&&l.preventDefault(),l.detail.originalEvent.type==="focusin"&&s.value&&l.preventDefault()})}),{default:A(()=>[P(i.$slots,"default")]),_:3},16))}}),Kj=Hj,Wj=L({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,r=Uo(),u=Il(o),{forwardRef:a}=Jn();return(s,i)=>(D(),k(f(ME),{present:s.forceMount||f(r).open.value},{default:A(()=>[f(r).modal.value?(D(),k(Uj,j({key:0,ref:f(a)},{...n,...f(u),...s.$attrs}),{default:A(()=>[P(s.$slots,"default")]),_:3},16)):(D(),k(Kj,j({key:1,ref:f(a)},{...n,...f(u),...s.$attrs}),{default:A(()=>[P(s.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),Gj=Wj,Yj=L({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(e){const t=e;Jn();const n=Uo();return(o,r)=>(D(),k(f(Ju),j(t,{id:f(n).descriptionId}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["id"]))}}),Rc=Yj,Zj=L({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=Uo();return mj(!0),Jn(),(n,o)=>(D(),k(f(Ju),{as:n.as,"as-child":n.asChild,"data-state":f(t).open.value?"open":"closed",style:{"pointer-events":"auto"}},{default:A(()=>[P(n.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),Xj=Zj,Jj=L({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=Uo(),{forwardRef:n}=Jn();return(o,r)=>f(t)?.modal.value?(D(),k(f(ME),{key:0,present:o.forceMount||f(t).open.value},{default:A(()=>[q(Xj,j(o.$attrs,{ref:f(n),as:o.as,"as-child":o.asChild}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["as","as-child"])]),_:3},8,["present"])):Y("v-if",!0)}}),Qj=Jj,eV=L({__name:"Teleport",props:{to:{type:null,required:!1,default:"body"},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=ij();return(n,o)=>f(t)||n.forceMount?(D(),k(os,{key:0,to:n.to,disabled:n.disabled,defer:n.defer},[P(n.$slots,"default")],8,["to","disabled","defer"])):Y("v-if",!0)}}),tV=eV,nV=L({__name:"DialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(D(),k(f(tV),me(xe(t)),{default:A(()=>[P(n.$slots,"default")]),_:3},16))}}),oV=nV,rV=L({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(e){const t=e,n=Uo();return Jn(),(o,r)=>(D(),k(f(Ju),j(t,{id:f(n).titleId}),{default:A(()=>[P(o.$slots,"default")]),_:3},16,["id"]))}}),Lc=rV,uV=L({__name:"DialogTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=Uo(),{forwardRef:o,currentElement:r}=Jn();return n.contentId||=md(void 0,"reka-dialog-content"),$e(()=>{n.triggerElement.value=r.value}),(u,a)=>(D(),k(f(Ju),j(t,{ref:f(o),type:u.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":f(n).open.value||!1,"aria-controls":f(n).open.value?f(n).contentId:void 0,"data-state":f(n).open.value?"open":"closed",onClick:f(n).onOpenToggle}),{default:A(()=>[P(u.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),aV=uV;(function(){var e;try{if(typeof document<"u"){var t=document.createElement("style");t.nonce=(e=document.head.querySelector("meta[property=csp-nonce]"))==null?void 0:e.content,t.appendChild(document.createTextNode('[data-vaul-drawer]{touch-action:none;will-change:transform;transition:transform .5s cubic-bezier(.32,.72,0,1);animation-duration:.5s;animation-timing-function:cubic-bezier(.32,.72,0,1)}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=open]{animation-name:slideFromBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=closed]{animation-name:slideToBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=open]{animation-name:slideFromTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=closed]{animation-name:slideToTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=open]{animation-name:slideFromLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=closed]{animation-name:slideToLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=open]{animation-name:slideFromRight}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=closed]{animation-name:slideToRight}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--initial-transform, 100%),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=top]{transform:translate3d(0,calc(var(--initial-transform, 100%) * -1),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=left]{transform:translate3d(calc(var(--initial-transform, 100%) * -1),0,0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--initial-transform, 100%),0,0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=top],[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--snap-point-height, 0),0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=left],[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--snap-point-height, 0),0,0)}[data-vaul-overlay][data-vaul-snap-points=false]{animation-duration:.5s;animation-timing-function:cubic-bezier(.32,.72,0,1)}[data-vaul-overlay][data-vaul-snap-points=false][data-state=open]{animation-name:fadeIn}[data-vaul-overlay][data-state=closed]{animation-name:fadeOut}[data-vaul-animate=false]{animation:none!important}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:0;transition:opacity .5s cubic-bezier(.32,.72,0,1)}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:1}[data-vaul-drawer]:not([data-vaul-custom-container=true]):after{content:"";position:absolute;background:inherit;background-color:inherit}[data-vaul-drawer][data-vaul-drawer-direction=top]:after{top:initial;bottom:100%;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=bottom]:after{top:100%;bottom:initial;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=left]:after{left:initial;right:100%;top:0;bottom:0;width:200%}[data-vaul-drawer][data-vaul-drawer-direction=right]:after{left:100%;right:initial;top:0;bottom:0;width:200%}[data-vaul-overlay][data-vaul-snap-points=true]:not([data-vaul-snap-points-overlay=true]):not([data-state=closed]){opacity:0}[data-vaul-overlay][data-vaul-snap-points-overlay=true]{opacity:1}[data-vaul-handle]{display:block;position:relative;opacity:.7;background:#e2e2e4;margin-left:auto;margin-right:auto;height:5px;width:32px;border-radius:1rem;touch-action:pan-y}[data-vaul-handle]:hover,[data-vaul-handle]:active{opacity:1}[data-vaul-handle-hitarea]{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:max(100%,2.75rem);height:max(100%,2.75rem);touch-action:inherit}@media (hover: hover) and (pointer: fine){[data-vaul-drawer]{-webkit-user-select:none;user-select:none}}@media (pointer: fine){[data-vaul-handle-hitarea]:{width:100%;height:100%}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{to{opacity:0}}@keyframes slideFromBottom{0%{transform:translate3d(0,var(--initial-transform, 100%),0)}to{transform:translateZ(0)}}@keyframes slideToBottom{to{transform:translate3d(0,var(--initial-transform, 100%),0)}}@keyframes slideFromTop{0%{transform:translate3d(0,calc(var(--initial-transform, 100%) * -1),0)}to{transform:translateZ(0)}}@keyframes slideToTop{to{transform:translate3d(0,calc(var(--initial-transform, 100%) * -1),0)}}@keyframes slideFromLeft{0%{transform:translate3d(calc(var(--initial-transform, 100%) * -1),0,0)}to{transform:translateZ(0)}}@keyframes slideToLeft{to{transform:translate3d(calc(var(--initial-transform, 100%) * -1),0,0)}}@keyframes slideFromRight{0%{transform:translate3d(var(--initial-transform, 100%),0,0)}to{transform:translateZ(0)}}@keyframes slideToRight{to{transform:translate3d(var(--initial-transform, 100%),0,0)}}')),document.head.appendChild(t)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();const sV=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const iV=e=>typeof e<"u";function lV(e){return JSON.parse(JSON.stringify(e))}function sg(e,t,n,o={}){var r,u,a;const{clone:s=!1,passive:i=!1,eventName:c,deep:l=!1,defaultValue:d,shouldEmit:p}=o,h=We(),m=n||h?.emit||((r=h?.$emit)==null?void 0:r.bind(h))||((a=(u=h?.proxy)==null?void 0:u.$emit)==null?void 0:a.bind(h?.proxy));let g=c;t||(t="modelValue"),g=g||`update:${t.toString()}`;const y=v=>s?typeof s=="function"?s(v):lV(v):v,E=()=>iV(e[t])?y(e[t]):d,b=v=>{p?p(v)&&m(g,v):m(g,v)};if(i){const v=E(),C=R(v);let w=!1;return ye(()=>e[t],B=>{w||(w=!0,C.value=y(B),Oe(()=>w=!1))}),ye(C,B=>{!w&&(B!==e[t]||l)&&b(B)},{deep:l}),C}else return F({get(){return E()},set(v){b(v)}})}const[Es,cV]=np("DrawerRoot"),LE=new WeakMap;function $t(e,t,n=!1){if(!e||!(e instanceof HTMLElement)||!t)return;const o={};Object.entries(t).forEach(([r,u])=>{if(r.startsWith("--")){e.style.setProperty(r,u);return}o[r]=e.style[r],e.style[r]=u}),!n&&LE.set(e,o)}function dV(e,t){if(!e||!(e instanceof HTMLElement))return;const n=LE.get(e);n&&Object.entries(n).forEach(([o,r])=>{e.style[o]=r})}function Xs(e,t){const n=window.getComputedStyle(e),o=n.transform||n.webkitTransform||n.mozTransform;let r=o.match(/^matrix3d\((.+)\)$/);return r?Number.parseFloat(r[1].split(", ")[St(t)?13:12]):(r=o.match(/^matrix\((.+)\)$/),r?Number.parseFloat(r[1].split(", ")[St(t)?5:4]):null)}function fV(e){return 8*(Math.log(e+1)-2)}function St(e){switch(e){case"top":case"bottom":return!0;case"left":case"right":return!1;default:return e}}function qc(e,t){if(!e)return()=>{};const n=e.style.cssText;return Object.assign(e.style,t),()=>{e.style.cssText=n}}function pV(...e){return(...t)=>{for(const n of e)typeof n=="function"&&n(...t)}}const vt={DURATION:.5,EASE:[.32,.72,0,1]},qE=.4,hV=.25,mV=100,$E=8,Js=16,NE=26,ig="vaul-dragging";function gV({activeSnapPoint:e,snapPoints:t,drawerRef:n,overlayRef:o,fadeFromIndex:r,onSnapPointChange:u,direction:a}){const s=R(typeof window<"u"?{innerWidth:window.innerWidth,innerHeight:window.innerHeight}:void 0);function i(){s.value={innerWidth:window.innerWidth,innerHeight:window.innerHeight}}$e(()=>{typeof window<"u"&&window.addEventListener("resize",i)}),mo(()=>{typeof window<"u"&&window.removeEventListener("resize",i)});const c=F(()=>(t.value&&e.value===t.value[t.value.length-1])??null),l=F(()=>t.value&&t.value.length>0&&(r?.value||r?.value===0)&&!Number.isNaN(r?.value)&&t.value[r?.value??-1]===e.value||!t.value),d=F(()=>{var b;return((b=t.value)==null?void 0:b.findIndex(v=>v===e.value))??null}),p=F(()=>{var b;return((b=t.value)==null?void 0:b.map(v=>{const C=typeof v=="string";let w=0;if(C&&(w=Number.parseInt(v,10)),St(a.value)){const x=C?w:s.value?v*s.value.innerHeight:0;return s.value?a.value==="bottom"?s.value.innerHeight-x:-s.value.innerHeight+x:x}const B=C?w:s.value?v*s.value.innerWidth:0;return s.value?a.value==="right"?s.value.innerWidth-B:-s.value.innerWidth+B:B}))??[]}),h=F(()=>{var b;return d.value!==null?(b=p.value)==null?void 0:b[d.value]:null}),m=b=>{var v,C,w,B;const x=((v=p.value)==null?void 0:v.findIndex(_=>_===b))??null;Oe(()=>{var _;u(x,p.value),$t((_=n.value)==null?void 0:_.$el,{transition:`transform ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,transform:St(a.value)?`translate3d(0, ${b}px, 0)`:`translate3d(${b}px, 0, 0)`})}),p.value&&x!==p.value.length-1&&x!==r?.value?$t((C=o.value)==null?void 0:C.$el,{transition:`opacity ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,opacity:"0"}):$t((w=o.value)==null?void 0:w.$el,{transition:`opacity ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,opacity:"1"}),e.value=x!==null?((B=t.value)==null?void 0:B[x])??null:null};ye([e,p,t],()=>{var b;if(e.value){const v=((b=t.value)==null?void 0:b.findIndex(C=>C===e.value))??-1;p.value&&v!==-1&&typeof p.value[v]=="number"&&m(p.value[v])}},{immediate:!0});function g({draggedDistance:b,closeDrawer:v,velocity:C,dismissible:w}){var B,x,_;if(r.value===void 0)return;const S=a.value==="bottom"||a.value==="right"?(h.value??0)-b:(h.value??0)+b,O=d.value===r.value-1,H=d.value===0,N=b>0;if(O&&$t((B=o.value)==null?void 0:B.$el,{transition:`opacity ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`}),C>2&&!N){w?v():m(p.value[0]);return}if(C>2&&N&&p&&t.value){m(p.value[t.value.length-1]);return}const J=(x=p.value)==null?void 0:x.reduce(($,I)=>typeof $!="number"||typeof I!="number"?$:Math.abs(I-S)qE&&Math.abs(b)0&&c){m(p.value[(((_=t.value)==null?void 0:_.length)??0)-1]);return}if(H&&$<0&&w&&v(),d.value===null)return;m(p.value[d.value+$]);return}m(J)}function y({draggedDistance:b}){var v;if(h.value===null)return;const C=a.value==="bottom"||a.value==="right"?h.value-b:h.value+b;(a.value==="bottom"||a.value==="right")&&Cp.value[p.value.length-1]||$t((v=n.value)==null?void 0:v.$el,{transform:St(a.value)?`translate3d(0, ${C}px, 0)`:`translate3d(${C}px, 0, 0)`})}function E(b,v){if(!t.value||typeof d.value!="number"||!p.value||r.value===void 0)return null;const C=d.value===r.value-1;if(d.value>=r.value&&v)return 0;if(C&&!v)return 1;if(!l.value&&!C)return null;const w=C?d.value+1:d.value-1,B=C?p.value[w]-p.value[w-1]:p.value[w+1]-p.value[w],x=b/Math.abs(B);return C?1-x:x}return{isLastSnapPoint:c,shouldFade:l,getPercentageDragged:E,activeSnapPointIndex:d,onRelease:g,onDrag:y,snapPointsOffset:p}}function lg(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}let ca=null;function vV(e){const{isOpen:t,modal:n,nested:o,hasBeenOpened:r,preventScrollRestoration:u,noBodyStyles:a}=e,s=R(typeof window<"u"?window.location.href:""),i=R(0);function c(){if(lg()&&ca===null&&t.value&&!a.value){ca={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left,height:document.body.style.height};const{scrollX:d,innerHeight:p}=window;document.body.style.setProperty("position","fixed","important"),Object.assign(document.body.style,{top:`${-i.value}px`,left:`${-d}px`,right:"0px",height:"auto"}),setTimeout(()=>{requestAnimationFrame(()=>{const h=p-window.innerHeight;h&&i.value>=p&&(document.body.style.top=`-${i.value+h}px`)})},300)}}function l(){if(lg()&&ca!==null&&!a.value){const d=-Number.parseInt(document.body.style.top,10),p=-Number.parseInt(document.body.style.left,10);Object.assign(document.body.style,ca),window.requestAnimationFrame(()=>{if(u.value&&s.value!==window.location.href){s.value=window.location.href;return}window.scrollTo(p,d)}),ca=null}}return $e(()=>{function d(){i.value=window.scrollY}d(),window.addEventListener("scroll",d),Ht(()=>{window.removeEventListener("scroll",d)})}),ye([t,r,s],()=>{o.value||!r.value||(t.value?(window.matchMedia("(display-mode: standalone)").matches||c(),n.value||setTimeout(()=>{l()},500)):l())}),{restorePositionSetting:l}}function yV(e,t){return e&&e.value?e:t}function bV(e){const{emitDrag:t,emitRelease:n,emitClose:o,emitOpenChange:r,open:u,dismissible:a,nested:s,modal:i,shouldScaleBackground:c,setBackgroundColorOnScale:l,scrollLockTimeout:d,closeThreshold:p,activeSnapPoint:h,fadeFromIndex:m,direction:g,noBodyStyles:y,handleOnly:E,preventScrollRestoration:b}=e,v=R(u.value??!1),C=R(!1),w=R(!1),B=R(!1),x=R(null),_=R(null),S=R(null),O=R(null),H=R(null),N=R(!1),J=R(null),G=R(0),$=R(!1),I=R(null),W=F(()=>{var z;return((z=I.value)==null?void 0:z.$el.getBoundingClientRect().height)||0}),K=yV(e.snapPoints,R(void 0)),de=F(()=>{var z;return K&&(((z=K.value)==null?void 0:z.length)??0)>0}),le=R(null),{activeSnapPointIndex:ut,onRelease:Ve,snapPointsOffset:ht,onDrag:Dt,shouldFade:Ne,getPercentageDragged:ze}=gV({snapPoints:K,activeSnapPoint:h,drawerRef:I,fadeFromIndex:m,overlayRef:x,onSnapPointChange:Z,direction:g});function Z(z,ue){K.value&&z===ue.length-1&&(_.value=new Date)}vV({isOpen:v,modal:i,nested:s,hasBeenOpened:C,noBodyStyles:y,preventScrollRestoration:b});function ce(){return(window.innerWidth-NE)/window.innerWidth}function se(z,ue){var oe;if(!z)return!1;let ee=z;const Q=(oe=window.getSelection())==null?void 0:oe.toString(),fe=I.value?Xs(I.value.$el,g.value):null,ie=new Date;if(ee.hasAttribute("data-vaul-no-drag")||ee.closest("[data-vaul-no-drag]"))return!1;if(g.value==="right"||g.value==="left")return!0;if(_.value&&ie.getTime()-_.value.getTime()<500)return!1;if(fe!==null&&(g.value==="bottom"?fe>0:fe<0))return!0;if(Q&&Q.length>0)return!1;if(H.value&&ie.getTime()-H.value.getTime()ee.clientHeight){if(ee.scrollTop!==0)return H.value=new Date,!1;if(ee.getAttribute("role")==="dialog")return!0}ee=ee.parentNode}return!0}function Ee(z){!a.value&&!K.value||I.value&&!I.value.$el.contains(z.target)||(w.value=!0,S.value=new Date,z.target.setPointerCapture(z.pointerId),G.value=St(g.value)?z.clientY:z.clientX)}function Te(z){var ue,oe,ee,Q,fe,ie;if(I.value&&w.value){const ge=g.value==="bottom"||g.value==="right"?1:-1,Be=(G.value-(St(g.value)?z.clientY:z.clientX))*ge,Le=Be>0,et=K.value&&!a.value&&!Le;if(et&&ut.value===0)return;const tt=Math.abs(Be),gt=document.querySelector("[data-vaul-drawer-wrapper]")||document.querySelector("[vaul-drawer-wrapper]");let at=tt/W.value;const cn=ze(tt,Le);if(cn!==null&&(at=cn),et&&at>=1||!N.value&&!se(z.target,Le))return;if((ue=I?.value)==null||ue.$el.classList.add(ig),N.value=!0,$t((oe=I.value)==null?void 0:oe.$el,{transition:"none"}),$t((ee=x.value)==null?void 0:ee.$el,{transition:"none"}),K.value&&Dt({draggedDistance:Be}),Le&&!K.value){const yn=fV(Be),vr=Math.min(yn*-1,0)*ge;$t((Q=I.value)==null?void 0:Q.$el,{transform:St(g.value)?`translate3d(0, ${vr}px, 0)`:`translate3d(${vr}px, 0, 0)`});return}const Qt=1-at;if((Ne.value||m.value&&ut.value===m.value-1)&&(t(at),$t((fe=x.value)==null?void 0:fe.$el,{opacity:`${Qt}`,transition:"none"},!0)),gt&&x.value&&c.value){const yn=Math.min(ce()+at*(1-ce()),1),vr=8-at*8,Kt=Math.max(0,14-at*14);$t(gt,{borderRadius:`${vr}px`,transform:St(g.value)?`scale(${yn}) translate3d(0, ${Kt}px, 0)`:`scale(${yn}) translate3d(${Kt}px, 0, 0)`,transition:"none"},!0)}if(!K.value){const yn=tt*ge;$t((ie=I.value)==null?void 0:ie.$el,{transform:St(g.value)?`translate3d(0, ${yn}px, 0)`:`translate3d(${yn}px, 0, 0)`})}}}function Ge(){var z;if(!I.value)return;const ue=document.querySelector("[data-vaul-drawer-wrapper]")||document.querySelector("[vaul-drawer-wrapper]"),oe=Xs(I.value.$el,g.value);$t(I.value.$el,{transform:"translate3d(0, 0, 0)",transition:`transform ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`}),$t((z=x.value)==null?void 0:z.$el,{transition:`opacity ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,opacity:"1"}),c.value&&oe&&oe>0&&v.value&&$t(ue,{borderRadius:`${$E}px`,overflow:"hidden",...St(g.value)?{transform:`scale(${ce()}) translate3d(0, calc(env(safe-area-inset-top) + 14px), 0)`,transformOrigin:"top"}:{transform:`scale(${ce()}) translate3d(calc(env(safe-area-inset-top) + 14px), 0, 0)`,transformOrigin:"left"},transitionProperty:"transform, border-radius",transitionDuration:`${vt.DURATION}s`,transitionTimingFunction:`cubic-bezier(${vt.EASE.join(",")})`},!0)}function T(z){I.value&&(o(),z||(v.value=!1),window.setTimeout(()=>{K.value&&(h.value=K.value[0])},vt.DURATION*1e3))}Ze(()=>{if(!v.value&&c.value&&sV){const z=setTimeout(()=>{dV(document.body)},200);return()=>clearTimeout(z)}}),ye(u,()=>{v.value=u.value,u.value||T()});function M(z){if(!w.value||!I.value)return;I.value.$el.classList.remove(ig),N.value=!1,w.value=!1,O.value=new Date;const ue=Xs(I.value.$el,g.value);if(!se(z.target,!1)||!ue||Number.isNaN(ue)||S.value===null)return;const oe=O.value.getTime()-S.value.getTime(),ee=G.value-(St(g.value)?z.clientY:z.clientX),Q=Math.abs(ee)/oe;if(Q>.05&&(B.value=!0,window.setTimeout(()=>{B.value=!1},200)),K.value){const ie=g.value==="bottom"||g.value==="right"?1:-1;Ve({draggedDistance:ee*ie,closeDrawer:T,velocity:Q,dismissible:a.value}),n(!0);return}if(g.value==="bottom"||g.value==="right"?ee>0:ee<0){Ge(),n(!0);return}if(Q>qE){T(),n(!1);return}const fe=Math.min(I.value.$el.getBoundingClientRect().height??0,window.innerHeight);if(ue>=fe*p.value){T(),n(!1);return}n(!0),Ge()}ye(v,z=>{z&&(_.value=new Date),r(z)},{immediate:!0});function V(z){var ue,oe;const ee=z?(window.innerWidth-Js)/window.innerWidth:1,Q=z?-16:0;J.value&&window.clearTimeout(J.value),$t((ue=I.value)==null?void 0:ue.$el,{transition:`transform ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,transform:`scale(${ee}) translate3d(0, ${Q}px, 0)`}),!z&&(oe=I.value)!=null&&oe.$el&&(J.value=window.setTimeout(()=>{var fe,ie;const ge=Xs((fe=I.value)==null?void 0:fe.$el,g.value);$t((ie=I.value)==null?void 0:ie.$el,{transition:"none",transform:St(g.value)?`translate3d(0, ${ge}px, 0)`:`translate3d(${ge}px, 0, 0)`})},500))}function te(z){var ue;if(z<0)return;const oe=St(g.value)?window.innerHeight:window.innerWidth,ee=(oe-Js)/oe,Q=ee+z*(1-ee),fe=-16+z*Js;$t((ue=I.value)==null?void 0:ue.$el,{transform:St(g.value)?`scale(${Q}) translate3d(0, ${fe}px, 0)`:`scale(${Q}) translate3d(${fe}px, 0, 0)`,transition:"none"})}function X(z){var ue;const oe=St(g.value)?window.innerHeight:window.innerWidth,ee=z?(oe-Js)/oe:1,Q=z?-16:0;z&&$t((ue=I.value)==null?void 0:ue.$el,{transition:`transform ${vt.DURATION}s cubic-bezier(${vt.EASE.join(",")})`,transform:St(g.value)?`scale(${ee}) translate3d(0, ${Q}px, 0)`:`scale(${ee}) translate3d(${Q}px, 0, 0)`})}return{open:u,isOpen:v,modal:i,keyboardIsOpen:$,hasBeenOpened:C,drawerRef:I,drawerHeightRef:W,overlayRef:x,handleRef:le,isDragging:w,dragStartTime:S,isAllowedToDrag:N,snapPoints:K,activeSnapPoint:h,hasSnapPoints:de,pointerStart:G,dismissible:a,snapPointsOffset:ht,direction:g,shouldFade:Ne,fadeFromIndex:m,shouldScaleBackground:c,setBackgroundColorOnScale:l,onPress:Ee,onDrag:Te,onRelease:M,closeDrawer:T,onNestedDrag:te,onNestedRelease:X,onNestedOpenChange:V,emitClose:o,emitDrag:t,emitRelease:n,emitOpenChange:r,nested:s,handleOnly:E,noBodyStyles:y}}const jE=L({__name:"DrawerRoot",props:{activeSnapPoint:{default:void 0},closeThreshold:{default:hV},shouldScaleBackground:{type:Boolean,default:void 0},setBackgroundColorOnScale:{type:Boolean,default:!0},scrollLockTimeout:{default:mV},fixed:{type:Boolean,default:void 0},dismissible:{type:Boolean,default:!0},modal:{type:Boolean,default:!0},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:void 0},nested:{type:Boolean,default:!1},direction:{default:"bottom"},noBodyStyles:{type:Boolean},handleOnly:{type:Boolean,default:!1},preventScrollRestoration:{type:Boolean},snapPoints:{default:void 0},fadeFromIndex:{default:void 0}},emits:["drag","release","close","update:open","update:activeSnapPoint","animationEnd"],setup(e,{expose:t,emit:n}){const o=e,r=n;qt();const u=F(()=>o.fadeFromIndex??(o.snapPoints&&o.snapPoints.length-1)),a=sg(o,"open",r,{defaultValue:o.defaultOpen,passive:o.open===void 0}),s=sg(o,"activeSnapPoint",r,{passive:o.activeSnapPoint===void 0}),i={emitDrag:m=>r("drag",m),emitRelease:m=>r("release",m),emitClose:()=>r("close"),emitOpenChange:m=>{r("update:open",m),setTimeout(()=>{r("animationEnd",m)},vt.DURATION*1e3)}},{closeDrawer:c,hasBeenOpened:l,modal:d,isOpen:p}=cV(bV({...i,...mt(o),activeSnapPoint:s,fadeFromIndex:u,open:a}));function h(m){if(a.value!==void 0){i.emitOpenChange(m);return}p.value=m,m?l.value=!0:c()}return t({open:p}),(m,g)=>(D(),k(f(Bj),{open:f(p),modal:f(d),"onUpdate:open":h},{default:A(()=>[P(m.$slots,"default",{open:f(p)})]),_:3},8,["open","modal"]))}}),EV=L({__name:"DrawerRootNested",props:{activeSnapPoint:{},closeThreshold:{},shouldScaleBackground:{type:Boolean},setBackgroundColorOnScale:{type:Boolean},scrollLockTimeout:{},fixed:{type:Boolean},dismissible:{type:Boolean},modal:{type:Boolean},open:{type:Boolean},defaultOpen:{type:Boolean},nested:{type:Boolean},direction:{},noBodyStyles:{type:Boolean},handleOnly:{type:Boolean},preventScrollRestoration:{type:Boolean},snapPoints:{},fadeFromIndex:{}},emits:["drag","release","close","update:open","update:activeSnapPoint","animationEnd"],setup(e,{emit:t}){const n=e,o=t,{onNestedDrag:r,onNestedOpenChange:u,onNestedRelease:a}=Es();function s(){u(!1)}function i(d){r(d)}function c(d){d&&u(d),o("update:open",d)}const l=yj(n,o);return(d,p)=>(D(),k(jE,j(f(l),{nested:"",onClose:s,onDrag:i,onRelease:f(a),"onUpdate:open":c}),{default:A(()=>[P(d.$slots,"default")]),_:3},16,["onRelease"]))}}),CV=L({__name:"DrawerOverlay",setup(e){const{overlayRef:t,hasSnapPoints:n,isOpen:o,shouldFade:r}=Es();return(u,a)=>(D(),k(f(Qj),{ref_key:"overlayRef",ref:t,"data-vaul-overlay":"","data-vaul-snap-points":f(o)&&f(n)?"true":"false","data-vaul-snap-points-overlay":f(o)&&f(r)?"true":"false"},null,8,["data-vaul-snap-points","data-vaul-snap-points-overlay"]))}}),xV=()=>()=>{};function wV(){const{direction:e,isOpen:t,shouldScaleBackground:n,setBackgroundColorOnScale:o,noBodyStyles:r}=Es(),u=R(null),a=R(document.body.style.backgroundColor);function s(){return(window.innerWidth-NE)/window.innerWidth}Ze(i=>{if(t.value&&n.value){u.value&&clearTimeout(u.value);const c=document.querySelector("[data-vaul-drawer-wrapper]")||document.querySelector("[vaul-drawer-wrapper]");if(!c)return;pV(o.value&&!r.value?qc(document.body,{background:"black"}):xV,qc(c,{transformOrigin:St(e.value)?"top":"left",transitionProperty:"transform, border-radius",transitionDuration:`${vt.DURATION}s`,transitionTimingFunction:`cubic-bezier(${vt.EASE.join(",")})`}));const l=qc(c,{borderRadius:`${$E}px`,overflow:"hidden",...St(e.value)?{transform:`scale(${s()}) translate3d(0, calc(env(safe-area-inset-top) + 14px), 0)`}:{transform:`scale(${s()}) translate3d(calc(env(safe-area-inset-top) + 14px), 0, 0)`}});i(()=>{l(),u.value=window.setTimeout(()=>{a.value?document.body.style.background=a.value:document.body.style.removeProperty("background")},vt.DURATION*1e3)})}},{flush:"pre"})}const DV=L({__name:"DrawerContent",setup(e){const{open:t,isOpen:n,snapPointsOffset:o,hasSnapPoints:r,drawerRef:u,onPress:a,onDrag:s,onRelease:i,modal:c,emitOpenChange:l,dismissible:d,keyboardIsOpen:p,closeDrawer:h,direction:m,handleOnly:g}=Es();wV();const y=R(!1),E=F(()=>o.value&&o.value.length>0?`${o.value[0]}px`:"0");function b(w){if(!c.value||w.defaultPrevented){w.preventDefault();return}p.value&&(p.value=!1),d.value?l(!1):w.preventDefault()}function v(w){g.value||a(w)}function C(w){g.value||s(w)}return Ze(()=>{r.value&&window.requestAnimationFrame(()=>{y.value=!0})}),(w,B)=>(D(),k(f(Gj),{ref_key:"drawerRef",ref:u,"data-vaul-drawer":"","data-vaul-drawer-direction":f(m),"data-vaul-delayed-snap-points":y.value?"true":"false","data-vaul-snap-points":f(n)&&f(r)?"true":"false",style:mn({"--snap-point-height":E.value}),onPointerdown:v,onPointermove:C,onPointerup:f(i),onPointerDownOutside:b,onOpenAutoFocus:B[0]||(B[0]=On(()=>{},["prevent"])),onEscapeKeyDown:B[1]||(B[1]=x=>{f(d)||x.preventDefault()})},{default:A(()=>[P(w.$slots,"default")]),_:3},8,["data-vaul-drawer-direction","data-vaul-delayed-snap-points","data-vaul-snap-points","style","onPointerup"]))}}),AV=["data-vaul-drawer-visible"],BV={"data-vaul-handle-hitarea":"","aria-hidden":"true"},_V=250,kV=120,SV=L({__name:"DrawerHandle",props:{preventCycle:{type:Boolean,default:!1}},setup(e){const t=e,{onPress:n,onDrag:o,handleRef:r,handleOnly:u,isOpen:a,snapPoints:s,activeSnapPoint:i,isDragging:c,dismissible:l,closeDrawer:d}=Es(),p=R(null),h=R(!1);function m(){if(h.value){E();return}window.setTimeout(()=>{g()},kV)}function g(){if(c.value||t.preventCycle||h.value){E();return}if(E(),!s.value||s.value.length===0){l.value||d();return}const C=i.value===s.value[s.value.length-1];if(C&&l.value){d();return}const w=s.value.findIndex(x=>x===i.value);if(w===-1)return;const B=C?0:w+1;i.value=s.value[B]}function y(){p.value=window.setTimeout(()=>{h.value=!0},_V)}function E(){p.value&&window.clearTimeout(p.value),h.value=!1}function b(C){u.value&&n(C),y()}function v(C){u.value&&o(C)}return(C,w)=>(D(),re("div",{ref_key:"handleRef",ref:r,"data-vaul-drawer-visible":f(a)?"true":"false","data-vaul-handle":"","aria-hidden":"true",onClick:m,onPointercancel:E,onPointerdown:b,onPointermove:v},[je("span",BV,[P(C.$slots,"default")])],40,AV))}}),TV={slots:{overlay:"fixed inset-0 bg-elevated/75",content:"fixed bg-default ring ring-default flex focus:outline-none",handle:["shrink-0 !bg-accented","transition-opacity"],container:"w-full flex flex-col gap-4 p-4 overflow-y-auto",header:"",title:"text-highlighted font-semibold",description:"mt-1 text-muted text-sm",body:"flex-1",footer:"flex flex-col gap-1.5"},variants:{direction:{top:{content:"mb-24 flex-col-reverse",handle:"mb-4"},right:{content:"flex-row",handle:"!ml-4"},bottom:{content:"mt-24 flex-col",handle:"mt-4"},left:{content:"flex-row-reverse",handle:"!mr-4"}},inset:{true:{content:"rounded-lg after:hidden overflow-hidden [--initial-transform:calc(100%+1.5rem)]"}},snapPoints:{true:""}},compoundVariants:[{direction:["top","bottom"],class:{content:"h-auto max-h-[96%]",handle:"!w-12 !h-1.5 mx-auto"}},{direction:["top","bottom"],snapPoints:!0,class:{content:"h-full"}},{direction:["right","left"],class:{content:"w-auto max-w-[calc(100%-2rem)]",handle:"!h-12 !w-1.5 mt-auto mb-auto"}},{direction:["right","left"],snapPoints:!0,class:{content:"w-full"}},{direction:"top",inset:!0,class:{content:"inset-x-4 top-4"}},{direction:"top",inset:!1,class:{content:"inset-x-0 top-0 rounded-b-lg"}},{direction:"bottom",inset:!0,class:{content:"inset-x-4 bottom-4"}},{direction:"bottom",inset:!1,class:{content:"inset-x-0 bottom-0 rounded-t-lg"}},{direction:"left",inset:!0,class:{content:"inset-y-4 left-4"}},{direction:"left",inset:!1,class:{content:"inset-y-0 left-0 rounded-r-lg"}},{direction:"right",inset:!0,class:{content:"inset-y-4 right-4"}},{direction:"right",inset:!1,class:{content:"inset-y-0 right-0 rounded-l-lg"}}]},FV={__name:"UDrawer",props:{as:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},inset:{type:Boolean,required:!1},content:{type:Object,required:!1},overlay:{type:Boolean,required:!1,default:!0},handle:{type:Boolean,required:!1,default:!0},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},nested:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},activeSnapPoint:{type:[Number,String,null],required:!1},closeThreshold:{type:Number,required:!1},shouldScaleBackground:{type:Boolean,required:!1},setBackgroundColorOnScale:{type:Boolean,required:!1},scrollLockTimeout:{type:Number,required:!1},fixed:{type:Boolean,required:!1},dismissible:{type:Boolean,required:!1,default:!0},modal:{type:Boolean,required:!1,default:!0},open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},direction:{type:String,required:!1,default:"bottom"},noBodyStyles:{type:Boolean,required:!1},handleOnly:{type:Boolean,required:!1},preventScrollRestoration:{type:Boolean,required:!1},snapPoints:{type:Array,required:!1}},emits:["close:prevent","drag","release","close","update:open","update:activeSnapPoint","animationEnd"],setup(e,{emit:t}){const n=e,o=t,r=qt(),u=Pe(),a=Et("drawer",n),s=it(Jt(n,"activeSnapPoint","closeThreshold","shouldScaleBackground","setBackgroundColorOnScale","scrollLockTimeout","fixed","dismissible","modal","open","defaultOpen","nested","direction","noBodyStyles","handleOnly","preventScrollRestoration","snapPoints"),o),i=tu(Ye(()=>n.portal)),c=Ye(()=>n.content),l=F(()=>n.dismissible?{pointerDownOutside:Fl}:["interactOutside","escapeKeyDown"].reduce((h,m)=>(h[m]=g=>{g.preventDefault(),o("close:prevent")},h),{})),d=F(()=>Se({extend:Se(TV),...u.ui?.drawer||{}})({direction:n.direction,inset:n.inset,snapPoints:n.snapPoints&&n.snapPoints.length>0}));return(p,h)=>(D(),k(Rt(e.nested?f(EV):f(jE)),me(xe(f(s))),{default:A(()=>[r.default?(D(),k(f(aV),{key:0,"as-child":"",class:U(n.class)},{default:A(()=>[P(p.$slots,"default")]),_:3},8,["class"])):Y("",!0),q(f(oV),me(xe(f(i))),{default:A(()=>[e.overlay?(D(),k(f(CV),{key:0,"data-slot":"overlay",class:U(d.value.overlay({class:f(a)?.overlay}))},null,8,["class"])):Y("",!0),q(f(DV),j({"data-slot":"content",class:d.value.content({class:[!r.default&&n.class,f(a)?.content]})},c.value,as(l.value)),{default:A(()=>[e.handle?(D(),k(f(SV),{key:0,"data-slot":"handle",class:U(d.value.handle({class:f(a)?.handle}))},null,8,["class"])):Y("",!0),!e.title&&!r.title||!e.description&&!r.description||r.content?(D(),k(f(Yr),{key:1},{default:A(()=>[!e.title&&!r.title?(D(),k(f(Lc),{key:0})):r.content?(D(),k(f(Lc),{key:1},{default:A(()=>[P(p.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3})):Y("",!0),!e.description&&!r.description?(D(),k(f(Rc),{key:2})):r.content?(D(),k(f(Rc),{key:3},{default:A(()=>[P(p.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3})):Y("",!0)]),_:3})):Y("",!0),P(p.$slots,"content",{},()=>[je("div",{"data-slot":"container",class:U(d.value.container({class:f(a)?.container}))},[r.header||e.title||r.title||e.description||r.description?(D(),re("div",{key:0,"data-slot":"header",class:U(d.value.header({class:f(a)?.header}))},[P(p.$slots,"header",{},()=>[e.title||r.title?(D(),k(f(Lc),{key:0,"data-slot":"title",class:U(d.value.title({class:f(a)?.title}))},{default:A(()=>[P(p.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3},8,["class"])):Y("",!0),e.description||r.description?(D(),k(f(Rc),{key:1,"data-slot":"description",class:U(d.value.description({class:f(a)?.description}))},{default:A(()=>[P(p.$slots,"description",{},()=>[Ke(Fe(e.description),1)])]),_:3},8,["class"])):Y("",!0)])],2)):Y("",!0),r.body?(D(),re("div",{key:1,"data-slot":"body",class:U(d.value.body({class:f(a)?.body}))},[P(p.$slots,"body")],2)):Y("",!0),r.footer?(D(),re("div",{key:2,"data-slot":"footer",class:U(d.value.footer({class:f(a)?.footer}))},[P(p.$slots,"footer")],2)):Y("",!0)],2)])]),_:3},16,["class"])]),_:3},16)]),_:3},16))}},PV={slots:{root:"bg-default/75 backdrop-blur border-b border-default h-(--ui-header-height) sticky top-0 z-50",container:"flex items-center justify-between gap-3 h-full",left:"lg:flex-1 flex items-center gap-1.5",center:"hidden lg:flex",right:"flex items-center justify-end lg:flex-1 gap-1.5",title:"shrink-0 font-bold text-xl text-highlighted flex items-end gap-1.5",toggle:"lg:hidden",content:"lg:hidden",overlay:"lg:hidden",header:"px-4 sm:px-6 h-(--ui-header-height) shrink-0 flex items-center justify-between gap-3",body:"p-4 sm:p-6 overflow-y-auto"},variants:{toggleSide:{left:{toggle:"-ms-1.5"},right:{toggle:"-me-1.5"}}}},MV=Object.assign({inheritAttrs:!1},{__name:"UHeader",props:vv({as:{type:null,required:!1,default:"header"},title:{type:String,required:!1,default:"Nuxt UI"},to:{type:String,required:!1,default:"/"},mode:{type:null,required:!1,default:"modal"},menu:{type:null,required:!1},toggle:{type:[Boolean,Object],required:!1,default:!0},toggleSide:{type:String,required:!1,default:"right"},autoClose:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(e){const t=e,n=qt(),o=xv(e,"open",{type:Boolean,default:!1}),r=Yn(),{t:u}=Vo(),a=Pe(),s=Et("header",t),[i,c]=To(),[l,d]=To(),[p,h]=To(),m=F(()=>(n.title&&$0(n.title())||t.title||"Nuxt UI").trim());ye(()=>r.fullPath,()=>{t.autoClose&&(o.value=!1)});const g=F(()=>Se({extend:Se(PV),...a.ui?.header||{}})()),y=F(()=>({slideover:GN,modal:ZN,drawer:FV})[t.mode]),E=Ye(()=>wt(t.menu,{content:{onOpenAutoFocus:v=>v.preventDefault()}},t.mode==="modal"?{fullscreen:!0,transition:!1}:{}));function b(){o.value=!o.value}return(v,C)=>(D(),re(Ce,null,[q(f(p),null,{default:A(()=>[P(v.$slots,"toggle",{open:o.value,toggle:b,ui:g.value},()=>[e.toggle?(D(),k(hn,j({key:0,color:"neutral",variant:"ghost","aria-label":o.value?f(u)("header.close"):f(u)("header.open"),icon:o.value?f(a).ui.icons.close:f(a).ui.icons.menu},typeof e.toggle=="object"?e.toggle:{},{"data-slot":"toggle",class:g.value.toggle({class:f(s)?.toggle,toggleSide:e.toggleSide}),onClick:b}),null,16,["aria-label","icon","class"])):Y("",!0)])]),_:3}),q(f(i),null,{default:A(()=>[je("div",{"data-slot":"left",class:U(g.value.left({class:f(s)?.left}))},[e.toggleSide==="left"?(D(),k(f(h),{key:0})):Y("",!0),P(v.$slots,"left",{},()=>[q($r,{to:e.to,"aria-label":m.value,"data-slot":"title",class:U(g.value.title({class:f(s)?.title}))},{default:A(()=>[P(v.$slots,"title",{},()=>[Ke(Fe(e.title),1)])]),_:3},8,["to","aria-label","class"])])],2)]),_:3}),q(f(l),null,{default:A(()=>[je("div",{"data-slot":"right",class:U(g.value.right({class:f(s)?.right}))},[P(v.$slots,"right"),e.toggleSide==="right"?(D(),k(f(h),{key:0})):Y("",!0)],2)]),_:3}),q(f(we),j({as:e.as},v.$attrs,{"data-slot":"root",class:g.value.root({class:[f(s)?.root,t.class]})}),{default:A(()=>[P(v.$slots,"top"),q(ep,{"data-slot":"container",class:U(g.value.container({class:f(s)?.container}))},{default:A(()=>[q(f(c)),je("div",{"data-slot":"center",class:U(g.value.center({class:f(s)?.center}))},[P(v.$slots,"default")],2),q(f(d))]),_:3},8,["class"]),P(v.$slots,"bottom")]),_:3},16,["as","class"]),q(f(y),j({open:o.value,"onUpdate:open":C[0]||(C[0]=w=>o.value=w),title:f(u)("header.title"),description:f(u)("header.description")},E.value,{ui:{overlay:g.value.overlay({class:f(s)?.overlay}),content:g.value.content({class:f(s)?.content})}}),{content:A(w=>[P(v.$slots,"content",me(xe(w)),()=>[e.mode!=="drawer"?(D(),re("div",{key:0,"data-slot":"header",class:U(g.value.header({class:f(s)?.header}))},[q(f(c)),q(f(d))],2)):Y("",!0),je("div",{"data-slot":"body",class:U(g.value.body({class:f(s)?.body}))},[P(v.$slots,"body")],2)])]),_:3},16,["open","title","description","ui"])],64))}});function cg(e){return!e||Array.isArray(e)&&e.length===0?[]:typeof e[0]=="string"?[{category:"Questions",items:e}]:e}const OV=360,IV=520;function VE(){const e=Bn(),t=Pe(),n=e.public.assistant,o=t.assistant,r=t.docus,u=F(()=>n?.enabled??!1),a=nr("assistant-open",()=>!1),s=nr("assistant-expanded",()=>!1),i=nr("assistant-messages",()=>[]),c=nr("assistant-pending",()=>{}),l=yk("(max-width: 767px)"),d=F(()=>s.value?IV:OV),p=F(()=>!l.value&&a.value),h=F(()=>{const C=o?.faqQuestions;if(!C)return[];if(!Array.isArray(C)){const w=C,B=r?.locale||"en",x=e.public.i18n?.defaultLocale||"en",_=w[B]||w[x]||Object.values(w)[0];return cg(_||[])}return cg(C)});function m(C,w=!1){w&&(i.value=[]),C&&(c.value=C),a.value=!0}function g(){c.value=void 0}function y(){a.value=!1}function E(){a.value=!a.value}function b(){i.value=[]}function v(){s.value=!s.value}return{isEnabled:u,isOpen:a,isExpanded:s,isMobile:l,panelWidth:d,shouldPushContent:p,messages:i,pendingMessage:c,faqQuestions:h,open:m,clearPending:g,close:y,toggle:E,toggleExpanded:v,clearMessages:b}}const RV=L({__name:"AppHeader",setup(e){const t=Pe(),{forced:n}=ss(),{isEnabled:o}=VE(),{isEnabled:r,locales:u}=Gu(),{subNavigationMode:a}=tp(),s=F(()=>t.github&&t.github.url?[{icon:"i-simple-icons-github",to:t.github.url,target:"_blank","aria-label":"GitHub"}]:[]);return(i,c)=>{const l=CI,d=MI,p=RI,h=$b,m=HI,g=ef,y=Vb,E=Mb,b=zb,v=hn,C=MN,w=LN,B=KN,x=MV;return D(),k(x,{ui:{center:"flex-1"},class:U({"flex flex-col":f(a)==="header"})},us({left:A(()=>[q(d)]),right:A(()=>[q(p),f(o)?(D(),k(h,{key:0})):Y("",!0),f(r)&&f(u).length>1?(D(),re(Ce,{key:1},[q(g,null,{fallback:A(()=>[...c[0]||(c[0]=[je("div",{class:"h-8 w-8 animate-pulse bg-neutral-200 dark:bg-neutral-800 rounded-md"},null,-1)])]),default:A(()=>[q(m)]),_:1}),q(y,{orientation:"vertical",class:"h-8"})],64)):Y("",!0),q(E,{class:"lg:hidden"}),f(n)?Y("",!0):(D(),k(g,{key:2},{fallback:A(()=>[...c[1]||(c[1]=[je("div",{class:"h-8 w-8 animate-pulse bg-neutral-200 dark:bg-neutral-800 rounded-md"},null,-1)])]),default:A(()=>[q(b)]),_:1})),f(s)?.length?(D(!0),re(Ce,{key:3},yt(f(s),(_,S)=>(D(),k(v,j({key:S},{ref_for:!0},{color:"neutral",variant:"ghost",..._}),null,16))),128)):Y("",!0)]),toggle:A(({open:_,toggle:S})=>[q(C,{open:_,class:"lg:hidden",onClick:S},null,8,["open","onClick"])]),body:A(()=>[q(w)]),default:A(()=>[q(l)]),_:2},[f(a)==="header"?{name:"bottom",fn:A(()=>[q(B)]),key:"0"}:void 0]),1032,["class"])}}}),zE=Object.assign(RV,{__name:"AppHeader"}),UE=(e="RouteProvider")=>L({name:e,props:{route:{type:Object,required:!0},vnode:Object,vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(t){const n=t.renderKey,o=t.route,r={};for(const u in t.route)Object.defineProperty(r,u,{get:()=>n===t.renderKey?t.route[u]:o[u],enumerable:!0});return Pt(Oo,Pn(r)),()=>t.vnode?qe(t.vnode,{ref:t.vnodeRef}):t.vnode}}),LV=UE(),dg=new WeakMap,qV=L({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,slots:n,expose:o}){const r=Re(),u=R(),a=Ue(Oo,null);let s;o({pageRef:u});const i=Ue(Dy,null);let c;const l=r.deferHydration();let d=!1,p=0;if(r.isHydrating){const m=r.hooks.hookOnce("app:error",l);Xt().beforeEach(m)}e.pageKey&&ye(()=>e.pageKey,(m,g)=>{m!==g&&r.callHook("page:loading:start")});let h=!1;{const m=Xt().beforeResolve(()=>{h=!1});mo(()=>{m(),l()})}return()=>qe(u3,{name:e.name,route:e.route,...t},{default:m=>{const g=$V(a,m.route,m.Component),y=a&&a.matched.length===m.route.matched.length;if(!m.Component){if(c&&!y)return c;l();return}if(c&&i&&!i.isCurrent(m.route))return c;if(g&&a&&(!i||i?.isCurrent(a)))return y||c?c:null;const E=p0(m,e.pageKey),b=NV(a,m.route,m.Component);!r.isHydrating&&s===E&&!b&&Oe(()=>{h||(h=!0,r.callHook("page:loading:end"))}),d&&s!==E&&p++,s=E;const v=!!(e.transition??m.route.meta.pageTransition??Qp),C=v&&i3([e.transition,m.route.meta.pageTransition,Qp,{onAfterLeave(){r["~transitionFinish"]?.(),delete r["~transitionFinish"],delete r["~transitionPromise"],r.callHook("page:transition:finish",m.Component)}}]),w=e.keepalive??m.route.meta.keepalive??L5;return c=s3(v&&C,pA(w,qe(Rd,{key:p,suspensible:!0,onPending:()=>{d=!0,v&&!r["~transitionPromise"]&&(r["~transitionPromise"]=new Promise(B=>{r["~transitionFinish"]=B})),r.callHook("page:start",m.Component)},onResolve:async()=>{d=!1;try{await Oe(),r._route.sync?.(),await r.callHook("page:finish",m.Component),!h&&!b&&(h=!0,await r.callHook("page:loading:end"))}finally{l()}}},{default:()=>{const B={key:E||void 0,vnode:n.default?jV(n.default,m):m.Component,route:m.route,renderKey:E||void 0,trackRootNodes:v,vnodeRef:u};if(!w)return qe(LV,B);const x=m.Component.type,_=x;let S=dg.get(_);return S||(S=UE(x.name||x.__name),dg.set(_,S)),qe(S,B)}}))).default(),c}})}});function $V(e,t,n){if(!e)return!1;const o=t.matched.findIndex(r=>r.components?.default===n?.type);return!o||o===-1?!1:t.matched.slice(0,o).some((r,u)=>r.components?.default!==e.matched[u]?.components?.default)||n&&p0({route:t,Component:n})!==p0({route:e,Component:n})}function NV(e,t,n){return e?t.matched.findIndex(r=>r.components?.default===n?.type)qe(or[e.name],e.layoutProps,t.slots)}}),zV={name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},UV=L({name:"NuxtLayout",inheritAttrs:!1,props:zV,setup(e,t){const n=Re(),o=Ue(Oo),u=!o||o===Yn()?Gy():o,a=F(()=>{let l=f(e.name)??u?.meta.layout??HE(u?.path).appLayout??"default";return l&&!(l in or)&&e.fallback&&(l=f(e.fallback)),l}),s=Me();t.expose({layoutRef:s});const i=n.deferHydration();if(n.isHydrating){const l=n.hooks.hookOnce("app:error",i);Xt().beforeEach(l)}let c;return()=>{const d=!!a.value&&a.value in or&&!!(u?.meta.layoutTransition??Jp),p=d&&i3([u?.meta.layoutTransition,Jp,{onBeforeLeave(){n["~transitionPromise"]=new Promise(m=>{n["~transitionFinish"]=m})},onAfterLeave(){n["~transitionFinish"]?.(),delete n["~transitionFinish"],delete n["~transitionPromise"]}}]),h=c;return c=a.value,s3(p,{default:()=>qe(Rd,{suspensible:!0,onResolve:async()=>{await Oe(i)}},{default:()=>qe(HV,{layoutProps:j(t.attrs,u.meta.layoutProps??{},{ref:s}),key:a.value||void 0,name:a.value,shouldProvide:!e.name,isRenderingNewLayout:m=>m!==h&&m===a.value,hasTransition:d},t.slots)})}).default()}}}),HV=L({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean},isRenderingNewLayout:{type:Function,required:!0}},setup(e,t){const n=e.name;e.shouldProvide&&Pt(Dy,{isCurrent:u=>n===!1||n===(u.meta.layout??HE(u.path).appLayout??"default")});const o=Ue(Oo);if(o&&o===Yn()){const u=Gy(),a={};for(const s in u){const i=s;Object.defineProperty(a,i,{enumerable:!0,get:()=>e.isRenderingNewLayout(e.name)?u[i]:o[i]})}Pt(Oo,Pn(a))}return()=>!n||typeof n=="string"&&!(n in or)?t.slots.default?.():qe(VV,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}),KV={},WV={class:"text-sm text-muted"};function GV(e,t){return D(),re("div",WV," Copyright © "+Fe(new Date().getFullYear()),1)}const YV=Object.assign(Wu(KV,[["render",GV]]),{__name:"AppFooterLeft"}),ZV=L({__name:"AppFooterRight",setup(e){const t=Pe(),{forced:n}=ss(),o=F(()=>{const r=Object.entries(t.socials||{}).flatMap(([a,s])=>typeof s!="string"||!s?[]:[{icon:`i-simple-icons-${a}`,to:s,target:"_blank","aria-label":`${a} social link`}]),u=t.github&&t.github.url?[{icon:"i-simple-icons-github",to:t.github.url,target:"_blank","aria-label":"GitHub repository"}]:[];return[...r,...u]});return(r,u)=>{const a=hn,s=zb;return D(),re(Ce,null,[f(o).length?(D(!0),re(Ce,{key:0},yt(f(o),(i,c)=>(D(),k(a,j({key:c,size:"sm"},{ref_for:!0},{color:"neutral",variant:"ghost",...i}),null,16))),128)):Y("",!0),f(n)?Y("",!0):(D(),k(s,{key:1}))],64)}}}),XV=Object.assign(ZV,{__name:"AppFooterRight"}),JV={slots:{root:"",top:"py-8 lg:py-12",bottom:"py-8 lg:py-12",container:"py-8 lg:py-4 lg:flex lg:items-center lg:justify-between lg:gap-x-3",left:"flex items-center justify-center lg:justify-start lg:flex-1 gap-x-1.5 mt-3 lg:mt-0 lg:order-1",center:"mt-3 lg:mt-0 lg:order-2 flex items-center justify-center",right:"lg:flex-1 flex items-center justify-center lg:justify-end gap-x-1.5 lg:order-3"}},QV={__name:"UFooter",props:{as:{type:null,required:!1,default:"footer"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,n=qt(),o=Pe(),r=Et("footer",t),u=F(()=>Se({extend:Se(JV),...o.ui?.footer||{}})());return(a,s)=>(D(),k(f(we),{as:e.as,"data-slot":"root",class:U(u.value.root({class:[f(r)?.root,t.class]}))},{default:A(()=>[n.top?(D(),re("div",{key:0,"data-slot":"top",class:U(u.value.top({class:f(r)?.top}))},[P(a.$slots,"top")],2)):Y("",!0),q(ep,{"data-slot":"container",class:U(u.value.container({class:f(r)?.container}))},{default:A(()=>[je("div",{"data-slot":"right",class:U(u.value.right({class:f(r)?.right}))},[P(a.$slots,"right")],2),je("div",{"data-slot":"center",class:U(u.value.center({class:f(r)?.center}))},[P(a.$slots,"default")],2),je("div",{"data-slot":"left",class:U(u.value.left({class:f(r)?.left}))},[P(a.$slots,"left")],2)]),_:3},8,["class"]),n.bottom?(D(),re("div",{key:1,"data-slot":"bottom",class:U(u.value.bottom({class:f(r)?.bottom}))},[P(a.$slots,"bottom")],2)):Y("",!0)]),_:3},8,["as","class"]))}},ez={};function tz(e,t){const n=YV,o=XV,r=QV;return D(),k(r,null,{left:A(()=>[q(n)]),right:A(()=>[q(o)]),_:1})}const KE=Object.assign(Wu(ez,[["render",tz]]),{__name:"AppFooter"}),nz={slots:{root:"gap-2",base:"relative overflow-hidden rounded-full bg-accented",indicator:"rounded-full size-full transition-transform duration-200 ease-out",status:"flex text-dimmed transition-[width] duration-200",steps:"grid items-end",step:"truncate text-end row-start-1 col-start-1 transition-opacity"},variants:{animation:{carousel:"","carousel-inverse":"",swing:"",elastic:""},color:{primary:{indicator:"bg-primary",steps:"text-primary"},secondary:{indicator:"bg-secondary",steps:"text-secondary"},success:{indicator:"bg-success",steps:"text-success"},info:{indicator:"bg-info",steps:"text-info"},warning:{indicator:"bg-warning",steps:"text-warning"},error:{indicator:"bg-error",steps:"text-error"},neutral:{indicator:"bg-inverted",steps:"text-inverted"}},size:{"2xs":{status:"text-xs",steps:"text-xs"},xs:{status:"text-xs",steps:"text-xs"},sm:{status:"text-sm",steps:"text-sm"},md:{status:"text-sm",steps:"text-sm"},lg:{status:"text-sm",steps:"text-sm"},xl:{status:"text-base",steps:"text-base"},"2xl":{status:"text-base",steps:"text-base"}},step:{active:{step:"opacity-100"},first:{step:"opacity-100 text-muted"},other:{step:"opacity-0"},last:{step:""}},orientation:{horizontal:{root:"w-full flex flex-col",base:"w-full",status:"flex-row items-center justify-end min-w-fit"},vertical:{root:"h-full flex flex-row-reverse",base:"h-full",status:"flex-col justify-end min-h-fit"}},inverted:{true:{status:"self-end"}}},compoundVariants:[{inverted:!0,orientation:"horizontal",class:{step:"text-start",status:"flex-row-reverse"}},{inverted:!0,orientation:"vertical",class:{steps:"items-start",status:"flex-col-reverse"}},{orientation:"horizontal",size:"2xs",class:"h-px"},{orientation:"horizontal",size:"xs",class:"h-0.5"},{orientation:"horizontal",size:"sm",class:"h-1"},{orientation:"horizontal",size:"md",class:"h-2"},{orientation:"horizontal",size:"lg",class:"h-3"},{orientation:"horizontal",size:"xl",class:"h-4"},{orientation:"horizontal",size:"2xl",class:"h-5"},{orientation:"vertical",size:"2xs",class:"w-px"},{orientation:"vertical",size:"xs",class:"w-0.5"},{orientation:"vertical",size:"sm",class:"w-1"},{orientation:"vertical",size:"md",class:"w-2"},{orientation:"vertical",size:"lg",class:"w-3"},{orientation:"vertical",size:"xl",class:"w-4"},{orientation:"vertical",size:"2xl",class:"w-5"},{orientation:"horizontal",animation:"carousel",class:{indicator:"data-[state=indeterminate]:animate-[carousel_2s_ease-in-out_infinite] data-[state=indeterminate]:rtl:animate-[carousel-rtl_2s_ease-in-out_infinite]"}},{orientation:"vertical",animation:"carousel",class:{indicator:"data-[state=indeterminate]:animate-[carousel-vertical_2s_ease-in-out_infinite]"}},{orientation:"horizontal",animation:"carousel-inverse",class:{indicator:"data-[state=indeterminate]:animate-[carousel-inverse_2s_ease-in-out_infinite] data-[state=indeterminate]:rtl:animate-[carousel-inverse-rtl_2s_ease-in-out_infinite]"}},{orientation:"vertical",animation:"carousel-inverse",class:{indicator:"data-[state=indeterminate]:animate-[carousel-inverse-vertical_2s_ease-in-out_infinite]"}},{orientation:"horizontal",animation:"swing",class:{indicator:"data-[state=indeterminate]:animate-[swing_2s_ease-in-out_infinite]"}},{orientation:"vertical",animation:"swing",class:{indicator:"data-[state=indeterminate]:animate-[swing-vertical_2s_ease-in-out_infinite]"}},{orientation:"horizontal",animation:"elastic",class:{indicator:"data-[state=indeterminate]:animate-[elastic_2s_ease-in-out_infinite]"}},{orientation:"vertical",animation:"elastic",class:{indicator:"data-[state=indeterminate]:animate-[elastic-vertical_2s_ease-in-out_infinite]"}}],defaultVariants:{animation:"carousel",color:"primary",size:"md"}},oz={__name:"UProgress",props:{as:{type:null,required:!1},max:{type:[Number,Array],required:!1},status:{type:Boolean,required:!1},inverted:{type:Boolean,required:!1,default:!1},size:{type:null,required:!1},color:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},animation:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},getValueLabel:{type:Function,required:!1},getValueText:{type:Function,required:!1},modelValue:{type:[Number,null],required:!1,default:null}},emits:["update:modelValue","update:max"],setup(e,{emit:t}){const n=e,o=t,r=qt(),{dir:u}=Vo(),a=Pe(),s=Et("progress",n),i=it(Jt(n,"getValueLabel","getValueText","modelValue"),o),c=F(()=>i.value.modelValue===null),l=F(()=>Array.isArray(n.max)),d=F(()=>{if(!(c.value||!n.max))return Array.isArray(n.max)?n.max.length-1:Number(n.max)}),p=F(()=>{if(!c.value)switch(!0){case i.value.modelValue<0:return 0;case i.value.modelValue>(d.value??100):return 100;default:return Math.round(i.value.modelValue/(d.value??100)*100)}}),h=F(()=>{if(p.value!==void 0)return n.orientation==="vertical"?{transform:`translateY(${n.inverted?"":"-"}${100-p.value}%)`}:u.value==="rtl"?{transform:`translateX(${n.inverted?"-":""}${100-p.value}%)`}:{transform:`translateX(${n.inverted?"":"-"}${100-p.value}%)`}}),m=F(()=>{const C=`${Math.max(p.value??0,0)}%`;return n.orientation==="vertical"?{height:C}:{width:C}});function g(C){return C===Number(n.modelValue)}function y(C){return C===0}function E(C){return C===d.value}function b(C){return C=Number(C),g(C)&&!y(C)?"active":y(C)&&g(C)?"first":E(C)&&g(C)?"last":"other"}const v=F(()=>Se({extend:Se(nz),...a.ui?.progress||{}})({animation:n.animation,size:n.size,color:n.color,orientation:n.orientation,inverted:n.inverted}));return(C,w)=>(D(),k(f(we),{as:e.as,"data-orientation":e.orientation,"data-slot":"root",class:U(v.value.root({class:[f(s)?.root,n.class]}))},{default:A(()=>[!c.value&&(e.status||r.status)?(D(),re("div",{key:0,"data-slot":"status",class:U(v.value.status({class:f(s)?.status})),style:mn(m.value)},[P(C.$slots,"status",{percent:p.value},()=>[Ke(Fe(p.value)+"% ",1)])],6)):Y("",!0),q(f(rP),j(f(i),{max:d.value,"data-slot":"base",class:v.value.base({class:f(s)?.base}),style:{transform:"translateZ(0)"}}),{default:A(()=>[q(f(aP),{"data-slot":"indicator",class:U(v.value.indicator({class:f(s)?.indicator})),style:mn(h.value)},null,8,["class","style"])]),_:1},16,["max","class"]),l.value?(D(),re("div",{key:1,"data-slot":"steps",class:U(v.value.steps({class:f(s)?.steps}))},[(D(!0),re(Ce,null,yt(e.max,(B,x)=>(D(),re("div",{key:x,"data-slot":"step",class:U(v.value.step({class:f(s)?.step,step:b(x)}))},[P(C.$slots,`step-${x}`,{step:B},()=>[Ke(Fe(B),1)])],2))),128))],2)):Y("",!0)]),_:3},8,["as","data-orientation","class"]))}},rz={slots:{root:"relative group overflow-hidden bg-default shadow-lg rounded-lg ring ring-default p-4 flex gap-2.5 focus:outline-none",wrapper:"w-0 flex-1 flex flex-col",title:"text-sm font-medium text-highlighted",description:"text-sm text-muted",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xl",actions:"flex gap-1.5 shrink-0",progress:"absolute inset-x-0 bottom-0",close:"p-0"},variants:{color:{primary:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary",icon:"text-primary"},secondary:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-secondary",icon:"text-secondary"},success:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-success",icon:"text-success"},info:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-info",icon:"text-info"},warning:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-warning",icon:"text-warning"},error:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-error",icon:"text-error"},neutral:{root:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-inverted",icon:"text-highlighted"}},orientation:{horizontal:{root:"items-center",actions:"items-center"},vertical:{root:"items-start",actions:"items-start mt-2.5"}},title:{true:{description:"mt-1"}}},defaultVariants:{color:"primary"}},uz={__name:"UToast",props:{as:{type:null,required:!1},title:{type:[String,Object,Function],required:!1},description:{type:[String,Object,Function],required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},orientation:{type:null,required:!1,default:"vertical"},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},actions:{type:Array,required:!1},progress:{type:[Boolean,Object],required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},type:{type:String,required:!1},duration:{type:Number,required:!1}},emits:["escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd","update:open"],setup(e,{expose:t,emit:n}){const o=e,r=n,u=qt(),{t:a}=Vo(),s=Pe(),i=Et("toast",o),c=it(Jt(o,"as","defaultOpen","open","duration","type"),r),l=F(()=>Se({extend:Se(rz),...s.ui?.toast||{}})({color:o.color,orientation:o.orientation,title:!!o.title||!!u.title})),d=rv("rootRef"),p=R(0);return $e(()=>{d.value?.$el?.getBoundingClientRect&&(p.value=d.value.$el.getBoundingClientRect().height)}),t({height:p}),(h,m)=>(D(),k(f(MP),j({ref_key:"rootRef",ref:d},f(c),{"data-orientation":e.orientation,"data-slot":"root",class:l.value.root({class:[f(i)?.root,o.class]}),style:{"--height":p.value}}),{default:A(({remaining:g,duration:y,open:E})=>[P(h.$slots,"leading",{ui:l.value},()=>[e.avatar?(D(),k(Ku,j({key:0,size:f(i)?.avatarSize||l.value.avatarSize()},e.avatar,{"data-slot":"avatar",class:l.value.avatar({class:f(i)?.avatar})}),null,16,["size","class"])):e.icon?(D(),k(st,{key:1,name:e.icon,"data-slot":"icon",class:U(l.value.icon({class:f(i)?.icon}))},null,8,["name","class"])):Y("",!0)]),je("div",{"data-slot":"wrapper",class:U(l.value.wrapper({class:f(i)?.wrapper}))},[e.title||u.title?(D(),k(f(IP),{key:0,"data-slot":"title",class:U(l.value.title({class:f(i)?.title}))},{default:A(()=>[P(h.$slots,"title",{},()=>[typeof e.title=="function"?(D(),k(Rt(e.title()),{key:0})):typeof e.title=="object"?(D(),k(Rt(e.title),{key:1})):(D(),re(Ce,{key:2},[Ke(Fe(e.title),1)],64))])]),_:3},8,["class"])):Y("",!0),e.description||u.description?(D(),k(f(SP),{key:1,"data-slot":"description",class:U(l.value.description({class:f(i)?.description}))},{default:A(()=>[P(h.$slots,"description",{},()=>[typeof e.description=="function"?(D(),k(Rt(e.description()),{key:0})):typeof e.description=="object"?(D(),k(Rt(e.description),{key:1})):(D(),re(Ce,{key:2},[Ke(Fe(e.description),1)],64))])]),_:3},8,["class"])):Y("",!0),e.orientation==="vertical"&&(e.actions?.length||u.actions)?(D(),re("div",{key:2,"data-slot":"actions",class:U(l.value.actions({class:f(i)?.actions}))},[P(h.$slots,"actions",{},()=>[(D(!0),re(Ce,null,yt(e.actions,(b,v)=>(D(),k(f(E4),{key:v,"alt-text":b.label||"Action","as-child":"",onClick:m[0]||(m[0]=On(()=>{},["stop"]))},{default:A(()=>[q(hn,j({size:"xs",color:e.color},{ref_for:!0},b),null,16,["color"])]),_:2},1032,["alt-text"]))),128))])],2)):Y("",!0)],2),e.orientation==="horizontal"&&(e.actions?.length||u.actions)||e.close?(D(),re("div",{key:0,"data-slot":"actions",class:U(l.value.actions({class:f(i)?.actions,orientation:"horizontal"}))},[e.orientation==="horizontal"&&(e.actions?.length||u.actions)?P(h.$slots,"actions",{key:0},()=>[(D(!0),re(Ce,null,yt(e.actions,(b,v)=>(D(),k(f(E4),{key:v,"alt-text":b.label||"Action","as-child":"",onClick:m[1]||(m[1]=On(()=>{},["stop"]))},{default:A(()=>[q(hn,j({size:"xs",color:e.color},{ref_for:!0},b),null,16,["color"])]),_:2},1032,["alt-text"]))),128))]):Y("",!0),e.close||u.close?(D(),k(f(Y1),{key:1,"as-child":""},{default:A(()=>[P(h.$slots,"close",{ui:l.value},()=>[e.close?(D(),k(hn,j({key:0,icon:e.closeIcon||f(s).ui.icons.close,color:"neutral",variant:"link","aria-label":f(a)("toast.close")},typeof e.close=="object"?e.close:{},{"data-slot":"close",class:l.value.close({class:f(i)?.close}),onClick:m[2]||(m[2]=On(()=>{},["stop"]))}),null,16,["icon","aria-label","class"])):Y("",!0)])]),_:3})):Y("",!0)],2)):Y("",!0),e.progress&&E&&g>0&&y?(D(),k(oz,j({key:1,"model-value":g/y*100,color:e.color},typeof e.progress=="object"?e.progress:{},{size:"sm","data-slot":"progress",class:l.value.progress({class:f(i)?.progress})}),null,16,["model-value","color","class"])):Y("",!0)]),_:3},16,["data-orientation","class","style"]))}},az={slots:{viewport:"fixed flex flex-col w-[calc(100%-2rem)] sm:w-96 z-[100] data-[expanded=true]:h-(--height) focus:outline-none",base:"pointer-events-auto absolute inset-x-0 z-(--index) transform-(--transform) data-[expanded=false]:data-[front=false]:h-(--front-height) data-[expanded=false]:data-[front=false]:*:opacity-0 data-[front=false]:*:transition-opacity data-[front=false]:*:duration-100 data-[state=closed]:animate-[toast-closed_200ms_ease-in-out] data-[state=closed]:data-[expanded=false]:data-[front=false]:animate-[toast-collapsed-closed_200ms_ease-in-out] data-[state=open]:data-[pulsing=odd]:animate-[toast-pulse-a_300ms_ease-out] data-[state=open]:data-[pulsing=even]:animate-[toast-pulse-b_300ms_ease-out] data-[swipe=move]:transition-none transition-[transform,translate,height] duration-200 ease-out"},variants:{position:{"top-left":{viewport:"left-4"},"top-center":{viewport:"left-1/2 transform -translate-x-1/2"},"top-right":{viewport:"right-4"},"bottom-left":{viewport:"left-4"},"bottom-center":{viewport:"left-1/2 transform -translate-x-1/2"},"bottom-right":{viewport:"right-4"}},swipeDirection:{up:"data-[swipe=end]:animate-[toast-slide-up_200ms_ease-out]",right:"data-[swipe=end]:animate-[toast-slide-right_200ms_ease-out]",down:"data-[swipe=end]:animate-[toast-slide-down_200ms_ease-out]",left:"data-[swipe=end]:animate-[toast-slide-left_200ms_ease-out]"}},compoundVariants:[{position:["top-left","top-center","top-right"],class:{viewport:"top-4",base:"top-0 data-[state=open]:animate-[toast-slide-in-from-top_200ms_ease-in-out]"}},{position:["bottom-left","bottom-center","bottom-right"],class:{viewport:"bottom-4",base:"bottom-0 data-[state=open]:animate-[toast-slide-in-from-bottom_200ms_ease-in-out]"}},{swipeDirection:["left","right"],class:"data-[swipe=move]:translate-x-(--reka-toast-swipe-move-x) data-[swipe=end]:translate-x-(--reka-toast-swipe-end-x) data-[swipe=cancel]:translate-x-0"},{swipeDirection:["up","down"],class:"data-[swipe=move]:translate-y-(--reka-toast-swipe-move-y) data-[swipe=end]:translate-y-(--reka-toast-swipe-end-y) data-[swipe=cancel]:translate-y-0"}],defaultVariants:{position:"bottom-right"}},sz={name:"Toaster"},iz=Object.assign(sz,{props:{position:{type:null,required:!1},expand:{type:Boolean,required:!1,default:!0},progress:{type:Boolean,required:!1,default:!0},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},max:{type:Number,required:!1,default:5},class:{type:null,required:!1},ui:{type:Object,required:!1},label:{type:String,required:!1},duration:{type:Number,required:!1,default:5e3},disableSwipe:{type:Boolean,required:!1},swipeThreshold:{type:Number,required:!1}},setup(e){const t=e,{toasts:n,remove:o}=Lb(),r=Pe(),u=Et("toaster",t);Pt(Rb,Ye(()=>t.max));const a=ln(Jt(t,"duration","label","swipeThreshold","disableSwipe")),s=tu(Ye(()=>t.portal)),i=F(()=>{switch(t.position){case"top-center":return"up";case"top-right":case"bottom-right":return"right";case"bottom-center":return"down";case"top-left":case"bottom-left":return"left"}return"right"}),c=F(()=>Se({extend:Se(az),...r.ui?.toaster||{}})({position:t.position,swipeDirection:i.value}));function l(E,b){E||o(b)}const d=R(!1),p=F(()=>t.expand||d.value),h=R([]),m=F(()=>h.value.reduce((E,{height:b})=>E+b+16,0)),g=F(()=>h.value[h.value.length-1]?.height||0);function y(E){return h.value.slice(E+1).reduce((b,{height:v})=>b+v+16,0)}return(E,b)=>(D(),k(f(hP),j({"swipe-direction":i.value},f(a)),{default:A(()=>[P(E.$slots,"default"),(D(!0),re(Ce,null,yt(f(n),(v,C)=>(D(),k(uz,j({key:v.id,ref_for:!0,ref_key:"refs",ref:h,progress:e.progress},{ref_for:!0},f(ms)(v,["id","close","_duplicate","_updated"]),{close:v.close,"data-expanded":p.value,"data-front":!p.value&&C===f(n).length-1,"data-pulsing":v._duplicate?v._duplicate%2===0?"even":"odd":void 0,style:{"--index":C-f(n).length+f(n).length,"--before":f(n).length-1-C,"--offset":y(C),"--scale":p.value?"1":"calc(1 - var(--before) * var(--scale-factor))","--translate":p.value?"calc(var(--offset) * var(--translate-factor))":"calc(var(--before) * var(--gap))","--transform":"translateY(var(--translate)) scale(var(--scale))"},"data-slot":"base",class:c.value.base({class:[f(u)?.base,v.onClick?"cursor-pointer":void 0]}),"onUpdate:open":w=>l(w,v.id),onClick:w=>v.onClick&&v.onClick(v)}),null,16,["progress","close","data-expanded","data-front","data-pulsing","style","class","onUpdate:open","onClick"]))),128)),q(f(FP),me(xe(f(s))),{default:A(()=>[q(f(qP),{"data-expanded":p.value,"data-slot":"viewport",class:U(c.value.viewport({class:[f(u)?.viewport,t.class]})),style:mn({"--scale-factor":"0.05","--translate-factor":e.position?.startsWith("top")?"1px":"-1px","--gap":e.position?.startsWith("top")?"16px":"-16px","--front-height":`${g.value}px`,"--height":`${m.value}px`}),onMouseenter:b[0]||(b[0]=v=>d.value=!0),onMouseleave:b[1]||(b[1]=v=>d.value=!1)},null,8,["data-expanded","class","style"])]),_:1},16)]),_:3},16,["swipe-direction"]))}}),lz=Object.assign(iz,{__name:"UToaster"});function cz(){const e=Pn([]),t=(c,l)=>{const{props:d,defaultOpen:p,destroyOnClose:h}=l||{},m=_t({id:Symbol(""),isOpen:!!p,component:_d(c),isMounted:!!p,destroyOnClose:!!h,originalProps:d||{},props:{...d}});return e.push(m),{...m,open:g=>n(m.id,g),close:g=>o(m.id,g),patch:g=>a(m.id,g)}},n=(c,l)=>{const d=s(c);l?d.props={...d.originalProps,...l}:d.props={...d.originalProps},d.isOpen=!0,d.isMounted=!0;const p=new Promise(h=>d.resolvePromise=h);return Object.assign(p,{id:c,isMounted:d.isMounted,isOpen:d.isOpen,result:p})},o=(c,l)=>{const d=s(c);d.isOpen=!1,d.resolvePromise&&(d.resolvePromise(l),d.resolvePromise=void 0)},r=()=>{e.forEach(c=>o(c.id))},u=c=>{const l=s(c);if(l.isMounted=!1,l.destroyOnClose){const d=e.findIndex(p=>p.id===c);e.splice(d,1)}},a=(c,l)=>{const d=s(c);d.props={...d.props,...l}},s=c=>{const l=e.find(d=>d.id===c);if(!l)throw new Error("Overlay not found");return l};return{overlays:e,open:n,close:o,closeAll:r,create:t,patch:a,unmount:u,isOpen:c=>s(c).isOpen}}const dz=Nu(cz),fz={__name:"UOverlayProvider",setup(e){const{overlays:t,unmount:n,close:o}=dz(),r=F(()=>t.filter(s=>s.isMounted)),u=s=>{o(s),n(s)},a=(s,i)=>{o(s,i)};return(s,i)=>(D(!0),re(Ce,null,yt(r.value,c=>(D(),k(Rt(c.component),j({key:c.id},{ref_for:!0},c.props,{open:c.isOpen,"onUpdate:open":l=>c.isOpen=l,onClose:l=>a(c.id,l),"onAfter:leave":l=>u(c.id)}),null,16,["open","onUpdate:open","onClose","onAfter:leave"]))),128))}},pz={name:"App"},hz=Object.assign(pz,{props:{tooltip:{type:Object,required:!1},toaster:{type:[Object,null],required:!1},locale:{type:Object,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:"body"},dir:{type:String,required:!1},scrollBody:{type:[Boolean,Object],required:!1},nonce:{type:String,required:!1}},setup(e){const t=e,n=ln(Jt(t,"scrollBody")),o=Ye(()=>t.tooltip),r=Ye(()=>t.toaster),u=Ye(()=>t.locale);return Pt(tb,u),Pt(Fb,Ye(()=>t.portal)),(s,i)=>(D(),k(f(V_),j({"use-id":()=>Td(),dir:t.dir||u.value?.dir,locale:u.value?.code},f(n)),{default:A(()=>[q(f(zP),me(xe(o.value)),{default:A(()=>[e.toaster!==null?(D(),k(lz,me(j({key:0},r.value)),{default:A(()=>[P(s.$slots,"default")]),_:3},16)):P(s.$slots,"default",{key:1}),q(fz)]),_:3},16)]),_:3},16,["use-id","dir","locale"]))}}),WE=Object.assign(hz,{__name:"UApp"}),mz=be({name:"العربية",code:"ar",dir:"rtl",messages:{alert:{close:"إغلاق"},authForm:{hidePassword:"إخفاء كلمة المرور",showPassword:"إظهار كلمة المرور",submit:"متابعة"},banner:{close:"إغلاق"},calendar:{nextMonth:"الشهر المقبل",nextYear:"السنة المقبلة",prevMonth:"الشهر السابق",prevYear:"السنة السابقة"},carousel:{dots:"اختر الشريحة المراد عرضها",goto:"الذهاب إلى شريحة {slide}",next:"التالي",prev:"السابق"},chatPrompt:{placeholder:"اكتب رسالتك هنا…"},chatPromptSubmit:{label:"إرسال"},chatReasoning:{thinking:"يفكّر…",thought:"فكّر",thoughtFor:"فكّر لمدة {duration}"},colorMode:{dark:"داكن",light:"فاتح",switchToDark:"التبديل إلى الوضع الداكن",switchToLight:"التبديل إلى الوضع الفاتح",system:"النظام"},commandPalette:{back:"رجوع",close:"إغلاق",noData:"لا توجد بيانات",noMatch:"لا توجد نتائج مطابقة",placeholder:"اكتب أمرًا أو ابحث…"},contentSearch:{links:"الروابط",theme:"السمة"},contentSearchButton:{label:"بحث…"},contentToc:{title:"في هذه الصفحة"},dropdownMenu:{noMatch:"لا توجد نتائج مطابقة",search:"بحث…"},dashboardSearch:{theme:"السمة"},dashboardSearchButton:{label:"بحث…"},dashboardSidebarCollapse:{collapse:"طي الشريط الجانبي",expand:"توسيع الشريط الجانبي"},dashboardSidebarToggle:{close:"إغلاق الشريط الجانبي",open:"فتح الشريط الجانبي"},error:{clear:"العودة إلى الصفحة الرئيسية"},fileUpload:{removeFile:"إزالة {filename}"},header:{close:"إغلاق القائمة",open:"فتح القائمة"},inputMenu:{create:'إنشاء "{label}"',noData:"لا توجد بيانات",noMatch:"لا توجد نتائج مطابقة"},inputNumber:{decrement:"تقليل",increment:"زيادة"},modal:{close:"إغلاق"},pricingTable:{caption:"مقارنة الخطط السعرية"},prose:{codeCollapse:{closeText:"طي",name:"كود",openText:"توسيع"},collapsible:{closeText:"إخفاء",name:"خصائص",openText:"إظهار"},pre:{copy:"نسخ الكود إلى الحافظة"}},sidebar:{close:"إغلاق",toggle:"تبديل"},selectMenu:{create:'إنشاء "{label}"',noData:"لا توجد بيانات",noMatch:"لا توجد نتائج مطابقة",search:"بحث…"},slideover:{close:"إغلاق"},table:{noData:"لا توجد بيانات"},toast:{close:"إغلاق"}}}),gz=be({name:"Azərbaycanca",code:"az",messages:{alert:{close:"Bağla"},authForm:{hidePassword:"Şifrəni gizlət",showPassword:"Şifrəni göstər",submit:"Davam et"},banner:{close:"Bağla"},calendar:{nextMonth:"Növbəti ay",nextYear:"Növbəti il",prevMonth:"Əvvəlki ay",prevYear:"Əvvəlki il"},carousel:{dots:"Göstərmək üçün slayd seçin",goto:"Slayd {slide} keç",next:"Növbəti",prev:"Əvvəlki"},chatPrompt:{placeholder:"Buraya mesajınızı yazın…"},chatPromptSubmit:{label:"Göndər"},chatReasoning:{thinking:"Düşünür…",thought:"Düşündü",thoughtFor:"{duration} düşündü"},colorMode:{dark:"Qaranlıq",light:"İşıqlı",switchToDark:"Qaranlıq rejimə keç",switchToLight:"İşıqlı rejimə keç",system:"Sistem"},commandPalette:{back:"Geri",close:"Bağla",noData:"Məlumat yoxdur",noMatch:"Uyğun məlumat tapılmadı",placeholder:"Əmr daxil edin və ya axtarın…"},contentSearch:{links:"Bağlantılar",theme:"Tema"},contentSearchButton:{label:"Axtar…"},contentToc:{title:"Bu səhifədə"},dropdownMenu:{noMatch:"Uyğun məlumat tapılmadı",search:"Axtar…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Axtar…"},dashboardSidebarCollapse:{collapse:"Yan paneli daralt",expand:"Yan paneli genişlət"},dashboardSidebarToggle:{close:"Yan paneli bağla",open:"Yan paneli aç"},error:{clear:"Ana səhifəyə qayıt"},fileUpload:{removeFile:"{filename} sil"},header:{close:"Menyunu bağla",open:"Menyunu aç"},inputMenu:{create:'"{label}" yarat',noData:"Məlumat yoxdur",noMatch:"Uyğun məlumat tapılmadı"},inputNumber:{decrement:"Azalt",increment:"Artır"},modal:{close:"Bağla"},pricingTable:{caption:"Qiymət planlarının müqayisəsi"},prose:{codeCollapse:{closeText:"Daralt",name:"kod",openText:"Genişlət"},collapsible:{closeText:"Gizlət",name:"xüsusiyyətlər",openText:"Göstər"},pre:{copy:"Kodu buferə kopyala"}},sidebar:{close:"Bağla",toggle:"Dəyişdir"},selectMenu:{create:'"{label}" yarat',noData:"Məlumat yoxdur",noMatch:"Uyğun məlumat tapılmadı",search:"Axtar…"},slideover:{close:"Bağla"},table:{noData:"Məlumat yoxdur"},toast:{close:"Bağla"}}}),vz=be({name:"Беларуская",code:"be",messages:{alert:{close:"Закрыць"},authForm:{hidePassword:"Схаваць пароль",showPassword:"Паказаць пароль",submit:"Працягнуць"},banner:{close:"Закрыць"},calendar:{nextMonth:"Наступны месяц",nextYear:"Наступны год",prevMonth:"Папярэдні месяц",prevYear:"Папярэдні год"},carousel:{dots:"Выберыце слайд для адлюстравання",goto:"Перайсці да {slide}",next:"Далей",prev:"Назад"},chatPrompt:{placeholder:"Увядзіце сваё паведамленне тут…"},chatPromptSubmit:{label:"Адправіць"},chatReasoning:{thinking:"Думае…",thought:"Падумаў",thoughtFor:"Думаў {duration}"},colorMode:{dark:"Цёмная",light:"Светлая",switchToDark:"Пераключыцца на цёмны рэжым",switchToLight:"Пераключыцца на светлы рэжым",system:"Сістэмная"},commandPalette:{back:"Назад",close:"Закрыць",noData:"Няма даных",noMatch:"Супадзенняў не знойдзена",placeholder:"Увядзіце каманду або выканайце пошук…"},contentSearch:{links:"Спасылкі",theme:"Тэма"},contentSearchButton:{label:"Пошук…"},contentToc:{title:"На гэтай старонцы"},dropdownMenu:{noMatch:"Супадзенняў не знойдзена",search:"Пошук…"},dashboardSearch:{theme:"Тэма"},dashboardSearchButton:{label:"Пошук…"},dashboardSidebarCollapse:{collapse:"Згарнуць бакавую панэль",expand:"Разгарнуць бакавую панэль"},dashboardSidebarToggle:{close:"Закрыць бакавую панэль",open:"Адкрыць бакавую панэль"},error:{clear:"Вярнуцца на галоўную"},fileUpload:{removeFile:"Выдаліць {filename}"},header:{close:"Закрыць меню",open:"Адкрыць меню"},inputMenu:{create:'Стварыць "{label}"',noData:"Няма даных",noMatch:"Супадзенняў не знойдзена"},inputNumber:{decrement:"Паменшыць",increment:"Павялічыць"},modal:{close:"Закрыць"},pricingTable:{caption:"Параўнанне платных планаў"},prose:{codeCollapse:{closeText:"Згарнуць",name:"код",openText:"Разгарнуць"},collapsible:{closeText:"Схаваць",name:"уласцівасці",openText:"Паказаць"},pre:{copy:"Скапіяваць код у буфер абмену"}},sidebar:{close:"Закрыць",toggle:"Пераключыць"},selectMenu:{create:'Стварыць "{label}"',noData:"Няма даных",noMatch:"Супадзенняў не знойдзена",search:"Пошук…"},slideover:{close:"Закрыць"},table:{noData:"Няма даных"},toast:{close:"Закрыць"}}}),yz=be({name:"Български",code:"bg",messages:{alert:{close:"Затворете"},authForm:{hidePassword:"Скрий паролата",showPassword:"Покажи паролата",submit:"Продължи"},banner:{close:"Затвори"},calendar:{nextMonth:"Следващ месец",nextYear:"Следваща година",prevMonth:"Предишен месец",prevYear:"Предишна година"},carousel:{dots:"Изберете слайд за показване",goto:"Отидете на слайд {slide}",next:"Напред",prev:"Назад"},chatPrompt:{placeholder:"Въведете съобщение…"},chatPromptSubmit:{label:"Изпрати"},chatReasoning:{thinking:"Мисли…",thought:"Помисли",thoughtFor:"Мислил {duration}"},colorMode:{dark:"Тъмно",light:"Светло",switchToDark:"Превключи към тъмен режим",switchToLight:"Превключи към светъл режим",system:"Система"},commandPalette:{back:"Назад",close:"Затворете",noData:"Няма данни",noMatch:"Няма съвпадение на данни",placeholder:"Въведете команда или потърсете…"},contentSearch:{links:"Връзки",theme:"Тема"},contentSearchButton:{label:"Търсене"},contentToc:{title:"Съдържание"},dropdownMenu:{noMatch:"Няма съвпадение на данни",search:"Потърсете…"},dashboardSearch:{theme:"Тема"},dashboardSearchButton:{label:"Търсене"},dashboardSidebarCollapse:{collapse:"Свий",expand:"Разшири"},dashboardSidebarToggle:{close:"Затвори",open:"Отвори"},error:{clear:"Изчисти"},fileUpload:{removeFile:"Премахни {filename}"},header:{close:"Затвори",open:"Отвори"},inputMenu:{create:'Създайте "{label}"',noData:"Няма данни",noMatch:"Няма съвпадение на данни"},inputNumber:{decrement:"Намаляване",increment:"Увеличаване"},modal:{close:"Затворете"},pricingTable:{caption:"Ценова таблица"},prose:{codeCollapse:{closeText:"Сгъни",name:"код",openText:"Разгъни"},collapsible:{closeText:"Скрий",name:"свойства",openText:"Покажи"},pre:{copy:"Копирай кода в клипборда"}},sidebar:{close:"Затворете",toggle:"Превключване"},selectMenu:{create:'Създайте "{label}"',noData:"Няма данни",noMatch:"Няма съвпадение на данни",search:"Потърсете…"},slideover:{close:"Затворете"},table:{noData:"Няма данни"},toast:{close:"Затворете"}}}),bz=be({name:"বাংলা",code:"bn",messages:{alert:{close:"বন্ধ করুন"},authForm:{hidePassword:"পাসওয়ার্ড লুকান",showPassword:"পাসওয়ার্ড দেখান",submit:"চালিয়ে যান"},banner:{close:"বন্ধ করুন"},calendar:{nextMonth:"পরবর্তী মাস",nextYear:"পরবর্তী বছর",prevMonth:"পূর্ববর্তী মাস",prevYear:"পূর্ববর্তী বছর"},carousel:{dots:"প্রদর্শনের জন্য স্লাইড নির্বাচন করুন",goto:"স্লাইড {slide} এ যান",next:"পরবর্তী",prev:"পূর্ববর্তী"},chatPrompt:{placeholder:"এখানে আপনার বার্তা লিখুন…"},chatPromptSubmit:{label:"প্রেরণ করুন"},chatReasoning:{thinking:"ভাবছে…",thought:"ভেবেছে",thoughtFor:"{duration} ভেবেছে"},colorMode:{dark:"গাঢ়",light:"হালকা",switchToDark:"গাঢ় মোডে পরিবর্তন করুন",switchToLight:"হালকা মোডে পরিবর্তন করুন",system:"সিস্টেম"},commandPalette:{back:"পেছনে",close:"বন্ধ করুন",noData:"কোন তথ্য নেই",noMatch:"কোন মিল পাওয়া যায়নি",placeholder:"কমান্ড টাইপ করুন বা অনুসন্ধান করুন…"},contentSearch:{links:"লিংকসমূহ",theme:"থিম"},contentSearchButton:{label:"অনুসন্ধান করুন…"},contentToc:{title:"এই পৃষ্ঠায়"},dropdownMenu:{noMatch:"কোন মিল পাওয়া যায়নি",search:"অনুসন্ধান করুন…"},dashboardSearch:{theme:"থিম"},dashboardSearchButton:{label:"অনুসন্ধান করুন…"},dashboardSidebarCollapse:{collapse:"সাইডবার সংকুচিত করুন",expand:"সাইডবার প্রসারিত করুন"},dashboardSidebarToggle:{close:"সাইডবার বন্ধ করুন",open:"সাইডবার খুলুন"},error:{clear:"হোম পেজে ফিরে যান"},fileUpload:{removeFile:"{filename} সরান"},header:{close:"মেনু বন্ধ করুন",open:"মেনু খুলুন"},inputMenu:{create:'"{label}" তৈরি করুন',noData:"কোন তথ্য নেই",noMatch:"কোন মিল পাওয়া যায়নি"},inputNumber:{decrement:"হ্রাস করুন",increment:"বৃদ্ধি করুন"},modal:{close:"বন্ধ করুন"},pricingTable:{caption:"প্রাইসিং প্ল্যানের তুলনা"},prose:{codeCollapse:{closeText:"সংকুচিত করুন",name:"কোড",openText:"প্রসারিত করুন"},collapsible:{closeText:"লুকান",name:"বৈশিষ্ট্যসমূহ",openText:"দেখান"},pre:{copy:"কোড ক্লিপবোর্ডে কপি করুন"}},sidebar:{close:"বন্ধ করুন",toggle:"টগল করুন"},selectMenu:{create:'"{label}" তৈরি করুন',noData:"কোন তথ্য নেই",noMatch:"কোন মিল পাওয়া যায়নি",search:"অনুসন্ধান করুন…"},slideover:{close:"বন্ধ করুন"},table:{noData:"কোন তথ্য নেই"},toast:{close:"বন্ধ করুন"}}}),Ez=be({name:"Català",code:"ca",messages:{alert:{close:"Tancar"},authForm:{hidePassword:"Amagar contrasenya",showPassword:"Mostrar contrasenya",submit:"Continuar"},banner:{close:"Tancar"},calendar:{nextMonth:"Mes següent",nextYear:"Any següent",prevMonth:"Mes anterior",prevYear:"Any anterior"},carousel:{dots:"Tria la diapositiva a mostrar",goto:"Anar a la diapositiva {slide}",next:"Següent",prev:"Anterior"},chatPrompt:{placeholder:"Escriu el teu missatge aquí…"},chatPromptSubmit:{label:"Enviar"},chatReasoning:{thinking:"Pensant…",thought:"Ha pensat",thoughtFor:"Ha pensat durant {duration}"},colorMode:{dark:"Fosc",light:"Clar",switchToDark:"Canviar a mode fosc",switchToLight:"Canviar a mode clar",system:"Sistema"},commandPalette:{back:"Enrere",close:"Tancar",noData:"Sense dades",noMatch:"No hi ha dades coincidents",placeholder:"Escriu una ordre o cerca…"},contentSearch:{links:"Enllaços",theme:"Tema"},contentSearchButton:{label:"Cercar…"},contentToc:{title:"En aquesta pàgina"},dropdownMenu:{noMatch:"No hi ha dades coincidents",search:"Cerca…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Cercar…"},dashboardSidebarCollapse:{collapse:"Contraure barra lateral",expand:"Expandir barra lateral"},dashboardSidebarToggle:{close:"Tancar barra lateral",open:"Obrir barra lateral"},error:{clear:"Tornar a l'inici"},fileUpload:{removeFile:"Eliminar {filename}"},header:{close:"Tancar menú",open:"Obrir menú"},inputMenu:{create:'Crear "{label}"',noData:"Sense dades",noMatch:"No hi ha dades coincidents"},inputNumber:{decrement:"Decrementar",increment:"Incrementar"},modal:{close:"Tancar"},pricingTable:{caption:"Comparació de plans de preu"},prose:{codeCollapse:{closeText:"Replega",name:"codi",openText:"Desplega"},collapsible:{closeText:"Amaga",name:"propietats",openText:"Mostra"},pre:{copy:"Copiar codi al portapapers"}},sidebar:{close:"Tancar",toggle:"Canviar"},selectMenu:{create:'Crear "{label}"',noData:"Sense dades",noMatch:"No hi ha dades coincidents",search:"Cerca…"},slideover:{close:"Tancar"},table:{noData:"Sense dades"},toast:{close:"Tancar"}}}),Cz=be({name:"کوردی",code:"ckb",dir:"rtl",messages:{alert:{close:"داخستن"},authForm:{hidePassword:"شاردنەوەی تێپەڕەوشە",showPassword:"پیشاندانی تێپەڕەوشە",submit:"بەردەوام بە"},banner:{close:"داخستن"},calendar:{nextMonth:"مانگی داهاتوو",nextYear:"ساڵی داهاتوو",prevMonth:"مانگی پێشوو",prevYear:"ساڵی پێشوو"},carousel:{dots:"سلایدێک هەڵبژێرە بۆ پیشاندان",goto:"بڕۆ بۆ سلایدی {slide}",next:"دواتر",prev:"پێشتر"},chatPrompt:{placeholder:"نامەکەت لێرە بنوسە..."},chatPromptSubmit:{label:"ناردن"},chatReasoning:{thinking:"بیرکردنەوە…",thought:"بیری کردەوە",thoughtFor:"بە ماوەی {duration} بیری کردەوە"},colorMode:{dark:"تاریک",light:"ڕووناک",switchToDark:"گۆڕین بۆ دۆخی تاریک",switchToLight:"گۆڕین بۆ دۆخی ڕووناک",system:"سیستەم"},commandPalette:{back:"گەڕانەوە",close:"داخستن",noData:"هیچ داتایەک نییە",noMatch:"هیچ ئەنجامێک نەدۆزرایەوە",placeholder:"فەرمانێک بنووسە یان بگەڕێ…"},contentSearch:{links:"بەستەرەکان",theme:"ڕووکار"},contentSearchButton:{label:"گەڕان…"},contentToc:{title:"لەم پەڕەیەدا"},dropdownMenu:{noMatch:"هیچ ئەنجامێک نەدۆزرایەوە",search:"گەڕان…"},dashboardSearch:{theme:"ڕووکار"},dashboardSearchButton:{label:"گەڕان…"},dashboardSidebarCollapse:{collapse:"داخستنی لای تەنیشت",expand:"فراوانکردنی لای تەنیشت"},dashboardSidebarToggle:{close:"داخستنی لاتەنیشت",open:"کردنەوەی لاتەنیشت"},error:{clear:"گەڕانەوە بۆ سەرەتا"},fileUpload:{removeFile:"{filename} بسڕەوە"},header:{close:"داخستنی پێڕست",open:"کردنەوەی پێڕست"},inputMenu:{create:'"{label}" زیادکردنی',noData:"هیچ داتایەک نییە",noMatch:"هیچ ئەنجامێک نەدۆزرایەوە"},inputNumber:{decrement:"کەمکردنەوە",increment:"زیادکردن"},modal:{close:"داخستن"},pricingTable:{caption:"بەراورکردنی پلانی نرخدانان"},prose:{codeCollapse:{closeText:"داخستن",name:"کۆد",openText:"فراوانکردن"},collapsible:{closeText:"شاردنەوە",name:"تایبەتمەندییەکان",openText:"پیشاندان"},pre:{copy:"لەبەرگرتنەوەی کۆد"}},sidebar:{close:"داخستن",toggle:"گۆڕین"},selectMenu:{create:'"{label}" زیادکردنی',noData:"هیچ داتایەک نییە",noMatch:"هیچ ئەنجامێک نەدۆزرایەوە",search:"گەڕان…"},slideover:{close:"داخستن"},table:{noData:"هیچ داتایەک نییە"},toast:{close:"داخستن"}}}),xz=be({name:"Čeština",code:"cs",messages:{alert:{close:"Zavřít"},authForm:{hidePassword:"Skrýt heslo",showPassword:"Zobrazit heslo",submit:"Pokračovat"},banner:{close:"Zavřít"},calendar:{nextMonth:"Další měsíc",nextYear:"Další rok",prevMonth:"Předchozí měsíc",prevYear:"Předchozí rok"},carousel:{dots:"Vyberte snímek k zobrazení",goto:"Přejít na {slide}",next:"Další",prev:"Předchozí"},chatPrompt:{placeholder:"Zde napište svůj text…"},chatPromptSubmit:{label:"Odeslat"},chatReasoning:{thinking:"Přemýšlí…",thought:"Přemýšlel",thoughtFor:"Přemýšlel {duration}"},colorMode:{dark:"Tmavý",light:"Světlý",switchToDark:"Přepnout na tmavý režim",switchToLight:"Přepnout na světlý režim",system:"Systémový"},commandPalette:{back:"Zpět",close:"Zavřít",noData:"Žádná data",noMatch:"Žádná shoda",placeholder:"Zadejte příkaz nebo hledejte…"},contentSearch:{links:"Odkazy",theme:"Barevný režim"},contentSearchButton:{label:"Hledat…"},contentToc:{title:"Na této stránce"},dropdownMenu:{noMatch:"Žádná shoda",search:"Hledat…"},dashboardSearch:{theme:"Barevný režim"},dashboardSearchButton:{label:"Hledat…"},dashboardSidebarCollapse:{collapse:"Sbalit postranní panel",expand:"Rozbalit postranní panel"},dashboardSidebarToggle:{close:"Zavřít postranní panel",open:"Otevřít postranní panel"},error:{clear:"Zpět na úvod"},fileUpload:{removeFile:"Odebrat {filename}"},header:{close:"Zavřít menu",open:"Otevřít menu"},inputMenu:{create:'Vytvořit "{label}"',noData:"Žádná data",noMatch:"Žádná shoda"},inputNumber:{decrement:"Snížit",increment:"Zvýšit"},modal:{close:"Zavřít"},pricingTable:{caption:"Porovnání cenových plánů"},prose:{codeCollapse:{closeText:"Sbalit",name:"kód",openText:"Rozbalit"},collapsible:{closeText:"Skrýt",name:"vlastnosti",openText:"Zobrazit"},pre:{copy:"Kopírovat kód do schránky"}},sidebar:{close:"Zavřít",toggle:"Přepnout"},selectMenu:{create:'Vytvořit "{label}"',noData:"Žádná data",noMatch:"Žádná shoda",search:"Hledat…"},slideover:{close:"Zavřít"},table:{noData:"Žádná data"},toast:{close:"Zavřít"}}}),wz=be({name:"Danish",code:"da",messages:{alert:{close:"Luk"},authForm:{hidePassword:"Skjul adgangskode",showPassword:"Vis adgangskode",submit:"Fortsæt"},banner:{close:"Luk"},calendar:{nextMonth:"Næste måned",nextYear:"Næste år",prevMonth:"Forrige måned",prevYear:"Forrige år"},carousel:{dots:"Vælg dias til visning",goto:"Gå til slide {slide}",next:"Næste",prev:"Forrige"},chatPrompt:{placeholder:"Skriv din besked her…"},chatPromptSubmit:{label:"Send"},chatReasoning:{thinking:"Tænker…",thought:"Tænkte",thoughtFor:"Tænkte i {duration}"},colorMode:{dark:"Mørk",light:"Lys",switchToDark:"Skift til mørk tilstand",switchToLight:"Skift til lys tilstand",system:"System"},commandPalette:{back:"Tilbage",close:"Luk",noData:"Ingen data",noMatch:"Ingen matchende data",placeholder:"Skriv en kommando eller søg…"},contentSearch:{links:"Links",theme:"Tema"},contentSearchButton:{label:"Søg…"},contentToc:{title:"På denne side"},dropdownMenu:{noMatch:"Ingen matchende data",search:"Søg…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Søg…"},dashboardSidebarCollapse:{collapse:"Sammenfold sidemenu",expand:"Udvid sidemenu"},dashboardSidebarToggle:{close:"Luk sidemenu",open:"Åbn sidemenu"},error:{clear:"Tilbage til forsiden"},fileUpload:{removeFile:"Fjern {filename}"},header:{close:"Luk menu",open:"Åbn menu"},inputMenu:{create:'Opret "{label}"',noData:"Ingen data",noMatch:"Ingen matchende data"},inputNumber:{decrement:"Reducer",increment:"Øg"},modal:{close:"Luk"},pricingTable:{caption:"Prisplaneringssammenligning"},prose:{codeCollapse:{closeText:"Sammenfold",name:"kode",openText:"Udvid"},collapsible:{closeText:"Skjul",name:"egenskaber",openText:"Vis"},pre:{copy:"Kopiér kode til udklipsholder"}},sidebar:{close:"Luk",toggle:"Skift"},selectMenu:{create:'Opret "{label}"',noData:"Ingen data",noMatch:"Ingen matchende data",search:"Søg…"},slideover:{close:"Luk"},table:{noData:"Ingen data"},toast:{close:"Luk"}}}),Dz=be({name:"Deutsch",code:"de",messages:{alert:{close:"Schließen"},authForm:{hidePassword:"Passwort verbergen",showPassword:"Passwort anzeigen",submit:"Weiter"},banner:{close:"Schließen"},calendar:{nextMonth:"Nächster Monat",nextYear:"Nächstes Jahr",prevMonth:"Vorheriger Monat",prevYear:"Vorheriges Jahr"},carousel:{dots:"Folie zur Anzeige auswählen",goto:"Gehe zu {slide}",next:"Weiter",prev:"Zurück"},chatPrompt:{placeholder:"Hier schreiben Sie Ihre Nachricht…"},chatPromptSubmit:{label:"Senden"},chatReasoning:{thinking:"Denkt nach…",thought:"Nachgedacht",thoughtFor:"{duration} nachgedacht"},colorMode:{dark:"Dunkel",light:"Hell",switchToDark:"Zum dunklen Modus wechseln",switchToLight:"Zum hellen Modus wechseln",system:"System"},commandPalette:{back:"Zurück",close:"Schließen",noData:"Keine Daten",noMatch:"Nichts gefunden",placeholder:"Geben Sie einen Befehl ein oder suchen Sie…"},contentSearch:{links:"Links",theme:"Thema"},contentSearchButton:{label:"Suchen…"},contentToc:{title:"Auf dieser Seite"},dropdownMenu:{noMatch:"Nichts gefunden",search:"Suchen…"},dashboardSearch:{theme:"Thema"},dashboardSearchButton:{label:"Suchen…"},dashboardSidebarCollapse:{collapse:"Seitenleiste einklappen",expand:"Seitenleiste erweitern"},dashboardSidebarToggle:{close:"Seitenleiste schließen",open:"Seitenleiste öffnen"},error:{clear:"Zurück zur Startseite"},fileUpload:{removeFile:"{filename} entfernen"},header:{close:"Menü schließen",open:"Menü öffnen"},inputMenu:{create:'"{label}" erstellen',noData:"Keine Daten",noMatch:"Nichts gefunden"},inputNumber:{decrement:"Verringern",increment:"Erhöhen"},modal:{close:"Schließen"},pricingTable:{caption:"Preisplanvergleich"},prose:{codeCollapse:{closeText:"Reduzieren",name:"Code",openText:"Erweitern"},collapsible:{closeText:"Ausblenden",name:"Eigenschaften",openText:"Anzeigen"},pre:{copy:"Code in die Zwischenablage kopieren"}},sidebar:{close:"Schließen",toggle:"Umschalten"},selectMenu:{create:'"{label}" erstellen',noData:"Keine Daten",noMatch:"Nichts gefunden",search:"Suchen…"},slideover:{close:"Schließen"},table:{noData:"Keine Daten"},toast:{close:"Schließen"}}}),Az=be({name:"Schweizerdeutsch",code:"de-CH",messages:{alert:{close:"Schliessen"},authForm:{hidePassword:"Passwort verbergen",showPassword:"Passwort anzeigen",submit:"Weiter"},banner:{close:"Schliessen"},calendar:{nextMonth:"Nächster Monat",nextYear:"Nächstes Jahr",prevMonth:"Vorheriger Monat",prevYear:"Vorheriges Jahr"},carousel:{dots:"Folie zur Anzeige auswählen",goto:"Gehe zu {slide}",next:"Weiter",prev:"Zurück"},chatPrompt:{placeholder:"Hier schreiben Sie Ihre Nachricht…"},chatPromptSubmit:{label:"Senden"},chatReasoning:{thinking:"Denkt nach…",thought:"Nachgedacht",thoughtFor:"{duration} nachgedacht"},colorMode:{dark:"Dunkel",light:"Hell",switchToDark:"Zum dunklen Modus wechseln",switchToLight:"Zum hellen Modus wechseln",system:"System"},commandPalette:{back:"Zurück",close:"Schliessen",noData:"Keine Daten",noMatch:"Nichts gefunden",placeholder:"Geben Sie einen Befehl ein oder suchen Sie…"},contentSearch:{links:"Links",theme:"Thema"},contentSearchButton:{label:"Suchen…"},contentToc:{title:"Auf dieser Seite"},dropdownMenu:{noMatch:"Nichts gefunden",search:"Suchen…"},dashboardSearch:{theme:"Thema"},dashboardSearchButton:{label:"Suchen…"},dashboardSidebarCollapse:{collapse:"Seitenleiste einklappen",expand:"Seitenleiste erweitern"},dashboardSidebarToggle:{close:"Seitenleiste schliessen",open:"Seitenleiste öffnen"},error:{clear:"Zurück zur Startseite"},fileUpload:{removeFile:"{filename} entfernen"},header:{close:"Menü schliessen",open:"Menü öffnen"},inputMenu:{create:'"{label}" erstellen',noData:"Keine Daten",noMatch:"Nichts gefunden"},inputNumber:{decrement:"Verringern",increment:"Erhöhen"},modal:{close:"Schliessen"},pricingTable:{caption:"Preisplanvergleich"},prose:{codeCollapse:{closeText:"Reduzieren",name:"Code",openText:"Erweitern"},collapsible:{closeText:"Ausblenden",name:"Eigenschaften",openText:"Anzeigen"},pre:{copy:"Code in die Zwischenablage kopieren"}},sidebar:{close:"Schliessen",toggle:"Umschalten"},selectMenu:{create:'"{label}" erstellen',noData:"Keine Daten",noMatch:"Nichts gefunden",search:"Suchen…"},slideover:{close:"Schliessen"},table:{noData:"Keine Daten"},toast:{close:"Schliessen"}}}),Bz=be({name:"Ελληνικά",code:"el",messages:{alert:{close:"Κλείσιμο"},authForm:{hidePassword:"Απόκρυψη κωδικού",showPassword:"Εμφάνιση κωδικού",submit:"Συνέχεια"},banner:{close:"Κλείσιμο"},calendar:{nextMonth:"Επόμενος μήνας",nextYear:"Επόμενο έτος",prevMonth:"Προηγούμενος μήνας",prevYear:"Προηγούμενο έτος"},carousel:{dots:"Επιλέξτε διαφάνεια για εμφάνιση",goto:"Μετάβαση στη διαφάνεια {slide}",next:"Επόμενο",prev:"Προηγούμενο"},chatPrompt:{placeholder:"Εδώ γράψτε το μήνυμά σας…"},chatPromptSubmit:{label:"Αποστολή"},chatReasoning:{thinking:"Σκέφτεται…",thought:"Σκέφτηκε",thoughtFor:"Σκέφτηκε για {duration}"},colorMode:{dark:"Σκοτεινό",light:"Φωτεινό",switchToDark:"Αλλαγή σε σκοτεινή λειτουργία",switchToLight:"Αλλαγή σε φωτεινή λειτουργία",system:"Σύστημα"},commandPalette:{back:"Πίσω",close:"Κλείσιμο",noData:"Δεν υπάρχουν δεδομένα",noMatch:"Δεν βρέθηκαν δεδομένα",placeholder:"Πληκτρολογήστε μια εντολή ή αναζητήστε…"},contentSearch:{links:"Σύνδεσμοι",theme:"Θέμα"},contentSearchButton:{label:"Αναζήτηση…"},contentToc:{title:"Σε αυτή τη σελίδα"},dropdownMenu:{noMatch:"Δεν βρέθηκαν δεδομένα",search:"Αναζήτηση…"},dashboardSearch:{theme:"Θέμα"},dashboardSearchButton:{label:"Αναζήτηση…"},dashboardSidebarCollapse:{collapse:"Σύμπτυξη πλευρικής μπάρας",expand:"Επέκταση πλευρικής μπάρας"},dashboardSidebarToggle:{close:"Κλείσιμο πλευρικής μπάρας",open:"Άνοιγμα πλευρικής μπάρας"},error:{clear:"Επιστροφή στην αρχική"},fileUpload:{removeFile:"Αφαίρεση {filename}"},header:{close:"Κλείσιμο μενού",open:"Άνοιγμα μενού"},inputMenu:{create:'Δημιουργία "{label}"',noData:"Δεν υπάρχουν δεδομένα",noMatch:"Δεν βρέθηκαν δεδομένα"},inputNumber:{decrement:"Μείωση",increment:"Αύξηση"},modal:{close:"Κλείσιμο"},pricingTable:{caption:"Σύγκριση προγραμμάτων τιμολόγησης"},prose:{codeCollapse:{closeText:"Σύμπτυξη",name:"κώδικας",openText:"Επέκταση"},collapsible:{closeText:"Απόκρυψη",name:"ιδιότητες",openText:"Εμφάνιση"},pre:{copy:"Αντιγραφή κώδικα στο πρόχειρο"}},sidebar:{close:"Κλείσιμο",toggle:"Εναλλαγή"},selectMenu:{create:'Δημιουργία "{label}"',noData:"Δεν υπάρχουν δεδομένα",noMatch:"Δεν βρέθηκαν δεδομένα",search:"Αναζήτηση…"},slideover:{close:"Κλείσιμο"},table:{noData:"Δεν υπάρχουν δεδομένα"},toast:{close:"Κλείσιμο"}}}),_z=be({name:"English (United Kingdom)",code:"en-GB",messages:Fu.messages}),kz=be({name:"Español",code:"es",messages:{alert:{close:"Cerrar"},authForm:{hidePassword:"Ocultar contraseña",showPassword:"Mostrar contraseña",submit:"Continuar"},banner:{close:"Cerrar"},calendar:{nextMonth:"Mes siguiente",nextYear:"Año siguiente",prevMonth:"Mes anterior",prevYear:"Año anterior"},carousel:{dots:"Elegir diapositiva a mostrar",goto:"Ir a la diapositiva {slide}",next:"Siguiente",prev:"Anterior"},chatPrompt:{placeholder:"Escribe tu mensaje aquí…"},chatPromptSubmit:{label:"Enviar"},chatReasoning:{thinking:"Pensando…",thought:"Pensó",thoughtFor:"Pensó durante {duration}"},colorMode:{dark:"Oscuro",light:"Claro",switchToDark:"Cambiar a modo oscuro",switchToLight:"Cambiar a modo claro",system:"Sistema"},commandPalette:{back:"Atrás",close:"Cerrar",noData:"Sin datos",noMatch:"No hay datos coincidentes",placeholder:"Escribe un comando o busca…"},contentSearch:{links:"Enlaces",theme:"Tema"},contentSearchButton:{label:"Buscar…"},contentToc:{title:"En esta página"},dropdownMenu:{noMatch:"No hay datos coincidentes",search:"Buscar…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Buscar…"},dashboardSidebarCollapse:{collapse:"Colapsar barra lateral",expand:"Expandir barra lateral"},dashboardSidebarToggle:{close:"Cerrar barra lateral",open:"Abrir barra lateral"},error:{clear:"Volver al inicio"},fileUpload:{removeFile:"Eliminar {filename}"},header:{close:"Cerrar menú",open:"Abrir menú"},inputMenu:{create:'Crear "{label}"',noData:"Sin datos",noMatch:"No hay datos coincidentes"},inputNumber:{decrement:"Decrementar",increment:"Incrementar"},modal:{close:"Cerrar"},pricingTable:{caption:"Comparación de planes de precios"},prose:{codeCollapse:{closeText:"Colapsar",name:"código",openText:"Expandir"},collapsible:{closeText:"Ocultar",name:"propiedades",openText:"Mostrar"},pre:{copy:"Copiar código al portapapeles"}},sidebar:{close:"Cerrar",toggle:"Alternar"},selectMenu:{create:'Crear "{label}"',noData:"Sin datos",noMatch:"No hay datos coincidentes",search:"Buscar…"},slideover:{close:"Cerrar"},table:{noData:"Sin datos"},toast:{close:"Cerrar"}}}),Sz=be({name:"Eesti",code:"et",messages:{alert:{close:"Sulge"},authForm:{hidePassword:"Peida parool",showPassword:"Näita parooli",submit:"Jätka"},banner:{close:"Sulge"},calendar:{nextMonth:"Järgmine kuu",nextYear:"Järgmine aasta",prevMonth:"Eelmine kuu",prevYear:"Eelmine aasta"},carousel:{dots:"Valige kuvatav slaid",goto:"Mine slaidile {slide}",next:"Järg",prev:"Eel"},chatPrompt:{placeholder:"Siia kirjutage oma sõnum…"},chatPromptSubmit:{label:"Saada"},chatReasoning:{thinking:"Mõtleb…",thought:"Mõtles",thoughtFor:"Mõtles {duration}"},colorMode:{dark:"Tume",light:"Hele",switchToDark:"Lülitu tumedasse režiimi",switchToLight:"Lülitu heledasse režiimi",system:"Süsteem"},commandPalette:{back:"Tagasi",close:"Sulge",noData:"Pole andmeid",noMatch:"Pole vastavaid andmeid",placeholder:"Sisesta käsk või otsi…"},contentSearch:{links:"Lingid",theme:"Teema"},contentSearchButton:{label:"Otsi…"},contentToc:{title:"Sellel lehel"},dropdownMenu:{noMatch:"Pole vastavaid andmeid",search:"Otsi…"},dashboardSearch:{theme:"Teema"},dashboardSearchButton:{label:"Otsi…"},dashboardSidebarCollapse:{collapse:"Ahenda külgriba",expand:"Laienda külgriba"},dashboardSidebarToggle:{close:"Sulge külgriba",open:"Ava külgriba"},error:{clear:"Tagasi avalehele"},fileUpload:{removeFile:"Eemalda {filename}"},header:{close:"Sulge menüü",open:"Ava menüü"},inputMenu:{create:'Loo "{label}"',noData:"Pole andmeid",noMatch:"Pole vastavaid andmeid"},inputNumber:{decrement:"Vähenda",increment:"Suurenda"},modal:{close:"Sulge"},pricingTable:{caption:"Hinna plaanide võrdlus"},prose:{codeCollapse:{closeText:"Ahenda",name:"kood",openText:"Laienda"},collapsible:{closeText:"Peida",name:"omadused",openText:"Näita"},pre:{copy:"Kopeeri kood lõikelauale"}},sidebar:{close:"Sulge",toggle:"Lülita"},selectMenu:{create:'Loo "{label}"',noData:"Pole andmeid",noMatch:"Pole vastavaid andmeid",search:"Otsi…"},slideover:{close:"Sulge"},table:{noData:"Pole andmeid"},toast:{close:"Sulge"}}}),Tz=be({name:"Euskera",code:"eu",messages:{alert:{close:"Itxi"},authForm:{hidePassword:"Pasahitza ezkutatu",showPassword:"Pasahitza erakutsi",submit:"Jarraitu"},banner:{close:"Itxi"},calendar:{nextMonth:"Hurrengo hilabetea",nextYear:"Hurrengo urtea",prevMonth:"Aurretiko hilabetea",prevYear:"Aurretiko urtea"},carousel:{dots:"Erakutsi beharreko diapositiba aukeratu",goto:"Joan diapositibara {slide}",next:"Hurrengoa",prev:"Aurretikoa"},chatPrompt:{placeholder:"Idatzi zure mezua hemen..."},chatPromptSubmit:{label:"Bidali"},chatReasoning:{thinking:"Pentsatzen…",thought:"Pentsatu du",thoughtFor:"{duration} pentsatzen"},colorMode:{dark:"Iluna",light:"Argia",switchToDark:"Aldatu ilunera",switchToLight:"Aldatu argira",system:"Sistema"},commandPalette:{back:"Atzera",close:"Itxi",noData:"Daturik gabe",noMatch:"Ez da datu bat ere aurkitu",placeholder:"Idatzi komando bat edo bilatu..."},contentSearch:{links:"Estekak",theme:"Gaia"},contentSearchButton:{label:"Bilatu…"},contentToc:{title:"Orri honetan"},dropdownMenu:{noMatch:"Ez da datu bat ere aurkitu",search:"Bilatu…"},dashboardSearch:{theme:"Gaia"},dashboardSearchButton:{label:"Bilatu…"},dashboardSidebarCollapse:{collapse:"Alboko barra itxi",expand:"Alboko barra zabaldu"},dashboardSidebarToggle:{close:"Alboko barra itxi",open:"Alboko barra zabaldu"},error:{clear:"Hasierara itzuli"},fileUpload:{removeFile:"Ezabatu {filename}"},header:{close:"Menua itxi",open:"Menua zabaldu"},inputMenu:{create:"Sortu {label}",noData:"Daturik gabe",noMatch:"Ez da datu bat ere aurkitu"},inputNumber:{decrement:"Murriztu",increment:"Handitu"},modal:{close:"Itxi"},pricingTable:{caption:"Prezio-plana alderatzea"},prose:{codeCollapse:{closeText:"Murriztu",name:"kodea",openText:"Zabaldu"},collapsible:{closeText:"Ezkutatu",name:"propietateak",openText:"Erakutsi"},pre:{copy:"Kopiatu kodea clipboard-era"}},sidebar:{close:"Itxi",toggle:"Txandakatu"},selectMenu:{create:"Sortu {label}",noData:"Daturik gabe",noMatch:"Ez da datu bat ere aurkitu",search:"Bilatu…"},slideover:{close:"Itxi"},table:{noData:"Daturik gabe"},toast:{close:"Itxi"}}}),Fz=be({name:"فارسی",code:"fa-IR",dir:"rtl",messages:{alert:{close:"بستن"},authForm:{hidePassword:"پنهان کردن رمز عبور",showPassword:"نمایش رمز عبور",submit:"ادامه"},banner:{close:"بستن"},calendar:{nextMonth:"ماه آینده",nextYear:"سال آینده",prevMonth:"ماه گذشته",prevYear:"سال گذشته"},carousel:{dots:"اسلاید مورد نظر برای نمایش را انتخاب کنید",goto:"رفتن به اسلاید {slide}",next:"بعدی",prev:"قبلی"},chatPrompt:{placeholder:"اینجا پیام خود را بنویسید…"},chatPromptSubmit:{label:"ارسال"},chatReasoning:{thinking:"در حال فکر کردن…",thought:"فکر کرد",thoughtFor:"به مدت {duration} فکر کرد"},colorMode:{dark:"تیره",light:"روشن",switchToDark:"تغییر به حالت تیره",switchToLight:"تغییر به حالت روشن",system:"سیستم"},commandPalette:{back:"بازگشت",close:"بستن",noData:"داده‌ای موجود نیست",noMatch:"داده‌ای یافت نشد",placeholder:"یک دستور وارد کنید یا جستجو کنید…"},contentSearch:{links:"پیوندها",theme:"تم"},contentSearchButton:{label:"جستجو…"},contentToc:{title:"در این صفحه"},dropdownMenu:{noMatch:"داده‌ای یافت نشد",search:"جستجو…"},dashboardSearch:{theme:"تم"},dashboardSearchButton:{label:"جستجو…"},dashboardSidebarCollapse:{collapse:"جمع کردن نوار کناری",expand:"گسترش نوار کناری"},dashboardSidebarToggle:{close:"بستن نوار کناری",open:"باز کردن نوار کناری"},error:{clear:"بازگشت به صفحه اصلی"},fileUpload:{removeFile:"حذف {filename}"},header:{close:"بستن منو",open:"باز کردن منو"},inputMenu:{create:'ایجاد "{label}"',noData:"داده‌ای موجود نیست",noMatch:"داده‌ای یافت نشد"},inputNumber:{decrement:"کاهش",increment:"افزایش"},modal:{close:"بستن"},pricingTable:{caption:"مقایسه طرح قیمت"},prose:{codeCollapse:{closeText:"جمع کردن",name:"کد",openText:"گسترش"},collapsible:{closeText:"پنهان",name:"ویژگی‌ها",openText:"نمایش"},pre:{copy:"کپی کد در کلیپ‌بورد"}},sidebar:{close:"بستن",toggle:"تغییر وضعیت"},selectMenu:{create:'ایجاد "{label}"',noData:"داده‌ای موجود نیست",noMatch:"داده‌ای یافت نشد",search:"جستجو…"},slideover:{close:"بستن"},table:{noData:"داده‌ای موجود نیست"},toast:{close:"بستن"}}}),Pz=be({name:"Suomeksi",code:"fi",messages:{alert:{close:"Sulje"},authForm:{hidePassword:"Piilota salasana",showPassword:"Näytä salasana",submit:"Jatka"},banner:{close:"Sulje"},calendar:{nextMonth:"Seuraava kuukausi",nextYear:"Seuraava vuosi",prevMonth:"Edellinen kuukausi",prevYear:"Edellinen vuosi"},carousel:{dots:"Valitse näytettävä dia",goto:"Siirry sivulle {slide}",next:"Seuraava",prev:"Edellinen"},chatPrompt:{placeholder:"Kirjoita viestisi tähän…"},chatPromptSubmit:{label:"Lähetä"},chatReasoning:{thinking:"Ajattelee…",thought:"Ajatteli",thoughtFor:"Ajatteli {duration}"},colorMode:{dark:"Tumma",light:"Vaalea",switchToDark:"Vaihda tummaan tilaan",switchToLight:"Vaihda vaaleaan tilaan",system:"Järjestelmä"},commandPalette:{back:"Takaisin",close:"Sulje",noData:"Ei tietoja",noMatch:"Ei vastaavia tietoja",placeholder:"Kirjoita komento tai hae…"},contentSearch:{links:"Linkit",theme:"Teema"},contentSearchButton:{label:"Hae…"},contentToc:{title:"Tällä sivulla"},dropdownMenu:{noMatch:"Ei vastaavia tietoja",search:"Hae…"},dashboardSearch:{theme:"Teema"},dashboardSearchButton:{label:"Hae…"},dashboardSidebarCollapse:{collapse:"Supista sivupalkki",expand:"Laajenna sivupalkki"},dashboardSidebarToggle:{close:"Sulje sivupalkki",open:"Avaa sivupalkki"},error:{clear:"Takaisin etusivulle"},fileUpload:{removeFile:"Poista {filename}"},header:{close:"Sulje valikko",open:"Avaa valikko"},inputMenu:{create:'Luo "{label}"',noData:"Ei tietoja",noMatch:"Ei vastaavia tietoja"},inputNumber:{decrement:"Vähennä",increment:"Kasvata"},modal:{close:"Sulje"},pricingTable:{caption:"Hinnoitellut suunnitelmat"},prose:{codeCollapse:{closeText:"Supista",name:"koodi",openText:"Laajenna"},collapsible:{closeText:"Piilota",name:"ominaisuudet",openText:"Näytä"},pre:{copy:"Kopioi koodi leikepöydälle"}},sidebar:{close:"Sulje",toggle:"Vaihda"},selectMenu:{create:'Luo "{label}"',noData:"Ei tietoja",noMatch:"Ei vastaavia tietoja",search:"Hae…"},slideover:{close:"Sulje"},table:{noData:"Ei tietoja"},toast:{close:"Sulje"}}}),Mz=be({name:"Français",code:"fr",messages:{alert:{close:"Fermer"},authForm:{hidePassword:"Masquer le mot de passe",showPassword:"Afficher le mot de passe",submit:"Continuer"},banner:{close:"Fermer"},calendar:{nextMonth:"Mois suivant",nextYear:"Année suivante",prevMonth:"Mois précédent",prevYear:"Année précédente"},carousel:{dots:"Choisir la diapositive à afficher",goto:"Aller à {slide}",next:"Suivant",prev:"Précédent"},chatPrompt:{placeholder:"Écrivez votre message ici…"},chatPromptSubmit:{label:"Envoyer"},chatReasoning:{thinking:"Réflexion en cours…",thought:"Réflexion",thoughtFor:"Réflexion pendant {duration}"},colorMode:{dark:"Sombre",light:"Clair",switchToDark:"Passer en mode sombre",switchToLight:"Passer en mode clair",system:"Système"},commandPalette:{back:"Retour",close:"Fermer",noData:"Aucune donnée",noMatch:"Aucune donnée correspondante",placeholder:"Tapez une commande ou recherchez…"},contentSearch:{links:"Liens",theme:"Thème"},contentSearchButton:{label:"Rechercher…"},contentToc:{title:"Sur cette page"},dropdownMenu:{noMatch:"Aucune donnée correspondante",search:"Rechercher…"},dashboardSearch:{theme:"Thème"},dashboardSearchButton:{label:"Rechercher…"},dashboardSidebarCollapse:{collapse:"Replier la barre latérale",expand:"Déployer la barre latérale"},dashboardSidebarToggle:{close:"Fermer la barre latérale",open:"Ouvrir la barre latérale"},error:{clear:"Retour à l'accueil"},fileUpload:{removeFile:"Supprimer {filename}"},header:{close:"Fermer le menu",open:"Ouvrir le menu"},inputMenu:{create:'Créer "{label}"',noData:"Aucune donnée",noMatch:"Aucune donnée correspondante"},inputNumber:{decrement:"Diminuer",increment:"Augmenter"},modal:{close:"Fermer"},pricingTable:{caption:"Comparaison des plans de prix"},prose:{codeCollapse:{closeText:"Réduire",name:"code",openText:"Développer"},collapsible:{closeText:"Masquer",name:"propriétés",openText:"Afficher"},pre:{copy:"Copier le code dans le presse-papiers"}},sidebar:{close:"Fermer",toggle:"Basculer"},selectMenu:{create:'Créer "{label}"',noData:"Aucune donnée",noMatch:"Aucune donnée correspondante",search:"Rechercher…"},slideover:{close:"Fermer"},table:{noData:"Aucune donnée"},toast:{close:"Fermer"}}}),Oz=be({name:"Galego",code:"gl",messages:{alert:{close:"Pechar"},authForm:{hidePassword:"Ocultar contrasinal",showPassword:"Amosar contrasinal",submit:"Continuar"},banner:{close:"Pechar"},calendar:{nextMonth:"Mes seguinte",nextYear:"Ano seguinte",prevMonth:"Mes anterior",prevYear:"Ano anterior"},carousel:{dots:"Escoller diapositiva a amostrar",goto:"Ir á diapositiva {slide}",next:"Seguinte",prev:"Anterior"},chatPrompt:{placeholder:"Escribe a túa mensaxe aquí…"},chatPromptSubmit:{label:"Enviar"},chatReasoning:{thinking:"Pensando…",thought:"Pensou",thoughtFor:"Pensou durante {duration}"},colorMode:{dark:"Oscuro",light:"Claro",switchToDark:"Cambiar a modo oscuro",switchToLight:"Cambiar a modo claro",system:"Sistema"},commandPalette:{back:"Atrás",close:"Pechar",noData:"Sen datos",noMatch:"Non hai datos coincidentes",placeholder:"Escribe un comando ou busca…"},contentSearch:{links:"Ligazóns",theme:"Tema"},contentSearchButton:{label:"Buscar…"},contentToc:{title:"Nesta páxina"},dropdownMenu:{noMatch:"Non hai datos coincidentes",search:"Buscar…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Buscar…"},dashboardSidebarCollapse:{collapse:"Contraer barra lateral",expand:"Despregar barra lateral"},dashboardSidebarToggle:{close:"Pechar barra lateral",open:"Abrir barra lateral"},error:{clear:"Volver ao inicio"},fileUpload:{removeFile:"Eliminar {filename}"},header:{close:"Pechar menú",open:"Abrir menú"},inputMenu:{create:'Crear "{label}"',noData:"Sen datos",noMatch:"Non hai datos coincidentes"},inputNumber:{decrement:"Diminuír",increment:"Aumentar"},modal:{close:"Pechar"},pricingTable:{caption:"Comparación de plans de prezos"},prose:{codeCollapse:{closeText:"Contraer",name:"código",openText:"Despregar"},collapsible:{closeText:"Ocultar",name:"propiedades",openText:"Amosar"},pre:{copy:"Copiar código ao portapapeis"}},sidebar:{close:"Pechar",toggle:"Alternar"},selectMenu:{create:'Crear "{label}"',noData:"Sen datos",noMatch:"Non hai datos coincidentes",search:"Buscar…"},slideover:{close:"Pechar"},table:{noData:"Sen datos"},toast:{close:"Pechar"}}}),Iz=be({name:"Hebrew",code:"he",dir:"rtl",messages:{alert:{close:"סגור"},authForm:{hidePassword:"הסתר סיסמה",showPassword:"הצג סיסמה",submit:"המשך"},banner:{close:"סגור"},calendar:{nextMonth:"חודש הבא",nextYear:"שנה הבאה",prevMonth:"חודש קודם",prevYear:"שנה קודמת"},carousel:{dots:"בחר שקופית להצגה",goto:"מעבר ל {slide}",next:"הבא",prev:"הקודם"},chatPrompt:{placeholder:"כתוב את ההודעה שלך כאן…"},chatPromptSubmit:{label:"שלח"},chatReasoning:{thinking:"חושב…",thought:"חשב",thoughtFor:"חשב במשך {duration}"},colorMode:{dark:"כהה",light:"בהיר",switchToDark:"עבור למצב כהה",switchToLight:"עבור למצב בהיר",system:"מערכת"},commandPalette:{back:"חזור",close:"סגור",noData:"אין נתונים זמינים",noMatch:"לא נמצאה התאמה",placeholder:"הקלד פקודה…"},contentSearch:{links:"קישורים",theme:"ערכת נושא"},contentSearchButton:{label:"חיפוש…"},contentToc:{title:"בדף זה"},dropdownMenu:{noMatch:"לא נמצאה התאמה",search:"חפש…"},dashboardSearch:{theme:"ערכת נושא"},dashboardSearchButton:{label:"חיפוש…"},dashboardSidebarCollapse:{collapse:"כווץ סרגל צד",expand:"הרחב סרגל צד"},dashboardSidebarToggle:{close:"סגור סרגל צד",open:"פתח סרגל צד"},error:{clear:"חזרה לדף הבית"},fileUpload:{removeFile:"הסר {filename}"},header:{close:"סגור תפריט",open:"פתח תפריט"},inputMenu:{create:'צור "{label}"',noData:"אין נתונים",noMatch:"אין התאמה"},inputNumber:{decrement:"הפחת",increment:"הוסף"},modal:{close:"סגור"},pricingTable:{caption:"שיפור מחירון"},prose:{codeCollapse:{closeText:"כווץ",name:"קוד",openText:"הרחב"},collapsible:{closeText:"הסתר",name:"מאפיינים",openText:"הצג"},pre:{copy:"העתק קוד ללוח"}},sidebar:{close:"סגור",toggle:"החלף"},selectMenu:{create:'צור "{label}"',noData:"אין נתונים",noMatch:"לא נמצאה התאמה",search:"חפש…"},slideover:{close:"סגור"},table:{noData:"אין נתונים להצגה"},toast:{close:"סגור"}}}),Rz=be({name:"Hindi",code:"hi",messages:{alert:{close:"बंद करें"},authForm:{hidePassword:"पासवर्ड छिपाएं",showPassword:"पासवर्ड दिखाएं",submit:"जारी रखें"},banner:{close:"बंद करें"},calendar:{nextMonth:"अगला महीना",nextYear:"अगला वर्ष",prevMonth:"पिछला महीना",prevYear:"पिछला वर्ष"},carousel:{dots:"प्रदर्शित करने के लिए स्लाइड चुनें",goto:"स्लाइड {slide} पर जाएं",next:"अगला",prev:"पिछला"},chatPrompt:{placeholder:"यहाँ आपका संदेश लिखें…"},chatPromptSubmit:{label:"भेजें"},chatReasoning:{thinking:"सोच रहा है…",thought:"सोचा",thoughtFor:"{duration} सोचा"},colorMode:{dark:"गहरा",light:"हल्का",switchToDark:"गहरे मोड में बदलें",switchToLight:"हल्के मोड में बदलें",system:"सिस्टम"},commandPalette:{back:"वापस",close:"बंद करें",noData:"कोई डेटा नहीं",noMatch:"कोई मेल खाता डेटा नहीं",placeholder:"एक आदेश या खोज टाइप करें…"},contentSearch:{links:"लिंक्स",theme:"थीम"},contentSearchButton:{label:"खोजें…"},contentToc:{title:"इस पृष्ठ पर"},dropdownMenu:{noMatch:"कोई मेल खाता डेटा नहीं",search:"खोजें…"},dashboardSearch:{theme:"थीम"},dashboardSearchButton:{label:"खोजें…"},dashboardSidebarCollapse:{collapse:"साइडबार संकुचित करें",expand:"साइडबार विस्तारित करें"},dashboardSidebarToggle:{close:"साइडबार बंद करें",open:"साइडबार खोलें"},error:{clear:"होम पेज पर वापस जाएं"},fileUpload:{removeFile:"{filename} हटाएं"},header:{close:"मेनू बंद करें",open:"मेनू खोलें"},inputMenu:{create:'"{label}" बनाएँ',noData:"कोई डेटा नहीं",noMatch:"कोई मेल खाता डेटा नहीं"},inputNumber:{decrement:"घटाना",increment:"बढ़ाना"},modal:{close:"बंद करें"},pricingTable:{caption:"कीमत योजनाओं की तुलना"},prose:{codeCollapse:{closeText:"संकुचित करें",name:"कोड",openText:"विस्तार करें"},collapsible:{closeText:"छिपाएँ",name:"गुण",openText:"दिखाएँ"},pre:{copy:"कोड को क्लिपबोर्ड पर कॉपी करें"}},sidebar:{close:"बंद करें",toggle:"टॉगल करें"},selectMenu:{create:'"{label}" बनाएँ',noData:"कोई डेटा नहीं",noMatch:"कोई मेल खाता डेटा नहीं",search:"खोजें…"},slideover:{close:"बंद करें"},table:{noData:"कोई डेटा नहीं"},toast:{close:"बंद करें"}}}),Lz=be({name:"Hrvatski",code:"hr",messages:{alert:{close:"Zatvori"},authForm:{hidePassword:"Sakrij lozinku",showPassword:"Prikaži lozinku",submit:"Nastavi"},banner:{close:"Zatvori"},calendar:{nextMonth:"Sljedeći mjesec",nextYear:"Sljedeća godina",prevMonth:"Prethodni mjesec",prevYear:"Prethodna godina"},carousel:{dots:"Odaberite slajd za prikaz",goto:"Idi na slajd {slide}",next:"Sljedeći",prev:"Prethodni"},chatPrompt:{placeholder:"Upišite svoju poruku ovdje…"},chatPromptSubmit:{label:"Pošalji upit"},chatReasoning:{thinking:"Razmišlja…",thought:"Razmislio",thoughtFor:"Razmišljao {duration}"},colorMode:{dark:"Tamno",light:"Svijetlo",switchToDark:"Prebaci na tamni način rada",switchToLight:"Prebaci na svijetli način rada",system:"Sustav"},commandPalette:{back:"Natrag",close:"Zatvori",noData:"Nema podataka",noMatch:"Nema odgovarajućih podataka",placeholder:"Upišite naredbu ili pretraživanje…"},contentSearch:{links:"Poveznice",theme:"Tema"},contentSearchButton:{label:"Pretraživanje…"},contentToc:{title:"Na ovoj stranici"},dropdownMenu:{noMatch:"Nema odgovarajućih podataka",search:"Pretraživanje…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Pretraživanje…"},dashboardSidebarCollapse:{collapse:"Smanji bočnu traku",expand:"Proširi bočnu traku"},dashboardSidebarToggle:{close:"Zatvori bočnu traku",open:"Otvori bočnu traku"},error:{clear:"Natrag na početnu"},fileUpload:{removeFile:"Ukloni {filename}"},header:{close:"Zatvori izbornik",open:"Otvori izbornik"},inputMenu:{create:'Stvori "{label}"',noData:"Nema podataka",noMatch:"Nema odgovarajućih podataka"},inputNumber:{decrement:"Smanji",increment:"Povećaj"},modal:{close:"Zatvori"},pricingTable:{caption:"Usporedba cjenovnih planova"},prose:{codeCollapse:{closeText:"Smanji",name:"kod",openText:"Proširi"},collapsible:{closeText:"Sakrij",name:"svojstva",openText:"Prikaži"},pre:{copy:"Kopiraj kod u međuspremnik"}},sidebar:{close:"Zatvori",toggle:"Prebaci"},selectMenu:{create:'Stvori "{label}"',noData:"Nema podataka",noMatch:"Nema odgovarajućih podataka",search:"Pretraživanje…"},slideover:{close:"Zatvori"},table:{noData:"Nema podataka"},toast:{close:"Zatvori"}}}),qz=be({name:"Magyar",code:"hu",messages:{alert:{close:"Bezárás"},authForm:{hidePassword:"Jelszó elrejtése",showPassword:"Jelszó megjelenítése",submit:"Folytatás"},banner:{close:"Bezárás"},calendar:{nextMonth:"Következő hónap",nextYear:"Következő év",prevMonth:"Előző hónap",prevYear:"Előző év"},carousel:{dots:"Válassza ki a megjelenítendő diát",goto:"Ugrás ide {slide}",next:"Következő",prev:"Előző"},chatPrompt:{placeholder:"Írd be a kérdésedet itt…"},chatPromptSubmit:{label:"Küldés"},chatReasoning:{thinking:"Gondolkodik…",thought:"Gondolkodott",thoughtFor:"{duration} gondolkodott"},colorMode:{dark:"Sötét",light:"Világos",switchToDark:"Váltás sötét módra",switchToLight:"Váltás világos módra",system:"Rendszer"},commandPalette:{back:"Vissza",close:"Bezárás",noData:"Nincs adat",noMatch:"Nincs találat",placeholder:"Írjon be egy parancsot vagy keressen…"},contentSearch:{links:"Linkek",theme:"Téma"},contentSearchButton:{label:"Keresés…"},contentToc:{title:"Ezen az oldalon"},dropdownMenu:{noMatch:"Nincs találat",search:"Keresés…"},dashboardSearch:{theme:"Téma"},dashboardSearchButton:{label:"Keresés…"},dashboardSidebarCollapse:{collapse:"Oldalsáv összecsukása",expand:"Oldalsáv kinyitása"},dashboardSidebarToggle:{close:"Oldalsáv bezárása",open:"Oldalsáv megnyitása"},error:{clear:"Vissza a főoldalra"},fileUpload:{removeFile:"{filename} eltávolítása"},header:{close:"Menü bezárása",open:"Menü megnyitása"},inputMenu:{create:'"{label}" létrehozása',noData:"Nincs adat",noMatch:"Nincs találat"},inputNumber:{decrement:"Csökkent",increment:"Növel"},modal:{close:"Bezárás"},pricingTable:{caption:"Árlista összehasonlítása"},prose:{codeCollapse:{closeText:"Összecsuk",name:"kód",openText:"Kinyit"},collapsible:{closeText:"Elrejt",name:"tulajdonságok",openText:"Mutat"},pre:{copy:"Kód másolása a vágólapra"}},sidebar:{close:"Bezárás",toggle:"Váltás"},selectMenu:{create:'"{label}" létrehozása',noData:"Nincs adat",noMatch:"Nincs találat",search:"Keresés…"},slideover:{close:"Bezárás"},table:{noData:"Nincs adat"},toast:{close:"Bezárás"}}}),$z=be({name:"Հայերեն",code:"hy",messages:{alert:{close:"Փակել"},authForm:{hidePassword:"Թաքցնել գաղտնաբառը",showPassword:"Ցույց տալ գաղտնաբառը",submit:"Շարունակել"},banner:{close:"Փակել"},calendar:{nextMonth:"Հաջորդ ամիս",nextYear:"Հաջորդ տարի",prevMonth:"Նախորդ ամիս",prevYear:"Նախորդ տարի"},carousel:{dots:"Ընտրեք ցուցադրելու սլայդը",goto:"Անցնել {slide}-ին",next:"Առաջ",prev:"Հետ"},chatPrompt:{placeholder:"Շարունակել"},chatPromptSubmit:{label:"Շարունակել"},chatReasoning:{thinking:"Մտածում է…",thought:"Մտածեց",thoughtFor:"Մտածեց {duration}"},colorMode:{dark:"Մուգ",light:"Լուսավոր",switchToDark:"Անցնել մուգ ռեժիմի",switchToLight:"Անցնել լուսավոր ռեժիմի",system:"Համակարգային"},commandPalette:{back:"Հետ",close:"Փակել",noData:"Տվյալներ չկան",noMatch:"Համընկնումներ չեն գտնվել",placeholder:"Մուտքագրեք հրաման կամ որոնեք…"},contentSearch:{links:"Հղումներ",theme:"Թեմա"},contentSearchButton:{label:"Որոնել…"},contentToc:{title:"Այս էջում"},dropdownMenu:{noMatch:"Համընկնումներ չեն գտնվել",search:"Որոնում…"},dashboardSearch:{theme:"Թեմա"},dashboardSearchButton:{label:"Որոնել…"},dashboardSidebarCollapse:{collapse:"Կոլապսել կողային վահանակը",expand:"Ընդլայնել կողային վահանակը"},dashboardSidebarToggle:{close:"Փակել կողային վահանակը",open:"Բացել կողային վահանակը"},error:{clear:"Վերադառնալ գլխավոր էջ"},fileUpload:{removeFile:"Ջնջել {filename}"},header:{close:"Փակել ընտրացանկը",open:"Բացել ընտրացանկը"},inputMenu:{create:'Ստեղծել "{label}"',noData:"Տվյալներ չկան",noMatch:"Համընկնումներ չեն գտնվել"},inputNumber:{decrement:"Պակասեցնել",increment:"Ավելացնել"},modal:{close:"Փակել"},pricingTable:{caption:"Գնումների համեմատություն"},prose:{codeCollapse:{closeText:"Կոլապսել",name:"կոդ",openText:"Ընդլայնել"},collapsible:{closeText:"Թաքցնել",name:"հատկություններ",openText:"Ցույց տալ"},pre:{copy:"Պատճենել կոդը սեղմատախտակին"}},sidebar:{close:"Փակել",toggle:"Փոխարկել"},selectMenu:{create:'Ստեղծել "{label}"',noData:"Տվյալներ չկան",noMatch:"Համընկնումներ չեն գտնվել",search:"Որոնում…"},slideover:{close:"Փակել"},table:{noData:"Տվյալներ չկան"},toast:{close:"Փակել"}}}),Nz=be({name:"Bahasa Indonesia",code:"id",messages:{alert:{close:"Tutup"},authForm:{hidePassword:"Sembunyikan kata sandi",showPassword:"Tampilkan kata sandi",submit:"Lanjutkan"},banner:{close:"Tutup"},calendar:{nextMonth:"Bulan berikutnya",nextYear:"Tahun berikutnya",prevMonth:"Bulan sebelumnya",prevYear:"Tahun sebelumnya"},carousel:{dots:"Pilih slide untuk ditampilkan",goto:"Pergi ke slide {slide}",next:"Berikutnya",prev:"Sebelumnya"},chatPrompt:{placeholder:"Tulis pesan Anda di sini…"},chatPromptSubmit:{label:"Kirim"},chatReasoning:{thinking:"Berpikir…",thought:"Telah berpikir",thoughtFor:"Berpikir selama {duration}"},colorMode:{dark:"Gelap",light:"Terang",switchToDark:"Beralih ke mode gelap",switchToLight:"Beralih ke mode terang",system:"Sistem"},commandPalette:{back:"Kembali",close:"Tutup",noData:"Tidak ada data",noMatch:"Tidak ada data yang cocok",placeholder:"Ketik perintah atau cari…"},contentSearch:{links:"Tautan",theme:"Tema"},contentSearchButton:{label:"Cari…"},contentToc:{title:"Pada halaman ini"},dropdownMenu:{noMatch:"Tidak ada data yang cocok",search:"Cari…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Cari…"},dashboardSidebarCollapse:{collapse:"Ciutkan sidebar",expand:"Perluas sidebar"},dashboardSidebarToggle:{close:"Tutup sidebar",open:"Buka sidebar"},error:{clear:"Kembali ke beranda"},fileUpload:{removeFile:"Hapus {filename}"},header:{close:"Tutup menu",open:"Buka menu"},inputMenu:{create:'Buat "{label}"',noData:"Tidak ada data",noMatch:"Tidak ada data yang cocok"},inputNumber:{decrement:"Kurangi",increment:"Tambah"},modal:{close:"Tutup"},pricingTable:{caption:"Perbandingan Harga"},prose:{codeCollapse:{closeText:"Ciutkan",name:"kode",openText:"Perluas"},collapsible:{closeText:"Sembunyikan",name:"properti",openText:"Tampilkan"},pre:{copy:"Salin kode ke clipboard"}},sidebar:{close:"Tutup",toggle:"Alihkan"},selectMenu:{create:'Buat "{label}"',noData:"Tidak ada data",noMatch:"Tidak ada data yang cocok",search:"Cari…"},slideover:{close:"Tutup"},table:{noData:"Tidak ada data"},toast:{close:"Tutup"}}}),jz=be({name:"Icelandic",code:"is",messages:{alert:{close:"Loka"},authForm:{hidePassword:"Fela lykilorð",showPassword:"Sýna lykilorð",submit:"Áfram"},banner:{close:"Loka"},calendar:{nextMonth:"Næsti mánuður",nextYear:"Næsta ár",prevMonth:"Fyrri mánuður",prevYear:"Fyrra ár"},carousel:{dots:"Veldu mynd til að sýna",goto:"Fara á mynd {slide}",next:"Næsta",prev:"Fyrri"},chatPrompt:{placeholder:"Skrifaðu skilaboðin þín hér…"},chatPromptSubmit:{label:"Senda fyrirspurn"},chatReasoning:{thinking:"Hugsar…",thought:"Hugsaði",thoughtFor:"Hugsaði í {duration}"},colorMode:{dark:"Dökkt",light:"Ljóst",switchToDark:"Skipta yfir í dökkan ham",switchToLight:"Skipta yfir í ljósan ham",system:"Kerfi"},commandPalette:{back:"Til baka",close:"Loka",noData:"Engin gögn",noMatch:"Engin gögn fundust",placeholder:"Sláðu inn skipun eða leitaðu…"},contentSearch:{links:"Tenglar",theme:"Þema"},contentSearchButton:{label:"Leita…"},contentToc:{title:"Á þessari síðu"},dropdownMenu:{noMatch:"Engin gögn fundust",search:"Leita…"},dashboardSearch:{theme:"Þema"},dashboardSearchButton:{label:"Leita…"},dashboardSidebarCollapse:{collapse:"Fella hliðarstiku saman",expand:"Stækka hliðarstiku"},dashboardSidebarToggle:{close:"Loka hliðarstiku",open:"Opna hliðarstiku"},error:{clear:"Til baka heim"},fileUpload:{removeFile:"Fjarlægja {filename}"},header:{close:"Loka valmynd",open:"Opna valmynd"},inputMenu:{create:'Búa til "{label}"',noData:"Engin gögn",noMatch:"Engin gögn fundust"},inputNumber:{decrement:"Minnka",increment:"Auka"},modal:{close:"Loka"},pricingTable:{caption:"Samanburður verðflokka"},prose:{codeCollapse:{closeText:"Fella saman",name:"kóði",openText:"Stækka"},collapsible:{closeText:"Fela",name:"eiginleikar",openText:"Sýna"},pre:{copy:"Afrita kóða á klippiborð"}},sidebar:{close:"Loka",toggle:"Skipta"},selectMenu:{create:'Búa til "{label}"',noData:"Engin gögn",noMatch:"Engin gögn fundust",search:"Leita…"},slideover:{close:"Loka"},table:{noData:"Engin gögn"},toast:{close:"Loka"}}}),Vz=be({name:"Italiano",code:"it",messages:{alert:{close:"Chiudi"},authForm:{hidePassword:"Nascondi password",showPassword:"Mostra password",submit:"Continua"},banner:{close:"Chiudi"},calendar:{nextMonth:"Mese successivo",nextYear:"Anno successivo",prevMonth:"Mese precedente",prevYear:"Anno precedente"},carousel:{dots:"Scegli diapositiva da visualizzare",goto:"Vai alla slide {slide}",next:"Successiva",prev:"Precedente"},chatPrompt:{placeholder:"Scrivi il tuo messaggio qui…"},chatPromptSubmit:{label:"Invia"},chatReasoning:{thinking:"Pensando…",thought:"Ha pensato",thoughtFor:"Ha pensato per {duration}"},colorMode:{dark:"Scuro",light:"Chiaro",switchToDark:"Passa alla modalità scura",switchToLight:"Passa alla modalità chiara",system:"Sistema"},commandPalette:{back:"Indietro",close:"Chiudi",noData:"Nessun dato",noMatch:"Nessun dato corrispondente",placeholder:"Digita un comando o cerca…"},contentSearch:{links:"Collegamenti",theme:"Tema"},contentSearchButton:{label:"Cerca…"},contentToc:{title:"In questa pagina"},dropdownMenu:{noMatch:"Nessun dato corrispondente",search:"Cerca…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Cerca…"},dashboardSidebarCollapse:{collapse:"Comprimi barra laterale",expand:"Espandi barra laterale"},dashboardSidebarToggle:{close:"Chiudi barra laterale",open:"Apri barra laterale"},error:{clear:"Torna alla home"},fileUpload:{removeFile:"Rimuovi {filename}"},header:{close:"Chiudi menu",open:"Apri menu"},inputMenu:{create:'Crea "{label}"',noData:"Nessun dato",noMatch:"Nessun dato corrispondente"},inputNumber:{decrement:"Diminuisci",increment:"Aumenta"},modal:{close:"Chiudi"},pricingTable:{caption:"Confronto dei piani di prezzo"},prose:{codeCollapse:{closeText:"Comprimi",name:"codice",openText:"Espandi"},collapsible:{closeText:"Nascondi",name:"proprietà",openText:"Mostra"},pre:{copy:"Copia codice negli appunti"}},sidebar:{close:"Chiudi",toggle:"Alterna"},selectMenu:{create:'Crea "{label}"',noData:"Nessun dato",noMatch:"Nessun dato corrispondente",search:"Cerca…"},slideover:{close:"Chiudi"},table:{noData:"Nessun dato"},toast:{close:"Chiudi"}}}),zz=be({name:"日本語",code:"ja",messages:{alert:{close:"閉じる"},authForm:{hidePassword:"パスワードを隠す",showPassword:"パスワードを表示",submit:"続ける"},banner:{close:"閉じる"},calendar:{nextMonth:"翌月",nextYear:"翌年",prevMonth:"前月",prevYear:"前年"},carousel:{dots:"表示するスライドを選択",goto:"スライド {slide} に移動",next:"次へ",prev:"前へ"},chatPrompt:{placeholder:"ここにメッセージを入力してください…"},chatPromptSubmit:{label:"送信"},chatReasoning:{thinking:"考えています…",thought:"考えました",thoughtFor:"{duration}考えました"},colorMode:{dark:"ダーク",light:"ライト",switchToDark:"ダークモードに切り替え",switchToLight:"ライトモードに切り替え",system:"システム"},commandPalette:{back:"戻る",close:"閉じる",noData:"データがありません",noMatch:"一致するデータがありません",placeholder:"コマンドを入力するか検索…"},contentSearch:{links:"リンク",theme:"テーマ"},contentSearchButton:{label:"検索…"},contentToc:{title:"このページ内"},dropdownMenu:{noMatch:"一致するデータがありません",search:"検索…"},dashboardSearch:{theme:"テーマ"},dashboardSearchButton:{label:"検索…"},dashboardSidebarCollapse:{collapse:"サイドバーを折りたたむ",expand:"サイドバーを展開"},dashboardSidebarToggle:{close:"サイドバーを閉じる",open:"サイドバーを開く"},error:{clear:"ホームに戻る"},fileUpload:{removeFile:"{filename}を削除"},header:{close:"メニューを閉じる",open:"メニューを開く"},inputMenu:{create:'"{label}"を作成',noData:"データがありません",noMatch:"一致するデータがありません"},inputNumber:{decrement:"減らす",increment:"増やす"},modal:{close:"閉じる"},pricingTable:{caption:"価格プランの比較"},prose:{codeCollapse:{closeText:"折りたたむ",name:"コード",openText:"展開"},collapsible:{closeText:"非表示",name:"プロパティ",openText:"表示"},pre:{copy:"コードをクリップボードにコピー"}},sidebar:{close:"閉じる",toggle:"切り替え"},selectMenu:{create:'"{label}"を作成',noData:"データがありません",noMatch:"一致するデータがありません",search:"検索…"},slideover:{close:"閉じる"},table:{noData:"データがありません"},toast:{close:"閉じる"}}}),Uz=be({name:"ქართული",code:"ka",messages:{alert:{close:"დახურვა"},authForm:{hidePassword:"პაროლის დამალვა",showPassword:"პაროლის ჩვენება",submit:"გაგრძელება"},banner:{close:"დახურვა"},calendar:{nextMonth:"შემდეგი თვე",nextYear:"შემდეგი წელი",prevMonth:"წინა თვე",prevYear:"წინა წელი"},carousel:{dots:"აირჩიეთ სლაიდი საჩვენებლად",goto:"გადასვლა სლაიდ {slide}-ზე",next:"შემდეგი",prev:"წინა"},chatPrompt:{placeholder:"დაწერეთ თქვენი მესიჯი აქ…"},chatPromptSubmit:{label:"შეტყობინების გაგზავნა"},chatReasoning:{thinking:"ფიქრობს…",thought:"იფიქრა",thoughtFor:"{duration} ფიქრობდა"},colorMode:{dark:"ბნელი",light:"ნათელი",switchToDark:"ბნელ რეჯიმზე გადასვლა",switchToLight:"ნათელ რეჯიმზე გადასვლა",system:"სისტემური"},commandPalette:{back:"უკან",close:"დახურვა",noData:"მონაცემები არ არის",noMatch:"შესატყვისი მონაცემები არ არის",placeholder:"ჩაწერეთ ბრძანება ან ძიება…"},contentSearch:{links:"ბმულები",theme:"თემა"},contentSearchButton:{label:"ძიება…"},contentToc:{title:"ამ გვერდზე"},dropdownMenu:{noMatch:"შესატყვისი მონაცემები არ არის",search:"ძიება…"},dashboardSearch:{theme:"თემა"},dashboardSearchButton:{label:"ძიება…"},dashboardSidebarCollapse:{collapse:"გვერდითი ზოლის ჩაკეცვა",expand:"გვერდითი ზოლის გაშლა"},dashboardSidebarToggle:{close:"გვერდითი ზოლის დახურვა",open:"გვერდითი ზოლის გახსნა"},error:{clear:"მთავარზე დაბრუნება"},fileUpload:{removeFile:"მოაშორე {filename}"},header:{close:"მენიუს დახურვა",open:"მენიუს გახსნა"},inputMenu:{create:'შექმენი "{label}"',noData:"მონაცემები არ არის",noMatch:"შესატყვისი მონაცემები არ არის"},inputNumber:{decrement:"დაკლება",increment:"დამატება"},modal:{close:"დახურვა"},pricingTable:{caption:"ფასის გეგმების შედარება"},prose:{codeCollapse:{closeText:"ჩაკეცვა",name:"კოდი",openText:"გაშლა"},collapsible:{closeText:"დახურვა",name:"თვისებები",openText:"ჩვენება"},pre:{copy:"კოდის კოპირება ბუფერში"}},sidebar:{close:"დახურვა",toggle:"გადართვა"},selectMenu:{create:'დაამატე "{label}"',noData:"მონაცემები არ არის",noMatch:"შესატყვისი მონაცემები არ არის",search:"ძიება…"},slideover:{close:"დახურვა"},table:{noData:"მონაცემები არ არის"},toast:{close:"დახურვა"}}}),Hz=be({name:"Қазақша",code:"kk",messages:{alert:{close:"Жабу"},authForm:{hidePassword:"Құпия сөзді жасыру",showPassword:"Құпия сөзді көрсету",submit:"Жалғастыру"},banner:{close:"Жабу"},calendar:{nextMonth:"Келесі ай",nextYear:"Келесі жыл",prevMonth:"Алдыңғы ай",prevYear:"Алдыңғы жыл"},carousel:{dots:"Көрсету үшін слайдты таңдаңыз",goto:"{slide} слайдқа өту",next:"Келесі",prev:"Алдыңғы"},chatPrompt:{placeholder:"Хабар енгізіңіз…"},chatPromptSubmit:{label:"Жіберу"},chatReasoning:{thinking:"Ойлануда…",thought:"Ойланды",thoughtFor:"{duration} ойланды"},colorMode:{dark:"Қараңғы",light:"Ашық",switchToDark:"Қараңғы режимге ауысу",switchToLight:"Ашық режимге ауысу",system:"Жүйе"},commandPalette:{back:"Артқа",close:"Жабу",noData:"Деректер жоқ",noMatch:"Сәйкес келетін деректер жоқ",placeholder:"Команда енгізіңіз немесе іздеңіз…"},contentSearch:{links:"Сілтемелер",theme:"Тақырып"},contentSearchButton:{label:"Іздеу"},contentToc:{title:"Мазмұны"},dropdownMenu:{noMatch:"Сәйкес келетін деректер жоқ",search:"Іздеу…"},dashboardSearch:{theme:"Тақырып"},dashboardSearchButton:{label:"Іздеу"},dashboardSidebarCollapse:{collapse:"Жию",expand:"Кеңейту"},dashboardSidebarToggle:{close:"Жабу",open:"Ашу"},error:{clear:"Тазалау"},fileUpload:{removeFile:"{filename} жою"},header:{close:"Жабу",open:"Ашу"},inputMenu:{create:'"{label}" жасау',noData:"Деректер жоқ",noMatch:"Сәйкес келетін деректер жоқ"},inputNumber:{decrement:"Азайту",increment:"Арттыру"},modal:{close:"Жабу"},pricingTable:{caption:"Баға кестесі"},prose:{codeCollapse:{closeText:"Жиыру",name:"код",openText:"Кеңейту"},collapsible:{closeText:"Жасыру",name:"қасиеттер",openText:"Көрсету"},pre:{copy:"Кодты алмасу буферіне көшіру"}},sidebar:{close:"Жабу",toggle:"Ауыстыру"},selectMenu:{create:'"{label}" жасау',noData:"Деректер жоқ",noMatch:"Сәйкес келетін деректер жоқ",search:"Іздеу…"},slideover:{close:"Жабу"},table:{noData:"Деректер жоқ"},toast:{close:"Жабу"}}}),Kz=be({name:"ភាសាខ្មែរ",code:"km",messages:{alert:{close:"បិទ"},authForm:{hidePassword:"លាក់ពាក្យសម្ងាត់",showPassword:"បង្ហាញពាក្យសម្ងាត់",submit:"បន្ត"},banner:{close:"បិទ"},calendar:{nextMonth:"ខែបន្ទាប់",nextYear:"ឆ្នាំបន្ទាប់",prevMonth:"ខែមុន",prevYear:"ឆ្នាំមុន"},carousel:{dots:"ជ្រើសរើស​ស្លាយ​ដើម្បី​បង្ហាញ",goto:"ឡើងទៅស្លាយ {slide}",next:"បន្ទាប់",prev:"មុន"},chatPrompt:{placeholder:"សួរស្រឡាញ់មួយបីនេះមានប្រភេទបានទាមទារទេ…"},chatPromptSubmit:{label:"សាក់"},chatReasoning:{thinking:"កំពុងគិត…",thought:"គិតរួចហើយ",thoughtFor:"គិតរយៈពេល {duration}"},colorMode:{dark:"ងងឹត",light:"ភ្លឺ",switchToDark:"ប្តូរទៅរបៀបងងឹត",switchToLight:"ប្តូរទៅរបៀបភ្លឺ",system:"ប្រព័ន្ធ"},commandPalette:{back:"ត្រឡប់",close:"បិទ",noData:"មិនមានទិន្នន័យ",noMatch:"មិនមានទិន្នន័យដែលត្រូវគ្នាទេ",placeholder:"វាយពាក្យបញ្ជា ឬស្វែងរក…"},contentSearch:{links:"តំណភ្ជាប់",theme:"រូបរាង"},contentSearchButton:{label:"ស្វែងរក…"},contentToc:{title:"នៅលើទំព័រនេះ"},dropdownMenu:{noMatch:"មិនមានទិន្នន័យដែលត្រូវគ្នាទេ",search:"ស្វែងរក…"},dashboardSearch:{theme:"រូបរាង"},dashboardSearchButton:{label:"ស្វែងរក…"},dashboardSidebarCollapse:{collapse:"បង្រួមបារចំហៀង",expand:"ពង្រីកបារចំហៀង"},dashboardSidebarToggle:{close:"បិទបារចំហៀង",open:"បើកបារចំហៀង"},error:{clear:"ត្រឡប់ទៅទំព័រដើម"},fileUpload:{removeFile:"លុប {filename}"},header:{close:"បិទម៉ឺនុយ",open:"បើកម៉ឺនុយ"},inputMenu:{create:'បង្កើត "{label}"',noData:"មិនមានទិន្នន័យ",noMatch:"មិនមានទិន្នន័យដែលត្រូវគ្នាទេ"},inputNumber:{decrement:"បន្ថយ",increment:"បង្កើន"},modal:{close:"បិទ"},pricingTable:{caption:"បញ្ជីតម្លៃបន្ទប់បន្ទប់"},prose:{codeCollapse:{closeText:"បង្រួម",name:"កូដ",openText:"ពង្រីក"},collapsible:{closeText:"លាក់",name:"លក្ខណៈសម្បត្តិ",openText:"បង្ហាញ"},pre:{copy:"ចម្លងកូដទៅក្ដារតម្បៀតខ្ទាស់"}},sidebar:{close:"បិទ",toggle:"បិទ/បើក"},selectMenu:{create:'បង្កើត "{label}"',noData:"មិនមានទិន្នន័យ",noMatch:"មិនមានទិន្នន័យដែលត្រូវគ្នាទេ",search:"ស្វែងរក…"},slideover:{close:"បិទ"},table:{noData:"មិនមានទិន្នន័យ"},toast:{close:"បិទ"}}}),Wz=be({name:"한국어",code:"ko",messages:{alert:{close:"닫기"},authForm:{hidePassword:"비밀번호 숨기기",showPassword:"비밀번호 표시",submit:"계속"},banner:{close:"닫기"},calendar:{nextMonth:"다음 달",nextYear:"다음 해",prevMonth:"이전 달",prevYear:"이전 해"},carousel:{dots:"표시할 슬라이드 선택",goto:"{slide} 페이지로 이동",next:"다음",prev:"이전"},chatPrompt:{placeholder:"여기에 메시지를 입력하세요…"},chatPromptSubmit:{label:"전송"},chatReasoning:{thinking:"생각하는 중…",thought:"생각했습니다",thoughtFor:"{duration} 동안 생각했습니다"},colorMode:{dark:"다크",light:"라이트",switchToDark:"다크 모드로 전환",switchToLight:"라이트 모드로 전환",system:"시스템"},commandPalette:{back:"뒤로",close:"닫기",noData:"데이터가 없습니다.",noMatch:"일치하는 데이터가 없습니다.",placeholder:"명령을 입력하거나 검색…"},contentSearch:{links:"링크",theme:"테마"},contentSearchButton:{label:"검색…"},contentToc:{title:"이 페이지에서"},dropdownMenu:{noMatch:"일치하는 데이터가 없습니다.",search:"검색…"},dashboardSearch:{theme:"테마"},dashboardSearchButton:{label:"검색…"},dashboardSidebarCollapse:{collapse:"사이드바 축소",expand:"사이드바 확장"},dashboardSidebarToggle:{close:"사이드바 닫기",open:"사이드바 열기"},error:{clear:"홈으로 돌아가기"},fileUpload:{removeFile:"{filename} 제거"},header:{close:"메뉴 닫기",open:"메뉴 열기"},inputMenu:{create:'"{label}" 생성',noData:"데이터가 없습니다.",noMatch:"일치하는 데이터가 없습니다."},inputNumber:{decrement:"감소",increment:"증가"},modal:{close:"닫기"},pricingTable:{caption:"가격 플랜 비교"},prose:{codeCollapse:{closeText:"접기",name:"코드",openText:"펼치기"},collapsible:{closeText:"숨기기",name:"속성",openText:"보기"},pre:{copy:"코드를 클립보드에 복사"}},sidebar:{close:"닫기",toggle:"토글"},selectMenu:{create:'"{label}" 생성',noData:"데이터가 없습니다.",noMatch:"일치하는 데이터가 없습니다.",search:"검색…"},slideover:{close:"닫기"},table:{noData:"데이터가 없습니다."},toast:{close:"닫기"}}}),Gz=be({name:"Кыргызча",code:"ky",messages:{alert:{close:"Жабуу"},authForm:{hidePassword:"Сырсөздү жашыруу",showPassword:"Сырсөздү көрсөтүү",submit:"Улантуу"},banner:{close:"Жабуу"},calendar:{nextMonth:"Кийинки ай",nextYear:"Кийинки жыл",prevMonth:"Алдыңкы ай",prevYear:"Алдыңкы жыл"},carousel:{dots:"Көрсөтүү үчүн слайдды тандаңыз",goto:"{slide} слайдга өтүү",next:"Кийинки",prev:"Алдыңкы"},chatPrompt:{placeholder:"Бул жерге билдирүүңүздү жазыңыз…"},chatPromptSubmit:{label:"Билдирүү жөнөтүү"},chatReasoning:{thinking:"Ойлонуда…",thought:"Ойлонду",thoughtFor:"{duration} ойлонду"},colorMode:{dark:"Караңгы",light:"Жарык",switchToDark:"Караңгы режимге өтүү",switchToLight:"Жарык режимге өтүү",system:"Система"},commandPalette:{back:"Артка",close:"Жабуу",noData:"Маалымат жок",noMatch:"Эч нерсе табылган жок",placeholder:"Буйрук киргизиңиз же издөө…"},contentSearch:{links:"Шилтемелер",theme:"Тема"},contentSearchButton:{label:"Издөө…"},contentToc:{title:"Бул бетте"},dropdownMenu:{noMatch:"Сүйлөшкөн маалыматтар жок",search:"Издөө…"},dashboardSearch:{theme:"Тема"},dashboardSearchButton:{label:"Издөө…"},dashboardSidebarCollapse:{collapse:"Каптал тилкесин жыйноо",expand:"Каптал тилкесин кеңейтүү"},dashboardSidebarToggle:{close:"Каптал тилкесин жабуу",open:"Каптал тилкесин ачуу"},error:{clear:"Башкы бетке кайтуу"},fileUpload:{removeFile:"{filename} өчүрүү"},header:{close:"Менюну жабуу",open:"Менюну ачуу"},inputMenu:{create:'"{label}" жасоо',noData:"Маалымат жок",noMatch:"Эч нерсе табылган жок"},inputNumber:{decrement:"Азайтуу",increment:"Кошуу"},modal:{close:"Жабуу"},pricingTable:{caption:"Баалардын салыштыруу таблицасы"},prose:{codeCollapse:{closeText:"Жыйноо",name:"код",openText:"Кеңейтүү"},collapsible:{closeText:"Жашыруу",name:"касиеттер",openText:"Көрсөтүү"},pre:{copy:"Кодду алмашуу буферине көчүрүү"}},sidebar:{close:"Жабуу",toggle:"Которуу"},selectMenu:{create:'"{label}" жасоо',noData:"Маалымат жок",noMatch:"Сүйлөшкөн маалыматтар жок",search:"Издөө…"},slideover:{close:"Жабуу"},table:{noData:"Маалымат жок"},toast:{close:"Жабуу"}}}),Yz=be({name:"Lëtzebuergesch",code:"lb",messages:{alert:{close:"Zoumaachen"},authForm:{hidePassword:"Passwuert verstoppen",showPassword:"Passwuert uweisen",submit:"Fortschécken"},banner:{close:"Zoumaachen"},calendar:{nextMonth:"Nächste Mount",nextYear:"Nächst Joer",prevMonth:"Virege Mount",prevYear:"Viregt Joer"},carousel:{dots:"Wielt Dia fir ze weisen",goto:"Gitt op d'Slide {Slide}",next:"Näch.",prev:"Präz."},chatPrompt:{placeholder:"Tippt hei Äre Message…"},chatPromptSubmit:{label:"Prompt schécken"},chatReasoning:{thinking:"Denkt no…",thought:"Nogeduecht",thoughtFor:"{duration} nogeduecht"},colorMode:{dark:"Donkel",light:"Liicht",switchToDark:"Op de Donkelmodus wiesselen",switchToLight:"Op de Liichtmodus wiesselen",system:"System"},commandPalette:{back:"Zréck",close:"Zoumaachen",noData:"Keng Donnéeën",noMatch:"Keng entspriechend Donnéeën",placeholder:"Tippt e Befeel oder sicht…"},contentSearch:{links:"Linken",theme:"Thema"},contentSearchButton:{label:"Sichen…"},contentToc:{title:"Op dëser Säit"},dropdownMenu:{noMatch:"Keng entspriechend Donnéeën",search:"Sichen.."},dashboardSearch:{theme:"Thema"},dashboardSearchButton:{label:"Sichen…"},dashboardSidebarCollapse:{collapse:"Sidebar zouklappen",expand:"Sidebar opklappen"},dashboardSidebarToggle:{close:"Sidebar zoumaachen",open:"Sidebar opmaachen"},error:{clear:"Zréck op d'Startsäit"},fileUpload:{removeFile:"{filename} ewechhuelen"},header:{close:"Menü zoumaachen",open:"Menü opmaachen"},inputMenu:{create:'"{label}" erstellen',noData:"Keng Donnéeën",noMatch:"Keng entspriechend Donnéeën"},inputNumber:{decrement:"Dekrementéieren",increment:"Inkrementéieren"},modal:{close:"Zoumaachen"},pricingTable:{caption:"Vergläich vun de Präispläng"},prose:{codeCollapse:{closeText:"Zouklappen",name:"code",openText:"Opklappen"},collapsible:{closeText:"Verstoppen",name:"eegenschaften",openText:"Uweisen"},pre:{copy:"Code an d'Zwëschspäicher kopéieren"}},sidebar:{close:"Zoumaachen",toggle:"Ëmschalten"},selectMenu:{create:'"{label}" erstellen',noData:"Keng Donnéeën",noMatch:"Keng entspriechend Donnéeën",search:"Sichen.."},slideover:{close:"Zoumaachen"},table:{noData:"Keng Donnéeën"},toast:{close:"Zoumaachen"}}}),Zz=be({name:"ລາວ",code:"lo",messages:{alert:{close:"ປິດ"},authForm:{hidePassword:"ເຊື່ອງລະຫັດຜ່ານ",showPassword:"ສະແດງລະຫັດຜ່ານ",submit:"ດຳເນີນການຕໍ່"},banner:{close:"ປິດ"},calendar:{nextMonth:"ເດືອນໜ້າ",nextYear:"ປີໜ້າ",prevMonth:"ເດືອນກ່ອນ",prevYear:"ປີກ່ອນ"},carousel:{dots:"ເລືອກສະໄລ້ທີ່ຈະສະແດງ",goto:"ໄປທີ່ສະໄລ້ {slide}",next:"ຕໍ່ໄປ",prev:"ກ່ອນໜ້າ"},chatPrompt:{placeholder:"ພິມຂໍ້ຄວາມຂອງທ່ານທີ່ນີ້..."},chatPromptSubmit:{label:"ສົ່ງຄຳສັ່ງ"},chatReasoning:{thinking:"ກຳລັງຄິດ…",thought:"ຄິດແລ້ວ",thoughtFor:"ຄິດເປັນເວລາ {duration}"},colorMode:{dark:"ມືດ",light:"ແຈ້ງ",switchToDark:"ປ່ຽນເປັນໂຫມດມືດ",switchToLight:"ປ່ຽນເປັນໂຫມດແຈ້ງ",system:"ລະບົບ"},commandPalette:{back:"ກັບຄືນ",close:"ປິດ",noData:"ບໍ່ມີຂໍ້ມູນ",noMatch:"ບໍ່ພົບຂໍ້ມູນທີ່ກົງກັນ",placeholder:"ພິມຄຳສັ່ງ ຫຼື ຄົ້ນຫາ..."},contentSearch:{links:"ລິ້ງ",theme:"ທີມ"},contentSearchButton:{label:"ຄົ້ນຫາ..."},contentToc:{title:"ໃນໜ້ານີ້"},dropdownMenu:{noMatch:"ບໍ່ພົບຂໍ້ມູນທີ່ກົງກັນ",search:"ຄົ້ນຫາ..."},dashboardSearch:{theme:"ທີມ"},dashboardSearchButton:{label:"ຄົ້ນຫາ..."},dashboardSidebarCollapse:{collapse:"ຫຍໍ້ແຖບດ້ານຂ້າງ",expand:"ຂະຫຍາຍແຖບດ້ານຂ້າງ"},dashboardSidebarToggle:{close:"ປິດແຖບດ້ານຂ້າງ",open:"ເປີດແຖບດ້ານຂ້າງ"},error:{clear:"ກັບໄປໜ້າຫຼັກ"},fileUpload:{removeFile:"ລົບ {filename}"},header:{close:"ປິດເມນູ",open:"ເປີດເມນູ"},inputMenu:{create:'ສ້າງ "{label}"',noData:"ບໍ່ມີຂໍ້ມູນ",noMatch:"ບໍ່ພົບຂໍ້ມູນທີ່ກົງກັນ"},inputNumber:{decrement:"ຫຼຸດລົງ",increment:"ເພີ່ມຂຶ້ນ"},modal:{close:"ປິດ"},pricingTable:{caption:"ປຽບທຽບແພັກເກັດລາຄາ"},prose:{codeCollapse:{closeText:"ຫຍໍ້",name:"ໂຄ້ດ",openText:"ຂະຫຍາຍ"},collapsible:{closeText:"ເຊື່ອງ",name:"ຄຸນສົມບັດ",openText:"ສະແດງ"},pre:{copy:"ຄັດລອກໂຄ້ດ"}},sidebar:{close:"ປິດ",toggle:"ສະລັບ"},selectMenu:{create:'ສ້າງ "{label}"',noData:"ບໍ່ມີຂໍ້ມູນ",noMatch:"ບໍ່ພົບຂໍ້ມູນທີ່ກົງກັນ",search:"ຄົ້ນຫາ..."},slideover:{close:"ປິດ"},table:{noData:"ບໍ່ມີຂໍ້ມູນ"},toast:{close:"ປິດ"}}}),Xz=be({name:"Lietuvių",code:"lt",messages:{alert:{close:"Uždaryti"},authForm:{hidePassword:"Slėpti slaptažodį",showPassword:"Rodyti slaptažodį",submit:"Tęsti"},banner:{close:"Uždaryti"},calendar:{nextMonth:"Kitas mėnuo",nextYear:"Kiti metai",prevMonth:"Ankstesnis mėnuo",prevYear:"Ankstesni metai"},carousel:{dots:"Pasirinkite skaidrę rodymui",goto:"Eiti į skaidrę {slide}",next:"Pirmyn",prev:"Atgal"},chatPrompt:{placeholder:"Įveskite savo žinutę čia…"},chatPromptSubmit:{label:"Siųsti žinutę"},chatReasoning:{thinking:"Mąsto…",thought:"Pamąstė",thoughtFor:"Mąstė {duration}"},colorMode:{dark:"Tamsus",light:"Šviesus",switchToDark:"Perjungti į tamsų režimą",switchToLight:"Perjungti į šviesų režimą",system:"Sistema"},commandPalette:{back:"Atgal",close:"Uždaryti",noData:"Nėra duomenų",noMatch:"Nėra atitinkančių duomenų",placeholder:"Įveskite komandą arba ieškokite…"},contentSearch:{links:"Nuorodos",theme:"Tema"},contentSearchButton:{label:"Ieškoti…"},contentToc:{title:"Šiame puslapyje"},dropdownMenu:{noMatch:"Nėra atitinkančių duomenų",search:"Ieškoti…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Ieškoti…"},dashboardSidebarCollapse:{collapse:"Suskleisti šoninę juostą",expand:"Išplėsti šoninę juostą"},dashboardSidebarToggle:{close:"Uždaryti šoninę juostą",open:"Atidaryti šoninę juostą"},error:{clear:"Grįžti į pradžią"},fileUpload:{removeFile:"Pašalinti {filename}"},header:{close:"Uždaryti meniu",open:"Atidaryti meniu"},inputMenu:{create:'Sukurti „{label}"',noData:"Nėra duomenų",noMatch:"Nėra atitinkančių duomenų"},inputNumber:{decrement:"Sumažinti",increment:"Padidinti"},modal:{close:"Uždaryti"},pricingTable:{caption:"Kainų planų palyginimas"},prose:{codeCollapse:{closeText:"Suskleisti",name:"kodas",openText:"Išplėsti"},collapsible:{closeText:"Slėpti",name:"savybės",openText:"Rodyti"},pre:{copy:"Kopijuoti kodą į iškarpinę"}},sidebar:{close:"Uždaryti",toggle:"Perjungti"},selectMenu:{create:'Sukurti „{label}"',noData:"Nėra duomenų",noMatch:"Nėra atitinkančių duomenų",search:"Ieškoti…"},slideover:{close:"Uždaryti"},table:{noData:"Nėra duomenų"},toast:{close:"Uždaryti"}}}),Jz=be({name:"Монгол",code:"mn",messages:{alert:{close:"Хаах"},authForm:{hidePassword:"Нууц үгийг нуух",showPassword:"Нууц үгийг харуулах",submit:"Үргэлжлүүлэх"},banner:{close:"Хаах"},calendar:{nextMonth:"Дараа сар",nextYear:"Дараа жил",prevMonth:"Өмнөх сар",prevYear:"Өмнөх жил"},carousel:{dots:"Харуулах слайдыг сонгоно уу",goto:"{slide}-р хуудсанд шилжих",next:"Дараах",prev:"Өмнөх"},chatPrompt:{placeholder:"Энд мессежээ бичнэ үү…"},chatPromptSubmit:{label:"Мессеж илгээх"},chatReasoning:{thinking:"Бодож байна…",thought:"Бодсон",thoughtFor:"{duration} бодсон"},colorMode:{dark:"Хар",light:"Цагаан",switchToDark:"Хар горимд шилжих",switchToLight:"Цагаан горимд шилжих",system:"Систем"},commandPalette:{back:"Буцах",close:"Хаах",noData:"Мэдээлэл байхгүй",noMatch:"Тохирох мэдээлэл олдсонгүй",placeholder:"Комманд бичих эсвэл хайлт хийх…"},contentSearch:{links:"Холбоосууд",theme:"Загвар"},contentSearchButton:{label:"Хайх…"},contentToc:{title:"Энэ хуудсанд"},dropdownMenu:{noMatch:"Тохирох мэдээлэл олдсонгүй",search:"Хайх…"},dashboardSearch:{theme:"Загвар"},dashboardSearchButton:{label:"Хайх…"},dashboardSidebarCollapse:{collapse:"Хажуугийн самбарыг хураах",expand:"Хажуугийн самбарыг дэлгэх"},dashboardSidebarToggle:{close:"Хажуугийн самбарыг хаах",open:"Хажуугийн самбарыг нээх"},error:{clear:"Нүүр хуудас руу буцах"},fileUpload:{removeFile:"{filename} устгах"},header:{close:"Цэсийг хаах",open:"Цэсийг нээх"},inputMenu:{create:'"{label}" үүсгэх',noData:"Мэдээлэл байхгүй",noMatch:"Тохирох мэдээлэл олдсонгүй"},inputNumber:{decrement:"Хасах",increment:"Нэмэх"},modal:{close:"Хаах"},pricingTable:{caption:"Үнийн төлөвлөгөөний харьцуулалт"},prose:{codeCollapse:{closeText:"Хураах",name:"код",openText:"Дэлгэх"},collapsible:{closeText:"Нуух",name:"шинж чанарууд",openText:"Харуулах"},pre:{copy:"Кодыг санах ойд хуулах"}},sidebar:{close:"Хаах",toggle:"Сэлгэх"},selectMenu:{create:'"{label}" үүсгэх',noData:"Мэдээлэл байхгүй",noMatch:"Тохирох мэдээлэл олдсонгүй",search:"Хайх…"},slideover:{close:"Хаах"},table:{noData:"Мэдээлэл байхгүй"},toast:{close:"Хаах"}}}),Qz=be({name:"Melayu",code:"ms",messages:{alert:{close:"Tutup"},authForm:{hidePassword:"Sembunyikan kata laluan",showPassword:"Tunjukkan kata laluan",submit:"Teruskan"},banner:{close:"Tutup"},calendar:{nextMonth:"Bulan seterusnya",nextYear:"Tahun seterusnya",prevMonth:"Bulan sebelum",prevYear:"Tahun sebelum"},carousel:{dots:"Pilih slaid untuk dipaparkan",goto:"Pergi ke slaid {slide}",next:"Seterusnya",prev:"Sebelum"},chatPrompt:{placeholder:"Taip mesej anda di sini…"},chatPromptSubmit:{label:"Hantar mesej"},chatReasoning:{thinking:"Berfikir…",thought:"Telah berfikir",thoughtFor:"Berfikir selama {duration}"},colorMode:{dark:"Gelap",light:"Cerah",switchToDark:"Tukar ke mod gelap",switchToLight:"Tukar ke mod cerah",system:"Sistem"},commandPalette:{back:"Kembali",close:"Tutup",noData:"Tiada data",noMatch:"Tiada data yang sepadan",placeholder:"Taip arahan atau carian…"},contentSearch:{links:"Pautan",theme:"Tema"},contentSearchButton:{label:"Cari…"},contentToc:{title:"Di halaman ini"},dropdownMenu:{noMatch:"Tiada data yang sepadan",search:"Cari…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Cari…"},dashboardSidebarCollapse:{collapse:"Runtuhkan bar sisi",expand:"Kembangkan bar sisi"},dashboardSidebarToggle:{close:"Tutup bar sisi",open:"Buka bar sisi"},error:{clear:"Kembali ke laman utama"},fileUpload:{removeFile:"Buang {filename}"},header:{close:"Tutup menu",open:"Buka menu"},inputMenu:{create:'Cipta "{label}"',noData:"Tiada data",noMatch:"Tiada data yang sepadan"},inputNumber:{decrement:"Kurangkan",increment:"Naikkan"},modal:{close:"Tutup"},pricingTable:{caption:"Perbandingan pelan harga"},prose:{codeCollapse:{closeText:"Runtuhkan",name:"kod",openText:"Kembangkan"},collapsible:{closeText:"Sembunyikan",name:"ciri",openText:"Tunjukkan"},pre:{copy:"Salin kod ke papan klip"}},sidebar:{close:"Tutup",toggle:"Togol"},selectMenu:{create:'Cipta "{label}"',noData:"Tiada data",noMatch:"Tiada data yang sepadan",search:"Cari…"},slideover:{close:"Tutup"},table:{noData:"Tiada data"},toast:{close:"Tutup"}}}),eU=be({name:"Norsk Bokmål",code:"nb-NO",messages:{alert:{close:"Lukk"},authForm:{hidePassword:"Skjul passord",showPassword:"Vis passord",submit:"Fortsett"},banner:{close:"Lukk"},calendar:{nextMonth:"Neste måned",nextYear:"Neste år",prevMonth:"Forrige måned",prevYear:"Forrige år"},carousel:{dots:"Velg lysbilde som skal vises",goto:"Gå til lysbilde {slide}",next:"Neste",prev:"Forrige"},chatPrompt:{placeholder:"Skriv din melding her…"},chatPromptSubmit:{label:"Send"},chatReasoning:{thinking:"Tenker…",thought:"Tenkte",thoughtFor:"Tenkte i {duration}"},colorMode:{dark:"Mørk",light:"Lys",switchToDark:"Bytt til mørk modus",switchToLight:"Bytt til lys modus",system:"System"},commandPalette:{back:"Tilbake",close:"Lukk",noData:"Ingen data",noMatch:"Ingen samsvarende data",placeholder:"Skriv inn en kommando eller søk…"},contentSearch:{links:"Lenker",theme:"Tema"},contentSearchButton:{label:"Søk…"},contentToc:{title:"På denne siden"},dropdownMenu:{noMatch:"Ingen samsvarende data",search:"Søk…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Søk…"},dashboardSidebarCollapse:{collapse:"Skjul sidepanel",expand:"Utvid sidepanel"},dashboardSidebarToggle:{close:"Lukk sidepanel",open:"Åpne sidepanel"},error:{clear:"Tilbake til forsiden"},fileUpload:{removeFile:"Fjern {filename}"},header:{close:"Lukk meny",open:"Åpne meny"},inputMenu:{create:'Opprett "{label}"',noData:"Ingen data",noMatch:"Ingen samsvarende data"},inputNumber:{decrement:"Reduser",increment:"Øk"},modal:{close:"Lukk"},pricingTable:{caption:"Prisplaneringssammenligning"},prose:{codeCollapse:{closeText:"Skjul",name:"kode",openText:"Utvid"},collapsible:{closeText:"Skjul",name:"egenskaper",openText:"Vis"},pre:{copy:"Kopier kode til utklippstavle"}},sidebar:{close:"Lukk",toggle:"Veksle"},selectMenu:{create:'Opprett "{label}"',noData:"Ingen data",noMatch:"Ingen samsvarende data",search:"Søk…"},slideover:{close:"Lukk"},table:{noData:"Ingen data"},toast:{close:"Lukk"}}}),tU=be({name:"Nederlands",code:"nl",messages:{alert:{close:"Sluiten"},authForm:{hidePassword:"Wachtwoord verbergen",showPassword:"Wachtwoord tonen",submit:"Doorgaan"},banner:{close:"Sluiten"},calendar:{nextMonth:"Volgende maand",nextYear:"Volgend jaar",prevMonth:"Vorige maand",prevYear:"Vorig jaar"},carousel:{dots:"Kies dia om weer te geven",goto:"Ga naar dia {slide}",next:"Volgende",prev:"Vorige"},chatPrompt:{placeholder:"Schrijf hier je bericht…"},chatPromptSubmit:{label:"Versturen"},chatReasoning:{thinking:"Aan het denken…",thought:"Nagedacht",thoughtFor:"{duration} nagedacht"},colorMode:{dark:"Donker",light:"Licht",switchToDark:"Overschakelen naar donkere modus",switchToLight:"Overschakelen naar lichte modus",system:"Systeem"},commandPalette:{back:"Terug",close:"Sluiten",noData:"Geen gegevens",noMatch:"Geen overeenkomende gegevens",placeholder:"Typ een commando of zoek…"},contentSearch:{links:"Links",theme:"Thema"},contentSearchButton:{label:"Zoeken…"},contentToc:{title:"Op deze pagina"},dropdownMenu:{noMatch:"Geen overeenkomende gegevens",search:"Zoeken…"},dashboardSearch:{theme:"Thema"},dashboardSearchButton:{label:"Zoeken…"},dashboardSidebarCollapse:{collapse:"Zijbalk invouwen",expand:"Zijbalk uitvouwen"},dashboardSidebarToggle:{close:"Zijbalk sluiten",open:"Zijbalk openen"},error:{clear:"Terug naar home"},fileUpload:{removeFile:"{filename} verwijderen"},header:{close:"Menu sluiten",open:"Menu openen"},inputMenu:{create:'"{label}" creëren',noData:"Geen gegevens",noMatch:"Geen overeenkomende gegevens"},inputNumber:{decrement:"Verlagen",increment:"Verhogen"},modal:{close:"Sluiten"},pricingTable:{caption:"Prijsplanvergelijking"},prose:{codeCollapse:{closeText:"Invouwen",name:"code",openText:"Uitvouwen"},collapsible:{closeText:"Verbergen",name:"eigenschappen",openText:"Tonen"},pre:{copy:"Code naar klembord kopiëren"}},sidebar:{close:"Sluiten",toggle:"Schakelen"},selectMenu:{create:'"{label}" creëren',noData:"Geen gegevens",noMatch:"Geen overeenkomende gegevens",search:"Zoeken…"},slideover:{close:"Sluiten"},table:{noData:"Geen gegevens"},toast:{close:"Sluiten"}}}),nU=be({name:"Polski",code:"pl",messages:{alert:{close:"Zamknij"},authForm:{hidePassword:"Ukryj hasło",showPassword:"Pokaż hasło",submit:"Kontynuuj"},banner:{close:"Zamknij"},calendar:{nextMonth:"Przyszły miesiąc",nextYear:"Przyszły rok",prevMonth:"Poprzedni miesiąc",prevYear:"Poprzedni rok"},carousel:{dots:"Wybierz slajd do wyświetlenia",goto:"Idź do {slide}",next:"Następny",prev:"Poprzedni"},chatPrompt:{placeholder:"Tutaj wpisz swoją wiadomość…"},chatPromptSubmit:{label:"Wyślij"},chatReasoning:{thinking:"Myśli…",thought:"Myślenie zakończone",thoughtFor:"Myślenie zajęło {duration}"},colorMode:{dark:"Ciemny",light:"Jasny",switchToDark:"Przełącz na tryb ciemny",switchToLight:"Przełącz na tryb jasny",system:"System"},commandPalette:{back:"Wstecz",close:"Zamknij",noData:"Brak danych",noMatch:"Brak pasujących danych",placeholder:"Wpisz polecenie lub wyszukaj…"},contentSearch:{links:"Linki",theme:"Motyw"},contentSearchButton:{label:"Szukaj…"},contentToc:{title:"Na tej stronie"},dropdownMenu:{noMatch:"Brak pasujących danych",search:"Szukaj…"},dashboardSearch:{theme:"Motyw"},dashboardSearchButton:{label:"Szukaj…"},dashboardSidebarCollapse:{collapse:"Zwiń pasek boczny",expand:"Rozwiń pasek boczny"},dashboardSidebarToggle:{close:"Zamknij pasek boczny",open:"Otwórz pasek boczny"},error:{clear:"Powrót do strony głównej"},fileUpload:{removeFile:"Usuń {filename}"},header:{close:"Zamknij menu",open:"Otwórz menu"},inputMenu:{create:'Utwórz "{label}"',noData:"Brak danych",noMatch:"Brak pasujących danych"},inputNumber:{decrement:"Zmniejsz",increment:"Zwiększ"},modal:{close:"Zamknij"},pricingTable:{caption:"Porównanie planów cenowych"},prose:{codeCollapse:{closeText:"Zwiń",name:"kod",openText:"Rozwiń"},collapsible:{closeText:"Ukryj",name:"właściwości",openText:"Pokaż"},pre:{copy:"Kopiuj kod do schowka"}},sidebar:{close:"Zamknij",toggle:"Przełącz"},selectMenu:{create:'Utwórz "{label}"',noData:"Brak danych",noMatch:"Brak pasujących danych",search:"Szukaj…"},slideover:{close:"Zamknij"},table:{noData:"Brak danych"},toast:{close:"Zamknij"}}}),oU=be({name:"Português",code:"pt",messages:{alert:{close:"Fechar"},authForm:{hidePassword:"Ocultar senha",showPassword:"Mostrar senha",submit:"Continuar"},banner:{close:"Fechar"},calendar:{nextMonth:"Próximo mês",nextYear:"Próximo ano",prevMonth:"Mês anterior",prevYear:"Ano anterior"},carousel:{dots:"Escolher slide para exibir",goto:"Ir ao diapositivo {slide}",next:"Próximo",prev:"Anterior"},chatPrompt:{placeholder:"Escreva a sua mensagem aqui…"},chatPromptSubmit:{label:"Enviar"},chatReasoning:{thinking:"A pensar…",thought:"Pensou",thoughtFor:"Pensou durante {duration}"},colorMode:{dark:"Escuro",light:"Claro",switchToDark:"Mudar para modo escuro",switchToLight:"Mudar para modo claro",system:"Sistema"},commandPalette:{back:"Voltar",close:"Fechar",noData:"Sem dados",noMatch:"Nenhum dado correspondente",placeholder:"Digite um comando ou pesquise…"},contentSearch:{links:"Links",theme:"Tema"},contentSearchButton:{label:"Pesquisar…"},contentToc:{title:"Nesta página"},dropdownMenu:{noMatch:"Nenhum dado correspondente",search:"Pesquisar…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Pesquisar…"},dashboardSidebarCollapse:{collapse:"Recolher barra lateral",expand:"Expandir barra lateral"},dashboardSidebarToggle:{close:"Fechar barra lateral",open:"Abrir barra lateral"},error:{clear:"Voltar para a página inicial"},fileUpload:{removeFile:"Remover {filename}"},header:{close:"Fechar menu",open:"Abrir menu"},inputMenu:{create:'Criar "{label}"',noData:"Sem dados",noMatch:"Nenhum dado correspondente"},inputNumber:{decrement:"Decrementar",increment:"Incrementar"},modal:{close:"Fechar"},pricingTable:{caption:"Comparação de planos de preços"},prose:{codeCollapse:{closeText:"Recolher",name:"código",openText:"Expandir"},collapsible:{closeText:"Ocultar",name:"propriedades",openText:"Mostrar"},pre:{copy:"Copiar código para a área de transferência"}},sidebar:{close:"Fechar",toggle:"Alternar"},selectMenu:{create:'Criar "{label}"',noData:"Sem dados",noMatch:"Nenhum dado correspondente",search:"Pesquisar…"},slideover:{close:"Fechar"},table:{noData:"Sem dados"},toast:{close:"Fechar"}}}),rU=be({name:"Português (Brasil)",code:"pt-BR",messages:{alert:{close:"Fechar"},authForm:{hidePassword:"Ocultar senha",showPassword:"Mostrar senha",submit:"Continuar"},banner:{close:"Fechar"},calendar:{nextMonth:"Próximo mês",nextYear:"Próximo ano",prevMonth:"Mês anterior",prevYear:"Ano anterior"},carousel:{dots:"Escolher slide para exibir",goto:"Ir para a slide {slide}",next:"Próximo",prev:"Anterior"},chatPrompt:{placeholder:"Escreva sua mensagem aqui…"},chatPromptSubmit:{label:"Enviar"},chatReasoning:{thinking:"Pensando…",thought:"Pensou",thoughtFor:"Pensou por {duration}"},colorMode:{dark:"Escuro",light:"Claro",switchToDark:"Mudar para modo escuro",switchToLight:"Mudar para modo claro",system:"Sistema"},commandPalette:{back:"Voltar",close:"Fechar",noData:"Nenhum dado",noMatch:"Nenhum dado correspondente",placeholder:"Digite um comando ou pesquise…"},contentSearch:{links:"Links",theme:"Tema"},contentSearchButton:{label:"Pesquisar…"},contentToc:{title:"Nesta página"},dropdownMenu:{noMatch:"Nenhum dado correspondente",search:"Pesquisar…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Pesquisar…"},dashboardSidebarCollapse:{collapse:"Recolher barra lateral",expand:"Expandir barra lateral"},dashboardSidebarToggle:{close:"Fechar barra lateral",open:"Abrir barra lateral"},error:{clear:"Voltar para a página inicial"},fileUpload:{removeFile:"Remover {filename}"},header:{close:"Fechar menu",open:"Abrir menu"},inputMenu:{create:'Criar "{label}"',noData:"Nenhum dado",noMatch:"Nenhum dado correspondente"},inputNumber:{decrement:"Decrementar",increment:"Incrementar"},modal:{close:"Fechar"},pricingTable:{caption:"Comparação de planos de preços"},prose:{codeCollapse:{closeText:"Recolher",name:"código",openText:"Expandir"},collapsible:{closeText:"Ocultar",name:"propriedades",openText:"Mostrar"},pre:{copy:"Copiar código para a área de transferência"}},sidebar:{close:"Fechar",toggle:"Alternar"},selectMenu:{create:'Criar "{label}"',noData:"Nenhum dado",noMatch:"Nenhum dado correspondente",search:"Pesquisar…"},slideover:{close:"Fechar"},table:{noData:"Nenhum dado"},toast:{close:"Fechar"}}}),uU=be({name:"Română",code:"ro",messages:{alert:{close:"Închide"},authForm:{hidePassword:"Ascunde parola",showPassword:"Arată parola",submit:"Continuă"},banner:{close:"Închide"},calendar:{nextMonth:"Luna următoare",nextYear:"Anul următor",prevMonth:"Luna precedentă",prevYear:"Anul precedent"},carousel:{dots:"Alegeți diapozitivul de afișat",goto:"Mergi la diapozitivul {slide}",next:"Următor",prev:"Anterior"},chatPrompt:{placeholder:"Scrieți mesajul dvs. aici…"},chatPromptSubmit:{label:"Trimite"},chatReasoning:{thinking:"Se gândește…",thought:"A gândit",thoughtFor:"A gândit {duration}"},colorMode:{dark:"Întunecat",light:"Luminos",switchToDark:"Comută la modul întunecat",switchToLight:"Comută la modul luminos",system:"Sistem"},commandPalette:{back:"Înapoi",close:"Închide",noData:"Nu există date",noMatch:"Nu există date corespunzătoare",placeholder:"Tastează o comandă sau caută…"},contentSearch:{links:"Linkuri",theme:"Temă"},contentSearchButton:{label:"Caută…"},contentToc:{title:"Pe această pagină"},dropdownMenu:{noMatch:"Nu există date corespunzătoare",search:"Caută…"},dashboardSearch:{theme:"Temă"},dashboardSearchButton:{label:"Caută…"},dashboardSidebarCollapse:{collapse:"Restrânge bara laterală",expand:"Extinde bara laterală"},dashboardSidebarToggle:{close:"Închide bara laterală",open:"Deschide bara laterală"},error:{clear:"Înapoi la pagina principală"},fileUpload:{removeFile:"Elimină {filename}"},header:{close:"Închide meniul",open:"Deschide meniul"},inputMenu:{create:'Creează "{label}"',noData:"Nu există date",noMatch:"Nu există date corespunzătoare"},inputNumber:{decrement:"Scade",increment:"Crește"},modal:{close:"Închide"},pricingTable:{caption:"Comparare prețuri"},prose:{codeCollapse:{closeText:"Restrânge",name:"cod",openText:"Extinde"},collapsible:{closeText:"Ascunde",name:"proprietăți",openText:"Afișează"},pre:{copy:"Copiază codul în clipboard"}},sidebar:{close:"Închide",toggle:"Comutare"},selectMenu:{create:'Creează "{label}"',noData:"Nu există date",noMatch:"Nu există date corespunzătoare",search:"Caută…"},slideover:{close:"Închide"},table:{noData:"Nu există date"},toast:{close:"Închide"}}}),aU=be({name:"Русский",code:"ru",messages:{alert:{close:"Закрыть"},authForm:{hidePassword:"Скрыть пароль",showPassword:"Показать пароль",submit:"Продолжить"},banner:{close:"Закрыть"},calendar:{nextMonth:"Следующий месяц",nextYear:"Следующий год",prevMonth:"Предыдущий месяц",prevYear:"Предыдущий год"},carousel:{dots:"Выберите слайд для отображения",goto:"Перейти к {slide}",next:"Далее",prev:"Назад"},chatPrompt:{placeholder:"Введите ваше сообщение здесь…"},chatPromptSubmit:{label:"Отправить"},chatReasoning:{thinking:"Размышляет…",thought:"Размышление завершено",thoughtFor:"Размышление заняло {duration}"},colorMode:{dark:"Тёмная",light:"Светлая",switchToDark:"Переключиться на тёмный режим",switchToLight:"Переключиться на светлый режим",system:"Системная"},commandPalette:{back:"Назад",close:"Закрыть",noData:"Нет данных",noMatch:"Совпадений не найдено",placeholder:"Введите команду или выполните поиск…"},contentSearch:{links:"Ссылки",theme:"Тема"},contentSearchButton:{label:"Поиск…"},contentToc:{title:"На этой странице"},dropdownMenu:{noMatch:"Совпадений не найдено",search:"Поиск…"},dashboardSearch:{theme:"Тема"},dashboardSearchButton:{label:"Поиск…"},dashboardSidebarCollapse:{collapse:"Свернуть боковую панель",expand:"Развернуть боковую панель"},dashboardSidebarToggle:{close:"Закрыть боковую панель",open:"Открыть боковую панель"},error:{clear:"Вернуться на главную"},fileUpload:{removeFile:"Удалить {filename}"},header:{close:"Закрыть меню",open:"Открыть меню"},inputMenu:{create:'Создать "{label}"',noData:"Нет данных",noMatch:"Совпадений не найдено"},inputNumber:{decrement:"Уменьшить",increment:"Увеличить"},modal:{close:"Закрыть"},pricingTable:{caption:"Сравнение ценных планов"},prose:{codeCollapse:{closeText:"Свернуть",name:"код",openText:"Развернуть"},collapsible:{closeText:"Скрыть",name:"свойства",openText:"Показать"},pre:{copy:"Скопировать код в буфер обмена"}},sidebar:{close:"Закрыть",toggle:"Переключить"},selectMenu:{create:'Создать "{label}"',noData:"Нет данных",noMatch:"Совпадений не найдено",search:"Поиск…"},slideover:{close:"Закрыть"},table:{noData:"Нет данных"},toast:{close:"Закрыть"}}}),sU=be({name:"Slovenčina",code:"sk",messages:{alert:{close:"Zatvoriť"},authForm:{hidePassword:"Skryť heslo",showPassword:"Zobraziť heslo",submit:"Pokračovať"},banner:{close:"Zatvoriť"},calendar:{nextMonth:"Nasledujúci mesiac",nextYear:"Nasledujúci rok",prevMonth:"Predchádzajúci mesiac",prevYear:"Predchádzajúci rok"},carousel:{dots:"Vyberte snímku na zobrazenie",goto:"Prejsť na {slide}",next:"Nasledujúci",prev:"Predchádzajúci"},chatPrompt:{placeholder:"Tu napíšte svoje správu…"},chatPromptSubmit:{label:"Odoslať"},chatReasoning:{thinking:"Premýšľa…",thought:"Premýšľal",thoughtFor:"Premýšľal {duration}"},colorMode:{dark:"Tmavý",light:"Svetlý",switchToDark:"Prepnúť na tmavý režim",switchToLight:"Prepnúť na svetlý režim",system:"Systém"},commandPalette:{back:"Späť",close:"Zavrieť",noData:"Žiadne dáta",noMatch:"Žiadna zhoda",placeholder:"Zadajte príkaz alebo vyhľadajte…"},contentSearch:{links:"Odkazy",theme:"Farebný režim"},contentSearchButton:{label:"Hľadať…"},contentToc:{title:"Na tejto stránke"},dropdownMenu:{noMatch:"Žiadna zhoda",search:"Hľadať…"},dashboardSearch:{theme:"Farebný režim"},dashboardSearchButton:{label:"Hľadať…"},dashboardSidebarCollapse:{collapse:"Zbaliť bočný panel",expand:"Rozbaliť bočný panel"},dashboardSidebarToggle:{close:"Zatvoriť bočný panel",open:"Otvoriť bočný panel"},error:{clear:"Späť na domovskú stránku"},fileUpload:{removeFile:"Odobrať {filename}"},header:{close:"Zatvoriť menu",open:"Otvoriť menu"},inputMenu:{create:'Vytvoriť "{label}"',noData:"Žiadne dáta",noMatch:"Žiadna zhoda"},inputNumber:{decrement:"Znížiť",increment:"Zvýšiť"},modal:{close:"Zatvoriť"},pricingTable:{caption:"Porovnanie cien"},prose:{codeCollapse:{closeText:"Zbaliť",name:"kód",openText:"Rozbaliť"},collapsible:{closeText:"Skryť",name:"vlastnosti",openText:"Zobraziť"},pre:{copy:"Kopírovať kód do schránky"}},sidebar:{close:"Zatvoriť",toggle:"Prepnúť"},selectMenu:{create:'Vytvoriť "{label}"',noData:"Žiadne dáta",noMatch:"Žiadna zhoda",search:"Hľadať…"},slideover:{close:"Zatvoriť"},table:{noData:"Žiadne dáta"},toast:{close:"Zatvoriť"}}}),iU=be({name:"Slovenščina",code:"sl",messages:{alert:{close:"Zapri"},authForm:{hidePassword:"Skrij geslo",showPassword:"Prikaži geslo",submit:"Nadaljuj"},banner:{close:"Zapri"},calendar:{nextMonth:"Naslednji mesec",nextYear:"Naslednje leto",prevMonth:"Prejšnji mesec",prevYear:"Prejšnje leto"},carousel:{dots:"Izberite diapozitiv za prikaz",goto:"Pojdi na {slide}",next:"Naprej",prev:"Nazaj"},chatPrompt:{placeholder:"Tukaj napišite svoje sporočilo…"},chatPromptSubmit:{label:"Pošlji sporočilo"},chatReasoning:{thinking:"Razmišlja…",thought:"Razmislil",thoughtFor:"Razmišljal {duration}"},colorMode:{dark:"Temno",light:"Svetlo",switchToDark:"Preklopi na temni način",switchToLight:"Preklopi na svetli način",system:"Sistem"},commandPalette:{back:"Nazaj",close:"Zapri",noData:"Ni podatkov",noMatch:"Ni ujemanj",placeholder:"Vpiši ukaz ali išči…"},contentSearch:{links:"Povezave",theme:"Tema"},contentSearchButton:{label:"Išči…"},contentToc:{title:"Na tej strani"},dropdownMenu:{noMatch:"Ni ujemanj",search:"Išči…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Išči…"},dashboardSidebarCollapse:{collapse:"Strni stransko vrstico",expand:"Razširi stransko vrstico"},dashboardSidebarToggle:{close:"Zapri stransko vrstico",open:"Odpri stransko vrstico"},error:{clear:"Nazaj na domačo stran"},fileUpload:{removeFile:"Odstrani {filename}"},header:{close:"Zapri meni",open:"Odpri meni"},inputMenu:{create:'Ustvari "{label}"',noData:"Ni podatkov",noMatch:"Ni ujemanj"},inputNumber:{decrement:"Zmanjšaj",increment:"Povišaj"},modal:{close:"Zapri"},pricingTable:{caption:"Primerjava cenovnih načrtov"},prose:{codeCollapse:{closeText:"Strni",name:"koda",openText:"Razširi"},collapsible:{closeText:"Skrij",name:"lastnosti",openText:"Prikaži"},pre:{copy:"Kopiraj kodo v odložišče"}},sidebar:{close:"Zapri",toggle:"Preklopi"},selectMenu:{create:'Ustvari "{label}"',noData:"Ni podatkov",noMatch:"Ni ujemanj",search:"Išči…"},slideover:{close:"Zapri"},table:{noData:"Ni podatkov"},toast:{close:"Zapri"}}}),lU=be({name:"Shqip",code:"sq",messages:{alert:{close:"Mbyll"},authForm:{hidePassword:"Fshih fjalëkalimin",showPassword:"Shfaq fjalëkalimin",submit:"Vazhdo"},banner:{close:"Mbyll"},calendar:{nextMonth:"Muaji tjetër",nextYear:"Viti tjetër",prevMonth:"Muaji i kaluar",prevYear:"Viti i kaluar"},carousel:{dots:"Zgjidh slajdin për të shfaqur",goto:"Shko te slajdi {slide}",next:"Tjetri",prev:"Para"},chatPrompt:{placeholder:"Shkruaj mesazhin tënd këtu…"},chatPromptSubmit:{label:"Dërgo mesazhin"},chatReasoning:{thinking:"Po mendon…",thought:"Mendoi",thoughtFor:"Mendoi për {duration}"},colorMode:{dark:"Errët",light:"Ndritshëm",switchToDark:"Kalo në modalitetin e errët",switchToLight:"Kalo në modalitetin e ndritshëm",system:"Sistem"},commandPalette:{back:"Pas",close:"Mbyll",noData:"Nuk ka të dhëna",noMatch:"Nuk ka të dhëna që përputhen",placeholder:"Shkruaj një komandë ose kërko…"},contentSearch:{links:"Lidhje",theme:"Tema"},contentSearchButton:{label:"Kërko…"},contentToc:{title:"Në këtë faqe"},dropdownMenu:{noMatch:"Nuk ka të dhëna që përputhen",search:"Kërko…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Kërko…"},dashboardSidebarCollapse:{collapse:"Palos panelin anësor",expand:"Zgjero panelin anësor"},dashboardSidebarToggle:{close:"Mbyll panelin anësor",open:"Hap panelin anësor"},error:{clear:"Kthehu në kryefaqe"},fileUpload:{removeFile:"Hiq {filename}"},header:{close:"Mbyll menunë",open:"Hap menunë"},inputMenu:{create:'Krijo "{label}"',noData:"Nuk ka të dhëna",noMatch:"Nuk ka të dhëna që përputhen"},inputNumber:{decrement:"Zvogëlo",increment:"Rrit"},modal:{close:"Mbyll"},pricingTable:{caption:"Krahasimi i planeve të çmimeve"},prose:{codeCollapse:{closeText:"Palos",name:"kodi",openText:"Zgjero"},collapsible:{closeText:"Fshih",name:"vetitë",openText:"Shfaq"},pre:{copy:"Kopjo kodin në kujtesë"}},sidebar:{close:"Mbyll",toggle:"Ndërro"},selectMenu:{create:'Krijo "{label}"',noData:"Nuk ka të dhëna",noMatch:"Nuk ka të dhëna që përputhen",search:"Kërko…"},slideover:{close:"Mbyll"},table:{noData:"Nuk ka të dhëna"},toast:{close:"Mbyll"}}}),cU=be({name:"Svenska",code:"sv",messages:{alert:{close:"Stäng"},authForm:{hidePassword:"Dölj lösenord",showPassword:"Visa lösenord",submit:"Fortsätt"},banner:{close:"Stäng"},calendar:{nextMonth:"Nästa månad",nextYear:"Nästa år",prevMonth:"Föregående månad",prevYear:"Föregående år"},carousel:{dots:"Välj bild att visa",goto:"Gå till {slide}",next:"Nästa",prev:"Föregående"},chatPrompt:{placeholder:"Skriv ditt meddelande här…"},chatPromptSubmit:{label:"Skicka"},chatReasoning:{thinking:"Tänker…",thought:"Tänkte",thoughtFor:"Tänkte i {duration}"},colorMode:{dark:"Mörkt",light:"Ljust",switchToDark:"Byt till mörkt läge",switchToLight:"Byt till ljust läge",system:"System"},commandPalette:{back:"Tillbaka",close:"Stäng",noData:"Inga data",noMatch:"Inga matchande data",placeholder:"Skriv ett kommando eller sök…"},contentSearch:{links:"Länkar",theme:"Tema"},contentSearchButton:{label:"Sök…"},contentToc:{title:"På denna sida"},dropdownMenu:{noMatch:"Inga matchande data",search:"Sök…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Sök…"},dashboardSidebarCollapse:{collapse:"Minimera sidofältet",expand:"Expandera sidofältet"},dashboardSidebarToggle:{close:"Stäng sidofältet",open:"Öppna sidofältet"},error:{clear:"Tillbaka till startsidan"},fileUpload:{removeFile:"Ta bort {filename}"},header:{close:"Stäng menyn",open:"Öppna menyn"},inputMenu:{create:'Skapa "{label}"',noData:"Inga data",noMatch:"Inga matchande data"},inputNumber:{decrement:"Minska",increment:"Öka"},modal:{close:"Stäng"},pricingTable:{caption:"Prisplanering"},prose:{codeCollapse:{closeText:"Minimera",name:"kod",openText:"Expandera"},collapsible:{closeText:"Dölj",name:"egenskaper",openText:"Visa"},pre:{copy:"Kopiera kod till urklipp"}},sidebar:{close:"Stäng",toggle:"Växla"},selectMenu:{create:'Skapa "{label}"',noData:"Inga data",noMatch:"Inga matchande data",search:"Sök…"},slideover:{close:"Stäng"},table:{noData:"Inga data"},toast:{close:"Stäng"}}}),dU=be({name:"ไทย",code:"th",messages:{alert:{close:"ปิด"},authForm:{hidePassword:"ซ่อนรหัสผ่าน",showPassword:"แสดงรหัสผ่าน",submit:"ดำเนินการต่อ"},banner:{close:"ปิด"},calendar:{nextMonth:"เดือนถัดไป",nextYear:"ปีถัดไป",prevMonth:"เดือนก่อนหน้า",prevYear:"ปีก่อนหน้า"},carousel:{dots:"เลือกสไลด์ที่จะแสดง",goto:"ไปที่ {slide}",next:"ถัดไป",prev:"ย้อนกลับ"},chatPrompt:{placeholder:"กรุณาป้อนข้อความของคุณที่นี่…"},chatPromptSubmit:{label:"ส่ง"},chatReasoning:{thinking:"กำลังคิด…",thought:"คิดแล้ว",thoughtFor:"คิดเป็นเวลา {duration}"},colorMode:{dark:"มืด",light:"สว่าง",switchToDark:"เปลี่ยนเป็นโหมดมืด",switchToLight:"เปลี่ยนเป็นโหมดสว่าง",system:"ระบบ"},commandPalette:{back:"ย้อนกลับ",close:"ปิด",noData:"ไม่มีข้อมูล",noMatch:"ไม่พบข้อมูลที่ตรงกัน",placeholder:"พิมพ์คำสั่งหรือค้นหา…"},contentSearch:{links:"ลิงก์",theme:"ธีม"},contentSearchButton:{label:"ค้นหา…"},contentToc:{title:"ในหน้านี้"},dropdownMenu:{noMatch:"ไม่พบข้อมูลที่ตรงกัน",search:"ค้นหา…"},dashboardSearch:{theme:"ธีม"},dashboardSearchButton:{label:"ค้นหา…"},dashboardSidebarCollapse:{collapse:"ย่อแถบด้านข้าง",expand:"ขยายแถบด้านข้าง"},dashboardSidebarToggle:{close:"ปิดแถบด้านข้าง",open:"เปิดแถบด้านข้าง"},error:{clear:"กลับไปยังหน้าหลัก"},fileUpload:{removeFile:"ลบ {filename}"},header:{close:"ปิดเมนู",open:"เปิดเมนู"},inputMenu:{create:'สร้าง "{label}"',noData:"ไม่มีข้อมูล",noMatch:"ไม่พบข้อมูลที่ตรงกัน"},inputNumber:{decrement:"ลด",increment:"เพิ่ม"},modal:{close:"ปิด"},pricingTable:{caption:"การเปรียบเทียบราคาสินค้า"},prose:{codeCollapse:{closeText:"ย่อ",name:"โค้ด",openText:"ขยาย"},collapsible:{closeText:"ซ่อน",name:"คุณสมบัติ",openText:"แสดง"},pre:{copy:"คัดลอกโค้ดไปยังคลิปบอร์ด"}},sidebar:{close:"ปิด",toggle:"สลับ"},selectMenu:{create:'สร้าง "{label}"',noData:"ไม่มีข้อมูล",noMatch:"ไม่พบข้อมูลที่ตรงกัน",search:"ค้นหา…"},slideover:{close:"ปิด"},table:{noData:"ไม่มีข้อมูล"},toast:{close:"ปิด"}}}),fU=be({name:"Тоҷикӣ",code:"tj",messages:{alert:{close:"Бастан"},authForm:{hidePassword:"Пинҳон кардани парол",showPassword:"Намоиши парол",submit:"Идома додан"},banner:{close:"Пӯшидан"},calendar:{nextMonth:"Моҳи оянда",nextYear:"Соли оянда",prevMonth:"Моҳи гузашта",prevYear:"Соли гузашта"},carousel:{dots:"Слайдро барои намоиш интихоб кунед",goto:"Ба слайди {slide} гузаред",next:"Баъдӣ",prev:"Қаблӣ"},chatPrompt:{placeholder:"Пайём ворид кунед…"},chatPromptSubmit:{label:"Фиристодан"},chatReasoning:{thinking:"Фикр мекунад…",thought:"Фикр кард",thoughtFor:"{duration} фикр кард"},colorMode:{dark:"Торик",light:"Рӯшно",switchToDark:"Гузариш ба ҳолати торик",switchToLight:"Гузариш ба ҳолати рӯшно",system:"Система"},commandPalette:{back:"Бозгашт",close:"Бастан",noData:"Маълумот нест",noMatch:"Маълумоти мувофиқ ёфт нашуд",placeholder:"Фармонро нависед ё ҷустуҷӯ кунед…"},contentSearch:{links:"Пайвандҳо",theme:"Мавзӯъ"},contentSearchButton:{label:"Ҷустуҷӯ"},contentToc:{title:"Мундариҷа"},dropdownMenu:{noMatch:"Маълумоти мувофиқ ёфт нашуд",search:"Ҷустуҷӯ…"},dashboardSearch:{theme:"Мавзӯъ"},dashboardSearchButton:{label:"Ҷустуҷӯ"},dashboardSidebarCollapse:{collapse:"Кам кардан",expand:"Васеъ кардан"},dashboardSidebarToggle:{close:"Пӯшидан",open:"Кушодан"},error:{clear:"Тоза кардан"},fileUpload:{removeFile:"{filename}-ро хориҷ кунед"},header:{close:"Пӯшидан",open:"Кушодан"},inputMenu:{create:'"{label}" созед',noData:"Маълумот нест",noMatch:"Маълумоти мувофиқ ёфт нашуд"},inputNumber:{decrement:"Кам кардан",increment:"Зиёд кардан"},modal:{close:"Бастан"},pricingTable:{caption:"Ҷадвали нархҳо"},prose:{codeCollapse:{closeText:"Кам кардан",name:"код",openText:"Васеъ кардан"},collapsible:{closeText:"Пинҳон кардан",name:"хусусиятҳо",openText:"Намоиш додан"},pre:{copy:"Нусха бардоштан"}},sidebar:{close:"Бастан",toggle:"Иваз кардан"},selectMenu:{create:'"{label}" созед',noData:"Маълумот нест",noMatch:"Маълумоти мувофиқ ёфт нашуд",search:"Ҷустуҷӯ…"},slideover:{close:"Бастан"},table:{noData:"Маълумот нест"},toast:{close:"Бастан"}}}),pU=be({name:"Türkçe",code:"tr",messages:{alert:{close:"Kapat"},authForm:{hidePassword:"Şifreyi gizle",showPassword:"Şifreyi göster",submit:"Devam et"},banner:{close:"Kapat"},calendar:{nextMonth:"Sonraki ay",nextYear:"Sonraki yıl",prevMonth:"Önceki ay",prevYear:"Önceki yıl"},carousel:{dots:"Görüntülenecek slaydı seçin",goto:"{slide}. slayda git",next:"Sonraki",prev:"Önceki"},chatPrompt:{placeholder:"Buraya mesajınızı yazın…"},chatPromptSubmit:{label:"Gönder"},chatReasoning:{thinking:"Düşünüyor…",thought:"Düşündü",thoughtFor:"{duration} düşündü"},colorMode:{dark:"Koyu",light:"Açık",switchToDark:"Koyu moda geç",switchToLight:"Açık moda geç",system:"Sistem"},commandPalette:{back:"Geri",close:"Kapat",noData:"Veri yok",noMatch:"Eşleşen veri yok",placeholder:"Bir komut yazın veya arama yapın…"},contentSearch:{links:"Bağlantılar",theme:"Tema"},contentSearchButton:{label:"Ara…"},contentToc:{title:"Bu sayfada"},dropdownMenu:{noMatch:"Eşleşen veri yok",search:"Ara…"},dashboardSearch:{theme:"Tema"},dashboardSearchButton:{label:"Ara…"},dashboardSidebarCollapse:{collapse:"Kenar çubuğunu daralt",expand:"Kenar çubuğunu genişlet"},dashboardSidebarToggle:{close:"Kenar çubuğunu kapat",open:"Kenar çubuğunu aç"},error:{clear:"Ana sayfaya dön"},fileUpload:{removeFile:"{filename} kaldır"},header:{close:"Menüyü kapat",open:"Menüyü aç"},inputMenu:{create:'"{label}" oluştur',noData:"Veri yok",noMatch:"Eşleşen veri yok"},inputNumber:{decrement:"Azalt",increment:"Arttır"},modal:{close:"Kapat"},pricingTable:{caption:"Fiyat planlarını karşılaştır"},prose:{codeCollapse:{closeText:"Daralt",name:"kod",openText:"Genişlet"},collapsible:{closeText:"Gizle",name:"özellikler",openText:"Göster"},pre:{copy:"Kodu panoya kopyala"}},sidebar:{close:"Kapat",toggle:"Değiştir"},selectMenu:{create:'"{label}" oluştur',noData:"Veri yok",noMatch:"Eşleşen veri yok",search:"Ara…"},slideover:{close:"Kapat"},table:{noData:"Veri yok"},toast:{close:"Kapat"}}}),hU=be({name:"ئۇيغۇرچە",code:"ug-CN",dir:"rtl",messages:{alert:{close:"تاقاش"},authForm:{hidePassword:"پارولنى يوشۇرۇش",showPassword:"پارولنى كۆرسىتىش",submit:"دەۋام قىلىش"},banner:{close:"تاقاش"},calendar:{nextMonth:"كېلەر ئاي",nextYear:"كېلەر يىل",prevMonth:"ئالدىنقى ئاي",prevYear:"ئالدىنقى يىل"},carousel:{dots:"كۆرسىتىدىغان سلايدنى تاللاڭ",goto:"{slide}-بەتكە ئاتلاش",next:"كېيىنكى بەت",prev:"ئالدىنقى بەت"},chatPrompt:{placeholder:"خەت كىرگۈزۈڭ…"},chatPromptSubmit:{label:"يوللاش"},chatReasoning:{thinking:"ئويلاۋاتىدۇ…",thought:"ئويلاندى",thoughtFor:"{duration} ئويلاندى"},colorMode:{dark:"قاراڭغۇ",light:"يورۇق",switchToDark:"قاراڭغۇ ھالەتكە ئالماشتۇرۇش",switchToLight:"يورۇق ھالەتكە ئالماشتۇرۇش",system:"سىستېما"},commandPalette:{back:"قايتىش",close:"تاقاش",noData:"سانلىق مەلۇمات يوق",noMatch:"ماس كېلىدىغان سانلىق مەلۇمات يوق",placeholder:"بۇيرۇق كىرگۈزۈڭ ياكى ئىزدەڭ…"},contentSearch:{links:"ئۇلانمىلار",theme:"تېما"},contentSearchButton:{label:"ئىزدەش"},contentToc:{title:"مەزمۇن"},dropdownMenu:{noMatch:"ماس كېلىدىغان سانلىق مەلۇمات يوق",search:"ئىزدەش…"},dashboardSearch:{theme:"تېما"},dashboardSearchButton:{label:"ئىزدەش"},dashboardSidebarCollapse:{collapse:"تارايتىش",expand:"كېڭەيتىش"},dashboardSidebarToggle:{close:"تاقاش",open:"ئېچىش"},error:{clear:"تازىلاش"},fileUpload:{removeFile:"{filename} ئۆچۈرۈش"},header:{close:"تاقاش",open:"ئېچىش"},inputMenu:{create:'"{label}" نى قۇرۇش',noData:"سانلىق مەلۇمات يوق",noMatch:"ماس كېلىدىغان سانلىق مەلۇمات يوق"},inputNumber:{decrement:"ئازايتىش",increment:"كۆپەيتىش"},modal:{close:"تاقاش"},pricingTable:{caption:"باھا جەدۋىلى"},prose:{codeCollapse:{closeText:"تارايتىش",name:"كود",openText:"كېڭەيتىش"},collapsible:{closeText:"يوشۇرۇش",name:"خاسلىقلار",openText:"كۆرسىتىش"},pre:{copy:"كۆچۈرۈش"}},sidebar:{close:"تاقاش",toggle:"ئالماشتۇرۇش"},selectMenu:{create:'"{label}" نى قۇرۇش',noData:"سانلىق مەلۇمات يوق",noMatch:"ماس كېلىدىغان سانلىق مەلۇمات يوق",search:"ئىزدەش…"},slideover:{close:"تاقاش"},table:{noData:"سانلىق مەلۇمات يوق"},toast:{close:"تاقاش"}}}),mU=be({name:"Українська",code:"uk",messages:{alert:{close:"Закрити"},authForm:{hidePassword:"Приховати пароль",showPassword:"Показати пароль",submit:"Продовжити"},banner:{close:"Закрити"},calendar:{nextMonth:"Наступний місяць",nextYear:"Наступний рік",prevMonth:"Попередній місяць",prevYear:"Попередній рік"},carousel:{dots:"Виберіть слайд для відображення",goto:"Перейти до {slide}",next:"Далі",prev:"Назад"},chatPrompt:{placeholder:"Введіть ваше повідомлення тут…"},chatPromptSubmit:{label:"Відправити"},chatReasoning:{thinking:"Думає…",thought:"Подумав",thoughtFor:"Думав {duration}"},colorMode:{dark:"Темна",light:"Світла",switchToDark:"Перейти до темного режиму",switchToLight:"Перейти до світлого режиму",system:"Системна"},commandPalette:{back:"Назад",close:"Закрити",noData:"Немає даних",noMatch:"Збігів не знайдено",placeholder:"Введіть команду або шукайте…"},contentSearch:{links:"Посилання",theme:"Тема"},contentSearchButton:{label:"Пошук…"},contentToc:{title:"На цій сторінці"},dropdownMenu:{noMatch:"Збігів не знайдено",search:"Пошук…"},dashboardSearch:{theme:"Тема"},dashboardSearchButton:{label:"Пошук…"},dashboardSidebarCollapse:{collapse:"Згорнути бічну панель",expand:"Розгорнути бічну панель"},dashboardSidebarToggle:{close:"Закрити бічну панель",open:"Відкрити бічну панель"},error:{clear:"Повернутися на головну"},fileUpload:{removeFile:"Видалити {filename}"},header:{close:"Закрити меню",open:"Відкрити меню"},inputMenu:{create:'Створити "{label}"',noData:"Немає даних",noMatch:"Збігів не знайдено"},inputNumber:{decrement:"Зменшити",increment:"Збільшити"},modal:{close:"Закрити"},pricingTable:{caption:"Порівняння планів цін"},prose:{codeCollapse:{closeText:"Згорнути",name:"код",openText:"Розгорнути"},collapsible:{closeText:"Сховати",name:"властивості",openText:"Показати"},pre:{copy:"Копіювати код у буфер обміну"}},sidebar:{close:"Закрити",toggle:"Перемикнути"},selectMenu:{create:'Створити "{label}"',noData:"Немає даних",noMatch:"Збігів не знайдено",search:"Пошук…"},slideover:{close:"Закрити"},table:{noData:"Немає даних"},toast:{close:"Закрити"}}}),gU=be({name:"Urdu",code:"ur",dir:"rtl",messages:{alert:{close:"بند کریں"},authForm:{hidePassword:"پاس ورڈ چھپائیں",showPassword:"پاس ورڈ دکھائیں",submit:"جاری رکھیں"},banner:{close:"بند کریں"},calendar:{nextMonth:"اگلا مہینہ",nextYear:"اگلا سال",prevMonth:"پچھلا مہینہ",prevYear:"پچھلا سال"},carousel:{dots:"دکھانے کے لیے سلائیڈ منتخب کریں",goto:"سلائیڈ {slide} پر جائیں",next:"اگلا",prev:"پچھلا"},chatPrompt:{placeholder:"یہاں اپنا پیغام لکھیں"},chatPromptSubmit:{label:"پیغام بھیجیں"},chatReasoning:{thinking:"سوچ رہا ہے…",thought:"سوچا",thoughtFor:"{duration} سوچا"},colorMode:{dark:"تاریک",light:"روشن",switchToDark:"تاریک موڈ میں تبدیل کریں",switchToLight:"روشن موڈ میں تبدیل کریں",system:"سسٹم"},commandPalette:{back:"واپس",close:"بند کریں",noData:"کوئی ڈیٹا نہیں",noMatch:"کوئی ملتا جلتا ڈیٹا نہیں ملا",placeholder:"کمانڈ ٹائپ کریں یا تلاش کریں…"},contentSearch:{links:"لنکس",theme:"تھیم"},contentSearchButton:{label:"تلاش کریں…"},contentToc:{title:"اس صفحے پر"},dropdownMenu:{noMatch:"کوئی ملتا جلتا ڈیٹا نہیں ملا",search:"تلاش کریں…"},dashboardSearch:{theme:"تھیم"},dashboardSearchButton:{label:"تلاش کریں…"},dashboardSidebarCollapse:{collapse:"سائیڈ بار کو سکیڑیں",expand:"سائیڈ بار کو پھیلائیں"},dashboardSidebarToggle:{close:"سائیڈ بار بند کریں",open:"سائیڈ بار کھولیں"},error:{clear:"ہوم پیج پر واپس جائیں"},fileUpload:{removeFile:"{filename} ہٹائیں"},header:{close:"مینو بند کریں",open:"مینو کھولیں"},inputMenu:{create:'"{label}" بنائیں',noData:"کوئی ڈیٹا نہیں",noMatch:"کوئی ملتا جلتا ڈیٹا نہیں ملا"},inputNumber:{decrement:"کمی",increment:"اضافہ"},modal:{close:"بند کریں"},pricingTable:{caption:"قیمت پلنز کی مقایسہ"},prose:{codeCollapse:{closeText:"سکیڑیں",name:"کوڈ",openText:"پھیلائیں"},collapsible:{closeText:"چھپائیں",name:"خصوصیات",openText:"دکھائیں"},pre:{copy:"کوڈ کاپی کریں"}},sidebar:{close:"بند کریں",toggle:"ٹوگل کریں"},selectMenu:{create:'"{label}" بنائیں',noData:"کوئی ڈیٹا نہیں",noMatch:"کوئی ملتا جلتا ڈیٹا نہیں ملا",search:"تلاش کریں…"},slideover:{close:"بند کریں"},table:{noData:"کوئی ڈیٹا نہیں"},toast:{close:"بند کریں"}}}),vU=be({name:"Oʻzbek",code:"uz",messages:{alert:{close:"Yopish"},authForm:{hidePassword:"Parolni yashirish",showPassword:"Parolni ko'rsatish",submit:"Davom etish"},banner:{close:"Yopish"},calendar:{nextMonth:"Keyingi oy",nextYear:"Keyingi yil",prevMonth:"Oldingi oy",prevYear:"Oldingi yil"},carousel:{dots:"Koʻrsatish uchun slaydni tanlang",goto:"{slide}-slaydga o'tish",next:"Oldinga",prev:"Ortga"},chatPrompt:{placeholder:"Bu yerda savolingizni yozing…"},chatPromptSubmit:{label:"Jo'natish"},chatReasoning:{thinking:"O'ylayapti…",thought:"O'yladi",thoughtFor:"{duration} o'yladi"},colorMode:{dark:"Qorong'i",light:"Yorug'",switchToDark:"Qorong'i rejimga o'tish",switchToLight:"Yorug' rejimga o'tish",system:"Tizim"},commandPalette:{back:"Orqaga",close:"Yopish",noData:"Maʼlumot yoʻq",noMatch:"Mos keluvchi natija topilmadi",placeholder:"Buyruq kiriting yoki qidiring…"},contentSearch:{links:"Havolalar",theme:"Mavzu"},contentSearchButton:{label:"Qidirish…"},contentToc:{title:"Ushbu sahifada"},dropdownMenu:{noMatch:"Mos keluvchi natija topilmadi",search:"Qidirish…"},dashboardSearch:{theme:"Mavzu"},dashboardSearchButton:{label:"Qidirish…"},dashboardSidebarCollapse:{collapse:"Yon panelni yig'ish",expand:"Yon panelni kengaytirish"},dashboardSidebarToggle:{close:"Yon panelni yopish",open:"Yon panelni ochish"},error:{clear:"Bosh sahifaga qaytish"},fileUpload:{removeFile:"{filename}ni oʻchirish"},header:{close:"Menyuni yopish",open:"Menyuni ochish"},inputMenu:{create:'"{label}" yaratish',noData:"Maʼlumot yoʻq",noMatch:"Mos keluvchi natija topilmadi"},inputNumber:{decrement:"Ayirish",increment:"Qoʻshish"},modal:{close:"Yopish"},pricingTable:{caption:"Narx planlarini taqqoslash"},prose:{codeCollapse:{closeText:"Yig'ish",name:"kod",openText:"Kengaytirish"},collapsible:{closeText:"Yashirish",name:"xususiyatlar",openText:"Ko'rsatish"},pre:{copy:"Koddan buferga nusxa olish"}},sidebar:{close:"Yopish",toggle:"Almashtirish"},selectMenu:{create:'"{label}" yaratish',noData:"Maʼlumot yoʻq",noMatch:"Mos keluvchi natija topilmadi",search:"Qidirish…"},slideover:{close:"Yopish"},table:{noData:"Maʼlumot yoʻq"},toast:{close:"Yopish"}}}),yU=be({name:"Tiếng Việt",code:"vi",messages:{alert:{close:"Đóng"},authForm:{hidePassword:"Ẩn mật khẩu",showPassword:"Hiển thị mật khẩu",submit:"Tiếp tục"},banner:{close:"Đóng"},calendar:{nextMonth:"Tháng sau",nextYear:"Năm sau",prevMonth:"Tháng trước",prevYear:"Năm trước"},carousel:{dots:"Chọn slide để hiển thị",goto:"Đi tới ô {slide}",next:"Sau",prev:"Trước"},chatPrompt:{placeholder:"Nhập tin nhắn của bạn ở đây…"},chatPromptSubmit:{label:"Gửi"},chatReasoning:{thinking:"Đang suy nghĩ…",thought:"Đã suy nghĩ",thoughtFor:"Đã suy nghĩ {duration}"},colorMode:{dark:"Tối",light:"Sáng",switchToDark:"Chuyển sang chế độ tối",switchToLight:"Chuyển sang chế độ sáng",system:"Hệ thống"},commandPalette:{back:"Quay lại",close:"Đóng",noData:"Không có dữ liệu",noMatch:"Không có kết quả phù hợp",placeholder:"Nhập lệnh hoặc tìm kiếm…"},contentSearch:{links:"Liên kết",theme:"Chủ đề"},contentSearchButton:{label:"Tìm kiếm…"},contentToc:{title:"Trong trang này"},dropdownMenu:{noMatch:"Không có kết quả phù hợp",search:"Tìm kiếm…"},dashboardSearch:{theme:"Chủ đề"},dashboardSearchButton:{label:"Tìm kiếm…"},dashboardSidebarCollapse:{collapse:"Thu gọn thanh bên",expand:"Mở rộng thanh bên"},dashboardSidebarToggle:{close:"Đóng thanh bên",open:"Mở thanh bên"},error:{clear:"Quay lại trang chủ"},fileUpload:{removeFile:"Xóa {filename}"},header:{close:"Đóng menu",open:"Mở menu"},inputMenu:{create:'Tạo "{label}"',noData:"Không có dữ liệu",noMatch:"Không có kết quả phù hợp"},inputNumber:{decrement:"Giảm",increment:"Tăng"},modal:{close:"Đóng"},pricingTable:{caption:"So sánh các kế hoạch giá"},prose:{codeCollapse:{closeText:"Thu gọn",name:"mã",openText:"Mở rộng"},collapsible:{closeText:"Ẩn",name:"thuộc tính",openText:"Hiển thị"},pre:{copy:"Sao chép mã vào bộ nhớ tạm"}},sidebar:{close:"Đóng",toggle:"Chuyển đổi"},selectMenu:{create:'Tạo "{label}"',noData:"Không có dữ liệu",noMatch:"Không có kết quả phù hợp",search:"Tìm kiếm…"},slideover:{close:"Đóng"},table:{noData:"Không có dữ liệu"},toast:{close:"Đóng"}}}),bU=be({name:"简体中文",code:"zh-CN",messages:{alert:{close:"关闭"},authForm:{hidePassword:"隐藏密码",showPassword:"显示密码",submit:"继续"},banner:{close:"关闭"},calendar:{nextMonth:"下个月",nextYear:"明年",prevMonth:"上个月",prevYear:"去年"},carousel:{dots:"选择要显示的幻灯片",goto:"跳转到第 {slide} 页",next:"下一页",prev:"上一页"},chatPrompt:{placeholder:"在这里输入你的消息…"},chatPromptSubmit:{label:"发送"},chatReasoning:{thinking:"思考中…",thought:"已思考",thoughtFor:"思考了 {duration}"},colorMode:{dark:"深色",light:"浅色",switchToDark:"切换到深色模式",switchToLight:"切换到浅色模式",system:"系统"},commandPalette:{back:"返回",close:"关闭",noData:"没有数据",noMatch:"没有匹配的数据",placeholder:"输入命令或搜索…"},contentSearch:{links:"链接",theme:"主题"},contentSearchButton:{label:"搜索…"},contentToc:{title:"本页内容"},dropdownMenu:{noMatch:"没有匹配的数据",search:"搜索…"},dashboardSearch:{theme:"主题"},dashboardSearchButton:{label:"搜索…"},dashboardSidebarCollapse:{collapse:"收起侧边栏",expand:"展开侧边栏"},dashboardSidebarToggle:{close:"关闭侧边栏",open:"打开侧边栏"},error:{clear:"返回首页"},fileUpload:{removeFile:"删除 {filename}"},header:{close:"关闭菜单",open:"打开菜单"},inputMenu:{create:'创建 "{label}"',noData:"没有数据",noMatch:"没有匹配的数据"},inputNumber:{decrement:"减少",increment:"增加"},modal:{close:"关闭"},pricingTable:{caption:"价格计划比较"},prose:{codeCollapse:{closeText:"收起",name:"代码",openText:"展开"},collapsible:{closeText:"隐藏",name:"属性",openText:"显示"},pre:{copy:"复制代码到剪贴板"}},sidebar:{close:"关闭",toggle:"切换"},selectMenu:{create:'创建 "{label}"',noData:"没有数据",noMatch:"没有匹配的数据",search:"搜索…"},slideover:{close:"关闭"},table:{noData:"没有数据"},toast:{close:"关闭"}}}),EU=be({name:"繁體中文",code:"zh-TW",messages:{alert:{close:"關閉"},authForm:{hidePassword:"隱藏密碼",showPassword:"顯示密碼",submit:"繼續"},banner:{close:"關閉"},calendar:{nextMonth:"下個月",nextYear:"明年",prevMonth:"上個月",prevYear:"去年"},carousel:{dots:"選擇要顯示的投影片",goto:"跳轉到第 {slide} 頁",next:"下一頁",prev:"上一頁"},chatPrompt:{placeholder:"在這裡輸入你的消息…"},chatPromptSubmit:{label:"發送"},chatReasoning:{thinking:"思考中…",thought:"已思考",thoughtFor:"思考了 {duration}"},colorMode:{dark:"深色",light:"淺色",switchToDark:"切換到深色模式",switchToLight:"切換到淺色模式",system:"系統"},commandPalette:{back:"返回",close:"關閉",noData:"沒有資料",noMatch:"沒有相符的資料",placeholder:"輸入命令或搜尋…"},contentSearch:{links:"連結",theme:"主題"},contentSearchButton:{label:"搜尋…"},contentToc:{title:"本頁內容"},dropdownMenu:{noMatch:"沒有相符的資料",search:"搜尋…"},dashboardSearch:{theme:"主題"},dashboardSearchButton:{label:"搜尋…"},dashboardSidebarCollapse:{collapse:"收起側邊欄",expand:"展開側邊欄"},dashboardSidebarToggle:{close:"關閉側邊欄",open:"開啟側邊欄"},error:{clear:"返回首頁"},fileUpload:{removeFile:"移除 {filename}"},header:{close:"關閉選單",open:"開啟選單"},inputMenu:{create:"建立「{label}」",noData:"沒有資料",noMatch:"沒有相符的資料"},inputNumber:{decrement:"減少",increment:"增加"},modal:{close:"關閉"},pricingTable:{caption:"價格計畫比較"},prose:{codeCollapse:{closeText:"收起",name:"程式碼",openText:"展開"},collapsible:{closeText:"隱藏",name:"屬性",openText:"顯示"},pre:{copy:"複製程式碼到剪貼簿"}},sidebar:{close:"關閉",toggle:"切換"},selectMenu:{create:"建立「{label}」",noData:"沒有資料",noMatch:"沒有相符的資料",search:"搜尋…"},slideover:{close:"關閉"},table:{noData:"沒有資料"},toast:{close:"關閉"}}}),GE=Object.freeze(Object.defineProperty({__proto__:null,ar:mz,az:gz,be:vz,bg:yz,bn:bz,ca:Ez,ckb:Cz,cs:xz,da:wz,de:Dz,de_ch:Az,el:Bz,en:Fu,en_gb:_z,es:kz,et:Sz,eu:Tz,fa_ir:Fz,fi:Pz,fr:Mz,gl:Oz,he:Iz,hi:Rz,hr:Lz,hu:qz,hy:$z,id:Nz,is:jz,it:Vz,ja:zz,ka:Uz,kk:Hz,km:Kz,ko:Wz,ky:Gz,lb:Yz,lo:Zz,lt:Xz,mn:Jz,ms:Qz,nb_no:eU,nl:tU,pl:nU,pt:oU,pt_br:rU,ro:uU,ru:aU,sk:sU,sl:iU,sq:lU,sv:cU,th:dU,tj:fU,tr:pU,ug_cn:hU,uk:mU,ur:gU,uz:vU,vi:yU,zh_cn:bU,zh_tw:EU},Symbol.toStringTag,{value:"Module"}));function YE(e,t,n){if(t&&n){const o=e.find(r=>r.path===`/${n}`)?.children||e;return o.find(r=>r.path===`/${n}/docs`)?.children||o}else return e.find(o=>o.path==="/docs")?.children||e}function CU(e,t,n=[]){if(e)for(const o of e){const r=[...n,{title:o.title,path:o.path}];if(o.path===t)return r;if(o.children){const u=CU(o.children,t,r);if(u)return u}}}const xU={docs:"v3.5.0--WRKcSWvvJ7xpisMbNohe5JlUaLkZ8gRI82vN6mYT1BA",landing:"v3.5.0--ZSrL8oMLgLk6PNmH6Z54wyDLHfAlLlD5NQyXKig3u7I"},wU={docs:"_content_docs",landing:"_content_landing",info:"_content_info"},fH={docs:{type:"page",fields:{id:"string",title:"string",body:"json",description:"string",extension:"string",links:"json",meta:"json",navigation:"json",path:"string",seo:"json",stem:"string"}},landing:{type:"page",fields:{id:"string",title:"string",body:"json",description:"string",extension:"string",meta:"json",navigation:"json",path:"string",seo:"json",stem:"string"}},info:{type:"data",fields:{}}},Gi=(e,t)=>{const n=e._conditions;return n.length>0?`(${n.join(` ${t} `)})`:""},Yi=e=>{const t=[],n={_conditions:t,where(o,r,u){let a;switch(r.toUpperCase()){case"IN":case"NOT IN":if(Array.isArray(u)){const s=u.map(i=>da(i)).join(", ");a=`"${String(o)}" ${r.toUpperCase()} (${s})`}else throw new TypeError(`Value for ${r} must be an array`);break;case"BETWEEN":case"NOT BETWEEN":if(Array.isArray(u)&&u.length===2)a=`"${String(o)}" ${r.toUpperCase()} ${da(u[0])} AND ${da(u[1])}`;else throw new Error(`Value for ${r} must be an array with two elements`);break;case"IS NULL":case"IS NOT NULL":a=`"${String(o)}" ${r.toUpperCase()}`;break;case"LIKE":case"NOT LIKE":a=`"${String(o)}" ${r.toUpperCase()} ${da(u)}`;break;default:a=`"${String(o)}" ${r} ${da(typeof u=="boolean"?Number(u):u)}`}return t.push(`${a}`),n},andWhere(o){const r=o(Yi());return t.push(Gi(r,"AND")),n},orWhere(o){const r=o(Yi());return t.push(Gi(r,"OR")),n}};return n},DU=(e,t)=>{const n={conditions:[],selectedFields:[],offset:0,limit:0,orderBy:[],count:{field:"",distinct:!1}},o={__params:n,andWhere(u){const a=u(Yi());return n.conditions.push(Gi(a,"AND")),o},orWhere(u){const a=u(Yi());return n.conditions.push(Gi(a,"OR")),o},path(u){return o.where("path","=",Bu(u))},skip(u){return n.offset=u,o},where(u,a,s){return o.andWhere(i=>i.where(String(u),a,s)),o},limit(u){return n.limit=u,o},select(...u){return u.length&&n.selectedFields.push(...u),o},order(u,a){return n.orderBy.push(`"${String(u)}" ${a}`),o},async all(){return t(e,r()).then(u=>u||[])},async first(){return t(e,r({limit:1})).then(u=>u[0]||null)},async count(u="*",a=!1){return t(e,r({count:{field:String(u),distinct:a}})).then(s=>s[0].count)}};function r(u={}){let a="SELECT ";if(u?.count)a+=`COUNT(${u.count.distinct?"DISTINCT ":""}${u.count.field}) as count`;else{const i=Array.from(new Set(n.selectedFields));a+=i.length>0?i.map(c=>`"${String(c)}"`).join(", "):"*"}a+=` FROM ${wU[String(e)]}`,n.conditions.length>0&&(a+=` WHERE ${n.conditions.join(" AND ")}`),n.orderBy.length>0?a+=` ORDER BY ${n.orderBy.join(", ")}`:a+=" ORDER BY stem ASC";const s=u?.limit||n.limit;return s>0&&(n.offset>0?a+=` LIMIT ${s} OFFSET ${n.offset}`:a+=` LIMIT ${s}`),a}return o};function da(e){return`'${String(e).replace(/'/g,"''")}'`}const AU=/\d/,BU=["-","_","/","."];function _U(e=""){if(!AU.test(e))return e!==e.toLowerCase()}function ZE(e,t){const n=BU,o=[];if(!e||typeof e!="string")return o;let r="",u,a;for(const s of e){const i=n.includes(s);if(i===!0){o.push(r),r="",u=void 0;continue}const c=_U(s);if(a===!1){if(u===!1&&c===!0){o.push(r),r=s,u=c;continue}if(u===!0&&c===!1&&r.length>1){const l=r.at(-1);o.push(r.slice(0,Math.max(0,r.length-1))),r=l+s,u=c;continue}}r+=s,u=c,a=i}return o.push(r),o}function kU(e){return e?e[0].toUpperCase()+e.slice(1):""}function SU(e,t){return e?(Array.isArray(e)?e:ZE(e)).map(n=>kU(t?.normalize?n.toLowerCase():n)).join(""):""}function pH(e,t){return e?(Array.isArray(e)?e:ZE(e)).map(n=>n.toLowerCase()).join("-"):""}function gd(e){return t=>(t=t||{},(e||[]).filter(n=>typeof t[n]<"u").reduce((n,o)=>Object.assign(n,{[o]:t[o]}),{}))}async function XE(e,t=[]){e.__params?.orderBy?.length||(e=e.order("stem","ASC"));const o=await e.orWhere(c=>c.where("navigation","<>","false").where("navigation","IS NULL")).select("navigation","stem","path","title","meta",...t||[]).all(),{contents:r,configs:u}=o.reduce((c,l)=>{if(String(l.stem).split("/").pop()===".navigation"){l.title=l.title?.toLowerCase()==="navigation"?"":l.title;const d=l.path.split("/").slice(0,-1).join("/")||"/";c.configs[d]={...l,...l.body}}else c.contents.push(l);return c},{configs:{},contents:[]}),a=c=>({...gd(["title",...t])(c),...c.meta,...fg(c?.navigation)?c.navigation:{}}),s=c=>({...gd(["title",...t])(c),...fg(c?.navigation)?c.navigation:{}}),i=r.reduce((c,l)=>{const d=l.path.substring(1).split("/"),p=l.stem.split("/"),h=!!p[p.length-1]?.match(/([1-9]\d*\.)?index/g),m=b=>({title:b.title,path:b.path,stem:b.stem,children:[],...s(b)}),g=m(l);if(h){const b=u[g.path];if(typeof b?.navigation<"u"&&b?.navigation===!1)return c;if(l.path!=="/"){const v=m(l);g.children.push(v)}b&&Object.assign(g,a(b))}if(d.length===1){const b=c.find(v=>v.path===g.path&&v.page===!1);return h&&b?Object.assign(b,{page:void 0,children:[...g.children||[],...b.children||[]]}):c.push(g),c}const y=d.slice(0,-1).reduce((b,v,C)=>{const w="/"+d.slice(0,C+1).join("/"),B=u[w];if(typeof B?.navigation<"u"&&B.navigation===!1)return[];let x=b.find(_=>_.path===w);if(!x){const _=B?a(B):{};x={..._,title:_.title||TU(v),path:w,stem:p.slice(0,C+1).join("/"),children:[],page:!1},b.push(x)}return x.children},c),E=y.find(b=>b.path===g.path&&b.page===!1);return E?Object.assign(E,{...g,page:void 0,children:[...g.children||[],...E.children||[]]}):y.push(g),c},[]);return JE(i)}function JE(e){const t=e;for(const n of t)n.children?.length?JE(n.children):delete n.children;return e}function fg(e){return e!==null&&Object.prototype.toString.call(e)==="[object Object]"}const TU=e=>e.split(/[\s-]/g).map(SU).join(" ");async function FU(e,t,n){const{before:o=1,after:r=1,fields:u=[]}=n||{},a=await XE(e,u),s=QE(a),i=s.findIndex(d=>d.path===t),c=i===-1?[]:s.slice(i-o,i),l=i===-1?[]:s.slice(i+1,i+r+1);return[...Array.from({length:o}).fill(null).concat(c).slice(c.length),...l.concat(Array.from({length:r}).fill(null)).slice(0,r)]}function QE(e){return e.flatMap(n=>{const o=n.children?QE(n.children):[];return n.page===!1||o.length&&o.find(r=>r.path===n.path)?o:[{...n,children:void 0},...o]})}function PU(e){return{type:"root",children:e.value.map(e2)}}function e2(e){if(typeof e=="string")return{type:"text",value:e};const[t,n,...o]=e;return{type:"element",tag:t,props:n,children:o.map(e2)}}const MU=/^h([1-6])$/,vd=e=>Number(e.match(MU)?.[1]??0);async function OU(e,t){const{ignoredTags:n=[],extraFields:o=[],minHeading:r="h1",maxHeading:u="h6"}={},a=vd(r),s=vd(u);return(await e.where("extension","=","md").select("path","body","description","title",...o||[]).all()).flatMap(c=>IU(c,{ignoredTags:n,extraFields:o,minLevel:a,maxLevel:s}))}function IU(e,{ignoredTags:t,extraFields:n,minLevel:o,maxLevel:r}){const u=!e.body||e.body?.type==="root"?e.body:PU(e.body),a=e.path??"",s=gd(n)(e),i=[{...s,id:a,title:e.title||"",titles:[],content:(e.description||"").trim(),level:1}];if(!u?.children)return i;let c=1,l=0;const d=[e.title??""];for(const p of u.children){const h=p.tag||"",m=vd(h);if(m>=o&&m<=r){const g=yd(p).trim();m===1?d.splice(0,d.length):myd(o,t)).filter(Boolean).join("")),n)}async function t2(e,t,n,o){const r=e?J5(e):{};r["accept-encoding"]=void 0;const u=`/__nuxt_content/${t}/${n}`,a={...o,headers:{...r,...o.headers},query:{v:xU[String(t)],t:void 0}};return e?await e.$fetch(u,a):await $fetch(u,a)}async function hH(e,t){return t2(e,t,"sql_dump.txt",{responseType:"text",headers:{"content-type":"text/plain"}})}async function RU(e,t,n){return t2(e,t,"query",{headers:{"content-type":"application/json"},method:"POST",body:{sql:n}})}const LU=e=>{const t=Cy()?.ssrContext?.event;return DU(e,(n,o)=>qU(t,n,o))};function n2(e,t){return up(e,n=>XE(n,t))}function mH(e,t,n){return up(e,o=>FU(o,t,n))}function o2(e,t){return up(e,n=>OU(n))}async function qU(e,t,n){return window.WebAssembly?$U(t,n):RU(e,String(t),n)}async function $U(e,t){return await ne(()=>import("./Df-aV_dL.js"),[],import.meta.url).then(o=>o.loadDatabaseAdapter(e)).then(o=>o.all(t))}function up(e,t){const n=LU(e),o={where(r,u,a){return n.where(String(r),u,a),o},andWhere(r){return n.andWhere(r),o},orWhere(r){return n.orWhere(r),o},order(r,u){return n.order(String(r),u),o},then(r,u){return t(n).then(r,u)},catch(r){return this.then(void 0,r)},finally(r){return this.then(void 0,void 0).finally(r)},get[Symbol.toStringTag](){return"Promise"}};return o}const NU=Ae(()=>ne(()=>import("./CxBf5103.js"),__vite__mapDeps([26,15,1]),import.meta.url).then(e=>e.default||e)),jU=Ae(()=>ne(()=>Promise.resolve().then(()=>Nb),void 0,import.meta.url).then(e=>e.default||e)),VU=Ae(()=>ne(()=>Promise.resolve().then(()=>Nb),void 0,import.meta.url).then(e=>e.default||e)),zU=L({__name:"app",async setup(e){let t,n;const o=Pe(),{seo:r}=o,{forced:u}=ss(),a=qb(),{locale:s,locales:i,isEnabled:c,switchLocalePath:l}=Gu(),{isEnabled:d,panelWidth:p,shouldPushContent:h}=VE(),m=F(()=>GE[s.value]||Fu),g=F(()=>m.value.code),y=F(()=>m.value.dir),E=F(()=>c.value?`docs_${s.value}`:"docs");if(Wd({meta:[{name:"viewport",content:"width=device-width, initial-scale=1"}],link:[{rel:"icon",href:"/favicon.ico"}],htmlAttrs:{lang:g,dir:y}}),$y({titleTemplate:r.titleTemplate,title:r.title,description:r.description,ogSiteName:a.name,twitterCard:"summary_large_image"}),c.value){const w=Yn(),B=Bn().public.i18n.defaultLocale;$e(()=>{const x=w.path.split("/")[1];if(!i.some(_=>_.code===x))return dl(l(B))})}const{data:b}=([t,n]=yv(()=>tf(()=>`navigation_${E.value}`,()=>n2(E.value),{transform:w=>YE(w,c.value,s.value),watch:[s]})),t=await t,n(),t),{data:v}=m3(`search_${E.value}`,()=>o2(E.value),{server:!1,watch:[s]});Pt("navigation",b);const{subNavigationMode:C}=tp(b);return(w,B)=>{const x=L_,_=zE,S=qV,O=UV,H=KE,N=NU,J=jU,G=VU,$=ef,I=WE;return D(),k(I,{locale:f(m)},{default:A(()=>[q(x,{color:"var(--ui-primary)"}),je("div",{class:U(["transition-[margin-right] duration-200 ease-linear will-change-[margin-right]",{"docus-sub-header":f(C)==="header"}]),style:mn({marginRight:f(h)?`${f(p)}px`:"0"})},[(w._.provides[Oo]||w.$route).meta.header!==!1?(D(),k(_,{key:0})):Y("",!0),q(O,null,{default:A(()=>[q(S)]),_:1}),(w._.provides[Oo]||w.$route).meta.footer!==!1?(D(),k(H,{key:1})):Y("",!0)],6),q($,null,{default:A(()=>[q(N,{files:f(v),navigation:f(b),"color-mode":!f(u)},null,8,["files","navigation","color-mode"]),f(d)?(D(),re(Ce,{key:0},[q(J),q(G)],64)):Y("",!0)]),_:1})]),_:1},8,["locale"])}}}),UU={slots:{root:"min-h-[calc(100vh-var(--ui-header-height))] flex flex-col items-center justify-center text-center",statusCode:"text-base font-semibold text-primary",statusMessage:"mt-2 text-4xl sm:text-5xl font-bold text-highlighted text-balance",message:"mt-4 text-lg text-muted text-balance",links:"mt-8 flex items-center justify-center gap-6"}},HU={__name:"UError",props:{as:{type:null,required:!1,default:"main"},error:{type:Object,required:!1},redirect:{type:String,required:!1,default:"/"},clear:{type:[Boolean,Object],required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,n=qt(),{t:o}=Vo(),r=Pe(),u=Et("error",t),a=F(()=>Se({extend:Se(UU),...r.ui?.error||{}})());function s(){_y({redirect:t.redirect})}return(i,c)=>(D(),k(f(we),{as:e.as,"data-slot":"root",class:U(a.value.root({class:[f(u)?.root,t.class]}))},{default:A(()=>[t.error?.statusCode||t.error?.status||n.statusCode?(D(),re("p",{key:0,"data-slot":"statusCode",class:U(a.value.statusCode({class:f(u)?.statusCode}))},[P(i.$slots,"statusCode",{},()=>[Ke(Fe(t.error?.statusCode||t.error?.status),1)])],2)):Y("",!0),t.error?.statusMessage||t.error?.statusText||n.statusMessage?(D(),re("h1",{key:1,"data-slot":"statusMessage",class:U(a.value.statusMessage({class:f(u)?.statusMessage}))},[P(i.$slots,"statusMessage",{},()=>[Ke(Fe(t.error?.statusMessage||t.error?.statusText),1)])],2)):Y("",!0),t.error?.message&&t.error.message!==(t.error.statusMessage||t.error.statusText)||n.message?(D(),re("p",{key:2,"data-slot":"message",class:U(a.value.message({class:f(u)?.message}))},[P(i.$slots,"message",{},()=>[Ke(Fe(t.error?.message),1)])],2)):Y("",!0),e.clear||n.links?(D(),re("div",{key:3,"data-slot":"links",class:U(a.value.links({class:f(u)?.links}))},[P(i.$slots,"links",{},()=>[e.clear?(D(),k(hn,j({key:0,size:"lg",color:"primary",variant:"solid",label:f(o)("error.clear")},typeof e.clear=="object"?e.clear:{},{onClick:s}),null,16,["label"])):Y("",!0)])],2)):Y("",!0)]),_:3},8,["as","class"]))}},KU=Ae(()=>ne(()=>import("./CxBf5103.js"),__vite__mapDeps([26,15,1]),import.meta.url).then(e=>e.default||e)),WU=L({__name:"error",props:{error:{}},async setup(e){let t,n;const o=e,{forced:r}=ss(),{locale:u,locales:a,isEnabled:s,t:i,switchLocalePath:c}=Gu(),l=F(()=>GE[u.value]||Fu),d=F(()=>l.value.code),p=F(()=>l.value.dir);Wd({htmlAttrs:{lang:d,dir:p}});const h=F(()=>({...o.error,statusMessage:i("common.error.title"),message:i("common.error.description")}));if($y({title:()=>i("common.error.title"),description:()=>i("common.error.description")}),s.value){const E=Yn(),b=Bn().public.i18n.defaultLocale;$e(()=>{const v=E.path.split("/")[1];if(!a.some(C=>C.code===v))return dl(c(b))})}const m=F(()=>s.value?`docs_${u.value}`:"docs"),{data:g}=([t,n]=yv(()=>tf(`navigation_${m.value}`,()=>n2(m.value),{transform:E=>YE(E,s.value,u.value),watch:[u]})),t=await t,n(),t),{data:y}=m3(`search_${m.value}`,()=>o2(m.value),{server:!1});return Pt("navigation",g),(E,b)=>{const v=zE,C=HU,w=KE,B=KU,x=ef,_=WE;return D(),k(_,{locale:f(l)},{default:A(()=>[q(v),q(C,{error:f(h)},null,8,["error"]),q(w),q(x,null,{default:A(()=>[q(B,{files:f(y),navigation:f(g),"color-mode":!f(r)},null,8,["files","navigation","color-mode"])]),_:1})]),_:1},8,["locale"])}}}),GU={key:0},pg={__name:"nuxt-root",setup(e){const t=()=>null,n=Re(),o=n.deferHydration();if(n.isHydrating){const c=n.hooks.hookOnce("app:error",o);Xt().beforeEach(c)}const r=!1;Pt(Oo,Yn()),n.hooks.callHookWith(c=>c.map(l=>l()),"vue:setup");const u=fl(),a=!1,s=/bot\b|chrome-lighthouse|facebookexternalhit|google\b/i;lv((c,l,d)=>{if(n.hooks.callHook("vue:error",c,l,d)?.catch(p=>console.error("[nuxt] Error in `vue:error` hook",p)),s.test(navigator.userAgent))return n.hooks.callHook("app:error",c),console.error(`[nuxt] Not rendering error page for bot with user agent \`${navigator.userAgent}\`:`,c),!1;if(ky(c)&&(c.fatal||c.unhandled))return n.runWithContext(()=>kr(c)),!1});const i=!1;return(c,l)=>(D(),k(Rd,{onResolve:f(o)},{default:A(()=>[f(a)?(D(),re("div",GU)):f(u)?(D(),k(f(WU),{key:1,error:f(u)},null,8,["error"])):f(i)?(D(),k(f(t),{key:2,context:f(i)},null,8,["context"])):f(r)?(D(),k(Rt(f(r)),{key:3})):(D(),k(f(zU),{key:4}))]),_:1},8,["onResolve"]))}};let hg;{let e;hg=async function(){if(e)return e;const n=!!(window.__NUXT__?.serverRendered??document.getElementById("__NUXT_DATA__")?.dataset.ssr==="true"),o=n?Mx(pg):Px(pg),r=U5({vueApp:o});async function u(a){await r.callHook("app:error",a),r.payload.error||=ar(a)}o.config.errorHandler=u,r.hook("app:suspense:resolve",()=>{o.config.errorHandler===u&&(o.config.errorHandler=void 0)}),!n&&eh.id&&r.hook("app:suspense:resolve",()=>{document.getElementById(eh.id)?.remove()});try{await W5(r,M_)}catch(a){u(a)}try{await r.hooks.callHook("app:created",o),await r.hooks.callHook("app:beforeMount",o),o.mount(j5),await r.hooks.callHook("app:mounted",o),await Oe()}catch(a){u(a)}return o},e=hg().catch(t=>{throw console.error("Error while mounting app:",t),t})}export{Vo as $,bl as A,q as B,$d as C,On as D,Yg as E,Ce as F,$e as G,Ht as H,sn as I,ae as J,YU as K,I3 as L,jg as M,ir as N,Me as O,we as P,qt as Q,tH as R,H7 as S,dt as T,qk as U,Yr as V,Rt as W,mn as X,An as Y,jt as Z,xv as _,k as a,zk as a$,Pe as a0,Et as a1,it as a2,Jt as a3,To as a4,XU as a5,rv as a6,$r as a7,xu as a8,ms as a9,ZN as aA,aH as aB,Eb as aC,bb as aD,uH as aE,tu as aF,No as aG,iH as aH,eb as aI,gF as aJ,L8 as aK,V8 as aL,Pt as aM,fO as aN,Yn as aO,Lb as aP,Bn as aQ,QU as aR,Gu as aS,VE as aT,Vb as aU,Pd as aV,mo as aW,Xt as aX,Re as aY,Wk as aZ,Hk as a_,_o as aa,st as ab,U as ac,Ku as ad,Tb as ae,je as af,Fe as ag,Ke as ah,Mf as ai,us as aj,hn as ak,vv as al,Se as am,Ye as an,wt as ao,V3 as ap,mI as aq,At as ar,JU as as,aM as at,Ib as au,ln as av,me as aw,xe as ax,oM as ay,rt as az,w0 as b,wU as b$,tp as b0,SE as b1,FV as b2,kE as b3,Ue as b4,yv as b5,tf as b6,pH as b7,LU as b8,mH as b9,D0 as bA,_E as bB,nr as bC,_n as bD,Gg as bE,Ua as bF,aT as bG,rH as bH,oH as bI,W7 as bJ,O$ as bK,Je as bL,cH as bM,zm as bN,I$ as bO,tx as bP,ZU as bQ,o1 as bR,H0 as bS,c1 as bT,dH as bU,l1 as bV,D4 as bW,Td as bX,Wu as bY,ep as bZ,fH as b_,ar as ba,CU as bb,qe as bc,_t as bd,We as be,He as bf,Ep as bg,SU as bh,Ae as bi,Lr as bj,bt as bk,$x as bl,ne as bm,PU as bn,qb as bo,$y as bp,Wd as bq,cr as br,Bu as bs,iv as bt,Ha as bu,df as bv,e1 as bw,t1 as bx,B0 as by,n1 as bz,F as c,xU as c0,hH as c1,ek as c2,eH as c3,$0 as c4,sH as c5,L as d,re as e,Y as f,mt as g,vo as h,Ur as i,Rk as j,ju as k,Lt as l,j as m,Oe as n,D as o,A as p,P as q,yt as r,f as s,ke as t,an as u,R as v,ye as w,H_ as x,nH as y,lt as z}; diff --git a/docus/dist/_nuxt/B4xqMpdT.js b/docus/dist/_nuxt/B4xqMpdT.js new file mode 100644 index 0000000..d45ab0a --- /dev/null +++ b/docus/dist/_nuxt/B4xqMpdT.js @@ -0,0 +1 @@ +import{a0 as r,a1 as c,e as p,q as u,ac as i,s as m,c as f,am as e,o as d}from"./B3fabVUf.js";const _={base:"my-1.5 ps-1.5 leading-7 [&>ul]:my-0"},b={__name:"ProseLi",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=a,o=r(),t=c("prose.li",s),l=f(()=>e({extend:e(_),...o.ui?.prose?.li||{}}));return(n,y)=>(d(),p("li",{class:i(l.value({class:[m(t)?.base,s.class]}))},[u(n.$slots,"default")],2))}};export{b as default}; diff --git a/docus/dist/_nuxt/B6bUjJBd.js b/docus/dist/_nuxt/B6bUjJBd.js new file mode 100644 index 0000000..2b539c9 --- /dev/null +++ b/docus/dist/_nuxt/B6bUjJBd.js @@ -0,0 +1 @@ +import{d as m,bH as I,I as y,h as g,G as F,H as h,o as K,a as S,p as l,B as C,s as n,P as q,q as w,c as u,y as B,bI as T,n as R,bJ as x}from"./B3fabVUf.js";var _=m({__name:"RovingFocusItem",props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(d){const r=d,a=I(),f=y(),i=u(()=>r.tabStopId||f),c=u(()=>a.currentTabStopId.value===i.value),{getItems:p,CollectionItem:v}=g();F(()=>{r.focusable&&a.onFocusableItemAdd()}),h(()=>{r.focusable&&a.onFocusableItemRemove()});function b(e){if(e.key==="Tab"&&e.shiftKey){a.onItemShiftTab();return}if(e.target!==e.currentTarget)return;const t=B(e,a.orientation.value,a.dir.value);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||!r.allowShiftKey&&e.shiftKey)return;e.preventDefault();let o=[...p().map(s=>s.ref).filter(s=>s.dataset.disabled!=="")];if(t==="last")o.reverse();else if(t==="prev"||t==="next"){t==="prev"&&o.reverse();const s=o.indexOf(e.currentTarget);o=a.loop.value?T(o,s+1):o.slice(s+1)}R(()=>x(o))}}return(e,t)=>(K(),S(n(v),null,{default:l(()=>[C(n(q),{tabindex:c.value?0:-1,"data-orientation":n(a).orientation.value,"data-active":e.active?"":void 0,"data-disabled":e.focusable?void 0:"",as:e.as,"as-child":e.asChild,onMousedown:t[0]||(t[0]=o=>{e.focusable?n(a).onItemFocus(i.value):o.preventDefault()}),onFocus:t[1]||(t[1]=o=>n(a).onItemFocus(i.value)),onKeydown:b},{default:l(()=>[w(e.$slots,"default")]),_:3},8,["tabindex","data-orientation","data-active","data-disabled","as","as-child"])]),_:3}))}}),A=_;export{A as R}; diff --git a/docus/dist/_nuxt/B7V4_Oof.js b/docus/dist/_nuxt/B7V4_Oof.js new file mode 100644 index 0000000..8b70c0a --- /dev/null +++ b/docus/dist/_nuxt/B7V4_Oof.js @@ -0,0 +1 @@ +const a={or:"veya",error:{title:"Sayfa bulunamadı",description:"Üzgünüz, bu sayfa bulunamadı."}},o={copy:{page:"Sayfayı kopyala",link:"Markdown bağlantısını kopyala",view:"Markdown olarak görüntüle",gpt:"ChatGPT'de aç",claude:"Claude'da aç"},links:"Topluluk",toc:"Bu sayfada",menu:"Menü",report:"Sorun bildir",edit:"Bu sayfayı düzenle"},n={copyLogo:"Logoyu kopyala",copyWordmark:"Wordmark'ı kopyala",downloadLogo:"Logoyu indir",downloadWordmark:"Wordmark'ı indir",brandAssets:"Marka materyalleri",logoCopied:"Logo kopyalandı",wordmarkCopied:"Wordmark kopyalandı",logoDownloaded:"Logo indirildi",wordmarkDownloaded:"Wordmark indirildi",copyLogoFailed:"Logo kopyalanamadı",copyWordmarkFailed:"Wordmark kopyalanamadı"},e={title:"Yapay zekaya sor",placeholder:"Bir soru sorun...",tooltip:"Yapay zekaya bir soru sorun",tryAsking:"Bir soru sormayı deneyin",askAnything:"Her şeyi sor...",clearChat:"Sohbeti temizle",close:"Kapat",expand:"Genişlet",collapse:"Daralt",thinking:"Düşünüyorum...",askMeAnything:"Her şeyi sor",askMeAnythingDescription:"Belgelerde gezinme, kavramları anlama ve yanıt bulma konusunda yardım alın.",faq:"SSS",chatCleared:"Sohbet yenilendiğinde temizlenir",lineBreak:"Satır sonu",explainWithAi:"Yapay zeka ile açıklayın",toolListPages:"Listelenen dokümantasyon sayfaları",toolReadPage:"Oku",loading:{searching:"Dokümantasyonda arama",reading:"Dokümanlar okunuyor",analyzing:"İçerik analiz ediliyor",finding:"En iyi yanıt bulunuyor",finished:"Kullanılan kaynaklar"}},r={common:a,docs:o,logo:n,assistant:e};export{e as assistant,a as common,r as default,o as docs,n as logo}; diff --git a/docus/dist/_nuxt/B91fwRQf.js b/docus/dist/_nuxt/B91fwRQf.js new file mode 100644 index 0000000..02f1eaf --- /dev/null +++ b/docus/dist/_nuxt/B91fwRQf.js @@ -0,0 +1 @@ +import{$ as h,aR as b,a0 as v,a1 as x,e as c,ac as r,s as e,B as u,af as d,ag as q,f as k,ak as C,q as S,m as $,c as B,am as p,o as m}from"./B3fabVUf.js";import w from"./C-sCiTCq.js";const P={slots:{root:"relative my-5 group",header:"flex items-center gap-1.5 border border-muted bg-default border-b-0 relative rounded-t-md px-4 py-3",filename:"text-default text-sm/6",icon:"size-4 shrink-0",copy:"absolute top-[11px] right-[11px] lg:opacity-0 lg:group-hover:opacity-100 transition",base:"group font-mono text-sm/6 border border-muted bg-muted rounded-md px-4 py-3 whitespace-pre-wrap break-words overflow-x-auto focus:outline-none **:[.line]:block **:[.line.highlight]:-mx-4 **:[.line.highlight]:px-4 **:[.line.highlight]:bg-accented/50!"},variants:{filename:{true:{root:"[&>pre]:rounded-t-none [&>pre]:my-0 my-5"}}}},A={__name:"ProsePre",props:{icon:{type:null,required:!1},code:{type:String,required:!1},language:{type:String,required:!1},filename:{type:String,required:!1},highlights:{type:Array,required:!1},hideHeader:{type:Boolean,required:!1},meta:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const t=a,{t:f}=h(),{copy:g,copied:y}=b(),l=v(),s=x("prose.pre",t),o=B(()=>p({extend:p(P),...l.ui?.prose?.pre||{}})());return(i,n)=>(m(),c("div",{class:r(o.value.root({class:[e(s)?.root],filename:!!a.filename}))},[a.filename&&!a.hideHeader?(m(),c("div",{key:0,class:r(o.value.header({class:e(s)?.header}))},[u(w,{icon:a.icon,filename:a.filename,class:r(o.value.icon({class:e(s)?.icon}))},null,8,["icon","filename","class"]),d("span",{class:r(o.value.filename({class:e(s)?.filename}))},q(a.filename),3)],2)):k("",!0),u(C,{icon:e(y)?e(l).ui.icons.copyCheck:e(l).ui.icons.copy,color:"neutral",variant:"outline",size:"sm","aria-label":e(f)("prose.pre.copy"),class:r(o.value.copy({class:e(s)?.copy})),tabindex:"-1",onClick:n[0]||(n[0]=z=>e(g)(t.code||""))},null,8,["icon","aria-label","class"]),d("pre",$({class:o.value.base({class:[e(s)?.base,t.class]})},i.$attrs),[S(i.$slots,"default")],16)],2))}};export{A as default}; diff --git a/docus/dist/_nuxt/BKwruWNQ.js b/docus/dist/_nuxt/BKwruWNQ.js new file mode 100644 index 0000000..7adfcf8 --- /dev/null +++ b/docus/dist/_nuxt/BKwruWNQ.js @@ -0,0 +1 @@ +import{a0 as p,a1 as u,e as d,af as i,q as f,ac as o,s as t,c as m,am as r,o as b}from"./B3fabVUf.js";const v={slots:{root:"relative my-5 overflow-x-auto",base:"w-full border-separate border-spacing-0 rounded-md"}},g={__name:"ProseTable",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(l){const e=l,c=p(),s=u("prose.table",e),a=m(()=>r({extend:r(v),...c.ui?.prose?.table||{}})());return(n,_)=>(b(),d("div",{class:o(a.value.root({class:[t(s)?.root,e.class]}))},[i("table",{class:o(a.value.base({class:t(s)?.base}))},[f(n.$slots,"default")],2)],2))}};export{g as default}; diff --git a/docus/dist/_nuxt/BLnzyn6S.js b/docus/dist/_nuxt/BLnzyn6S.js new file mode 100644 index 0000000..e21ebad --- /dev/null +++ b/docus/dist/_nuxt/BLnzyn6S.js @@ -0,0 +1 @@ +import{r as a}from"./Cf5i2Hk_.js";import t from"./Jc8Ntx_l.js";import{a0 as s,a as e,p as n,s as p,o as c}from"./B3fabVUf.js";import"./BN_7HF1G.js";const d={__name:"ProseCaution",setup(i){const o=s();return(r,f)=>(c(),e(t,{color:"error",icon:p(o).ui.icons.caution},{default:n(()=>[a(r.$slots,"default",{mdcUnwrap:"p"})]),_:3},8,["icon"]))}};export{d as default}; diff --git a/docus/dist/_nuxt/BN_7HF1G.js b/docus/dist/_nuxt/BN_7HF1G.js new file mode 100644 index 0000000..8e3b47c --- /dev/null +++ b/docus/dist/_nuxt/BN_7HF1G.js @@ -0,0 +1 @@ +const y=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,i){return r.type===i||typeof r.type=="object"&&r.type.tag===i||r.tag===i}function u(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function l(r){return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof r.children?.default=="function"?r.children.default():[]}function n(r){if(!r)return"";if(Array.isArray(r))return r.map(n).join("");if(u(r))return r.value||r.children||"";const i=l(r);return Array.isArray(i)?i.map(n).filter(Boolean).join(""):""}function h(r,i=[]){if(Array.isArray(r))return r.flatMap(e=>h(e,i));let t=r;return i.some(e=>e==="*"||f(r,e))&&(t=l(r)||r,!Array.isArray(t)&&y.some(e=>f(r,e))&&(t=[t])),t}function p(r,i=[]){return r=Array.isArray(r)?r:[r],i.length?r.flatMap(t=>p(h(t,[i[0]]),i.slice(1))).filter(t=>!(u(t)&&n(t).trim()==="")):r}function a(r,i=[]){return typeof i=="string"&&(i=i.split(/[,\s]/).map(t=>t.trim()).filter(Boolean)),i.length?p(r,i).reduce((t,e)=>(u(e)?typeof t[t.length-1]=="string"?t[t.length-1]+=e.children:t.push(e.children):t.push(e),t),[]):r}export{a as f,n}; diff --git a/docus/dist/_nuxt/BOynLmEf.js b/docus/dist/_nuxt/BOynLmEf.js new file mode 100644 index 0000000..6de35a1 --- /dev/null +++ b/docus/dist/_nuxt/BOynLmEf.js @@ -0,0 +1 @@ +const a={or:"ou",error:{title:"Página não encontrada",description:"Desculpe, mas esta página não pôde ser encontrada."}},o={copy:{page:"Copiar página",link:"Copiar página em Markdown",view:"Visualizar como Markdown",gpt:"Abrir no ChatGPT",claude:"Abrir no Claude"},links:"Comunidade",toc:"Nesta página",menu:"Menu",report:"Reportar um erro",edit:"Editar esta página"},e={copyLogo:"Copiar logo",copyWordmark:"Copiar wordmark",downloadLogo:"Baixar logo",downloadWordmark:"Baixar wordmark",brandAssets:"Recursos da marca",logoCopied:"Logo copiado",wordmarkCopied:"Wordmark copiado",logoDownloaded:"Logo baixado",wordmarkDownloaded:"Wordmark baixado",copyLogoFailed:"Falha ao copiar o logo",copyWordmarkFailed:"Falha ao copiar o wordmark"},r={title:"Pergunte à IA",placeholder:"Faça uma pergunta...",tooltip:"Faça uma pergunta à IA",tryAsking:"Tente fazer uma pergunta",askAnything:"Pergunte qualquer coisa...",clearChat:"Limpar chat",close:"Fechar",expand:"Expandir",collapse:"Recolher",thinking:"Pensando...",askMeAnything:"Perguntar qualquer coisa",askMeAnythingDescription:"Obtenha ajuda para navegar pela documentação, entender conceitos e encontrar respostas.",faq:"Perguntas frequentes",chatCleared:"O chat é apagado ao atualizar",lineBreak:"Quebra de linha",explainWithAi:"Explicar com IA",toolListPages:"Páginas de documentação listadas",toolReadPage:"Ler",loading:{searching:"Pesquisar a documentação",reading:"Ler os documentos",analyzing:"Analisar o conteúdo",finding:"Encontrar a melhor resposta",finished:"Fontes utilizadas"}},n={common:a,docs:o,logo:e,assistant:r};export{r as assistant,a as common,n as default,o as docs,e as logo}; diff --git a/docus/dist/_nuxt/BRj7a3jo.js b/docus/dist/_nuxt/BRj7a3jo.js new file mode 100644 index 0000000..56d3e54 --- /dev/null +++ b/docus/dist/_nuxt/BRj7a3jo.js @@ -0,0 +1 @@ +const e={or:"oder",error:{title:"Säit net fonnt",description:"Et deet ons leed, awer d'Säit déi Dir sicht gëtt et net."}},n={copy:{page:"Säit kopéieren",link:"Markdown Säit kopéieren",view:"Als Markdown kucken",gpt:"An ChatGPT opmaachen",claude:"An Claude opmaachen"},links:"Gemeinschaft",toc:"Op dëser Säit",menu:"Menü",report:"Problem mellen",edit:"Dës Säit änneren"},o={copyLogo:"Logo kopéieren",copyWordmark:"Wortmark kopéieren",downloadLogo:"Logo eroflueden",downloadWordmark:"Wortmark eroflueden",brandAssets:"Marken-Materialien",logoCopied:"Logo kopéiert",wordmarkCopied:"Wortmark kopéiert",logoDownloaded:"Logo erofgelueden",wordmarkDownloaded:"Wortmark erofgelueden",copyLogoFailed:"Logo konnt net kopéiert ginn",copyWordmarkFailed:"Wortmark konnt net kopéiert ginn"},t={title:"Frot d'AI",placeholder:"Stell eng Fro...",tooltip:"Stell der AI eng Fro",tryAsking:"Probéieren eng Fro ze stellen",askAnything:"Frot iergendeppes...",clearChat:"Chat läschen",close:"Zoumaachen",expand:"Erweideren",collapse:"Zesummeklappen",thinking:"Denken...",askMeAnything:"Frot alles",askMeAnythingDescription:"Kritt Hëllef fir an der Dokumentatioun ze navigéieren, Konzepter ze verstoen an Äntwerten ze fannen.",faq:"FAQ",chatCleared:"Chat gëtt op Erfrëschung gereinegt",lineBreak:"Zeilepaus",explainWithAi:"Erklär mat AI",toolListPages:"Opgelëschte Dokumentatiounssäiten",toolReadPage:"Liesen",loading:{searching:"D'Dokumentatioun gëtt duerchsicht",reading:"D'Dokumenter ginn duerchgelies",analyzing:"Den Inhalt gëtt analyséiert",finding:"Déi bescht Äntwert gëtt fonnt",finished:"Benotzte Quellen"}},r={common:e,docs:n,logo:o,assistant:t};export{t as assistant,e as common,r as default,n as docs,o as logo}; diff --git a/docus/dist/_nuxt/BXokzvm8.js b/docus/dist/_nuxt/BXokzvm8.js new file mode 100644 index 0000000..392f05f --- /dev/null +++ b/docus/dist/_nuxt/BXokzvm8.js @@ -0,0 +1 @@ +import{a0 as c,a1 as i,e as l,q as p,ac as u,s as m,c as d,am as a,o as f,ah as b,ag as g}from"./B3fabVUf.js";const y={base:"*:first:mt-0 *:last:mb-0 *:my-1.5"},I={__name:"ProseTabsItem",props:{label:{type:String,required:!0},description:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,t=c(),r=i("prose.tabsItem",s),o=d(()=>a({extend:a(y),...t.ui?.prose?.tabsItem||{}}));return(n,q)=>(f(),l("div",{class:u(o.value({class:[m(r)?.base,s.class]}))},[p(n.$slots,"default",{},()=>[b(g(e.description),1)])],2))}};export{I as default}; diff --git a/docus/dist/_nuxt/BeOsfPZ5.js b/docus/dist/_nuxt/BeOsfPZ5.js new file mode 100644 index 0000000..bdbf64f --- /dev/null +++ b/docus/dist/_nuxt/BeOsfPZ5.js @@ -0,0 +1 @@ +const a={or:"o",error:{title:"Pagina non trovata",description:"Ci scusiamo, ma sembra che questa pagina non sia disponibile."}},o={copy:{page:"Copia pagina",link:"Copia pagina Markdown",view:"Visualizza come Markdown",gpt:"Apri in ChatGPT",claude:"Apri in Claude"},links:"Comunità",toc:"In questa pagina",menu:"Menu",report:"Segnala un problema",edit:"Modifica questa pagina"},i={copyLogo:"Copia logo",copyWordmark:"Copia wordmark",downloadLogo:"Scarica logo",downloadWordmark:"Scarica wordmark",brandAssets:"Risorse del brand",logoCopied:"Logo copiato",wordmarkCopied:"Wordmark copiato",logoDownloaded:"Logo scaricato",wordmarkDownloaded:"Wordmark scaricato",copyLogoFailed:"Impossibile copiare il logo",copyWordmarkFailed:"Impossibile copiare il wordmark"},e={title:"Chiedi all'AI",placeholder:"Fai una domanda...",tooltip:"Fai una domanda all'IA",tryAsking:"Prova a fare una domanda",askAnything:"Chiedi qualsiasi cosa...",clearChat:"Cancella chat",close:"Chiudi",expand:"Espandi",collapse:"Comprimi",thinking:"Sto pensando...",askMeAnything:"Chiedi qualsiasi cosa",askMeAnythingDescription:"Ricevi assistenza per esplorare la documentazione, comprendere i concetti e trovare risposte.",faq:"Domande frequenti",chatCleared:"La chat viene cancellata all'aggiornamento",lineBreak:"Interruzione di riga",explainWithAi:"Spiega con l'IA",toolListPages:"Pagine di documentazione elencate",toolReadPage:"Leggi",loading:{searching:"Ricerca della documentazione",reading:"Leggere i documenti",analyzing:"Analizzare il contenuto",finding:"Trovare la risposta migliore",finished:"Fonti utilizzate"}},n={common:a,docs:o,logo:i,assistant:e};export{e as assistant,a as common,n as default,o as docs,i as logo}; diff --git a/docus/dist/_nuxt/BePYYsBE.js b/docus/dist/_nuxt/BePYYsBE.js new file mode 100644 index 0000000..2fc3531 --- /dev/null +++ b/docus/dist/_nuxt/BePYYsBE.js @@ -0,0 +1 @@ +const o={or:"හෝ",error:{title:"පිටුව හමු නොවීය",description:"අපට කණගාටුයි, නමුත් මෙම පිටුව සොයාගත නොහැකි විය."}},a={copy:{page:"පිටුව පිටපත් කරන්න",link:"Markdown පිටුව පිටපත් කරන්න",view:"Markdown ලෙස බලන්න",gpt:"ChatGPT හි විවෘත කරන්න",claude:"Claude හි විවෘත කරන්න"},links:"Community",toc:"මෙම පිටුවේ",menu:"මෙනුව",report:"ගැටලුවක් වාර්තා කරන්න",edit:"මෙම පිටුව සංස්කරණය කරන්න"},e={copyLogo:"ලාංඡනය පිටපත් කරන්න",copyWordmark:"වචන ලකුණ පිටපත් කරන්න",downloadLogo:"ලාංඡනය බාගන්න",downloadWordmark:"වචන ලකුණ බාගන්න",brandAssets:"වෙළඳ නාම සම්පත්",logoCopied:"ලාංඡනය පිටපත් කරන ලදී",wordmarkCopied:"වචන ලකුණ පිටපත් කරන ලදී",logoDownloaded:"ලාංඡනය බාගත කරන ලදී",wordmarkDownloaded:"වචන ලකුණ බාගත කරන ලදී",copyLogoFailed:"ලාංඡනය පිටපත් කිරීමට අසමත් විය",copyWordmarkFailed:"වචන ලකුණ පිටපත් කිරීමට අසමත් විය"},n={title:"AI අහන්න",placeholder:"ප්‍රශ්නයක් අහන්න...",tooltip:"AI ගෙන් ප්‍රශ්නයක් අසන්න",tryAsking:"ප්රශ්නයක් ඇසීමට උත්සාහ කරන්න",askAnything:"ඕන දෙයක් අහන්න...",clearChat:"කතාබස් පැහැදිලි කරන්න",close:"වසන්න",expand:"පුළුල් කරන්න",collapse:"හකුළන්න",thinking:"සිතමින්...",askMeAnything:"ඕන දෙයක් අහන්න",askMeAnythingDescription:"ලේඛන සැරිසැරීමට, සංකල්ප තේරුම් ගැනීමට සහ පිළිතුරු සෙවීමට උදවු ලබා ගන්න.",faq:"නිතර අසන පැන",chatCleared:"නැවුම් කිරීමේදී කතාබස් හිස් වේ",lineBreak:"රේඛා බිඳීම",explainWithAi:"AI සමඟ පැහැදිලි කරන්න",toolListPages:"ලැයිස්තුගත ලේඛන පිටු",toolReadPage:"කියවන්න",loading:{searching:"ලේඛන සෙවීම",reading:"ලේඛන හරහා කියවීම",analyzing:"අන්තර්ගතය විශ්ලේෂණය කිරීම",finding:"හොඳම පිළිතුර සොයා ගැනීම",finished:"භාවිතා කරන ලද මූලාශ්ර"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/BecbEIqG.js b/docus/dist/_nuxt/BecbEIqG.js new file mode 100644 index 0000000..579a69b --- /dev/null +++ b/docus/dist/_nuxt/BecbEIqG.js @@ -0,0 +1 @@ +import{Q as C,a0 as q,a1 as S,o as r,a as d,p,e as g,ac as o,s as i,q as u,ab as $,f as c,af as m,a7 as w,m as F,ah as y,ag as v,P as I,c as k,am as b,c4 as P}from"./B3fabVUf.js";const j={slots:{root:"relative rounded-sm",wrapper:"",leading:"inline-flex items-center justify-center",leadingIcon:"size-5 shrink-0 text-primary",title:"text-base text-pretty font-semibold text-highlighted",description:"text-[15px] text-pretty text-muted"},variants:{orientation:{horizontal:{root:"flex items-start gap-2.5",leading:"p-0.5"},vertical:{leading:"mb-2.5"}},to:{true:{root:["has-focus-visible:ring-2 has-focus-visible:ring-primary","transition"]}},title:{true:{description:"mt-1"}}}},B=Object.assign({inheritAttrs:!1},{__name:"UPageFeature",props:{as:{type:null,required:!1},icon:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},orientation:{type:null,required:!1,default:"horizontal"},to:{type:null,required:!1},target:{type:[String,Object,null],required:!1},onClick:{type:Function,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const t=e,s=C(),h=q(),l=S("pageFeature",t),a=k(()=>b({extend:b(j),...h.ui?.pageFeature||{}})({orientation:t.orientation,title:!!t.title||!!s.title,to:!!t.to||!!t.onClick})),x=k(()=>(s.title&&P(s.title())||t.title||"Feature link").trim());return(n,f)=>(r(),d(i(I),{as:e.as,"data-orientation":e.orientation,"data-slot":"root",class:o(a.value.root({class:[i(l)?.root,t.class]})),onClick:e.onClick},{default:p(()=>[e.icon||s.leading?(r(),g("div",{key:0,"data-slot":"leading",class:o(a.value.leading({class:i(l)?.leading}))},[u(n.$slots,"leading",{ui:a.value},()=>[e.icon?(r(),d($,{key:0,name:e.icon,"data-slot":"leadingIcon",class:o(a.value.leadingIcon({class:i(l)?.leadingIcon}))},null,8,["name","class"])):c("",!0)])],2)):c("",!0),m("div",{"data-slot":"wrapper",class:o(a.value.wrapper({class:i(l)?.wrapper}))},[e.to?(r(),d(w,F({key:0,"aria-label":x.value},{to:e.to,target:e.target,...n.$attrs},{class:"focus:outline-none peer",raw:""}),{default:p(()=>[...f[0]||(f[0]=[m("span",{class:"absolute inset-0","aria-hidden":"true"},null,-1)])]),_:1},16,["aria-label"])):c("",!0),u(n.$slots,"default",{},()=>[e.title||s.title?(r(),g("div",{key:0,"data-slot":"title",class:o(a.value.title({class:i(l)?.title}))},[u(n.$slots,"title",{},()=>[y(v(e.title),1)])],2)):c("",!0),e.description||s.description?(r(),g("div",{key:1,"data-slot":"description",class:o(a.value.description({class:i(l)?.description}))},[u(n.$slots,"description",{},()=>[y(v(e.description),1)])],2)):c("",!0)])],2)]),_:3},8,["as","data-orientation","class","onClick"]))}});export{B as default}; diff --git a/docus/dist/_nuxt/BfXwXGCj.js b/docus/dist/_nuxt/BfXwXGCj.js new file mode 100644 index 0000000..8042f67 --- /dev/null +++ b/docus/dist/_nuxt/BfXwXGCj.js @@ -0,0 +1 @@ +import{aQ as c,e as t,s as d,q as n,c as p,o as r}from"./B3fabVUf.js";const u=["id"],f=["href"],k={__name:"ProseH5",props:{id:{type:String,required:!1}},setup(a){const e=a,{headings:o}=c().public.mdc,i=p(()=>e.id&&(typeof o?.anchorLinks=="boolean"&&o?.anchorLinks===!0||typeof o?.anchorLinks=="object"&&o?.anchorLinks?.h5));return(s,h)=>(r(),t("h5",{id:e.id},[e.id&&d(i)?(r(),t("a",{key:0,href:`#${e.id}`},[n(s.$slots,"default")],8,f)):n(s.$slots,"default",{key:1})],8,u))}};export{k as default}; diff --git a/docus/dist/_nuxt/Bkurqz2d.js b/docus/dist/_nuxt/Bkurqz2d.js new file mode 100644 index 0000000..cc249a1 --- /dev/null +++ b/docus/dist/_nuxt/Bkurqz2d.js @@ -0,0 +1 @@ +const o={or:"ή",error:{title:"Η σελίδα δεν βρέθηκε",description:"Λυπούμαστε, αλλά η σελίδα που αναζητάτε δεν υπάρχει."}},a={copy:{page:"Αντιγραφή σελίδας",link:"Αντιγραφή σελίδας Markdown",view:"Προβολή ως Markdown",gpt:"Άνοιγμα στο ChatGPT",claude:"Άνοιγμα στο Claude"},links:"Κοινότητα",toc:"Σε αυτή τη σελίδα",menu:"Μενού",report:"Αναφορά προβλήματος",edit:"Επεξεργασία αυτής της σελίδας"},e={copyLogo:"Αντιγραφή λογοτύπου",copyWordmark:"Αντιγραφή wordmark",downloadLogo:"Λήψη λογοτύπου",downloadWordmark:"Λήψη wordmark",brandAssets:"Υλικά επωνυμίας",logoCopied:"Το λογότυπο αντιγράφηκε",wordmarkCopied:"Το wordmark αντιγράφηκε",logoDownloaded:"Το λογότυπο κατέβηκε",wordmarkDownloaded:"Το wordmark κατέβηκε",copyLogoFailed:"Αποτυχία αντιγραφής λογοτύπου",copyWordmarkFailed:"Αποτυχία αντιγραφής wordmark"},d={title:"Ερώτηση στην τεχνητή νοημοσύνη",placeholder:"Κάντε μια ερώτηση...",tooltip:"Κάντε μια ερώτηση στην τεχνητή νοημοσύνη",tryAsking:"Δοκιμάστε να κάνετε μια ερώτηση",askAnything:"Ρωτήστε οτιδήποτε...",clearChat:"Εκκαθάριση συνομιλίας",close:"Κλείσιμο",expand:"Ανάπτυξη",collapse:"Σύμπτυξη",thinking:"Σκέψη...",askMeAnything:"Ρωτήστε οτιδήποτε",askMeAnythingDescription:"Λάβετε βοήθεια για την πλοήγηση στην τεκμηρίωση, την κατανόηση των εννοιών και την εύρεση απαντήσεων.",faq:"Συχνές Ερωτήσεις",chatCleared:"Η συνομιλία εκκαθαρίζεται κατά την ανανέωση",lineBreak:"Διακοπή γραμμής",explainWithAi:"Εξηγήστε με τεχνητή νοημοσύνη",toolListPages:"Καταχωρημένες σελίδες τεκμηρίωσης",toolReadPage:"Ανάγνωση",loading:{searching:"Αναζήτηση στην τεκμηρίωση",reading:"Ανάγνωση των εγγράφων",analyzing:"Ανάλυση του περιεχομένου",finding:"Βρίσκοντας την καλύτερη απάντηση",finished:"Πηγές που χρησιμοποιήθηκαν"}},n={common:o,docs:a,logo:e,assistant:d};export{d as assistant,o as common,n as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/BlIgAVvl.js b/docus/dist/_nuxt/BlIgAVvl.js new file mode 100644 index 0000000..e9bf046 --- /dev/null +++ b/docus/dist/_nuxt/BlIgAVvl.js @@ -0,0 +1 @@ +import{a0 as c,a1 as p,e as l,q as u,ac as m,s as i,c as f,am as s,o as d}from"./B3fabVUf.js";const _={base:""},g={__name:"ProseEm",props:{class:{type:String,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,o=c(),t=p("prose.em",e),r=f(()=>s({extend:s(_),...o.ui?.prose?.em||{}}));return(n,C)=>(d(),l("em",{class:m(r.value({class:[i(t)?.base,e.class]}))},[u(n.$slots,"default")],2))}};export{g as default}; diff --git a/docus/dist/_nuxt/BlxJeUnt.js b/docus/dist/_nuxt/BlxJeUnt.js new file mode 100644 index 0000000..b779ca6 --- /dev/null +++ b/docus/dist/_nuxt/BlxJeUnt.js @@ -0,0 +1 @@ +const o={or:"або",error:{title:"Сторінку не знайдено",description:"Вибачте, але сторінку, яку ви шукаєте, не знайдено."}},a={copy:{page:"Скопіювати сторінку",link:"Скопіювати Markdown сторінку",view:"Переглянути як Markdown",gpt:"Відкрити в ChatGPT",claude:"Відкрити в Claude"},links:"Спільнота",toc:"На цій сторінці",menu:"Меню",report:"Повідомити про проблему",edit:"Редагувати цю сторінку"},e={copyLogo:"Копіювати логотип",copyWordmark:"Копіювати словесний знак",downloadLogo:"Завантажити логотип",downloadWordmark:"Завантажити словесний знак",brandAssets:"Матеріали бренду",logoCopied:"Логотип скопійовано",wordmarkCopied:"Словесний знак скопійовано",logoDownloaded:"Логотип завантажено",wordmarkDownloaded:"Словесний знак завантажено",copyLogoFailed:"Не вдалося скопіювати логотип",copyWordmarkFailed:"Не вдалося скопіювати словесний знак"},n={title:"Запитайте ШІ",placeholder:"Задайте питання...",tooltip:"Задайте питання ШІ",tryAsking:"Спробуйте задати питання",askAnything:"Запитайте будь-що...",clearChat:"Очистити чат",close:"Закрити",expand:"Розгорнути",collapse:"Згорнути",thinking:"Думаючи...",askMeAnything:"Запитайте будь-що",askMeAnythingDescription:"Отримайте допомогу в навігації документацією, розумінні понять і пошуку відповідей.",faq:"Поширені запитання",chatCleared:"Чат очищається під час оновлення",lineBreak:"Розрив рядка",explainWithAi:"Поясніть за допомогою ШІ",toolListPages:"Перелічені сторінки документації",toolReadPage:"Читати",loading:{searching:"Пошук документації",reading:"Читання документів",analyzing:"Аналіз змісту",finding:"Пошук найкращої відповіді",finished:"Використані джерела"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/BnHu5O7o.js b/docus/dist/_nuxt/BnHu5O7o.js new file mode 100644 index 0000000..b56a3c6 --- /dev/null +++ b/docus/dist/_nuxt/BnHu5O7o.js @@ -0,0 +1 @@ +import{_ as o}from"./DXQrCARz.js";import{bY as a,a as n,p as s,o as r,q as c}from"./B3fabVUf.js";const _={};function f(t,l){const e=o;return r(),n(e,null,{default:s(()=>[c(t.$slots,"default")]),_:3})}const m=a(_,[["render",f]]);export{m as default}; diff --git a/docus/dist/_nuxt/BnW3dU0n.js b/docus/dist/_nuxt/BnW3dU0n.js new file mode 100644 index 0000000..c1f3734 --- /dev/null +++ b/docus/dist/_nuxt/BnW3dU0n.js @@ -0,0 +1 @@ +import{Q as _,a0 as K,a1 as P,a2 as O,a3 as j,o,a as d,p as b,B as A,s as a,ac as g,q as f,e as w,F as I,r as $,Z as m,ab as F,ad as R,m as V,f as y,ah as T,ag as C,bB as D,v as U,c as B,am as x,_ as E,G as H,bC as L,w as M,bt as W,ay as G,al as Q,W as Z}from"./B3fabVUf.js";import{a as J,b as X,c as Y,d as ee,T as ae}from"./DewHeYIb.js";import"./B6bUjJBd.js";const te={slots:{root:"flex items-center gap-2",list:"relative flex p-1 group",indicator:"absolute transition-[translate,width] duration-200",trigger:["group relative inline-flex items-center min-w-0 data-[state=inactive]:text-muted hover:data-[state=inactive]:not-disabled:text-default font-medium rounded-md disabled:cursor-not-allowed disabled:opacity-75","transition-colors"],leadingIcon:"shrink-0",leadingAvatar:"shrink-0",leadingAvatarSize:"",label:"truncate",trailingBadge:"shrink-0",trailingBadgeSize:"sm",content:"focus:outline-none w-full"},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{pill:{list:"bg-elevated rounded-lg",trigger:"grow",indicator:"rounded-md shadow-xs"},link:{list:"border-default",indicator:"rounded-full",trigger:"focus:outline-none"}},orientation:{horizontal:{root:"flex-col",list:"w-full",indicator:"left-0 w-(--reka-tabs-indicator-size) translate-x-(--reka-tabs-indicator-position)",trigger:"justify-center"},vertical:{list:"flex-col",indicator:"top-0 h-(--reka-tabs-indicator-size) translate-y-(--reka-tabs-indicator-position)"}},size:{xs:{trigger:"px-2 py-1 text-xs gap-1",leadingIcon:"size-4",leadingAvatarSize:"3xs"},sm:{trigger:"px-2.5 py-1.5 text-xs gap-1.5",leadingIcon:"size-4",leadingAvatarSize:"3xs"},md:{trigger:"px-3 py-1.5 text-sm gap-1.5",leadingIcon:"size-5",leadingAvatarSize:"2xs"},lg:{trigger:"px-3 py-2 text-sm gap-2",leadingIcon:"size-5",leadingAvatarSize:"2xs"},xl:{trigger:"px-3 py-2 text-base gap-2",leadingIcon:"size-6",leadingAvatarSize:"xs"}}},compoundVariants:[{orientation:"horizontal",variant:"pill",class:{indicator:"inset-y-1"}},{orientation:"horizontal",variant:"link",class:{list:"border-b -mb-px",indicator:"-bottom-px h-px"}},{orientation:"vertical",variant:"pill",class:{indicator:"inset-x-1",list:"items-center"}},{orientation:"vertical",variant:"link",class:{list:"border-s -ms-px",indicator:"-start-px w-px"}},{color:"primary",variant:"pill",class:{indicator:"bg-primary",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"}},{color:"secondary",variant:"pill",class:{indicator:"bg-secondary",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-secondary"}},{color:"success",variant:"pill",class:{indicator:"bg-success",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-success"}},{color:"info",variant:"pill",class:{indicator:"bg-info",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-info"}},{color:"warning",variant:"pill",class:{indicator:"bg-warning",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-warning"}},{color:"error",variant:"pill",class:{indicator:"bg-error",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-error"}},{color:"neutral",variant:"pill",class:{indicator:"bg-inverted",trigger:"data-[state=active]:text-inverted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-inverted"}},{color:"primary",variant:"link",class:{indicator:"bg-primary",trigger:"data-[state=active]:text-primary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary"}},{color:"secondary",variant:"link",class:{indicator:"bg-secondary",trigger:"data-[state=active]:text-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-secondary"}},{color:"success",variant:"link",class:{indicator:"bg-success",trigger:"data-[state=active]:text-success focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-success"}},{color:"info",variant:"link",class:{indicator:"bg-info",trigger:"data-[state=active]:text-info focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-info"}},{color:"warning",variant:"link",class:{indicator:"bg-warning",trigger:"data-[state=active]:text-warning focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-warning"}},{color:"error",variant:"link",class:{indicator:"bg-error",trigger:"data-[state=active]:text-error focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-error"}},{color:"neutral",variant:"link",class:{indicator:"bg-inverted",trigger:"data-[state=active]:text-highlighted focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-inverted"}}],defaultVariants:{color:"primary",variant:"pill",size:"md"}},ie={__name:"UTabs",props:{as:{type:null,required:!1},items:{type:Array,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},size:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},content:{type:Boolean,required:!1,default:!0},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultValue:{type:[String,Number],required:!1,default:"0"},modelValue:{type:[String,Number],required:!1},activationMode:{type:String,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:modelValue"],setup(n,{expose:c,emit:h}){const t=n,z=h,S=_(),k=K(),r=P("tabs",t),q=O(j(t,"as","unmountOnHide"),z),s=B(()=>x({extend:x(te),...k.ui?.tabs||{}})({color:t.color,variant:t.variant,size:t.size,orientation:t.orientation})),p=U([]);function l(i,v){p.value[i]=v}return c({triggersRef:p}),(i,v)=>(o(),d(a(ae),V(a(q),{"model-value":n.modelValue,"default-value":n.defaultValue,orientation:n.orientation,"activation-mode":n.activationMode,"data-slot":"root",class:s.value.root({class:[a(r)?.root,t.class]})}),{default:b(()=>[A(a(J),{"data-slot":"list",class:g(s.value.list({class:a(r)?.list}))},{default:b(()=>[A(a(X),{"data-slot":"indicator",class:g(s.value.indicator({class:a(r)?.indicator}))},null,8,["class"]),f(i.$slots,"list-leading"),(o(!0),w(I,null,$(n.items,(e,u)=>(o(),d(a(Y),{key:u,ref_for:!0,ref:N=>l(u,N),value:a(m)(e,t.valueKey)??String(u),disabled:e.disabled,"data-slot":"trigger",class:g(s.value.trigger({class:[a(r)?.trigger,e.ui?.trigger]}))},{default:b(()=>[f(i.$slots,"leading",{item:e,index:u,ui:s.value},()=>[e.icon?(o(),d(F,{key:0,name:e.icon,"data-slot":"leadingIcon",class:g(s.value.leadingIcon({class:[a(r)?.leadingIcon,e.ui?.leadingIcon]}))},null,8,["name","class"])):e.avatar?(o(),d(R,V({key:1,size:e.ui?.leadingAvatarSize||a(r)?.leadingAvatarSize||s.value.leadingAvatarSize()},{ref_for:!0},e.avatar,{"data-slot":"leadingAvatar",class:s.value.leadingAvatar({class:[a(r)?.leadingAvatar,e.ui?.leadingAvatar]})}),null,16,["size","class"])):y("",!0)]),a(m)(e,t.labelKey)||S.default?(o(),w("span",{key:0,"data-slot":"label",class:g(s.value.label({class:[a(r)?.label,e.ui?.label]}))},[f(i.$slots,"default",{item:e,index:u},()=>[T(C(a(m)(e,t.labelKey)),1)])],2)):y("",!0),f(i.$slots,"trailing",{item:e,index:u,ui:s.value},()=>[e.badge||e.badge===0?(o(),d(D,V({key:0,color:"neutral",variant:"outline",size:e.ui?.trailingBadgeSize||a(r)?.trailingBadgeSize||s.value.trailingBadgeSize()},{ref_for:!0},typeof e.badge=="string"||typeof e.badge=="number"?{label:e.badge}:e.badge,{"data-slot":"trailingBadge",class:s.value.trailingBadge({class:[a(r)?.trailingBadge,e.ui?.trailingBadge]})}),null,16,["size","class"])):y("",!0)])]),_:2},1032,["value","disabled","class"]))),128)),f(i.$slots,"list-trailing")]),_:3},8,["class"]),n.content?(o(!0),w(I,{key:0},$(n.items,(e,u)=>(o(),d(a(ee),{key:u,value:a(m)(e,t.valueKey)??String(u),"data-slot":"content",class:g(s.value.content({class:[a(r)?.content,e.ui?.content,e.class]}))},{default:b(()=>[f(i.$slots,e.slot||"content",{item:e,index:u,ui:s.value},()=>[T(C(e.content),1)])]),_:2},1032,["value","class"]))),128)):y("",!0)]),_:3},16,["model-value","default-value","orientation","activation-mode","class"]))}},se={slots:{root:"my-5 gap-4"}},oe={__name:"ProseTabs",props:Q({defaultValue:{type:String,required:!1,default:"0"},sync:{type:String,required:!1},hash:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},{modelValue:{type:String},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const c=n,h=_(),t=E(n,"modelValue"),z=K(),S=P("prose.tabs",c),k=B(()=>x({extend:x(se),...z.ui?.prose?.tabs||{}})),r=U(1),q=B(()=>(r.value,h.default?.()?.flatMap(s).filter(Boolean)||[]));function s(l,i){return typeof l.type=="symbol"?l.children?.map(s):{index:i,label:l.props?.label||`${i}`,description:l.props?.description,icon:l.props?.icon,component:l}}H(()=>{if(c.sync){const l=`tabs-${c.sync}`,i=L(l,()=>localStorage.getItem(l));M(i,()=>{i.value&&(t.value=i.value)},{immediate:!0}),M(t,()=>{t.value&&(i.value=t.value,localStorage.setItem(l,t.value))})}});async function p(){if(c.hash){const l=c.hash.startsWith("#")?c.hash:`#${c.hash}`;setTimeout(()=>{document.querySelector(l)?.scrollIntoView()},200)}}return W(()=>r.value++),(l,i)=>(o(),d(ie,{modelValue:t.value,"onUpdate:modelValue":[i[0]||(i[0]=v=>t.value=v),p],color:"primary",variant:"link",items:q.value,class:g(c.class),"unmount-on-hide":!1,ui:a(G)(k.value(),a(S))},{content:b(({item:v})=>[(o(),d(Z(v.component)))]),_:1},8,["modelValue","items","class","ui"]))}};export{oe as default}; diff --git a/docus/dist/_nuxt/Bnc4fItI.js b/docus/dist/_nuxt/Bnc4fItI.js new file mode 100644 index 0000000..12091d3 --- /dev/null +++ b/docus/dist/_nuxt/Bnc4fItI.js @@ -0,0 +1 @@ +import{r as f}from"./Cf5i2Hk_.js";import{Q as y,a0 as x,a1 as q,a as v,p as g,ac as r,s as t,P as k,c as C,am as u,o as l,af as S,e as i,ag as o,f as n,ah as w}from"./B3fabVUf.js";import"./BN_7HF1G.js";const B={slots:{root:"my-5",container:"flex items-center gap-3 font-mono text-sm",name:"font-semibold text-primary",wrapper:"flex-1 flex items-center gap-1.5 text-xs",required:"rounded-sm bg-error/10 text-error px-1.5 py-0.5",type:"rounded-sm bg-elevated text-toned px-1.5 py-0.5",description:"mt-3 text-muted text-sm [&_code]:text-xs/4"}},V={__name:"ProseField",props:{as:{type:null,required:!1},name:{type:String,required:!1},type:{type:String,required:!1},description:{type:String,required:!1},required:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const c=e,d=y(),p=x(),s=q("prose.field",c),a=C(()=>u({extend:u(B),...p.ui?.prose?.field||{}})());return(m,b)=>(l(),v(t(k),{as:e.as,class:r(a.value.root({class:[t(s)?.root,c.class]}))},{default:g(()=>[S("div",{class:r(a.value.container({class:t(s)?.container}))},[e.name?(l(),i("span",{key:0,class:r(a.value.name({class:t(s)?.name}))},o(e.name),3)):n("",!0),e.type||e.required?(l(),i("div",{key:1,class:r(a.value.wrapper({class:t(s)?.wrapper}))},[e.type?(l(),i("span",{key:0,class:r(a.value.type({class:t(s)?.type}))},o(e.type),3)):n("",!0),e.required?(l(),i("span",{key:1,class:r(a.value.required({class:t(s)?.required}))}," required ",2)):n("",!0)],2)):n("",!0)],2),d.default||e.description?(l(),i("div",{key:0,class:r(a.value.description({class:t(s)?.description}))},[f(m.$slots,"default",{mdcUnwrap:"p"},()=>[w(o(e.description),1)])],2)):n("",!0)]),_:3},8,["as","class"]))}};export{V as default}; diff --git a/docus/dist/_nuxt/BosS-MS4.js b/docus/dist/_nuxt/BosS-MS4.js new file mode 100644 index 0000000..ee7bcfa --- /dev/null +++ b/docus/dist/_nuxt/BosS-MS4.js @@ -0,0 +1 @@ +const e={or:"oder",error:{title:"Seite nicht gefunden",description:"Es tut uns leid, aber diese Seite konnte nicht gefunden werden."}},n={copy:{page:"Seite kopieren",link:"Markdown-Seite kopieren",view:"Als Markdown anzeigen",gpt:"In ChatGPT öffnen",claude:"In Claude öffnen"},links:"Community",toc:"Auf dieser Seite",menu:"Menü",report:"Problem melden",edit:"Diese Seite bearbeiten"},o={copyLogo:"Logo kopieren",copyWordmark:"Wortmarke kopieren",downloadLogo:"Logo herunterladen",downloadWordmark:"Wortmarke herunterladen",brandAssets:"Markenmaterialien",logoCopied:"Logo kopiert",wordmarkCopied:"Wortmarke kopiert",logoDownloaded:"Logo heruntergeladen",wordmarkDownloaded:"Wortmarke heruntergeladen",copyLogoFailed:"Logo konnte nicht kopiert werden",copyWordmarkFailed:"Wortmarke konnte nicht kopiert werden"},i={title:"AI fragen",placeholder:"Stellen Sie eine Frage...",tooltip:"KI eine Frage stellen",tryAsking:"Versuchen Sie, eine Frage zu stellen",askAnything:"Fragen Sie alles...",clearChat:"Chat löschen",close:"Schließen",expand:"Erweitern",collapse:"Einklappen",thinking:"Denken...",askMeAnything:"Fragen Sie alles",askMeAnythingDescription:"Erhalten Sie Hilfe beim Navigieren durch die Dokumentation, beim Verstehen von Konzepten und beim Finden von Antworten.",faq:"FAQ",chatCleared:"Chat wird beim Aktualisieren gelöscht",lineBreak:"Zeilenumbruch",explainWithAi:"Mit KI erklären",toolListPages:"Aufgelistete Dokumentationsseiten",toolReadPage:"Lesen",loading:{searching:"Durchsuchen der Dokumentation",reading:"Lesen der Dokumente",analyzing:"Analysieren des Inhalts",finding:"Die beste Antwort finden",finished:"Verwendete Quellen"}},t={common:e,docs:n,logo:o,assistant:i};export{i as assistant,e as common,t as default,n as docs,o as logo}; diff --git a/docus/dist/_nuxt/Bqoc_FpL.js b/docus/dist/_nuxt/Bqoc_FpL.js new file mode 100644 index 0000000..030c521 --- /dev/null +++ b/docus/dist/_nuxt/Bqoc_FpL.js @@ -0,0 +1 @@ +const o={or:"או",error:{title:"העמוד לא נמצא",description:"אנו מתנצלים, אך העמוד שאתה מחפש לא קיים."}},a={copy:{page:"העתק עמוד",link:"העתק עמוד Markdown",view:"הצג כ-Markdown",gpt:"פתח ב-ChatGPT",claude:"פתח ב-Claude"},links:"קהילה",toc:"בעמוד זה",menu:"תפריט",report:"דווח על בעיה",edit:"ערוך עמוד זה"},e={copyLogo:"העתק לוגו",copyWordmark:"העתק סימן מילולי",downloadLogo:"הורד לוגו",downloadWordmark:"הורד סימן מילולי",brandAssets:"נכסי מותג",logoCopied:"הלוגו הועתק",wordmarkCopied:"הסימן המילולי הועתק",logoDownloaded:"הלוגו הורד",wordmarkDownloaded:"הסימן המילולי הורד",copyLogoFailed:"העתקת הלוגו נכשלה",copyWordmarkFailed:"העתקת הסימן המילולי נכשלה"},n={title:"שאל את הבינה המלאכותית",placeholder:"שאל שאלה...",tooltip:"שאל את הבינה המלאכותית שאלה",tryAsking:"נסה לשאול שאלה",askAnything:"שאל כל דבר...",clearChat:"נקה צ'אט",close:"סגירה",expand:"הרחבה",collapse:"כיווץ התצוגה",thinking:"חושב...",askMeAnything:"שאלו כל דבר",askMeAnythingDescription:"קבלת עזרה בניווט בתיעוד, הבנת מושגים ומציאת תשובות.",faq:"שאלות נפוצות",chatCleared:"הצ'אט נוקה בעת הרענון",lineBreak:"מעבר שורה",explainWithAi:"הסבר באמצעות בינה מלאכותית",toolListPages:"דפי תיעוד רשומים",toolReadPage:"קריאה",loading:{searching:"חיפוש בתיעוד",reading:"קריאה דרך המסמכים",analyzing:"ניתוח התוכן",finding:"מציאת התשובה הטובה ביותר",finished:"מקורות בשימוש"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/BscxgZ9w.js b/docus/dist/_nuxt/BscxgZ9w.js new file mode 100644 index 0000000..1907cbf --- /dev/null +++ b/docus/dist/_nuxt/BscxgZ9w.js @@ -0,0 +1 @@ +const o={or:"lub",error:{title:"Nie znaleziono strony",description:"Przepraszamy, ale nie znaleziono tej strony."}},a={copy:{page:"Skopiuj stronę",link:"Skopiuj stronę Markdown",view:"Wyświetl jako Markdown",gpt:"Otwórz w ChatGPT",claude:"Otwórz w Claude"},links:"Społeczność",toc:"Na tej stronie",menu:"Menu",report:"Zgłoś problem",edit:"Edytuj tę stronę"},i={copyLogo:"Kopiuj logo",copyWordmark:"Kopiuj wordmark",downloadLogo:"Pobierz logo",downloadWordmark:"Pobierz wordmark",brandAssets:"Materiały marki",logoCopied:"Logo skopiowane",wordmarkCopied:"Wordmark skopiowany",logoDownloaded:"Logo pobrane",wordmarkDownloaded:"Wordmark pobrany",copyLogoFailed:"Nie udało się skopiować logo",copyWordmarkFailed:"Nie udało się skopiować wordmarku"},e={title:"Zapytaj SI",placeholder:"Zadaj pytanie...",tooltip:"Zadaj AI pytanie",tryAsking:"Spróbuj zadać pytanie",askAnything:"Zapytaj o cokolwiek...",clearChat:"Wyczyść czat",close:"Zamknij",expand:"Rozwiń",collapse:"Zwiń",thinking:"Zastanawiam się...",askMeAnything:"Zapytaj o cokolwiek",askMeAnythingDescription:"Uzyskaj pomoc w poruszaniu się po dokumentacji, zrozumieniu pojęć i znalezieniu odpowiedzi.",faq:"Często zadawane pytania",chatCleared:"Czat został wyczyszczony po odświeżeniu",lineBreak:"Podział wiersza",explainWithAi:"Wyjaśnij za pomocą sztucznej inteligencji",toolListPages:"Wymienione strony dokumentacji",toolReadPage:"Czytaj",loading:{searching:"Przeszukiwanie dokumentacji",reading:"Czytanie dokumentów",analyzing:"Analizowanie treści",finding:"Znajdowanie najlepszej odpowiedzi",finished:"Wykorzystane źródła"}},n={common:o,docs:a,logo:i,assistant:e};export{e as assistant,o as common,n as default,a as docs,i as logo}; diff --git a/docus/dist/_nuxt/BvtDsFck.js b/docus/dist/_nuxt/BvtDsFck.js new file mode 100644 index 0000000..16d9377 --- /dev/null +++ b/docus/dist/_nuxt/BvtDsFck.js @@ -0,0 +1 @@ +import{s,e as o,ah as e,af as t,f as n,o as a}from"./B3fabVUf.js";const i={key:0},u={__name:"ProseScript",props:{src:{type:String,required:!0}},setup(c){return(l,r)=>s(!1)?(a(),o("div",i,[...r[0]||(r[0]=[e(" Rendering the ",-1),t("code",null,"script",-1),e(" element is dangerous and is disabled by default. Consider implementing your own ",-1),t("code",null,"ProseScript",-1),e(" element to have control over script rendering. ",-1)])])):n("",!0)}};export{u as default}; diff --git a/docus/dist/_nuxt/Bzhn7Nlk.js b/docus/dist/_nuxt/Bzhn7Nlk.js new file mode 100644 index 0000000..b872075 --- /dev/null +++ b/docus/dist/_nuxt/Bzhn7Nlk.js @@ -0,0 +1 @@ +import{a0 as p,a1 as n,e as l,q as u,ac as i,s as d,c as m,am as e,o as f}from"./B3fabVUf.js";const g={base:"grid grid-cols-1 sm:grid-cols-2 gap-5 my-5 *:my-0"},y={__name:"ProseCardGroup",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=a,o=p(),r=n("prose.cardGroup",s),t=m(()=>e({extend:e(g),...o.ui?.prose?.cardGroup||{}}));return(c,C)=>(f(),l("div",{class:i(t.value({class:[d(r)?.base,s.class]}))},[u(c.$slots,"default")],2))}};export{y as default}; diff --git a/docus/dist/_nuxt/C-sCiTCq.js b/docus/dist/_nuxt/C-sCiTCq.js new file mode 100644 index 0000000..404d3d3 --- /dev/null +++ b/docus/dist/_nuxt/C-sCiTCq.js @@ -0,0 +1 @@ +import{a0 as f,a as d,ab as y,f as v,c as t,ao as a,o as r}from"./B3fabVUf.js";const u={"package.json":"i-vscode-icons-file-type-node","tsconfig.json":"i-vscode-icons-file-type-tsconfig",".npmrc":"i-vscode-icons-file-type-npm",".editorconfig":"i-vscode-icons-file-type-editorconfig",".eslintrc":"i-vscode-icons-file-type-eslint",".eslintrc.cjs":"i-vscode-icons-file-type-eslint",".eslintignore":"i-vscode-icons-file-type-eslint","eslint.config.js":"i-vscode-icons-file-type-eslint","eslint.config.mjs":"i-vscode-icons-file-type-eslint","eslint.config.cjs":"i-vscode-icons-file-type-eslint",".gitignore":"i-vscode-icons-file-type-git","yarn.lock":"i-vscode-icons-file-type-yarn",".env":"i-vscode-icons-file-type-dotenv",".env.example":"i-vscode-icons-file-type-dotenv",".vscode/settings.json":"i-vscode-icons-file-type-vscode",nuxt:"i-vscode-icons-file-type-nuxt",".nuxtrc":"i-vscode-icons-file-type-nuxt",".nuxtignore":"i-vscode-icons-file-type-nuxt","nuxt.config.js":"i-vscode-icons-file-type-nuxt","nuxt.config.ts":"i-vscode-icons-file-type-nuxt","nuxt.schema.ts":"i-vscode-icons-file-type-nuxt","tailwind.config.js":"i-vscode-icons-file-type-tailwind","tailwind.config.ts":"i-vscode-icons-file-type-tailwind",vue:"i-vscode-icons-file-type-vue",ts:"i-vscode-icons-file-type-typescript",tsx:"i-vscode-icons-file-type-typescript",mjs:"i-vscode-icons-file-type-js",cjs:"i-vscode-icons-file-type-js",js:"i-vscode-icons-file-type-js",jsx:"i-vscode-icons-file-type-js",md:"i-vscode-icons-file-type-markdown",py:"i-vscode-icons-file-type-python",cs:"i-vscode-icons-file-type-csharp",asm:"i-vscode-icons-file-type-assembly",f:"i-vscode-icons-file-type-fortran",hs:"i-vscode-icons-file-type-haskell",fs:"i-vscode-icons-file-type-fsharp",kt:"i-vscode-icons-file-type-kotlin",rs:"i-vscode-icons-file-type-rust",rb:"i-vscode-icons-file-type-ruby",lsp:"i-vscode-icons-file-type-lisp",ps1:"i-vscode-icons-file-type-powershell",psd1:"i-vscode-icons-file-type-powershell",psm1:"i-vscode-icons-file-type-powershell",go:"i-vscode-icons-file-type-go",gleam:"i-vscode-icons-file-type-gleam",bicep:"i-vscode-icons-file-type-bicep",bicepparam:"i-vscode-icons-file-type-bicep",exs:"i-vscode-icons-file-type-elixir",erl:"i-vscode-icons-file-type-erlang",sbt:"i-vscode-icons-file-type-scala",h:"i-vscode-icons-file-type-cppheader",ino:"i-vscode-icons-file-type-arduino",pl:"i-vscode-icons-file-type-perl",jl:"i-vscode-icons-file-type-julia",dart:"i-vscode-icons-file-type-dartlang",ico:"i-vscode-icons-file-type-favicon",npm:"i-vscode-icons-file-type-npm",pnpm:"i-vscode-icons-file-type-pnpm",npx:"i-vscode-icons-file-type-npm",yarn:"i-vscode-icons-file-type-yarn",bun:"i-vscode-icons-file-type-bun",deno:"i-vscode-icons-file-type-deno",yml:"i-vscode-icons-file-type-yaml",terminal:"i-lucide-terminal"},g={__name:"ProseCodeIcon",props:{icon:{type:null,required:!1},filename:{type:String,required:!1}},setup(l){const e=l,p=f(),o=t(()=>a(p.ui?.prose?.codeIcon||{},u)),c=t(()=>{if(e.icon)return e.icon;if(!e.filename)return;const i=e.filename.replace(/\s*\(.*\)\s*$/,""),s=i.includes(".")&&i.split(".").pop(),n=i.split("/").pop();return(n&&o.value[n.toLowerCase()])??(s&&(o.value[s]??`i-vscode-icons-file-type-${s}`))});return(i,s)=>c.value?(r(),d(y,{key:0,name:c.value},null,8,["name"])):v("",!0)}};export{g as default}; diff --git a/docus/dist/_nuxt/C0AA5UMg.js b/docus/dist/_nuxt/C0AA5UMg.js new file mode 100644 index 0000000..ddac23b --- /dev/null +++ b/docus/dist/_nuxt/C0AA5UMg.js @@ -0,0 +1 @@ +import{Q as L,a0 as $,a1 as A,o as n,a as f,p as d,af as v,ac as l,s as e,e as g,F as q,r as D,B as p,a7 as E,m as y,a8 as F,aa as S,q as _,ab as x,f as h,ah as V,ag as j,P as B,c as C,am as k,d as I,b0 as U,aU as z,b1 as H,b3 as O,bY as T,bZ as w}from"./B3fabVUf.js";import{_ as M}from"./Dq00p3Sb.js";import{_ as Q}from"./DXQrCARz.js";const Y={slots:{root:"",list:"",item:"relative",link:"group text-sm flex items-center gap-1.5 py-1 focus-visible:outline-primary",linkLeading:"rounded-md p-1 inline-flex ring-inset ring",linkLeadingIcon:"size-4 shrink-0",linkLabel:"truncate",linkLabelExternalIcon:"size-3 absolute top-0 text-dimmed"},variants:{active:{true:{link:"text-primary font-semibold",linkLeading:"bg-primary ring-primary text-inverted"},false:{link:["text-muted hover:text-default font-medium","transition-colors"],linkLeading:["bg-elevated/50 ring-accented text-dimmed group-hover:bg-primary group-hover:ring-primary group-hover:text-inverted","transition"]}}}},Z={__name:"UPageAnchors",props:{as:{type:null,required:!1,default:"nav"},links:{type:Array,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(r){const c=r,o=L(),m=$(),t=A("pageAnchors",c),a=C(()=>k({extend:k(Y),...m.ui?.pageAnchors||{}})());return(i,b)=>(n(),f(e(B),{as:r.as,"data-slot":"root",class:l(a.value.root({class:[e(t)?.root,c.class]}))},{default:d(()=>[v("ul",{"data-slot":"list",class:l(a.value.list({class:e(t)?.list}))},[(n(!0),g(q,null,D(r.links,(s,P)=>(n(),g("li",{key:P,"data-slot":"item",class:l(a.value.item({class:[e(t)?.item,s.ui?.item]}))},[p(E,y({ref_for:!0},e(F)(s),{custom:""}),{default:d(({active:u,...N})=>[p(S,y({ref_for:!0},N,{"data-slot":"link",class:a.value.link({class:[e(t)?.link,s.ui?.link,s.class],active:u})}),{default:d(()=>[_(i.$slots,"link",{link:s,active:u,ui:a.value},()=>[s.icon||o["link-leading"]?(n(),g("div",{key:0,"data-slot":"linkLeading",class:l(a.value.linkLeading({class:[e(t)?.linkLeading,s.ui?.linkLeading],active:u}))},[_(i.$slots,"link-leading",{link:s,active:u,ui:a.value},()=>[s.icon?(n(),f(x,{key:0,name:s.icon,"data-slot":"linkLeadingIcon",class:l(a.value.linkLeadingIcon({class:[e(t)?.linkLeadingIcon,s.ui?.linkLeadingIcon],active:u}))},null,8,["name","class"])):h("",!0)])],2)):h("",!0),s.label||o["link-label"]?(n(),g("span",{key:1,"data-slot":"linkLabel",class:l(a.value.linkLabel({class:[e(t)?.linkLabel,s.ui?.linkLabel],active:u}))},[_(i.$slots,"link-label",{link:s,active:u},()=>[V(j(s.label),1)]),s.target==="_blank"?(n(),f(x,{key:0,name:e(m).ui.icons.external,"data-slot":"linkLabelExternalIcon",class:l(a.value.linkLabelExternalIcon({class:[e(t)?.linkLabelExternalIcon,s.ui?.linkLabelExternalIcon],active:u}))},null,8,["name","class"])):h("",!0)],2)):h("",!0),_(i.$slots,"link-trailing",{link:s,active:u})])]),_:2},1040,["class"])]),_:2},1040)],2))),128))],2)]),_:3},8,["as","class"]))}},G={key:0,class:"mb-2"},J={key:1},K=I({__name:"DocsAsideLeftTop",setup(r){const{subNavigationMode:c,sections:o}=U();return(m,t)=>{const a=Z,i=z;return e(c)==="aside"?(n(),g("div",G,[p(a,{links:e(o)},null,8,["links"]),p(i,{type:"dashed",class:"my-4"})])):(n(),g("div",J))}}}),R=Object.assign(K,{__name:"DocsAsideLeftTop"}),W=I({__name:"DocsAsideLeftBody",setup(r){const{sidebarNavigation:c}=U(),o=H("contentNavigation");return(m,t)=>{const a=O;return n(),f(a,{highlight:e(o).highlight??!0,"highlight-color":e(o).highlightColor,variant:e(o).variant??"link",color:e(o).color,navigation:e(c)},null,8,["highlight","highlight-color","variant","color","navigation"])}}}),X=Object.assign(W,{__name:"DocsAsideLeftBody"}),ee={slots:{root:"hidden overflow-y-auto lg:block lg:max-h-[calc(100vh-var(--ui-header-height))] lg:sticky lg:top-(--ui-header-height) py-8 lg:ps-4 lg:-ms-4 lg:pe-6.5",container:"relative",top:"sticky -top-8 -mt-8 pointer-events-none z-[1]",topHeader:"h-8 bg-default -mx-4 px-4",topBody:"bg-default relative pointer-events-auto flex flex-col -mx-4 px-4",topFooter:"h-8 bg-gradient-to-b from-default -mx-4 px-4"}},ae={__name:"UPageAside",props:{as:{type:null,required:!1,default:"aside"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(r){const c=r,o=L(),m=$(),t=A("pageAside",c),a=C(()=>k({extend:k(ee),...m.ui?.pageAside||{}})());return(i,b)=>(n(),f(e(B),{as:r.as,"data-slot":"root",class:l(a.value.root({class:[e(t)?.root,c.class]}))},{default:d(()=>[v("div",{"data-slot":"container",class:l(a.value.container({class:e(t)?.container}))},[o.top?(n(),g("div",{key:0,"data-slot":"top",class:l(a.value.top({class:e(t)?.top}))},[v("div",{"data-slot":"topHeader",class:l(a.value.topHeader({class:e(t)?.topHeader}))},null,2),v("div",{"data-slot":"topBody",class:l(a.value.topBody({class:e(t)?.topBody}))},[_(i.$slots,"top")],2),v("div",{"data-slot":"topFooter",class:l(a.value.topFooter({class:e(t)?.topFooter}))},null,2)],2)):h("",!0),_(i.$slots,"default"),_(i.$slots,"bottom")],2)]),_:3},8,["as","class"]))}},te={};function se(r,c){const o=R,m=X,t=ae,a=M,i=w,b=Q;return n(),f(b,null,{default:d(()=>[p(i,null,{default:d(()=>[p(a,null,{left:d(()=>[p(t,null,{default:d(()=>[p(o),p(m)]),_:1})]),default:d(()=>[_(r.$slots,"default")]),_:3})]),_:3})]),_:3})}const ie=T(te,[["render",se]]);export{ie as default}; diff --git a/docus/dist/_nuxt/C1fSKR9D.js b/docus/dist/_nuxt/C1fSKR9D.js new file mode 100644 index 0000000..7c39e6a --- /dev/null +++ b/docus/dist/_nuxt/C1fSKR9D.js @@ -0,0 +1 @@ +const e={or:"või",error:{title:"Lehekülge ei leitud",description:"Vabandame, kuid otsitavat lehekülge ei leitud."}},a={copy:{page:"Kopeeri lehekülg",link:"Kopeeri Markdown lehekülg",view:"Vaata Markdownina",gpt:"Ava ChatGPT-s",claude:"Ava Claude'is"},links:"Kogukond",toc:"Sellel lehel",menu:"Menüü",report:"Teata probleemist",edit:"Muuda seda lehekülge"},i={copyLogo:"Kopeeri logo",copyWordmark:"Kopeeri sõnamärk",downloadLogo:"Laadi logo alla",downloadWordmark:"Laadi sõnamärk alla",brandAssets:"Brändimaterjalid",logoCopied:"Logo kopeeritud",wordmarkCopied:"Sõnamärk kopeeritud",logoDownloaded:"Logo allalaaditud",wordmarkDownloaded:"Sõnamärk allalaaditud",copyLogoFailed:"Logo kopeerimine ebaõnnestus",copyWordmarkFailed:"Sõnamärgi kopeerimine ebaõnnestus"},o={title:"Küsi tehisintellekti",placeholder:"Esita küsimus...",tooltip:"Esita tehisintellektile küsimus",tryAsking:"Proovi esitada küsimus",askAnything:"Küsi ükskõik mida...",clearChat:"Tühjenda vestlus",close:"Sulge",expand:"Laienda",collapse:"Ahenda",thinking:"Mõtlen...",askMeAnything:"Küsi ükskõik mida",askMeAnythingDescription:"Saa abi dokumentatsioonis navigeerimisel, kontseptsioonide mõistmisel ja vastuste leidmisel.",faq:"KKK",chatCleared:"Vestlus kustutatakse värskendamisel",lineBreak:"Reavahetus",explainWithAi:"Selgita tehisintellektiga",toolListPages:"Loetletud dokumentatsiooni lehed",toolReadPage:"Loe",loading:{searching:"Dokumentatsiooni otsimine",reading:"Dokumentide lugemine",analyzing:"Sisu analüüsimine",finding:"Parima vastuse leidmine",finished:"Kasutatud allikad"}},t={common:e,docs:a,logo:i,assistant:o};export{o as assistant,e as common,t as default,a as docs,i as logo}; diff --git a/docus/dist/_nuxt/C2GbCjp9.js b/docus/dist/_nuxt/C2GbCjp9.js new file mode 100644 index 0000000..0ec5751 --- /dev/null +++ b/docus/dist/_nuxt/C2GbCjp9.js @@ -0,0 +1 @@ +const o={or:"یان",error:{title:"لاپەڕە نەدۆزرایەوە",description:"ببورن بەڵام ئەم پەیجە نەدۆزرایەوە."}},a={copy:{page:"کۆپیکردنی پەڕە",link:"کۆپیکردنی پەڕەی Markdown",view:"بینین وەک Markdown",gpt:"کردنەوە لە ChatGPT",claude:"کردنەوە لە Claude"},links:"کۆمەڵگا",toc:"لەم پەڕەدا",menu:"مینیو",report:"ڕاپۆرتکردنی کێشە",edit:"دەستکاریکردنی ئەم پەڕەیە"},e={copyLogo:"کۆپیکردنی لۆگۆ",copyWordmark:"کۆپیکردنی وشەنیشان",downloadLogo:"داگرتنی لۆگۆ",downloadWordmark:"داگرتنی وشەنیشان",brandAssets:"سامانەکانی براند",logoCopied:"لۆگۆ کۆپی کرا",wordmarkCopied:"وشەنیشان کۆپی کرا",logoDownloaded:"لۆگۆ دابەزێنرا",wordmarkDownloaded:"وشەنیشان دابەزێنرا",copyLogoFailed:"کۆپیکردنی لۆگۆ سەرکەوتوو نەبوو",copyWordmarkFailed:"کۆپیکردنی وشەنیشان سەرکەوتوو نەبوو"},n={title:"پرسیار لە AI بکە",placeholder:"پرسیارێک بکە...",tooltip:"پرسیارێک لە AI بکە",tryAsking:"هەوڵبدە پرسیارێک بکەیت",askAnything:"هەر شتێک بپرسە...",clearChat:"چاتی پاک بکەرەوە",close:"دابخە",expand:"فراوانتر بکە",collapse:"داڕمان",thinking:"بیرکردنەوە...",askMeAnything:"هەر شتێک بپرسە",askMeAnythingDescription:"یارمەتی وەربگرە لە گەشتکردن بە بەڵگەنامەکان، تێگەیشتن لە چەمکەکان و دۆزینەوەی وەڵامەکان.",faq:"پرسیارە بەردەوامەکان",chatCleared:"چات لە کاتی نوێکردنەوەدا پاک دەکرێتەوە",lineBreak:"هێڵ شکاندن",explainWithAi:"بە AI ڕوونی بکەرەوە",toolListPages:"لاپەڕەکانی بەڵگەنامەی ڕیزبەندی",toolReadPage:"خوێندنەوە",loading:{searching:"گەڕان بەدوای بەڵگەنامەکاندا",reading:"خوێندنەوە لە ڕێگەی دۆکیۆمێنتەکانەوە",analyzing:"شیکردنەوەی ناوەڕۆک",finding:"دۆزینەوەی باشترین وەڵام",finished:"سەرچاوە بەکارهێنراوەکان"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/C3Ly8WAT.js b/docus/dist/_nuxt/C3Ly8WAT.js new file mode 100644 index 0000000..44a173f --- /dev/null +++ b/docus/dist/_nuxt/C3Ly8WAT.js @@ -0,0 +1 @@ +import{r}from"./Cf5i2Hk_.js";import a from"./Jc8Ntx_l.js";import{a0 as t,a as e,p,s as c,o as n}from"./B3fabVUf.js";import"./BN_7HF1G.js";const d={__name:"ProseTip",setup(i){const o=t();return(s,f)=>(n(),e(a,{color:"success",icon:c(o).ui.icons.tip},{default:p(()=>[r(s.$slots,"default",{mdcUnwrap:"p"})]),_:3},8,["icon"]))}};export{d as default}; diff --git a/docus/dist/_nuxt/C5B99YjC.js b/docus/dist/_nuxt/C5B99YjC.js new file mode 100644 index 0000000..a77d066 --- /dev/null +++ b/docus/dist/_nuxt/C5B99YjC.js @@ -0,0 +1 @@ +import{i}from"./B3fabVUf.js";function r(e,s,o){const t=e.findIndex(n=>i(n,s)),d=e.findIndex(n=>i(n,o));if(t===-1||d===-1)return[];const[x,f]=[t,d].sort((n,I)=>n-I);return e.slice(x,f+1)}export{r as f}; diff --git a/docus/dist/_nuxt/C6Z5zZ8h.js b/docus/dist/_nuxt/C6Z5zZ8h.js new file mode 100644 index 0000000..a84d1aa --- /dev/null +++ b/docus/dist/_nuxt/C6Z5zZ8h.js @@ -0,0 +1 @@ +import{a0 as c,a1 as p,e as l,q as u,ac as d,s as i,c as m,am as e,o as f}from"./B3fabVUf.js";const b={base:""},C={__name:"ProseTbody",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=a,o=c(),t=p("prose.tbody",s),r=m(()=>e({extend:e(b),...o.ui?.prose?.tbody||{}}));return(n,y)=>(f(),l("tbody",{class:d(r.value({class:[i(t)?.base,s.class]}))},[u(n.$slots,"default")],2))}};export{C as default}; diff --git a/docus/dist/_nuxt/C8-8Pk2V.js b/docus/dist/_nuxt/C8-8Pk2V.js new file mode 100644 index 0000000..a50e3a7 --- /dev/null +++ b/docus/dist/_nuxt/C8-8Pk2V.js @@ -0,0 +1 @@ +const a={or:"ali",error:{title:"Stran ni bila najdena",description:"Opravičujemo se, vendar stran, ki jo iščete, ni bila najdena."}},o={copy:{page:"Kopiraj stran",link:"Kopiraj Markdown stran",view:"Prikaži kot Markdown",gpt:"Odpri v ChatGPT",claude:"Odpri v Claude"},links:"Skupnost",toc:"Na tej strani",menu:"Meni",report:"Prijavi težavo",edit:"Uredi to stran"},e={copyLogo:"Kopiraj logotip",copyWordmark:"Kopiraj besedno znamko",downloadLogo:"Prenesi logotip",downloadWordmark:"Prenesi besedno znamko",brandAssets:"Materiali blagovne znamke",logoCopied:"Logotip kopiran",wordmarkCopied:"Besedna znamka kopirana",logoDownloaded:"Logotip prenesen",wordmarkDownloaded:"Besedna znamka prenesena",copyLogoFailed:"Kopiranje logotipa ni uspelo",copyWordmarkFailed:"Kopiranje besedne znamke ni uspelo"},i={title:"Vprašajte AI",placeholder:"Postavite vprašanje...",tooltip:"Zastavite vprašanje AI",tryAsking:"Poskusite postaviti vprašanje",askAnything:"Vprašajte karkoli...",clearChat:"Počisti klepet",close:"Zapri",expand:"Razširi",collapse:"Strni",thinking:"Razmišljanje...",askMeAnything:"Vprašaj karkoli",askMeAnythingDescription:"Poiščite pomoč pri krmarjenju po dokumentaciji, razumevanju konceptov in iskanju odgovorov.",faq:"Pogosta vprašanja",chatCleared:"Klepet se ob osvežitvi izbriše",lineBreak:"Prelom vrstice",explainWithAi:"Razloži z AI",toolListPages:"Navedene strani dokumentacije",toolReadPage:"Preberi",loading:{searching:"Iskanje po dokumentaciji",reading:"Prebiranje dokumentov",analyzing:"Analiza vsebine",finding:"Iskanje najboljšega odgovora",finished:"Uporabljeni viri"}},n={common:a,docs:o,logo:e,assistant:i};export{i as assistant,a as common,n as default,o as docs,e as logo}; diff --git a/docus/dist/_nuxt/C8-Mg-oX.js b/docus/dist/_nuxt/C8-Mg-oX.js new file mode 100644 index 0000000..a693d1f --- /dev/null +++ b/docus/dist/_nuxt/C8-Mg-oX.js @@ -0,0 +1 @@ +import{Q as x,a0 as b,a1 as $,o as a,a as y,p as g,q as n,B as q,bZ as w,ac as o,s,e as d,ah as f,ag as h,f as c,F as C,r as S,ak as B,m as P,P as z,c as j,am as m}from"./B3fabVUf.js";const H={slots:{root:"relative isolate",container:"flex flex-col lg:grid py-24 sm:py-32 lg:py-40 gap-16 sm:gap-y-24",wrapper:"",header:"",headline:"mb-4",title:"text-5xl sm:text-7xl text-pretty tracking-tight font-bold text-highlighted",description:"text-lg sm:text-xl/8 text-muted",body:"mt-10",footer:"mt-10",links:"flex flex-wrap gap-x-6 gap-y-3"},variants:{orientation:{horizontal:{container:"lg:grid-cols-2 lg:items-center",description:"text-pretty"},vertical:{container:"",headline:"justify-center",wrapper:"text-center",description:"text-balance",links:"justify-center"}},reverse:{true:{wrapper:"order-last"}},headline:{true:{headline:"font-semibold text-primary flex items-center gap-1.5"}},title:{true:{description:"mt-6"}}}},N={key:2,class:"hidden lg:block"},F={__name:"UPageHero",props:{as:{type:null,required:!1},headline:{type:String,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},links:{type:Array,required:!1},orientation:{type:null,required:!1,default:"vertical"},reverse:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const u=t,e=x(),p=b(),l=$("pageHero",u),i=j(()=>m({extend:m(H),...p.ui?.pageHero||{}})({orientation:u.orientation,reverse:u.reverse,title:!!u.title||!!e.title}));return(r,V)=>(a(),y(s(z),{as:t.as,"data-orientation":t.orientation,"data-slot":"root",class:o(i.value.root({class:[s(l)?.root,u.class]}))},{default:g(()=>[n(r.$slots,"top"),q(w,{"data-slot":"container",class:o(i.value.container({class:s(l)?.container}))},{default:g(()=>[e.header||t.headline||e.headline||t.title||e.title||t.description||e.description||e.body||e.footer||t.links?.length||e.links?(a(),d("div",{key:0,"data-slot":"wrapper",class:o(i.value.wrapper({class:s(l)?.wrapper}))},[e.header||t.headline||e.headline||t.title||e.title||t.description||e.description?(a(),d("div",{key:0,"data-slot":"header",class:o(i.value.header({class:s(l)?.header}))},[n(r.$slots,"header",{},()=>[t.headline||e.headline?(a(),d("div",{key:0,"data-slot":"headline",class:o(i.value.headline({class:s(l)?.headline,headline:!e.headline}))},[n(r.$slots,"headline",{},()=>[f(h(t.headline),1)])],2)):c("",!0),t.title||e.title?(a(),d("h1",{key:1,"data-slot":"title",class:o(i.value.title({class:s(l)?.title}))},[n(r.$slots,"title",{},()=>[f(h(t.title),1)])],2)):c("",!0),t.description||e.description?(a(),d("div",{key:2,"data-slot":"description",class:o(i.value.description({class:s(l)?.description}))},[n(r.$slots,"description",{},()=>[f(h(t.description),1)])],2)):c("",!0)])],2)):c("",!0),e.body?(a(),d("div",{key:1,"data-slot":"body",class:o(i.value.body({class:s(l)?.body}))},[n(r.$slots,"body")],2)):c("",!0),e.footer||t.links?.length||e.links?(a(),d("div",{key:2,"data-slot":"footer",class:o(i.value.footer({class:s(l)?.footer}))},[n(r.$slots,"footer",{},()=>[t.links?.length||e.links?(a(),d("div",{key:0,"data-slot":"links",class:o(i.value.links({class:s(l)?.links}))},[n(r.$slots,"links",{},()=>[(a(!0),d(C,null,S(t.links,(k,v)=>(a(),y(B,P({key:v,size:"xl"},{ref_for:!0},k),null,16))),128))])],2)):c("",!0)])],2)):c("",!0)],2)):c("",!0),e.default?n(r.$slots,"default",{key:1}):t.orientation==="horizontal"?(a(),d("div",N)):c("",!0)]),_:3},8,["class"]),n(r.$slots,"bottom")]),_:3},8,["as","data-orientation","class"]))}};export{F as default}; diff --git a/docus/dist/_nuxt/C8791Vr7.js b/docus/dist/_nuxt/C8791Vr7.js new file mode 100644 index 0000000..572b1b8 --- /dev/null +++ b/docus/dist/_nuxt/C8791Vr7.js @@ -0,0 +1 @@ +import{a0 as c,a1 as n,e as p,ac as l,s as u,c as i,am as s,o as m}from"./B3fabVUf.js";const f={base:"border-t border-default my-12"},h={__name:"ProseHr",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,r=c(),o=n("prose.hr",e),t=i(()=>s({extend:s(f),...r.ui?.prose?.hr||{}}));return(d,_)=>(m(),p("hr",{class:l(t.value({class:[u(o)?.base,e.class]}))},null,2))}};export{h as default}; diff --git a/docus/dist/_nuxt/C919_JS_.js b/docus/dist/_nuxt/C919_JS_.js new file mode 100644 index 0000000..8dfb816 --- /dev/null +++ b/docus/dist/_nuxt/C919_JS_.js @@ -0,0 +1 @@ +const e={or:"sau",error:{title:"Pagina nu a fost găsită",description:"Ne pare rău, dar această pagină nu a putut fi găsită."}},a={copy:{page:"Copiază pagina",link:"Copiază pagina în Markdown",view:"Vezi ca Markdown",gpt:"Deschide în ChatGPT",claude:"Deschide în Claude"},links:"Comunitate",toc:"Pe această pagină",menu:"Meniu",report:"Raportează o problemă",edit:"Editează această pagină"},o={copyLogo:"Copiază logo",copyWordmark:"Copiază wordmark",downloadLogo:"Descarcă logo",downloadWordmark:"Descarcă wordmark",brandAssets:"Resurse de brand",logoCopied:"Logo copiat",wordmarkCopied:"Wordmark copiat",logoDownloaded:"Logo descărcat",wordmarkDownloaded:"Wordmark descărcat",copyLogoFailed:"Nu s-a putut copia logo-ul",copyWordmarkFailed:"Nu s-a putut copia wordmark-ul"},i={title:"Întrebați AI",placeholder:"Pune o întrebare...",tooltip:"Pune o întrebare AI",tryAsking:"Încercați să puneți o întrebare",askAnything:"Întreabă orice...",clearChat:"Ștergeți chatul",close:"Închide",expand:"Extindeți",collapse:"Colaps",thinking:"Gândind...",askMeAnything:"Întreabă orice",askMeAnythingDescription:"Obțineți ajutor pentru navigarea în documentație, înțelegerea conceptelor și găsirea răspunsurilor.",faq:"Întrebări frecvente",chatCleared:"Chatul este șters la reîmprospătare",lineBreak:"Rupere de linie",explainWithAi:"Explicați cu AI",toolListPages:"Pagini de documentație listate",toolReadPage:"Citiți",loading:{searching:"Căutarea documentației",reading:"Citind documentele",analyzing:"Analizând conținutul",finding:"Găsirea celui mai bun răspuns",finished:"Surse folosite"}},n={common:e,docs:a,logo:o,assistant:i};export{i as assistant,e as common,n as default,a as docs,o as logo}; diff --git a/docus/dist/_nuxt/CArNbJ6I.js b/docus/dist/_nuxt/CArNbJ6I.js new file mode 100644 index 0000000..59e5a25 --- /dev/null +++ b/docus/dist/_nuxt/CArNbJ6I.js @@ -0,0 +1 @@ +const a={or:"atau",error:{title:"Halaman tidak ditemukan",description:"Kami minta maaf, halaman ini tidak dapat ditemukan."},copied:"Berhasil disalin ke papan klip"},n={copy:{page:"Salin halaman",link:"Salin halaman Markdown",view:"Lihat sebagai Markdown",gpt:"Buka di ChatGPT",claude:"Buka di Claude",mcp_url:"Salin URL Server MCP",mcp_add:"Tambah Server MCP"},links:"Komunitas",toc:"Pada halaman ini",menu:"Menu",report:"Laporkan masalah",edit:"Ubah halaman ini"},i={copyLogo:"Salin logo",copyWordmark:"Salin wordmark",downloadLogo:"Unduh logo",downloadWordmark:"Unduh wordmark",brandAssets:"Aset merek",logoCopied:"Logo disalin",wordmarkCopied:"Wordmark disalin",logoDownloaded:"Logo diunduh",wordmarkDownloaded:"Wordmark diunduh",copyLogoFailed:"Gagal menyalin logo",copyWordmarkFailed:"Gagal menyalin wordmark"},o={title:"Tanya AI",placeholder:"Ajukan pertanyaan...",tooltip:"Ajukan pertanyaan kepada AI",tryAsking:"Coba ajukan pertanyaan",askAnything:"Tanyakan apa saja...",clearChat:"Hapus obrolan",close:"Tutup",expand:"Perluas",collapse:"Ciutkan",thinking:"Berpikir...",askMeAnything:"Tanyakan apa saja",askMeAnythingDescription:"Dapatkan bantuan untuk menavigasi dokumentasi, memahami konsep, dan menemukan jawaban.",faq:"Pertanyaan Umum",chatCleared:"Obrolan dihapus saat penyegaran",lineBreak:"Jeda baris",explainWithAi:"Jelaskan dengan AI",toolListPages:"Halaman dokumentasi yang terdaftar",toolReadPage:"Baca",loading:{searching:"Mencari dokumentasi",reading:"Membaca dokumen",analyzing:"Menganalisis konten",finding:"Menemukan jawaban terbaik",finished:"Sumber yang digunakan"}},e={common:a,docs:n,logo:i,assistant:o};export{o as assistant,a as common,e as default,n as docs,i as logo}; diff --git a/docus/dist/_nuxt/CB6Z2s81.js b/docus/dist/_nuxt/CB6Z2s81.js new file mode 100644 index 0000000..2ff11dc --- /dev/null +++ b/docus/dist/_nuxt/CB6Z2s81.js @@ -0,0 +1 @@ +import{a0 as n,a1 as i,e as l,q as p,ac as u,s as d,c as m,am as t,o as f,ah as b,ag as g}from"./B3fabVUf.js";const y={base:"pb-4 text-muted *:first:mt-0 *:last:mb-0 *:my-1.5"},C={__name:"ProseAccordionItem",props:{label:{type:String,required:!0},description:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,a=n(),o=i("prose.accordionItem",s),r=m(()=>t({extend:t(y),...a.ui?.prose?.accordionItem||{}}));return(c,q)=>(f(),l("div",{class:u(r.value({class:[d(o)?.base,s.class]}))},[p(c.$slots,"default",{},()=>[b(g(e.description),1)])],2))}};export{C as default}; diff --git a/docus/dist/_nuxt/CCiWmQwn.js b/docus/dist/_nuxt/CCiWmQwn.js new file mode 100644 index 0000000..722ece5 --- /dev/null +++ b/docus/dist/_nuxt/CCiWmQwn.js @@ -0,0 +1 @@ +import{r as k}from"./Cf5i2Hk_.js";import{Q as I,a0 as w,a1 as q,e as c,a as u,p as C,m as S,a7 as $,f as l,ac as n,s as t,ab as g,q as V,c as d,am as f,o,af as B,ah as h,ag as x}from"./B3fabVUf.js";import"./BN_7HF1G.js";const j={slots:{base:["group relative block my-5 p-4 sm:p-6 border border-default rounded-md bg-default","transition-colors"],icon:"size-6 mb-2 block",title:"text-highlighted font-semibold",description:"text-[15px] text-muted *:first:mt-0 *:last:mb-0 *:my-1",externalIcon:["size-4 align-top absolute right-2 top-2 text-dimmed pointer-events-none","transition-colors"]},variants:{color:{primary:{icon:"text-primary"},secondary:{icon:"text-secondary"},success:{icon:"text-success"},info:{icon:"text-info"},warning:{icon:"text-warning"},error:{icon:"text-error"},neutral:{icon:"text-highlighted"}},to:{true:""},title:{true:{description:"mt-1"}}},compoundVariants:[{color:"primary",to:!0,class:{base:"hover:bg-primary/10 hover:border-primary has-focus-visible:border-primary",externalIcon:"group-hover:text-primary"}},{color:"secondary",to:!0,class:{base:"hover:bg-secondary/10 hover:border-secondary has-focus-visible:border-secondary",externalIcon:"group-hover:text-secondary"}},{color:"success",to:!0,class:{base:"hover:bg-success/10 hover:border-success has-focus-visible:border-success",externalIcon:"group-hover:text-success"}},{color:"info",to:!0,class:{base:"hover:bg-info/10 hover:border-info has-focus-visible:border-info",externalIcon:"group-hover:text-info"}},{color:"warning",to:!0,class:{base:"hover:bg-warning/10 hover:border-warning has-focus-visible:border-warning",externalIcon:"group-hover:text-warning"}},{color:"error",to:!0,class:{base:"hover:bg-error/10 hover:border-error has-focus-visible:border-error",externalIcon:"group-hover:text-error"}},{color:"neutral",to:!0,class:{base:"hover:bg-elevated/50 hover:border-inverted has-focus-visible:border-inverted",externalIcon:"group-hover:text-highlighted"}}],defaultVariants:{color:"primary"}},P=Object.assign({inheritAttrs:!1},{__name:"ProseCard",props:{to:{type:null,required:!1},target:{type:[String,Object,null],required:!1},icon:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},color:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(r){const e=r,b=I(),p=w(),s=q("prose.card",e),a=d(()=>f({extend:f(j),...p.ui?.prose?.card||{}})({color:e.color,to:!!e.to,title:!!e.title})),m=d(()=>e.target||(e.to&&typeof e.to=="string"&&e.to.startsWith("http")?"_blank":void 0)),y=d(()=>(e.title||"Card link").trim());return(i,v)=>(o(),c("div",{class:n(a.value.base({class:[t(s)?.base,e.class]}))},[r.to?(o(),u($,S({key:0,"aria-label":y.value},{to:r.to,target:m.value,...i.$attrs},{class:"focus:outline-none",raw:""}),{default:C(()=>[...v[0]||(v[0]=[B("span",{class:"absolute inset-0","aria-hidden":"true"},null,-1)])]),_:1},16,["aria-label"])):l("",!0),r.icon?(o(),u(g,{key:1,name:r.icon,class:n(a.value.icon({class:t(s)?.icon}))},null,8,["name","class"])):l("",!0),r.to&&m.value==="_blank"?(o(),u(g,{key:2,name:t(p).ui.icons.external,class:n(a.value.externalIcon({class:t(s)?.externalIcon}))},null,8,["name","class"])):l("",!0),r.title||b.title?(o(),c("p",{key:3,class:n(a.value.title({class:t(s)?.title}))},[k(i.$slots,"title",{mdcUnwrap:"p"},()=>[h(x(r.title),1)])],2)):l("",!0),b.default?(o(),c("div",{key:4,class:n(a.value.description({class:t(s)?.description}))},[V(i.$slots,"default",{},()=>[h(x(r.description),1)])],2)):l("",!0)],2))}});export{P as default}; diff --git a/docus/dist/_nuxt/CDym3zc6.js b/docus/dist/_nuxt/CDym3zc6.js new file mode 100644 index 0000000..6801dda --- /dev/null +++ b/docus/dist/_nuxt/CDym3zc6.js @@ -0,0 +1 @@ +import{a0 as c,a1 as n,o as l,a as u,p as d,q as p,ac as f,s as m,a7 as b,c as h,am as s}from"./B3fabVUf.js";const y={base:["text-primary border-b border-transparent hover:border-primary font-medium focus-visible:outline-primary focus-visible:has-[>code]:outline-0 [&>code]:border-dashed hover:[&>code]:border-primary hover:[&>code]:text-primary focus-visible:[&>code]:border-primary focus-visible:[&>code]:text-primary","transition-colors [&>code]:transition-colors"]},x={__name:"ProseA",props:{href:{type:String,required:!1},target:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const r=e,a=c(),o=n("prose.a",r),t=h(()=>s({extend:s(y),...a.ui?.prose?.a||{}}));return(i,v)=>(l(),u(b,{href:e.href,target:e.target,class:f(t.value({class:[m(o)?.base,r.class]})),raw:""},{default:d(()=>[p(i.$slots,"default")]),_:3},8,["href","target","class"]))}};export{x as default}; diff --git a/docus/dist/_nuxt/CFKlwMFM.js b/docus/dist/_nuxt/CFKlwMFM.js new file mode 100644 index 0000000..032b6cf --- /dev/null +++ b/docus/dist/_nuxt/CFKlwMFM.js @@ -0,0 +1 @@ +import{Q as B,a0 as q,a1 as v,a2 as $,a3 as P,o as d,a as f,p as n,s as e,aZ as T,q as m,f as O,B as x,a_ as S,ac as l,m as k,a$ as w,c as C,am as p,$ as I,ay as L,af as _,ab as N,ag as y}from"./B3fabVUf.js";const U={slots:{root:"",content:"data-[state=open]:animate-[collapsible-down_200ms_ease-out] data-[state=closed]:animate-[collapsible-up_200ms_ease-out] overflow-hidden"}},V={__name:"UCollapsible",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(r,{emit:s}){const a=r,i=s,t=B(),o=q(),c=v("collapsible",a),g=$(P(a,"as","defaultOpen","open","disabled","unmountOnHide"),i),u=C(()=>p({extend:p(U),...o.ui?.collapsible||{}})());return(b,z)=>(d(),f(e(w),k(e(g),{"data-slot":"root",class:u.value.root({class:[e(c)?.root,a.class]})}),{default:n(({open:h})=>[t.default?(d(),f(e(T),{key:0,"as-child":""},{default:n(()=>[m(b.$slots,"default",{open:h})]),_:2},1024)):O("",!0),x(e(S),{"data-slot":"content",class:l(u.value.content({class:e(c)?.content}))},{default:n(()=>[m(b.$slots,"content")]),_:3},8,["class"])]),_:3},16,["class"]))}},j={slots:{root:"my-5",trigger:["group relative rounded-xs inline-flex items-center gap-1.5 text-muted hover:text-default text-sm focus-visible:ring-2 focus-visible:ring-primary focus:outline-none","transition-colors"],triggerIcon:"size-4 shrink-0 group-data-[state=open]:rotate-180 transition-transform duration-200",triggerLabel:"truncate",content:"*:first:mt-2.5 *:last:mb-0 *:my-1.5"}},H={__name:"ProseCollapsible",props:{icon:{type:null,required:!1},name:{type:String,required:!1},openText:{type:String,required:!1},closeText:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(r){const s=r,{t:a}=I(),i=q(),t=v("prose.collapsible",s),o=C(()=>p({extend:p(j),...i.ui?.prose?.collapsible||{}})());return(c,g)=>(d(),f(V,{"unmount-on-hide":!1,class:l(s.class),ui:e(L)(o.value,e(t))},{default:n(({open:u})=>[_("button",{class:l(o.value.trigger({class:e(t)?.trigger}))},[x(N,{name:r.icon||e(i).ui.icons.chevronDown,class:l(o.value.triggerIcon({class:e(t)?.triggerIcon}))},null,8,["name","class"]),_("span",{class:l(o.value.triggerLabel({class:e(t)?.triggerLabel}))},y(u?s.closeText||e(a)("prose.collapsible.closeText"):s.openText||e(a)("prose.collapsible.openText"))+" "+y(s.name||e(a)("prose.collapsible.name")),3)],2)]),content:n(()=>[m(c.$slots,"default")]),_:3},8,["class","ui"]))}};export{H as default}; diff --git a/docus/dist/_nuxt/CFOqH6J8.js b/docus/dist/_nuxt/CFOqH6J8.js new file mode 100644 index 0000000..7ec7ba4 --- /dev/null +++ b/docus/dist/_nuxt/CFOqH6J8.js @@ -0,0 +1 @@ +import{a0 as l,a1 as n,e as u,q as p,ac as i,s as m,c as d,am as s,o as f}from"./B3fabVUf.js";const _={base:"list-disc ps-6 my-5 marker:text-(--ui-border-accented)"},k={__name:"ProseUl",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,t=l(),o=n("prose.ul",e),r=d(()=>s({extend:s(_),...t.ui?.prose?.ul||{}}));return(c,b)=>(f(),u("ul",{class:i(r.value({class:[m(o)?.base,e.class]}))},[p(c.$slots,"default")],2))}};export{k as default}; diff --git a/docus/dist/_nuxt/CG1YvYVw.js b/docus/dist/_nuxt/CG1YvYVw.js new file mode 100644 index 0000000..555dfd1 --- /dev/null +++ b/docus/dist/_nuxt/CG1YvYVw.js @@ -0,0 +1 @@ +import{r as a}from"./Cf5i2Hk_.js";import n from"./Jc8Ntx_l.js";import{a0 as s,a as t,p as e,s as i,o as p}from"./B3fabVUf.js";import"./BN_7HF1G.js";const d={__name:"ProseWarning",setup(c){const o=s();return(r,f)=>(p(),t(n,{color:"warning",icon:i(o).ui.icons.warning},{default:e(()=>[a(r.$slots,"default",{mdcUnwrap:"p"})]),_:3},8,["icon"]))}};export{d as default}; diff --git a/docus/dist/_nuxt/CGXzuCYy.js b/docus/dist/_nuxt/CGXzuCYy.js new file mode 100644 index 0000000..5b1176b --- /dev/null +++ b/docus/dist/_nuxt/CGXzuCYy.js @@ -0,0 +1 @@ +import{a0 as c,a1 as n,e as p,q as u,ac as m,s as i,c as d,am as s,o as f}from"./B3fabVUf.js";const _={base:"list-decimal ps-6 my-5 marker:text-muted"},k={__name:"ProseOl",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,o=c(),t=n("prose.ol",e),l=d(()=>s({extend:s(_),...o.ui?.prose?.ol||{}}));return(r,C)=>(f(),p("ol",{class:m(l.value({class:[i(t)?.base,e.class]}))},[u(r.$slots,"default")],2))}};export{k as default}; diff --git a/docus/dist/_nuxt/CI43exTt.js b/docus/dist/_nuxt/CI43exTt.js new file mode 100644 index 0000000..b00b025 --- /dev/null +++ b/docus/dist/_nuxt/CI43exTt.js @@ -0,0 +1 @@ +const o={or:"або",error:{title:"Старонка не знойдзена",description:"Прабачце, але старонка, якую вы шукаеце, не знойдзена."}},a={copy:{page:"Скапіраваць старонку",link:"Скапіраваць Markdown-старонку",view:"Праглядзець як Markdown",gpt:"Адкрыць у ChatGPT",claude:"Адкрыць у Claude"},links:"Супольнасць",toc:"На гэтай старонцы",menu:"Меню",report:"Паведаміць пра праблему",edit:"Рэдагаваць гэтую старонку"},e={copyLogo:"Капіяваць лагатып",copyWordmark:"Капіяваць словесны знак",downloadLogo:"Спампаваць лагатып",downloadWordmark:"Спампаваць словесны знак",brandAssets:"Матэрыялы брэнда",logoCopied:"Лагатып скапіяваны",wordmarkCopied:"Словесны знак скапіяваны",logoDownloaded:"Лагатып спампаваны",wordmarkDownloaded:"Словесны знак спампаваны",copyLogoFailed:"Не ўдалося скапіяваць лагатып",copyWordmarkFailed:"Не ўдалося скапіяваць словесны знак"},n={title:"Спытаць ІІ",placeholder:"Задаць пытанне...",tooltip:"Задаць пытанне ІІ",tryAsking:"Паспрабуйце задаць пытанне",askAnything:"Спытай што заўгодна...",clearChat:"Ачысціць чат",close:"Закрыць",expand:"Пашырыць",collapse:"Згарнуць",thinking:"Мысленне...",askMeAnything:"Спытаць што-небудзь",askMeAnythingDescription:"Атрымаць дапамогу ў навігацыі па дакументацыі, разуменні канцэпцый і пошуку адказаў.",faq:"Пытанні і адказы",chatCleared:"Чат ачышчаецца пры абнаўленні",lineBreak:"Перапынак у радку",explainWithAi:"Растлумачыць ІІ",toolListPages:"Старонкі дакументацыі",toolReadPage:"Чытаць",loading:{searching:"Пошук дакументацыі",reading:"Чытанне праз дакументы",analyzing:"Аналіз зместу",finding:"Пошук найлепшага адказу",finished:"Выкарыстаныя крыніцы"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/CSimry40.js b/docus/dist/_nuxt/CSimry40.js new file mode 100644 index 0000000..8ec4314 --- /dev/null +++ b/docus/dist/_nuxt/CSimry40.js @@ -0,0 +1 @@ +import{a0 as l,a1 as n,e as u,q as p,ac as i,s as d,c as m,am as s,o as f}from"./B3fabVUf.js";const b={base:"border-s-4 border-accented ps-4 italic"},_={__name:"ProseBlockquote",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(o){const e=o,a=l(),t=n("prose.blockquote",e),c=m(()=>s({extend:s(b),...a.ui?.prose?.blockquote||{}}));return(r,q)=>(f(),u("blockquote",{class:i(c.value({class:[d(t)?.base,e.class]}))},[p(r.$slots,"default")],2))}};export{_ as default}; diff --git a/docus/dist/_nuxt/CSnfmutH.js b/docus/dist/_nuxt/CSnfmutH.js new file mode 100644 index 0000000..9339a72 --- /dev/null +++ b/docus/dist/_nuxt/CSnfmutH.js @@ -0,0 +1 @@ +import{a0 as c,a1 as p,e as l,q as u,ac as d,s as i,c as m,am as s,o as f}from"./B3fabVUf.js";const h={base:"bg-muted"},C={__name:"ProseThead",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,t=c(),o=p("prose.thead",e),r=m(()=>s({extend:s(h),...t.ui?.prose?.thead||{}}));return(n,_)=>(f(),l("thead",{class:d(r.value({class:[i(o)?.base,e.class]}))},[u(n.$slots,"default")],2))}};export{C as default}; diff --git a/docus/dist/_nuxt/CTU5hS66.js b/docus/dist/_nuxt/CTU5hS66.js new file mode 100644 index 0000000..e437935 --- /dev/null +++ b/docus/dist/_nuxt/CTU5hS66.js @@ -0,0 +1 @@ +import{a0 as t,a1 as r,a as u,ac as i,s as l,ab as p,c as m,am as a,o as f}from"./B3fabVUf.js";const d={base:"size-4 shrink-0 align-sub"},C={__name:"ProseIcon",props:{name:{type:String,required:!0},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const e=s,n=t(),o=r("prose.icon",e),c=m(()=>a({extend:a(d),...n.ui?.prose?.icon||{}}));return(_,b)=>(f(),u(p,{name:s.name,class:i(c.value({class:[l(o)?.base,e.class]}))},null,8,["name","class"]))}};export{C as default}; diff --git a/docus/dist/_nuxt/CamoC0EK.js b/docus/dist/_nuxt/CamoC0EK.js new file mode 100644 index 0000000..7292462 --- /dev/null +++ b/docus/dist/_nuxt/CamoC0EK.js @@ -0,0 +1 @@ +import{a0 as c,a1 as d,e as i,q as l,ac as u,s as p,c as b,am as r,o as m}from"./B3fabVUf.js";const f={base:"px-1.5 py-0.5 text-sm font-mono font-medium rounded-md inline-block",variants:{color:{primary:"border border-primary/25 bg-primary/10 text-primary",secondary:"border border-secondary/25 bg-secondary/10 text-secondary",success:"border border-success/25 bg-success/10 text-success",info:"border border-info/25 bg-info/10 text-info",warning:"border border-warning/25 bg-warning/10 text-warning",error:"border border-error/25 bg-error/10 text-error",neutral:"border border-muted text-highlighted bg-muted"}},defaultVariants:{color:"neutral"}},x={__name:"ProseCode",props:{lang:{type:String,required:!1},color:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(o){const e=o,s=c(),t=d("prose.code",e),a=b(()=>r({extend:r(f),...s.ui?.prose?.code||{}}));return(n,g)=>(m(),i("code",{class:u(a.value({class:[p(t)?.base,(e.class||"").split(",").join(" ")],color:e.color}))},[l(n.$slots,"default")],2))}};export{x as default}; diff --git a/docus/dist/_nuxt/CdNQ_JKz.js b/docus/dist/_nuxt/CdNQ_JKz.js new file mode 100644 index 0000000..5c6ddef --- /dev/null +++ b/docus/dist/_nuxt/CdNQ_JKz.js @@ -0,0 +1 @@ +import{a0 as i,a1 as n,o as p,a as u,p as d,q as f,ac as g,s as e,P as m,c as C,am as t}from"./B3fabVUf.js";const q={base:"relative grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8"},_={__name:"UPageGrid",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const a=s,r=i(),l=n("pageGrid",a),o=C(()=>t({extend:t(q),...r.ui?.pageGrid||{}}));return(c,v)=>(p(),u(e(m),{as:s.as,class:g(o.value({class:[e(l)?.base,a.class]}))},{default:d(()=>[f(c.$slots,"default")]),_:3},8,["as","class"]))}};export{_ as default}; diff --git a/docus/dist/_nuxt/Cf5i2Hk_.js b/docus/dist/_nuxt/Cf5i2Hk_.js new file mode 100644 index 0000000..61ef53e --- /dev/null +++ b/docus/dist/_nuxt/Cf5i2Hk_.js @@ -0,0 +1 @@ +import{f as d}from"./BN_7HF1G.js";import{q as a}from"./B3fabVUf.js";const w=(f,r,t,...n)=>f[r]?a({...f,[r]:()=>d(f[r](),t?.unwrap||t?.mdcUnwrap)},r,t,...n):a(f,r,t,...n);export{w as r}; diff --git a/docus/dist/_nuxt/CfPbqwDO.js b/docus/dist/_nuxt/CfPbqwDO.js new file mode 100644 index 0000000..95f31c8 --- /dev/null +++ b/docus/dist/_nuxt/CfPbqwDO.js @@ -0,0 +1 @@ +import{d as S,bv as H,bw as K,J as j,o as d,a as f,p,q as b,s as a,P as z,Q as B,a0 as P,a1 as V,a2 as D,a3 as F,e as x,F as N,r as O,bx as U,ac as r,Z as q,B as C,by as E,ab as $,f as I,ah as k,ag as w,bz as R,af as T,m as J,bA as L,c as A,am as _,bt as M,ay as Q,v as W,W as Z}from"./B3fabVUf.js";var G=S({__name:"AccordionHeader",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h3"}},setup(i){const u=i,o=H(),y=K();return j(),(n,g)=>(d(),f(a(z),{as:u.as,"as-child":u.asChild,"data-orientation":a(o).orientation,"data-state":a(y).dataState.value,"data-disabled":a(y).dataDisabled.value},{default:p(()=>[b(n.$slots,"default")]),_:3},8,["as","as-child","data-orientation","data-state","data-disabled"]))}}),X=G;const Y={slots:{root:"w-full",item:"border-b border-default last:border-b-0",header:"flex",trigger:"group flex-1 flex items-center gap-1.5 font-medium text-sm py-3.5 focus-visible:outline-primary min-w-0",content:"data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out] overflow-hidden focus:outline-none",body:"text-sm pb-3.5",leadingIcon:"shrink-0 size-5",trailingIcon:"shrink-0 size-5 ms-auto group-data-[state=open]:rotate-180 transition-transform duration-200",label:"text-start break-words"},variants:{disabled:{true:{trigger:"cursor-not-allowed opacity-75"}}}},ee={__name:"UAccordion",props:{as:{type:null,required:!1},items:{type:Array,required:!1},trailingIcon:{type:null,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1},collapsible:{type:Boolean,required:!1,default:!0},defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1},type:{type:String,required:!1,default:"single"},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:modelValue"],setup(i,{emit:u}){const o=i,y=u,n=B(),g=P(),l=V("accordion",o),h=D(F(o,"as","collapsible","defaultValue","disabled","modelValue","unmountOnHide"),y),t=A(()=>_({extend:_(Y),...g.ui?.accordion||{}})({disabled:o.disabled}));return(s,v)=>(d(),f(a(L),J(a(h),{type:i.type,"data-slot":"root",class:t.value.root({class:[a(l)?.root,o.class]})}),{default:p(()=>[(d(!0),x(N,null,O(o.items,(e,c)=>(d(),f(a(U),{key:c,value:a(q)(e,o.valueKey)??String(c),disabled:e.disabled,"data-slot":"item",class:r(t.value.item({class:[a(l)?.item,e.ui?.item,e.class]}))},{default:p(({open:m})=>[C(a(X),{as:"div","data-slot":"header",class:r(t.value.header({class:[a(l)?.header,e.ui?.header]}))},{default:p(()=>[C(a(E),{"data-slot":"trigger",class:r(t.value.trigger({class:[a(l)?.trigger,e.ui?.trigger],disabled:e.disabled}))},{default:p(()=>[b(s.$slots,"leading",{item:e,index:c,open:m,ui:t.value},()=>[e.icon?(d(),f($,{key:0,name:e.icon,"data-slot":"leadingIcon",class:r(t.value.leadingIcon({class:[a(l)?.leadingIcon,e?.ui?.leadingIcon]}))},null,8,["name","class"])):I("",!0)]),a(q)(e,o.labelKey)||n.default?(d(),x("span",{key:0,"data-slot":"label",class:r(t.value.label({class:[a(l)?.label,e.ui?.label]}))},[b(s.$slots,"default",{item:e,index:c,open:m},()=>[k(w(a(q)(e,o.labelKey)),1)])],2)):I("",!0),b(s.$slots,"trailing",{item:e,index:c,open:m,ui:t.value},()=>[C($,{name:e.trailingIcon||i.trailingIcon||a(g).ui.icons.chevronDown,"data-slot":"trailingIcon",class:r(t.value.trailingIcon({class:[a(l)?.trailingIcon,e.ui?.trailingIcon]}))},null,8,["name","class"])])]),_:2},1032,["class"])]),_:2},1032,["class"]),e.content||n.content||e.slot&&n[e.slot]||n.body||e.slot&&n[`${e.slot}-body`]?(d(),f(a(R),{key:0,"data-slot":"content",class:r(t.value.content({class:[a(l)?.content,e.ui?.content]}))},{default:p(()=>[b(s.$slots,e.slot||"content",{item:e,index:c,open:m,ui:t.value},()=>[T("div",{"data-slot":"body",class:r(t.value.body({class:[a(l)?.body,e.ui?.body]}))},[b(s.$slots,e.slot?`${e.slot}-body`:"body",{item:e,index:c,open:m,ui:t.value},()=>[k(w(e.content),1)])],2)])]),_:2},1032,["class"])):I("",!0)]),_:2},1032,["value","disabled","class"]))),128))]),_:3},16,["type","class"]))}},ae={slots:{root:"my-5",trigger:"text-base"}},se={__name:"ProseAccordion",props:{type:{type:String,required:!1,default:"multiple"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(i){const u=i,o=B(),y=P(),n=V("prose.accordion",u),g=A(()=>_({extend:_(ae),...y.ui?.prose?.accordion||{}})),l=W(1),h=A(()=>(l.value,o.default?.()?.flatMap(t).filter(Boolean)||[]));function t(s,v){return typeof s.type=="symbol"?s.children?.map(t):{index:v,label:s.props?.label||`${v}`,description:s.props?.description,icon:s.props?.icon,component:s}}return M(()=>l.value++),(s,v)=>(d(),f(ee,{type:i.type,items:h.value,"unmount-on-hide":!1,class:r(u.class),ui:a(Q)(g.value(),a(n))},{content:p(({item:e})=>[(d(),f(Z(e.component)))]),_:1},8,["type","items","class","ui"]))}};export{se as default}; diff --git a/docus/dist/_nuxt/CgQMWAWA.js b/docus/dist/_nuxt/CgQMWAWA.js new file mode 100644 index 0000000..c816c44 --- /dev/null +++ b/docus/dist/_nuxt/CgQMWAWA.js @@ -0,0 +1 @@ +import{T as w,a as B,b as I,c as T,d as L}from"./DewHeYIb.js";import{Q as M,_ as q,a0 as G,a1 as z,G as U,bC as $,w as y,bt as D,a as d,p as f,ac as n,s as a,al as F,v as N,c as h,am as x,o as i,B as m,e as _,F as S,r as V,af as P,ag as j,W as A}from"./B3fabVUf.js";import E from"./C-sCiTCq.js";import"./B6bUjJBd.js";const K={slots:{root:"relative group *:not-first:!my-0 *:not-first:!static my-5",list:"relative flex items-center gap-1 border border-muted bg-default border-b-0 rounded-t-md overflow-x-auto p-2",indicator:"absolute left-0 inset-y-2 w-(--reka-tabs-indicator-size) translate-x-(--reka-tabs-indicator-position) transition-[translate,width] duration-200 bg-elevated rounded-md shadow-xs",trigger:["relative inline-flex items-center gap-1.5 text-default data-[state=active]:text-highlighted hover:bg-elevated/50 px-2 py-1.5 text-sm rounded-md disabled:cursor-not-allowed disabled:opacity-75 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary focus:outline-none","transition-colors"],triggerIcon:"size-4 shrink-0",triggerLabel:"truncate"}},H={__name:"ProseCodeGroup",props:F({defaultValue:{type:String,required:!1,default:"0"},sync:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},{modelValue:{type:String},modelModifiers:{}}),emits:["update:modelValue"],setup(p){const c=p,C=M(),s=q(p,"modelValue"),k=G(),r=z("prose.codeGroup",c),o=h(()=>x({extend:x(K),...k.ui?.prose?.codeGroup||{}})()),g=N(1),v=h(()=>(g.value,C.default?.()?.flatMap(b).filter(Boolean)||[]));function b(e,t){return typeof e.type=="symbol"?e.children?.map(b):{label:e.props?.filename||e.props?.label||`${t}`,icon:e.props?.icon,component:e}}return U(()=>{if(c.sync){const e=`code-group-${c.sync}`,t=$(e,()=>localStorage.getItem(e));y(t,()=>{t.value&&(s.value=t.value)},{immediate:!0}),y(s,()=>{s.value&&(t.value=s.value,localStorage.setItem(e,s.value))})}}),D(()=>g.value++),(e,t)=>(i(),d(a(w),{modelValue:s.value,"onUpdate:modelValue":t[0]||(t[0]=l=>s.value=l),"default-value":p.defaultValue,"unmount-on-hide":!1,class:n(o.value.root({class:[a(r)?.root,c.class]}))},{default:f(()=>[m(a(B),{class:n(o.value.list({class:a(r)?.list}))},{default:f(()=>[m(a(I),{class:n(o.value.indicator({class:a(r)?.indicator}))},null,8,["class"]),(i(!0),_(S,null,V(v.value,(l,u)=>(i(),d(a(T),{key:u,value:String(u),class:n(o.value.trigger({class:a(r)?.trigger}))},{default:f(()=>[m(E,{icon:l.icon,filename:l.label,class:n(o.value.triggerIcon({class:a(r)?.triggerIcon}))},null,8,["icon","filename","class"]),P("span",{class:n(o.value.triggerLabel({class:a(r)?.triggerLabel}))},j(l.label),3)]),_:2},1032,["value","class"]))),128))]),_:1},8,["class"]),(i(!0),_(S,null,V(v.value,(l,u)=>(i(),d(a(L),{key:u,value:String(u),"as-child":""},{default:f(()=>[(i(),d(A(l.component),{"hide-header":"",tabindex:"-1"}))]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue","default-value","class"]))}};export{H as default}; diff --git a/docus/dist/_nuxt/ClE5p2_s.js b/docus/dist/_nuxt/ClE5p2_s.js new file mode 100644 index 0000000..d952224 --- /dev/null +++ b/docus/dist/_nuxt/ClE5p2_s.js @@ -0,0 +1 @@ +const o={or:"یا",error:{title:"صفحہ نہیں ملا",description:"ہمیں افسوس ہے، لیکن آپ جو صفحہ تلاش کر رہے ہیں وہ موجود نہیں ہے۔"}},a={copy:{page:"صفحہ کاپی کریں",link:"Markdown صفحہ کاپی کریں",view:"Markdown کے طور پر دیکھیں",gpt:"ChatGPT میں کھولیں",claude:"Claude میں کھولیں"},links:"کمیونٹی",toc:"اس صفحے پر",menu:"مینو",report:"مسئلہ کی اطلاع دیں",edit:"اس صفحے کو ترمیم کریں"},e={copyLogo:"لوگو کاپی کریں",copyWordmark:"ورڈ مارک کاپی کریں",downloadLogo:"لوگو ڈاؤن لوڈ کریں",downloadWordmark:"ورڈ مارک ڈاؤن لوڈ کریں",brandAssets:"برانڈ اثاثے",logoCopied:"لوگو کاپی ہو گیا",wordmarkCopied:"ورڈ مارک کاپی ہو گیا",logoDownloaded:"لوگو ڈاؤن لوڈ ہو گیا",wordmarkDownloaded:"ورڈ مارک ڈاؤن لوڈ ہو گیا",copyLogoFailed:"لوگو کاپی نہیں ہو سکا",copyWordmarkFailed:"ورڈ مارک کاپی نہیں ہو سکا"},n={title:"AI سے پوچھیں۔",placeholder:"ایک سوال پوچھیں...",tooltip:"AI سے ایک سوال پوچھیں۔",tryAsking:"ایک سوال پوچھنے کی کوشش کریں۔",askAnything:"کچھ بھی پوچھو...",clearChat:"چیٹ صاف کریں۔",close:"بند",expand:"پھیلائیں۔",collapse:"سمٹنا",thinking:"سوچ رہا ہے...",askMeAnything:"کچھ بھی پوچھو",askMeAnythingDescription:"دستاویزات کو نیویگیٹ کرنے، تصورات کو سمجھنے اور جوابات تلاش کرنے میں مدد حاصل کریں۔",faq:"اکثر پوچھے گئے سوالات",chatCleared:"ریفریش پر چیٹ صاف ہو جاتی ہے۔",lineBreak:"لائن بریک",explainWithAi:"AI کے ساتھ وضاحت کریں۔",toolListPages:"درج دستاویزات کے صفحات",toolReadPage:"پڑھیں",loading:{searching:"دستاویزات کی تلاش",reading:"دستاویزات کے ذریعے پڑھنا",analyzing:"مواد کا تجزیہ",finding:"بہترین جواب تلاش کرنا",finished:"ذرائع استعمال کیے گئے۔"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/ClIRhDxf.js b/docus/dist/_nuxt/ClIRhDxf.js new file mode 100644 index 0000000..250ecf8 --- /dev/null +++ b/docus/dist/_nuxt/ClIRhDxf.js @@ -0,0 +1,3 @@ +import"./B3fabVUf.js";var Ft=(()=>{var qe=import.meta.url;return function(ce={}){var ge,i=ce,ye,Ee,Ne=new Promise((e,t)=>{ye=e,Ee=t}),Je=typeof window=="object",Oe=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";const Fe=globalThis.sqlite3InitModuleState||Object.assign(Object.create(null),{debugModule:()=>{}});delete globalThis.sqlite3InitModuleState,Fe.debugModule("globalThis.location =",globalThis.location);var Qe=Object.assign({},i),re="./this.program",me="";function Ae(e){return i.locateFile?i.locateFile(e,me):me+e}var Le,Me;(Je||Oe)&&(Oe?me=self.location.href:typeof document<"u"&&document.currentScript&&(me=document.currentScript.src),qe&&(me=qe),me.startsWith("blob:")?me="":me=me.substr(0,me.replace(/[?#].*/,"").lastIndexOf("/")+1),Oe&&(Me=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),Le=e=>fetch(e,{credentials:"same-origin"}).then(t=>t.ok?t.arrayBuffer():Promise.reject(new Error(t.status+" : "+t.url))));var He=i.print||console.log.bind(console),Pe=i.printErr||console.error.bind(console);Object.assign(i,Qe),Qe=null,i.arguments&&i.arguments,i.thisProgram&&(re=i.thisProgram);var Xe=i.wasmBinary,Ce,ut=!1,xe,je,Ve,ue,we,Ie;function ft(){var e=Ce.buffer;i.HEAP8=xe=new Int8Array(e),i.HEAP16=Ve=new Int16Array(e),i.HEAPU8=je=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=ue=new Int32Array(e),i.HEAPU32=we=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e),i.HEAP64=Ie=new BigInt64Array(e),i.HEAPU64=new BigUint64Array(e)}if(i.wasmMemory)Ce=i.wasmMemory;else{var Pt=i.INITIAL_MEMORY||16777216;Ce=new WebAssembly.Memory({initial:Pt/65536,maximum:32768})}ft();var dt=[],pt=[],mt=[];function Ot(){var e=i.preRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Dt)),it(dt)}function Lt(){!i.noFSInit&&!a.initialized&&a.init(),a.ignorePermissions=!1,it(pt)}function Ct(){var e=i.postRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Nt)),it(mt)}function Dt(e){dt.unshift(e)}function Rt(e){pt.unshift(e)}function Nt(e){mt.unshift(e)}var De=0,Ge=null;function Yn(e){return e}function nt(e){De++,i.monitorRunDependencies?.(De)}function Ye(e){if(De--,i.monitorRunDependencies?.(De),De==0&&Ge){var t=Ge;Ge=null,t()}}function rt(e){i.onAbort?.(e),e="Aborted("+e+")",Pe(e),ut=!0,e+=". Build with -sASSERTIONS for more info.";var t=new WebAssembly.RuntimeError(e);throw Ee(t),t}var Mt="data:application/octet-stream;base64,",ht=e=>e.startsWith(Mt);function jt(){if(i.locateFile){var e="sqlite3.wasm";return ht(e)?e:Ae(e)}return new URL(""+new URL("sqlite3.DBpDb1lf.wasm",import.meta.url).href,import.meta.url).href}var st;function gt(e){if(e==st&&Xe)return new Uint8Array(Xe);if(Me)return Me(e);throw"both async and sync fetching of the wasm failed"}function Bt(e){return Xe?Promise.resolve().then(()=>gt(e)):Le(e).then(t=>new Uint8Array(t),()=>gt(e))}function qt(e,t,n){return Bt(e).then(r=>WebAssembly.instantiate(r,t)).then(n,r=>{Pe(`failed to asynchronously prepare wasm: ${r}`),rt(r)})}function Ut(e,t,n,r){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!ht(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var o=WebAssembly.instantiateStreaming(s,n);return o.then(r,function(p){return Pe(`wasm streaming compile failed: ${p}`),Pe("falling back to ArrayBuffer instantiation"),qt(t,n,r)})}):qt(t,n,r)}function zt(){return{env:St,wasi_snapshot_preview1:St}}function Wt(){var e=zt();function t(r,s){return m=r.exports,Rt(m.__wasm_call_ctors),Ye(),m}nt();function n(r){t(r.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(r){Pe(`Module.instantiateWasm callback failed with error: ${r}`),Ee(r)}return st??=jt(),Ut(Xe,st,e,n).catch(Ee),{}}var it=e=>{e.forEach(t=>t(i))};i.noExitRuntime;var fe={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var n=0,r=e.length-1;r>=0;r--){var s=e[r];s==="."?e.splice(r,1):s===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:e=>{var t=fe.isAbs(e),n=e.substr(-1)==="/";return e=fe.normalizeArray(e.split("/").filter(r=>!!r),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=fe.splitPath(e),n=t[0],r=t[1];return!n&&!r?".":(r&&(r=r.substr(0,r.length-1)),n+r)},basename:e=>{if(e==="/")return"/";e=fe.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>fe.normalize(e.join("/")),join2:(e,t)=>fe.normalize(e+"/"+t)},Qt=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);rt("initRandomDevice")},bt=e=>(bt=Qt())(e),ke={resolve:(...e)=>{for(var t="",n=!1,r=e.length-1;r>=-1&&!n;r--){var s=r>=0?e[r]:a.cwd();if(typeof s!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!s)return"";t=s+"/"+t,n=fe.isAbs(s)}return t=fe.normalizeArray(t.split("/").filter(o=>!!o),!n).join("/"),(n?"/":"")+t||"."},relative:(e,t)=>{e=ke.resolve(e).substr(1),t=ke.resolve(t).substr(1);function n(R){for(var z=0;z=0&&R[Q]==="";Q--);return z>Q?[]:R.slice(z,Q-z+1)}for(var r=n(e.split("/")),s=n(t.split("/")),o=Math.min(r.length,s.length),p=o,g=0;g{for(var r=t+n,s=t;e[s]&&!(s>=r);)++s;if(s-t>16&&e.buffer&&yt)return yt.decode(e.subarray(t,s));for(var o="";t>10,56320|R&1023)}}return o},ot=[],Ze=e=>{for(var t=0,n=0;n=55296&&r<=57343?(t+=4,++n):t+=3}return t},lt=(e,t,n,r)=>{if(!(r>0))return 0;for(var s=n,o=n+r-1,p=0;p=55296&&g<=57343){var P=e.charCodeAt(++p);g=65536+((g&1023)<<10)|P&1023}if(g<=127){if(n>=o)break;t[n++]=g}else if(g<=2047){if(n+1>=o)break;t[n++]=192|g>>6,t[n++]=128|g&63}else if(g<=65535){if(n+2>=o)break;t[n++]=224|g>>12,t[n++]=128|g>>6&63,t[n++]=128|g&63}else{if(n+3>=o)break;t[n++]=240|g>>18,t[n++]=128|g>>12&63,t[n++]=128|g>>6&63,t[n++]=128|g&63}}return t[n]=0,n-s};function wt(e,t,n){var r=Ze(e)+1,s=new Array(r),o=lt(e,s,0,s.length);return s.length=o,s}var Ht=()=>{if(!ot.length){var e=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(e=window.prompt("Input: "),e!==null&&(e+=` +`)),!e)return null;ot=wt(e)}return ot.shift()},Re={ttys:[],init(){},shutdown(){},register(e,t){Re.ttys[e]={input:[],output:[],ops:t},a.registerDevice(e,Re.stream_ops)},stream_ops:{open(e){var t=Re.ttys[e.node.rdev];if(!t)throw new a.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,n,r,s){if(!e.tty||!e.tty.ops.get_char)throw new a.ErrnoError(60);for(var o=0,p=0;p0&&(He(Be(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,n){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(Pe(Be(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(Pe(Be(e.output)),e.output=[])}}},Vt=(e,t)=>{je.fill(0,e,e+t)},Et=(e,t)=>Math.ceil(e/t)*t,vt=e=>{e=Et(e,65536);var t=At(65536,e);return t&&Vt(t,e),t},oe={ops_table:null,mount(e){return oe.createNode(null,"/",16895,0)},createNode(e,t,n,r){if(a.isBlkdev(n)||a.isFIFO(n))throw new a.ErrnoError(63);oe.ops_table||={dir:{node:{getattr:oe.node_ops.getattr,setattr:oe.node_ops.setattr,lookup:oe.node_ops.lookup,mknod:oe.node_ops.mknod,rename:oe.node_ops.rename,unlink:oe.node_ops.unlink,rmdir:oe.node_ops.rmdir,readdir:oe.node_ops.readdir,symlink:oe.node_ops.symlink},stream:{llseek:oe.stream_ops.llseek}},file:{node:{getattr:oe.node_ops.getattr,setattr:oe.node_ops.setattr},stream:{llseek:oe.stream_ops.llseek,read:oe.stream_ops.read,write:oe.stream_ops.write,allocate:oe.stream_ops.allocate,mmap:oe.stream_ops.mmap,msync:oe.stream_ops.msync}},link:{node:{getattr:oe.node_ops.getattr,setattr:oe.node_ops.setattr,readlink:oe.node_ops.readlink},stream:{}},chrdev:{node:{getattr:oe.node_ops.getattr,setattr:oe.node_ops.setattr},stream:a.chrdev_stream_ops}};var s=a.createNode(e,t,n,r);return a.isDir(s.mode)?(s.node_ops=oe.ops_table.dir.node,s.stream_ops=oe.ops_table.dir.stream,s.contents={}):a.isFile(s.mode)?(s.node_ops=oe.ops_table.file.node,s.stream_ops=oe.ops_table.file.stream,s.usedBytes=0,s.contents=null):a.isLink(s.mode)?(s.node_ops=oe.ops_table.link.node,s.stream_ops=oe.ops_table.link.stream):a.isChrdev(s.mode)&&(s.node_ops=oe.ops_table.chrdev.node,s.stream_ops=oe.ops_table.chrdev.stream),s.timestamp=Date.now(),e&&(e.contents[t]=s,e.timestamp=s.timestamp),s},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){var r=1024*1024;t=Math.max(t,n*(n>>0),n!=0&&(t=Math.max(t,256));var s=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(s.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=a.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,a.isDir(e.mode)?t.size=4096:a.isFile(e.mode)?t.size=e.usedBytes:a.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){t.mode!==void 0&&(e.mode=t.mode),t.timestamp!==void 0&&(e.timestamp=t.timestamp),t.size!==void 0&&oe.resizeFileStorage(e,t.size)},lookup(e,t){throw a.genericErrors[44]},mknod(e,t,n,r){return oe.createNode(e,t,n,r)},rename(e,t,n){if(a.isDir(e.mode)){var r;try{r=a.lookupNode(t,n)}catch{}if(r)for(var s in r.contents)throw new a.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp},unlink(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir(e,t){var n=a.lookupNode(e,t);for(var r in n.contents)throw new a.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir(e){var t=[".",".."];for(var n of Object.keys(e.contents))t.push(n);return t},symlink(e,t,n){var r=oe.createNode(e,t,41471,0);return r.link=n,r},readlink(e){if(!a.isLink(e.mode))throw new a.ErrnoError(28);return e.link}},stream_ops:{read(e,t,n,r,s){var o=e.node.contents;if(s>=e.node.usedBytes)return 0;var p=Math.min(e.node.usedBytes-s,r);if(p>8&&o.subarray)t.set(o.subarray(s,s+p),n);else for(var g=0;g0||n+t{var s=`al ${e}`;Le(e).then(o=>{t(new Uint8Array(o)),s&&Ye()},o=>{if(n)n();else throw`Loading data file "${e}" failed.`}),s&&nt()},$t=(e,t,n,r,s,o)=>{a.createDataFile(e,t,n,r,s,o)},Kt=i.preloadPlugins||[],Jt=(e,t,n,r)=>{typeof Browser<"u"&&Browser.init();var s=!1;return Kt.forEach(o=>{s||o.canHandle(t)&&(o.handle(e,t,n,r),s=!0)}),s},Xt=(e,t,n,r,s,o,p,g,P,R)=>{var z=t?ke.resolve(fe.join2(e,t)):e;function Q(T){function A(D){R?.(),g||$t(e,t,D,r,s,P),o?.(),Ye()}Jt(T,z,A,()=>{p?.(),Ye()})||A(T)}nt(),typeof n=="string"?Gt(n,Q,p):Q(n)},Yt=e=>{var t={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},n=t[e];if(typeof n>"u")throw new Error(`Unknown file open mode: ${e}`);return n},at=(e,t)=>{var n=0;return e&&(n|=365),t&&(n|=146),n},a={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){this.name="ErrnoError",this.errno=e}},genericErrors:{},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(e){this.node=e}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e}get position(){return this.shared.position}set position(e){this.shared.position=e}},FSNode:class{constructor(e,t,n,r){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=a.nextInode++,this.name=t,this.mode=n,this.node_ops={},this.stream_ops={},this.rdev=r,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(e){e?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(e){e?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return a.isDir(this.mode)}get isDevice(){return a.isChrdev(this.mode)}},lookupPath(e,t={}){if(e=ke.resolve(e),!e)return{path:"",node:null};var n={follow_mount:!0,recurse_count:0};if(t=Object.assign(n,t),t.recurse_count>8)throw new a.ErrnoError(32);for(var r=e.split("/").filter(Q=>!!Q),s=a.root,o="/",p=0;p40)throw new a.ErrnoError(32)}}return{path:o,node:s}},getPath(e){for(var t;;){if(a.isRoot(e)){var n=e.mount.mountpoint;return t?n[n.length-1]!=="/"?`${n}/${t}`:n+t:n}t=t?`${e.name}/${t}`:e.name,e=e.parent}},hashName(e,t){for(var n=0,r=0;r>>0)%a.nameTable.length},hashAddNode(e){var t=a.hashName(e.parent.id,e.name);e.name_next=a.nameTable[t],a.nameTable[t]=e},hashRemoveNode(e){var t=a.hashName(e.parent.id,e.name);if(a.nameTable[t]===e)a.nameTable[t]=e.name_next;else for(var n=a.nameTable[t];n;){if(n.name_next===e){n.name_next=e.name_next;break}n=n.name_next}},lookupNode(e,t){var n=a.mayLookup(e);if(n)throw new a.ErrnoError(n);for(var r=a.hashName(e.id,t),s=a.nameTable[r];s;s=s.name_next){var o=s.name;if(s.parent.id===e.id&&o===t)return s}return a.lookup(e,t)},createNode(e,t,n,r){var s=new a.FSNode(e,t,n,r);return a.hashAddNode(s),s},destroyNode(e){a.hashRemoveNode(e)},isRoot(e){return e===e.parent},isMountpoint(e){return!!e.mounted},isFile(e){return(e&61440)===32768},isDir(e){return(e&61440)===16384},isLink(e){return(e&61440)===40960},isChrdev(e){return(e&61440)===8192},isBlkdev(e){return(e&61440)===24576},isFIFO(e){return(e&61440)===4096},isSocket(e){return(e&49152)===49152},flagsToPermissionString(e){var t=["r","w","rw"][e&3];return e&512&&(t+="w"),t},nodePermissions(e,t){return a.ignorePermissions?0:t.includes("r")&&!(e.mode&292)||t.includes("w")&&!(e.mode&146)||t.includes("x")&&!(e.mode&73)?2:0},mayLookup(e){if(!a.isDir(e.mode))return 54;var t=a.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate(e,t){try{var n=a.lookupNode(e,t);return 20}catch{}return a.nodePermissions(e,"wx")},mayDelete(e,t,n){var r;try{r=a.lookupNode(e,t)}catch(o){return o.errno}var s=a.nodePermissions(e,"wx");if(s)return s;if(n){if(!a.isDir(r.mode))return 54;if(a.isRoot(r)||a.getPath(r)===a.cwd())return 10}else if(a.isDir(r.mode))return 31;return 0},mayOpen(e,t){return e?a.isLink(e.mode)?32:a.isDir(e.mode)&&(a.flagsToPermissionString(t)!=="r"||t&512)?31:a.nodePermissions(e,a.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd(){for(var e=0;e<=a.MAX_OPEN_FDS;e++)if(!a.streams[e])return e;throw new a.ErrnoError(33)},getStreamChecked(e){var t=a.getStream(e);if(!t)throw new a.ErrnoError(8);return t},getStream:e=>a.streams[e],createStream(e,t=-1){return e=Object.assign(new a.FSStream,e),t==-1&&(t=a.nextfd()),e.fd=t,a.streams[t]=e,e},closeStream(e){a.streams[e]=null},dupStream(e,t=-1){var n=a.createStream(e,t);return n.stream_ops?.dup?.(n),n},chrdev_stream_ops:{open(e){var t=a.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open?.(e)},llseek(){throw new a.ErrnoError(70)}},major:e=>e>>8,minor:e=>e&255,makedev:(e,t)=>e<<8|t,registerDevice(e,t){a.devices[e]={stream_ops:t}},getDevice:e=>a.devices[e],getMounts(e){for(var t=[],n=[e];n.length;){var r=n.pop();t.push(r),n.push(...r.mounts)}return t},syncfs(e,t){typeof e=="function"&&(t=e,e=!1),a.syncFSRequests++,a.syncFSRequests>1&&Pe(`warning: ${a.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var n=a.getMounts(a.root.mount),r=0;function s(p){return a.syncFSRequests--,t(p)}function o(p){if(p)return o.errored?void 0:(o.errored=!0,s(p));++r>=n.length&&s(null)}n.forEach(p=>{if(!p.type.syncfs)return o(null);p.type.syncfs(p,e,o)})},mount(e,t,n){var r=n==="/",s=!n,o;if(r&&a.root)throw new a.ErrnoError(10);if(!r&&!s){var p=a.lookupPath(n,{follow_mount:!1});if(n=p.path,o=p.node,a.isMountpoint(o))throw new a.ErrnoError(10);if(!a.isDir(o.mode))throw new a.ErrnoError(54)}var g={type:e,opts:t,mountpoint:n,mounts:[]},P=e.mount(g);return P.mount=g,g.root=P,r?a.root=P:o&&(o.mounted=g,o.mount&&o.mount.mounts.push(g)),P},unmount(e){var t=a.lookupPath(e,{follow_mount:!1});if(!a.isMountpoint(t.node))throw new a.ErrnoError(28);var n=t.node,r=n.mounted,s=a.getMounts(r);Object.keys(a.nameTable).forEach(p=>{for(var g=a.nameTable[p];g;){var P=g.name_next;s.includes(g.mount)&&a.destroyNode(g),g=P}}),n.mounted=null;var o=n.mount.mounts.indexOf(r);n.mount.mounts.splice(o,1)},lookup(e,t){return e.node_ops.lookup(e,t)},mknod(e,t,n){var r=a.lookupPath(e,{parent:!0}),s=r.node,o=fe.basename(e);if(!o||o==="."||o==="..")throw new a.ErrnoError(28);var p=a.mayCreate(s,o);if(p)throw new a.ErrnoError(p);if(!s.node_ops.mknod)throw new a.ErrnoError(63);return s.node_ops.mknod(s,o,t,n)},create(e,t){return t=t!==void 0?t:438,t&=4095,t|=32768,a.mknod(e,t,0)},mkdir(e,t){return t=t!==void 0?t:511,t&=1023,t|=16384,a.mknod(e,t,0)},mkdirTree(e,t){for(var n=e.split("/"),r="",s=0;s"u"&&(n=t,t=438),t|=8192,a.mknod(e,t,n)},symlink(e,t){if(!ke.resolve(e))throw new a.ErrnoError(44);var n=a.lookupPath(t,{parent:!0}),r=n.node;if(!r)throw new a.ErrnoError(44);var s=fe.basename(t),o=a.mayCreate(r,s);if(o)throw new a.ErrnoError(o);if(!r.node_ops.symlink)throw new a.ErrnoError(63);return r.node_ops.symlink(r,s,e)},rename(e,t){var n=fe.dirname(e),r=fe.dirname(t),s=fe.basename(e),o=fe.basename(t),p,g,P;if(p=a.lookupPath(e,{parent:!0}),g=p.node,p=a.lookupPath(t,{parent:!0}),P=p.node,!g||!P)throw new a.ErrnoError(44);if(g.mount!==P.mount)throw new a.ErrnoError(75);var R=a.lookupNode(g,s),z=ke.relative(e,r);if(z.charAt(0)!==".")throw new a.ErrnoError(28);if(z=ke.relative(t,n),z.charAt(0)!==".")throw new a.ErrnoError(55);var Q;try{Q=a.lookupNode(P,o)}catch{}if(R!==Q){var T=a.isDir(R.mode),A=a.mayDelete(g,s,T);if(A)throw new a.ErrnoError(A);if(A=Q?a.mayDelete(P,o,T):a.mayCreate(P,o),A)throw new a.ErrnoError(A);if(!g.node_ops.rename)throw new a.ErrnoError(63);if(a.isMountpoint(R)||Q&&a.isMountpoint(Q))throw new a.ErrnoError(10);if(P!==g&&(A=a.nodePermissions(g,"w"),A))throw new a.ErrnoError(A);a.hashRemoveNode(R);try{g.node_ops.rename(R,P,o),R.parent=P}catch(D){throw D}finally{a.hashAddNode(R)}}},rmdir(e){var t=a.lookupPath(e,{parent:!0}),n=t.node,r=fe.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!0);if(o)throw new a.ErrnoError(o);if(!n.node_ops.rmdir)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.rmdir(n,r),a.destroyNode(s)},readdir(e){var t=a.lookupPath(e,{follow:!0}),n=t.node;if(!n.node_ops.readdir)throw new a.ErrnoError(54);return n.node_ops.readdir(n)},unlink(e){var t=a.lookupPath(e,{parent:!0}),n=t.node;if(!n)throw new a.ErrnoError(44);var r=fe.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!1);if(o)throw new a.ErrnoError(o);if(!n.node_ops.unlink)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.unlink(n,r),a.destroyNode(s)},readlink(e){var t=a.lookupPath(e),n=t.node;if(!n)throw new a.ErrnoError(44);if(!n.node_ops.readlink)throw new a.ErrnoError(28);return ke.resolve(a.getPath(n.parent),n.node_ops.readlink(n))},stat(e,t){var n=a.lookupPath(e,{follow:!t}),r=n.node;if(!r)throw new a.ErrnoError(44);if(!r.node_ops.getattr)throw new a.ErrnoError(63);return r.node_ops.getattr(r)},lstat(e){return a.stat(e,!0)},chmod(e,t,n){var r;if(typeof e=="string"){var s=a.lookupPath(e,{follow:!n});r=s.node}else r=e;if(!r.node_ops.setattr)throw new a.ErrnoError(63);r.node_ops.setattr(r,{mode:t&4095|r.mode&-4096,timestamp:Date.now()})},lchmod(e,t){a.chmod(e,t,!0)},fchmod(e,t){var n=a.getStreamChecked(e);a.chmod(n.node,t)},chown(e,t,n,r){var s;if(typeof e=="string"){var o=a.lookupPath(e,{follow:!r});s=o.node}else s=e;if(!s.node_ops.setattr)throw new a.ErrnoError(63);s.node_ops.setattr(s,{timestamp:Date.now()})},lchown(e,t,n){a.chown(e,t,n,!0)},fchown(e,t,n){var r=a.getStreamChecked(e);a.chown(r.node,t,n)},truncate(e,t){if(t<0)throw new a.ErrnoError(28);var n;if(typeof e=="string"){var r=a.lookupPath(e,{follow:!0});n=r.node}else n=e;if(!n.node_ops.setattr)throw new a.ErrnoError(63);if(a.isDir(n.mode))throw new a.ErrnoError(31);if(!a.isFile(n.mode))throw new a.ErrnoError(28);var s=a.nodePermissions(n,"w");if(s)throw new a.ErrnoError(s);n.node_ops.setattr(n,{size:t,timestamp:Date.now()})},ftruncate(e,t){var n=a.getStreamChecked(e);if((n.flags&2097155)===0)throw new a.ErrnoError(28);a.truncate(n.node,t)},utime(e,t,n){var r=a.lookupPath(e,{follow:!0}),s=r.node;s.node_ops.setattr(s,{timestamp:Math.max(t,n)})},open(e,t,n){if(e==="")throw new a.ErrnoError(44);t=typeof t=="string"?Yt(t):t,t&64?(n=typeof n>"u"?438:n,n=n&4095|32768):n=0;var r;if(typeof e=="object")r=e;else{e=fe.normalize(e);try{var s=a.lookupPath(e,{follow:!(t&131072)});r=s.node}catch{}}var o=!1;if(t&64)if(r){if(t&128)throw new a.ErrnoError(20)}else r=a.mknod(e,n,0),o=!0;if(!r)throw new a.ErrnoError(44);if(a.isChrdev(r.mode)&&(t&=-513),t&65536&&!a.isDir(r.mode))throw new a.ErrnoError(54);if(!o){var p=a.mayOpen(r,t);if(p)throw new a.ErrnoError(p)}t&512&&!o&&a.truncate(r,0),t&=-131713;var g=a.createStream({node:r,path:a.getPath(r),flags:t,seekable:!0,position:0,stream_ops:r.stream_ops,ungotten:[],error:!1});return g.stream_ops.open&&g.stream_ops.open(g),i.logReadFiles&&!(t&1)&&(e in a.readFiles||(a.readFiles[e]=1)),g},close(e){if(a.isClosed(e))throw new a.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(t){throw t}finally{a.closeStream(e.fd)}e.fd=null},isClosed(e){return e.fd===null},llseek(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new a.ErrnoError(70);if(n!=0&&n!=1&&n!=2)throw new a.ErrnoError(28);return e.position=e.stream_ops.llseek(e,t,n),e.ungotten=[],e.position},read(e,t,n,r,s){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===1)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.read)throw new a.ErrnoError(28);var o=typeof s<"u";if(!o)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var p=e.stream_ops.read(e,t,n,r,s);return o||(e.position+=p),p},write(e,t,n,r,s,o){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.write)throw new a.ErrnoError(28);e.seekable&&e.flags&1024&&a.llseek(e,0,2);var p=typeof s<"u";if(!p)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var g=e.stream_ops.write(e,t,n,r,s,o);return p||(e.position+=g),g},allocate(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(t<0||n<=0)throw new a.ErrnoError(28);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(!a.isFile(e.node.mode)&&!a.isDir(e.node.mode))throw new a.ErrnoError(43);if(!e.stream_ops.allocate)throw new a.ErrnoError(138);e.stream_ops.allocate(e,t,n)},mmap(e,t,n,r,s){if((r&2)!==0&&(s&2)===0&&(e.flags&2097155)!==2)throw new a.ErrnoError(2);if((e.flags&2097155)===1)throw new a.ErrnoError(2);if(!e.stream_ops.mmap)throw new a.ErrnoError(43);if(!t)throw new a.ErrnoError(28);return e.stream_ops.mmap(e,t,n,r,s)},msync(e,t,n,r,s){return e.stream_ops.msync?e.stream_ops.msync(e,t,n,r,s):0},ioctl(e,t,n){if(!e.stream_ops.ioctl)throw new a.ErrnoError(59);return e.stream_ops.ioctl(e,t,n)},readFile(e,t={}){if(t.flags=t.flags||0,t.encoding=t.encoding||"binary",t.encoding!=="utf8"&&t.encoding!=="binary")throw new Error(`Invalid encoding type "${t.encoding}"`);var n,r=a.open(e,t.flags),s=a.stat(e),o=s.size,p=new Uint8Array(o);return a.read(r,p,0,o,0),t.encoding==="utf8"?n=Be(p):t.encoding==="binary"&&(n=p),a.close(r),n},writeFile(e,t,n={}){n.flags=n.flags||577;var r=a.open(e,n.flags,n.mode);if(typeof t=="string"){var s=new Uint8Array(Ze(t)+1),o=lt(t,s,0,s.length);a.write(r,s,0,o,void 0,n.canOwn)}else if(ArrayBuffer.isView(t))a.write(r,t,0,t.byteLength,void 0,n.canOwn);else throw new Error("Unsupported data type");a.close(r)},cwd:()=>a.currentPath,chdir(e){var t=a.lookupPath(e,{follow:!0});if(t.node===null)throw new a.ErrnoError(44);if(!a.isDir(t.node.mode))throw new a.ErrnoError(54);var n=a.nodePermissions(t.node,"x");if(n)throw new a.ErrnoError(n);a.currentPath=t.path},createDefaultDirectories(){a.mkdir("/tmp"),a.mkdir("/home"),a.mkdir("/home/web_user")},createDefaultDevices(){a.mkdir("/dev"),a.registerDevice(a.makedev(1,3),{read:()=>0,write:(r,s,o,p,g)=>p}),a.mkdev("/dev/null",a.makedev(1,3)),Re.register(a.makedev(5,0),Re.default_tty_ops),Re.register(a.makedev(6,0),Re.default_tty1_ops),a.mkdev("/dev/tty",a.makedev(5,0)),a.mkdev("/dev/tty1",a.makedev(6,0));var e=new Uint8Array(1024),t=0,n=()=>(t===0&&(t=bt(e).byteLength),e[--t]);a.createDevice("/dev","random",n),a.createDevice("/dev","urandom",n),a.mkdir("/dev/shm"),a.mkdir("/dev/shm/tmp")},createSpecialDirectories(){a.mkdir("/proc");var e=a.mkdir("/proc/self");a.mkdir("/proc/self/fd"),a.mount({mount(){var t=a.createNode(e,"fd",16895,73);return t.node_ops={lookup(n,r){var s=+r,o=a.getStreamChecked(s),p={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>o.path}};return p.parent=p,p}},t}},{},"/proc/self/fd")},createStandardStreams(e,t,n){e?a.createDevice("/dev","stdin",e):a.symlink("/dev/tty","/dev/stdin"),t?a.createDevice("/dev","stdout",null,t):a.symlink("/dev/tty","/dev/stdout"),n?a.createDevice("/dev","stderr",null,n):a.symlink("/dev/tty1","/dev/stderr"),a.open("/dev/stdin",0),a.open("/dev/stdout",1),a.open("/dev/stderr",1)},staticInit(){[44].forEach(e=>{a.genericErrors[e]=new a.ErrnoError(e),a.genericErrors[e].stack=""}),a.nameTable=new Array(4096),a.mount(oe,{},"/"),a.createDefaultDirectories(),a.createDefaultDevices(),a.createSpecialDirectories(),a.filesystems={MEMFS:oe}},init(e,t,n){a.initialized=!0,e??=i.stdin,t??=i.stdout,n??=i.stderr,a.createStandardStreams(e,t,n)},quit(){a.initialized=!1;for(var e=0;ethis.length-1||A<0)){var D=A%this.chunkSize,q=A/this.chunkSize|0;return this.getter(q)[D]}}setDataGetter(A){this.getter=A}cacheLength(){var A=new XMLHttpRequest;if(A.open("HEAD",n,!1),A.send(null),!(A.status>=200&&A.status<300||A.status===304))throw new Error("Couldn't load "+n+". Status: "+A.status);var D=Number(A.getResponseHeader("Content-length")),q,w=(q=A.getResponseHeader("Accept-Ranges"))&&q==="bytes",x=(q=A.getResponseHeader("Content-Encoding"))&&q==="gzip",N=1024*1024;w||(N=D);var O=(L,$)=>{if(L>$)throw new Error("invalid range ("+L+", "+$+") or no bytes requested!");if($>D-1)throw new Error("only "+D+" bytes available! programmer error!");var c=new XMLHttpRequest;if(c.open("GET",n,!1),D!==N&&c.setRequestHeader("Range","bytes="+L+"-"+$),c.responseType="arraybuffer",c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined"),c.send(null),!(c.status>=200&&c.status<300||c.status===304))throw new Error("Couldn't load "+n+". Status: "+c.status);return c.response!==void 0?new Uint8Array(c.response||[]):wt(c.responseText||"")},S=this;S.setDataGetter(L=>{var $=L*N,c=(L+1)*N-1;if(c=Math.min(c,D-1),typeof S.chunks[L]>"u"&&(S.chunks[L]=O($,c)),typeof S.chunks[L]>"u")throw new Error("doXHR failed!");return S.chunks[L]}),(x||!D)&&(N=D=1,D=this.getter(0).length,N=D,He("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=D,this._chunkSize=N,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){if(!Oe)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var p=new o,g={isDevice:!1,contents:p}}else var g={isDevice:!1,url:n};var P=a.createFile(e,t,g,r,s);g.contents?P.contents=g.contents:g.url&&(P.contents=null,P.url=g.url),Object.defineProperties(P,{usedBytes:{get:function(){return this.contents.length}}});var R={},z=Object.keys(P.stream_ops);z.forEach(T=>{var A=P.stream_ops[T];R[T]=(...D)=>(a.forceLoadFile(P),A(...D))});function Q(T,A,D,q,w){var x=T.node.contents;if(w>=x.length)return 0;var N=Math.min(x.length-w,q);if(x.slice)for(var O=0;O(a.forceLoadFile(P),Q(T,A,D,q,w)),R.mmap=(T,A,D,q,w)=>{a.forceLoadFile(P);var x=vt(A);if(!x)throw new a.ErrnoError(48);return Q(T,xe,x,A,D),{ptr:x,allocated:!0}},P.stream_ops=R,P}},Zt=(e,t)=>e?Be(je,e,t):"",ae={DEFAULT_POLLMASK:5,calculateAt(e,t,n){if(fe.isAbs(t))return t;var r;if(e===-100)r=a.cwd();else{var s=ae.getStreamFromFD(e);r=s.path}if(t.length==0){if(!n)throw new a.ErrnoError(44);return r}return fe.join2(r,t)},doStat(e,t,n){var r=e(t);ue[n>>2]=r.dev,ue[n+4>>2]=r.mode,we[n+8>>2]=r.nlink,ue[n+12>>2]=r.uid,ue[n+16>>2]=r.gid,ue[n+20>>2]=r.rdev,Ie[n+24>>3]=BigInt(r.size),ue[n+32>>2]=4096,ue[n+36>>2]=r.blocks;var s=r.atime.getTime(),o=r.mtime.getTime(),p=r.ctime.getTime();return Ie[n+40>>3]=BigInt(Math.floor(s/1e3)),we[n+48>>2]=s%1e3*1e3*1e3,Ie[n+56>>3]=BigInt(Math.floor(o/1e3)),we[n+64>>2]=o%1e3*1e3*1e3,Ie[n+72>>3]=BigInt(Math.floor(p/1e3)),we[n+80>>2]=p%1e3*1e3*1e3,Ie[n+88>>3]=BigInt(r.ino),0},doMsync(e,t,n,r,s){if(!a.isFile(t.node.mode))throw new a.ErrnoError(43);if(r&2)return 0;var o=je.slice(e,e+n);a.msync(t,o,s,n,r)},getStreamFromFD(e){var t=a.getStreamChecked(e);return t},varargs:void 0,getStr(e){var t=Zt(e);return t}};function en(e,t){try{return e=ae.getStr(e),a.chmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function tn(e,t,n,r){try{if(t=ae.getStr(t),t=ae.calculateAt(e,t),n&-8)return-28;var s=a.lookupPath(t,{follow:!0}),o=s.node;if(!o)return-44;var p="";return n&4&&(p+="r"),n&2&&(p+="w"),n&1&&(p+="x"),p&&a.nodePermissions(o,p)?-2:0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function nn(e,t){try{return a.fchmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function rn(e,t,n){try{return a.fchown(e,t,n),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function et(){var e=ue[+ae.varargs>>2];return ae.varargs+=4,e}var Ue=et;function sn(e,t,n){ae.varargs=n;try{var r=ae.getStreamFromFD(e);switch(t){case 0:{var s=et();if(s<0)return-28;for(;a.streams[s];)s++;var o;return o=a.dupStream(r,s),o.fd}case 1:case 2:return 0;case 3:return r.flags;case 4:{var s=et();return r.flags|=s,0}case 12:{var s=Ue(),p=0;return Ve[s+p>>1]=2,0}case 13:case 14:return 0}return-28}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function on(e,t){try{var n=ae.getStreamFromFD(e);return ae.doStat(a.stat,n.path,t)}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var ln=9007199254740992,an=-9007199254740992,$e=e=>eln?NaN:Number(e);function cn(e,t){t=$e(t);try{return isNaN(t)?61:(a.ftruncate(e,t),0)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}var ze=(e,t,n)=>lt(e,je,t,n);function _n(e,t){try{if(t===0)return-28;var n=a.cwd(),r=Ze(n)+1;return t"u"||s.name!=="ErrnoError")throw s;return-s.errno}}function un(e,t,n){ae.varargs=n;try{var r=ae.getStreamFromFD(e);switch(t){case 21509:return r.tty?0:-59;case 21505:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcgets){var s=r.tty.ops.ioctl_tcgets(r),o=Ue();ue[o>>2]=s.c_iflag||0,ue[o+4>>2]=s.c_oflag||0,ue[o+8>>2]=s.c_cflag||0,ue[o+12>>2]=s.c_lflag||0;for(var p=0;p<32;p++)xe[o+p+17]=s.c_cc[p]||0;return 0}return 0}case 21510:case 21511:case 21512:return r.tty?0:-59;case 21506:case 21507:case 21508:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcsets){for(var o=Ue(),g=ue[o>>2],P=ue[o+4>>2],R=ue[o+8>>2],z=ue[o+12>>2],Q=[],p=0;p<32;p++)Q.push(xe[o+p+17]);return r.tty.ops.ioctl_tcsets(r.tty,t,{c_iflag:g,c_oflag:P,c_cflag:R,c_lflag:z,c_cc:Q})}return 0}case 21519:{if(!r.tty)return-59;var o=Ue();return ue[o>>2]=0,0}case 21520:return r.tty?-28:-59;case 21531:{var o=Ue();return a.ioctl(r,t,o)}case 21523:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tiocgwinsz){var T=r.tty.ops.ioctl_tiocgwinsz(r.tty),o=Ue();Ve[o>>1]=T[0],Ve[o+2>>1]=T[1]}return 0}case 21524:return r.tty?0:-59;case 21515:return r.tty?0:-59;default:return-28}}catch(A){if(typeof a>"u"||A.name!=="ErrnoError")throw A;return-A.errno}}function fn(e,t){try{return e=ae.getStr(e),ae.doStat(a.lstat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function dn(e,t,n){try{return t=ae.getStr(t),t=ae.calculateAt(e,t),t=fe.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),a.mkdir(t,n,0),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function pn(e,t,n,r){try{t=ae.getStr(t);var s=r&256,o=r&4096;return r=r&-6401,t=ae.calculateAt(e,t,o),ae.doStat(s?a.lstat:a.stat,t,n)}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}function mn(e,t,n,r){ae.varargs=r;try{t=ae.getStr(t),t=ae.calculateAt(e,t);var s=r?et():0;return a.open(t,n,s).fd}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return-o.errno}}function hn(e,t,n,r){try{if(t=ae.getStr(t),t=ae.calculateAt(e,t),r<=0)return-28;var s=a.readlink(t),o=Math.min(r,Ze(s)),p=xe[n+o];return ze(s,n,r+1),xe[n+o]=p,o}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function gn(e){try{return e=ae.getStr(e),a.rmdir(e),0}catch(t){if(typeof a>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}function qn(e,t){try{return e=ae.getStr(e),ae.doStat(a.stat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function bn(e,t,n){try{return t=ae.getStr(t),t=ae.calculateAt(e,t),n===0?a.unlink(t):n===512?a.rmdir(t):rt("Invalid flags passed to unlinkat"),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var xt=e=>we[e>>2]+ue[e+4>>2]*4294967296;function yn(e,t,n,r){try{t=ae.getStr(t),t=ae.calculateAt(e,t,!0);var s=Date.now(),o,p;if(!n)o=s,p=s;else{var g=xt(n),P=ue[n+8>>2];P==1073741823?o=s:P==1073741822?o=-1:o=g*1e3+P/(1e3*1e3),n+=16,g=xt(n),P=ue[n+8>>2],P==1073741823?p=s:P==1073741822?p=-1:p=g*1e3+P/(1e3*1e3)}return(p!=-1||o!=-1)&&a.utime(t,o,p),0}catch(R){if(typeof a>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var wn=1,En=()=>wn,vn=e=>e%4===0&&(e%100!==0||e%400===0),xn=[0,31,60,91,121,152,182,213,244,274,305,335],Sn=[0,31,59,90,120,151,181,212,243,273,304,334],An=e=>{var t=vn(e.getFullYear()),n=t?xn:Sn,r=n[e.getMonth()]+e.getDate()-1;return r};function In(e,t){e=$e(e);var n=new Date(e*1e3);ue[t>>2]=n.getSeconds(),ue[t+4>>2]=n.getMinutes(),ue[t+8>>2]=n.getHours(),ue[t+12>>2]=n.getDate(),ue[t+16>>2]=n.getMonth(),ue[t+20>>2]=n.getFullYear()-1900,ue[t+24>>2]=n.getDay();var r=An(n)|0;ue[t+28>>2]=r,ue[t+36>>2]=-(n.getTimezoneOffset()*60);var s=new Date(n.getFullYear(),0,1),o=new Date(n.getFullYear(),6,1).getTimezoneOffset(),p=s.getTimezoneOffset(),g=(o!=p&&n.getTimezoneOffset()==Math.min(p,o))|0;ue[t+32>>2]=g}function kn(e,t,n,r,s,o,p){s=$e(s);try{if(isNaN(s))return 61;var g=ae.getStreamFromFD(r),P=a.mmap(g,e,s,t,n),R=P.ptr;return ue[o>>2]=P.allocated,we[p>>2]=R,0}catch(z){if(typeof a>"u"||z.name!=="ErrnoError")throw z;return-z.errno}}function Tn(e,t,n,r,s,o){o=$e(o);try{var p=ae.getStreamFromFD(s);n&2&&ae.doMsync(e,p,t,r,o)}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}var Fn=(e,t,n,r)=>{var s=new Date().getFullYear(),o=new Date(s,0,1),p=new Date(s,6,1),g=o.getTimezoneOffset(),P=p.getTimezoneOffset(),R=Math.max(g,P);we[e>>2]=R*60,ue[t>>2]=+(g!=P);var z=A=>{var D=A>=0?"-":"+",q=Math.abs(A),w=String(Math.floor(q/60)).padStart(2,"0"),x=String(q%60).padStart(2,"0");return`UTC${D}${w}${x}`},Q=z(g),T=z(P);PDate.now(),On=()=>performance.now(),Ln=()=>2147483648,Cn=e=>{var t=Ce.buffer,n=(e-t.byteLength+65535)/65536|0;try{return Ce.grow(n),ft(),1}catch{}},Dn=e=>{var t=je.length;e>>>=0;var n=Ln();if(e>n)return!1;for(var r=1;r<=4;r*=2){var s=t*(1+.2/r);s=Math.min(s,e+100663296);var o=Math.min(n,Et(Math.max(e,s),65536)),p=Cn(o);if(p)return!0}return!1},ct={},Rn=()=>re||"./this.program",Ke=()=>{if(!Ke.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:Rn()};for(var n in ct)ct[n]===void 0?delete t[n]:t[n]=ct[n];var r=[];for(var n in t)r.push(`${n}=${t[n]}`);Ke.strings=r}return Ke.strings},Nn=(e,t)=>{for(var n=0;n{var n=0;return Ke().forEach((r,s)=>{var o=t+n;we[e+s*4>>2]=o,Nn(r,o),n+=r.length+1}),0},jn=(e,t)=>{var n=Ke();we[e>>2]=n.length;var r=0;return n.forEach(s=>r+=s.length+1),we[t>>2]=r,0};function Bn(e){try{var t=ae.getStreamFromFD(e);return a.close(t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}function Un(e,t){try{var n=0,r=0,s=0,o=ae.getStreamFromFD(e),p=o.tty?2:a.isDir(o.mode)?3:a.isLink(o.mode)?7:4;return xe[t]=p,Ve[t+2>>1]=s,Ie[t+8>>3]=BigInt(n),Ie[t+16>>3]=BigInt(r),0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return g.errno}}var zn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=we[t+4>>2];t+=8;var P=a.read(e,xe,p,g,r);if(P<0)return-1;if(s+=P,P>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}function Qn(e,t,n,r){t=$e(t);try{if(isNaN(t))return 61;var s=ae.getStreamFromFD(e);return a.llseek(s,t,n),Ie[r>>3]=BigInt(s.position),s.getdents&&t===0&&n===0&&(s.getdents=null),0}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return o.errno}}function Hn(e){try{var t=ae.getStreamFromFD(e);return t.stream_ops?.fsync?t.stream_ops.fsync(t):0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}var Vn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=we[t+4>>2];t+=8;var P=a.write(e,xe,p,g,r);if(P<0)return-1;if(s+=P,P>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}a.createPreloadedFile=Xt,a.staticInit();var St={__syscall_chmod:en,__syscall_faccessat:tn,__syscall_fchmod:nn,__syscall_fchown32:rn,__syscall_fcntl64:sn,__syscall_fstat64:on,__syscall_ftruncate64:cn,__syscall_getcwd:_n,__syscall_ioctl:un,__syscall_lstat64:fn,__syscall_mkdirat:dn,__syscall_newfstatat:pn,__syscall_openat:mn,__syscall_readlinkat:hn,__syscall_rmdir:gn,__syscall_stat64:qn,__syscall_unlinkat:bn,__syscall_utimensat:yn,_emscripten_get_now_is_monotonic:En,_localtime_js:In,_mmap_js:kn,_munmap_js:Tn,_tzset_js:Fn,emscripten_date_now:Pn,emscripten_get_now:On,emscripten_resize_heap:Dn,environ_get:Mn,environ_sizes_get:jn,fd_close:Bn,fd_fdstat_get:Un,fd_read:Wn,fd_seek:Qn,fd_sync:Hn,fd_write:Gn,memory:Ce},m=Wt();i._sqlite3_status64=(e,t,n,r)=>(i._sqlite3_status64=m.sqlite3_status64)(e,t,n,r),i._sqlite3_status=(e,t,n,r)=>(i._sqlite3_status=m.sqlite3_status)(e,t,n,r),i._sqlite3_db_status=(e,t,n,r,s)=>(i._sqlite3_db_status=m.sqlite3_db_status)(e,t,n,r,s),i._sqlite3_msize=e=>(i._sqlite3_msize=m.sqlite3_msize)(e),i._sqlite3_vfs_find=e=>(i._sqlite3_vfs_find=m.sqlite3_vfs_find)(e),i._sqlite3_initialize=()=>(i._sqlite3_initialize=m.sqlite3_initialize)(),i._sqlite3_malloc=e=>(i._sqlite3_malloc=m.sqlite3_malloc)(e),i._sqlite3_free=e=>(i._sqlite3_free=m.sqlite3_free)(e),i._sqlite3_vfs_register=(e,t)=>(i._sqlite3_vfs_register=m.sqlite3_vfs_register)(e,t),i._sqlite3_vfs_unregister=e=>(i._sqlite3_vfs_unregister=m.sqlite3_vfs_unregister)(e),i._sqlite3_malloc64=e=>(i._sqlite3_malloc64=m.sqlite3_malloc64)(e),i._sqlite3_realloc=(e,t)=>(i._sqlite3_realloc=m.sqlite3_realloc)(e,t),i._sqlite3_realloc64=(e,t)=>(i._sqlite3_realloc64=m.sqlite3_realloc64)(e,t),i._sqlite3_value_text=e=>(i._sqlite3_value_text=m.sqlite3_value_text)(e),i._sqlite3_randomness=(e,t)=>(i._sqlite3_randomness=m.sqlite3_randomness)(e,t),i._sqlite3_stricmp=(e,t)=>(i._sqlite3_stricmp=m.sqlite3_stricmp)(e,t),i._sqlite3_strnicmp=(e,t,n)=>(i._sqlite3_strnicmp=m.sqlite3_strnicmp)(e,t,n),i._sqlite3_uri_parameter=(e,t)=>(i._sqlite3_uri_parameter=m.sqlite3_uri_parameter)(e,t),i._sqlite3_uri_boolean=(e,t,n)=>(i._sqlite3_uri_boolean=m.sqlite3_uri_boolean)(e,t,n),i._sqlite3_serialize=(e,t,n,r)=>(i._sqlite3_serialize=m.sqlite3_serialize)(e,t,n,r),i._sqlite3_prepare_v2=(e,t,n,r,s)=>(i._sqlite3_prepare_v2=m.sqlite3_prepare_v2)(e,t,n,r,s),i._sqlite3_step=e=>(i._sqlite3_step=m.sqlite3_step)(e),i._sqlite3_column_int64=(e,t)=>(i._sqlite3_column_int64=m.sqlite3_column_int64)(e,t),i._sqlite3_reset=e=>(i._sqlite3_reset=m.sqlite3_reset)(e),i._sqlite3_exec=(e,t,n,r,s)=>(i._sqlite3_exec=m.sqlite3_exec)(e,t,n,r,s),i._sqlite3_column_int=(e,t)=>(i._sqlite3_column_int=m.sqlite3_column_int)(e,t),i._sqlite3_finalize=e=>(i._sqlite3_finalize=m.sqlite3_finalize)(e),i._sqlite3_file_control=(e,t,n,r)=>(i._sqlite3_file_control=m.sqlite3_file_control)(e,t,n,r),i._sqlite3_column_name=(e,t)=>(i._sqlite3_column_name=m.sqlite3_column_name)(e,t),i._sqlite3_column_text=(e,t)=>(i._sqlite3_column_text=m.sqlite3_column_text)(e,t),i._sqlite3_column_type=(e,t)=>(i._sqlite3_column_type=m.sqlite3_column_type)(e,t),i._sqlite3_errmsg=e=>(i._sqlite3_errmsg=m.sqlite3_errmsg)(e),i._sqlite3_deserialize=(e,t,n,r,s,o)=>(i._sqlite3_deserialize=m.sqlite3_deserialize)(e,t,n,r,s,o),i._sqlite3_clear_bindings=e=>(i._sqlite3_clear_bindings=m.sqlite3_clear_bindings)(e),i._sqlite3_value_blob=e=>(i._sqlite3_value_blob=m.sqlite3_value_blob)(e),i._sqlite3_value_bytes=e=>(i._sqlite3_value_bytes=m.sqlite3_value_bytes)(e),i._sqlite3_value_double=e=>(i._sqlite3_value_double=m.sqlite3_value_double)(e),i._sqlite3_value_int=e=>(i._sqlite3_value_int=m.sqlite3_value_int)(e),i._sqlite3_value_int64=e=>(i._sqlite3_value_int64=m.sqlite3_value_int64)(e),i._sqlite3_value_subtype=e=>(i._sqlite3_value_subtype=m.sqlite3_value_subtype)(e),i._sqlite3_value_pointer=(e,t)=>(i._sqlite3_value_pointer=m.sqlite3_value_pointer)(e,t),i._sqlite3_value_type=e=>(i._sqlite3_value_type=m.sqlite3_value_type)(e),i._sqlite3_value_nochange=e=>(i._sqlite3_value_nochange=m.sqlite3_value_nochange)(e),i._sqlite3_value_frombind=e=>(i._sqlite3_value_frombind=m.sqlite3_value_frombind)(e),i._sqlite3_value_dup=e=>(i._sqlite3_value_dup=m.sqlite3_value_dup)(e),i._sqlite3_value_free=e=>(i._sqlite3_value_free=m.sqlite3_value_free)(e),i._sqlite3_result_blob=(e,t,n,r)=>(i._sqlite3_result_blob=m.sqlite3_result_blob)(e,t,n,r),i._sqlite3_result_error_toobig=e=>(i._sqlite3_result_error_toobig=m.sqlite3_result_error_toobig)(e),i._sqlite3_result_error_nomem=e=>(i._sqlite3_result_error_nomem=m.sqlite3_result_error_nomem)(e),i._sqlite3_result_double=(e,t)=>(i._sqlite3_result_double=m.sqlite3_result_double)(e,t),i._sqlite3_result_error=(e,t,n)=>(i._sqlite3_result_error=m.sqlite3_result_error)(e,t,n),i._sqlite3_result_int=(e,t)=>(i._sqlite3_result_int=m.sqlite3_result_int)(e,t),i._sqlite3_result_int64=(e,t)=>(i._sqlite3_result_int64=m.sqlite3_result_int64)(e,t),i._sqlite3_result_null=e=>(i._sqlite3_result_null=m.sqlite3_result_null)(e),i._sqlite3_result_pointer=(e,t,n,r)=>(i._sqlite3_result_pointer=m.sqlite3_result_pointer)(e,t,n,r),i._sqlite3_result_subtype=(e,t)=>(i._sqlite3_result_subtype=m.sqlite3_result_subtype)(e,t),i._sqlite3_result_text=(e,t,n,r)=>(i._sqlite3_result_text=m.sqlite3_result_text)(e,t,n,r),i._sqlite3_result_zeroblob=(e,t)=>(i._sqlite3_result_zeroblob=m.sqlite3_result_zeroblob)(e,t),i._sqlite3_result_zeroblob64=(e,t)=>(i._sqlite3_result_zeroblob64=m.sqlite3_result_zeroblob64)(e,t),i._sqlite3_result_error_code=(e,t)=>(i._sqlite3_result_error_code=m.sqlite3_result_error_code)(e,t),i._sqlite3_user_data=e=>(i._sqlite3_user_data=m.sqlite3_user_data)(e),i._sqlite3_context_db_handle=e=>(i._sqlite3_context_db_handle=m.sqlite3_context_db_handle)(e),i._sqlite3_vtab_nochange=e=>(i._sqlite3_vtab_nochange=m.sqlite3_vtab_nochange)(e),i._sqlite3_vtab_in_first=(e,t)=>(i._sqlite3_vtab_in_first=m.sqlite3_vtab_in_first)(e,t),i._sqlite3_vtab_in_next=(e,t)=>(i._sqlite3_vtab_in_next=m.sqlite3_vtab_in_next)(e,t),i._sqlite3_aggregate_context=(e,t)=>(i._sqlite3_aggregate_context=m.sqlite3_aggregate_context)(e,t),i._sqlite3_get_auxdata=(e,t)=>(i._sqlite3_get_auxdata=m.sqlite3_get_auxdata)(e,t),i._sqlite3_set_auxdata=(e,t,n,r)=>(i._sqlite3_set_auxdata=m.sqlite3_set_auxdata)(e,t,n,r),i._sqlite3_column_count=e=>(i._sqlite3_column_count=m.sqlite3_column_count)(e),i._sqlite3_data_count=e=>(i._sqlite3_data_count=m.sqlite3_data_count)(e),i._sqlite3_column_blob=(e,t)=>(i._sqlite3_column_blob=m.sqlite3_column_blob)(e,t),i._sqlite3_column_bytes=(e,t)=>(i._sqlite3_column_bytes=m.sqlite3_column_bytes)(e,t),i._sqlite3_column_double=(e,t)=>(i._sqlite3_column_double=m.sqlite3_column_double)(e,t),i._sqlite3_column_value=(e,t)=>(i._sqlite3_column_value=m.sqlite3_column_value)(e,t),i._sqlite3_column_decltype=(e,t)=>(i._sqlite3_column_decltype=m.sqlite3_column_decltype)(e,t),i._sqlite3_bind_blob=(e,t,n,r,s)=>(i._sqlite3_bind_blob=m.sqlite3_bind_blob)(e,t,n,r,s),i._sqlite3_bind_double=(e,t,n)=>(i._sqlite3_bind_double=m.sqlite3_bind_double)(e,t,n),i._sqlite3_bind_int=(e,t,n)=>(i._sqlite3_bind_int=m.sqlite3_bind_int)(e,t,n),i._sqlite3_bind_int64=(e,t,n)=>(i._sqlite3_bind_int64=m.sqlite3_bind_int64)(e,t,n),i._sqlite3_bind_null=(e,t)=>(i._sqlite3_bind_null=m.sqlite3_bind_null)(e,t),i._sqlite3_bind_pointer=(e,t,n,r,s)=>(i._sqlite3_bind_pointer=m.sqlite3_bind_pointer)(e,t,n,r,s),i._sqlite3_bind_text=(e,t,n,r,s)=>(i._sqlite3_bind_text=m.sqlite3_bind_text)(e,t,n,r,s),i._sqlite3_bind_parameter_count=e=>(i._sqlite3_bind_parameter_count=m.sqlite3_bind_parameter_count)(e),i._sqlite3_bind_parameter_name=(e,t)=>(i._sqlite3_bind_parameter_name=m.sqlite3_bind_parameter_name)(e,t),i._sqlite3_bind_parameter_index=(e,t)=>(i._sqlite3_bind_parameter_index=m.sqlite3_bind_parameter_index)(e,t),i._sqlite3_db_handle=e=>(i._sqlite3_db_handle=m.sqlite3_db_handle)(e),i._sqlite3_stmt_readonly=e=>(i._sqlite3_stmt_readonly=m.sqlite3_stmt_readonly)(e),i._sqlite3_stmt_isexplain=e=>(i._sqlite3_stmt_isexplain=m.sqlite3_stmt_isexplain)(e),i._sqlite3_stmt_explain=(e,t)=>(i._sqlite3_stmt_explain=m.sqlite3_stmt_explain)(e,t),i._sqlite3_stmt_busy=e=>(i._sqlite3_stmt_busy=m.sqlite3_stmt_busy)(e),i._sqlite3_stmt_status=(e,t,n)=>(i._sqlite3_stmt_status=m.sqlite3_stmt_status)(e,t,n),i._sqlite3_sql=e=>(i._sqlite3_sql=m.sqlite3_sql)(e),i._sqlite3_expanded_sql=e=>(i._sqlite3_expanded_sql=m.sqlite3_expanded_sql)(e),i._sqlite3_preupdate_old=(e,t,n)=>(i._sqlite3_preupdate_old=m.sqlite3_preupdate_old)(e,t,n),i._sqlite3_preupdate_count=e=>(i._sqlite3_preupdate_count=m.sqlite3_preupdate_count)(e),i._sqlite3_preupdate_depth=e=>(i._sqlite3_preupdate_depth=m.sqlite3_preupdate_depth)(e),i._sqlite3_preupdate_blobwrite=e=>(i._sqlite3_preupdate_blobwrite=m.sqlite3_preupdate_blobwrite)(e),i._sqlite3_preupdate_new=(e,t,n)=>(i._sqlite3_preupdate_new=m.sqlite3_preupdate_new)(e,t,n),i._sqlite3_value_numeric_type=e=>(i._sqlite3_value_numeric_type=m.sqlite3_value_numeric_type)(e),i._sqlite3_set_authorizer=(e,t,n)=>(i._sqlite3_set_authorizer=m.sqlite3_set_authorizer)(e,t,n),i._sqlite3_strglob=(e,t)=>(i._sqlite3_strglob=m.sqlite3_strglob)(e,t),i._sqlite3_strlike=(e,t,n)=>(i._sqlite3_strlike=m.sqlite3_strlike)(e,t,n),i._sqlite3_auto_extension=e=>(i._sqlite3_auto_extension=m.sqlite3_auto_extension)(e),i._sqlite3_cancel_auto_extension=e=>(i._sqlite3_cancel_auto_extension=m.sqlite3_cancel_auto_extension)(e),i._sqlite3_reset_auto_extension=()=>(i._sqlite3_reset_auto_extension=m.sqlite3_reset_auto_extension)(),i._sqlite3_prepare_v3=(e,t,n,r,s,o)=>(i._sqlite3_prepare_v3=m.sqlite3_prepare_v3)(e,t,n,r,s,o),i._sqlite3_create_module=(e,t,n,r)=>(i._sqlite3_create_module=m.sqlite3_create_module)(e,t,n,r),i._sqlite3_create_module_v2=(e,t,n,r,s)=>(i._sqlite3_create_module_v2=m.sqlite3_create_module_v2)(e,t,n,r,s),i._sqlite3_drop_modules=(e,t)=>(i._sqlite3_drop_modules=m.sqlite3_drop_modules)(e,t),i._sqlite3_declare_vtab=(e,t)=>(i._sqlite3_declare_vtab=m.sqlite3_declare_vtab)(e,t),i._sqlite3_vtab_on_conflict=e=>(i._sqlite3_vtab_on_conflict=m.sqlite3_vtab_on_conflict)(e),i._sqlite3_vtab_collation=(e,t)=>(i._sqlite3_vtab_collation=m.sqlite3_vtab_collation)(e,t),i._sqlite3_vtab_in=(e,t,n)=>(i._sqlite3_vtab_in=m.sqlite3_vtab_in)(e,t,n),i._sqlite3_vtab_rhs_value=(e,t,n)=>(i._sqlite3_vtab_rhs_value=m.sqlite3_vtab_rhs_value)(e,t,n),i._sqlite3_vtab_distinct=e=>(i._sqlite3_vtab_distinct=m.sqlite3_vtab_distinct)(e),i._sqlite3_keyword_name=(e,t,n)=>(i._sqlite3_keyword_name=m.sqlite3_keyword_name)(e,t,n),i._sqlite3_keyword_count=()=>(i._sqlite3_keyword_count=m.sqlite3_keyword_count)(),i._sqlite3_keyword_check=(e,t)=>(i._sqlite3_keyword_check=m.sqlite3_keyword_check)(e,t),i._sqlite3_complete=e=>(i._sqlite3_complete=m.sqlite3_complete)(e),i._sqlite3_libversion=()=>(i._sqlite3_libversion=m.sqlite3_libversion)(),i._sqlite3_libversion_number=()=>(i._sqlite3_libversion_number=m.sqlite3_libversion_number)(),i._sqlite3_shutdown=()=>(i._sqlite3_shutdown=m.sqlite3_shutdown)(),i._sqlite3_last_insert_rowid=e=>(i._sqlite3_last_insert_rowid=m.sqlite3_last_insert_rowid)(e),i._sqlite3_set_last_insert_rowid=(e,t)=>(i._sqlite3_set_last_insert_rowid=m.sqlite3_set_last_insert_rowid)(e,t),i._sqlite3_changes64=e=>(i._sqlite3_changes64=m.sqlite3_changes64)(e),i._sqlite3_changes=e=>(i._sqlite3_changes=m.sqlite3_changes)(e),i._sqlite3_total_changes64=e=>(i._sqlite3_total_changes64=m.sqlite3_total_changes64)(e),i._sqlite3_total_changes=e=>(i._sqlite3_total_changes=m.sqlite3_total_changes)(e),i._sqlite3_txn_state=(e,t)=>(i._sqlite3_txn_state=m.sqlite3_txn_state)(e,t),i._sqlite3_close_v2=e=>(i._sqlite3_close_v2=m.sqlite3_close_v2)(e),i._sqlite3_busy_handler=(e,t,n)=>(i._sqlite3_busy_handler=m.sqlite3_busy_handler)(e,t,n),i._sqlite3_progress_handler=(e,t,n,r)=>(i._sqlite3_progress_handler=m.sqlite3_progress_handler)(e,t,n,r),i._sqlite3_busy_timeout=(e,t)=>(i._sqlite3_busy_timeout=m.sqlite3_busy_timeout)(e,t),i._sqlite3_interrupt=e=>(i._sqlite3_interrupt=m.sqlite3_interrupt)(e),i._sqlite3_is_interrupted=e=>(i._sqlite3_is_interrupted=m.sqlite3_is_interrupted)(e),i._sqlite3_create_function=(e,t,n,r,s,o,p,g)=>(i._sqlite3_create_function=m.sqlite3_create_function)(e,t,n,r,s,o,p,g),i._sqlite3_create_function_v2=(e,t,n,r,s,o,p,g,P)=>(i._sqlite3_create_function_v2=m.sqlite3_create_function_v2)(e,t,n,r,s,o,p,g,P),i._sqlite3_create_window_function=(e,t,n,r,s,o,p,g,P,R)=>(i._sqlite3_create_window_function=m.sqlite3_create_window_function)(e,t,n,r,s,o,p,g,P,R),i._sqlite3_overload_function=(e,t,n)=>(i._sqlite3_overload_function=m.sqlite3_overload_function)(e,t,n),i._sqlite3_trace_v2=(e,t,n,r)=>(i._sqlite3_trace_v2=m.sqlite3_trace_v2)(e,t,n,r),i._sqlite3_commit_hook=(e,t,n)=>(i._sqlite3_commit_hook=m.sqlite3_commit_hook)(e,t,n),i._sqlite3_update_hook=(e,t,n)=>(i._sqlite3_update_hook=m.sqlite3_update_hook)(e,t,n),i._sqlite3_rollback_hook=(e,t,n)=>(i._sqlite3_rollback_hook=m.sqlite3_rollback_hook)(e,t,n),i._sqlite3_preupdate_hook=(e,t,n)=>(i._sqlite3_preupdate_hook=m.sqlite3_preupdate_hook)(e,t,n),i._sqlite3_error_offset=e=>(i._sqlite3_error_offset=m.sqlite3_error_offset)(e),i._sqlite3_errcode=e=>(i._sqlite3_errcode=m.sqlite3_errcode)(e),i._sqlite3_extended_errcode=e=>(i._sqlite3_extended_errcode=m.sqlite3_extended_errcode)(e),i._sqlite3_errstr=e=>(i._sqlite3_errstr=m.sqlite3_errstr)(e),i._sqlite3_limit=(e,t,n)=>(i._sqlite3_limit=m.sqlite3_limit)(e,t,n),i._sqlite3_open=(e,t)=>(i._sqlite3_open=m.sqlite3_open)(e,t),i._sqlite3_open_v2=(e,t,n,r)=>(i._sqlite3_open_v2=m.sqlite3_open_v2)(e,t,n,r),i._sqlite3_create_collation=(e,t,n,r,s)=>(i._sqlite3_create_collation=m.sqlite3_create_collation)(e,t,n,r,s),i._sqlite3_create_collation_v2=(e,t,n,r,s,o)=>(i._sqlite3_create_collation_v2=m.sqlite3_create_collation_v2)(e,t,n,r,s,o),i._sqlite3_collation_needed=(e,t,n)=>(i._sqlite3_collation_needed=m.sqlite3_collation_needed)(e,t,n),i._sqlite3_get_autocommit=e=>(i._sqlite3_get_autocommit=m.sqlite3_get_autocommit)(e),i._sqlite3_table_column_metadata=(e,t,n,r,s,o,p,g,P)=>(i._sqlite3_table_column_metadata=m.sqlite3_table_column_metadata)(e,t,n,r,s,o,p,g,P),i._sqlite3_extended_result_codes=(e,t)=>(i._sqlite3_extended_result_codes=m.sqlite3_extended_result_codes)(e,t),i._sqlite3_uri_key=(e,t)=>(i._sqlite3_uri_key=m.sqlite3_uri_key)(e,t),i._sqlite3_uri_int64=(e,t,n)=>(i._sqlite3_uri_int64=m.sqlite3_uri_int64)(e,t,n),i._sqlite3_db_name=(e,t)=>(i._sqlite3_db_name=m.sqlite3_db_name)(e,t),i._sqlite3_db_filename=(e,t)=>(i._sqlite3_db_filename=m.sqlite3_db_filename)(e,t),i._sqlite3_db_readonly=(e,t)=>(i._sqlite3_db_readonly=m.sqlite3_db_readonly)(e,t),i._sqlite3_compileoption_used=e=>(i._sqlite3_compileoption_used=m.sqlite3_compileoption_used)(e),i._sqlite3_compileoption_get=e=>(i._sqlite3_compileoption_get=m.sqlite3_compileoption_get)(e),i._sqlite3session_diff=(e,t,n,r)=>(i._sqlite3session_diff=m.sqlite3session_diff)(e,t,n,r),i._sqlite3session_attach=(e,t)=>(i._sqlite3session_attach=m.sqlite3session_attach)(e,t),i._sqlite3session_create=(e,t,n)=>(i._sqlite3session_create=m.sqlite3session_create)(e,t,n),i._sqlite3session_delete=e=>(i._sqlite3session_delete=m.sqlite3session_delete)(e),i._sqlite3session_table_filter=(e,t,n)=>(i._sqlite3session_table_filter=m.sqlite3session_table_filter)(e,t,n),i._sqlite3session_changeset=(e,t,n)=>(i._sqlite3session_changeset=m.sqlite3session_changeset)(e,t,n),i._sqlite3session_changeset_strm=(e,t,n)=>(i._sqlite3session_changeset_strm=m.sqlite3session_changeset_strm)(e,t,n),i._sqlite3session_patchset_strm=(e,t,n)=>(i._sqlite3session_patchset_strm=m.sqlite3session_patchset_strm)(e,t,n),i._sqlite3session_patchset=(e,t,n)=>(i._sqlite3session_patchset=m.sqlite3session_patchset)(e,t,n),i._sqlite3session_enable=(e,t)=>(i._sqlite3session_enable=m.sqlite3session_enable)(e,t),i._sqlite3session_indirect=(e,t)=>(i._sqlite3session_indirect=m.sqlite3session_indirect)(e,t),i._sqlite3session_isempty=e=>(i._sqlite3session_isempty=m.sqlite3session_isempty)(e),i._sqlite3session_memory_used=e=>(i._sqlite3session_memory_used=m.sqlite3session_memory_used)(e),i._sqlite3session_object_config=(e,t,n)=>(i._sqlite3session_object_config=m.sqlite3session_object_config)(e,t,n),i._sqlite3session_changeset_size=e=>(i._sqlite3session_changeset_size=m.sqlite3session_changeset_size)(e),i._sqlite3changeset_start=(e,t,n)=>(i._sqlite3changeset_start=m.sqlite3changeset_start)(e,t,n),i._sqlite3changeset_start_v2=(e,t,n,r)=>(i._sqlite3changeset_start_v2=m.sqlite3changeset_start_v2)(e,t,n,r),i._sqlite3changeset_start_strm=(e,t,n)=>(i._sqlite3changeset_start_strm=m.sqlite3changeset_start_strm)(e,t,n),i._sqlite3changeset_start_v2_strm=(e,t,n,r)=>(i._sqlite3changeset_start_v2_strm=m.sqlite3changeset_start_v2_strm)(e,t,n,r),i._sqlite3changeset_next=e=>(i._sqlite3changeset_next=m.sqlite3changeset_next)(e),i._sqlite3changeset_op=(e,t,n,r,s)=>(i._sqlite3changeset_op=m.sqlite3changeset_op)(e,t,n,r,s),i._sqlite3changeset_pk=(e,t,n)=>(i._sqlite3changeset_pk=m.sqlite3changeset_pk)(e,t,n),i._sqlite3changeset_old=(e,t,n)=>(i._sqlite3changeset_old=m.sqlite3changeset_old)(e,t,n),i._sqlite3changeset_new=(e,t,n)=>(i._sqlite3changeset_new=m.sqlite3changeset_new)(e,t,n),i._sqlite3changeset_conflict=(e,t,n)=>(i._sqlite3changeset_conflict=m.sqlite3changeset_conflict)(e,t,n),i._sqlite3changeset_fk_conflicts=(e,t)=>(i._sqlite3changeset_fk_conflicts=m.sqlite3changeset_fk_conflicts)(e,t),i._sqlite3changeset_finalize=e=>(i._sqlite3changeset_finalize=m.sqlite3changeset_finalize)(e),i._sqlite3changeset_invert=(e,t,n,r)=>(i._sqlite3changeset_invert=m.sqlite3changeset_invert)(e,t,n,r),i._sqlite3changeset_invert_strm=(e,t,n,r)=>(i._sqlite3changeset_invert_strm=m.sqlite3changeset_invert_strm)(e,t,n,r),i._sqlite3changeset_apply_v2=(e,t,n,r,s,o,p,g,P)=>(i._sqlite3changeset_apply_v2=m.sqlite3changeset_apply_v2)(e,t,n,r,s,o,p,g,P),i._sqlite3changeset_apply=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply=m.sqlite3changeset_apply)(e,t,n,r,s,o),i._sqlite3changeset_apply_v2_strm=(e,t,n,r,s,o,p,g,P)=>(i._sqlite3changeset_apply_v2_strm=m.sqlite3changeset_apply_v2_strm)(e,t,n,r,s,o,p,g,P),i._sqlite3changeset_apply_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply_strm=m.sqlite3changeset_apply_strm)(e,t,n,r,s,o),i._sqlite3changegroup_new=e=>(i._sqlite3changegroup_new=m.sqlite3changegroup_new)(e),i._sqlite3changegroup_add=(e,t,n)=>(i._sqlite3changegroup_add=m.sqlite3changegroup_add)(e,t,n),i._sqlite3changegroup_output=(e,t,n)=>(i._sqlite3changegroup_output=m.sqlite3changegroup_output)(e,t,n),i._sqlite3changegroup_add_strm=(e,t,n)=>(i._sqlite3changegroup_add_strm=m.sqlite3changegroup_add_strm)(e,t,n),i._sqlite3changegroup_output_strm=(e,t,n)=>(i._sqlite3changegroup_output_strm=m.sqlite3changegroup_output_strm)(e,t,n),i._sqlite3changegroup_delete=e=>(i._sqlite3changegroup_delete=m.sqlite3changegroup_delete)(e),i._sqlite3changeset_concat=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat=m.sqlite3changeset_concat)(e,t,n,r,s,o),i._sqlite3changeset_concat_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat_strm=m.sqlite3changeset_concat_strm)(e,t,n,r,s,o),i._sqlite3session_config=(e,t)=>(i._sqlite3session_config=m.sqlite3session_config)(e,t),i._sqlite3_sourceid=()=>(i._sqlite3_sourceid=m.sqlite3_sourceid)(),i._sqlite3__wasm_pstack_ptr=()=>(i._sqlite3__wasm_pstack_ptr=m.sqlite3__wasm_pstack_ptr)(),i._sqlite3__wasm_pstack_restore=e=>(i._sqlite3__wasm_pstack_restore=m.sqlite3__wasm_pstack_restore)(e),i._sqlite3__wasm_pstack_alloc=e=>(i._sqlite3__wasm_pstack_alloc=m.sqlite3__wasm_pstack_alloc)(e),i._sqlite3__wasm_pstack_remaining=()=>(i._sqlite3__wasm_pstack_remaining=m.sqlite3__wasm_pstack_remaining)(),i._sqlite3__wasm_pstack_quota=()=>(i._sqlite3__wasm_pstack_quota=m.sqlite3__wasm_pstack_quota)(),i._sqlite3__wasm_db_error=(e,t,n)=>(i._sqlite3__wasm_db_error=m.sqlite3__wasm_db_error)(e,t,n),i._sqlite3__wasm_test_struct=e=>(i._sqlite3__wasm_test_struct=m.sqlite3__wasm_test_struct)(e),i._sqlite3__wasm_enum_json=()=>(i._sqlite3__wasm_enum_json=m.sqlite3__wasm_enum_json)(),i._sqlite3__wasm_vfs_unlink=(e,t)=>(i._sqlite3__wasm_vfs_unlink=m.sqlite3__wasm_vfs_unlink)(e,t),i._sqlite3__wasm_db_vfs=(e,t)=>(i._sqlite3__wasm_db_vfs=m.sqlite3__wasm_db_vfs)(e,t),i._sqlite3__wasm_db_reset=e=>(i._sqlite3__wasm_db_reset=m.sqlite3__wasm_db_reset)(e),i._sqlite3__wasm_db_export_chunked=(e,t)=>(i._sqlite3__wasm_db_export_chunked=m.sqlite3__wasm_db_export_chunked)(e,t),i._sqlite3__wasm_db_serialize=(e,t,n,r,s)=>(i._sqlite3__wasm_db_serialize=m.sqlite3__wasm_db_serialize)(e,t,n,r,s),i._sqlite3__wasm_vfs_create_file=(e,t,n,r)=>(i._sqlite3__wasm_vfs_create_file=m.sqlite3__wasm_vfs_create_file)(e,t,n,r),i._sqlite3__wasm_posix_create_file=(e,t,n)=>(i._sqlite3__wasm_posix_create_file=m.sqlite3__wasm_posix_create_file)(e,t,n),i._sqlite3__wasm_kvvfsMakeKeyOnPstack=(e,t)=>(i._sqlite3__wasm_kvvfsMakeKeyOnPstack=m.sqlite3__wasm_kvvfsMakeKeyOnPstack)(e,t),i._sqlite3__wasm_kvvfs_methods=()=>(i._sqlite3__wasm_kvvfs_methods=m.sqlite3__wasm_kvvfs_methods)(),i._sqlite3__wasm_vtab_config=(e,t,n)=>(i._sqlite3__wasm_vtab_config=m.sqlite3__wasm_vtab_config)(e,t,n),i._sqlite3__wasm_db_config_ip=(e,t,n,r)=>(i._sqlite3__wasm_db_config_ip=m.sqlite3__wasm_db_config_ip)(e,t,n,r),i._sqlite3__wasm_db_config_pii=(e,t,n,r,s)=>(i._sqlite3__wasm_db_config_pii=m.sqlite3__wasm_db_config_pii)(e,t,n,r,s),i._sqlite3__wasm_db_config_s=(e,t,n)=>(i._sqlite3__wasm_db_config_s=m.sqlite3__wasm_db_config_s)(e,t,n),i._sqlite3__wasm_config_i=(e,t)=>(i._sqlite3__wasm_config_i=m.sqlite3__wasm_config_i)(e,t),i._sqlite3__wasm_config_ii=(e,t,n)=>(i._sqlite3__wasm_config_ii=m.sqlite3__wasm_config_ii)(e,t,n),i._sqlite3__wasm_config_j=(e,t)=>(i._sqlite3__wasm_config_j=m.sqlite3__wasm_config_j)(e,t),i._sqlite3__wasm_qfmt_token=(e,t)=>(i._sqlite3__wasm_qfmt_token=m.sqlite3__wasm_qfmt_token)(e,t),i._sqlite3__wasm_init_wasmfs=e=>(i._sqlite3__wasm_init_wasmfs=m.sqlite3__wasm_init_wasmfs)(e),i._sqlite3__wasm_test_intptr=e=>(i._sqlite3__wasm_test_intptr=m.sqlite3__wasm_test_intptr)(e),i._sqlite3__wasm_test_voidptr=e=>(i._sqlite3__wasm_test_voidptr=m.sqlite3__wasm_test_voidptr)(e),i._sqlite3__wasm_test_int64_max=()=>(i._sqlite3__wasm_test_int64_max=m.sqlite3__wasm_test_int64_max)(),i._sqlite3__wasm_test_int64_min=()=>(i._sqlite3__wasm_test_int64_min=m.sqlite3__wasm_test_int64_min)(),i._sqlite3__wasm_test_int64_times2=e=>(i._sqlite3__wasm_test_int64_times2=m.sqlite3__wasm_test_int64_times2)(e),i._sqlite3__wasm_test_int64_minmax=(e,t)=>(i._sqlite3__wasm_test_int64_minmax=m.sqlite3__wasm_test_int64_minmax)(e,t),i._sqlite3__wasm_test_int64ptr=e=>(i._sqlite3__wasm_test_int64ptr=m.sqlite3__wasm_test_int64ptr)(e),i._sqlite3__wasm_test_stack_overflow=e=>(i._sqlite3__wasm_test_stack_overflow=m.sqlite3__wasm_test_stack_overflow)(e),i._sqlite3__wasm_test_str_hello=e=>(i._sqlite3__wasm_test_str_hello=m.sqlite3__wasm_test_str_hello)(e),i._sqlite3__wasm_SQLTester_strglob=(e,t)=>(i._sqlite3__wasm_SQLTester_strglob=m.sqlite3__wasm_SQLTester_strglob)(e,t),i._malloc=e=>(i._malloc=m.malloc)(e),i._free=e=>(i._free=m.free)(e),i._realloc=(e,t)=>(i._realloc=m.realloc)(e,t);var At=(e,t)=>(At=m.emscripten_builtin_memalign)(e,t);i.wasmMemory=Ce;var tt,It;Ge=function e(){tt||kt(),tt||(Ge=e)};function kt(){if(De>0||!It&&(It=1,Ot(),De>0))return;function e(){tt||(tt=1,i.calledRun=1,!ut&&(Lt(),ye(i),i.onRuntimeInitialized?.(),Ct()))}i.setStatus?(i.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>i.setStatus(""),1),e()},1)):e()}if(i.preInit)for(typeof i.preInit=="function"&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return kt(),i.runSQLite3PostLoadInit=function(e){if(globalThis.sqlite3ApiBootstrap=function t(n=globalThis.sqlite3ApiConfig||t.defaultConfig){if(t.sqlite3)return(t.sqlite3.config||console).warn("sqlite3ApiBootstrap() called multiple times.","Config and external initializers are ignored on calls after the first."),t.sqlite3;const r=Object.assign(Object.create(null),{exports:void 0,memory:void 0,bigIntEnabled:typeof i<"u"&&i.HEAPU64?!0:!!globalThis.BigInt64Array,debug:console.debug.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),log:console.log.bind(console),wasmfsOpfsDir:"/opfs",useStdAlloc:!1},n||{});Object.assign(r,{allocExportName:r.useStdAlloc?"malloc":"sqlite3_malloc",deallocExportName:r.useStdAlloc?"free":"sqlite3_free",reallocExportName:r.useStdAlloc?"realloc":"sqlite3_realloc"},r),["exports","memory","wasmfsOpfsDir"].forEach(l=>{typeof r[l]=="function"&&(r[l]=r[l]())}),delete globalThis.sqlite3ApiConfig,delete t.defaultConfig;const s=Object.create(null),o=Object.create(null),p=l=>s.sqlite3_js_rc_str&&s.sqlite3_js_rc_str(l)||"Unknown result code #"+l,g=l=>typeof l=="number"&&l===(l|0);class P extends Error{constructor(..._){let u;if(_.length)if(g(_[0]))if(u=_[0],_.length===1)super(p(_[0]));else{const I=p(u);typeof _[1]=="object"?super(I,_[1]):(_[0]=I+":",super(_.join(" ")))}else _.length===2&&typeof _[1]=="object"?super(..._):super(_.join(" "));this.resultCode=u||s.SQLITE_ERROR,this.name="SQLite3Error"}}P.toss=(...l)=>{throw new P(...l)};const R=P.toss;r.wasmfsOpfsDir&&!/^\/[^/]+$/.test(r.wasmfsOpfsDir)&&R("config.wasmfsOpfsDir must be falsy or in the form '/dir-name'.");const z=l=>typeof l!="bigint"&&l===(l|0)&&l<=2147483647&&l>=-2147483648,Q=function l(_){return l._max||(l._max=BigInt("0x7fffffffffffffff"),l._min=~l._max),_>=l._min&&_<=l._max},T=l=>l>=-0x7fffffffn-1n&&l<=0x7fffffffn,A=function l(_){return l._min||(l._min=Number.MIN_SAFE_INTEGER,l._max=Number.MAX_SAFE_INTEGER),_>=l._min&&_<=l._max},D=l=>l&&l.constructor&&z(l.constructor.BYTES_PER_ELEMENT)?l:!1,q=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,w=l=>l.buffer instanceof q,x=(l,_,u)=>w(l)?l.slice(_,u):l.subarray(_,u),N=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),O=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),S=l=>N(l)||R("Value is not of a supported TypedArray type."),L=new TextDecoder("utf-8"),$=function(l,_,u){return L.decode(x(l,_,u))},c=function(l){return O(l)?$(l instanceof ArrayBuffer?new Uint8Array(l):l):Array.isArray(l)?l.join(""):(o.isPtr(l)&&(l=o.cstrToJs(l)),l)};class d extends Error{constructor(..._){_.length===2&&typeof _[1]=="object"?super(..._):_.length?super(_.join(" ")):super("Allocation failed."),this.resultCode=s.SQLITE_NOMEM,this.name="WasmAllocError"}}d.toss=(...l)=>{throw new d(...l)},Object.assign(s,{sqlite3_bind_blob:void 0,sqlite3_bind_text:void 0,sqlite3_create_function_v2:(l,_,u,I,U,ee,ne,se,ie)=>{},sqlite3_create_function:(l,_,u,I,U,ee,ne,se)=>{},sqlite3_create_window_function:(l,_,u,I,U,ee,ne,se,ie,j)=>{},sqlite3_prepare_v3:(l,_,u,I,U,ee)=>{},sqlite3_prepare_v2:(l,_,u,I,U)=>{},sqlite3_exec:(l,_,u,I,U)=>{},sqlite3_randomness:(l,_)=>{}});const y={affirmBindableTypedArray:S,flexibleString:c,bigIntFits32:T,bigIntFits64:Q,bigIntFitsDouble:A,isBindableTypedArray:N,isInt32:z,isSQLableTypedArray:O,isTypedArray:D,typedArrayToString:$,isUIThread:()=>globalThis.window===globalThis&&!!globalThis.document,isSharedTypedArray:w,toss:function(...l){throw new Error(l.join(" "))},toss3:R,typedArrayPart:x,affirmDbHeader:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _="SQLite format 3";_.length>l.byteLength&&R("Input does not contain an SQLite3 database header.");for(let u=0;u<_.length;++u)_.charCodeAt(u)!==l[u]&&R("Input does not contain an SQLite3 database header.")},affirmIsDb:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _=l.byteLength;(_<512||_%512!==0)&&R("Byte array size",_,"is invalid for an SQLite3 db."),y.affirmDbHeader(l)}};Object.assign(o,{ptrSizeof:r.wasmPtrSizeof||4,ptrIR:r.wasmPtrIR||"i32",bigIntEnabled:!!r.bigIntEnabled,exports:r.exports||R("Missing API config.exports (WASM module exports)."),memory:r.memory||r.exports.memory||R("API config object requires a WebAssembly.Memory object","in either config.exports.memory (exported)","or config.memory (imported)."),alloc:void 0,realloc:void 0,dealloc:void 0}),o.allocFromTypedArray=function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l)),S(l);const _=o.alloc(l.byteLength||1);return o.heapForSize(l.constructor).set(l.byteLength?l:[0],_),_};{const l=r.allocExportName,_=r.deallocExportName,u=r.reallocExportName;for(const I of[l,_,u])o.exports[I]instanceof Function||R("Missing required exports[",I,"] function.");o.alloc=function I(U){return I.impl(U)||d.toss("Failed to allocate",U," bytes.")},o.alloc.impl=o.exports[l],o.realloc=function I(U,ee){const ne=I.impl(U,ee);return ee?ne||d.toss("Failed to reallocate",ee," bytes."):0},o.realloc.impl=o.exports[u],o.dealloc=o.exports[_]}o.compileOptionUsed=function l(_){if(arguments.length){if(Array.isArray(_)){const u={};return _.forEach(I=>{u[I]=s.sqlite3_compileoption_used(I)}),u}else if(typeof _=="object")return Object.keys(_).forEach(u=>{_[u]=s.sqlite3_compileoption_used(u)}),_}else{if(l._result)return l._result;l._opt||(l._rx=/^([^=]+)=(.+)/,l._rxInt=/^-?\d+$/,l._opt=function(ne,se){const ie=l._rx.exec(ne);se[0]=ie?ie[1]:ne,se[1]=ie?l._rxInt.test(ie[2])?+ie[2]:ie[2]:!0});const u={},I=[0,0];let U=0,ee;for(;ee=s.sqlite3_compileoption_get(U++);)l._opt(ee,I),u[I[0]]=I[1];return l._result=u}return typeof _=="string"?!!s.sqlite3_compileoption_used(_):!1},o.pstack=Object.assign(Object.create(null),{restore:o.exports.sqlite3__wasm_pstack_restore,alloc:function(l){return typeof l=="string"&&!(l=o.sizeofIR(l))&&d.toss("Invalid value for pstack.alloc(",arguments[0],")"),o.exports.sqlite3__wasm_pstack_alloc(l)||d.toss("Could not allocate",l,"bytes from the pstack.")},allocChunks:function(l,_){typeof _=="string"&&!(_=o.sizeofIR(_))&&d.toss("Invalid size value for allocChunks(",arguments[1],")");const u=o.pstack.alloc(l*_),I=[];let U=0,ee=0;for(;Ul===1?o.pstack.alloc(_?8:o.ptrSizeof):o.pstack.allocChunks(l,_?8:o.ptrSizeof),call:function(l){const _=o.pstack.pointer;try{return l(h)}finally{o.pstack.restore(_)}}}),Object.defineProperties(o.pstack,{pointer:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_ptr},quota:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_quota},remaining:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_remaining}}),s.sqlite3_randomness=(...l)=>{if(l.length===1&&y.isTypedArray(l[0])&&l[0].BYTES_PER_ELEMENT===1){const _=l[0];if(_.byteLength===0)return o.exports.sqlite3_randomness(0,0),_;const u=o.pstack.pointer;try{let I=_.byteLength,U=0;const ee=o.exports.sqlite3_randomness,ne=o.heap8u(),se=I<512?I:512,ie=o.pstack.alloc(se);do{const j=I>se?se:I;ee(j,ie),_.set(x(ne,ie,ie+j),U),I-=j,U+=j}while(I>0)}catch(I){console.error("Highly unexpected (and ignored!) exception in sqlite3_randomness():",I)}finally{o.pstack.restore(u)}return _}o.exports.sqlite3_randomness(...l)};let B;if(s.sqlite3_wasmfs_opfs_dir=function(){if(B!==void 0)return B;const l=r.wasmfsOpfsDir;if(!l||!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle)return B="";try{return l&&o.xCallWrapped("sqlite3__wasm_init_wasmfs","i32",["string"],l)===0?B=l:B=""}catch{return B=""}},s.sqlite3_wasmfs_filename_is_persistent=function(l){const _=s.sqlite3_wasmfs_opfs_dir();return _&&l?l.startsWith(_+"/"):!1},s.sqlite3_js_db_uses_vfs=function(l,_,u=0){try{const I=s.sqlite3_vfs_find(_);return I?l?I===s.sqlite3_js_db_vfs(l,u)?I:!1:I===s.sqlite3_vfs_find(0)?I:!1:!1}catch{return!1}},s.sqlite3_js_vfs_list=function(){const l=[];let _=s.sqlite3_vfs_find(0);for(;_;){const u=new s.sqlite3_vfs(_);l.push(o.cstrToJs(u.$zName)),_=u.$pNext,u.dispose()}return l},s.sqlite3_js_db_export=function(l,_=0){l=o.xWrap.testConvertArg("sqlite3*",l),l||R("Invalid sqlite3* argument."),o.bigIntEnabled||R("BigInt64 support is not enabled.");const u=o.scopedAllocPush();let I;try{const U=o.scopedAlloc(8+o.ptrSizeof),ee=U+8,ne=_?o.isPtr(_)?_:o.scopedAllocCString(""+_):0;let se=o.exports.sqlite3__wasm_db_serialize(l,ne,ee,U,0);se&&R("Database serialization failed with code",h.capi.sqlite3_js_rc_str(se)),I=o.peekPtr(ee);const ie=o.peek(U,"i64");return se=ie?o.heap8u().slice(I,I+Number(ie)):new Uint8Array,se}finally{I&&o.exports.sqlite3_free(I),o.scopedAllocPop(u)}},s.sqlite3_js_db_vfs=(l,_=0)=>y.sqlite3__wasm_db_vfs(l,_),s.sqlite3_js_aggregate_context=(l,_)=>s.sqlite3_aggregate_context(l,_)||(_?d.toss("Cannot allocate",_,"bytes for sqlite3_aggregate_context()"):0),s.sqlite3_js_posix_create_file=function(l,_,u){let I;_&&o.isPtr(_)?I=_:_ instanceof ArrayBuffer||_ instanceof Uint8Array?(I=o.allocFromTypedArray(_),(arguments.length<3||!y.isInt32(u)||u<0)&&(u=_.byteLength)):P.toss("Invalid 2nd argument for sqlite3_js_posix_create_file().");try{(!y.isInt32(u)||u<0)&&P.toss("Invalid 3rd argument for sqlite3_js_posix_create_file().");const U=y.sqlite3__wasm_posix_create_file(l,I,u);U&&P.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(U))}finally{o.dealloc(I)}},s.sqlite3_js_vfs_create_file=function(l,_,u,I){r.warn("sqlite3_js_vfs_create_file() is deprecated and","should be avoided because it can lead to C-level crashes.","See its documentation for alternative options.");let U;u?(o.isPtr(u)?U=u:u instanceof ArrayBuffer&&(u=new Uint8Array(u)),u instanceof Uint8Array?(U=o.allocFromTypedArray(u),(arguments.length<4||!y.isInt32(I)||I<0)&&(I=u.byteLength)):P.toss("Invalid 3rd argument type for sqlite3_js_vfs_create_file().")):U=0,(!y.isInt32(I)||I<0)&&(o.dealloc(U),P.toss("Invalid 4th argument for sqlite3_js_vfs_create_file()."));try{const ee=y.sqlite3__wasm_vfs_create_file(l,_,U,I);ee&&P.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(ee))}finally{o.dealloc(U)}},s.sqlite3_js_sql_to_string=l=>{if(typeof l=="string")return l;const _=c(v);return _===v?void 0:_},y.isUIThread()){const l=function(_){const u=Object.create(null);return u.prefix="kvvfs-"+_,u.stores=[],(_==="session"||_==="")&&u.stores.push(globalThis.sessionStorage),(_==="local"||_==="")&&u.stores.push(globalThis.localStorage),u};s.sqlite3_js_kvvfs_clear=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{const ee=[];let ne;for(ne=0;neU.removeItem(se)),u+=ee.length}),u},s.sqlite3_js_kvvfs_size=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{let ee;for(ee=0;eef(l,_,"sqlite3_preupdate_new"),s.sqlite3_preupdate_old_js=(l,_)=>f(l,_,"sqlite3_preupdate_old"),s.sqlite3changeset_new_js=(l,_)=>f(l,_,"sqlite3changeset_new"),s.sqlite3changeset_old_js=(l,_)=>f(l,_,"sqlite3changeset_old");const h={WasmAllocError:d,SQLite3Error:P,capi:s,util:y,wasm:o,config:r,version:Object.create(null),client:void 0,asyncPostInit:async function l(){if(l.isReady instanceof Promise)return l.isReady;let _=t.initializersAsync;delete t.initializersAsync;const u=async()=>(h.__isUnderTest||(delete h.util,delete h.StructBinder),h),I=ee=>{throw r.error("an async sqlite3 initializer failed:",ee),ee};if(!_||!_.length)return l.isReady=u().catch(I);_=_.map(ee=>ee instanceof Function?async ne=>ee(h):ee),_.push(u);let U=Promise.resolve(h);for(;_.length;)U=U.then(_.shift());return l.isReady=U.catch(I)},scriptInfo:void 0};try{t.initializers.forEach(l=>{l(h)})}catch(l){throw console.error("sqlite3 bootstrap initializer threw:",l),l}return delete t.initializers,t.sqlite3=h,h},globalThis.sqlite3ApiBootstrap.initializers=[],globalThis.sqlite3ApiBootstrap.initializersAsync=[],globalThis.sqlite3ApiBootstrap.defaultConfig=Object.create(null),globalThis.sqlite3ApiBootstrap.sqlite3=void 0,globalThis.WhWasmUtilInstaller=function(t){t.bigIntEnabled===void 0&&(t.bigIntEnabled=!!globalThis.BigInt64Array);const n=(...c)=>{throw new Error(c.join(" "))};t.exports||Object.defineProperty(t,"exports",{enumerable:!0,configurable:!0,get:()=>t.instance&&t.instance.exports});const r=t.pointerIR||"i32",s=t.ptrSizeof=r==="i32"?4:r==="i64"?8:n("Unhandled ptrSizeof:",r),o=Object.create(null);o.heapSize=0,o.memory=null,o.freeFuncIndexes=[],o.scopedAlloc=[],o.utf8Decoder=new TextDecoder,o.utf8Encoder=new TextEncoder("utf-8"),t.sizeofIR=c=>{switch(c){case"i8":return 1;case"i16":return 2;case"i32":case"f32":case"float":return 4;case"i64":case"f64":case"double":return 8;case"*":return s;default:return(""+c).endsWith("*")?s:void 0}};const p=function(){if(!o.memory)o.memory=t.memory instanceof WebAssembly.Memory?t.memory:t.exports.memory;else if(o.heapSize===o.memory.buffer.byteLength)return o;const c=o.memory.buffer;return o.HEAP8=new Int8Array(c),o.HEAP8U=new Uint8Array(c),o.HEAP16=new Int16Array(c),o.HEAP16U=new Uint16Array(c),o.HEAP32=new Int32Array(c),o.HEAP32U=new Uint32Array(c),t.bigIntEnabled&&(o.HEAP64=new BigInt64Array(c),o.HEAP64U=new BigUint64Array(c)),o.HEAP32F=new Float32Array(c),o.HEAP64F=new Float64Array(c),o.heapSize=c.byteLength,o};t.heap8=()=>p().HEAP8,t.heap8u=()=>p().HEAP8U,t.heap16=()=>p().HEAP16,t.heap16u=()=>p().HEAP16U,t.heap32=()=>p().HEAP32,t.heap32u=()=>p().HEAP32U,t.heapForSize=function(c,d=!0){const y=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();switch(c){case Int8Array:return y.HEAP8;case Uint8Array:return y.HEAP8U;case Int16Array:return y.HEAP16;case Uint16Array:return y.HEAP16U;case Int32Array:return y.HEAP32;case Uint32Array:return y.HEAP32U;case 8:return d?y.HEAP8U:y.HEAP8;case 16:return d?y.HEAP16U:y.HEAP16;case 32:return d?y.HEAP32U:y.HEAP32;case 64:if(y.HEAP64)return d?y.HEAP64U:y.HEAP64;break;default:if(t.bigIntEnabled){if(c===globalThis.BigUint64Array)return y.HEAP64U;if(c===globalThis.BigInt64Array)return y.HEAP64;break}}n("Invalid heapForSize() size: expecting 8, 16, 32,","or (if BigInt is enabled) 64.")},t.functionTable=function(){return t.exports.__indirect_function_table},t.functionEntry=function(c){const d=t.functionTable();return c>7)},rxJSig:/^(\w)\((\w*)\)$/,sigParams:function(h){const l=c._.rxJSig.exec(h);return l?l[2]:h.substr(1)},letterType:h=>c._.sigTypes[h]||n("Invalid signature letter:",h),pushSigType:(h,l)=>h.push(c._.typeCodes[c._.letterType(l)])}),typeof d=="string"){const h=y;y=d,d=h}const B=c._.sigParams(y),f=[1,96];c._.uleb128Encode(f,"push",B.length);for(const h of B)c._.pushSigType(f,h);return y[0]==="v"?f.push(0):(f.push(1),c._.pushSigType(f,y[0])),c._.uleb128Encode(f,"unshift",f.length),f.unshift(0,97,115,109,1,0,0,0,1),f.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0),new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array(f)),{e:{f:d}}).exports.f};const g=function(d,y,B){if(B&&!o.scopedAlloc.length&&n("No scopedAllocPush() scope is active."),typeof d=="string"){const _=y;y=d,d=_}(typeof y!="string"||!(d instanceof Function))&&n("Invalid arguments: expecting (function,signature) or (signature,function).");const f=t.functionTable(),h=f.length;let l;for(;o.freeFuncIndexes.length&&(l=o.freeFuncIndexes.pop(),f.get(l));){l=null;continue}l||(l=h,f.grow(1));try{return f.set(l,d),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l),l}catch(_){if(!(_ instanceof TypeError))throw l===h&&o.freeFuncIndexes.push(h),_}try{const _=t.jsFuncToWasm(d,y);f.set(l,_),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l)}catch(_){throw l===h&&o.freeFuncIndexes.push(h),_}return l};t.installFunction=(c,d)=>g(c,d,!1),t.scopedInstallFunction=(c,d)=>g(c,d,!0),t.uninstallFunction=function(c){if(!c&&c!==0)return;const d=o.freeFuncIndexes,y=t.functionTable();d.push(c);const B=y.get(c);return y.set(c,null),B},t.peek=function(d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p(),f=Array.isArray(d)?[]:void 0;let h;do{switch(f&&(d=arguments[0].shift()),y){case"i1":case"i8":h=B.HEAP8[d>>0];break;case"i16":h=B.HEAP16[d>>1];break;case"i32":h=B.HEAP32[d>>2];break;case"float":case"f32":h=B.HEAP32F[d>>2];break;case"double":case"f64":h=Number(B.HEAP64F[d>>3]);break;case"i64":if(t.bigIntEnabled){h=BigInt(B.HEAP64[d>>3]);break}default:n("Invalid type for peek():",y)}f&&f.push(h)}while(f&&arguments[0].length);return f||h},t.poke=function(c,d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();for(const f of Array.isArray(c)?c:[c])switch(y){case"i1":case"i8":B.HEAP8[f>>0]=d;continue;case"i16":B.HEAP16[f>>1]=d;continue;case"i32":B.HEAP32[f>>2]=d;continue;case"float":case"f32":B.HEAP32F[f>>2]=d;continue;case"double":case"f64":B.HEAP64F[f>>3]=d;continue;case"i64":if(B.HEAP64){B.HEAP64[f>>3]=BigInt(d);continue}default:n("Invalid type for poke(): "+y)}return this},t.peekPtr=(...c)=>t.peek(c.length===1?c[0]:c,r),t.pokePtr=(c,d=0)=>t.poke(c,d,r),t.peek8=(...c)=>t.peek(c.length===1?c[0]:c,"i8"),t.poke8=(c,d)=>t.poke(c,d,"i8"),t.peek16=(...c)=>t.peek(c.length===1?c[0]:c,"i16"),t.poke16=(c,d)=>t.poke(c,d,"i16"),t.peek32=(...c)=>t.peek(c.length===1?c[0]:c,"i32"),t.poke32=(c,d)=>t.poke(c,d,"i32"),t.peek64=(...c)=>t.peek(c.length===1?c[0]:c,"i64"),t.poke64=(c,d)=>t.poke(c,d,"i64"),t.peek32f=(...c)=>t.peek(c.length===1?c[0]:c,"f32"),t.poke32f=(c,d)=>t.poke(c,d,"f32"),t.peek64f=(...c)=>t.peek(c.length===1?c[0]:c,"f64"),t.poke64f=(c,d)=>t.poke(c,d,"f64"),t.getMemValue=t.peek,t.getPtrValue=t.peekPtr,t.setMemValue=t.poke,t.setPtrValue=t.pokePtr,t.isPtr32=c=>typeof c=="number"&&c===(c|0)&&c>=0,t.isPtr=t.isPtr32,t.cstrlen=function(c){if(!c||!t.isPtr(c))return null;const d=p().HEAP8U;let y=c;for(;d[y]!==0;++y);return y-c};const P=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,R=function(c,d,y){return o.utf8Decoder.decode(c.buffer instanceof P?c.slice(d,y):c.subarray(d,y))};t.cstrToJs=function(c){const d=t.cstrlen(c);return d?R(p().HEAP8U,c,c+d):d===null?d:""},t.jstrlen=function(c){if(typeof c!="string")return null;const d=c.length;let y=0;for(let B=0;B=55296&&f<=57343&&(f=65536+((f&1023)<<10)|c.charCodeAt(++B)&1023),f<=127?++y:f<=2047?y+=2:f<=65535?y+=3:y+=4}return y},t.jstrcpy=function(c,d,y=0,B=-1,f=!0){if((!d||!(d instanceof Int8Array)&&!(d instanceof Uint8Array))&&n("jstrcpy() target must be an Int8Array or Uint8Array."),B<0&&(B=d.length-y),!(B>0)||!(y>=0))return 0;let h=0,l=c.length;const _=y,u=y+B-(f?1:0);for(;h=55296&&I<=57343&&(I=65536+((I&1023)<<10)|c.charCodeAt(++h)&1023),I<=127){if(y>=u)break;d[y++]=I}else if(I<=2047){if(y+1>=u)break;d[y++]=192|I>>6,d[y++]=128|I&63}else if(I<=65535){if(y+2>=u)break;d[y++]=224|I>>12,d[y++]=128|I>>6&63,d[y++]=128|I&63}else{if(y+3>=u)break;d[y++]=240|I>>18,d[y++]=128|I>>12&63,d[y++]=128|I>>6&63,d[y++]=128|I&63}}return f&&(d[y++]=0),y-_},t.cstrncpy=function(c,d,y){if((!c||!d)&&n("cstrncpy() does not accept NULL strings."),y<0)y=t.cstrlen(strPtr)+1;else if(!(y>0))return 0;const B=t.heap8u();let f=0,h;for(;fo.utf8Encoder.encode(d?c+"\0":c);const z=(c,d)=>{(!(c.alloc instanceof Function)||!(c.dealloc instanceof Function))&&n("Object is missing alloc() and/or dealloc() function(s)","required by",d+"().")},Q=function(c,d,y,B){if(z(t,B),typeof c!="string")return null;{const f=o.utf8Encoder.encode(c),h=y(f.length+1),l=p().HEAP8U;return l.set(f,h),l[h+f.length]=0,d?[h,f.length]:h}};t.allocCString=(c,d=!1)=>Q(c,d,t.alloc,"allocCString()"),t.scopedAllocPush=function(){z(t,"scopedAllocPush");const c=[];return o.scopedAlloc.push(c),c},t.scopedAllocPop=function(c){z(t,"scopedAllocPop");const d=arguments.length?o.scopedAlloc.indexOf(c):o.scopedAlloc.length-1;d<0&&n("Invalid state object for scopedAllocPop()."),arguments.length===0&&(c=o.scopedAlloc[d]),o.scopedAlloc.splice(d,1);for(let y;y=c.pop();)t.functionEntry(y)?t.uninstallFunction(y):t.dealloc(y)},t.scopedAlloc=function(c){o.scopedAlloc.length||n("No scopedAllocPush() scope is active.");const d=t.alloc(c);return o.scopedAlloc[o.scopedAlloc.length-1].push(d),d},Object.defineProperty(t.scopedAlloc,"level",{configurable:!1,enumerable:!1,get:()=>o.scopedAlloc.length,set:()=>n("The 'active' property is read-only.")}),t.scopedAllocCString=(c,d=!1)=>Q(c,d,t.scopedAlloc,"scopedAllocCString()");const T=function(c,d){const y=t[c?"scopedAlloc":"alloc"]((d.length+1)*t.ptrSizeof);let B=0;return d.forEach(f=>{t.pokePtr(y+t.ptrSizeof*B++,t[c?"scopedAllocCString":"allocCString"](""+f))}),t.pokePtr(y+t.ptrSizeof*B,0),y};t.scopedAllocMainArgv=c=>T(!0,c),t.allocMainArgv=c=>T(!1,c),t.cArgvToJs=(c,d)=>{const y=[];for(let B=0;BA(c,d,"alloc"),t.scopedAllocPtr=(c=1,d=!0)=>A(c,d,"scopedAlloc"),t.xGet=function(c){return t.exports[c]||n("Cannot find exported symbol:",c)};const D=(c,d)=>n(c+"() requires",d,"argument(s).");t.xCall=function(c,...d){const y=c instanceof Function?c:t.xGet(c);return y instanceof Function||n("Exported symbol",c,"is not a function."),y.length!==d.length&&D(y===c?y.name:c,y.length),arguments.length===2&&Array.isArray(arguments[1])?y.apply(null,arguments[1]):y.apply(null,d)},o.xWrap=Object.create(null),o.xWrap.convert=Object.create(null),o.xWrap.convert.arg=new Map,o.xWrap.convert.result=new Map;const q=o.xWrap.convert.arg,w=o.xWrap.convert.result;t.bigIntEnabled&&q.set("i64",c=>BigInt(c));const x=r==="i32"?c=>c|0:c=>BigInt(c)|BigInt(0);q.set("i32",x).set("i16",c=>(c|0)&65535).set("i8",c=>(c|0)&255).set("f32",c=>Number(c).valueOf()).set("float",q.get("f32")).set("f64",q.get("f32")).set("double",q.get("f64")).set("int",q.get("i32")).set("null",c=>c).set(null,q.get("null")).set("**",x).set("*",x),w.set("*",x).set("pointer",x).set("number",c=>Number(c)).set("void",c=>{}).set("null",c=>c).set(null,w.get("null"));{const c=["i8","i16","i32","int","f32","float","f64","double"];t.bigIntEnabled&&c.push("i64");const d=q.get(r);for(const y of c)q.set(y+"*",d),w.set(y+"*",d),w.set(y,q.get(y)||n("Missing arg converter:",y))}const N=function(c){return typeof c=="string"?t.scopedAllocCString(c):c?x(c):null};q.set("string",N).set("utf8",N).set("pointer",N),w.set("string",c=>t.cstrToJs(c)).set("utf8",w.get("string")).set("string:dealloc",c=>{try{return c?t.cstrToJs(c):null}finally{t.dealloc(c)}}).set("utf8:dealloc",w.get("string:dealloc")).set("json",c=>JSON.parse(t.cstrToJs(c))).set("json:dealloc",c=>{try{return c?JSON.parse(t.cstrToJs(c)):null}finally{t.dealloc(c)}});const O=class{constructor(c){this.name=c.name||"unnamed adapter"}convertArg(c,d,y){n("AbstractArgAdapter must be subclassed.")}};q.FuncPtrAdapter=class Te extends O{constructor(d){super(d),q.FuncPtrAdapter.warnOnUse&&console.warn("xArg.FuncPtrAdapter is an internal-only API","and is not intended to be invoked from","client-level code. Invoked with:",d),this.name=d.name||"unnamed",this.signature=d.signature,d.contextKey instanceof Function&&(this.contextKey=d.contextKey,d.bindScope||(d.bindScope="context")),this.bindScope=d.bindScope||n("FuncPtrAdapter options requires a bindScope (explicit or implied)."),Te.bindScopes.indexOf(d.bindScope)<0&&n("Invalid options.bindScope ("+d.bindMod+") for FuncPtrAdapter. Expecting one of: ("+Te.bindScopes.join(", ")+")"),this.isTransient=this.bindScope==="transient",this.isContext=this.bindScope==="context",this.isPermanent=this.bindScope==="permanent",this.singleton=this.bindScope==="singleton"?[]:void 0,this.callProxy=d.callProxy instanceof Function?d.callProxy:void 0}contextKey(d,y){return this}contextMap(d){const y=this.__cmap||(this.__cmap=new Map);let B=y.get(d);return B===void 0&&y.set(d,B=[]),B}convertArg(d,y,B){let f=this.singleton;if(!f&&this.isContext&&(f=this.contextMap(this.contextKey(y,B))),f&&f[0]===d)return f[1];if(d instanceof Function){this.callProxy&&(d=this.callProxy(d));const h=g(d,this.signature,this.isTransient);if(Te.debugFuncInstall&&Te.debugOut("FuncPtrAdapter installed",this,this.contextKey(y,B),"@"+h,d),f){if(f[1]){Te.debugFuncInstall&&Te.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}}f[0]=d,f[1]=h}return h}else if(t.isPtr(d)||d===null||d===void 0){if(f&&f[1]&&f[1]!==d){Te.debugFuncInstall&&Te.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}f[0]=f[1]=d|0}return d||0}else throw new TypeError("Invalid FuncPtrAdapter argument type. Expecting a function pointer or a "+(this.name?this.name+" ":"")+"function matching signature "+this.signature+".")}},q.FuncPtrAdapter.warnOnUse=!1,q.FuncPtrAdapter.debugFuncInstall=!1,q.FuncPtrAdapter.debugOut=console.debug.bind(console),q.FuncPtrAdapter.bindScopes=["transient","context","singleton","permanent"];const S=c=>q.get(c)||n("Argument adapter not found:",c),L=c=>w.get(c)||n("Result adapter not found:",c);o.xWrap.convertArg=(c,...d)=>S(c)(...d),o.xWrap.convertArgNoCheck=(c,...d)=>q.get(c)(...d),o.xWrap.convertResult=(c,d)=>c===null?d:c?L(c)(d):void 0,o.xWrap.convertResultNoCheck=(c,d)=>c===null?d:c?w.get(c)(d):void 0,t.xWrap=function(c,d,...y){arguments.length===3&&Array.isArray(arguments[2])&&(y=arguments[2]),t.isPtr(c)&&(c=t.functionEntry(c)||n("Function pointer not found in WASM function table."));const B=c instanceof Function,f=B?c:t.xGet(c);if(B&&(c=f.name||"unnamed function"),y.length!==f.length&&D(c,f.length),d===null&&f.length===0)return f;d!=null&&L(d);for(const l of y)l instanceof O?q.set(l,(..._)=>l.convertArg(..._)):S(l);const h=o.xWrap;return f.length===0?(...l)=>l.length?D(c,f.length):h.convertResult(d,f.call(null)):function(...l){l.length!==f.length&&D(c,f.length);const _=t.scopedAllocPush();try{let u=0;for(;ufetch(t.uri,{credentials:"same-origin"}),r=this,s=function(p){if(t.wasmUtilTarget){const g=(...R)=>{throw new Error(R.join(" "))},P=t.wasmUtilTarget;if(P.module=p.module,P.instance=p.instance,P.instance.exports.memory||(P.memory=t.imports&&t.imports.env&&t.imports.env.memory||g("Missing 'memory' object!")),!P.alloc&&p.instance.exports.malloc){const R=p.instance.exports;P.alloc=function(z){return R.malloc(z)||g("Allocation of",z,"bytes failed.")},P.dealloc=function(z){R.free(z)}}r(P)}return t.onload&&t.onload(p,t),p};return WebAssembly.instantiateStreaming?function(){return WebAssembly.instantiateStreaming(n(),t.imports||{}).then(s)}:function(){return n().then(g=>g.arrayBuffer()).then(g=>WebAssembly.instantiate(g,t.imports||{})).then(s)}}).bind(globalThis.WhWasmUtilInstaller),globalThis.Jaccwabyt=function t(n){const r=(...F)=>{throw new Error(F.join(" "))};!(n.heap instanceof WebAssembly.Memory)&&!(n.heap instanceof Function)&&r("config.heap must be WebAssembly.Memory instance or a function."),["alloc","dealloc"].forEach(function(F){n[F]instanceof Function||r("Config option '"+F+"' must be a function.")});const s=t,o=n.heap instanceof Function?n.heap:()=>new Uint8Array(n.heap.buffer),p=n.alloc,g=n.dealloc,P=n.log||console.log.bind(console),R=n.memberPrefix||"",z=n.memberSuffix||"",Q=n.bigIntEnabled===void 0?!!globalThis.BigInt64Array:!!n.bigIntEnabled,T=globalThis.BigInt,A=globalThis.BigInt64Array,D=n.ptrSizeof||4,q=n.ptrIR||"i32";s.debugFlags||(s.__makeDebugFlags=function(F=null){F&&F.__flags&&(F=F.__flags);const V=function K(X){return arguments.length===0?K.__flags:(X<0?(delete K.__flags.getter,delete K.__flags.setter,delete K.__flags.alloc,delete K.__flags.dealloc):(K.__flags.getter=(1&X)!==0,K.__flags.setter=(2&X)!==0,K.__flags.alloc=(4&X)!==0,K.__flags.dealloc=(8&X)!==0),K._flags)};return Object.defineProperty(V,"__flags",{iterable:!1,writable:!1,value:Object.create(F)}),F||V(0),V},s.debugFlags=s.__makeDebugFlags());const w=(function(){const F=new ArrayBuffer(2);return new DataView(F).setInt16(0,256,!0),new Int16Array(F)[0]===256})(),x=F=>F[1]==="(",N=F=>F==="P",O=F=>x(F)?"p":F[0],S=function(F){switch(O(F)){case"c":case"C":return"i8";case"i":return"i32";case"p":case"P":case"s":return q;case"j":return"i64";case"f":return"float";case"d":return"double"}r("Unhandled signature IR:",F)},L=A?()=>!0:()=>r("BigInt64Array is not available."),$=function(F){switch(O(F)){case"p":case"P":case"s":{switch(D){case 4:return"getInt32";case 8:return L()&&"getBigInt64"}break}case"i":return"getInt32";case"c":return"getInt8";case"C":return"getUint8";case"j":return L()&&"getBigInt64";case"f":return"getFloat32";case"d":return"getFloat64"}r("Unhandled DataView getter for signature:",F)},c=function(F){switch(O(F)){case"p":case"P":case"s":{switch(D){case 4:return"setInt32";case 8:return L()&&"setBigInt64"}break}case"i":return"setInt32";case"c":return"setInt8";case"C":return"setUint8";case"j":return L()&&"setBigInt64";case"f":return"setFloat32";case"d":return"setFloat64"}r("Unhandled DataView setter for signature:",F)},d=function(F){switch(O(F)){case"i":case"f":case"c":case"C":case"d":return Number;case"j":return L()&&T;case"p":case"P":case"s":switch(D){case 4:return Number;case 8:return L()&&T}break}r("Unhandled DataView set wrapper for signature:",F)},y=(F,V)=>F+"::"+V,B=function(F,V){return()=>r(y(F,V),"is read-only.")},f=new WeakMap,h="(pointer-is-external)",l=function(F,V,K){if(K||(K=f.get(V)),K){if(f.delete(V),Array.isArray(V.ondispose)){let X;for(;X=V.ondispose.shift();)try{X instanceof Function?X.call(V):X instanceof te?X.dispose():typeof X=="number"&&g(X)}catch(_e){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",_e)}}else if(V.ondispose instanceof Function)try{V.ondispose()}catch(X){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",X)}delete V.ondispose,F.debugFlags.__flags.dealloc&&P("debug.dealloc:",V[h]?"EXTERNAL":"",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),V[h]||g(K)}},_=F=>({configurable:!1,writable:!1,iterable:!1,value:F}),u=function(F,V,K){let X=!K;K?Object.defineProperty(V,h,_(K)):(K=p(F.structInfo.sizeof),K||r("Allocation of",F.structName,"structure failed."));try{F.debugFlags.__flags.alloc&&P("debug.alloc:",X?"":"EXTERNAL",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),X&&o().fill(0,K,K+F.structInfo.sizeof),f.set(V,K)}catch(_e){throw l(F,V,K),_e}},I=function(){const F=this.pointer;return F?new Uint8Array(o().slice(F,F+this.structInfo.sizeof)):null},ee=_(F=>R+F+z),ne=function(F,V,K=!0){let X=F.members[V];if(!X&&(R||z)){for(const _e of Object.values(F.members))if(_e.key===V){X=_e;break}!X&&K&&r(y(F.name,V),"is not a mapped struct member.")}return X},se=function F(V,K,X=!1){F._||(F._=he=>he.replace(/[^vipPsjrdcC]/g,"").replace(/[pPscC]/g,"i"));const _e=ne(V.structInfo,K,!0);return X?F._(_e.signature):_e.signature},ie={configurable:!1,enumerable:!1,get:function(){return f.get(this)},set:()=>r("Cannot assign the 'pointer' property of a struct.")},j=_(function(){const F=[];for(const V of Object.keys(this.structInfo.members))F.push(this.memberKey(V));return F}),b=new TextDecoder("utf-8"),k=new TextEncoder,W=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,H=function(F,V,K){return b.decode(F.buffer instanceof W?F.slice(V,K):F.subarray(V,K))},Z=function(F,V,K=!1){const X=ne(F.structInfo,V,K);return X&&X.signature.length===1&&X.signature[0]==="s"?X:!1},E=function(F){F.signature!=="s"&&r("Invalid member type signature for C-string value:",JSON.stringify(F))},C=function(V,K){const X=ne(V.structInfo,K,!0);E(X);const _e=V[X.key];if(!_e)return null;let he=_e;const de=o();for(;de[he]!==0;++he);return _e===he?"":H(de,_e,he)},M=function(F,...V){F.ondispose?Array.isArray(F.ondispose)||(F.ondispose=[F.ondispose]):F.ondispose=[],F.ondispose.push(...V)},J=function(F){const V=k.encode(F),K=p(V.length+1);K||r("Allocation error while duplicating string:",F);const X=o();return X.set(V,K),X[K+V.length]=0,K},G=function(F,V,K){const X=ne(F.structInfo,V,!0);E(X);const _e=J(K);return F[X.key]=_e,M(F,_e),F},te=function(V,K){arguments[2]!==_&&r("Do not call the StructType constructor","from client-level code."),Object.defineProperties(this,{structName:_(V),structInfo:_(K)})};te.prototype=Object.create(null,{dispose:_(function(){l(this.constructor,this)}),lookupMember:_(function(F,V=!0){return ne(this.structInfo,F,V)}),memberToJsString:_(function(F){return C(this,F)}),memberIsString:_(function(F,V=!0){return Z(this,F,V)}),memberKey:ee,memberKeys:j,memberSignature:_(function(F,V=!1){return se(this,F,V)}),memoryDump:_(I),pointer:ie,setMemberCString:_(function(F,V){return G(this,F,V)})}),Object.assign(te.prototype,{addOnDispose:function(...F){return M(this,...F),this}}),Object.defineProperties(te,{allocCString:_(J),isA:_(F=>F instanceof te),hasExternalPointer:_(F=>F instanceof te&&!!F[h]),memberKey:ee});const le=F=>Number.isFinite(F)||F instanceof(T||Number),Y=function F(V,K,X){if(!F._){F._={getters:{},setters:{},sw:{}};const ve=["i","c","C","p","P","s","f","d","v()"];Q&&ve.push("j"),ve.forEach(function(Se){F._.getters[Se]=$(Se),F._.setters[Se]=c(Se),F._.sw[Se]=d(Se)});const $n=/^[ipPsjfdcC]$/,Kn=/^[vipPsjfdcC]\([ipPsjfdcC]*\)$/;F.sigCheck=function(Se,Jn,Tt,_t){Object.prototype.hasOwnProperty.call(Se,Tt)&&r(Se.structName,"already has a property named",Tt+"."),$n.test(_t)||Kn.test(_t)||r("Malformed signature for",y(Se.structName,Jn)+":",_t)}}const _e=V.memberKey(K);F.sigCheck(V.prototype,K,_e,X.signature),X.key=_e,X.name=K;const he=O(X.signature),de=y(V.prototype.structName,_e),pe=V.prototype.debugFlags.__flags,We=Object.create(null);We.configurable=!1,We.enumerable=!1,We.get=function(){pe.getter&&P("debug.getter:",F._.getters[he],"for",S(he),de,"@",this.pointer,"+",X.offset,"sz",X.sizeof);let ve=new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.getters[he]](0,w);return pe.getter&&P("debug.getter:",de,"result =",ve),ve},X.readOnly?We.set=B(V.prototype.structName,_e):We.set=function(ve){if(pe.setter&&P("debug.setter:",F._.setters[he],"for",S(he),de,"@",this.pointer,"+",X.offset,"sz",X.sizeof,ve),this.pointer||r("Cannot set struct property on disposed instance."),ve===null)ve=0;else for(;!le(ve);){if(N(X.signature)&&ve instanceof te){ve=ve.pointer||0,pe.setter&&P("debug.setter:",de,"resolved to",ve);break}r("Invalid value for pointer-type",de+".")}new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.setters[he]](0,F._.sw[he](ve),w)},Object.defineProperty(V.prototype,_e,We)},be=function F(V,K){arguments.length===1?(K=V,V=K.name):K.name||(K.name=V),V||r("Struct name is required.");let X=!1;Object.keys(K.members).forEach(de=>{const pe=K.members[de];pe.sizeof?pe.sizeof===1?pe.signature==="c"||pe.signature==="C"||r("Unexpected sizeof==1 member",y(K.name,de),"with signature",pe.signature):(pe.sizeof%4!==0&&(console.warn("Invalid struct member description =",pe,"from",K),r(V,"member",de,"sizeof is not aligned. sizeof="+pe.sizeof)),pe.offset%4!==0&&(console.warn("Invalid struct member description =",pe,"from",K),r(V,"member",de,"offset is not aligned. offset="+pe.offset))):r(V,"member",de,"is missing sizeof."),(!X||X.offsetde instanceof he),memberKey:ee,memberKeys:j,methodInfoForKey:_(function(de){}),structInfo:_(K),structName:_(V)}),he.prototype=new te(V,K,_),Object.defineProperties(he.prototype,{debugFlags:_e,constructor:_(he)}),Object.keys(K.members).forEach(de=>Y(he,de,K.members[de])),he};return be.StructType=te,be.config=n,be.allocCString=J,be.debugFlags||(be.debugFlags=s.__makeDebugFlags(s.debugFlags)),be},globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...q)=>{throw new Error(q.join(" "))};t.SQLite3Error.toss;const r=t.capi,s=t.wasm,o=t.util;if(globalThis.WhWasmUtilInstaller(s),delete globalThis.WhWasmUtilInstaller,s.bindingSignatures=[["sqlite3_aggregate_context","void*","sqlite3_context*","int"],["sqlite3_bind_double","int","sqlite3_stmt*","int","f64"],["sqlite3_bind_int","int","sqlite3_stmt*","int","int"],["sqlite3_bind_null",void 0,"sqlite3_stmt*","int"],["sqlite3_bind_parameter_count","int","sqlite3_stmt*"],["sqlite3_bind_parameter_index","int","sqlite3_stmt*","string"],["sqlite3_bind_parameter_name","string","sqlite3_stmt*","int"],["sqlite3_bind_pointer","int","sqlite3_stmt*","int","*","string:static","*"],["sqlite3_busy_handler","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({signature:"i(pi)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_busy_timeout","int","sqlite3*","int"],["sqlite3_changes","int","sqlite3*"],["sqlite3_clear_bindings","int","sqlite3_stmt*"],["sqlite3_collation_needed","int","sqlite3*","*","*"],["sqlite3_column_blob","*","sqlite3_stmt*","int"],["sqlite3_column_bytes","int","sqlite3_stmt*","int"],["sqlite3_column_count","int","sqlite3_stmt*"],["sqlite3_column_decltype","string","sqlite3_stmt*","int"],["sqlite3_column_double","f64","sqlite3_stmt*","int"],["sqlite3_column_int","int","sqlite3_stmt*","int"],["sqlite3_column_name","string","sqlite3_stmt*","int"],["sqlite3_column_text","string","sqlite3_stmt*","int"],["sqlite3_column_type","int","sqlite3_stmt*","int"],["sqlite3_column_value","sqlite3_value*","sqlite3_stmt*","int"],["sqlite3_commit_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_commit_hook",signature:"i(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_compileoption_get","string","int"],["sqlite3_compileoption_used","int","string"],["sqlite3_complete","int","string:flexible"],["sqlite3_context_db_handle","sqlite3*","sqlite3_context*"],["sqlite3_data_count","int","sqlite3_stmt*"],["sqlite3_db_filename","string","sqlite3*","string"],["sqlite3_db_handle","sqlite3*","sqlite3_stmt*"],["sqlite3_db_name","string","sqlite3*","int"],["sqlite3_db_readonly","int","sqlite3*","string"],["sqlite3_db_status","int","sqlite3*","int","*","*","int"],["sqlite3_errcode","int","sqlite3*"],["sqlite3_errmsg","string","sqlite3*"],["sqlite3_error_offset","int","sqlite3*"],["sqlite3_errstr","string","int"],["sqlite3_exec","int",["sqlite3*","string:flexible",new s.xWrap.FuncPtrAdapter({signature:"i(pipp)",bindScope:"transient",callProxy:q=>{let w;return(x,N,O,S)=>{try{const L=s.cArgvToJs(N,O);return w||(w=s.cArgvToJs(N,S)),q(L,w)|0}catch(L){return L.resultCode||r.SQLITE_ERROR}}}}),"*","**"]],["sqlite3_expanded_sql","string","sqlite3_stmt*"],["sqlite3_extended_errcode","int","sqlite3*"],["sqlite3_extended_result_codes","int","sqlite3*","int"],["sqlite3_file_control","int","sqlite3*","string","int","*"],["sqlite3_finalize","int","sqlite3_stmt*"],["sqlite3_free",void 0,"*"],["sqlite3_get_autocommit","int","sqlite3*"],["sqlite3_get_auxdata","*","sqlite3_context*","int"],["sqlite3_initialize",void 0],["sqlite3_interrupt",void 0,"sqlite3*"],["sqlite3_is_interrupted","int","sqlite3*"],["sqlite3_keyword_count","int"],["sqlite3_keyword_name","int",["int","**","*"]],["sqlite3_keyword_check","int",["string","int"]],["sqlite3_libversion","string"],["sqlite3_libversion_number","int"],["sqlite3_limit","int",["sqlite3*","int","int"]],["sqlite3_malloc","*","int"],["sqlite3_open","int","string","*"],["sqlite3_open_v2","int","string","*","int","string"],["sqlite3_realloc","*","*","int"],["sqlite3_reset","int","sqlite3_stmt*"],["sqlite3_result_blob",void 0,"sqlite3_context*","*","int","*"],["sqlite3_result_double",void 0,"sqlite3_context*","f64"],["sqlite3_result_error",void 0,"sqlite3_context*","string","int"],["sqlite3_result_error_code",void 0,"sqlite3_context*","int"],["sqlite3_result_error_nomem",void 0,"sqlite3_context*"],["sqlite3_result_error_toobig",void 0,"sqlite3_context*"],["sqlite3_result_int",void 0,"sqlite3_context*","int"],["sqlite3_result_null",void 0,"sqlite3_context*"],["sqlite3_result_pointer",void 0,"sqlite3_context*","*","string:static","*"],["sqlite3_result_subtype",void 0,"sqlite3_value*","int"],["sqlite3_result_text",void 0,"sqlite3_context*","string","int","*"],["sqlite3_result_zeroblob",void 0,"sqlite3_context*","int"],["sqlite3_rollback_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_rollback_hook",signature:"v(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_set_auxdata",void 0,["sqlite3_context*","int","*","*"]],["sqlite3_shutdown",void 0],["sqlite3_sourceid","string"],["sqlite3_sql","string","sqlite3_stmt*"],["sqlite3_status","int","int","*","*","int"],["sqlite3_step","int","sqlite3_stmt*"],["sqlite3_stmt_busy","int","sqlite3_stmt*"],["sqlite3_stmt_readonly","int","sqlite3_stmt*"],["sqlite3_stmt_status","int","sqlite3_stmt*","int","int"],["sqlite3_strglob","int","string","string"],["sqlite3_stricmp","int","string","string"],["sqlite3_strlike","int","string","string","int"],["sqlite3_strnicmp","int","string","string","int"],["sqlite3_table_column_metadata","int","sqlite3*","string","string","string","**","**","*","*","*"],["sqlite3_total_changes","int","sqlite3*"],["sqlite3_trace_v2","int",["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"sqlite3_trace_v2::callback",signature:"i(ippp)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_txn_state","int",["sqlite3*","string"]],["sqlite3_uri_boolean","int","sqlite3_filename","string","int"],["sqlite3_uri_key","string","sqlite3_filename","int"],["sqlite3_uri_parameter","string","sqlite3_filename","string"],["sqlite3_user_data","void*","sqlite3_context*"],["sqlite3_value_blob","*","sqlite3_value*"],["sqlite3_value_bytes","int","sqlite3_value*"],["sqlite3_value_double","f64","sqlite3_value*"],["sqlite3_value_dup","sqlite3_value*","sqlite3_value*"],["sqlite3_value_free",void 0,"sqlite3_value*"],["sqlite3_value_frombind","int","sqlite3_value*"],["sqlite3_value_int","int","sqlite3_value*"],["sqlite3_value_nochange","int","sqlite3_value*"],["sqlite3_value_numeric_type","int","sqlite3_value*"],["sqlite3_value_pointer","*","sqlite3_value*","string:static"],["sqlite3_value_subtype","int","sqlite3_value*"],["sqlite3_value_text","string","sqlite3_value*"],["sqlite3_value_type","int","sqlite3_value*"],["sqlite3_vfs_find","*","string"],["sqlite3_vfs_register","int","sqlite3_vfs*","int"],["sqlite3_vfs_unregister","int","sqlite3_vfs*"]],s.exports.sqlite3_progress_handler&&s.bindingSignatures.push(["sqlite3_progress_handler",void 0,["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"xProgressHandler",signature:"i(p)",bindScope:"context",contextKey:(q,w)=>q[0]}),"*"]]),s.exports.sqlite3_stmt_explain&&s.bindingSignatures.push(["sqlite3_stmt_explain","int","sqlite3_stmt*","int"],["sqlite3_stmt_isexplain","int","sqlite3_stmt*"]),s.exports.sqlite3_set_authorizer&&s.bindingSignatures.push(["sqlite3_set_authorizer","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_set_authorizer::xAuth",signature:"i(pissss)",contextKey:(q,w)=>q[0],callProxy:q=>(w,x,N,O,S,L)=>{try{return N=N&&s.cstrToJs(N),O=O&&s.cstrToJs(O),S=S&&s.cstrToJs(S),L=L&&s.cstrToJs(L),q(w,x,N,O,S,L)||0}catch($){return $.resultCode||r.SQLITE_ERROR}}}),"*"]]),s.bindingSignatures.int64=[["sqlite3_bind_int64","int",["sqlite3_stmt*","int","i64"]],["sqlite3_changes64","i64",["sqlite3*"]],["sqlite3_column_int64","i64",["sqlite3_stmt*","int"]],["sqlite3_deserialize","int","sqlite3*","string","*","i64","i64","int"],["sqlite3_last_insert_rowid","i64",["sqlite3*"]],["sqlite3_malloc64","*","i64"],["sqlite3_msize","i64","*"],["sqlite3_overload_function","int",["sqlite3*","string","int"]],["sqlite3_realloc64","*","*","i64"],["sqlite3_result_int64",void 0,"*","i64"],["sqlite3_result_zeroblob64","int","*","i64"],["sqlite3_serialize","*","sqlite3*","string","*","int"],["sqlite3_set_last_insert_rowid",void 0,["sqlite3*","i64"]],["sqlite3_status64","int","int","*","*","int"],["sqlite3_total_changes64","i64",["sqlite3*"]],["sqlite3_update_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_update_hook",signature:"v(iippj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,O,S)=>{q(w,x,s.cstrToJs(N),s.cstrToJs(O),S)}}),"*"]],["sqlite3_uri_int64","i64",["sqlite3_filename","string","i64"]],["sqlite3_value_int64","i64","sqlite3_value*"]],s.bigIntEnabled&&s.exports.sqlite3_declare_vtab&&s.bindingSignatures.int64.push(["sqlite3_create_module","int",["sqlite3*","string","sqlite3_module*","*"]],["sqlite3_create_module_v2","int",["sqlite3*","string","sqlite3_module*","*","*"]],["sqlite3_declare_vtab","int",["sqlite3*","string:flexible"]],["sqlite3_drop_modules","int",["sqlite3*","**"]],["sqlite3_vtab_collation","string","sqlite3_index_info*","int"],["sqlite3_vtab_distinct","int","sqlite3_index_info*"],["sqlite3_vtab_in","int","sqlite3_index_info*","int","int"],["sqlite3_vtab_in_first","int","sqlite3_value*","**"],["sqlite3_vtab_in_next","int","sqlite3_value*","**"],["sqlite3_vtab_nochange","int","sqlite3_context*"],["sqlite3_vtab_on_conflict","int","sqlite3*"],["sqlite3_vtab_rhs_value","int","sqlite3_index_info*","int","**"]),s.bigIntEnabled&&s.exports.sqlite3_preupdate_hook&&s.bindingSignatures.int64.push(["sqlite3_preupdate_blobwrite","int","sqlite3*"],["sqlite3_preupdate_count","int","sqlite3*"],["sqlite3_preupdate_depth","int","sqlite3*"],["sqlite3_preupdate_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_preupdate_hook",signature:"v(ppippjj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,O,S,L,$)=>{q(w,x,N,s.cstrToJs(O),s.cstrToJs(S),L,$)}}),"*"]],["sqlite3_preupdate_new","int",["sqlite3*","int","**"]],["sqlite3_preupdate_old","int",["sqlite3*","int","**"]]),s.bigIntEnabled&&s.exports.sqlite3changegroup_add&&s.exports.sqlite3session_create&&s.exports.sqlite3_preupdate_hook){const q={signature:"i(ps)",callProxy:w=>(x,N)=>{try{return w(x,s.cstrToJs(N))|0}catch(O){return O.resultCode||r.SQLITE_ERROR}}};s.bindingSignatures.int64.push(["sqlite3changegroup_add","int",["sqlite3_changegroup*","int","void*"]],["sqlite3changegroup_add_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changegroup_delete",void 0,["sqlite3_changegroup*"]],["sqlite3changegroup_new","int",["**"]],["sqlite3changegroup_output","int",["sqlite3_changegroup*","int*","**"]],["sqlite3changegroup_output_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_v2","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_apply_v2_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_concat","int",["int","void*","int","void*","int*","**"]],["sqlite3changeset_concat_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInputA",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xInputB",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_conflict","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_finalize","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_fk_conflicts","int",["sqlite3_changeset_iter*","int*"]],["sqlite3changeset_invert","int",["int","void*","int*","**"]],["sqlite3changeset_invert_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_new","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_next","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_old","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_op","int",["sqlite3_changeset_iter*","**","int*","int*","int*"]],["sqlite3changeset_pk","int",["sqlite3_changeset_iter*","**","int*"]],["sqlite3changeset_start","int",["**","int","*"]],["sqlite3changeset_start_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changeset_start_v2","int",["**","int","*","int"]],["sqlite3changeset_start_v2_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*","int"]],["sqlite3session_attach","int",["sqlite3_session*","string"]],["sqlite3session_changeset","int",["sqlite3_session*","int*","**"]],["sqlite3session_changeset_size","i64",["sqlite3_session*"]],["sqlite3session_changeset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_config","int",["int","void*"]],["sqlite3session_create","int",["sqlite3*","string","**"]],["sqlite3session_diff","int",["sqlite3_session*","string","string","**"]],["sqlite3session_enable","int",["sqlite3_session*","int"]],["sqlite3session_indirect","int",["sqlite3_session*","int"]],["sqlite3session_isempty","int",["sqlite3_session*"]],["sqlite3session_memory_used","i64",["sqlite3_session*"]],["sqlite3session_object_config","int",["sqlite3_session*","int","void*"]],["sqlite3session_patchset","int",["sqlite3_session*","*","**"]],["sqlite3session_patchset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_table_filter",void 0,["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xFilter",...q,contextKey:(w,x)=>w[0]}),"*"]])}s.bindingSignatures.wasmInternal=[["sqlite3__wasm_db_reset","int","sqlite3*"],["sqlite3__wasm_db_vfs","sqlite3_vfs*","sqlite3*","string"],["sqlite3__wasm_vfs_create_file","int","sqlite3_vfs*","string","*","int"],["sqlite3__wasm_posix_create_file","int","string","*","int"],["sqlite3__wasm_vfs_unlink","int","sqlite3_vfs*","string"],["sqlite3__wasm_qfmt_token","string:dealloc","string","int"]],t.StructBinder=globalThis.Jaccwabyt({heap:s.heap8u,alloc:s.alloc,dealloc:s.dealloc,bigIntEnabled:s.bigIntEnabled,memberPrefix:"$"}),delete globalThis.Jaccwabyt;{const q=s.xWrap.argAdapter("string");s.xWrap.argAdapter("string:flexible",S=>q(o.flexibleString(S))),s.xWrap.argAdapter("string:static",(function(S){return s.isPtr(S)?S:(S=""+S,this[S]||(this[S]=s.allocCString(S)))}).bind(Object.create(null)));const w=s.xWrap.argAdapter("*"),x=function(){};s.xWrap.argAdapter("sqlite3_filename",w)("sqlite3_context*",w)("sqlite3_value*",w)("void*",w)("sqlite3_changegroup*",w)("sqlite3_changeset_iter*",w)("sqlite3_session*",w)("sqlite3_stmt*",S=>w(S instanceof(t?.oo1?.Stmt||x)?S.pointer:S))("sqlite3*",S=>w(S instanceof(t?.oo1?.DB||x)?S.pointer:S))("sqlite3_vfs*",S=>typeof S=="string"?r.sqlite3_vfs_find(S)||t.SQLite3Error.toss(r.SQLITE_NOTFOUND,"Unknown sqlite3_vfs name:",S):w(S instanceof(r.sqlite3_vfs||x)?S.pointer:S)),s.exports.sqlite3_declare_vtab&&s.xWrap.argAdapter("sqlite3_index_info*",S=>w(S instanceof(r.sqlite3_index_info||x)?S.pointer:S))("sqlite3_module*",S=>w(S instanceof(r.sqlite3_module||x)?S.pointer:S));const N=s.xWrap.resultAdapter("*");s.xWrap.resultAdapter("sqlite3*",N)("sqlite3_context*",N)("sqlite3_stmt*",N)("sqlite3_value*",N)("sqlite3_vfs*",N)("void*",N),s.exports.sqlite3_step.length===0&&(s.xWrap.doArgcCheck=!1,t.config.warn("Disabling sqlite3.wasm.xWrap.doArgcCheck due to environmental quirks."));for(const S of s.bindingSignatures)r[S[0]]=s.xWrap.apply(null,S);for(const S of s.bindingSignatures.wasmInternal)o[S[0]]=s.xWrap.apply(null,S);const O=function(S){return()=>n(S+"() is unavailable due to lack","of BigInt support in this build.")};for(const S of s.bindingSignatures.int64)r[S[0]]=s.bigIntEnabled?s.xWrap.apply(null,S):O(S[0]);if(delete s.bindingSignatures,s.exports.sqlite3__wasm_db_error){const S=s.xWrap("sqlite3__wasm_db_error","int","sqlite3*","int","string");o.sqlite3__wasm_db_error=function(L,$,c){return $ instanceof t.WasmAllocError?($=r.SQLITE_NOMEM,c=0):$ instanceof Error&&(c=c||""+$,$=$.resultCode||r.SQLITE_ERROR),L?S(L,$,c):$}}else o.sqlite3__wasm_db_error=function(S,L,$){return console.warn("sqlite3__wasm_db_error() is not exported.",arguments),L}}{const q=s.xCall("sqlite3__wasm_enum_json");q||n("Maintenance required: increase sqlite3__wasm_enum_json()'s","static buffer size!"),s.ctype=JSON.parse(s.cstrToJs(q));const w=["access","authorizer","blobFinalizers","changeset","config","dataTypes","dbConfig","dbStatus","encodings","fcntl","flock","ioCap","limits","openFlags","prepareFlags","resultCodes","sqlite3Status","stmtStatus","syncFlags","trace","txnState","udfFlags","version"];s.bigIntEnabled&&w.push("serialize","session","vtab");for(const O of w)for(const S of Object.entries(s.ctype[O]))r[S[0]]=S[1];s.functionEntry(r.SQLITE_WASM_DEALLOC)||n("Internal error: cannot resolve exported function","entry SQLITE_WASM_DEALLOC (=="+r.SQLITE_WASM_DEALLOC+").");const x=Object.create(null);for(const O of["resultCodes"])for(const S of Object.entries(s.ctype[O]))x[S[1]]=S[0];r.sqlite3_js_rc_str=O=>x[O];const N=Object.assign(Object.create(null),{WasmTestStruct:!0,sqlite3_kvvfs_methods:!o.isUIThread(),sqlite3_index_info:!s.bigIntEnabled,sqlite3_index_constraint:!s.bigIntEnabled,sqlite3_index_orderby:!s.bigIntEnabled,sqlite3_index_constraint_usage:!s.bigIntEnabled});for(const O of s.ctype.structs)N[O.name]||(r[O.name]=t.StructBinder(O));if(r.sqlite3_index_info){for(const O of["sqlite3_index_constraint","sqlite3_index_orderby","sqlite3_index_constraint_usage"])r.sqlite3_index_info[O]=r[O],delete r[O];r.sqlite3_vtab_config=s.xWrap("sqlite3__wasm_vtab_config","int",["sqlite3*","int","int"])}}const p=(q,w,x)=>o.sqlite3__wasm_db_error(q,r.SQLITE_MISUSE,w+"() requires "+x+" argument"+(x===1?"":"s")+"."),g=q=>o.sqlite3__wasm_db_error(q,r.SQLITE_FORMAT,"SQLITE_UTF8 is the only supported encoding."),P=q=>s.xWrap.argAdapter("sqlite3*")(q),R=q=>s.isPtr(q)?s.cstrToJs(q):q,z=(function(q,w){q=P(q);let x=this.dbMap.get(q);if(w)!x&&w>0&&this.dbMap.set(q,x=Object.create(null));else return this.dbMap.delete(q),x;return x}).bind(Object.assign(Object.create(null),{dbMap:new Map}));z.addCollation=function(q,w){const x=z(q,1);x.collation||(x.collation=new Set),x.collation.add(R(w).toLowerCase())},z._addUDF=function(q,w,x,N){w=R(w).toLowerCase();let O=N.get(w);O||N.set(w,O=new Set),O.add(x<0?-1:x)},z.addFunction=function(q,w,x){const N=z(q,1);N.udf||(N.udf=new Map),this._addUDF(q,w,x,N.udf)},s.exports.sqlite3_create_window_function&&(z.addWindowFunc=function(q,w,x){const N=z(q,1);N.wudf||(N.wudf=new Map),this._addUDF(q,w,x,N.wudf)}),z.cleanup=function(q){q=P(q);const w=[q];for(const O of["sqlite3_busy_handler","sqlite3_commit_hook","sqlite3_preupdate_hook","sqlite3_progress_handler","sqlite3_rollback_hook","sqlite3_set_authorizer","sqlite3_trace_v2","sqlite3_update_hook"]){const S=s.exports[O];if(S){w.length=S.length;try{r[O](...w)}catch(L){t.config.warn("close-time call of",O+"(",w,") threw:",L)}}}const x=z(q,0);if(!x)return;if(x.collation){for(const O of x.collation)try{r.sqlite3_create_collation_v2(q,O,r.SQLITE_UTF8,0,0,0)}catch{}delete x.collation}let N;for(N=0;N<2;++N){const O=N?x.wudf:x.udf;if(!O)continue;const S=N?r.sqlite3_create_window_function:r.sqlite3_create_function_v2;for(const L of O){const $=L[0],c=L[1],d=[q,$,0,r.SQLITE_UTF8,0,0,0,0,0];N&&d.push(0);for(const y of c)try{d[2]=y,S.apply(null,d)}catch{}c.clear()}O.clear()}delete x.udf,delete x.wudf};{const q=s.xWrap("sqlite3_close_v2","int","sqlite3*");r.sqlite3_close_v2=function(w){if(arguments.length!==1)return p(w,"sqlite3_close_v2",1);if(w)try{z.cleanup(w)}catch{}return q(w)}}if(r.sqlite3session_create){const q=s.xWrap("sqlite3session_delete",void 0,["sqlite3_session*"]);r.sqlite3session_delete=function(w){if(arguments.length!==1)return p(pDb,"sqlite3session_delete",1);w&&r.sqlite3session_table_filter(w,0,0),q(w)}}{const q=(x,N)=>"argv["+N+"]:"+x[0]+":"+s.cstrToJs(x[1]).toLowerCase(),w=s.xWrap("sqlite3_create_collation_v2","int",["sqlite3*","string","int","*",new s.xWrap.FuncPtrAdapter({name:"xCompare",signature:"i(pipip)",contextKey:q}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",signature:"v(p)",contextKey:q})]);r.sqlite3_create_collation_v2=function(x,N,O,S,L,$){if(arguments.length!==6)return p(x,"sqlite3_create_collation_v2",6);if((O&15)===0)O|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(O&15))return g(x);try{const c=w(x,N,O,S,L,$);return c===0&&L instanceof Function&&z.addCollation(x,N),c}catch(c){return o.sqlite3__wasm_db_error(x,c)}},r.sqlite3_create_collation=(x,N,O,S,L)=>arguments.length===5?r.sqlite3_create_collation_v2(x,N,O,S,L,0):p(x,"sqlite3_create_collation",5)}{const q=function(O,S){return O[0]+":"+(O[2]<0?-1:O[2])+":"+S+":"+s.cstrToJs(O[1]).toLowerCase()},w=Object.assign(Object.create(null),{xInverseAndStep:{signature:"v(pip)",contextKey:q,callProxy:O=>(S,L,$)=>{try{O(S,...r.sqlite3_values_to_js(L,$))}catch(c){r.sqlite3_result_error_js(S,c)}}},xFinalAndValue:{signature:"v(p)",contextKey:q,callProxy:O=>S=>{try{r.sqlite3_result_js(S,O(S))}catch(L){r.sqlite3_result_error_js(S,L)}}},xFunc:{signature:"v(pip)",contextKey:q,callProxy:O=>(S,L,$)=>{try{r.sqlite3_result_js(S,O(S,...r.sqlite3_values_to_js(L,$)))}catch(c){r.sqlite3_result_error_js(S,c)}}},xDestroy:{signature:"v(p)",contextKey:q,callProxy:O=>S=>{try{O(S)}catch(L){console.error("UDF xDestroy method threw:",L)}}}}),x=s.xWrap("sqlite3_create_function_v2","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xFunc",...w.xFunc}),new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]),N=s.exports.sqlite3_create_window_function?s.xWrap("sqlite3_create_window_function","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xValue",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xInverse",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]):void 0;r.sqlite3_create_function_v2=function O(S,L,$,c,d,y,B,f,h){if(O.length!==arguments.length)return p(S,"sqlite3_create_function_v2",O.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const l=x(S,L,$,c,d,y,B,f,h);return l===0&&(y instanceof Function||B instanceof Function||f instanceof Function||h instanceof Function)&&z.addFunction(S,L,$),l}catch(l){return console.error("sqlite3_create_function_v2() setup threw:",l),o.sqlite3__wasm_db_error(S,l,"Creation of UDF threw: "+l)}},r.sqlite3_create_function=function O(S,L,$,c,d,y,B,f){return O.length===arguments.length?r.sqlite3_create_function_v2(S,L,$,c,d,y,B,f,0):p(S,"sqlite3_create_function",O.length)},N?r.sqlite3_create_window_function=function O(S,L,$,c,d,y,B,f,h,l){if(O.length!==arguments.length)return p(S,"sqlite3_create_window_function",O.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const _=N(S,L,$,c,d,y,B,f,h,l);return _===0&&(y instanceof Function||B instanceof Function||f instanceof Function||h instanceof Function||l instanceof Function)&&z.addWindowFunc(S,L,$),_}catch(_){return console.error("sqlite3_create_window_function() setup threw:",_),o.sqlite3__wasm_db_error(S,_,"Creation of UDF threw: "+_)}}:delete r.sqlite3_create_window_function,r.sqlite3_create_function_v2.udfSetResult=r.sqlite3_create_function.udfSetResult=r.sqlite3_result_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetResult=r.sqlite3_result_js),r.sqlite3_create_function_v2.udfConvertArgs=r.sqlite3_create_function.udfConvertArgs=r.sqlite3_values_to_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfConvertArgs=r.sqlite3_values_to_js),r.sqlite3_create_function_v2.udfSetError=r.sqlite3_create_function.udfSetError=r.sqlite3_result_error_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetError=r.sqlite3_result_error_js)}{const q=(x,N)=>(typeof x=="string"?N=-1:o.isSQLableTypedArray(x)?(N=x.byteLength,x=o.typedArrayToString(x instanceof ArrayBuffer?new Uint8Array(x):x)):Array.isArray(x)&&(x=x.join(""),N=-1),[x,N]),w={basic:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","string","int","int","**","**"]),full:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","*","int","int","**","**"])};r.sqlite3_prepare_v3=function x(N,O,S,L,$,c){if(x.length!==arguments.length)return p(N,"sqlite3_prepare_v3",x.length);const[d,y]=q(O,S);switch(typeof d){case"string":return w.basic(N,d,y,L,$,null);case"number":return w.full(N,d,y,L,$,c);default:return o.sqlite3__wasm_db_error(N,r.SQLITE_MISUSE,"Invalid SQL argument type for sqlite3_prepare_v2/v3().")}},r.sqlite3_prepare_v2=function x(N,O,S,L,$){return x.length===arguments.length?r.sqlite3_prepare_v3(N,O,S,0,L,$):p(N,"sqlite3_prepare_v2",x.length)}}{const q=s.xWrap("sqlite3_bind_text","int",["sqlite3_stmt*","int","string","int","*"]),w=s.xWrap("sqlite3_bind_blob","int",["sqlite3_stmt*","int","*","int","*"]);r.sqlite3_bind_text=function x(N,O,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_text",x.length);if(s.isPtr(S)||S===null)return q(N,O,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(pMem)&&(S=pMem.join(""));let c,d;try{if(o.isSQLableTypedArray(S))c=s.allocFromTypedArray(S),d=S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_text().");return q(N,O,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}},r.sqlite3_bind_blob=function x(N,O,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_blob",x.length);if(s.isPtr(S)||S===null)return w(N,O,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(S)&&(S=S.join(""));let c,d;try{if(o.isBindableTypedArray(S))c=s.allocFromTypedArray(S),d=L>=0?L:S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_blob().");return w(N,O,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}}}r.sqlite3_config=function(q,...w){if(arguments.length<2)return r.SQLITE_MISUSE;switch(q){case r.SQLITE_CONFIG_COVERING_INDEX_SCAN:case r.SQLITE_CONFIG_MEMSTATUS:case r.SQLITE_CONFIG_SMALL_MALLOC:case r.SQLITE_CONFIG_SORTERREF_SIZE:case r.SQLITE_CONFIG_STMTJRNL_SPILL:case r.SQLITE_CONFIG_URI:return s.exports.sqlite3__wasm_config_i(q,w[0]);case r.SQLITE_CONFIG_LOOKASIDE:return s.exports.sqlite3__wasm_config_ii(q,w[0],w[1]);case r.SQLITE_CONFIG_MEMDB_MAXSIZE:return s.exports.sqlite3__wasm_config_j(q,w[0]);case r.SQLITE_CONFIG_GETMALLOC:case r.SQLITE_CONFIG_GETMUTEX:case r.SQLITE_CONFIG_GETPCACHE2:case r.SQLITE_CONFIG_GETPCACHE:case r.SQLITE_CONFIG_HEAP:case r.SQLITE_CONFIG_LOG:case r.SQLITE_CONFIG_MALLOC:case r.SQLITE_CONFIG_MMAP_SIZE:case r.SQLITE_CONFIG_MULTITHREAD:case r.SQLITE_CONFIG_MUTEX:case r.SQLITE_CONFIG_PAGECACHE:case r.SQLITE_CONFIG_PCACHE2:case r.SQLITE_CONFIG_PCACHE:case r.SQLITE_CONFIG_PCACHE_HDRSZ:case r.SQLITE_CONFIG_PMASZ:case r.SQLITE_CONFIG_SERIALIZED:case r.SQLITE_CONFIG_SINGLETHREAD:case r.SQLITE_CONFIG_SQLLOG:case r.SQLITE_CONFIG_WIN32_HEAPSIZE:default:return r.SQLITE_NOTFOUND}};{const q=new Set;r.sqlite3_auto_extension=function(w){if(w instanceof Function)w=s.installFunction("i(ppp)",w);else if(arguments.length!==1||!s.isPtr(w))return r.SQLITE_MISUSE;const x=s.exports.sqlite3_auto_extension(w);return w!==arguments[0]&&(x===0?q.add(w):s.uninstallFunction(w)),x},r.sqlite3_cancel_auto_extension=function(w){return!w||arguments.length!==1||!s.isPtr(w)?0:s.exports.sqlite3_cancel_auto_extension(w)},r.sqlite3_reset_auto_extension=function(){s.exports.sqlite3_reset_auto_extension();for(const w of q)s.uninstallFunction(w);q.clear()}}const Q=r.sqlite3_vfs_find("kvvfs");if(Q)if(o.isUIThread()){const q=new r.sqlite3_kvvfs_methods(s.exports.sqlite3__wasm_kvvfs_methods());delete r.sqlite3_kvvfs_methods;const w=s.exports.sqlite3__wasm_kvvfsMakeKeyOnPstack,x=s.pstack,N=S=>s.peek(S)===115?sessionStorage:localStorage,O={xRead:(S,L,$,c)=>{const d=x.pointer,y=s.scopedAllocPush();try{const B=w(S,L);if(!B)return-3;const f=s.cstrToJs(B),h=N(S).getItem(f);if(!h)return-1;const l=h.length;if(c<=0)return l;if(c===1)return s.poke($,0),l;const _=s.scopedAllocCString(h);return c>l+1&&(c=l+1),s.heap8u().copyWithin($,_,_+c-1),s.poke($+c-1,0),c-1}catch(B){return console.error("kvstorageRead()",B),-2}finally{x.restore(d),s.scopedAllocPop(y)}},xWrite:(S,L,$)=>{const c=x.pointer;try{const d=w(S,L);if(!d)return 1;const y=s.cstrToJs(d);return N(S).setItem(y,s.cstrToJs($)),0}catch(d){return console.error("kvstorageWrite()",d),r.SQLITE_IOERR}finally{x.restore(c)}},xDelete:(S,L)=>{const $=x.pointer;try{const c=w(S,L);return c?(N(S).removeItem(s.cstrToJs(c)),0):1}catch(c){return console.error("kvstorageDelete()",c),r.SQLITE_IOERR}finally{x.restore($)}}};for(const S of Object.keys(O))q[q.memberKey(S)]=s.installFunction(q.memberSignature(S),O[S])}else r.sqlite3_vfs_unregister(Q);s.xWrap.FuncPtrAdapter.warnOnUse=!0;const T=t.StructBinder,A=function q(w,x,N,O=q.installMethodArgcCheck){if(w instanceof T.StructType?!(N instanceof Function)&&!s.isPtr(N)&&n("Usage error: expecting a Function or WASM pointer to one."):n("Usage error: target object is-not-a StructType."),arguments.length===1)return(c,d)=>q(w,c,d,O);q.argcProxy||(q.argcProxy=function(c,d,y,B){return function(...f){return y.length!==arguments.length&&n("Argument mismatch for",c.structInfo.name+"::"+d+": Native signature is:",B),y.apply(this,f)}},q.removeFuncList=function(){this.ondispose.__removeFuncList&&(this.ondispose.__removeFuncList.forEach((c,d)=>{if(typeof c=="number")try{s.uninstallFunction(c)}catch{}}),delete this.ondispose.__removeFuncList)});const S=w.memberSignature(x);S.length<2&&n("Member",x,"does not have a function pointer signature:",S);const L=w.memberKey(x),$=O&&!s.isPtr(N)?q.argcProxy(w,L,N,S):N;if(s.isPtr($))$&&!s.functionEntry($)&&n("Pointer",$,"is not a WASM function table entry."),w[L]=$;else{const c=s.installFunction($,w.memberSignature(x,!0));w[L]=c,(!w.ondispose||!w.ondispose.__removeFuncList)&&(w.addOnDispose("ondispose.__removeFuncList handler",q.removeFuncList),w.ondispose.__removeFuncList=[]),w.ondispose.__removeFuncList.push(L,c)}return(c,d)=>q(w,c,d,O)};A.installMethodArgcCheck=!1;const D=function(q,w,x=A.installMethodArgcCheck){const N=new Map;for(const O of Object.keys(w)){const S=w[O],L=N.get(S);if(L){const $=q.memberKey(O);q[$]=q[q.memberKey(L)]}else A(q,O,S,x),N.set(S,O)}return q};T.StructType.prototype.installMethod=function(w,x,N=A.installMethodArgcCheck){return arguments.length<3&&w&&typeof w=="object"?D(this,...arguments):A(this,...arguments)},T.StructType.prototype.installMethods=function(q,w=A.installMethodArgcCheck){return D(this,q,w)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){t.version={libVersion:"3.50.4",libVersionNumber:3050004,sourceId:"2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3",downloadVersion:3500400}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...f)=>{throw new t.SQLite3Error(...f)},r=t.capi,s=t.wasm,o=t.util,p=new WeakMap,g=new WeakMap,P=(f,h,l)=>{const _=Object.getOwnPropertyDescriptor(f,h);return _?_.value:l},R=function(f,h){return h&&(f instanceof A&&(f=f.pointer),n(h,"sqlite3 result code",h+":",f?r.sqlite3_errmsg(f):r.sqlite3_errstr(h))),arguments[0]},z=s.installFunction("i(ippp)",(function(f,h,l,_){r.SQLITE_TRACE_STMT===f&&console.log("SQL TRACE #"+ ++this.counter+" via sqlite3@"+h+":",s.cstrToJs(_))}).bind({counter:0})),Q=Object.create(null),T=function f(...h){if(!f._name2vfs){f._name2vfs=Object.create(null);const j=typeof importScripts=="function"?b=>n("The VFS for",b,"is only available in the main window thread."):!1;f._name2vfs[":localStorage:"]={vfs:"kvvfs",filename:j||(()=>"local")},f._name2vfs[":sessionStorage:"]={vfs:"kvvfs",filename:j||(()=>"session")}}const l=f.normalizeArgs(...h);let _=l.filename,u=l.vfs,I=l.flags;(typeof _!="string"&&typeof _!="number"||typeof I!="string"||u&&typeof u!="string"&&typeof u!="number")&&(t.config.error("Invalid DB ctor args",l,arguments),n("Invalid arguments for DB constructor."));let U=typeof _=="number"?s.cstrToJs(_):_;const ee=f._name2vfs[U];ee&&(u=ee.vfs,_=U=ee.filename(U));let ne,se=0;I.indexOf("c")>=0&&(se|=r.SQLITE_OPEN_CREATE|r.SQLITE_OPEN_READWRITE),I.indexOf("w")>=0&&(se|=r.SQLITE_OPEN_READWRITE),se===0&&(se|=r.SQLITE_OPEN_READONLY),se|=r.SQLITE_OPEN_EXRESCODE;const ie=s.pstack.pointer;try{const j=s.pstack.allocPtr();let b=r.sqlite3_open_v2(_,j,se,u||0);ne=s.peekPtr(j),R(ne,b),r.sqlite3_extended_result_codes(ne,1),I.indexOf("t")>=0&&r.sqlite3_trace_v2(ne,r.SQLITE_TRACE_STMT,z,ne)}catch(j){throw ne&&r.sqlite3_close_v2(ne),j}finally{s.pstack.restore(ie)}this.filename=U,p.set(this,ne),g.set(this,Object.create(null));try{const j=r.sqlite3_js_db_vfs(ne)||n("Internal error: cannot get VFS for new db handle."),b=Q[j];b&&(b instanceof Function?b(this,t):R(ne,r.sqlite3_exec(ne,b,0,0,0)))}catch(j){throw this.close(),j}};T.setVfsPostOpenCallback=function(f,h){h instanceof Function||n("dbCtorHelper.setVfsPostOpenCallback() should not be used with a non-function argument.",arguments),Q[f]=h},T.normalizeArgs=function(f=":memory:",h="c",l=null){const _={};return arguments.length===1&&arguments[0]&&typeof arguments[0]=="object"?(Object.assign(_,arguments[0]),_.flags===void 0&&(_.flags="c"),_.vfs===void 0&&(_.vfs=null),_.filename===void 0&&(_.filename=":memory:")):(_.filename=f,_.flags=h,_.vfs=l),_};const A=function(...f){T.apply(this,f)};A.dbCtorHelper=T;const D={null:1,number:2,string:3,boolean:4,blob:5};D.undefined==D.null,s.bigIntEnabled&&(D.bigint=D.number);const q=function(){D!==arguments[2]&&n(r.SQLITE_MISUSE,"Do not call the Stmt constructor directly. Use DB.prepare()."),this.db=arguments[0],p.set(this,arguments[1]),this.parameterCount=r.sqlite3_bind_parameter_count(this.pointer)},w=function(f){return f.pointer||n("DB has been closed."),f},x=function(f,h){return(h!==(h|0)||h<0||h>=f.columnCount)&&n("Column index",h,"is out of range."),f},N=function(f,h){const l=Object.create(null);switch(l.opt=Object.create(null),h.length){case 1:typeof h[0]=="string"||o.isSQLableTypedArray(h[0])||Array.isArray(h[0])?l.sql=h[0]:h[0]&&typeof h[0]=="object"&&(l.opt=h[0],l.sql=l.opt.sql);break;case 2:l.sql=h[0],l.opt=h[1];break;default:n("Invalid argument count for exec().")}l.sql=o.flexibleString(l.sql),typeof l.sql!="string"&&n("Missing SQL argument or unsupported SQL value type.");const _=l.opt;switch(_.returnValue){case"resultRows":_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows;break;case"saveSql":_.saveSql||(_.saveSql=[]),l.returnVal=()=>_.saveSql;break;case void 0:case"this":l.returnVal=()=>f;break;default:n("Invalid returnValue value:",_.returnValue)}if(!_.callback&&!_.returnValue&&_.rowMode!==void 0&&(_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows),_.callback||_.resultRows)switch(_.rowMode===void 0?"array":_.rowMode){case"object":l.cbArg=(u,I)=>{I.columnNames||(I.columnNames=u.getColumnNames([]));const U=u.get([]),ee=Object.create(null);for(const ne in I.columnNames)ee[I.columnNames[ne]]=U[ne];return ee};break;case"array":l.cbArg=u=>u.get([]);break;case"stmt":Array.isArray(_.resultRows)&&n("exec(): invalid rowMode for a resultRows array: must","be one of 'array', 'object',","a result column number, or column name reference."),l.cbArg=u=>u;break;default:if(o.isInt32(_.rowMode)){l.cbArg=u=>u.get(_.rowMode);break}else if(typeof _.rowMode=="string"&&_.rowMode.length>1&&_.rowMode[0]==="$"){const u=_.rowMode.substr(1);l.cbArg=I=>{const U=I.get(Object.create(null))[u];return U===void 0?n(r.SQLITE_NOTFOUND,"exec(): unknown result column:",u):U};break}n("Invalid rowMode:",_.rowMode)}return l},O=(f,h,l,..._)=>{const u=f.prepare(h);try{const I=u.bind(l).step()?u.get(..._):void 0;return u.reset(),I}finally{u.finalize()}},S=(f,h,l,_)=>f.exec({sql:h,bind:l,rowMode:_,returnValue:"resultRows"});A.checkRc=(f,h)=>R(f,h),A.prototype={isOpen:function(){return!!this.pointer},affirmOpen:function(){return w(this)},close:function(){if(this.pointer){if(this.onclose&&this.onclose.before instanceof Function)try{this.onclose.before(this)}catch{}const f=this.pointer;if(Object.keys(g.get(this)).forEach((h,l)=>{if(l&&l.pointer)try{l.finalize()}catch{}}),p.delete(this),g.delete(this),r.sqlite3_close_v2(f),this.onclose&&this.onclose.after instanceof Function)try{this.onclose.after(this)}catch{}delete this.filename}},changes:function(f=!1,h=!1){const l=w(this).pointer;return f?h?r.sqlite3_total_changes64(l):r.sqlite3_total_changes(l):h?r.sqlite3_changes64(l):r.sqlite3_changes(l)},dbFilename:function(f="main"){return r.sqlite3_db_filename(w(this).pointer,f)},dbName:function(f=0){return r.sqlite3_db_name(w(this).pointer,f)},dbVfsName:function(f=0){let h;const l=r.sqlite3_js_db_vfs(w(this).pointer,f);if(l){const _=new r.sqlite3_vfs(l);try{h=s.cstrToJs(_.$zName)}finally{_.dispose()}}return h},prepare:function(f){w(this);const h=s.pstack.pointer;let l,_;try{l=s.pstack.alloc(8),A.checkRc(this,r.sqlite3_prepare_v2(this.pointer,f,-1,l,null)),_=s.peekPtr(l)}finally{s.pstack.restore(h)}_||n("Cannot prepare empty SQL.");const u=new q(this,_,D);return g.get(this)[_]=u,u},exec:function(){w(this);const f=N(this,arguments);if(!f.sql)return n("exec() requires an SQL string.");const h=f.opt,l=h.callback,_=Array.isArray(h.resultRows)?h.resultRows:void 0;let u,I=h.bind,U=!!(f.cbArg||h.columnNames||_);const ee=s.scopedAllocPush(),ne=Array.isArray(h.saveSql)?h.saveSql:void 0;try{const se=o.isSQLableTypedArray(f.sql);let ie=se?f.sql.byteLength:s.jstrlen(f.sql);const j=s.scopedAlloc(2*s.ptrSizeof+(ie+1)),b=j+s.ptrSizeof;let k=b+s.ptrSizeof;const W=k+ie;for(se?s.heap8().set(f.sql,k):s.jstrcpy(f.sql,s.heap8(),k,ie,!1),s.poke(k+ie,0);k&&s.peek(k,"i8");){s.pokePtr([j,b],0),A.checkRc(this,r.sqlite3_prepare_v3(this.pointer,k,ie,0,j,b));const H=s.peekPtr(j);if(k=s.peekPtr(b),ie=W-k,!!H){if(ne&&ne.push(r.sqlite3_sql(H).trim()),u=new q(this,H,D),I&&u.parameterCount&&(u.bind(I),I=null),U&&u.columnCount){let Z=Array.isArray(h.columnNames)?0:1;if(U=!1,f.cbArg||_){const E=Object.create(null);for(;u.step();u._lockedByExec=!1){Z++===0&&u.getColumnNames(E.columnNames=h.columnNames||[]),u._lockedByExec=!0;const C=f.cbArg(u,E);if(_&&_.push(C),l&&l.call(h,C,u)===!1)break}u._lockedByExec=!1}Z===0&&u.getColumnNames(h.columnNames)}else u.step();u.reset().finalize(),u=null}}}finally{s.scopedAllocPop(ee),u&&(delete u._lockedByExec,u.finalize())}return f.returnVal()},createFunction:function(h,l,_){const u=E=>E instanceof Function;switch(arguments.length){case 1:_=h,h=_.name,l=_.xFunc||0;break;case 2:u(l)||(_=l,l=_.xFunc||0);break}_||(_={}),typeof h!="string"&&n("Invalid arguments: missing function name.");let I=_.xStep||0,U=_.xFinal||0;const ee=_.xValue||0,ne=_.xInverse||0;let se;u(l)?(se=!1,(u(I)||u(U))&&n("Ambiguous arguments: scalar or aggregate?"),I=U=null):u(I)?(u(U)||n("Missing xFinal() callback for aggregate or window UDF."),l=null):u(U)?n("Missing xStep() callback for aggregate or window UDF."):n("Missing function-type properties."),se===!1?(u(ee)||u(ne))&&n("xValue and xInverse are not permitted for non-window UDFs."):u(ee)?(u(ne)||n("xInverse must be provided if xValue is."),se=!0):u(ne)&&n("xValue must be provided if xInverse is.");const ie=_.pApp;ie!=null&&(typeof ie!="number"||!o.isInt32(ie))&&n("Invalid value for pApp property. Must be a legal WASM pointer value.");const j=_.xDestroy||0;j&&!u(j)&&n("xDestroy property must be a function.");let b=0;P(_,"deterministic")&&(b|=r.SQLITE_DETERMINISTIC),P(_,"directOnly")&&(b|=r.SQLITE_DIRECTONLY),P(_,"innocuous")&&(b|=r.SQLITE_INNOCUOUS),h=h.toLowerCase();const k=l||I,W=P(_,"arity"),H=typeof W=="number"?W:k.length?k.length-1:0;let Z;return se?Z=r.sqlite3_create_window_function(this.pointer,h,H,r.SQLITE_UTF8|b,ie||0,I,U,ee,ne,j):Z=r.sqlite3_create_function_v2(this.pointer,h,H,r.SQLITE_UTF8|b,ie||0,l,I,U,j),A.checkRc(this,Z),this},selectValue:function(f,h,l){return O(this,f,h,0,l)},selectValues:function(f,h,l){const _=this.prepare(f),u=[];try{for(_.bind(h);_.step();)u.push(_.get(0,l));_.reset()}finally{_.finalize()}return u},selectArray:function(f,h){return O(this,f,h,[])},selectObject:function(f,h){return O(this,f,h,{})},selectArrays:function(f,h){return S(this,f,h,"array")},selectObjects:function(f,h){return S(this,f,h,"object")},openStatementCount:function(){return this.pointer?Object.keys(g.get(this)).length:0},transaction:function(f){let h="BEGIN";arguments.length>1&&(/[^a-zA-Z]/.test(arguments[0])&&n(r.SQLITE_MISUSE,"Invalid argument for BEGIN qualifier."),h+=" "+arguments[0],f=arguments[1]),w(this).exec(h);try{const l=f(this);return this.exec("COMMIT"),l}catch(l){throw this.exec("ROLLBACK"),l}},savepoint:function(f){w(this).exec("SAVEPOINT oo1");try{const h=f(this);return this.exec("RELEASE oo1"),h}catch(h){throw this.exec("ROLLBACK to SAVEPOINT oo1; RELEASE SAVEPOINT oo1"),h}},checkRc:function(f){return R(this,f)}};const L=function(f){return f.pointer||n("Stmt has been closed."),f},$=function(f){let h=D[f==null?"null":typeof f];switch(h){case D.boolean:case D.null:case D.number:case D.string:return h;case D.bigint:if(s.bigIntEnabled)return h;default:return o.isBindableTypedArray(f)?D.blob:void 0}},c=function(f){return $(f)||n("Unsupported bind() argument type:",typeof f)},d=function(f,h){const l=typeof h=="number"?h:r.sqlite3_bind_parameter_index(f.pointer,h);return l===0||!o.isInt32(l)?n("Invalid bind() parameter name: "+h):(l<1||l>f.parameterCount)&&n("Bind index",h,"is out of range."),l},y=function(f,h){return f._lockedByExec&&n("Operation is illegal when statement is locked:",h),f},B=function f(h,l,_,u){y(L(h),"bind()"),f._||(f._tooBigInt=U=>n("BigInt value is too big to store without precision loss:",U),f._={string:function(U,ee,ne,se){const[ie,j]=s.allocCString(ne,!0);return(se?r.sqlite3_bind_blob:r.sqlite3_bind_text)(U.pointer,ee,ie,j,r.SQLITE_WASM_DEALLOC)}}),c(u),l=d(h,l);let I=0;switch(u==null?D.null:_){case D.null:I=r.sqlite3_bind_null(h.pointer,l);break;case D.string:I=f._.string(h,l,u,!1);break;case D.number:{let U;o.isInt32(u)?U=r.sqlite3_bind_int:typeof u=="bigint"?o.bigIntFits64(u)?s.bigIntEnabled?U=r.sqlite3_bind_int64:o.bigIntFitsDouble(u)?(u=Number(u),U=r.sqlite3_bind_double):f._tooBigInt(u):f._tooBigInt(u):(u=Number(u),s.bigIntEnabled&&Number.isInteger(u)?U=r.sqlite3_bind_int64:U=r.sqlite3_bind_double),I=U(h.pointer,l,u);break}case D.boolean:I=r.sqlite3_bind_int(h.pointer,l,u?1:0);break;case D.blob:{if(typeof u=="string"){I=f._.string(h,l,u,!0);break}else u instanceof ArrayBuffer?u=new Uint8Array(u):o.isBindableTypedArray(u)||n("Binding a value as a blob requires","that it be a string, Uint8Array, Int8Array, or ArrayBuffer.");const U=s.alloc(u.byteLength||1);s.heap8().set(u.byteLength?u:[0],U),I=r.sqlite3_bind_blob(h.pointer,l,U,u.byteLength,r.SQLITE_WASM_DEALLOC);break}default:t.config.warn("Unsupported bind() argument type:",u),n("Unsupported bind() argument type: "+typeof u)}return I&&A.checkRc(h.db.pointer,I),h._mayGet=!1,h};q.prototype={finalize:function(){if(this.pointer){y(this,"finalize()");const f=r.sqlite3_finalize(this.pointer);return delete g.get(this.db)[this.pointer],p.delete(this),delete this._mayGet,delete this.parameterCount,delete this._lockedByExec,delete this.db,f}},clearBindings:function(){return y(L(this),"clearBindings()"),r.sqlite3_clear_bindings(this.pointer),this._mayGet=!1,this},reset:function(f){y(this,"reset()"),f&&this.clearBindings();const h=r.sqlite3_reset(L(this).pointer);return this._mayGet=!1,R(this.db,h),this},bind:function(){L(this);let f,h;switch(arguments.length){case 1:f=1,h=arguments[0];break;case 2:f=arguments[0],h=arguments[1];break;default:n("Invalid bind() arguments.")}return h===void 0?this:(this.parameterCount||n("This statement has no bindable parameters."),this._mayGet=!1,h===null?B(this,f,D.null,h):Array.isArray(h)?(arguments.length!==1&&n("When binding an array, an index argument is not permitted."),h.forEach((l,_)=>B(this,_+1,c(l),l)),this):(h instanceof ArrayBuffer&&(h=new Uint8Array(h)),typeof h=="object"&&!o.isBindableTypedArray(h)?(arguments.length!==1&&n("When binding an object, an index argument is not permitted."),Object.keys(h).forEach(l=>B(this,l,c(h[l]),h[l])),this):B(this,f,c(h),h)))},bindAsBlob:function(f,h){L(this),arguments.length===1&&(h=f,f=1);const l=c(h);return D.string!==l&&D.blob!==l&&D.null!==l&&n("Invalid value type for bindAsBlob()"),B(this,f,D.blob,h)},step:function(){y(this,"step()");const f=r.sqlite3_step(L(this).pointer);switch(f){case r.SQLITE_DONE:return this._mayGet=!1;case r.SQLITE_ROW:return this._mayGet=!0;default:this._mayGet=!1,t.config.warn("sqlite3_step() rc=",f,r.sqlite3_js_rc_str(f),"SQL =",r.sqlite3_sql(this.pointer)),A.checkRc(this.db.pointer,f)}},stepReset:function(){return this.step(),this.reset()},stepFinalize:function(){try{const f=this.step();return this.reset(),f}finally{try{this.finalize()}catch{}}},get:function(f,h){if(L(this)._mayGet||n("Stmt.step() has not (recently) returned true."),Array.isArray(f)){let l=0;const _=this.columnCount;for(;l<_;)f[l]=this.get(l++);return f}else if(f&&typeof f=="object"){let l=0;const _=this.columnCount;for(;l<_;)f[r.sqlite3_column_name(this.pointer,l)]=this.get(l++);return f}switch(x(this,f),h===void 0?r.sqlite3_column_type(this.pointer,f):h){case r.SQLITE_NULL:return null;case r.SQLITE_INTEGER:if(s.bigIntEnabled){const l=r.sqlite3_column_int64(this.pointer,f);return l>=Number.MIN_SAFE_INTEGER&&l<=Number.MAX_SAFE_INTEGER?Number(l).valueOf():l}else{const l=r.sqlite3_column_double(this.pointer,f);return(l>Number.MAX_SAFE_INTEGER||ln("The pointer property is read-only.")};Object.defineProperty(q.prototype,"pointer",f),Object.defineProperty(A.prototype,"pointer",f)}if(Object.defineProperty(q.prototype,"columnCount",{enumerable:!1,get:function(){return r.sqlite3_column_count(this.pointer)},set:()=>n("The columnCount property is read-only.")}),t.oo1={DB:A,Stmt:q},o.isUIThread()){t.oo1.JsStorageDb=function(h="session"){const l=T.normalizeArgs(...arguments);h=l.filename,h!=="session"&&h!=="local"&&n("JsStorageDb db name must be one of 'session' or 'local'."),l.vfs="kvvfs",T.call(this,l)};const f=t.oo1.JsStorageDb;f.prototype=Object.create(A.prototype),f.clearStorage=r.sqlite3_js_kvvfs_clear,f.prototype.clearStorage=function(){return f.clearStorage(w(this).filename)},f.storageSize=r.sqlite3_js_kvvfs_size,f.prototype.storageSize=function(){return f.storageSize(w(this).filename)}}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util;t.initWorker1API=(function(){const r=(...T)=>{throw new Error(T.join(" "))};globalThis.WorkerGlobalScope instanceof Function||r("initWorker1API() must be run from a Worker thread.");const s=this.sqlite3||r("Missing this.sqlite3 object."),o=s.oo1.DB,p=function(T){let A=g.idMap.get(T);return A||(A="db#"+ ++g.idSeq+"@"+T.pointer,g.idMap.set(T,A),A)},g={dbList:[],idSeq:0,idMap:new WeakMap,xfer:[],open:function(T){const A=new o(T);return this.dbs[p(A)]=A,this.dbList.indexOf(A)<0&&this.dbList.push(A),A},close:function(T,A){if(T){delete this.dbs[p(T)];const D=T.filename,q=n.sqlite3__wasm_db_vfs(T.pointer,0);T.close();const w=this.dbList.indexOf(T);w>=0&&this.dbList.splice(w,1),A&&D&&q&&n.sqlite3__wasm_vfs_unlink(q,D)}},post:function(T,A){A&&A.length?(globalThis.postMessage(T,Array.from(A)),A.length=0):globalThis.postMessage(T)},dbs:Object.create(null),getDb:function(T,A=!0){return this.dbs[T]||(A?r("Unknown (or closed) DB ID:",T):void 0)}},P=function(T=g.dbList[0]){return T&&T.pointer?T:r("DB is not opened.")},R=function(T,A=!0){const D=g.getDb(T.dbId,!1)||g.dbList[0];return A?P(D):D},z=function(){return g.dbList[0]&&p(g.dbList[0])},Q={open:function(T){const A=Object.create(null),D=T.args||Object.create(null);D.simulateError&&r("Throwing because of simulateError flag.");const q=Object.create(null);A.vfs=D.vfs,A.filename=D.filename||"";const w=g.open(A);return q.filename=w.filename,q.persistent=!!s.capi.sqlite3_js_db_uses_vfs(w.pointer,"opfs"),q.dbId=p(w),q.vfs=w.dbVfsName(),q},close:function(T){const A=R(T,!1),D={filename:A&&A.filename};if(A){const q=T.args&&typeof T.args=="object"?!!T.args.unlink:!1;g.close(A,q)}return D},exec:function(T){const A=typeof T.args=="string"?{sql:T.args}:T.args||Object.create(null);A.rowMode==="stmt"?r("Invalid rowMode for 'exec': stmt mode","does not work in the Worker API."):A.sql||r("'exec' requires input SQL.");const D=R(T);(A.callback||Array.isArray(A.resultRows))&&(D._blobXfer=g.xfer);const q=A.callback;let w=0;const x=!!A.columnNames;typeof q=="string"&&(x||(A.columnNames=[]),A.callback=function(N,O){g.post({type:q,columnNames:A.columnNames,rowNumber:++w,row:N},g.xfer)});try{const N=A.countChanges?D.changes(!0,A.countChanges===64):void 0;D.exec(A),N!==void 0&&(A.changeCount=D.changes(!0,A.countChanges===64)-N);const O=A.lastInsertRowId?s.capi.sqlite3_last_insert_rowid(D):void 0;O!==void 0&&(A.lastInsertRowId=O),A.callback instanceof Function&&(A.callback=q,g.post({type:q,columnNames:A.columnNames,rowNumber:null,row:void 0}))}finally{delete D._blobXfer,A.callback&&(A.callback=q)}return A},"config-get":function(){const T=Object.create(null),A=s.config;return["bigIntEnabled"].forEach(function(D){Object.getOwnPropertyDescriptor(A,D)&&(T[D]=A[D])}),T.version=s.version,T.vfsList=s.capi.sqlite3_js_vfs_list(),T},export:function(T){const A=R(T),D={byteArray:s.capi.sqlite3_js_db_export(A.pointer),filename:A.filename,mimetype:"application/x-sqlite3"};return g.xfer.push(D.byteArray.buffer),D},toss:function(T){r("Testing worker exception")}};globalThis.onmessage=async function(T){T=T.data;let A,D=T.dbId,q=T.type;const w=performance.now();try{Q.hasOwnProperty(q)&&Q[q]instanceof Function?A=await Q[q](T):r("Unknown db worker message type:",T.type)}catch(x){q="error",A={operation:T.type,message:x.message,errorClass:x.name,input:T},x.stack&&(A.stack=typeof x.stack=="string"?x.stack.split(/\n\s*/):x.stack)}D||(D=A.dbId||z()),g.post({type:q,dbId:D,messageId:T.messageId,workerReceivedTime:w,workerRespondTime:performance.now(),departureTime:T.departureTime,result:A},g.xfer)},globalThis.postMessage({type:"sqlite3-api",result:"worker1-ready"})}).bind({sqlite3:t})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vfs=o,r.sqlite3_vfs.prototype.registerVfs=function(p=!1){this instanceof t.capi.sqlite3_vfs||s("Expecting a sqlite3_vfs-type argument.");const g=r.sqlite3_vfs_register(this,p?1:0);return g&&s("sqlite3_vfs_register(",this,") failed with rc",g),this.pointer!==r.sqlite3_vfs_find(this.$zName)&&s("BUG: sqlite3_vfs_find(vfs.$zName) failed for just-installed VFS",this),this},o.installVfs=function(p){let g=0;const P=["io","vfs"];for(const R of P){const z=p[R];z&&(++g,z.struct.installMethods(z.methods,!!z.applyArgcCheck),R==="vfs"&&(!z.struct.$zName&&typeof z.name=="string"&&z.struct.addOnDispose(z.struct.$zName=n.allocCString(z.name)),z.struct.registerVfs(!!z.asDefault)))}return g||s("Misuse: installVfs() options object requires at least","one of:",P),this}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){if(!t.wasm.exports.sqlite3_declare_vtab)return;const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vtab=o;const p=r.sqlite3_index_info;p.prototype.nthConstraint=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const Q=this.$aConstraint+p.sqlite3_index_constraint.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_constraint(Q)},p.prototype.nthConstraintUsage=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const Q=this.$aConstraintUsage+p.sqlite3_index_constraint_usage.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_constraint_usage(Q)},p.prototype.nthOrderBy=function(R,z=!1){if(R<0||R>=this.$nOrderBy)return!1;const Q=this.$aOrderBy+p.sqlite3_index_orderby.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_orderby(Q)};const g=function(R,z){return(function(Q,T=!1){if(arguments.length===0&&(Q=new z),Q instanceof z)return this.set(Q.pointer,Q),Q;n.isPtr(Q)||t.SQLite3Error.toss("Invalid argument to",R+"()");let A=this.get(Q);return T&&this.delete(Q),A}).bind(new Map)},P=function(R,z){const Q=g(R,z);return Object.assign(Object.create(null),{StructType:z,create:T=>{const A=Q();return n.pokePtr(T,A.pointer),A},get:T=>Q(T),unget:T=>Q(T,!0),dispose:T=>{const A=Q(T,!0);A&&A.dispose()}})};o.xVtab=P("xVtab",r.sqlite3_vtab),o.xCursor=P("xCursor",r.sqlite3_vtab_cursor),o.xIndexInfo=R=>new r.sqlite3_index_info(R),o.xError=function R(z,Q,T){if(R.errorReporter instanceof Function)try{R.errorReporter("sqlite3_module::"+z+"(): "+Q.message)}catch{}let A;return Q instanceof t.WasmAllocError?A=r.SQLITE_NOMEM:arguments.length>2?A=T:Q instanceof t.SQLite3Error&&(A=Q.resultCode),A||r.SQLITE_ERROR},o.xError.errorReporter=console.error.bind(console),o.xRowid=(R,z)=>n.poke(R,z,"i64"),o.setupModule=function(R){let z=!1;const Q=this instanceof r.sqlite3_module?this:R.struct||(z=new r.sqlite3_module);try{const T=R.methods||s("Missing 'methods' object.");for(const A of Object.entries({xConnect:"xCreate",xDisconnect:"xDestroy"})){const D=A[0],q=A[1];T[D]===!0?T[D]=T[q]:T[q]===!0&&(T[q]=T[D])}if(R.catchExceptions){const A=function(w,x){return["xConnect","xCreate"].indexOf(w)>=0?function(N,O,S,L,$,c){try{return x(...arguments)||0}catch(d){return d instanceof t.WasmAllocError||(n.dealloc(n.peekPtr(c)),n.pokePtr(c,n.allocCString(d.message))),o.xError(w,d)}}:function(...N){try{return x(...N)||0}catch(O){return o.xError(w,O)}}},D=["xCreate","xConnect","xBestIndex","xDisconnect","xDestroy","xOpen","xClose","xFilter","xNext","xEof","xColumn","xRowid","xUpdate","xBegin","xSync","xCommit","xRollback","xFindFunction","xRename","xSavepoint","xRelease","xRollbackTo","xShadowName"],q=Object.create(null);for(const w of D){const x=T[w];if(x instanceof Function)w==="xConnect"&&T.xCreate===x?q[w]=T.xCreate:w==="xCreate"&&T.xConnect===x?q[w]=T.xConnect:q[w]=A(w,x);else continue}Q.installMethods(q,!1)}else Q.installMethods(T,!!R.applyArgcCheck);if(Q.$iVersion===0){let A;typeof R.iVersion=="number"?A=R.iVersion:Q.$xShadowName?A=3:Q.$xSavePoint||Q.$xRelease||Q.$xRollbackTo?A=2:A=1,Q.$iVersion=A}}catch(T){throw z&&z.dispose(),T}return Q},r.sqlite3_module.prototype.setupModule=function(R){return o.setupModule.call(this,R)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=function r(s){if(!globalThis.SharedArrayBuffer||!globalThis.Atomics)return Promise.reject(new Error("Cannot install OPFS: Missing SharedArrayBuffer and/or Atomics. The server must emit the COOP/COEP response headers to enable those. See https://sqlite.org/wasm/doc/trunk/persistence.md#coop-coep"));if(typeof WorkerGlobalScope>"u")return Promise.reject(new Error("The OPFS sqlite3_vfs cannot run in the main thread because it requires Atomics.wait()."));if(!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory)return Promise.reject(new Error("Missing required OPFS APIs."));(!s||typeof s!="object")&&(s=Object.create(null));const o=new URL(globalThis.location.href).searchParams;return o.has("opfs-disable")?Promise.resolve(t):(s.verbose===void 0&&(s.verbose=o.has("opfs-verbose")?+o.get("opfs-verbose")||2:1),s.sanityChecks===void 0&&(s.sanityChecks=o.has("opfs-sanity-check")),s.proxyUri===void 0&&(s.proxyUri=r.defaultProxyUri),typeof s.proxyUri=="function"&&(s.proxyUri=s.proxyUri()),new Promise(function(g,P){const R=[t.config.error,t.config.warn,t.config.log],z=(E,...C)=>{s.verbose>E&&R[E]("OPFS syncer:",...C)},Q=(...E)=>z(2,...E),T=(...E)=>z(1,...E),A=(...E)=>z(0,...E),D=t.util.toss,q=t.capi,w=t.util,x=t.wasm,N=q.sqlite3_vfs,O=q.sqlite3_file,S=q.sqlite3_io_methods,L=Object.create(null),$=()=>globalThis.FileSystemHandle&&globalThis.FileSystemDirectoryHandle&&globalThis.FileSystemFileHandle&&globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle&&navigator?.storage?.getDirectory;L.metrics={dump:function(){let E,C=0,M=0,J=0;for(E in u.opIds){const G=I[E];C+=G.count,M+=G.time,J+=G.wait,G.avgTime=G.count&&G.time?G.time/G.count:0,G.avgWait=G.count&&G.wait?G.wait/G.count:0}t.config.log(globalThis.location.href,"metrics for",globalThis.location.href,":",I,` +Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),h.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),P(E)),f=()=>(y=!1,g(t)),h=new Worker(new URL(""+new URL("sqlite3-opfs-async-proxy-C_otN2ZJ.js",import.meta.url).href,import.meta.url));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),h._originalOnError=h.onerror,h.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),h.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),le=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const be=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,_e,he,de;for(_e=0;_e{ie.start=performance.now(),ie.op=E,++I[E].count},b=()=>I[ie.op].time+=performance.now()-ie.start,k={xCheckReservedLock:function(E,C){return x.poke(C,0,"i32"),0},xClose:function(E){j("xClose");let C=0;const M=se[E];return M&&(delete se[E],C=U("xClose",E),M.sq3File&&M.sq3File.dispose()),b(),C},xDeviceCharacteristics:function(E){return q.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(E,C,M){return q.SQLITE_NOTFOUND},xFileSize:function(E,C){j("xFileSize");let M=U("xFileSize",E);if(M==0)try{const J=u.s11n.deserialize()[0];x.poke(C,J,"i64")}catch(J){A("Unexpected error reading xFileSize() result:",J),M=u.sq3Codes.SQLITE_IOERR}return b(),M},xLock:function(E,C){j("xLock");const M=se[E];let J=0;return M.lockType?M.lockType=C:(J=U("xLock",E,C),J===0&&(M.lockType=C)),b(),J},xRead:function(E,C,M,J){j("xRead");const G=se[E];let te;try{te=U("xRead",E,M,Number(J)),(te===0||q.SQLITE_IOERR_SHORT_READ===te)&&x.heap8u().set(G.sabView.subarray(0,M),C)}catch(le){A("xRead(",arguments,") failed:",le,G),te=q.SQLITE_IOERR_READ}return b(),te},xSync:function(E,C){j("xSync"),++I.xSync.count;const M=U("xSync",E,C);return b(),M},xTruncate:function(E,C){j("xTruncate");const M=U("xTruncate",E,Number(C));return b(),M},xUnlock:function(E,C){j("xUnlock");const M=se[E];let J=0;return q.SQLITE_LOCK_NONE===C&&M.lockType&&(J=U("xUnlock",E,C)),J===0&&(M.lockType=C),b(),J},xWrite:function(E,C,M,J){j("xWrite");const G=se[E];let te;try{G.sabView.set(x.heap8u().subarray(C,C+M)),te=U("xWrite",E,M,Number(J))}catch(le){A("xWrite(",arguments,") failed:",le,G),te=q.SQLITE_IOERR_WRITE}return b(),te}},W={xAccess:function(E,C,M,J){j("xAccess");const G=U("xAccess",x.cstrToJs(C));return x.poke(J,G?0:1,"i32"),b(),0},xCurrentTime:function(E,C){return x.poke(C,24405875e-1+new Date().getTime()/864e5,"double"),0},xCurrentTimeInt64:function(E,C){return x.poke(C,24405875e-1*864e5+new Date().getTime(),"i64"),0},xDelete:function(E,C,M){j("xDelete");const J=U("xDelete",x.cstrToJs(C),M,!1);return b(),J},xFullPathname:function(E,C,M,J){return x.cstrncpy(J,C,M)!!J):M},L.getDirForFilename=async function(C,M=!1){const J=L.getResolvedPath(C,!0),G=J.pop();let te=L.rootDirectory;for(const le of J)le&&(te=await te.getDirectoryHandle(le,{create:!!M}));return[te,G]},L.mkdir=async function(E){try{return await L.getDirForFilename(E+"/filepart",!0),!0}catch{return!1}},L.entryExists=async function(E){try{const[C,M]=await L.getDirForFilename(E);return await C.getFileHandle(M),!0}catch{return!1}},L.randomFilename=ne,L.treeList=async function(){const E=async function M(J,G){G.name=J.name,G.dirs=[],G.files=[];for await(const te of J.values())if(te.kind==="directory"){const le=Object.create(null);G.dirs.push(le),await M(te,le)}else G.files.push(te.name)},C=Object.create(null);return await E(L.rootDirectory,C),C},L.rmfr=async function(){const E=L.rootDirectory,C={recurse:!0};for await(const M of E.values())E.removeEntry(M.name,C)},L.unlink=async function(E,C=!1,M=!1){try{const[J,G]=await L.getDirForFilename(E,!1);return await J.removeEntry(G,{recursive:C}),!0}catch(J){if(M)throw new Error("unlink(",arguments[0],") failed: "+J.message,{cause:J});return!1}},L.traverse=async function(E){const C={recursive:!0,directory:L.rootDirectory};typeof E=="function"&&(E={callback:E}),E=Object.assign(C,E||{}),async function J(G,te){for await(const le of G.values()){if(E.callback(le,G,te)===!1)return!1;if(E.recursive&&le.kind==="directory"&&await J(le,te+1)===!1)break}}(E.directory,0)};const H=async function(E,C){const[M,J]=await L.getDirForFilename(E,!0);let te=await(await M.getFileHandle(J,{create:!0})).createSyncAccessHandle(),le=0,Y,be=!1;try{for(te.truncate(0);(Y=await C())!==void 0;)Y instanceof ArrayBuffer&&(Y=new Uint8Array(Y)),le===0&&Y.byteLength>=15&&(w.affirmDbHeader(Y),be=!0),te.write(Y,{at:le}),le+=Y.byteLength;if((le<512||le%512!==0)&&D("Input size",le,"is not correct for an SQLite database."),!be){const F=new Uint8Array(20);te.read(F,{at:0}),w.affirmDbHeader(F)}return te.write(new Uint8Array([1,1]),{at:18}),le}catch(F){throw await te.close(),te=void 0,await M.removeEntry(J).catch(()=>{}),F}finally{te&&await te.close()}};if(L.importDb=async function(E,C){if(C instanceof Function)return H(E,C);C instanceof ArrayBuffer&&(C=new Uint8Array(C)),w.affirmIsDb(C);const M=C.byteLength,[J,G]=await L.getDirForFilename(E,!0);let te,le=0;try{return te=await(await J.getFileHandle(G,{create:!0})).createSyncAccessHandle(),te.truncate(0),le=te.write(C,{at:0}),le!=M&&D("Expected to write "+M+" bytes but wrote "+le+"."),te.write(new Uint8Array([1,1]),{at:18}),le}catch(Y){throw te&&(await te.close(),te=void 0),await J.removeEntry(G).catch(()=>{}),Y}finally{te&&await te.close()}},t.oo1){const E=function(...C){const M=t.oo1.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=d.$zName,t.oo1.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(t.oo1.DB.prototype),t.oo1.OpfsDb=E,E.importDb=L.importDb,t.oo1.DB.dbCtorHelper.setVfsPostOpenCallback(d.pointer,function(C,M){M.capi.sqlite3_busy_timeout(C,1e4)})}const Z=function(){const E=x.scopedAllocPush(),C=new O;try{const M=C.pointer,J=q.SQLITE_OPEN_CREATE|q.SQLITE_OPEN_READWRITE|q.SQLITE_OPEN_MAIN_DB,G=x.scopedAlloc(8),te="/sanity/check/file"+ne(8),le=x.scopedAllocCString(te);let Y;if(u.s11n.serialize("This is ä string."),Y=u.s11n.deserialize(),Q("deserialize() says:",Y),Y[0]!=="This is ä string."&&D("String d13n error."),W.xAccess(d.pointer,le,0,G),Y=x.peek(G,"i32"),Q("xAccess(",te,") exists ?=",Y),Y=W.xOpen(d.pointer,le,M,J,G),Q("open rc =",Y,"state.sabOPView[xOpen] =",u.sabOPView[u.opIds.xOpen]),Y!==0){A("open failed with code",Y);return}W.xAccess(d.pointer,le,0,G),Y=x.peek(G,"i32"),Y||D("xAccess() failed to detect file."),Y=k.xSync(C.pointer,0),Y&&D("sync failed w/ rc",Y),Y=k.xTruncate(C.pointer,1024),Y&&D("truncate failed w/ rc",Y),x.poke(G,0,"i64"),Y=k.xFileSize(C.pointer,G),Y&&D("xFileSize failed w/ rc",Y),Q("xFileSize says:",x.peek(G,"i64")),Y=k.xWrite(C.pointer,le,10,1),Y&&D("xWrite() failed!");const be=x.scopedAlloc(16);Y=k.xRead(C.pointer,be,6,2),x.poke(be+6,0);let F=x.cstrToJs(be);Q("xRead() got:",F),F!=="sanity"&&D("Unexpected xRead() value."),W.xSleep&&(Q("xSleep()ing before close()ing..."),W.xSleep(d.pointer,2e3),Q("waking up from xSleep()")),Y=k.xClose(M),Q("xClose rc =",Y,"sabOPView =",u.sabOPView),Q("Deleting file:",te),W.xDelete(d.pointer,le,4660),W.xAccess(d.pointer,le,0,G),Y=x.peek(G,"i32"),Y&&D("Expecting 0 from xAccess(",te,") after xDelete()."),T("End of OPFS sanity checks.")}finally{C.dispose(),x.scopedAllocPop(E)}};h.onmessage=function({data:E}){switch(E.type){case"opfs-unavailable":B(new Error(E.payload.join(" ")));break;case"opfs-async-loaded":h.postMessage({type:"opfs-async-init",args:u});break;case"opfs-async-inited":{if(y===!0)break;try{t.vfs.installVfs({io:{struct:c,methods:k},vfs:{struct:d,methods:W}}),u.sabOPView=new Int32Array(u.sabOP),u.sabFileBufView=new Uint8Array(u.sabIO,0,u.fileBufferSize),u.sabS11nView=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),ee(),s.sanityChecks&&(T("Running sanity checks because of opfs-sanity-check URL arg..."),Z()),$()?navigator.storage.getDirectory().then(C=>{h.onerror=h._originalOnError,delete h._originalOnError,t.opfs=L,L.rootDirectory=C,Q("End of OPFS sqlite3_vfs setup.",d),f()}).catch(B):f()}catch(C){A(C),B(C)}break}default:{const C="Unexpected message from the OPFS async worker: "+JSON.stringify(E);A(C),B(new Error(C));break}}}}))};n.defaultProxyUri="sqlite3-opfs-async-proxy.js",globalThis.sqlite3ApiBootstrap.initializersAsync.push(async r=>{try{let s=n.defaultProxyUri;return r.scriptInfo.sqlite3Dir&&(n.defaultProxyUri=r.scriptInfo.sqlite3Dir+s),n().catch(o=>{r.config.warn("Ignoring inability to install OPFS sqlite3_vfs:",o.message)})}catch(s){return r.config.error("installOpfsVfs() exception:",s),Promise.reject(s)}})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util.toss,r=t.util.toss3,s=Object.create(null),o=t.capi,p=t.util,g=t.wasm,P=4096,R=512,z=4,Q=8,T=R+z,A=R,D=T,q=P,w=o.SQLITE_OPEN_MAIN_DB|o.SQLITE_OPEN_MAIN_JOURNAL|o.SQLITE_OPEN_SUPER_JOURNAL|o.SQLITE_OPEN_WAL,x=o.SQLITE_OPEN_MEMORY,N=".opaque",O=()=>Math.random().toString(36).slice(2),S=new TextDecoder,L=new TextEncoder,$=Object.assign(Object.create(null),{name:"opfs-sahpool",directory:void 0,initialCapacity:6,clearOnInit:!1,verbosity:2,forceReinitIfPreviouslyFailed:!1}),c=[t.config.error,t.config.warn,t.config.log];t.config.log;const d=t.config.warn;t.config.error;const y=new Map,B=j=>y.get(j),f=(j,b)=>{b?y.set(j,b):y.delete(j)},h=new Map,l=j=>h.get(j),_=(j,b)=>{b?h.set(j,b):h.delete(j)},u={xCheckReservedLock:function(j,b){const k=l(j);return k.log("xCheckReservedLock"),k.storeErr(),g.poke32(b,1),0},xClose:function(j){const b=l(j);b.storeErr();const k=b.getOFileForS3File(j);if(k)try{b.log(`xClose ${k.path}`),b.mapS3FileToOFile(j,!1),k.sah.flush(),k.flags&o.SQLITE_OPEN_DELETEONCLOSE&&b.deletePath(k.path)}catch(W){return b.storeErr(W,o.SQLITE_IOERR)}return 0},xDeviceCharacteristics:function(j){return o.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(j,b,k){return o.SQLITE_NOTFOUND},xFileSize:function(j,b){const k=l(j);k.log("xFileSize");const H=k.getOFileForS3File(j).sah.getSize()-q;return g.poke64(b,BigInt(H)),0},xLock:function(j,b){const k=l(j);k.log(`xLock ${b}`),k.storeErr();const W=k.getOFileForS3File(j);return W.lockType=b,0},xRead:function(j,b,k,W){const H=l(j);H.storeErr();const Z=H.getOFileForS3File(j);H.log(`xRead ${Z.path} ${k} @ ${W}`);try{const E=Z.sah.read(g.heap8u().subarray(b,b+k),{at:q+Number(W)});return Eb&&g.poke8(k+b-1,0)}catch{return o.SQLITE_NOMEM}finally{g.scopedAllocPop(Z)}}return H?H.sqlite3Rc||o.SQLITE_IOERR:0},xOpen:function(b,k,W,H,Z){const E=B(b);try{H&=~x,E.log(`xOpen ${g.cstrToJs(k)} ${H}`);const C=k&&g.peek8(k)?E.getPath(k):O();let M=E.getSAHForPath(C);!M&&H&o.SQLITE_OPEN_CREATE&&(E.getFileCount()f(b.pointer,0)),W&&(b.$xRandomness=W.$xRandomness,b.$xSleep=W.$xSleep,W.dispose()),!b.$xRandomness&&!U.xRandomness&&(U.xRandomness=function(H,Z,E){const C=g.heap8u();let M=0;for(;M0),t.vfs.installVfs({vfs:{struct:b,methods:U}}),b};class ne{vfsDir;#e;#o;#a;#r=new Map;#t=new Map;#s=new Set;#l=new Map;#n=new Uint8Array(T);#c;#i;#u;constructor(b=Object.create(null)){this.#u=b.verbosity??$.verbosity,this.vfsName=b.name||$.name,this.#i=ee(this.vfsName),f(this.#i.pointer,this),this.vfsDir=b.directory||"."+this.vfsName,this.#c=new DataView(this.#n.buffer,this.#n.byteOffset),this.isReady=this.reset(!!(b.clearOnInit??$.clearOnInit)).then(()=>{if(this.$error)throw this.$error;return this.getCapacity()?Promise.resolve(void 0):this.addCapacity(b.initialCapacity||$.initialCapacity)})}#_(b,...k){this.#u>b&&c[b](this.vfsName+":",...k)}log(...b){this.#_(2,...b)}warn(...b){this.#_(1,...b)}error(...b){this.#_(0,...b)}getVfs(){return this.#i}getCapacity(){return this.#r.size}getFileCount(){return this.#t.size}getFileNames(){const b=[];for(const k of this.#t.keys())b.push(k);return b}async addCapacity(b){for(let k=0;k{try{const Z=await H.createSyncAccessHandle();if(this.#r.set(Z,W),b)Z.truncate(q),this.setAssociatedPath(Z,"",0);else{const E=this.getAssociatedPath(Z);E?this.#t.set(E,Z):this.#s.add(Z)}}catch(Z){throw this.storeErr(Z),this.releaseAccessHandles(),Z}}))}getAssociatedPath(b){b.read(this.#n,{at:0});const k=this.#c.getUint32(A);if(this.#n[0]&&(k&o.SQLITE_OPEN_DELETEONCLOSE||(k&w)===0))return d(`Removing file with unexpected flags ${k.toString(16)}`,this.#n),this.setAssociatedPath(b,"",0),"";const W=new Uint32Array(Q/4);b.read(W,{at:D});const H=this.computeDigest(this.#n,k);if(W.every((Z,E)=>Z===H[E])){const Z=this.#n.findIndex(E=>E===0);return Z===0&&b.truncate(q),Z?S.decode(this.#n.subarray(0,Z)):""}else return d("Disassociating file with bad digest."),this.setAssociatedPath(b,"",0),""}setAssociatedPath(b,k,W){const H=L.encodeInto(k,this.#n);R<=H.written+1&&n("Path too long:",k),k&&W&&(W|=x),this.#n.fill(0,H.written,R),this.#c.setUint32(A,W);const Z=this.computeDigest(this.#n,W);b.write(this.#n,{at:0}),b.write(Z,{at:D}),b.flush(),k?(this.#t.set(k,b),this.#s.delete(b)):(b.truncate(q),this.#s.add(b))}computeDigest(b,k){if(k&x){let W=3735928559,H=1103547991;for(const Z of b)W=Math.imul(W^Z,2654435761),H=Math.imul(H^Z,104729);return new Uint32Array([W>>>0,H>>>0])}else return new Uint32Array([0,0])}async reset(b){await this.isReady;let k=await navigator.storage.getDirectory(),W;for(const H of this.vfsDir.split("/"))H&&(W=k,k=await k.getDirectoryHandle(H,{create:!0}));return this.#e=k,this.#a=W,this.#o=await this.#e.getDirectoryHandle(N,{create:!0}),this.releaseAccessHandles(),this.acquireAccessHandles(b)}getPath(b){return g.isPtr(b)&&(b=g.cstrToJs(b)),(b instanceof URL?b:new URL(b,"file://localhost/")).pathname}deletePath(b){const k=this.#t.get(b);return k&&(this.#t.delete(b),this.setAssociatedPath(k,"",0)),!!k}storeErr(b,k){return b&&(b.sqlite3Rc=k||o.SQLITE_IOERR,this.error(b)),this.$error=b,k}popErr(){const b=this.$error;return this.$error=void 0,b}nextAvailableSAH(){const[b]=this.#s.keys();return b}getOFileForS3File(b){return this.#l.get(b)}mapS3FileToOFile(b,k){k?(this.#l.set(b,k),_(b,this)):(this.#l.delete(b),_(b,!1))}hasFilename(b){return this.#t.has(b)}getSAHForPath(b){return this.#t.get(b)}async removeVfs(){if(!this.#i.pointer||!this.#o)return!1;o.sqlite3_vfs_unregister(this.#i.pointer),this.#i.dispose(),delete s[this.vfsName];try{this.releaseAccessHandles(),await this.#e.removeEntry(N,{recursive:!0}),this.#o=void 0,await this.#a.removeEntry(this.#e.name,{recursive:!0}),this.#e=this.#a=void 0}catch(b){t.config.error(this.vfsName,"removeVfs() failed with no recovery strategy:",b)}return!0}pauseVfs(){return this.#l.size>0&&t.SQLite3Error.toss(o.SQLITE_MISUSE,"Cannot pause VFS",this.vfsName,"because it has opened files."),this.#r.size>0&&(o.sqlite3_vfs_unregister(this.vfsName),this.releaseAccessHandles()),this}isPaused(){return this.#r.size===0}async unpauseVfs(){return this.#r.size===0?this.acquireAccessHandles(!1).then(()=>o.sqlite3_vfs_register(this.#i,0),this):this}exportFile(b){const k=this.#t.get(b)||n("File not found:",b),W=k.getSize()-q,H=new Uint8Array(W>0?W:0);if(W>0){const Z=k.read(H,{at:q});Z!=W&&n("Expected to read "+W+" bytes but read "+Z+".")}return H}async importDbChunked(b,k){const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to.");W.truncate(0);let H=0,Z,E=!1;try{for(;(Z=await k())!==void 0;)Z instanceof ArrayBuffer&&(Z=new Uint8Array(Z)),H===0&&Z.byteLength>=15&&(p.affirmDbHeader(Z),E=!0),W.write(Z,{at:q+H}),H+=Z.byteLength;if((H<512||H%512!==0)&&n("Input size",H,"is not correct for an SQLite database."),!E){const C=new Uint8Array(20);W.read(C,{at:0}),p.affirmDbHeader(C)}W.write(new Uint8Array([1,1]),{at:q+18})}catch(C){throw this.setAssociatedPath(W,"",0),C}return this.setAssociatedPath(W,b,o.SQLITE_OPEN_MAIN_DB),H}importDb(b,k){if(k instanceof ArrayBuffer)k=new Uint8Array(k);else if(k instanceof Function)return this.importDbChunked(b,k);const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to."),H=k.byteLength;(H<512||H%512!=0)&&n("Byte array size is invalid for an SQLite db.");const Z="SQLite format 3";for(let C=0;Cthis)}isPaused(){return this.#e.isPaused()}}const ie=async()=>{const j=await navigator.storage.getDirectory(),b=".opfs-sahpool-sync-check-"+O(),H=(await(await j.getFileHandle(b,{create:!0})).createSyncAccessHandle()).close();return await H,await j.removeEntry(b),H?.then&&n("The local OPFS API is too old for opfs-sahpool:","it has an async FileSystemSyncAccessHandle.close() method."),!0};t.installOpfsSAHPoolVfs=async function(j=Object.create(null)){j=Object.assign(Object.create(null),$,j||{});const b=j.name;if(j.$testThrowPhase1)throw j.$testThrowPhase1;if(s[b])try{return await s[b]}catch(k){if(j.forceReinitIfPreviouslyFailed)delete s[b];else throw k}return!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory?s[b]=Promise.reject(new Error("Missing required OPFS APIs.")):s[b]=ie().then(async function(){if(j.$testThrowPhase2)throw j.$testThrowPhase2;const k=new ne(j);return k.isReady.then(async()=>{const W=new se(k);if(t.oo1){const H=t.oo1,Z=k.getVfs(),E=function(...C){const M=H.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=Z.$zName,H.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(H.DB.prototype),W.OpfsSAHPoolDb=E}return k.log("VFS initialized."),W}).catch(async W=>{throw await k.removeVfs().catch(()=>{}),W})}).catch(k=>s[b]=Promise.reject(k))}}),typeof i<"u"){const t=Object.assign(Object.create(null),{exports:typeof m>"u"?i.asm:m,memory:i.wasmMemory},globalThis.sqlite3ApiConfig||{});globalThis.sqlite3ApiConfig=t;let n;try{n=globalThis.sqlite3ApiBootstrap()}catch(r){throw console.error("sqlite3ApiBootstrap() error:",r),r}finally{delete globalThis.sqlite3ApiBootstrap,delete globalThis.sqlite3ApiConfig}i.sqlite3=n}else console.warn("This is not running in an Emscripten module context, so","globalThis.sqlite3ApiBootstrap() is _not_ being called due to lack","of config info for the WASM environment.","It must be called manually.")},ge=Ne,ge}})();const Xn=(function(){const qe=Ft;if(!qe)throw new Error("Expecting globalThis.sqlite3InitModule to be defined by the Emscripten build.");const ce=globalThis.sqlite3InitModuleState=Object.assign(Object.create(null),{moduleScript:globalThis?.document?.currentScript,isWorker:typeof WorkerGlobalScope<"u",location:globalThis.location,urlParams:globalThis?.location?.href?new URL(globalThis.location.href).searchParams:new URLSearchParams});if(ce.debugModule=ce.urlParams.has("sqlite3.debugModule")?(...ge)=>console.warn("sqlite3.debugModule:",...ge):()=>{},ce.urlParams.has("sqlite3.dir"))ce.sqlite3Dir=ce.urlParams.get("sqlite3.dir")+"/";else if(ce.moduleScript){const ge=ce.moduleScript.src.split("/");ge.pop(),ce.sqlite3Dir=ge.join("/")+"/"}if(globalThis.sqlite3InitModule=function ge(...i){return qe(...i).then(ye=>{ye.runSQLite3PostLoadInit(ye);const Ee=ye.sqlite3;Ee.scriptInfo=ce,ge.__isUnderTest&&(Ee.__isUnderTest=!0);const Ne=Ee.asyncPostInit;return delete Ee.asyncPostInit,Ne()}).catch(ye=>{throw console.error("Exception loading sqlite3 module:",ye),ye})},globalThis.sqlite3InitModule.ready=qe.ready,globalThis.sqlite3InitModuleState.moduleScript){const ge=globalThis.sqlite3InitModuleState;let i=ge.moduleScript.src.split("/");i.pop(),ge.scriptDir=i.join("/")+"/"}return ce.debugModule("sqlite3InitModuleState =",ce),globalThis.sqlite3InitModule})();Ft=Xn;globalThis.sqlite3Worker1Promiser=function qe(ce=qe.defaultConfig){if(arguments.length===1&&typeof arguments[0]=="function"){const re=ce;ce=Object.assign(Object.create(null),qe.defaultConfig),ce.onready=re}else ce=Object.assign(Object.create(null),qe.defaultConfig,ce);const ge=Object.create(null),i=function(){},ye=ce.onerror||i,Ee=ce.debug||i,Ne=ce.generateMessageId?void 0:Object.create(null),Je=ce.generateMessageId||function(re){return re.type+"#"+(Ne[re.type]=(Ne[re.type]||0)+1)},Oe=(...re)=>{throw new Error(re.join(" "))};ce.worker||(ce.worker=qe.defaultConfig.worker),typeof ce.worker=="function"&&(ce.worker=ce.worker());let Fe,Qe;return ce.worker.onmessage=function(re){re=re.data,Ee("worker1.onmessage",re);let me=ge[re.messageId];if(!me){if(re&&re.type==="sqlite3-api"&&re.result==="worker1-ready"){ce.onready&&ce.onready(Qe);return}if(me=ge[re.type],me&&me.onrow){me.onrow(re);return}ce.onunhandled?ce.onunhandled(arguments[0]):ye("sqlite3Worker1Promiser() unhandled worker message:",re);return}switch(delete ge[re.messageId],re.type){case"error":me.reject(re);return;case"open":Fe||(Fe=re.dbId);break;case"close":re.dbId===Fe&&(Fe=void 0);break}try{me.resolve(re)}catch(Ae){me.reject(Ae)}},Qe=function(){let re;arguments.length===1?re=arguments[0]:arguments.length===2?(re=Object.create(null),re.type=arguments[0],re.args=arguments[1],re.dbId=re.args.dbId):Oe("Invalid arguments for sqlite3Worker1Promiser()-created factory."),!re.dbId&&re.type!=="open"&&(re.dbId=Fe),re.messageId=Je(re),re.departureTime=performance.now();const me=Object.create(null);me.message=re;let Ae;re.type==="exec"&&re.args&&(typeof re.args.callback=="function"?(Ae=re.messageId+":row",me.onrow=re.args.callback,re.args.callback=Ae,ge[Ae]=me):typeof re.args.callback=="string"&&Oe("exec callback may not be a string when using the Promise interface."));let Le=new Promise(function(Me,He){me.resolve=Me,me.reject=He,ge[re.messageId]=me,Ee("Posting",re.type,"message to Worker dbId="+(Fe||"default")+":",re),ce.worker.postMessage(re)});return Ae&&(Le=Le.finally(()=>delete ge[Ae])),Le}};globalThis.sqlite3Worker1Promiser.defaultConfig={worker:function(){return new Worker(new URL(""+new URL("sqlite3-worker1-bundler-friendly-Bv6ABw9v.js",import.meta.url).href,import.meta.url),{type:"module"})},onerror:(...qe)=>console.error("worker1 promiser error",...qe)};sqlite3Worker1Promiser.v2=(function(qe){let ce;typeof qe=="function"?(ce=qe,qe={}):typeof qe?.onready=="function"&&(ce=qe.onready,delete qe.onready);const ge=Object.create(null);qe=Object.assign(qe||Object.create(null),{onready:async function(ye){try{ce&&await ce(ye),ge.resolve(ye)}catch(Ee){ge.reject(Ee)}}});const i=new Promise(function(ye,Ee){ge.resolve=ye,ge.reject=Ee});try{this.original(qe)}catch(ye){ge.reject(ye)}return i}).bind({original:sqlite3Worker1Promiser});sqlite3Worker1Promiser.v2;const er=globalThis.sqlite3Worker1Promiser;export{Ft as default,er as sqlite3Worker1Promiser}; diff --git a/docus/dist/_nuxt/CrCM1jgP.js b/docus/dist/_nuxt/CrCM1jgP.js new file mode 100644 index 0000000..a9fa1f3 --- /dev/null +++ b/docus/dist/_nuxt/CrCM1jgP.js @@ -0,0 +1 @@ +const o={or:"или",error:{title:"Страница не найдена",description:"Извините, но запрашиваемая страница не найдена."}},a={copy:{page:"Копировать страницу",link:"Копировать Markdown-страницу",view:"Просмотреть как Markdown",gpt:"Открыть в ChatGPT",claude:"Открыть в Claude"},links:"Сообщество",toc:"На этой странице",menu:"Меню",report:"Сообщить о проблеме",edit:"Редактировать эту страницу"},e={copyLogo:"Копировать логотип",copyWordmark:"Копировать словесный знак",downloadLogo:"Скачать логотип",downloadWordmark:"Скачать словесный знак",brandAssets:"Материалы бренда",logoCopied:"Логотип скопирован",wordmarkCopied:"Словесный знак скопирован",logoDownloaded:"Логотип скачан",wordmarkDownloaded:"Словесный знак скачан",copyLogoFailed:"Не удалось скопировать логотип",copyWordmarkFailed:"Не удалось скопировать словесный знак"},n={title:"Спросите ИИ",placeholder:"Задайте вопрос...",tooltip:"Задайте вопрос ИИ",tryAsking:"Попробуйте задать вопрос",askAnything:"Спросите что угодно...",clearChat:"Очистить чат",close:"Закрыть",expand:"Развернуть",collapse:"Свернуть",thinking:"Думаю...",askMeAnything:"Спросите что угодно",askMeAnythingDescription:"Получите помощь в навигации по документации, понимании концепций и поиске ответов.",faq:"Часто задаваемые вопросы",chatCleared:"Чат очищается при обновлении",lineBreak:"Разрыв строки",explainWithAi:"Объясните с помощью ИИ",toolListPages:"Перечисленные страницы документации",toolReadPage:"Читать",loading:{searching:"Поиск документации",reading:"Чтение документации",analyzing:"Анализ контента",finding:"Поиск лучшего ответа",finished:"Использованные источники"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/Crnsupp9.js b/docus/dist/_nuxt/Crnsupp9.js new file mode 100644 index 0000000..09dc1bf --- /dev/null +++ b/docus/dist/_nuxt/Crnsupp9.js @@ -0,0 +1 @@ +const o={or:"ឬ",error:{title:"រកមិនឃើញទំព័រ",description:"យើងសុំទោស ប៉ុន្តែទំព័រដែលអ្នកកំពុងស្វែងរកមិនអាចរកឃើញទេ។"}},a={copy:{page:"ចម្លងទំព័រ",link:"ចម្លងទំព័រ Markdown",view:"មើលជា Markdown",gpt:"បើកនៅ ChatGPT",claude:"បើកនៅ Claude"},links:"សហគមន៍",toc:"នៅលើទំព័រនេះ",menu:"ម៉ឺនុយ",report:"រាយការណ៍បញ្ហា",edit:"កែសម្រួលទំព័រនេះ"},e={copyLogo:"ចម្លងនិមិត្តសញ្ញា",copyWordmark:"ចម្លង wordmark",downloadLogo:"ទាញយកនិមិត្តសញ្ញា",downloadWordmark:"ទាញយក wordmark",brandAssets:"ទ្រព្យសម្បត្តិម៉ាក",logoCopied:"បានចម្លងនិមិត្តសញ្ញា",wordmarkCopied:"បានចម្លង wordmark",logoDownloaded:"បានទាញយកនិមិត្តសញ្ញា",wordmarkDownloaded:"បានទាញយក wordmark",copyLogoFailed:"មិនអាចចម្លងនិមិត្តសញ្ញាបានទេ",copyWordmarkFailed:"មិនអាចចម្លង wordmark បានទេ"},d={title:"សួរ AI",placeholder:"សំណួរមួយ...",tooltip:"សួរសំណួរទៅកាន់ AI",tryAsking:"ព្យាយាមសួរសំណួរមួយ",askAnything:"សួរអ្វីក៏បាន...",clearChat:"ជម្រះការជជែកកំសាន្ត",close:"បិទ",expand:"ពង្រីក",collapse:"បង្រួម",thinking:"កំពុងគិត...",askMeAnything:"សួរអ្វីក៏បាន",askMeAnythingDescription:"ទទួលបានជំនួយក្នុងការរុករកឯកសារ ការយល់ដឹងអំពីគោលគំនិត និងការស្វែងរកចម្លើយ ។",faq:"សំណួរដែលចោទសួរញឹកញាប់",chatCleared:"បានសម្អាតការជជែកកំសាន្តនៅពេលរីហ្វ្រែស",lineBreak:"ការបំបែកបន្ទាត់",explainWithAi:"ពន្យល់ដោយ AI",toolListPages:"ទំព័រឯកសារដែលបានចុះបញ្ជី",toolReadPage:"អាន",loading:{searching:"ការស្វែងរកឯកសារ",reading:"ការ អាន តាម រយៈ ឯកសារ",analyzing:"ការវិភាគមាតិកា",finding:"ការស្វែងរកចម្លើយដែលត្រឹមត្រូវបំផុត",finished:"ប្រភពដែលបានប្រើ"}},n={common:o,docs:a,logo:e,assistant:d};export{d as assistant,o as common,n as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/CsIQayK_.js b/docus/dist/_nuxt/CsIQayK_.js new file mode 100644 index 0000000..877a106 --- /dev/null +++ b/docus/dist/_nuxt/CsIQayK_.js @@ -0,0 +1 @@ +import{a0 as i,a1 as p,a as n,p as c,ac as d,s as a,P as f,c as m,am as t,o as v,q as y}from"./B3fabVUf.js";const C={base:"my-5 divide-y divide-default *:not-last:pb-5"},P={__name:"ProseFieldGroup",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const e=s,o=i(),l=p("prose.fieldGroup",e),r=m(()=>t({extend:t(C),...o.ui?.prose?.fieldGroup||{}}));return(u,b)=>(v(),n(a(f),{as:s.as,class:d(r.value({class:[a(l)?.base,e.class]}))},{default:c(()=>[y(u.$slots,"default")]),_:3},8,["as","class"]))}};export{P as default}; diff --git a/docus/dist/_nuxt/CsxHJ_Yb.js b/docus/dist/_nuxt/CsxHJ_Yb.js new file mode 100644 index 0000000..54bc819 --- /dev/null +++ b/docus/dist/_nuxt/CsxHJ_Yb.js @@ -0,0 +1 @@ +const a={or:"atau",error:{title:"Halaman tidak dijumpai",description:"Kami mohon maaf, tetapi halaman yang anda cari tidak dapat dijumpai."}},n={copy:{page:"Salin halaman",link:"Salin halaman Markdown",view:"Lihat sebagai Markdown",gpt:"Buka di ChatGPT",claude:"Buka di Claude"},links:"Komuniti",toc:"Dalam halaman ini",menu:"Menu",report:"Laporkan masalah",edit:"Edit halaman ini"},o={copyLogo:"Salin logo",copyWordmark:"Salin wordmark",downloadLogo:"Muat turun logo",downloadWordmark:"Muat turun wordmark",brandAssets:"Aset jenama",logoCopied:"Logo disalin",wordmarkCopied:"Wordmark disalin",logoDownloaded:"Logo dimuat turun",wordmarkDownloaded:"Wordmark dimuat turun",copyLogoFailed:"Gagal menyalin logo",copyWordmarkFailed:"Gagal menyalin wordmark"},i={title:"Tanya AI",placeholder:"Tanya soalan...",tooltip:"Tanya soalan kepada AI",tryAsking:"Cuba tanya soalan",askAnything:"Tanya apa-apa...",clearChat:"Kosongkan sembang",close:"Tutup",expand:"Kembangkan",collapse:"Kecilkan",thinking:"Berfikir...",askMeAnything:"Tanya apa sahaja",askMeAnythingDescription:"Dapatkan bantuan untuk menavigasi dokumentasi, memahami konsep, dan mencari jawapan.",faq:"Soalan Lazim",chatCleared:"Sembang dikosongkan semasa segar semula",lineBreak:"Pemutus baris",explainWithAi:"Terangkan dengan AI",toolListPages:"Halaman dokumentasi tersenarai",toolReadPage:"Baca",loading:{searching:"Mencari dokumentasi",reading:"Membaca dokumen",analyzing:"Menganalisis kandungan",finding:"Mencari jawapan terbaik",finished:"Sumber yang digunakan"}},e={common:a,docs:n,logo:o,assistant:i};export{i as assistant,a as common,e as default,n as docs,o as logo}; diff --git a/docus/dist/_nuxt/CuQFqh_W.js b/docus/dist/_nuxt/CuQFqh_W.js new file mode 100644 index 0000000..c412ff2 --- /dev/null +++ b/docus/dist/_nuxt/CuQFqh_W.js @@ -0,0 +1 @@ +const o={or:"অথবা",error:{title:"পেজ খুঁজে পাওয়া যায়নি",description:"দুঃখিত, আপনি যে পেজটি খুঁজছেন সেটি পাওয়া যায়নি।"}},a={copy:{page:"পেজ কপি করুন",link:"Markdown পেজ কপি করুন",view:"Markdown হিসেবে দেখুন",gpt:"ChatGPT এ খুলুন",claude:"Claude এ খুলুন"},links:"কমিউনিটি",toc:"এই পেজে",menu:"মেনু",report:"সমস্যা রিপোর্ট করুন",edit:"এই পেজ সম্পাদনা করুন"},e={copyLogo:"লোগো কপি করুন",copyWordmark:"ওয়ার্ডমার্ক কপি করুন",downloadLogo:"লোগো ডাউনলোড করুন",downloadWordmark:"ওয়ার্ডমার্ক ডাউনলোড করুন",brandAssets:"ব্র্যান্ড অ্যাসেট",logoCopied:"লোগো কপি হয়েছে",wordmarkCopied:"ওয়ার্ডমার্ক কপি হয়েছে",logoDownloaded:"লোগো ডাউনলোড হয়েছে",wordmarkDownloaded:"ওয়ার্ডমার্ক ডাউনলোড হয়েছে",copyLogoFailed:"লোগো কপি করা যায়নি",copyWordmarkFailed:"ওয়ার্ডমার্ক কপি করা যায়নি"},n={title:"AI-কে জিজ্ঞাসা করুন",placeholder:"একটি প্রশ্ন জিজ্ঞাসা করুন...",tooltip:"AI-কে একটি প্রশ্ন জিজ্ঞাসা করুন",tryAsking:"একটি প্রশ্ন জিজ্ঞাসা করার চেষ্টা করুন",askAnything:"যেকোনো কিছু জিজ্ঞাসা করুন...",clearChat:"চ্যাট সাফ করুন",close:"বন্ধ করুন",expand:"প্রসারিত করুন",collapse:"সঙ্কুচিত",thinking:"চিন্তা করা হচ্ছে...",askMeAnything:"যেকোনো কিছু জিজ্ঞাসা করুন",askMeAnythingDescription:"ডকুমেন্টেশন নেভিগেট করতে, ধারণাগুলি বুঝতে এবং উত্তর খুঁজে পেতে সহায়তা পান ।",faq:"প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী",chatCleared:"রিফ্রেশে চ্যাট সাফ করা হয়",lineBreak:"লাইন ব্রেক",explainWithAi:"AI এর সাথে ব্যাখ্যা করুন",toolListPages:"তালিকাভুক্ত ডকুমেন্টেশন পৃষ্ঠাগুলি",toolReadPage:"পড়ুন",loading:{searching:"ডকুমেন্টেশন অনুসন্ধান করা হচ্ছে",reading:"ডকুমেন্টের মাধ্যমে পড়া",analyzing:"বিষয়বস্তু বিশ্লেষণ করা হচ্ছে",finding:"সেরা উত্তর খোঁজা",finished:"ব্যবহৃত উৎসসমূহ"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/CxBf5103.js b/docus/dist/_nuxt/CxBf5103.js new file mode 100644 index 0000000..f1c49a6 --- /dev/null +++ b/docus/dist/_nuxt/CxBf5103.js @@ -0,0 +1,4 @@ +import{c as z,t as ie,u as Gt,d as ne,w as ve,o as E,a as B,m as V,V as Ut,b as Ye,e as H,f as Q,F as ae,r as me,i as Yt,g as Qt,h as ke,j as Xt,k as Jt,l as _t,n as xe,p as O,q as j,s as f,P as he,v as te,x as Te,y as Zt,z as Qe,A as Mt,B as Z,C as ye,D as Xe,E as es,G as ts,H as ss,I as wt,J as kt,K as is,L as ns,M as rt,N as rs,O as as,Q as Je,R as ls,S as os,T as us,U as cs,W as ds,X as hs,Y as fs,Z as se,_ as Ft,$ as Lt,a0 as zt,a1 as Tt,a2 as ps,a3 as Ke,a4 as gs,a5 as ms,a6 as Bt,a7 as vs,a8 as ys,a9 as Re,aa as bs,ab as Se,ac as q,ad as xs,ae as Ss,af as at,ag as pe,ah as Be,ai as As,aj as Dt,ak as lt,al as $e,am as _e,an as Cs,ao as qe,ap as Is,aq as Es,ar as _s,as as Ms,at as ws,au as ks,av as ot,aw as ut,ax as ct,ay as Fs,az as Ls,aA as zs}from"./B3fabVUf.js";import{f as Ie}from"./C5B99YjC.js";import{_ as Ts}from"./DJxuwfoz.js";function Bs(n){return z(()=>ie(n)?!!Gt(n)?.closest("form"):!0)}function Ds(){return{ALT:"Alt",ARROW_DOWN:"ArrowDown",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ARROW_UP:"ArrowUp",BACKSPACE:"Backspace",CAPS_LOCK:"CapsLock",CONTROL:"Control",DELETE:"Delete",END:"End",ENTER:"Enter",ESCAPE:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",HOME:"Home",META:"Meta",PAGE_DOWN:"PageDown",PAGE_UP:"PageUp",SHIFT:"Shift",SPACE:" ",TAB:"Tab",CTRL:"Control",ASTERISK:"*",SPACE_CODE:"Space"}}var Os=ne({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(n){const t=n,{primitiveElement:e,currentElement:s}=Ye(),i=z(()=>t.checked??t.value);return ve(i,(r,a)=>{if(!s.value)return;const l=s.value,u=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(u,"value").set;if(d&&r!==a){const g=new Event("input",{bubbles:!0}),c=new Event("change",{bubbles:!0});d.call(l,r),l.dispatchEvent(g),l.dispatchEvent(c)}}),(r,a)=>(E(),B(Ut,V({ref_key:"primitiveElement",ref:e},{...t,...r.$attrs},{as:"input"}),null,16))}}),dt=Os,Ks=ne({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(n){const t=n,e=z(()=>typeof t.value=="object"&&Array.isArray(t.value)&&t.value.length===0&&t.required),s=z(()=>typeof t.value=="string"||typeof t.value=="number"||typeof t.value=="boolean"||t.value===null||t.value===void 0?[{name:t.name,value:t.value}]:typeof t.value=="object"&&Array.isArray(t.value)?t.value.flatMap((i,r)=>typeof i=="object"?Object.entries(i).map(([a,l])=>({name:`${t.name}[${r}][${a}]`,value:l})):{name:`${t.name}[${r}]`,value:i}):t.value!==null&&typeof t.value=="object"&&!Array.isArray(t.value)?Object.entries(t.value).map(([i,r])=>({name:`${t.name}[${i}]`,value:r})):[]);return(i,r)=>(E(),H(ae,null,[Q(" We render single input if it's required "),e.value?(E(),B(dt,V({key:i.name},{...t,...i.$attrs},{name:i.name,value:i.value}),null,16,["name","value"])):(E(!0),H(ae,{key:1},me(s.value,a=>(E(),B(dt,V({key:a.name},{ref_for:!0},{...t,...i.$attrs},{name:a.name,value:a.value}),null,16,["name","value"]))),128))],2112))}}),Rs=Ks;function ht(n){return n?.querySelector("[data-state=checked]")}function $s(n,t,e){return n===void 0?!1:Array.isArray(n)?n.some(s=>le(s,t,e)):le(n,t,e)}function le(n,t,e){return n===void 0||t===void 0?!1:typeof n=="string"?n===t:typeof e=="function"?e(n,t):typeof e=="string"?n?.[e]===t?.[e]:Yt(n,t)}const[Fe,qs]=Qe("ListboxRoot");var Ps=ne({__name:"ListboxRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},multiple:{type:Boolean,required:!1},orientation:{type:String,required:!1,default:"vertical"},dir:{type:String,required:!1},disabled:{type:Boolean,required:!1},selectionBehavior:{type:String,required:!1,default:"toggle"},highlightOnHover:{type:Boolean,required:!1},by:{type:[String,Function],required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","highlight","entryFocus","leave"],setup(n,{expose:t,emit:e}){const s=n,i=e,{multiple:r,highlightOnHover:a,orientation:l,disabled:u,selectionBehavior:p,dir:d}=Qt(s),{getItems:g}=ke({isProvider:!0}),{handleTypeaheadSearch:c}=Xt(),{primitiveElement:o,currentElement:m}=Ye(),v=Ds(),y=Jt(d),S=Bs(m),_=te(),L=te(!1),K=te(!0),w=_t(s,"modelValue",i,{defaultValue:s.defaultValue??(r.value?[]:void 0),passive:s.modelValue===void 0,deep:!0});function W(b){if(L.value=!0,s.multiple){const M=Array.isArray(w.value)?[...w.value]:[],F=M.findIndex(N=>le(N,b,s.by));s.selectionBehavior==="toggle"?(F===-1?M.push(b):M.splice(F,1),w.value=M):(w.value=[b],_.value=b)}else s.selectionBehavior==="toggle"&&le(w.value,b,s.by)?w.value=void 0:w.value=b;setTimeout(()=>{L.value=!1},1)}const A=te(null),k=te(null),R=te(!1),D=te(!1),J=Te(),ee=Te(),I=Te();function P(){return g().map(b=>b.ref).filter(b=>b.dataset.disabled!=="")}function h(b,M=!0,F){if(!b)return;A.value=b,(F??K.value)&&A.value.focus(),M&&A.value.scrollIntoView({block:"nearest"});const N=g().find(re=>re.ref===b);i("highlight",N)}function $(b){if(R.value)I.trigger(b);else{const M=g().find(F=>le(F.value,b,s.by));M&&(A.value=M.ref,h(M.ref))}}function x(b){A.value&&A.value.isConnected&&(b.preventDefault(),b.stopPropagation(),D.value||A.value.click())}function T(b){if(K.value){if(L.value=!0,R.value)ee.trigger(b);else{const M=b.altKey||b.ctrlKey||b.metaKey;if(M&&b.key==="a"&&r.value){const F=g(),N=F.map(ze=>ze.value);w.value=[...N],b.preventDefault();const re=F.at(-1);re&&h(re.ref)}else if(!M){const F=c(b.key,g());F&&h(F)}}setTimeout(()=>{L.value=!1},1)}}function Y(){D.value=!0}function G(){xe(()=>{D.value=!1})}function fe(){xe(()=>{const b=new KeyboardEvent("keydown",{key:"PageUp"});it(b)})}function Le(b){const M=A.value;M?.isConnected&&(k.value=M),A.value=null,i("leave",b)}function jt(b){const M=new CustomEvent("listbox.entryFocus",{bubbles:!1,cancelable:!0});if(b.currentTarget?.dispatchEvent(M),i("entryFocus",M),!M.defaultPrevented)if(k.value)h(k.value);else{const F=P()?.[0];h(F)}}function it(b){const M=Zt(b,l.value,y.value);if(!M)return;let F=P();if(A.value){if(M==="last")F.reverse();else if(M==="prev"||M==="next"){M==="prev"&&F.reverse();const N=F.indexOf(A.value);F=F.slice(N+1)}Wt(b,F[0])}if(F.length){const N=!A.value&&M==="prev"?F.length-1:0;h(F[N])}if(R.value)return ee.trigger(b)}function Wt(b,M){if(!(R.value||s.selectionBehavior!=="replace"||!r.value||!Array.isArray(w.value)||(b.altKey||b.ctrlKey||b.metaKey)&&!b.shiftKey)&&b.shiftKey){const N=g().filter(be=>be.ref.dataset.disabled!=="");let re=N.find(be=>be.ref===M)?.value;if(b.key===v.END?re=N.at(-1)?.value:b.key===v.HOME&&(re=N[0]?.value),!re||!_.value)return;const ze=Ie(N.map(be=>be.value),_.value,re);w.value=ze}}async function nt(b){if(await xe(),R.value)J.trigger(b);else{const M=P(),F=M.find(N=>N.dataset.state==="checked");F?h(F):M.length&&h(M[0])}}return ve(w,()=>{L.value||xe(()=>{nt()})},{immediate:!0,deep:!0}),t({highlightedElement:A,highlightItem:$,highlightFirstItem:fe,highlightSelected:nt,getItems:g}),qs({modelValue:w,onValueChange:W,multiple:r,orientation:l,dir:y,disabled:u,highlightOnHover:a,highlightedElement:A,isVirtual:R,virtualFocusHook:J,virtualKeydownHook:ee,virtualHighlightHook:I,by:s.by,firstValue:_,selectionBehavior:p,focusable:K,onLeave:Le,onEnter:jt,changeHighlight:h,onKeydownEnter:x,onKeydownNavigation:it,onKeydownTypeAhead:T,onCompositionStart:Y,onCompositionEnd:G,highlightFirstItem:fe}),(b,M)=>(E(),B(f(he),{ref_key:"primitiveElement",ref:o,as:b.as,"as-child":b.asChild,dir:f(y),"data-disabled":f(u)?"":void 0,onPointerleave:Le,onFocusout:M[0]||(M[0]=async F=>{const N=F.relatedTarget||F.target;await xe(),A.value&&f(m)&&!f(m).contains(N)&&Le(F)})},{default:O(()=>[j(b.$slots,"default",{modelValue:f(w)}),f(S)&&b.name?(E(),B(f(Rs),{key:0,name:b.name,value:f(w),disabled:f(u),required:b.required},null,8,["name","value","disabled","required"])):Q("v-if",!0)]),_:3},8,["as","as-child","dir","data-disabled"]))}}),Hs=Ps,Vs=ne({__name:"ListboxContent",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const{CollectionSlot:t}=ke(),e=Fe(),s=Mt(!1,10);return(i,r)=>(E(),B(f(t),null,{default:O(()=>[Z(f(he),{role:"listbox",as:i.as,"as-child":i.asChild,tabindex:f(e).focusable.value?f(e).highlightedElement.value?"-1":"0":"-1","aria-orientation":f(e).orientation.value,"aria-multiselectable":!!f(e).multiple.value,"data-orientation":f(e).orientation.value,onMousedown:r[0]||(r[0]=Xe(a=>s.value=!0,["left"])),onFocus:r[1]||(r[1]=a=>{f(s)||f(e).onEnter(a)}),onKeydown:[r[2]||(r[2]=ye(a=>{f(e).orientation.value==="vertical"&&(a.key==="ArrowLeft"||a.key==="ArrowRight")||f(e).orientation.value==="horizontal"&&(a.key==="ArrowUp"||a.key==="ArrowDown")||(a.preventDefault(),f(e).focusable.value&&f(e).onKeydownNavigation(a))},["down","up","left","right","home","end"])),ye(f(e).onKeydownEnter,["enter"]),f(e).onKeydownTypeAhead]},{default:O(()=>[j(i.$slots,"default")]),_:3},8,["as","as-child","tabindex","aria-orientation","aria-multiselectable","data-orientation","onKeydown"])]),_:3}))}}),Ns=Vs,js=ne({__name:"ListboxFilter",props:{modelValue:{type:String,required:!1},autoFocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"input"}},emits:["update:modelValue"],setup(n,{emit:t}){const e=n,i=_t(e,"modelValue",t,{defaultValue:"",passive:e.modelValue===void 0}),r=Fe(),{primitiveElement:a,currentElement:l}=Ye(),u=z(()=>e.disabled||r.disabled.value||!1),p=te();return es(()=>p.value=r.highlightedElement.value?.id),ts(()=>{r.focusable.value=!1,setTimeout(()=>{e.autoFocus&&l.value?.focus()},1)}),ss(()=>{r.focusable.value=!0}),(d,g)=>(E(),B(f(he),{ref_key:"primitiveElement",ref:a,as:d.as,"as-child":d.asChild,value:f(i),disabled:u.value?"":void 0,"data-disabled":u.value?"":void 0,"aria-disabled":u.value??void 0,"aria-activedescendant":p.value,type:"text",onKeydown:[ye(Xe(f(r).onKeydownNavigation,["prevent"]),["down","up","home","end"]),ye(f(r).onKeydownEnter,["enter"])],onInput:g[0]||(g[0]=c=>{i.value=c.target.value,f(r).highlightFirstItem()}),onCompositionstart:f(r).onCompositionStart,onCompositionend:f(r).onCompositionEnd},{default:O(()=>[j(d.$slots,"default",{modelValue:f(i)})]),_:3},8,["as","as-child","value","disabled","data-disabled","aria-disabled","aria-activedescendant","onKeydown","onCompositionstart","onCompositionend"]))}}),Ws=js;const[Gs,Us]=Qe("ListboxGroup");var Ys=ne({__name:"ListboxGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const t=n,e=wt(void 0,"reka-listbox-group");return Us({id:e}),(s,i)=>(E(),B(f(he),V({role:"group"},t,{"aria-labelledby":f(e)}),{default:O(()=>[j(s.$slots,"default")]),_:3},16,["aria-labelledby"]))}}),Qs=Ys,Xs=ne({__name:"ListboxGroupLabel",props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},setup(n){const t=n,e=Gs({id:""});return(s,i)=>(E(),B(f(he),V(t,{id:f(e).id}),{default:O(()=>[j(s.$slots,"default")]),_:3},16,["id"]))}}),Js=Xs;const Zs="listbox.select",[ei,ti]=Qe("ListboxItem");var si=ne({__name:"ListboxItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},emits:["select"],setup(n,{emit:t}){const e=n,s=t,i=wt(void 0,"reka-listbox-item"),{CollectionItem:r}=ke(),{forwardRef:a,currentElement:l}=kt(),u=Fe(),p=z(()=>l.value===u.highlightedElement.value),d=z(()=>$s(u.modelValue.value,e.value,u.by)),g=z(()=>u.disabled.value||e.disabled);async function c(m){s("select",m),!m?.defaultPrevented&&!g.value&&m&&(u.onValueChange(e.value),u.changeHighlight(l.value))}function o(m){const v={originalEvent:m,value:e.value};ns(Zs,c,v)}return ti({isSelected:d}),(m,v)=>(E(),B(f(r),{value:m.value},{default:O(()=>[is([p.value,d.value],()=>Z(f(he),V({id:f(i)},m.$attrs,{ref:f(a),role:"option",tabindex:f(u).focusable.value?p.value?"0":"-1":-1,"aria-selected":d.value,as:m.as,"as-child":m.asChild,disabled:g.value?"":void 0,"data-disabled":g.value?"":void 0,"data-highlighted":p.value?"":void 0,"data-state":d.value?"checked":"unchecked",onClick:o,onKeydown:ye(Xe(o,["prevent"]),["space"]),onPointermove:v[0]||(v[0]=()=>{f(u).highlightedElement.value!==f(l)&&f(u).highlightOnHover.value&&f(u).changeHighlight(f(l),!1,!1)})}),{default:O(()=>[j(m.$slots,"default")]),_:3},16,["id","tabindex","aria-selected","as","as-child","disabled","data-disabled","data-highlighted","data-state","onKeydown"]),v,1)]),_:3},8,["value"]))}}),ii=si,ni=ne({__name:"ListboxItemIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(n){const t=n;kt();const e=ei();return(s,i)=>f(e).isSelected.value?(E(),B(f(he),V({key:0,"aria-hidden":"true"},t),{default:O(()=>[j(s.$slots,"default")]),_:3},16)):Q("v-if",!0)}}),ri=ni;function ge(n,t,e){let s=e.initialDeps??[],i,r=!0;function a(){var l,u,p;let d;e.key&&((l=e.debug)!=null&&l.call(e))&&(d=Date.now());const g=n();if(!(g.length!==s.length||g.some((m,v)=>s[v]!==m)))return i;s=g;let o;if(e.key&&((u=e.debug)!=null&&u.call(e))&&(o=Date.now()),i=t(...g),e.key&&((p=e.debug)!=null&&p.call(e))){const m=Math.round((Date.now()-d)*100)/100,v=Math.round((Date.now()-o)*100)/100,y=v/16,S=(_,L)=>{for(_=String(_);_.length{s=l},a}function ft(n,t){if(n===void 0)throw new Error("Unexpected undefined");return n}const ai=(n,t)=>Math.abs(n-t)<1.01,li=(n,t,e)=>{let s;return function(...i){n.clearTimeout(s),s=n.setTimeout(()=>t.apply(this,i),e)}},pt=n=>{const{offsetWidth:t,offsetHeight:e}=n;return{width:t,height:e}},oi=n=>n,ui=n=>{const t=Math.max(n.startIndex-n.overscan,0),e=Math.min(n.endIndex+n.overscan,n.count-1),s=[];for(let i=t;i<=e;i++)s.push(i);return s},ci=(n,t)=>{const e=n.scrollElement;if(!e)return;const s=n.targetWindow;if(!s)return;const i=a=>{const{width:l,height:u}=a;t({width:Math.round(l),height:Math.round(u)})};if(i(pt(e)),!s.ResizeObserver)return()=>{};const r=new s.ResizeObserver(a=>{const l=()=>{const u=a[0];if(u?.borderBoxSize){const p=u.borderBoxSize[0];if(p){i({width:p.inlineSize,height:p.blockSize});return}}i(pt(e))};n.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(l):l()});return r.observe(e,{box:"border-box"}),()=>{r.unobserve(e)}},gt={passive:!0},mt=typeof window>"u"?!0:"onscrollend"in window,di=(n,t)=>{const e=n.scrollElement;if(!e)return;const s=n.targetWindow;if(!s)return;let i=0;const r=n.options.useScrollendEvent&&mt?()=>{}:li(s,()=>{t(i,!1)},n.options.isScrollingResetDelay),a=d=>()=>{const{horizontal:g,isRtl:c}=n.options;i=g?e.scrollLeft*(c&&-1||1):e.scrollTop,r(),t(i,d)},l=a(!0),u=a(!1);e.addEventListener("scroll",l,gt);const p=n.options.useScrollendEvent&&mt;return p&&e.addEventListener("scrollend",u,gt),()=>{e.removeEventListener("scroll",l),p&&e.removeEventListener("scrollend",u)}},hi=(n,t,e)=>{if(t?.borderBoxSize){const s=t.borderBoxSize[0];if(s)return Math.round(s[e.options.horizontal?"inlineSize":"blockSize"])}return n[e.options.horizontal?"offsetWidth":"offsetHeight"]},fi=(n,{adjustments:t=0,behavior:e},s)=>{var i,r;const a=n+t;(r=(i=s.scrollElement)==null?void 0:i.scrollTo)==null||r.call(i,{[s.options.horizontal?"left":"top"]:a,behavior:e})};class pi{constructor(t){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this.itemSizeCache=new Map,this.laneAssignments=new Map,this.pendingMeasuredCacheIndexes=[],this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.now=()=>{var e,s,i;return((i=(s=(e=this.targetWindow)==null?void 0:e.performance)==null?void 0:s.now)==null?void 0:i.call(s))??Date.now()},this.observer=(()=>{let e=null;const s=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(i=>{i.forEach(r=>{const a=()=>{const l=r.target,u=this.indexFromElement(l);if(!l.isConnected){this.observer.unobserve(l);return}this.shouldMeasureDuringScroll(u)&&this.resizeItem(u,this.options.measureElement(l,r,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(a):a()})}));return{disconnect:()=>{var i;(i=s())==null||i.disconnect(),e=null},observe:i=>{var r;return(r=s())==null?void 0:r.observe(i,{box:"border-box"})},unobserve:i=>{var r;return(r=s())==null?void 0:r.unobserve(i)}}})(),this.range=null,this.setOptions=e=>{Object.entries(e).forEach(([s,i])=>{typeof i>"u"&&delete e[s]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:oi,rangeExtractor:ui,onChange:()=>{},measureElement:hi,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",...e}},this.notify=e=>{var s,i;(i=(s=this.options).onChange)==null||i.call(s,this,e)},this.maybeNotify=ge(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;const s=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==s){if(this.cleanup(),!s){this.maybeNotify();return}this.scrollElement=s,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((e=this.scrollElement)==null?void 0:e.window)??null,this.elementsCache.forEach(i=>{this.observer.observe(i)}),this.unsubs.push(this.options.observeElementRect(this,i=>{this.scrollRect=i,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(i,r)=>{this.scrollAdjustments=0,this.scrollDirection=r?this.getScrollOffset()this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,s)=>{const i=new Map,r=new Map;for(let a=s-1;a>=0;a--){const l=e[a];if(i.has(l.lane))continue;const u=r.get(l.lane);if(u==null||l.end>u.end?r.set(l.lane,l):l.enda.end===l.end?a.index-l.index:a.end-l.end)[0]:void 0},this.getMeasurementOptions=ge(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode],(e,s,i,r,a,l,u)=>(this.prevLanes!==void 0&&this.prevLanes!==l&&(this.lanesChangedFlag=!0),this.prevLanes=l,this.pendingMeasuredCacheIndexes=[],{count:e,paddingStart:s,scrollMargin:i,getItemKey:r,enabled:a,lanes:l,laneAssignmentMode:u}),{key:!1}),this.getMeasurements=ge(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:e,paddingStart:s,scrollMargin:i,getItemKey:r,enabled:a,lanes:l,laneAssignmentMode:u},p)=>{if(!a)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(const o of this.laneAssignments.keys())o>=e&&this.laneAssignments.delete(o);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMeasuredCacheIndexes=[]),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(o=>{this.itemSizeCache.set(o.key,o.size)}));const d=this.lanesSettling?0:this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[],this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1);const g=this.measurementsCache.slice(0,d),c=new Array(l).fill(void 0);for(let o=0;o1){y=v;const W=c[y],A=W!==void 0?g[W]:void 0;S=A?A.end+this.options.gap:s+i}else{const W=this.options.lanes===1?g[o-1]:this.getFurthestMeasurement(g,o);S=W?W.end+this.options.gap:s+i,y=W?W.lane:o%this.options.lanes,this.options.lanes>1&&_&&this.laneAssignments.set(o,y)}const L=p.get(m),K=typeof L=="number"?L:this.options.estimateSize(o),w=S+K;g[o]={index:o,start:S,size:K,end:w,key:m,lane:y},c[y]=o}return this.measurementsCache=g,g},{key:!1,debug:()=>this.options.debug}),this.calculateRange=ge(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,s,i,r)=>this.range=e.length>0&&s>0?gi({measurements:e,outerSize:s,scrollOffset:i,lanes:r}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=ge(()=>{let e=null,s=null;const i=this.calculateRange();return i&&(e=i.startIndex,s=i.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,s]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,s]},(e,s,i,r,a)=>r===null||a===null?[]:e({startIndex:r,endIndex:a,overscan:s,count:i}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const s=this.options.indexAttribute,i=e.getAttribute(s);return i?parseInt(i,10):(console.warn(`Missing attribute name '${s}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{var s;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const i=this.scrollState.index??((s=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:s.index);if(i!==void 0&&this.range){const r=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),a=Math.max(0,i-r),l=Math.min(this.options.count-1,i+r);return e>=a&&e<=l}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((a,l)=>{a.isConnected||(this.observer.unobserve(a),this.elementsCache.delete(l))});return}const s=this.indexFromElement(e),i=this.options.getItemKey(s),r=this.elementsCache.get(i);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(i,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(s)&&this.resizeItem(s,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,s)=>{var i;const r=this.measurementsCache[e];if(!r)return;const a=this.itemSizeCache.get(r.key)??r.size,l=s-a;l!==0&&(((i=this.scrollState)==null?void 0:i.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(r,l,this):r.start[this.getVirtualIndexes(),this.getMeasurements()],(e,s)=>{const i=[];for(let r=0,a=e.length;rthis.options.debug}),this.getVirtualItemForOffset=e=>{const s=this.getMeasurements();if(s.length!==0)return ft(s[Ot(0,s.length-1,i=>ft(s[i]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getOffsetForAlignment=(e,s,i=0)=>{if(!this.scrollElement)return 0;const r=this.getSize(),a=this.getScrollOffset();s==="auto"&&(s=e>=a+r?"end":"start"),s==="center"?e+=(i-r)/2:s==="end"&&(e-=r);const l=this.getMaxScrollOffset();return Math.max(Math.min(l,e),0)},this.getOffsetForIndex=(e,s="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));const i=this.getSize(),r=this.getScrollOffset(),a=this.measurementsCache[e];if(!a)return;if(s==="auto")if(a.end>=r+i-this.options.scrollPaddingEnd)s="end";else if(a.start<=r+this.options.scrollPaddingStart)s="start";else return[r,s];if(s==="end"&&e===this.options.count-1)return[this.getMaxScrollOffset(),s];const l=s==="end"?a.end+this.options.scrollPaddingEnd:a.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(l,s,a.size),s]},this.scrollToOffset=(e,{align:s="start",behavior:i="auto"}={})=>{const r=this.getOffsetForAlignment(e,s),a=this.now();this.scrollState={index:null,align:s,behavior:i,startedAt:a,lastTargetOffset:r,stableFrames:0},this._scrollToOffset(r,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:s="auto",behavior:i="auto"}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));const r=this.getOffsetForIndex(e,s);if(!r)return;const[a,l]=r,u=this.now();this.scrollState={index:e,align:l,behavior:i,startedAt:u,lastTargetOffset:a,stableFrames:0},this._scrollToOffset(a,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:s="auto"}={})=>{const i=this.getScrollOffset()+e,r=this.now();this.scrollState={index:null,align:"start",behavior:s,startedAt:r,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.getTotalSize=()=>{var e;const s=this.getMeasurements();let i;if(s.length===0)i=this.options.paddingStart;else if(this.options.lanes===1)i=((e=s[s.length-1])==null?void 0:e.end)??0;else{const r=Array(this.options.lanes).fill(null);let a=s.length-1;for(;a>=0&&r.some(l=>l===null);){const l=s[a];r[l.lane]===null&&(r[l.lane]=l.end),a--}i=Math.max(...r.filter(l=>l!==null))}return Math.max(i-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(e,{adjustments:s,behavior:i})=>{this.options.scrollToFn(e,{behavior:i,adjustments:s},this)},this.measure=()=>{this.itemSizeCache=new Map,this.laneAssignments=new Map,this.notify(!1)},this.setOptions(t)}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const s=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,i=s?s[0]:this.scrollState.lastTargetOffset,r=1,a=i!==this.scrollState.lastTargetOffset;if(!a&&ai(i,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=r){this.scrollState=null;return}}else this.scrollState.stableFrames=0,a&&(this.scrollState.lastTargetOffset=i,this.scrollState.behavior="auto",this._scrollToOffset(i,{adjustments:void 0,behavior:"auto"}));this.scheduleScrollReconcile()}}const Ot=(n,t,e,s)=>{for(;n<=t;){const i=(n+t)/2|0,r=e(i);if(rs)t=i-1;else return i}return n>0?n-1:0};function gi({measurements:n,outerSize:t,scrollOffset:e,lanes:s}){const i=n.length-1,r=u=>n[u].start;if(n.length<=s)return{startIndex:0,endIndex:i};let a=Ot(0,i,r,e),l=a;if(s===1)for(;l1){const u=Array(s).fill(0);for(;ld=0&&p.some(d=>d>=e);){const d=n[a];p[d.lane]=d.start,a--}a=Math.max(0,a-a%s),l=Math.min(i,l+(s-1-l%s))}return{startIndex:a,endIndex:l}}function mi(n){const t=new pi(f(n)),e=as(t),s=t._didMount();return ve(()=>f(n).getScrollElement(),i=>{i&&t._willUpdate()},{immediate:!0}),ve(()=>f(n),i=>{t.setOptions({...i,onChange:(r,a)=>{var l;rt(e),(l=i.onChange)==null||l.call(i,r,a)}}),t._willUpdate(),rt(e)},{immediate:!0}),rs(s),e}function vi(n){return mi(z(()=>({observeElementRect:ci,observeElementOffset:di,scrollToFn:fi,...f(n)})))}var yi=ne({__name:"ListboxVirtualizer",props:{options:{type:Array,required:!0},overscan:{type:Number,required:!1},estimateSize:{type:[Number,Function],required:!1},textContent:{type:Function,required:!1}},setup(n){const t=n,e=Je(),s=Fe(),i=ls(),{getItems:r}=ke();s.isVirtual.value=!0;const a=z(()=>{const c=i.value;if(c){const o=window.getComputedStyle(c);return{start:Number.parseFloat(o.paddingBlockStart||o.paddingTop),end:Number.parseFloat(o.paddingBlockEnd||o.paddingBottom)}}else return{start:0,end:0}}),l=vi({get scrollPaddingStart(){return a.value.start},get scrollPaddingEnd(){return a.value.end},get count(){return t.options.length},get horizontal(){return s.orientation.value==="horizontal"},estimateSize(c){return typeof t.estimateSize=="function"?t.estimateSize(c):t.estimateSize??28},getScrollElement(){return i.value},overscan:t.overscan??12}),u=z(()=>l.value.getVirtualItems().map(c=>{const o=e.default({option:t.options[c.index],virtualizer:l.value,virtualItem:c})[0],m=o.type===ae&&Array.isArray(o.children)?o.children[0]:o;return{item:c,is:fs(m,{key:`${c.key}`,"data-index":c.index,"aria-setsize":t.options.length,"aria-posinset":c.index+1,style:{position:"absolute",top:0,left:0,transform:`translateY(${c.start}px)`,overflowAnchor:"none"}})}}));s.virtualFocusHook.on(c=>{const o=t.options.findIndex(m=>Array.isArray(s.modelValue.value)?le(m,s.modelValue.value[0],s.by):le(m,s.modelValue.value,s.by));o!==-1?(c?.preventDefault(),l.value.scrollToIndex(o,{align:"start"}),requestAnimationFrame(()=>{const m=ht(i.value);m&&(s.changeHighlight(m),c&&m?.focus())})):s.highlightFirstItem()}),s.virtualHighlightHook.on(c=>{const o=t.options.findIndex(m=>le(m,c,s.by));l.value.scrollToIndex(o,{align:"start"}),requestAnimationFrame(()=>{const m=ht(i.value);m&&s.changeHighlight(m)})});const p=Mt("",1e3),d=z(()=>{const c=o=>t.textContent?t.textContent(o):o?.toString().toLowerCase();return t.options.map((o,m)=>({index:m,textContent:c(o)}))});function g(c,o){if(!s.firstValue?.value||!s.multiple.value||!Array.isArray(s.modelValue.value))return;const v=r().filter(S=>S.ref.dataset.disabled!=="").find(S=>S.ref===s.highlightedElement.value)?.value;if(!v)return;let y=null;switch(o){case"prev":case"next":{y=Ie(t.options,s.firstValue.value,v);break}case"first":{y=Ie(t.options,s.firstValue.value,t.options?.[0]);break}case"last":{y=Ie(t.options,s.firstValue.value,t.options?.[t.options.length-1]);break}}s.modelValue.value=y}return s.virtualKeydownHook.on(c=>{const o=c.altKey||c.ctrlKey||c.metaKey;if(c.key==="Tab"&&!o)return;let v=os[c.key];if(o&&c.key==="a"&&s.multiple.value?(c.preventDefault(),s.modelValue.value=[...t.options],v="last"):c.shiftKey&&v&&g(c,v),["first","last"].includes(v)){c.preventDefault();const y=v==="first"?0:t.options.length-1;l.value.scrollToIndex(y),requestAnimationFrame(()=>{const S=r(),_=v==="first"?S[0]:S[S.length-1];_&&s.changeHighlight(_.ref)})}else if(!v&&!o){p.value+=c.key;const y=Number(us()?.getAttribute("data-index")),S=d.value[y].textContent,_=d.value.map(w=>w.textContent??""),L=cs(_,p.value,S),K=d.value.find(w=>w.textContent===L);K&&(l.value.scrollToIndex(K.index,{align:"start"}),requestAnimationFrame(()=>{const w=i.value.querySelector(`[data-index="${K.index}"]`);w instanceof HTMLElement&&s.changeHighlight(w)}))}}),(c,o)=>(E(),H("div",{"data-reka-virtualizer":"",style:hs({position:"relative",width:"100%",height:`${f(l).getTotalSize()}px`})},[(E(!0),H(ae,null,me(u.value,({is:m,item:v})=>(E(),B(ds(m),{key:v.index}))),128))],4))}}),bi=yi;function oe(n){return Array.isArray?Array.isArray(n):Rt(n)==="[object Array]"}function xi(n){if(typeof n=="string")return n;if(typeof n=="bigint")return n.toString();const t=n+"";return t=="0"&&1/n==-1/0?"-0":t}function Pe(n){return n==null?"":xi(n)}function U(n){return typeof n=="string"}function Ee(n){return typeof n=="number"}function Si(n){return n===!0||n===!1||Ai(n)&&Rt(n)=="[object Boolean]"}function Kt(n){return typeof n=="object"}function Ai(n){return Kt(n)&&n!==null}function X(n){return n!=null}function Ce(n){return!n.trim().length}function Rt(n){return n==null?n===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(n)}const Ci="Incorrect 'index' type",Ii=n=>`Invalid value for key ${n}`,Ei=n=>`Pattern length exceeds max of ${n}.`,_i=n=>`Missing ${n} property in key`,Mi=n=>`Property 'weight' in key '${n}' must be a positive integer`,vt=Object.prototype.hasOwnProperty;class wi{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach(s=>{const i=$t(s);this._keys.push(i),this._keyMap[i.id]=i,e+=i.weight}),this._keys.forEach(s=>{s.weight/=e})}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function $t(n){let t=null,e=null,s=null,i=1,r=null;if(U(n)||oe(n))s=n,t=yt(n),e=He(n);else{if(!vt.call(n,"name"))throw new Error(_i("name"));const a=n.name;if(s=a,vt.call(n,"weight")&&(i=n.weight,i<=0))throw new Error(Mi(a));t=yt(a),e=He(a),r=n.getFn}return{path:t,id:e,weight:i,src:s,getFn:r}}function yt(n){return oe(n)?n:n.split(".")}function He(n){return oe(n)?n.join("."):n}function ki(n,t){const e=[];let s=!1;const i=(r,a,l,u)=>{if(X(r))if(!a[l])e.push(u!==void 0?{v:r,i:u}:r);else{const p=a[l],d=r[p];if(!X(d))return;if(l===a.length-1&&(U(d)||Ee(d)||Si(d)||typeof d=="bigint"))e.push(u!==void 0?{v:Pe(d),i:u}:Pe(d));else if(oe(d)){s=!0;for(let g=0,c=d.length;gn.score===t.score?n.idx{this._keysMap[e.id]=s})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,U(this.docs[0])?this.docs.forEach((t,e)=>{this._addString(t,e)}):this.docs.forEach((t,e)=>{this._addObject(t,e)}),this.norm.clear())}add(t){const e=this.size();U(t)?this._addString(t,e):this._addObject(t,e)}removeAt(t){this.records.splice(t,1);for(let e=t,s=this.size();e=0;e-=1)this.records.splice(t[e],1);for(let e=0,s=this.records.length;e{const a=i.getFn?i.getFn(t):this.getFn(t,i.path);if(X(a)){if(oe(a)){const l=[];for(let u=0,p=a.length;ue),records:this.records}}}function qt(n,t,{getFn:e=C.getFn,fieldNormWeight:s=C.fieldNormWeight}={}){const i=new Ze({getFn:e,fieldNormWeight:s});return i.setKeys(n.map($t)),i.setSources(t),i.create(),i}function Oi(n,{getFn:t=C.getFn,fieldNormWeight:e=C.fieldNormWeight}={}){const{keys:s,records:i}=n,r=new Ze({getFn:t,fieldNormWeight:e});return r.setKeys(s),r.setIndexRecords(i),r}function Ki(n=[],t=C.minMatchCharLength){const e=[];let s=-1,i=-1,r=0;for(let a=n.length;r=t&&e.push([s,i]),s=-1)}return n[r-1]&&r-s>=t&&e.push([s,r-1]),e}const de=32;function Ri(n,t,e,{location:s=C.location,distance:i=C.distance,threshold:r=C.threshold,findAllMatches:a=C.findAllMatches,minMatchCharLength:l=C.minMatchCharLength,includeMatches:u=C.includeMatches,ignoreLocation:p=C.ignoreLocation}={}){if(t.length>de)throw new Error(Ei(de));const d=t.length,g=n.length,c=Math.max(0,Math.min(s,g));let o=r,m=c;const v=(k,R)=>{const D=k/d;if(p)return D;const J=Math.abs(c-R);return i?D+J/i:J?1:D},y=l>1||u,S=y?Array(g):[];let _;for(;(_=n.indexOf(t,m))>-1;){const k=v(0,_);if(o=Math.min(k,o),m=_+d,y){let R=0;for(;R=J;h-=1){const $=h-1,x=e[n[$]];if(y&&(S[$]=+!!x),I[h]=(I[h+1]<<1|1)&x,k&&(I[h]|=(L[h+1]|L[h])<<1|1|L[h+1]),I[h]&W&&(K=v(k,$),K<=o)){if(o=K,m=$,m<=c)break;J=Math.max(1,2*c-m)}}if(v(k+1,c)>o)break;L=I}const A={isMatch:m>=0,score:Math.max(.001,K)};if(y){const k=Ki(S,l);k.length?u&&(A.indices=k):A.isMatch=!1}return A}function $i(n){const t={};for(let e=0,s=n.length;ee[0]-s[0]||e[1]-s[1]);const t=[n[0]];for(let e=1,s=n.length;en.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,"").replace(qi,t=>Pt[t]):n=>n;class tt{constructor(t,{location:e=C.location,threshold:s=C.threshold,distance:i=C.distance,includeMatches:r=C.includeMatches,findAllMatches:a=C.findAllMatches,minMatchCharLength:l=C.minMatchCharLength,isCaseSensitive:u=C.isCaseSensitive,ignoreDiacritics:p=C.ignoreDiacritics,ignoreLocation:d=C.ignoreLocation}={}){if(this.options={location:e,threshold:s,distance:i,includeMatches:r,findAllMatches:a,minMatchCharLength:l,isCaseSensitive:u,ignoreDiacritics:p,ignoreLocation:d},t=u?t:t.toLowerCase(),t=p?Ae(t):t,this.pattern=t,this.chunks=[],!this.pattern.length)return;const g=(o,m)=>{this.chunks.push({pattern:o,alphabet:$i(o),startIndex:m})},c=this.pattern.length;if(c>de){let o=0;const m=c%de,v=c-m;for(;o{const{isMatch:_,score:L,indices:K}=Ri(t,v,y,{location:r+S,distance:a,threshold:l,findAllMatches:u,minMatchCharLength:p,includeMatches:i,ignoreLocation:d});_&&(o=!0),c+=L,_&&K&&g.push(...K)});const m={isMatch:o,score:o?c/this.chunks.length:1};return o&&i&&(m.indices=et(g)),m}}class ue{constructor(t){this.pattern=t}static isMultiMatch(t){return bt(t,this.multiRegex)}static isSingleMatch(t){return bt(t,this.singleRegex)}search(t){return{isMatch:!1,score:1}}}function bt(n,t){const e=n.match(t);return e?e[1]:null}class Pi extends ue{constructor(t){super(t)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(t){const e=t===this.pattern;return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}}class Hi extends ue{constructor(t){super(t)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(t){const s=t.indexOf(this.pattern)===-1;return{isMatch:s,score:s?0:1,indices:[0,t.length-1]}}}class Vi extends ue{constructor(t){super(t)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(t){const e=t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}}class Ni extends ue{constructor(t){super(t)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(t){const e=!t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}}class ji extends ue{constructor(t){super(t)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(t){const e=t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[t.length-this.pattern.length,t.length-1]}}}class Wi extends ue{constructor(t){super(t)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(t){const e=!t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}}class Ht extends ue{constructor(t,{location:e=C.location,threshold:s=C.threshold,distance:i=C.distance,includeMatches:r=C.includeMatches,findAllMatches:a=C.findAllMatches,minMatchCharLength:l=C.minMatchCharLength,isCaseSensitive:u=C.isCaseSensitive,ignoreDiacritics:p=C.ignoreDiacritics,ignoreLocation:d=C.ignoreLocation}={}){super(t),this._bitapSearch=new tt(t,{location:e,threshold:s,distance:i,includeMatches:r,findAllMatches:a,minMatchCharLength:l,isCaseSensitive:u,ignoreDiacritics:p,ignoreLocation:d})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(t){return this._bitapSearch.searchIn(t)}}class Vt extends ue{constructor(t){super(t)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(t){let e=0,s;const i=[],r=this.pattern.length;for(;(s=t.indexOf(this.pattern,e))>-1;)e=s+r,i.push([s,e-1]);const a=!!i.length;return{isMatch:a,score:a?0:1,indices:i}}}const Ve=[Pi,Vt,Vi,Ni,Wi,ji,Hi,Ht],xt=Ve.length,Gi="\0",Ui="|";function Yi(n){const t=[],e=n.length;let s=0;for(;s=e)break;let i=s;for(;i=e||n[r]===" "){i++;break}if(n[r]==="$"&&(r+1>=e||n[r+1]===" ")){i+=2;break}}i++}t.push(n.substring(s,i)),s=i}else{for(;i{const i=s.replace(/\u0000/g,"|"),r=Yi(i.trim()).filter(l=>l&&!!l.trim()),a=[];for(let l=0,u=r.length;l!!(n[we.AND]||n[we.OR]),Zi=n=>!!n[je.PATH],en=n=>!oe(n)&&Kt(n)&&!We(n),St=n=>({[we.AND]:Object.keys(n).map(t=>({[t]:n[t]}))});function Nt(n,t,{auto:e=!0}={}){const s=i=>{if(U(i)){const u={keyId:null,pattern:i};return e&&(u.searcher=Me(i,t)),u}const r=Object.keys(i),a=Zi(i);if(!a&&r.length>1&&!We(i))return s(St(i));if(en(i)){const u=a?i[je.PATH]:r[0],p=a?i[je.PATTERN]:i[u];if(!U(p))throw new Error(Ii(u));const d={keyId:He(u),pattern:p};return e&&(d.searcher=Me(p,t)),d}const l={children:[],operator:r[0]};return r.forEach(u=>{const p=i[u];oe(p)&&p.forEach(d=>{l.children.push(s(d))})}),l};return We(n)||(n=St(n)),s(n)}function Ge(n,{ignoreFieldNorm:t=C.ignoreFieldNorm}){let e=1;return n.forEach(({key:s,norm:i,score:r})=>{const a=s?s.weight:null;e*=Math.pow(r===0&&a?Number.EPSILON:r,(a||1)*(t?1:i))}),e}function tn(n,{ignoreFieldNorm:t=C.ignoreFieldNorm}){n.forEach(e=>{e.score=Ge(e.matches,{ignoreFieldNorm:t})})}class sn{constructor(t){this.limit=t,this.heap=[]}get size(){return this.heap.length}shouldInsert(t){return this.size0;){const s=t-1>>1;if(e[t].score<=e[s].score)break;const i=e[t];e[t]=e[s],e[s]=i,t=s}}_sinkDown(t){const e=this.heap,s=e.length;let i=t;do{t=i;const r=2*t+1,a=2*t+2;if(re[i].score&&(i=r),ae[i].score&&(i=a),i!==t){const l=e[t];e[t]=e[i],e[i]=l}}while(i!==t)}}function nn(n,t){const e=n.matches;t.matches=[],X(e)&&e.forEach(s=>{if(!X(s.indices)||!s.indices.length)return;const{indices:i,value:r}=s,a={indices:i,value:r};s.key&&(a.key=s.key.src),s.idx>-1&&(a.refIndex=s.idx),t.matches.push(a)})}function rn(n,t){t.score=n.score}function an(n,t,{includeMatches:e=C.includeMatches,includeScore:s=C.includeScore}={}){const i=[];return e&&i.push(nn),s&&i.push(rn),n.map(r=>{const{idx:a}=r,l={item:t[a],refIndex:a};return i.length&&i.forEach(u=>{u(r,l)}),l})}const ln=/\b\w+\b/g;function Ue({isCaseSensitive:n=!1,ignoreDiacritics:t=!1}={}){return{tokenize(e){return n||(e=e.toLowerCase()),t&&(e=Ae(e)),e.match(ln)||[]}}}function on(n,t,e){const s=new Map,i=new Map;let r=0;function a(l,u,p,d){const g=e.tokenize(l);if(!g.length)return;r++;const c=new Map;for(const o of g)c.set(o,(c.get(o)||0)+1);for(const[o,m]of c){const v={docIdx:u,keyIdx:p,subIdx:d,tf:m};let y=s.get(o);y||(y=[],s.set(o,y)),y.push(v),i.set(o,(i.get(o)||0)+1)}}for(const l of n){const{i:u,v:p,$:d}=l;if(p!==void 0){a(p,u,-1,-1);continue}if(d)for(let g=0;ga.docIdx!==t),r=s.length-i.length;r>0&&(n.fieldCount-=r,n.df.set(e,(n.df.get(e)||0)-r),i.length===0?(n.terms.delete(e),n.df.delete(e)):n.terms.set(e,i))}}class ce{constructor(t,e,s){this.options={...C,...e},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new wi(this.options.keys),this._docs=t,this._myIndex=null,this._invertedIndex=null,this.setCollection(t,s),this._lastQuery=null,this._lastSearcher=null}_getSearcher(t){if(this._lastQuery===t)return this._lastSearcher;const e=this._invertedIndex?{...this.options,_invertedIndex:this._invertedIndex}:this.options,s=Me(t,e);return this._lastQuery=t,this._lastSearcher=s,s}setCollection(t,e){if(this._docs=t,e&&!(e instanceof Ze))throw new Error(Ci);if(this._myIndex=e||qt(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){const s=Ue({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics});this._invertedIndex=on(this._myIndex.records,this._myIndex.keys.length,s)}}add(t){if(X(t)&&(this._docs.push(t),this._myIndex.add(t),this._invertedIndex)){const e=this._myIndex.records[this._myIndex.records.length-1],s=Ue({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics});un(this._invertedIndex,e,this._myIndex.keys.length,s)}}remove(t=()=>!1){const e=[],s=[];for(let i=0,r=this._docs.length;i=0;i-=1)this._docs.splice(s[i],1);this._myIndex.removeAll(s)}return e}removeAt(t){this._invertedIndex&&At(this._invertedIndex,t);const e=this._docs.splice(t,1)[0];return this._myIndex.removeAt(t),e}getIndex(){return this._myIndex}search(t,e){const{limit:s=-1}=e||{},{includeMatches:i,includeScore:r,shouldSort:a,sortFn:l,ignoreFieldNorm:u}=this.options;if(U(t)&&!t.trim()){let g=this._docs.map((c,o)=>({item:c,refIndex:o}));return Ee(s)&&s>-1&&(g=g.slice(0,s)),g}const p=Ee(s)&&s>0&&U(t);let d;if(p){const g=new sn(s);U(this._docs[0])?this._searchStringList(t,{heap:g,ignoreFieldNorm:u}):this._searchObjectList(t,{heap:g,ignoreFieldNorm:u}),d=g.extractSorted(l)}else d=U(t)?U(this._docs[0])?this._searchStringList(t):this._searchObjectList(t):this._searchLogical(t),tn(d,{ignoreFieldNorm:u}),a&&d.sort(l),Ee(s)&&s>-1&&(d=d.slice(0,s));return an(d,this._docs,{includeMatches:i,includeScore:r})}_searchStringList(t,{heap:e,ignoreFieldNorm:s}={}){const i=this._getSearcher(t),{records:r}=this._myIndex,a=e?null:[];return r.forEach(({v:l,i:u,n:p})=>{if(!X(l))return;const{isMatch:d,score:g,indices:c}=i.searchIn(l);if(d){const o={item:l,idx:u,matches:[{score:g,value:l,norm:p,indices:c}]};e?(o.score=Ge(o.matches,{ignoreFieldNorm:s}),e.shouldInsert(o.score)&&e.insert(o)):a.push(o)}}),a}_searchLogical(t){const e=Nt(t,this.options),s=(l,u,p)=>{if(!("children"in l)){const{keyId:o,searcher:m}=l;let v;return o===null?(v=[],this._myIndex.keys.forEach((y,S)=>{v.push(...this._findMatches({key:y,value:u[S],searcher:m}))})):v=this._findMatches({key:this._keyStore.get(o),value:this._myIndex.getValueForItemAtKeyId(u,o),searcher:m}),v&&v.length?[{idx:p,item:u,matches:v}]:[]}const{children:d,operator:g}=l,c=[];for(let o=0,m=d.length;o{if(X(l)){const p=s(e,l,u);p.length&&(r.has(u)||(r.set(u,{idx:u,item:l,matches:[]}),a.push(r.get(u))),p.forEach(({matches:d})=>{r.get(u).matches.push(...d)}))}}),a}_searchObjectList(t,{heap:e,ignoreFieldNorm:s}={}){const i=this._getSearcher(t),{keys:r,records:a}=this._myIndex,l=e?null:[];return a.forEach(({$:u,i:p})=>{if(!X(u))return;const d=[];let g=!1,c=!1;if(r.forEach((o,m)=>{const v=this._findMatches({key:o,value:u[m],searcher:i});v.length?(d.push(...v),v[0].hasInverse&&(c=!0)):g=!0}),!(c&&g)&&d.length){const o={idx:p,item:u,matches:d};e?(o.score=Ge(o.matches,{ignoreFieldNorm:s}),e.shouldInsert(o.score)&&e.insert(o)):l.push(o)}}),l}_findMatches({key:t,value:e,searcher:s}){if(!X(e))return[];const i=[];if(oe(e))e.forEach(({v:r,i:a,n:l})=>{if(!X(r))return;const{isMatch:u,score:p,indices:d,hasInverse:g}=s.searchIn(r);u&&i.push({score:p,key:t,value:r,idx:a,norm:l,indices:d,hasInverse:g})});else{const{v:r,n:a}=e,{isMatch:l,score:u,indices:p,hasInverse:d}=s.searchIn(r);l&&i.push({score:u,key:t,value:r,norm:a,indices:p,hasInverse:d})}return i}}class cn{static condition(t,e){return e.useTokenSearch}constructor(t,e){this.options=e,this.analyzer=Ue({isCaseSensitive:e.isCaseSensitive,ignoreDiacritics:e.ignoreDiacritics});const s=this.analyzer.tokenize(t),i=e._invertedIndex,{df:r,fieldCount:a}=i;this.termSearchers=[],this.idfWeights=[];for(const l of s){this.termSearchers.push(new tt(l,{location:e.location,threshold:e.threshold,distance:e.distance,includeMatches:e.includeMatches,findAllMatches:e.findAllMatches,minMatchCharLength:e.minMatchCharLength,isCaseSensitive:e.isCaseSensitive,ignoreDiacritics:e.ignoreDiacritics,ignoreLocation:!0}));const u=r.get(l)||0,p=Math.log(1+(a-u+.5)/(u+.5));this.idfWeights.push(p)}}searchIn(t){if(!this.termSearchers.length)return{isMatch:!1,score:1};const e=[];let s=0,i=0,r=0;for(let u=0;u0?1-s/i:0,l={isMatch:!0,score:Math.max(.001,a)};return this.options.includeMatches&&e.length&&(l.indices=et(e)),l}}ce.version="7.3.0";ce.createIndex=qt;ce.parseIndex=Oi;ce.config=C;ce.match=function(n,t,e){return Me(n,{...C,...e}).searchIn(t)};ce.parseQuery=Nt;st(Ji);st(cn);ce.use=function(...n){n.forEach(t=>st(t))};function dn(n,t,e){const s=()=>{var r,a;return new ce((r=ie(t))!==null&&r!==void 0?r:[],(a=ie(e))===null||a===void 0?void 0:a.fuseOptions)},i=te(s());return ve(()=>{var r;return(r=ie(e))===null||r===void 0?void 0:r.fuseOptions},()=>{i.value=s()},{deep:!0}),ve(()=>ie(t),r=>{i.value.setCollection(r)},{deep:!0}),{fuse:i,results:z(()=>{const r=ie(e);if(r?.matchAllWhenSearchEmpty&&!ie(n))return ie(t).map((l,u)=>({item:l,refIndex:u}));const a=r?.resultLimit;return i.value.search(ie(n),a?{limit:a}:void 0)})}}const hn={"&":"&","<":"<",">":">",'"':""","'":"'"};function fn(n){return n.replace(/[&<>"']/g,t=>hn[t])}function pn(n){return/&(?:amp|lt|gt|quot|#39);/.test(n)}function De(n){return pn(n)?n:fn(n)}function gn(n,t){let e="",s=0,i=!1;for(let r=n.length-1;r>=0;r--){if(n[r]===">")i=!0;else if(n[r]==="<"){i=!1,e=n[r]+e;continue}if(i||s++,s<=t)e=n[r]+e;else{e="..."+e;break}}return e}function Ct(n,t,e,s){function i(r,a=[]){r=r||"";let l="",u=0;a.forEach(d=>{if(d.length===2&&d[0]===d[1])return;const g=d[1]+1,c=g-d[0]>=t.length;l+=[De(r.substring(u,d[0])),c&&"",De(r.substring(d[0],g)),c&&""].filter(Boolean).join(""),u=g}),l+=De(r.substring(u));const p=l.indexOf("");return p!==-1&&(l=gn(l,l.length-p)),l}if(n.matches?.length){for(const r of n.matches)if(!(e&&r.key!==e)&&!s?.includes(r.key))return i(r.value,r.indices)}}function mn(n,t){if(typeof n!="object"||n===null)return!1;const e=se(n,t);return e!=null&&e!==""}function It(n,t){return t?{xs:44,sm:48,md:52,lg:56,xl:60}[n]:{xs:24,sm:28,md:32,lg:36,xl:40}[n]}function vn(n,t,e,s){const i=It(t,!0),r=It(t,!1);return s?()=>i:e?a=>mn(n[a],e)?i:r:()=>r}const yn={slots:{root:"flex flex-col min-h-0 min-w-0 divide-y divide-default",input:"",close:"",back:"p-0",content:"relative overflow-hidden flex flex-col",footer:"p-1",viewport:"relative scroll-py-1 overflow-y-auto flex-1 focus:outline-none",group:"p-1 isolate",empty:"text-center text-muted",label:"font-semibold text-highlighted",item:"group relative w-full flex items-start select-none outline-none before:absolute before:z-[-1] before:inset-px before:rounded-md data-disabled:cursor-not-allowed data-disabled:opacity-75",itemLeadingIcon:"shrink-0",itemLeadingAvatar:"shrink-0",itemLeadingAvatarSize:"",itemLeadingChip:"shrink-0",itemLeadingChipSize:"",itemTrailing:"ms-auto inline-flex items-center",itemTrailingIcon:"shrink-0",itemTrailingHighlightedIcon:"shrink-0 text-dimmed hidden group-data-highlighted:inline-flex",itemTrailingKbds:"hidden lg:inline-flex items-center shrink-0",itemTrailingKbdsSize:"",itemWrapper:"flex-1 flex flex-col text-start min-w-0",itemLabel:"truncate space-x-1 text-dimmed",itemDescription:"truncate text-muted",itemLabelBase:"text-highlighted [&>mark]:text-inverted [&>mark]:bg-primary",itemLabelPrefix:"text-default",itemLabelSuffix:"text-dimmed [&>mark]:text-inverted [&>mark]:bg-primary"},variants:{virtualize:{true:{viewport:"p-1 isolate"},false:{viewport:"divide-y divide-default"}},size:{xs:{input:"[&>input]:h-10",empty:"py-3 text-xs",label:"p-1 text-[10px]/3 gap-1",item:"p-1 text-xs gap-1",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemLeadingChip:"size-4",itemLeadingChipSize:"sm",itemTrailing:"gap-1",itemTrailingIcon:"size-4",itemTrailingHighlightedIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},sm:{input:"[&>input]:h-11",empty:"py-4 text-xs",label:"p-1.5 text-[10px]/3 gap-1.5",item:"p-1.5 text-xs gap-1.5",itemLeadingIcon:"size-4",itemLeadingAvatarSize:"3xs",itemLeadingChip:"size-4",itemLeadingChipSize:"sm",itemTrailing:"gap-1.5",itemTrailingIcon:"size-4",itemTrailingHighlightedIcon:"size-4",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"sm"},md:{input:"[&>input]:h-12",empty:"py-6 text-sm",label:"p-1.5 text-xs gap-1.5",item:"p-1.5 text-sm gap-1.5",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemLeadingChip:"size-5",itemLeadingChipSize:"md",itemTrailing:"gap-1.5",itemTrailingIcon:"size-5",itemTrailingHighlightedIcon:"size-5",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"md"},lg:{input:"[&>input]:h-13",empty:"py-7 text-sm",label:"p-2 text-xs gap-2",item:"p-2 text-sm gap-2",itemLeadingIcon:"size-5",itemLeadingAvatarSize:"2xs",itemLeadingChip:"size-5",itemLeadingChipSize:"md",itemTrailing:"gap-2",itemTrailingIcon:"size-5",itemTrailingHighlightedIcon:"size-5",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"md"},xl:{input:"[&>input]:h-14",empty:"py-8 text-base",label:"p-2 text-sm gap-2",item:"p-2 text-base gap-2",itemLeadingIcon:"size-6",itemLeadingAvatarSize:"xs",itemLeadingChip:"size-6",itemLeadingChipSize:"lg",itemTrailing:"gap-2",itemTrailingIcon:"size-6",itemTrailingHighlightedIcon:"size-6",itemTrailingKbds:"gap-0.5",itemTrailingKbdsSize:"lg"}},active:{true:{item:"text-highlighted before:bg-elevated",itemLeadingIcon:"text-default"},false:{item:["text-default data-highlighted:not-data-disabled:text-highlighted data-highlighted:not-data-disabled:before:bg-elevated/50","transition-colors before:transition-colors"],itemLeadingIcon:["text-dimmed group-data-highlighted:not-group-data-disabled:text-default","transition-colors"]}},loading:{true:{itemLeadingIcon:"animate-spin"}}},defaultVariants:{size:"md"}},bn=["innerHTML"],xn=["innerHTML"],Sn=Object.assign({inheritAttrs:!1},{__name:"UCommandPalette",props:$e({as:{type:null,required:!1},size:{type:null,required:!1},icon:{type:null,required:!1},trailingIcon:{type:null,required:!1},selectedIcon:{type:null,required:!1},childrenIcon:{type:null,required:!1},placeholder:{type:String,required:!1},autofocus:{type:Boolean,required:!1,default:!0},close:{type:[Boolean,Object],required:!1},closeIcon:{type:null,required:!1},back:{type:[Boolean,Object],required:!1,default:!0},backIcon:{type:null,required:!1},input:{type:[Boolean,Object],required:!1,default:!0},groups:{type:Array,required:!1},fuse:{type:Object,required:!1},virtualize:{type:[Boolean,Object],required:!1,default:!1},valueKey:{type:null,required:!1},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},preserveGroupOrder:{type:Boolean,required:!1,default:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},multiple:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},highlightOnHover:{type:Boolean,required:!1,default:!0},selectionBehavior:{type:String,required:!1},by:{type:[String,Function],required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1}},{searchTerm:{type:String,default:""},searchTermModifiers:{}}),emits:$e(["update:modelValue","highlight","entryFocus","leave","update:open"],["update:searchTerm"]),setup(n,{emit:t}){const e=n,s=t,i=Je(),r=Ft(n,"searchTerm",{type:String,default:""}),{t:a}=Lt(),l=zt(),u=Tt("commandPalette",e),p=ps(Ke(e,"as","disabled","multiple","modelValue","defaultValue","highlightOnHover","by"),s),d=Cs(()=>e.virtualize?qe(typeof e.virtualize=="boolean"?{}:e.virtualize,{estimateSize:vn(A.value,"md",e.descriptionKey,!!i["item-description"])}):!1),[g,c]=gs({props:{item:{type:Object,required:!0},group:{type:Object,required:!1},index:{type:Number,required:!1}}}),o=z(()=>_e({extend:_e(yn),...l.ui?.commandPalette||{}})({size:e.size,virtualize:!!e.virtualize})),m=z(()=>qe({},e.fuse,{fuseOptions:{ignoreLocation:!0,threshold:.1,keys:[e.labelKey,"suffix"]},resultLimit:12,matchAllWhenSearchEmpty:!0})),v=te([]),y=z(()=>v.value[v.value.length-1]?.placeholder||e.placeholder||a("commandPalette.placeholder")),S=z(()=>v.value?.length?[v.value[v.value.length-1]]:e.groups),_=z(()=>S.value?.filter(I=>I.id?!I.ignoreFilter:(console.warn("[@nuxt/ui] CommandPalette group is missing an `id` property"),!1))?.flatMap(I=>I.items?.map(P=>({...P,group:I.id}))||[])||[]),{results:L}=dn(r,_,m),K=ms(L,16,!0);function w(I,P){let h=P;return I?.postFilter&&typeof I.postFilter=="function"&&(h=I.postFilter(r.value,h)),{...I,items:h.slice(0,m.value.resultLimit).map($=>({...$,labelHtml:Ct($,r.value,e.labelKey),suffixHtml:Ct($,r.value,void 0,[e.labelKey])}))}}const W=z(()=>{const I=S.value,P=K.value.reduce((x,T)=>{const{item:Y,matches:G}=T;return Y.group&&(x[Y.group]||=[],x[Y.group]?.push({...Y,matches:G})),x},{});if(e.preserveGroupOrder){const x=[];for(const T of I||[]){if(!T.items?.length)continue;const Y=T.ignoreFilter?T.items:P[T.id];if(!Y?.length)continue;const G=w(T,Y);G.items?.length&&x.push(G)}return x}const h=Object.entries(P).map(([x,T])=>{const Y=I?.find(fe=>fe.id===x);if(!Y)return;const G=w(Y,T);return G.items?.length?G:void 0}).filter(x=>!!x);return(I?.map((x,T)=>({...x,index:T}))?.filter(x=>x.ignoreFilter&&x.items?.length)?.map(x=>({...w(x,x.items||[]),index:x.index}))?.filter(x=>x.items?.length)||[]).reduce((x,T)=>(x.splice(T.index,0,T),x),[...h])}),A=z(()=>W.value.flatMap(I=>I.items||[])),k=Bt("rootRef");function R(I){I.children?.length&&(v.value.push({id:`history-${v.value.length}`,label:I.label,slot:I.slot,placeholder:I.placeholder,items:I.children}),r.value="",k.value?.highlightFirstItem())}function D(){v.value.length&&(v.value.pop(),r.value="",k.value?.highlightFirstItem())}function J(){r.value||D()}function ee(I,P){P.children?.length?(I.preventDefault(),R(P)):P.onSelect?.(I)}return(I,P)=>(E(),H(ae,null,[Z(f(g),null,{default:O(({item:h,index:$,group:x})=>[Z(vs,V(f(ys)(h),{custom:""}),{default:O(({active:T,...Y})=>[Z(f(ii),{value:e.valueKey?f(se)(h,e.valueKey):f(Re)(h,["matches","group","onSelect","labelHtml","suffixHtml","children"]),disabled:h.disabled,"as-child":"",onSelect:G=>ee(G,h)},{default:O(()=>[Z(bs,V(Y,{"data-slot":"item",class:o.value.item({class:[f(u)?.item,h.ui?.item,h.class],active:T||h.active})}),{default:O(()=>[j(I.$slots,h.slot||x?.slot||"item",{item:h,index:$,ui:o.value},()=>[j(I.$slots,h.slot?`${h.slot}-leading`:x?.slot?`${x.slot}-leading`:"item-leading",{item:h,index:$,ui:o.value},()=>[h.loading?(E(),B(Se,{key:0,name:n.loadingIcon||f(l).ui.icons.loading,"data-slot":"itemLeadingIcon",class:q(o.value.itemLeadingIcon({class:[f(u)?.itemLeadingIcon,h.ui?.itemLeadingIcon],loading:!0}))},null,8,["name","class"])):h.icon?(E(),B(Se,{key:1,name:h.icon,"data-slot":"itemLeadingIcon",class:q(o.value.itemLeadingIcon({class:[f(u)?.itemLeadingIcon,h.ui?.itemLeadingIcon],active:T||h.active}))},null,8,["name","class"])):h.avatar?(E(),B(xs,V({key:2,size:h.ui?.itemLeadingAvatarSize||f(u)?.itemLeadingAvatarSize||o.value.itemLeadingAvatarSize()},h.avatar,{"data-slot":"itemLeadingAvatar",class:o.value.itemLeadingAvatar({class:[f(u)?.itemLeadingAvatar,h.ui?.itemLeadingAvatar],active:T||h.active})}),null,16,["size","class"])):h.chip?(E(),B(Ss,V({key:3,size:h.ui?.itemLeadingChipSize||f(u)?.itemLeadingChipSize||o.value.itemLeadingChipSize(),inset:"",standalone:""},h.chip,{"data-slot":"itemLeadingChip",class:o.value.itemLeadingChip({class:[f(u)?.itemLeadingChip,h.ui?.itemLeadingChip],active:T||h.active})}),null,16,["size","class"])):Q("",!0)]),h.prefix||h.labelHtml||f(se)(h,e.labelKey)||h.suffixHtml||h.suffix||i[h.slot?`${h.slot}-label`:x?.slot?`${x.slot}-label`:"item-label"]||f(se)(h,e.descriptionKey)||i[h.slot?`${h.slot}-description`:x?.slot?`${x.slot}-description`:"item-description"]?(E(),H("span",{key:0,"data-slot":"itemWrapper",class:q(o.value.itemWrapper({class:[f(u)?.itemWrapper,h.ui?.itemWrapper]}))},[at("span",{"data-slot":"itemLabel",class:q(o.value.itemLabel({class:[f(u)?.itemLabel,h.ui?.itemLabel],active:T||h.active}))},[j(I.$slots,h.slot?`${h.slot}-label`:x?.slot?`${x.slot}-label`:"item-label",{item:h,index:$,ui:o.value},()=>[h.prefix?(E(),H("span",{key:0,"data-slot":"itemLabelPrefix",class:q(o.value.itemLabelPrefix({class:[f(u)?.itemLabelPrefix,h.ui?.itemLabelPrefix]}))},pe(h.prefix),3)):Q("",!0),h.labelHtml?(E(),H("span",{key:1,"data-slot":"itemLabelBase",class:q(o.value.itemLabelBase({class:[f(u)?.itemLabelBase,h.ui?.itemLabelBase],active:T||h.active})),innerHTML:h.labelHtml},null,10,bn)):(E(),H("span",{key:2,"data-slot":"itemLabelBase",class:q(o.value.itemLabelBase({class:[f(u)?.itemLabelBase,h.ui?.itemLabelBase],active:T||h.active}))},pe(f(se)(h,e.labelKey)),3)),h.suffixHtml?(E(),H("span",{key:3,"data-slot":"itemLabelSuffix",class:q(o.value.itemLabelSuffix({class:[f(u)?.itemLabelSuffix,h.ui?.itemLabelSuffix],active:T||h.active})),innerHTML:h.suffixHtml},null,10,xn)):h.suffix?(E(),H("span",{key:4,"data-slot":"itemLabelSuffix",class:q(o.value.itemLabelSuffix({class:[f(u)?.itemLabelSuffix,h.ui?.itemLabelSuffix],active:T||h.active}))},pe(h.suffix),3)):Q("",!0)])],2),f(se)(h,e.descriptionKey)||i[h.slot?`${h.slot}-description`:x?.slot?`${x.slot}-description`:"item-description"]?(E(),H("span",{key:0,"data-slot":"itemDescription",class:q(o.value.itemDescription({class:[f(u)?.itemDescription,h.ui?.itemDescription]}))},[j(I.$slots,h.slot?`${h.slot}-description`:x?.slot?`${x.slot}-description`:"item-description",{item:h,index:$,ui:o.value},()=>[Be(pe(f(se)(h,e.descriptionKey)),1)])],2)):Q("",!0)],2)):Q("",!0),at("span",{"data-slot":"itemTrailing",class:q(o.value.itemTrailing({class:[f(u)?.itemTrailing,h.ui?.itemTrailing]}))},[j(I.$slots,h.slot?`${h.slot}-trailing`:x?.slot?`${x.slot}-trailing`:"item-trailing",{item:h,index:$,ui:o.value},()=>[h.children&&h.children.length>0?(E(),B(Se,{key:0,name:n.childrenIcon||f(l).ui.icons.chevronRight,"data-slot":"itemTrailingIcon",class:q(o.value.itemTrailingIcon({class:[f(u)?.itemTrailingIcon,h.ui?.itemTrailingIcon]}))},null,8,["name","class"])):h.kbds?.length?(E(),H("span",{key:1,"data-slot":"itemTrailingKbds",class:q(o.value.itemTrailingKbds({class:[f(u)?.itemTrailingKbds,h.ui?.itemTrailingKbds]}))},[(E(!0),H(ae,null,me(h.kbds,(G,fe)=>(E(),B(As,V({key:fe,size:h.ui?.itemTrailingKbdsSize||f(u)?.itemTrailingKbdsSize||o.value.itemTrailingKbdsSize()},{ref_for:!0},typeof G=="string"?{value:G}:G),null,16,["size"]))),128))],2)):x?.highlightedIcon?(E(),B(Se,{key:2,name:x.highlightedIcon,"data-slot":"itemTrailingHighlightedIcon",class:q(o.value.itemTrailingHighlightedIcon({class:[f(u)?.itemTrailingHighlightedIcon,h.ui?.itemTrailingHighlightedIcon]}))},null,8,["name","class"])):Q("",!0)]),h.children?.length?Q("",!0):(E(),B(f(ri),{key:0,"as-child":""},{default:O(()=>[Z(Se,{name:n.selectedIcon||f(l).ui.icons.check,"data-slot":"itemTrailingIcon",class:q(o.value.itemTrailingIcon({class:[f(u)?.itemTrailingIcon,h.ui?.itemTrailingIcon]}))},null,8,["name","class"])]),_:2},1024))],2)])]),_:2},1040,["class"])]),_:2},1032,["value","disabled","onSelect"])]),_:2},1040)]),_:3}),Z(f(Hs),V({...f(p),...I.$attrs},{ref_key:"rootRef",ref:k,"selection-behavior":n.selectionBehavior,"data-slot":"root",class:o.value.root({class:[f(u)?.root,e.class]})}),{default:O(()=>[n.input?(E(),B(f(Ws),{key:0,modelValue:r.value,"onUpdate:modelValue":P[1]||(P[1]=h=>r.value=h),"as-child":""},{default:O(()=>[Z(Ts,V({variant:"none",size:n.size},typeof e.input=="object"?e.input:{},{placeholder:y.value,autofocus:n.autofocus,loading:n.loading,"loading-icon":n.loadingIcon,"trailing-icon":n.trailingIcon,icon:n.icon||f(l).ui.icons.search,"data-slot":"input",class:o.value.input({class:f(u)?.input}),onKeydown:ye(J,["backspace"])}),Dt({_:2},[v.value?.length&&(n.back||i.back)?{name:"leading",fn:O(()=>[j(I.$slots,"back",{ui:o.value},()=>[Z(lt,V({size:n.size,icon:n.backIcon||f(l).ui.icons.arrowLeft,color:"neutral",variant:"link","aria-label":f(a)("commandPalette.back")},typeof n.back=="object"?n.back:{},{"data-slot":"back",class:o.value.back({class:f(u)?.back}),onClick:D}),null,16,["size","icon","aria-label","class"])])]),key:"0"}:void 0,n.close||i.close?{name:"trailing",fn:O(()=>[j(I.$slots,"close",{ui:o.value},()=>[n.close?(E(),B(lt,V({key:0,size:n.size,icon:n.closeIcon||f(l).ui.icons.close,color:"neutral",variant:"ghost","aria-label":f(a)("commandPalette.close")},typeof n.close=="object"?n.close:{},{"data-slot":"close",class:o.value.close({class:f(u)?.close}),onClick:P[0]||(P[0]=h=>s("update:open",!1))}),null,16,["size","icon","aria-label","class"])):Q("",!0)])]),key:"1"}:void 0]),1040,["size","placeholder","autofocus","loading","loading-icon","trailing-icon","icon","class"])]),_:3},8,["modelValue"])):Q("",!0),Z(f(Ns),{"data-slot":"content",class:q(o.value.content({class:f(u)?.content}))},{default:O(()=>[W.value?.length?(E(),H("div",{key:0,role:"presentation","data-slot":"viewport",class:q(o.value.viewport({class:f(u)?.viewport}))},[n.virtualize?(E(),B(f(bi),V({key:0,options:A.value,"text-content":h=>f(se)(h,e.labelKey)},d.value),{default:O(({option:h,virtualItem:$})=>[Z(f(c),{item:h,index:$.index},null,8,["item","index"])]),_:1},16,["options","text-content"])):(E(!0),H(ae,{key:1},me(W.value,h=>(E(),B(f(Qs),{key:`group-${h.id}`,"data-slot":"group",class:q(o.value.group({class:f(u)?.group}))},{default:O(()=>[f(se)(h,e.labelKey)?(E(),B(f(Js),{key:0,"data-slot":"label",class:q(o.value.label({class:f(u)?.label}))},{default:O(()=>[Be(pe(f(se)(h,e.labelKey)),1)]),_:2},1032,["class"])):Q("",!0),(E(!0),H(ae,null,me(h.items,($,x)=>(E(),B(f(c),{key:`group-${h.id}-${x}`,item:$,index:x,group:h},null,8,["item","index","group"]))),128))]),_:2},1032,["class"]))),128))],2)):(E(),H("div",{key:1,"data-slot":"empty",class:q(o.value.empty({class:f(u)?.empty}))},[j(I.$slots,"empty",{searchTerm:r.value},()=>[Be(pe(r.value?f(a)("commandPalette.noMatch",{searchTerm:r.value}):f(a)("commandPalette.noData")),1)])],2))]),_:3},8,["class"]),i.footer?(E(),H("div",{key:1,"data-slot":"footer",class:q(o.value.footer({class:f(u)?.footer}))},[j(I.$slots,"footer",{ui:o.value})],2)):Q("",!0)]),_:3},16,["selection-behavior","class"])],64))}}),An={slots:{modal:"",input:""},variants:{fullscreen:{false:{modal:"sm:max-w-3xl h-full sm:h-[28rem]"}},size:{xs:{},sm:{},md:{},lg:{},xl:{}}},defaultVariants:{size:"md"}},Cn=/^[^-]+.*-.*[^-]+$/,In=/^[^_]+.*_.*[^_]+$/,Et=["arrowleft","arrowright","arrowup","arrowright","tab","escape","enter","backspace"];function Oe(n){return/^[a-z]$/i.test(n)?`Key${n.toUpperCase()}`:/^\d$/.test(n)?`Digit${n}`:/^f\d+$/i.test(n)?n.toUpperCase():{space:"Space",enter:"Enter",escape:"Escape",tab:"Tab",backspace:"Backspace",delete:"Delete",arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight"}[n.toLowerCase()]||n}function En(n,t={}){const e=te([]),s=()=>{e.value.splice(0,e.value.length)},i=Is(s,t.chainDelay??800),{macOS:r}=Es(),a=Ms(),l=t.layoutIndependent??!1,u=Et.map(c=>Oe(c)),p=c=>{if(!c.key)return;const o=l?/^Key[A-Z]$/i.test(c.code):/^[a-z]{1}$/i.test(c.key),m=l?u.includes(c.code):Et.includes(c.key.toLowerCase());let v;if(e.value.push(l?c.code:c.key),e.value.length>=2){v=e.value.slice(-2).join("-");for(const y of g.value.filter(S=>S.chained))if(y.key===v){y.enabled&&(c.preventDefault(),y.handler(c)),s();return}}for(const y of g.value.filter(S=>!S.chained)){if(l){if(c.code!==y.key)continue}else if(c.key.toLowerCase()!==y.key)continue;if(c.metaKey===y.metaKey&&c.ctrlKey===y.ctrlKey&&c.altKey===y.altKey&&!((o||m||y.shiftKey||c.shiftKey&&(c.metaKey||c.ctrlKey))&&c.shiftKey!==y.shiftKey)){y.enabled&&(c.preventDefault(),y.handler(c)),s();return}}i()},d=z(()=>{const c=a.value?.tagName,o=a.value?.contentEditable;return c==="INPUT"||c==="TEXTAREA"||o==="true"||o==="plaintext-only"?a.value?.name||!0:!1}),g=z(()=>Object.entries(ie(n)).map(([c,o])=>{if(!o)return null;let m;c.includes("-")&&c!=="-"&&!c.includes("_")&&!c.match(Cn)?.length&&console.trace(`[Shortcut] Invalid key: "${c}"`),c.includes("_")&&c!=="_"&&!c.match(In)?.length&&console.trace(`[Shortcut] Invalid key: "${c}"`);const v=c.includes("-")&&c!=="-"&&!c.includes("_");if(v)l?m={key:c.split("-").map(_=>Oe(_)).join("-"),metaKey:!1,ctrlKey:!1,shiftKey:!1,altKey:!1}:m={key:c.toLowerCase(),metaKey:!1,ctrlKey:!1,shiftKey:!1,altKey:!1};else{const S=c.toLowerCase().split("_").map(L=>L);let _=S.filter(L=>!["meta","command","ctrl","shift","alt","option"].includes(L)).join("_");l&&(_=Oe(_)),m={key:_,metaKey:S.includes("meta")||S.includes("command"),ctrlKey:S.includes("ctrl"),shiftKey:S.includes("shift"),altKey:S.includes("alt")||S.includes("option")}}if(m.chained=v,!r.value&&m.metaKey&&!m.ctrlKey&&(m.metaKey=!1,m.ctrlKey=!0),typeof o=="function"?m.handler=o:typeof o=="object"&&(m={...m,handler:o.handler}),!m.handler)return console.trace("[Shortcut] Invalid value"),null;let y=!0;return o.usingInput?typeof o.usingInput=="string"&&(y=d.value===o.usingInput):y=!d.value,m.enabled=y,m}).filter(Boolean));return _s("keydown",p)}const kn={__name:"UContentSearch",props:$e({size:{type:null,required:!1},icon:{type:null,required:!1},placeholder:{type:String,required:!1},autofocus:{type:Boolean,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},shortcut:{type:String,required:!1,default:"meta_k"},links:{type:Array,required:!1},navigation:{type:Array,required:!1},groups:{type:Array,required:!1},files:{type:Array,required:!1},fuse:{type:Object,required:!1},colorMode:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},overlay:{type:Boolean,required:!1},transition:{type:Boolean,required:!1},content:{type:Object,required:!1},dismissible:{type:Boolean,required:!1},fullscreen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0}},{searchTerm:{type:String,default:""},searchTermModifiers:{}}),emits:["update:searchTerm"],setup(n,{expose:t}){const e=n,s=Je(),i=Ft(n,"searchTerm",{type:String,default:""}),{t:r}=Lt(),{open:a,mapNavigationItems:l,postFilter:u}=ws(),p=ks(),d=zt(),g=Tt("contentSearch",e),c=ot(Ke(e,"size","icon","placeholder","autofocus","loading","loadingIcon","close","closeIcon")),o=ot(Ke(e,"overlay","transition","content","dismissible","fullscreen","modal","portal")),m=()=>Re(s,["content"]),v=z(()=>qe({},e.fuse,{fuseOptions:{includeMatches:!0}})),y=z(()=>_e({extend:_e(An),...d.ui?.contentSearch||{}})({size:e.size,fullscreen:e.fullscreen})),S=Bt("commandPaletteRef"),_=z(()=>e.links?.length?e.links.flatMap(A=>[{...A,suffix:A.description,description:void 0,icon:A.icon||d.ui.icons.file,children:void 0},...A.children?.map(k=>({...k,prefix:A.label+" >",suffix:k.description,description:void 0,icon:k.icon||A.icon||d.ui.icons.file}))||[]]):[]),L=z(()=>e.navigation?.length?e.navigation.some(A=>!!A.children?.length)?e.navigation.map(A=>({id:A.path,label:A.title,items:l(A.children||[],e.files||[]),postFilter:u})):[{id:"docs",items:l(e.navigation,e.files||[]),postFilter:u}]:[]),K=z(()=>!e.colorMode||p?.forced?null:{id:"theme",label:r("contentSearch.theme"),items:[{label:r("colorMode.system"),icon:d.ui.icons.system,active:p.preference==="system",onSelect:()=>{p.preference="system"}},{label:r("colorMode.light"),icon:d.ui.icons.light,active:p.preference==="light",onSelect:()=>{p.preference="light"}},{label:r("colorMode.dark"),icon:d.ui.icons.dark,active:p.preference==="dark",onSelect:()=>{p.preference="dark"}}]}),w=z(()=>{const A=[];return _.value.length&&A.push({id:"links",label:r("contentSearch.links"),items:_.value}),A.push(...L.value),A.push(...e.groups||[]),K.value&&A.push(K.value),A});function W(A){A.disabled||(a.value=!1,i.value="")}return En({[e.shortcut]:{usingInput:!0,handler:()=>a.value=!a.value}}),t({commandPaletteRef:S}),(A,k)=>(E(),B(zs,V({open:f(a),"onUpdate:open":k[2]||(k[2]=R=>Ls(a)?a.value=R:null),title:n.title||f(r)("contentSearch.title"),description:n.description||f(r)("contentSearch.description")},f(o),{"data-slot":"modal",class:y.value.modal({class:[f(g)?.modal,e.class]})}),{content:O(R=>[j(A.$slots,"content",ut(ct(R)),()=>[Z(Sn,V({ref_key:"commandPaletteRef",ref:S,"search-term":i.value,"onUpdate:searchTerm":k[0]||(k[0]=D=>i.value=D)},f(c),{groups:w.value,fuse:v.value,input:{fixed:!0},ui:f(Fs)(f(Re)(y.value,["modal"]),f(g)),"onUpdate:modelValue":W,"onUpdate:open":k[1]||(k[1]=D=>a.value=D)}),Dt({_:2},[me(m(),(D,J)=>({name:J,fn:O(ee=>[j(A.$slots,J,ut(ct(ee)))])}))]),1040,["search-term","groups","fuse","ui"])])]),_:3},16,["open","title","description","class"]))}};export{kn as default}; diff --git a/docus/dist/_nuxt/Czt-ZuAe.js b/docus/dist/_nuxt/Czt-ZuAe.js new file mode 100644 index 0000000..98a86b9 --- /dev/null +++ b/docus/dist/_nuxt/Czt-ZuAe.js @@ -0,0 +1 @@ +import{aQ as c,e as t,s as d,q as n,c as p,o as r}from"./B3fabVUf.js";const u=["id"],f=["href"],k={__name:"ProseH6",props:{id:{type:String,required:!1}},setup(a){const e=a,{headings:o}=c().public.mdc,i=p(()=>e.id&&(typeof o?.anchorLinks=="boolean"&&o?.anchorLinks===!0||typeof o?.anchorLinks=="object"&&o?.anchorLinks?.h6));return(s,h)=>(r(),t("h6",{id:e.id},[e.id&&d(i)?(r(),t("a",{key:0,href:`#${e.id}`},[n(s.$slots,"default")],8,f)):n(s.$slots,"default",{key:1})],8,u))}};export{k as default}; diff --git a/docus/dist/_nuxt/D-lyTl4E.js b/docus/dist/_nuxt/D-lyTl4E.js new file mode 100644 index 0000000..8090829 --- /dev/null +++ b/docus/dist/_nuxt/D-lyTl4E.js @@ -0,0 +1 @@ +const o={or:"또는",error:{title:"페이지를 찾을 수 없습니다",description:"죄송합니다. 찾고 계신 페이지를 찾을 수 없습니다."}},a={copy:{page:"페이지 복사",link:"Markdown 페이지 복사",view:"Markdown으로 보기",gpt:"ChatGPT에서 열기",claude:"Claude에서 열기"},links:"커뮤니티",toc:"이 페이지에서",menu:"메뉴",report:"문제 신고",edit:"이 페이지 편집"},e={copyLogo:"로고 복사",copyWordmark:"워드마크 복사",downloadLogo:"로고 다운로드",downloadWordmark:"워드마크 다운로드",brandAssets:"브랜드 에셋",logoCopied:"로고가 복사되었습니다",wordmarkCopied:"워드마크가 복사되었습니다",logoDownloaded:"로고가 다운로드되었습니다",wordmarkDownloaded:"워드마크가 다운로드되었습니다",copyLogoFailed:"로고 복사 실패",copyWordmarkFailed:"워드마크 복사 실패"},n={title:"AI에게 물어보기",placeholder:"질문하기...",tooltip:"AI에 질문하기",tryAsking:"질문을 해보세요",askAnything:"무엇이든 물어보세요...",clearChat:"채팅 지우기",close:"닫기",expand:"펼치기",collapse:"접기",thinking:"생각 중...",askMeAnything:"무엇이든 물어보세요",askMeAnythingDescription:"문서를 탐색하고, 개념을 이해하고, 답을 찾는 데 도움을 받으세요.",faq:"자주 묻는 질문",chatCleared:"새로 고침 시 채팅이 지워집니다",lineBreak:"줄바꿈",explainWithAi:"AI로 설명",toolListPages:"나열된 문서 페이지",toolReadPage:"읽기",loading:{searching:"문서를 검색하는 중",reading:"문서 읽기",analyzing:"콘텐츠 분석",finding:"최선의 답 찾기",finished:"사용된 출처"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/D0RjKS9E.js b/docus/dist/_nuxt/D0RjKS9E.js new file mode 100644 index 0000000..7f868b5 --- /dev/null +++ b/docus/dist/_nuxt/D0RjKS9E.js @@ -0,0 +1 @@ +const e={or:"eller",error:{title:"Side ikke funnet",description:"Vi beklager, men siden du leter etter kunne ikke finnes."}},o={copy:{page:"Kopier side",link:"Kopier Markdown-side",view:"Vis som Markdown",gpt:"Åpne i ChatGPT",claude:"Åpne i Claude"},links:"Fellesskap",toc:"På denne siden",menu:"Meny",report:"Rapporter et problem",edit:"Rediger denne siden"},n={copyLogo:"Kopier logo",copyWordmark:"Kopier wordmark",downloadLogo:"Last ned logo",downloadWordmark:"Last ned wordmark",brandAssets:"Merkevareressurser",logoCopied:"Logo kopiert",wordmarkCopied:"Wordmark kopiert",logoDownloaded:"Logo lastet ned",wordmarkDownloaded:"Wordmark lastet ned",copyLogoFailed:"Kunne ikke kopiere logo",copyWordmarkFailed:"Kunne ikke kopiere wordmark"},r={title:"Spør AI",placeholder:"Still et spørsmål...",tooltip:"Still AI et spørsmål",tryAsking:"Prøv å stille et spørsmål",askAnything:"Spør hva som helst...",clearChat:"Tøm chat",close:"Lukk",expand:"Utvid",collapse:"Skjul",thinking:"Tenker...",askMeAnything:"Spør hva som helst",askMeAnythingDescription:"Få hjelp til å navigere i dokumentasjonen, forstå konsepter og finne svar.",faq:"Ofte stilte spørsmål",chatCleared:"Chat slettes ved oppdatering",lineBreak:"Linjeskift",explainWithAi:"Forklar med AI",toolListPages:"Oppførte dokumentasjonssider",toolReadPage:"Les",loading:{searching:"Søker i dokumentasjonen",reading:"Leser gjennom dokumentene",analyzing:"Analyserer innholdet",finding:"Finne det beste svaret",finished:"Kilder brukt"}},t={common:e,docs:o,logo:n,assistant:r};export{r as assistant,e as common,t as default,o as docs,n as logo}; diff --git a/docus/dist/_nuxt/D2PgxUb5.js b/docus/dist/_nuxt/D2PgxUb5.js new file mode 100644 index 0000000..18b1b12 --- /dev/null +++ b/docus/dist/_nuxt/D2PgxUb5.js @@ -0,0 +1 @@ +import{Q as z,c2 as B,a0 as I,a1 as P,c3 as V,w as F,o as s,a as h,p as C,e as c,ac as n,s as r,f as g,af as x,q as d,ab as T,ah as k,ag as q,a7 as j,m as N,X as O,P as A,c as p,am as w,c4 as E,v as R}from"./B3fabVUf.js";const U={slots:{root:"relative flex rounded-lg",spotlight:"absolute inset-0 rounded-[inherit] pointer-events-none bg-default/90",container:"relative flex flex-col flex-1 lg:grid gap-x-8 gap-y-4 p-4 sm:p-6",wrapper:"flex flex-col flex-1 items-start",header:"mb-4",body:"flex-1",footer:"pt-4 mt-auto",leading:"inline-flex items-center mb-2.5",leadingIcon:"size-5 shrink-0 text-primary",title:"text-base text-pretty font-semibold text-highlighted",description:"text-[15px] text-pretty"},variants:{orientation:{horizontal:{container:"lg:grid-cols-2 lg:items-center"},vertical:{container:""}},reverse:{true:{wrapper:"order-last"}},variant:{solid:{root:"bg-inverted text-inverted",title:"text-inverted",description:"text-dimmed"},outline:{root:"bg-default ring ring-default",description:"text-muted"},soft:{root:"bg-elevated/50",description:"text-toned"},subtle:{root:"bg-elevated/50 ring ring-default",description:"text-toned"},ghost:{description:"text-muted"},naked:{container:"p-0 sm:p-0",description:"text-muted"}},to:{true:{root:["has-focus-visible:ring-2 has-focus-visible:ring-primary","transition"]}},title:{true:{description:"mt-1"}},highlight:{true:{root:"ring-2"}},highlightColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},spotlight:{true:{root:"[--spotlight-size:400px] before:absolute before:-inset-px before:pointer-events-none before:rounded-[inherit] before:bg-[radial-gradient(var(--spotlight-size)_var(--spotlight-size)_at_calc(var(--spotlight-x,0px))_calc(var(--spotlight-y,0px)),var(--spotlight-color),transparent_70%)]"}},spotlightColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""}},compoundVariants:[{variant:"solid",to:!0,class:{root:"hover:bg-inverted/90"}},{variant:"outline",to:!0,class:{root:"hover:bg-elevated/50"}},{variant:"soft",to:!0,class:{root:"hover:bg-elevated"}},{variant:"subtle",to:!0,class:{root:"hover:bg-elevated"}},{variant:"subtle",to:!0,highlight:!1,class:{root:"hover:ring-accented"}},{variant:"ghost",to:!0,class:{root:"hover:bg-elevated/50"}},{highlightColor:"primary",highlight:!0,class:{root:"ring-primary"}},{highlightColor:"secondary",highlight:!0,class:{root:"ring-secondary"}},{highlightColor:"success",highlight:!0,class:{root:"ring-success"}},{highlightColor:"info",highlight:!0,class:{root:"ring-info"}},{highlightColor:"warning",highlight:!0,class:{root:"ring-warning"}},{highlightColor:"error",highlight:!0,class:{root:"ring-error"}},{highlightColor:"neutral",highlight:!0,class:{root:"ring-inverted"}},{spotlightColor:"primary",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-primary)]"}},{spotlightColor:"secondary",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-secondary)]"}},{spotlightColor:"success",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-success)]"}},{spotlightColor:"info",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-info)]"}},{spotlightColor:"warning",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-warning)]"}},{spotlightColor:"error",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-error)]"}},{spotlightColor:"neutral",spotlight:!0,class:{root:"[--spotlight-color:var(--ui-bg-inverted)]"}}],defaultVariants:{variant:"outline",highlightColor:"primary",spotlightColor:"primary"}},D=Object.assign({inheritAttrs:!1},{__name:"UPageCard",props:{as:{type:null,required:!1},icon:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},orientation:{type:null,required:!1,default:"vertical"},reverse:{type:Boolean,required:!1},highlight:{type:Boolean,required:!1},highlightColor:{type:null,required:!1},spotlight:{type:Boolean,required:!1},spotlightColor:{type:null,required:!1},variant:{type:null,required:!1},to:{type:null,required:!1},target:{type:[String,Object,null],required:!1},onClick:{type:Function,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const o=t,e=z(),v=R(),u=B(),$=I(),l=P("pageCard",o),{elementX:f,elementY:y}=V(v,{eventFilter:u.eventFilter}),m=p(()=>o.spotlight&&(f.value!==0||y.value!==0));F(()=>o.spotlight,a=>{a?u.resume():u.pause()},{immediate:!0});const i=p(()=>w({extend:w(U),...$.ui?.pageCard||{}})({orientation:o.orientation,reverse:o.reverse,variant:o.variant,to:!!o.to||!!o.onClick,title:!!o.title||!!e.title,highlight:o.highlight,highlightColor:o.highlightColor,spotlight:m.value,spotlightColor:o.spotlightColor})),S=p(()=>(e.title&&E(e.title())||o.title||"Card link").trim());return(a,b)=>(s(),h(r(A),{ref_key:"cardRef",ref:v,as:t.as,"data-orientation":t.orientation,"data-slot":"root",class:n(i.value.root({class:[r(l)?.root,o.class]})),style:O(m.value&&{"--spotlight-x":`${r(f)}px`,"--spotlight-y":`${r(y)}px`}),onClick:t.onClick},{default:C(()=>[o.spotlight?(s(),c("div",{key:0,"data-slot":"spotlight",class:n(i.value.spotlight({class:r(l)?.spotlight}))},null,2)):g("",!0),x("div",{"data-slot":"container",class:n(i.value.container({class:r(l)?.container}))},[e.header||t.icon||e.leading||e.body||t.title||e.title||t.description||e.description||e.footer?(s(),c("div",{key:0,"data-slot":"wrapper",class:n(i.value.wrapper({class:r(l)?.wrapper}))},[e.header?(s(),c("div",{key:0,"data-slot":"header",class:n(i.value.header({class:r(l)?.header}))},[d(a.$slots,"header")],2)):g("",!0),t.icon||e.leading?(s(),c("div",{key:1,"data-slot":"leading",class:n(i.value.leading({class:r(l)?.leading}))},[d(a.$slots,"leading",{ui:i.value},()=>[t.icon?(s(),h(T,{key:0,name:t.icon,"data-slot":"leadingIcon",class:n(i.value.leadingIcon({class:r(l)?.leadingIcon}))},null,8,["name","class"])):g("",!0)])],2)):g("",!0),e.body||t.title||e.title||t.description||e.description?(s(),c("div",{key:2,"data-slot":"body",class:n(i.value.body({class:r(l)?.body}))},[d(a.$slots,"body",{},()=>[t.title||e.title?(s(),c("div",{key:0,"data-slot":"title",class:n(i.value.title({class:r(l)?.title}))},[d(a.$slots,"title",{},()=>[k(q(t.title),1)])],2)):g("",!0),t.description||e.description?(s(),c("div",{key:1,"data-slot":"description",class:n(i.value.description({class:r(l)?.description}))},[d(a.$slots,"description",{},()=>[k(q(t.description),1)])],2)):g("",!0)])],2)):g("",!0),e.footer?(s(),c("div",{key:3,"data-slot":"footer",class:n(i.value.footer({class:r(l)?.footer}))},[d(a.$slots,"footer")],2)):g("",!0)],2)):g("",!0),d(a.$slots,"default")],2),t.to?(s(),h(j,N({key:1,"aria-label":S.value},{to:t.to,target:t.target,...a.$attrs},{class:"focus:outline-none peer",raw:""}),{default:C(()=>[...b[0]||(b[0]=[x("span",{class:"absolute inset-0","aria-hidden":"true"},null,-1)])]),_:1},16,["aria-label"])):g("",!0)]),_:3},8,["as","data-orientation","class","style","onClick"]))}});export{D as default}; diff --git a/docus/dist/_nuxt/D5DWQP-B.js b/docus/dist/_nuxt/D5DWQP-B.js new file mode 100644 index 0000000..8ed93fb --- /dev/null +++ b/docus/dist/_nuxt/D5DWQP-B.js @@ -0,0 +1 @@ +import{a0 as m,a1 as g,aQ as b,e as i,ac as n,s as c,q as r,c as u,am as d,o as h}from"./B3fabVUf.js";const k={slots:{base:"text-lg text-highlighted font-bold mt-6 mb-2 scroll-mt-[calc(24px+45px+var(--ui-header-height))] lg:scroll-mt-[calc(24px+var(--ui-header-height))] [&>a]:focus-visible:outline-primary",link:""}},v=["id"],y=["href"],q={__name:"ProseH4",props:{id:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,p=m(),a=g("prose.h4",s),{headings:t}=b().public?.mdc||{},o=u(()=>d({extend:d(k),...p.ui?.prose?.h4||{}})()),f=u(()=>s.id&&typeof t?.anchorLinks=="object"&&t.anchorLinks.h4);return(l,x)=>(h(),i("h4",{id:e.id,class:n(o.value.base({class:[c(a)?.base,s.class]}))},[e.id&&f.value?(h(),i("a",{key:0,href:`#${e.id}`,class:n(o.value.link({class:c(a)?.link}))},[r(l.$slots,"default")],10,y)):r(l.$slots,"default",{key:1})],10,v))}};export{q as default}; diff --git a/docus/dist/_nuxt/D5E4Znt1.js b/docus/dist/_nuxt/D5E4Znt1.js new file mode 100644 index 0000000..c069175 --- /dev/null +++ b/docus/dist/_nuxt/D5E4Znt1.js @@ -0,0 +1 @@ +import{a0 as m,a1 as g,aQ as k,e as o,ac as i,s as c,q as r,c as u,am as d,o as h}from"./B3fabVUf.js";const b={slots:{base:"text-4xl text-highlighted font-bold mb-8 scroll-mt-[calc(45px+var(--ui-header-height))] lg:scroll-mt-(--ui-header-height)",link:"inline-flex items-center gap-2"}},x=["id"],y=["href"],q={__name:"ProseH1",props:{id:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,p=m(),a=g("prose.h1",s),{headings:t}=k().public?.mdc||{},l=u(()=>d({extend:d(b),...p.ui?.prose?.h1||{}})()),f=u(()=>s.id&&typeof t?.anchorLinks=="object"&&t.anchorLinks.h1);return(n,v)=>(h(),o("h1",{id:e.id,class:i(l.value.base({class:[c(a)?.base,s.class]}))},[e.id&&f.value?(h(),o("a",{key:0,href:`#${e.id}`,class:i(l.value.link({class:c(a)?.link}))},[r(n.$slots,"default")],10,y)):r(n.$slots,"default",{key:1})],10,x))}};export{q as default}; diff --git a/docus/dist/_nuxt/DB_5vY_E.js b/docus/dist/_nuxt/DB_5vY_E.js new file mode 100644 index 0000000..a312f06 --- /dev/null +++ b/docus/dist/_nuxt/DB_5vY_E.js @@ -0,0 +1 @@ +import{a0 as n,a1 as c,e as l,q as u,ac as i,s as m,c as f,am as s,o as d}from"./B3fabVUf.js";const _={base:"my-5 leading-7 text-pretty"},b={__name:"ProseP",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const e=a,t=n(),o=c("prose.p",e),p=f(()=>s({extend:s(_),...t.ui?.prose?.p||{}}));return(r,y)=>(d(),l("p",{class:i(p.value({class:[m(o)?.base,e.class]}))},[u(r.$slots,"default")],2))}};export{b as default}; diff --git a/docus/dist/_nuxt/DEklDIUE.js b/docus/dist/_nuxt/DEklDIUE.js new file mode 100644 index 0000000..e6a47d1 --- /dev/null +++ b/docus/dist/_nuxt/DEklDIUE.js @@ -0,0 +1 @@ +const o={or:"կամ",error:{title:"Էջը չի գտնվել",description:"Ներողություն, բայց այն էջը, որը փնտրում եք, չի գտնվել:"}},a={copy:{page:"Պատճենել էջը",link:"Պատճենել Markdown էջը",view:"Դիտել որպես Markdown",gpt:"Բացել ChatGPT-ում",claude:"Բացել Claude-ում"},links:"Համայնք",toc:"Այս էջում",menu:"Ընտրացանկ",report:"Հաղորդել խնդրի մասին",edit:"Խմբագրել այս էջը"},d={copyLogo:"Copy logo",copyWordmark:"Copy wordmark",downloadLogo:"Download logo",downloadWordmark:"Download wordmark",brandAssets:"Brand assets",logoCopied:"Logo copied",wordmarkCopied:"Wordmark copied",logoDownloaded:"Logo downloaded",wordmarkDownloaded:"Wordmark downloaded",copyLogoFailed:"Failed to copy logo",copyWordmarkFailed:"Failed to copy wordmark"},e={title:"Հարցրեք AI-ին",placeholder:"Հարց տվեք...",tooltip:"Հարց տվեք AI-ին",tryAsking:"Փորձեք հարց տալ",askAnything:"Հարցրեք որևէ բան...",clearChat:"Ջնջել չատը",close:"Փակել",expand:"Ընդարձակել",collapse:"Փակել",thinking:"Մտածում եմ...",askMeAnything:"Հարցրեք որևէ բան",askMeAnythingDescription:"Ստացեք օգնություն՝ փաստաթղթերում կողմնորոշվելու, հասկացությունները հասկանալու և պատասխաններ գտնելու համար։",faq:"ՀՏՀ",chatCleared:"Զրույցը մաքրվում է թարմացնելիս",lineBreak:"Գծի ընդմիջում",explainWithAi:"Բացատրիր AI-ով",toolListPages:"Հրապարակված փաստաթղթերի էջեր",toolReadPage:"Կարդալ",loading:{searching:"Փաստաթղթերի որոնում",reading:"Փաստաթղթերի ընթերցում",analyzing:"Բովանդակության վերլուծություն",finding:"Գտնել լավագույն պատասխանը",finished:"Օգտագործված աղբյուրներ"}},n={common:o,docs:a,logo:d,assistant:e};export{e as assistant,o as common,n as default,a as docs,d as logo}; diff --git a/docus/dist/_nuxt/DHP-KcjK.js b/docus/dist/_nuxt/DHP-KcjK.js new file mode 100644 index 0000000..816a7d3 --- /dev/null +++ b/docus/dist/_nuxt/DHP-KcjK.js @@ -0,0 +1 @@ +import{Q as v,a0 as m,a1 as f,e as d,af as w,q as n,ac as o,s as r,f as b,c as y,am as l,o as u}from"./B3fabVUf.js";const C={slots:{root:"my-5",preview:"flex justify-center border border-muted relative p-4 rounded-md",code:"[&>div>pre]:rounded-t-none [&>div]:my-0"},variants:{code:{true:{preview:"border-b-0 rounded-b-none"}}}},k={__name:"ProseCodePreview",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(i){const a=i,t=v(),p=m(),e=f("prose.codePreview",a),s=y(()=>l({extend:l(C),...p.ui?.prose?.codePreview||{}})({code:!!t.code}));return(c,P)=>(u(),d("div",{class:o(s.value.root({class:[r(e)?.root,a.class]}))},[w("div",{class:o(s.value.preview({class:[r(e)?.preview]}))},[n(c.$slots,"default")],2),t.code?(u(),d("div",{key:0,class:o(s.value.code({class:[r(e)?.code]}))},[n(c.$slots,"code")],2)):b("",!0)],2))}};export{k as default}; diff --git a/docus/dist/_nuxt/DJxuwfoz.js b/docus/dist/_nuxt/DJxuwfoz.js new file mode 100644 index 0000000..98129ee --- /dev/null +++ b/docus/dist/_nuxt/DJxuwfoz.js @@ -0,0 +1 @@ +import{Q as K,l as W,a0 as X,a1 as Y,aB as Z,aC as _,aD as ee,a6 as ie,G as ae,o as n,a as d,p as le,af as se,m as q,s as a,q as m,e as I,ac as o,ab as S,ad as te,f as g,P as ne,c as B,am as A,aE as re}from"./B3fabVUf.js";const oe={slots:{root:"relative inline-flex items-center",base:["w-full rounded-md border-0 appearance-none placeholder:text-dimmed focus:outline-none disabled:cursor-not-allowed disabled:opacity-75","transition-colors"],leading:"absolute inset-y-0 start-0 flex items-center",leadingIcon:"shrink-0 text-dimmed",leadingAvatar:"shrink-0",leadingAvatarSize:"",trailing:"absolute inset-y-0 end-0 flex items-center",trailingIcon:"shrink-0 text-dimmed"},variants:{fieldGroup:{horizontal:{root:"group has-focus-visible:z-[1]",base:"group-not-only:group-first:rounded-e-none group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none"},vertical:{root:"group has-focus-visible:z-[1]",base:"group-not-only:group-first:rounded-b-none group-not-only:group-last:rounded-t-none group-not-last:group-not-first:rounded-none"}},size:{xs:{base:"px-2 py-1 text-sm/4 gap-1",leading:"ps-2",trailing:"pe-2",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},sm:{base:"px-2.5 py-1.5 text-sm/4 gap-1.5",leading:"ps-2.5",trailing:"pe-2.5",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},md:{base:"px-2.5 py-1.5 text-base/5 gap-1.5",leading:"ps-2.5",trailing:"pe-2.5",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},lg:{base:"px-3 py-2 text-base/5 gap-2",leading:"ps-3",trailing:"pe-3",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},xl:{base:"px-3 py-2 text-base gap-2",leading:"ps-3",trailing:"pe-3",leadingIcon:"size-6",leadingAvatarSize:"xs",trailingIcon:"size-6"}},variant:{outline:"text-highlighted bg-default ring ring-inset ring-accented",soft:"text-highlighted bg-elevated/50 hover:bg-elevated focus:bg-elevated disabled:bg-elevated/50",subtle:"text-highlighted bg-elevated ring ring-inset ring-accented",ghost:"text-highlighted bg-transparent hover:bg-elevated focus:bg-elevated disabled:bg-transparent dark:disabled:bg-transparent",none:"text-highlighted bg-transparent"},color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},leading:{true:""},trailing:{true:""},loading:{true:""},highlight:{true:""},fixed:{false:""},type:{file:"file:me-1.5 file:font-medium file:text-muted file:outline-none"}},compoundVariants:[{color:"primary",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary"},{color:"secondary",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-secondary"},{color:"success",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-success"},{color:"info",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-info"},{color:"warning",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-warning"},{color:"error",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-error"},{color:"primary",highlight:!0,class:"ring ring-inset ring-primary"},{color:"secondary",highlight:!0,class:"ring ring-inset ring-secondary"},{color:"success",highlight:!0,class:"ring ring-inset ring-success"},{color:"info",highlight:!0,class:"ring ring-inset ring-info"},{color:"warning",highlight:!0,class:"ring ring-inset ring-warning"},{color:"error",highlight:!0,class:"ring ring-inset ring-error"},{color:"neutral",variant:["outline","subtle"],class:"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-inverted"},{color:"neutral",highlight:!0,class:"ring ring-inset ring-inverted"},{leading:!0,size:"xs",class:"ps-7"},{leading:!0,size:"sm",class:"ps-8"},{leading:!0,size:"md",class:"ps-9"},{leading:!0,size:"lg",class:"ps-10"},{leading:!0,size:"xl",class:"ps-11"},{trailing:!0,size:"xs",class:"pe-7"},{trailing:!0,size:"sm",class:"pe-8"},{trailing:!0,size:"md",class:"pe-9"},{trailing:!0,size:"lg",class:"pe-10"},{trailing:!0,size:"xl",class:"pe-11"},{loading:!0,leading:!0,class:{leadingIcon:"animate-spin"}},{loading:!0,leading:!1,trailing:!0,class:{trailingIcon:"animate-spin"}},{fixed:!1,size:"xs",class:"md:text-xs"},{fixed:!1,size:"sm",class:"md:text-xs"},{fixed:!1,size:"md",class:"md:text-sm"},{fixed:!1,size:"lg",class:"md:text-sm"}],defaultVariants:{size:"md",color:"primary",variant:"outline"}},ue=["id","type","value","name","placeholder","disabled","required","autocomplete"],ge=Object.assign({inheritAttrs:!1},{__name:"UInput",props:{as:{type:null,required:!1},id:{type:String,required:!1},name:{type:String,required:!1},type:{type:null,required:!1,default:"text"},placeholder:{type:String,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},size:{type:null,required:!1},required:{type:Boolean,required:!1},autocomplete:{type:[String,Object],required:!1,default:"off"},autofocus:{type:Boolean,required:!1},autofocusDelay:{type:Number,required:!1,default:0},disabled:{type:Boolean,required:!1},highlight:{type:Boolean,required:!1},fixed:{type:Boolean,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},modelModifiers:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1}},emits:["update:modelValue","blur","change"],setup(s,{expose:k,emit:V}){const i=s,c=V,u=K(),v=W(i,"modelValue",c,{defaultValue:i.defaultValue}),C=X(),t=Y("input",i),{emitFormBlur:M,emitFormInput:F,emitFormChange:w,size:G,color:N,id:$,name:j,highlight:O,disabled:P,emitFormFocus:b,ariaAttrs:R}=Z(i,{}),{orientation:T,size:D}=_(i),{isLeading:f,isTrailing:h,leadingIconName:y,trailingIconName:x}=ee(i),E=B(()=>D.value||G.value),l=B(()=>A({extend:A(oe),...C.ui?.input||{}})({type:i.type,color:N.value,variant:i.variant,size:E?.value,loading:i.loading,highlight:O.value,fixed:i.fixed,leading:f.value||!!i.avatar||!!u.leading,trailing:h.value||!!u.trailing,fieldGroup:T.value})),p=ie("inputRef");function z(e){i.modelModifiers?.trim&&(typeof e=="string"||e===null||e===void 0)&&(e=e?.trim()??null),(i.modelModifiers?.number||i.type==="number")&&(e=re(e)),i.modelModifiers?.nullable&&(e||=null),i.modelModifiers?.optional&&!i.modelModifiers?.nullable&&e!==null&&(e||=void 0),v.value=e,F()}function U(e){i.modelModifiers?.lazy||z(e.target.value)}function L(e){const r=e.target.value;i.modelModifiers?.lazy&&z(r),i.modelModifiers?.trim&&(e.target.value=r.trim()),w(),c("change",e)}function Q(e){M(),c("blur",e)}function H(){i.autofocus&&p.value?.focus()}return ae(()=>{setTimeout(()=>{H()},i.autofocusDelay)}),k({inputRef:p}),(e,r)=>(n(),d(a(ne),{as:s.as,"data-slot":"root",class:o(l.value.root({class:[a(t)?.root,i.class]}))},{default:le(()=>[se("input",q({id:a($),ref_key:"inputRef",ref:p,type:s.type,value:a(v),name:a(j),placeholder:s.placeholder,"data-slot":"base",class:l.value.base({class:a(t)?.base}),disabled:a(P),required:s.required,autocomplete:s.autocomplete},{...e.$attrs,...a(R)},{onInput:U,onBlur:Q,onChange:L,onFocus:r[0]||(r[0]=(...J)=>a(b)&&a(b)(...J))}),null,16,ue),m(e.$slots,"default",{ui:l.value}),a(f)||s.avatar||u.leading?(n(),I("span",{key:0,"data-slot":"leading",class:o(l.value.leading({class:a(t)?.leading}))},[m(e.$slots,"leading",{ui:l.value},()=>[a(f)&&a(y)?(n(),d(S,{key:0,name:a(y),"data-slot":"leadingIcon",class:o(l.value.leadingIcon({class:a(t)?.leadingIcon}))},null,8,["name","class"])):s.avatar?(n(),d(te,q({key:1,size:a(t)?.leadingAvatarSize||l.value.leadingAvatarSize()},s.avatar,{"data-slot":"leadingAvatar",class:l.value.leadingAvatar({class:a(t)?.leadingAvatar})}),null,16,["size","class"])):g("",!0)])],2)):g("",!0),a(h)||u.trailing?(n(),I("span",{key:1,"data-slot":"trailing",class:o(l.value.trailing({class:a(t)?.trailing}))},[m(e.$slots,"trailing",{ui:l.value},()=>[a(x)?(n(),d(S,{key:0,name:a(x),"data-slot":"trailingIcon",class:o(l.value.trailingIcon({class:a(t)?.trailingIcon}))},null,8,["name","class"])):g("",!0)])],2)):g("",!0)]),_:3},8,["as","class"]))}});export{ge as _}; diff --git a/docus/dist/_nuxt/DLv9Mxsp.js b/docus/dist/_nuxt/DLv9Mxsp.js new file mode 100644 index 0000000..f400088 --- /dev/null +++ b/docus/dist/_nuxt/DLv9Mxsp.js @@ -0,0 +1 @@ +import{a0 as d,a1 as c,e as n,q as i,ac as u,s as p,c as m,am as e,o as f}from"./B3fabVUf.js";const h={base:"[&:first-child>th:first-child]:rounded-tl-md [&:first-child>th:last-child]:rounded-tr-md [&:last-child>td:first-child]:rounded-bl-md [&:last-child>td:last-child]:rounded-br-md"},C={__name:"ProseTr",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const s=t,a=d(),r=c("prose.tr",s),l=m(()=>e({extend:e(h),...a.ui?.prose?.tr||{}}));return(o,b)=>(f(),n("tr",{class:u(l.value({class:[p(r)?.base,s.class]}))},[i(o.$slots,"default")],2))}};export{C as default}; diff --git a/docus/dist/_nuxt/DOelY9Nb.js b/docus/dist/_nuxt/DOelY9Nb.js new file mode 100644 index 0000000..c13edd4 --- /dev/null +++ b/docus/dist/_nuxt/DOelY9Nb.js @@ -0,0 +1 @@ +const o={or:"or",error:{title:"Page not found",description:"We are sorry but this page could not be found."}},e={copy:{page:"Copy page",link:"Copy Markdown page",view:"View as Markdown",gpt:"Open in ChatGPT",claude:"Open in Claude"},links:"Community",toc:"On this page",menu:"Menu",report:"Report an issue",edit:"Edit this page"},n={copyLogo:"Copy logo",copyWordmark:"Copy wordmark",downloadLogo:"Download logo",downloadWordmark:"Download wordmark",brandAssets:"Brand assets",logoCopied:"Logo copied",wordmarkCopied:"Wordmark copied",logoDownloaded:"Logo downloaded",wordmarkDownloaded:"Wordmark downloaded",copyLogoFailed:"Failed to copy logo",copyWordmarkFailed:"Failed to copy wordmark"},a={title:"Ask AI",placeholder:"Ask a question...",tooltip:"Ask AI a question",tryAsking:"Try asking a question",askAnything:"Ask anything...",clearChat:"Clear chat",close:"Close",expand:"Expand",collapse:"Collapse",thinking:"Thinking...",askMeAnything:"Ask anything",askMeAnythingDescription:"Get help navigating the documentation, understanding concepts, and finding answers.",faq:"FAQ",chatCleared:"Chat is cleared on refresh",lineBreak:"Line break",explainWithAi:"Explain with AI",toolListPages:"Listed documentation pages",toolReadPage:"Read",loading:{searching:"Searching the documentation",reading:"Reading through the docs",analyzing:"Analyzing the content",finding:"Finding the best answer",finished:"Sources used"}},i={common:o,docs:e,logo:n,assistant:a};export{a as assistant,o as common,i as default,e as docs,n as logo}; diff --git a/docus/dist/_nuxt/DVlZI4kn.js b/docus/dist/_nuxt/DVlZI4kn.js new file mode 100644 index 0000000..e3ce303 --- /dev/null +++ b/docus/dist/_nuxt/DVlZI4kn.js @@ -0,0 +1 @@ +const a={or:"o",error:{title:"Página no encontrada",description:"Lo sentimos, no se pudo encontrar esta página."}},o={copy:{page:"Copiar página",link:"Copiar página en Markdown",view:"Ver como Markdown",gpt:"Abrir en ChatGPT",claude:"Abrir en Claude"},links:"Comunidad",toc:"En esta página",menu:"Menú",report:"Reportar un problema",edit:"Editar esta página"},e={copyLogo:"Copiar logo",copyWordmark:"Copiar wordmark",downloadLogo:"Descargar logo",downloadWordmark:"Descargar wordmark",brandAssets:"Recursos de marca",logoCopied:"Logo copiado",wordmarkCopied:"Wordmark copiado",logoDownloaded:"Logo descargado",wordmarkDownloaded:"Wordmark descargado",copyLogoFailed:"No se pudo copiar el logo",copyWordmarkFailed:"No se pudo copiar el wordmark"},r={title:"Preguntar a la IA",placeholder:"Haz una pregunta...",tooltip:"Haz una pregunta a la IA",tryAsking:"Intenta hacer una pregunta",askAnything:"Pregunta lo que quieras...",clearChat:"Borrar chat",close:"Cerrar",expand:"Expandir",collapse:"Contraer",thinking:"Pensando...",askMeAnything:"Preguntar cualquier cosa",askMeAnythingDescription:"Obtenga ayuda para navegar por la documentación, comprender conceptos y encontrar respuestas.",faq:"Preguntas frecuentes",chatCleared:"El chat se borra al actualizar",lineBreak:"Salto de línea",explainWithAi:"Explicar con IA",toolListPages:"Páginas de documentación publicadas",toolReadPage:"Leer",loading:{searching:"Búsqueda de la documentación",reading:"Leyendo los documentos",analyzing:"Análisis del contenido",finding:"Encontrar la mejor respuesta",finished:"Fuentes utilizadas"}},n={common:a,docs:o,logo:e,assistant:r};export{r as assistant,a as common,n as default,o as docs,e as logo}; diff --git a/docus/dist/_nuxt/DXQrCARz.js b/docus/dist/_nuxt/DXQrCARz.js new file mode 100644 index 0000000..2404ae3 --- /dev/null +++ b/docus/dist/_nuxt/DXQrCARz.js @@ -0,0 +1 @@ +import{a0 as o,a1 as r,o as u,a as p,p as m,q as f,ac as d,s as e,P as h,c as v,am as t}from"./B3fabVUf.js";const C={base:"min-h-[calc(100vh-var(--ui-header-height))]"},b={__name:"UMain",props:{as:{type:null,required:!1,default:"main"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=a,n=o(),c=r("main",s),i=v(()=>t({extend:t(C),...n.ui?.main||{}}));return(l,_)=>(u(),p(e(h),{as:a.as,class:d(i.value({class:[e(c)?.base,s.class]}))},{default:m(()=>[f(l.$slots,"default")]),_:3},8,["as","class"]))}};export{b as _}; diff --git a/docus/dist/_nuxt/D_gYX37v.js b/docus/dist/_nuxt/D_gYX37v.js new file mode 100644 index 0000000..65d74fb --- /dev/null +++ b/docus/dist/_nuxt/D_gYX37v.js @@ -0,0 +1 @@ +import{a0 as l,a1 as i,e as c,q as p,ac as u,s as d,c as f,am as t,o as m}from"./B3fabVUf.js";const b={base:"py-3 px-4 font-semibold text-sm border-e border-b first:border-s border-t border-muted",variants:{align:{left:"text-left",center:"text-center",right:"text-right"}},defaultVariants:{align:"left"}},x={__name:"ProseTh",props:{align:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const e=s,a=l(),r=i("prose.th",e),o=f(()=>t({extend:t(b),...a.ui?.prose?.th||{}}));return(n,g)=>(m(),c("th",{class:u(o.value({align:e.align,class:[d(r)?.base,e.class]}))},[p(n.$slots,"default")],2))}};export{x as default}; diff --git a/docus/dist/_nuxt/D_wlStJ8.js b/docus/dist/_nuxt/D_wlStJ8.js new file mode 100644 index 0000000..e576a34 --- /dev/null +++ b/docus/dist/_nuxt/D_wlStJ8.js @@ -0,0 +1 @@ +const a={or:"eller",error:{title:"Sidan hittades inte",description:"Vi ber om ursäkt, men sidan du letar efter kunde inte hittas."}},e={copy:{page:"Kopiera sida",link:"Kopiera Markdown-sida",view:"Visa som Markdown",gpt:"Öppna i ChatGPT",claude:"Öppna i Claude"},links:"Gemenskap",toc:"På denna sida",menu:"Meny",report:"Rapportera ett problem",edit:"Redigera denna sida"},o={copyLogo:"Kopiera logotyp",copyWordmark:"Kopiera ordmärke",downloadLogo:"Ladda ner logotyp",downloadWordmark:"Ladda ner ordmärke",brandAssets:"Varumärkesmaterial",logoCopied:"Logotyp kopierad",wordmarkCopied:"Ordmärke kopierat",logoDownloaded:"Logotyp nedladdad",wordmarkDownloaded:"Ordmärke nedladdat",copyLogoFailed:"Kunde inte kopiera logotyp",copyWordmarkFailed:"Kunde inte kopiera ordmärke"},t={title:"Fråga AI",placeholder:"Ställ en fråga...",tooltip:"Ställ en fråga till AI",tryAsking:"Försök att ställa en fråga",askAnything:"Fråga vad som helst...",clearChat:"Rensa chatten",close:"Stäng",expand:"Expandera",collapse:"Kollapsa",thinking:"Funderar...",askMeAnything:"Fråga vad som helst",askMeAnythingDescription:"Få hjälp med att navigera i dokumentationen, förstå begrepp och hitta svar.",faq:"FAQ",chatCleared:"Chatten rensas vid uppdatering",lineBreak:"Radbrytning",explainWithAi:"Förklara med AI",toolListPages:"Listade dokumentationssidor",toolReadPage:"Läs",loading:{searching:"Söker i dokumentationen",reading:"Läser igenom dokumenten",analyzing:"Analysera innehållet",finding:"Att hitta det bästa svaret",finished:"Använda källor"}},n={common:a,docs:e,logo:o,assistant:t};export{t as assistant,a as common,n as default,e as docs,o as logo}; diff --git a/docus/dist/_nuxt/DbjiwLiW.js b/docus/dist/_nuxt/DbjiwLiW.js new file mode 100644 index 0000000..c16f93a --- /dev/null +++ b/docus/dist/_nuxt/DbjiwLiW.js @@ -0,0 +1 @@ +const n={or:"hoặc",error:{title:"Không tìm thấy trang",description:"Chúng tôi xin lỗi, nhưng trang bạn đang tìm kiếm không tồn tại."}},o={copy:{page:"Sao chép trang",link:"Sao chép trang Markdown",view:"Xem dưới dạng Markdown",gpt:"Mở trong ChatGPT",claude:"Mở trong Claude"},links:"Cộng đồng",toc:"Trên trang này",menu:"Menu",report:"Báo cáo sự cố",edit:"Chỉnh sửa trang này"},i={copyLogo:"Sao chép logo",copyWordmark:"Sao chép wordmark",downloadLogo:"Tải logo",downloadWordmark:"Tải wordmark",brandAssets:"Tài nguyên thương hiệu",logoCopied:"Đã sao chép logo",wordmarkCopied:"Đã sao chép wordmark",logoDownloaded:"Đã tải logo",wordmarkDownloaded:"Đã tải wordmark",copyLogoFailed:"Không thể sao chép logo",copyWordmarkFailed:"Không thể sao chép wordmark"},t={title:"Hỏi AI",placeholder:"Đặt một câu hỏi...",tooltip:"Đặt câu hỏi cho AI",tryAsking:"Hãy thử đặt một câu hỏi",askAnything:"Hỏi bất cứ điều gì...",clearChat:"Xóa cuộc trò chuyện",close:"Đóng",expand:"Mở rộng",collapse:"Thu gọn",thinking:"Đang suy nghĩ...",askMeAnything:"Hỏi bất cứ điều gì",askMeAnythingDescription:"Nhận trợ giúp điều hướng tài liệu, hiểu các khái niệm và tìm câu trả lời.",faq:"Câu hỏi thường gặp",chatCleared:"Trò chuyện sẽ bị xóa khi làm mới",lineBreak:"Ngắt dòng",explainWithAi:"Giải thích bằng AI",toolListPages:"Các trang tài liệu được liệt kê",toolReadPage:"Đọc",loading:{searching:"Tìm kiếm tài liệu",reading:"Đọc qua tài liệu",analyzing:"Phân tích nội dung",finding:"Tìm câu trả lời tốt nhất",finished:"Nguồn được sử dụng"}},a={common:n,docs:o,logo:i,assistant:t};export{t as assistant,n as common,a as default,o as docs,i as logo}; diff --git a/docus/dist/_nuxt/Dcswgw4K.js b/docus/dist/_nuxt/Dcswgw4K.js new file mode 100644 index 0000000..5aeeba0 --- /dev/null +++ b/docus/dist/_nuxt/Dcswgw4K.js @@ -0,0 +1 @@ +const o={or:"nebo",error:{title:"Stránka nenalezena",description:"Je nám líto, ale stránka, kterou hledáte, nebyla nalezena."}},e={copy:{page:"Kopírovat stránku",link:"Kopírovat Markdown stránku",view:"Zobrazit jako Markdown",gpt:"Otevřít v ChatGPT",claude:"Otevřít v Claude"},links:"Komunita",toc:"Na této stránce",menu:"Nabídka",report:"Nahlásit problém",edit:"Upravit tuto stránku"},a={copyLogo:"Kopírovat logo",copyWordmark:"Kopírovat wordmark",downloadLogo:"Stáhnout logo",downloadWordmark:"Stáhnout wordmark",brandAssets:"Materiály značky",logoCopied:"Logo zkopírováno",wordmarkCopied:"Wordmark zkopírován",logoDownloaded:"Logo staženo",wordmarkDownloaded:"Wordmark stažen",copyLogoFailed:"Kopírování loga selhalo",copyWordmarkFailed:"Kopírování wordmarku selhalo"},t={title:"Zeptejte se AI",placeholder:"Zeptej se...",tooltip:"Zeptejte se umělé inteligence",tryAsking:"Zkus položit otázku",askAnything:"Zeptej se na cokoliv...",clearChat:"Vymazat chat",close:"Zavřít",expand:"Rozbalit",collapse:"Sbalit",thinking:"Přemýšlím...",askMeAnything:"Zeptej se na cokoliv",askMeAnythingDescription:"Získejte pomoc s orientací v dokumentaci, porozuměním konceptům a nalezením odpovědí.",faq:"Často kladené otázky",chatCleared:"Chat je vymazán při obnovení",lineBreak:"Zalomení řádku",explainWithAi:"Vysvětlete pomocí AI",toolListPages:"Uvedené stránky dokumentace",toolReadPage:"Číst",loading:{searching:"Vyhledávání v dokumentaci",reading:"Čtení dokumentů",analyzing:"Analýza obsahu",finding:"Nalezení nejlepší odpovědi",finished:"Použité zdroje"}},n={common:o,docs:e,logo:a,assistant:t};export{t as assistant,o as common,n as default,e as docs,a as logo}; diff --git a/docus/dist/_nuxt/DewHeYIb.js b/docus/dist/_nuxt/DewHeYIb.js new file mode 100644 index 0000000..6af9d0c --- /dev/null +++ b/docus/dist/_nuxt/DewHeYIb.js @@ -0,0 +1 @@ +import{d as b,g as V,k as M,J as m,l as B,I as $,o as _,a as y,p,q as g,s as t,P as h,v as C,O as z,z as k,G as L,aW as A,B as I,X as D,f as w,bD as F,c,w as P,bE as O,bF as E,m as H,bG as N,C as G,D as K}from"./B3fabVUf.js";import{R as W}from"./B6bUjJBd.js";const[q,j]=k("TabsRoot");var J=b({__name:"TabsRoot",props:{defaultValue:{type:null,required:!1},orientation:{type:String,required:!1,default:"horizontal"},dir:{type:String,required:!1},activationMode:{type:String,required:!1,default:"automatic"},modelValue:{type:null,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue"],setup(i,{emit:s}){const n=i,e=s,{orientation:r,unmountOnHide:u,dir:o}=V(n),a=M(o);m();const l=B(n,"modelValue",e,{defaultValue:n.defaultValue,passive:n.modelValue===void 0}),f=C(),v=z(new Set);return j({modelValue:l,changeModelValue:d=>{l.value=d},orientation:r,dir:a,unmountOnHide:u,activationMode:n.activationMode,baseId:$(void 0,"reka-tabs"),tabsList:f,contentIds:v,registerContent:d=>{v.value=new Set([...v.value,d])},unregisterContent:d=>{const T=new Set(v.value);T.delete(d),v.value=T}}),(d,T)=>(_(),y(t(h),{dir:t(a),"data-orientation":t(r),"as-child":d.asChild,as:d.as},{default:p(()=>[g(d.$slots,"default",{modelValue:t(l)})]),_:3},8,["dir","data-orientation","as-child","as"]))}}),ee=J;function S(i,s){return`${i}-trigger-${s}`}function R(i,s){return`${i}-content-${s}`}var U=b({__name:"TabsContent",props:{value:{type:[String,Number],required:!0},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(i){const s=i,{forwardRef:n}=m(),e=q(),r=c(()=>S(e.baseId,s.value)),u=c(()=>R(e.baseId,s.value)),o=c(()=>s.value===e.modelValue.value),a=C(o.value);return L(()=>{e.registerContent(s.value),requestAnimationFrame(()=>{a.value=!1})}),A(()=>{e.unregisterContent(s.value)}),(l,f)=>(_(),y(t(F),{present:l.forceMount||o.value,"force-mount":""},{default:p(({present:v})=>[I(t(h),{id:u.value,ref:t(n),"as-child":l.asChild,as:l.as,role:"tabpanel","data-state":o.value?"active":"inactive","data-orientation":t(e).orientation.value,"aria-labelledby":r.value,hidden:!v,tabindex:"0",style:D({animationDuration:a.value?"0s":void 0})},{default:p(()=>[!t(e).unmountOnHide.value||v?g(l.$slots,"default",{key:0}):w("v-if",!0)]),_:2},1032,["id","as-child","as","data-state","data-orientation","aria-labelledby","hidden","style"])]),_:3},8,["present"]))}}),ae=U,X=b({__name:"TabsIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(i,{expose:s}){const n=i,e=q();s({updateIndicatorStyle:o}),m();const r=C({size:null,position:null}),u=C([]);P(()=>[e.modelValue.value,e?.dir.value],()=>{o()},{immediate:!0,flush:"post"}),O(()=>{u.value=Array.from(e.tabsList.value?.querySelectorAll('[role="tab"]')||[])}),E(c(()=>[e.tabsList.value,...u.value]),o);function o(){const a=e.tabsList.value?.querySelector('[role="tab"][data-state="active"]');a&&(e.orientation.value==="horizontal"?r.value={size:a.offsetWidth,position:a.offsetLeft}:r.value={size:a.offsetHeight,position:a.offsetTop})}return(a,l)=>typeof r.value.size=="number"?(_(),y(t(h),H({key:0},n,{style:{"--reka-tabs-indicator-size":`${r.value.size}px`,"--reka-tabs-indicator-position":`${r.value.position}px`}}),{default:p(()=>[g(a.$slots,"default")]),_:3},16,["style"])):w("v-if",!0)}}),te=X,Q=b({__name:"TabsList",props:{loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(i){const s=i,{loop:n}=V(s),{forwardRef:e,currentElement:r}=m(),u=q();return u.tabsList=r,(o,a)=>(_(),y(t(N),{"as-child":"",orientation:t(u).orientation.value,dir:t(u).dir.value,loop:t(n)},{default:p(()=>[I(t(h),{ref:t(e),role:"tablist","as-child":o.asChild,as:o.as,"aria-orientation":t(u).orientation.value},{default:p(()=>[g(o.$slots,"default")]),_:3},8,["as-child","as","aria-orientation"])]),_:3},8,["orientation","dir","loop"]))}}),se=Q,Y=b({__name:"TabsTrigger",props:{value:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(i){const s=i,{forwardRef:n}=m(),e=q(),r=c(()=>S(e.baseId,s.value)),u=c(()=>e.contentIds.value.has(s.value)?R(e.baseId,s.value):void 0),o=c(()=>s.value===e.modelValue.value);return(a,l)=>(_(),y(t(W),{"as-child":"",focusable:!a.disabled,active:o.value},{default:p(()=>[I(t(h),{id:r.value,ref:t(n),role:"tab",type:a.as==="button"?"button":void 0,as:a.as,"as-child":a.asChild,"aria-selected":o.value?"true":"false","aria-controls":u.value,"data-state":o.value?"active":"inactive",disabled:a.disabled,"data-disabled":a.disabled?"":void 0,"data-orientation":t(e).orientation.value,onMousedown:l[0]||(l[0]=K(f=>{!a.disabled&&f.ctrlKey===!1?t(e).changeModelValue(a.value):f.preventDefault()},["left"])),onKeydown:l[1]||(l[1]=G(f=>t(e).changeModelValue(a.value),["enter","space"])),onFocus:l[2]||(l[2]=()=>{const f=t(e).activationMode!=="manual";!o.value&&!a.disabled&&f&&t(e).changeModelValue(a.value)})},{default:p(()=>[g(a.$slots,"default")]),_:3},8,["id","type","as","as-child","aria-selected","aria-controls","data-state","disabled","data-disabled","data-orientation"])]),_:3},8,["focusable","active"]))}}),oe=Y;export{ee as T,se as a,te as b,oe as c,ae as d}; diff --git a/docus/dist/_nuxt/Df-aV_dL.js b/docus/dist/_nuxt/Df-aV_dL.js new file mode 100644 index 0000000..5237057 --- /dev/null +++ b/docus/dist/_nuxt/Df-aV_dL.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ClIRhDxf.js","./B3fabVUf.js","./entry.B0IIbxeE.css"])))=>i.map(i=>d[i]); +import{b_ as w,bm as b,b$ as d,c0 as l,c1 as p}from"./B3fabVUf.js";async function h(n,a="gzip"){let e;if(typeof Buffer<"u"){const i=Buffer.from(n,"base64");e=Uint8Array.from(i)}else if(typeof atob<"u")e=Uint8Array.from(atob(n),i=>i.charCodeAt(0));else throw new TypeError("No base64 decoding method available");const o=new Response(new Blob([e])).body?.pipeThrough(new DecompressionStream(a)),c=await new Response(o).text();return JSON.parse(c)}function f(n,a){const e=g(n),t={...a};for(const o in t)e[o]==="json"&&t[o]&&t[o]!=="undefined"&&(t[o]=JSON.parse(t[o])),e[o]==="boolean"&&t[o]!=="undefined"&&(t[o]=!!t[o]);for(const o in t)t[o]==="NULL"&&(t[o]=void 0);return t}function g(n){const a=n.match(/FROM\s+(\w+)/);return a?w[y(a[1])]?.fields||{}:{}}function y(n){return n.replace(/^_content_/,"")}let r;const u=new Map,s=new Map;function E(n){async function a(e){const t=String(e);return r||(s.has("_")||s.set("_",S()),r=await s.get("_"),s.delete("_")),u.has(t)||(s.has(t)||s.set(t,_(e)),await s.get(t),u.set(t,"loaded"),s.delete(t)),r}return{all:async(e,t)=>(await a(n),r.exec({sql:e,bind:t,rowMode:"object",returnValue:"resultRows"}).map(o=>f(e,o))),first:async(e,t)=>(await a(n),f(e,r.exec({sql:e,bind:t,rowMode:"object",returnValue:"resultRows"}).shift())),exec:async(e,t)=>{await a(n),await r.exec({sql:e,bind:t})}}}async function S(){if(!r){const n=await b(()=>import("./ClIRhDxf.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(e=>e.default);globalThis.sqlite3ApiConfig={silent:!0,debug:(...e)=>console.debug(...e),warn:(...e)=>{String(e[0]).includes("OPFS sqlite3_vfs")||console.warn(...e)},error:(...e)=>console.error(...e),log:(...e)=>console.log(...e)};const a=await n();r=new a.oo1.DB}return r}async function _(n){if(window.sessionStorage.getItem("previewToken"))return r;let a=null;const e=`checksum_${n}`,t=`collection_${n}`;let o="matched";try{r.exec({sql:`SELECT * FROM ${d.info} where id = '${e}'`,rowMode:"object",returnValue:"resultRows"}).shift()?.version!==l[String(n)]&&(o="mismatch")}catch{o="missing"}if(o!=="matched"){if(window.localStorage.getItem(`content_${e}`)===l[String(n)]&&(a=window.localStorage.getItem(`content_${t}`)),!a){a=await p(void 0,String(n));try{window.localStorage.setItem(`content_${e}`,l[String(n)]),window.localStorage.setItem(`content_${t}`,a)}catch(i){console.error("Database integrity check failed, rebuilding database",i)}}const c=await h(a);await r.exec({sql:`DROP TABLE IF EXISTS ${d[String(n)]}`}),o==="mismatch"&&await r.exec({sql:`DELETE FROM ${d.info} WHERE id = '${e}'`});for(const i of c)try{await r.exec(i)}catch(m){console.error("Error executing command",m)}}return r}export{E as loadDatabaseAdapter}; diff --git a/docus/dist/_nuxt/Dme4Sp_Z.js b/docus/dist/_nuxt/Dme4Sp_Z.js new file mode 100644 index 0000000..b8741d5 --- /dev/null +++ b/docus/dist/_nuxt/Dme4Sp_Z.js @@ -0,0 +1 @@ +const e={or:"of",error:{title:"Pagina niet gevonden",description:"Sorry, maar deze pagina is niet gevonden."}},o={copy:{page:"Kopieer pagina",link:"Kopieer Markdown pagina",view:"Bekijk als Markdown",gpt:"Open in ChatGPT",claude:"Open in Claude"},links:"Community",toc:"Op deze pagina",menu:"Menu",report:"Rapporteer een probleem",edit:"Bewerk deze pagina"},n={copyLogo:"Logo kopiëren",copyWordmark:"Woordmerk kopiëren",downloadLogo:"Logo downloaden",downloadWordmark:"Woordmerk downloaden",brandAssets:"Merkmaterialen",logoCopied:"Logo gekopieerd",wordmarkCopied:"Woordmerk gekopieerd",logoDownloaded:"Logo gedownload",wordmarkDownloaded:"Woordmerk gedownload",copyLogoFailed:"Logo kopiëren mislukt",copyWordmarkFailed:"Woordmerk kopiëren mislukt"},a={title:"Vraag AI",placeholder:"Stel een vraag...",tooltip:"Stel een vraag aan AI",tryAsking:"Probeer een vraag te stellen",askAnything:"Vraag maar raak...",clearChat:"Chat wissen",close:"Sluiten",expand:"Uitvouwen",collapse:"Inklappen",thinking:"Aan het nadenken...",askMeAnything:"Vraag maar raak",askMeAnythingDescription:"Krijg hulp bij het navigeren door de documentatie, het begrijpen van concepten en het vinden van antwoorden.",faq:"Veelgestelde vragen",chatCleared:"De chat wordt gewist bij verversen",lineBreak:"Regelafbreking",explainWithAi:"Uitleggen met AI",toolListPages:"Vermelde documentatiepagina's",toolReadPage:"Lezen",loading:{searching:"De documentatie doorzoeken",reading:"De documentatie doornemen",analyzing:"De inhoud analyseren",finding:"Het beste antwoord vinden",finished:"Gebruikte bronnen"}},r={common:e,docs:o,logo:n,assistant:a};export{a as assistant,e as common,r as default,o as docs,n as logo}; diff --git a/docus/dist/_nuxt/Dq00p3Sb.js b/docus/dist/_nuxt/Dq00p3Sb.js new file mode 100644 index 0000000..5103a73 --- /dev/null +++ b/docus/dist/_nuxt/Dq00p3Sb.js @@ -0,0 +1 @@ +import{Q as y,a0 as _,a1 as k,O as d,bt as q,o as r,a as c,p as n,s,bu as h,ac as l,q as u,f as m,af as B,P,c as b,am as v}from"./B3fabVUf.js";const x={slots:{root:"flex flex-col lg:grid lg:grid-cols-10 lg:gap-10",left:"lg:col-span-2",center:"lg:col-span-8",right:"lg:col-span-2 order-first lg:order-last"},variants:{left:{true:""},right:{true:""}},compoundVariants:[{left:!0,right:!0,class:{center:"lg:col-span-6"}},{left:!1,right:!1,class:{center:"lg:col-span-10"}}]},V={__name:"UPage",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(i){const f=i,e=y(),C=_(),a=k("page",f),g=d(!!e.left),p=d(!!e.right);q(()=>{g.value=!!e.left,p.value=!!e.right});const t=b(()=>v({extend:v(x),...C.ui?.page||{}})({left:g.value,right:p.value}));return(o,S)=>(r(),c(s(P),{as:i.as,"data-slot":"root",class:l(t.value.root({class:[s(a)?.root,f.class]}))},{default:n(()=>[e.left?(r(),c(s(h),{key:0,"data-slot":"left",class:l(t.value.left({class:s(a)?.left}))},{default:n(()=>[u(o.$slots,"left")]),_:3},8,["class"])):m("",!0),B("div",{"data-slot":"center",class:l(t.value.center({class:s(a)?.center}))},[u(o.$slots,"default")],2),e.right?(r(),c(s(h),{key:1,"data-slot":"right",class:l(t.value.right({class:s(a)?.right}))},{default:n(()=>[u(o.$slots,"right")]),_:3},8,["class"])):m("",!0)]),_:3},8,["as","class"]))}};export{V as _}; diff --git a/docus/dist/_nuxt/Ds9OA60O.js b/docus/dist/_nuxt/Ds9OA60O.js new file mode 100644 index 0000000..3dcceb1 --- /dev/null +++ b/docus/dist/_nuxt/Ds9OA60O.js @@ -0,0 +1 @@ +const o={or:"أو",error:{title:"الصفحة غير موجودة",description:"نأسف، لكن الصفحة التي تبحث عنها غير موجودة."}},a={copy:{page:"نسخ الصفحة",link:"نسخ صفحة Markdown",view:"عرض كـ Markdown",gpt:"فتح في ChatGPT",claude:"فتح في Claude"},links:"المجتمع",toc:"في هذه الصفحة",menu:"قائمة",report:"الإبلاغ عن مشكلة",edit:"تحرير هذه الصفحة"},e={copyLogo:"نسخ الشعار",copyWordmark:"نسخ العلامة النصية",downloadLogo:"تحميل الشعار",downloadWordmark:"تحميل العلامة النصية",brandAssets:"أصول العلامة التجارية",logoCopied:"تم نسخ الشعار",wordmarkCopied:"تم نسخ العلامة النصية",logoDownloaded:"تم تحميل الشعار",wordmarkDownloaded:"تم تحميل العلامة النصية",copyLogoFailed:"فشل نسخ الشعار",copyWordmarkFailed:"فشل نسخ العلامة النصية"},n={title:"اسأل الذكاء الاصطناعي",placeholder:"اطرح سؤالاً...",tooltip:"اطرح سؤالاً على الذكاء الاصطناعي",tryAsking:"حاول طرح سؤال",askAnything:"اسأل أي شيء...",clearChat:"محو المحادثة",close:"إغلاق",expand:"توسيع",collapse:"طي",thinking:"التفكير...",askMeAnything:"اسأل عن أي شيء",askMeAnythingDescription:"احصل على المساعدة في التنقل بين الوثائق وفهم المفاهيم والعثور على الإجابات.",faq:"الأسئلة الشائعة",chatCleared:"تم مسح الدردشة عند التحديث",lineBreak:"فاصل الأسطر",explainWithAi:"اشرح باستخدام الذكاء الاصطناعي",toolListPages:"صفحات الوثائق المدرجة",toolReadPage:"قراءة",loading:{searching:"البحث في الوثائق",reading:"قراءة المستندات",analyzing:"تحليل المحتوى",finding:"العثور على أفضل إجابة",finished:"المصادر المستخدمة"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/Du9oxZzF.js b/docus/dist/_nuxt/Du9oxZzF.js new file mode 100644 index 0000000..720dd5c --- /dev/null +++ b/docus/dist/_nuxt/Du9oxZzF.js @@ -0,0 +1 @@ +const e={or:"eller",error:{title:"Side ikke fundet",description:"Vi beklager, men siden du leder efter kunne ikke findes."}},o={copy:{page:"Kopier side",link:"Kopier Markdown side",view:"Vis som Markdown",gpt:"Åbn i ChatGPT",claude:"Åbn i Claude"},links:"Fællesskab",toc:"På denne side",menu:"Menu",report:"Rapporter et problem",edit:"Rediger denne side"},n={copyLogo:"Kopiér logo",copyWordmark:"Kopiér wordmark",downloadLogo:"Download logo",downloadWordmark:"Download wordmark",brandAssets:"Brandmaterialer",logoCopied:"Logo kopieret",wordmarkCopied:"Wordmark kopieret",logoDownloaded:"Logo downloadet",wordmarkDownloaded:"Wordmark downloadet",copyLogoFailed:"Kunne ikke kopiere logo",copyWordmarkFailed:"Kunne ikke kopiere wordmark"},d={title:"Spørg AI",placeholder:"Stil et spørgsmål...",tooltip:"Stil AI et spørgsmål",tryAsking:"Prøv at stille et spørgsmål",askAnything:"Spørg om hvad som helst...",clearChat:"Ryd chat",close:"Luk",expand:"Udvid",collapse:"Skjul",thinking:"Tænker...",askMeAnything:"Spørg om hvad som helst",askMeAnythingDescription:"Få hjælp til at navigere i dokumentationen, forstå begreber og finde svar.",faq:"FAQ",chatCleared:"Chat ryddes ved opdatering",lineBreak:"Linjeskift",explainWithAi:"Forklar med AI",toolListPages:"Opførte dokumentationssider",toolReadPage:"Læs",loading:{searching:"Søgning i dokumentationen",reading:"Gennemlæsning af dokumenterne",analyzing:"Analyse af indholdet",finding:"Find det bedste svar",finished:"Anvendte kilder"}},i={common:e,docs:o,logo:n,assistant:d};export{d as assistant,e as common,i as default,o as docs,n as logo}; diff --git a/docus/dist/_nuxt/DuhoAnL7.js b/docus/dist/_nuxt/DuhoAnL7.js new file mode 100644 index 0000000..4b6e238 --- /dev/null +++ b/docus/dist/_nuxt/DuhoAnL7.js @@ -0,0 +1 @@ +const e={or:"ou",error:{title:"Page non trouvée",description:"Nous sommes désolés, mais la page que vous cherchez n'existe pas."}},o={copy:{page:"Copier la page",link:"Copier le lien Markdown",view:"Voir en Markdown",gpt:"Ouvrir dans ChatGPT",claude:"Ouvrir dans Claude"},links:"Communauté",toc:"Sur cette page",menu:"Menu",report:"Signaler un problème",edit:"Éditer cette page"},r={copyLogo:"Copier le logo",copyWordmark:"Copier le wordmark",downloadLogo:"Télécharger le logo",downloadWordmark:"Télécharger le wordmark",brandAssets:"Brand assets",logoCopied:"Logo copié",wordmarkCopied:"Wordmark copié",logoDownloaded:"Logo téléchargé",wordmarkDownloaded:"Wordmark téléchargé",copyLogoFailed:"Impossible de copier le logo",copyWordmarkFailed:"Impossible de copier le wordmark"},a={title:"Demander à l'IA",placeholder:"Posez une question...",tooltip:"Poser une question à l'IA",tryAsking:"Essayez de poser une question",askAnything:"Demandez n'importe quoi...",clearChat:"Effacer le chat",close:"Fermer",expand:"Agrandir",collapse:"Réduire",thinking:"Réflexion...",askMeAnything:"Posez une question",askMeAnythingDescription:"Obtenez de l'aide pour naviguer dans la documentation, comprendre des concepts et trouver des réponses.",faq:"FAQ",chatCleared:"Le chat est effacé au rechargement",lineBreak:"Retour à la ligne",explainWithAi:"Expliquer avec l'IA",toolListPages:"Pages de documentation listées",toolReadPage:"Lecture de",loading:{searching:"Recherche dans la documentation",reading:"Lecture des documents",analyzing:"Analyse du contenu",finding:"Recherche de la meilleure réponse",finished:"Sources utilisées"}},n={common:e,docs:o,logo:r,assistant:a};export{a as assistant,e as common,n as default,o as docs,r as logo}; diff --git a/docus/dist/_nuxt/DvjBH7HE.js b/docus/dist/_nuxt/DvjBH7HE.js new file mode 100644 index 0000000..5bc51a5 --- /dev/null +++ b/docus/dist/_nuxt/DvjBH7HE.js @@ -0,0 +1 @@ +const a={or:"tai",error:{title:"Sivua ei löytynyt",description:"Pahoittelut, etsimääsi sivua ei löytynyt."}},i={copy:{page:"Kopioi sivu",link:"Kopioi Markdown-sivu",view:"Näytä Markdownina",gpt:"Avaa ChatGPT:ssä",claude:"Avaa Claudessa"},links:"Yhteisö",toc:"Tällä sivulla",menu:"Valikko",report:"Ilmoita ongelmasta",edit:"Muokkaa tätä sivua"},t={copyLogo:"Kopioi logo",copyWordmark:"Kopioi sanamerkki",downloadLogo:"Lataa logo",downloadWordmark:"Lataa sanamerkki",brandAssets:"Brändimateriaalit",logoCopied:"Logo kopioitu",wordmarkCopied:"Sanamerkki kopioitu",logoDownloaded:"Logo ladattu",wordmarkDownloaded:"Sanamerkki ladattu",copyLogoFailed:"Logon kopiointi epäonnistui",copyWordmarkFailed:"Sanamerkin kopiointi epäonnistui"},o={title:"Kysy tekoälyltä",placeholder:"Esitä kysymys...",tooltip:"Esitä tekoälylle kysymys",tryAsking:"Kokeile kysymyksen esittämistä",askAnything:"Kysy mitä tahansa...",clearChat:"Tyhjennä chat",close:"Sulje",expand:"Laajenna",collapse:"Pienennä",thinking:"Ajatellaan...",askMeAnything:"Kysy mitä tahansa",askMeAnythingDescription:"Saat apua dokumentaatiossa navigointiin, käsitteiden ymmärtämiseen ja vastausten löytämiseen.",faq:"UKK",chatCleared:"Keskustelu tyhjennetään päivitettäessä",lineBreak:"Rivinvaihto",explainWithAi:"Selitä tekoälyllä",toolListPages:"Luetellut dokumentaatiosivut",toolReadPage:"Lue",loading:{searching:"Dokumentaation hakeminen",reading:"Asiakirjojen lukeminen",analyzing:"Sisällön analysointi",finding:"Parhaan vastauksen löytäminen",finished:"Käytetyt lähteet"}},e={common:a,docs:i,logo:t,assistant:o};export{o as assistant,a as common,e as default,i as docs,t as logo}; diff --git a/docus/dist/_nuxt/DxN8ZPeP.js b/docus/dist/_nuxt/DxN8ZPeP.js new file mode 100644 index 0000000..8ed2dc2 --- /dev/null +++ b/docus/dist/_nuxt/DxN8ZPeP.js @@ -0,0 +1 @@ +const o={or:"же",error:{title:"Барак табылган жок",description:"Кечиресиз, бирок сиз издеген барак табылган жок."}},a={copy:{page:"Баракты көчүрүү",link:"Markdown барагын көчүрүү",view:"Markdown катары көрүү",gpt:"ChatGPT'те ачуу",claude:"Claude'да ачуу"},links:"Коом",toc:"Бул барактта",menu:"Меню",report:"Көйгөй туурасында кабарлоо",edit:"Бул баракты түзөтүү"},e={copyLogo:"Логотипти көчүрүү",copyWordmark:"Сөз белгисин көчүрүү",downloadLogo:"Логотипти жүктөө",downloadWordmark:"Сөз белгисин жүктөө",brandAssets:"Бренд материалдары",logoCopied:"Логотип көчүрүлдү",wordmarkCopied:"Сөз белгиси көчүрүлдү",logoDownloaded:"Логотип жүктөлдү",wordmarkDownloaded:"Сөз белгиси жүктөлдү",copyLogoFailed:"Логотипти көчүрүү ишке ашкан жок",copyWordmarkFailed:"Сөз белгисин көчүрүү ишке ашкан жок"},n={title:"AIден сураңыз",placeholder:"Суроо берүү...",tooltip:"АИге суроо берүү",tryAsking:"Суроо берүүгө аракет кылыңыз",askAnything:"Суроо...",clearChat:"Чатты тазалоо",close:"Жабуу",expand:"Кеңейтүү",collapse:"Бузулуу",thinking:"Ойлонуу...",askMeAnything:"Суроо",askMeAnythingDescription:"Документтерди навигациялоого, түшүнүктөрдү түшүнүүгө жана жоопторду табууга жардам алыңыз.",faq:"Көп берилүүчү суроолор",chatCleared:"Чат жаңыртууда тазаланды",lineBreak:"Сызыктын үзүлүшү",explainWithAi:"AI менен түшүндүрүү",toolListPages:"Тизмедеги документтердин барактары",toolReadPage:"Окуу",loading:{searching:"Документтерди издөө",reading:"Документтер аркылуу окуу",analyzing:"Мазмунду талдоо",finding:"Мыкты жооп табуу",finished:"Колдонулган булактар"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/DzNJTbjO.js b/docus/dist/_nuxt/DzNJTbjO.js new file mode 100644 index 0000000..ce0327d --- /dev/null +++ b/docus/dist/_nuxt/DzNJTbjO.js @@ -0,0 +1 @@ +import{u as p,_}from"./n8vERajx.js";import{d as m,aO as d,aS as v,b5 as f,ba as g,s,a as b,f as y,b6 as C,b8 as h,c as I,o as w}from"./B3fabVUf.js";import"./BN_7HF1G.js";const N=m({__name:"landing",async setup(x){let a,t;const n=d(),{locale:u,isEnabled:c}=v(),o=I(()=>c.value?`landing_${u.value}`:"landing"),{data:e}=([a,t]=f(()=>C(o.value,()=>h(o.value).path(n.path).first(),"$KuVI-rcQns")),a=await a,t(),a);if(!e.value)throw g({statusCode:404,statusMessage:"Page not found",fatal:!0});const l=e.value.seo?.title||e.value.title,r=e.value.seo?.description||e.value.description;return p({title:l,description:r,type:"website",ogImage:e.value?.seo?.ogImage}),e.value?.seo?.ogImage,(k,A)=>{const i=_;return s(e)?(w(),b(i,{key:0,value:s(e)},null,8,["value"])):y("",!0)}}});export{N as default}; diff --git a/docus/dist/_nuxt/FIW8Ti8B.js b/docus/dist/_nuxt/FIW8Ti8B.js new file mode 100644 index 0000000..320f44e --- /dev/null +++ b/docus/dist/_nuxt/FIW8Ti8B.js @@ -0,0 +1 @@ +const o={or:"или",error:{title:"Страницата не е намерена",description:"Съжаляваме, но тази страница не може да бъде намерена."}},a={copy:{page:"Копиране на Markdown кода на страницата",link:"Копиране на връзка към Markdown файла на страницата",view:"Отваряне на Markdown файла на страницата",gpt:"Отваряне в ChatGPT",claude:"Отваряне в Claude"},links:"Общност",toc:"На тази страница",menu:"Меню",report:"Докладване на проблем",edit:"Редактиране на тази страница"},e={copyLogo:"Копиране на логото",copyWordmark:"Копиране на словната марка",downloadLogo:"Изтегляне на логото",downloadWordmark:"Изтегляне на словната марка",brandAssets:"Брандови материали",logoCopied:"Логото е копирано",wordmarkCopied:"Словната марка е копирана",logoDownloaded:"Логото е изтеглено",wordmarkDownloaded:"Словната марка е изтеглена",copyLogoFailed:"Неуспешно копиране на логото",copyWordmarkFailed:"Неуспешно копиране на словната марка"},n={title:"Попитайте AI",placeholder:"Задайте въпрос...",tooltip:"Задайте въпрос на AI",tryAsking:"Опитайте да зададете въпрос",askAnything:"Попитайте каквото и да е...",clearChat:"Изчистване на чата",close:"Затваряне",expand:"Разширяване",collapse:"Свиване",thinking:"Мисля си...",askMeAnything:"Попитайте за всичко",askMeAnythingDescription:"Потърсете помощ за навигация в документацията, разбиране на концепциите и намиране на отговори.",faq:"Често задавани въпроси",chatCleared:"Чатът е изчистен при обновяване",lineBreak:"Прекъсване на линията",explainWithAi:"Обяснете с ИИ",toolListPages:"Изброени страници от документацията",toolReadPage:"Четене",loading:{searching:"Търсене в документацията",reading:"Четене на документите",analyzing:"Анализиране на съдържанието",finding:"Намиране на най-добрия отговор",finished:"Използвани източници"}},d={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,d as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/FyXvkSrC.js b/docus/dist/_nuxt/FyXvkSrC.js new file mode 100644 index 0000000..0c73c83 --- /dev/null +++ b/docus/dist/_nuxt/FyXvkSrC.js @@ -0,0 +1 @@ +import{_ as d,$ as f,a0 as g,a1 as m,e as v,q as x,af as C,B as y,s as e,ac as n,ak as b,al as h,c as _,am as i,o as q}from"./B3fabVUf.js";const B={slots:{root:"relative [&_pre]:h-[200px]",footer:"h-16 absolute inset-x-px bottom-px rounded-b-md flex items-center justify-center",trigger:"group",triggerIcon:"group-data-[state=open]:rotate-180"},variants:{open:{true:{root:"[&_pre]:h-auto [&_pre]:min-h-[200px] [&_pre]:max-h-[80vh] [&_pre]:pb-12"},false:{root:"[&_pre]:overflow-hidden",footer:"bg-gradient-to-t from-muted"}}}},I={__name:"ProseCodeCollapse",props:h({icon:{type:null,required:!1},name:{type:String,required:!1},openText:{type:String,required:!1},closeText:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(l){const o=l,a=d(l,"open",{type:Boolean,default:!1}),{t:r}=f(),p=g(),s=m("prose.codeCollapse",o),t=_(()=>i({extend:i(B),...p.ui?.prose?.codeCollapse||{}})({open:a.value}));return(u,c)=>(q(),v("div",{class:n(t.value.root({class:[e(s)?.root,o.class]}))},[x(u.$slots,"default"),C("div",{class:n(t.value.footer({class:e(s)?.footer}))},[y(b,{icon:l.icon||e(p).ui.icons.chevronDown,color:"neutral",variant:"outline","data-state":a.value?"open":"closed",label:`${a.value?o.closeText||e(r)("prose.codeCollapse.closeText"):o.openText||e(r)("prose.codeCollapse.openText")} ${o.name||e(r)("prose.codeCollapse.name")}`,class:n(t.value.trigger({class:e(s)?.trigger})),ui:{leadingIcon:t.value.triggerIcon({class:e(s)?.triggerIcon})},onClick:c[0]||(c[0]=T=>a.value=!a.value)},null,8,["icon","data-state","label","class","ui"])],2)],2))}};export{I as default}; diff --git a/docus/dist/_nuxt/G6op-Gdf.js b/docus/dist/_nuxt/G6op-Gdf.js new file mode 100644 index 0000000..123ec15 --- /dev/null +++ b/docus/dist/_nuxt/G6op-Gdf.js @@ -0,0 +1 @@ +import{Q as q,a0 as S,a1 as w,o as a,a as f,p as k,q as d,B as C,bZ as z,ac as r,s,e as n,ab as B,f as c,ah as h,ag as m,F as v,r as b,m as p,ak as I,P,c as j,am as x}from"./B3fabVUf.js";import V from"./BecbEIqG.js";const A={slots:{root:"relative isolate",container:"flex flex-col lg:grid py-16 sm:py-24 lg:py-32 gap-8 sm:gap-16",wrapper:"",header:"",leading:"flex items-center mb-6",leadingIcon:"size-10 shrink-0 text-primary",headline:"mb-3",title:"text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-highlighted",description:"text-base sm:text-lg text-muted",body:"mt-8",features:"grid",footer:"mt-8",links:"flex flex-wrap gap-x-6 gap-y-3"},variants:{orientation:{horizontal:{container:"lg:grid-cols-2 lg:items-center",description:"text-pretty",features:"gap-4"},vertical:{container:"",headline:"justify-center",leading:"justify-center",title:"text-center",description:"text-center text-balance",links:"justify-center",features:"sm:grid-cols-2 lg:grid-cols-3 gap-8"}},reverse:{true:{wrapper:"order-last"}},headline:{true:{headline:"font-semibold text-primary flex items-center gap-1.5"}},title:{true:{description:"mt-6"}},description:{true:""},body:{true:""}},compoundVariants:[{orientation:"vertical",title:!0,class:{body:"mt-16"}},{orientation:"vertical",description:!0,class:{body:"mt-16"}},{orientation:"vertical",body:!0,class:{footer:"mt-16"}}]},N={key:2,class:"hidden lg:block"},E={__name:"UPageSection",props:{as:{type:null,required:!1,default:"section"},headline:{type:String,required:!1},icon:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},links:{type:Array,required:!1},features:{type:Array,required:!1},orientation:{type:null,required:!1,default:"vertical"},reverse:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const u=t,e=q(),$=S(),i=w("pageSection",u),l=j(()=>x({extend:x(A),...$.ui?.pageSection||{}})({orientation:u.orientation,reverse:u.reverse,title:!!u.title||!!e.title,description:!!u.description||!!e.description,body:!!e.body||!!u.features?.length||!!e.features}));return(o,F)=>(a(),f(s(P),{as:t.as,"data-orientation":t.orientation,"data-slot":"root",class:r(l.value.root({class:[s(i)?.root,u.class]}))},{default:k(()=>[d(o.$slots,"top"),C(z,{"data-slot":"container",class:r(l.value.container({class:s(i)?.container}))},{default:k(()=>[e.header||t.icon||e.leading||t.headline||e.headline||t.title||e.title||t.description||e.description||e.body||t.features?.length||e.features||e.footer||t.links?.length||e.links?(a(),n("div",{key:0,"data-slot":"wrapper",class:r(l.value.wrapper({class:s(i)?.wrapper}))},[e.header||t.icon||e.leading||t.headline||e.headline||t.title||e.title||t.description||e.description?(a(),n("div",{key:0,"data-slot":"header",class:r(l.value.header({class:s(i)?.header}))},[d(o.$slots,"header",{},()=>[t.icon||e.leading?(a(),n("div",{key:0,"data-slot":"leading",class:r(l.value.leading({class:s(i)?.leading}))},[d(o.$slots,"leading",{ui:l.value},()=>[t.icon?(a(),f(B,{key:0,name:t.icon,"data-slot":"leadingIcon",class:r(l.value.leadingIcon({class:s(i)?.leadingIcon}))},null,8,["name","class"])):c("",!0)])],2)):c("",!0),t.headline||e.headline?(a(),n("div",{key:1,"data-slot":"headline",class:r(l.value.headline({class:s(i)?.headline,headline:!e.headline}))},[d(o.$slots,"headline",{},()=>[h(m(t.headline),1)])],2)):c("",!0),t.title||e.title?(a(),n("h2",{key:2,"data-slot":"title",class:r(l.value.title({class:s(i)?.title}))},[d(o.$slots,"title",{},()=>[h(m(t.title),1)])],2)):c("",!0),t.description||e.description?(a(),n("div",{key:3,"data-slot":"description",class:r(l.value.description({class:s(i)?.description}))},[d(o.$slots,"description",{},()=>[h(m(t.description),1)])],2)):c("",!0)])],2)):c("",!0),e.body||t.features?.length||e.features?(a(),n("div",{key:1,"data-slot":"body",class:r(l.value.body({class:s(i)?.body}))},[d(o.$slots,"body",{},()=>[t.features?.length||e.features?(a(),n("ul",{key:0,"data-slot":"features",class:r(l.value.features({class:s(i)?.features}))},[d(o.$slots,"features",{},()=>[(a(!0),n(v,null,b(t.features,(g,y)=>(a(),f(V,p({key:y,as:"li"},{ref_for:!0},g),null,16))),128))])],2)):c("",!0)])],2)):c("",!0),e.footer||t.links?.length||e.links?(a(),n("div",{key:2,"data-slot":"footer",class:r(l.value.footer({class:s(i)?.footer}))},[d(o.$slots,"footer",{},()=>[t.links?.length||e.links?(a(),n("div",{key:0,"data-slot":"links",class:r(l.value.links({class:s(i)?.links}))},[d(o.$slots,"links",{},()=>[(a(!0),n(v,null,b(t.links,(g,y)=>(a(),f(I,p({key:y,size:"lg"},{ref_for:!0},g),null,16))),128))])],2)):c("",!0)])],2)):c("",!0)],2)):c("",!0),e.default?d(o.$slots,"default",{key:1}):t.orientation==="horizontal"?(a(),n("div",N)):c("",!0)]),_:3},8,["class"]),d(o.$slots,"bottom")]),_:3},8,["as","data-orientation","class"]))}};export{E as default}; diff --git a/docus/dist/_nuxt/ICECbu1X.js b/docus/dist/_nuxt/ICECbu1X.js new file mode 100644 index 0000000..82a87f4 --- /dev/null +++ b/docus/dist/_nuxt/ICECbu1X.js @@ -0,0 +1 @@ +import{a0 as b,a1 as a,e as l,q as h,ac as i,s as u,c,am as r,o as p}from"./B3fabVUf.js";const d={base:"ms-4 border-s border-default ps-8 [counter-reset:step]",variants:{level:{2:"[&>h2]:[counter-increment:step] [&>h2]:relative [&>h2]:before:absolute [&>h2]:before:size-8 [&>h2]:before:bg-elevated [&>h2]:before:rounded-full [&>h2]:before:font-semibold [&>h2]:before:text-sm [&>h2]:before:tabular-nums [&>h2]:before:inline-flex [&>h2]:before:items-center [&>h2]:before:justify-center [&>h2]:before:ring-4 [&>h2]:before:ring-bg [&>h2]:before:-ms-[48.5px] [&>h2]:before:-mt-0 [&>h2]:before:content-[counter(step)] [&>h2>a>span.absolute]:hidden",3:"[&>h3]:[counter-increment:step] [&>h3]:relative [&>h3]:before:absolute [&>h3]:before:size-7 [&>h3]:before:inset-x-0.5 [&>h3]:before:bg-elevated [&>h3]:before:rounded-full [&>h3]:before:font-semibold [&>h3]:before:text-sm [&>h3]:before:tabular-nums [&>h3]:before:inline-flex [&>h3]:before:items-center [&>h3]:before:justify-center [&>h3]:before:ring-4 [&>h3]:before:ring-bg [&>h3]:before:-ms-[48.5px] [&>h3]:before:content-[counter(step)] [&>h3>a>span.absolute]:hidden",4:"[&>h4]:[counter-increment:step] [&>h4]:relative [&>h4]:before:absolute [&>h4]:before:size-7 [&>h4]:before:inset-x-0.5 [&>h4]:before:bg-elevated [&>h4]:before:rounded-full [&>h4]:before:font-semibold [&>h4]:before:text-sm [&>h4]:before:tabular-nums [&>h4]:before:inline-flex [&>h4]:before:items-center [&>h4]:before:justify-center [&>h4]:before:ring-4 [&>h4]:before:ring-bg [&>h4]:before:-ms-[48.5px] [&>h4]:before:content-[counter(step)] [&>h4>a>span.absolute]:hidden"}},defaultVariants:{level:"3"}},g={__name:"ProseSteps",props:{level:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(o){const e=o,t=b(),s=a("prose.steps",e),n=c(()=>r({extend:r(d),...t.ui?.prose?.steps||{}}));return(f,m)=>(p(),l("div",{class:i(n.value({class:[u(s)?.base,e.class],level:e.level}))},[h(f.$slots,"default")],2))}};export{g as default}; diff --git a/docus/dist/_nuxt/Jc8Ntx_l.js b/docus/dist/_nuxt/Jc8Ntx_l.js new file mode 100644 index 0000000..2aa83b0 --- /dev/null +++ b/docus/dist/_nuxt/Jc8Ntx_l.js @@ -0,0 +1 @@ +import{r as m}from"./Cf5i2Hk_.js";import{a0 as _,a1 as p,e as y,a as c,p as g,m as h,a7 as k,f as n,ac as i,s as o,ab as x,c as f,am as v,o as t,af as w}from"./B3fabVUf.js";import"./BN_7HF1G.js";const I={slots:{base:["group relative block px-4 py-3 rounded-md text-sm/6 my-5 last:mb-0 [&_code]:text-xs/5 [&_code]:bg-default [&_pre]:bg-default [&>div]:my-2.5 [&_ul]:my-2.5 [&_ol]:my-2.5 [&>*]:last:!mb-0 [&_ul]:ps-4.5 [&_ol]:ps-4.5 [&_li]:my-0","transition-colors"],icon:["size-4 shrink-0 align-sub me-1.5 inline-block","transition-colors"],externalIcon:["size-4 align-top absolute right-2 top-2 pointer-events-none","transition-colors"]},variants:{color:{primary:{base:"border border-primary/25 bg-primary/10 text-primary-600 dark:text-primary-300 [&_a]:text-primary [&_a]:hover:border-primary [&_a]:focus-visible:outline-primary [&_code]:text-primary-600 dark:[&_code]:text-primary-300 [&_code]:border-primary/25 [&_a]:hover:[&>code]:border-primary [&_a]:hover:[&>code]:text-primary [&_a]:focus-visible:[&>code]:border-primary [&_a]:focus-visible:[&>code]:text-primary [&>ul]:marker:text-primary/50",icon:"text-primary",externalIcon:"text-primary-600 dark:text-primary-300"},secondary:{base:"border border-secondary/25 bg-secondary/10 text-secondary-600 dark:text-secondary-300 [&_a]:text-secondary [&_a]:hover:border-secondary [&_a]:focus-visible:outline-secondary [&_code]:text-secondary-600 dark:[&_code]:text-secondary-300 [&_code]:border-secondary/25 [&_a]:hover:[&>code]:border-secondary [&_a]:hover:[&>code]:text-secondary [&_a]:focus-visible:[&>code]:border-secondary [&_a]:focus-visible:[&>code]:text-secondary [&>ul]:marker:text-secondary/50",icon:"text-secondary",externalIcon:"text-secondary-600 dark:text-secondary-300"},success:{base:"border border-success/25 bg-success/10 text-success-600 dark:text-success-300 [&_a]:text-success [&_a]:hover:border-success [&_a]:focus-visible:outline-success [&_code]:text-success-600 dark:[&_code]:text-success-300 [&_code]:border-success/25 [&_a]:hover:[&>code]:border-success [&_a]:hover:[&>code]:text-success [&_a]:focus-visible:[&>code]:border-success [&_a]:focus-visible:[&>code]:text-success [&>ul]:marker:text-success/50",icon:"text-success",externalIcon:"text-success-600 dark:text-success-300"},info:{base:"border border-info/25 bg-info/10 text-info-600 dark:text-info-300 [&_a]:text-info [&_a]:hover:border-info [&_a]:focus-visible:outline-info [&_code]:text-info-600 dark:[&_code]:text-info-300 [&_code]:border-info/25 [&_a]:hover:[&>code]:border-info [&_a]:hover:[&>code]:text-info [&_a]:focus-visible:[&>code]:border-info [&_a]:focus-visible:[&>code]:text-info [&>ul]:marker:text-info/50",icon:"text-info",externalIcon:"text-info-600 dark:text-info-300"},warning:{base:"border border-warning/25 bg-warning/10 text-warning-600 dark:text-warning-300 [&_a]:text-warning [&_a]:hover:border-warning [&_a]:focus-visible:outline-warning [&_code]:text-warning-600 dark:[&_code]:text-warning-300 [&_code]:border-warning/25 [&_a]:hover:[&>code]:border-warning [&_a]:hover:[&>code]:text-warning [&_a]:focus-visible:[&>code]:border-warning [&_a]:focus-visible:[&>code]:text-warning [&>ul]:marker:text-warning/50",icon:"text-warning",externalIcon:"text-warning-600 dark:text-warning-300"},error:{base:"border border-error/25 bg-error/10 text-error-600 dark:text-error-300 [&_a]:text-error [&_a]:hover:border-error [&_a]:focus-visible:outline-error [&_code]:text-error-600 dark:[&_code]:text-error-300 [&_code]:border-error/25 [&_a]:hover:[&>code]:border-error [&_a]:hover:[&>code]:text-error [&_a]:focus-visible:[&>code]:border-error [&_a]:focus-visible:[&>code]:text-error [&>ul]:marker:text-error/50",icon:"text-error",externalIcon:"text-error-600 dark:text-error-300"},neutral:{base:"border border-muted bg-muted text-default",icon:"text-highlighted",externalIcon:"text-dimmed"}},to:{true:"border-dashed"}},compoundVariants:[{color:"primary",to:!0,class:{base:"hover:border-primary has-focus-visible:border-primary",externalIcon:"group-hover:text-primary"}},{color:"secondary",to:!0,class:{base:"hover:border-secondary has-focus-visible:border-secondary",externalIcon:"group-hover:text-secondary"}},{color:"success",to:!0,class:{base:"hover:border-success has-focus-visible:border-success",externalIcon:"group-hover:text-success"}},{color:"info",to:!0,class:{base:"hover:border-info has-focus-visible:border-info",externalIcon:"group-hover:text-info"}},{color:"warning",to:!0,class:{base:"hover:border-warning has-focus-visible:border-warning",externalIcon:"group-hover:text-warning"}},{color:"error",to:!0,class:{base:"hover:border-error has-focus-visible:border-error",externalIcon:"group-hover:text-error"}},{color:"neutral",to:!0,class:{base:"hover:border-inverted has-focus-visible:border-inverted",externalIcon:"group-hover:text-highlighted"}}],defaultVariants:{color:"neutral"}},V=Object.assign({inheritAttrs:!1},{__name:"ProseCallout",props:{to:{type:null,required:!1},target:{type:[String,Object,null],required:!1},icon:{type:null,required:!1},color:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(r){const e=r,d=_(),a=p("prose.callout",e),s=f(()=>v({extend:v(I),...d.ui?.prose?.callout||{}})({color:e.color,to:!!e.to})),l=f(()=>e.target||(e.to&&typeof e.to=="string"&&e.to.startsWith("http")?"_blank":void 0));return(u,b)=>(t(),y("div",{class:i(s.value.base({class:[o(a)?.base,e.class]}))},[r.to?(t(),c(k,h({key:0},{to:r.to,target:l.value,...u.$attrs},{class:"focus:outline-none",raw:""}),{default:g(()=>[...b[0]||(b[0]=[w("span",{class:"absolute inset-0","aria-hidden":"true"},null,-1)])]),_:1},16)):n("",!0),r.icon?(t(),c(x,{key:1,name:r.icon,class:i(s.value.icon({class:o(a)?.icon}))},null,8,["name","class"])):n("",!0),r.to&&l.value==="_blank"?(t(),c(x,{key:2,name:o(d).ui.icons.external,class:i(s.value.externalIcon({class:o(a)?.externalIcon}))},null,8,["name","class"])):n("",!0),m(u.$slots,"default",{mdcUnwrap:"p"})],2))}});export{V as default}; diff --git a/docus/dist/_nuxt/LZNkr4Qo.js b/docus/dist/_nuxt/LZNkr4Qo.js new file mode 100644 index 0000000..6e4d554 --- /dev/null +++ b/docus/dist/_nuxt/LZNkr4Qo.js @@ -0,0 +1 @@ +import{r as a}from"./Cf5i2Hk_.js";import s from"./Jc8Ntx_l.js";import{a0 as t,a as e,p as n,s as p,o as i}from"./B3fabVUf.js";import"./BN_7HF1G.js";const d={__name:"ProseNote",setup(c){const o=t();return(r,f)=>(i(),e(s,{color:"info",icon:p(o).ui.icons.info},{default:n(()=>[a(r.$slots,"default",{mdcUnwrap:"p"})]),_:3},8,["icon"]))}};export{d as default}; diff --git a/docus/dist/_nuxt/PB_A7Nh4.js b/docus/dist/_nuxt/PB_A7Nh4.js new file mode 100644 index 0000000..0292a26 --- /dev/null +++ b/docus/dist/_nuxt/PB_A7Nh4.js @@ -0,0 +1 @@ +const o={or:"或",error:{title:"页面未找到",description:"很抱歉,您访问的页面未找到。"}},a={copy:{page:"复制页面",link:"复制页面(Markdown)",view:"以 Markdown 格式查看",gpt:"在 ChatGPT 中打开",claude:"在 Claude 中打开"},links:"社区",toc:"在此页面上",menu:"菜单",report:"提交问题报告",edit:"编辑此页面"},e={copyLogo:"复制图标",copyWordmark:"复制文字标识",downloadLogo:"下载图标",downloadWordmark:"下载文字标识",brandAssets:"品牌资源",logoCopied:"图标已复制",wordmarkCopied:"文字标识已复制",logoDownloaded:"图标已下载",wordmarkDownloaded:"文字标识已下载",copyLogoFailed:"复制图标失败",copyWordmarkFailed:"复制文字标识失败"},n={title:"询问人工智能",placeholder:"问一个问题...",tooltip:"问人工智能一个问题",tryAsking:"尝试提问",askAnything:"想问什么都可以...",clearChat:"清除聊天内容",close:"关闭",expand:"展开",collapse:"崩溃",thinking:"想着……",askMeAnything:"询问任何事情",askMeAnythingDescription:"获取浏览文档、理解概念和寻找答案的帮助。",faq:"常见问题解答",chatCleared:"刷新时聊天会被清除",lineBreak:"换行符",explainWithAi:"用AI解释",toolListPages:"列出的文档页面",toolReadPage:"阅读",loading:{searching:"搜索文档",reading:"通读文档",analyzing:"分析内容",finding:"寻找最佳答案",finished:"使用的来源"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/Y1bVb6fC.js b/docus/dist/_nuxt/Y1bVb6fC.js new file mode 100644 index 0000000..1a6a4fe --- /dev/null +++ b/docus/dist/_nuxt/Y1bVb6fC.js @@ -0,0 +1 @@ +const o={or:"немесе",error:{title:"Бет табылмады",description:"Кешіріңіз, бірақ сіз іздеген бет табылмады."}},a={copy:{page:"Бетті көшіру",link:"Markdown бетін көшіру",view:"Markdown ретінде көру",gpt:"ChatGPT-те ашу",claude:"Claude-те ашу"},links:"Қауымдастық",toc:"Осы бетте",menu:"Мәзір",report:"Мәселе туралы хабарлау",edit:"Осы бетті өңдеу"},e={copyLogo:"Логотипті көшіру",copyWordmark:"Сөз белгісін көшіру",downloadLogo:"Логотипті жүктеу",downloadWordmark:"Сөз белгісін жүктеу",brandAssets:"Бренд материалдары",logoCopied:"Логотип көшірілді",wordmarkCopied:"Сөз белгісі көшірілді",logoDownloaded:"Логотип жүктелді",wordmarkDownloaded:"Сөз белгісі жүктелді",copyLogoFailed:"Логотипті көшіру сәтсіз",copyWordmarkFailed:"Сөз белгісін көшіру сәтсіз"},n={title:"AI-ден сұраңыз",placeholder:"Сұрақ қойыңыз...",tooltip:"ЖИ-ге сұрақ қойыңыз",tryAsking:"Сұрақ қоюға тырысыңыз",askAnything:"Кез келген нәрсені сұраңыз...",clearChat:"Чатты тазалау",close:"Жабу",expand:"Кеңейту",collapse:"Жию",thinking:"Ойлану...",askMeAnything:"Кез келген нәрсені сұраңыз",askMeAnythingDescription:"Құжаттамада шарлауға, тұжырымдамаларды түсінуге және жауап табуға көмектеседі.",faq:"Жиі қойылатын сұрақтар",chatCleared:"Чат жаңартылғанда тазартылды",lineBreak:"Сызық үзілісі",explainWithAi:"Жасанды интеллектпен түсіндіріңіз",toolListPages:"Тізімделген құжаттама беттері",toolReadPage:"Оқу",loading:{searching:"Құжаттаманы іздеу",reading:"Құжаттар арқылы оқу",analyzing:"Мазмұнды талдау",finding:"Үздік жауап табу",finished:"Пайдаланылған көздер"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/Y2TJq070.js b/docus/dist/_nuxt/Y2TJq070.js new file mode 100644 index 0000000..6d710a2 --- /dev/null +++ b/docus/dist/_nuxt/Y2TJq070.js @@ -0,0 +1 @@ +import{a0 as n,a1 as r,a as u,ac as l,s as p,ai as i,c as m,am as a,o as d}from"./B3fabVUf.js";const f={base:"align-text-top"},g={__name:"ProseKbd",props:{value:{type:String,required:!0},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,t=n(),o=r("prose.kbd",s),c=m(()=>a({extend:a(f),...t.ui?.prose?.kbd||{}}));return(b,v)=>(d(),u(i,{value:e.value,class:l(c.value({class:[p(o)?.base,s.class]}))},null,8,["value","class"]))}};export{g as default}; diff --git a/docus/dist/_nuxt/builds/latest.json b/docus/dist/_nuxt/builds/latest.json new file mode 100644 index 0000000..043ab25 --- /dev/null +++ b/docus/dist/_nuxt/builds/latest.json @@ -0,0 +1 @@ +{"id":"3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a","timestamp":1776806590495} \ No newline at end of file diff --git a/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json b/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json new file mode 100644 index 0000000..6705147 --- /dev/null +++ b/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json @@ -0,0 +1 @@ +{"id":"3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a","timestamp":1776806590495,"prerendered":["/","/server-extension","/getting-started","/client-addons","/server-modules","/getting-started/surrealdb-setup","/server-extension/api-reference","/getting-started/development","/server-extension/usage-examples","/getting-started/architecture","/server-modules/task","/getting-started/module-reference","/server-modules/actor","/server-modules/store","/server-modules/bank","/client-addons/main","/server-modules/cad","/client-addons/phone","/client-addons/store","/client-addons/common","/server-modules/garage","/client-addons/actor","/server-modules/organization","/server-modules/locker","/server-modules/economy","/client-addons/cad","/client-addons/bank","/server-modules/owned-storage","/server-modules/phone","/client-addons/organization","/client-addons/garage","/client-addons/locker","/client-addons/notifications"]} \ No newline at end of file diff --git a/docus/dist/_nuxt/entry.B0IIbxeE.css b/docus/dist/_nuxt/entry.B0IIbxeE.css new file mode 100644 index 0000000..561010f --- /dev/null +++ b/docus/dist/_nuxt/entry.B0IIbxeE.css @@ -0,0 +1 @@ +@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:1.33333;--text-sm:.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--text-2xl:1.5rem;--text-2xl--line-height:1.33333;--text-3xl:1.875rem;--text-3xl--line-height:1.2;--text-4xl:2.25rem;--text-4xl--line-height:1.11111;--text-5xl:3rem;--text-5xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--blur-sm:8px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-old-neutral-50:oklch(98.5% 0 0);--color-old-neutral-100:oklch(97% 0 0);--color-old-neutral-200:oklch(92.2% 0 0);--color-old-neutral-300:oklch(87% 0 0);--color-old-neutral-400:oklch(70.8% 0 0);--color-old-neutral-500:oklch(55.6% 0 0);--color-old-neutral-600:oklch(43.9% 0 0);--color-old-neutral-700:oklch(37.1% 0 0);--color-old-neutral-800:oklch(26.9% 0 0);--color-old-neutral-900:oklch(20.5% 0 0);--color-old-neutral-950:oklch(14.5% 0 0)}:host,:root{--ui-header-height:4rem;--ui-radius:.25rem;--ui-container:80rem}.light,:host,:root{--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-text-inverted:#fff;--ui-bg:#fff;--ui-bg-muted:var(--ui-color-neutral-50);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-muted:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900)}.dark{--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:#fff;--ui-text-inverted:var(--ui-color-neutral-900);--ui-bg:var(--ui-color-neutral-900);--ui-bg-muted:var(--ui-color-neutral-800);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:#fff;--ui-border:var(--ui-color-neutral-800);--ui-border-muted:var(--ui-color-neutral-700);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:#fff}}@layer base{*,::backdrop,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}::file-selector-button{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}button,input,optgroup,select,textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}::file-selector-button{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background-color:var(--ui-bg);color:var(--ui-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color-scheme:light}body:where(.dark,.dark *){color-scheme:dark}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.not-sr-only{clip-path:none;height:auto;margin:0;overflow:visible;padding:0;position:static;white-space:normal;width:auto}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-1{inset-inline:calc(var(--spacing)*1)}.inset-x-4{inset-inline:calc(var(--spacing)*4)}.inset-x-px{inset-inline:1px}.inset-y-0{inset-block:calc(var(--spacing)*0)}.inset-y-1{inset-block:calc(var(--spacing)*1)}.inset-y-1\.5{inset-block:calc(var(--spacing)*1.5)}.inset-y-2{inset-block:calc(var(--spacing)*2)}.inset-y-3{inset-block:calc(var(--spacing)*3)}.inset-y-4{inset-block:calc(var(--spacing)*4)}.-start-px{inset-inline-start:-1px}.start{inset-inline-start:var(--spacing)}.start-0{inset-inline-start:calc(var(--spacing)*0)}.start-4{inset-inline-start:calc(var(--spacing)*4)}.start-32{inset-inline-start:calc(var(--spacing)*32)}.start-\[calc\(--spacing\(4\)-1px\)\]{inset-inline-start:calc(var(--spacing)*4 - 1px)}.start-\[calc\(50\%\+16px\)\]{inset-inline-start:calc(50% + 16px)}.start-\[calc\(50\%\+20px\)\]{inset-inline-start:calc(50% + 20px)}.start-\[calc\(50\%\+28px\)\]{inset-inline-start:calc(50% + 28px)}.start-\[calc\(50\%\+32px\)\]{inset-inline-start:calc(50% + 32px)}.start-\[calc\(50\%\+36px\)\]{inset-inline-start:calc(50% + 36px)}.start-\[calc\(50\%-1px\)\]{inset-inline-start:calc(50% - 1px)}.-end-1\.5{inset-inline-end:calc(var(--spacing)*-1.5)}.end{inset-inline-end:var(--spacing)}.end-0{inset-inline-end:calc(var(--spacing)*0)}.end-4{inset-inline-end:calc(var(--spacing)*4)}.end-\[calc\(-50\%\+16px\)\]{inset-inline-end:calc(16px - 50%)}.end-\[calc\(-50\%\+20px\)\]{inset-inline-end:calc(20px - 50%)}.end-\[calc\(-50\%\+28px\)\]{inset-inline-end:calc(28px - 50%)}.end-\[calc\(-50\%\+32px\)\]{inset-inline-end:calc(32px - 50%)}.end-\[calc\(-50\%\+36px\)\]{inset-inline-end:calc(36px - 50%)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.-top-8{top:calc(var(--spacing)*-8)}.top-\(--ui-header-height\){top:var(--ui-header-height)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\[11px\]{top:11px}.top-\[30px\]{top:30px}.top-\[38px\]{top:38px}.top-\[46px\]{top:46px}.top-\[50\%\]{top:50%}.top-\[54px\]{top:54px}.top-\[62px\]{top:62px}.top-\[86\%\]{top:86%}.top-\[calc\(50\%-2px\)\]{top:calc(50% - 2px)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-1\/2{right:50%}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-\[11px\]{right:11px}.-bottom-7{bottom:calc(var(--spacing)*-7)}.-bottom-\[10px\]{bottom:-10px}.-bottom-px{bottom:-1px}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-\[max\(1\.5rem\,env\(safe-area-inset-bottom\)\)\]{bottom:max(1.5rem,env(safe-area-inset-bottom))}.bottom-px{bottom:1px}.left-\(--reka-navigation-menu-viewport-left\){left:var(--reka-navigation-menu-viewport-left)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing)*4)}.left-6\.5{left:calc(var(--spacing)*6.5)}.left-11{left:calc(var(--spacing)*11)}.left-auto\!{left:auto!important}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-\(--index\){z-index:var(--index)}.z-1{z-index:1}.z-2{z-index:2}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[100\]{z-index:100}.order-first{order:-9999}.order-last{order:9999}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.m-0\.5{margin:calc(var(--spacing)*.5)}.\!mx-0{margin-inline:calc(var(--spacing)*0)!important}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-2\.5{margin-inline:calc(var(--spacing)*-2.5)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-0\.5{margin-inline:calc(var(--spacing)*.5)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-1\.5{margin-block:calc(var(--spacing)*1.5)}.my-2{margin-block:calc(var(--spacing)*2)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-12{margin-block:calc(var(--spacing)*12)}.-ms-1\.5{margin-inline-start:calc(var(--spacing)*-1.5)}.-ms-4{margin-inline-start:calc(var(--spacing)*-4)}.-ms-8{margin-inline-start:calc(var(--spacing)*-8)}.-ms-\[8\.5px\]{margin-inline-start:-8.5px}.-ms-px{margin-inline-start:-1px}.ms-1{margin-inline-start:calc(var(--spacing)*1)}.ms-2{margin-inline-start:calc(var(--spacing)*2)}.ms-2\.5{margin-inline-start:calc(var(--spacing)*2.5)}.ms-3{margin-inline-start:calc(var(--spacing)*3)}.ms-4{margin-inline-start:calc(var(--spacing)*4)}.ms-4\.5{margin-inline-start:calc(var(--spacing)*4.5)}.ms-5{margin-inline-start:calc(var(--spacing)*5)}.ms-5\.5{margin-inline-start:calc(var(--spacing)*5.5)}.ms-6{margin-inline-start:calc(var(--spacing)*6)}.ms-auto{margin-inline-start:auto}.-me-0\.5{margin-inline-end:calc(var(--spacing)*-.5)}.-me-1{margin-inline-end:calc(var(--spacing)*-1)}.-me-1\.5{margin-inline-end:calc(var(--spacing)*-1.5)}.-me-2{margin-inline-end:calc(var(--spacing)*-2)}.me-1\.5{margin-inline-end:calc(var(--spacing)*1.5)}.me-2{margin-inline-end:calc(var(--spacing)*2)}.-mt-0\.5{margin-top:calc(var(--spacing)*-.5)}.-mt-1\.5{margin-top:calc(var(--spacing)*-1.5)}.-mt-4{margin-top:calc(var(--spacing)*-4)}.-mt-8{margin-top:calc(var(--spacing)*-8)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-2\.5{margin-top:calc(var(--spacing)*2.5)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-3\.5{margin-top:calc(var(--spacing)*3.5)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-24{margin-top:calc(var(--spacing)*24)}.mt-auto{margin-top:auto}.\!mr-4{margin-right:calc(var(--spacing)*4)!important}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-2\.5{margin-bottom:calc(var(--spacing)*2.5)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-24{margin-bottom:calc(var(--spacing)*24)}.mb-auto{margin-bottom:auto}.\!ml-4{margin-left:calc(var(--spacing)*4)!important}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-square{aspect-ratio:1}.size-1{height:calc(var(--spacing)*1);width:calc(var(--spacing)*1)}.size-2{height:calc(var(--spacing)*2);width:calc(var(--spacing)*2)}.size-2\.5{height:calc(var(--spacing)*2.5);width:calc(var(--spacing)*2.5)}.size-3{height:calc(var(--spacing)*3);width:calc(var(--spacing)*3)}.size-3\.5{height:calc(var(--spacing)*3.5);width:calc(var(--spacing)*3.5)}.size-4{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.size-4\.5{height:calc(var(--spacing)*4.5);width:calc(var(--spacing)*4.5)}.size-5{height:calc(var(--spacing)*5);width:calc(var(--spacing)*5)}.size-6{height:calc(var(--spacing)*6);width:calc(var(--spacing)*6)}.size-7{height:calc(var(--spacing)*7);width:calc(var(--spacing)*7)}.size-8{height:calc(var(--spacing)*8);width:calc(var(--spacing)*8)}.size-9{height:calc(var(--spacing)*9);width:calc(var(--spacing)*9)}.size-10{height:calc(var(--spacing)*10);width:calc(var(--spacing)*10)}.size-10\/12{height:83.3333%;width:83.3333%}.size-11{height:calc(var(--spacing)*11);width:calc(var(--spacing)*11)}.size-12{height:calc(var(--spacing)*12);width:calc(var(--spacing)*12)}.size-14{height:calc(var(--spacing)*14);width:calc(var(--spacing)*14)}.size-full{height:100%;width:100%}.\!h-1\.5{height:calc(var(--spacing)*1.5)!important}.\!h-12{height:calc(var(--spacing)*12)!important}.h-\(--indicator-size\){height:var(--indicator-size)}.h-\(--reka-navigation-menu-viewport-height\){height:var(--reka-navigation-menu-viewport-height)}.h-\(--reka-tabs-indicator-size\){height:var(--reka-tabs-indicator-size)}.h-\(--ui-header-height\){height:var(--ui-header-height)}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-38{height:calc(var(--spacing)*38)}.h-40{height:calc(var(--spacing)*40)}.h-42{height:calc(var(--spacing)*42)}.h-44{height:calc(var(--spacing)*44)}.h-46{height:calc(var(--spacing)*46)}.h-\[4px\]{height:4px}.h-\[5px\]{height:5px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[8px\]{height:8px}.h-\[9px\]{height:9px}.h-\[10px\]{height:10px}.h-\[11px\]{height:11px}.h-\[12px\]{height:12px}.h-\[48px\]{height:48px}.h-\[350px\]{height:350px}.h-\[700px\]{height:700px}.h-\[fit-content\]{height:-moz-fit-content;height:fit-content}.h-auto{height:auto}.h-auto\!{height:auto!important}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[70vh\]{max-height:70vh}.max-h-\[95vh\]{max-height:95vh}.max-h-\[96\%\]{max-height:96%}.max-h-\[200px\]{max-height:200px}.max-h-\[calc\(100\%-2rem\)\]{max-height:calc(100% - 2rem)}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.max-h-\[calc\(100vh-var\(--ui-header-height\)\)\]{max-height:calc(100vh - var(--ui-header-height))}.max-h-full{max-height:100%}.min-h-\(--ui-header-height\){min-height:var(--ui-header-height)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-6{min-height:calc(var(--spacing)*6)}.min-h-8{min-height:calc(var(--spacing)*8)}.min-h-12{min-height:calc(var(--spacing)*12)}.min-h-\[49px\]{min-height:49px}.min-h-\[calc\(100vh-var\(--ui-header-height\)\)\]{min-height:calc(100vh - var(--ui-header-height))}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.min-h-svh{min-height:100svh}.\!w-1\.5{width:calc(var(--spacing)*1.5)!important}.\!w-12{width:calc(var(--spacing)*12)!important}.w-\(--reka-combobox-trigger-width\){width:var(--reka-combobox-trigger-width)}.w-\(--reka-navigation-menu-indicator-size\){width:var(--reka-navigation-menu-indicator-size)}.w-\(--reka-select-trigger-width\){width:var(--reka-select-trigger-width)}.w-\(--reka-tabs-indicator-size\){width:var(--reka-tabs-indicator-size)}.w-\(--sidebar-width\){width:var(--sidebar-width)}.w-\(--width\){width:var(--width)}.w-0{width:calc(var(--spacing)*0)}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-32{width:calc(var(--spacing)*32)}.w-38{width:calc(var(--spacing)*38)}.w-40{width:calc(var(--spacing)*40)}.w-42{width:calc(var(--spacing)*42)}.w-44{width:calc(var(--spacing)*44)}.w-46{width:calc(var(--spacing)*46)}.w-60{width:calc(var(--spacing)*60)}.w-\[6px\]{width:6px}.w-\[7px\]{width:7px}.w-\[8px\]{width:8px}.w-\[9px\]{width:9px}.w-\[10px\]{width:10px}.w-\[48px\]{width:48px}.w-\[350px\]{width:350px}.w-\[700px\]{width:700px}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.w-auto{width:auto}.w-full{width:100%}.w-full\!{width:100%!important}.w-px{width:1px}.max-w-\(--ui-container\){max-width:var(--ui-container)}.max-w-2\/3{max-width:66.6667%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-60{max-width:calc(var(--spacing)*60)}.max-w-96{max-width:calc(var(--spacing)*96)}.max-w-\[75\%\]{max-width:75%}.max-w-\[95vw\]{max-width:95vw}.max-w-\[200px\]{max-width:200px}.max-w-\[900px\]{max-width:900px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-16{min-width:calc(var(--spacing)*16)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-\[4px\]{min-width:4px}.min-w-\[5px\]{min-width:5px}.min-w-\[6px\]{min-width:6px}.min-w-\[7px\]{min-width:7px}.min-w-\[8px\]{min-width:8px}.min-w-\[9px\]{min-width:9px}.min-w-\[10px\]{min-width:10px}.min-w-\[11px\]{min-width:11px}.min-w-\[12px\]{min-width:12px}.min-w-\[16px\]{min-width:16px}.min-w-\[20px\]{min-width:20px}.min-w-\[24px\]{min-width:24px}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0)}.border-spacing-0,.border-spacing-x-0{border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.border-spacing-x-0{--tw-border-spacing-x:calc(var(--spacing)*0)}.origin-\(--reka-combobox-content-transform-origin\){transform-origin:var(--reka-combobox-content-transform-origin)}.origin-\(--reka-context-menu-content-transform-origin\){transform-origin:var(--reka-context-menu-content-transform-origin)}.origin-\(--reka-dropdown-menu-content-transform-origin\){transform-origin:var(--reka-dropdown-menu-content-transform-origin)}.origin-\(--reka-popover-content-transform-origin\){transform-origin:var(--reka-popover-content-transform-origin)}.origin-\(--reka-select-content-transform-origin\){transform-origin:var(--reka-select-content-transform-origin)}.origin-\(--reka-tooltip-content-transform-origin\){transform-origin:var(--reka-tooltip-content-transform-origin)}.origin-\[top_center\]{transform-origin:top}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-\[4px\]{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-\[4px\]{--tw-translate-x:-4px}.translate-x-\(--reka-navigation-menu-indicator-position\){--tw-translate-x:var(--reka-navigation-menu-indicator-position);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\(--reka-tabs-indicator-position\){--tw-translate-x:var(--reka-tabs-indicator-position);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x:50%}.-translate-y-1\/2,.translate-x-1\/2{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:-50%}.translate-y-\(--indicator-position\){--tw-translate-y:var(--indicator-position);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\(--reka-tabs-indicator-position\){--tw-translate-y:var(--reka-tabs-indicator-position);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y:50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-none{translate:none}.scale-80{--tw-scale-x:80%;--tw-scale-y:80%;--tw-scale-z:80%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-3d{scale:var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform-\(--transform\){transform:var(--transform)}.animate-\[marquee-vertical_var\(--duration\)_linear_infinite\]{animation:marquee-vertical var(--duration) linear infinite}.animate-\[marquee_var\(--duration\)_linear_infinite\]{animation:marquee var(--duration) linear infinite}.animate-\[shimmer_var\(--duration\)_linear_infinite\]{animation:shimmer var(--duration) linear infinite}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-e-resize{cursor:e-resize}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-w-resize{cursor:w-resize}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.scroll-mt-3{scroll-margin-top:calc(var(--spacing)*3)}.scroll-mt-4{scroll-margin-top:calc(var(--spacing)*4)}.scroll-mt-\[calc\(24px\+45px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(69px + var(--ui-header-height))}.scroll-mt-\[calc\(32px\+45px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(77px + var(--ui-header-height))}.scroll-mt-\[calc\(45px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(45px + var(--ui-header-height))}.scroll-mt-\[calc\(48px\+45px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(93px + var(--ui-header-height))}.scroll-py-1{scroll-padding-block:calc(var(--spacing)*1)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.place-items-baseline{place-items:baseline}.place-items-center{place-items:center}.content-center{align-content:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-\(--gap\){gap:var(--gap)}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-0\.25{gap:calc(var(--spacing)*.25)}.gap-0\.75{gap:calc(var(--spacing)*.75)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-3\.5{gap:calc(var(--spacing)*3.5)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}.gap-16{gap:calc(var(--spacing)*16)}:where(.-space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(-1px*var(--tw-space-y-reverse))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*5*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*5*var(--tw-space-y-reverse))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*8*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*8*var(--tw-space-y-reverse))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*12*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*12*var(--tw-space-y-reverse))}:where(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-1\.5{-moz-column-gap:calc(var(--spacing)*1.5);column-gap:calc(var(--spacing)*1.5)}.gap-x-2{-moz-column-gap:calc(var(--spacing)*2);column-gap:calc(var(--spacing)*2)}.gap-x-3{-moz-column-gap:calc(var(--spacing)*3);column-gap:calc(var(--spacing)*3)}.gap-x-4{-moz-column-gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*4)}.gap-x-6{-moz-column-gap:calc(var(--spacing)*6);column-gap:calc(var(--spacing)*6)}.gap-x-8{-moz-column-gap:calc(var(--spacing)*8);column-gap:calc(var(--spacing)*8)}:where(.-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(-1px*var(--tw-space-x-reverse))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*1*var(--tw-space-x-reverse))}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-1\.5{row-gap:calc(var(--spacing)*1.5)}.gap-y-3{row-gap:calc(var(--spacing)*3)}.gap-y-4{row-gap:calc(var(--spacing)*4)}.gap-y-6{row-gap:calc(var(--spacing)*6)}.gap-y-8{row-gap:calc(var(--spacing)*8)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}:where(.divide-accented>:not(:last-child)){border-color:var(--ui-border-accented)}:where(.divide-default>:not(:last-child)){border-color:var(--ui-border)}:where(.divide-transparent>:not(:last-child)){border-color:#0000}.self-center{align-self:center}.self-end{align-self:flex-end}.self-stretch{align-self:stretch}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\[0\.5px\]{border-radius:.5px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:calc(var(--ui-radius)*2)}.rounded-md{border-radius:calc(var(--ui-radius)*1.5)}.rounded-sm{border-radius:var(--ui-radius)}.rounded-xl{border-radius:calc(var(--ui-radius)*3)}.rounded-xs{border-radius:calc(var(--ui-radius)*.5)}.rounded-s{border-end-start-radius:.25rem}.rounded-s,.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-end-end-radius:.25rem}.rounded-e,.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:calc(var(--ui-radius)*2);border-top-right-radius:calc(var(--ui-radius)*2)}.rounded-t-md{border-top-left-radius:calc(var(--ui-radius)*1.5);border-top-right-radius:calc(var(--ui-radius)*1.5)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-l-lg{border-bottom-left-radius:calc(var(--ui-radius)*2);border-top-left-radius:calc(var(--ui-radius)*2)}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-r-lg{border-bottom-right-radius:calc(var(--ui-radius)*2);border-top-right-radius:calc(var(--ui-radius)*2)}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-lg{border-bottom-left-radius:calc(var(--ui-radius)*2);border-bottom-right-radius:calc(var(--ui-radius)*2)}.rounded-b-md{border-bottom-left-radius:calc(var(--ui-radius)*1.5);border-bottom-right-radius:calc(var(--ui-radius)*1.5)}.rounded-b-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.border-s-\[2px\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-s-\[3px\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px}.border-s-\[4px\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.border-s-\[5px\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:5px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-bs{border-block-start-style:var(--tw-border-style);border-block-start-width:1px}.border-be{border-block-end-style:var(--tw-border-style);border-block-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-\[2px\]{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.border-t-\[4px\]{border-top-style:var(--tw-border-style);border-top-width:4px}.border-t-\[5px\]{border-top-style:var(--tw-border-style);border-top-width:5px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-solid{--tw-border-style:solid;border-style:solid}.border-accented{border-color:var(--ui-border-accented)}.border-bg{border-color:var(--ui-bg)}.border-default{border-color:var(--ui-border)}.border-error,.border-error\/25{border-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.border-error\/25{border-color:color-mix(in oklab,var(--ui-error) 25%,transparent)}}.border-info,.border-info\/25{border-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.border-info\/25{border-color:color-mix(in oklab,var(--ui-info) 25%,transparent)}}.border-inverted{border-color:var(--ui-border-inverted)}.border-muted{border-color:var(--ui-border-muted)}.border-primary,.border-primary\/25{border-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,var(--ui-primary) 25%,transparent)}}.border-secondary,.border-secondary\/25{border-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.border-secondary\/25{border-color:color-mix(in oklab,var(--ui-secondary) 25%,transparent)}}.border-success,.border-success\/25{border-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.border-success\/25{border-color:color-mix(in oklab,var(--ui-success) 25%,transparent)}}.border-transparent{border-color:#0000}.border-warning,.border-warning\/25{border-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/25{border-color:color-mix(in oklab,var(--ui-warning) 25%,transparent)}}.\!bg-accented{background-color:var(--ui-bg-accented)!important}.bg-\(--ui-border\){background-color:var(--ui-border)}.bg-\(--ui-border-accented\){background-color:var(--ui-border-accented)}.bg-accented{background-color:var(--ui-bg-accented)}.bg-border{background-color:var(--ui-border)}.bg-current{background-color:currentColor}.bg-default,.bg-default\/75{background-color:var(--ui-bg)}@supports (color:color-mix(in lab,red,red)){.bg-default\/75{background-color:color-mix(in oklab,var(--ui-bg) 75%,transparent)}}.bg-default\/90{background-color:var(--ui-bg)}@supports (color:color-mix(in lab,red,red)){.bg-default\/90{background-color:color-mix(in oklab,var(--ui-bg) 90%,transparent)}}.bg-default\/95{background-color:var(--ui-bg)}@supports (color:color-mix(in lab,red,red)){.bg-default\/95{background-color:color-mix(in oklab,var(--ui-bg) 95%,transparent)}}.bg-elevated,.bg-elevated\/50{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-elevated\/50{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.bg-elevated\/75{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-elevated\/75{background-color:color-mix(in oklab,var(--ui-bg-elevated) 75%,transparent)}}.bg-error,.bg-error\/10{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.bg-error\/10{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.bg-info,.bg-info\/10{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/10{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.bg-inverted{background-color:var(--ui-bg-inverted)}.bg-muted{background-color:var(--ui-bg-muted)}.bg-neutral-200{background-color:var(--ui-color-neutral-200)}.bg-neutral-950{background-color:var(--ui-color-neutral-950)}.bg-primary,.bg-primary\/10{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.bg-secondary,.bg-secondary\/10{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/10{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.bg-success,.bg-success\/10{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/10{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab}.bg-gradient-to-b,.bg-gradient-to-t{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab}.bg-\[image\:linear-gradient\(90deg\,\#0000_calc\(50\%-var\(--spread\)\)\,var\(--ui-text-highlighted\)\,\#0000_calc\(50\%\+var\(--spread\)\)\)\,linear-gradient\(var\(--ui-text-muted\)\,var\(--ui-text-muted\)\)\]{background-image:linear-gradient(90deg,#0000 calc(50% - var(--spread)),var(--ui-text-highlighted),#0000 calc(50% + var(--spread))),linear-gradient(var(--ui-text-muted),var(--ui-text-muted))}.bg-\[radial-gradient\(circle_at_top_right\,rgba\(255\,255\,255\,0\.10\)_0\%\,rgba\(255\,255\,255\,0\.04\)_40\%\,transparent_70\%\)\]{background-image:radial-gradient(circle at 100% 0,#ffffff1a 0,#ffffff0a 40%,#0000 70%)}.bg-\[radial-gradient\(circle_at_top_right\,rgba\(255\,255\,255\,0\.22\)_0\%\,rgba\(255\,255\,255\,0\.08\)_35\%\,transparent_65\%\)\]{background-image:radial-gradient(circle at 100% 0,#ffffff38 0,#ffffff14 35%,#0000 65%)}.from-default{--tw-gradient-from:var(--ui-bg);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-muted{--tw-gradient-from:var(--ui-bg-muted);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-size-\[calc\(200\%\+var\(--spread\)\*2\+2px\)_100\%\,auto\]{background-size:calc(200% + var(--spread)*2 + 2px) 100%,auto}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat{background-repeat:repeat}.mask-no-clip{-webkit-mask-clip:no-clip;mask-clip:no-clip}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.fill-bg{fill:var(--ui-bg)}.stroke-default{stroke:var(--ui-border)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-3\.5{padding:calc(var(--spacing)*3.5)}.p-4{padding:calc(var(--spacing)*4)}.p-4\.5{padding:calc(var(--spacing)*4.5)}.p-6{padding:calc(var(--spacing)*6)}.\!px-1{padding-inline:calc(var(--spacing)*1)!important}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-\[80px\]{padding-inline:80px}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-7{padding-block:calc(var(--spacing)*7)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-24{padding-block:calc(var(--spacing)*24)}.py-\[60px\]{padding-block:60px}.ps-1{padding-inline-start:calc(var(--spacing)*1)}.ps-1\.5{padding-inline-start:calc(var(--spacing)*1.5)}.ps-2{padding-inline-start:calc(var(--spacing)*2)}.ps-2\.5{padding-inline-start:calc(var(--spacing)*2.5)}.ps-3{padding-inline-start:calc(var(--spacing)*3)}.ps-4{padding-inline-start:calc(var(--spacing)*4)}.ps-6{padding-inline-start:calc(var(--spacing)*6)}.ps-6\.5{padding-inline-start:calc(var(--spacing)*6.5)}.ps-7{padding-inline-start:calc(var(--spacing)*7)}.ps-8{padding-inline-start:calc(var(--spacing)*8)}.ps-9{padding-inline-start:calc(var(--spacing)*9)}.ps-10{padding-inline-start:calc(var(--spacing)*10)}.ps-11{padding-inline-start:calc(var(--spacing)*11)}.ps-px{padding-inline-start:1px}.pe-1{padding-inline-end:calc(var(--spacing)*1)}.pe-2{padding-inline-end:calc(var(--spacing)*2)}.pe-2\.5{padding-inline-end:calc(var(--spacing)*2.5)}.pe-3{padding-inline-end:calc(var(--spacing)*3)}.pe-4\.5{padding-inline-end:calc(var(--spacing)*4.5)}.pe-5{padding-inline-end:calc(var(--spacing)*5)}.pe-5\.5{padding-inline-end:calc(var(--spacing)*5.5)}.pe-6{padding-inline-end:calc(var(--spacing)*6)}.pe-6\.5{padding-inline-end:calc(var(--spacing)*6.5)}.pe-7{padding-inline-end:calc(var(--spacing)*7)}.pe-7\.5{padding-inline-end:calc(var(--spacing)*7.5)}.pe-8{padding-inline-end:calc(var(--spacing)*8)}.pe-8\.5{padding-inline-end:calc(var(--spacing)*8.5)}.pe-9{padding-inline-end:calc(var(--spacing)*9)}.pe-10{padding-inline-end:calc(var(--spacing)*10)}.pe-11{padding-inline-end:calc(var(--spacing)*11)}.\!pt-0{padding-top:calc(var(--spacing)*0)!important}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pb-2\.5{padding-bottom:calc(var(--spacing)*2.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-3\.5{padding-bottom:calc(var(--spacing)*3.5)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-4\.5{padding-bottom:calc(var(--spacing)*4.5)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-5\.5{padding-bottom:calc(var(--spacing)*5.5)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-6\.5{padding-bottom:calc(var(--spacing)*6.5)}.pb-7{padding-bottom:calc(var(--spacing)*7)}.pb-7\.5{padding-bottom:calc(var(--spacing)*7.5)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-8\.5{padding-bottom:calc(var(--spacing)*8.5)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-\[22px\]{padding-left:22px}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-sub{vertical-align:sub}.align-text-top{vertical-align:text-top}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-\[8px\]\/3{font-size:8px;line-height:calc(var(--spacing)*3)}.text-\[10px\]\/3{font-size:10px;line-height:calc(var(--spacing)*3)}.text-base{line-height:var(--tw-leading,var(--text-base--line-height))}.text-base,.text-base\/5{font-size:var(--text-base)}.text-base\/5{line-height:calc(var(--spacing)*5)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm,.text-sm\/4{font-size:var(--text-sm)}.text-sm\/4{line-height:calc(var(--spacing)*4)}.text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{line-height:var(--tw-leading,var(--text-xs--line-height))}.text-xs,.text-xs\/5{font-size:var(--text-xs)}.text-xs\/5{line-height:calc(var(--spacing)*5)}.text-\[4px\]{font-size:4px}.text-\[5px\]{font-size:5px}.text-\[6px\]{font-size:6px}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[15px\]{font-size:15px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[28px\]{font-size:28px}.text-\[50px\]{font-size:50px}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.wrap-anywhere{overflow-wrap:anywhere}.wrap-break-word{overflow-wrap:break-word}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-default{color:var(--ui-text)}.text-dimmed{color:var(--ui-text-dimmed)}.text-error{color:var(--ui-error)}.text-error-600{color:var(--ui-color-error-600)}.text-error\/75{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.text-error\/75{color:color-mix(in oklab,var(--ui-error) 75%,transparent)}}.text-highlighted{color:var(--ui-text-highlighted)}.text-info{color:var(--ui-info)}.text-info-600{color:var(--ui-color-info-600)}.text-info\/75{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.text-info\/75{color:color-mix(in oklab,var(--ui-info) 75%,transparent)}}.text-inherit{color:inherit}.text-inverted{color:var(--ui-text-inverted)}.text-muted{color:var(--ui-text-muted)}.text-neutral-400{color:var(--ui-color-neutral-400)}.text-primary{color:var(--ui-primary)}.text-primary-600{color:var(--ui-color-primary-600)}.text-primary\/75{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.text-primary\/75{color:color-mix(in oklab,var(--ui-primary) 75%,transparent)}}.text-secondary{color:var(--ui-secondary)}.text-secondary-600{color:var(--ui-color-secondary-600)}.text-secondary\/75{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.text-secondary\/75{color:color-mix(in oklab,var(--ui-secondary) 75%,transparent)}}.text-success{color:var(--ui-success)}.text-success-600{color:var(--ui-color-success-600)}.text-success\/75{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.text-success\/75{color:color-mix(in oklab,var(--ui-success) 75%,transparent)}}.text-toned{color:var(--ui-text-toned)}.text-transparent{color:#0000}.text-warning{color:var(--ui-warning)}.text-warning-600{color:var(--ui-color-warning-600)}.text-warning\/75{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.text-warning\/75{color:color-mix(in oklab,var(--ui-warning) 75%,transparent)}}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.diagonal-fractions,.lining-nums{font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.oldstyle-nums,.ordinal{font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal}.proportional-nums{--tw-numeric-spacing:proportional-nums}.proportional-nums,.slashed-zero{font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero}.stacked-fractions{--tw-numeric-fraction:stacked-fractions}.stacked-fractions,.tabular-nums{font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow,.shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.shadow-none\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow-sm,.shadow-xs{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.ring,.ring-0{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.ring-2,.ring-3{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-3{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.inset-ring{--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-accented{--tw-ring-color:var(--ui-border-accented)}.ring-bg{--tw-ring-color:var(--ui-bg)}.ring-default{--tw-ring-color:var(--ui-border)}.ring-error,.ring-error\/25{--tw-ring-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.ring-error\/25{--tw-ring-color:color-mix(in oklab,var(--ui-error) 25%,transparent)}}.ring-error\/50{--tw-ring-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.ring-error\/50{--tw-ring-color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.ring-info,.ring-info\/25{--tw-ring-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.ring-info\/25{--tw-ring-color:color-mix(in oklab,var(--ui-info) 25%,transparent)}}.ring-info\/50{--tw-ring-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.ring-info\/50{--tw-ring-color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.ring-inverted{--tw-ring-color:var(--ui-border-inverted)}.ring-primary,.ring-primary\/25{--tw-ring-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/25{--tw-ring-color:color-mix(in oklab,var(--ui-primary) 25%,transparent)}}.ring-primary\/50{--tw-ring-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/50{--tw-ring-color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.ring-secondary,.ring-secondary\/25{--tw-ring-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.ring-secondary\/25{--tw-ring-color:color-mix(in oklab,var(--ui-secondary) 25%,transparent)}}.ring-secondary\/50{--tw-ring-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.ring-secondary\/50{--tw-ring-color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.ring-success,.ring-success\/25{--tw-ring-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.ring-success\/25{--tw-ring-color:color-mix(in oklab,var(--ui-success) 25%,transparent)}}.ring-success\/50{--tw-ring-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.ring-success\/50{--tw-ring-color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.ring-warning,.ring-warning\/25{--tw-ring-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.ring-warning\/25{--tw-ring-color:color-mix(in oklab,var(--ui-warning) 25%,transparent)}}.ring-warning\/50{--tw-ring-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.ring-warning\/50{--tw-ring-color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.ring-white{--tw-ring-color:var(--color-white)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline:2px solid #0000;outline-offset:2px}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.drop-shadow{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl))}.backdrop-blur-xl,.backdrop-grayscale{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.backdrop-invert{--tw-backdrop-invert:invert(100%)}.backdrop-invert,.backdrop-sepia{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[background\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[color\,opacity\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[color\,translate\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,translate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[left\,right\,width\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[margin-right\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:margin-right;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[right\,width\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[rotate\,opacity\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:rotate,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[transform\,translate\,height\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[translate\,height\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:translate,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[translate\,width\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:translate,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[width\,height\,left\,right\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:width,height,left,right;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-\[width\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-all{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-opacity{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-\[background-position\]{will-change:background-position}.will-change-\[height\]{will-change:height}.will-change-\[margin-right\]{will-change:margin-right}.will-change-\[right\,width\]{will-change:right,width}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.\!\[animation-direction\:reverse\]{animation-direction:reverse!important}.\[--duration\:20s\]{--duration:20s}.\[--gap\:--spacing\(16\)\]{--gap:calc(var(--spacing)*16)}.\[--initial-transform\:calc\(100\%\+1\.5rem\)\]{--initial-transform: calc(100% + 1.5rem) }.\[--sidebar-width-icon\:4rem\]{--sidebar-width-icon:4rem}.\[--sidebar-width\:16rem\]{--sidebar-width:16rem}.\[--spotlight-color\:var\(--ui-bg-inverted\)\]{--spotlight-color:var(--ui-bg-inverted)}.\[--spotlight-color\:var\(--ui-error\)\]{--spotlight-color:var(--ui-error)}.\[--spotlight-color\:var\(--ui-info\)\]{--spotlight-color:var(--ui-info)}.\[--spotlight-color\:var\(--ui-primary\)\]{--spotlight-color:var(--ui-primary)}.\[--spotlight-color\:var\(--ui-secondary\)\]{--spotlight-color:var(--ui-secondary)}.\[--spotlight-color\:var\(--ui-success\)\]{--spotlight-color:var(--ui-success)}.\[--spotlight-color\:var\(--ui-warning\)\]{--spotlight-color:var(--ui-warning)}.\[--spotlight-size\:400px\]{--spotlight-size:400px}.\[counter-reset\:step\]{counter-reset:step}.backface-hidden{backface-visibility:hidden}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}:is(.\*\:my-0>*){margin-block:calc(var(--spacing)*0)}:is(.\*\:my-1>*){margin-block:calc(var(--spacing)*1)}:is(.\*\:my-1\.5>*){margin-block:calc(var(--spacing)*1.5)}:is(.\*\:my-5>*){margin-block:calc(var(--spacing)*5)}:is(.\*\:size-2>*){height:calc(var(--spacing)*2);width:calc(var(--spacing)*2)}:is(.\*\:break-inside-avoid-column>*){-moz-column-break-inside:avoid;break-inside:avoid-column}:is(.\*\:rounded-full>*){border-radius:3.40282e+38px}:is(.\*\:rounded-none\!>*){border-radius:0!important}:is(.\*\:bg-accented>*){background-color:var(--ui-bg-accented)}:is(.\*\:bg-elevated>*){background-color:var(--ui-bg-elevated)}:is(.\*\:p-0\!>*){padding:calc(var(--spacing)*0)!important}:is(.\*\:pt-8>*){padding-top:calc(var(--spacing)*8)}:is(.\*\:text-base\!>*){font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}:is(.\*\:will-change-transform>*){will-change:transform}:is(.\*\:not-first\:\!static>*):not(:first-child){position:static!important}:is(.\*\:not-first\:\!my-0>*):not(:first-child){margin-block:calc(var(--spacing)*0)!important}:is(.\*\:not-last\:pb-5>*):not(:last-child){padding-bottom:calc(var(--spacing)*5)}.not-last\:not-first\:rounded-none:not(:last-child):not(:first-child){border-radius:0}.not-data-\[segment\=literal\]\:w-6:not([data-segment=literal]){width:calc(var(--spacing)*6)}.not-data-\[segment\=literal\]\:w-7:not([data-segment=literal]){width:calc(var(--spacing)*7)}.not-data-\[segment\=literal\]\:w-8:not([data-segment=literal]){width:calc(var(--spacing)*8)}.group-not-last\:group-not-first\:rounded-none:is(:where(.group):not(:last-child) *):is(:where(.group):not(:first-child) *){border-radius:0}.group-not-only\:group-first\:rounded-e-none:is(:where(.group):not(:only-child) *):is(:where(.group):first-child *){border-end-end-radius:0;border-start-end-radius:0}.group-not-only\:group-first\:rounded-b-none:is(:where(.group):not(:only-child) *):is(:where(.group):first-child *){border-bottom-left-radius:0;border-bottom-right-radius:0}.group-not-only\:group-last\:rounded-s-none:is(:where(.group):not(:only-child) *):is(:where(.group):last-child *){border-end-start-radius:0;border-start-start-radius:0}.group-not-only\:group-last\:rounded-t-none:is(:where(.group):not(:only-child) *):is(:where(.group):last-child *){border-top-left-radius:0;border-top-right-radius:0}.group-focus-within\:hidden:is(:where(.group):focus-within *){display:none}@media(hover:hover){.group-hover\:bg-primary:is(:where(.group):hover *),.group-hover\:bg-primary\/10:is(:where(.group):hover *){background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-primary\/10:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.group-hover\:text-default:is(:where(.group):hover *){color:var(--ui-text)}.group-hover\:text-error:is(:where(.group):hover *){color:var(--ui-error)}.group-hover\:text-highlighted:is(:where(.group):hover *){color:var(--ui-text-highlighted)}.group-hover\:text-info:is(:where(.group):hover *){color:var(--ui-info)}.group-hover\:text-inverted:is(:where(.group):hover *){color:var(--ui-text-inverted)}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--ui-primary)}.group-hover\:text-secondary:is(:where(.group):hover *){color:var(--ui-secondary)}.group-hover\:text-success:is(:where(.group):hover *){color:var(--ui-success)}.group-hover\:text-warning:is(:where(.group):hover *){color:var(--ui-warning)}.group-hover\:opacity-0:is(:where(.group):hover *){opacity:0}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\:ring-primary:is(:where(.group):hover *),.group-hover\:ring-primary\/50:is(:where(.group):hover *){--tw-ring-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.group-hover\:ring-primary\/50:is(:where(.group):hover *){--tw-ring-color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.group-hover\:\[animation-play-state\:paused\]:is(:where(.group):hover *){animation-play-state:paused}.group-hover\/blog-post\:scale-110:is(:where(.group\/blog-post):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\/blog-post\:rounded-r-none:is(:where(.group\/blog-post):hover *){border-bottom-right-radius:0;border-top-right-radius:0}.group-hover\/blog-post\:rounded-b-none:is(:where(.group\/blog-post):hover *){border-bottom-left-radius:0;border-bottom-right-radius:0}.group-hover\/blog-post\:shadow-none:is(:where(.group\/blog-post):hover *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-hover\/changelog-version-image\:scale-105:is(:where(.group\/changelog-version-image):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\/message\:opacity-100:is(:where(.group\/message):hover *){opacity:1}.group-hover\/user\:scale-115:is(:where(.group\/user):hover *){--tw-scale-x:115%;--tw-scale-y:115%;--tw-scale-z:115%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.group-focus\:opacity-100:is(:where(.group):focus *){opacity:1}.group-active\:-translate-x-0\.5:is(:where(.group):active *){--tw-translate-x:calc(var(--spacing)*-.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-active\:translate-x-0\.5:is(:where(.group):active *){--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-has-focus-visible\/changelog-version-image\:scale-105:is(:where(.group\/changelog-version-image):has(:focus-visible) *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-has-focus-visible\/user\:scale-115:is(:where(.group\/user):has(:focus-visible) *){--tw-scale-x:115%;--tw-scale-y:115%;--tw-scale-z:115%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-data-expanded\:rotate-180:is(:where(.group)[data-expanded] *){rotate:180deg}.group-data-highlighted\:inline-flex:is(:where(.group)[data-highlighted] *){display:inline-flex}.group-data-highlighted\:text-default:is(:where(.group)[data-highlighted] *){color:var(--ui-text)}.group-data-highlighted\:text-error:is(:where(.group)[data-highlighted] *){color:var(--ui-error)}.group-data-highlighted\:text-info:is(:where(.group)[data-highlighted] *){color:var(--ui-info)}.group-data-highlighted\:text-primary:is(:where(.group)[data-highlighted] *){color:var(--ui-primary)}.group-data-highlighted\:text-secondary:is(:where(.group)[data-highlighted] *){color:var(--ui-secondary)}.group-data-highlighted\:text-success:is(:where(.group)[data-highlighted] *){color:var(--ui-success)}.group-data-highlighted\:text-warning:is(:where(.group)[data-highlighted] *){color:var(--ui-warning)}.group-data-highlighted\:not-group-data-disabled\:text-default:is(:where(.group)[data-highlighted] *):not(:is(:where(.group)[data-disabled] *)){color:var(--ui-text)}.group-data-\[disabled\]\:opacity-75:is(:where(.group)[data-disabled] *){opacity:.75}.group-data-\[state\=active\]\:bg-error:is(:where(.group)[data-state=active] *){background-color:var(--ui-error)}.group-data-\[state\=active\]\:bg-info:is(:where(.group)[data-state=active] *){background-color:var(--ui-info)}.group-data-\[state\=active\]\:bg-inverted:is(:where(.group)[data-state=active] *){background-color:var(--ui-bg-inverted)}.group-data-\[state\=active\]\:bg-primary:is(:where(.group)[data-state=active] *){background-color:var(--ui-primary)}.group-data-\[state\=active\]\:bg-secondary:is(:where(.group)[data-state=active] *){background-color:var(--ui-secondary)}.group-data-\[state\=active\]\:bg-success:is(:where(.group)[data-state=active] *){background-color:var(--ui-success)}.group-data-\[state\=active\]\:bg-warning:is(:where(.group)[data-state=active] *){background-color:var(--ui-warning)}.group-data-\[state\=active\]\:text-inverted:is(:where(.group)[data-state=active] *){color:var(--ui-text-inverted)}.group-data-\[state\=checked\]\:text-error:is(:where(.group)[data-state=checked] *){color:var(--ui-error)}.group-data-\[state\=checked\]\:text-highlighted:is(:where(.group)[data-state=checked] *){color:var(--ui-text-highlighted)}.group-data-\[state\=checked\]\:text-info:is(:where(.group)[data-state=checked] *){color:var(--ui-info)}.group-data-\[state\=checked\]\:text-primary:is(:where(.group)[data-state=checked] *){color:var(--ui-primary)}.group-data-\[state\=checked\]\:text-secondary:is(:where(.group)[data-state=checked] *){color:var(--ui-secondary)}.group-data-\[state\=checked\]\:text-success:is(:where(.group)[data-state=checked] *){color:var(--ui-success)}.group-data-\[state\=checked\]\:text-warning:is(:where(.group)[data-state=checked] *){color:var(--ui-warning)}.group-data-\[state\=checked\]\:opacity-100:is(:where(.group)[data-state=checked] *){opacity:1}.group-data-\[state\=collapsed\]\/sidebar\:hidden:is(:where(.group\/sidebar)[data-state=collapsed] *){display:none}.group-data-\[state\=collapsed\]\/sidebar\:overflow-hidden:is(:where(.group\/sidebar)[data-state=collapsed] *){overflow:hidden}.group-data-\[state\=completed\]\:bg-error:is(:where(.group)[data-state=completed] *){background-color:var(--ui-error)}.group-data-\[state\=completed\]\:bg-info:is(:where(.group)[data-state=completed] *){background-color:var(--ui-info)}.group-data-\[state\=completed\]\:bg-inverted:is(:where(.group)[data-state=completed] *){background-color:var(--ui-bg-inverted)}.group-data-\[state\=completed\]\:bg-primary:is(:where(.group)[data-state=completed] *){background-color:var(--ui-primary)}.group-data-\[state\=completed\]\:bg-secondary:is(:where(.group)[data-state=completed] *){background-color:var(--ui-secondary)}.group-data-\[state\=completed\]\:bg-success:is(:where(.group)[data-state=completed] *){background-color:var(--ui-success)}.group-data-\[state\=completed\]\:bg-warning:is(:where(.group)[data-state=completed] *){background-color:var(--ui-warning)}.group-data-\[state\=completed\]\:text-inverted:is(:where(.group)[data-state=completed] *){color:var(--ui-text-inverted)}.group-data-\[state\=open\]\:rotate-90:is(:where(.group)[data-state=open] *){rotate:90deg}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[state\=open\]\:text-default:is(:where(.group)[data-state=open] *){color:var(--ui-text)}.group-data-\[state\=open\]\:text-error:is(:where(.group)[data-state=open] *){color:var(--ui-error)}.group-data-\[state\=open\]\:text-highlighted:is(:where(.group)[data-state=open] *){color:var(--ui-text-highlighted)}.group-data-\[state\=open\]\:text-info:is(:where(.group)[data-state=open] *){color:var(--ui-info)}.group-data-\[state\=open\]\:text-primary:is(:where(.group)[data-state=open] *){color:var(--ui-primary)}.group-data-\[state\=open\]\:text-secondary:is(:where(.group)[data-state=open] *){color:var(--ui-secondary)}.group-data-\[state\=open\]\:text-success:is(:where(.group)[data-state=open] *){color:var(--ui-success)}.group-data-\[state\=open\]\:text-warning:is(:where(.group)[data-state=open] *){color:var(--ui-warning)}.group-data-\[state\=open\]\:opacity-0:is(:where(.group)[data-state=open] *){opacity:0}.group-data-\[state\=open\]\:opacity-100:is(:where(.group)[data-state=open] *){opacity:1}.group-data-\[state\=unchecked\]\:text-dimmed:is(:where(.group)[data-state=unchecked] *){color:var(--ui-text-dimmed)}.group-data-\[state\=unchecked\]\:opacity-100:is(:where(.group)[data-state=unchecked] *){opacity:1}@media(hover:hover){.peer-hover\:text-highlighted:is(:where(.peer):hover~*){color:var(--ui-text-highlighted)}.peer-hover\:text-toned:is(:where(.peer):hover~*){color:var(--ui-text-toned)}}.peer-focus-visible\:text-highlighted:is(:where(.peer):focus-visible~*){color:var(--ui-text-highlighted)}.peer-focus-visible\:text-toned:is(:where(.peer):focus-visible~*){color:var(--ui-text-toned)}.marker\:text-\(--ui-border-accented\) ::marker{color:var(--ui-border-accented)}.marker\:text-\(--ui-border-accented\)::marker{color:var(--ui-border-accented)}.marker\:text-\(--ui-border-accented\) ::-webkit-details-marker,.marker\:text-\(--ui-border-accented\)::-webkit-details-marker{color:var(--ui-border-accented)}.marker\:text-muted ::marker{color:var(--ui-text-muted)}.marker\:text-muted::marker{color:var(--ui-text-muted)}.marker\:text-muted ::-webkit-details-marker,.marker\:text-muted::-webkit-details-marker{color:var(--ui-text-muted)}.selection\:bg-primary\/20 ::-moz-selection{background-color:var(--ui-primary)}.selection\:bg-primary\/20 ::selection{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.selection\:bg-primary\/20 ::-moz-selection{background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}.selection\:bg-primary\/20 ::selection{background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}}.selection\:bg-primary\/20::-moz-selection{background-color:var(--ui-primary)}.selection\:bg-primary\/20::selection{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.selection\:bg-primary\/20::-moz-selection{background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}.selection\:bg-primary\/20::selection{background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}}.file\:me-1\.5::file-selector-button{margin-inline-end:calc(var(--spacing)*1.5)}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-muted::file-selector-button{color:var(--ui-text-muted)}.file\:outline-none::file-selector-button{--tw-outline-style:none;outline-style:none}.placeholder\:text-dimmed::-moz-placeholder{color:var(--ui-text-dimmed)}.placeholder\:text-dimmed::placeholder{color:var(--ui-text-dimmed)}.before\:pointer-events-none:before{content:var(--tw-content);pointer-events:none}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:-inset-px:before{content:var(--tw-content);inset:-1px}.before\:inset-px:before{content:var(--tw-content);inset:1px}.before\:inset-x-0:before{content:var(--tw-content);inset-inline:calc(var(--spacing)*0)}.before\:inset-x-px:before{content:var(--tw-content);inset-inline:1px}.before\:inset-y-0:before{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.before\:inset-y-px:before{content:var(--tw-content);inset-block:1px}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:-right-1\.5:before{content:var(--tw-content);right:calc(var(--spacing)*-1.5)}.before\:-left-1\.5:before{content:var(--tw-content);left:calc(var(--spacing)*-1.5)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:z-1:before{content:var(--tw-content);z-index:1}.before\:z-2:before{content:var(--tw-content);z-index:2}.before\:z-\[-1\]:before{content:var(--tw-content);z-index:-1}.before\:h-1\/3:before{content:var(--tw-content);height:33.3333%}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-1\/3:before{content:var(--tw-content);width:33.3333%}.before\:w-full:before{content:var(--tw-content);width:100%}.before\:rounded-\[inherit\]:before{border-radius:inherit;content:var(--tw-content)}.before\:rounded-md:before{border-radius:calc(var(--ui-radius)*1.5);content:var(--tw-content)}.before\:bg-elevated:before,.before\:bg-elevated\/75:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-elevated\/75:before{background-color:color-mix(in oklab,var(--ui-bg-elevated) 75%,transparent)}}.before\:bg-error\/10:before{background-color:var(--ui-error);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-error\/10:before{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.before\:bg-info\/10:before{background-color:var(--ui-info);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-info\/10:before{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.before\:bg-primary\/10:before{background-color:var(--ui-primary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-primary\/10:before{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.before\:bg-secondary\/10:before{background-color:var(--ui-secondary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-secondary\/10:before{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.before\:bg-success\/10:before{background-color:var(--ui-success);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-success\/10:before{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.before\:bg-warning\/10:before{background-color:var(--ui-warning);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.before\:bg-warning\/10:before{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.before\:bg-gradient-to-b:before{--tw-gradient-position:to bottom in oklab}.before\:bg-gradient-to-b:before,.before\:bg-gradient-to-r:before{background-image:linear-gradient(var(--tw-gradient-stops));content:var(--tw-content)}.before\:bg-gradient-to-r:before{--tw-gradient-position:to right in oklab}.before\:bg-\[radial-gradient\(var\(--spotlight-size\)_var\(--spotlight-size\)_at_calc\(var\(--spotlight-x\,0px\)\)_calc\(var\(--spotlight-y\,0px\)\)\,var\(--spotlight-color\)\,transparent_70\%\)\]:before{background-image:radial-gradient(var(--spotlight-size) var(--spotlight-size) at calc(var(--spotlight-x,0px)) calc(var(--spotlight-y,0px)),var(--spotlight-color),transparent 70%);content:var(--tw-content)}.before\:from-default:before{content:var(--tw-content);--tw-gradient-from:var(--ui-bg);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.before\:transition-colors:before{content:var(--tw-content);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.before\:content-\[\\\"\\\"\]:before{--tw-content:\"\";content:var(--tw-content)}.not-first-of-type\:before\:me-0\.5:not(:first-of-type):before{content:var(--tw-content);margin-inline-end:calc(var(--spacing)*.5)}.not-first-of-type\:before\:content-\[\'·\'\]:not(:first-of-type):before{--tw-content:"·";content:var(--tw-content)}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);inset-inline:calc(var(--spacing)*0)}.after\:inset-x-2\.5:after{content:var(--tw-content);inset-inline:calc(var(--spacing)*2.5)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.after\:inset-y-0\.5:after{content:var(--tw-content);inset-block:calc(var(--spacing)*.5)}.after\:-start-1\.5:after{content:var(--tw-content);inset-inline-start:calc(var(--spacing)*-1.5)}.after\:right-0:after{content:var(--tw-content);right:calc(var(--spacing)*0)}.after\:-bottom-2:after{bottom:calc(var(--spacing)*-2);content:var(--tw-content)}.after\:bottom-0:after{bottom:calc(var(--spacing)*0);content:var(--tw-content)}.after\:-left-1\.5:after{content:var(--tw-content);left:calc(var(--spacing)*-1.5)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:z-1:after{content:var(--tw-content);z-index:1}.after\:z-2:after{content:var(--tw-content);z-index:2}.after\:ms-0\.5:after{content:var(--tw-content);margin-inline-start:calc(var(--spacing)*.5)}.after\:block:after{content:var(--tw-content);display:block}.after\:hidden:after{content:var(--tw-content);display:none}.after\:size-1:after{content:var(--tw-content);height:calc(var(--spacing)*1);width:calc(var(--spacing)*1)}.after\:size-1\.5:after{content:var(--tw-content);height:calc(var(--spacing)*1.5);width:calc(var(--spacing)*1.5)}.after\:size-2:after{content:var(--tw-content);height:calc(var(--spacing)*2);width:calc(var(--spacing)*2)}.after\:h-1\/3:after{content:var(--tw-content);height:33.3333%}.after\:h-full:after{content:var(--tw-content);height:100%}.after\:h-px:after{content:var(--tw-content);height:1px}.after\:w-1\/3:after{content:var(--tw-content);width:33.3333%}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:w-px:after{content:var(--tw-content);width:1px}.after\:animate-\[carousel-inverse_2s_ease-in-out_infinite\]:after{animation:carousel-inverse 2s ease-in-out infinite;content:var(--tw-content)}.after\:animate-\[carousel_2s_ease-in-out_infinite\]:after{animation:carousel 2s ease-in-out infinite;content:var(--tw-content)}.after\:animate-\[elastic_2s_ease-in-out_infinite\]:after{animation:elastic 2s ease-in-out infinite;content:var(--tw-content)}.after\:animate-\[swing_2s_ease-in-out_infinite\]:after{animation:swing 2s ease-in-out infinite;content:var(--tw-content)}.after\:rounded-full:after{border-radius:3.40282e+38px;content:var(--tw-content)}.after\:bg-default:after{background-color:var(--ui-bg);content:var(--tw-content)}.after\:bg-error:after{background-color:var(--ui-error);content:var(--tw-content)}.after\:bg-info:after{background-color:var(--ui-info);content:var(--tw-content)}.after\:bg-inverted:after{background-color:var(--ui-bg-inverted);content:var(--tw-content)}.after\:bg-primary:after{background-color:var(--ui-primary);content:var(--tw-content)}.after\:bg-secondary:after{background-color:var(--ui-secondary);content:var(--tw-content)}.after\:bg-success:after{background-color:var(--ui-success);content:var(--tw-content)}.after\:bg-warning:after{background-color:var(--ui-warning);content:var(--tw-content)}.after\:bg-gradient-to-l:after{--tw-gradient-position:to left in oklab}.after\:bg-gradient-to-l:after,.after\:bg-gradient-to-t:after{background-image:linear-gradient(var(--tw-gradient-stops));content:var(--tw-content)}.after\:bg-gradient-to-t:after{--tw-gradient-position:to top in oklab}.after\:from-default:after{content:var(--tw-content);--tw-gradient-from:var(--ui-bg);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.after\:to-transparent:after{content:var(--tw-content);--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position))}.after\:text-error:after{color:var(--ui-error);content:var(--tw-content)}.after\:transition-colors:after{content:var(--tw-content);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.after\:content-\[\'\*\'\]:after{--tw-content:"*";content:var(--tw-content)}.after\:content-\[\\\"\\\"\]:after{--tw-content:\"\";content:var(--tw-content)}:is(.\*\:not-last\:after\:absolute>*):not(:last-child):after{content:var(--tw-content);position:absolute}:is(.\*\:not-last\:after\:inset-x-1>*):not(:last-child):after{content:var(--tw-content);inset-inline:calc(var(--spacing)*1)}:is(.\*\:not-last\:after\:bottom-0>*):not(:last-child):after{bottom:calc(var(--spacing)*0);content:var(--tw-content)}:is(.\*\:not-last\:after\:h-px>*):not(:last-child):after{content:var(--tw-content);height:1px}:is(.\*\:not-last\:after\:bg-border>*):not(:last-child):after{background-color:var(--ui-border);content:var(--tw-content)}.first\:me-0:first-child{margin-inline-end:calc(var(--spacing)*0)}.first\:border-s:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}:is(.\*\:first\:mt-0>*):first-child{margin-top:calc(var(--spacing)*0)}:is(.\*\:first\:mt-2\.5>*):first-child{margin-top:calc(var(--spacing)*2.5)}.not-only\:first\:rounded-e-none:not(:only-child):first-child{border-end-end-radius:0;border-start-end-radius:0}.not-only\:first\:rounded-b-none:not(:only-child):first-child{border-bottom-left-radius:0;border-bottom-right-radius:0}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}:is(.\*\:last\:mb-0>*):last-child{margin-bottom:calc(var(--spacing)*0)}.not-only\:last\:rounded-s-none:not(:only-child):last-child{border-end-start-radius:0;border-start-start-radius:0}.not-only\:last\:rounded-t-none:not(:only-child):last-child{border-top-left-radius:0;border-top-right-radius:0}.first-of-type\:rounded-s-lg:first-of-type{border-end-start-radius:calc(var(--ui-radius)*2);border-start-start-radius:calc(var(--ui-radius)*2)}.first-of-type\:rounded-t-lg:first-of-type{border-top-left-radius:calc(var(--ui-radius)*2);border-top-right-radius:calc(var(--ui-radius)*2)}.last-of-type\:rounded-e-lg:last-of-type{border-end-end-radius:calc(var(--ui-radius)*2);border-start-end-radius:calc(var(--ui-radius)*2)}.last-of-type\:rounded-b-lg:last-of-type{border-bottom-left-radius:calc(var(--ui-radius)*2);border-bottom-right-radius:calc(var(--ui-radius)*2)}@media(hover:hover){.hover\:scale-115:hover{--tw-scale-x:115%;--tw-scale-y:115%;--tw-scale-z:115%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-error:hover{border-color:var(--ui-error)}.hover\:border-info:hover{border-color:var(--ui-info)}.hover\:border-inverted:hover{border-color:var(--ui-border-inverted)}.hover\:border-primary:hover{border-color:var(--ui-primary)}.hover\:border-secondary:hover{border-color:var(--ui-secondary)}.hover\:border-success:hover{border-color:var(--ui-success)}.hover\:border-warning:hover{border-color:var(--ui-warning)}.hover\:bg-accented\/75:hover{background-color:var(--ui-bg-accented)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accented\/75:hover{background-color:color-mix(in oklab,var(--ui-bg-accented) 75%,transparent)}}.hover\:bg-default\/10:hover{background-color:var(--ui-bg)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-default\/10:hover{background-color:color-mix(in oklab,var(--ui-bg) 10%,transparent)}}.hover\:bg-elevated:hover,.hover\:bg-elevated\/25:hover{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-elevated\/25:hover{background-color:color-mix(in oklab,var(--ui-bg-elevated) 25%,transparent)}}.hover\:bg-elevated\/50:hover{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-elevated\/50:hover{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.hover\:bg-error\/10:hover{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/10:hover{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.hover\:bg-error\/15:hover{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/15:hover{background-color:color-mix(in oklab,var(--ui-error) 15%,transparent)}}.hover\:bg-error\/75:hover{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/75:hover{background-color:color-mix(in oklab,var(--ui-error) 75%,transparent)}}.hover\:bg-error\/90:hover{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/90:hover{background-color:color-mix(in oklab,var(--ui-error) 90%,transparent)}}.hover\:bg-info\/10:hover{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/10:hover{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.hover\:bg-info\/15:hover{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/15:hover{background-color:color-mix(in oklab,var(--ui-info) 15%,transparent)}}.hover\:bg-info\/75:hover{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/75:hover{background-color:color-mix(in oklab,var(--ui-info) 75%,transparent)}}.hover\:bg-info\/90:hover{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/90:hover{background-color:color-mix(in oklab,var(--ui-info) 90%,transparent)}}.hover\:bg-inverted\/90:hover{background-color:var(--ui-bg-inverted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-inverted\/90:hover{background-color:color-mix(in oklab,var(--ui-bg-inverted) 90%,transparent)}}.hover\:bg-muted:hover{background-color:var(--ui-bg-muted)}.hover\:bg-primary\/10:hover{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.hover\:bg-primary\/15:hover{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab,var(--ui-primary) 15%,transparent)}}.hover\:bg-primary\/75:hover{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/75:hover{background-color:color-mix(in oklab,var(--ui-primary) 75%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--ui-primary) 90%,transparent)}}.hover\:bg-secondary\/10:hover{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/10:hover{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.hover\:bg-secondary\/15:hover{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/15:hover{background-color:color-mix(in oklab,var(--ui-secondary) 15%,transparent)}}.hover\:bg-secondary\/75:hover{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/75:hover{background-color:color-mix(in oklab,var(--ui-secondary) 75%,transparent)}}.hover\:bg-secondary\/90:hover{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--ui-secondary) 90%,transparent)}}.hover\:bg-success\/10:hover{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/10:hover{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.hover\:bg-success\/15:hover{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/15:hover{background-color:color-mix(in oklab,var(--ui-success) 15%,transparent)}}.hover\:bg-success\/75:hover{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/75:hover{background-color:color-mix(in oklab,var(--ui-success) 75%,transparent)}}.hover\:bg-success\/90:hover{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/90:hover{background-color:color-mix(in oklab,var(--ui-success) 90%,transparent)}}.hover\:bg-warning\/10:hover{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/10:hover{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.hover\:bg-warning\/15:hover{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/15:hover{background-color:color-mix(in oklab,var(--ui-warning) 15%,transparent)}}.hover\:bg-warning\/75:hover{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/75:hover{background-color:color-mix(in oklab,var(--ui-warning) 75%,transparent)}}.hover\:bg-warning\/90:hover{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/90:hover{background-color:color-mix(in oklab,var(--ui-warning) 90%,transparent)}}.hover\:text-default:hover{color:var(--ui-text)}.hover\:text-error\/75:hover{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:text-error\/75:hover{color:color-mix(in oklab,var(--ui-error) 75%,transparent)}}.hover\:text-highlighted:hover{color:var(--ui-text-highlighted)}.hover\:text-info\/75:hover{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:text-info\/75:hover{color:color-mix(in oklab,var(--ui-info) 75%,transparent)}}.hover\:text-primary:hover,.hover\:text-primary\/75:hover{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/75:hover{color:color-mix(in oklab,var(--ui-primary) 75%,transparent)}}.hover\:text-secondary\/75:hover{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-secondary\/75:hover{color:color-mix(in oklab,var(--ui-secondary) 75%,transparent)}}.hover\:text-success\/75:hover{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:text-success\/75:hover{color:color-mix(in oklab,var(--ui-success) 75%,transparent)}}.hover\:text-warning\/75:hover{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:text-warning\/75:hover{color:color-mix(in oklab,var(--ui-warning) 75%,transparent)}}.hover\:ring-accented:hover{--tw-ring-color:var(--ui-border-accented)}.hover\:not-data-\[selected\]\:bg-error\/10:hover:not([data-selected]){background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-error\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-error\/20:hover:not([data-selected]){background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-error\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-error) 20%,transparent)}}.hover\:not-data-\[selected\]\:bg-info\/10:hover:not([data-selected]){background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-info\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-info\/20:hover:not([data-selected]){background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-info\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-info) 20%,transparent)}}.hover\:not-data-\[selected\]\:bg-inverted\/10:hover:not([data-selected]){background-color:var(--ui-bg-inverted)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-inverted\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-bg-inverted) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-primary\/10:hover:not([data-selected]){background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-primary\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-primary\/20:hover:not([data-selected]){background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-primary\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}}.hover\:not-data-\[selected\]\:bg-secondary\/10:hover:not([data-selected]){background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-secondary\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-secondary\/20:hover:not([data-selected]){background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-secondary\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-secondary) 20%,transparent)}}.hover\:not-data-\[selected\]\:bg-success\/10:hover:not([data-selected]){background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-success\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-success\/20:hover:not([data-selected]){background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-success\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-success) 20%,transparent)}}.hover\:not-data-\[selected\]\:bg-warning\/10:hover:not([data-selected]){background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-warning\/10:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.hover\:not-data-\[selected\]\:bg-warning\/20:hover:not([data-selected]){background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.hover\:not-data-\[selected\]\:bg-warning\/20:hover:not([data-selected]){background-color:color-mix(in oklab,var(--ui-warning) 20%,transparent)}}.hover\:before\:bg-elevated\/50:hover:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.hover\:before\:bg-elevated\/50:hover:before{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.hover\:after\:bg-\(--ui-border-accented\):hover:after{background-color:var(--ui-border-accented);content:var(--tw-content)}}.focus\:bg-accented:focus,.focus\:bg-accented\/50:focus{background-color:var(--ui-bg-accented)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-accented\/50:focus{background-color:color-mix(in oklab,var(--ui-bg-accented) 50%,transparent)}}.focus\:bg-elevated:focus{background-color:var(--ui-bg-elevated)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-error:focus{--tw-ring-color:var(--ui-error)}.focus\:ring-info:focus{--tw-ring-color:var(--ui-info)}.focus\:ring-inverted:focus{--tw-ring-color:var(--ui-border-inverted)}.focus\:ring-primary:focus{--tw-ring-color:var(--ui-primary)}.focus\:ring-secondary:focus{--tw-ring-color:var(--ui-secondary)}.focus\:ring-success:focus{--tw-ring-color:var(--ui-success)}.focus\:ring-warning:focus{--tw-ring-color:var(--ui-warning)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:focus\:bg-accented:is(:where(.group):hover *):focus{background-color:var(--ui-bg-accented)}}.focus-visible\:z-\[1\]:focus-visible{z-index:1}.focus-visible\:bg-accented\/75:focus-visible{background-color:var(--ui-bg-accented)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-accented\/75:focus-visible{background-color:color-mix(in oklab,var(--ui-bg-accented) 75%,transparent)}}.focus-visible\:bg-default\/10:focus-visible{background-color:var(--ui-bg)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-default\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-bg) 10%,transparent)}}.focus-visible\:bg-elevated:focus-visible{background-color:var(--ui-bg-elevated)}.focus-visible\:bg-error\/10:focus-visible{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-error\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.focus-visible\:bg-error\/15:focus-visible{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-error\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-error) 15%,transparent)}}.focus-visible\:bg-info\/10:focus-visible{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-info\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.focus-visible\:bg-info\/15:focus-visible{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-info\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-info) 15%,transparent)}}.focus-visible\:bg-primary\/10:focus-visible{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-primary\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.focus-visible\:bg-primary\/15:focus-visible{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-primary\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-primary) 15%,transparent)}}.focus-visible\:bg-secondary\/10:focus-visible{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-secondary\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.focus-visible\:bg-secondary\/15:focus-visible{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-secondary\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-secondary) 15%,transparent)}}.focus-visible\:bg-success\/10:focus-visible{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-success\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.focus-visible\:bg-success\/15:focus-visible{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-success\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-success) 15%,transparent)}}.focus-visible\:bg-warning\/10:focus-visible{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-warning\/10:focus-visible{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.focus-visible\:bg-warning\/15:focus-visible{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-warning\/15:focus-visible{background-color:color-mix(in oklab,var(--ui-warning) 15%,transparent)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-error:focus-visible{--tw-ring-color:var(--ui-error)}.focus-visible\:ring-info:focus-visible{--tw-ring-color:var(--ui-info)}.focus-visible\:ring-inverted:focus-visible{--tw-ring-color:var(--ui-border-inverted)}.focus-visible\:ring-primary:focus-visible{--tw-ring-color:var(--ui-primary)}.focus-visible\:ring-secondary:focus-visible{--tw-ring-color:var(--ui-secondary)}.focus-visible\:ring-success:focus-visible{--tw-ring-color:var(--ui-success)}.focus-visible\:ring-warning:focus-visible{--tw-ring-color:var(--ui-warning)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-error:focus-visible,.focus-visible\:outline-error\/50:focus-visible{outline-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-error\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.focus-visible\:outline-info:focus-visible,.focus-visible\:outline-info\/50:focus-visible{outline-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-info\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.focus-visible\:outline-inverted:focus-visible,.focus-visible\:outline-inverted\/50:focus-visible{outline-color:var(--ui-border-inverted)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-inverted\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-border-inverted) 50%,transparent)}}.focus-visible\:outline-primary:focus-visible,.focus-visible\:outline-primary\/50:focus-visible{outline-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-primary\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.focus-visible\:outline-secondary:focus-visible,.focus-visible\:outline-secondary\/50:focus-visible{outline-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-secondary\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.focus-visible\:outline-success:focus-visible,.focus-visible\:outline-success\/50:focus-visible{outline-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-success\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.focus-visible\:outline-warning:focus-visible,.focus-visible\:outline-warning\/50:focus-visible{outline-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:outline-warning\/50:focus-visible{outline-color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:before\:ring-2:focus-visible:before{content:var(--tw-content);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:before\:ring-error:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-error)}.focus-visible\:before\:ring-info:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-info)}.focus-visible\:before\:ring-inverted:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-border-inverted)}.focus-visible\:before\:ring-primary:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-primary)}.focus-visible\:before\:ring-secondary:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-secondary)}.focus-visible\:before\:ring-success:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-success)}.focus-visible\:before\:ring-warning:focus-visible:before{content:var(--tw-content);--tw-ring-color:var(--ui-warning)}.focus-visible\:before\:ring-inset:focus-visible:before{content:var(--tw-content);--tw-ring-inset:inset}.active\:bg-accented\/75:active{background-color:var(--ui-bg-accented)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accented\/75:active{background-color:color-mix(in oklab,var(--ui-bg-accented) 75%,transparent)}}.active\:bg-elevated:active{background-color:var(--ui-bg-elevated)}.active\:bg-error\/10:active{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.active\:bg-error\/10:active{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.active\:bg-error\/15:active{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.active\:bg-error\/15:active{background-color:color-mix(in oklab,var(--ui-error) 15%,transparent)}}.active\:bg-error\/75:active{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.active\:bg-error\/75:active{background-color:color-mix(in oklab,var(--ui-error) 75%,transparent)}}.active\:bg-info\/10:active{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.active\:bg-info\/10:active{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.active\:bg-info\/15:active{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.active\:bg-info\/15:active{background-color:color-mix(in oklab,var(--ui-info) 15%,transparent)}}.active\:bg-info\/75:active{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.active\:bg-info\/75:active{background-color:color-mix(in oklab,var(--ui-info) 75%,transparent)}}.active\:bg-inverted\/90:active{background-color:var(--ui-bg-inverted)}@supports (color:color-mix(in lab,red,red)){.active\:bg-inverted\/90:active{background-color:color-mix(in oklab,var(--ui-bg-inverted) 90%,transparent)}}.active\:bg-primary\/10:active{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-primary\/10:active{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.active\:bg-primary\/15:active{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-primary\/15:active{background-color:color-mix(in oklab,var(--ui-primary) 15%,transparent)}}.active\:bg-primary\/75:active{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-primary\/75:active{background-color:color-mix(in oklab,var(--ui-primary) 75%,transparent)}}.active\:bg-secondary\/10:active{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-secondary\/10:active{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.active\:bg-secondary\/15:active{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-secondary\/15:active{background-color:color-mix(in oklab,var(--ui-secondary) 15%,transparent)}}.active\:bg-secondary\/75:active{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-secondary\/75:active{background-color:color-mix(in oklab,var(--ui-secondary) 75%,transparent)}}.active\:bg-success\/10:active{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-success\/10:active{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.active\:bg-success\/15:active{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-success\/15:active{background-color:color-mix(in oklab,var(--ui-success) 15%,transparent)}}.active\:bg-success\/75:active{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-success\/75:active{background-color:color-mix(in oklab,var(--ui-success) 75%,transparent)}}.active\:bg-warning\/10:active{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.active\:bg-warning\/10:active{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.active\:bg-warning\/15:active{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.active\:bg-warning\/15:active{background-color:color-mix(in oklab,var(--ui-warning) 15%,transparent)}}.active\:bg-warning\/75:active{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.active\:bg-warning\/75:active{background-color:color-mix(in oklab,var(--ui-warning) 75%,transparent)}}.active\:text-default:active{color:var(--ui-text)}.active\:text-error\/75:active{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.active\:text-error\/75:active{color:color-mix(in oklab,var(--ui-error) 75%,transparent)}}.active\:text-info\/75:active{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.active\:text-info\/75:active{color:color-mix(in oklab,var(--ui-info) 75%,transparent)}}.active\:text-primary\/75:active{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.active\:text-primary\/75:active{color:color-mix(in oklab,var(--ui-primary) 75%,transparent)}}.active\:text-secondary\/75:active{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:text-secondary\/75:active{color:color-mix(in oklab,var(--ui-secondary) 75%,transparent)}}.active\:text-success\/75:active{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.active\:text-success\/75:active{color:color-mix(in oklab,var(--ui-success) 75%,transparent)}}.active\:text-warning\/75:active{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.active\:text-warning\/75:active{color:color-mix(in oklab,var(--ui-warning) 75%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-default:disabled{background-color:var(--ui-bg)}.disabled\:bg-elevated:disabled,.disabled\:bg-elevated\/50:disabled{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-elevated\/50:disabled{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.disabled\:bg-error:disabled,.disabled\:bg-error\/10:disabled{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-error\/10:disabled{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.disabled\:bg-info:disabled,.disabled\:bg-info\/10:disabled{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-info\/10:disabled{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.disabled\:bg-inverted:disabled{background-color:var(--ui-bg-inverted)}.disabled\:bg-primary:disabled,.disabled\:bg-primary\/10:disabled{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-primary\/10:disabled{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.disabled\:bg-secondary:disabled,.disabled\:bg-secondary\/10:disabled{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-secondary\/10:disabled{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.disabled\:bg-success:disabled,.disabled\:bg-success\/10:disabled{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-success\/10:disabled{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.disabled\:bg-transparent:disabled{background-color:#0000}.disabled\:bg-warning:disabled,.disabled\:bg-warning\/10:disabled{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-warning\/10:disabled{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.disabled\:text-error:disabled{color:var(--ui-error)}.disabled\:text-info:disabled{color:var(--ui-info)}.disabled\:text-muted:disabled{color:var(--ui-text-muted)}.disabled\:text-primary:disabled{color:var(--ui-primary)}.disabled\:text-secondary:disabled{color:var(--ui-secondary)}.disabled\:text-success:disabled{color:var(--ui-success)}.disabled\:text-warning:disabled{color:var(--ui-warning)}.disabled\:opacity-75:disabled{opacity:.75}@media(hover:hover){.hover\:disabled\:bg-transparent:hover:disabled{background-color:#0000}.disabled\:hover\:text-muted:disabled:hover{color:var(--ui-text-muted)}}.has-focus\:bg-elevated:has(:focus){background-color:var(--ui-bg-elevated)}.has-focus-visible\:z-\[1\]:has(:focus-visible){z-index:1}.has-focus-visible\:border-error:has(:focus-visible){border-color:var(--ui-error)}.has-focus-visible\:border-info:has(:focus-visible){border-color:var(--ui-info)}.has-focus-visible\:border-inverted:has(:focus-visible){border-color:var(--ui-border-inverted)}.has-focus-visible\:border-primary:has(:focus-visible){border-color:var(--ui-primary)}.has-focus-visible\:border-secondary:has(:focus-visible){border-color:var(--ui-secondary)}.has-focus-visible\:border-success:has(:focus-visible){border-color:var(--ui-success)}.has-focus-visible\:border-warning:has(:focus-visible){border-color:var(--ui-warning)}.has-focus-visible\:ring-2:has(:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-focus-visible\:ring-error:has(:focus-visible){--tw-ring-color:var(--ui-error)}.has-focus-visible\:ring-info:has(:focus-visible){--tw-ring-color:var(--ui-info)}.has-focus-visible\:ring-inverted:has(:focus-visible){--tw-ring-color:var(--ui-border-inverted)}.has-focus-visible\:ring-primary:has(:focus-visible){--tw-ring-color:var(--ui-primary)}.has-focus-visible\:ring-secondary:has(:focus-visible){--tw-ring-color:var(--ui-secondary)}.has-focus-visible\:ring-success:has(:focus-visible){--tw-ring-color:var(--ui-success)}.has-focus-visible\:ring-warning:has(:focus-visible){--tw-ring-color:var(--ui-warning)}.has-focus-visible\:ring-inset:has(:focus-visible){--tw-ring-inset:inset}.has-data-\[state\=checked\]\:z-\[1\]:has([data-state=checked]){z-index:1}.has-data-\[state\=checked\]\:border-error:has([data-state=checked]),.has-data-\[state\=checked\]\:border-error\/50:has([data-state=checked]){border-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-error\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.has-data-\[state\=checked\]\:border-info:has([data-state=checked]),.has-data-\[state\=checked\]\:border-info\/50:has([data-state=checked]){border-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-info\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.has-data-\[state\=checked\]\:border-inverted:has([data-state=checked]),.has-data-\[state\=checked\]\:border-inverted\/50:has([data-state=checked]){border-color:var(--ui-border-inverted)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-inverted\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-border-inverted) 50%,transparent)}}.has-data-\[state\=checked\]\:border-primary:has([data-state=checked]),.has-data-\[state\=checked\]\:border-primary\/50:has([data-state=checked]){border-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-primary\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.has-data-\[state\=checked\]\:border-secondary:has([data-state=checked]),.has-data-\[state\=checked\]\:border-secondary\/50:has([data-state=checked]){border-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-secondary\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.has-data-\[state\=checked\]\:border-success:has([data-state=checked]),.has-data-\[state\=checked\]\:border-success\/50:has([data-state=checked]){border-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-success\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.has-data-\[state\=checked\]\:border-warning:has([data-state=checked]),.has-data-\[state\=checked\]\:border-warning\/50:has([data-state=checked]){border-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:border-warning\/50:has([data-state=checked]){border-color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.has-data-\[state\=checked\]\:bg-elevated:has([data-state=checked]){background-color:var(--ui-bg-elevated)}.has-data-\[state\=checked\]\:bg-error\/10:has([data-state=checked]){background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-error\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.has-data-\[state\=checked\]\:bg-info\/10:has([data-state=checked]){background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-info\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.has-data-\[state\=checked\]\:bg-primary\/10:has([data-state=checked]){background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-primary\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.has-data-\[state\=checked\]\:bg-secondary\/10:has([data-state=checked]){background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-secondary\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.has-data-\[state\=checked\]\:bg-success\/10:has([data-state=checked]){background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-success\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.has-data-\[state\=checked\]\:bg-warning\/10:has([data-state=checked]){background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-warning\/10:has([data-state=checked]){background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.focus-visible\:has-\[\>code\]\:outline-0:focus-visible:has(>code){outline-style:var(--tw-outline-style);outline-width:0}.aria-disabled\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.aria-disabled\:bg-default[aria-disabled=true]{background-color:var(--ui-bg)}.aria-disabled\:bg-elevated[aria-disabled=true]{background-color:var(--ui-bg-elevated)}.aria-disabled\:bg-error[aria-disabled=true],.aria-disabled\:bg-error\/10[aria-disabled=true]{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-error\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.aria-disabled\:bg-info[aria-disabled=true],.aria-disabled\:bg-info\/10[aria-disabled=true]{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-info\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.aria-disabled\:bg-inverted[aria-disabled=true]{background-color:var(--ui-bg-inverted)}.aria-disabled\:bg-primary[aria-disabled=true],.aria-disabled\:bg-primary\/10[aria-disabled=true]{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-primary\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.aria-disabled\:bg-secondary[aria-disabled=true],.aria-disabled\:bg-secondary\/10[aria-disabled=true]{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-secondary\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.aria-disabled\:bg-success[aria-disabled=true],.aria-disabled\:bg-success\/10[aria-disabled=true]{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-success\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.aria-disabled\:bg-transparent[aria-disabled=true]{background-color:#0000}.aria-disabled\:bg-warning[aria-disabled=true],.aria-disabled\:bg-warning\/10[aria-disabled=true]{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.aria-disabled\:bg-warning\/10[aria-disabled=true]{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.aria-disabled\:text-error[aria-disabled=true]{color:var(--ui-error)}.aria-disabled\:text-info[aria-disabled=true]{color:var(--ui-info)}.aria-disabled\:text-muted[aria-disabled=true]{color:var(--ui-text-muted)}.aria-disabled\:text-primary[aria-disabled=true]{color:var(--ui-primary)}.aria-disabled\:text-secondary[aria-disabled=true]{color:var(--ui-secondary)}.aria-disabled\:text-success[aria-disabled=true]{color:var(--ui-success)}.aria-disabled\:text-warning[aria-disabled=true]{color:var(--ui-warning)}.aria-disabled\:opacity-75[aria-disabled=true]{opacity:.75}@media(hover:hover){.hover\:aria-disabled\:bg-transparent:hover[aria-disabled=true]{background-color:#0000}}.data-disabled\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-disabled\:text-muted[data-disabled]{color:var(--ui-text-muted)}.data-disabled\:opacity-75[data-disabled]{opacity:.75}.data-highlighted\:text-error[data-highlighted]{color:var(--ui-error)}.data-highlighted\:text-highlighted[data-highlighted]{color:var(--ui-text-highlighted)}.data-highlighted\:text-info[data-highlighted]{color:var(--ui-info)}.data-highlighted\:text-primary[data-highlighted]{color:var(--ui-primary)}.data-highlighted\:text-secondary[data-highlighted]{color:var(--ui-secondary)}.data-highlighted\:text-success[data-highlighted]{color:var(--ui-success)}.data-highlighted\:text-warning[data-highlighted]{color:var(--ui-warning)}.data-highlighted\:not-data-disabled\:text-highlighted[data-highlighted]:not([data-disabled]){color:var(--ui-text-highlighted)}.data-highlighted\:before\:bg-elevated\/50[data-highlighted]:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-elevated\/50[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.data-highlighted\:before\:bg-error\/10[data-highlighted]:before{background-color:var(--ui-error);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-error\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.data-highlighted\:before\:bg-info\/10[data-highlighted]:before{background-color:var(--ui-info);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-info\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.data-highlighted\:before\:bg-primary\/10[data-highlighted]:before{background-color:var(--ui-primary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-primary\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.data-highlighted\:before\:bg-secondary\/10[data-highlighted]:before{background-color:var(--ui-secondary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-secondary\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.data-highlighted\:before\:bg-success\/10[data-highlighted]:before{background-color:var(--ui-success);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-success\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.data-highlighted\:before\:bg-warning\/10[data-highlighted]:before{background-color:var(--ui-warning);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:before\:bg-warning\/10[data-highlighted]:before{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.data-highlighted\:not-data-disabled\:before\:bg-elevated\/50[data-highlighted]:not([data-disabled]):before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-highlighted\:not-data-disabled\:before\:bg-elevated\/50[data-highlighted]:not([data-disabled]):before{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.data-invalid\:text-error[data-invalid]{color:var(--ui-error)}.data-placeholder\:text-dimmed[data-placeholder]{color:var(--ui-text-dimmed)}.data-today\:font-semibold[data-today]{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.data-today\:not-data-\[selected\]\:text-error[data-today]:not([data-selected]){color:var(--ui-error)}.data-today\:not-data-\[selected\]\:text-highlighted[data-today]:not([data-selected]){color:var(--ui-text-highlighted)}.data-today\:not-data-\[selected\]\:text-info[data-today]:not([data-selected]){color:var(--ui-info)}.data-today\:not-data-\[selected\]\:text-primary[data-today]:not([data-selected]){color:var(--ui-primary)}.data-today\:not-data-\[selected\]\:text-secondary[data-today]:not([data-selected]){color:var(--ui-secondary)}.data-today\:not-data-\[selected\]\:text-success[data-today]:not([data-selected]){color:var(--ui-success)}.data-today\:not-data-\[selected\]\:text-warning[data-today]:not([data-selected]){color:var(--ui-warning)}.data-unavailable\:pointer-events-none[data-unavailable]{pointer-events:none}.data-unavailable\:text-muted[data-unavailable]{color:var(--ui-text-muted)}.data-unavailable\:line-through[data-unavailable]{text-decoration-line:line-through}.data-\[disabled\]\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-\[disabled\]\:opacity-75[data-disabled]{opacity:.75}.data-\[dragging\=true\]\:bg-elevated\/25[data-dragging=true]{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.data-\[dragging\=true\]\:bg-elevated\/25[data-dragging=true]{background-color:color-mix(in oklab,var(--ui-bg-elevated) 25%,transparent)}}.data-\[expanded\=true\]\:h-\(--height\)[data-expanded=true]{height:var(--height)}:is(.data-\[front\=false\]\:\*\:transition-opacity[data-front=false]>*){transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}:is(.data-\[front\=false\]\:\*\:duration-100[data-front=false]>*){--tw-duration:.1s;transition-duration:.1s}.data-\[expanded\=false\]\:data-\[front\=false\]\:h-\(--front-height\)[data-expanded=false][data-front=false]{height:var(--front-height)}:is(.data-\[expanded\=false\]\:data-\[front\=false\]\:\*\:opacity-0[data-expanded=false][data-front=false]>*){opacity:0}.data-\[highlighted\]\:bg-error\/10[data-highlighted]{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-error\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.data-\[highlighted\]\:bg-error\/20[data-highlighted]{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-error\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-error) 20%,transparent)}}.data-\[highlighted\]\:bg-info\/10[data-highlighted]{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-info\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.data-\[highlighted\]\:bg-info\/20[data-highlighted]{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-info\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-info) 20%,transparent)}}.data-\[highlighted\]\:bg-inverted\/10[data-highlighted]{background-color:var(--ui-bg-inverted)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-inverted\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-bg-inverted) 10%,transparent)}}.data-\[highlighted\]\:bg-inverted\/20[data-highlighted]{background-color:var(--ui-bg-inverted)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-inverted\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-bg-inverted) 20%,transparent)}}.data-\[highlighted\]\:bg-primary\/10[data-highlighted]{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-primary\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.data-\[highlighted\]\:bg-primary\/20[data-highlighted]{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-primary\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}}.data-\[highlighted\]\:bg-secondary\/10[data-highlighted]{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-secondary\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.data-\[highlighted\]\:bg-secondary\/20[data-highlighted]{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-secondary\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-secondary) 20%,transparent)}}.data-\[highlighted\]\:bg-success\/10[data-highlighted]{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-success\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.data-\[highlighted\]\:bg-success\/20[data-highlighted]{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-success\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-success) 20%,transparent)}}.data-\[highlighted\]\:bg-warning\/10[data-highlighted]{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-warning\/10[data-highlighted]{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.data-\[highlighted\]\:bg-warning\/20[data-highlighted]{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.data-\[highlighted\]\:bg-warning\/20[data-highlighted]{background-color:color-mix(in oklab,var(--ui-warning) 20%,transparent)}}.data-\[motion\=from-end\]\:animate-\[enter-from-right_200ms_ease\][data-motion=from-end]{animation:enter-from-right .2s}.data-\[motion\=from-start\]\:animate-\[enter-from-left_200ms_ease\][data-motion=from-start]{animation:enter-from-left .2s}.data-\[motion\=to-end\]\:animate-\[exit-to-right_200ms_ease\][data-motion=to-end]{animation:exit-to-right .2s}.data-\[motion\=to-start\]\:animate-\[exit-to-left_200ms_ease\][data-motion=to-start]{animation:exit-to-left .2s}.data-\[outside-view\]\:text-muted[data-outside-view]{color:var(--ui-text-muted)}.data-\[segment\=day\]\:w-6[data-segment=day]{width:calc(var(--spacing)*6)}.data-\[segment\=day\]\:w-7[data-segment=day]{width:calc(var(--spacing)*7)}.data-\[segment\=day\]\:w-8[data-segment=day]{width:calc(var(--spacing)*8)}.data-\[segment\=literal\]\:text-muted[data-segment=literal]{color:var(--ui-text-muted)}.data-\[segment\=month\]\:w-6[data-segment=month]{width:calc(var(--spacing)*6)}.data-\[segment\=month\]\:w-7[data-segment=month]{width:calc(var(--spacing)*7)}.data-\[segment\=month\]\:w-8[data-segment=month]{width:calc(var(--spacing)*8)}.data-\[segment\=year\]\:w-9[data-segment=year]{width:calc(var(--spacing)*9)}.data-\[segment\=year\]\:w-11[data-segment=year]{width:calc(var(--spacing)*11)}.data-\[segment\=year\]\:w-13[data-segment=year]{width:calc(var(--spacing)*13)}.data-\[selected\]\:bg-default[data-selected]{background-color:var(--ui-bg)}.data-\[selected\]\:bg-elevated[data-selected]{background-color:var(--ui-bg-elevated)}.data-\[selected\]\:bg-error[data-selected],.data-\[selected\]\:bg-error\/10[data-selected]{background-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-error\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.data-\[selected\]\:bg-info[data-selected],.data-\[selected\]\:bg-info\/10[data-selected]{background-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-info\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.data-\[selected\]\:bg-inverted[data-selected]{background-color:var(--ui-bg-inverted)}.data-\[selected\]\:bg-primary[data-selected],.data-\[selected\]\:bg-primary\/10[data-selected]{background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-primary\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.data-\[selected\]\:bg-secondary[data-selected],.data-\[selected\]\:bg-secondary\/10[data-selected]{background-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-secondary\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.data-\[selected\]\:bg-success[data-selected],.data-\[selected\]\:bg-success\/10[data-selected]{background-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-success\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.data-\[selected\]\:bg-warning[data-selected],.data-\[selected\]\:bg-warning\/10[data-selected]{background-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:bg-warning\/10[data-selected]{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.data-\[selected\]\:text-default[data-selected]{color:var(--ui-text)}.data-\[selected\]\:text-error[data-selected]{color:var(--ui-error)}.data-\[selected\]\:text-info[data-selected]{color:var(--ui-info)}.data-\[selected\]\:text-inverted[data-selected]{color:var(--ui-text-inverted)}.data-\[selected\]\:text-primary[data-selected]{color:var(--ui-primary)}.data-\[selected\]\:text-secondary[data-selected]{color:var(--ui-secondary)}.data-\[selected\]\:text-success[data-selected]{color:var(--ui-success)}.data-\[selected\]\:text-warning[data-selected]{color:var(--ui-warning)}.data-\[selected\]\:ring[data-selected]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[selected\]\:ring-accented[data-selected]{--tw-ring-color:var(--ui-border-accented)}.data-\[selected\]\:ring-error\/25[data-selected]{--tw-ring-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-error\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-error) 25%,transparent)}}.data-\[selected\]\:ring-error\/50[data-selected]{--tw-ring-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-error\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.data-\[selected\]\:ring-info\/25[data-selected]{--tw-ring-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-info\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-info) 25%,transparent)}}.data-\[selected\]\:ring-info\/50[data-selected]{--tw-ring-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-info\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.data-\[selected\]\:ring-primary\/25[data-selected]{--tw-ring-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-primary\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-primary) 25%,transparent)}}.data-\[selected\]\:ring-primary\/50[data-selected]{--tw-ring-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-primary\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.data-\[selected\]\:ring-secondary\/25[data-selected]{--tw-ring-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-secondary\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-secondary) 25%,transparent)}}.data-\[selected\]\:ring-secondary\/50[data-selected]{--tw-ring-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-secondary\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.data-\[selected\]\:ring-success\/25[data-selected]{--tw-ring-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-success\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-success) 25%,transparent)}}.data-\[selected\]\:ring-success\/50[data-selected]{--tw-ring-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-success\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.data-\[selected\]\:ring-warning\/25[data-selected]{--tw-ring-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-warning\/25[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-warning) 25%,transparent)}}.data-\[selected\]\:ring-warning\/50[data-selected]{--tw-ring-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\]\:ring-warning\/50[data-selected]{--tw-ring-color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.data-\[selected\]\:ring-inset[data-selected]{--tw-ring-inset:inset}.data-\[selected\=true\]\:bg-elevated\/50[data-selected=true]{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.data-\[selected\=true\]\:bg-elevated\/50[data-selected=true]{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.data-\[state\=\\\"active\\\"\]\:bg-accented[data-state='"active"']{background-color:var(--ui-bg-accented)}.data-\[state\=active\]\:bg-inverted[data-state=active]{background-color:var(--ui-bg-inverted)}.data-\[state\=active\]\:text-error[data-state=active]{color:var(--ui-error)}.data-\[state\=active\]\:text-highlighted[data-state=active]{color:var(--ui-text-highlighted)}.data-\[state\=active\]\:text-info[data-state=active]{color:var(--ui-info)}.data-\[state\=active\]\:text-inverted[data-state=active]{color:var(--ui-text-inverted)}.data-\[state\=active\]\:text-primary[data-state=active]{color:var(--ui-primary)}.data-\[state\=active\]\:text-secondary[data-state=active]{color:var(--ui-secondary)}.data-\[state\=active\]\:text-success[data-state=active]{color:var(--ui-success)}.data-\[state\=active\]\:text-warning[data-state=active]{color:var(--ui-warning)}.data-\[state\=checked\]\:translate-x-3[data-state=checked]{--tw-translate-x:calc(var(--spacing)*3);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-3\.5[data-state=checked]{--tw-translate-x:calc(var(--spacing)*3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-4\.5[data-state=checked]{--tw-translate-x:calc(var(--spacing)*4.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-error[data-state=checked]{background-color:var(--ui-error)}.data-\[state\=checked\]\:bg-info[data-state=checked]{background-color:var(--ui-info)}.data-\[state\=checked\]\:bg-inverted[data-state=checked]{background-color:var(--ui-bg-inverted)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--ui-primary)}.data-\[state\=checked\]\:bg-secondary[data-state=checked]{background-color:var(--ui-secondary)}.data-\[state\=checked\]\:bg-success[data-state=checked]{background-color:var(--ui-success)}.data-\[state\=checked\]\:bg-warning[data-state=checked]{background-color:var(--ui-warning)}.data-\[state\=closed\]\:animate-\[accordion-up_200ms_ease-out\][data-state=closed]{animation:accordion-up .2s ease-out}.data-\[state\=closed\]\:animate-\[collapsible-up_200ms_ease-out\][data-state=closed]{animation:collapsible-up .2s ease-out}.data-\[state\=closed\]\:animate-\[fade-out_200ms_ease-in\][data-state=closed]{animation:fade-out .2s ease-in}.data-\[state\=closed\]\:animate-\[scale-out_100ms_ease-in\][data-state=closed]{animation:scale-out .1s ease-in}.data-\[state\=closed\]\:animate-\[scale-out_200ms_ease-in\][data-state=closed]{animation:scale-out .2s ease-in}.data-\[state\=closed\]\:animate-\[slide-out-to-bottom_200ms_ease-in-out\][data-state=closed]{animation:slide-out-to-bottom .2s ease-in-out}.data-\[state\=closed\]\:animate-\[slide-out-to-left_200ms_ease-in-out\][data-state=closed]{animation:slide-out-to-left .2s ease-in-out}.data-\[state\=closed\]\:animate-\[slide-out-to-right_200ms_ease-in-out\][data-state=closed]{animation:slide-out-to-right .2s ease-in-out}.data-\[state\=closed\]\:animate-\[slide-out-to-top_200ms_ease-in-out\][data-state=closed]{animation:slide-out-to-top .2s ease-in-out}.data-\[state\=closed\]\:animate-\[toast-closed_200ms_ease-in-out\][data-state=closed]{animation:toast-closed .2s ease-in-out}.data-\[state\=closed\]\:data-\[expanded\=false\]\:data-\[front\=false\]\:animate-\[toast-collapsed-closed_200ms_ease-in-out\][data-state=closed][data-expanded=false][data-front=false]{animation:toast-collapsed-closed .2s ease-in-out}.data-\[state\=collapsed\]\:-right-\(--sidebar-width\)[data-state=collapsed]{right:calc(var(--sidebar-width)*-1)}.data-\[state\=collapsed\]\:-left-\(--sidebar-width\)[data-state=collapsed]{left:calc(var(--sidebar-width)*-1)}.data-\[state\=collapsed\]\:w-\(--sidebar-width-icon\)[data-state=collapsed]{width:var(--sidebar-width-icon)}.data-\[state\=collapsed\]\:w-0[data-state=collapsed]{width:calc(var(--spacing)*0)}.data-\[state\=collapsed\]\:w-\[calc\(var\(--sidebar-width-icon\)\+--spacing\(8\)\)\][data-state=collapsed]{width:calc(var(--sidebar-width-icon) + var(--spacing)*8)}.data-\[state\=collapsed\]\:w-\[calc\(var\(--sidebar-width-icon\)\+--spacing\(8\)\+2px\)\][data-state=collapsed]{width:calc(var(--sidebar-width-icon) + var(--spacing)*8 + 2px)}.data-\[state\=collapsed\]\:cursor-e-resize[data-state=collapsed]{cursor:e-resize}.data-\[state\=collapsed\]\:cursor-w-resize[data-state=collapsed]{cursor:w-resize}.data-\[state\=delayed-open\]\:animate-\[scale-in_100ms_ease-out\][data-state=delayed-open]{animation:scale-in .1s ease-out}.data-\[state\=hidden\]\:animate-\[fade-out_100ms_ease-in\][data-state=hidden]{animation:fade-out .1s ease-in}.data-\[state\=hidden\]\:opacity-0[data-state=hidden]{opacity:0}.data-\[state\=inactive\]\:text-muted[data-state=inactive]{color:var(--ui-text-muted)}@media(hover:hover){.hover\:data-\[state\=inactive\]\:not-disabled\:text-default:hover[data-state=inactive]:not(:disabled){color:var(--ui-text)}}.data-\[state\=indeterminate\]\:animate-\[carousel-inverse-vertical_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:carousel-inverse-vertical 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[carousel-inverse_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:carousel-inverse 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[carousel-vertical_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:carousel-vertical 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[carousel_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:carousel 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[elastic-vertical_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:elastic-vertical 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[elastic_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:elastic 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[swing-vertical_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:swing-vertical 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:animate-\[swing_2s_ease-in-out_infinite\][data-state=indeterminate]{animation:swing 2s ease-in-out infinite}.data-\[state\=open\]\:mb-1\.5[data-state=open]{margin-bottom:calc(var(--spacing)*1.5)}.data-\[state\=open\]\:animate-\[accordion-down_200ms_ease-out\][data-state=open]{animation:accordion-down .2s ease-out}.data-\[state\=open\]\:animate-\[collapsible-down_200ms_ease-out\][data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:animate-\[fade-in_200ms_ease-out\][data-state=open]{animation:fade-in .2s ease-out}.data-\[state\=open\]\:animate-\[scale-in_100ms_ease-out\][data-state=open]{animation:scale-in .1s ease-out}.data-\[state\=open\]\:animate-\[scale-in_200ms_ease-out\][data-state=open]{animation:scale-in .2s ease-out}.data-\[state\=open\]\:animate-\[slide-in-from-bottom_200ms_ease-in-out\][data-state=open]{animation:slide-in-from-bottom .2s ease-in-out}.data-\[state\=open\]\:animate-\[slide-in-from-left_200ms_ease-in-out\][data-state=open]{animation:slide-in-from-left .2s ease-in-out}.data-\[state\=open\]\:animate-\[slide-in-from-right_200ms_ease-in-out\][data-state=open]{animation:slide-in-from-right .2s ease-in-out}.data-\[state\=open\]\:animate-\[slide-in-from-top_200ms_ease-in-out\][data-state=open]{animation:slide-in-from-top .2s ease-in-out}.data-\[state\=open\]\:animate-\[toast-slide-in-from-bottom_200ms_ease-in-out\][data-state=open]{animation:toast-slide-in-from-bottom .2s ease-in-out}.data-\[state\=open\]\:animate-\[toast-slide-in-from-top_200ms_ease-in-out\][data-state=open]{animation:toast-slide-in-from-top .2s ease-in-out}.data-\[state\=open\]\:text-highlighted[data-state=open]{color:var(--ui-text-highlighted)}.data-\[state\=open\]\:before\:bg-elevated\/50[data-state=open]:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-elevated\/50[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}.data-\[state\=open\]\:before\:bg-error\/10[data-state=open]:before{background-color:var(--ui-error);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-error\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-error) 10%,transparent)}}.data-\[state\=open\]\:before\:bg-info\/10[data-state=open]:before{background-color:var(--ui-info);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-info\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-info) 10%,transparent)}}.data-\[state\=open\]\:before\:bg-primary\/10[data-state=open]:before{background-color:var(--ui-primary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-primary\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-primary) 10%,transparent)}}.data-\[state\=open\]\:before\:bg-secondary\/10[data-state=open]:before{background-color:var(--ui-secondary);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-secondary\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-secondary) 10%,transparent)}}.data-\[state\=open\]\:before\:bg-success\/10[data-state=open]:before{background-color:var(--ui-success);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-success\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-success) 10%,transparent)}}.data-\[state\=open\]\:before\:bg-warning\/10[data-state=open]:before{background-color:var(--ui-warning);content:var(--tw-content)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:before\:bg-warning\/10[data-state=open]:before{background-color:color-mix(in oklab,var(--ui-warning) 10%,transparent)}}.data-\[state\=open\]\:data-\[pulsing\=even\]\:animate-\[toast-pulse-b_300ms_ease-out\][data-state=open][data-pulsing=even]{animation:toast-pulse-b .3s ease-out}.data-\[state\=open\]\:data-\[pulsing\=odd\]\:animate-\[toast-pulse-a_300ms_ease-out\][data-state=open][data-pulsing=odd]{animation:toast-pulse-a .3s ease-out}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-accented[data-state=unchecked]{background-color:var(--ui-bg-accented)}.data-\[state\=visible\]\:animate-\[fade-in_100ms_ease-out\][data-state=visible]{animation:fade-in .1s ease-out}.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=cancel\]\:translate-y-0[data-swipe=cancel]{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\(--reka-toast-swipe-end-x\)[data-swipe=end]{--tw-translate-x:var(--reka-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-y-\(--reka-toast-swipe-end-y\)[data-swipe=end]{--tw-translate-y:var(--reka-toast-swipe-end-y);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:animate-\[toast-slide-down_200ms_ease-out\][data-swipe=end]{animation:toast-slide-down .2s ease-out}.data-\[swipe\=end\]\:animate-\[toast-slide-left_200ms_ease-out\][data-swipe=end]{animation:toast-slide-left .2s ease-out}.data-\[swipe\=end\]\:animate-\[toast-slide-right_200ms_ease-out\][data-swipe=end]{animation:toast-slide-right .2s ease-out}.data-\[swipe\=end\]\:animate-\[toast-slide-up_200ms_ease-out\][data-swipe=end]{animation:toast-slide-up .2s ease-out}.data-\[swipe\=move\]\:translate-x-\(--reka-toast-swipe-move-x\)[data-swipe=move]{--tw-translate-x:var(--reka-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-y-\(--reka-toast-swipe-move-y\)[data-swipe=move]{--tw-translate-y:var(--reka-toast-swipe-move-y);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media(min-width:40rem){.sm\:-start-12{inset-inline-start:calc(var(--spacing)*-12)}.sm\:-end-12{inset-inline-end:calc(var(--spacing)*-12)}.sm\:-top-12{top:calc(var(--spacing)*-12)}.sm\:-bottom-12{bottom:calc(var(--spacing)*-12)}.sm\:-mx-6{margin-inline:calc(var(--spacing)*-6)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:h-\[28rem\]{height:28rem}.sm\:max-h-\[calc\(100dvh-4rem\)\]{max-height:calc(100dvh - 4rem)}.sm\:w-\(--reka-navigation-menu-viewport-width\){width:var(--reka-navigation-menu-viewport-width)}.sm\:w-96{width:calc(var(--spacing)*96)}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-96{max-width:calc(var(--spacing)*96)}.sm\:scroll-mt-6{scroll-margin-top:calc(var(--spacing)*6)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:gap-16{gap:calc(var(--spacing)*16)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*0*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*0*var(--tw-space-y-reverse))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*4*var(--tw-space-x-reverse))}.sm\:gap-y-12{row-gap:calc(var(--spacing)*12)}.sm\:gap-y-24{row-gap:calc(var(--spacing)*24)}.sm\:p-0{padding:calc(var(--spacing)*0)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-8{padding-inline:calc(var(--spacing)*8)}.sm\:px-12{padding-inline:calc(var(--spacing)*12)}.sm\:px-80{padding-inline:calc(var(--spacing)*80)}.sm\:py-8{padding-block:calc(var(--spacing)*8)}.sm\:py-24{padding-block:calc(var(--spacing)*24)}.sm\:py-32{padding-block:calc(var(--spacing)*32)}.sm\:pt-6{padding-top:calc(var(--spacing)*6)}.sm\:pb-4\.5{padding-bottom:calc(var(--spacing)*4.5)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-xl\/8{font-size:var(--text-xl);line-height:calc(var(--spacing)*8)}.sm\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.sm\:ring,.sm\:shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.sm\:ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}}@media(min-width:48rem){.md\:hidden{display:none}.md\:table{display:table}.md\:columns-2{-moz-columns:2;column-count:2}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-\(--ui-header-height\){top:var(--ui-header-height)}.lg\:z-\[1\]{z-index:1}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-last{order:9999}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:mx-auto{margin-inline:auto}.lg\:-ms-2{margin-inline-start:calc(var(--spacing)*-2)}.lg\:-ms-4{margin-inline-start:calc(var(--spacing)*-4)}.lg\:ms-0{margin-inline-start:calc(var(--spacing)*0)}.lg\:me-0{margin-inline-end:calc(var(--spacing)*0)}.lg\:mt-0{margin-top:calc(var(--spacing)*0)}.lg\:mt-12{margin-top:calc(var(--spacing)*12)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:inline-flex{display:inline-flex}.lg\:h-\[450px\]{height:450px}.lg\:max-h-\[calc\(100vh-var\(--ui-header-height\)\)\]{max-height:calc(100vh - var(--ui-header-height))}.lg\:w-\(--width\){width:var(--width)}.lg\:w-full{width:100%}.lg\:max-w-xs{max-width:var(--container-xs)}.lg\:flex-1{flex:1}.lg\:scale-\[1\.1\]{scale:1.1}.lg\:scroll-mt-\(--ui-header-height\){scroll-margin-top:var(--ui-header-height)}.lg\:scroll-mt-\[calc\(24px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(24px + var(--ui-header-height))}.lg\:scroll-mt-\[calc\(32px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(32px + var(--ui-header-height))}.lg\:scroll-mt-\[calc\(48px\+var\(--ui-header-height\)\)\]{scroll-margin-top:calc(48px + var(--ui-header-height))}.lg\:columns-3{-moz-columns:3;column-count:3}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-\[repeat\(var\(--count\)\,minmax\(0\,1fr\)\)\]{grid-template-columns:repeat(var(--count),minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:justify-center{justify-content:center}.lg\:justify-end{justify-content:flex-end}.lg\:justify-start{justify-content:flex-start}.lg\:gap-10{gap:calc(var(--spacing)*10)}.lg\:gap-x-3{-moz-column-gap:calc(var(--spacing)*3);column-gap:calc(var(--spacing)*3)}.lg\:gap-x-13{-moz-column-gap:calc(var(--spacing)*13);column-gap:calc(var(--spacing)*13)}.lg\:gap-y-16{row-gap:calc(var(--spacing)*16)}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style)}:where(.lg\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.lg\:border-0{border-style:var(--tw-border-style);border-width:0}.lg\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:bg-\[initial\]{background-color:initial}.lg\:p-6{padding:calc(var(--spacing)*6)}.lg\:p-8{padding:calc(var(--spacing)*8)}.lg\:px-0{padding-inline:calc(var(--spacing)*0)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:px-16{padding-inline:calc(var(--spacing)*16)}.lg\:py-4{padding-block:calc(var(--spacing)*4)}.lg\:py-8{padding-block:calc(var(--spacing)*8)}.lg\:py-12{padding-block:calc(var(--spacing)*12)}.lg\:py-24{padding-block:calc(var(--spacing)*24)}.lg\:py-32{padding-block:calc(var(--spacing)*32)}.lg\:py-40{padding-block:calc(var(--spacing)*40)}.lg\:ps-2{padding-inline-start:calc(var(--spacing)*2)}.lg\:ps-4{padding-inline-start:calc(var(--spacing)*4)}.lg\:pe-6\.5{padding-inline-end:calc(var(--spacing)*6.5)}.lg\:pr-6{padding-right:calc(var(--spacing)*6)}.lg\:pb-0{padding-bottom:calc(var(--spacing)*0)}.lg\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.lg\:opacity-0{opacity:0}.lg\:not-last\:border-e:not(:last-child){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.lg\:not-last\:border-default:not(:last-child){border-color:var(--ui-border)}@media(hover:hover){.lg\:group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:mt-0{margin-top:calc(var(--spacing)*0)}.xl\:mb-0{margin-bottom:calc(var(--spacing)*0)}.xl\:grid{display:grid}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:gap-8{gap:calc(var(--spacing)*8)}.xl\:p-10{padding:calc(var(--spacing)*10)}}.rtl\:right-\[calc\(100\%-var\(--reka-navigation-menu-viewport-left\)-var\(--reka-navigation-menu-viewport-width\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(100% - var(--reka-navigation-menu-viewport-left) - var(--reka-navigation-menu-viewport-width))}.rtl\:left-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:auto}.rtl\:translate-x-\[4px\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:4px;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-scale-x-100:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x:-100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rtl\:-rotate-90:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:-90deg}.rtl\:animate-\[marquee-rtl_var\(--duration\)_linear_infinite\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){animation:marquee-rtl var(--duration) linear infinite}.rtl\:animate-\[marquee-vertical-rtl_var\(--duration\)_linear_infinite\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){animation:marquee-vertical-rtl var(--duration) linear infinite}.rtl\:animate-\[shimmer-rtl_var\(--duration\)_linear_infinite\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){animation:shimmer-rtl var(--duration) linear infinite}.rtl\:text-right:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}.rtl\:after\:animate-\[carousel-inverse-rtl_2s_ease-in-out_infinite\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{animation:carousel-inverse-rtl 2s ease-in-out infinite;content:var(--tw-content)}.rtl\:after\:animate-\[carousel-rtl_2s_ease-in-out_infinite\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{animation:carousel-rtl 2s ease-in-out infinite;content:var(--tw-content)}.data-\[state\=checked\]\:rtl\:-translate-x-3[data-state=checked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-3);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:rtl\:-translate-x-3\.5[data-state=checked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:rtl\:-translate-x-4[data-state=checked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:rtl\:-translate-x-4\.5[data-state=checked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-4.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:rtl\:-translate-x-5[data-state=checked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=indeterminate\]\:rtl\:animate-\[carousel-inverse-rtl_2s_ease-in-out_infinite\][data-state=indeterminate]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){animation:carousel-inverse-rtl 2s ease-in-out infinite}.data-\[state\=indeterminate\]\:rtl\:animate-\[carousel-rtl_2s_ease-in-out_infinite\][data-state=indeterminate]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){animation:carousel-rtl 2s ease-in-out infinite}.data-\[state\=unchecked\]\:rtl\:-translate-x-0[data-state=unchecked]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:block:where(.dark,.dark *){display:block}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:inline-block:where(.dark,.dark *){display:inline-block}.dark\:bg-neutral-800:where(.dark,.dark *){background-color:var(--ui-color-neutral-800)}.dark\:text-error-300:where(.dark,.dark *){color:var(--ui-color-error-300)}.dark\:text-info-300:where(.dark,.dark *){color:var(--ui-color-info-300)}.dark\:text-primary-300:where(.dark,.dark *){color:var(--ui-color-primary-300)}.dark\:text-secondary-300:where(.dark,.dark *){color:var(--ui-color-secondary-300)}.dark\:text-success-300:where(.dark,.dark *){color:var(--ui-color-success-300)}.dark\:text-warning-300:where(.dark,.dark *){color:var(--ui-color-warning-300)}.dark\:focus-visible\:outline-none:where(.dark,.dark *):focus-visible{--tw-outline-style:none;outline-style:none}.dark\:disabled\:bg-transparent:where(.dark,.dark *):disabled{background-color:#0000}@media(hover:hover){.dark\:hover\:disabled\:bg-transparent:where(.dark,.dark *):hover:disabled{background-color:#0000}}.dark\:aria-disabled\:bg-transparent:where(.dark,.dark *)[aria-disabled=true]{background-color:#0000}@media(hover:hover){.dark\:hover\:aria-disabled\:bg-transparent:where(.dark,.dark *):hover[aria-disabled=true]{background-color:#0000}}.\[\&_\.ProseMirror-selectednode\:not\(img\)\:not\(pre\)\:not\(\[data-node-view-wrapper\]\)\]\:bg-primary\/20 .ProseMirror-selectednode:not(img):not(pre):not([data-node-view-wrapper]){background-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&_\.ProseMirror-selectednode\:not\(img\)\:not\(pre\)\:not\(\[data-node-view-wrapper\]\)\]\:bg-primary\/20 .ProseMirror-selectednode:not(img):not(pre):not([data-node-view-wrapper]){background-color:color-mix(in oklab,var(--ui-primary) 20%,transparent)}}.\[\&_\.iconify\]\:mx-0\.5 .iconify{margin-inline:calc(var(--spacing)*.5)}.\[\&_\.iconify\]\:size-4 .iconify{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.\[\&_\.mention\]\:font-medium .mention{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\.mention\]\:text-primary .mention{color:var(--ui-primary)}.\[\&_\:is\(h1\,h2\,h3\,h4\,h5\,h6\)\]\:font-bold :is(h1,h2,h3,h4,h5,h6){--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_\:is\(h1\,h2\,h3\,h4\,h5\,h6\)\]\:text-highlighted :is(h1,h2,h3,h4,h5,h6){color:var(--ui-text-highlighted)}.\[\&_\:is\(h1\,h2\,h3\,h4\,h5\,h6\)\>code\]\:border-dashed :is(h1,h2,h3,h4,h5,h6)>code{--tw-border-style:dashed;border-style:dashed}.\[\&_\:is\(h1\,h2\,h3\,h4\,h5\,h6\)\>code\]\:font-bold :is(h1,h2,h3,h4,h5,h6)>code{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-editor-empty\:first-child\]\:before\:pointer-events-none :is(p,h1,h2,h3,h4,h5,h6).is-editor-empty:first-child:before{content:var(--tw-content);pointer-events:none}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-editor-empty\:first-child\]\:before\:float-start :is(p,h1,h2,h3,h4,h5,h6).is-editor-empty:first-child:before{content:var(--tw-content);float:inline-start}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-editor-empty\:first-child\]\:before\:h-0 :is(p,h1,h2,h3,h4,h5,h6).is-editor-empty:first-child:before{content:var(--tw-content);height:calc(var(--spacing)*0)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-editor-empty\:first-child\]\:before\:text-dimmed :is(p,h1,h2,h3,h4,h5,h6).is-editor-empty:first-child:before{color:var(--ui-text-dimmed);content:var(--tw-content)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-editor-empty\:first-child\]\:before\:content-\[attr\(data-placeholder\)\] :is(p,h1,h2,h3,h4,h5,h6).is-editor-empty:first-child:before{--tw-content:attr(data-placeholder);content:var(--tw-content)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-empty\]\:before\:pointer-events-none :is(p,h1,h2,h3,h4,h5,h6).is-empty:before{content:var(--tw-content);pointer-events:none}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-empty\]\:before\:float-start :is(p,h1,h2,h3,h4,h5,h6).is-empty:before{content:var(--tw-content);float:inline-start}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-empty\]\:before\:h-0 :is(p,h1,h2,h3,h4,h5,h6).is-empty:before{content:var(--tw-content);height:calc(var(--spacing)*0)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-empty\]\:before\:text-dimmed :is(p,h1,h2,h3,h4,h5,h6).is-empty:before{color:var(--ui-text-dimmed);content:var(--tw-content)}.\[\&_\:is\(p\,h1\,h2\,h3\,h4\,h5\,h6\)\.is-empty\]\:before\:content-\[attr\(data-placeholder\)\] :is(p,h1,h2,h3,h4,h5,h6).is-empty:before{--tw-content:attr(data-placeholder);content:var(--tw-content)}.\[\&_\:is\(ul\,ol\)\]\:ps-6 :is(ul,ol){padding-inline-start:calc(var(--spacing)*6)}.\[\&_\[data-type\=horizontalRule\]\]\:my-8 [data-type=horizontalRule]{margin-block:calc(var(--spacing)*8)}.\[\&_\[data-type\=horizontalRule\]\]\:py-2 [data-type=horizontalRule]{padding-block:calc(var(--spacing)*2)}.\[\&_a\]\:border-b a{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_a\]\:border-transparent a{border-color:#0000}.\[\&_a\]\:font-medium a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_a\]\:text-error a{color:var(--ui-error)}.\[\&_a\]\:text-info a{color:var(--ui-info)}.\[\&_a\]\:text-primary a{color:var(--ui-primary)}.\[\&_a\]\:text-secondary a{color:var(--ui-secondary)}.\[\&_a\]\:text-success a{color:var(--ui-success)}.\[\&_a\]\:text-warning a{color:var(--ui-warning)}.\[\&_a\]\:transition-colors a{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media(hover:hover){.\[\&_a\]\:hover\:border-error a:hover{border-color:var(--ui-error)}.\[\&_a\]\:hover\:border-info a:hover{border-color:var(--ui-info)}.\[\&_a\]\:hover\:border-primary a:hover{border-color:var(--ui-primary)}.\[\&_a\]\:hover\:border-secondary a:hover{border-color:var(--ui-secondary)}.\[\&_a\]\:hover\:border-success a:hover{border-color:var(--ui-success)}.\[\&_a\]\:hover\:border-warning a:hover{border-color:var(--ui-warning)}}.\[\&_a\]\:focus-visible\:outline-error a:focus-visible{outline-color:var(--ui-error)}.\[\&_a\]\:focus-visible\:outline-info a:focus-visible{outline-color:var(--ui-info)}.\[\&_a\]\:focus-visible\:outline-primary a:focus-visible{outline-color:var(--ui-primary)}.\[\&_a\]\:focus-visible\:outline-secondary a:focus-visible{outline-color:var(--ui-secondary)}.\[\&_a\]\:focus-visible\:outline-success a:focus-visible{outline-color:var(--ui-success)}.\[\&_a\]\:focus-visible\:outline-warning a:focus-visible{outline-color:var(--ui-warning)}.\[\&_a\:hover\>code\]\:border-primary a:hover>code{border-color:var(--ui-primary)}.\[\&_a\:hover\>code\]\:text-primary a:hover>code{color:var(--ui-primary)}.\[\&_a\>code\]\:border-dashed a>code{--tw-border-style:dashed;border-style:dashed}.\[\&_a\>code\]\:transition-colors a>code{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.\[\&_blockquote\]\:border-s-4 blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.\[\&_blockquote\]\:border-accented blockquote{border-color:var(--ui-border-accented)}.\[\&_blockquote\]\:ps-4 blockquote{padding-inline-start:calc(var(--spacing)*4)}.\[\&_blockquote\]\:italic blockquote{font-style:italic}.\[\&_code\]\:inline-block code{display:inline-block}.\[\&_code\]\:rounded-md code{border-radius:calc(var(--ui-radius)*1.5)}.\[\&_code\]\:border code{border-style:var(--tw-border-style);border-width:1px}.\[\&_code\]\:border-error\/25 code{border-color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-error\/25 code{border-color:color-mix(in oklab,var(--ui-error) 25%,transparent)}}.\[\&_code\]\:border-info\/25 code{border-color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-info\/25 code{border-color:color-mix(in oklab,var(--ui-info) 25%,transparent)}}.\[\&_code\]\:border-muted code{border-color:var(--ui-border-muted)}.\[\&_code\]\:border-primary\/25 code{border-color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-primary\/25 code{border-color:color-mix(in oklab,var(--ui-primary) 25%,transparent)}}.\[\&_code\]\:border-secondary\/25 code{border-color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-secondary\/25 code{border-color:color-mix(in oklab,var(--ui-secondary) 25%,transparent)}}.\[\&_code\]\:border-success\/25 code{border-color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-success\/25 code{border-color:color-mix(in oklab,var(--ui-success) 25%,transparent)}}.\[\&_code\]\:border-warning\/25 code{border-color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.\[\&_code\]\:border-warning\/25 code{border-color:color-mix(in oklab,var(--ui-warning) 25%,transparent)}}.\[\&_code\]\:bg-default code{background-color:var(--ui-bg)}.\[\&_code\]\:bg-muted code{background-color:var(--ui-bg-muted)}.\[\&_code\]\:px-1\.5 code{padding-inline:calc(var(--spacing)*1.5)}.\[\&_code\]\:py-0\.5 code{padding-block:calc(var(--spacing)*.5)}.\[\&_code\]\:font-mono code{font-family:var(--font-mono)}.\[\&_code\]\:text-sm code{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_code\]\:text-xs\/4 code{font-size:var(--text-xs);line-height:calc(var(--spacing)*4)}.\[\&_code\]\:text-xs\/5 code{font-size:var(--text-xs);line-height:calc(var(--spacing)*5)}.\[\&_code\]\:font-medium code{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_code\]\:text-error-600 code{color:var(--ui-color-error-600)}.\[\&_code\]\:text-highlighted code{color:var(--ui-text-highlighted)}.\[\&_code\]\:text-info-600 code{color:var(--ui-color-info-600)}.\[\&_code\]\:text-primary-600 code{color:var(--ui-color-primary-600)}.\[\&_code\]\:text-secondary-600 code{color:var(--ui-color-secondary-600)}.\[\&_code\]\:text-success-600 code{color:var(--ui-color-success-600)}.\[\&_code\]\:text-warning-600 code{color:var(--ui-color-warning-600)}.dark\:\[\&_code\]\:text-error-300:where(.dark,.dark *) code{color:var(--ui-color-error-300)}.dark\:\[\&_code\]\:text-info-300:where(.dark,.dark *) code{color:var(--ui-color-info-300)}.dark\:\[\&_code\]\:text-primary-300:where(.dark,.dark *) code{color:var(--ui-color-primary-300)}.dark\:\[\&_code\]\:text-secondary-300:where(.dark,.dark *) code{color:var(--ui-color-secondary-300)}.dark\:\[\&_code\]\:text-success-300:where(.dark,.dark *) code{color:var(--ui-color-success-300)}.dark\:\[\&_code\]\:text-warning-300:where(.dark,.dark *) code{color:var(--ui-color-warning-300)}.\[\&_h1\]\:text-3xl h1{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.\[\&_h2\]\:text-2xl h2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.\[\&_h2\>code\]\:text-xl\/6 h2>code{font-size:var(--text-xl);line-height:calc(var(--spacing)*6)}.\[\&_h3\]\:text-xl h3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\[\&_h3\>code\]\:text-lg\/5 h3>code{font-size:var(--text-lg);line-height:calc(var(--spacing)*5)}.\[\&_h4\]\:text-lg h4{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.\[\&_h5\]\:text-base h5,.\[\&_h6\]\:text-base h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_hr\]\:border-t hr{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&_hr\]\:border-default hr{border-color:var(--ui-border)}.\[\&_img\]\:block img{display:block}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_img\]\:rounded-md img{border-radius:calc(var(--ui-radius)*1.5)}.\[\&_img\.ProseMirror-selectednode\]\:outline-2 img.ProseMirror-selectednode{outline-style:var(--tw-outline-style);outline-width:2px}.\[\&_img\.ProseMirror-selectednode\]\:outline-primary img.ProseMirror-selectednode{outline-color:var(--ui-primary)}.\[\&_li\]\:my-0 li{margin-block:calc(var(--spacing)*0)}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing)*.5)}.\[\&_li\]\:my-1\.5 li{margin-block:calc(var(--spacing)*1.5)}.\[\&_li\]\:ps-1\.5 li{padding-inline-start:calc(var(--spacing)*1.5)}.\[\&_li\]\:leading-6 li{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.\[\&_ol\]\:my-0 ol{margin-block:calc(var(--spacing)*0)}.\[\&_ol\]\:my-2\.5 ol{margin-block:calc(var(--spacing)*2.5)}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:ps-4\.5 ol{padding-inline-start:calc(var(--spacing)*4.5)}.\[\&_ol\]\:marker\:text-muted ol ::marker{color:var(--ui-text-muted)}.\[\&_ol\]\:marker\:text-muted ol::marker{color:var(--ui-text-muted)}.\[\&_ol\]\:marker\:text-muted ol ::-webkit-details-marker,.\[\&_ol\]\:marker\:text-muted ol::-webkit-details-marker{color:var(--ui-text-muted)}.\[\&_p\]\:my-0 p{margin-block:calc(var(--spacing)*0)}.\[\&_p\]\:leading-6 p{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.\[\&_p\]\:leading-7 p{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.\[\&_pre\]\:h-\[200px\] pre{height:200px}.\[\&_pre\]\:h-auto pre{height:auto}.\[\&_pre\]\:max-h-\[80vh\] pre{max-height:80vh}.\[\&_pre\]\:min-h-\[200px\] pre{min-height:200px}.\[\&_pre\]\:overflow-hidden pre{overflow:hidden}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded-md pre{border-radius:calc(var(--ui-radius)*1.5)}.\[\&_pre\]\:border pre{border-style:var(--tw-border-style);border-width:1px}.\[\&_pre\]\:border-muted pre{border-color:var(--ui-border-muted)}.\[\&_pre\]\:bg-default pre{background-color:var(--ui-bg)}.\[\&_pre\]\:bg-muted pre{background-color:var(--ui-bg-muted)}.\[\&_pre\]\:px-4 pre{padding-inline:calc(var(--spacing)*4)}.\[\&_pre\]\:py-3 pre{padding-block:calc(var(--spacing)*3)}.\[\&_pre\]\:pb-12 pre{padding-bottom:calc(var(--spacing)*12)}.\[\&_pre\]\:text-sm\/6 pre{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.\[\&_pre\]\:break-words pre{overflow-wrap:break-word}.\[\&_pre\]\:whitespace-pre-wrap pre{white-space:pre-wrap}.\[\&_pre_code\]\:inline pre code{display:inline}.\[\&_pre_code\]\:rounded-none pre code{border-radius:0}.\[\&_pre_code\]\:border-0 pre code{border-style:var(--tw-border-style);border-width:0}.\[\&_pre_code\]\:bg-transparent pre code{background-color:#0000}.\[\&_pre_code\]\:p-0 pre code{padding:calc(var(--spacing)*0)}.\[\&_pre_code\]\:text-inherit pre code{color:inherit}.\[\&_ul\]\:my-0 ul{margin-block:calc(var(--spacing)*0)}.\[\&_ul\]\:my-2\.5 ul{margin-block:calc(var(--spacing)*2.5)}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:ps-4\.5 ul{padding-inline-start:calc(var(--spacing)*4.5)}.\[\&_ul\]\:marker\:text-\(--ui-border-accented\) ul ::marker{color:var(--ui-border-accented)}.\[\&_ul\]\:marker\:text-\(--ui-border-accented\) ul::marker{color:var(--ui-border-accented)}.\[\&_ul\]\:marker\:text-\(--ui-border-accented\) ul ::-webkit-details-marker,.\[\&_ul\]\:marker\:text-\(--ui-border-accented\) ul::-webkit-details-marker{color:var(--ui-border-accented)}.\[\&\:first-child\>th\:first-child\]\:rounded-tl-md:first-child>th:first-child{border-top-left-radius:calc(var(--ui-radius)*1.5)}.\[\&\:first-child\>th\:last-child\]\:rounded-tr-md:first-child>th:last-child{border-top-right-radius:calc(var(--ui-radius)*1.5)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pe-0:has([role=checkbox]){padding-inline-end:calc(var(--spacing)*0)}:is(.\*\*\:\[\.line\]\:block *).line{display:block}:is(.\*\*\:\[\.line\.highlight\]\:-mx-4 *).line.highlight{margin-inline:calc(var(--spacing)*-4)}:is(.\*\*\:\[\.line\.highlight\]\:bg-accented\/50\! *).line.highlight{background-color:var(--ui-bg-accented)!important}@supports (color:color-mix(in lab,red,red)){:is(.\*\*\:\[\.line\.highlight\]\:bg-accented\/50\! *).line.highlight{background-color:color-mix(in oklab,var(--ui-bg-accented) 50%,transparent)!important}}:is(.\*\*\:\[\.line\.highlight\]\:px-4 *).line.highlight{padding-inline:calc(var(--spacing)*4)}.\[\&\:last-child\>td\:first-child\]\:rounded-bl-md:last-child>td:first-child{border-bottom-left-radius:calc(var(--ui-radius)*1.5)}.\[\&\:last-child\>td\:last-child\]\:rounded-br-md:last-child>td:last-child{border-bottom-right-radius:calc(var(--ui-radius)*1.5)}.\[\&\>\*\]\:last\:\!mb-0>:last-child{margin-bottom:calc(var(--spacing)*0)!important}.\[\&\>\*\:first-child\]\:col-start-2>:first-child{grid-column-start:2}.\[\&\>\*\:nth-child\(1\)\]\:animate-\[bounce_1s_infinite\]>:first-child{animation:bounce 1s infinite}.\[\&\>\*\:nth-child\(2\)\]\:animate-\[bounce_1s_0\.15s_infinite\]>:nth-child(2){animation:bounce 1s .15s infinite}.\[\&\>\*\:nth-child\(3\)\]\:animate-\[bounce_1s_0\.3s_infinite\]>:nth-child(3){animation:bounce 1s .3s infinite}.\[\&\>a\]\:focus-visible\:outline-primary>a:focus-visible{outline-color:var(--ui-primary)}.\[\&\>a\>code\]\:border-dashed>a>code{--tw-border-style:dashed;border-style:dashed}.\[\&\>a\>code\]\:text-lg\/6>a>code{font-size:var(--text-lg);line-height:calc(var(--spacing)*6)}.\[\&\>a\>code\]\:text-xl\/7>a>code{font-size:var(--text-xl);line-height:calc(var(--spacing)*7)}.\[\&\>a\>code\]\:font-bold>a>code{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&\>a\>code\]\:transition-colors>a>code{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media(hover:hover){.hover\:\[\&\>a\>code\]\:border-primary:hover>a>code{border-color:var(--ui-primary)}.hover\:\[\&\>a\>code\]\:text-primary:hover>a>code{color:var(--ui-primary)}}.\[\&\>article\]\:last-of-type\:min-h-\(--last-message-height\)>article:last-of-type{min-height:var(--last-message-height)}.\[\&\>button\]\:py-0>button{padding-block:calc(var(--spacing)*0)}.\[\&\>code\]\:border-dashed>code{--tw-border-style:dashed;border-style:dashed}.\[\&\>code\]\:transition-colors>code{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media(hover:hover){.hover\:\[\&\>code\]\:border-primary:hover>code{border-color:var(--ui-primary)}.hover\:\[\&\>code\]\:text-primary:hover>code{color:var(--ui-primary)}}.focus-visible\:\[\&\>code\]\:border-primary:focus-visible>code{border-color:var(--ui-primary)}.focus-visible\:\[\&\>code\]\:text-primary:focus-visible>code{color:var(--ui-primary)}@media(hover:hover){.\[\&_a\]\:hover\:\[\&\>code\]\:border-error a:hover>code{border-color:var(--ui-error)}.\[\&_a\]\:hover\:\[\&\>code\]\:border-info a:hover>code{border-color:var(--ui-info)}.\[\&_a\]\:hover\:\[\&\>code\]\:border-primary a:hover>code{border-color:var(--ui-primary)}.\[\&_a\]\:hover\:\[\&\>code\]\:border-secondary a:hover>code{border-color:var(--ui-secondary)}.\[\&_a\]\:hover\:\[\&\>code\]\:border-success a:hover>code{border-color:var(--ui-success)}.\[\&_a\]\:hover\:\[\&\>code\]\:border-warning a:hover>code{border-color:var(--ui-warning)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-error a:hover>code{color:var(--ui-error)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-info a:hover>code{color:var(--ui-info)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-primary a:hover>code{color:var(--ui-primary)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-secondary a:hover>code{color:var(--ui-secondary)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-success a:hover>code{color:var(--ui-success)}.\[\&_a\]\:hover\:\[\&\>code\]\:text-warning a:hover>code{color:var(--ui-warning)}}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-error a:focus-visible>code{border-color:var(--ui-error)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-info a:focus-visible>code{border-color:var(--ui-info)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-primary a:focus-visible>code{border-color:var(--ui-primary)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-secondary a:focus-visible>code{border-color:var(--ui-secondary)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-success a:focus-visible>code{border-color:var(--ui-success)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:border-warning a:focus-visible>code{border-color:var(--ui-warning)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-error a:focus-visible>code{color:var(--ui-error)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-info a:focus-visible>code{color:var(--ui-info)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-primary a:focus-visible>code{color:var(--ui-primary)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-secondary a:focus-visible>code{color:var(--ui-secondary)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-success a:focus-visible>code{color:var(--ui-success)}.\[\&_a\]\:focus-visible\:\[\&\>code\]\:text-warning a:focus-visible>code{color:var(--ui-warning)}.\[\&\>div\]\:my-0>div{margin-block:calc(var(--spacing)*0)}.\[\&\>div\]\:my-2\.5>div{margin-block:calc(var(--spacing)*2.5)}.\[\&\>div\]\:flex>div{display:flex}.\[\&\>div\]\:min-w-0>div{min-width:calc(var(--spacing)*0)}.\[\&\>div\]\:flex-1>div{flex:1}.\[\&\>div\]\:flex-col>div{flex-direction:column}.\[\&\>div\]\:overflow-y-auto>div{overflow-y:auto}.\[\&\>div\>div\]\:border-0>div>div{border-style:var(--tw-border-style);border-width:0}.\[\&\>div\>pre\]\:flex-1>div>pre{flex:1}.\[\&\>div\>pre\]\:rounded-t-none>div>pre{border-top-left-radius:0;border-top-right-radius:0}.\[\&\>div\>pre\]\:rounded-l-none>div>pre{border-bottom-left-radius:0;border-top-left-radius:0}.\[\&\>div\>pre\]\:border-s-0>div>pre{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>div\>pre\]\:border-e-0>div>pre{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>div\>pre\]\:border-b-0>div>pre{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\>h2\]\:relative>h2{position:relative}.\[\&\>h2\]\:\[counter-increment\:step\]>h2{counter-increment:step}.\[\&\>h2\]\:before\:absolute>h2:before{content:var(--tw-content);position:absolute}.\[\&\>h2\]\:before\:-ms-\[48\.5px\]>h2:before{content:var(--tw-content);margin-inline-start:-48.5px}.\[\&\>h2\]\:before\:-mt-0>h2:before{content:var(--tw-content);margin-top:calc(var(--spacing)*0)}.\[\&\>h2\]\:before\:inline-flex>h2:before{content:var(--tw-content);display:inline-flex}.\[\&\>h2\]\:before\:size-8>h2:before{content:var(--tw-content);height:calc(var(--spacing)*8);width:calc(var(--spacing)*8)}.\[\&\>h2\]\:before\:items-center>h2:before{align-items:center;content:var(--tw-content)}.\[\&\>h2\]\:before\:justify-center>h2:before{content:var(--tw-content);justify-content:center}.\[\&\>h2\]\:before\:rounded-full>h2:before{border-radius:3.40282e+38px;content:var(--tw-content)}.\[\&\>h2\]\:before\:bg-elevated>h2:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}.\[\&\>h2\]\:before\:text-sm>h2:before{content:var(--tw-content);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&\>h2\]\:before\:font-semibold>h2:before{content:var(--tw-content);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&\>h2\]\:before\:tabular-nums>h2:before{content:var(--tw-content);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.\[\&\>h2\]\:before\:ring-4>h2:before{content:var(--tw-content);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\>h2\]\:before\:ring-bg>h2:before{content:var(--tw-content);--tw-ring-color:var(--ui-bg)}.\[\&\>h2\]\:before\:content-\[counter\(step\)\]>h2:before{--tw-content:counter(step);content:var(--tw-content)}.\[\&\>h2\>a\>span\.absolute\]\:hidden>h2>a>span.absolute{display:none}.\[\&\>h3\]\:relative>h3{position:relative}.\[\&\>h3\]\:\[counter-increment\:step\]>h3{counter-increment:step}.\[\&\>h3\]\:before\:absolute>h3:before{content:var(--tw-content);position:absolute}.\[\&\>h3\]\:before\:inset-x-0\.5>h3:before{content:var(--tw-content);inset-inline:calc(var(--spacing)*.5)}.\[\&\>h3\]\:before\:-ms-\[48\.5px\]>h3:before{content:var(--tw-content);margin-inline-start:-48.5px}.\[\&\>h3\]\:before\:inline-flex>h3:before{content:var(--tw-content);display:inline-flex}.\[\&\>h3\]\:before\:size-7>h3:before{content:var(--tw-content);height:calc(var(--spacing)*7);width:calc(var(--spacing)*7)}.\[\&\>h3\]\:before\:items-center>h3:before{align-items:center;content:var(--tw-content)}.\[\&\>h3\]\:before\:justify-center>h3:before{content:var(--tw-content);justify-content:center}.\[\&\>h3\]\:before\:rounded-full>h3:before{border-radius:3.40282e+38px;content:var(--tw-content)}.\[\&\>h3\]\:before\:bg-elevated>h3:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}.\[\&\>h3\]\:before\:text-sm>h3:before{content:var(--tw-content);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&\>h3\]\:before\:font-semibold>h3:before{content:var(--tw-content);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&\>h3\]\:before\:tabular-nums>h3:before{content:var(--tw-content);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.\[\&\>h3\]\:before\:ring-4>h3:before{content:var(--tw-content);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\>h3\]\:before\:ring-bg>h3:before{content:var(--tw-content);--tw-ring-color:var(--ui-bg)}.\[\&\>h3\]\:before\:content-\[counter\(step\)\]>h3:before{--tw-content:counter(step);content:var(--tw-content)}.\[\&\>h3\>a\>span\.absolute\]\:hidden>h3>a>span.absolute{display:none}.\[\&\>h4\]\:relative>h4{position:relative}.\[\&\>h4\]\:\[counter-increment\:step\]>h4{counter-increment:step}.\[\&\>h4\]\:before\:absolute>h4:before{content:var(--tw-content);position:absolute}.\[\&\>h4\]\:before\:inset-x-0\.5>h4:before{content:var(--tw-content);inset-inline:calc(var(--spacing)*.5)}.\[\&\>h4\]\:before\:-ms-\[48\.5px\]>h4:before{content:var(--tw-content);margin-inline-start:-48.5px}.\[\&\>h4\]\:before\:inline-flex>h4:before{content:var(--tw-content);display:inline-flex}.\[\&\>h4\]\:before\:size-7>h4:before{content:var(--tw-content);height:calc(var(--spacing)*7);width:calc(var(--spacing)*7)}.\[\&\>h4\]\:before\:items-center>h4:before{align-items:center;content:var(--tw-content)}.\[\&\>h4\]\:before\:justify-center>h4:before{content:var(--tw-content);justify-content:center}.\[\&\>h4\]\:before\:rounded-full>h4:before{border-radius:3.40282e+38px;content:var(--tw-content)}.\[\&\>h4\]\:before\:bg-elevated>h4:before{background-color:var(--ui-bg-elevated);content:var(--tw-content)}.\[\&\>h4\]\:before\:text-sm>h4:before{content:var(--tw-content);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&\>h4\]\:before\:font-semibold>h4:before{content:var(--tw-content);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&\>h4\]\:before\:tabular-nums>h4:before{content:var(--tw-content);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.\[\&\>h4\]\:before\:ring-4>h4:before{content:var(--tw-content);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\>h4\]\:before\:ring-bg>h4:before{content:var(--tw-content);--tw-ring-color:var(--ui-bg)}.\[\&\>h4\]\:before\:content-\[counter\(step\)\]>h4:before{--tw-content:counter(step);content:var(--tw-content)}.\[\&\>h4\>a\>span\.absolute\]\:hidden>h4>a>span.absolute{display:none}.\[\&\>input\]\:h-10>input{height:calc(var(--spacing)*10)}.\[\&\>input\]\:h-11>input{height:calc(var(--spacing)*11)}.\[\&\>input\]\:h-12>input{height:calc(var(--spacing)*12)}.\[\&\>input\]\:h-13>input{height:calc(var(--spacing)*13)}.\[\&\>input\]\:h-14>input{height:calc(var(--spacing)*14)}.\[\&\>mark\]\:bg-primary>mark{background-color:var(--ui-primary)}.\[\&\>mark\]\:text-inverted>mark{color:var(--ui-text-inverted)}.\[\&\>pre\]\:my-0>pre{margin-block:calc(var(--spacing)*0)}.\[\&\>pre\]\:rounded-t-none>pre{border-top-left-radius:0;border-top-right-radius:0}@media(hover:hover){.\[\&\>tr\]\:data-\[selectable\=true\]\:hover\:bg-elevated\/50>tr[data-selectable=true]:hover{background-color:var(--ui-bg-elevated)}@supports (color:color-mix(in lab,red,red)){.\[\&\>tr\]\:data-\[selectable\=true\]\:hover\:bg-elevated\/50>tr[data-selectable=true]:hover{background-color:color-mix(in oklab,var(--ui-bg-elevated) 50%,transparent)}}}.\[\&\>tr\]\:data-\[selectable\=true\]\:focus-visible\:outline-primary>tr[data-selectable=true]:focus-visible{outline-color:var(--ui-primary)}.\[\&\>ul\]\:my-0>ul{margin-block:calc(var(--spacing)*0)}.\[\&\>ul\]\:marker\:text-error\/50>ul ::marker{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-error\/50>ul ::marker{color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-error\/50>ul::marker{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-error\/50>ul::marker{color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-error\/50>ul ::-webkit-details-marker{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-error\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-error\/50>ul::-webkit-details-marker{color:var(--ui-error)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-error\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-error) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-info\/50>ul ::marker{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-info\/50>ul ::marker{color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-info\/50>ul::marker{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-info\/50>ul::marker{color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-info\/50>ul ::-webkit-details-marker{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-info\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-info\/50>ul::-webkit-details-marker{color:var(--ui-info)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-info\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-info) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-primary\/50>ul ::marker{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-primary\/50>ul ::marker{color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-primary\/50>ul::marker{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-primary\/50>ul::marker{color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-primary\/50>ul ::-webkit-details-marker{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-primary\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-primary\/50>ul::-webkit-details-marker{color:var(--ui-primary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-primary\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-primary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-secondary\/50>ul ::marker{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-secondary\/50>ul ::marker{color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-secondary\/50>ul::marker{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-secondary\/50>ul::marker{color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-secondary\/50>ul ::-webkit-details-marker{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-secondary\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-secondary\/50>ul::-webkit-details-marker{color:var(--ui-secondary)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-secondary\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-secondary) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-success\/50>ul ::marker{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-success\/50>ul ::marker{color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-success\/50>ul::marker{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-success\/50>ul::marker{color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-success\/50>ul ::-webkit-details-marker{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-success\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-success\/50>ul::-webkit-details-marker{color:var(--ui-success)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-success\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-success) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-warning\/50>ul ::marker{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-warning\/50>ul ::marker{color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-warning\/50>ul::marker{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-warning\/50>ul::marker{color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-warning\/50>ul ::-webkit-details-marker{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-warning\/50>ul ::-webkit-details-marker{color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}.\[\&\>ul\]\:marker\:text-warning\/50>ul::-webkit-details-marker{color:var(--ui-warning)}@supports (color:color-mix(in lab,red,red)){.\[\&\>ul\]\:marker\:text-warning\/50>ul::-webkit-details-marker{color:color-mix(in oklab,var(--ui-warning) 50%,transparent)}}@media(hover:hover){.\[\@media\(hover\:hover\)\]\:focus-within\:scale-105:focus-within{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.\[\@media\(hover\:hover\)\]\:hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}@keyframes accordion-up{0%{height:var(--reka-accordion-content-height)}to{height:0}}@keyframes accordion-down{0%{height:0}to{height:var(--reka-accordion-content-height)}}@keyframes collapsible-up{0%{height:var(--reka-collapsible-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--reka-collapsible-content-height)}}@keyframes toast-slide-in-from-top{0%{transform:translateY(-100%)}to{transform:var(--transform)}}@keyframes toast-slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:var(--transform)}}@keyframes toast-slide-up{0%{transform:translate(0) translateY(var(--translate))}to{transform:translate(0) translateY(calc(var(--translate) - 100%))}}@keyframes toast-slide-down{0%{transform:translate(0) translateY(var(--translate))}to{transform:translate(0) translateY(calc(var(--translate) + 100%))}}@keyframes toast-pulse-a{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-pulse-b{0%,to{scale:1}50%{scale:1.04}}@keyframes toast-collapsed-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--before) - var(--height))*var(--gap))) scale(var(--scale))}}@keyframes toast-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--offset) - var(--height))*var(--translate-factor)))}}@keyframes toast-slide-left{0%{transform:translate(0) translateY(var(--translate))}to{transform:translate(-100%) translateY(var(--translate))}}@keyframes toast-slide-right{0%{transform:translate(0) translateY(var(--translate))}to{transform:translate(100%) translateY(var(--translate))}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes slide-in-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes slide-out-to-top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes slide-in-from-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes slide-out-to-right{0%{transform:translate(0)}to{transform:translate(100%)}}@keyframes slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes slide-in-from-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes slide-out-to-left{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes slide-in-from-top-and-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-top-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes slide-in-from-right-and-fade{0%{opacity:0;transform:translate(4px)}to{opacity:1;transform:translate(0)}}@keyframes slide-out-to-right-and-fade{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(4px)}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes slide-in-from-left-and-fade{0%{opacity:0;transform:translate(-4px)}to{opacity:1;transform:translate(0)}}@keyframes slide-out-to-left-and-fade{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-4px)}}@keyframes enter-from-right{0%{opacity:0;transform:translate(200px)}to{opacity:1;transform:translate(0)}}@keyframes enter-from-left{0%{opacity:0;transform:translate(-200px)}to{opacity:1;transform:translate(0)}}@keyframes exit-to-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(200px)}}@keyframes exit-to-left{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-200px)}}@keyframes carousel{0%,to{width:50%}0%{transform:translate(-100%)}to{transform:translate(200%)}}@keyframes carousel-rtl{0%,to{width:50%}0%{transform:translate(100%)}to{transform:translate(-200%)}}@keyframes carousel-vertical{0%,to{height:50%}0%{transform:translateY(-100%)}to{transform:translateY(200%)}}@keyframes carousel-inverse{0%,to{width:50%}0%{transform:translate(200%)}to{transform:translate(-100%)}}@keyframes carousel-inverse-rtl{0%,to{width:50%}0%{transform:translate(-200%)}to{transform:translate(100%)}}@keyframes carousel-inverse-vertical{0%,to{height:50%}0%{transform:translateY(200%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:50%}0%,to{transform:translate(-25%)}50%{transform:translate(125%)}}@keyframes swing-vertical{0%,to{height:50%}0%,to{transform:translateY(-25%)}50%{transform:translateY(125%)}}@keyframes elastic{0%,to{margin-left:25%;width:50%}50%{margin-left:5%;width:90%}}@keyframes elastic-vertical{0%,to{height:50%;margin-top:25%}50%{height:90%;margin-top:5%}}@keyframes marquee{0%{transform:translateZ(0)}to{transform:translate3d(calc(-100% - var(--gap)),0,0)}}@keyframes marquee-rtl{0%{transform:translateZ(0)}to{transform:translate3d(calc(100% + var(--gap)),0,0)}}@keyframes marquee-vertical{0%{transform:translateZ(0)}to{transform:translate3d(0,calc(-100% - var(--gap)),0)}}@keyframes marquee-vertical-rtl{0%{transform:translate3d(0,calc(-100% - var(--gap)),0)}to{transform:translate3d(0,calc(-100%*var(--gap)),0)}}@keyframes shimmer{0%{background-position:100%}to{background-position:0}}@keyframes shimmer-rtl{0%{background-position:0}to{background-position:100%}}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}@media(min-width:1024px){.docus-sub-header{--ui-header-height:112px}} diff --git a/docus/dist/_nuxt/jpB_SM9d.js b/docus/dist/_nuxt/jpB_SM9d.js new file mode 100644 index 0000000..989e945 --- /dev/null +++ b/docus/dist/_nuxt/jpB_SM9d.js @@ -0,0 +1,3 @@ +import{v as L,d as le,g as ie,j as oe,k as ue,l as Q,o as _,a as O,p as P,B as V,q as te,s,C as M,D,P as ae,bG as de,x as ce,c as w,z as fe,S as ve,n as pe,T as U,h as me,m as ne,L as Y,Q as ge,a0 as he,a1 as ye,a4 as be,w as F,bt as xe,e as $,af as N,ac as E,W as ke,F as J,am as X,r as Ce,ab as Z,ag as Te,f as ee}from"./B3fabVUf.js";import{f as G}from"./C5B99YjC.js";import{R as Ke}from"./B6bUjJBd.js";import Se from"./C-sCiTCq.js";function Ae(f,K){const e=L(),b=(l,g)=>{if(K.multiple&&Array.isArray(f.value))if(K.selectionBehavior==="replace")f.value=[l],e.value=l;else{const S=f.value.findIndex(p=>g(p));S!==-1?f.value=f.value.filter((p,v)=>v!==S):f.value=[...f.value,l]}else K.selectionBehavior==="replace"?f.value={...l}:!Array.isArray(f.value)&&g(f.value)?f.value=void 0:f.value={...l};return f.value};function B(l,g,S,p){if(!e?.value||!K.multiple||!Array.isArray(f.value))return;const I=S().filter(A=>A.ref.dataset.disabled!=="").find(A=>A.ref===g)?.value;if(!I)return;let x=null;switch(l){case"prev":case"next":{x=G(p,e.value,I);break}case"first":{x=G(p,e.value,p?.[0]);break}case"last":{x=G(p,e.value,p?.[p.length-1]);break}}f.value=x}return{firstValue:e,onSelectItem:b,handleMultipleReplace:B}}function W(f){return f.reduce((K,e)=>(K.push(e),e.children&&K.push(...W(e.children)),K),[])}const[Ie,Ee]=fe("TreeRoot");var _e=le({__name:"TreeRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},items:{type:Array,required:!1},expanded:{type:Array,required:!1},defaultExpanded:{type:Array,required:!1},getKey:{type:Function,required:!0},getChildren:{type:Function,required:!1,default:f=>f.children},selectionBehavior:{type:String,required:!1,default:"toggle"},multiple:{type:Boolean,required:!1,skipCheck:!0},dir:{type:String,required:!1},disabled:{type:Boolean,required:!1},propagateSelect:{type:Boolean,required:!1},bubbleSelect:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"ul"}},emits:["update:modelValue","update:expanded"],setup(f,{emit:K}){const e=f,b=K,{items:B,multiple:l,disabled:g,propagateSelect:S,dir:p,bubbleSelect:v}=ie(e),{handleTypeaheadSearch:I}=oe(),x=ue(p),A=L(),R=L(!1),q=ce(),d=Q(e,"modelValue",b,{defaultValue:e.defaultValue??(l.value?[]:void 0),passive:!0,deep:!0}),C=Q(e,"expanded",b,{defaultValue:e.defaultExpanded??[],passive:e.expanded===void 0,deep:!0}),{onSelectItem:a,handleMultipleReplace:i}=Ae(d,e),c=w(()=>l.value&&Array.isArray(d.value)?d.value.map(t=>e.getKey(t)):[e.getKey(d.value??{})]);function r(t,n=1,k){return t.reduce((y,T,j)=>{const H=e.getKey(T),z=e.getChildren(T),re=C.value.includes(H),se={_id:H,value:T,index:j,level:n,parentItem:k,hasChildren:!!z,bind:{value:T,level:n,"aria-setsize":t.length,"aria-posinset":j+1}};return y.push(se),z&&re&&y.push(...r(z,n+1,T)),y},[])}const u=w(()=>{const t=e.items;return C.value.map(n=>n),r(t??[])});function o(t){if(R.value)q.trigger(t);else{const n=A.value?.getItems()??[];I(t.key,n)}}function m(t){if(R.value)return;const n=ve[t.key];pe(()=>{i(n,U(),A.value?.getItems,u.value.map(k=>k.value))})}function h(t){if(t.parentItem!=null&&Array.isArray(d.value)&&e.multiple){const n=u.value.find(k=>t.parentItem!=null&&e.getKey(k.value)===e.getKey(t.parentItem));n!=null&&(e.getChildren(n.value)?.every(y=>d.value.find(T=>e.getKey(T)===e.getKey(y)))?d.value=[...d.value,n.value]:d.value=d.value.filter(y=>e.getKey(y)!==e.getKey(n.value)),h(n))}}return Ee({modelValue:d,selectedKeys:c,onSelect:t=>{const n=y=>e.getKey(y??{})===e.getKey(t),k=e.multiple&&Array.isArray(d.value)?d.value?.findIndex(n)!==-1:void 0;if(a(t,n),e.bubbleSelect&&e.multiple&&Array.isArray(d.value)){const y=u.value.find(T=>e.getKey(T.value)===e.getKey(t));y!=null&&h(y)}if(e.propagateSelect&&e.multiple&&Array.isArray(d.value)){const y=W(e.getChildren(t)??[]);k?d.value=[...d.value].filter(T=>!y.some(j=>e.getKey(T??{})===e.getKey(j))):d.value=[...d.value,...y]}},expanded:C,onToggle(t){if(!(t?e.getChildren(t):void 0))return;const k=e.getKey(t)??t;C.value.includes(k)?C.value=C.value.filter(y=>y!==k):C.value=[...C.value,k]},getKey:e.getKey,getChildren:e.getChildren,items:B,expandedItems:u,disabled:g,multiple:l,dir:x,propagateSelect:S,bubbleSelect:v,isVirtual:R,virtualKeydownHook:q,handleMultipleReplace:i}),(t,n)=>(_(),O(s(de),{ref_key:"rovingFocusGroupRef",ref:A,"as-child":"",orientation:"vertical",dir:s(x)},{default:P(()=>[V(s(ae),{role:"tree",as:t.as,"as-child":t.asChild,"aria-multiselectable":s(l)?!0:void 0,onKeydown:[o,M(D(m,["shift"]),["up","down"])]},{default:P(()=>[te(t.$slots,"default",{flattenItems:u.value,modelValue:s(d),expanded:s(C)})]),_:3},8,["as","as-child","aria-multiselectable","onKeydown"])]),_:3},8,["dir"]))}}),qe=_e;const we="tree.select",Be="tree.toggle";var Re=le({inheritAttrs:!1,__name:"TreeItem",props:{value:{type:null,required:!0},level:{type:Number,required:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"li"}},emits:["select","toggle"],setup(f,{expose:K,emit:e}){const b=f,B=e,l=Ie(),{getItems:g}=me(),S=w(()=>!!l.getChildren(b.value)),p=w(()=>{const a=l.getKey(b.value);return l.expanded.value.includes(a)}),v=w(()=>{const a=l.getKey(b.value);return l.selectedKeys.value.includes(a)}),I=w(()=>{if(l.bubbleSelect.value&&S.value&&Array.isArray(l.modelValue.value)){const a=W(l.getChildren(b.value)||[]);return a.some(i=>l.modelValue.value.find(c=>l.getKey(c)===l.getKey(i)))&&!a.every(i=>l.modelValue.value.find(c=>l.getKey(c)===l.getKey(i)))}else return l.propagateSelect.value&&v.value&&S.value&&Array.isArray(l.modelValue.value)?!W(l.getChildren(b.value)||[]).every(i=>l.modelValue.value.find(c=>l.getKey(c)===l.getKey(i))):void 0});function x(a){if(S.value)if(p.value){const i=g().map(m=>m.ref),c=U(),r=i.indexOf(c),o=[...i].slice(r).find(m=>Number(m.getAttribute("data-indent"))===b.level+1);o&&o.focus()}else C(a)}function A(a){if(p.value)C(a);else{const i=g().map(m=>m.ref),c=U(),r=i.indexOf(c),o=[...i].slice(0,r).reverse().find(m=>Number(m.getAttribute("data-indent"))===b.level-1);o&&o.focus()}}async function R(a){B("select",a),!a?.defaultPrevented&&l.onSelect(b.value)}async function q(a){B("toggle",a),!a?.defaultPrevented&&l.onToggle(b.value)}async function d(a){if(!a)return;const i={originalEvent:a,value:b.value,isExpanded:p.value,isSelected:v.value};Y(we,R,i)}async function C(a){if(!a)return;const i={originalEvent:a,value:b.value,isExpanded:p.value,isSelected:v.value};Y(Be,q,i)}return K({isExpanded:p,isSelected:v,isIndeterminate:I,handleToggle:()=>l.onToggle(b.value),handleSelect:()=>l.onSelect(b.value)}),(a,i)=>(_(),O(s(Ke),{"as-child":"",value:a.value,"allow-shift-key":""},{default:P(()=>[V(s(ae),ne(a.$attrs,{role:"treeitem",as:a.as,"as-child":a.asChild,"aria-selected":v.value,"aria-expanded":S.value?p.value:void 0,"aria-level":a.level,"data-indent":a.level,"data-selected":v.value?"":void 0,"data-expanded":p.value?"":void 0,onKeydown:[M(D(d,["self","prevent"]),["enter","space"]),i[0]||(i[0]=M(D(c=>s(l).dir.value==="ltr"?x(c):A(c),["prevent"]),["right"])),i[1]||(i[1]=M(D(c=>s(l).dir.value==="ltr"?A(c):x(c),["prevent"]),["left"]))],onClick:i[2]||(i[2]=D(c=>{d(c),C(c)},["stop"]))}),{default:P(()=>[te(a.$slots,"default",{isExpanded:p.value,isSelected:v.value,isIndeterminate:I.value,handleSelect:()=>s(l).onSelect(a.value),handleToggle:()=>s(l).onToggle(a.value)})]),_:3},16,["as","as-child","aria-selected","aria-expanded","aria-level","data-indent","data-selected","data-expanded","onKeydown"])]),_:3},8,["value"]))}}),Ve=Re;const Le={slots:{root:"relative lg:h-[450px] my-5 grid lg:grid-cols-3 border border-muted rounded-md",list:"isolate relative p-2 border-b lg:border-b-0 lg:border-e border-muted overflow-y-auto",item:"",listWithChildren:"ms-4.5 border-s border-default",itemWithChildren:"ps-1.5 -ms-px",link:"relative group peer w-full px-2.5 py-1.5 before:inset-y-px before:inset-x-0 flex items-center gap-1.5 text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2",linkLeadingIcon:"size-4 shrink-0",linkLabel:"truncate",linkTrailing:"ms-auto inline-flex gap-1.5 items-center",linkTrailingIcon:"size-5 transform transition-transform duration-200 shrink-0 group-data-expanded:rotate-180",content:"overflow-hidden lg:col-span-2 flex flex-col [&>div]:my-0 [&>div]:flex-1 [&>div]:flex [&>div]:flex-col [&>div>div]:border-0 [&>div>pre]:border-b-0 [&>div>pre]:border-s-0 [&>div>pre]:border-e-0 [&>div>pre]:rounded-l-none [&>div>pre]:flex-1 [&>div]:overflow-y-auto"},variants:{active:{true:{link:"text-highlighted before:bg-elevated"},false:{link:["hover:text-highlighted hover:before:bg-elevated/50","transition-colors before:transition-colors"]}}}},je=Object.assign({inheritAttrs:!1},{__name:"ProseCodeTree",props:{items:{type:Array,required:!1},modelValue:{type:String,required:!1},defaultValue:{type:String,required:!1},expandAll:{type:Boolean,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},emits:["update:modelValue"],setup(f,{emit:K}){const e=f,b=K,B=ge(),l=he(),g=ye("prose.codeTree",e),[S,p]=be(),v=w(()=>X({extend:X(Le),...l.ui?.prose?.codeTree||{}})()),I=e.modelValue??e.defaultValue,x=L(I?{path:I}:void 0),A=L();F(x,r=>{r?.path!==e.modelValue&&b("update:modelValue",r?.path)}),F(()=>e.modelValue,r=>{if(r===x.value?.path)return;x.value=r?{path:r}:void 0;const u=i(r);for(const o of u)c.value.includes(o)||c.value.push(o)});const R=L(1),q=w(()=>(R.value,e.items||B.default?.()?.flatMap(a).filter(Boolean)||[])),d=w(()=>C(q.value));function C(r){const u=new Map,o=[];r.forEach(h=>{const t=h.label.split("/");let n="";t.forEach((k,y)=>{if(n=n?`${n}/${k}`:k,!u.has(n)){const T={label:k,path:n,...yh.sort((t,n)=>!!t.children==!!n.children?t.label.localeCompare(n.label):n.children?1:-1).map(t=>({...t,children:t.children&&m(t.children)}));return m(o)}function a(r,u){return typeof r.type=="symbol"?r.children?.map(a):{label:r.props?.filename||r.props?.label||`${u}`,icon:r.props?.icon,component:r}}function i(r){if(e.expandAll){const o=new Set;return q.value.forEach(m=>{const h=m.label.split("/");for(let t=1;tu.slice(0,m+1).join("/"))}const c=L(i(x.value?.path));return F(q,(r,u)=>{if(!e.expandAll)return;const o=r.map(h=>h.label).join(` +`),m=u?.map(h=>h.label).join(` +`)??"";o!==m&&(c.value=i())}),F(x,r=>{const u=q.value.find(o=>r?.path===o.label);u?.component&&(A.value=u)},{immediate:!0}),xe(()=>R.value++),(r,u)=>(_(),$(J,null,[V(s(S),null,{default:P(({items:o,level:m})=>[(_(!0),$(J,null,Ce(o,(h,t)=>(_(),$("li",{key:`${m}-${t}`,role:"presentation",class:E(m>1?v.value.itemWithChildren({class:s(g)?.itemWithChildren}):v.value.item({class:s(g)?.item}))},[V(s(Ve),{level:m,value:h,"as-child":""},{default:P(({isExpanded:n,isSelected:k})=>[N("button",{type:"button",class:E(v.value.link({class:s(g)?.link,active:k}))},[h.children?.length?(_(),O(Z,{key:0,name:n?s(l).ui.icons.folderOpen:s(l).ui.icons.folder,class:E(v.value.linkLeadingIcon({class:s(g)?.linkLeadingIcon}))},null,8,["name","class"])):(_(),O(Se,{key:1,filename:h.label,class:E(v.value.linkLeadingIcon({class:s(g)?.linkLeadingIcon}))},null,8,["filename","class"])),N("span",{class:E(v.value.linkLabel({class:s(g)?.linkLabel}))},Te(h.label),3),h.children?.length?(_(),$("span",{key:2,class:E(v.value.linkTrailing({class:s(g)?.linkTrailing}))},[V(Z,{name:s(l).ui.icons.chevronDown,class:E(v.value.linkTrailingIcon({class:s(g)?.linkTrailingIcon}))},null,8,["name","class"])],2)):ee("",!0)],2),h.children?.length&&n?(_(),$("ul",{key:0,role:"group",class:E(v.value.listWithChildren({class:s(g)?.listWithChildren}))},[V(s(p),{items:h.children,level:m+1},null,8,["items","level"])],2)):ee("",!0)]),_:2},1032,["level","value"])],2))),128))]),_:1}),N("div",ne(r.$attrs,{class:v.value.root({class:[s(g)?.root,e.class]})}),[V(s(qe),{modelValue:x.value,"onUpdate:modelValue":u[0]||(u[0]=o=>x.value=o),expanded:c.value,"onUpdate:expanded":u[1]||(u[1]=o=>c.value=o),class:E(v.value.list({class:s(g)?.list})),items:d.value,"get-key":o=>o.path},{default:P(()=>[V(s(p),{items:d.value,level:1},null,8,["items"])]),_:1},8,["modelValue","expanded","class","items","get-key"]),N("div",{class:E(v.value.content({class:s(g)?.content}))},[(_(),O(ke(A.value?.component)))],2)],16)],64))}});export{je as default}; diff --git a/docus/dist/_nuxt/n8vERajx.js b/docus/dist/_nuxt/n8vERajx.js new file mode 100644 index 0000000..22b8dcc --- /dev/null +++ b/docus/dist/_nuxt/n8vERajx.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./B3fabVUf.js","./entry.B0IIbxeE.css","./D2PgxUb5.js","./BecbEIqG.js","./CdNQ_JKz.js","./C8-Mg-oX.js","./G6op-Gdf.js"])))=>i.map(i=>d[i]); +import{d as Cn,bc as G,bd as Sn,w as kn,be as xn,c as b,bf as ln,bg as on,bh as L,bi as F,bj as j,bk as wn,b7 as tn,bl as On,bm as R,aQ as Tn,a as Dn,s as J,ac as Ln,q as Mn,bn as _n,o as Rn,aO as En,bo as Un,aS as An,bp as Z,bq as Q,t as D,br as I,bs as In}from"./B3fabVUf.js";import{f as rn,n as Bn}from"./BN_7HF1G.js";const V=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"]);class B{constructor(l,e,r){this.normal=e,this.property=l,r&&(this.space=r)}}B.prototype.normal={};B.prototype.property={};B.prototype.space=void 0;function an(n,l){const e={},r={};for(const t of n)Object.assign(e,t.property),Object.assign(r,t.normal);return new B(e,r,l)}function N(n){return n.toLowerCase()}class x{constructor(l,e){this.attribute=e,this.property=l}}x.prototype.attribute="";x.prototype.booleanish=!1;x.prototype.boolean=!1;x.prototype.commaOrSpaceSeparated=!1;x.prototype.commaSeparated=!1;x.prototype.defined=!1;x.prototype.mustUseProperty=!1;x.prototype.number=!1;x.prototype.overloadedBoolean=!1;x.prototype.property="";x.prototype.spaceSeparated=!1;x.prototype.space=void 0;let jn=0;const i=M(),y=M(),q=M(),o=M(),v=M(),U=M(),w=M();function M(){return 2**++jn}const W=Object.freeze(Object.defineProperty({__proto__:null,boolean:i,booleanish:y,commaOrSpaceSeparated:w,commaSeparated:U,number:o,overloadedBoolean:q,spaceSeparated:v},Symbol.toStringTag,{value:"Module"})),z=Object.keys(W);class X extends x{constructor(l,e,r,t){let a=-1;if(super(l,e),nn(this,"space",t),typeof r=="number")for(;++a4&&e.slice(0,4)==="data"&&Vn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(en,Wn);r="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!en.test(a)){let c=a.replace(Fn,qn);c.charAt(0)!=="-"&&(c="-"+c),l="data"+c}}t=X}return new t(r,l)}function qn(n){return"-"+n.toLowerCase()}function Wn(n){return n.charAt(1).toUpperCase()}const $n=an([un,Hn,pn,dn,gn],"html");an([un,zn,pn,dn,gn],"svg");function Kn(n,l){return l.reduce((e,r)=>{const t=Xn(n,r);return t!==void 0&&(e[r]=t),e},{})}function Xn(n,l){return l.split(".").reduce((e,r)=>e&&e[r],n)}const $="default",mn=/^@|^v-on:/,fn=/^:|^v-bind:/,Yn=/^v-model/,Gn=["select","textarea","input"],Jn=new Set(["math","svg"]),hn=new Set,Zn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),Qn=["script","base"],ne=Cn({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},class:{type:[String,Object],default:void 0},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})},unwrap:{type:[Boolean,String],default:!1}},async setup(n){const e=xn()?.appContext?.app?.$nuxt,r=e?.$route||e?._route,{mdc:t}=e?.$config?.public||{},a=t?.components?.customElements||t?.components?.custom;a&&a.forEach(s=>hn.add(s));const c=b(()=>({...t?.components?.prose&&n.prose!==!1?Zn:{},...t?.components?.map||{},...ln(n.data?.mdc?.components||{}),...n.components})),m=b(()=>{const s=(n.body?.children||[]).map(f=>f.tag||f.type).filter(f=>!Y(f));return Array.from(new Set(s)).sort().join(".")}),d=Sn({...n.data});kn(()=>n.data,s=>{Object.assign(d,s)}),await pe(n.body,{tags:c.value});function p(s,f){const k=s.split(".").length-1;return s.split(".").reduce((P,O,S)=>S==k&&P?(P[O]=f,P[O]):typeof P=="object"?P[O]:void 0,d)}return{tags:c,contentKey:m,route:r,runtimeData:d,updateRuntimeData:p}},render(n){const{tags:l,tag:e,body:r,data:t,contentKey:a,route:c,unwrap:m,runtimeData:d,updateRuntimeData:p}=n;if(!r)return null;const s={...t,tags:l,$route:c,runtimeData:d,updateRuntimeData:p},f=e!==!1?K(e||s.component?.name||s.component||"div"):void 0;return f?G(f,{...s.component?.props,class:n.class,...this.$attrs,key:a},{default:k}):k?.();function k(){const P=vn(r,G,{documentMeta:s,parentScope:s,resolveComponent:K});return P?.default?m?rn(P.default(),typeof m=="string"?m.split(" "):["*"]):P.default():null}}});function ee(n,l,e,r){const{documentMeta:t,parentScope:a,resolveComponent:c}=e;if(n.type==="text")return l(j,n.value);if(n.type==="comment")return l(wn,null,n.value);const m=n.tag,d=bn(n,t.tags);if(n.tag==="binding")return le(n,l,t,a);const p=yn(d)?k=>k:c;if(Qn.includes(L(d).toLowerCase()))return l("pre",{class:"mdc-renderer-dangerous-tag"},"<"+d+">"+Bn(n)+"");const s=p(d);typeof s=="object"&&(s.tag=m);const f=oe(n,t);return r&&(f.key=r),l(s,f,vn(n,l,{documentMeta:t,parentScope:{...a,...f},resolveComponent:p}))}function vn(n,l,e){const{documentMeta:r,parentScope:t,resolveComponent:a}=e,m=(n.children||[]).reduce((p,s)=>{if(!se(s))return p[$].children.push(s),p;const f=ie(s);return p[f]=p[f]||{props:{},children:[]},s.type==="element"&&(p[f].props=s.props,p[f].children.push(...s.children||[])),p},{[$]:{props:{},children:[]}});return Object.entries(m).reduce((p,[s,{props:f,children:k}])=>(k.length&&(p[s]=(P={})=>{const O=Kn(P,Object.keys(f||{}));let S=k.map((u,h)=>ee(u,l,{documentMeta:r,parentScope:{...t,...O},resolveComponent:a},String(u.props?.key||h)));return f?.unwrap&&(S=rn(S,f.unwrap)),ce(S)}),p),{})}function le(n,l,e,r={}){const t={...e.runtimeData,...r,$document:e,$doc:e},a=/\.|\[(\d+)\]/,m=(n.props?.value.trim().split(a).filter(Boolean)).reduce((p,s)=>{if(p&&s in p)return typeof p[s]=="function"?p[s]():p[s]},t),d=n.props?.defaultValue;return l(j,m??d??"")}function oe(n,l){const{tag:e="",props:r={}}=n;return Object.keys(r).reduce(function(t,a){if(a==="__ignoreMap")return t;const c=r[a];if(Yn.test(a))return te(a,c,t,l,{native:Gn.includes(e)});if(a==="v-bind")return re(a,c,t,l);if(mn.test(a))return ae(a,c,t,l);if(fn.test(a))return ue(a,c,t,l);const{attribute:m}=Nn($n,a);return Array.isArray(c)&&c.every(d=>typeof d=="string")?(t[m]=c.join(" "),t):(t[m]=c,t)},{})}function te(n,l,e,r,{native:t}){const a=n.match(/^v-model:([^=]+)/)?.[1]||"modelValue",c=t?"value":a,m=t?"onInput":`onUpdate:${a}`;return e[c]=H(l,r.runtimeData),e[m]=d=>{r.updateRuntimeData(l,t?d.target?.value:d)},e}function re(n,l,e,r){const t=H(l,r);return e=Object.assign(e,t),e}function ae(n,l,e,r){return n=n.replace(mn,""),e.on=e.on||{},e.on[n]=()=>H(l,r),e}function ue(n,l,e,r){return n=n.replace(fn,""),e[n]=H(l,r),e}const K=n=>{if(typeof n=="string"){if(Y(n))return n;const l=on(L(n),!1);return!n||l?.name==="AsyncComponentWrapper"||typeof l=="string"?l:"setup"in l?F(()=>new Promise(e=>e(l))):l}return n};function H(n,l){const e=n.split(".").reduce((r,t)=>typeof r=="object"?r[t]:void 0,l);return typeof e>"u"?On(n):e}function ie(n){let l="";for(const e of Object.keys(n.props||{}))if(!(!e.startsWith("#")&&!e.startsWith("v-slot:"))){l=e.split(/[:#]/,2)[1];break}return l||$}function se(n){return n.tag==="template"}function yn(n){return Jn.has(n)}function ce(n){const l=[];for(const e of n){const r=l[l.length-1];e.type===j&&r?.type===j?r.children=r.children+e.children:l.push(e)}return l}async function pe(n,l){if(!n)return;const e=Array.from(new Set(r(n,l)));await Promise.all(e.map(async t=>{if(t?.render||t?.ssrRender||t?.__ssrInlineRender)return;const a=K(t);a?.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function r(t,a){const c=t.tag;if(t.type==="text"||c==="binding"||t.type==="comment")return[];const m=bn(t,a.tags);if(yn(m))return[];const d=[];t.type!=="root"&&!Y(m)&&d.push(m);for(const p of t.children||[])d.push(...r(p,a));return d}}function bn(n,l){const e=n.tag;return!e||typeof n.props?.__ignoreMap<"u"?e:l[e]||l[L(e)]||l[tn(n.tag)]||e}function Y(n){return(typeof n=="string"?hn.has(n):!1)||V.has(n)}const de=Object.assign(ne,{__name:"MDCRenderer"}),E=(n,l,e,r)=>{const t=l==="default"?n?.default:n?.[l];if(!t)throw new Error(`[nuxt-content] Missing export "${l}" for component "${e}" in "${r}".`);return t},ge={UButton:()=>R(()=>import("./B3fabVUf.js").then(n=>n.c5),__vite__mapDeps([0,1]),import.meta.url).then(n=>E(n,"default","UButton","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/Button.vue")),UPageCard:()=>R(()=>import("./D2PgxUb5.js"),__vite__mapDeps([2,0,1]),import.meta.url).then(n=>E(n,"default","UPageCard","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/PageCard.vue")),UPageFeature:()=>R(()=>import("./BecbEIqG.js"),__vite__mapDeps([3,0,1]),import.meta.url).then(n=>E(n,"default","UPageFeature","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/PageFeature.vue")),UPageGrid:()=>R(()=>import("./CdNQ_JKz.js"),__vite__mapDeps([4,0,1]),import.meta.url).then(n=>E(n,"default","UPageGrid","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/PageGrid.vue")),UPageHero:()=>R(()=>import("./C8-Mg-oX.js"),__vite__mapDeps([5,0,1]),import.meta.url).then(n=>E(n,"default","UPageHero","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/PageHero.vue")),UPageSection:()=>R(()=>import("./G6op-Gdf.js"),__vite__mapDeps([6,0,1,3]),import.meta.url).then(n=>E(n,"default","UPageSection","./../../../../docus/node_modules/@nuxt/ui/dist/runtime/components/PageSection.vue"))},me=["ProseA","ProseAccordion","ProseAccordionItem","ProseBadge","ProseBlockquote","ProseCallout","ProseCard","ProseCardGroup","ProseCode","ProseCodeCollapse","ProseCodeGroup","ProseCodeIcon","ProseCodePreview","ProseCodeTree","ProseCollapsible","ProseEm","ProseField","ProseFieldGroup","ProseH1","ProseH2","ProseH3","ProseH4","ProseHr","ProseIcon","ProseImg","ProseKbd","ProseLi","ProseOl","ProseP","ProsePre","ProseScript","ProseSteps","ProseStrong","ProseTable","ProseTabs","ProseTabsItem","ProseTbody","ProseTd","ProseTh","ProseThead","ProseTr","ProseUl","ProseCaution","ProseNote","ProseTip","ProseWarning","ProseH5","ProseH6","Icon"],fe=["UButton","UPageCard","UPageFeature","UPageGrid","UPageHero","UPageSection"],he={__name:"ContentRenderer",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})},prose:{type:Boolean,default:void 0},class:{type:[String,Object],default:void 0},unwrap:{type:[Boolean,String],default:!1}},setup(n){const l=["render","ssrRender","__ssrInlineRender"],e=n,r=import.meta.preview,t=b(()=>{let u=e.value.body||e.value;return e.excerpt&&e.value.excerpt&&(u=e.value.excerpt),u.type==="minimal"||u.type==="minimark"?_n({value:u.value}):u}),a=b(()=>!t.value?.children?.length),c=b(()=>{const{body:u,excerpt:h,...g}=e.value;return{...g,...e.data}}),m=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(u=>[u,`prose-${u}`])),{mdc:d}=Tn().public||{},p=b(()=>e.data.mdc),s=b(()=>({...d?.components?.prose&&e.prose!==!1?m:{},...d?.components?.map||{},...ln(p.value?.components||{}),...e.components})),f=b(()=>t.value?P(t.value,{tags:s.value}):{});function k(u){let h=u;if(typeof u=="string"){if(V.has(u))return u;if(me.includes(L(u)))h=on(u,!1);else if(fe.includes(L(u))){const C=ge[L(u)];h=C?F(C):void 0}if(typeof h=="string")return h}if(!h)return h;const g=h;return"__asyncLoader"in g?g:"setup"in g?F(()=>Promise.resolve(g)):g}function P(u,h){if(!u)return;const g=Array.from(new Set(O(u,h))),C={};for(const[T,_]of g)if(!C[T]){if(typeof _=="object"&&l.some(Pn=>Object.hasOwnProperty.call(_,Pn))){C[T]=_;continue}C[T]=k(_)}return C}function O(u,h){const g=u.tag;if(u.type==="text"||g==="binding"||u.type==="comment")return[];const C=S(u,h.tags),T=[];u.type!=="root"&&!V.has(C)&&T.push([g,C]);for(const _ of u.children||[])T.push(...O(_,h));return T}function S(u,h){const g=u.tag;return!g||typeof u.props?.__ignoreMap<"u"?g:h[g]||h[L(g)]||h[tn(u.tag)]||g}return(u,h)=>a.value?Mn(u.$slots,"empty",{key:1,body:t.value,data:c.value,dataContentId:J(r)?n.value.id:void 0}):(Rn(),Dn(de,{key:0,body:t.value,data:c.value,class:Ln(e.class),tag:e.tag,prose:e.prose,unwrap:e.unwrap,components:f.value,"data-content-id":J(r)?n.value.id:void 0},null,8,["body","data","class","tag","prose","unwrap","components","data-content-id"]))}},be=Object.assign(he,{__name:"ContentRenderer"});function Pe(n){const l=En(),e=Un(),{locale:r,locales:t,isEnabled:a,switchLocalePath:c}=An(),m=b(()=>D(n.title)),d=b(()=>D(n.description)),p=b(()=>D(n.type)||"article"),s=b(()=>D(n.ogImage)),f=b(()=>D(n.publishedAt)),k=b(()=>D(n.modifiedAt)),P=b(()=>D(n.breadcrumbs)),O=b(()=>{if(e.url)return I(e.url,l.path)}),S=b(()=>e.url?In(e.url):"");Z({title:m,description:d,ogTitle:m,ogDescription:d,ogType:p,ogUrl:O,ogLocale:b(()=>a.value?r.value:void 0)}),Q({link:b(()=>{const u=[];if(O.value&&u.push({rel:"canonical",href:O.value}),a.value&&S.value){for(const g of t){const C=c(g.code);C&&u.push({rel:"alternate",hreflang:g.code,href:I(S.value,C)})}const h=c(t[0]?.code||"en");h&&u.push({rel:"alternate",hreflang:"x-default",href:I(S.value,h)})}return u})}),s.value&&Z({ogImage:s.value,twitterImage:s.value}),Q({script:b(()=>{const u=[];if(!S.value||!m.value)return u;const h=I(S.value,l.path);if(p.value==="article"){const g={"@context":"https://schema.org","@type":"Article",headline:m.value,description:d.value,url:h,mainEntityOfPage:{"@type":"WebPage","@id":h}};f.value&&(g.datePublished=f.value),k.value&&(g.dateModified=k.value),e.name&&(g.publisher={"@type":"Organization",name:e.name}),u.push({type:"application/ld+json",innerHTML:JSON.stringify(g)})}if(p.value==="website"){const g={"@context":"https://schema.org","@type":"WebSite",name:e.name||m.value,description:d.value,url:S.value};u.push({type:"application/ld+json",innerHTML:JSON.stringify(g)})}if(P.value&&P.value.length>0){const g={"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:P.value.map((C,T)=>({"@type":"ListItem",position:T+1,name:C.title,item:I(S.value,C.path)}))};u.push({type:"application/ld+json",innerHTML:JSON.stringify(g)})}return u})})}export{be as _,Pe as u}; diff --git a/docus/dist/_nuxt/p9GVdgbx.js b/docus/dist/_nuxt/p9GVdgbx.js new file mode 100644 index 0000000..00b2329 --- /dev/null +++ b/docus/dist/_nuxt/p9GVdgbx.js @@ -0,0 +1 @@ +import{a0 as g,a1 as f,aQ as b,e as r,ac as t,s as e,af as v,B as x,ab as y,q as d,c as u,am as p,o as h}from"./B3fabVUf.js";const k={slots:{base:["relative text-2xl text-highlighted font-bold mt-12 mb-6 scroll-mt-[calc(48px+45px+var(--ui-header-height))] lg:scroll-mt-[calc(48px+var(--ui-header-height))] [&>a]:focus-visible:outline-primary [&>a>code]:border-dashed hover:[&>a>code]:border-primary hover:[&>a>code]:text-primary [&>a>code]:text-xl/7 [&>a>code]:font-bold","[&>a>code]:transition-colors"],leading:["absolute -ms-8 top-1 opacity-0 group-hover:opacity-100 group-focus:opacity-100 p-1 bg-elevated hover:text-primary rounded-md hidden lg:flex text-muted","transition"],leadingIcon:"size-4 shrink-0",link:"group lg:ps-2 lg:-ms-2"}},C=["id"],q=["href"],_={__name:"ProseH2",props:{id:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const l=a,i=g(),s=f("prose.h2",l),{headings:n}=b().public?.mdc||{},o=u(()=>p({extend:p(k),...i.ui?.prose?.h2||{}})()),m=u(()=>l.id&&typeof n?.anchorLinks=="object"&&n.anchorLinks.h2);return(c,B)=>(h(),r("h2",{id:a.id,class:t(o.value.base({class:[e(s)?.base,l.class]}))},[a.id&&m.value?(h(),r("a",{key:0,href:`#${a.id}`,class:t(o.value.link({class:e(s)?.link}))},[v("span",{class:t(o.value.leading({class:e(s)?.leading}))},[x(y,{name:e(i).ui.icons.hash,class:t(o.value.leadingIcon({class:e(s)?.leadingIcon}))},null,8,["name","class"])],2),d(c.$slots,"default")],10,q)):d(c.$slots,"default",{key:1})],10,C))}};export{_ as default}; diff --git a/docus/dist/_nuxt/qDOTQ2yj.js b/docus/dist/_nuxt/qDOTQ2yj.js new file mode 100644 index 0000000..64eb9fe --- /dev/null +++ b/docus/dist/_nuxt/qDOTQ2yj.js @@ -0,0 +1 @@ +import{a0 as c,a1 as p,e as l,q as u,ac as i,s as m,c as f,am as e,o as d}from"./B3fabVUf.js";const g={base:""},b={__name:"ProseStrong",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=a,o=c(),t=p("prose.strong",s),r=f(()=>e({extend:e(g),...o.ui?.prose?.strong||{}}));return(n,_)=>(d(),l("strong",{class:i(r.value({class:[m(t)?.base,s.class]}))},[u(n.$slots,"default")],2))}};export{b as default}; diff --git a/docus/dist/_nuxt/sqlite3-DBpDb1lf.wasm b/docus/dist/_nuxt/sqlite3-DBpDb1lf.wasm new file mode 100644 index 0000000..f001d7a Binary files /dev/null and b/docus/dist/_nuxt/sqlite3-DBpDb1lf.wasm differ diff --git a/docus/dist/_nuxt/sqlite3-opfs-async-proxy-C_otN2ZJ.js b/docus/dist/_nuxt/sqlite3-opfs-async-proxy-C_otN2ZJ.js new file mode 100644 index 0000000..d21c5e4 --- /dev/null +++ b/docus/dist/_nuxt/sqlite3-opfs-async-proxy-C_otN2ZJ.js @@ -0,0 +1 @@ +(function(){"use strict";const O=(w,...t)=>postMessage({type:w,payload:t}),v=function(){const w=function(...e){throw new Error(e.join(" "))};globalThis.window===globalThis?w("This code cannot run from the main thread.","Load it as a Worker from a separate Worker."):navigator?.storage?.getDirectory||w("This API requires navigator.storage.getDirectory.");const t=Object.create(null);t.verbose=1;const D={0:console.error.bind(console),1:console.warn.bind(console),2:console.log.bind(console)},A=(e,...s)=>{t.verbose>e&&D[e]("OPFS asyncer:",...s)},g=(...e)=>A(2,...e),S=(...e)=>A(1,...e),h=(...e)=>A(0,...e),E=Object.create(null),I=new Set,k=function(e,s){const n=new URL(e,"file://irrelevant").pathname;return s?n.split("/").filter(o=>!!o):n},x=async function(s,n=!1){const o=k(s,!0),a=o.pop();let i=t.rootDir;for(const r of o)r&&(i=await i.getDirectoryHandle(r,{create:!!n}));return[i,a]},R=async e=>{if(e.syncHandle){g("Closing sync handle for",e.filenameAbs);const s=e.syncHandle;return delete e.syncHandle,delete e.xLock,I.delete(e.fid),s.close()}},F=async e=>{try{await R(e)}catch(s){S("closeSyncHandleNoThrow() ignoring:",s,e)}},z=async()=>{if(I.size)for(const e of I){const s=E[e];await F(s),g("Auto-unlocked",e,s.filenameAbs)}},T=async e=>{if(e.releaseImplicitLocks&&I.has(e.fid))return F(e)};class b extends Error{constructor(s,...n){super([...n,": "+s.name+":",s.message].join(" "),{cause:s}),this.name="GetSyncHandleError"}}b.convertRc=(e,s)=>{if(e instanceof b){if(e.cause.name==="NoModificationAllowedError"||e.cause.name==="DOMException"&&e.cause.message.indexOf("Access Handles cannot")===0)return t.sq3Codes.SQLITE_BUSY;if(e.cause.name==="NotFoundError")return t.sq3Codes.SQLITE_CANTOPEN}else if(e?.name==="NotFoundError")return t.sq3Codes.SQLITE_CANTOPEN;return s};const m=async(e,s)=>{if(!e.syncHandle){const n=performance.now();g("Acquiring sync handle for",e.filenameAbs);const o=6,a=t.asyncIdleWaitTime*2;let i=1,r=a;for(;;r=a*++i)try{e.syncHandle=await e.fileHandle.createSyncAccessHandle();break}catch(c){if(i===o)throw new b(c,"Error getting sync handle for",s+"().",o,"attempts failed.",e.filenameAbs);S("Error getting sync handle for",s+"(). Waiting",r,"ms and trying again.",e.filenameAbs,c),Atomics.wait(t.sabOPView,t.opIds.retry,0,r)}g("Got",s+"() sync handle for",e.filenameAbs,"in",performance.now()-n,"ms"),e.xLock||(I.add(e.fid),g("Acquired implicit lock for",s+"()",e.fid,e.filenameAbs))}return e.syncHandle},d=(e,s)=>{g(e+"() => notify(",s,")"),Atomics.store(t.sabOPView,t.opIds.rc,s),Atomics.notify(t.sabOPView,t.opIds.rc)},H=function(e,s){s.readOnly&&w(e+"(): File is read-only: "+s.filenameAbs)};let L=!1;const _={"opfs-async-shutdown":async()=>{L=!0,d("opfs-async-shutdown",0)},mkdir:async e=>{let s=0;try{await x(e+"/filepart",!0)}catch(n){t.s11n.storeException(2,n),s=t.sq3Codes.SQLITE_IOERR}d("mkdir",s)},xAccess:async e=>{let s=0;try{const[n,o]=await x(e);await n.getFileHandle(o)}catch(n){t.s11n.storeException(2,n),s=t.sq3Codes.SQLITE_IOERR}d("xAccess",s)},xClose:async function(e){const s="xClose";I.delete(e);const n=E[e];let o=0;if(n){if(delete E[e],await R(n),n.deleteOnClose)try{await n.dirHandle.removeEntry(n.filenamePart)}catch(a){S("Ignoring dirHandle.removeEntry() failure of",n,a)}}else t.s11n.serialize(),o=t.sq3Codes.SQLITE_NOTFOUND;d(s,o)},xDelete:async function(...e){const s=await _.xDeleteNoWait(...e);d("xDelete",s)},xDeleteNoWait:async function(e,s=0,n=!1){let o=0;try{for(;e;){const[a,i]=await x(e,!1);if(!i||(await a.removeEntry(i,{recursive:n}),s!==4660))break;n=!1,e=k(e,!0),e.pop(),e=e.join("/")}}catch(a){t.s11n.storeException(2,a),o=t.sq3Codes.SQLITE_IOERR_DELETE}return o},xFileSize:async function(e){const s=E[e];let n=0;try{const o=await(await m(s,"xFileSize")).getSize();t.s11n.serialize(Number(o))}catch(o){t.s11n.storeException(1,o),n=b.convertRc(o,t.sq3Codes.SQLITE_IOERR)}await T(s),d("xFileSize",n)},xLock:async function(e,s){const n=E[e];let o=0;const a=n.xLock;if(n.xLock=s,!n.syncHandle)try{await m(n,"xLock"),I.delete(e)}catch(i){t.s11n.storeException(1,i),o=b.convertRc(i,t.sq3Codes.SQLITE_IOERR_LOCK),n.xLock=a}d("xLock",o)},xOpen:async function(e,s,n,o){const a="xOpen",i=t.sq3Codes.SQLITE_OPEN_CREATE&n;try{let r,c;try{[r,c]=await x(s,!!i)}catch(f){t.s11n.storeException(1,f),d(a,t.sq3Codes.SQLITE_NOTFOUND);return}if(t.opfsFlags.OPFS_UNLINK_BEFORE_OPEN&o)try{await r.removeEntry(c)}catch{}const y=await r.getFileHandle(c,{create:i}),l=Object.assign(Object.create(null),{fid:e,filenameAbs:s,filenamePart:c,dirHandle:r,fileHandle:y,sabView:t.sabFileBufView,readOnly:!i&&!!(t.sq3Codes.SQLITE_OPEN_READONLY&n),deleteOnClose:!!(t.sq3Codes.SQLITE_OPEN_DELETEONCLOSE&n)});l.releaseImplicitLocks=o&t.opfsFlags.OPFS_UNLOCK_ASAP||t.opfsFlags.defaultUnlockAsap,E[e]=l,d(a,0)}catch(r){h(a,r),t.s11n.storeException(1,r),d(a,t.sq3Codes.SQLITE_IOERR)}},xRead:async function(e,s,n){let o=0,a;const i=E[e];try{a=(await m(i,"xRead")).read(i.sabView.subarray(0,s),{at:Number(n)}),a{if(t.s11n)return t.s11n;const e=new TextDecoder,s=new TextEncoder("utf-8"),n=new Uint8Array(t.sabIO,t.sabS11nOffset,t.sabS11nSize),o=new DataView(t.sabIO,t.sabS11nOffset,t.sabS11nSize);t.s11n=Object.create(null);const a=Object.create(null);a.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},a.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},a.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},a.string={id:4};const i=c=>a[typeof c]||w("Maintenance required: this value type cannot be serialized.",c),r=c=>{switch(c){case a.number.id:return a.number;case a.bigint.id:return a.bigint;case a.boolean.id:return a.boolean;case a.string.id:return a.string;default:w("Invalid type ID:",c)}};return t.s11n.deserialize=function(c=!1){const y=n[0],l=y?[]:null;if(y){const f=[];let u=1,p,C,N;for(p=0;p{c<=t.asyncS11nExceptions&&t.s11n.serialize([y.name,": ",y.message].join(""))}:()=>{},t.s11n},q=async function(){const s=Object.create(null);for(let n of Object.keys(t.opIds)){const o=_[n];if(!o)continue;const a=Object.create(null);s[t.opIds[n]]=a,a.key=n,a.f=o}for(;!L;)try{if(Atomics.wait(t.sabOPView,t.opIds.whichOp,0,t.asyncIdleWaitTime)!=="not-equal"){await z();continue}const n=Atomics.load(t.sabOPView,t.opIds.whichOp);Atomics.store(t.sabOPView,t.opIds.whichOp,0);const o=s[n]??w("No waitLoop handler for whichOp #",n),a=t.s11n.deserialize(!0)||[];o.f?await o.f(...a):h("Missing callback for opId",n)}catch(n){h("in waitLoop():",n)}};navigator.storage.getDirectory().then(function(e){t.rootDir=e,globalThis.onmessage=function({data:s}){switch(s.type){case"opfs-async-init":{const n=s.args;for(const o in n)t[o]=n[o];t.verbose=n.verbose??1,t.sabOPView=new Int32Array(t.sabOP),t.sabFileBufView=new Uint8Array(t.sabIO,0,t.fileBufferSize),t.sabS11nView=new Uint8Array(t.sabIO,t.sabS11nOffset,t.sabS11nSize),Object.keys(_).forEach(o=>{Number.isFinite(t.opIds[o])||w("Maintenance required: missing state.opIds[",o,"]")}),Q(),g("init state",t),O("opfs-async-inited"),q();break}case"opfs-async-restart":L&&(S("Restarting after opfs-async-shutdown. Might or might not work."),L=!1,q());break}},O("opfs-async-loaded")}).catch(e=>h("error initializing OPFS asyncer:",e))};globalThis.SharedArrayBuffer?globalThis.Atomics?!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory?O("opfs-unavailable","Missing required OPFS APIs."):v():O("opfs-unavailable","Missing Atomics API.","The server must emit the COOP/COEP response headers to enable that."):O("opfs-unavailable","Missing SharedArrayBuffer API.","The server must emit the COOP/COEP response headers to enable that.")})(); diff --git a/docus/dist/_nuxt/sqlite3-worker1-bundler-friendly-Bv6ABw9v.js b/docus/dist/_nuxt/sqlite3-worker1-bundler-friendly-Bv6ABw9v.js new file mode 100644 index 0000000..0c984f8 --- /dev/null +++ b/docus/dist/_nuxt/sqlite3-worker1-bundler-friendly-Bv6ABw9v.js @@ -0,0 +1,3 @@ +(function(){"use strict";var $e=(()=>{var Ie=self.location.href;return function(qe={}){var be,i=qe,ve,Ee,Ke=new Promise((e,t)=>{ve=e,Ee=t}),lt=typeof window=="object",Ue=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";const Ft=globalThis.sqlite3InitModuleState||Object.assign(Object.create(null),{debugModule:()=>{}});delete globalThis.sqlite3InitModuleState,Ft.debugModule("globalThis.location =",globalThis.location);var at=Object.assign({},i),ct="./this.program",ye="";function Ot(e){return i.locateFile?i.locateFile(e,ye):ye+e}var Je,ze;(lt||Ue)&&(Ue?ye=self.location.href:typeof document<"u"&&document.currentScript&&(ye=document.currentScript.src),Ie&&(ye=Ie),ye.startsWith("blob:")?ye="":ye=ye.substr(0,ye.replace(/[?#].*/,"").lastIndexOf("/")+1),Ue&&(ze=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),Je=e=>fetch(e,{credentials:"same-origin"}).then(t=>t.ok?t.arrayBuffer():Promise.reject(new Error(t.status+" : "+t.url))));var Xe=i.print||console.log.bind(console),ke=i.printErr||console.error.bind(console);Object.assign(i,at),at=null,i.arguments&&i.arguments,i.thisProgram&&(ct=i.thisProgram);var Qe=i.wasmBinary,Te,_t=!1,ge,Pe,Ne,ce,he,xe;function ut(){var e=Te.buffer;i.HEAP8=ge=new Int8Array(e),i.HEAP16=Ne=new Int16Array(e),i.HEAPU8=Pe=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=ce=new Int32Array(e),i.HEAPU32=he=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e),i.HEAP64=xe=new BigInt64Array(e),i.HEAPU64=new BigUint64Array(e)}if(i.wasmMemory)Te=i.wasmMemory;else{var Pt=i.INITIAL_MEMORY||16777216;Te=new WebAssembly.Memory({initial:Pt/65536,maximum:32768})}ut();var ft=[],dt=[],pt=[];function Lt(){var e=i.preRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Rt)),tt(ft)}function Ct(){!i.noFSInit&&!a.initialized&&a.init(),a.ignorePermissions=!1,tt(dt)}function Dt(){var e=i.postRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Mt)),tt(pt)}function Rt(e){ft.unshift(e)}function Nt(e){dt.unshift(e)}function Mt(e){pt.unshift(e)}var Fe=0,Me=null;function Zn(e){return e}function Ye(e){Fe++,i.monitorRunDependencies?.(Fe)}function We(e){if(Fe--,i.monitorRunDependencies?.(Fe),Fe==0&&Me){var t=Me;Me=null,t()}}function Ze(e){i.onAbort?.(e),e="Aborted("+e+")",ke(e),_t=!0,e+=". Build with -sASSERTIONS for more info.";var t=new WebAssembly.RuntimeError(e);throw Ee(t),t}var jt="data:application/octet-stream;base64,",ht=e=>e.startsWith(jt);function Bt(){if(i.locateFile){var e="sqlite3.wasm";return ht(e)?e:Ot(e)}return new URL(""+new URL("sqlite3-DBpDb1lf.wasm",self.location.href).href,self.location.href).href}var et;function mt(e){if(e==et&&Qe)return new Uint8Array(Qe);if(ze)return ze(e);throw"both async and sync fetching of the wasm failed"}function Ut(e){return Qe?Promise.resolve().then(()=>mt(e)):Je(e).then(t=>new Uint8Array(t),()=>mt(e))}function gt(e,t,n){return Ut(e).then(r=>WebAssembly.instantiate(r,t)).then(n,r=>{ke(`failed to asynchronously prepare wasm: ${r}`),Ze(r)})}function zt(e,t,n,r){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!ht(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var o=WebAssembly.instantiateStreaming(s,n);return o.then(r,function(p){return ke(`wasm streaming compile failed: ${p}`),ke("falling back to ArrayBuffer instantiation"),gt(t,n,r)})}):gt(t,n,r)}function Qt(){return{env:xt,wasi_snapshot_preview1:xt}}function Wt(){var e=Qt();function t(r,s){return h=r.exports,Nt(h.__wasm_call_ctors),We(),h}Ye();function n(r){t(r.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(r){ke(`Module.instantiateWasm callback failed with error: ${r}`),Ee(r)}return et??=Bt(),zt(Qe,et,e,n).catch(Ee),{}}var tt=e=>{e.forEach(t=>t(i))};i.noExitRuntime;var _e={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var n=0,r=e.length-1;r>=0;r--){var s=e[r];s==="."?e.splice(r,1):s===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:e=>{var t=_e.isAbs(e),n=e.substr(-1)==="/";return e=_e.normalizeArray(e.split("/").filter(r=>!!r),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=_e.splitPath(e),n=t[0],r=t[1];return!n&&!r?".":(r&&(r=r.substr(0,r.length-1)),n+r)},basename:e=>{if(e==="/")return"/";e=_e.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>_e.normalize(e.join("/")),join2:(e,t)=>_e.normalize(e+"/"+t)},Ht=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);Ze("initRandomDevice")},qt=e=>(qt=Ht())(e),Se={resolve:(...e)=>{for(var t="",n=!1,r=e.length-1;r>=-1&&!n;r--){var s=r>=0?e[r]:a.cwd();if(typeof s!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!s)return"";t=s+"/"+t,n=_e.isAbs(s)}return t=_e.normalizeArray(t.split("/").filter(o=>!!o),!n).join("/"),(n?"/":"")+t||"."},relative:(e,t)=>{e=Se.resolve(e).substr(1),t=Se.resolve(t).substr(1);function n(R){for(var z=0;z=0&&R[W]==="";W--);return z>W?[]:R.slice(z,W-z+1)}for(var r=n(e.split("/")),s=n(t.split("/")),o=Math.min(r.length,s.length),p=o,g=0;g{for(var r=t+n,s=t;e[s]&&!(s>=r);)++s;if(s-t>16&&e.buffer&&bt)return bt.decode(e.subarray(t,s));for(var o="";t>10,56320|R&1023)}}return o},nt=[],He=e=>{for(var t=0,n=0;n=55296&&r<=57343?(t+=4,++n):t+=3}return t},rt=(e,t,n,r)=>{if(!(r>0))return 0;for(var s=n,o=n+r-1,p=0;p=55296&&g<=57343){var O=e.charCodeAt(++p);g=65536+((g&1023)<<10)|O&1023}if(g<=127){if(n>=o)break;t[n++]=g}else if(g<=2047){if(n+1>=o)break;t[n++]=192|g>>6,t[n++]=128|g&63}else if(g<=65535){if(n+2>=o)break;t[n++]=224|g>>12,t[n++]=128|g>>6&63,t[n++]=128|g&63}else{if(n+3>=o)break;t[n++]=240|g>>18,t[n++]=128|g>>12&63,t[n++]=128|g>>6&63,t[n++]=128|g&63}}return t[n]=0,n-s};function yt(e,t,n){var r=He(e)+1,s=new Array(r),o=rt(e,s,0,s.length);return s.length=o,s}var Vt=()=>{if(!nt.length){var e=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(e=window.prompt("Input: "),e!==null&&(e+=` +`)),!e)return null;nt=yt(e)}return nt.shift()},Oe={ttys:[],init(){},shutdown(){},register(e,t){Oe.ttys[e]={input:[],output:[],ops:t},a.registerDevice(e,Oe.stream_ops)},stream_ops:{open(e){var t=Oe.ttys[e.node.rdev];if(!t)throw new a.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,n,r,s){if(!e.tty||!e.tty.ops.get_char)throw new a.ErrnoError(60);for(var o=0,p=0;p0&&(Xe(Le(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,n){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(ke(Le(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(ke(Le(e.output)),e.output=[])}}},Gt=(e,t)=>{Pe.fill(0,e,e+t)},wt=(e,t)=>Math.ceil(e/t)*t,vt=e=>{e=wt(e,65536);var t=St(65536,e);return t&&Gt(t,e),t},ie={ops_table:null,mount(e){return ie.createNode(null,"/",16895,0)},createNode(e,t,n,r){if(a.isBlkdev(n)||a.isFIFO(n))throw new a.ErrnoError(63);ie.ops_table||={dir:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr,lookup:ie.node_ops.lookup,mknod:ie.node_ops.mknod,rename:ie.node_ops.rename,unlink:ie.node_ops.unlink,rmdir:ie.node_ops.rmdir,readdir:ie.node_ops.readdir,symlink:ie.node_ops.symlink},stream:{llseek:ie.stream_ops.llseek}},file:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr},stream:{llseek:ie.stream_ops.llseek,read:ie.stream_ops.read,write:ie.stream_ops.write,allocate:ie.stream_ops.allocate,mmap:ie.stream_ops.mmap,msync:ie.stream_ops.msync}},link:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr,readlink:ie.node_ops.readlink},stream:{}},chrdev:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr},stream:a.chrdev_stream_ops}};var s=a.createNode(e,t,n,r);return a.isDir(s.mode)?(s.node_ops=ie.ops_table.dir.node,s.stream_ops=ie.ops_table.dir.stream,s.contents={}):a.isFile(s.mode)?(s.node_ops=ie.ops_table.file.node,s.stream_ops=ie.ops_table.file.stream,s.usedBytes=0,s.contents=null):a.isLink(s.mode)?(s.node_ops=ie.ops_table.link.node,s.stream_ops=ie.ops_table.link.stream):a.isChrdev(s.mode)&&(s.node_ops=ie.ops_table.chrdev.node,s.stream_ops=ie.ops_table.chrdev.stream),s.timestamp=Date.now(),e&&(e.contents[t]=s,e.timestamp=s.timestamp),s},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){var r=1024*1024;t=Math.max(t,n*(n>>0),n!=0&&(t=Math.max(t,256));var s=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(s.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=a.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,a.isDir(e.mode)?t.size=4096:a.isFile(e.mode)?t.size=e.usedBytes:a.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){t.mode!==void 0&&(e.mode=t.mode),t.timestamp!==void 0&&(e.timestamp=t.timestamp),t.size!==void 0&&ie.resizeFileStorage(e,t.size)},lookup(e,t){throw a.genericErrors[44]},mknod(e,t,n,r){return ie.createNode(e,t,n,r)},rename(e,t,n){if(a.isDir(e.mode)){var r;try{r=a.lookupNode(t,n)}catch{}if(r)for(var s in r.contents)throw new a.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp},unlink(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir(e,t){var n=a.lookupNode(e,t);for(var r in n.contents)throw new a.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir(e){var t=[".",".."];for(var n of Object.keys(e.contents))t.push(n);return t},symlink(e,t,n){var r=ie.createNode(e,t,41471,0);return r.link=n,r},readlink(e){if(!a.isLink(e.mode))throw new a.ErrnoError(28);return e.link}},stream_ops:{read(e,t,n,r,s){var o=e.node.contents;if(s>=e.node.usedBytes)return 0;var p=Math.min(e.node.usedBytes-s,r);if(p>8&&o.subarray)t.set(o.subarray(s,s+p),n);else for(var g=0;g0||n+t{var s=`al ${e}`;Je(e).then(o=>{t(new Uint8Array(o)),s&&We()},o=>{if(n)n();else throw`Loading data file "${e}" failed.`}),s&&Ye()},Kt=(e,t,n,r,s,o)=>{a.createDataFile(e,t,n,r,s,o)},Jt=i.preloadPlugins||[],Xt=(e,t,n,r)=>{typeof Browser<"u"&&Browser.init();var s=!1;return Jt.forEach(o=>{s||o.canHandle(t)&&(o.handle(e,t,n,r),s=!0)}),s},Yt=(e,t,n,r,s,o,p,g,O,R)=>{var z=t?Se.resolve(_e.join2(e,t)):e;function W(T){function A(D){R?.(),g||Kt(e,t,D,r,s,O),o?.(),We()}Xt(T,z,A,()=>{p?.(),We()})||A(T)}Ye(),typeof n=="string"?$t(n,W,p):W(n)},Zt=e=>{var t={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},n=t[e];if(typeof n>"u")throw new Error(`Unknown file open mode: ${e}`);return n},st=(e,t)=>{var n=0;return e&&(n|=365),t&&(n|=146),n},a={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){this.name="ErrnoError",this.errno=e}},genericErrors:{},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(e){this.node=e}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e}get position(){return this.shared.position}set position(e){this.shared.position=e}},FSNode:class{constructor(e,t,n,r){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=a.nextInode++,this.name=t,this.mode=n,this.node_ops={},this.stream_ops={},this.rdev=r,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(e){e?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(e){e?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return a.isDir(this.mode)}get isDevice(){return a.isChrdev(this.mode)}},lookupPath(e,t={}){if(e=Se.resolve(e),!e)return{path:"",node:null};var n={follow_mount:!0,recurse_count:0};if(t=Object.assign(n,t),t.recurse_count>8)throw new a.ErrnoError(32);for(var r=e.split("/").filter(W=>!!W),s=a.root,o="/",p=0;p40)throw new a.ErrnoError(32)}}return{path:o,node:s}},getPath(e){for(var t;;){if(a.isRoot(e)){var n=e.mount.mountpoint;return t?n[n.length-1]!=="/"?`${n}/${t}`:n+t:n}t=t?`${e.name}/${t}`:e.name,e=e.parent}},hashName(e,t){for(var n=0,r=0;r>>0)%a.nameTable.length},hashAddNode(e){var t=a.hashName(e.parent.id,e.name);e.name_next=a.nameTable[t],a.nameTable[t]=e},hashRemoveNode(e){var t=a.hashName(e.parent.id,e.name);if(a.nameTable[t]===e)a.nameTable[t]=e.name_next;else for(var n=a.nameTable[t];n;){if(n.name_next===e){n.name_next=e.name_next;break}n=n.name_next}},lookupNode(e,t){var n=a.mayLookup(e);if(n)throw new a.ErrnoError(n);for(var r=a.hashName(e.id,t),s=a.nameTable[r];s;s=s.name_next){var o=s.name;if(s.parent.id===e.id&&o===t)return s}return a.lookup(e,t)},createNode(e,t,n,r){var s=new a.FSNode(e,t,n,r);return a.hashAddNode(s),s},destroyNode(e){a.hashRemoveNode(e)},isRoot(e){return e===e.parent},isMountpoint(e){return!!e.mounted},isFile(e){return(e&61440)===32768},isDir(e){return(e&61440)===16384},isLink(e){return(e&61440)===40960},isChrdev(e){return(e&61440)===8192},isBlkdev(e){return(e&61440)===24576},isFIFO(e){return(e&61440)===4096},isSocket(e){return(e&49152)===49152},flagsToPermissionString(e){var t=["r","w","rw"][e&3];return e&512&&(t+="w"),t},nodePermissions(e,t){return a.ignorePermissions?0:t.includes("r")&&!(e.mode&292)||t.includes("w")&&!(e.mode&146)||t.includes("x")&&!(e.mode&73)?2:0},mayLookup(e){if(!a.isDir(e.mode))return 54;var t=a.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate(e,t){try{var n=a.lookupNode(e,t);return 20}catch{}return a.nodePermissions(e,"wx")},mayDelete(e,t,n){var r;try{r=a.lookupNode(e,t)}catch(o){return o.errno}var s=a.nodePermissions(e,"wx");if(s)return s;if(n){if(!a.isDir(r.mode))return 54;if(a.isRoot(r)||a.getPath(r)===a.cwd())return 10}else if(a.isDir(r.mode))return 31;return 0},mayOpen(e,t){return e?a.isLink(e.mode)?32:a.isDir(e.mode)&&(a.flagsToPermissionString(t)!=="r"||t&512)?31:a.nodePermissions(e,a.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd(){for(var e=0;e<=a.MAX_OPEN_FDS;e++)if(!a.streams[e])return e;throw new a.ErrnoError(33)},getStreamChecked(e){var t=a.getStream(e);if(!t)throw new a.ErrnoError(8);return t},getStream:e=>a.streams[e],createStream(e,t=-1){return e=Object.assign(new a.FSStream,e),t==-1&&(t=a.nextfd()),e.fd=t,a.streams[t]=e,e},closeStream(e){a.streams[e]=null},dupStream(e,t=-1){var n=a.createStream(e,t);return n.stream_ops?.dup?.(n),n},chrdev_stream_ops:{open(e){var t=a.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open?.(e)},llseek(){throw new a.ErrnoError(70)}},major:e=>e>>8,minor:e=>e&255,makedev:(e,t)=>e<<8|t,registerDevice(e,t){a.devices[e]={stream_ops:t}},getDevice:e=>a.devices[e],getMounts(e){for(var t=[],n=[e];n.length;){var r=n.pop();t.push(r),n.push(...r.mounts)}return t},syncfs(e,t){typeof e=="function"&&(t=e,e=!1),a.syncFSRequests++,a.syncFSRequests>1&&ke(`warning: ${a.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var n=a.getMounts(a.root.mount),r=0;function s(p){return a.syncFSRequests--,t(p)}function o(p){if(p)return o.errored?void 0:(o.errored=!0,s(p));++r>=n.length&&s(null)}n.forEach(p=>{if(!p.type.syncfs)return o(null);p.type.syncfs(p,e,o)})},mount(e,t,n){var r=n==="/",s=!n,o;if(r&&a.root)throw new a.ErrnoError(10);if(!r&&!s){var p=a.lookupPath(n,{follow_mount:!1});if(n=p.path,o=p.node,a.isMountpoint(o))throw new a.ErrnoError(10);if(!a.isDir(o.mode))throw new a.ErrnoError(54)}var g={type:e,opts:t,mountpoint:n,mounts:[]},O=e.mount(g);return O.mount=g,g.root=O,r?a.root=O:o&&(o.mounted=g,o.mount&&o.mount.mounts.push(g)),O},unmount(e){var t=a.lookupPath(e,{follow_mount:!1});if(!a.isMountpoint(t.node))throw new a.ErrnoError(28);var n=t.node,r=n.mounted,s=a.getMounts(r);Object.keys(a.nameTable).forEach(p=>{for(var g=a.nameTable[p];g;){var O=g.name_next;s.includes(g.mount)&&a.destroyNode(g),g=O}}),n.mounted=null;var o=n.mount.mounts.indexOf(r);n.mount.mounts.splice(o,1)},lookup(e,t){return e.node_ops.lookup(e,t)},mknod(e,t,n){var r=a.lookupPath(e,{parent:!0}),s=r.node,o=_e.basename(e);if(!o||o==="."||o==="..")throw new a.ErrnoError(28);var p=a.mayCreate(s,o);if(p)throw new a.ErrnoError(p);if(!s.node_ops.mknod)throw new a.ErrnoError(63);return s.node_ops.mknod(s,o,t,n)},create(e,t){return t=t!==void 0?t:438,t&=4095,t|=32768,a.mknod(e,t,0)},mkdir(e,t){return t=t!==void 0?t:511,t&=1023,t|=16384,a.mknod(e,t,0)},mkdirTree(e,t){for(var n=e.split("/"),r="",s=0;s"u"&&(n=t,t=438),t|=8192,a.mknod(e,t,n)},symlink(e,t){if(!Se.resolve(e))throw new a.ErrnoError(44);var n=a.lookupPath(t,{parent:!0}),r=n.node;if(!r)throw new a.ErrnoError(44);var s=_e.basename(t),o=a.mayCreate(r,s);if(o)throw new a.ErrnoError(o);if(!r.node_ops.symlink)throw new a.ErrnoError(63);return r.node_ops.symlink(r,s,e)},rename(e,t){var n=_e.dirname(e),r=_e.dirname(t),s=_e.basename(e),o=_e.basename(t),p,g,O;if(p=a.lookupPath(e,{parent:!0}),g=p.node,p=a.lookupPath(t,{parent:!0}),O=p.node,!g||!O)throw new a.ErrnoError(44);if(g.mount!==O.mount)throw new a.ErrnoError(75);var R=a.lookupNode(g,s),z=Se.relative(e,r);if(z.charAt(0)!==".")throw new a.ErrnoError(28);if(z=Se.relative(t,n),z.charAt(0)!==".")throw new a.ErrnoError(55);var W;try{W=a.lookupNode(O,o)}catch{}if(R!==W){var T=a.isDir(R.mode),A=a.mayDelete(g,s,T);if(A)throw new a.ErrnoError(A);if(A=W?a.mayDelete(O,o,T):a.mayCreate(O,o),A)throw new a.ErrnoError(A);if(!g.node_ops.rename)throw new a.ErrnoError(63);if(a.isMountpoint(R)||W&&a.isMountpoint(W))throw new a.ErrnoError(10);if(O!==g&&(A=a.nodePermissions(g,"w"),A))throw new a.ErrnoError(A);a.hashRemoveNode(R);try{g.node_ops.rename(R,O,o),R.parent=O}catch(D){throw D}finally{a.hashAddNode(R)}}},rmdir(e){var t=a.lookupPath(e,{parent:!0}),n=t.node,r=_e.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!0);if(o)throw new a.ErrnoError(o);if(!n.node_ops.rmdir)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.rmdir(n,r),a.destroyNode(s)},readdir(e){var t=a.lookupPath(e,{follow:!0}),n=t.node;if(!n.node_ops.readdir)throw new a.ErrnoError(54);return n.node_ops.readdir(n)},unlink(e){var t=a.lookupPath(e,{parent:!0}),n=t.node;if(!n)throw new a.ErrnoError(44);var r=_e.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!1);if(o)throw new a.ErrnoError(o);if(!n.node_ops.unlink)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.unlink(n,r),a.destroyNode(s)},readlink(e){var t=a.lookupPath(e),n=t.node;if(!n)throw new a.ErrnoError(44);if(!n.node_ops.readlink)throw new a.ErrnoError(28);return Se.resolve(a.getPath(n.parent),n.node_ops.readlink(n))},stat(e,t){var n=a.lookupPath(e,{follow:!t}),r=n.node;if(!r)throw new a.ErrnoError(44);if(!r.node_ops.getattr)throw new a.ErrnoError(63);return r.node_ops.getattr(r)},lstat(e){return a.stat(e,!0)},chmod(e,t,n){var r;if(typeof e=="string"){var s=a.lookupPath(e,{follow:!n});r=s.node}else r=e;if(!r.node_ops.setattr)throw new a.ErrnoError(63);r.node_ops.setattr(r,{mode:t&4095|r.mode&-4096,timestamp:Date.now()})},lchmod(e,t){a.chmod(e,t,!0)},fchmod(e,t){var n=a.getStreamChecked(e);a.chmod(n.node,t)},chown(e,t,n,r){var s;if(typeof e=="string"){var o=a.lookupPath(e,{follow:!r});s=o.node}else s=e;if(!s.node_ops.setattr)throw new a.ErrnoError(63);s.node_ops.setattr(s,{timestamp:Date.now()})},lchown(e,t,n){a.chown(e,t,n,!0)},fchown(e,t,n){var r=a.getStreamChecked(e);a.chown(r.node,t,n)},truncate(e,t){if(t<0)throw new a.ErrnoError(28);var n;if(typeof e=="string"){var r=a.lookupPath(e,{follow:!0});n=r.node}else n=e;if(!n.node_ops.setattr)throw new a.ErrnoError(63);if(a.isDir(n.mode))throw new a.ErrnoError(31);if(!a.isFile(n.mode))throw new a.ErrnoError(28);var s=a.nodePermissions(n,"w");if(s)throw new a.ErrnoError(s);n.node_ops.setattr(n,{size:t,timestamp:Date.now()})},ftruncate(e,t){var n=a.getStreamChecked(e);if((n.flags&2097155)===0)throw new a.ErrnoError(28);a.truncate(n.node,t)},utime(e,t,n){var r=a.lookupPath(e,{follow:!0}),s=r.node;s.node_ops.setattr(s,{timestamp:Math.max(t,n)})},open(e,t,n){if(e==="")throw new a.ErrnoError(44);t=typeof t=="string"?Zt(t):t,t&64?(n=typeof n>"u"?438:n,n=n&4095|32768):n=0;var r;if(typeof e=="object")r=e;else{e=_e.normalize(e);try{var s=a.lookupPath(e,{follow:!(t&131072)});r=s.node}catch{}}var o=!1;if(t&64)if(r){if(t&128)throw new a.ErrnoError(20)}else r=a.mknod(e,n,0),o=!0;if(!r)throw new a.ErrnoError(44);if(a.isChrdev(r.mode)&&(t&=-513),t&65536&&!a.isDir(r.mode))throw new a.ErrnoError(54);if(!o){var p=a.mayOpen(r,t);if(p)throw new a.ErrnoError(p)}t&512&&!o&&a.truncate(r,0),t&=-131713;var g=a.createStream({node:r,path:a.getPath(r),flags:t,seekable:!0,position:0,stream_ops:r.stream_ops,ungotten:[],error:!1});return g.stream_ops.open&&g.stream_ops.open(g),i.logReadFiles&&!(t&1)&&(e in a.readFiles||(a.readFiles[e]=1)),g},close(e){if(a.isClosed(e))throw new a.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(t){throw t}finally{a.closeStream(e.fd)}e.fd=null},isClosed(e){return e.fd===null},llseek(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new a.ErrnoError(70);if(n!=0&&n!=1&&n!=2)throw new a.ErrnoError(28);return e.position=e.stream_ops.llseek(e,t,n),e.ungotten=[],e.position},read(e,t,n,r,s){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===1)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.read)throw new a.ErrnoError(28);var o=typeof s<"u";if(!o)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var p=e.stream_ops.read(e,t,n,r,s);return o||(e.position+=p),p},write(e,t,n,r,s,o){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.write)throw new a.ErrnoError(28);e.seekable&&e.flags&1024&&a.llseek(e,0,2);var p=typeof s<"u";if(!p)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var g=e.stream_ops.write(e,t,n,r,s,o);return p||(e.position+=g),g},allocate(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(t<0||n<=0)throw new a.ErrnoError(28);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(!a.isFile(e.node.mode)&&!a.isDir(e.node.mode))throw new a.ErrnoError(43);if(!e.stream_ops.allocate)throw new a.ErrnoError(138);e.stream_ops.allocate(e,t,n)},mmap(e,t,n,r,s){if((r&2)!==0&&(s&2)===0&&(e.flags&2097155)!==2)throw new a.ErrnoError(2);if((e.flags&2097155)===1)throw new a.ErrnoError(2);if(!e.stream_ops.mmap)throw new a.ErrnoError(43);if(!t)throw new a.ErrnoError(28);return e.stream_ops.mmap(e,t,n,r,s)},msync(e,t,n,r,s){return e.stream_ops.msync?e.stream_ops.msync(e,t,n,r,s):0},ioctl(e,t,n){if(!e.stream_ops.ioctl)throw new a.ErrnoError(59);return e.stream_ops.ioctl(e,t,n)},readFile(e,t={}){if(t.flags=t.flags||0,t.encoding=t.encoding||"binary",t.encoding!=="utf8"&&t.encoding!=="binary")throw new Error(`Invalid encoding type "${t.encoding}"`);var n,r=a.open(e,t.flags),s=a.stat(e),o=s.size,p=new Uint8Array(o);return a.read(r,p,0,o,0),t.encoding==="utf8"?n=Le(p):t.encoding==="binary"&&(n=p),a.close(r),n},writeFile(e,t,n={}){n.flags=n.flags||577;var r=a.open(e,n.flags,n.mode);if(typeof t=="string"){var s=new Uint8Array(He(t)+1),o=rt(t,s,0,s.length);a.write(r,s,0,o,void 0,n.canOwn)}else if(ArrayBuffer.isView(t))a.write(r,t,0,t.byteLength,void 0,n.canOwn);else throw new Error("Unsupported data type");a.close(r)},cwd:()=>a.currentPath,chdir(e){var t=a.lookupPath(e,{follow:!0});if(t.node===null)throw new a.ErrnoError(44);if(!a.isDir(t.node.mode))throw new a.ErrnoError(54);var n=a.nodePermissions(t.node,"x");if(n)throw new a.ErrnoError(n);a.currentPath=t.path},createDefaultDirectories(){a.mkdir("/tmp"),a.mkdir("/home"),a.mkdir("/home/web_user")},createDefaultDevices(){a.mkdir("/dev"),a.registerDevice(a.makedev(1,3),{read:()=>0,write:(r,s,o,p,g)=>p}),a.mkdev("/dev/null",a.makedev(1,3)),Oe.register(a.makedev(5,0),Oe.default_tty_ops),Oe.register(a.makedev(6,0),Oe.default_tty1_ops),a.mkdev("/dev/tty",a.makedev(5,0)),a.mkdev("/dev/tty1",a.makedev(6,0));var e=new Uint8Array(1024),t=0,n=()=>(t===0&&(t=qt(e).byteLength),e[--t]);a.createDevice("/dev","random",n),a.createDevice("/dev","urandom",n),a.mkdir("/dev/shm"),a.mkdir("/dev/shm/tmp")},createSpecialDirectories(){a.mkdir("/proc");var e=a.mkdir("/proc/self");a.mkdir("/proc/self/fd"),a.mount({mount(){var t=a.createNode(e,"fd",16895,73);return t.node_ops={lookup(n,r){var s=+r,o=a.getStreamChecked(s),p={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>o.path}};return p.parent=p,p}},t}},{},"/proc/self/fd")},createStandardStreams(e,t,n){e?a.createDevice("/dev","stdin",e):a.symlink("/dev/tty","/dev/stdin"),t?a.createDevice("/dev","stdout",null,t):a.symlink("/dev/tty","/dev/stdout"),n?a.createDevice("/dev","stderr",null,n):a.symlink("/dev/tty1","/dev/stderr"),a.open("/dev/stdin",0),a.open("/dev/stdout",1),a.open("/dev/stderr",1)},staticInit(){[44].forEach(e=>{a.genericErrors[e]=new a.ErrnoError(e),a.genericErrors[e].stack=""}),a.nameTable=new Array(4096),a.mount(ie,{},"/"),a.createDefaultDirectories(),a.createDefaultDevices(),a.createSpecialDirectories(),a.filesystems={MEMFS:ie}},init(e,t,n){a.initialized=!0,e??=i.stdin,t??=i.stdout,n??=i.stderr,a.createStandardStreams(e,t,n)},quit(){a.initialized=!1;for(var e=0;ethis.length-1||A<0)){var D=A%this.chunkSize,q=A/this.chunkSize|0;return this.getter(q)[D]}}setDataGetter(A){this.getter=A}cacheLength(){var A=new XMLHttpRequest;if(A.open("HEAD",n,!1),A.send(null),!(A.status>=200&&A.status<300||A.status===304))throw new Error("Couldn't load "+n+". Status: "+A.status);var D=Number(A.getResponseHeader("Content-length")),q,w=(q=A.getResponseHeader("Accept-Ranges"))&&q==="bytes",x=(q=A.getResponseHeader("Content-Encoding"))&&q==="gzip",N=1024*1024;w||(N=D);var P=(L,$)=>{if(L>$)throw new Error("invalid range ("+L+", "+$+") or no bytes requested!");if($>D-1)throw new Error("only "+D+" bytes available! programmer error!");var c=new XMLHttpRequest;if(c.open("GET",n,!1),D!==N&&c.setRequestHeader("Range","bytes="+L+"-"+$),c.responseType="arraybuffer",c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined"),c.send(null),!(c.status>=200&&c.status<300||c.status===304))throw new Error("Couldn't load "+n+". Status: "+c.status);return c.response!==void 0?new Uint8Array(c.response||[]):yt(c.responseText||"")},S=this;S.setDataGetter(L=>{var $=L*N,c=(L+1)*N-1;if(c=Math.min(c,D-1),typeof S.chunks[L]>"u"&&(S.chunks[L]=P($,c)),typeof S.chunks[L]>"u")throw new Error("doXHR failed!");return S.chunks[L]}),(x||!D)&&(N=D=1,D=this.getter(0).length,N=D,Xe("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=D,this._chunkSize=N,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){if(!Ue)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var p=new o,g={isDevice:!1,contents:p}}else var g={isDevice:!1,url:n};var O=a.createFile(e,t,g,r,s);g.contents?O.contents=g.contents:g.url&&(O.contents=null,O.url=g.url),Object.defineProperties(O,{usedBytes:{get:function(){return this.contents.length}}});var R={},z=Object.keys(O.stream_ops);z.forEach(T=>{var A=O.stream_ops[T];R[T]=(...D)=>(a.forceLoadFile(O),A(...D))});function W(T,A,D,q,w){var x=T.node.contents;if(w>=x.length)return 0;var N=Math.min(x.length-w,q);if(x.slice)for(var P=0;P(a.forceLoadFile(O),W(T,A,D,q,w)),R.mmap=(T,A,D,q,w)=>{a.forceLoadFile(O);var x=vt(A);if(!x)throw new a.ErrnoError(48);return W(T,ge,x,A,D),{ptr:x,allocated:!0}},O.stream_ops=R,O}},en=(e,t)=>e?Le(Pe,e,t):"",le={DEFAULT_POLLMASK:5,calculateAt(e,t,n){if(_e.isAbs(t))return t;var r;if(e===-100)r=a.cwd();else{var s=le.getStreamFromFD(e);r=s.path}if(t.length==0){if(!n)throw new a.ErrnoError(44);return r}return _e.join2(r,t)},doStat(e,t,n){var r=e(t);ce[n>>2]=r.dev,ce[n+4>>2]=r.mode,he[n+8>>2]=r.nlink,ce[n+12>>2]=r.uid,ce[n+16>>2]=r.gid,ce[n+20>>2]=r.rdev,xe[n+24>>3]=BigInt(r.size),ce[n+32>>2]=4096,ce[n+36>>2]=r.blocks;var s=r.atime.getTime(),o=r.mtime.getTime(),p=r.ctime.getTime();return xe[n+40>>3]=BigInt(Math.floor(s/1e3)),he[n+48>>2]=s%1e3*1e3*1e3,xe[n+56>>3]=BigInt(Math.floor(o/1e3)),he[n+64>>2]=o%1e3*1e3*1e3,xe[n+72>>3]=BigInt(Math.floor(p/1e3)),he[n+80>>2]=p%1e3*1e3*1e3,xe[n+88>>3]=BigInt(r.ino),0},doMsync(e,t,n,r,s){if(!a.isFile(t.node.mode))throw new a.ErrnoError(43);if(r&2)return 0;var o=Pe.slice(e,e+n);a.msync(t,o,s,n,r)},getStreamFromFD(e){var t=a.getStreamChecked(e);return t},varargs:void 0,getStr(e){var t=en(e);return t}};function tn(e,t){try{return e=le.getStr(e),a.chmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function nn(e,t,n,r){try{if(t=le.getStr(t),t=le.calculateAt(e,t),n&-8)return-28;var s=a.lookupPath(t,{follow:!0}),o=s.node;if(!o)return-44;var p="";return n&4&&(p+="r"),n&2&&(p+="w"),n&1&&(p+="x"),p&&a.nodePermissions(o,p)?-2:0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function rn(e,t){try{return a.fchmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function sn(e,t,n){try{return a.fchown(e,t,n),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function Ve(){var e=ce[+le.varargs>>2];return le.varargs+=4,e}var Ce=Ve;function on(e,t,n){le.varargs=n;try{var r=le.getStreamFromFD(e);switch(t){case 0:{var s=Ve();if(s<0)return-28;for(;a.streams[s];)s++;var o;return o=a.dupStream(r,s),o.fd}case 1:case 2:return 0;case 3:return r.flags;case 4:{var s=Ve();return r.flags|=s,0}case 12:{var s=Ce(),p=0;return Ne[s+p>>1]=2,0}case 13:case 14:return 0}return-28}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function ln(e,t){try{var n=le.getStreamFromFD(e);return le.doStat(a.stat,n.path,t)}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var an=9007199254740992,cn=-9007199254740992,je=e=>ean?NaN:Number(e);function _n(e,t){t=je(t);try{return isNaN(t)?61:(a.ftruncate(e,t),0)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}var De=(e,t,n)=>rt(e,Pe,t,n);function un(e,t){try{if(t===0)return-28;var n=a.cwd(),r=He(n)+1;return t"u"||s.name!=="ErrnoError")throw s;return-s.errno}}function fn(e,t,n){le.varargs=n;try{var r=le.getStreamFromFD(e);switch(t){case 21509:return r.tty?0:-59;case 21505:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcgets){var s=r.tty.ops.ioctl_tcgets(r),o=Ce();ce[o>>2]=s.c_iflag||0,ce[o+4>>2]=s.c_oflag||0,ce[o+8>>2]=s.c_cflag||0,ce[o+12>>2]=s.c_lflag||0;for(var p=0;p<32;p++)ge[o+p+17]=s.c_cc[p]||0;return 0}return 0}case 21510:case 21511:case 21512:return r.tty?0:-59;case 21506:case 21507:case 21508:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcsets){for(var o=Ce(),g=ce[o>>2],O=ce[o+4>>2],R=ce[o+8>>2],z=ce[o+12>>2],W=[],p=0;p<32;p++)W.push(ge[o+p+17]);return r.tty.ops.ioctl_tcsets(r.tty,t,{c_iflag:g,c_oflag:O,c_cflag:R,c_lflag:z,c_cc:W})}return 0}case 21519:{if(!r.tty)return-59;var o=Ce();return ce[o>>2]=0,0}case 21520:return r.tty?-28:-59;case 21531:{var o=Ce();return a.ioctl(r,t,o)}case 21523:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tiocgwinsz){var T=r.tty.ops.ioctl_tiocgwinsz(r.tty),o=Ce();Ne[o>>1]=T[0],Ne[o+2>>1]=T[1]}return 0}case 21524:return r.tty?0:-59;case 21515:return r.tty?0:-59;default:return-28}}catch(A){if(typeof a>"u"||A.name!=="ErrnoError")throw A;return-A.errno}}function dn(e,t){try{return e=le.getStr(e),le.doStat(a.lstat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function pn(e,t,n){try{return t=le.getStr(t),t=le.calculateAt(e,t),t=_e.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),a.mkdir(t,n,0),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function hn(e,t,n,r){try{t=le.getStr(t);var s=r&256,o=r&4096;return r=r&-6401,t=le.calculateAt(e,t,o),le.doStat(s?a.lstat:a.stat,t,n)}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}function mn(e,t,n,r){le.varargs=r;try{t=le.getStr(t),t=le.calculateAt(e,t);var s=r?Ve():0;return a.open(t,n,s).fd}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return-o.errno}}function gn(e,t,n,r){try{if(t=le.getStr(t),t=le.calculateAt(e,t),r<=0)return-28;var s=a.readlink(t),o=Math.min(r,He(s)),p=ge[n+o];return De(s,n,r+1),ge[n+o]=p,o}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function qn(e){try{return e=le.getStr(e),a.rmdir(e),0}catch(t){if(typeof a>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}function bn(e,t){try{return e=le.getStr(e),le.doStat(a.stat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function yn(e,t,n){try{return t=le.getStr(t),t=le.calculateAt(e,t),n===0?a.unlink(t):n===512?a.rmdir(t):Ze("Invalid flags passed to unlinkat"),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var Et=e=>he[e>>2]+ce[e+4>>2]*4294967296;function wn(e,t,n,r){try{t=le.getStr(t),t=le.calculateAt(e,t,!0);var s=Date.now(),o,p;if(!n)o=s,p=s;else{var g=Et(n),O=ce[n+8>>2];O==1073741823?o=s:O==1073741822?o=-1:o=g*1e3+O/1e6,n+=16,g=Et(n),O=ce[n+8>>2],O==1073741823?p=s:O==1073741822?p=-1:p=g*1e3+O/1e6}return(p!=-1||o!=-1)&&a.utime(t,o,p),0}catch(R){if(typeof a>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var vn=1,En=()=>vn,xn=e=>e%4===0&&(e%100!==0||e%400===0),Sn=[0,31,60,91,121,152,182,213,244,274,305,335],An=[0,31,59,90,120,151,181,212,243,273,304,334],In=e=>{var t=xn(e.getFullYear()),n=t?Sn:An,r=n[e.getMonth()]+e.getDate()-1;return r};function kn(e,t){e=je(e);var n=new Date(e*1e3);ce[t>>2]=n.getSeconds(),ce[t+4>>2]=n.getMinutes(),ce[t+8>>2]=n.getHours(),ce[t+12>>2]=n.getDate(),ce[t+16>>2]=n.getMonth(),ce[t+20>>2]=n.getFullYear()-1900,ce[t+24>>2]=n.getDay();var r=In(n)|0;ce[t+28>>2]=r,ce[t+36>>2]=-(n.getTimezoneOffset()*60);var s=new Date(n.getFullYear(),0,1),o=new Date(n.getFullYear(),6,1).getTimezoneOffset(),p=s.getTimezoneOffset(),g=(o!=p&&n.getTimezoneOffset()==Math.min(p,o))|0;ce[t+32>>2]=g}function Tn(e,t,n,r,s,o,p){s=je(s);try{if(isNaN(s))return 61;var g=le.getStreamFromFD(r),O=a.mmap(g,e,s,t,n),R=O.ptr;return ce[o>>2]=O.allocated,he[p>>2]=R,0}catch(z){if(typeof a>"u"||z.name!=="ErrnoError")throw z;return-z.errno}}function Fn(e,t,n,r,s,o){o=je(o);try{var p=le.getStreamFromFD(s);n&2&&le.doMsync(e,p,t,r,o)}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}var On=(e,t,n,r)=>{var s=new Date().getFullYear(),o=new Date(s,0,1),p=new Date(s,6,1),g=o.getTimezoneOffset(),O=p.getTimezoneOffset(),R=Math.max(g,O);he[e>>2]=R*60,ce[t>>2]=+(g!=O);var z=A=>{var D=A>=0?"-":"+",q=Math.abs(A),w=String(Math.floor(q/60)).padStart(2,"0"),x=String(q%60).padStart(2,"0");return`UTC${D}${w}${x}`},W=z(g),T=z(O);ODate.now(),Ln=()=>performance.now(),Cn=()=>2147483648,Dn=e=>{var t=Te.buffer,n=(e-t.byteLength+65535)/65536|0;try{return Te.grow(n),ut(),1}catch{}},Rn=e=>{var t=Pe.length;e>>>=0;var n=Cn();if(e>n)return!1;for(var r=1;r<=4;r*=2){var s=t*(1+.2/r);s=Math.min(s,e+100663296);var o=Math.min(n,wt(Math.max(e,s),65536)),p=Dn(o);if(p)return!0}return!1},it={},Nn=()=>ct||"./this.program",Be=()=>{if(!Be.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:Nn()};for(var n in it)it[n]===void 0?delete t[n]:t[n]=it[n];var r=[];for(var n in t)r.push(`${n}=${t[n]}`);Be.strings=r}return Be.strings},Mn=(e,t)=>{for(var n=0;n{var n=0;return Be().forEach((r,s)=>{var o=t+n;he[e+s*4>>2]=o,Mn(r,o),n+=r.length+1}),0},Bn=(e,t)=>{var n=Be();he[e>>2]=n.length;var r=0;return n.forEach(s=>r+=s.length+1),he[t>>2]=r,0};function Un(e){try{var t=le.getStreamFromFD(e);return a.close(t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}function zn(e,t){try{var n=0,r=0,s=0,o=le.getStreamFromFD(e),p=o.tty?2:a.isDir(o.mode)?3:a.isLink(o.mode)?7:4;return ge[t]=p,Ne[t+2>>1]=s,xe[t+8>>3]=BigInt(n),xe[t+16>>3]=BigInt(r),0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return g.errno}}var Qn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=he[t+4>>2];t+=8;var O=a.read(e,ge,p,g,r);if(O<0)return-1;if(s+=O,O>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}function Hn(e,t,n,r){t=je(t);try{if(isNaN(t))return 61;var s=le.getStreamFromFD(e);return a.llseek(s,t,n),xe[r>>3]=BigInt(s.position),s.getdents&&t===0&&n===0&&(s.getdents=null),0}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return o.errno}}function Vn(e){try{var t=le.getStreamFromFD(e);return t.stream_ops?.fsync?t.stream_ops.fsync(t):0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}var Gn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=he[t+4>>2];t+=8;var O=a.write(e,ge,p,g,r);if(O<0)return-1;if(s+=O,O>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}a.createPreloadedFile=Yt,a.staticInit();var xt={__syscall_chmod:tn,__syscall_faccessat:nn,__syscall_fchmod:rn,__syscall_fchown32:sn,__syscall_fcntl64:on,__syscall_fstat64:ln,__syscall_ftruncate64:_n,__syscall_getcwd:un,__syscall_ioctl:fn,__syscall_lstat64:dn,__syscall_mkdirat:pn,__syscall_newfstatat:hn,__syscall_openat:mn,__syscall_readlinkat:gn,__syscall_rmdir:qn,__syscall_stat64:bn,__syscall_unlinkat:yn,__syscall_utimensat:wn,_emscripten_get_now_is_monotonic:En,_localtime_js:kn,_mmap_js:Tn,_munmap_js:Fn,_tzset_js:On,emscripten_date_now:Pn,emscripten_get_now:Ln,emscripten_resize_heap:Rn,environ_get:jn,environ_sizes_get:Bn,fd_close:Un,fd_fdstat_get:zn,fd_read:Wn,fd_seek:Hn,fd_sync:Vn,fd_write:$n,memory:Te},h=Wt();i._sqlite3_status64=(e,t,n,r)=>(i._sqlite3_status64=h.sqlite3_status64)(e,t,n,r),i._sqlite3_status=(e,t,n,r)=>(i._sqlite3_status=h.sqlite3_status)(e,t,n,r),i._sqlite3_db_status=(e,t,n,r,s)=>(i._sqlite3_db_status=h.sqlite3_db_status)(e,t,n,r,s),i._sqlite3_msize=e=>(i._sqlite3_msize=h.sqlite3_msize)(e),i._sqlite3_vfs_find=e=>(i._sqlite3_vfs_find=h.sqlite3_vfs_find)(e),i._sqlite3_initialize=()=>(i._sqlite3_initialize=h.sqlite3_initialize)(),i._sqlite3_malloc=e=>(i._sqlite3_malloc=h.sqlite3_malloc)(e),i._sqlite3_free=e=>(i._sqlite3_free=h.sqlite3_free)(e),i._sqlite3_vfs_register=(e,t)=>(i._sqlite3_vfs_register=h.sqlite3_vfs_register)(e,t),i._sqlite3_vfs_unregister=e=>(i._sqlite3_vfs_unregister=h.sqlite3_vfs_unregister)(e),i._sqlite3_malloc64=e=>(i._sqlite3_malloc64=h.sqlite3_malloc64)(e),i._sqlite3_realloc=(e,t)=>(i._sqlite3_realloc=h.sqlite3_realloc)(e,t),i._sqlite3_realloc64=(e,t)=>(i._sqlite3_realloc64=h.sqlite3_realloc64)(e,t),i._sqlite3_value_text=e=>(i._sqlite3_value_text=h.sqlite3_value_text)(e),i._sqlite3_randomness=(e,t)=>(i._sqlite3_randomness=h.sqlite3_randomness)(e,t),i._sqlite3_stricmp=(e,t)=>(i._sqlite3_stricmp=h.sqlite3_stricmp)(e,t),i._sqlite3_strnicmp=(e,t,n)=>(i._sqlite3_strnicmp=h.sqlite3_strnicmp)(e,t,n),i._sqlite3_uri_parameter=(e,t)=>(i._sqlite3_uri_parameter=h.sqlite3_uri_parameter)(e,t),i._sqlite3_uri_boolean=(e,t,n)=>(i._sqlite3_uri_boolean=h.sqlite3_uri_boolean)(e,t,n),i._sqlite3_serialize=(e,t,n,r)=>(i._sqlite3_serialize=h.sqlite3_serialize)(e,t,n,r),i._sqlite3_prepare_v2=(e,t,n,r,s)=>(i._sqlite3_prepare_v2=h.sqlite3_prepare_v2)(e,t,n,r,s),i._sqlite3_step=e=>(i._sqlite3_step=h.sqlite3_step)(e),i._sqlite3_column_int64=(e,t)=>(i._sqlite3_column_int64=h.sqlite3_column_int64)(e,t),i._sqlite3_reset=e=>(i._sqlite3_reset=h.sqlite3_reset)(e),i._sqlite3_exec=(e,t,n,r,s)=>(i._sqlite3_exec=h.sqlite3_exec)(e,t,n,r,s),i._sqlite3_column_int=(e,t)=>(i._sqlite3_column_int=h.sqlite3_column_int)(e,t),i._sqlite3_finalize=e=>(i._sqlite3_finalize=h.sqlite3_finalize)(e),i._sqlite3_file_control=(e,t,n,r)=>(i._sqlite3_file_control=h.sqlite3_file_control)(e,t,n,r),i._sqlite3_column_name=(e,t)=>(i._sqlite3_column_name=h.sqlite3_column_name)(e,t),i._sqlite3_column_text=(e,t)=>(i._sqlite3_column_text=h.sqlite3_column_text)(e,t),i._sqlite3_column_type=(e,t)=>(i._sqlite3_column_type=h.sqlite3_column_type)(e,t),i._sqlite3_errmsg=e=>(i._sqlite3_errmsg=h.sqlite3_errmsg)(e),i._sqlite3_deserialize=(e,t,n,r,s,o)=>(i._sqlite3_deserialize=h.sqlite3_deserialize)(e,t,n,r,s,o),i._sqlite3_clear_bindings=e=>(i._sqlite3_clear_bindings=h.sqlite3_clear_bindings)(e),i._sqlite3_value_blob=e=>(i._sqlite3_value_blob=h.sqlite3_value_blob)(e),i._sqlite3_value_bytes=e=>(i._sqlite3_value_bytes=h.sqlite3_value_bytes)(e),i._sqlite3_value_double=e=>(i._sqlite3_value_double=h.sqlite3_value_double)(e),i._sqlite3_value_int=e=>(i._sqlite3_value_int=h.sqlite3_value_int)(e),i._sqlite3_value_int64=e=>(i._sqlite3_value_int64=h.sqlite3_value_int64)(e),i._sqlite3_value_subtype=e=>(i._sqlite3_value_subtype=h.sqlite3_value_subtype)(e),i._sqlite3_value_pointer=(e,t)=>(i._sqlite3_value_pointer=h.sqlite3_value_pointer)(e,t),i._sqlite3_value_type=e=>(i._sqlite3_value_type=h.sqlite3_value_type)(e),i._sqlite3_value_nochange=e=>(i._sqlite3_value_nochange=h.sqlite3_value_nochange)(e),i._sqlite3_value_frombind=e=>(i._sqlite3_value_frombind=h.sqlite3_value_frombind)(e),i._sqlite3_value_dup=e=>(i._sqlite3_value_dup=h.sqlite3_value_dup)(e),i._sqlite3_value_free=e=>(i._sqlite3_value_free=h.sqlite3_value_free)(e),i._sqlite3_result_blob=(e,t,n,r)=>(i._sqlite3_result_blob=h.sqlite3_result_blob)(e,t,n,r),i._sqlite3_result_error_toobig=e=>(i._sqlite3_result_error_toobig=h.sqlite3_result_error_toobig)(e),i._sqlite3_result_error_nomem=e=>(i._sqlite3_result_error_nomem=h.sqlite3_result_error_nomem)(e),i._sqlite3_result_double=(e,t)=>(i._sqlite3_result_double=h.sqlite3_result_double)(e,t),i._sqlite3_result_error=(e,t,n)=>(i._sqlite3_result_error=h.sqlite3_result_error)(e,t,n),i._sqlite3_result_int=(e,t)=>(i._sqlite3_result_int=h.sqlite3_result_int)(e,t),i._sqlite3_result_int64=(e,t)=>(i._sqlite3_result_int64=h.sqlite3_result_int64)(e,t),i._sqlite3_result_null=e=>(i._sqlite3_result_null=h.sqlite3_result_null)(e),i._sqlite3_result_pointer=(e,t,n,r)=>(i._sqlite3_result_pointer=h.sqlite3_result_pointer)(e,t,n,r),i._sqlite3_result_subtype=(e,t)=>(i._sqlite3_result_subtype=h.sqlite3_result_subtype)(e,t),i._sqlite3_result_text=(e,t,n,r)=>(i._sqlite3_result_text=h.sqlite3_result_text)(e,t,n,r),i._sqlite3_result_zeroblob=(e,t)=>(i._sqlite3_result_zeroblob=h.sqlite3_result_zeroblob)(e,t),i._sqlite3_result_zeroblob64=(e,t)=>(i._sqlite3_result_zeroblob64=h.sqlite3_result_zeroblob64)(e,t),i._sqlite3_result_error_code=(e,t)=>(i._sqlite3_result_error_code=h.sqlite3_result_error_code)(e,t),i._sqlite3_user_data=e=>(i._sqlite3_user_data=h.sqlite3_user_data)(e),i._sqlite3_context_db_handle=e=>(i._sqlite3_context_db_handle=h.sqlite3_context_db_handle)(e),i._sqlite3_vtab_nochange=e=>(i._sqlite3_vtab_nochange=h.sqlite3_vtab_nochange)(e),i._sqlite3_vtab_in_first=(e,t)=>(i._sqlite3_vtab_in_first=h.sqlite3_vtab_in_first)(e,t),i._sqlite3_vtab_in_next=(e,t)=>(i._sqlite3_vtab_in_next=h.sqlite3_vtab_in_next)(e,t),i._sqlite3_aggregate_context=(e,t)=>(i._sqlite3_aggregate_context=h.sqlite3_aggregate_context)(e,t),i._sqlite3_get_auxdata=(e,t)=>(i._sqlite3_get_auxdata=h.sqlite3_get_auxdata)(e,t),i._sqlite3_set_auxdata=(e,t,n,r)=>(i._sqlite3_set_auxdata=h.sqlite3_set_auxdata)(e,t,n,r),i._sqlite3_column_count=e=>(i._sqlite3_column_count=h.sqlite3_column_count)(e),i._sqlite3_data_count=e=>(i._sqlite3_data_count=h.sqlite3_data_count)(e),i._sqlite3_column_blob=(e,t)=>(i._sqlite3_column_blob=h.sqlite3_column_blob)(e,t),i._sqlite3_column_bytes=(e,t)=>(i._sqlite3_column_bytes=h.sqlite3_column_bytes)(e,t),i._sqlite3_column_double=(e,t)=>(i._sqlite3_column_double=h.sqlite3_column_double)(e,t),i._sqlite3_column_value=(e,t)=>(i._sqlite3_column_value=h.sqlite3_column_value)(e,t),i._sqlite3_column_decltype=(e,t)=>(i._sqlite3_column_decltype=h.sqlite3_column_decltype)(e,t),i._sqlite3_bind_blob=(e,t,n,r,s)=>(i._sqlite3_bind_blob=h.sqlite3_bind_blob)(e,t,n,r,s),i._sqlite3_bind_double=(e,t,n)=>(i._sqlite3_bind_double=h.sqlite3_bind_double)(e,t,n),i._sqlite3_bind_int=(e,t,n)=>(i._sqlite3_bind_int=h.sqlite3_bind_int)(e,t,n),i._sqlite3_bind_int64=(e,t,n)=>(i._sqlite3_bind_int64=h.sqlite3_bind_int64)(e,t,n),i._sqlite3_bind_null=(e,t)=>(i._sqlite3_bind_null=h.sqlite3_bind_null)(e,t),i._sqlite3_bind_pointer=(e,t,n,r,s)=>(i._sqlite3_bind_pointer=h.sqlite3_bind_pointer)(e,t,n,r,s),i._sqlite3_bind_text=(e,t,n,r,s)=>(i._sqlite3_bind_text=h.sqlite3_bind_text)(e,t,n,r,s),i._sqlite3_bind_parameter_count=e=>(i._sqlite3_bind_parameter_count=h.sqlite3_bind_parameter_count)(e),i._sqlite3_bind_parameter_name=(e,t)=>(i._sqlite3_bind_parameter_name=h.sqlite3_bind_parameter_name)(e,t),i._sqlite3_bind_parameter_index=(e,t)=>(i._sqlite3_bind_parameter_index=h.sqlite3_bind_parameter_index)(e,t),i._sqlite3_db_handle=e=>(i._sqlite3_db_handle=h.sqlite3_db_handle)(e),i._sqlite3_stmt_readonly=e=>(i._sqlite3_stmt_readonly=h.sqlite3_stmt_readonly)(e),i._sqlite3_stmt_isexplain=e=>(i._sqlite3_stmt_isexplain=h.sqlite3_stmt_isexplain)(e),i._sqlite3_stmt_explain=(e,t)=>(i._sqlite3_stmt_explain=h.sqlite3_stmt_explain)(e,t),i._sqlite3_stmt_busy=e=>(i._sqlite3_stmt_busy=h.sqlite3_stmt_busy)(e),i._sqlite3_stmt_status=(e,t,n)=>(i._sqlite3_stmt_status=h.sqlite3_stmt_status)(e,t,n),i._sqlite3_sql=e=>(i._sqlite3_sql=h.sqlite3_sql)(e),i._sqlite3_expanded_sql=e=>(i._sqlite3_expanded_sql=h.sqlite3_expanded_sql)(e),i._sqlite3_preupdate_old=(e,t,n)=>(i._sqlite3_preupdate_old=h.sqlite3_preupdate_old)(e,t,n),i._sqlite3_preupdate_count=e=>(i._sqlite3_preupdate_count=h.sqlite3_preupdate_count)(e),i._sqlite3_preupdate_depth=e=>(i._sqlite3_preupdate_depth=h.sqlite3_preupdate_depth)(e),i._sqlite3_preupdate_blobwrite=e=>(i._sqlite3_preupdate_blobwrite=h.sqlite3_preupdate_blobwrite)(e),i._sqlite3_preupdate_new=(e,t,n)=>(i._sqlite3_preupdate_new=h.sqlite3_preupdate_new)(e,t,n),i._sqlite3_value_numeric_type=e=>(i._sqlite3_value_numeric_type=h.sqlite3_value_numeric_type)(e),i._sqlite3_set_authorizer=(e,t,n)=>(i._sqlite3_set_authorizer=h.sqlite3_set_authorizer)(e,t,n),i._sqlite3_strglob=(e,t)=>(i._sqlite3_strglob=h.sqlite3_strglob)(e,t),i._sqlite3_strlike=(e,t,n)=>(i._sqlite3_strlike=h.sqlite3_strlike)(e,t,n),i._sqlite3_auto_extension=e=>(i._sqlite3_auto_extension=h.sqlite3_auto_extension)(e),i._sqlite3_cancel_auto_extension=e=>(i._sqlite3_cancel_auto_extension=h.sqlite3_cancel_auto_extension)(e),i._sqlite3_reset_auto_extension=()=>(i._sqlite3_reset_auto_extension=h.sqlite3_reset_auto_extension)(),i._sqlite3_prepare_v3=(e,t,n,r,s,o)=>(i._sqlite3_prepare_v3=h.sqlite3_prepare_v3)(e,t,n,r,s,o),i._sqlite3_create_module=(e,t,n,r)=>(i._sqlite3_create_module=h.sqlite3_create_module)(e,t,n,r),i._sqlite3_create_module_v2=(e,t,n,r,s)=>(i._sqlite3_create_module_v2=h.sqlite3_create_module_v2)(e,t,n,r,s),i._sqlite3_drop_modules=(e,t)=>(i._sqlite3_drop_modules=h.sqlite3_drop_modules)(e,t),i._sqlite3_declare_vtab=(e,t)=>(i._sqlite3_declare_vtab=h.sqlite3_declare_vtab)(e,t),i._sqlite3_vtab_on_conflict=e=>(i._sqlite3_vtab_on_conflict=h.sqlite3_vtab_on_conflict)(e),i._sqlite3_vtab_collation=(e,t)=>(i._sqlite3_vtab_collation=h.sqlite3_vtab_collation)(e,t),i._sqlite3_vtab_in=(e,t,n)=>(i._sqlite3_vtab_in=h.sqlite3_vtab_in)(e,t,n),i._sqlite3_vtab_rhs_value=(e,t,n)=>(i._sqlite3_vtab_rhs_value=h.sqlite3_vtab_rhs_value)(e,t,n),i._sqlite3_vtab_distinct=e=>(i._sqlite3_vtab_distinct=h.sqlite3_vtab_distinct)(e),i._sqlite3_keyword_name=(e,t,n)=>(i._sqlite3_keyword_name=h.sqlite3_keyword_name)(e,t,n),i._sqlite3_keyword_count=()=>(i._sqlite3_keyword_count=h.sqlite3_keyword_count)(),i._sqlite3_keyword_check=(e,t)=>(i._sqlite3_keyword_check=h.sqlite3_keyword_check)(e,t),i._sqlite3_complete=e=>(i._sqlite3_complete=h.sqlite3_complete)(e),i._sqlite3_libversion=()=>(i._sqlite3_libversion=h.sqlite3_libversion)(),i._sqlite3_libversion_number=()=>(i._sqlite3_libversion_number=h.sqlite3_libversion_number)(),i._sqlite3_shutdown=()=>(i._sqlite3_shutdown=h.sqlite3_shutdown)(),i._sqlite3_last_insert_rowid=e=>(i._sqlite3_last_insert_rowid=h.sqlite3_last_insert_rowid)(e),i._sqlite3_set_last_insert_rowid=(e,t)=>(i._sqlite3_set_last_insert_rowid=h.sqlite3_set_last_insert_rowid)(e,t),i._sqlite3_changes64=e=>(i._sqlite3_changes64=h.sqlite3_changes64)(e),i._sqlite3_changes=e=>(i._sqlite3_changes=h.sqlite3_changes)(e),i._sqlite3_total_changes64=e=>(i._sqlite3_total_changes64=h.sqlite3_total_changes64)(e),i._sqlite3_total_changes=e=>(i._sqlite3_total_changes=h.sqlite3_total_changes)(e),i._sqlite3_txn_state=(e,t)=>(i._sqlite3_txn_state=h.sqlite3_txn_state)(e,t),i._sqlite3_close_v2=e=>(i._sqlite3_close_v2=h.sqlite3_close_v2)(e),i._sqlite3_busy_handler=(e,t,n)=>(i._sqlite3_busy_handler=h.sqlite3_busy_handler)(e,t,n),i._sqlite3_progress_handler=(e,t,n,r)=>(i._sqlite3_progress_handler=h.sqlite3_progress_handler)(e,t,n,r),i._sqlite3_busy_timeout=(e,t)=>(i._sqlite3_busy_timeout=h.sqlite3_busy_timeout)(e,t),i._sqlite3_interrupt=e=>(i._sqlite3_interrupt=h.sqlite3_interrupt)(e),i._sqlite3_is_interrupted=e=>(i._sqlite3_is_interrupted=h.sqlite3_is_interrupted)(e),i._sqlite3_create_function=(e,t,n,r,s,o,p,g)=>(i._sqlite3_create_function=h.sqlite3_create_function)(e,t,n,r,s,o,p,g),i._sqlite3_create_function_v2=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3_create_function_v2=h.sqlite3_create_function_v2)(e,t,n,r,s,o,p,g,O),i._sqlite3_create_window_function=(e,t,n,r,s,o,p,g,O,R)=>(i._sqlite3_create_window_function=h.sqlite3_create_window_function)(e,t,n,r,s,o,p,g,O,R),i._sqlite3_overload_function=(e,t,n)=>(i._sqlite3_overload_function=h.sqlite3_overload_function)(e,t,n),i._sqlite3_trace_v2=(e,t,n,r)=>(i._sqlite3_trace_v2=h.sqlite3_trace_v2)(e,t,n,r),i._sqlite3_commit_hook=(e,t,n)=>(i._sqlite3_commit_hook=h.sqlite3_commit_hook)(e,t,n),i._sqlite3_update_hook=(e,t,n)=>(i._sqlite3_update_hook=h.sqlite3_update_hook)(e,t,n),i._sqlite3_rollback_hook=(e,t,n)=>(i._sqlite3_rollback_hook=h.sqlite3_rollback_hook)(e,t,n),i._sqlite3_preupdate_hook=(e,t,n)=>(i._sqlite3_preupdate_hook=h.sqlite3_preupdate_hook)(e,t,n),i._sqlite3_error_offset=e=>(i._sqlite3_error_offset=h.sqlite3_error_offset)(e),i._sqlite3_errcode=e=>(i._sqlite3_errcode=h.sqlite3_errcode)(e),i._sqlite3_extended_errcode=e=>(i._sqlite3_extended_errcode=h.sqlite3_extended_errcode)(e),i._sqlite3_errstr=e=>(i._sqlite3_errstr=h.sqlite3_errstr)(e),i._sqlite3_limit=(e,t,n)=>(i._sqlite3_limit=h.sqlite3_limit)(e,t,n),i._sqlite3_open=(e,t)=>(i._sqlite3_open=h.sqlite3_open)(e,t),i._sqlite3_open_v2=(e,t,n,r)=>(i._sqlite3_open_v2=h.sqlite3_open_v2)(e,t,n,r),i._sqlite3_create_collation=(e,t,n,r,s)=>(i._sqlite3_create_collation=h.sqlite3_create_collation)(e,t,n,r,s),i._sqlite3_create_collation_v2=(e,t,n,r,s,o)=>(i._sqlite3_create_collation_v2=h.sqlite3_create_collation_v2)(e,t,n,r,s,o),i._sqlite3_collation_needed=(e,t,n)=>(i._sqlite3_collation_needed=h.sqlite3_collation_needed)(e,t,n),i._sqlite3_get_autocommit=e=>(i._sqlite3_get_autocommit=h.sqlite3_get_autocommit)(e),i._sqlite3_table_column_metadata=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3_table_column_metadata=h.sqlite3_table_column_metadata)(e,t,n,r,s,o,p,g,O),i._sqlite3_extended_result_codes=(e,t)=>(i._sqlite3_extended_result_codes=h.sqlite3_extended_result_codes)(e,t),i._sqlite3_uri_key=(e,t)=>(i._sqlite3_uri_key=h.sqlite3_uri_key)(e,t),i._sqlite3_uri_int64=(e,t,n)=>(i._sqlite3_uri_int64=h.sqlite3_uri_int64)(e,t,n),i._sqlite3_db_name=(e,t)=>(i._sqlite3_db_name=h.sqlite3_db_name)(e,t),i._sqlite3_db_filename=(e,t)=>(i._sqlite3_db_filename=h.sqlite3_db_filename)(e,t),i._sqlite3_db_readonly=(e,t)=>(i._sqlite3_db_readonly=h.sqlite3_db_readonly)(e,t),i._sqlite3_compileoption_used=e=>(i._sqlite3_compileoption_used=h.sqlite3_compileoption_used)(e),i._sqlite3_compileoption_get=e=>(i._sqlite3_compileoption_get=h.sqlite3_compileoption_get)(e),i._sqlite3session_diff=(e,t,n,r)=>(i._sqlite3session_diff=h.sqlite3session_diff)(e,t,n,r),i._sqlite3session_attach=(e,t)=>(i._sqlite3session_attach=h.sqlite3session_attach)(e,t),i._sqlite3session_create=(e,t,n)=>(i._sqlite3session_create=h.sqlite3session_create)(e,t,n),i._sqlite3session_delete=e=>(i._sqlite3session_delete=h.sqlite3session_delete)(e),i._sqlite3session_table_filter=(e,t,n)=>(i._sqlite3session_table_filter=h.sqlite3session_table_filter)(e,t,n),i._sqlite3session_changeset=(e,t,n)=>(i._sqlite3session_changeset=h.sqlite3session_changeset)(e,t,n),i._sqlite3session_changeset_strm=(e,t,n)=>(i._sqlite3session_changeset_strm=h.sqlite3session_changeset_strm)(e,t,n),i._sqlite3session_patchset_strm=(e,t,n)=>(i._sqlite3session_patchset_strm=h.sqlite3session_patchset_strm)(e,t,n),i._sqlite3session_patchset=(e,t,n)=>(i._sqlite3session_patchset=h.sqlite3session_patchset)(e,t,n),i._sqlite3session_enable=(e,t)=>(i._sqlite3session_enable=h.sqlite3session_enable)(e,t),i._sqlite3session_indirect=(e,t)=>(i._sqlite3session_indirect=h.sqlite3session_indirect)(e,t),i._sqlite3session_isempty=e=>(i._sqlite3session_isempty=h.sqlite3session_isempty)(e),i._sqlite3session_memory_used=e=>(i._sqlite3session_memory_used=h.sqlite3session_memory_used)(e),i._sqlite3session_object_config=(e,t,n)=>(i._sqlite3session_object_config=h.sqlite3session_object_config)(e,t,n),i._sqlite3session_changeset_size=e=>(i._sqlite3session_changeset_size=h.sqlite3session_changeset_size)(e),i._sqlite3changeset_start=(e,t,n)=>(i._sqlite3changeset_start=h.sqlite3changeset_start)(e,t,n),i._sqlite3changeset_start_v2=(e,t,n,r)=>(i._sqlite3changeset_start_v2=h.sqlite3changeset_start_v2)(e,t,n,r),i._sqlite3changeset_start_strm=(e,t,n)=>(i._sqlite3changeset_start_strm=h.sqlite3changeset_start_strm)(e,t,n),i._sqlite3changeset_start_v2_strm=(e,t,n,r)=>(i._sqlite3changeset_start_v2_strm=h.sqlite3changeset_start_v2_strm)(e,t,n,r),i._sqlite3changeset_next=e=>(i._sqlite3changeset_next=h.sqlite3changeset_next)(e),i._sqlite3changeset_op=(e,t,n,r,s)=>(i._sqlite3changeset_op=h.sqlite3changeset_op)(e,t,n,r,s),i._sqlite3changeset_pk=(e,t,n)=>(i._sqlite3changeset_pk=h.sqlite3changeset_pk)(e,t,n),i._sqlite3changeset_old=(e,t,n)=>(i._sqlite3changeset_old=h.sqlite3changeset_old)(e,t,n),i._sqlite3changeset_new=(e,t,n)=>(i._sqlite3changeset_new=h.sqlite3changeset_new)(e,t,n),i._sqlite3changeset_conflict=(e,t,n)=>(i._sqlite3changeset_conflict=h.sqlite3changeset_conflict)(e,t,n),i._sqlite3changeset_fk_conflicts=(e,t)=>(i._sqlite3changeset_fk_conflicts=h.sqlite3changeset_fk_conflicts)(e,t),i._sqlite3changeset_finalize=e=>(i._sqlite3changeset_finalize=h.sqlite3changeset_finalize)(e),i._sqlite3changeset_invert=(e,t,n,r)=>(i._sqlite3changeset_invert=h.sqlite3changeset_invert)(e,t,n,r),i._sqlite3changeset_invert_strm=(e,t,n,r)=>(i._sqlite3changeset_invert_strm=h.sqlite3changeset_invert_strm)(e,t,n,r),i._sqlite3changeset_apply_v2=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3changeset_apply_v2=h.sqlite3changeset_apply_v2)(e,t,n,r,s,o,p,g,O),i._sqlite3changeset_apply=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply=h.sqlite3changeset_apply)(e,t,n,r,s,o),i._sqlite3changeset_apply_v2_strm=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3changeset_apply_v2_strm=h.sqlite3changeset_apply_v2_strm)(e,t,n,r,s,o,p,g,O),i._sqlite3changeset_apply_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply_strm=h.sqlite3changeset_apply_strm)(e,t,n,r,s,o),i._sqlite3changegroup_new=e=>(i._sqlite3changegroup_new=h.sqlite3changegroup_new)(e),i._sqlite3changegroup_add=(e,t,n)=>(i._sqlite3changegroup_add=h.sqlite3changegroup_add)(e,t,n),i._sqlite3changegroup_output=(e,t,n)=>(i._sqlite3changegroup_output=h.sqlite3changegroup_output)(e,t,n),i._sqlite3changegroup_add_strm=(e,t,n)=>(i._sqlite3changegroup_add_strm=h.sqlite3changegroup_add_strm)(e,t,n),i._sqlite3changegroup_output_strm=(e,t,n)=>(i._sqlite3changegroup_output_strm=h.sqlite3changegroup_output_strm)(e,t,n),i._sqlite3changegroup_delete=e=>(i._sqlite3changegroup_delete=h.sqlite3changegroup_delete)(e),i._sqlite3changeset_concat=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat=h.sqlite3changeset_concat)(e,t,n,r,s,o),i._sqlite3changeset_concat_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat_strm=h.sqlite3changeset_concat_strm)(e,t,n,r,s,o),i._sqlite3session_config=(e,t)=>(i._sqlite3session_config=h.sqlite3session_config)(e,t),i._sqlite3_sourceid=()=>(i._sqlite3_sourceid=h.sqlite3_sourceid)(),i._sqlite3__wasm_pstack_ptr=()=>(i._sqlite3__wasm_pstack_ptr=h.sqlite3__wasm_pstack_ptr)(),i._sqlite3__wasm_pstack_restore=e=>(i._sqlite3__wasm_pstack_restore=h.sqlite3__wasm_pstack_restore)(e),i._sqlite3__wasm_pstack_alloc=e=>(i._sqlite3__wasm_pstack_alloc=h.sqlite3__wasm_pstack_alloc)(e),i._sqlite3__wasm_pstack_remaining=()=>(i._sqlite3__wasm_pstack_remaining=h.sqlite3__wasm_pstack_remaining)(),i._sqlite3__wasm_pstack_quota=()=>(i._sqlite3__wasm_pstack_quota=h.sqlite3__wasm_pstack_quota)(),i._sqlite3__wasm_db_error=(e,t,n)=>(i._sqlite3__wasm_db_error=h.sqlite3__wasm_db_error)(e,t,n),i._sqlite3__wasm_test_struct=e=>(i._sqlite3__wasm_test_struct=h.sqlite3__wasm_test_struct)(e),i._sqlite3__wasm_enum_json=()=>(i._sqlite3__wasm_enum_json=h.sqlite3__wasm_enum_json)(),i._sqlite3__wasm_vfs_unlink=(e,t)=>(i._sqlite3__wasm_vfs_unlink=h.sqlite3__wasm_vfs_unlink)(e,t),i._sqlite3__wasm_db_vfs=(e,t)=>(i._sqlite3__wasm_db_vfs=h.sqlite3__wasm_db_vfs)(e,t),i._sqlite3__wasm_db_reset=e=>(i._sqlite3__wasm_db_reset=h.sqlite3__wasm_db_reset)(e),i._sqlite3__wasm_db_export_chunked=(e,t)=>(i._sqlite3__wasm_db_export_chunked=h.sqlite3__wasm_db_export_chunked)(e,t),i._sqlite3__wasm_db_serialize=(e,t,n,r,s)=>(i._sqlite3__wasm_db_serialize=h.sqlite3__wasm_db_serialize)(e,t,n,r,s),i._sqlite3__wasm_vfs_create_file=(e,t,n,r)=>(i._sqlite3__wasm_vfs_create_file=h.sqlite3__wasm_vfs_create_file)(e,t,n,r),i._sqlite3__wasm_posix_create_file=(e,t,n)=>(i._sqlite3__wasm_posix_create_file=h.sqlite3__wasm_posix_create_file)(e,t,n),i._sqlite3__wasm_kvvfsMakeKeyOnPstack=(e,t)=>(i._sqlite3__wasm_kvvfsMakeKeyOnPstack=h.sqlite3__wasm_kvvfsMakeKeyOnPstack)(e,t),i._sqlite3__wasm_kvvfs_methods=()=>(i._sqlite3__wasm_kvvfs_methods=h.sqlite3__wasm_kvvfs_methods)(),i._sqlite3__wasm_vtab_config=(e,t,n)=>(i._sqlite3__wasm_vtab_config=h.sqlite3__wasm_vtab_config)(e,t,n),i._sqlite3__wasm_db_config_ip=(e,t,n,r)=>(i._sqlite3__wasm_db_config_ip=h.sqlite3__wasm_db_config_ip)(e,t,n,r),i._sqlite3__wasm_db_config_pii=(e,t,n,r,s)=>(i._sqlite3__wasm_db_config_pii=h.sqlite3__wasm_db_config_pii)(e,t,n,r,s),i._sqlite3__wasm_db_config_s=(e,t,n)=>(i._sqlite3__wasm_db_config_s=h.sqlite3__wasm_db_config_s)(e,t,n),i._sqlite3__wasm_config_i=(e,t)=>(i._sqlite3__wasm_config_i=h.sqlite3__wasm_config_i)(e,t),i._sqlite3__wasm_config_ii=(e,t,n)=>(i._sqlite3__wasm_config_ii=h.sqlite3__wasm_config_ii)(e,t,n),i._sqlite3__wasm_config_j=(e,t)=>(i._sqlite3__wasm_config_j=h.sqlite3__wasm_config_j)(e,t),i._sqlite3__wasm_qfmt_token=(e,t)=>(i._sqlite3__wasm_qfmt_token=h.sqlite3__wasm_qfmt_token)(e,t),i._sqlite3__wasm_init_wasmfs=e=>(i._sqlite3__wasm_init_wasmfs=h.sqlite3__wasm_init_wasmfs)(e),i._sqlite3__wasm_test_intptr=e=>(i._sqlite3__wasm_test_intptr=h.sqlite3__wasm_test_intptr)(e),i._sqlite3__wasm_test_voidptr=e=>(i._sqlite3__wasm_test_voidptr=h.sqlite3__wasm_test_voidptr)(e),i._sqlite3__wasm_test_int64_max=()=>(i._sqlite3__wasm_test_int64_max=h.sqlite3__wasm_test_int64_max)(),i._sqlite3__wasm_test_int64_min=()=>(i._sqlite3__wasm_test_int64_min=h.sqlite3__wasm_test_int64_min)(),i._sqlite3__wasm_test_int64_times2=e=>(i._sqlite3__wasm_test_int64_times2=h.sqlite3__wasm_test_int64_times2)(e),i._sqlite3__wasm_test_int64_minmax=(e,t)=>(i._sqlite3__wasm_test_int64_minmax=h.sqlite3__wasm_test_int64_minmax)(e,t),i._sqlite3__wasm_test_int64ptr=e=>(i._sqlite3__wasm_test_int64ptr=h.sqlite3__wasm_test_int64ptr)(e),i._sqlite3__wasm_test_stack_overflow=e=>(i._sqlite3__wasm_test_stack_overflow=h.sqlite3__wasm_test_stack_overflow)(e),i._sqlite3__wasm_test_str_hello=e=>(i._sqlite3__wasm_test_str_hello=h.sqlite3__wasm_test_str_hello)(e),i._sqlite3__wasm_SQLTester_strglob=(e,t)=>(i._sqlite3__wasm_SQLTester_strglob=h.sqlite3__wasm_SQLTester_strglob)(e,t),i._malloc=e=>(i._malloc=h.malloc)(e),i._free=e=>(i._free=h.free)(e),i._realloc=(e,t)=>(i._realloc=h.realloc)(e,t);var St=(e,t)=>(St=h.emscripten_builtin_memalign)(e,t);i.wasmMemory=Te;var Ge,At;Me=function e(){Ge||It(),Ge||(Me=e)};function It(){if(Fe>0||!At&&(At=1,Lt(),Fe>0))return;function e(){Ge||(Ge=1,i.calledRun=1,!_t&&(Ct(),ve(i),i.onRuntimeInitialized?.(),Dt()))}i.setStatus?(i.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>i.setStatus(""),1),e()},1)):e()}if(i.preInit)for(typeof i.preInit=="function"&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return It(),i.runSQLite3PostLoadInit=function(e){if(globalThis.sqlite3ApiBootstrap=function t(n=globalThis.sqlite3ApiConfig||t.defaultConfig){if(t.sqlite3)return(t.sqlite3.config||console).warn("sqlite3ApiBootstrap() called multiple times.","Config and external initializers are ignored on calls after the first."),t.sqlite3;const r=Object.assign(Object.create(null),{exports:void 0,memory:void 0,bigIntEnabled:typeof i<"u"&&i.HEAPU64?!0:!!globalThis.BigInt64Array,debug:console.debug.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),log:console.log.bind(console),wasmfsOpfsDir:"/opfs",useStdAlloc:!1},n||{});Object.assign(r,{allocExportName:r.useStdAlloc?"malloc":"sqlite3_malloc",deallocExportName:r.useStdAlloc?"free":"sqlite3_free",reallocExportName:r.useStdAlloc?"realloc":"sqlite3_realloc"},r),["exports","memory","wasmfsOpfsDir"].forEach(l=>{typeof r[l]=="function"&&(r[l]=r[l]())}),delete globalThis.sqlite3ApiConfig,delete t.defaultConfig;const s=Object.create(null),o=Object.create(null),p=l=>s.sqlite3_js_rc_str&&s.sqlite3_js_rc_str(l)||"Unknown result code #"+l,g=l=>typeof l=="number"&&l===(l|0);class O extends Error{constructor(..._){let u;if(_.length)if(g(_[0]))if(u=_[0],_.length===1)super(p(_[0]));else{const I=p(u);typeof _[1]=="object"?super(I,_[1]):(_[0]=I+":",super(_.join(" ")))}else _.length===2&&typeof _[1]=="object"?super(..._):super(_.join(" "));this.resultCode=u||s.SQLITE_ERROR,this.name="SQLite3Error"}}O.toss=(...l)=>{throw new O(...l)};const R=O.toss;r.wasmfsOpfsDir&&!/^\/[^/]+$/.test(r.wasmfsOpfsDir)&&R("config.wasmfsOpfsDir must be falsy or in the form '/dir-name'.");const z=l=>typeof l!="bigint"&&l===(l|0)&&l<=2147483647&&l>=-2147483648,W=function l(_){return l._max||(l._max=BigInt("0x7fffffffffffffff"),l._min=~l._max),_>=l._min&&_<=l._max},T=l=>l>=-0x7fffffffn-1n&&l<=0x7fffffffn,A=function l(_){return l._min||(l._min=Number.MIN_SAFE_INTEGER,l._max=Number.MAX_SAFE_INTEGER),_>=l._min&&_<=l._max},D=l=>l&&l.constructor&&z(l.constructor.BYTES_PER_ELEMENT)?l:!1,q=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,w=l=>l.buffer instanceof q,x=(l,_,u)=>w(l)?l.slice(_,u):l.subarray(_,u),N=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),P=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),S=l=>N(l)||R("Value is not of a supported TypedArray type."),L=new TextDecoder("utf-8"),$=function(l,_,u){return L.decode(x(l,_,u))},c=function(l){return P(l)?$(l instanceof ArrayBuffer?new Uint8Array(l):l):Array.isArray(l)?l.join(""):(o.isPtr(l)&&(l=o.cstrToJs(l)),l)};class d extends Error{constructor(..._){_.length===2&&typeof _[1]=="object"?super(..._):_.length?super(_.join(" ")):super("Allocation failed."),this.resultCode=s.SQLITE_NOMEM,this.name="WasmAllocError"}}d.toss=(...l)=>{throw new d(...l)},Object.assign(s,{sqlite3_bind_blob:void 0,sqlite3_bind_text:void 0,sqlite3_create_function_v2:(l,_,u,I,U,ee,ne,re,se)=>{},sqlite3_create_function:(l,_,u,I,U,ee,ne,re)=>{},sqlite3_create_window_function:(l,_,u,I,U,ee,ne,re,se,j)=>{},sqlite3_prepare_v3:(l,_,u,I,U,ee)=>{},sqlite3_prepare_v2:(l,_,u,I,U)=>{},sqlite3_exec:(l,_,u,I,U)=>{},sqlite3_randomness:(l,_)=>{}});const y={affirmBindableTypedArray:S,flexibleString:c,bigIntFits32:T,bigIntFits64:W,bigIntFitsDouble:A,isBindableTypedArray:N,isInt32:z,isSQLableTypedArray:P,isTypedArray:D,typedArrayToString:$,isUIThread:()=>globalThis.window===globalThis&&!!globalThis.document,isSharedTypedArray:w,toss:function(...l){throw new Error(l.join(" "))},toss3:R,typedArrayPart:x,affirmDbHeader:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _="SQLite format 3";_.length>l.byteLength&&R("Input does not contain an SQLite3 database header.");for(let u=0;u<_.length;++u)_.charCodeAt(u)!==l[u]&&R("Input does not contain an SQLite3 database header.")},affirmIsDb:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _=l.byteLength;(_<512||_%512!==0)&&R("Byte array size",_,"is invalid for an SQLite3 db."),y.affirmDbHeader(l)}};Object.assign(o,{ptrSizeof:r.wasmPtrSizeof||4,ptrIR:r.wasmPtrIR||"i32",bigIntEnabled:!!r.bigIntEnabled,exports:r.exports||R("Missing API config.exports (WASM module exports)."),memory:r.memory||r.exports.memory||R("API config object requires a WebAssembly.Memory object","in either config.exports.memory (exported)","or config.memory (imported)."),alloc:void 0,realloc:void 0,dealloc:void 0}),o.allocFromTypedArray=function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l)),S(l);const _=o.alloc(l.byteLength||1);return o.heapForSize(l.constructor).set(l.byteLength?l:[0],_),_};{const l=r.allocExportName,_=r.deallocExportName,u=r.reallocExportName;for(const I of[l,_,u])o.exports[I]instanceof Function||R("Missing required exports[",I,"] function.");o.alloc=function I(U){return I.impl(U)||d.toss("Failed to allocate",U," bytes.")},o.alloc.impl=o.exports[l],o.realloc=function I(U,ee){const ne=I.impl(U,ee);return ee?ne||d.toss("Failed to reallocate",ee," bytes."):0},o.realloc.impl=o.exports[u],o.dealloc=o.exports[_]}o.compileOptionUsed=function l(_){if(arguments.length){if(Array.isArray(_)){const u={};return _.forEach(I=>{u[I]=s.sqlite3_compileoption_used(I)}),u}else if(typeof _=="object")return Object.keys(_).forEach(u=>{_[u]=s.sqlite3_compileoption_used(u)}),_}else{if(l._result)return l._result;l._opt||(l._rx=/^([^=]+)=(.+)/,l._rxInt=/^-?\d+$/,l._opt=function(ne,re){const se=l._rx.exec(ne);re[0]=se?se[1]:ne,re[1]=se?l._rxInt.test(se[2])?+se[2]:se[2]:!0});const u={},I=[0,0];let U=0,ee;for(;ee=s.sqlite3_compileoption_get(U++);)l._opt(ee,I),u[I[0]]=I[1];return l._result=u}return typeof _=="string"?!!s.sqlite3_compileoption_used(_):!1},o.pstack=Object.assign(Object.create(null),{restore:o.exports.sqlite3__wasm_pstack_restore,alloc:function(l){return typeof l=="string"&&!(l=o.sizeofIR(l))&&d.toss("Invalid value for pstack.alloc(",arguments[0],")"),o.exports.sqlite3__wasm_pstack_alloc(l)||d.toss("Could not allocate",l,"bytes from the pstack.")},allocChunks:function(l,_){typeof _=="string"&&!(_=o.sizeofIR(_))&&d.toss("Invalid size value for allocChunks(",arguments[1],")");const u=o.pstack.alloc(l*_),I=[];let U=0,ee=0;for(;Ul===1?o.pstack.alloc(_?8:o.ptrSizeof):o.pstack.allocChunks(l,_?8:o.ptrSizeof),call:function(l){const _=o.pstack.pointer;try{return l(m)}finally{o.pstack.restore(_)}}}),Object.defineProperties(o.pstack,{pointer:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_ptr},quota:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_quota},remaining:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_remaining}}),s.sqlite3_randomness=(...l)=>{if(l.length===1&&y.isTypedArray(l[0])&&l[0].BYTES_PER_ELEMENT===1){const _=l[0];if(_.byteLength===0)return o.exports.sqlite3_randomness(0,0),_;const u=o.pstack.pointer;try{let I=_.byteLength,U=0;const ee=o.exports.sqlite3_randomness,ne=o.heap8u(),re=I<512?I:512,se=o.pstack.alloc(re);do{const j=I>re?re:I;ee(j,se),_.set(x(ne,se,se+j),U),I-=j,U+=j}while(I>0)}catch(I){console.error("Highly unexpected (and ignored!) exception in sqlite3_randomness():",I)}finally{o.pstack.restore(u)}return _}o.exports.sqlite3_randomness(...l)};let B;if(s.sqlite3_wasmfs_opfs_dir=function(){if(B!==void 0)return B;const l=r.wasmfsOpfsDir;if(!l||!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle)return B="";try{return l&&o.xCallWrapped("sqlite3__wasm_init_wasmfs","i32",["string"],l)===0?B=l:B=""}catch{return B=""}},s.sqlite3_wasmfs_filename_is_persistent=function(l){const _=s.sqlite3_wasmfs_opfs_dir();return _&&l?l.startsWith(_+"/"):!1},s.sqlite3_js_db_uses_vfs=function(l,_,u=0){try{const I=s.sqlite3_vfs_find(_);return I?l?I===s.sqlite3_js_db_vfs(l,u)?I:!1:I===s.sqlite3_vfs_find(0)?I:!1:!1}catch{return!1}},s.sqlite3_js_vfs_list=function(){const l=[];let _=s.sqlite3_vfs_find(0);for(;_;){const u=new s.sqlite3_vfs(_);l.push(o.cstrToJs(u.$zName)),_=u.$pNext,u.dispose()}return l},s.sqlite3_js_db_export=function(l,_=0){l=o.xWrap.testConvertArg("sqlite3*",l),l||R("Invalid sqlite3* argument."),o.bigIntEnabled||R("BigInt64 support is not enabled.");const u=o.scopedAllocPush();let I;try{const U=o.scopedAlloc(8+o.ptrSizeof),ee=U+8,ne=_?o.isPtr(_)?_:o.scopedAllocCString(""+_):0;let re=o.exports.sqlite3__wasm_db_serialize(l,ne,ee,U,0);re&&R("Database serialization failed with code",m.capi.sqlite3_js_rc_str(re)),I=o.peekPtr(ee);const se=o.peek(U,"i64");return re=se?o.heap8u().slice(I,I+Number(se)):new Uint8Array,re}finally{I&&o.exports.sqlite3_free(I),o.scopedAllocPop(u)}},s.sqlite3_js_db_vfs=(l,_=0)=>y.sqlite3__wasm_db_vfs(l,_),s.sqlite3_js_aggregate_context=(l,_)=>s.sqlite3_aggregate_context(l,_)||(_?d.toss("Cannot allocate",_,"bytes for sqlite3_aggregate_context()"):0),s.sqlite3_js_posix_create_file=function(l,_,u){let I;_&&o.isPtr(_)?I=_:_ instanceof ArrayBuffer||_ instanceof Uint8Array?(I=o.allocFromTypedArray(_),(arguments.length<3||!y.isInt32(u)||u<0)&&(u=_.byteLength)):O.toss("Invalid 2nd argument for sqlite3_js_posix_create_file().");try{(!y.isInt32(u)||u<0)&&O.toss("Invalid 3rd argument for sqlite3_js_posix_create_file().");const U=y.sqlite3__wasm_posix_create_file(l,I,u);U&&O.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(U))}finally{o.dealloc(I)}},s.sqlite3_js_vfs_create_file=function(l,_,u,I){r.warn("sqlite3_js_vfs_create_file() is deprecated and","should be avoided because it can lead to C-level crashes.","See its documentation for alternative options.");let U;u?(o.isPtr(u)?U=u:u instanceof ArrayBuffer&&(u=new Uint8Array(u)),u instanceof Uint8Array?(U=o.allocFromTypedArray(u),(arguments.length<4||!y.isInt32(I)||I<0)&&(I=u.byteLength)):O.toss("Invalid 3rd argument type for sqlite3_js_vfs_create_file().")):U=0,(!y.isInt32(I)||I<0)&&(o.dealloc(U),O.toss("Invalid 4th argument for sqlite3_js_vfs_create_file()."));try{const ee=y.sqlite3__wasm_vfs_create_file(l,_,U,I);ee&&O.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(ee))}finally{o.dealloc(U)}},s.sqlite3_js_sql_to_string=l=>{if(typeof l=="string")return l;const _=c(v);return _===v?void 0:_},y.isUIThread()){const l=function(_){const u=Object.create(null);return u.prefix="kvvfs-"+_,u.stores=[],(_==="session"||_==="")&&u.stores.push(globalThis.sessionStorage),(_==="local"||_==="")&&u.stores.push(globalThis.localStorage),u};s.sqlite3_js_kvvfs_clear=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{const ee=[];let ne;for(ne=0;neU.removeItem(re)),u+=ee.length}),u},s.sqlite3_js_kvvfs_size=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{let ee;for(ee=0;eef(l,_,"sqlite3_preupdate_new"),s.sqlite3_preupdate_old_js=(l,_)=>f(l,_,"sqlite3_preupdate_old"),s.sqlite3changeset_new_js=(l,_)=>f(l,_,"sqlite3changeset_new"),s.sqlite3changeset_old_js=(l,_)=>f(l,_,"sqlite3changeset_old");const m={WasmAllocError:d,SQLite3Error:O,capi:s,util:y,wasm:o,config:r,version:Object.create(null),client:void 0,asyncPostInit:async function l(){if(l.isReady instanceof Promise)return l.isReady;let _=t.initializersAsync;delete t.initializersAsync;const u=async()=>(m.__isUnderTest||(delete m.util,delete m.StructBinder),m),I=ee=>{throw r.error("an async sqlite3 initializer failed:",ee),ee};if(!_||!_.length)return l.isReady=u().catch(I);_=_.map(ee=>ee instanceof Function?async ne=>ee(m):ee),_.push(u);let U=Promise.resolve(m);for(;_.length;)U=U.then(_.shift());return l.isReady=U.catch(I)},scriptInfo:void 0};try{t.initializers.forEach(l=>{l(m)})}catch(l){throw console.error("sqlite3 bootstrap initializer threw:",l),l}return delete t.initializers,t.sqlite3=m,m},globalThis.sqlite3ApiBootstrap.initializers=[],globalThis.sqlite3ApiBootstrap.initializersAsync=[],globalThis.sqlite3ApiBootstrap.defaultConfig=Object.create(null),globalThis.sqlite3ApiBootstrap.sqlite3=void 0,globalThis.WhWasmUtilInstaller=function(t){t.bigIntEnabled===void 0&&(t.bigIntEnabled=!!globalThis.BigInt64Array);const n=(...c)=>{throw new Error(c.join(" "))};t.exports||Object.defineProperty(t,"exports",{enumerable:!0,configurable:!0,get:()=>t.instance&&t.instance.exports});const r=t.pointerIR||"i32",s=t.ptrSizeof=r==="i32"?4:r==="i64"?8:n("Unhandled ptrSizeof:",r),o=Object.create(null);o.heapSize=0,o.memory=null,o.freeFuncIndexes=[],o.scopedAlloc=[],o.utf8Decoder=new TextDecoder,o.utf8Encoder=new TextEncoder("utf-8"),t.sizeofIR=c=>{switch(c){case"i8":return 1;case"i16":return 2;case"i32":case"f32":case"float":return 4;case"i64":case"f64":case"double":return 8;case"*":return s;default:return(""+c).endsWith("*")?s:void 0}};const p=function(){if(!o.memory)o.memory=t.memory instanceof WebAssembly.Memory?t.memory:t.exports.memory;else if(o.heapSize===o.memory.buffer.byteLength)return o;const c=o.memory.buffer;return o.HEAP8=new Int8Array(c),o.HEAP8U=new Uint8Array(c),o.HEAP16=new Int16Array(c),o.HEAP16U=new Uint16Array(c),o.HEAP32=new Int32Array(c),o.HEAP32U=new Uint32Array(c),t.bigIntEnabled&&(o.HEAP64=new BigInt64Array(c),o.HEAP64U=new BigUint64Array(c)),o.HEAP32F=new Float32Array(c),o.HEAP64F=new Float64Array(c),o.heapSize=c.byteLength,o};t.heap8=()=>p().HEAP8,t.heap8u=()=>p().HEAP8U,t.heap16=()=>p().HEAP16,t.heap16u=()=>p().HEAP16U,t.heap32=()=>p().HEAP32,t.heap32u=()=>p().HEAP32U,t.heapForSize=function(c,d=!0){const y=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();switch(c){case Int8Array:return y.HEAP8;case Uint8Array:return y.HEAP8U;case Int16Array:return y.HEAP16;case Uint16Array:return y.HEAP16U;case Int32Array:return y.HEAP32;case Uint32Array:return y.HEAP32U;case 8:return d?y.HEAP8U:y.HEAP8;case 16:return d?y.HEAP16U:y.HEAP16;case 32:return d?y.HEAP32U:y.HEAP32;case 64:if(y.HEAP64)return d?y.HEAP64U:y.HEAP64;break;default:if(t.bigIntEnabled){if(c===globalThis.BigUint64Array)return y.HEAP64U;if(c===globalThis.BigInt64Array)return y.HEAP64;break}}n("Invalid heapForSize() size: expecting 8, 16, 32,","or (if BigInt is enabled) 64.")},t.functionTable=function(){return t.exports.__indirect_function_table},t.functionEntry=function(c){const d=t.functionTable();return c>7)},rxJSig:/^(\w)\((\w*)\)$/,sigParams:function(m){const l=c._.rxJSig.exec(m);return l?l[2]:m.substr(1)},letterType:m=>c._.sigTypes[m]||n("Invalid signature letter:",m),pushSigType:(m,l)=>m.push(c._.typeCodes[c._.letterType(l)])}),typeof d=="string"){const m=y;y=d,d=m}const B=c._.sigParams(y),f=[1,96];c._.uleb128Encode(f,"push",B.length);for(const m of B)c._.pushSigType(f,m);return y[0]==="v"?f.push(0):(f.push(1),c._.pushSigType(f,y[0])),c._.uleb128Encode(f,"unshift",f.length),f.unshift(0,97,115,109,1,0,0,0,1),f.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0),new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array(f)),{e:{f:d}}).exports.f};const g=function(d,y,B){if(B&&!o.scopedAlloc.length&&n("No scopedAllocPush() scope is active."),typeof d=="string"){const _=y;y=d,d=_}(typeof y!="string"||!(d instanceof Function))&&n("Invalid arguments: expecting (function,signature) or (signature,function).");const f=t.functionTable(),m=f.length;let l;for(;o.freeFuncIndexes.length&&(l=o.freeFuncIndexes.pop(),f.get(l));){l=null;continue}l||(l=m,f.grow(1));try{return f.set(l,d),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l),l}catch(_){if(!(_ instanceof TypeError))throw l===m&&o.freeFuncIndexes.push(m),_}try{const _=t.jsFuncToWasm(d,y);f.set(l,_),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l)}catch(_){throw l===m&&o.freeFuncIndexes.push(m),_}return l};t.installFunction=(c,d)=>g(c,d,!1),t.scopedInstallFunction=(c,d)=>g(c,d,!0),t.uninstallFunction=function(c){if(!c&&c!==0)return;const d=o.freeFuncIndexes,y=t.functionTable();d.push(c);const B=y.get(c);return y.set(c,null),B},t.peek=function(d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p(),f=Array.isArray(d)?[]:void 0;let m;do{switch(f&&(d=arguments[0].shift()),y){case"i1":case"i8":m=B.HEAP8[d>>0];break;case"i16":m=B.HEAP16[d>>1];break;case"i32":m=B.HEAP32[d>>2];break;case"float":case"f32":m=B.HEAP32F[d>>2];break;case"double":case"f64":m=Number(B.HEAP64F[d>>3]);break;case"i64":if(t.bigIntEnabled){m=BigInt(B.HEAP64[d>>3]);break}default:n("Invalid type for peek():",y)}f&&f.push(m)}while(f&&arguments[0].length);return f||m},t.poke=function(c,d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();for(const f of Array.isArray(c)?c:[c])switch(y){case"i1":case"i8":B.HEAP8[f>>0]=d;continue;case"i16":B.HEAP16[f>>1]=d;continue;case"i32":B.HEAP32[f>>2]=d;continue;case"float":case"f32":B.HEAP32F[f>>2]=d;continue;case"double":case"f64":B.HEAP64F[f>>3]=d;continue;case"i64":if(B.HEAP64){B.HEAP64[f>>3]=BigInt(d);continue}default:n("Invalid type for poke(): "+y)}return this},t.peekPtr=(...c)=>t.peek(c.length===1?c[0]:c,r),t.pokePtr=(c,d=0)=>t.poke(c,d,r),t.peek8=(...c)=>t.peek(c.length===1?c[0]:c,"i8"),t.poke8=(c,d)=>t.poke(c,d,"i8"),t.peek16=(...c)=>t.peek(c.length===1?c[0]:c,"i16"),t.poke16=(c,d)=>t.poke(c,d,"i16"),t.peek32=(...c)=>t.peek(c.length===1?c[0]:c,"i32"),t.poke32=(c,d)=>t.poke(c,d,"i32"),t.peek64=(...c)=>t.peek(c.length===1?c[0]:c,"i64"),t.poke64=(c,d)=>t.poke(c,d,"i64"),t.peek32f=(...c)=>t.peek(c.length===1?c[0]:c,"f32"),t.poke32f=(c,d)=>t.poke(c,d,"f32"),t.peek64f=(...c)=>t.peek(c.length===1?c[0]:c,"f64"),t.poke64f=(c,d)=>t.poke(c,d,"f64"),t.getMemValue=t.peek,t.getPtrValue=t.peekPtr,t.setMemValue=t.poke,t.setPtrValue=t.pokePtr,t.isPtr32=c=>typeof c=="number"&&c===(c|0)&&c>=0,t.isPtr=t.isPtr32,t.cstrlen=function(c){if(!c||!t.isPtr(c))return null;const d=p().HEAP8U;let y=c;for(;d[y]!==0;++y);return y-c};const O=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,R=function(c,d,y){return o.utf8Decoder.decode(c.buffer instanceof O?c.slice(d,y):c.subarray(d,y))};t.cstrToJs=function(c){const d=t.cstrlen(c);return d?R(p().HEAP8U,c,c+d):d===null?d:""},t.jstrlen=function(c){if(typeof c!="string")return null;const d=c.length;let y=0;for(let B=0;B=55296&&f<=57343&&(f=65536+((f&1023)<<10)|c.charCodeAt(++B)&1023),f<=127?++y:f<=2047?y+=2:f<=65535?y+=3:y+=4}return y},t.jstrcpy=function(c,d,y=0,B=-1,f=!0){if((!d||!(d instanceof Int8Array)&&!(d instanceof Uint8Array))&&n("jstrcpy() target must be an Int8Array or Uint8Array."),B<0&&(B=d.length-y),!(B>0)||!(y>=0))return 0;let m=0,l=c.length;const _=y,u=y+B-(f?1:0);for(;m=55296&&I<=57343&&(I=65536+((I&1023)<<10)|c.charCodeAt(++m)&1023),I<=127){if(y>=u)break;d[y++]=I}else if(I<=2047){if(y+1>=u)break;d[y++]=192|I>>6,d[y++]=128|I&63}else if(I<=65535){if(y+2>=u)break;d[y++]=224|I>>12,d[y++]=128|I>>6&63,d[y++]=128|I&63}else{if(y+3>=u)break;d[y++]=240|I>>18,d[y++]=128|I>>12&63,d[y++]=128|I>>6&63,d[y++]=128|I&63}}return f&&(d[y++]=0),y-_},t.cstrncpy=function(c,d,y){if((!c||!d)&&n("cstrncpy() does not accept NULL strings."),y<0)y=t.cstrlen(strPtr)+1;else if(!(y>0))return 0;const B=t.heap8u();let f=0,m;for(;fo.utf8Encoder.encode(d?c+"\0":c);const z=(c,d)=>{(!(c.alloc instanceof Function)||!(c.dealloc instanceof Function))&&n("Object is missing alloc() and/or dealloc() function(s)","required by",d+"().")},W=function(c,d,y,B){if(z(t,B),typeof c!="string")return null;{const f=o.utf8Encoder.encode(c),m=y(f.length+1),l=p().HEAP8U;return l.set(f,m),l[m+f.length]=0,d?[m,f.length]:m}};t.allocCString=(c,d=!1)=>W(c,d,t.alloc,"allocCString()"),t.scopedAllocPush=function(){z(t,"scopedAllocPush");const c=[];return o.scopedAlloc.push(c),c},t.scopedAllocPop=function(c){z(t,"scopedAllocPop");const d=arguments.length?o.scopedAlloc.indexOf(c):o.scopedAlloc.length-1;d<0&&n("Invalid state object for scopedAllocPop()."),arguments.length===0&&(c=o.scopedAlloc[d]),o.scopedAlloc.splice(d,1);for(let y;y=c.pop();)t.functionEntry(y)?t.uninstallFunction(y):t.dealloc(y)},t.scopedAlloc=function(c){o.scopedAlloc.length||n("No scopedAllocPush() scope is active.");const d=t.alloc(c);return o.scopedAlloc[o.scopedAlloc.length-1].push(d),d},Object.defineProperty(t.scopedAlloc,"level",{configurable:!1,enumerable:!1,get:()=>o.scopedAlloc.length,set:()=>n("The 'active' property is read-only.")}),t.scopedAllocCString=(c,d=!1)=>W(c,d,t.scopedAlloc,"scopedAllocCString()");const T=function(c,d){const y=t[c?"scopedAlloc":"alloc"]((d.length+1)*t.ptrSizeof);let B=0;return d.forEach(f=>{t.pokePtr(y+t.ptrSizeof*B++,t[c?"scopedAllocCString":"allocCString"](""+f))}),t.pokePtr(y+t.ptrSizeof*B,0),y};t.scopedAllocMainArgv=c=>T(!0,c),t.allocMainArgv=c=>T(!1,c),t.cArgvToJs=(c,d)=>{const y=[];for(let B=0;BA(c,d,"alloc"),t.scopedAllocPtr=(c=1,d=!0)=>A(c,d,"scopedAlloc"),t.xGet=function(c){return t.exports[c]||n("Cannot find exported symbol:",c)};const D=(c,d)=>n(c+"() requires",d,"argument(s).");t.xCall=function(c,...d){const y=c instanceof Function?c:t.xGet(c);return y instanceof Function||n("Exported symbol",c,"is not a function."),y.length!==d.length&&D(y===c?y.name:c,y.length),arguments.length===2&&Array.isArray(arguments[1])?y.apply(null,arguments[1]):y.apply(null,d)},o.xWrap=Object.create(null),o.xWrap.convert=Object.create(null),o.xWrap.convert.arg=new Map,o.xWrap.convert.result=new Map;const q=o.xWrap.convert.arg,w=o.xWrap.convert.result;t.bigIntEnabled&&q.set("i64",c=>BigInt(c));const x=r==="i32"?c=>c|0:c=>BigInt(c)|BigInt(0);q.set("i32",x).set("i16",c=>(c|0)&65535).set("i8",c=>(c|0)&255).set("f32",c=>Number(c).valueOf()).set("float",q.get("f32")).set("f64",q.get("f32")).set("double",q.get("f64")).set("int",q.get("i32")).set("null",c=>c).set(null,q.get("null")).set("**",x).set("*",x),w.set("*",x).set("pointer",x).set("number",c=>Number(c)).set("void",c=>{}).set("null",c=>c).set(null,w.get("null"));{const c=["i8","i16","i32","int","f32","float","f64","double"];t.bigIntEnabled&&c.push("i64");const d=q.get(r);for(const y of c)q.set(y+"*",d),w.set(y+"*",d),w.set(y,q.get(y)||n("Missing arg converter:",y))}const N=function(c){return typeof c=="string"?t.scopedAllocCString(c):c?x(c):null};q.set("string",N).set("utf8",N).set("pointer",N),w.set("string",c=>t.cstrToJs(c)).set("utf8",w.get("string")).set("string:dealloc",c=>{try{return c?t.cstrToJs(c):null}finally{t.dealloc(c)}}).set("utf8:dealloc",w.get("string:dealloc")).set("json",c=>JSON.parse(t.cstrToJs(c))).set("json:dealloc",c=>{try{return c?JSON.parse(t.cstrToJs(c)):null}finally{t.dealloc(c)}});const P=class{constructor(c){this.name=c.name||"unnamed adapter"}convertArg(c,d,y){n("AbstractArgAdapter must be subclassed.")}};q.FuncPtrAdapter=class Ae extends P{constructor(d){super(d),q.FuncPtrAdapter.warnOnUse&&console.warn("xArg.FuncPtrAdapter is an internal-only API","and is not intended to be invoked from","client-level code. Invoked with:",d),this.name=d.name||"unnamed",this.signature=d.signature,d.contextKey instanceof Function&&(this.contextKey=d.contextKey,d.bindScope||(d.bindScope="context")),this.bindScope=d.bindScope||n("FuncPtrAdapter options requires a bindScope (explicit or implied)."),Ae.bindScopes.indexOf(d.bindScope)<0&&n("Invalid options.bindScope ("+d.bindMod+") for FuncPtrAdapter. Expecting one of: ("+Ae.bindScopes.join(", ")+")"),this.isTransient=this.bindScope==="transient",this.isContext=this.bindScope==="context",this.isPermanent=this.bindScope==="permanent",this.singleton=this.bindScope==="singleton"?[]:void 0,this.callProxy=d.callProxy instanceof Function?d.callProxy:void 0}contextKey(d,y){return this}contextMap(d){const y=this.__cmap||(this.__cmap=new Map);let B=y.get(d);return B===void 0&&y.set(d,B=[]),B}convertArg(d,y,B){let f=this.singleton;if(!f&&this.isContext&&(f=this.contextMap(this.contextKey(y,B))),f&&f[0]===d)return f[1];if(d instanceof Function){this.callProxy&&(d=this.callProxy(d));const m=g(d,this.signature,this.isTransient);if(Ae.debugFuncInstall&&Ae.debugOut("FuncPtrAdapter installed",this,this.contextKey(y,B),"@"+m,d),f){if(f[1]){Ae.debugFuncInstall&&Ae.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}}f[0]=d,f[1]=m}return m}else if(t.isPtr(d)||d===null||d===void 0){if(f&&f[1]&&f[1]!==d){Ae.debugFuncInstall&&Ae.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}f[0]=f[1]=d|0}return d||0}else throw new TypeError("Invalid FuncPtrAdapter argument type. Expecting a function pointer or a "+(this.name?this.name+" ":"")+"function matching signature "+this.signature+".")}},q.FuncPtrAdapter.warnOnUse=!1,q.FuncPtrAdapter.debugFuncInstall=!1,q.FuncPtrAdapter.debugOut=console.debug.bind(console),q.FuncPtrAdapter.bindScopes=["transient","context","singleton","permanent"];const S=c=>q.get(c)||n("Argument adapter not found:",c),L=c=>w.get(c)||n("Result adapter not found:",c);o.xWrap.convertArg=(c,...d)=>S(c)(...d),o.xWrap.convertArgNoCheck=(c,...d)=>q.get(c)(...d),o.xWrap.convertResult=(c,d)=>c===null?d:c?L(c)(d):void 0,o.xWrap.convertResultNoCheck=(c,d)=>c===null?d:c?w.get(c)(d):void 0,t.xWrap=function(c,d,...y){arguments.length===3&&Array.isArray(arguments[2])&&(y=arguments[2]),t.isPtr(c)&&(c=t.functionEntry(c)||n("Function pointer not found in WASM function table."));const B=c instanceof Function,f=B?c:t.xGet(c);if(B&&(c=f.name||"unnamed function"),y.length!==f.length&&D(c,f.length),d===null&&f.length===0)return f;d!=null&&L(d);for(const l of y)l instanceof P?q.set(l,(..._)=>l.convertArg(..._)):S(l);const m=o.xWrap;return f.length===0?(...l)=>l.length?D(c,f.length):m.convertResult(d,f.call(null)):function(...l){l.length!==f.length&&D(c,f.length);const _=t.scopedAllocPush();try{let u=0;for(;ufetch(t.uri,{credentials:"same-origin"}),r=this,s=function(p){if(t.wasmUtilTarget){const g=(...R)=>{throw new Error(R.join(" "))},O=t.wasmUtilTarget;if(O.module=p.module,O.instance=p.instance,O.instance.exports.memory||(O.memory=t.imports&&t.imports.env&&t.imports.env.memory||g("Missing 'memory' object!")),!O.alloc&&p.instance.exports.malloc){const R=p.instance.exports;O.alloc=function(z){return R.malloc(z)||g("Allocation of",z,"bytes failed.")},O.dealloc=function(z){R.free(z)}}r(O)}return t.onload&&t.onload(p,t),p};return WebAssembly.instantiateStreaming?function(){return WebAssembly.instantiateStreaming(n(),t.imports||{}).then(s)}:function(){return n().then(g=>g.arrayBuffer()).then(g=>WebAssembly.instantiate(g,t.imports||{})).then(s)}}).bind(globalThis.WhWasmUtilInstaller),globalThis.Jaccwabyt=function t(n){const r=(...F)=>{throw new Error(F.join(" "))};!(n.heap instanceof WebAssembly.Memory)&&!(n.heap instanceof Function)&&r("config.heap must be WebAssembly.Memory instance or a function."),["alloc","dealloc"].forEach(function(F){n[F]instanceof Function||r("Config option '"+F+"' must be a function.")});const s=t,o=n.heap instanceof Function?n.heap:()=>new Uint8Array(n.heap.buffer),p=n.alloc,g=n.dealloc,O=n.log||console.log.bind(console),R=n.memberPrefix||"",z=n.memberSuffix||"",W=n.bigIntEnabled===void 0?!!globalThis.BigInt64Array:!!n.bigIntEnabled,T=globalThis.BigInt,A=globalThis.BigInt64Array,D=n.ptrSizeof||4,q=n.ptrIR||"i32";s.debugFlags||(s.__makeDebugFlags=function(F=null){F&&F.__flags&&(F=F.__flags);const V=function K(X){return arguments.length===0?K.__flags:(X<0?(delete K.__flags.getter,delete K.__flags.setter,delete K.__flags.alloc,delete K.__flags.dealloc):(K.__flags.getter=(1&X)!==0,K.__flags.setter=(2&X)!==0,K.__flags.alloc=(4&X)!==0,K.__flags.dealloc=(8&X)!==0),K._flags)};return Object.defineProperty(V,"__flags",{iterable:!1,writable:!1,value:Object.create(F)}),F||V(0),V},s.debugFlags=s.__makeDebugFlags());const w=(function(){const F=new ArrayBuffer(2);return new DataView(F).setInt16(0,256,!0),new Int16Array(F)[0]===256})(),x=F=>F[1]==="(",N=F=>F==="P",P=F=>x(F)?"p":F[0],S=function(F){switch(P(F)){case"c":case"C":return"i8";case"i":return"i32";case"p":case"P":case"s":return q;case"j":return"i64";case"f":return"float";case"d":return"double"}r("Unhandled signature IR:",F)},L=A?()=>!0:()=>r("BigInt64Array is not available."),$=function(F){switch(P(F)){case"p":case"P":case"s":{switch(D){case 4:return"getInt32";case 8:return L()&&"getBigInt64"}break}case"i":return"getInt32";case"c":return"getInt8";case"C":return"getUint8";case"j":return L()&&"getBigInt64";case"f":return"getFloat32";case"d":return"getFloat64"}r("Unhandled DataView getter for signature:",F)},c=function(F){switch(P(F)){case"p":case"P":case"s":{switch(D){case 4:return"setInt32";case 8:return L()&&"setBigInt64"}break}case"i":return"setInt32";case"c":return"setInt8";case"C":return"setUint8";case"j":return L()&&"setBigInt64";case"f":return"setFloat32";case"d":return"setFloat64"}r("Unhandled DataView setter for signature:",F)},d=function(F){switch(P(F)){case"i":case"f":case"c":case"C":case"d":return Number;case"j":return L()&&T;case"p":case"P":case"s":switch(D){case 4:return Number;case 8:return L()&&T}break}r("Unhandled DataView set wrapper for signature:",F)},y=(F,V)=>F+"::"+V,B=function(F,V){return()=>r(y(F,V),"is read-only.")},f=new WeakMap,m="(pointer-is-external)",l=function(F,V,K){if(K||(K=f.get(V)),K){if(f.delete(V),Array.isArray(V.ondispose)){let X;for(;X=V.ondispose.shift();)try{X instanceof Function?X.call(V):X instanceof te?X.dispose():typeof X=="number"&&g(X)}catch(ae){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",ae)}}else if(V.ondispose instanceof Function)try{V.ondispose()}catch(X){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",X)}delete V.ondispose,F.debugFlags.__flags.dealloc&&O("debug.dealloc:",V[m]?"EXTERNAL":"",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),V[m]||g(K)}},_=F=>({configurable:!1,writable:!1,iterable:!1,value:F}),u=function(F,V,K){let X=!K;K?Object.defineProperty(V,m,_(K)):(K=p(F.structInfo.sizeof),K||r("Allocation of",F.structName,"structure failed."));try{F.debugFlags.__flags.alloc&&O("debug.alloc:",X?"":"EXTERNAL",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),X&&o().fill(0,K,K+F.structInfo.sizeof),f.set(V,K)}catch(ae){throw l(F,V,K),ae}},I=function(){const F=this.pointer;return F?new Uint8Array(o().slice(F,F+this.structInfo.sizeof)):null},ee=_(F=>R+F+z),ne=function(F,V,K=!0){let X=F.members[V];if(!X&&(R||z)){for(const ae of Object.values(F.members))if(ae.key===V){X=ae;break}!X&&K&&r(y(F.name,V),"is not a mapped struct member.")}return X},re=function F(V,K,X=!1){F._||(F._=de=>de.replace(/[^vipPsjrdcC]/g,"").replace(/[pPscC]/g,"i"));const ae=ne(V.structInfo,K,!0);return X?F._(ae.signature):ae.signature},se={configurable:!1,enumerable:!1,get:function(){return f.get(this)},set:()=>r("Cannot assign the 'pointer' property of a struct.")},j=_(function(){const F=[];for(const V of Object.keys(this.structInfo.members))F.push(this.memberKey(V));return F}),b=new TextDecoder("utf-8"),k=new TextEncoder,Q=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,H=function(F,V,K){return b.decode(F.buffer instanceof Q?F.slice(V,K):F.subarray(V,K))},Z=function(F,V,K=!1){const X=ne(F.structInfo,V,K);return X&&X.signature.length===1&&X.signature[0]==="s"?X:!1},E=function(F){F.signature!=="s"&&r("Invalid member type signature for C-string value:",JSON.stringify(F))},C=function(V,K){const X=ne(V.structInfo,K,!0);E(X);const ae=V[X.key];if(!ae)return null;let de=ae;const ue=o();for(;ue[de]!==0;++de);return ae===de?"":H(ue,ae,de)},M=function(F,...V){F.ondispose?Array.isArray(F.ondispose)||(F.ondispose=[F.ondispose]):F.ondispose=[],F.ondispose.push(...V)},J=function(F){const V=k.encode(F),K=p(V.length+1);K||r("Allocation error while duplicating string:",F);const X=o();return X.set(V,K),X[K+V.length]=0,K},G=function(F,V,K){const X=ne(F.structInfo,V,!0);E(X);const ae=J(K);return F[X.key]=ae,M(F,ae),F},te=function(V,K){arguments[2]!==_&&r("Do not call the StructType constructor","from client-level code."),Object.defineProperties(this,{structName:_(V),structInfo:_(K)})};te.prototype=Object.create(null,{dispose:_(function(){l(this.constructor,this)}),lookupMember:_(function(F,V=!0){return ne(this.structInfo,F,V)}),memberToJsString:_(function(F){return C(this,F)}),memberIsString:_(function(F,V=!0){return Z(this,F,V)}),memberKey:ee,memberKeys:j,memberSignature:_(function(F,V=!1){return re(this,F,V)}),memoryDump:_(I),pointer:se,setMemberCString:_(function(F,V){return G(this,F,V)})}),Object.assign(te.prototype,{addOnDispose:function(...F){return M(this,...F),this}}),Object.defineProperties(te,{allocCString:_(J),isA:_(F=>F instanceof te),hasExternalPointer:_(F=>F instanceof te&&!!F[m]),memberKey:ee});const oe=F=>Number.isFinite(F)||F instanceof(T||Number),Y=function F(V,K,X){if(!F._){F._={getters:{},setters:{},sw:{}};const me=["i","c","C","p","P","s","f","d","v()"];W&&me.push("j"),me.forEach(function(we){F._.getters[we]=$(we),F._.setters[we]=c(we),F._.sw[we]=d(we)});const Kn=/^[ipPsjfdcC]$/,Jn=/^[vipPsjfdcC]\([ipPsjfdcC]*\)$/;F.sigCheck=function(we,Xn,kt,ot){Object.prototype.hasOwnProperty.call(we,kt)&&r(we.structName,"already has a property named",kt+"."),Kn.test(ot)||Jn.test(ot)||r("Malformed signature for",y(we.structName,Xn)+":",ot)}}const ae=V.memberKey(K);F.sigCheck(V.prototype,K,ae,X.signature),X.key=ae,X.name=K;const de=P(X.signature),ue=y(V.prototype.structName,ae),fe=V.prototype.debugFlags.__flags,Re=Object.create(null);Re.configurable=!1,Re.enumerable=!1,Re.get=function(){fe.getter&&O("debug.getter:",F._.getters[de],"for",S(de),ue,"@",this.pointer,"+",X.offset,"sz",X.sizeof);let me=new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.getters[de]](0,w);return fe.getter&&O("debug.getter:",ue,"result =",me),me},X.readOnly?Re.set=B(V.prototype.structName,ae):Re.set=function(me){if(fe.setter&&O("debug.setter:",F._.setters[de],"for",S(de),ue,"@",this.pointer,"+",X.offset,"sz",X.sizeof,me),this.pointer||r("Cannot set struct property on disposed instance."),me===null)me=0;else for(;!oe(me);){if(N(X.signature)&&me instanceof te){me=me.pointer||0,fe.setter&&O("debug.setter:",ue,"resolved to",me);break}r("Invalid value for pointer-type",ue+".")}new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.setters[de]](0,F._.sw[de](me),w)},Object.defineProperty(V.prototype,ae,Re)},pe=function F(V,K){arguments.length===1?(K=V,V=K.name):K.name||(K.name=V),V||r("Struct name is required.");let X=!1;Object.keys(K.members).forEach(ue=>{const fe=K.members[ue];fe.sizeof?fe.sizeof===1?fe.signature==="c"||fe.signature==="C"||r("Unexpected sizeof==1 member",y(K.name,ue),"with signature",fe.signature):(fe.sizeof%4!==0&&(console.warn("Invalid struct member description =",fe,"from",K),r(V,"member",ue,"sizeof is not aligned. sizeof="+fe.sizeof)),fe.offset%4!==0&&(console.warn("Invalid struct member description =",fe,"from",K),r(V,"member",ue,"offset is not aligned. offset="+fe.offset))):r(V,"member",ue,"is missing sizeof."),(!X||X.offsetue instanceof de),memberKey:ee,memberKeys:j,methodInfoForKey:_(function(ue){}),structInfo:_(K),structName:_(V)}),de.prototype=new te(V,K,_),Object.defineProperties(de.prototype,{debugFlags:ae,constructor:_(de)}),Object.keys(K.members).forEach(ue=>Y(de,ue,K.members[ue])),de};return pe.StructType=te,pe.config=n,pe.allocCString=J,pe.debugFlags||(pe.debugFlags=s.__makeDebugFlags(s.debugFlags)),pe},globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...q)=>{throw new Error(q.join(" "))};t.SQLite3Error.toss;const r=t.capi,s=t.wasm,o=t.util;if(globalThis.WhWasmUtilInstaller(s),delete globalThis.WhWasmUtilInstaller,s.bindingSignatures=[["sqlite3_aggregate_context","void*","sqlite3_context*","int"],["sqlite3_bind_double","int","sqlite3_stmt*","int","f64"],["sqlite3_bind_int","int","sqlite3_stmt*","int","int"],["sqlite3_bind_null",void 0,"sqlite3_stmt*","int"],["sqlite3_bind_parameter_count","int","sqlite3_stmt*"],["sqlite3_bind_parameter_index","int","sqlite3_stmt*","string"],["sqlite3_bind_parameter_name","string","sqlite3_stmt*","int"],["sqlite3_bind_pointer","int","sqlite3_stmt*","int","*","string:static","*"],["sqlite3_busy_handler","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({signature:"i(pi)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_busy_timeout","int","sqlite3*","int"],["sqlite3_changes","int","sqlite3*"],["sqlite3_clear_bindings","int","sqlite3_stmt*"],["sqlite3_collation_needed","int","sqlite3*","*","*"],["sqlite3_column_blob","*","sqlite3_stmt*","int"],["sqlite3_column_bytes","int","sqlite3_stmt*","int"],["sqlite3_column_count","int","sqlite3_stmt*"],["sqlite3_column_decltype","string","sqlite3_stmt*","int"],["sqlite3_column_double","f64","sqlite3_stmt*","int"],["sqlite3_column_int","int","sqlite3_stmt*","int"],["sqlite3_column_name","string","sqlite3_stmt*","int"],["sqlite3_column_text","string","sqlite3_stmt*","int"],["sqlite3_column_type","int","sqlite3_stmt*","int"],["sqlite3_column_value","sqlite3_value*","sqlite3_stmt*","int"],["sqlite3_commit_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_commit_hook",signature:"i(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_compileoption_get","string","int"],["sqlite3_compileoption_used","int","string"],["sqlite3_complete","int","string:flexible"],["sqlite3_context_db_handle","sqlite3*","sqlite3_context*"],["sqlite3_data_count","int","sqlite3_stmt*"],["sqlite3_db_filename","string","sqlite3*","string"],["sqlite3_db_handle","sqlite3*","sqlite3_stmt*"],["sqlite3_db_name","string","sqlite3*","int"],["sqlite3_db_readonly","int","sqlite3*","string"],["sqlite3_db_status","int","sqlite3*","int","*","*","int"],["sqlite3_errcode","int","sqlite3*"],["sqlite3_errmsg","string","sqlite3*"],["sqlite3_error_offset","int","sqlite3*"],["sqlite3_errstr","string","int"],["sqlite3_exec","int",["sqlite3*","string:flexible",new s.xWrap.FuncPtrAdapter({signature:"i(pipp)",bindScope:"transient",callProxy:q=>{let w;return(x,N,P,S)=>{try{const L=s.cArgvToJs(N,P);return w||(w=s.cArgvToJs(N,S)),q(L,w)|0}catch(L){return L.resultCode||r.SQLITE_ERROR}}}}),"*","**"]],["sqlite3_expanded_sql","string","sqlite3_stmt*"],["sqlite3_extended_errcode","int","sqlite3*"],["sqlite3_extended_result_codes","int","sqlite3*","int"],["sqlite3_file_control","int","sqlite3*","string","int","*"],["sqlite3_finalize","int","sqlite3_stmt*"],["sqlite3_free",void 0,"*"],["sqlite3_get_autocommit","int","sqlite3*"],["sqlite3_get_auxdata","*","sqlite3_context*","int"],["sqlite3_initialize",void 0],["sqlite3_interrupt",void 0,"sqlite3*"],["sqlite3_is_interrupted","int","sqlite3*"],["sqlite3_keyword_count","int"],["sqlite3_keyword_name","int",["int","**","*"]],["sqlite3_keyword_check","int",["string","int"]],["sqlite3_libversion","string"],["sqlite3_libversion_number","int"],["sqlite3_limit","int",["sqlite3*","int","int"]],["sqlite3_malloc","*","int"],["sqlite3_open","int","string","*"],["sqlite3_open_v2","int","string","*","int","string"],["sqlite3_realloc","*","*","int"],["sqlite3_reset","int","sqlite3_stmt*"],["sqlite3_result_blob",void 0,"sqlite3_context*","*","int","*"],["sqlite3_result_double",void 0,"sqlite3_context*","f64"],["sqlite3_result_error",void 0,"sqlite3_context*","string","int"],["sqlite3_result_error_code",void 0,"sqlite3_context*","int"],["sqlite3_result_error_nomem",void 0,"sqlite3_context*"],["sqlite3_result_error_toobig",void 0,"sqlite3_context*"],["sqlite3_result_int",void 0,"sqlite3_context*","int"],["sqlite3_result_null",void 0,"sqlite3_context*"],["sqlite3_result_pointer",void 0,"sqlite3_context*","*","string:static","*"],["sqlite3_result_subtype",void 0,"sqlite3_value*","int"],["sqlite3_result_text",void 0,"sqlite3_context*","string","int","*"],["sqlite3_result_zeroblob",void 0,"sqlite3_context*","int"],["sqlite3_rollback_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_rollback_hook",signature:"v(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_set_auxdata",void 0,["sqlite3_context*","int","*","*"]],["sqlite3_shutdown",void 0],["sqlite3_sourceid","string"],["sqlite3_sql","string","sqlite3_stmt*"],["sqlite3_status","int","int","*","*","int"],["sqlite3_step","int","sqlite3_stmt*"],["sqlite3_stmt_busy","int","sqlite3_stmt*"],["sqlite3_stmt_readonly","int","sqlite3_stmt*"],["sqlite3_stmt_status","int","sqlite3_stmt*","int","int"],["sqlite3_strglob","int","string","string"],["sqlite3_stricmp","int","string","string"],["sqlite3_strlike","int","string","string","int"],["sqlite3_strnicmp","int","string","string","int"],["sqlite3_table_column_metadata","int","sqlite3*","string","string","string","**","**","*","*","*"],["sqlite3_total_changes","int","sqlite3*"],["sqlite3_trace_v2","int",["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"sqlite3_trace_v2::callback",signature:"i(ippp)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_txn_state","int",["sqlite3*","string"]],["sqlite3_uri_boolean","int","sqlite3_filename","string","int"],["sqlite3_uri_key","string","sqlite3_filename","int"],["sqlite3_uri_parameter","string","sqlite3_filename","string"],["sqlite3_user_data","void*","sqlite3_context*"],["sqlite3_value_blob","*","sqlite3_value*"],["sqlite3_value_bytes","int","sqlite3_value*"],["sqlite3_value_double","f64","sqlite3_value*"],["sqlite3_value_dup","sqlite3_value*","sqlite3_value*"],["sqlite3_value_free",void 0,"sqlite3_value*"],["sqlite3_value_frombind","int","sqlite3_value*"],["sqlite3_value_int","int","sqlite3_value*"],["sqlite3_value_nochange","int","sqlite3_value*"],["sqlite3_value_numeric_type","int","sqlite3_value*"],["sqlite3_value_pointer","*","sqlite3_value*","string:static"],["sqlite3_value_subtype","int","sqlite3_value*"],["sqlite3_value_text","string","sqlite3_value*"],["sqlite3_value_type","int","sqlite3_value*"],["sqlite3_vfs_find","*","string"],["sqlite3_vfs_register","int","sqlite3_vfs*","int"],["sqlite3_vfs_unregister","int","sqlite3_vfs*"]],s.exports.sqlite3_progress_handler&&s.bindingSignatures.push(["sqlite3_progress_handler",void 0,["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"xProgressHandler",signature:"i(p)",bindScope:"context",contextKey:(q,w)=>q[0]}),"*"]]),s.exports.sqlite3_stmt_explain&&s.bindingSignatures.push(["sqlite3_stmt_explain","int","sqlite3_stmt*","int"],["sqlite3_stmt_isexplain","int","sqlite3_stmt*"]),s.exports.sqlite3_set_authorizer&&s.bindingSignatures.push(["sqlite3_set_authorizer","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_set_authorizer::xAuth",signature:"i(pissss)",contextKey:(q,w)=>q[0],callProxy:q=>(w,x,N,P,S,L)=>{try{return N=N&&s.cstrToJs(N),P=P&&s.cstrToJs(P),S=S&&s.cstrToJs(S),L=L&&s.cstrToJs(L),q(w,x,N,P,S,L)||0}catch($){return $.resultCode||r.SQLITE_ERROR}}}),"*"]]),s.bindingSignatures.int64=[["sqlite3_bind_int64","int",["sqlite3_stmt*","int","i64"]],["sqlite3_changes64","i64",["sqlite3*"]],["sqlite3_column_int64","i64",["sqlite3_stmt*","int"]],["sqlite3_deserialize","int","sqlite3*","string","*","i64","i64","int"],["sqlite3_last_insert_rowid","i64",["sqlite3*"]],["sqlite3_malloc64","*","i64"],["sqlite3_msize","i64","*"],["sqlite3_overload_function","int",["sqlite3*","string","int"]],["sqlite3_realloc64","*","*","i64"],["sqlite3_result_int64",void 0,"*","i64"],["sqlite3_result_zeroblob64","int","*","i64"],["sqlite3_serialize","*","sqlite3*","string","*","int"],["sqlite3_set_last_insert_rowid",void 0,["sqlite3*","i64"]],["sqlite3_status64","int","int","*","*","int"],["sqlite3_total_changes64","i64",["sqlite3*"]],["sqlite3_update_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_update_hook",signature:"v(iippj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,P,S)=>{q(w,x,s.cstrToJs(N),s.cstrToJs(P),S)}}),"*"]],["sqlite3_uri_int64","i64",["sqlite3_filename","string","i64"]],["sqlite3_value_int64","i64","sqlite3_value*"]],s.bigIntEnabled&&s.exports.sqlite3_declare_vtab&&s.bindingSignatures.int64.push(["sqlite3_create_module","int",["sqlite3*","string","sqlite3_module*","*"]],["sqlite3_create_module_v2","int",["sqlite3*","string","sqlite3_module*","*","*"]],["sqlite3_declare_vtab","int",["sqlite3*","string:flexible"]],["sqlite3_drop_modules","int",["sqlite3*","**"]],["sqlite3_vtab_collation","string","sqlite3_index_info*","int"],["sqlite3_vtab_distinct","int","sqlite3_index_info*"],["sqlite3_vtab_in","int","sqlite3_index_info*","int","int"],["sqlite3_vtab_in_first","int","sqlite3_value*","**"],["sqlite3_vtab_in_next","int","sqlite3_value*","**"],["sqlite3_vtab_nochange","int","sqlite3_context*"],["sqlite3_vtab_on_conflict","int","sqlite3*"],["sqlite3_vtab_rhs_value","int","sqlite3_index_info*","int","**"]),s.bigIntEnabled&&s.exports.sqlite3_preupdate_hook&&s.bindingSignatures.int64.push(["sqlite3_preupdate_blobwrite","int","sqlite3*"],["sqlite3_preupdate_count","int","sqlite3*"],["sqlite3_preupdate_depth","int","sqlite3*"],["sqlite3_preupdate_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_preupdate_hook",signature:"v(ppippjj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,P,S,L,$)=>{q(w,x,N,s.cstrToJs(P),s.cstrToJs(S),L,$)}}),"*"]],["sqlite3_preupdate_new","int",["sqlite3*","int","**"]],["sqlite3_preupdate_old","int",["sqlite3*","int","**"]]),s.bigIntEnabled&&s.exports.sqlite3changegroup_add&&s.exports.sqlite3session_create&&s.exports.sqlite3_preupdate_hook){const q={signature:"i(ps)",callProxy:w=>(x,N)=>{try{return w(x,s.cstrToJs(N))|0}catch(P){return P.resultCode||r.SQLITE_ERROR}}};s.bindingSignatures.int64.push(["sqlite3changegroup_add","int",["sqlite3_changegroup*","int","void*"]],["sqlite3changegroup_add_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changegroup_delete",void 0,["sqlite3_changegroup*"]],["sqlite3changegroup_new","int",["**"]],["sqlite3changegroup_output","int",["sqlite3_changegroup*","int*","**"]],["sqlite3changegroup_output_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_v2","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_apply_v2_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_concat","int",["int","void*","int","void*","int*","**"]],["sqlite3changeset_concat_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInputA",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xInputB",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_conflict","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_finalize","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_fk_conflicts","int",["sqlite3_changeset_iter*","int*"]],["sqlite3changeset_invert","int",["int","void*","int*","**"]],["sqlite3changeset_invert_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_new","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_next","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_old","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_op","int",["sqlite3_changeset_iter*","**","int*","int*","int*"]],["sqlite3changeset_pk","int",["sqlite3_changeset_iter*","**","int*"]],["sqlite3changeset_start","int",["**","int","*"]],["sqlite3changeset_start_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changeset_start_v2","int",["**","int","*","int"]],["sqlite3changeset_start_v2_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*","int"]],["sqlite3session_attach","int",["sqlite3_session*","string"]],["sqlite3session_changeset","int",["sqlite3_session*","int*","**"]],["sqlite3session_changeset_size","i64",["sqlite3_session*"]],["sqlite3session_changeset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_config","int",["int","void*"]],["sqlite3session_create","int",["sqlite3*","string","**"]],["sqlite3session_diff","int",["sqlite3_session*","string","string","**"]],["sqlite3session_enable","int",["sqlite3_session*","int"]],["sqlite3session_indirect","int",["sqlite3_session*","int"]],["sqlite3session_isempty","int",["sqlite3_session*"]],["sqlite3session_memory_used","i64",["sqlite3_session*"]],["sqlite3session_object_config","int",["sqlite3_session*","int","void*"]],["sqlite3session_patchset","int",["sqlite3_session*","*","**"]],["sqlite3session_patchset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_table_filter",void 0,["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xFilter",...q,contextKey:(w,x)=>w[0]}),"*"]])}s.bindingSignatures.wasmInternal=[["sqlite3__wasm_db_reset","int","sqlite3*"],["sqlite3__wasm_db_vfs","sqlite3_vfs*","sqlite3*","string"],["sqlite3__wasm_vfs_create_file","int","sqlite3_vfs*","string","*","int"],["sqlite3__wasm_posix_create_file","int","string","*","int"],["sqlite3__wasm_vfs_unlink","int","sqlite3_vfs*","string"],["sqlite3__wasm_qfmt_token","string:dealloc","string","int"]],t.StructBinder=globalThis.Jaccwabyt({heap:s.heap8u,alloc:s.alloc,dealloc:s.dealloc,bigIntEnabled:s.bigIntEnabled,memberPrefix:"$"}),delete globalThis.Jaccwabyt;{const q=s.xWrap.argAdapter("string");s.xWrap.argAdapter("string:flexible",S=>q(o.flexibleString(S))),s.xWrap.argAdapter("string:static",(function(S){return s.isPtr(S)?S:(S=""+S,this[S]||(this[S]=s.allocCString(S)))}).bind(Object.create(null)));const w=s.xWrap.argAdapter("*"),x=function(){};s.xWrap.argAdapter("sqlite3_filename",w)("sqlite3_context*",w)("sqlite3_value*",w)("void*",w)("sqlite3_changegroup*",w)("sqlite3_changeset_iter*",w)("sqlite3_session*",w)("sqlite3_stmt*",S=>w(S instanceof(t?.oo1?.Stmt||x)?S.pointer:S))("sqlite3*",S=>w(S instanceof(t?.oo1?.DB||x)?S.pointer:S))("sqlite3_vfs*",S=>typeof S=="string"?r.sqlite3_vfs_find(S)||t.SQLite3Error.toss(r.SQLITE_NOTFOUND,"Unknown sqlite3_vfs name:",S):w(S instanceof(r.sqlite3_vfs||x)?S.pointer:S)),s.exports.sqlite3_declare_vtab&&s.xWrap.argAdapter("sqlite3_index_info*",S=>w(S instanceof(r.sqlite3_index_info||x)?S.pointer:S))("sqlite3_module*",S=>w(S instanceof(r.sqlite3_module||x)?S.pointer:S));const N=s.xWrap.resultAdapter("*");s.xWrap.resultAdapter("sqlite3*",N)("sqlite3_context*",N)("sqlite3_stmt*",N)("sqlite3_value*",N)("sqlite3_vfs*",N)("void*",N),s.exports.sqlite3_step.length===0&&(s.xWrap.doArgcCheck=!1,t.config.warn("Disabling sqlite3.wasm.xWrap.doArgcCheck due to environmental quirks."));for(const S of s.bindingSignatures)r[S[0]]=s.xWrap.apply(null,S);for(const S of s.bindingSignatures.wasmInternal)o[S[0]]=s.xWrap.apply(null,S);const P=function(S){return()=>n(S+"() is unavailable due to lack","of BigInt support in this build.")};for(const S of s.bindingSignatures.int64)r[S[0]]=s.bigIntEnabled?s.xWrap.apply(null,S):P(S[0]);if(delete s.bindingSignatures,s.exports.sqlite3__wasm_db_error){const S=s.xWrap("sqlite3__wasm_db_error","int","sqlite3*","int","string");o.sqlite3__wasm_db_error=function(L,$,c){return $ instanceof t.WasmAllocError?($=r.SQLITE_NOMEM,c=0):$ instanceof Error&&(c=c||""+$,$=$.resultCode||r.SQLITE_ERROR),L?S(L,$,c):$}}else o.sqlite3__wasm_db_error=function(S,L,$){return console.warn("sqlite3__wasm_db_error() is not exported.",arguments),L}}{const q=s.xCall("sqlite3__wasm_enum_json");q||n("Maintenance required: increase sqlite3__wasm_enum_json()'s","static buffer size!"),s.ctype=JSON.parse(s.cstrToJs(q));const w=["access","authorizer","blobFinalizers","changeset","config","dataTypes","dbConfig","dbStatus","encodings","fcntl","flock","ioCap","limits","openFlags","prepareFlags","resultCodes","sqlite3Status","stmtStatus","syncFlags","trace","txnState","udfFlags","version"];s.bigIntEnabled&&w.push("serialize","session","vtab");for(const P of w)for(const S of Object.entries(s.ctype[P]))r[S[0]]=S[1];s.functionEntry(r.SQLITE_WASM_DEALLOC)||n("Internal error: cannot resolve exported function","entry SQLITE_WASM_DEALLOC (=="+r.SQLITE_WASM_DEALLOC+").");const x=Object.create(null);for(const P of["resultCodes"])for(const S of Object.entries(s.ctype[P]))x[S[1]]=S[0];r.sqlite3_js_rc_str=P=>x[P];const N=Object.assign(Object.create(null),{WasmTestStruct:!0,sqlite3_kvvfs_methods:!o.isUIThread(),sqlite3_index_info:!s.bigIntEnabled,sqlite3_index_constraint:!s.bigIntEnabled,sqlite3_index_orderby:!s.bigIntEnabled,sqlite3_index_constraint_usage:!s.bigIntEnabled});for(const P of s.ctype.structs)N[P.name]||(r[P.name]=t.StructBinder(P));if(r.sqlite3_index_info){for(const P of["sqlite3_index_constraint","sqlite3_index_orderby","sqlite3_index_constraint_usage"])r.sqlite3_index_info[P]=r[P],delete r[P];r.sqlite3_vtab_config=s.xWrap("sqlite3__wasm_vtab_config","int",["sqlite3*","int","int"])}}const p=(q,w,x)=>o.sqlite3__wasm_db_error(q,r.SQLITE_MISUSE,w+"() requires "+x+" argument"+(x===1?"":"s")+"."),g=q=>o.sqlite3__wasm_db_error(q,r.SQLITE_FORMAT,"SQLITE_UTF8 is the only supported encoding."),O=q=>s.xWrap.argAdapter("sqlite3*")(q),R=q=>s.isPtr(q)?s.cstrToJs(q):q,z=(function(q,w){q=O(q);let x=this.dbMap.get(q);if(w)!x&&w>0&&this.dbMap.set(q,x=Object.create(null));else return this.dbMap.delete(q),x;return x}).bind(Object.assign(Object.create(null),{dbMap:new Map}));z.addCollation=function(q,w){const x=z(q,1);x.collation||(x.collation=new Set),x.collation.add(R(w).toLowerCase())},z._addUDF=function(q,w,x,N){w=R(w).toLowerCase();let P=N.get(w);P||N.set(w,P=new Set),P.add(x<0?-1:x)},z.addFunction=function(q,w,x){const N=z(q,1);N.udf||(N.udf=new Map),this._addUDF(q,w,x,N.udf)},s.exports.sqlite3_create_window_function&&(z.addWindowFunc=function(q,w,x){const N=z(q,1);N.wudf||(N.wudf=new Map),this._addUDF(q,w,x,N.wudf)}),z.cleanup=function(q){q=O(q);const w=[q];for(const P of["sqlite3_busy_handler","sqlite3_commit_hook","sqlite3_preupdate_hook","sqlite3_progress_handler","sqlite3_rollback_hook","sqlite3_set_authorizer","sqlite3_trace_v2","sqlite3_update_hook"]){const S=s.exports[P];if(S){w.length=S.length;try{r[P](...w)}catch(L){t.config.warn("close-time call of",P+"(",w,") threw:",L)}}}const x=z(q,0);if(!x)return;if(x.collation){for(const P of x.collation)try{r.sqlite3_create_collation_v2(q,P,r.SQLITE_UTF8,0,0,0)}catch{}delete x.collation}let N;for(N=0;N<2;++N){const P=N?x.wudf:x.udf;if(!P)continue;const S=N?r.sqlite3_create_window_function:r.sqlite3_create_function_v2;for(const L of P){const $=L[0],c=L[1],d=[q,$,0,r.SQLITE_UTF8,0,0,0,0,0];N&&d.push(0);for(const y of c)try{d[2]=y,S.apply(null,d)}catch{}c.clear()}P.clear()}delete x.udf,delete x.wudf};{const q=s.xWrap("sqlite3_close_v2","int","sqlite3*");r.sqlite3_close_v2=function(w){if(arguments.length!==1)return p(w,"sqlite3_close_v2",1);if(w)try{z.cleanup(w)}catch{}return q(w)}}if(r.sqlite3session_create){const q=s.xWrap("sqlite3session_delete",void 0,["sqlite3_session*"]);r.sqlite3session_delete=function(w){if(arguments.length!==1)return p(pDb,"sqlite3session_delete",1);w&&r.sqlite3session_table_filter(w,0,0),q(w)}}{const q=(x,N)=>"argv["+N+"]:"+x[0]+":"+s.cstrToJs(x[1]).toLowerCase(),w=s.xWrap("sqlite3_create_collation_v2","int",["sqlite3*","string","int","*",new s.xWrap.FuncPtrAdapter({name:"xCompare",signature:"i(pipip)",contextKey:q}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",signature:"v(p)",contextKey:q})]);r.sqlite3_create_collation_v2=function(x,N,P,S,L,$){if(arguments.length!==6)return p(x,"sqlite3_create_collation_v2",6);if((P&15)===0)P|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(P&15))return g(x);try{const c=w(x,N,P,S,L,$);return c===0&&L instanceof Function&&z.addCollation(x,N),c}catch(c){return o.sqlite3__wasm_db_error(x,c)}},r.sqlite3_create_collation=(x,N,P,S,L)=>arguments.length===5?r.sqlite3_create_collation_v2(x,N,P,S,L,0):p(x,"sqlite3_create_collation",5)}{const q=function(P,S){return P[0]+":"+(P[2]<0?-1:P[2])+":"+S+":"+s.cstrToJs(P[1]).toLowerCase()},w=Object.assign(Object.create(null),{xInverseAndStep:{signature:"v(pip)",contextKey:q,callProxy:P=>(S,L,$)=>{try{P(S,...r.sqlite3_values_to_js(L,$))}catch(c){r.sqlite3_result_error_js(S,c)}}},xFinalAndValue:{signature:"v(p)",contextKey:q,callProxy:P=>S=>{try{r.sqlite3_result_js(S,P(S))}catch(L){r.sqlite3_result_error_js(S,L)}}},xFunc:{signature:"v(pip)",contextKey:q,callProxy:P=>(S,L,$)=>{try{r.sqlite3_result_js(S,P(S,...r.sqlite3_values_to_js(L,$)))}catch(c){r.sqlite3_result_error_js(S,c)}}},xDestroy:{signature:"v(p)",contextKey:q,callProxy:P=>S=>{try{P(S)}catch(L){console.error("UDF xDestroy method threw:",L)}}}}),x=s.xWrap("sqlite3_create_function_v2","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xFunc",...w.xFunc}),new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]),N=s.exports.sqlite3_create_window_function?s.xWrap("sqlite3_create_window_function","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xValue",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xInverse",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]):void 0;r.sqlite3_create_function_v2=function P(S,L,$,c,d,y,B,f,m){if(P.length!==arguments.length)return p(S,"sqlite3_create_function_v2",P.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const l=x(S,L,$,c,d,y,B,f,m);return l===0&&(y instanceof Function||B instanceof Function||f instanceof Function||m instanceof Function)&&z.addFunction(S,L,$),l}catch(l){return console.error("sqlite3_create_function_v2() setup threw:",l),o.sqlite3__wasm_db_error(S,l,"Creation of UDF threw: "+l)}},r.sqlite3_create_function=function P(S,L,$,c,d,y,B,f){return P.length===arguments.length?r.sqlite3_create_function_v2(S,L,$,c,d,y,B,f,0):p(S,"sqlite3_create_function",P.length)},N?r.sqlite3_create_window_function=function P(S,L,$,c,d,y,B,f,m,l){if(P.length!==arguments.length)return p(S,"sqlite3_create_window_function",P.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const _=N(S,L,$,c,d,y,B,f,m,l);return _===0&&(y instanceof Function||B instanceof Function||f instanceof Function||m instanceof Function||l instanceof Function)&&z.addWindowFunc(S,L,$),_}catch(_){return console.error("sqlite3_create_window_function() setup threw:",_),o.sqlite3__wasm_db_error(S,_,"Creation of UDF threw: "+_)}}:delete r.sqlite3_create_window_function,r.sqlite3_create_function_v2.udfSetResult=r.sqlite3_create_function.udfSetResult=r.sqlite3_result_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetResult=r.sqlite3_result_js),r.sqlite3_create_function_v2.udfConvertArgs=r.sqlite3_create_function.udfConvertArgs=r.sqlite3_values_to_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfConvertArgs=r.sqlite3_values_to_js),r.sqlite3_create_function_v2.udfSetError=r.sqlite3_create_function.udfSetError=r.sqlite3_result_error_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetError=r.sqlite3_result_error_js)}{const q=(x,N)=>(typeof x=="string"?N=-1:o.isSQLableTypedArray(x)?(N=x.byteLength,x=o.typedArrayToString(x instanceof ArrayBuffer?new Uint8Array(x):x)):Array.isArray(x)&&(x=x.join(""),N=-1),[x,N]),w={basic:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","string","int","int","**","**"]),full:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","*","int","int","**","**"])};r.sqlite3_prepare_v3=function x(N,P,S,L,$,c){if(x.length!==arguments.length)return p(N,"sqlite3_prepare_v3",x.length);const[d,y]=q(P,S);switch(typeof d){case"string":return w.basic(N,d,y,L,$,null);case"number":return w.full(N,d,y,L,$,c);default:return o.sqlite3__wasm_db_error(N,r.SQLITE_MISUSE,"Invalid SQL argument type for sqlite3_prepare_v2/v3().")}},r.sqlite3_prepare_v2=function x(N,P,S,L,$){return x.length===arguments.length?r.sqlite3_prepare_v3(N,P,S,0,L,$):p(N,"sqlite3_prepare_v2",x.length)}}{const q=s.xWrap("sqlite3_bind_text","int",["sqlite3_stmt*","int","string","int","*"]),w=s.xWrap("sqlite3_bind_blob","int",["sqlite3_stmt*","int","*","int","*"]);r.sqlite3_bind_text=function x(N,P,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_text",x.length);if(s.isPtr(S)||S===null)return q(N,P,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(pMem)&&(S=pMem.join(""));let c,d;try{if(o.isSQLableTypedArray(S))c=s.allocFromTypedArray(S),d=S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_text().");return q(N,P,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}},r.sqlite3_bind_blob=function x(N,P,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_blob",x.length);if(s.isPtr(S)||S===null)return w(N,P,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(S)&&(S=S.join(""));let c,d;try{if(o.isBindableTypedArray(S))c=s.allocFromTypedArray(S),d=L>=0?L:S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_blob().");return w(N,P,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}}}r.sqlite3_config=function(q,...w){if(arguments.length<2)return r.SQLITE_MISUSE;switch(q){case r.SQLITE_CONFIG_COVERING_INDEX_SCAN:case r.SQLITE_CONFIG_MEMSTATUS:case r.SQLITE_CONFIG_SMALL_MALLOC:case r.SQLITE_CONFIG_SORTERREF_SIZE:case r.SQLITE_CONFIG_STMTJRNL_SPILL:case r.SQLITE_CONFIG_URI:return s.exports.sqlite3__wasm_config_i(q,w[0]);case r.SQLITE_CONFIG_LOOKASIDE:return s.exports.sqlite3__wasm_config_ii(q,w[0],w[1]);case r.SQLITE_CONFIG_MEMDB_MAXSIZE:return s.exports.sqlite3__wasm_config_j(q,w[0]);case r.SQLITE_CONFIG_GETMALLOC:case r.SQLITE_CONFIG_GETMUTEX:case r.SQLITE_CONFIG_GETPCACHE2:case r.SQLITE_CONFIG_GETPCACHE:case r.SQLITE_CONFIG_HEAP:case r.SQLITE_CONFIG_LOG:case r.SQLITE_CONFIG_MALLOC:case r.SQLITE_CONFIG_MMAP_SIZE:case r.SQLITE_CONFIG_MULTITHREAD:case r.SQLITE_CONFIG_MUTEX:case r.SQLITE_CONFIG_PAGECACHE:case r.SQLITE_CONFIG_PCACHE2:case r.SQLITE_CONFIG_PCACHE:case r.SQLITE_CONFIG_PCACHE_HDRSZ:case r.SQLITE_CONFIG_PMASZ:case r.SQLITE_CONFIG_SERIALIZED:case r.SQLITE_CONFIG_SINGLETHREAD:case r.SQLITE_CONFIG_SQLLOG:case r.SQLITE_CONFIG_WIN32_HEAPSIZE:default:return r.SQLITE_NOTFOUND}};{const q=new Set;r.sqlite3_auto_extension=function(w){if(w instanceof Function)w=s.installFunction("i(ppp)",w);else if(arguments.length!==1||!s.isPtr(w))return r.SQLITE_MISUSE;const x=s.exports.sqlite3_auto_extension(w);return w!==arguments[0]&&(x===0?q.add(w):s.uninstallFunction(w)),x},r.sqlite3_cancel_auto_extension=function(w){return!w||arguments.length!==1||!s.isPtr(w)?0:s.exports.sqlite3_cancel_auto_extension(w)},r.sqlite3_reset_auto_extension=function(){s.exports.sqlite3_reset_auto_extension();for(const w of q)s.uninstallFunction(w);q.clear()}}const W=r.sqlite3_vfs_find("kvvfs");if(W)if(o.isUIThread()){const q=new r.sqlite3_kvvfs_methods(s.exports.sqlite3__wasm_kvvfs_methods());delete r.sqlite3_kvvfs_methods;const w=s.exports.sqlite3__wasm_kvvfsMakeKeyOnPstack,x=s.pstack,N=S=>s.peek(S)===115?sessionStorage:localStorage,P={xRead:(S,L,$,c)=>{const d=x.pointer,y=s.scopedAllocPush();try{const B=w(S,L);if(!B)return-3;const f=s.cstrToJs(B),m=N(S).getItem(f);if(!m)return-1;const l=m.length;if(c<=0)return l;if(c===1)return s.poke($,0),l;const _=s.scopedAllocCString(m);return c>l+1&&(c=l+1),s.heap8u().copyWithin($,_,_+c-1),s.poke($+c-1,0),c-1}catch(B){return console.error("kvstorageRead()",B),-2}finally{x.restore(d),s.scopedAllocPop(y)}},xWrite:(S,L,$)=>{const c=x.pointer;try{const d=w(S,L);if(!d)return 1;const y=s.cstrToJs(d);return N(S).setItem(y,s.cstrToJs($)),0}catch(d){return console.error("kvstorageWrite()",d),r.SQLITE_IOERR}finally{x.restore(c)}},xDelete:(S,L)=>{const $=x.pointer;try{const c=w(S,L);return c?(N(S).removeItem(s.cstrToJs(c)),0):1}catch(c){return console.error("kvstorageDelete()",c),r.SQLITE_IOERR}finally{x.restore($)}}};for(const S of Object.keys(P))q[q.memberKey(S)]=s.installFunction(q.memberSignature(S),P[S])}else r.sqlite3_vfs_unregister(W);s.xWrap.FuncPtrAdapter.warnOnUse=!0;const T=t.StructBinder,A=function q(w,x,N,P=q.installMethodArgcCheck){if(w instanceof T.StructType?!(N instanceof Function)&&!s.isPtr(N)&&n("Usage error: expecting a Function or WASM pointer to one."):n("Usage error: target object is-not-a StructType."),arguments.length===1)return(c,d)=>q(w,c,d,P);q.argcProxy||(q.argcProxy=function(c,d,y,B){return function(...f){return y.length!==arguments.length&&n("Argument mismatch for",c.structInfo.name+"::"+d+": Native signature is:",B),y.apply(this,f)}},q.removeFuncList=function(){this.ondispose.__removeFuncList&&(this.ondispose.__removeFuncList.forEach((c,d)=>{if(typeof c=="number")try{s.uninstallFunction(c)}catch{}}),delete this.ondispose.__removeFuncList)});const S=w.memberSignature(x);S.length<2&&n("Member",x,"does not have a function pointer signature:",S);const L=w.memberKey(x),$=P&&!s.isPtr(N)?q.argcProxy(w,L,N,S):N;if(s.isPtr($))$&&!s.functionEntry($)&&n("Pointer",$,"is not a WASM function table entry."),w[L]=$;else{const c=s.installFunction($,w.memberSignature(x,!0));w[L]=c,(!w.ondispose||!w.ondispose.__removeFuncList)&&(w.addOnDispose("ondispose.__removeFuncList handler",q.removeFuncList),w.ondispose.__removeFuncList=[]),w.ondispose.__removeFuncList.push(L,c)}return(c,d)=>q(w,c,d,P)};A.installMethodArgcCheck=!1;const D=function(q,w,x=A.installMethodArgcCheck){const N=new Map;for(const P of Object.keys(w)){const S=w[P],L=N.get(S);if(L){const $=q.memberKey(P);q[$]=q[q.memberKey(L)]}else A(q,P,S,x),N.set(S,P)}return q};T.StructType.prototype.installMethod=function(w,x,N=A.installMethodArgcCheck){return arguments.length<3&&w&&typeof w=="object"?D(this,...arguments):A(this,...arguments)},T.StructType.prototype.installMethods=function(q,w=A.installMethodArgcCheck){return D(this,q,w)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){t.version={libVersion:"3.50.4",libVersionNumber:3050004,sourceId:"2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3",downloadVersion:3500400}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...f)=>{throw new t.SQLite3Error(...f)},r=t.capi,s=t.wasm,o=t.util,p=new WeakMap,g=new WeakMap,O=(f,m,l)=>{const _=Object.getOwnPropertyDescriptor(f,m);return _?_.value:l},R=function(f,m){return m&&(f instanceof A&&(f=f.pointer),n(m,"sqlite3 result code",m+":",f?r.sqlite3_errmsg(f):r.sqlite3_errstr(m))),arguments[0]},z=s.installFunction("i(ippp)",(function(f,m,l,_){r.SQLITE_TRACE_STMT===f&&console.log("SQL TRACE #"+ ++this.counter+" via sqlite3@"+m+":",s.cstrToJs(_))}).bind({counter:0})),W=Object.create(null),T=function f(...m){if(!f._name2vfs){f._name2vfs=Object.create(null);const j=typeof importScripts=="function"?b=>n("The VFS for",b,"is only available in the main window thread."):!1;f._name2vfs[":localStorage:"]={vfs:"kvvfs",filename:j||(()=>"local")},f._name2vfs[":sessionStorage:"]={vfs:"kvvfs",filename:j||(()=>"session")}}const l=f.normalizeArgs(...m);let _=l.filename,u=l.vfs,I=l.flags;(typeof _!="string"&&typeof _!="number"||typeof I!="string"||u&&typeof u!="string"&&typeof u!="number")&&(t.config.error("Invalid DB ctor args",l,arguments),n("Invalid arguments for DB constructor."));let U=typeof _=="number"?s.cstrToJs(_):_;const ee=f._name2vfs[U];ee&&(u=ee.vfs,_=U=ee.filename(U));let ne,re=0;I.indexOf("c")>=0&&(re|=r.SQLITE_OPEN_CREATE|r.SQLITE_OPEN_READWRITE),I.indexOf("w")>=0&&(re|=r.SQLITE_OPEN_READWRITE),re===0&&(re|=r.SQLITE_OPEN_READONLY),re|=r.SQLITE_OPEN_EXRESCODE;const se=s.pstack.pointer;try{const j=s.pstack.allocPtr();let b=r.sqlite3_open_v2(_,j,re,u||0);ne=s.peekPtr(j),R(ne,b),r.sqlite3_extended_result_codes(ne,1),I.indexOf("t")>=0&&r.sqlite3_trace_v2(ne,r.SQLITE_TRACE_STMT,z,ne)}catch(j){throw ne&&r.sqlite3_close_v2(ne),j}finally{s.pstack.restore(se)}this.filename=U,p.set(this,ne),g.set(this,Object.create(null));try{const j=r.sqlite3_js_db_vfs(ne)||n("Internal error: cannot get VFS for new db handle."),b=W[j];b&&(b instanceof Function?b(this,t):R(ne,r.sqlite3_exec(ne,b,0,0,0)))}catch(j){throw this.close(),j}};T.setVfsPostOpenCallback=function(f,m){m instanceof Function||n("dbCtorHelper.setVfsPostOpenCallback() should not be used with a non-function argument.",arguments),W[f]=m},T.normalizeArgs=function(f=":memory:",m="c",l=null){const _={};return arguments.length===1&&arguments[0]&&typeof arguments[0]=="object"?(Object.assign(_,arguments[0]),_.flags===void 0&&(_.flags="c"),_.vfs===void 0&&(_.vfs=null),_.filename===void 0&&(_.filename=":memory:")):(_.filename=f,_.flags=m,_.vfs=l),_};const A=function(...f){T.apply(this,f)};A.dbCtorHelper=T;const D={null:1,number:2,string:3,boolean:4,blob:5};D.undefined==D.null,s.bigIntEnabled&&(D.bigint=D.number);const q=function(){D!==arguments[2]&&n(r.SQLITE_MISUSE,"Do not call the Stmt constructor directly. Use DB.prepare()."),this.db=arguments[0],p.set(this,arguments[1]),this.parameterCount=r.sqlite3_bind_parameter_count(this.pointer)},w=function(f){return f.pointer||n("DB has been closed."),f},x=function(f,m){return(m!==(m|0)||m<0||m>=f.columnCount)&&n("Column index",m,"is out of range."),f},N=function(f,m){const l=Object.create(null);switch(l.opt=Object.create(null),m.length){case 1:typeof m[0]=="string"||o.isSQLableTypedArray(m[0])||Array.isArray(m[0])?l.sql=m[0]:m[0]&&typeof m[0]=="object"&&(l.opt=m[0],l.sql=l.opt.sql);break;case 2:l.sql=m[0],l.opt=m[1];break;default:n("Invalid argument count for exec().")}l.sql=o.flexibleString(l.sql),typeof l.sql!="string"&&n("Missing SQL argument or unsupported SQL value type.");const _=l.opt;switch(_.returnValue){case"resultRows":_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows;break;case"saveSql":_.saveSql||(_.saveSql=[]),l.returnVal=()=>_.saveSql;break;case void 0:case"this":l.returnVal=()=>f;break;default:n("Invalid returnValue value:",_.returnValue)}if(!_.callback&&!_.returnValue&&_.rowMode!==void 0&&(_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows),_.callback||_.resultRows)switch(_.rowMode===void 0?"array":_.rowMode){case"object":l.cbArg=(u,I)=>{I.columnNames||(I.columnNames=u.getColumnNames([]));const U=u.get([]),ee=Object.create(null);for(const ne in I.columnNames)ee[I.columnNames[ne]]=U[ne];return ee};break;case"array":l.cbArg=u=>u.get([]);break;case"stmt":Array.isArray(_.resultRows)&&n("exec(): invalid rowMode for a resultRows array: must","be one of 'array', 'object',","a result column number, or column name reference."),l.cbArg=u=>u;break;default:if(o.isInt32(_.rowMode)){l.cbArg=u=>u.get(_.rowMode);break}else if(typeof _.rowMode=="string"&&_.rowMode.length>1&&_.rowMode[0]==="$"){const u=_.rowMode.substr(1);l.cbArg=I=>{const U=I.get(Object.create(null))[u];return U===void 0?n(r.SQLITE_NOTFOUND,"exec(): unknown result column:",u):U};break}n("Invalid rowMode:",_.rowMode)}return l},P=(f,m,l,..._)=>{const u=f.prepare(m);try{const I=u.bind(l).step()?u.get(..._):void 0;return u.reset(),I}finally{u.finalize()}},S=(f,m,l,_)=>f.exec({sql:m,bind:l,rowMode:_,returnValue:"resultRows"});A.checkRc=(f,m)=>R(f,m),A.prototype={isOpen:function(){return!!this.pointer},affirmOpen:function(){return w(this)},close:function(){if(this.pointer){if(this.onclose&&this.onclose.before instanceof Function)try{this.onclose.before(this)}catch{}const f=this.pointer;if(Object.keys(g.get(this)).forEach((m,l)=>{if(l&&l.pointer)try{l.finalize()}catch{}}),p.delete(this),g.delete(this),r.sqlite3_close_v2(f),this.onclose&&this.onclose.after instanceof Function)try{this.onclose.after(this)}catch{}delete this.filename}},changes:function(f=!1,m=!1){const l=w(this).pointer;return f?m?r.sqlite3_total_changes64(l):r.sqlite3_total_changes(l):m?r.sqlite3_changes64(l):r.sqlite3_changes(l)},dbFilename:function(f="main"){return r.sqlite3_db_filename(w(this).pointer,f)},dbName:function(f=0){return r.sqlite3_db_name(w(this).pointer,f)},dbVfsName:function(f=0){let m;const l=r.sqlite3_js_db_vfs(w(this).pointer,f);if(l){const _=new r.sqlite3_vfs(l);try{m=s.cstrToJs(_.$zName)}finally{_.dispose()}}return m},prepare:function(f){w(this);const m=s.pstack.pointer;let l,_;try{l=s.pstack.alloc(8),A.checkRc(this,r.sqlite3_prepare_v2(this.pointer,f,-1,l,null)),_=s.peekPtr(l)}finally{s.pstack.restore(m)}_||n("Cannot prepare empty SQL.");const u=new q(this,_,D);return g.get(this)[_]=u,u},exec:function(){w(this);const f=N(this,arguments);if(!f.sql)return n("exec() requires an SQL string.");const m=f.opt,l=m.callback,_=Array.isArray(m.resultRows)?m.resultRows:void 0;let u,I=m.bind,U=!!(f.cbArg||m.columnNames||_);const ee=s.scopedAllocPush(),ne=Array.isArray(m.saveSql)?m.saveSql:void 0;try{const re=o.isSQLableTypedArray(f.sql);let se=re?f.sql.byteLength:s.jstrlen(f.sql);const j=s.scopedAlloc(2*s.ptrSizeof+(se+1)),b=j+s.ptrSizeof;let k=b+s.ptrSizeof;const Q=k+se;for(re?s.heap8().set(f.sql,k):s.jstrcpy(f.sql,s.heap8(),k,se,!1),s.poke(k+se,0);k&&s.peek(k,"i8");){s.pokePtr([j,b],0),A.checkRc(this,r.sqlite3_prepare_v3(this.pointer,k,se,0,j,b));const H=s.peekPtr(j);if(k=s.peekPtr(b),se=Q-k,!!H){if(ne&&ne.push(r.sqlite3_sql(H).trim()),u=new q(this,H,D),I&&u.parameterCount&&(u.bind(I),I=null),U&&u.columnCount){let Z=Array.isArray(m.columnNames)?0:1;if(U=!1,f.cbArg||_){const E=Object.create(null);for(;u.step();u._lockedByExec=!1){Z++===0&&u.getColumnNames(E.columnNames=m.columnNames||[]),u._lockedByExec=!0;const C=f.cbArg(u,E);if(_&&_.push(C),l&&l.call(m,C,u)===!1)break}u._lockedByExec=!1}Z===0&&u.getColumnNames(m.columnNames)}else u.step();u.reset().finalize(),u=null}}}finally{s.scopedAllocPop(ee),u&&(delete u._lockedByExec,u.finalize())}return f.returnVal()},createFunction:function(m,l,_){const u=E=>E instanceof Function;switch(arguments.length){case 1:_=m,m=_.name,l=_.xFunc||0;break;case 2:u(l)||(_=l,l=_.xFunc||0);break}_||(_={}),typeof m!="string"&&n("Invalid arguments: missing function name.");let I=_.xStep||0,U=_.xFinal||0;const ee=_.xValue||0,ne=_.xInverse||0;let re;u(l)?(re=!1,(u(I)||u(U))&&n("Ambiguous arguments: scalar or aggregate?"),I=U=null):u(I)?(u(U)||n("Missing xFinal() callback for aggregate or window UDF."),l=null):u(U)?n("Missing xStep() callback for aggregate or window UDF."):n("Missing function-type properties."),re===!1?(u(ee)||u(ne))&&n("xValue and xInverse are not permitted for non-window UDFs."):u(ee)?(u(ne)||n("xInverse must be provided if xValue is."),re=!0):u(ne)&&n("xValue must be provided if xInverse is.");const se=_.pApp;se!=null&&(typeof se!="number"||!o.isInt32(se))&&n("Invalid value for pApp property. Must be a legal WASM pointer value.");const j=_.xDestroy||0;j&&!u(j)&&n("xDestroy property must be a function.");let b=0;O(_,"deterministic")&&(b|=r.SQLITE_DETERMINISTIC),O(_,"directOnly")&&(b|=r.SQLITE_DIRECTONLY),O(_,"innocuous")&&(b|=r.SQLITE_INNOCUOUS),m=m.toLowerCase();const k=l||I,Q=O(_,"arity"),H=typeof Q=="number"?Q:k.length?k.length-1:0;let Z;return re?Z=r.sqlite3_create_window_function(this.pointer,m,H,r.SQLITE_UTF8|b,se||0,I,U,ee,ne,j):Z=r.sqlite3_create_function_v2(this.pointer,m,H,r.SQLITE_UTF8|b,se||0,l,I,U,j),A.checkRc(this,Z),this},selectValue:function(f,m,l){return P(this,f,m,0,l)},selectValues:function(f,m,l){const _=this.prepare(f),u=[];try{for(_.bind(m);_.step();)u.push(_.get(0,l));_.reset()}finally{_.finalize()}return u},selectArray:function(f,m){return P(this,f,m,[])},selectObject:function(f,m){return P(this,f,m,{})},selectArrays:function(f,m){return S(this,f,m,"array")},selectObjects:function(f,m){return S(this,f,m,"object")},openStatementCount:function(){return this.pointer?Object.keys(g.get(this)).length:0},transaction:function(f){let m="BEGIN";arguments.length>1&&(/[^a-zA-Z]/.test(arguments[0])&&n(r.SQLITE_MISUSE,"Invalid argument for BEGIN qualifier."),m+=" "+arguments[0],f=arguments[1]),w(this).exec(m);try{const l=f(this);return this.exec("COMMIT"),l}catch(l){throw this.exec("ROLLBACK"),l}},savepoint:function(f){w(this).exec("SAVEPOINT oo1");try{const m=f(this);return this.exec("RELEASE oo1"),m}catch(m){throw this.exec("ROLLBACK to SAVEPOINT oo1; RELEASE SAVEPOINT oo1"),m}},checkRc:function(f){return R(this,f)}};const L=function(f){return f.pointer||n("Stmt has been closed."),f},$=function(f){let m=D[f==null?"null":typeof f];switch(m){case D.boolean:case D.null:case D.number:case D.string:return m;case D.bigint:if(s.bigIntEnabled)return m;default:return o.isBindableTypedArray(f)?D.blob:void 0}},c=function(f){return $(f)||n("Unsupported bind() argument type:",typeof f)},d=function(f,m){const l=typeof m=="number"?m:r.sqlite3_bind_parameter_index(f.pointer,m);return l===0||!o.isInt32(l)?n("Invalid bind() parameter name: "+m):(l<1||l>f.parameterCount)&&n("Bind index",m,"is out of range."),l},y=function(f,m){return f._lockedByExec&&n("Operation is illegal when statement is locked:",m),f},B=function f(m,l,_,u){y(L(m),"bind()"),f._||(f._tooBigInt=U=>n("BigInt value is too big to store without precision loss:",U),f._={string:function(U,ee,ne,re){const[se,j]=s.allocCString(ne,!0);return(re?r.sqlite3_bind_blob:r.sqlite3_bind_text)(U.pointer,ee,se,j,r.SQLITE_WASM_DEALLOC)}}),c(u),l=d(m,l);let I=0;switch(u==null?D.null:_){case D.null:I=r.sqlite3_bind_null(m.pointer,l);break;case D.string:I=f._.string(m,l,u,!1);break;case D.number:{let U;o.isInt32(u)?U=r.sqlite3_bind_int:typeof u=="bigint"?o.bigIntFits64(u)?s.bigIntEnabled?U=r.sqlite3_bind_int64:o.bigIntFitsDouble(u)?(u=Number(u),U=r.sqlite3_bind_double):f._tooBigInt(u):f._tooBigInt(u):(u=Number(u),s.bigIntEnabled&&Number.isInteger(u)?U=r.sqlite3_bind_int64:U=r.sqlite3_bind_double),I=U(m.pointer,l,u);break}case D.boolean:I=r.sqlite3_bind_int(m.pointer,l,u?1:0);break;case D.blob:{if(typeof u=="string"){I=f._.string(m,l,u,!0);break}else u instanceof ArrayBuffer?u=new Uint8Array(u):o.isBindableTypedArray(u)||n("Binding a value as a blob requires","that it be a string, Uint8Array, Int8Array, or ArrayBuffer.");const U=s.alloc(u.byteLength||1);s.heap8().set(u.byteLength?u:[0],U),I=r.sqlite3_bind_blob(m.pointer,l,U,u.byteLength,r.SQLITE_WASM_DEALLOC);break}default:t.config.warn("Unsupported bind() argument type:",u),n("Unsupported bind() argument type: "+typeof u)}return I&&A.checkRc(m.db.pointer,I),m._mayGet=!1,m};q.prototype={finalize:function(){if(this.pointer){y(this,"finalize()");const f=r.sqlite3_finalize(this.pointer);return delete g.get(this.db)[this.pointer],p.delete(this),delete this._mayGet,delete this.parameterCount,delete this._lockedByExec,delete this.db,f}},clearBindings:function(){return y(L(this),"clearBindings()"),r.sqlite3_clear_bindings(this.pointer),this._mayGet=!1,this},reset:function(f){y(this,"reset()"),f&&this.clearBindings();const m=r.sqlite3_reset(L(this).pointer);return this._mayGet=!1,R(this.db,m),this},bind:function(){L(this);let f,m;switch(arguments.length){case 1:f=1,m=arguments[0];break;case 2:f=arguments[0],m=arguments[1];break;default:n("Invalid bind() arguments.")}return m===void 0?this:(this.parameterCount||n("This statement has no bindable parameters."),this._mayGet=!1,m===null?B(this,f,D.null,m):Array.isArray(m)?(arguments.length!==1&&n("When binding an array, an index argument is not permitted."),m.forEach((l,_)=>B(this,_+1,c(l),l)),this):(m instanceof ArrayBuffer&&(m=new Uint8Array(m)),typeof m=="object"&&!o.isBindableTypedArray(m)?(arguments.length!==1&&n("When binding an object, an index argument is not permitted."),Object.keys(m).forEach(l=>B(this,l,c(m[l]),m[l])),this):B(this,f,c(m),m)))},bindAsBlob:function(f,m){L(this),arguments.length===1&&(m=f,f=1);const l=c(m);return D.string!==l&&D.blob!==l&&D.null!==l&&n("Invalid value type for bindAsBlob()"),B(this,f,D.blob,m)},step:function(){y(this,"step()");const f=r.sqlite3_step(L(this).pointer);switch(f){case r.SQLITE_DONE:return this._mayGet=!1;case r.SQLITE_ROW:return this._mayGet=!0;default:this._mayGet=!1,t.config.warn("sqlite3_step() rc=",f,r.sqlite3_js_rc_str(f),"SQL =",r.sqlite3_sql(this.pointer)),A.checkRc(this.db.pointer,f)}},stepReset:function(){return this.step(),this.reset()},stepFinalize:function(){try{const f=this.step();return this.reset(),f}finally{try{this.finalize()}catch{}}},get:function(f,m){if(L(this)._mayGet||n("Stmt.step() has not (recently) returned true."),Array.isArray(f)){let l=0;const _=this.columnCount;for(;l<_;)f[l]=this.get(l++);return f}else if(f&&typeof f=="object"){let l=0;const _=this.columnCount;for(;l<_;)f[r.sqlite3_column_name(this.pointer,l)]=this.get(l++);return f}switch(x(this,f),m===void 0?r.sqlite3_column_type(this.pointer,f):m){case r.SQLITE_NULL:return null;case r.SQLITE_INTEGER:if(s.bigIntEnabled){const l=r.sqlite3_column_int64(this.pointer,f);return l>=Number.MIN_SAFE_INTEGER&&l<=Number.MAX_SAFE_INTEGER?Number(l).valueOf():l}else{const l=r.sqlite3_column_double(this.pointer,f);return(l>Number.MAX_SAFE_INTEGER||ln("The pointer property is read-only.")};Object.defineProperty(q.prototype,"pointer",f),Object.defineProperty(A.prototype,"pointer",f)}if(Object.defineProperty(q.prototype,"columnCount",{enumerable:!1,get:function(){return r.sqlite3_column_count(this.pointer)},set:()=>n("The columnCount property is read-only.")}),t.oo1={DB:A,Stmt:q},o.isUIThread()){t.oo1.JsStorageDb=function(m="session"){const l=T.normalizeArgs(...arguments);m=l.filename,m!=="session"&&m!=="local"&&n("JsStorageDb db name must be one of 'session' or 'local'."),l.vfs="kvvfs",T.call(this,l)};const f=t.oo1.JsStorageDb;f.prototype=Object.create(A.prototype),f.clearStorage=r.sqlite3_js_kvvfs_clear,f.prototype.clearStorage=function(){return f.clearStorage(w(this).filename)},f.storageSize=r.sqlite3_js_kvvfs_size,f.prototype.storageSize=function(){return f.storageSize(w(this).filename)}}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util;t.initWorker1API=(function(){const r=(...T)=>{throw new Error(T.join(" "))};globalThis.WorkerGlobalScope instanceof Function||r("initWorker1API() must be run from a Worker thread.");const s=this.sqlite3||r("Missing this.sqlite3 object."),o=s.oo1.DB,p=function(T){let A=g.idMap.get(T);return A||(A="db#"+ ++g.idSeq+"@"+T.pointer,g.idMap.set(T,A),A)},g={dbList:[],idSeq:0,idMap:new WeakMap,xfer:[],open:function(T){const A=new o(T);return this.dbs[p(A)]=A,this.dbList.indexOf(A)<0&&this.dbList.push(A),A},close:function(T,A){if(T){delete this.dbs[p(T)];const D=T.filename,q=n.sqlite3__wasm_db_vfs(T.pointer,0);T.close();const w=this.dbList.indexOf(T);w>=0&&this.dbList.splice(w,1),A&&D&&q&&n.sqlite3__wasm_vfs_unlink(q,D)}},post:function(T,A){A&&A.length?(globalThis.postMessage(T,Array.from(A)),A.length=0):globalThis.postMessage(T)},dbs:Object.create(null),getDb:function(T,A=!0){return this.dbs[T]||(A?r("Unknown (or closed) DB ID:",T):void 0)}},O=function(T=g.dbList[0]){return T&&T.pointer?T:r("DB is not opened.")},R=function(T,A=!0){const D=g.getDb(T.dbId,!1)||g.dbList[0];return A?O(D):D},z=function(){return g.dbList[0]&&p(g.dbList[0])},W={open:function(T){const A=Object.create(null),D=T.args||Object.create(null);D.simulateError&&r("Throwing because of simulateError flag.");const q=Object.create(null);A.vfs=D.vfs,A.filename=D.filename||"";const w=g.open(A);return q.filename=w.filename,q.persistent=!!s.capi.sqlite3_js_db_uses_vfs(w.pointer,"opfs"),q.dbId=p(w),q.vfs=w.dbVfsName(),q},close:function(T){const A=R(T,!1),D={filename:A&&A.filename};if(A){const q=T.args&&typeof T.args=="object"?!!T.args.unlink:!1;g.close(A,q)}return D},exec:function(T){const A=typeof T.args=="string"?{sql:T.args}:T.args||Object.create(null);A.rowMode==="stmt"?r("Invalid rowMode for 'exec': stmt mode","does not work in the Worker API."):A.sql||r("'exec' requires input SQL.");const D=R(T);(A.callback||Array.isArray(A.resultRows))&&(D._blobXfer=g.xfer);const q=A.callback;let w=0;const x=!!A.columnNames;typeof q=="string"&&(x||(A.columnNames=[]),A.callback=function(N,P){g.post({type:q,columnNames:A.columnNames,rowNumber:++w,row:N},g.xfer)});try{const N=A.countChanges?D.changes(!0,A.countChanges===64):void 0;D.exec(A),N!==void 0&&(A.changeCount=D.changes(!0,A.countChanges===64)-N);const P=A.lastInsertRowId?s.capi.sqlite3_last_insert_rowid(D):void 0;P!==void 0&&(A.lastInsertRowId=P),A.callback instanceof Function&&(A.callback=q,g.post({type:q,columnNames:A.columnNames,rowNumber:null,row:void 0}))}finally{delete D._blobXfer,A.callback&&(A.callback=q)}return A},"config-get":function(){const T=Object.create(null),A=s.config;return["bigIntEnabled"].forEach(function(D){Object.getOwnPropertyDescriptor(A,D)&&(T[D]=A[D])}),T.version=s.version,T.vfsList=s.capi.sqlite3_js_vfs_list(),T},export:function(T){const A=R(T),D={byteArray:s.capi.sqlite3_js_db_export(A.pointer),filename:A.filename,mimetype:"application/x-sqlite3"};return g.xfer.push(D.byteArray.buffer),D},toss:function(T){r("Testing worker exception")}};globalThis.onmessage=async function(T){T=T.data;let A,D=T.dbId,q=T.type;const w=performance.now();try{W.hasOwnProperty(q)&&W[q]instanceof Function?A=await W[q](T):r("Unknown db worker message type:",T.type)}catch(x){q="error",A={operation:T.type,message:x.message,errorClass:x.name,input:T},x.stack&&(A.stack=typeof x.stack=="string"?x.stack.split(/\n\s*/):x.stack)}D||(D=A.dbId||z()),g.post({type:q,dbId:D,messageId:T.messageId,workerReceivedTime:w,workerRespondTime:performance.now(),departureTime:T.departureTime,result:A},g.xfer)},globalThis.postMessage({type:"sqlite3-api",result:"worker1-ready"})}).bind({sqlite3:t})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vfs=o,r.sqlite3_vfs.prototype.registerVfs=function(p=!1){this instanceof t.capi.sqlite3_vfs||s("Expecting a sqlite3_vfs-type argument.");const g=r.sqlite3_vfs_register(this,p?1:0);return g&&s("sqlite3_vfs_register(",this,") failed with rc",g),this.pointer!==r.sqlite3_vfs_find(this.$zName)&&s("BUG: sqlite3_vfs_find(vfs.$zName) failed for just-installed VFS",this),this},o.installVfs=function(p){let g=0;const O=["io","vfs"];for(const R of O){const z=p[R];z&&(++g,z.struct.installMethods(z.methods,!!z.applyArgcCheck),R==="vfs"&&(!z.struct.$zName&&typeof z.name=="string"&&z.struct.addOnDispose(z.struct.$zName=n.allocCString(z.name)),z.struct.registerVfs(!!z.asDefault)))}return g||s("Misuse: installVfs() options object requires at least","one of:",O),this}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){if(!t.wasm.exports.sqlite3_declare_vtab)return;const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vtab=o;const p=r.sqlite3_index_info;p.prototype.nthConstraint=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const W=this.$aConstraint+p.sqlite3_index_constraint.structInfo.sizeof*R;return z?W:new p.sqlite3_index_constraint(W)},p.prototype.nthConstraintUsage=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const W=this.$aConstraintUsage+p.sqlite3_index_constraint_usage.structInfo.sizeof*R;return z?W:new p.sqlite3_index_constraint_usage(W)},p.prototype.nthOrderBy=function(R,z=!1){if(R<0||R>=this.$nOrderBy)return!1;const W=this.$aOrderBy+p.sqlite3_index_orderby.structInfo.sizeof*R;return z?W:new p.sqlite3_index_orderby(W)};const g=function(R,z){return(function(W,T=!1){if(arguments.length===0&&(W=new z),W instanceof z)return this.set(W.pointer,W),W;n.isPtr(W)||t.SQLite3Error.toss("Invalid argument to",R+"()");let A=this.get(W);return T&&this.delete(W),A}).bind(new Map)},O=function(R,z){const W=g(R,z);return Object.assign(Object.create(null),{StructType:z,create:T=>{const A=W();return n.pokePtr(T,A.pointer),A},get:T=>W(T),unget:T=>W(T,!0),dispose:T=>{const A=W(T,!0);A&&A.dispose()}})};o.xVtab=O("xVtab",r.sqlite3_vtab),o.xCursor=O("xCursor",r.sqlite3_vtab_cursor),o.xIndexInfo=R=>new r.sqlite3_index_info(R),o.xError=function R(z,W,T){if(R.errorReporter instanceof Function)try{R.errorReporter("sqlite3_module::"+z+"(): "+W.message)}catch{}let A;return W instanceof t.WasmAllocError?A=r.SQLITE_NOMEM:arguments.length>2?A=T:W instanceof t.SQLite3Error&&(A=W.resultCode),A||r.SQLITE_ERROR},o.xError.errorReporter=console.error.bind(console),o.xRowid=(R,z)=>n.poke(R,z,"i64"),o.setupModule=function(R){let z=!1;const W=this instanceof r.sqlite3_module?this:R.struct||(z=new r.sqlite3_module);try{const T=R.methods||s("Missing 'methods' object.");for(const A of Object.entries({xConnect:"xCreate",xDisconnect:"xDestroy"})){const D=A[0],q=A[1];T[D]===!0?T[D]=T[q]:T[q]===!0&&(T[q]=T[D])}if(R.catchExceptions){const A=function(w,x){return["xConnect","xCreate"].indexOf(w)>=0?function(N,P,S,L,$,c){try{return x(...arguments)||0}catch(d){return d instanceof t.WasmAllocError||(n.dealloc(n.peekPtr(c)),n.pokePtr(c,n.allocCString(d.message))),o.xError(w,d)}}:function(...N){try{return x(...N)||0}catch(P){return o.xError(w,P)}}},D=["xCreate","xConnect","xBestIndex","xDisconnect","xDestroy","xOpen","xClose","xFilter","xNext","xEof","xColumn","xRowid","xUpdate","xBegin","xSync","xCommit","xRollback","xFindFunction","xRename","xSavepoint","xRelease","xRollbackTo","xShadowName"],q=Object.create(null);for(const w of D){const x=T[w];if(x instanceof Function)w==="xConnect"&&T.xCreate===x?q[w]=T.xCreate:w==="xCreate"&&T.xConnect===x?q[w]=T.xConnect:q[w]=A(w,x);else continue}W.installMethods(q,!1)}else W.installMethods(T,!!R.applyArgcCheck);if(W.$iVersion===0){let A;typeof R.iVersion=="number"?A=R.iVersion:W.$xShadowName?A=3:W.$xSavePoint||W.$xRelease||W.$xRollbackTo?A=2:A=1,W.$iVersion=A}}catch(T){throw z&&z.dispose(),T}return W},r.sqlite3_module.prototype.setupModule=function(R){return o.setupModule.call(this,R)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=function r(s){if(!globalThis.SharedArrayBuffer||!globalThis.Atomics)return Promise.reject(new Error("Cannot install OPFS: Missing SharedArrayBuffer and/or Atomics. The server must emit the COOP/COEP response headers to enable those. See https://sqlite.org/wasm/doc/trunk/persistence.md#coop-coep"));if(typeof WorkerGlobalScope>"u")return Promise.reject(new Error("The OPFS sqlite3_vfs cannot run in the main thread because it requires Atomics.wait()."));if(!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory)return Promise.reject(new Error("Missing required OPFS APIs."));(!s||typeof s!="object")&&(s=Object.create(null));const o=new URL(globalThis.location.href).searchParams;return o.has("opfs-disable")?Promise.resolve(t):(s.verbose===void 0&&(s.verbose=o.has("opfs-verbose")?+o.get("opfs-verbose")||2:1),s.sanityChecks===void 0&&(s.sanityChecks=o.has("opfs-sanity-check")),s.proxyUri===void 0&&(s.proxyUri=r.defaultProxyUri),typeof s.proxyUri=="function"&&(s.proxyUri=s.proxyUri()),new Promise(function(g,O){const R=[t.config.error,t.config.warn,t.config.log],z=(E,...C)=>{s.verbose>E&&R[E]("OPFS syncer:",...C)},W=(...E)=>z(2,...E),T=(...E)=>z(1,...E),A=(...E)=>z(0,...E),D=t.util.toss,q=t.capi,w=t.util,x=t.wasm,N=q.sqlite3_vfs,P=q.sqlite3_file,S=q.sqlite3_io_methods,L=Object.create(null),$=()=>globalThis.FileSystemHandle&&globalThis.FileSystemDirectoryHandle&&globalThis.FileSystemFileHandle&&globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle&&navigator?.storage?.getDirectory;L.metrics={dump:function(){let E,C=0,M=0,J=0;for(E in u.opIds){const G=I[E];C+=G.count,M+=G.time,J+=G.wait,G.avgTime=G.count&&G.time?G.time/G.count:0,G.avgWait=G.count&&G.wait?G.wait/G.count:0}t.config.log(globalThis.location.href,"metrics for",globalThis.location.href,":",I,` +Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),m.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),O(E)),f=()=>(y=!1,g(t)),m=new Worker(new URL(""+new URL("sqlite3-opfs-async-proxy-C_otN2ZJ.js",self.location.href).href,self.location.href));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),m._originalOnError=m.onerror,m.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),m.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),oe=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const pe=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,ae,de,ue;for(ae=0;ae{se.start=performance.now(),se.op=E,++I[E].count},b=()=>I[se.op].time+=performance.now()-se.start,k={xCheckReservedLock:function(E,C){return x.poke(C,0,"i32"),0},xClose:function(E){j("xClose");let C=0;const M=re[E];return M&&(delete re[E],C=U("xClose",E),M.sq3File&&M.sq3File.dispose()),b(),C},xDeviceCharacteristics:function(E){return q.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(E,C,M){return q.SQLITE_NOTFOUND},xFileSize:function(E,C){j("xFileSize");let M=U("xFileSize",E);if(M==0)try{const J=u.s11n.deserialize()[0];x.poke(C,J,"i64")}catch(J){A("Unexpected error reading xFileSize() result:",J),M=u.sq3Codes.SQLITE_IOERR}return b(),M},xLock:function(E,C){j("xLock");const M=re[E];let J=0;return M.lockType?M.lockType=C:(J=U("xLock",E,C),J===0&&(M.lockType=C)),b(),J},xRead:function(E,C,M,J){j("xRead");const G=re[E];let te;try{te=U("xRead",E,M,Number(J)),(te===0||q.SQLITE_IOERR_SHORT_READ===te)&&x.heap8u().set(G.sabView.subarray(0,M),C)}catch(oe){A("xRead(",arguments,") failed:",oe,G),te=q.SQLITE_IOERR_READ}return b(),te},xSync:function(E,C){j("xSync"),++I.xSync.count;const M=U("xSync",E,C);return b(),M},xTruncate:function(E,C){j("xTruncate");const M=U("xTruncate",E,Number(C));return b(),M},xUnlock:function(E,C){j("xUnlock");const M=re[E];let J=0;return q.SQLITE_LOCK_NONE===C&&M.lockType&&(J=U("xUnlock",E,C)),J===0&&(M.lockType=C),b(),J},xWrite:function(E,C,M,J){j("xWrite");const G=re[E];let te;try{G.sabView.set(x.heap8u().subarray(C,C+M)),te=U("xWrite",E,M,Number(J))}catch(oe){A("xWrite(",arguments,") failed:",oe,G),te=q.SQLITE_IOERR_WRITE}return b(),te}},Q={xAccess:function(E,C,M,J){j("xAccess");const G=U("xAccess",x.cstrToJs(C));return x.poke(J,G?0:1,"i32"),b(),0},xCurrentTime:function(E,C){return x.poke(C,24405875e-1+new Date().getTime()/864e5,"double"),0},xCurrentTimeInt64:function(E,C){return x.poke(C,24405875e-1*864e5+new Date().getTime(),"i64"),0},xDelete:function(E,C,M){j("xDelete");const J=U("xDelete",x.cstrToJs(C),M,!1);return b(),J},xFullPathname:function(E,C,M,J){return x.cstrncpy(J,C,M)!!J):M},L.getDirForFilename=async function(C,M=!1){const J=L.getResolvedPath(C,!0),G=J.pop();let te=L.rootDirectory;for(const oe of J)oe&&(te=await te.getDirectoryHandle(oe,{create:!!M}));return[te,G]},L.mkdir=async function(E){try{return await L.getDirForFilename(E+"/filepart",!0),!0}catch{return!1}},L.entryExists=async function(E){try{const[C,M]=await L.getDirForFilename(E);return await C.getFileHandle(M),!0}catch{return!1}},L.randomFilename=ne,L.treeList=async function(){const E=async function M(J,G){G.name=J.name,G.dirs=[],G.files=[];for await(const te of J.values())if(te.kind==="directory"){const oe=Object.create(null);G.dirs.push(oe),await M(te,oe)}else G.files.push(te.name)},C=Object.create(null);return await E(L.rootDirectory,C),C},L.rmfr=async function(){const E=L.rootDirectory,C={recurse:!0};for await(const M of E.values())E.removeEntry(M.name,C)},L.unlink=async function(E,C=!1,M=!1){try{const[J,G]=await L.getDirForFilename(E,!1);return await J.removeEntry(G,{recursive:C}),!0}catch(J){if(M)throw new Error("unlink(",arguments[0],") failed: "+J.message,{cause:J});return!1}},L.traverse=async function(E){const C={recursive:!0,directory:L.rootDirectory};typeof E=="function"&&(E={callback:E}),E=Object.assign(C,E||{}),async function J(G,te){for await(const oe of G.values()){if(E.callback(oe,G,te)===!1)return!1;if(E.recursive&&oe.kind==="directory"&&await J(oe,te+1)===!1)break}}(E.directory,0)};const H=async function(E,C){const[M,J]=await L.getDirForFilename(E,!0);let te=await(await M.getFileHandle(J,{create:!0})).createSyncAccessHandle(),oe=0,Y,pe=!1;try{for(te.truncate(0);(Y=await C())!==void 0;)Y instanceof ArrayBuffer&&(Y=new Uint8Array(Y)),oe===0&&Y.byteLength>=15&&(w.affirmDbHeader(Y),pe=!0),te.write(Y,{at:oe}),oe+=Y.byteLength;if((oe<512||oe%512!==0)&&D("Input size",oe,"is not correct for an SQLite database."),!pe){const F=new Uint8Array(20);te.read(F,{at:0}),w.affirmDbHeader(F)}return te.write(new Uint8Array([1,1]),{at:18}),oe}catch(F){throw await te.close(),te=void 0,await M.removeEntry(J).catch(()=>{}),F}finally{te&&await te.close()}};if(L.importDb=async function(E,C){if(C instanceof Function)return H(E,C);C instanceof ArrayBuffer&&(C=new Uint8Array(C)),w.affirmIsDb(C);const M=C.byteLength,[J,G]=await L.getDirForFilename(E,!0);let te,oe=0;try{return te=await(await J.getFileHandle(G,{create:!0})).createSyncAccessHandle(),te.truncate(0),oe=te.write(C,{at:0}),oe!=M&&D("Expected to write "+M+" bytes but wrote "+oe+"."),te.write(new Uint8Array([1,1]),{at:18}),oe}catch(Y){throw te&&(await te.close(),te=void 0),await J.removeEntry(G).catch(()=>{}),Y}finally{te&&await te.close()}},t.oo1){const E=function(...C){const M=t.oo1.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=d.$zName,t.oo1.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(t.oo1.DB.prototype),t.oo1.OpfsDb=E,E.importDb=L.importDb,t.oo1.DB.dbCtorHelper.setVfsPostOpenCallback(d.pointer,function(C,M){M.capi.sqlite3_busy_timeout(C,1e4)})}const Z=function(){const E=x.scopedAllocPush(),C=new P;try{const M=C.pointer,J=q.SQLITE_OPEN_CREATE|q.SQLITE_OPEN_READWRITE|q.SQLITE_OPEN_MAIN_DB,G=x.scopedAlloc(8),te="/sanity/check/file"+ne(8),oe=x.scopedAllocCString(te);let Y;if(u.s11n.serialize("This is ä string."),Y=u.s11n.deserialize(),W("deserialize() says:",Y),Y[0]!=="This is ä string."&&D("String d13n error."),Q.xAccess(d.pointer,oe,0,G),Y=x.peek(G,"i32"),W("xAccess(",te,") exists ?=",Y),Y=Q.xOpen(d.pointer,oe,M,J,G),W("open rc =",Y,"state.sabOPView[xOpen] =",u.sabOPView[u.opIds.xOpen]),Y!==0){A("open failed with code",Y);return}Q.xAccess(d.pointer,oe,0,G),Y=x.peek(G,"i32"),Y||D("xAccess() failed to detect file."),Y=k.xSync(C.pointer,0),Y&&D("sync failed w/ rc",Y),Y=k.xTruncate(C.pointer,1024),Y&&D("truncate failed w/ rc",Y),x.poke(G,0,"i64"),Y=k.xFileSize(C.pointer,G),Y&&D("xFileSize failed w/ rc",Y),W("xFileSize says:",x.peek(G,"i64")),Y=k.xWrite(C.pointer,oe,10,1),Y&&D("xWrite() failed!");const pe=x.scopedAlloc(16);Y=k.xRead(C.pointer,pe,6,2),x.poke(pe+6,0);let F=x.cstrToJs(pe);W("xRead() got:",F),F!=="sanity"&&D("Unexpected xRead() value."),Q.xSleep&&(W("xSleep()ing before close()ing..."),Q.xSleep(d.pointer,2e3),W("waking up from xSleep()")),Y=k.xClose(M),W("xClose rc =",Y,"sabOPView =",u.sabOPView),W("Deleting file:",te),Q.xDelete(d.pointer,oe,4660),Q.xAccess(d.pointer,oe,0,G),Y=x.peek(G,"i32"),Y&&D("Expecting 0 from xAccess(",te,") after xDelete()."),T("End of OPFS sanity checks.")}finally{C.dispose(),x.scopedAllocPop(E)}};m.onmessage=function({data:E}){switch(E.type){case"opfs-unavailable":B(new Error(E.payload.join(" ")));break;case"opfs-async-loaded":m.postMessage({type:"opfs-async-init",args:u});break;case"opfs-async-inited":{if(y===!0)break;try{t.vfs.installVfs({io:{struct:c,methods:k},vfs:{struct:d,methods:Q}}),u.sabOPView=new Int32Array(u.sabOP),u.sabFileBufView=new Uint8Array(u.sabIO,0,u.fileBufferSize),u.sabS11nView=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),ee(),s.sanityChecks&&(T("Running sanity checks because of opfs-sanity-check URL arg..."),Z()),$()?navigator.storage.getDirectory().then(C=>{m.onerror=m._originalOnError,delete m._originalOnError,t.opfs=L,L.rootDirectory=C,W("End of OPFS sqlite3_vfs setup.",d),f()}).catch(B):f()}catch(C){A(C),B(C)}break}default:{const C="Unexpected message from the OPFS async worker: "+JSON.stringify(E);A(C),B(new Error(C));break}}}}))};n.defaultProxyUri="sqlite3-opfs-async-proxy.js",globalThis.sqlite3ApiBootstrap.initializersAsync.push(async r=>{try{let s=n.defaultProxyUri;return r.scriptInfo.sqlite3Dir&&(n.defaultProxyUri=r.scriptInfo.sqlite3Dir+s),n().catch(o=>{r.config.warn("Ignoring inability to install OPFS sqlite3_vfs:",o.message)})}catch(s){return r.config.error("installOpfsVfs() exception:",s),Promise.reject(s)}})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util.toss,r=t.util.toss3,s=Object.create(null),o=t.capi,p=t.util,g=t.wasm,O=4096,R=512,z=4,W=8,T=R+z,A=R,D=T,q=O,w=o.SQLITE_OPEN_MAIN_DB|o.SQLITE_OPEN_MAIN_JOURNAL|o.SQLITE_OPEN_SUPER_JOURNAL|o.SQLITE_OPEN_WAL,x=o.SQLITE_OPEN_MEMORY,N=".opaque",P=()=>Math.random().toString(36).slice(2),S=new TextDecoder,L=new TextEncoder,$=Object.assign(Object.create(null),{name:"opfs-sahpool",directory:void 0,initialCapacity:6,clearOnInit:!1,verbosity:2,forceReinitIfPreviouslyFailed:!1}),c=[t.config.error,t.config.warn,t.config.log];t.config.log;const d=t.config.warn;t.config.error;const y=new Map,B=j=>y.get(j),f=(j,b)=>{b?y.set(j,b):y.delete(j)},m=new Map,l=j=>m.get(j),_=(j,b)=>{b?m.set(j,b):m.delete(j)},u={xCheckReservedLock:function(j,b){const k=l(j);return k.log("xCheckReservedLock"),k.storeErr(),g.poke32(b,1),0},xClose:function(j){const b=l(j);b.storeErr();const k=b.getOFileForS3File(j);if(k)try{b.log(`xClose ${k.path}`),b.mapS3FileToOFile(j,!1),k.sah.flush(),k.flags&o.SQLITE_OPEN_DELETEONCLOSE&&b.deletePath(k.path)}catch(Q){return b.storeErr(Q,o.SQLITE_IOERR)}return 0},xDeviceCharacteristics:function(j){return o.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(j,b,k){return o.SQLITE_NOTFOUND},xFileSize:function(j,b){const k=l(j);k.log("xFileSize");const H=k.getOFileForS3File(j).sah.getSize()-q;return g.poke64(b,BigInt(H)),0},xLock:function(j,b){const k=l(j);k.log(`xLock ${b}`),k.storeErr();const Q=k.getOFileForS3File(j);return Q.lockType=b,0},xRead:function(j,b,k,Q){const H=l(j);H.storeErr();const Z=H.getOFileForS3File(j);H.log(`xRead ${Z.path} ${k} @ ${Q}`);try{const E=Z.sah.read(g.heap8u().subarray(b,b+k),{at:q+Number(Q)});return Eb&&g.poke8(k+b-1,0)}catch{return o.SQLITE_NOMEM}finally{g.scopedAllocPop(Z)}}return H?H.sqlite3Rc||o.SQLITE_IOERR:0},xOpen:function(b,k,Q,H,Z){const E=B(b);try{H&=~x,E.log(`xOpen ${g.cstrToJs(k)} ${H}`);const C=k&&g.peek8(k)?E.getPath(k):P();let M=E.getSAHForPath(C);!M&&H&o.SQLITE_OPEN_CREATE&&(E.getFileCount()f(b.pointer,0)),Q&&(b.$xRandomness=Q.$xRandomness,b.$xSleep=Q.$xSleep,Q.dispose()),!b.$xRandomness&&!U.xRandomness&&(U.xRandomness=function(H,Z,E){const C=g.heap8u();let M=0;for(;M0),t.vfs.installVfs({vfs:{struct:b,methods:U}}),b};class ne{vfsDir;#e;#o;#a;#r=new Map;#t=new Map;#s=new Set;#l=new Map;#n=new Uint8Array(T);#c;#i;#u;constructor(b=Object.create(null)){this.#u=b.verbosity??$.verbosity,this.vfsName=b.name||$.name,this.#i=ee(this.vfsName),f(this.#i.pointer,this),this.vfsDir=b.directory||"."+this.vfsName,this.#c=new DataView(this.#n.buffer,this.#n.byteOffset),this.isReady=this.reset(!!(b.clearOnInit??$.clearOnInit)).then(()=>{if(this.$error)throw this.$error;return this.getCapacity()?Promise.resolve(void 0):this.addCapacity(b.initialCapacity||$.initialCapacity)})}#_(b,...k){this.#u>b&&c[b](this.vfsName+":",...k)}log(...b){this.#_(2,...b)}warn(...b){this.#_(1,...b)}error(...b){this.#_(0,...b)}getVfs(){return this.#i}getCapacity(){return this.#r.size}getFileCount(){return this.#t.size}getFileNames(){const b=[];for(const k of this.#t.keys())b.push(k);return b}async addCapacity(b){for(let k=0;k{try{const Z=await H.createSyncAccessHandle();if(this.#r.set(Z,Q),b)Z.truncate(q),this.setAssociatedPath(Z,"",0);else{const E=this.getAssociatedPath(Z);E?this.#t.set(E,Z):this.#s.add(Z)}}catch(Z){throw this.storeErr(Z),this.releaseAccessHandles(),Z}}))}getAssociatedPath(b){b.read(this.#n,{at:0});const k=this.#c.getUint32(A);if(this.#n[0]&&(k&o.SQLITE_OPEN_DELETEONCLOSE||(k&w)===0))return d(`Removing file with unexpected flags ${k.toString(16)}`,this.#n),this.setAssociatedPath(b,"",0),"";const Q=new Uint32Array(W/4);b.read(Q,{at:D});const H=this.computeDigest(this.#n,k);if(Q.every((Z,E)=>Z===H[E])){const Z=this.#n.findIndex(E=>E===0);return Z===0&&b.truncate(q),Z?S.decode(this.#n.subarray(0,Z)):""}else return d("Disassociating file with bad digest."),this.setAssociatedPath(b,"",0),""}setAssociatedPath(b,k,Q){const H=L.encodeInto(k,this.#n);R<=H.written+1&&n("Path too long:",k),k&&Q&&(Q|=x),this.#n.fill(0,H.written,R),this.#c.setUint32(A,Q);const Z=this.computeDigest(this.#n,Q);b.write(this.#n,{at:0}),b.write(Z,{at:D}),b.flush(),k?(this.#t.set(k,b),this.#s.delete(b)):(b.truncate(q),this.#s.add(b))}computeDigest(b,k){if(k&x){let Q=3735928559,H=1103547991;for(const Z of b)Q=Math.imul(Q^Z,2654435761),H=Math.imul(H^Z,104729);return new Uint32Array([Q>>>0,H>>>0])}else return new Uint32Array([0,0])}async reset(b){await this.isReady;let k=await navigator.storage.getDirectory(),Q;for(const H of this.vfsDir.split("/"))H&&(Q=k,k=await k.getDirectoryHandle(H,{create:!0}));return this.#e=k,this.#a=Q,this.#o=await this.#e.getDirectoryHandle(N,{create:!0}),this.releaseAccessHandles(),this.acquireAccessHandles(b)}getPath(b){return g.isPtr(b)&&(b=g.cstrToJs(b)),(b instanceof URL?b:new URL(b,"file://localhost/")).pathname}deletePath(b){const k=this.#t.get(b);return k&&(this.#t.delete(b),this.setAssociatedPath(k,"",0)),!!k}storeErr(b,k){return b&&(b.sqlite3Rc=k||o.SQLITE_IOERR,this.error(b)),this.$error=b,k}popErr(){const b=this.$error;return this.$error=void 0,b}nextAvailableSAH(){const[b]=this.#s.keys();return b}getOFileForS3File(b){return this.#l.get(b)}mapS3FileToOFile(b,k){k?(this.#l.set(b,k),_(b,this)):(this.#l.delete(b),_(b,!1))}hasFilename(b){return this.#t.has(b)}getSAHForPath(b){return this.#t.get(b)}async removeVfs(){if(!this.#i.pointer||!this.#o)return!1;o.sqlite3_vfs_unregister(this.#i.pointer),this.#i.dispose(),delete s[this.vfsName];try{this.releaseAccessHandles(),await this.#e.removeEntry(N,{recursive:!0}),this.#o=void 0,await this.#a.removeEntry(this.#e.name,{recursive:!0}),this.#e=this.#a=void 0}catch(b){t.config.error(this.vfsName,"removeVfs() failed with no recovery strategy:",b)}return!0}pauseVfs(){return this.#l.size>0&&t.SQLite3Error.toss(o.SQLITE_MISUSE,"Cannot pause VFS",this.vfsName,"because it has opened files."),this.#r.size>0&&(o.sqlite3_vfs_unregister(this.vfsName),this.releaseAccessHandles()),this}isPaused(){return this.#r.size===0}async unpauseVfs(){return this.#r.size===0?this.acquireAccessHandles(!1).then(()=>o.sqlite3_vfs_register(this.#i,0),this):this}exportFile(b){const k=this.#t.get(b)||n("File not found:",b),Q=k.getSize()-q,H=new Uint8Array(Q>0?Q:0);if(Q>0){const Z=k.read(H,{at:q});Z!=Q&&n("Expected to read "+Q+" bytes but read "+Z+".")}return H}async importDbChunked(b,k){const Q=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to.");Q.truncate(0);let H=0,Z,E=!1;try{for(;(Z=await k())!==void 0;)Z instanceof ArrayBuffer&&(Z=new Uint8Array(Z)),H===0&&Z.byteLength>=15&&(p.affirmDbHeader(Z),E=!0),Q.write(Z,{at:q+H}),H+=Z.byteLength;if((H<512||H%512!==0)&&n("Input size",H,"is not correct for an SQLite database."),!E){const C=new Uint8Array(20);Q.read(C,{at:0}),p.affirmDbHeader(C)}Q.write(new Uint8Array([1,1]),{at:q+18})}catch(C){throw this.setAssociatedPath(Q,"",0),C}return this.setAssociatedPath(Q,b,o.SQLITE_OPEN_MAIN_DB),H}importDb(b,k){if(k instanceof ArrayBuffer)k=new Uint8Array(k);else if(k instanceof Function)return this.importDbChunked(b,k);const Q=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to."),H=k.byteLength;(H<512||H%512!=0)&&n("Byte array size is invalid for an SQLite db.");const Z="SQLite format 3";for(let C=0;Cthis)}isPaused(){return this.#e.isPaused()}}const se=async()=>{const j=await navigator.storage.getDirectory(),b=".opfs-sahpool-sync-check-"+P(),H=(await(await j.getFileHandle(b,{create:!0})).createSyncAccessHandle()).close();return await H,await j.removeEntry(b),H?.then&&n("The local OPFS API is too old for opfs-sahpool:","it has an async FileSystemSyncAccessHandle.close() method."),!0};t.installOpfsSAHPoolVfs=async function(j=Object.create(null)){j=Object.assign(Object.create(null),$,j||{});const b=j.name;if(j.$testThrowPhase1)throw j.$testThrowPhase1;if(s[b])try{return await s[b]}catch(k){if(j.forceReinitIfPreviouslyFailed)delete s[b];else throw k}return!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory?s[b]=Promise.reject(new Error("Missing required OPFS APIs.")):s[b]=se().then(async function(){if(j.$testThrowPhase2)throw j.$testThrowPhase2;const k=new ne(j);return k.isReady.then(async()=>{const Q=new re(k);if(t.oo1){const H=t.oo1,Z=k.getVfs(),E=function(...C){const M=H.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=Z.$zName,H.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(H.DB.prototype),Q.OpfsSAHPoolDb=E}return k.log("VFS initialized."),Q}).catch(async Q=>{throw await k.removeVfs().catch(()=>{}),Q})}).catch(k=>s[b]=Promise.reject(k))}}),typeof i<"u"){const t=Object.assign(Object.create(null),{exports:typeof h>"u"?i.asm:h,memory:i.wasmMemory},globalThis.sqlite3ApiConfig||{});globalThis.sqlite3ApiConfig=t;let n;try{n=globalThis.sqlite3ApiBootstrap()}catch(r){throw console.error("sqlite3ApiBootstrap() error:",r),r}finally{delete globalThis.sqlite3ApiBootstrap,delete globalThis.sqlite3ApiConfig}i.sqlite3=n}else console.warn("This is not running in an Emscripten module context, so","globalThis.sqlite3ApiBootstrap() is _not_ being called due to lack","of config info for the WASM environment.","It must be called manually.")},be=Ke,be}})();$e=(function(){const Ie=$e;if(!Ie)throw new Error("Expecting globalThis.sqlite3InitModule to be defined by the Emscripten build.");const qe=globalThis.sqlite3InitModuleState=Object.assign(Object.create(null),{moduleScript:globalThis?.document?.currentScript,isWorker:typeof WorkerGlobalScope<"u",location:globalThis.location,urlParams:globalThis?.location?.href?new URL(globalThis.location.href).searchParams:new URLSearchParams});if(qe.debugModule=qe.urlParams.has("sqlite3.debugModule")?(...be)=>console.warn("sqlite3.debugModule:",...be):()=>{},qe.urlParams.has("sqlite3.dir"))qe.sqlite3Dir=qe.urlParams.get("sqlite3.dir")+"/";else if(qe.moduleScript){const be=qe.moduleScript.src.split("/");be.pop(),qe.sqlite3Dir=be.join("/")+"/"}if(globalThis.sqlite3InitModule=function be(...i){return Ie(...i).then(ve=>{ve.runSQLite3PostLoadInit(ve);const Ee=ve.sqlite3;Ee.scriptInfo=qe,be.__isUnderTest&&(Ee.__isUnderTest=!0);const Ke=Ee.asyncPostInit;return delete Ee.asyncPostInit,Ke()}).catch(ve=>{throw console.error("Exception loading sqlite3 module:",ve),ve})},globalThis.sqlite3InitModule.ready=Ie.ready,globalThis.sqlite3InitModuleState.moduleScript){const be=globalThis.sqlite3InitModuleState;let i=be.moduleScript.src.split("/");i.pop(),be.scriptDir=i.join("/")+"/"}return qe.debugModule("sqlite3InitModuleState =",qe),globalThis.sqlite3InitModule})();var Tt=$e;Tt().then(Ie=>Ie.initWorker1API())})(); diff --git a/docus/dist/_nuxt/sqlite3.DBpDb1lf.wasm b/docus/dist/_nuxt/sqlite3.DBpDb1lf.wasm new file mode 100644 index 0000000..f001d7a Binary files /dev/null and b/docus/dist/_nuxt/sqlite3.DBpDb1lf.wasm differ diff --git a/docus/dist/_nuxt/uN6OGCoe.js b/docus/dist/_nuxt/uN6OGCoe.js new file mode 100644 index 0000000..1a4ee87 --- /dev/null +++ b/docus/dist/_nuxt/uN6OGCoe.js @@ -0,0 +1 @@ +const o={or:"または",error:{title:"ページが見つかりません",description:"申し訳ございませんが、お探しのページは見つかりませんでした。"}},a={copy:{page:"ページをコピー",link:"Markdownページをコピー",view:"Markdownとして表示",gpt:"ChatGPTで開く",claude:"Claudeで開く"},links:"コミュニティ",toc:"このページの内容",menu:"メニュー",report:"問題を報告",edit:"このページを編集"},e={copyLogo:"ロゴをコピー",copyWordmark:"ワードマークをコピー",downloadLogo:"ロゴをダウンロード",downloadWordmark:"ワードマークをダウンロード",brandAssets:"ブランドアセット",logoCopied:"ロゴをコピーしました",wordmarkCopied:"ワードマークをコピーしました",logoDownloaded:"ロゴをダウンロードしました",wordmarkDownloaded:"ワードマークをダウンロードしました",copyLogoFailed:"ロゴのコピーに失敗しました",copyWordmarkFailed:"ワードマークのコピーに失敗しました"},n={title:"AIに聞く",placeholder:"質問してください...",tooltip:"AIに質問する",tryAsking:"質問してみてください",askAnything:"何でも聞いてください...",clearChat:"チャットをクリア",close:"閉じる",expand:"展開",collapse:"折りたたむ",thinking:"考えています...",askMeAnything:"何でも聞いてみよう",askMeAnythingDescription:"ドキュメンテーションの閲覧、概念の理解、および回答の検索に関するヘルプを入手してください。",faq:"よくある質問",chatCleared:"チャットは更新時にクリアされます",lineBreak:"改行",explainWithAi:"AIで説明する",toolListPages:"一覧表示されたドキュメントページ",toolReadPage:"読む",loading:{searching:"ドキュメントを検索中",reading:"ドキュメントを読む",analyzing:"コンテンツの分析",finding:"最適な回答を見つける",finished:"使用したソース"}},i={common:o,docs:a,logo:e,assistant:n};export{n as assistant,o as common,i as default,a as docs,e as logo}; diff --git a/docus/dist/_nuxt/vaS8Rkl_.js b/docus/dist/_nuxt/vaS8Rkl_.js new file mode 100644 index 0000000..c53c79e --- /dev/null +++ b/docus/dist/_nuxt/vaS8Rkl_.js @@ -0,0 +1 @@ +import{r as c}from"./Cf5i2Hk_.js";import{a0 as n,a1 as l,a as u,p as i,ac as m,s as d,bB as f,c as _,am as a,o as b}from"./B3fabVUf.js";import"./BN_7HF1G.js";const g={base:"rounded-full"},x={__name:"ProseBadge",props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(e){const s=e,o=n(),r=l("prose.badge",s),t=_(()=>a({extend:a(g),...o.ui?.prose?.badge||{}}));return(p,C)=>(b(),u(f,{color:"primary",variant:"subtle",class:m(t.value({class:[d(r)?.base,s.class]}))},{default:i(()=>[c(p.$slots,"default",{mdcUnwrap:"p"})]),_:3},8,["class"]))}};export{x as default}; diff --git a/docus/dist/_nuxt/zNu3OsYz.js b/docus/dist/_nuxt/zNu3OsYz.js new file mode 100644 index 0000000..86ec4aa --- /dev/null +++ b/docus/dist/_nuxt/zNu3OsYz.js @@ -0,0 +1 @@ +const a={or:"o",error:{title:"Pàgina no trobada",description:"Ho sentim, però la pàgina que cerques no existeix."}},e={copy:{page:"Copiar pàgina",link:"Copiar pàgina Markdown",view:"Veure com a Markdown",gpt:"Obrir a ChatGPT",claude:"Obrir a Claude"},links:"Comunitat",toc:"En aquesta pàgina",menu:"Menú",report:"Informar d'un problema",edit:"Editar aquesta pàgina"},o={copyLogo:"Copiar el logotip",copyWordmark:"Copiar el wordmark",downloadLogo:"Descarregar el logotip",downloadWordmark:"Descarregar el wordmark",brandAssets:"Recursos de marca",logoCopied:"Logotip copiat",wordmarkCopied:"Wordmark copiat",logoDownloaded:"Logotip descarregat",wordmarkDownloaded:"Wordmark descarregat",copyLogoFailed:"No s'ha pogut copiar el logotip",copyWordmarkFailed:"No s'ha pogut copiar el wordmark"},r={title:"Pregunta a la IA",placeholder:"Fes una pregunta...",tooltip:"Fes una pregunta a l'IA",tryAsking:"Prova de fer una pregunta",askAnything:"Pregunta qualsevol cosa...",clearChat:"Esborra el xat",close:"Tanca",expand:"Amplia",collapse:"Contraure",thinking:"Pensant...",askMeAnything:"Pregunta el que vulguis",askMeAnythingDescription:"Rep ajuda per navegar per la documentació, entendre els conceptes i trobar respostes.",faq:"Preguntes freqüents",chatCleared:"El xat s'esborra quan s'actualitza",lineBreak:"Salt de línia",explainWithAi:"Explica-ho amb IA",toolListPages:"Pàgines de documentació llistades",toolReadPage:"Llegir",loading:{searching:"Cerca a la documentació",reading:"Llegir els documents",analyzing:"Analitzar el contingut",finding:"Trobar la millor resposta",finished:"Fonts utilitzades"}},t={common:a,docs:e,logo:o,assistant:r};export{r as assistant,a as common,t as default,e as docs,o as logo}; diff --git a/docus/dist/_og-static-fonts/inter-400-latin.ttf b/docus/dist/_og-static-fonts/inter-400-latin.ttf new file mode 100644 index 0000000..6cc4fc5 Binary files /dev/null and b/docus/dist/_og-static-fonts/inter-400-latin.ttf differ diff --git a/docus/dist/_og-static-fonts/inter-700-latin.ttf b/docus/dist/_og-static-fonts/inter-700-latin.ttf new file mode 100644 index 0000000..7eebe9c Binary files /dev/null and b/docus/dist/_og-static-fonts/inter-700-latin.ttf differ diff --git a/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Development+Guide,description_This+guide+covers+the+usual+path+for+adding+or+changing+a+Forge+module.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvZGV2ZWxvcG1lbnQi.png b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Development+Guide,description_This+guide+covers+the+usual+path+for+adding+or+changing+a+Forge+module.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvZGV2ZWxvcG1lbnQi.png new file mode 100644 index 0000000..efa5874 Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Development+Guide,description_This+guide+covers+the+usual+path+for+adding+or+changing+a+Forge+module.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvZGV2ZWxvcG1lbnQi.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Framework+Architecture,description_Forge+is+organized+around+domain+modules.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvYXJjaGl0ZWN0dXJlIg.png b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Framework+Architecture,description_Forge+is+organized+around+domain+modules.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvYXJjaGl0ZWN0dXJlIg.png new file mode 100644 index 0000000..d1f6275 Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Framework+Architecture,description_Forge+is+organized+around+domain+modules.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvYXJjaGl0ZWN0dXJlIg.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Getting+Started,description_Use+this+section+as+the+main+entry+point+for+the+Forge+framework.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQi.png b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Getting+Started,description_Use+this+section+as+the+main+entry+point+for+the+Forge+framework.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQi.png new file mode 100644 index 0000000..50ccaf7 Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Getting+Started,description_Use+this+section+as+the+main+entry+point+for+the+Forge+framework.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQi.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Module+Reference,description_This+reference+lists+the+main+Forge+modules+and+where+each+layer+lives.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvbW9kdWxlLXJlZmVyZW5jZSI.png b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Module+Reference,description_This+reference+lists+the+main+Forge+modules+and+where+each+layer+lives.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvbW9kdWxlLXJlZmVyZW5jZSI.png new file mode 100644 index 0000000..c91ce3f Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_Module+Reference,description_This+reference+lists+the+main+Forge+modules+and+where+each+layer+lives.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvbW9kdWxlLXJlZmVyZW5jZSI.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_SurrealDB+Setup,description_Forge+uses+SurrealDB+for+durable+storage.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvc3VycmVhbGRiLXNldHVwIg.png b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_SurrealDB+Setup,description_Forge+uses+SurrealDB+for+durable+storage.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvc3VycmVhbGRiLXNldHVwIg.png new file mode 100644 index 0000000..83544a9 Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Getting+Started,title_SurrealDB+Setup,description_Forge+uses+SurrealDB+for+durable+storage.,p_Ii9nZXR0aW5nLXN0YXJ0ZWQvc3VycmVhbGRiLXNldHVwIg.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Garage+Usage+Guide,description_The+garage+module+stores+physical+player+vehicles.,p_Ii9zZXJ2ZXItbW9kdWxlcy9nYXJhZ2Ui.png b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Garage+Usage+Guide,description_The+garage+module+stores+physical+player+vehicles.,p_Ii9zZXJ2ZXItbW9kdWxlcy9nYXJhZ2Ui.png new file mode 100644 index 0000000..8067b3b Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Garage+Usage+Guide,description_The+garage+module+stores+physical+player+vehicles.,p_Ii9zZXJ2ZXItbW9kdWxlcy9nYXJhZ2Ui.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Locker+Usage+Guide,description_The+locker+module+stores+physical+player+inventory+items+by+classname.,p_Ii9zZXJ2ZXItbW9kdWxlcy9sb2NrZXIi.png b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Locker+Usage+Guide,description_The+locker+module+stores+physical+player+inventory+items+by+classname.,p_Ii9zZXJ2ZXItbW9kdWxlcy9sb2NrZXIi.png new file mode 100644 index 0000000..f19b26a Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Locker+Usage+Guide,description_The+locker+module+stores+physical+player+inventory+items+by+classname.,p_Ii9zZXJ2ZXItbW9kdWxlcy9sb2NrZXIi.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Server+Module+Guides,description_These+pages+document+the+authoritative+server-side+workflows+in+Forge.,p_Ii9zZXJ2ZXItbW9kdWxlcyI.png b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Server+Module+Guides,description_These+pages+document+the+authoritative+server-side+workflows+in+Forge.,p_Ii9zZXJ2ZXItbW9kdWxlcyI.png new file mode 100644 index 0000000..d0ca5af Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Server+Module+Guides,description_These+pages+document+the+authoritative+server-side+workflows+in+Forge.,p_Ii9zZXJ2ZXItbW9kdWxlcyI.png differ diff --git a/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Store+Usage+Guide,description_The+store+module+processes+checkout+requests.,p_Ii9zZXJ2ZXItbW9kdWxlcy9zdG9yZSI.png b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Store+Usage+Guide,description_The+store+module+processes+checkout+requests.,p_Ii9zZXJ2ZXItbW9kdWxlcy9zdG9yZSI.png new file mode 100644 index 0000000..341cb60 Binary files /dev/null and b/docus/dist/_og/s/c_Docs,headline_Server+Modules,title_Store+Usage+Guide,description_The+store+module+processes+checkout+requests.,p_Ii9zZXJ2ZXItbW9kdWxlcy9zdG9yZSI.png differ diff --git a/docus/dist/_og/s/c_Landing,title_Forge+Framework+Documentation,description_Documentation+for+the+Forge+Arma+3+framework+covering+architecture+persistence+extension+APIs+gameplay+modules+and+client.png b/docus/dist/_og/s/c_Landing,title_Forge+Framework+Documentation,description_Documentation+for+the+Forge+Arma+3+framework+covering+architecture+persistence+extension+APIs+gameplay+modules+and+client.png new file mode 100644 index 0000000..398cc2e Binary files /dev/null and b/docus/dist/_og/s/c_Landing,title_Forge+Framework+Documentation,description_Documentation+for+the+Forge+Arma+3+framework+covering+architecture+persistence+extension+APIs+gameplay+modules+and+client.png differ diff --git a/docus/dist/_og/s/o_2b32zu.png b/docus/dist/_og/s/o_2b32zu.png new file mode 100644 index 0000000..8deb4da Binary files /dev/null and b/docus/dist/_og/s/o_2b32zu.png differ diff --git a/docus/dist/_og/s/o_31ssr7.png b/docus/dist/_og/s/o_31ssr7.png new file mode 100644 index 0000000..4bea997 Binary files /dev/null and b/docus/dist/_og/s/o_31ssr7.png differ diff --git a/docus/dist/_og/s/o_3chrpw.png b/docus/dist/_og/s/o_3chrpw.png new file mode 100644 index 0000000..44f066b Binary files /dev/null and b/docus/dist/_og/s/o_3chrpw.png differ diff --git a/docus/dist/_og/s/o_5t9xk5.png b/docus/dist/_og/s/o_5t9xk5.png new file mode 100644 index 0000000..ef998ab Binary files /dev/null and b/docus/dist/_og/s/o_5t9xk5.png differ diff --git a/docus/dist/_og/s/o_77cueh.png b/docus/dist/_og/s/o_77cueh.png new file mode 100644 index 0000000..799bb4f Binary files /dev/null and b/docus/dist/_og/s/o_77cueh.png differ diff --git a/docus/dist/_og/s/o_8x0y18.png b/docus/dist/_og/s/o_8x0y18.png new file mode 100644 index 0000000..4a5380e Binary files /dev/null and b/docus/dist/_og/s/o_8x0y18.png differ diff --git a/docus/dist/_og/s/o_b0sm59.png b/docus/dist/_og/s/o_b0sm59.png new file mode 100644 index 0000000..0ce3626 Binary files /dev/null and b/docus/dist/_og/s/o_b0sm59.png differ diff --git a/docus/dist/_og/s/o_b2v64z.png b/docus/dist/_og/s/o_b2v64z.png new file mode 100644 index 0000000..b95ca78 Binary files /dev/null and b/docus/dist/_og/s/o_b2v64z.png differ diff --git a/docus/dist/_og/s/o_bcy052.png b/docus/dist/_og/s/o_bcy052.png new file mode 100644 index 0000000..6bbc1d8 Binary files /dev/null and b/docus/dist/_og/s/o_bcy052.png differ diff --git a/docus/dist/_og/s/o_bddkx.png b/docus/dist/_og/s/o_bddkx.png new file mode 100644 index 0000000..590c558 Binary files /dev/null and b/docus/dist/_og/s/o_bddkx.png differ diff --git a/docus/dist/_og/s/o_c87zr.png b/docus/dist/_og/s/o_c87zr.png new file mode 100644 index 0000000..6e5bb7b Binary files /dev/null and b/docus/dist/_og/s/o_c87zr.png differ diff --git a/docus/dist/_og/s/o_dkjpur.png b/docus/dist/_og/s/o_dkjpur.png new file mode 100644 index 0000000..92af079 Binary files /dev/null and b/docus/dist/_og/s/o_dkjpur.png differ diff --git a/docus/dist/_og/s/o_ixzngg.png b/docus/dist/_og/s/o_ixzngg.png new file mode 100644 index 0000000..29cb59a Binary files /dev/null and b/docus/dist/_og/s/o_ixzngg.png differ diff --git a/docus/dist/_og/s/o_jscb4s.png b/docus/dist/_og/s/o_jscb4s.png new file mode 100644 index 0000000..433205c Binary files /dev/null and b/docus/dist/_og/s/o_jscb4s.png differ diff --git a/docus/dist/_og/s/o_l2pl5s.png b/docus/dist/_og/s/o_l2pl5s.png new file mode 100644 index 0000000..ba94e83 Binary files /dev/null and b/docus/dist/_og/s/o_l2pl5s.png differ diff --git a/docus/dist/_og/s/o_mjfbqk.png b/docus/dist/_og/s/o_mjfbqk.png new file mode 100644 index 0000000..0948645 Binary files /dev/null and b/docus/dist/_og/s/o_mjfbqk.png differ diff --git a/docus/dist/_og/s/o_msqvkp.png b/docus/dist/_og/s/o_msqvkp.png new file mode 100644 index 0000000..d4a38a2 Binary files /dev/null and b/docus/dist/_og/s/o_msqvkp.png differ diff --git a/docus/dist/_og/s/o_qq03xq.png b/docus/dist/_og/s/o_qq03xq.png new file mode 100644 index 0000000..2a99c25 Binary files /dev/null and b/docus/dist/_og/s/o_qq03xq.png differ diff --git a/docus/dist/_og/s/o_rzljaw.png b/docus/dist/_og/s/o_rzljaw.png new file mode 100644 index 0000000..500da10 Binary files /dev/null and b/docus/dist/_og/s/o_rzljaw.png differ diff --git a/docus/dist/_og/s/o_uedqew.png b/docus/dist/_og/s/o_uedqew.png new file mode 100644 index 0000000..8e3fc39 Binary files /dev/null and b/docus/dist/_og/s/o_uedqew.png differ diff --git a/docus/dist/_og/s/o_vueek3.png b/docus/dist/_og/s/o_vueek3.png new file mode 100644 index 0000000..c29cd8f Binary files /dev/null and b/docus/dist/_og/s/o_vueek3.png differ diff --git a/docus/dist/_og/s/o_wgoy24.png b/docus/dist/_og/s/o_wgoy24.png new file mode 100644 index 0000000..5673be9 Binary files /dev/null and b/docus/dist/_og/s/o_wgoy24.png differ diff --git a/docus/dist/_og/s/o_yln960.png b/docus/dist/_og/s/o_yln960.png new file mode 100644 index 0000000..9642b7a Binary files /dev/null and b/docus/dist/_og/s/o_yln960.png differ diff --git a/docus/dist/_payload.json b/docus/dist/_payload.json new file mode 100644 index 0000000..988f672 --- /dev/null +++ b/docus/dist/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"navigation_docs":3,"landing":145},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":147,"body":148,"description":147,"extension":334,"meta":335,"navigation":336,"path":337,"seo":338,"stem":340,"__hash__":341},"landing\u002Findex.md","",{"type":149,"value":150,"toc":331},"minimark",[151,188,280],[152,153,154,158,172],"u-page-hero",{},[155,156,157],"template",{"v-slot:title":147},"Forge Framework Documentation",[155,159,160,169],{"v-slot:description":147},[161,162,163,164,168],"p",{},"Forge is a persistent Arma 3 framework that combines SQF addons, a Rust\n",[165,166,167],"code",{},"arma-rs"," extension, SurrealDB persistence, shared domain crates, and\nbrowser-backed player interfaces.",[161,170,171],{},"Use these docs to understand the runtime architecture, extension API surface,\nserver gameplay modules, and client addon integration patterns.",[155,173,174,181],{"v-slot:links":147},[175,176,180],"u-button",{"color":177,"size":178,"to":6,"trailing-icon":179},"primary","xl","i-lucide-arrow-right","Start here",[175,182,187],{"color":183,"size":178,"to":184,"icon":185,"variant":186},"neutral","https:\u002F\u002Fgithub.com\u002FInnovativeDevSolutions\u002Fforge","simple-icons-github","outline","View source",[189,190,191,194],"u-page-section",{},[155,192,193],{"v-slot:title":147},"What Forge Covers",[155,195,196,212,225,238,250,267],{"v-slot:features":147},[197,198,200,209],"u-page-feature",{"icon":199},"i-lucide-boxes",[155,201,202,203],{"v-slot:title":147},"Domain ",[204,205,208],"span",{"className":206},[207],"text-primary","Modules",[155,210,211],{"v-slot:description":147},"Actor, bank, CAD, garage, locker, organization, phone, store, task, and\nowned-storage workflows share a consistent service and extension model.",[197,213,215,222],{"icon":214},"i-lucide-server",[155,216,217,218],{"v-slot:title":147},"Rust ",[204,219,221],{"className":220},[207],"Extension",[155,223,224],{"v-slot:description":147},"The server extension keeps command parsing thin, routes domain requests into\nservices, and persists durable state through SurrealDB.",[197,226,228,235],{"icon":227},"i-lucide-database-zap",[155,229,230,231],{"v-slot:title":147},"Durable ",[204,232,234],{"className":233},[207],"Persistence",[155,236,237],{"v-slot:description":147},"Repository traits stay storage-agnostic while concrete adapters in the\nextension handle schema and database mapping.",[197,239,240,247],{"icon":144},[155,241,242,243],{"v-slot:title":147},"Browser ",[204,244,246],{"className":245},[207],"UIs",[155,248,249],{"v-slot:description":147},"Client addons host web-based interfaces inside Arma displays and synchronize\nstate through namespaced browser bridge events.",[197,251,253,260],{"icon":252},"i-lucide-arrow-left-right",[155,254,255,256],{"v-slot:title":147},"Transport ",[204,257,259],{"className":258},[207],"Layer",[155,261,262,263,266],{"v-slot:description":147},"Large payloads move through chunked request and response transport while\nsmaller commands still use direct ",[165,264,265],{},"callExtension"," paths.",[197,268,270,277],{"icon":269},"i-lucide-wrench",[155,271,272,273],{"v-slot:title":147},"Development ",[204,274,276],{"className":275},[207],"Workflow",[155,278,279],{"v-slot:description":147},"The docs cover module boundaries, local validation checks, and where new\ndomain logic belongs across Rust, SQF, and web UI layers.",[189,281,282,285],{},[155,283,284],{"v-slot:title":147},"Documentation Areas",[155,286,287,297,309,319],{"v-slot:features":147},[197,288,289,294],{"icon":26,"to":6},[155,290,291],{"v-slot:title":147},[204,292,5],{"className":293},[207],[155,295,296],{"v-slot:description":147},"Framework overview, architecture, module reference, and development rules.",[197,298,300,306],{"icon":299,"to":29},"i-lucide-server-cog",[155,301,302,303],{"v-slot:title":147},"Server ",[204,304,221],{"className":305},[207],[155,307,308],{"v-slot:description":147},"Extension architecture, command surface, and SQF usage examples.",[197,310,311,316],{"icon":92,"to":43},[155,312,302,313],{"v-slot:title":147},[204,314,208],{"className":315},[207],[155,317,318],{"v-slot:description":147},"Gameplay-domain usage guides for persistence, hot state, and command flows.",[197,320,321,328],{"icon":144,"to":95},[155,322,323,324],{"v-slot:title":147},"Client ",[204,325,327],{"className":326},[207],"Addons",[155,329,330],{"v-slot:description":147},"Browser bridge, client UX entry points, and addon-specific event contracts.",{"title":147,"searchDepth":332,"depth":332,"links":333},2,[],"md",{},true,"\u002F",{"title":157,"description":339},"Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs.","index","z56nrU81noeKPhRmw6SAhUXnhI6zxbOa-u-8PzIaH0c",1776806625126] \ No newline at end of file diff --git a/docus/dist/client-addons.html b/docus/dist/client-addons.html new file mode 100644 index 0000000..98a9705 --- /dev/null +++ b/docus/dist/client-addons.html @@ -0,0 +1,128 @@ +Client Usage Guide - forge-docus
Client Addons

Client Usage Guide

Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons.

Client Usage Guide

Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons.

Use this guide as the entry point for client-side integration. Domain data, +validation, persistence, rewards, ownership, and checkout behavior remain +server-side responsibilities.

Client Responsibilities

  • Open Arma displays and CT_WEBBROWSER controls.
  • Load browser UI assets from each addon's ui/_site folder.
  • Receive browser alerts through JSDialog handlers.
  • Translate browser events into local actions or CBA server events.
  • Cache display state in client repositories.
  • Push server responses back into browser UIs with ExecJS.
  • Provide local-only utility state where the feature is intentionally local.

Authoritative Boundaries

Client repositories are view state. They are useful for rendering, local UI +decisions, and short-lived session behavior, but they should not be treated as +durable state.

Authoritative state lives in:

  • server SQF addons for mission and player workflow ownership
  • the forge_server extension for durable and hot-state domain logic
  • SurrealDB where the extension persists durable domain records

Common Runtime Flow

Most browser-backed client addons follow this shape:

  1. The addon creates a display, finds a browser control, and registers a +JSDialog event handler.
  2. The browser loads an HTML entrypoint from ui/_site.
  3. The browser sends JSON alerts with an event name and data payload.
  4. fnc_handleUIEvents.sqf parses the alert and routes the event.
  5. A bridge object or repository sends a CBA server event when server data is +needed.
  6. Server responses are caught in XEH_postInitClient.sqf.
  7. The bridge sends browser update events back through ExecJS.

Browser alert payload:

{
+  "event": "module::action",
+  "data": {}
+}
+

Open UI Entry Points

UIEntry point
Actor menucall forge_client_actor_fnc_openUI;
Bankcall forge_client_bank_fnc_openUI;
ATM[true] call forge_client_bank_fnc_openUI;
CADcall forge_client_cad_fnc_openUI;
Garagecall forge_client_garage_fnc_openUI;
Virtual garagecall forge_client_garage_fnc_openVG;
Organization portalcall forge_client_org_fnc_openUI;
Phonecall forge_client_phone_fnc_openUI;
Storecall forge_client_store_fnc_openUI;

Notifications are normally opened during client initialization and then updated +through the notification event/service.

Addon Guides

Extension Calls

Client addons should usually call server SQF events, not the forge_server +extension directly. The server addon owns validation context and converts the +request into extension commands.

Example:

[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent);
+

Direct extension calls from client code bypass server authorization boundaries +and should be avoided.

Browser Bridge Notes

forge_client_common_fnc_initWebUIBridge provides reusable bridge and screen +objects for newer browser UIs. It queues outbound events until a browser screen +is ready, then delivers payloads through:

_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]];
+

Feature addons still own their event names, request payloads, and response +mapping.

Development Checklist

  • Keep feature-specific behavior in the owning addon.
  • Send authoritative changes to the server addon.
  • Use namespaced browser events such as bank::deposit::request.
  • Treat profileNamespace as local player preference or utility state only.
  • Make browser-ready events request the current server state before rendering +stale data.
  • Queue or ignore bridge responses when the display is closed.
  • Keep mission object setup on the mission/server side and client display logic +on the client side.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/_payload.json b/docus/dist/client-addons/_payload.json new file mode 100644 index 0000000..2b30bad --- /dev/null +++ b/docus/dist/client-addons/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":629},["ShallowReactive",2],{"navigation_docs":3,"-client-addons":145,"-client-addons-surround":624},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":99,"body":147,"description":157,"extension":618,"links":619,"meta":620,"navigation":621,"path":95,"seo":622,"stem":96,"__hash__":623},"docs\u002F4.client-addons\u002F0.index.md",{"type":148,"value":149,"toc":608},"minimark",[150,154,158,161,166,208,212,215,218,233,237,240,285,288,353,357,467,470,474,521,525,531,534,545,548,552,558,567,570,574,604],[151,152,99],"h1",{"id":153},"client-usage-guide",[155,156,157],"p",{},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",[155,159,160],{},"Use this guide as the entry point for client-side integration. Domain data,\nvalidation, persistence, rewards, ownership, and checkout behavior remain\nserver-side responsibilities.",[162,163,165],"h2",{"id":164},"client-responsibilities","Client Responsibilities",[167,168,169,178,185,192,195,198,205],"ul",{},[170,171,172,173,177],"li",{},"Open Arma displays and ",[174,175,176],"code",{},"CT_WEBBROWSER"," controls.",[170,179,180,181,184],{},"Load browser UI assets from each addon's ",[174,182,183],{},"ui\u002F_site"," folder.",[170,186,187,188,191],{},"Receive browser alerts through ",[174,189,190],{},"JSDialog"," handlers.",[170,193,194],{},"Translate browser events into local actions or CBA server events.",[170,196,197],{},"Cache display state in client repositories.",[170,199,200,201,204],{},"Push server responses back into browser UIs with ",[174,202,203],{},"ExecJS",".",[170,206,207],{},"Provide local-only utility state where the feature is intentionally local.",[162,209,211],{"id":210},"authoritative-boundaries","Authoritative Boundaries",[155,213,214],{},"Client repositories are view state. They are useful for rendering, local UI\ndecisions, and short-lived session behavior, but they should not be treated as\ndurable state.",[155,216,217],{},"Authoritative state lives in:",[167,219,220,223,230],{},[170,221,222],{},"server SQF addons for mission and player workflow ownership",[170,224,225,226,229],{},"the ",[174,227,228],{},"forge_server"," extension for durable and hot-state domain logic",[170,231,232],{},"SurrealDB where the extension persists durable domain records",[162,234,236],{"id":235},"common-runtime-flow","Common Runtime Flow",[155,238,239],{},"Most browser-backed client addons follow this shape:",[241,242,243,249,254,265,271,274,280],"ol",{},[170,244,245,246,248],{},"The addon creates a display, finds a browser control, and registers a\n",[174,247,190],{}," event handler.",[170,250,251,252,204],{},"The browser loads an HTML entrypoint from ",[174,253,183],{},[170,255,256,257,260,261,264],{},"The browser sends JSON alerts with an ",[174,258,259],{},"event"," name and ",[174,262,263],{},"data"," payload.",[170,266,267,270],{},[174,268,269],{},"fnc_handleUIEvents.sqf"," parses the alert and routes the event.",[170,272,273],{},"A bridge object or repository sends a CBA server event when server data is\nneeded.",[170,275,276,277,204],{},"Server responses are caught in ",[174,278,279],{},"XEH_postInitClient.sqf",[170,281,282,283,204],{},"The bridge sends browser update events back through ",[174,284,203],{},[155,286,287],{},"Browser alert payload:",[289,290,295],"pre",{"className":291,"code":292,"language":293,"meta":294,"style":294},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"module::action\",\n \"data\": {}\n}\n","json","",[174,296,297,306,333,347],{"__ignoreMap":294},[298,299,302],"span",{"class":300,"line":301},"line",1,[298,303,305],{"class":304},"sMK4o","{\n",[298,307,309,312,315,318,321,324,328,330],{"class":300,"line":308},2,[298,310,311],{"class":304}," \"",[298,313,259],{"class":314},"spNyl",[298,316,317],{"class":304},"\"",[298,319,320],{"class":304},":",[298,322,323],{"class":304}," \"",[298,325,327],{"class":326},"sfazB","module::action",[298,329,317],{"class":304},[298,331,332],{"class":304},",\n",[298,334,336,338,340,342,344],{"class":300,"line":335},3,[298,337,311],{"class":304},[298,339,263],{"class":314},[298,341,317],{"class":304},[298,343,320],{"class":304},[298,345,346],{"class":304}," {}\n",[298,348,350],{"class":300,"line":349},4,[298,351,352],{"class":304},"}\n",[162,354,356],{"id":355},"open-ui-entry-points","Open UI Entry Points",[358,359,360,373],"table",{},[361,362,363],"thead",{},[364,365,366,370],"tr",{},[367,368,369],"th",{},"UI",[367,371,372],{},"Entry point",[374,375,376,387,397,407,417,427,437,447,457],"tbody",{},[364,377,378,382],{},[379,380,381],"td",{},"Actor menu",[379,383,384],{},[174,385,386],{},"call forge_client_actor_fnc_openUI;",[364,388,389,392],{},[379,390,391],{},"Bank",[379,393,394],{},[174,395,396],{},"call forge_client_bank_fnc_openUI;",[364,398,399,402],{},[379,400,401],{},"ATM",[379,403,404],{},[174,405,406],{},"[true] call forge_client_bank_fnc_openUI;",[364,408,409,412],{},[379,410,411],{},"CAD",[379,413,414],{},[174,415,416],{},"call forge_client_cad_fnc_openUI;",[364,418,419,422],{},[379,420,421],{},"Garage",[379,423,424],{},[174,425,426],{},"call forge_client_garage_fnc_openUI;",[364,428,429,432],{},[379,430,431],{},"Virtual garage",[379,433,434],{},[174,435,436],{},"call forge_client_garage_fnc_openVG;",[364,438,439,442],{},[379,440,441],{},"Organization portal",[379,443,444],{},[174,445,446],{},"call forge_client_org_fnc_openUI;",[364,448,449,452],{},[379,450,451],{},"Phone",[379,453,454],{},[174,455,456],{},"call forge_client_phone_fnc_openUI;",[364,458,459,462],{},[379,460,461],{},"Store",[379,463,464],{},[174,465,466],{},"call forge_client_store_fnc_openUI;",[155,468,469],{},"Notifications are normally opened during client initialization and then updated\nthrough the notification event\u002Fservice.",[162,471,473],{"id":472},"addon-guides","Addon Guides",[167,475,476,481,485,489,493,497,501,505,509,513,517],{},[170,477,478],{},[479,480,101],"a",{"href":102},[170,482,483],{},[479,484,113],{"href":114},[170,486,487],{},[479,488,117],{"href":118},[170,490,491],{},[479,492,121],{"href":122},[170,494,495],{},[479,496,125],{"href":126},[170,498,499],{},[479,500,129],{"href":130},[170,502,503],{},[479,504,133],{"href":134},[170,506,507],{},[479,508,137],{"href":138},[170,510,511],{},[479,512,141],{"href":142},[170,514,515],{},[479,516,105],{"href":106},[170,518,519],{},[479,520,109],{"href":110},[162,522,524],{"id":523},"extension-calls","Extension Calls",[155,526,527,528,530],{},"Client addons should usually call server SQF events, not the ",[174,529,228],{},"\nextension directly. The server addon owns validation context and converts the\nrequest into extension commands.",[155,532,533],{},"Example:",[289,535,539],{"className":536,"code":537,"language":538,"meta":294,"style":294},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent);\n","sqf",[174,540,541],{"__ignoreMap":294},[298,542,543],{"class":300,"line":301},[298,544,537],{},[155,546,547],{},"Direct extension calls from client code bypass server authorization boundaries\nand should be avoided.",[162,549,551],{"id":550},"browser-bridge-notes","Browser Bridge Notes",[155,553,554,557],{},[174,555,556],{},"forge_client_common_fnc_initWebUIBridge"," provides reusable bridge and screen\nobjects for newer browser UIs. It queues outbound events until a browser screen\nis ready, then delivers payloads through:",[289,559,561],{"className":536,"code":560,"language":538,"meta":294,"style":294},"_control ctrlWebBrowserAction [\"ExecJS\", format [\"ForgeBridge.receive(%1)\", _json]];\n",[174,562,563],{"__ignoreMap":294},[298,564,565],{"class":300,"line":301},[298,566,560],{},[155,568,569],{},"Feature addons still own their event names, request payloads, and response\nmapping.",[162,571,573],{"id":572},"development-checklist","Development Checklist",[167,575,576,579,582,588,595,598,601],{},[170,577,578],{},"Keep feature-specific behavior in the owning addon.",[170,580,581],{},"Send authoritative changes to the server addon.",[170,583,584,585,204],{},"Use namespaced browser events such as ",[174,586,587],{},"bank::deposit::request",[170,589,590,591,594],{},"Treat ",[174,592,593],{},"profileNamespace"," as local player preference or utility state only.",[170,596,597],{},"Make browser-ready events request the current server state before rendering\nstale data.",[170,599,600],{},"Queue or ignore bridge responses when the display is closed.",[170,602,603],{},"Keep mission object setup on the mission\u002Fserver side and client display logic\non the client side.",[605,606,607],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":294,"searchDepth":308,"depth":308,"links":609},[610,611,612,613,614,615,616,617],{"id":164,"depth":308,"text":165},{"id":210,"depth":308,"text":211},{"id":235,"depth":308,"text":236},{"id":355,"depth":308,"text":356},{"id":472,"depth":308,"text":473},{"id":523,"depth":308,"text":524},{"id":550,"depth":308,"text":551},{"id":572,"depth":308,"text":573},"md",null,{},true,{"title":99,"description":157},"JTkXjG_St8xEkLNECfj9fYzon1OZmDe7brlAXBnT7d8",[625,627],{"title":89,"path":90,"stem":91,"description":626,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",{"title":101,"path":102,"stem":103,"description":628,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",1776806627034] \ No newline at end of file diff --git a/docus/dist/client-addons/actor.html b/docus/dist/client-addons/actor.html new file mode 100644 index 0000000..913df9b --- /dev/null +++ b/docus/dist/client-addons/actor.html @@ -0,0 +1,117 @@ +Client Actor Usage Guide - forge-docus
Client Addons

Client Actor Usage Guide

The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs.

Client Actor Usage Guide

The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs.

Open the Actor Menu

call forge_client_actor_fnc_openUI;
+

The actor menu opens RscActorMenu, loads ui/_site/index.html, and routes +browser alerts through forge_client_actor_fnc_handleUIEvents.

Repository

forge_client_actor_fnc_initRepository creates GVAR(ActorRepository).

The repository:

  • requests actor initialization from the server
  • saves actor state through the server actor addon
  • caches client-visible actor fields
  • applies position, direction, stance, rank, and loadout on JIP sync when the +relevant settings allow it
  • provides nearby interaction actions to the browser UI

Initialize actor state through the repository:

GVAR(ActorRepository) call ["init", []];
+

Save actor state through the server:

GVAR(ActorRepository) call ["save", [true]];
+

Nearby Actions

The menu asks for nearby actions with:

actor::get::actions
+

The repository scans objects within 5 meters and returns actions based on +mission object variables:

VariableAction
storeTypestore
isAtmATM
isBankbank
isGaragegarage
garageTypegarage subtype
isLockervirtual arsenal action when VA is enabled
deviceTypedevice action placeholder
nearby player unitplayer interaction placeholder

The response is pushed into the browser with updateAvailableActions(...).

Browser Events

EventClient behavior
actor::get::actionsRefresh nearby actions.
actor::close::menuClose actor menu.
actor::open::atmOpen bank UI in ATM mode.
actor::open::bankOpen bank UI in bank mode.
actor::open::cadOpen CAD UI.
actor::open::garageOpen garage UI.
actor::open::vgarageOpen virtual garage.
actor::open::orgOpen organization UI.
actor::open::vlockerOpen ACE arsenal on FORGE_Locker_Box.
actor::open::phoneOpen phone UI.
actor::open::storeOpen store UI.

Device and player interaction events currently display placeholder feedback.

Authoritative State

Actor persistence is server-owned. The client repository requests and displays +actor data, but actor creation, durable updates, and hot-state behavior are +handled by the server actor addon and extension.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/actor/_payload.json b/docus/dist/client-addons/actor/_payload.json new file mode 100644 index 0000000..b7f0303 --- /dev/null +++ b/docus/dist/client-addons/actor/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":580},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-actor":145,"-client-addons-actor-surround":575},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":117,"body":147,"description":157,"extension":569,"links":570,"meta":571,"navigation":572,"path":118,"seo":573,"stem":119,"__hash__":574},"docs\u002F4.client-addons\u002F3.actor.md",{"type":148,"value":149,"toc":560},"minimark",[150,154,158,163,180,195,199,208,211,230,233,242,245,254,258,261,269,272,370,376,380,507,510,514,517,521,556],[151,152,117],"h1",{"id":153},"client-actor-usage-guide",[155,156,157],"p",{},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",[159,160,162],"h2",{"id":161},"open-the-actor-menu","Open the Actor Menu",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_actor_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The actor menu opens ",[171,184,185],{},"RscActorMenu",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_actor_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository","Repository",[155,200,201,204,205,194],{},[171,202,203],{},"forge_client_actor_fnc_initRepository"," creates ",[171,206,207],{},"GVAR(ActorRepository)",[155,209,210],{},"The repository:",[212,213,214,218,221,224,227],"ul",{},[215,216,217],"li",{},"requests actor initialization from the server",[215,219,220],{},"saves actor state through the server actor addon",[215,222,223],{},"caches client-visible actor fields",[215,225,226],{},"applies position, direction, stance, rank, and loadout on JIP sync when the\nrelevant settings allow it",[215,228,229],{},"provides nearby interaction actions to the browser UI",[155,231,232],{},"Initialize actor state through the repository:",[164,234,236],{"className":166,"code":235,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"init\", []];\n",[171,237,238],{"__ignoreMap":169},[174,239,240],{"class":176,"line":177},[174,241,235],{},[155,243,244],{},"Save actor state through the server:",[164,246,248],{"className":166,"code":247,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"save\", [true]];\n",[171,249,250],{"__ignoreMap":169},[174,251,252],{"class":176,"line":177},[174,253,247],{},[159,255,257],{"id":256},"nearby-actions","Nearby Actions",[155,259,260],{},"The menu asks for nearby actions with:",[164,262,267],{"className":263,"code":265,"language":266,"meta":169},[264],"language-text","actor::get::actions\n","text",[171,268,265],{"__ignoreMap":169},[155,270,271],{},"The repository scans objects within 5 meters and returns actions based on\nmission object variables:",[273,274,275,288],"table",{},[276,277,278],"thead",{},[279,280,281,285],"tr",{},[282,283,284],"th",{},"Variable",[282,286,287],{},"Action",[289,290,291,302,312,322,332,342,352,362],"tbody",{},[279,292,293,299],{},[294,295,296],"td",{},[171,297,298],{},"storeType",[294,300,301],{},"store",[279,303,304,309],{},[294,305,306],{},[171,307,308],{},"isAtm",[294,310,311],{},"ATM",[279,313,314,319],{},[294,315,316],{},[171,317,318],{},"isBank",[294,320,321],{},"bank",[279,323,324,329],{},[294,325,326],{},[171,327,328],{},"isGarage",[294,330,331],{},"garage",[279,333,334,339],{},[294,335,336],{},[171,337,338],{},"garageType",[294,340,341],{},"garage subtype",[279,343,344,349],{},[294,345,346],{},[171,347,348],{},"isLocker",[294,350,351],{},"virtual arsenal action when VA is enabled",[279,353,354,359],{},[294,355,356],{},[171,357,358],{},"deviceType",[294,360,361],{},"device action placeholder",[279,363,364,367],{},[294,365,366],{},"nearby player unit",[294,368,369],{},"player interaction placeholder",[155,371,372,373,194],{},"The response is pushed into the browser with ",[171,374,375],{},"updateAvailableActions(...)",[159,377,379],{"id":378},"browser-events","Browser Events",[273,381,382,392],{},[276,383,384],{},[279,385,386,389],{},[282,387,388],{},"Event",[282,390,391],{},"Client behavior",[289,393,394,404,414,424,434,444,454,464,474,487,497],{},[279,395,396,401],{},[294,397,398],{},[171,399,400],{},"actor::get::actions",[294,402,403],{},"Refresh nearby actions.",[279,405,406,411],{},[294,407,408],{},[171,409,410],{},"actor::close::menu",[294,412,413],{},"Close actor menu.",[279,415,416,421],{},[294,417,418],{},[171,419,420],{},"actor::open::atm",[294,422,423],{},"Open bank UI in ATM mode.",[279,425,426,431],{},[294,427,428],{},[171,429,430],{},"actor::open::bank",[294,432,433],{},"Open bank UI in bank mode.",[279,435,436,441],{},[294,437,438],{},[171,439,440],{},"actor::open::cad",[294,442,443],{},"Open CAD UI.",[279,445,446,451],{},[294,447,448],{},[171,449,450],{},"actor::open::garage",[294,452,453],{},"Open garage UI.",[279,455,456,461],{},[294,457,458],{},[171,459,460],{},"actor::open::vgarage",[294,462,463],{},"Open virtual garage.",[279,465,466,471],{},[294,467,468],{},[171,469,470],{},"actor::open::org",[294,472,473],{},"Open organization UI.",[279,475,476,481],{},[294,477,478],{},[171,479,480],{},"actor::open::vlocker",[294,482,483,484,194],{},"Open ACE arsenal on ",[171,485,486],{},"FORGE_Locker_Box",[279,488,489,494],{},[294,490,491],{},[171,492,493],{},"actor::open::phone",[294,495,496],{},"Open phone UI.",[279,498,499,504],{},[294,500,501],{},[171,502,503],{},"actor::open::store",[294,505,506],{},"Open store UI.",[155,508,509],{},"Device and player interaction events currently display placeholder feedback.",[159,511,513],{"id":512},"authoritative-state","Authoritative State",[155,515,516],{},"Actor persistence is server-owned. The client repository requests and displays\nactor data, but actor creation, durable updates, and hot-state behavior are\nhandled by the server actor addon and extension.",[159,518,520],{"id":519},"related-guides","Related Guides",[212,522,523,528,532,536,540,544,548,552],{},[215,524,525],{},[526,527,49],"a",{"href":50},[215,529,530],{},[526,531,121],{"href":122},[215,533,534],{},[526,535,125],{"href":126},[215,537,538],{},[526,539,129],{"href":130},[215,541,542],{},[526,543,133],{"href":134},[215,545,546],{},[526,547,141],{"href":142},[215,549,550],{},[526,551,105],{"href":106},[215,553,554],{},[526,555,109],{"href":110},[557,558,559],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":561,"depth":561,"links":562},2,[563,564,565,566,567,568],{"id":161,"depth":561,"text":162},{"id":197,"depth":561,"text":198},{"id":256,"depth":561,"text":257},{"id":378,"depth":561,"text":379},{"id":512,"depth":561,"text":513},{"id":519,"depth":561,"text":520},"md",null,{},true,{"title":117,"description":157},"CeusWIDeAc6KDGfoUngW1_lAMAWRX8g6N17xG10V1Tc",[576,578],{"title":113,"path":114,"stem":115,"description":577,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",{"title":121,"path":122,"stem":123,"description":579,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/bank.html b/docus/dist/client-addons/bank.html new file mode 100644 index 0000000..8e6268b --- /dev/null +++ b/docus/dist/client-addons/bank.html @@ -0,0 +1,117 @@ +Client Bank Usage Guide - forge-docus
Client Addons

Client Bank Usage Guide

The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser.

Client Bank Usage Guide

The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser.

Open Bank UI

Open full bank mode:

call forge_client_bank_fnc_openUI;
+

Open ATM mode:

[true] call forge_client_bank_fnc_openUI;
+

The open function creates RscBank, sets the bridge mode to bank or atm, +loads ui/_site/index.html, and routes browser events through +forge_client_bank_fnc_handleUIEvents.

Bridge and Repository

forge_client_bank_fnc_initRepository tracks account load and cached account +state.

forge_client_bank_fnc_initUIBridge owns:

  • active browser control tracking
  • bank/ATM mode
  • browser ready handling
  • account hydrate and sync responses
  • deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN +requests
  • browser notice delivery

Browser Events

EventClient behavior
bank::readyMark browser ready and request hydrate from the server.
bank::refreshRequest fresh bank hydrate data.
bank::deposit::requestForward deposit amount to the server.
bank::withdraw::requestForward withdrawal amount to the server.
bank::transfer::requestForward target, source field, and amount.
bank::depositEarnings::requestRequest earnings deposit.
bank::repayCreditLine::requestRequest credit-line repayment.
bank::pin::requestForward PIN validation request.
bank::closeDispose bridge screen state and close the display.

Browser Response Events

The bridge sends:

EventPurpose
bank::hydrateFull session/account payload.
bank::syncAccount patch or sync data.
bank::noticeUI-visible notice payload.

Request Flow

Example deposit flow:

  1. Browser sends bank::deposit::request with an amount.
  2. Client bridge calls the server bank request event.
  3. Server bank addon validates the request and calls bank hot-state logic.
  4. Server response is caught by the client post-init event handlers.
  5. Client bridge sends bank::sync or bank::notice back to the browser.

Authoritative State

Balances, PIN authorization, transfers, checkout charges, credit lines, and +persistence are server-owned. The client should only display account data and +request mutations through server events.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/bank/_payload.json b/docus/dist/client-addons/bank/_payload.json new file mode 100644 index 0000000..6abbb63 --- /dev/null +++ b/docus/dist/client-addons/bank/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":507},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-bank":145,"-client-addons-bank-surround":502},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":121,"body":147,"description":157,"extension":496,"links":497,"meta":498,"navigation":499,"path":122,"seo":500,"stem":123,"__hash__":501},"docs\u002F4.client-addons\u002F4.bank.md",{"type":148,"value":149,"toc":486},"minimark",[150,154,158,163,166,183,186,195,218,222,228,234,256,260,370,374,377,420,424,427,456,460,463,467,482],[151,152,121],"h1",{"id":153},"client-bank-usage-guide",[155,156,157],"p",{},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",[159,160,162],"h2",{"id":161},"open-bank-ui","Open Bank UI",[155,164,165],{},"Open full bank mode:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_bank_fnc_openUI;\n","sqf","",[174,175,176],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,170],{},[155,184,185],{},"Open ATM mode:",[167,187,189],{"className":169,"code":188,"language":171,"meta":172,"style":172},"[true] call forge_client_bank_fnc_openUI;\n",[174,190,191],{"__ignoreMap":172},[177,192,193],{"class":179,"line":180},[177,194,188],{},[155,196,197,198,201,202,205,206,209,210,213,214,217],{},"The open function creates ",[174,199,200],{},"RscBank",", sets the bridge mode to ",[174,203,204],{},"bank"," or ",[174,207,208],{},"atm",",\nloads ",[174,211,212],{},"ui\u002F_site\u002Findex.html",", and routes browser events through\n",[174,215,216],{},"forge_client_bank_fnc_handleUIEvents",".",[159,219,221],{"id":220},"bridge-and-repository","Bridge and Repository",[155,223,224,227],{},[174,225,226],{},"forge_client_bank_fnc_initRepository"," tracks account load and cached account\nstate.",[155,229,230,233],{},[174,231,232],{},"forge_client_bank_fnc_initUIBridge"," owns:",[235,236,237,241,244,247,250,253],"ul",{},[238,239,240],"li",{},"active browser control tracking",[238,242,243],{},"bank\u002FATM mode",[238,245,246],{},"browser ready handling",[238,248,249],{},"account hydrate and sync responses",[238,251,252],{},"deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN\nrequests",[238,254,255],{},"browser notice delivery",[159,257,259],{"id":258},"browser-events","Browser Events",[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"Event",[270,274,275],{},"Client behavior",[277,278,279,290,300,310,320,330,340,350,360],"tbody",{},[267,280,281,287],{},[282,283,284],"td",{},[174,285,286],{},"bank::ready",[282,288,289],{},"Mark browser ready and request hydrate from the server.",[267,291,292,297],{},[282,293,294],{},[174,295,296],{},"bank::refresh",[282,298,299],{},"Request fresh bank hydrate data.",[267,301,302,307],{},[282,303,304],{},[174,305,306],{},"bank::deposit::request",[282,308,309],{},"Forward deposit amount to the server.",[267,311,312,317],{},[282,313,314],{},[174,315,316],{},"bank::withdraw::request",[282,318,319],{},"Forward withdrawal amount to the server.",[267,321,322,327],{},[282,323,324],{},[174,325,326],{},"bank::transfer::request",[282,328,329],{},"Forward target, source field, and amount.",[267,331,332,337],{},[282,333,334],{},[174,335,336],{},"bank::depositEarnings::request",[282,338,339],{},"Request earnings deposit.",[267,341,342,347],{},[282,343,344],{},[174,345,346],{},"bank::repayCreditLine::request",[282,348,349],{},"Request credit-line repayment.",[267,351,352,357],{},[282,353,354],{},[174,355,356],{},"bank::pin::request",[282,358,359],{},"Forward PIN validation request.",[267,361,362,367],{},[282,363,364],{},[174,365,366],{},"bank::close",[282,368,369],{},"Dispose bridge screen state and close the display.",[159,371,373],{"id":372},"browser-response-events","Browser Response Events",[155,375,376],{},"The bridge sends:",[261,378,379,388],{},[264,380,381],{},[267,382,383,385],{},[270,384,272],{},[270,386,387],{},"Purpose",[277,389,390,400,410],{},[267,391,392,397],{},[282,393,394],{},[174,395,396],{},"bank::hydrate",[282,398,399],{},"Full session\u002Faccount payload.",[267,401,402,407],{},[282,403,404],{},[174,405,406],{},"bank::sync",[282,408,409],{},"Account patch or sync data.",[267,411,412,417],{},[282,413,414],{},[174,415,416],{},"bank::notice",[282,418,419],{},"UI-visible notice payload.",[159,421,423],{"id":422},"request-flow","Request Flow",[155,425,426],{},"Example deposit flow:",[428,429,430,439,442,445,448],"ol",{},[238,431,432,433,435,436,217],{},"Browser sends ",[174,434,306],{}," with an ",[174,437,438],{},"amount",[238,440,441],{},"Client bridge calls the server bank request event.",[238,443,444],{},"Server bank addon validates the request and calls bank hot-state logic.",[238,446,447],{},"Server response is caught by the client post-init event handlers.",[238,449,450,451,205,453,455],{},"Client bridge sends ",[174,452,406],{},[174,454,416],{}," back to the browser.",[159,457,459],{"id":458},"authoritative-state","Authoritative State",[155,461,462],{},"Balances, PIN authorization, transfers, checkout charges, credit lines, and\npersistence are server-owned. The client should only display account data and\nrequest mutations through server events.",[159,464,466],{"id":465},"related-guides","Related Guides",[235,468,469,474,478],{},[238,470,471],{},[472,473,61],"a",{"href":62},[238,475,476],{},[472,477,113],{"href":114},[238,479,480],{},[472,481,109],{"href":110},[483,484,485],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":487,"depth":487,"links":488},2,[489,490,491,492,493,494,495],{"id":161,"depth":487,"text":162},{"id":220,"depth":487,"text":221},{"id":258,"depth":487,"text":259},{"id":372,"depth":487,"text":373},{"id":422,"depth":487,"text":423},{"id":458,"depth":487,"text":459},{"id":465,"depth":487,"text":466},"md",null,{},true,{"title":121,"description":157},"9tSr_28NEzJ4LE8au9-O-2Asw_3deKU9B74cukr6ppU",[503,505],{"title":117,"path":118,"stem":119,"description":504,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",{"title":125,"path":126,"stem":127,"description":506,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/cad.html b/docus/dist/client-addons/cad.html new file mode 100644 index 0000000..1cdbe29 --- /dev/null +++ b/docus/dist/client-addons/cad.html @@ -0,0 +1,117 @@ +Client CAD Usage Guide - forge-docus
Client Addons

Client CAD Usage Guide

The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows.

Client CAD Usage Guide

The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows.

Open CAD UI

call forge_client_cad_fnc_openUI;
+

The CAD UI opens RscMapUI and loads separate browser controls for:

  • top bar
  • bottom bar
  • side panel
  • dispatcher board

The native Arma map remains part of the same display.

Repository and Bridge

forge_client_cad_fnc_initRepository caches the hydrated CAD payload, +selected mode, dispatch view, session data, groups, tasks, requests, and +assignments.

forge_client_cad_fnc_initUIBridge owns:

  • ready state for side panel, top bar, and dispatcher board
  • operations vs dispatch mode
  • board vs map dispatch view
  • hydrate requests
  • task assignment, acknowledge, and decline requests
  • dispatch order create/close requests
  • support request submit/close requests
  • group status, role, and profile requests
  • map focus actions

Browser Events

EventClient behavior
cad::topbar::readyMark top bar ready and push top bar state.
cad::readyMark side panel ready and request hydrate.
cad::dispatcher::readyMark dispatcher board ready and push hydrate data.
cad::mode::setSwitch between operations and dispatch mode.
cad::dispatchView::setSwitch dispatch board/map view.
cad::refreshRequest fresh CAD hydrate data.
cad::tasks::assignAssign a task to a group.
cad::tasks::acknowledgeAcknowledge assigned task.
cad::tasks::declineDecline assigned task.
cad::dispatchOrder::createCreate dispatch order.
cad::dispatchOrder::closeClose dispatch order.
cad::supportRequest::submitSubmit support request.
cad::supportRequest::closeClose support request.
cad::groups::statusUpdate group status.
cad::groups::roleUpdate group role.
cad::groups::profileUpdate status and role together.
cad::groups::focusCenter map on a group.
cad::tasks::focusCenter map on a task.
cad::requests::focusCenter map on a support request.
map::zoomInZoom native map in.
map::zoomOutZoom native map out.
map::searchPlaceholder status update.
map::closeDispose bridge state and close the display.

Response Events

The bridge pushes:

EventPurpose
cad::hydrateFull hydrated CAD payload to the side panel.
cad::assignment::responseTask assignment/acknowledge/decline result.
cad::group::responseGroup status/role/profile result.
cad::request::responseSupport request result.

Dispatcher board controls also receive direct ExecJS status and hydrate +calls.

Task Compatibility

CAD task visibility depends on server-side task catalog entries. Tasks created +through Eden Forge task modules or forge_server_task_fnc_startTask are the +normal CAD-compatible task sources because they register task catalog data.

Direct handler or task-function calls only work with CAD when the task catalog +entry already exists.

Authorization Notes

Only dispatcher sessions can enter dispatch mode. If the hydrated session is +not a dispatcher, the bridge forces the UI back to operations mode.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/cad/_payload.json b/docus/dist/client-addons/cad/_payload.json new file mode 100644 index 0000000..3280bfe --- /dev/null +++ b/docus/dist/client-addons/cad/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":637},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-cad":145,"-client-addons-cad-surround":632},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":125,"body":147,"description":157,"extension":626,"links":627,"meta":628,"navigation":629,"path":126,"seo":630,"stem":127,"__hash__":631},"docs\u002F4.client-addons\u002F5.cad.md",{"type":148,"value":149,"toc":616},"minimark",[150,154,158,163,180,187,203,206,210,216,222,251,255,505,509,512,565,572,576,583,586,590,593,597,612],[151,152,125],"h1",{"id":153},"client-cad-usage-guide",[155,156,157],"p",{},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",[159,160,162],"h2",{"id":161},"open-cad-ui","Open CAD UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_cad_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186],{},"The CAD UI opens ",[171,184,185],{},"RscMapUI"," and loads separate browser controls for:",[188,189,190,194,197,200],"ul",{},[191,192,193],"li",{},"top bar",[191,195,196],{},"bottom bar",[191,198,199],{},"side panel",[191,201,202],{},"dispatcher board",[155,204,205],{},"The native Arma map remains part of the same display.",[159,207,209],{"id":208},"repository-and-bridge","Repository and Bridge",[155,211,212,215],{},[171,213,214],{},"forge_client_cad_fnc_initRepository"," caches the hydrated CAD payload,\nselected mode, dispatch view, session data, groups, tasks, requests, and\nassignments.",[155,217,218,221],{},[171,219,220],{},"forge_client_cad_fnc_initUIBridge"," owns:",[188,223,224,227,230,233,236,239,242,245,248],{},[191,225,226],{},"ready state for side panel, top bar, and dispatcher board",[191,228,229],{},"operations vs dispatch mode",[191,231,232],{},"board vs map dispatch view",[191,234,235],{},"hydrate requests",[191,237,238],{},"task assignment, acknowledge, and decline requests",[191,240,241],{},"dispatch order create\u002Fclose requests",[191,243,244],{},"support request submit\u002Fclose requests",[191,246,247],{},"group status, role, and profile requests",[191,249,250],{},"map focus actions",[159,252,254],{"id":253},"browser-events","Browser Events",[256,257,258,271],"table",{},[259,260,261],"thead",{},[262,263,264,268],"tr",{},[265,266,267],"th",{},"Event",[265,269,270],{},"Client behavior",[272,273,274,285,295,305,315,325,335,345,355,365,375,385,395,405,415,425,435,445,455,465,475,485,495],"tbody",{},[262,275,276,282],{},[277,278,279],"td",{},[171,280,281],{},"cad::topbar::ready",[277,283,284],{},"Mark top bar ready and push top bar state.",[262,286,287,292],{},[277,288,289],{},[171,290,291],{},"cad::ready",[277,293,294],{},"Mark side panel ready and request hydrate.",[262,296,297,302],{},[277,298,299],{},[171,300,301],{},"cad::dispatcher::ready",[277,303,304],{},"Mark dispatcher board ready and push hydrate data.",[262,306,307,312],{},[277,308,309],{},[171,310,311],{},"cad::mode::set",[277,313,314],{},"Switch between operations and dispatch mode.",[262,316,317,322],{},[277,318,319],{},[171,320,321],{},"cad::dispatchView::set",[277,323,324],{},"Switch dispatch board\u002Fmap view.",[262,326,327,332],{},[277,328,329],{},[171,330,331],{},"cad::refresh",[277,333,334],{},"Request fresh CAD hydrate data.",[262,336,337,342],{},[277,338,339],{},[171,340,341],{},"cad::tasks::assign",[277,343,344],{},"Assign a task to a group.",[262,346,347,352],{},[277,348,349],{},[171,350,351],{},"cad::tasks::acknowledge",[277,353,354],{},"Acknowledge assigned task.",[262,356,357,362],{},[277,358,359],{},[171,360,361],{},"cad::tasks::decline",[277,363,364],{},"Decline assigned task.",[262,366,367,372],{},[277,368,369],{},[171,370,371],{},"cad::dispatchOrder::create",[277,373,374],{},"Create dispatch order.",[262,376,377,382],{},[277,378,379],{},[171,380,381],{},"cad::dispatchOrder::close",[277,383,384],{},"Close dispatch order.",[262,386,387,392],{},[277,388,389],{},[171,390,391],{},"cad::supportRequest::submit",[277,393,394],{},"Submit support request.",[262,396,397,402],{},[277,398,399],{},[171,400,401],{},"cad::supportRequest::close",[277,403,404],{},"Close support request.",[262,406,407,412],{},[277,408,409],{},[171,410,411],{},"cad::groups::status",[277,413,414],{},"Update group status.",[262,416,417,422],{},[277,418,419],{},[171,420,421],{},"cad::groups::role",[277,423,424],{},"Update group role.",[262,426,427,432],{},[277,428,429],{},[171,430,431],{},"cad::groups::profile",[277,433,434],{},"Update status and role together.",[262,436,437,442],{},[277,438,439],{},[171,440,441],{},"cad::groups::focus",[277,443,444],{},"Center map on a group.",[262,446,447,452],{},[277,448,449],{},[171,450,451],{},"cad::tasks::focus",[277,453,454],{},"Center map on a task.",[262,456,457,462],{},[277,458,459],{},[171,460,461],{},"cad::requests::focus",[277,463,464],{},"Center map on a support request.",[262,466,467,472],{},[277,468,469],{},[171,470,471],{},"map::zoomIn",[277,473,474],{},"Zoom native map in.",[262,476,477,482],{},[277,478,479],{},[171,480,481],{},"map::zoomOut",[277,483,484],{},"Zoom native map out.",[262,486,487,492],{},[277,488,489],{},[171,490,491],{},"map::search",[277,493,494],{},"Placeholder status update.",[262,496,497,502],{},[277,498,499],{},[171,500,501],{},"map::close",[277,503,504],{},"Dispose bridge state and close the display.",[159,506,508],{"id":507},"response-events","Response Events",[155,510,511],{},"The bridge pushes:",[256,513,514,523],{},[259,515,516],{},[262,517,518,520],{},[265,519,267],{},[265,521,522],{},"Purpose",[272,524,525,535,545,555],{},[262,526,527,532],{},[277,528,529],{},[171,530,531],{},"cad::hydrate",[277,533,534],{},"Full hydrated CAD payload to the side panel.",[262,536,537,542],{},[277,538,539],{},[171,540,541],{},"cad::assignment::response",[277,543,544],{},"Task assignment\u002Facknowledge\u002Fdecline result.",[262,546,547,552],{},[277,548,549],{},[171,550,551],{},"cad::group::response",[277,553,554],{},"Group status\u002Frole\u002Fprofile result.",[262,556,557,562],{},[277,558,559],{},[171,560,561],{},"cad::request::response",[277,563,564],{},"Support request result.",[155,566,567,568,571],{},"Dispatcher board controls also receive direct ",[171,569,570],{},"ExecJS"," status and hydrate\ncalls.",[159,573,575],{"id":574},"task-compatibility","Task Compatibility",[155,577,578,579,582],{},"CAD task visibility depends on server-side task catalog entries. Tasks created\nthrough Eden Forge task modules or ",[171,580,581],{},"forge_server_task_fnc_startTask"," are the\nnormal CAD-compatible task sources because they register task catalog data.",[155,584,585],{},"Direct handler or task-function calls only work with CAD when the task catalog\nentry already exists.",[159,587,589],{"id":588},"authorization-notes","Authorization Notes",[155,591,592],{},"Only dispatcher sessions can enter dispatch mode. If the hydrated session is\nnot a dispatcher, the bridge forces the UI back to operations mode.",[159,594,596],{"id":595},"related-guides","Related Guides",[188,598,599,604,608],{},[191,600,601],{},[602,603,65],"a",{"href":66},[191,605,606],{},[602,607,57],{"href":58},[191,609,610],{},[602,611,113],{"href":114},[613,614,615],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":617,"depth":617,"links":618},2,[619,620,621,622,623,624,625],{"id":161,"depth":617,"text":162},{"id":208,"depth":617,"text":209},{"id":253,"depth":617,"text":254},{"id":507,"depth":617,"text":508},{"id":574,"depth":617,"text":575},{"id":588,"depth":617,"text":589},{"id":595,"depth":617,"text":596},"md",null,{},true,{"title":125,"description":157},"PkqhI_PomRiB_5NhoA0fI40iHaGK26pYqhDGm9sj2iA",[633,635],{"title":121,"path":122,"stem":123,"description":634,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",{"title":129,"path":130,"stem":131,"description":636,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/common.html b/docus/dist/client-addons/common.html new file mode 100644 index 0000000..240e778 --- /dev/null +++ b/docus/dist/client-addons/common.html @@ -0,0 +1,128 @@ +Client Common Usage Guide - forge-docus
Client Addons

Client Common Usage Guide

The client common addon contains shared browser UI bridge declarations and +common client-side browser integration patterns.

Client Common Usage Guide

The client common addon contains shared browser UI bridge declarations and +common client-side browser integration patterns.

Purpose

Use forge_client_common when a browser-backed feature UI needs reusable +screen lifecycle behavior:

  • active browser control tracking
  • browser ready state
  • pending event queues
  • ExecJS payload delivery
  • shared bridge object inheritance through createHashMapObject

Feature addons still own their app-specific events and server RPC mapping.

Shared Bridge

Initialize the bridge declarations with:

private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;
+private _bridgeDeclaration = _webUIDeclarations get "bridgeDeclaration";
+

Feature bridges can inherit from the shared declaration:

GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [
+    ["#base", _bridgeDeclaration],
+    ["#type", "MyUIBridgeBaseClass"],
+    ["handleReady", compileFinal {
+        params [["_control", controlNull, [controlNull]]];
+
+        _self call ["setActiveBrowserControl", [_control]];
+        _self call ["sendEvent", ["myAddon::hydrate", createHashMap, _control]];
+    }]
+];
+

Event Delivery

sendEvent builds this payload:

{
+  "event": "myAddon::event",
+  "data": {}
+}
+

If the browser control is missing or not ready, the payload is queued on the +screen object. When the screen marks ready, flushPendingEvents delivers the +queue.

Screen Lifecycle

The shared screen object tracks:

FieldPurpose
controlActive browser control.
readyStateWhether the browser app has sent its ready event.
pendingEventsOutbound events waiting for a ready browser.

Call handleClose or dispose when a display closes so stale controls and +queued events are cleared.

Current Consumers

The common bridge pattern is used by the newer bank, CAD, garage, and +organization client bridges. Store currently keeps its own bridge object and +browser bridge function names.

Usage Rules

  • Keep bridge inheritance in feature addons thin and explicit.
  • Keep shared code generic; do not add bank, CAD, org, or store-specific logic +to common.
  • Prefer namespaced events such as garage::sync.
  • Send hash maps or arrays that can be safely serialized with toJSON.
  • Avoid direct extension calls from the client bridge; send CBA server events.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/common/_payload.json b/docus/dist/client-addons/common/_payload.json new file mode 100644 index 0000000..c7351d5 --- /dev/null +++ b/docus/dist/client-addons/common/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":531},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-common":145,"-client-addons-common-surround":526},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":113,"body":147,"description":520,"extension":521,"links":522,"meta":523,"navigation":274,"path":114,"seo":524,"stem":115,"__hash__":525},"docs\u002F4.client-addons\u002F2.common.md",{"type":148,"value":149,"toc":511},"minimark",[150,154,163,168,175,200,203,207,210,233,236,300,304,310,369,376,380,383,432,443,447,450,454,480,484,507],[151,152,113],"h1",{"id":153},"client-common-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"common"," addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_common"," when a browser-backed feature UI needs reusable\nscreen lifecycle behavior:",[176,177,178,182,185,188,194],"ul",{},[179,180,181],"li",{},"active browser control tracking",[179,183,184],{},"browser ready state",[179,186,187],{},"pending event queues",[179,189,190,193],{},[159,191,192],{},"ExecJS"," payload delivery",[179,195,196,197],{},"shared bridge object inheritance through ",[159,198,199],{},"createHashMapObject",[155,201,202],{},"Feature addons still own their app-specific events and server RPC mapping.",[164,204,206],{"id":205},"shared-bridge","Shared Bridge",[155,208,209],{},"Initialize the bridge declarations with:",[211,212,217],"pre",{"className":213,"code":214,"language":215,"meta":216,"style":216},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\nprivate _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n","sqf","",[159,218,219,227],{"__ignoreMap":216},[220,221,224],"span",{"class":222,"line":223},"line",1,[220,225,226],{},"private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\n",[220,228,230],{"class":222,"line":229},2,[220,231,232],{},"private _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n",[155,234,235],{},"Feature bridges can inherit from the shared declaration:",[211,237,239],{"className":213,"code":238,"language":215,"meta":216,"style":216},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n [\"#base\", _bridgeDeclaration],\n [\"#type\", \"MyUIBridgeBaseClass\"],\n [\"handleReady\", compileFinal {\n params [[\"_control\", controlNull, [controlNull]]];\n\n _self call [\"setActiveBrowserControl\", [_control]];\n _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n }]\n];\n",[159,240,241,246,251,257,263,269,276,282,288,294],{"__ignoreMap":216},[220,242,243],{"class":222,"line":223},[220,244,245],{},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n",[220,247,248],{"class":222,"line":229},[220,249,250],{}," [\"#base\", _bridgeDeclaration],\n",[220,252,254],{"class":222,"line":253},3,[220,255,256],{}," [\"#type\", \"MyUIBridgeBaseClass\"],\n",[220,258,260],{"class":222,"line":259},4,[220,261,262],{}," [\"handleReady\", compileFinal {\n",[220,264,266],{"class":222,"line":265},5,[220,267,268],{}," params [[\"_control\", controlNull, [controlNull]]];\n",[220,270,272],{"class":222,"line":271},6,[220,273,275],{"emptyLinePlaceholder":274},true,"\n",[220,277,279],{"class":222,"line":278},7,[220,280,281],{}," _self call [\"setActiveBrowserControl\", [_control]];\n",[220,283,285],{"class":222,"line":284},8,[220,286,287],{}," _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n",[220,289,291],{"class":222,"line":290},9,[220,292,293],{}," }]\n",[220,295,297],{"class":222,"line":296},10,[220,298,299],{},"];\n",[164,301,303],{"id":302},"event-delivery","Event Delivery",[155,305,306,309],{},[159,307,308],{},"sendEvent"," builds this payload:",[211,311,315],{"className":312,"code":313,"language":314,"meta":216,"style":216},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"myAddon::event\",\n \"data\": {}\n}\n","json",[159,316,317,323,350,364],{"__ignoreMap":216},[220,318,319],{"class":222,"line":223},[220,320,322],{"class":321},"sMK4o","{\n",[220,324,325,328,332,335,338,341,345,347],{"class":222,"line":229},[220,326,327],{"class":321}," \"",[220,329,331],{"class":330},"spNyl","event",[220,333,334],{"class":321},"\"",[220,336,337],{"class":321},":",[220,339,340],{"class":321}," \"",[220,342,344],{"class":343},"sfazB","myAddon::event",[220,346,334],{"class":321},[220,348,349],{"class":321},",\n",[220,351,352,354,357,359,361],{"class":222,"line":253},[220,353,327],{"class":321},[220,355,356],{"class":330},"data",[220,358,334],{"class":321},[220,360,337],{"class":321},[220,362,363],{"class":321}," {}\n",[220,365,366],{"class":222,"line":259},[220,367,368],{"class":321},"}\n",[155,370,371,372,375],{},"If the browser control is missing or not ready, the payload is queued on the\nscreen object. When the screen marks ready, ",[159,373,374],{},"flushPendingEvents"," delivers the\nqueue.",[164,377,379],{"id":378},"screen-lifecycle","Screen Lifecycle",[155,381,382],{},"The shared screen object tracks:",[384,385,386,398],"table",{},[387,388,389],"thead",{},[390,391,392,396],"tr",{},[393,394,395],"th",{},"Field",[393,397,167],{},[399,400,401,412,422],"tbody",{},[390,402,403,409],{},[404,405,406],"td",{},[159,407,408],{},"control",[404,410,411],{},"Active browser control.",[390,413,414,419],{},[404,415,416],{},[159,417,418],{},"readyState",[404,420,421],{},"Whether the browser app has sent its ready event.",[390,423,424,429],{},[404,425,426],{},[159,427,428],{},"pendingEvents",[404,430,431],{},"Outbound events waiting for a ready browser.",[155,433,434,435,438,439,442],{},"Call ",[159,436,437],{},"handleClose"," or ",[159,440,441],{},"dispose"," when a display closes so stale controls and\nqueued events are cleared.",[164,444,446],{"id":445},"current-consumers","Current Consumers",[155,448,449],{},"The common bridge pattern is used by the newer bank, CAD, garage, and\norganization client bridges. Store currently keeps its own bridge object and\nbrowser bridge function names.",[164,451,453],{"id":452},"usage-rules","Usage Rules",[176,455,456,459,465,471,477],{},[179,457,458],{},"Keep bridge inheritance in feature addons thin and explicit.",[179,460,461,462,464],{},"Keep shared code generic; do not add bank, CAD, org, or store-specific logic\nto ",[159,463,161],{},".",[179,466,467,468,464],{},"Prefer namespaced events such as ",[159,469,470],{},"garage::sync",[179,472,473,474,464],{},"Send hash maps or arrays that can be safely serialized with ",[159,475,476],{},"toJSON",[179,478,479],{},"Avoid direct extension calls from the client bridge; send CBA server events.",[164,481,483],{"id":482},"related-guides","Related Guides",[176,485,486,491,495,499,503],{},[179,487,488],{},[489,490,99],"a",{"href":95},[179,492,493],{},[489,494,121],{"href":122},[179,496,497],{},[489,498,125],{"href":126},[179,500,501],{},[489,502,129],{"href":130},[179,504,505],{},[489,506,141],{"href":142},[508,509,510],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":216,"searchDepth":229,"depth":229,"links":512},[513,514,515,516,517,518,519],{"id":166,"depth":229,"text":167},{"id":205,"depth":229,"text":206},{"id":302,"depth":229,"text":303},{"id":378,"depth":229,"text":379},{"id":445,"depth":229,"text":446},{"id":452,"depth":229,"text":453},{"id":482,"depth":229,"text":483},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.","md",null,{},{"title":113,"description":520},"y19oU7ALKU_ma2WFUqXb_vdzt_Y7Yt4fw-1V7_galCk",[527,529],{"title":109,"path":110,"stem":111,"description":528,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",{"title":117,"path":118,"stem":119,"description":530,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/garage.html b/docus/dist/client-addons/garage.html new file mode 100644 index 0000000..582e0a0 --- /dev/null +++ b/docus/dist/client-addons/garage.html @@ -0,0 +1,124 @@ +Client Garage Usage Guide - forge-docus
Client Addons

Client Garage Usage Guide

The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view.

Client Garage Usage Guide

The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view.

Open Garage UI

call forge_client_garage_fnc_openUI;
+

The garage UI opens RscGarage, loads ui/_site/index.html, and routes +browser events through forge_client_garage_fnc_handleUIEvents.

Open Virtual Garage

call forge_client_garage_fnc_openVG;
+

The virtual garage uses mission-configured FORGE_CfgGarages locations to set +the spawn/preview position, opens the BIS garage interface, and restricts the +available vehicle lists from the virtual garage repository.

Client Services

ServicePurpose
GarageRepositoryPlayer garage view state.
VGRepositoryVirtual garage unlock view state.
GarageHelperServiceVehicle names, hit points, and payload helpers.
GarageContextServiceNearby/current vehicle context.
GaragePayloadServiceBrowser hydrate payload construction.
GarageActionServiceStore/retrieve request handling and selected nearby vehicle refuel/repair request forwarding.
GarageUIBridgeBrowser ready, hydrate, and sync delivery.

Browser Events

EventClient behavior
garage::readyMark browser ready and send garage::hydrate.
garage::refreshSend current garage payload as garage::sync.
garage::vehicle::retrieve::requestForward retrieve request through the action service.
garage::vehicle::store::requestForward store request through the action service.
garage::vehicle::refuel::requestForward selected nearby vehicle refuel request to the server economy service.
garage::vehicle::repair::requestForward selected nearby vehicle repair request to the server economy service.
garage::closeDispose bridge screen state and close the display.

Browser Response Events

EventPurpose
garage::hydrateInitial vehicle and session payload.
garage::syncRefreshed vehicle payload.
garage::service::successBrowser notice for accepted refuel/repair requests.
garage::service::failureBrowser notice for rejected refuel/repair requests.

Server action responses are handled by the action service and notification +flow.

Vehicle Service

The selected vehicle detail panel includes refuel and repair actions for nearby +world vehicles. Stored records must be retrieved first because server economy +services operate on live vehicle objects, not stored garage records.

Refuel requests use the server economy RefuelService event. Repair requests +use the server economy RepairService event. Both services are billed by the +server economy addon through organization funds.

Mission Setup

Garage interactions are normally surfaced through the actor menu when nearby +objects have garage variables such as:

_object setVariable ["isGarage", true, true];
+_object setVariable ["garageType", "cars", true];
+

Virtual garage access also requires configured garage locations in mission +config so the preview/spawn position can be resolved.

Authoritative State

The client gathers vehicle context and sends store/retrieve requests. Stored +vehicle state, validation, spawning, removal, and persistence are owned by the +server garage addon and extension.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/garage/_payload.json b/docus/dist/client-addons/garage/_payload.json new file mode 100644 index 0000000..527852e --- /dev/null +++ b/docus/dist/client-addons/garage/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":558},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-garage":145,"-client-addons-garage-surround":553},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":129,"body":147,"description":157,"extension":547,"links":548,"meta":549,"navigation":550,"path":130,"seo":551,"stem":131,"__hash__":552},"docs\u002F4.client-addons\u002F6.garage.md",{"type":148,"value":149,"toc":536},"minimark",[150,154,158,163,180,195,199,208,215,219,309,313,403,407,457,460,464,467,478,482,485,501,504,508,511,515,532],[151,152,129],"h1",{"id":153},"client-garage-usage-guide",[155,156,157],"p",{},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",[159,160,162],"h2",{"id":161},"open-garage-ui","Open Garage UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_garage_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The garage UI opens ",[171,184,185],{},"RscGarage",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser events through ",[171,192,193],{},"forge_client_garage_fnc_handleUIEvents",".",[159,196,198],{"id":197},"open-virtual-garage","Open Virtual Garage",[164,200,202],{"className":166,"code":201,"language":168,"meta":169,"style":169},"call forge_client_garage_fnc_openVG;\n",[171,203,204],{"__ignoreMap":169},[174,205,206],{"class":176,"line":177},[174,207,201],{},[155,209,210,211,214],{},"The virtual garage uses mission-configured ",[171,212,213],{},"FORGE_CfgGarages"," locations to set\nthe spawn\u002Fpreview position, opens the BIS garage interface, and restricts the\navailable vehicle lists from the virtual garage repository.",[159,216,218],{"id":217},"client-services","Client Services",[220,221,222,235],"table",{},[223,224,225],"thead",{},[226,227,228,232],"tr",{},[229,230,231],"th",{},"Service",[229,233,234],{},"Purpose",[236,237,238,249,259,269,279,289,299],"tbody",{},[226,239,240,246],{},[241,242,243],"td",{},[171,244,245],{},"GarageRepository",[241,247,248],{},"Player garage view state.",[226,250,251,256],{},[241,252,253],{},[171,254,255],{},"VGRepository",[241,257,258],{},"Virtual garage unlock view state.",[226,260,261,266],{},[241,262,263],{},[171,264,265],{},"GarageHelperService",[241,267,268],{},"Vehicle names, hit points, and payload helpers.",[226,270,271,276],{},[241,272,273],{},[171,274,275],{},"GarageContextService",[241,277,278],{},"Nearby\u002Fcurrent vehicle context.",[226,280,281,286],{},[241,282,283],{},[171,284,285],{},"GaragePayloadService",[241,287,288],{},"Browser hydrate payload construction.",[226,290,291,296],{},[241,292,293],{},[171,294,295],{},"GarageActionService",[241,297,298],{},"Store\u002Fretrieve request handling and selected nearby vehicle refuel\u002Frepair request forwarding.",[226,300,301,306],{},[241,302,303],{},[171,304,305],{},"GarageUIBridge",[241,307,308],{},"Browser ready, hydrate, and sync delivery.",[159,310,312],{"id":311},"browser-events","Browser Events",[220,314,315,325],{},[223,316,317],{},[226,318,319,322],{},[229,320,321],{},"Event",[229,323,324],{},"Client behavior",[236,326,327,340,353,363,373,383,393],{},[226,328,329,334],{},[241,330,331],{},[171,332,333],{},"garage::ready",[241,335,336,337,194],{},"Mark browser ready and send ",[171,338,339],{},"garage::hydrate",[226,341,342,347],{},[241,343,344],{},[171,345,346],{},"garage::refresh",[241,348,349,350,194],{},"Send current garage payload as ",[171,351,352],{},"garage::sync",[226,354,355,360],{},[241,356,357],{},[171,358,359],{},"garage::vehicle::retrieve::request",[241,361,362],{},"Forward retrieve request through the action service.",[226,364,365,370],{},[241,366,367],{},[171,368,369],{},"garage::vehicle::store::request",[241,371,372],{},"Forward store request through the action service.",[226,374,375,380],{},[241,376,377],{},[171,378,379],{},"garage::vehicle::refuel::request",[241,381,382],{},"Forward selected nearby vehicle refuel request to the server economy service.",[226,384,385,390],{},[241,386,387],{},[171,388,389],{},"garage::vehicle::repair::request",[241,391,392],{},"Forward selected nearby vehicle repair request to the server economy service.",[226,394,395,400],{},[241,396,397],{},[171,398,399],{},"garage::close",[241,401,402],{},"Dispose bridge screen state and close the display.",[159,404,406],{"id":405},"browser-response-events","Browser Response Events",[220,408,409,417],{},[223,410,411],{},[226,412,413,415],{},[229,414,321],{},[229,416,234],{},[236,418,419,428,437,447],{},[226,420,421,425],{},[241,422,423],{},[171,424,339],{},[241,426,427],{},"Initial vehicle and session payload.",[226,429,430,434],{},[241,431,432],{},[171,433,352],{},[241,435,436],{},"Refreshed vehicle payload.",[226,438,439,444],{},[241,440,441],{},[171,442,443],{},"garage::service::success",[241,445,446],{},"Browser notice for accepted refuel\u002Frepair requests.",[226,448,449,454],{},[241,450,451],{},[171,452,453],{},"garage::service::failure",[241,455,456],{},"Browser notice for rejected refuel\u002Frepair requests.",[155,458,459],{},"Server action responses are handled by the action service and notification\nflow.",[159,461,463],{"id":462},"vehicle-service","Vehicle Service",[155,465,466],{},"The selected vehicle detail panel includes refuel and repair actions for nearby\nworld vehicles. Stored records must be retrieved first because server economy\nservices operate on live vehicle objects, not stored garage records.",[155,468,469,470,473,474,477],{},"Refuel requests use the server economy ",[171,471,472],{},"RefuelService"," event. Repair requests\nuse the server economy ",[171,475,476],{},"RepairService"," event. Both services are billed by the\nserver economy addon through organization funds.",[159,479,481],{"id":480},"mission-setup","Mission Setup",[155,483,484],{},"Garage interactions are normally surfaced through the actor menu when nearby\nobjects have garage variables such as:",[164,486,488],{"className":166,"code":487,"language":168,"meta":169,"style":169},"_object setVariable [\"isGarage\", true, true];\n_object setVariable [\"garageType\", \"cars\", true];\n",[171,489,490,495],{"__ignoreMap":169},[174,491,492],{"class":176,"line":177},[174,493,494],{},"_object setVariable [\"isGarage\", true, true];\n",[174,496,498],{"class":176,"line":497},2,[174,499,500],{},"_object setVariable [\"garageType\", \"cars\", true];\n",[155,502,503],{},"Virtual garage access also requires configured garage locations in mission\nconfig so the preview\u002Fspawn position can be resolved.",[159,505,507],{"id":506},"authoritative-state","Authoritative State",[155,509,510],{},"The client gathers vehicle context and sends store\u002Fretrieve requests. Stored\nvehicle state, validation, spawning, removal, and persistence are owned by the\nserver garage addon and extension.",[159,512,514],{"id":513},"related-guides","Related Guides",[516,517,518,524,528],"ul",{},[519,520,521],"li",{},[522,523,73],"a",{"href":74},[519,525,526],{},[522,527,117],{"href":118},[519,529,530],{},[522,531,137],{"href":138},[533,534,535],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":497,"depth":497,"links":537},[538,539,540,541,542,543,544,545,546],{"id":161,"depth":497,"text":162},{"id":197,"depth":497,"text":198},{"id":217,"depth":497,"text":218},{"id":311,"depth":497,"text":312},{"id":405,"depth":497,"text":406},{"id":462,"depth":497,"text":463},{"id":480,"depth":497,"text":481},{"id":506,"depth":497,"text":507},{"id":513,"depth":497,"text":514},"md",null,{},true,{"title":129,"description":157},"FjY4rI8r7pbcqenAYzqgitXP9qYdvwrTtKlyd4O8aw8",[554,556],{"title":125,"path":126,"stem":127,"description":555,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",{"title":133,"path":134,"stem":135,"description":557,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/locker.html b/docus/dist/client-addons/locker.html new file mode 100644 index 0000000..9a25a5f --- /dev/null +++ b/docus/dist/client-addons/locker.html @@ -0,0 +1,115 @@ +Client Locker Usage Guide - forge-docus
Client Addons

Client Locker Usage Guide

The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state.

Client Locker Usage Guide

The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state.

Repositories

forge_client_locker_fnc_initRepository creates GVAR(LockerRepository).

forge_client_locker_fnc_initVARepository creates GVAR(VARepository).

Initialize locker state:

GVAR(LockerRepository) call ["init", []];
+GVAR(VARepository) call ["init", []];
+

Locker Container Flow

The repository searches mission namespace variables whose names contain +locker and refer to objects. For each server/mission locker object, it creates +a local Box_NATO_Equip_F at the same position and attaches container event +handlers.

On container open:

  • the local container is cleared
  • cached locker items are inserted into the container
  • over-capacity warnings are emitted when the item count is above 25

On container close:

  • cargo, nested container items, and weapon attachments are read back
  • the new locker map is sent to the server with the override request
  • the local repository cache is updated

Virtual Arsenal Flow

The virtual arsenal repository creates a local FORGE_Locker_Box and requests +virtual arsenal unlocks from the server.

As sync data arrives, it applies unlocks through ACE Arsenal:

Data keyClient behavior
itemsAdd virtual items.
weaponsAdd virtual weapons.
magazinesAdd virtual magazines.
backpacksAdd virtual backpacks.

The actor menu opens the virtual locker with:

[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox;
+

Server Events

The client repository sends requests for:

  • locker initialization
  • locker save
  • locker override after container close
  • virtual arsenal initialization
  • virtual arsenal save

The server locker addon and extension own the saved locker and virtual arsenal +state.

Mission Setup

Mission locker objects must be placed into missionNamespace with a variable +name containing locker. The client creates local interactive containers from +those authoritative mission objects.

Example:

missionNamespace setVariable ["forge_locker_alpha", _lockerObject, true];
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/locker/_payload.json b/docus/dist/client-addons/locker/_payload.json new file mode 100644 index 0000000..2e42412 --- /dev/null +++ b/docus/dist/client-addons/locker/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":434},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-locker":145,"-client-addons-locker-surround":429},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":133,"body":147,"description":157,"extension":423,"links":424,"meta":425,"navigation":426,"path":134,"seo":427,"stem":135,"__hash__":428},"docs\u002F4.client-addons\u002F7.locker.md",{"type":148,"value":149,"toc":415},"minimark",[150,154,158,163,174,182,185,208,212,223,226,239,242,253,257,264,267,327,330,339,343,346,363,366,370,380,383,392,396,411],[151,152,133],"h1",{"id":153},"client-locker-usage-guide",[155,156,157],"p",{},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",[159,160,162],"h2",{"id":161},"repositories","Repositories",[155,164,165,169,170,173],{},[166,167,168],"code",{},"forge_client_locker_fnc_initRepository"," creates ",[166,171,172],{},"GVAR(LockerRepository)",".",[155,175,176,169,179,173],{},[166,177,178],{},"forge_client_locker_fnc_initVARepository",[166,180,181],{},"GVAR(VARepository)",[155,183,184],{},"Initialize locker state:",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(LockerRepository) call [\"init\", []];\nGVAR(VARepository) call [\"init\", []];\n","sqf","",[166,193,194,202],{"__ignoreMap":191},[195,196,199],"span",{"class":197,"line":198},"line",1,[195,200,201],{},"GVAR(LockerRepository) call [\"init\", []];\n",[195,203,205],{"class":197,"line":204},2,[195,206,207],{},"GVAR(VARepository) call [\"init\", []];\n",[159,209,211],{"id":210},"locker-container-flow","Locker Container Flow",[155,213,214,215,218,219,222],{},"The repository searches mission namespace variables whose names contain\n",[166,216,217],{},"locker"," and refer to objects. For each server\u002Fmission locker object, it creates\na local ",[166,220,221],{},"Box_NATO_Equip_F"," at the same position and attaches container event\nhandlers.",[155,224,225],{},"On container open:",[227,228,229,233,236],"ul",{},[230,231,232],"li",{},"the local container is cleared",[230,234,235],{},"cached locker items are inserted into the container",[230,237,238],{},"over-capacity warnings are emitted when the item count is above 25",[155,240,241],{},"On container close:",[227,243,244,247,250],{},[230,245,246],{},"cargo, nested container items, and weapon attachments are read back",[230,248,249],{},"the new locker map is sent to the server with the override request",[230,251,252],{},"the local repository cache is updated",[159,254,256],{"id":255},"virtual-arsenal-flow","Virtual Arsenal Flow",[155,258,259,260,263],{},"The virtual arsenal repository creates a local ",[166,261,262],{},"FORGE_Locker_Box"," and requests\nvirtual arsenal unlocks from the server.",[155,265,266],{},"As sync data arrives, it applies unlocks through ACE Arsenal:",[268,269,270,283],"table",{},[271,272,273],"thead",{},[274,275,276,280],"tr",{},[277,278,279],"th",{},"Data key",[277,281,282],{},"Client behavior",[284,285,286,297,307,317],"tbody",{},[274,287,288,294],{},[289,290,291],"td",{},[166,292,293],{},"items",[289,295,296],{},"Add virtual items.",[274,298,299,304],{},[289,300,301],{},[166,302,303],{},"weapons",[289,305,306],{},"Add virtual weapons.",[274,308,309,314],{},[289,310,311],{},[166,312,313],{},"magazines",[289,315,316],{},"Add virtual magazines.",[274,318,319,324],{},[289,320,321],{},[166,322,323],{},"backpacks",[289,325,326],{},"Add virtual backpacks.",[155,328,329],{},"The actor menu opens the virtual locker with:",[186,331,333],{"className":188,"code":332,"language":190,"meta":191,"style":191},"[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox;\n",[166,334,335],{"__ignoreMap":191},[195,336,337],{"class":197,"line":198},[195,338,332],{},[159,340,342],{"id":341},"server-events","Server Events",[155,344,345],{},"The client repository sends requests for:",[227,347,348,351,354,357,360],{},[230,349,350],{},"locker initialization",[230,352,353],{},"locker save",[230,355,356],{},"locker override after container close",[230,358,359],{},"virtual arsenal initialization",[230,361,362],{},"virtual arsenal save",[155,364,365],{},"The server locker addon and extension own the saved locker and virtual arsenal\nstate.",[159,367,369],{"id":368},"mission-setup","Mission Setup",[155,371,372,373,376,377,379],{},"Mission locker objects must be placed into ",[166,374,375],{},"missionNamespace"," with a variable\nname containing ",[166,378,217],{},". The client creates local interactive containers from\nthose authoritative mission objects.",[155,381,382],{},"Example:",[186,384,386],{"className":188,"code":385,"language":190,"meta":191,"style":191},"missionNamespace setVariable [\"forge_locker_alpha\", _lockerObject, true];\n",[166,387,388],{"__ignoreMap":191},[195,389,390],{"class":197,"line":198},[195,391,385],{},[159,393,395],{"id":394},"related-guides","Related Guides",[227,397,398,403,407],{},[230,399,400],{},[401,402,77],"a",{"href":78},[230,404,405],{},[401,406,85],{"href":86},[230,408,409],{},[401,410,117],{"href":118},[412,413,414],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":204,"depth":204,"links":416},[417,418,419,420,421,422],{"id":161,"depth":204,"text":162},{"id":210,"depth":204,"text":211},{"id":255,"depth":204,"text":256},{"id":341,"depth":204,"text":342},{"id":368,"depth":204,"text":369},{"id":394,"depth":204,"text":395},"md",null,{},true,{"title":133,"description":157},"Xg6JIHaku-KiLc15y67lo3EujW_Zj6YTuSIMClw5vsM",[430,432],{"title":129,"path":130,"stem":131,"description":431,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",{"title":137,"path":138,"stem":139,"description":433,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/main.html b/docus/dist/client-addons/main.html new file mode 100644 index 0000000..b530044 --- /dev/null +++ b/docus/dist/client-addons/main.html @@ -0,0 +1,113 @@ +Client Main Usage Guide - forge-docus
Client Addons

Client Main Usage Guide

The client main addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons.

Client Main Usage Guide

The client main addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons.

Purpose

Use forge_client_main as the foundation dependency for client addons that +need Forge macros, function naming, settings, or mod-level configuration.

Feature logic should stay in the owning addon. main should remain limited to +shared client configuration and compile infrastructure.

Key Files

FilePurpose
script_mod.hppClient mod identity.
script_version.hppClient mod version values.
script_macros.hppShared client macros.
CfgSettings.hppClient CBA settings.
config.cppAddon config and mod wiring.

Dependency Pattern

Feature addons normally depend on forge_client_main in their config.cpp.

class forge_client_example {
+    requiredAddons[] = {
+        "forge_client_main"
+    };
+};
+

Usage Notes

  • Put domain UI, repositories, and event handling in feature addons.
  • Put reusable browser bridge behavior in forge_client_common.
  • Put server-only behavior in arma/server/addons.
  • Keep settings in CfgSettings.hpp when they apply to the client mod as a +whole or to a client feature toggle.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/main/_payload.json b/docus/dist/client-addons/main/_payload.json new file mode 100644 index 0000000..ad778af --- /dev/null +++ b/docus/dist/client-addons/main/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-main":145,"-client-addons-main-surround":374},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":101,"body":147,"description":367,"extension":368,"links":369,"meta":370,"navigation":371,"path":102,"seo":372,"stem":103,"__hash__":373},"docs\u002F4.client-addons\u002F1.main.md",{"type":148,"value":149,"toc":360},"minimark",[150,154,163,168,175,181,185,254,258,267,308,312,337,341,356],[151,152,101],"h1",{"id":153},"client-main-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"main"," addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_main"," as the foundation dependency for client addons that\nneed Forge macros, function naming, settings, or mod-level configuration.",[155,176,177,178,180],{},"Feature logic should stay in the owning addon. ",[159,179,161],{}," should remain limited to\nshared client configuration and compile infrastructure.",[164,182,184],{"id":183},"key-files","Key Files",[186,187,188,200],"table",{},[189,190,191],"thead",{},[192,193,194,198],"tr",{},[195,196,197],"th",{},"File",[195,199,167],{},[201,202,203,214,224,234,244],"tbody",{},[192,204,205,211],{},[206,207,208],"td",{},[159,209,210],{},"script_mod.hpp",[206,212,213],{},"Client mod identity.",[192,215,216,221],{},[206,217,218],{},[159,219,220],{},"script_version.hpp",[206,222,223],{},"Client mod version values.",[192,225,226,231],{},[206,227,228],{},[159,229,230],{},"script_macros.hpp",[206,232,233],{},"Shared client macros.",[192,235,236,241],{},[206,237,238],{},[159,239,240],{},"CfgSettings.hpp",[206,242,243],{},"Client CBA settings.",[192,245,246,251],{},[206,247,248],{},[159,249,250],{},"config.cpp",[206,252,253],{},"Addon config and mod wiring.",[164,255,257],{"id":256},"dependency-pattern","Dependency Pattern",[155,259,260,261,263,264,266],{},"Feature addons normally depend on ",[159,262,173],{}," in their ",[159,265,250],{},".",[268,269,274],"pre",{"className":270,"code":271,"language":272,"meta":273,"style":273},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class forge_client_example {\n requiredAddons[] = {\n \"forge_client_main\"\n };\n};\n","cpp","",[159,275,276,284,290,296,302],{"__ignoreMap":273},[277,278,281],"span",{"class":279,"line":280},"line",1,[277,282,283],{},"class forge_client_example {\n",[277,285,287],{"class":279,"line":286},2,[277,288,289],{}," requiredAddons[] = {\n",[277,291,293],{"class":279,"line":292},3,[277,294,295],{}," \"forge_client_main\"\n",[277,297,299],{"class":279,"line":298},4,[277,300,301],{}," };\n",[277,303,305],{"class":279,"line":304},5,[277,306,307],{},"};\n",[164,309,311],{"id":310},"usage-notes","Usage Notes",[313,314,315,319,325,331],"ul",{},[316,317,318],"li",{},"Put domain UI, repositories, and event handling in feature addons.",[316,320,321,322,266],{},"Put reusable browser bridge behavior in ",[159,323,324],{},"forge_client_common",[316,326,327,328,266],{},"Put server-only behavior in ",[159,329,330],{},"arma\u002Fserver\u002Faddons",[316,332,333,334,336],{},"Keep settings in ",[159,335,240],{}," when they apply to the client mod as a\nwhole or to a client feature toggle.",[164,338,340],{"id":339},"related-guides","Related Guides",[313,342,343,348,352],{},[316,344,345],{},[346,347,99],"a",{"href":95},[316,349,350],{},[346,351,113],{"href":114},[316,353,354],{},[346,355,19],{"href":20},[357,358,359],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":273,"searchDepth":286,"depth":286,"links":361},[362,363,364,365,366],{"id":166,"depth":286,"text":167},{"id":183,"depth":286,"text":184},{"id":256,"depth":286,"text":257},{"id":310,"depth":286,"text":311},{"id":339,"depth":286,"text":340},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.","md",null,{},true,{"title":101,"description":367},"Th6geljS-Lc2R7P9vy5TF75LdSxHFKrOUt7Rwds7sgM",[375,377],{"title":99,"path":95,"stem":96,"description":376,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",{"title":105,"path":106,"stem":107,"description":378,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/notifications.html b/docus/dist/client-addons/notifications.html new file mode 100644 index 0000000..29d2790 --- /dev/null +++ b/docus/dist/client-addons/notifications.html @@ -0,0 +1,121 @@ +Client Notifications Usage Guide - forge-docus
Client Addons

Client Notifications Usage Guide

The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules.

Client Notifications Usage Guide

The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules.

Runtime Behavior

The notification display is created during client initialization. The browser +HUD sends:

notifications::ready
+

When that event is received, NotificationService initializes and sends a +startup notification.

Create a Notification

Use the notification service when available:

GVAR(NotificationService) call ["create", [
+    "success",
+    "Title",
+    "Notification text.",
+    4000
+]];
+

Arguments:

ArgumentPurpose
_typeNotification type, such as success, info, warning, or error.
_titleNotification title.
_contentNotification body text.
_durationDisplay duration in milliseconds.

The service dispatches a browser forge:notify custom event.

CBA Event Surface

Other addons can use the client notification event:

["forge_client_notifications_recieveNotification", [
+    "warning",
+    "Garage",
+    "Vehicle spawn position is blocked.",
+    3000
+]] call CBA_fnc_localEvent;
+

The event payload is:

[_type, _title, _content, _duration]
+

Usage Rules

  • Use the shared notification service instead of opening separate transient +browser UIs.
  • Keep server-driven player feedback short and actionable.
  • Treat notification state as transient client UI state.
  • Do not use notifications as the only record of durable domain changes.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/notifications/_payload.json b/docus/dist/client-addons/notifications/_payload.json new file mode 100644 index 0000000..7d41ccb --- /dev/null +++ b/docus/dist/client-addons/notifications/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-notifications":145,"-client-addons-notifications-surround":435},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":137,"body":147,"description":157,"extension":429,"links":430,"meta":431,"navigation":432,"path":138,"seo":433,"stem":139,"__hash__":434},"docs\u002F4.client-addons\u002F8.notifications.md",{"type":148,"value":149,"toc":422},"minimark",[150,154,158,163,166,177,184,188,191,236,239,314,321,325,328,363,366,375,379,395,399,418],[151,152,137],"h1",{"id":153},"client-notifications-usage-guide",[155,156,157],"p",{},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",[159,160,162],"h2",{"id":161},"runtime-behavior","Runtime Behavior",[155,164,165],{},"The notification display is created during client initialization. The browser\nHUD sends:",[167,168,174],"pre",{"className":169,"code":171,"language":172,"meta":173},[170],"language-text","notifications::ready\n","text","",[175,176,171],"code",{"__ignoreMap":173},[155,178,179,180,183],{},"When that event is received, ",[175,181,182],{},"NotificationService"," initializes and sends a\nstartup notification.",[159,185,187],{"id":186},"create-a-notification","Create a Notification",[155,189,190],{},"Use the notification service when available:",[167,192,196],{"className":193,"code":194,"language":195,"meta":173,"style":173},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(NotificationService) call [\"create\", [\n \"success\",\n \"Title\",\n \"Notification text.\",\n 4000\n]];\n","sqf",[175,197,198,206,212,218,224,230],{"__ignoreMap":173},[199,200,203],"span",{"class":201,"line":202},"line",1,[199,204,205],{},"GVAR(NotificationService) call [\"create\", [\n",[199,207,209],{"class":201,"line":208},2,[199,210,211],{}," \"success\",\n",[199,213,215],{"class":201,"line":214},3,[199,216,217],{}," \"Title\",\n",[199,219,221],{"class":201,"line":220},4,[199,222,223],{}," \"Notification text.\",\n",[199,225,227],{"class":201,"line":226},5,[199,228,229],{}," 4000\n",[199,231,233],{"class":201,"line":232},6,[199,234,235],{},"]];\n",[155,237,238],{},"Arguments:",[240,241,242,255],"table",{},[243,244,245],"thead",{},[246,247,248,252],"tr",{},[249,250,251],"th",{},"Argument",[249,253,254],{},"Purpose",[256,257,258,284,294,304],"tbody",{},[246,259,260,266],{},[261,262,263],"td",{},[175,264,265],{},"_type",[261,267,268,269,272,273,272,276,279,280,283],{},"Notification type, such as ",[175,270,271],{},"success",", ",[175,274,275],{},"info",[175,277,278],{},"warning",", or ",[175,281,282],{},"error",".",[246,285,286,291],{},[261,287,288],{},[175,289,290],{},"_title",[261,292,293],{},"Notification title.",[246,295,296,301],{},[261,297,298],{},[175,299,300],{},"_content",[261,302,303],{},"Notification body text.",[246,305,306,311],{},[261,307,308],{},[175,309,310],{},"_duration",[261,312,313],{},"Display duration in milliseconds.",[155,315,316,317,320],{},"The service dispatches a browser ",[175,318,319],{},"forge:notify"," custom event.",[159,322,324],{"id":323},"cba-event-surface","CBA Event Surface",[155,326,327],{},"Other addons can use the client notification event:",[167,329,331],{"className":193,"code":330,"language":195,"meta":173,"style":173},"[\"forge_client_notifications_recieveNotification\", [\n \"warning\",\n \"Garage\",\n \"Vehicle spawn position is blocked.\",\n 3000\n]] call CBA_fnc_localEvent;\n",[175,332,333,338,343,348,353,358],{"__ignoreMap":173},[199,334,335],{"class":201,"line":202},[199,336,337],{},"[\"forge_client_notifications_recieveNotification\", [\n",[199,339,340],{"class":201,"line":208},[199,341,342],{}," \"warning\",\n",[199,344,345],{"class":201,"line":214},[199,346,347],{}," \"Garage\",\n",[199,349,350],{"class":201,"line":220},[199,351,352],{}," \"Vehicle spawn position is blocked.\",\n",[199,354,355],{"class":201,"line":226},[199,356,357],{}," 3000\n",[199,359,360],{"class":201,"line":232},[199,361,362],{},"]] call CBA_fnc_localEvent;\n",[155,364,365],{},"The event payload is:",[167,367,369],{"className":193,"code":368,"language":195,"meta":173,"style":173},"[_type, _title, _content, _duration]\n",[175,370,371],{"__ignoreMap":173},[199,372,373],{"class":201,"line":202},[199,374,368],{},[159,376,378],{"id":377},"usage-rules","Usage Rules",[380,381,382,386,389,392],"ul",{},[383,384,385],"li",{},"Use the shared notification service instead of opening separate transient\nbrowser UIs.",[383,387,388],{},"Keep server-driven player feedback short and actionable.",[383,390,391],{},"Treat notification state as transient client UI state.",[383,393,394],{},"Do not use notifications as the only record of durable domain changes.",[159,396,398],{"id":397},"related-guides","Related Guides",[380,400,401,406,410,414],{},[383,402,403],{},[404,405,99],"a",{"href":95},[383,407,408],{},[404,409,129],{"href":130},[383,411,412],{},[404,413,121],{"href":122},[383,415,416],{},[404,417,109],{"href":110},[419,420,421],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":173,"searchDepth":208,"depth":208,"links":423},[424,425,426,427,428],{"id":161,"depth":208,"text":162},{"id":186,"depth":208,"text":187},{"id":323,"depth":208,"text":324},{"id":377,"depth":208,"text":378},{"id":397,"depth":208,"text":398},"md",null,{},true,{"title":137,"description":157},"P5hLsZEtZ07GJaZAEGp85RqGAXcXTLDP_pi2pwHR08o",[436,438],{"title":133,"path":134,"stem":135,"description":437,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",{"title":141,"path":142,"stem":143,"description":439,"children":-1},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/organization.html b/docus/dist/client-addons/organization.html new file mode 100644 index 0000000..0eb7724 --- /dev/null +++ b/docus/dist/client-addons/organization.html @@ -0,0 +1,122 @@ +Client Organization Usage Guide - forge-docus
Client Addons

Client Organization Usage Guide

The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display.

Client Organization Usage Guide

The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display.

Open Organization UI

call forge_client_org_fnc_openUI;
+

The UI opens RscOrg, loads ui/_site/index.html, and routes browser alerts +through forge_client_org_fnc_handleUIEvents.

Repository and Bridge

forge_client_org_fnc_initRepository caches organization portal state.

forge_client_org_fnc_initUIBridge owns:

  • active browser control tracking
  • portal hydrate requests
  • create/login response routing
  • leave and disband requests
  • credit-line assignment requests
  • invite, accept invite, and decline invite requests
  • targeted browser response events

Browser Events

EventClient behavior
org::readyMark browser ready and request org::sync.
org::login::requestRequest portal hydrate as org::login::success.
org::create::requestValidate org name and request creation on server.
org::disband::requestRequest disband on server.
org::leave::requestRequest leave on server.
org::credit::requestRequest credit-line assignment.
org::invite::requestRequest member invite.
org::invite::acceptAccept invite by org ID.
org::invite::declineDecline invite by org ID.
org::closeClose the display.

Browser Response Events

EventPurpose
org::syncFull portal sync payload.
org::login::successLogin hydrate payload.
org::create::successCreation hydrate payload.
org::create::failureCreation validation or server failure.
org::disband::successRequester disband success.
org::disband::failureDisband failure.
org::portal::revokedPortal state revoked by someone else's disband action.
org::leave::successLeave success.
org::leave::failureLeave failure.
org::credit::successCredit-line request success.
org::credit::failureCredit-line request failure.
org::member::creditUpdatedTargeted member credit-line patch.
org::invite::successInvite success.
org::invite::failureInvite failure.
org::invite::decision::successInvite accept/decline success.
org::invite::decision::failureInvite accept/decline failure.

Request Examples

Create organization request payload:

{
+  "orgName": "Example Logistics"
+}
+

Credit-line request payload:

{
+  "memberUid": "76561198000000000",
+  "memberName": "Player Name",
+  "amount": 2500
+}
+

Invite request payload:

{
+  "targetUid": "76561198000000000",
+  "targetName": "Player Name"
+}
+

Authoritative State

Organization funds, reputation, membership, invites, credit lines, assets, +fleet, and persistence are server-owned. The client portal only displays and +requests changes.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/organization/_payload.json b/docus/dist/client-addons/organization/_payload.json new file mode 100644 index 0000000..d98a673 --- /dev/null +++ b/docus/dist/client-addons/organization/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":771},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-organization":145,"-client-addons-organization-surround":768},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":141,"body":147,"description":157,"extension":762,"links":763,"meta":764,"navigation":765,"path":142,"seo":766,"stem":143,"__hash__":767},"docs\u002F4.client-addons\u002F9.organization.md",{"type":148,"value":149,"toc":753},"minimark",[150,154,158,163,180,195,199,205,211,236,240,366,370,541,545,548,593,596,667,670,719,723,726,730,749],[151,152,141],"h1",{"id":153},"client-organization-usage-guide",[155,156,157],"p",{},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",[159,160,162],"h2",{"id":161},"open-organization-ui","Open Organization UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_org_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscOrg",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_org_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository-and-bridge","Repository and Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_org_fnc_initRepository"," caches organization portal state.",[155,206,207,210],{},[171,208,209],{},"forge_client_org_fnc_initUIBridge"," owns:",[212,213,214,218,221,224,227,230,233],"ul",{},[215,216,217],"li",{},"active browser control tracking",[215,219,220],{},"portal hydrate requests",[215,222,223],{},"create\u002Flogin response routing",[215,225,226],{},"leave and disband requests",[215,228,229],{},"credit-line assignment requests",[215,231,232],{},"invite, accept invite, and decline invite requests",[215,234,235],{},"targeted browser response events",[159,237,239],{"id":238},"browser-events","Browser Events",[241,242,243,256],"table",{},[244,245,246],"thead",{},[247,248,249,253],"tr",{},[250,251,252],"th",{},"Event",[250,254,255],{},"Client behavior",[257,258,259,273,286,296,306,316,326,336,346,356],"tbody",{},[247,260,261,267],{},[262,263,264],"td",{},[171,265,266],{},"org::ready",[262,268,269,270,194],{},"Mark browser ready and request ",[171,271,272],{},"org::sync",[247,274,275,280],{},[262,276,277],{},[171,278,279],{},"org::login::request",[262,281,282,283,194],{},"Request portal hydrate as ",[171,284,285],{},"org::login::success",[247,287,288,293],{},[262,289,290],{},[171,291,292],{},"org::create::request",[262,294,295],{},"Validate org name and request creation on server.",[247,297,298,303],{},[262,299,300],{},[171,301,302],{},"org::disband::request",[262,304,305],{},"Request disband on server.",[247,307,308,313],{},[262,309,310],{},[171,311,312],{},"org::leave::request",[262,314,315],{},"Request leave on server.",[247,317,318,323],{},[262,319,320],{},[171,321,322],{},"org::credit::request",[262,324,325],{},"Request credit-line assignment.",[247,327,328,333],{},[262,329,330],{},[171,331,332],{},"org::invite::request",[262,334,335],{},"Request member invite.",[247,337,338,343],{},[262,339,340],{},[171,341,342],{},"org::invite::accept",[262,344,345],{},"Accept invite by org ID.",[247,347,348,353],{},[262,349,350],{},[171,351,352],{},"org::invite::decline",[262,354,355],{},"Decline invite by org ID.",[247,357,358,363],{},[262,359,360],{},[171,361,362],{},"org::close",[262,364,365],{},"Close the display.",[159,367,369],{"id":368},"browser-response-events","Browser Response Events",[241,371,372,381],{},[244,373,374],{},[247,375,376,378],{},[250,377,252],{},[250,379,380],{},"Purpose",[257,382,383,392,401,411,421,431,441,451,461,471,481,491,501,511,521,531],{},[247,384,385,389],{},[262,386,387],{},[171,388,272],{},[262,390,391],{},"Full portal sync payload.",[247,393,394,398],{},[262,395,396],{},[171,397,285],{},[262,399,400],{},"Login hydrate payload.",[247,402,403,408],{},[262,404,405],{},[171,406,407],{},"org::create::success",[262,409,410],{},"Creation hydrate payload.",[247,412,413,418],{},[262,414,415],{},[171,416,417],{},"org::create::failure",[262,419,420],{},"Creation validation or server failure.",[247,422,423,428],{},[262,424,425],{},[171,426,427],{},"org::disband::success",[262,429,430],{},"Requester disband success.",[247,432,433,438],{},[262,434,435],{},[171,436,437],{},"org::disband::failure",[262,439,440],{},"Disband failure.",[247,442,443,448],{},[262,444,445],{},[171,446,447],{},"org::portal::revoked",[262,449,450],{},"Portal state revoked by someone else's disband action.",[247,452,453,458],{},[262,454,455],{},[171,456,457],{},"org::leave::success",[262,459,460],{},"Leave success.",[247,462,463,468],{},[262,464,465],{},[171,466,467],{},"org::leave::failure",[262,469,470],{},"Leave failure.",[247,472,473,478],{},[262,474,475],{},[171,476,477],{},"org::credit::success",[262,479,480],{},"Credit-line request success.",[247,482,483,488],{},[262,484,485],{},[171,486,487],{},"org::credit::failure",[262,489,490],{},"Credit-line request failure.",[247,492,493,498],{},[262,494,495],{},[171,496,497],{},"org::member::creditUpdated",[262,499,500],{},"Targeted member credit-line patch.",[247,502,503,508],{},[262,504,505],{},[171,506,507],{},"org::invite::success",[262,509,510],{},"Invite success.",[247,512,513,518],{},[262,514,515],{},[171,516,517],{},"org::invite::failure",[262,519,520],{},"Invite failure.",[247,522,523,528],{},[262,524,525],{},[171,526,527],{},"org::invite::decision::success",[262,529,530],{},"Invite accept\u002Fdecline success.",[247,532,533,538],{},[262,534,535],{},[171,536,537],{},"org::invite::decision::failure",[262,539,540],{},"Invite accept\u002Fdecline failure.",[159,542,544],{"id":543},"request-examples","Request Examples",[155,546,547],{},"Create organization request payload:",[164,549,553],{"className":550,"code":551,"language":552,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"orgName\": \"Example Logistics\"\n}\n","json",[171,554,555,561,587],{"__ignoreMap":169},[174,556,557],{"class":176,"line":177},[174,558,560],{"class":559},"sMK4o","{\n",[174,562,564,567,571,574,577,580,584],{"class":176,"line":563},2,[174,565,566],{"class":559}," \"",[174,568,570],{"class":569},"spNyl","orgName",[174,572,573],{"class":559},"\"",[174,575,576],{"class":559},":",[174,578,579],{"class":559}," \"",[174,581,583],{"class":582},"sfazB","Example Logistics",[174,585,586],{"class":559},"\"\n",[174,588,590],{"class":176,"line":589},3,[174,591,592],{"class":559},"}\n",[155,594,595],{},"Credit-line request payload:",[164,597,599],{"className":550,"code":598,"language":552,"meta":169,"style":169},"{\n \"memberUid\": \"76561198000000000\",\n \"memberName\": \"Player Name\",\n \"amount\": 2500\n}\n",[171,600,601,605,626,646,662],{"__ignoreMap":169},[174,602,603],{"class":176,"line":177},[174,604,560],{"class":559},[174,606,607,609,612,614,616,618,621,623],{"class":176,"line":563},[174,608,566],{"class":559},[174,610,611],{"class":569},"memberUid",[174,613,573],{"class":559},[174,615,576],{"class":559},[174,617,579],{"class":559},[174,619,620],{"class":582},"76561198000000000",[174,622,573],{"class":559},[174,624,625],{"class":559},",\n",[174,627,628,630,633,635,637,639,642,644],{"class":176,"line":589},[174,629,566],{"class":559},[174,631,632],{"class":569},"memberName",[174,634,573],{"class":559},[174,636,576],{"class":559},[174,638,579],{"class":559},[174,640,641],{"class":582},"Player Name",[174,643,573],{"class":559},[174,645,625],{"class":559},[174,647,649,651,654,656,658],{"class":176,"line":648},4,[174,650,566],{"class":559},[174,652,653],{"class":569},"amount",[174,655,573],{"class":559},[174,657,576],{"class":559},[174,659,661],{"class":660},"sbssI"," 2500\n",[174,663,665],{"class":176,"line":664},5,[174,666,592],{"class":559},[155,668,669],{},"Invite request payload:",[164,671,673],{"className":550,"code":672,"language":552,"meta":169,"style":169},"{\n \"targetUid\": \"76561198000000000\",\n \"targetName\": \"Player Name\"\n}\n",[171,674,675,679,698,715],{"__ignoreMap":169},[174,676,677],{"class":176,"line":177},[174,678,560],{"class":559},[174,680,681,683,686,688,690,692,694,696],{"class":176,"line":563},[174,682,566],{"class":559},[174,684,685],{"class":569},"targetUid",[174,687,573],{"class":559},[174,689,576],{"class":559},[174,691,579],{"class":559},[174,693,620],{"class":582},[174,695,573],{"class":559},[174,697,625],{"class":559},[174,699,700,702,705,707,709,711,713],{"class":176,"line":589},[174,701,566],{"class":559},[174,703,704],{"class":569},"targetName",[174,706,573],{"class":559},[174,708,576],{"class":559},[174,710,579],{"class":559},[174,712,641],{"class":582},[174,714,586],{"class":559},[174,716,717],{"class":176,"line":648},[174,718,592],{"class":559},[159,720,722],{"id":721},"authoritative-state","Authoritative State",[155,724,725],{},"Organization funds, reputation, membership, invites, credit lines, assets,\nfleet, and persistence are server-owned. The client portal only displays and\nrequests changes.",[159,727,729],{"id":728},"related-guides","Related Guides",[212,731,732,737,741,745],{},[215,733,734],{},[735,736,81],"a",{"href":82},[215,738,739],{},[735,740,113],{"href":114},[215,742,743],{},[735,744,121],{"href":122},[215,746,747],{},[735,748,109],{"href":110},[750,751,752],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":169,"searchDepth":563,"depth":563,"links":754},[755,756,757,758,759,760,761],{"id":161,"depth":563,"text":162},{"id":197,"depth":563,"text":198},{"id":238,"depth":563,"text":239},{"id":368,"depth":563,"text":369},{"id":543,"depth":563,"text":544},{"id":721,"depth":563,"text":722},{"id":728,"depth":563,"text":729},"md",null,{},true,{"title":141,"description":157},"55er24PBmMaI2LQjtirzxJhMPRLdoX0WEvJjQx-Ptgc",[769,763],{"title":137,"path":138,"stem":139,"description":770,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/phone.html b/docus/dist/client-addons/phone.html new file mode 100644 index 0000000..cdfe2c8 --- /dev/null +++ b/docus/dist/client-addons/phone.html @@ -0,0 +1,115 @@ +Client Phone Usage Guide - forge-docus
Client Addons

Client Phone Usage Guide

The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms.

Client Phone Usage Guide

The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms.

Open Phone UI

call forge_client_phone_fnc_openUI;
+

The phone UI creates RscPhone, loads ui/_site/index.html, and routes +browser alerts through forge_client_phone_fnc_handleUIEvents.

State Ownership

Contacts, messages, and emails are server-owned and requested through the +server phone addon.

Local utility app state is stored in profileNamespace:

  • notes
  • calendar events
  • world clocks
  • alarms
  • theme/preferences

Phone Class

forge_client_phone_fnc_initClass creates GVAR(PhoneClass).

The phone class currently owns local notes, events, and settings helpers. +Contacts, messages, and emails continue to use server-backed request/response +events.

Browser Events

Session and Preferences

EventClient behavior
phone::get::playerSend player UID to browser with setPlayerUid.
phone::get::themeSend saved light/dark theme to browser.
phone::set::themeSave theme preference to profileNamespace.

Contacts

EventClient behavior
phone::get::contactsLoad cached contacts and request server refresh.
phone::refresh::contactsRequest contacts from server.
phone::add::contactAdd contact by phone number.
phone::add::contact::by::phoneAdd contact by phone number.
phone::add::contact::by::emailAdd contact by email.
phone::remove::contactRemove contact by UID.

Messages

EventClient behavior
phone::get::messagesRequest messages from server.
phone::get::message::threadRequest thread with another UID.
phone::send::messageSend SMS through server.
phone::mark::message::readMark message read on server.
phone::delete::messageDelete message on server.

Email

EventClient behavior
phone::get::emailsRequest emails from server.
phone::send::emailSend email through server.
phone::mark::email::readMark email read on server.
phone::delete::emailDelete email on server.

Local Utility Apps

EventClient behavior
phone::get::notesLoad local notes.
phone::save::noteSave local note.
phone::delete::noteDelete local note.
phone::get::eventsLoad local calendar events.
phone::save::eventSave local calendar event.
phone::delete::eventDelete local calendar event.
phone::get::clocksLoad local world clocks.
phone::save::clockSave local world clock.
phone::delete::clockDelete local world clock.
phone::get::alarmsLoad local alarms.
phone::save::alarmSave local alarm.
phone::delete::alarmDelete local alarm.
phone::toggle::alarmToggle local alarm enabled state.

Usage Rules

  • Send contact, message, and email mutations to the server phone addon.
  • Keep local-only utility apps in profileNamespace until they are migrated to +server-backed storage.
  • Do not treat local phone utility state as shared multiplayer state.
  • Validate required UID, phone, email, subject, and message fields before +sending server requests.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/phone/_payload.json b/docus/dist/client-addons/phone/_payload.json new file mode 100644 index 0000000..eb674c2 --- /dev/null +++ b/docus/dist/client-addons/phone/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-phone":145,"-client-addons-phone-surround":713},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":105,"body":147,"description":157,"extension":707,"links":708,"meta":709,"navigation":710,"path":106,"seo":711,"stem":107,"__hash__":712},"docs\u002F4.client-addons\u002F10.phone.md",{"type":148,"value":149,"toc":691},"minimark",[150,154,158,163,180,195,199,202,209,228,232,241,244,248,253,308,312,383,387,449,453,505,509,651,655,672,676,687],[151,152,105],"h1",{"id":153},"client-phone-usage-guide",[155,156,157],"p",{},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",[159,160,162],"h2",{"id":161},"open-phone-ui","Open Phone UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_phone_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The phone UI creates ",[171,184,185],{},"RscPhone",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_phone_fnc_handleUIEvents",".",[159,196,198],{"id":197},"state-ownership","State Ownership",[155,200,201],{},"Contacts, messages, and emails are server-owned and requested through the\nserver phone addon.",[155,203,204,205,208],{},"Local utility app state is stored in ",[171,206,207],{},"profileNamespace",":",[210,211,212,216,219,222,225],"ul",{},[213,214,215],"li",{},"notes",[213,217,218],{},"calendar events",[213,220,221],{},"world clocks",[213,223,224],{},"alarms",[213,226,227],{},"theme\u002Fpreferences",[159,229,231],{"id":230},"phone-class","Phone Class",[155,233,234,237,238,194],{},[171,235,236],{},"forge_client_phone_fnc_initClass"," creates ",[171,239,240],{},"GVAR(PhoneClass)",[155,242,243],{},"The phone class currently owns local notes, events, and settings helpers.\nContacts, messages, and emails continue to use server-backed request\u002Fresponse\nevents.",[159,245,247],{"id":246},"browser-events","Browser Events",[249,250,252],"h3",{"id":251},"session-and-preferences","Session and Preferences",[254,255,256,269],"table",{},[257,258,259],"thead",{},[260,261,262,266],"tr",{},[263,264,265],"th",{},"Event",[263,267,268],{},"Client behavior",[270,271,272,286,296],"tbody",{},[260,273,274,280],{},[275,276,277],"td",{},[171,278,279],{},"phone::get::player",[275,281,282,283,194],{},"Send player UID to browser with ",[171,284,285],{},"setPlayerUid",[260,287,288,293],{},[275,289,290],{},[171,291,292],{},"phone::get::theme",[275,294,295],{},"Send saved light\u002Fdark theme to browser.",[260,297,298,303],{},[275,299,300],{},[171,301,302],{},"phone::set::theme",[275,304,305,306,194],{},"Save theme preference to ",[171,307,207],{},[249,309,311],{"id":310},"contacts","Contacts",[254,313,314,322],{},[257,315,316],{},[260,317,318,320],{},[263,319,265],{},[263,321,268],{},[270,323,324,334,344,354,363,373],{},[260,325,326,331],{},[275,327,328],{},[171,329,330],{},"phone::get::contacts",[275,332,333],{},"Load cached contacts and request server refresh.",[260,335,336,341],{},[275,337,338],{},[171,339,340],{},"phone::refresh::contacts",[275,342,343],{},"Request contacts from server.",[260,345,346,351],{},[275,347,348],{},[171,349,350],{},"phone::add::contact",[275,352,353],{},"Add contact by phone number.",[260,355,356,361],{},[275,357,358],{},[171,359,360],{},"phone::add::contact::by::phone",[275,362,353],{},[260,364,365,370],{},[275,366,367],{},[171,368,369],{},"phone::add::contact::by::email",[275,371,372],{},"Add contact by email.",[260,374,375,380],{},[275,376,377],{},[171,378,379],{},"phone::remove::contact",[275,381,382],{},"Remove contact by UID.",[249,384,386],{"id":385},"messages","Messages",[254,388,389,397],{},[257,390,391],{},[260,392,393,395],{},[263,394,265],{},[263,396,268],{},[270,398,399,409,419,429,439],{},[260,400,401,406],{},[275,402,403],{},[171,404,405],{},"phone::get::messages",[275,407,408],{},"Request messages from server.",[260,410,411,416],{},[275,412,413],{},[171,414,415],{},"phone::get::message::thread",[275,417,418],{},"Request thread with another UID.",[260,420,421,426],{},[275,422,423],{},[171,424,425],{},"phone::send::message",[275,427,428],{},"Send SMS through server.",[260,430,431,436],{},[275,432,433],{},[171,434,435],{},"phone::mark::message::read",[275,437,438],{},"Mark message read on server.",[260,440,441,446],{},[275,442,443],{},[171,444,445],{},"phone::delete::message",[275,447,448],{},"Delete message on server.",[249,450,452],{"id":451},"email","Email",[254,454,455,463],{},[257,456,457],{},[260,458,459,461],{},[263,460,265],{},[263,462,268],{},[270,464,465,475,485,495],{},[260,466,467,472],{},[275,468,469],{},[171,470,471],{},"phone::get::emails",[275,473,474],{},"Request emails from server.",[260,476,477,482],{},[275,478,479],{},[171,480,481],{},"phone::send::email",[275,483,484],{},"Send email through server.",[260,486,487,492],{},[275,488,489],{},[171,490,491],{},"phone::mark::email::read",[275,493,494],{},"Mark email read on server.",[260,496,497,502],{},[275,498,499],{},[171,500,501],{},"phone::delete::email",[275,503,504],{},"Delete email on server.",[249,506,508],{"id":507},"local-utility-apps","Local Utility Apps",[254,510,511,519],{},[257,512,513],{},[260,514,515,517],{},[263,516,265],{},[263,518,268],{},[270,520,521,531,541,551,561,571,581,591,601,611,621,631,641],{},[260,522,523,528],{},[275,524,525],{},[171,526,527],{},"phone::get::notes",[275,529,530],{},"Load local notes.",[260,532,533,538],{},[275,534,535],{},[171,536,537],{},"phone::save::note",[275,539,540],{},"Save local note.",[260,542,543,548],{},[275,544,545],{},[171,546,547],{},"phone::delete::note",[275,549,550],{},"Delete local note.",[260,552,553,558],{},[275,554,555],{},[171,556,557],{},"phone::get::events",[275,559,560],{},"Load local calendar events.",[260,562,563,568],{},[275,564,565],{},[171,566,567],{},"phone::save::event",[275,569,570],{},"Save local calendar event.",[260,572,573,578],{},[275,574,575],{},[171,576,577],{},"phone::delete::event",[275,579,580],{},"Delete local calendar event.",[260,582,583,588],{},[275,584,585],{},[171,586,587],{},"phone::get::clocks",[275,589,590],{},"Load local world clocks.",[260,592,593,598],{},[275,594,595],{},[171,596,597],{},"phone::save::clock",[275,599,600],{},"Save local world clock.",[260,602,603,608],{},[275,604,605],{},[171,606,607],{},"phone::delete::clock",[275,609,610],{},"Delete local world clock.",[260,612,613,618],{},[275,614,615],{},[171,616,617],{},"phone::get::alarms",[275,619,620],{},"Load local alarms.",[260,622,623,628],{},[275,624,625],{},[171,626,627],{},"phone::save::alarm",[275,629,630],{},"Save local alarm.",[260,632,633,638],{},[275,634,635],{},[171,636,637],{},"phone::delete::alarm",[275,639,640],{},"Delete local alarm.",[260,642,643,648],{},[275,644,645],{},[171,646,647],{},"phone::toggle::alarm",[275,649,650],{},"Toggle local alarm enabled state.",[159,652,654],{"id":653},"usage-rules","Usage Rules",[210,656,657,660,666,669],{},[213,658,659],{},"Send contact, message, and email mutations to the server phone addon.",[213,661,662,663,665],{},"Keep local-only utility apps in ",[171,664,207],{}," until they are migrated to\nserver-backed storage.",[213,667,668],{},"Do not treat local phone utility state as shared multiplayer state.",[213,670,671],{},"Validate required UID, phone, email, subject, and message fields before\nsending server requests.",[159,673,675],{"id":674},"related-guides","Related Guides",[210,677,678,683],{},[213,679,680],{},[681,682,89],"a",{"href":90},[213,684,685],{},[681,686,137],{"href":138},[688,689,690],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":692,"depth":692,"links":693},2,[694,695,696,697,705,706],{"id":161,"depth":692,"text":162},{"id":197,"depth":692,"text":198},{"id":230,"depth":692,"text":231},{"id":246,"depth":692,"text":247,"children":698},[699,701,702,703,704],{"id":251,"depth":700,"text":252},3,{"id":310,"depth":700,"text":311},{"id":385,"depth":700,"text":386},{"id":451,"depth":700,"text":452},{"id":507,"depth":700,"text":508},{"id":653,"depth":692,"text":654},{"id":674,"depth":692,"text":675},"md",null,{},true,{"title":105,"description":157},"0NTtS9Y0Ou2ZP0DjQSKm3TT1mcZwqsRjnA5q7p__qdo",[714,716],{"title":101,"path":102,"stem":103,"description":715,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",{"title":109,"path":110,"stem":111,"description":717,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/store.html b/docus/dist/client-addons/store.html new file mode 100644 index 0000000..93ca4a5 --- /dev/null +++ b/docus/dist/client-addons/store.html @@ -0,0 +1,122 @@ +Client Store Usage Guide - forge-docus
Client Addons

Client Store Usage Guide

The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests.

Client Store Usage Guide

The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests.

Open Store UI

call forge_client_store_fnc_openUI;
+

The UI opens RscStore, loads ui/_site/index.html, and routes browser alerts +through forge_client_store_fnc_handleUIEvents.

Bridge

forge_client_store_fnc_initUIBridge owns:

  • browser control lookup
  • store hydrate requests
  • category requests
  • checkout requests
  • category hydrate/failure responses
  • checkout success/failure responses
  • store config refresh after successful checkout

Store currently uses its own StoreUIBridge.receive(...) browser bridge rather +than the shared ForgeBridge.receive(...) delivery used by newer bridges.

Browser Events

EventClient behavior
store::readyRequest store hydrate from the server.
store::category::requestRequest catalog items for a category.
store::checkout::requestForward checkout JSON to the server.
store::closeClose the display.

Browser Response Events

EventPurpose
store::hydrateInitial storefront/session/config payload.
store::config::hydrateRefreshed payment/source config.
store::category::hydrateCategory catalog payload.
store::category::failureCategory request failure.
store::checkout::successCheckout success payload.
store::checkout::failureCheckout failure payload.

Category Requests

Category requests require a non-empty category value.

{
+  "category": "weapons"
+}
+

The client lowercases the category before forwarding it to the server store +addon.

Checkout Requests

Checkout requests send a serialized checkout payload:

{
+  "checkoutJson": "{\"items\":[],\"paymentSource\":\"cash\"}"
+}
+

The client only forwards the checkout data. The server store addon and +extension validate prices, inventory grants, payment source authorization, and +integration with bank, organization, locker, and garage state.

After a successful checkout, the client asks the server for a fresh store config +payload so payment-source balances and permissions stay current.

Authoritative State

Catalog data, prices, checkout validation, money movement, organization funds, +credit lines, locker grants, garage grants, and persistence are server-owned.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/client-addons/store/_payload.json b/docus/dist/client-addons/store/_payload.json new file mode 100644 index 0000000..0f447f5 --- /dev/null +++ b/docus/dist/client-addons/store/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":571},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-store":145,"-client-addons-store-surround":566},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":109,"body":147,"description":157,"extension":560,"links":561,"meta":562,"navigation":563,"path":110,"seo":564,"stem":111,"__hash__":565},"docs\u002F4.client-addons\u002F11.store.md",{"type":148,"value":149,"toc":550},"minimark",[150,154,158,163,180,195,199,205,230,241,245,305,309,382,386,389,434,437,441,444,506,509,512,516,519,523,546],[151,152,109],"h1",{"id":153},"client-store-usage-guide",[155,156,157],"p",{},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",[159,160,162],"h2",{"id":161},"open-store-ui","Open Store UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_store_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscStore",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_store_fnc_handleUIEvents",".",[159,196,198],{"id":197},"bridge","Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_store_fnc_initUIBridge"," owns:",[206,207,208,212,215,218,221,224,227],"ul",{},[209,210,211],"li",{},"browser control lookup",[209,213,214],{},"store hydrate requests",[209,216,217],{},"category requests",[209,219,220],{},"checkout requests",[209,222,223],{},"category hydrate\u002Ffailure responses",[209,225,226],{},"checkout success\u002Ffailure responses",[209,228,229],{},"store config refresh after successful checkout",[155,231,232,233,236,237,240],{},"Store currently uses its own ",[171,234,235],{},"StoreUIBridge.receive(...)"," browser bridge rather\nthan the shared ",[171,238,239],{},"ForgeBridge.receive(...)"," delivery used by newer bridges.",[159,242,244],{"id":243},"browser-events","Browser Events",[246,247,248,261],"table",{},[249,250,251],"thead",{},[252,253,254,258],"tr",{},[255,256,257],"th",{},"Event",[255,259,260],{},"Client behavior",[262,263,264,275,285,295],"tbody",{},[252,265,266,272],{},[267,268,269],"td",{},[171,270,271],{},"store::ready",[267,273,274],{},"Request store hydrate from the server.",[252,276,277,282],{},[267,278,279],{},[171,280,281],{},"store::category::request",[267,283,284],{},"Request catalog items for a category.",[252,286,287,292],{},[267,288,289],{},[171,290,291],{},"store::checkout::request",[267,293,294],{},"Forward checkout JSON to the server.",[252,296,297,302],{},[267,298,299],{},[171,300,301],{},"store::close",[267,303,304],{},"Close the display.",[159,306,308],{"id":307},"browser-response-events","Browser Response Events",[246,310,311,320],{},[249,312,313],{},[252,314,315,317],{},[255,316,257],{},[255,318,319],{},"Purpose",[262,321,322,332,342,352,362,372],{},[252,323,324,329],{},[267,325,326],{},[171,327,328],{},"store::hydrate",[267,330,331],{},"Initial storefront\u002Fsession\u002Fconfig payload.",[252,333,334,339],{},[267,335,336],{},[171,337,338],{},"store::config::hydrate",[267,340,341],{},"Refreshed payment\u002Fsource config.",[252,343,344,349],{},[267,345,346],{},[171,347,348],{},"store::category::hydrate",[267,350,351],{},"Category catalog payload.",[252,353,354,359],{},[267,355,356],{},[171,357,358],{},"store::category::failure",[267,360,361],{},"Category request failure.",[252,363,364,369],{},[267,365,366],{},[171,367,368],{},"store::checkout::success",[267,370,371],{},"Checkout success payload.",[252,373,374,379],{},[267,375,376],{},[171,377,378],{},"store::checkout::failure",[267,380,381],{},"Checkout failure payload.",[159,383,385],{"id":384},"category-requests","Category Requests",[155,387,388],{},"Category requests require a non-empty category value.",[164,390,394],{"className":391,"code":392,"language":393,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"category\": \"weapons\"\n}\n","json",[171,395,396,402,428],{"__ignoreMap":169},[174,397,398],{"class":176,"line":177},[174,399,401],{"class":400},"sMK4o","{\n",[174,403,405,408,412,415,418,421,425],{"class":176,"line":404},2,[174,406,407],{"class":400}," \"",[174,409,411],{"class":410},"spNyl","category",[174,413,414],{"class":400},"\"",[174,416,417],{"class":400},":",[174,419,420],{"class":400}," \"",[174,422,424],{"class":423},"sfazB","weapons",[174,426,427],{"class":400},"\"\n",[174,429,431],{"class":176,"line":430},3,[174,432,433],{"class":400},"}\n",[155,435,436],{},"The client lowercases the category before forwarding it to the server store\naddon.",[159,438,440],{"id":439},"checkout-requests","Checkout Requests",[155,442,443],{},"Checkout requests send a serialized checkout payload:",[164,445,447],{"className":391,"code":446,"language":393,"meta":169,"style":169},"{\n \"checkoutJson\": \"{\\\"items\\\":[],\\\"paymentSource\\\":\\\"cash\\\"}\"\n}\n",[171,448,449,453,502],{"__ignoreMap":169},[174,450,451],{"class":176,"line":177},[174,452,401],{"class":400},[174,454,455,457,460,462,464,466,469,473,476,478,481,483,486,488,490,492,495,497,500],{"class":176,"line":404},[174,456,407],{"class":400},[174,458,459],{"class":410},"checkoutJson",[174,461,414],{"class":400},[174,463,417],{"class":400},[174,465,420],{"class":400},[174,467,468],{"class":423},"{",[174,470,472],{"class":471},"sTEyZ","\\\"",[174,474,475],{"class":423},"items",[174,477,472],{"class":471},[174,479,480],{"class":423},":[],",[174,482,472],{"class":471},[174,484,485],{"class":423},"paymentSource",[174,487,472],{"class":471},[174,489,417],{"class":423},[174,491,472],{"class":471},[174,493,494],{"class":423},"cash",[174,496,472],{"class":471},[174,498,499],{"class":423},"}",[174,501,427],{"class":400},[174,503,504],{"class":176,"line":430},[174,505,433],{"class":400},[155,507,508],{},"The client only forwards the checkout data. The server store addon and\nextension validate prices, inventory grants, payment source authorization, and\nintegration with bank, organization, locker, and garage state.",[155,510,511],{},"After a successful checkout, the client asks the server for a fresh store config\npayload so payment-source balances and permissions stay current.",[159,513,515],{"id":514},"authoritative-state","Authoritative State",[155,517,518],{},"Catalog data, prices, checkout validation, money movement, organization funds,\ncredit lines, locker grants, garage grants, and persistence are server-owned.",[159,520,522],{"id":521},"related-guides","Related Guides",[206,524,525,530,534,538,542],{},[209,526,527],{},[528,529,53],"a",{"href":54},[209,531,532],{},[528,533,121],{"href":122},[209,535,536],{},[528,537,141],{"href":142},[209,539,540],{},[528,541,133],{"href":134},[209,543,544],{},[528,545,129],{"href":130},[547,548,549],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":169,"searchDepth":404,"depth":404,"links":551},[552,553,554,555,556,557,558,559],{"id":161,"depth":404,"text":162},{"id":197,"depth":404,"text":198},{"id":243,"depth":404,"text":244},{"id":307,"depth":404,"text":308},{"id":384,"depth":404,"text":385},{"id":439,"depth":404,"text":440},{"id":514,"depth":404,"text":515},{"id":521,"depth":404,"text":522},"md",null,{},true,{"title":109,"description":157},"_8o4h6aY-FR4MYNv4DJEbZDm0AHB3KRAnI2hPi2cCII",[567,569],{"title":105,"path":106,"stem":107,"description":568,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",{"title":113,"path":114,"stem":115,"description":570,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started.html b/docus/dist/getting-started.html new file mode 100644 index 0000000..6ca6042 --- /dev/null +++ b/docus/dist/getting-started.html @@ -0,0 +1,104 @@ +Getting Started - forge-docus
Getting Started

Getting Started

Use this section as the main entry point for the Forge framework.

Getting Started

Use this section as the main entry point for the Forge framework.

Forge combines:

  • Arma 3 client addons for UX and browser-hosted interfaces
  • Arma 3 server addons for mission integration and authoritative flow control
  • a Rust server extension for command routing and persistence
  • shared Rust crates for models, repositories, and services
  • SurrealDB for durable storage

Common Commands

cargo test
+npm run build:webui
+.\build-arma.ps1
+

Start Here

Architecture
Understand how SQF, Rust services, SurrealDB, and browser UIs fit together.
Module Reference
Review gameplay domains, infrastructure modules, and extension command groups.
Development Guide
See the rules for adding modules and changing boundaries without regressions.
SurrealDB Setup
Install SurrealDB, match Forge config values, and choose the right setup path +for developers or admin-facing roles.
Server Extension
Follow the extension architecture, API surface, and SQF usage examples.
Server Modules
Dive into the actor, bank, CAD, garage, locker, organization, phone, store, +task, and owned-storage guides.
Client Addons
Explore the client bridge model and addon-specific browser integration rules.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/getting-started/_payload.json b/docus/dist/getting-started/_payload.json new file mode 100644 index 0000000..a472a5c --- /dev/null +++ b/docus/dist/getting-started/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"navigation_docs":3,"-getting-started":145,"-getting-started-surround":265},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":5,"body":147,"description":157,"extension":259,"links":260,"meta":261,"navigation":262,"path":6,"seo":263,"stem":7,"__hash__":264},"docs\u002F1.getting-started\u002F0.index.md",{"type":148,"value":149,"toc":255},"minimark",[150,154,158,161,180,185,215,219,251],[151,152,5],"h1",{"id":153},"getting-started",[155,156,157],"p",{},"Use this section as the main entry point for the Forge framework.",[155,159,160],{},"Forge combines:",[162,163,164,168,171,174,177],"ul",{},[165,166,167],"li",{},"Arma 3 client addons for UX and browser-hosted interfaces",[165,169,170],{},"Arma 3 server addons for mission integration and authoritative flow control",[165,172,173],{},"a Rust server extension for command routing and persistence",[165,175,176],{},"shared Rust crates for models, repositories, and services",[165,178,179],{},"SurrealDB for durable storage",[181,182,184],"h2",{"id":183},"common-commands","Common Commands",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo test\nnpm run build:webui\n.\\build-arma.ps1\n","powershell","",[193,194,195,203,209],"code",{"__ignoreMap":191},[196,197,200],"span",{"class":198,"line":199},"line",1,[196,201,202],{},"cargo test\n",[196,204,206],{"class":198,"line":205},2,[196,207,208],{},"npm run build:webui\n",[196,210,212],{"class":198,"line":211},3,[196,213,214],{},".\\build-arma.ps1\n",[181,216,218],{"id":217},"start-here","Start Here",[220,221,222,228,232,236,240,245,248],"u-page-grid",{},[223,224,227],"u-page-card",{"icon":225,"title":226,"to":12},"i-lucide-network","Architecture","Understand how SQF, Rust services, SurrealDB, and browser UIs fit together.",[223,229,231],{"icon":230,"title":15,"to":16},"i-lucide-boxes","Review gameplay domains, infrastructure modules, and extension command groups.",[223,233,235],{"icon":234,"title":19,"to":20},"i-lucide-wrench","See the rules for adding modules and changing boundaries without regressions.",[223,237,239],{"icon":238,"title":23,"to":24},"i-lucide-database","Install SurrealDB, match Forge config values, and choose the right setup path\nfor developers or admin-facing roles.",[223,241,244],{"icon":242,"title":243,"to":29},"i-lucide-server-cog","Server Extension","Follow the extension architecture, API surface, and SQF usage examples.",[223,246,247],{"icon":92,"title":42,"to":43},"Dive into the actor, bank, CAD, garage, locker, organization, phone, store,\ntask, and owned-storage guides.",[223,249,250],{"icon":144,"title":94,"to":95},"Explore the client bridge model and addon-specific browser integration rules.",[252,253,254],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":205,"depth":205,"links":256},[257,258],{"id":183,"depth":205,"text":184},{"id":217,"depth":205,"text":218},"md",null,{},true,{"title":5,"description":157},"S3Xe9nM8bUIoSC2wMWB6DiA3AF4Pcfw7DxQNTkDDSbc",[260,266],{"title":11,"path":12,"stem":13,"description":267,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",1776806627034] \ No newline at end of file diff --git a/docus/dist/getting-started/architecture.html b/docus/dist/getting-started/architecture.html new file mode 100644 index 0000000..136a2ba --- /dev/null +++ b/docus/dist/getting-started/architecture.html @@ -0,0 +1,154 @@ +Framework Architecture - forge-docus
Getting Started

Framework Architecture

Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI.

Framework Architecture

Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI.

Runtime Flow

Arma client UI or SQF action
+  -> client addon bridge
+  -> server addon function
+  -> forge_server callExtension command
+  -> extension command group
+  -> forge-services domain service
+  -> forge-repositories trait
+  -> SurrealDB repository implementation
+  -> SurrealDB
+

For small payloads, server SQF calls forge_server directly through the +extension bridge. For large payloads, arma/server/addons/extension stages +request and response chunks through the extension transport module.

Main Layers

Client Addons

Client addons live under arma/client/addons. They own local player UX, +keybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs +durable or authoritative state, it routes work to the matching server addon +instead of touching persistence directly.

Server Addons

Server addons live under arma/server/addons. They own server-side SQF +initialization, game-object integration, validation near the Arma runtime, and +calls into the Rust extension. The extension addon is the shared bridge for +callExtension and transport handling.

Rust Extension

The server extension lives under arma/server/extension. It registers the +forge_server command groups, loads configuration, initializes SurrealDB, and +maps SQF command inputs into service calls.

The extension should stay thin:

  • Parse and validate command arguments that arrive from SQF.
  • Resolve Arma-specific context such as player UID when required.
  • Call the matching service.
  • Serialize the service result back to JSON or a simple string.

Shared Rust Crates

The lib workspace contains reusable Rust crates:

  • forge-models: shared domain structs and serialization rules.
  • forge-repositories: storage-agnostic repository traits and in-memory +implementations used by tests and hot-state services.
  • forge-services: domain behavior, validation, and mutation workflows.
  • forge-shared: cross-crate helpers.

Persistence

Durable storage is SurrealDB. Schema modules live under +arma/server/extension/src/schema, and concrete SurrealDB repository +implementations live under arma/server/extension/src/storage.

Repository traits stay in lib/repositories so service logic remains testable +without a database.

Hot State

Several domains have hot command groups. Hot state keeps a runtime copy of +frequently accessed data in memory, then saves it back to durable storage when +requested. This is useful for player state that changes often during a session.

Typical hot-state flow:

actor:hot:init
+actor:hot:get
+actor:hot:override
+actor:hot:save
+actor:hot:remove
+

Use hot state for session workflows. Use normal domain commands for direct +durable CRUD operations.

Transport Layer

The transport layer exists because Arma extension calls have practical payload +size limits. It provides chunked request and response handling while still +routing to the same domain command groups.

Common direct command:

"forge_server" callExtension ["status", []];
+

Common transport path:

server addon fnc_extCall
+  -> transport:request:append
+  -> transport:invoke_stored
+  -> transport:response:get
+

Configuration

The server extension reads config.toml next to the extension DLL. The current +persistence section is:

[surreal]
+endpoint = "127.0.0.1:8000"
+namespace = "forge"
+database = "main"
+username = "root"
+password = "root"
+connect_timeout_ms = 5000
+

For install links and role-based setup guidance, see +SurrealDB Setup.

Check persistence readiness before issuing commands that require storage:

"forge_server" callExtension ["status", []];
+"forge_server" callExtension ["surreal:status", []];
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/getting-started/architecture/_payload.json b/docus/dist/getting-started/architecture/_payload.json new file mode 100644 index 0000000..84d64c4 --- /dev/null +++ b/docus/dist/getting-started/architecture/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":477},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-architecture":145,"-getting-started-architecture-surround":472},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":11,"body":147,"description":157,"extension":466,"links":467,"meta":468,"navigation":469,"path":12,"seo":470,"stem":13,"__hash__":471},"docs\u002F1.getting-started\u002F1.architecture.md",{"type":148,"value":149,"toc":453},"minimark",[150,154,158,163,174,185,189,193,200,204,219,223,233,236,252,256,263,289,293,304,311,315,322,325,331,334,338,341,344,358,361,367,371,378,426,432,435,449],[151,152,11],"h1",{"id":153},"framework-architecture",[155,156,157],"p",{},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",[159,160,162],"h2",{"id":161},"runtime-flow","Runtime Flow",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","Arma client UI or SQF action\n -> client addon bridge\n -> server addon function\n -> forge_server callExtension command\n -> extension command group\n -> forge-services domain service\n -> forge-repositories trait\n -> SurrealDB repository implementation\n -> SurrealDB\n","text","",[172,173,168],"code",{"__ignoreMap":170},[155,175,176,177,180,181,184],{},"For small payloads, server SQF calls ",[172,178,179],{},"forge_server"," directly through the\nextension bridge. For large payloads, ",[172,182,183],{},"arma\u002Fserver\u002Faddons\u002Fextension"," stages\nrequest and response chunks through the extension transport module.",[159,186,188],{"id":187},"main-layers","Main Layers",[190,191,94],"h3",{"id":192},"client-addons",[155,194,195,196,199],{},"Client addons live under ",[172,197,198],{},"arma\u002Fclient\u002Faddons",". They own local player UX,\nkeybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs\ndurable or authoritative state, it routes work to the matching server addon\ninstead of touching persistence directly.",[190,201,203],{"id":202},"server-addons","Server Addons",[155,205,206,207,210,211,214,215,218],{},"Server addons live under ",[172,208,209],{},"arma\u002Fserver\u002Faddons",". They own server-side SQF\ninitialization, game-object integration, validation near the Arma runtime, and\ncalls into the Rust extension. The ",[172,212,213],{},"extension"," addon is the shared bridge for\n",[172,216,217],{},"callExtension"," and transport handling.",[190,220,222],{"id":221},"rust-extension","Rust Extension",[155,224,225,226,229,230,232],{},"The server extension lives under ",[172,227,228],{},"arma\u002Fserver\u002Fextension",". It registers the\n",[172,231,179],{}," command groups, loads configuration, initializes SurrealDB, and\nmaps SQF command inputs into service calls.",[155,234,235],{},"The extension should stay thin:",[237,238,239,243,246,249],"ul",{},[240,241,242],"li",{},"Parse and validate command arguments that arrive from SQF.",[240,244,245],{},"Resolve Arma-specific context such as player UID when required.",[240,247,248],{},"Call the matching service.",[240,250,251],{},"Serialize the service result back to JSON or a simple string.",[190,253,255],{"id":254},"shared-rust-crates","Shared Rust Crates",[155,257,258,259,262],{},"The ",[172,260,261],{},"lib"," workspace contains reusable Rust crates:",[237,264,265,271,277,283],{},[240,266,267,270],{},[172,268,269],{},"forge-models",": shared domain structs and serialization rules.",[240,272,273,276],{},[172,274,275],{},"forge-repositories",": storage-agnostic repository traits and in-memory\nimplementations used by tests and hot-state services.",[240,278,279,282],{},[172,280,281],{},"forge-services",": domain behavior, validation, and mutation workflows.",[240,284,285,288],{},[172,286,287],{},"forge-shared",": cross-crate helpers.",[190,290,292],{"id":291},"persistence","Persistence",[155,294,295,296,299,300,303],{},"Durable storage is SurrealDB. Schema modules live under\n",[172,297,298],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",", and concrete SurrealDB repository\nimplementations live under ",[172,301,302],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",".",[155,305,306,307,310],{},"Repository traits stay in ",[172,308,309],{},"lib\u002Frepositories"," so service logic remains testable\nwithout a database.",[159,312,314],{"id":313},"hot-state","Hot State",[155,316,317,318,321],{},"Several domains have ",[172,319,320],{},"hot"," command groups. Hot state keeps a runtime copy of\nfrequently accessed data in memory, then saves it back to durable storage when\nrequested. This is useful for player state that changes often during a session.",[155,323,324],{},"Typical hot-state flow:",[164,326,329],{"className":327,"code":328,"language":169,"meta":170},[167],"actor:hot:init\nactor:hot:get\nactor:hot:override\nactor:hot:save\nactor:hot:remove\n",[172,330,328],{"__ignoreMap":170},[155,332,333],{},"Use hot state for session workflows. Use normal domain commands for direct\ndurable CRUD operations.",[159,335,337],{"id":336},"transport-layer","Transport Layer",[155,339,340],{},"The transport layer exists because Arma extension calls have practical payload\nsize limits. It provides chunked request and response handling while still\nrouting to the same domain command groups.",[155,342,343],{},"Common direct command:",[164,345,349],{"className":346,"code":347,"language":348,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n","sqf",[172,350,351],{"__ignoreMap":170},[352,353,356],"span",{"class":354,"line":355},"line",1,[352,357,347],{},[155,359,360],{},"Common transport path:",[164,362,365],{"className":363,"code":364,"language":169,"meta":170},[167],"server addon fnc_extCall\n -> transport:request:append\n -> transport:invoke_stored\n -> transport:response:get\n",[172,366,364],{"__ignoreMap":170},[159,368,370],{"id":369},"configuration","Configuration",[155,372,373,374,377],{},"The server extension reads ",[172,375,376],{},"config.toml"," next to the extension DLL. The current\npersistence section is:",[164,379,383],{"className":380,"code":381,"language":382,"meta":170,"style":170},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[172,384,385,390,396,402,408,414,420],{"__ignoreMap":170},[352,386,387],{"class":354,"line":355},[352,388,389],{},"[surreal]\n",[352,391,393],{"class":354,"line":392},2,[352,394,395],{},"endpoint = \"127.0.0.1:8000\"\n",[352,397,399],{"class":354,"line":398},3,[352,400,401],{},"namespace = \"forge\"\n",[352,403,405],{"class":354,"line":404},4,[352,406,407],{},"database = \"main\"\n",[352,409,411],{"class":354,"line":410},5,[352,412,413],{},"username = \"root\"\n",[352,415,417],{"class":354,"line":416},6,[352,418,419],{},"password = \"root\"\n",[352,421,423],{"class":354,"line":422},7,[352,424,425],{},"connect_timeout_ms = 5000\n",[155,427,428,429,303],{},"For install links and role-based setup guidance, see\n",[430,431,23],"a",{"href":24},[155,433,434],{},"Check persistence readiness before issuing commands that require storage:",[164,436,438],{"className":346,"code":437,"language":348,"meta":170,"style":170},"\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n",[172,439,440,444],{"__ignoreMap":170},[352,441,442],{"class":354,"line":355},[352,443,347],{},[352,445,446],{"class":354,"line":392},[352,447,448],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[450,451,452],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":392,"depth":392,"links":454},[455,456,463,464,465],{"id":161,"depth":392,"text":162},{"id":187,"depth":392,"text":188,"children":457},[458,459,460,461,462],{"id":192,"depth":398,"text":94},{"id":202,"depth":398,"text":203},{"id":221,"depth":398,"text":222},{"id":254,"depth":398,"text":255},{"id":291,"depth":398,"text":292},{"id":313,"depth":392,"text":314},{"id":336,"depth":392,"text":337},{"id":369,"depth":392,"text":370},"md",null,{},true,{"title":11,"description":157},"iMv3ZlJLneWaY-rT4sboHwZgTUNknan2htKsPAMBaw0",[473,475],{"title":5,"path":6,"stem":7,"description":474,"children":-1},"Use this section as the main entry point for the Forge framework.",{"title":15,"path":16,"stem":17,"description":476,"children":-1},"This reference lists the main Forge modules and where each layer lives.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/development.html b/docus/dist/getting-started/development.html new file mode 100644 index 0000000..823c73f --- /dev/null +++ b/docus/dist/getting-started/development.html @@ -0,0 +1,123 @@ +Development Guide - forge-docus
Getting Started

Development Guide

This guide covers the usual path for adding or changing a Forge module.

Development Guide

This guide covers the usual path for adding or changing a Forge module.

Local Checks

Before running storage-backed workflows locally, complete +SurrealDB Setup.

Run these before pushing Rust or extension changes:

cargo fmt --check
+cargo check
+cargo test
+cargo build
+cargo clippy --all-targets --all-features -- -D warnings
+

Run this after changing browser UI sources:

npm run build:webui
+

Build Arma packages with:

.\build-arma.ps1
+

Module Boundaries

Keep each layer responsible for one kind of work:

LayerOwnsAvoid
lib/modelsData structures, serde defaults, validation helpers.Database calls, SQF-specific context.
lib/repositoriesRepository traits and in-memory stores.SurrealDB-specific code.
lib/servicesBusiness rules, workflow orchestration, structured results.Arma engine calls, extension transport details.
arma/server/extensionCommand parsing, context resolution, SurrealDB implementations, serialization to SQF.Business rules that belong in services.
arma/server/addonsServer SQF lifecycle, game-object integration, calls into forge_server.Direct database logic.
arma/client/addonsClient UI, keybinds, local UI events.Authoritative persistence.

Adding a Domain Module

  1. Add the model in lib/models/src/<module>.rs.
  2. Export the model from lib/models/src/lib.rs.
  3. Add repository traits in lib/repositories/src/<module>.rs.
  4. Add in-memory repository support if the service needs tests or hot state.
  5. Export the traits from lib/repositories/src/lib.rs.
  6. Add service logic in lib/services/src/<module>.rs.
  7. Add focused unit tests for service behavior.
  8. Export the service from lib/services/src/lib.rs.
  9. Add a SurrealDB schema module under arma/server/extension/src/schema.
  10. Add the concrete storage adapter under arma/server/extension/src/storage.
  11. Register the storage adapter in arma/server/extension/src/storage.rs.
  12. Add an extension command group under arma/server/extension/src/<module>.rs.
  13. Register the command group in arma/server/extension/src/lib.rs.
  14. Add server addon functions under arma/server/addons/<module> if SQF needs a module-level API.
  15. Add client addon or browser UI files under arma/client/addons/<module> if the module has player-facing UI.
  16. Add documentation in docs/ and module-level READMEs.

Extension Command Rules

Commands should return one of these forms:

  • JSON string for structured results.
  • "true" or "false" for simple existence and boolean operations.
  • "OK" for successful destructive operations with no response body.
  • "Error: <message>" for failures.

Prefer stable JSON shapes over ad hoc strings. SQF callers should always check +for the "Error:" prefix before parsing JSON.

Example:

private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Actor request failed: %1", _payload];
+};
+
+private _actor = fromJSON _payload;
+

Persistence Rules

SurrealDB is the durable store. Keep database-specific mapping in the extension +storage adapters, not in services or repository traits.

When changing persisted data:

  • Update or add the matching .surql schema module.
  • Update the concrete storage adapter.
  • Preserve existing records when possible through serde defaults or migration +logic.
  • Add tests at the service level for behavior, and add storage tests only when +database mapping is the risk.

Hot-State Rules

Use hot state for data that is read or mutated frequently during a player +session. Hot-state modules usually provide:

  • init to load durable state into memory.
  • get to read the runtime copy.
  • override or focused mutation commands to update the runtime copy.
  • save to write the runtime copy back to SurrealDB.
  • remove to evict the runtime copy.

Do not assume hot state is durable until save succeeds.

Web UI Rules

Browser UI source files live under each client addon. Built assets usually land +under that addon's ui/_site directory.

Use the existing common bridge in arma/client/addons/common when a UI needs +to send events back to SQF. Keep UI state and rendering in JavaScript, and keep +server-authoritative decisions in server SQF or Rust services.

Documentation Checklist

When adding or changing a module, update:

  • docs/MODULE_REFERENCE.md for framework-level inventory.
  • A module-specific README in the addon directory when SQF or UI usage changes.
  • arma/server/docs/api-reference.md when extension commands change.
  • Existing usage guides when payload shapes or workflows change.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/getting-started/development/_payload.json b/docus/dist/getting-started/development/_payload.json new file mode 100644 index 0000000..0a230b2 --- /dev/null +++ b/docus/dist/getting-started/development/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":688},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-development":145,"-getting-started-development-surround":683},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":19,"body":147,"description":157,"extension":678,"links":679,"meta":680,"navigation":517,"path":20,"seo":681,"stem":21,"__hash__":682},"docs\u002F1.getting-started\u002F3.development.md",{"type":148,"value":149,"toc":668},"minimark",[150,154,158,163,170,173,215,218,227,230,239,243,246,350,354,451,455,458,486,493,496,546,550,553,556,574,578,581,613,619,623,630,637,641,644,664],[151,152,19],"h1",{"id":153},"development-guide",[155,156,157],"p",{},"This guide covers the usual path for adding or changing a Forge module.",[159,160,162],"h2",{"id":161},"local-checks","Local Checks",[155,164,165,166,169],{},"Before running storage-backed workflows locally, complete\n",[167,168,23],"a",{"href":24},".",[155,171,172],{},"Run these before pushing Rust or extension changes:",[174,175,180],"pre",{"className":176,"code":177,"language":178,"meta":179,"style":179},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo fmt --check\ncargo check\ncargo test\ncargo build\ncargo clippy --all-targets --all-features -- -D warnings\n","powershell","",[181,182,183,191,197,203,209],"code",{"__ignoreMap":179},[184,185,188],"span",{"class":186,"line":187},"line",1,[184,189,190],{},"cargo fmt --check\n",[184,192,194],{"class":186,"line":193},2,[184,195,196],{},"cargo check\n",[184,198,200],{"class":186,"line":199},3,[184,201,202],{},"cargo test\n",[184,204,206],{"class":186,"line":205},4,[184,207,208],{},"cargo build\n",[184,210,212],{"class":186,"line":211},5,[184,213,214],{},"cargo clippy --all-targets --all-features -- -D warnings\n",[155,216,217],{},"Run this after changing browser UI sources:",[174,219,221],{"className":176,"code":220,"language":178,"meta":179,"style":179},"npm run build:webui\n",[181,222,223],{"__ignoreMap":179},[184,224,225],{"class":186,"line":187},[184,226,220],{},[155,228,229],{},"Build Arma packages with:",[174,231,233],{"className":176,"code":232,"language":178,"meta":179,"style":179},".\\build-arma.ps1\n",[181,234,235],{"__ignoreMap":179},[184,236,237],{"class":186,"line":187},[184,238,232],{},[159,240,242],{"id":241},"module-boundaries","Module Boundaries",[155,244,245],{},"Keep each layer responsible for one kind of work:",[247,248,249,265],"table",{},[250,251,252],"thead",{},[253,254,255,259,262],"tr",{},[256,257,258],"th",{},"Layer",[256,260,261],{},"Owns",[256,263,264],{},"Avoid",[266,267,268,282,295,308,321,337],"tbody",{},[253,269,270,276,279],{},[271,272,273],"td",{},[181,274,275],{},"lib\u002Fmodels",[271,277,278],{},"Data structures, serde defaults, validation helpers.",[271,280,281],{},"Database calls, SQF-specific context.",[253,283,284,289,292],{},[271,285,286],{},[181,287,288],{},"lib\u002Frepositories",[271,290,291],{},"Repository traits and in-memory stores.",[271,293,294],{},"SurrealDB-specific code.",[253,296,297,302,305],{},[271,298,299],{},[181,300,301],{},"lib\u002Fservices",[271,303,304],{},"Business rules, workflow orchestration, structured results.",[271,306,307],{},"Arma engine calls, extension transport details.",[253,309,310,315,318],{},[271,311,312],{},[181,313,314],{},"arma\u002Fserver\u002Fextension",[271,316,317],{},"Command parsing, context resolution, SurrealDB implementations, serialization to SQF.",[271,319,320],{},"Business rules that belong in services.",[253,322,323,328,334],{},[271,324,325],{},[181,326,327],{},"arma\u002Fserver\u002Faddons",[271,329,330,331,169],{},"Server SQF lifecycle, game-object integration, calls into ",[181,332,333],{},"forge_server",[271,335,336],{},"Direct database logic.",[253,338,339,344,347],{},[271,340,341],{},[181,342,343],{},"arma\u002Fclient\u002Faddons",[271,345,346],{},"Client UI, keybinds, local UI events.",[271,348,349],{},"Authoritative persistence.",[159,351,353],{"id":352},"adding-a-domain-module","Adding a Domain Module",[355,356,357,364,370,376,379,385,391,394,400,406,412,418,424,430,437,444],"ol",{},[358,359,360,361,169],"li",{},"Add the model in ",[181,362,363],{},"lib\u002Fmodels\u002Fsrc\u002F\u003Cmodule>.rs",[358,365,366,367,169],{},"Export the model from ",[181,368,369],{},"lib\u002Fmodels\u002Fsrc\u002Flib.rs",[358,371,372,373,169],{},"Add repository traits in ",[181,374,375],{},"lib\u002Frepositories\u002Fsrc\u002F\u003Cmodule>.rs",[358,377,378],{},"Add in-memory repository support if the service needs tests or hot state.",[358,380,381,382,169],{},"Export the traits from ",[181,383,384],{},"lib\u002Frepositories\u002Fsrc\u002Flib.rs",[358,386,387,388,169],{},"Add service logic in ",[181,389,390],{},"lib\u002Fservices\u002Fsrc\u002F\u003Cmodule>.rs",[358,392,393],{},"Add focused unit tests for service behavior.",[358,395,396,397,169],{},"Export the service from ",[181,398,399],{},"lib\u002Fservices\u002Fsrc\u002Flib.rs",[358,401,402,403,169],{},"Add a SurrealDB schema module under ",[181,404,405],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",[358,407,408,409,169],{},"Add the concrete storage adapter under ",[181,410,411],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",[358,413,414,415,169],{},"Register the storage adapter in ",[181,416,417],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage.rs",[358,419,420,421,169],{},"Add an extension command group under ",[181,422,423],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002F\u003Cmodule>.rs",[358,425,426,427,169],{},"Register the command group in ",[181,428,429],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Flib.rs",[358,431,432,433,436],{},"Add server addon functions under ",[181,434,435],{},"arma\u002Fserver\u002Faddons\u002F\u003Cmodule>"," if SQF needs a module-level API.",[358,438,439,440,443],{},"Add client addon or browser UI files under ",[181,441,442],{},"arma\u002Fclient\u002Faddons\u002F\u003Cmodule>"," if the module has player-facing UI.",[358,445,446,447,450],{},"Add documentation in ",[181,448,449],{},"docs\u002F"," and module-level READMEs.",[159,452,454],{"id":453},"extension-command-rules","Extension Command Rules",[155,456,457],{},"Commands should return one of these forms:",[459,460,461,464,474,480],"ul",{},[358,462,463],{},"JSON string for structured results.",[358,465,466,469,470,473],{},[181,467,468],{},"\"true\""," or ",[181,471,472],{},"\"false\""," for simple existence and boolean operations.",[358,475,476,479],{},[181,477,478],{},"\"OK\""," for successful destructive operations with no response body.",[358,481,482,485],{},[181,483,484],{},"\"Error: \u003Cmessage>\""," for failures.",[155,487,488,489,492],{},"Prefer stable JSON shapes over ad hoc strings. SQF callers should always check\nfor the ",[181,490,491],{},"\"Error:\""," prefix before parsing JSON.",[155,494,495],{},"Example:",[174,497,501],{"className":498,"code":499,"language":500,"meta":179,"style":179},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor request failed: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n","sqf",[181,502,503,508,513,519,524,529,535,540],{"__ignoreMap":179},[184,504,505],{"class":186,"line":187},[184,506,507],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[184,509,510],{"class":186,"line":193},[184,511,512],{},"private _payload = _result select 0;\n",[184,514,515],{"class":186,"line":199},[184,516,518],{"emptyLinePlaceholder":517},true,"\n",[184,520,521],{"class":186,"line":205},[184,522,523],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[184,525,526],{"class":186,"line":211},[184,527,528],{}," systemChat format [\"Actor request failed: %1\", _payload];\n",[184,530,532],{"class":186,"line":531},6,[184,533,534],{},"};\n",[184,536,538],{"class":186,"line":537},7,[184,539,518],{"emptyLinePlaceholder":517},[184,541,543],{"class":186,"line":542},8,[184,544,545],{},"private _actor = fromJSON _payload;\n",[159,547,549],{"id":548},"persistence-rules","Persistence Rules",[155,551,552],{},"SurrealDB is the durable store. Keep database-specific mapping in the extension\nstorage adapters, not in services or repository traits.",[155,554,555],{},"When changing persisted data:",[459,557,558,565,568,571],{},[358,559,560,561,564],{},"Update or add the matching ",[181,562,563],{},".surql"," schema module.",[358,566,567],{},"Update the concrete storage adapter.",[358,569,570],{},"Preserve existing records when possible through serde defaults or migration\nlogic.",[358,572,573],{},"Add tests at the service level for behavior, and add storage tests only when\ndatabase mapping is the risk.",[159,575,577],{"id":576},"hot-state-rules","Hot-State Rules",[155,579,580],{},"Use hot state for data that is read or mutated frequently during a player\nsession. Hot-state modules usually provide:",[459,582,583,589,595,601,607],{},[358,584,585,588],{},[181,586,587],{},"init"," to load durable state into memory.",[358,590,591,594],{},[181,592,593],{},"get"," to read the runtime copy.",[358,596,597,600],{},[181,598,599],{},"override"," or focused mutation commands to update the runtime copy.",[358,602,603,606],{},[181,604,605],{},"save"," to write the runtime copy back to SurrealDB.",[358,608,609,612],{},[181,610,611],{},"remove"," to evict the runtime copy.",[155,614,615,616,618],{},"Do not assume hot state is durable until ",[181,617,605],{}," succeeds.",[159,620,622],{"id":621},"web-ui-rules","Web UI Rules",[155,624,625,626,629],{},"Browser UI source files live under each client addon. Built assets usually land\nunder that addon's ",[181,627,628],{},"ui\u002F_site"," directory.",[155,631,632,633,636],{},"Use the existing common bridge in ",[181,634,635],{},"arma\u002Fclient\u002Faddons\u002Fcommon"," when a UI needs\nto send events back to SQF. Keep UI state and rendering in JavaScript, and keep\nserver-authoritative decisions in server SQF or Rust services.",[159,638,640],{"id":639},"documentation-checklist","Documentation Checklist",[155,642,643],{},"When adding or changing a module, update:",[459,645,646,652,655,661],{},[358,647,648,651],{},[181,649,650],{},"docs\u002FMODULE_REFERENCE.md"," for framework-level inventory.",[358,653,654],{},"A module-specific README in the addon directory when SQF or UI usage changes.",[358,656,657,660],{},[181,658,659],{},"arma\u002Fserver\u002Fdocs\u002Fapi-reference.md"," when extension commands change.",[358,662,663],{},"Existing usage guides when payload shapes or workflows change.",[665,666,667],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":179,"searchDepth":193,"depth":193,"links":669},[670,671,672,673,674,675,676,677],{"id":161,"depth":193,"text":162},{"id":241,"depth":193,"text":242},{"id":352,"depth":193,"text":353},{"id":453,"depth":193,"text":454},{"id":548,"depth":193,"text":549},{"id":576,"depth":193,"text":577},{"id":621,"depth":193,"text":622},{"id":639,"depth":193,"text":640},"md",null,{},{"title":19,"description":157},"SACXFQxkQonJpusqYCXgr0NFhrv1Imz0UFQfb7-7iGg",[684,686],{"title":15,"path":16,"stem":17,"description":685,"children":-1},"This reference lists the main Forge modules and where each layer lives.",{"title":23,"path":24,"stem":25,"description":687,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/module-reference.html b/docus/dist/getting-started/module-reference.html new file mode 100644 index 0000000..962ede0 --- /dev/null +++ b/docus/dist/getting-started/module-reference.html @@ -0,0 +1,134 @@ +Module Reference - forge-docus
Getting Started

Module Reference

This reference lists the main Forge modules and where each layer lives.

Module Reference

This reference lists the main Forge modules and where each layer lives.

Directory Map

arma/client/addons/      Client-side Arma addons and browser UIs
+arma/server/addons/      Server-side Arma addons and extension bridge
+arma/server/extension/   Rust arma-rs extension and SurrealDB adapters
+bin/icom/                Interprocess communication helper
+lib/models/              Shared domain data models
+lib/repositories/        Repository traits and in-memory stores
+lib/services/            Domain services and workflow logic
+lib/shared/              Cross-crate helpers
+tools/                   Web UI build tooling
+docs/                    Framework-level documentation
+

Gameplay Domains

DomainPurposeClient addonServer addonService/model layerExtension group
ActorPlayer identity, loadout, position, status, contact identifiers, and persistent character data.arma/client/addons/actorarma/server/addons/actorlib/models/src/actor.rs, lib/services/src/actor.rsactor:*
BankPlayer accounts, cash/bank balances, PIN validation, transfers, checkout charging, and transaction context.arma/client/addons/bankarma/server/addons/banklib/models/src/bank.rs, lib/services/src/bank.rsbank:*, bank:hot:*
CADDispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views.arma/client/addons/cadarma/server/addons/cadlib/models/src/cad.rs, lib/services/src/cad.rscad:*
GaragePlayer vehicle storage with plate IDs, fuel, damage, and hit point state.arma/client/addons/garagearma/server/addons/garagelib/models/src/garage.rs, lib/services/src/garage.rsgarage:*, garage:hot:*
LockerPlayer item storage keyed by classname with category and amount.arma/client/addons/lockerarma/server/addons/lockerlib/models/src/locker.rs, lib/services/src/locker.rslocker:*, locker:hot:*
OrganizationPlayer organizations, membership, treasury, credit lines, shared assets, and fleet data.arma/client/addons/orgarma/server/addons/orglib/models/src/org.rs, lib/services/src/org.rsorg:*, org:hot:*
PhoneContacts, messages, and email state.arma/client/addons/phonearma/server/addons/phonelib/models/src/phone.rs, lib/services/src/phone.rsphone:*
StoreStorefront entity setup, catalog hydration, checkout workflows, and checkout charging integration.arma/client/addons/storearma/server/addons/storelib/models/src/store.rs, lib/services/src/store.rsstore:checkout
TaskServer-owned mission/task flows, catalog, ownership, status, participant tracking, rewards, and defuse counters.nonearma/server/addons/tasklib/models/src/task.rs, lib/services/src/task.rstask:*
Owned GarageOrganization or owner-scoped vehicle unlock storage.via garage/org UIserver extension onlylib/models/src/v_garage.rs, lib/services/src/v_garage.rsowned:garage:*
Owned LockerOrganization or owner-scoped arsenal unlock storage.via locker/org UIserver extension onlylib/models/src/v_locker.rs, lib/services/src/v_locker.rsowned:locker:*

Server and extension guides: +Actor, +Bank, +CAD, +Economy, +Garage, +Locker, +Organization, +Owned Storage, +Phone, +Store, +Task.

Client guides: +Client Overview, +Main, +Common, +Actor, +Bank, +CAD, +Garage, +Locker, +Notifications, +Organization, +Phone, +Store.

Infrastructure Modules

ModulePurposeLocation
commonShared SQF helpers, base stores, utility functions, and shared UI bridge pieces.arma/client/addons/common, arma/server/addons/common
extensionServer SQF bridge around forge_server extension calls and chunked transport.arma/server/addons/extension
mainMod-level configuration, pre-init wiring, and server/client startup glue.arma/client/addons/main, arma/server/addons/main
economyServer-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank/cash first, then organization funds with repayable member debt when personal funds cannot cover the bill.arma/server/addons/economy
notificationsClient notification UI, sounds, and UI event handling.arma/client/addons/notifications
icomRust helper for interprocess communication and event broadcasting.bin/icom, arma/server/extension/src/icom.rs
terrainExtension-side terrain export helper.arma/server/extension/src/terrain.rs
transportChunked request/response handling for large extension payloads.arma/server/extension/src/transport.rs
surrealSurrealDB connection lifecycle and status reporting.arma/server/extension/src/surreal.rs

Extension Command Groups

Commands are invoked with:

"forge_server" callExtension ["group:command", [_arg1, _arg2]];
+

Nested groups use additional : separators, for example +bank:hot:deposit.

Core

CommandPurpose
versionReturn the extension version string.
statusReturn SurrealDB connection state.
surreal:statusReturn SurrealDB connection state directly from the Surreal module.

Actor

CommandPurpose
actor:getFetch actor data for a resolved player UID.
actor:createCreate actor data from JSON.
actor:updateApply actor JSON updates.
actor:existsReturn true or false.
actor:deleteDelete actor data.
actor:hot:init, actor:hot:get, actor:hot:keys, actor:hot:override, actor:hot:save, actor:hot:removeManage actor hot state.

See Actor Usage Guide for examples.

Bank

CommandPurpose
bank:get, bank:create, bank:update, bank:exists, bank:deleteDurable bank CRUD.
bank:hot:init, bank:hot:get, bank:hot:override, bank:hot:patch, bank:hot:save, bank:hot:removeManage bank hot state.
bank:hot:deposit, bank:hot:withdraw, bank:hot:deposit_earnings, bank:hot:transferMutate hot bank balances with operation context.
bank:hot:charge_checkoutCharge a checkout against hot bank state.
bank:hot:validate_pinValidate a PIN for bank operations.

See Bank Usage Guide for examples.

Garage

CommandPurpose
garage:create, garage:get, garage:add, garage:update, garage:patch, garage:remove, garage:delete, garage:existsDurable player garage operations.
garage:hot:init, garage:hot:get, garage:hot:override, garage:hot:add, garage:hot:remove_vehicle, garage:hot:save, garage:hot:removeManage player garage hot state.

See Garage Usage Guide for examples.

Locker

CommandPurpose
locker:create, locker:get, locker:add, locker:update, locker:patch, locker:remove, locker:delete, locker:existsDurable player locker operations.
locker:hot:init, locker:hot:get, locker:hot:override, locker:hot:save, locker:hot:removeManage player locker hot state.

See Locker Usage Guide for examples.

Organization

CommandPurpose
org:get, org:create, org:update, org:exists, org:deleteDurable organization CRUD.
org:assets:get, org:assets:updateManage organization assets.
org:fleet:get, org:fleet:updateManage organization fleet entries.
org:members:get, org:members:add, org:members:removeManage organization membership.
org:hot:*Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.

See Org Usage Guide for examples.

Phone

CommandPurpose
phone:initInitialize phone state for a UID.
phone:contacts:list, phone:contacts:add, phone:contacts:removeManage contacts.
phone:messages:list, phone:messages:thread, phone:messages:send, phone:messages:mark_read, phone:messages:deleteManage messages.
phone:emails:list, phone:emails:send, phone:emails:mark_read, phone:emails:deleteManage emails.
phone:removeRemove phone state for a UID.

See Phone Usage Guide for examples.

CAD

Command GroupPurpose
cad:activity:append, cad:activity:recentAppend and read recent activity.
cad:assignments:list, cad:assignments:assign, cad:assignments:acknowledge, cad:assignments:decline, cad:assignments:upsert, cad:assignments:deleteManage dispatch assignments.
cad:orders:list, cad:orders:create, cad:orders:create_from_context, cad:orders:close, cad:orders:upsert, cad:orders:deleteManage orders.
cad:requests:list, cad:requests:submit, cad:requests:submit_from_context, cad:requests:close, cad:requests:upsert, cad:requests:deleteManage requests.
cad:profiles:list, cad:profiles:update_from_context, cad:profiles:upsert, cad:profiles:deleteManage profiles.
cad:groups:buildBuild grouped CAD state.
cad:view:hydrateBuild the dispatcher view model.

See CAD Usage Guide for examples.

Task

Command GroupPurpose
task:resetReset task state.
task:catalog:active, task:catalog:get, task:catalog:upsert, task:catalog:deleteManage task catalog entries.
task:ownership:bind, task:ownership:release, task:ownership:accept, task:ownership:reward_contextManage task ownership and rewards.
task:status:set, task:status:get, task:status:clearManage task status.
task:defuse:increment, task:defuse:getManage defuse counters.
task:clearClear task state.

See Task Usage Guide for examples.

Owned Storage

Command GroupPurpose
owned:garage:create, owned:garage:fetch, owned:garage:get, owned:garage:add, owned:garage:remove, owned:garage:delete, owned:garage:existsOwner-scoped vehicle storage.
owned:garage:hot:*Owner-scoped vehicle hot state.
owned:locker:create, owned:locker:fetch, owned:locker:get, owned:locker:add, owned:locker:remove, owned:locker:delete, owned:locker:existsOwner-scoped item storage.
owned:locker:hot:*Owner-scoped item hot state.

See Owned Storage Usage Guide for examples.

Other Extension Groups

Command GroupPurpose
store:checkoutRun store checkout behavior.
icom:connect, icom:broadcast, icom:send_eventICom connection and event forwarding.
terrain:exportSVGExport terrain data as SVG.
transport:invoke, transport:invoke_storedInvoke commands through transport.
transport:request:append, transport:request:clearManage stored request chunks.
transport:response:get, transport:response:clearManage stored response chunks.

Rust Crates

CrateRole
forge-modelsDomain models and validation. Keep these serializable and free of persistence details.
forge-repositoriesRepository traits and in-memory implementations. Keep these storage-agnostic.
forge-servicesBusiness rules and workflows. Depend on repository traits, not concrete databases.
forge-sharedCross-crate helpers. Keep dependencies light.
forge-serverArma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.
forge-icomICom helper binary and client library.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/getting-started/module-reference/_payload.json b/docus/dist/getting-started/module-reference/_payload.json new file mode 100644 index 0000000..841478a --- /dev/null +++ b/docus/dist/getting-started/module-reference/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1959},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-module-reference":145,"-getting-started-module-reference-surround":1954},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":15,"body":147,"description":157,"extension":1948,"links":1949,"meta":1950,"navigation":1951,"path":16,"seo":1952,"stem":17,"__hash__":1953},"docs\u002F1.getting-started\u002F2.module-reference.md",{"type":148,"value":149,"toc":1927},"minimark",[150,154,158,163,174,178,553,583,614,618,782,786,789,803,813,818,861,864,958,964,967,1064,1068,1071,1142,1146,1149,1214,1218,1221,1306,1311,1314,1403,1407,1410,1550,1554,1557,1656,1660,1663,1751,1755,1759,1845,1849,1923],[151,152,15],"h1",{"id":153},"module-reference",[155,156,157],"p",{},"This reference lists the main Forge modules and where each layer lives.",[159,160,162],"h2",{"id":161},"directory-map","Directory Map",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","arma\u002Fclient\u002Faddons\u002F Client-side Arma addons and browser UIs\narma\u002Fserver\u002Faddons\u002F Server-side Arma addons and extension bridge\narma\u002Fserver\u002Fextension\u002F Rust arma-rs extension and SurrealDB adapters\nbin\u002Ficom\u002F Interprocess communication helper\nlib\u002Fmodels\u002F Shared domain data models\nlib\u002Frepositories\u002F Repository traits and in-memory stores\nlib\u002Fservices\u002F Domain services and workflow logic\nlib\u002Fshared\u002F Cross-crate helpers\ntools\u002F Web UI build tooling\ndocs\u002F Framework-level documentation\n","text","",[172,173,168],"code",{"__ignoreMap":170},[159,175,177],{"id":176},"gameplay-domains","Gameplay Domains",[179,180,181,206],"table",{},[182,183,184],"thead",{},[185,186,187,191,194,197,200,203],"tr",{},[188,189,190],"th",{},"Domain",[188,192,193],{},"Purpose",[188,195,196],{},"Client addon",[188,198,199],{},"Server addon",[188,201,202],{},"Service\u002Fmodel layer",[188,204,205],{},"Extension group",[207,208,209,242,276,307,341,375,409,440,471,500,527],"tbody",{},[185,210,211,215,218,223,228,237],{},[212,213,214],"td",{},"Actor",[212,216,217],{},"Player identity, loadout, position, status, contact identifiers, and persistent character data.",[212,219,220],{},[172,221,222],{},"arma\u002Fclient\u002Faddons\u002Factor",[212,224,225],{},[172,226,227],{},"arma\u002Fserver\u002Faddons\u002Factor",[212,229,230,233,234],{},[172,231,232],{},"lib\u002Fmodels\u002Fsrc\u002Factor.rs",", ",[172,235,236],{},"lib\u002Fservices\u002Fsrc\u002Factor.rs",[212,238,239],{},[172,240,241],{},"actor:*",[185,243,244,247,250,255,260,268],{},[212,245,246],{},"Bank",[212,248,249],{},"Player accounts, cash\u002Fbank balances, PIN validation, transfers, checkout charging, and transaction context.",[212,251,252],{},[172,253,254],{},"arma\u002Fclient\u002Faddons\u002Fbank",[212,256,257],{},[172,258,259],{},"arma\u002Fserver\u002Faddons\u002Fbank",[212,261,262,233,265],{},[172,263,264],{},"lib\u002Fmodels\u002Fsrc\u002Fbank.rs",[172,266,267],{},"lib\u002Fservices\u002Fsrc\u002Fbank.rs",[212,269,270,233,273],{},[172,271,272],{},"bank:*",[172,274,275],{},"bank:hot:*",[185,277,278,281,284,289,294,302],{},[212,279,280],{},"CAD",[212,282,283],{},"Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views.",[212,285,286],{},[172,287,288],{},"arma\u002Fclient\u002Faddons\u002Fcad",[212,290,291],{},[172,292,293],{},"arma\u002Fserver\u002Faddons\u002Fcad",[212,295,296,233,299],{},[172,297,298],{},"lib\u002Fmodels\u002Fsrc\u002Fcad.rs",[172,300,301],{},"lib\u002Fservices\u002Fsrc\u002Fcad.rs",[212,303,304],{},[172,305,306],{},"cad:*",[185,308,309,312,315,320,325,333],{},[212,310,311],{},"Garage",[212,313,314],{},"Player vehicle storage with plate IDs, fuel, damage, and hit point state.",[212,316,317],{},[172,318,319],{},"arma\u002Fclient\u002Faddons\u002Fgarage",[212,321,322],{},[172,323,324],{},"arma\u002Fserver\u002Faddons\u002Fgarage",[212,326,327,233,330],{},[172,328,329],{},"lib\u002Fmodels\u002Fsrc\u002Fgarage.rs",[172,331,332],{},"lib\u002Fservices\u002Fsrc\u002Fgarage.rs",[212,334,335,233,338],{},[172,336,337],{},"garage:*",[172,339,340],{},"garage:hot:*",[185,342,343,346,349,354,359,367],{},[212,344,345],{},"Locker",[212,347,348],{},"Player item storage keyed by classname with category and amount.",[212,350,351],{},[172,352,353],{},"arma\u002Fclient\u002Faddons\u002Flocker",[212,355,356],{},[172,357,358],{},"arma\u002Fserver\u002Faddons\u002Flocker",[212,360,361,233,364],{},[172,362,363],{},"lib\u002Fmodels\u002Fsrc\u002Flocker.rs",[172,365,366],{},"lib\u002Fservices\u002Fsrc\u002Flocker.rs",[212,368,369,233,372],{},[172,370,371],{},"locker:*",[172,373,374],{},"locker:hot:*",[185,376,377,380,383,388,393,401],{},[212,378,379],{},"Organization",[212,381,382],{},"Player organizations, membership, treasury, credit lines, shared assets, and fleet data.",[212,384,385],{},[172,386,387],{},"arma\u002Fclient\u002Faddons\u002Forg",[212,389,390],{},[172,391,392],{},"arma\u002Fserver\u002Faddons\u002Forg",[212,394,395,233,398],{},[172,396,397],{},"lib\u002Fmodels\u002Fsrc\u002Forg.rs",[172,399,400],{},"lib\u002Fservices\u002Fsrc\u002Forg.rs",[212,402,403,233,406],{},[172,404,405],{},"org:*",[172,407,408],{},"org:hot:*",[185,410,411,414,417,422,427,435],{},[212,412,413],{},"Phone",[212,415,416],{},"Contacts, messages, and email state.",[212,418,419],{},[172,420,421],{},"arma\u002Fclient\u002Faddons\u002Fphone",[212,423,424],{},[172,425,426],{},"arma\u002Fserver\u002Faddons\u002Fphone",[212,428,429,233,432],{},[172,430,431],{},"lib\u002Fmodels\u002Fsrc\u002Fphone.rs",[172,433,434],{},"lib\u002Fservices\u002Fsrc\u002Fphone.rs",[212,436,437],{},[172,438,439],{},"phone:*",[185,441,442,445,448,453,458,466],{},[212,443,444],{},"Store",[212,446,447],{},"Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration.",[212,449,450],{},[172,451,452],{},"arma\u002Fclient\u002Faddons\u002Fstore",[212,454,455],{},[172,456,457],{},"arma\u002Fserver\u002Faddons\u002Fstore",[212,459,460,233,463],{},[172,461,462],{},"lib\u002Fmodels\u002Fsrc\u002Fstore.rs",[172,464,465],{},"lib\u002Fservices\u002Fsrc\u002Fstore.rs",[212,467,468],{},[172,469,470],{},"store:checkout",[185,472,473,476,479,482,487,495],{},[212,474,475],{},"Task",[212,477,478],{},"Server-owned mission\u002Ftask flows, catalog, ownership, status, participant tracking, rewards, and defuse counters.",[212,480,481],{},"none",[212,483,484],{},[172,485,486],{},"arma\u002Fserver\u002Faddons\u002Ftask",[212,488,489,233,492],{},[172,490,491],{},"lib\u002Fmodels\u002Fsrc\u002Ftask.rs",[172,493,494],{},"lib\u002Fservices\u002Fsrc\u002Ftask.rs",[212,496,497],{},[172,498,499],{},"task:*",[185,501,502,505,508,511,514,522],{},[212,503,504],{},"Owned Garage",[212,506,507],{},"Organization or owner-scoped vehicle unlock storage.",[212,509,510],{},"via garage\u002Forg UI",[212,512,513],{},"server extension only",[212,515,516,233,519],{},[172,517,518],{},"lib\u002Fmodels\u002Fsrc\u002Fv_garage.rs",[172,520,521],{},"lib\u002Fservices\u002Fsrc\u002Fv_garage.rs",[212,523,524],{},[172,525,526],{},"owned:garage:*",[185,528,529,532,535,538,540,548],{},[212,530,531],{},"Owned Locker",[212,533,534],{},"Organization or owner-scoped arsenal unlock storage.",[212,536,537],{},"via locker\u002Forg UI",[212,539,513],{},[212,541,542,233,545],{},[172,543,544],{},"lib\u002Fmodels\u002Fsrc\u002Fv_locker.rs",[172,546,547],{},"lib\u002Fservices\u002Fsrc\u002Fv_locker.rs",[212,549,550],{},[172,551,552],{},"owned:locker:*",[155,554,555,556,559,560,559,562,559,564,559,567,559,569,559,571,559,573,559,576,559,578,559,580,582],{},"Server and extension guides:\n",[557,558,214],"a",{"href":50},",\n",[557,561,246],{"href":62},[557,563,280],{"href":66},[557,565,566],{"href":70},"Economy",[557,568,311],{"href":74},[557,570,345],{"href":78},[557,572,379],{"href":82},[557,574,575],{"href":86},"Owned Storage",[557,577,413],{"href":90},[557,579,444],{"href":54},[557,581,475],{"href":58},".",[155,584,585,586,559,589,559,592,559,595,559,597,559,599,559,601,559,603,559,605,559,608,559,610,559,612,582],{},"Client guides:\n",[557,587,588],{"href":95},"Client Overview",[557,590,591],{"href":102},"Main",[557,593,594],{"href":114},"Common",[557,596,214],{"href":118},[557,598,246],{"href":122},[557,600,280],{"href":126},[557,602,311],{"href":130},[557,604,345],{"href":134},[557,606,607],{"href":138},"Notifications",[557,609,379],{"href":142},[557,611,413],{"href":106},[557,613,444],{"href":110},[159,615,617],{"id":616},"infrastructure-modules","Infrastructure Modules",[179,619,620,632],{},[182,621,622],{},[185,623,624,627,629],{},[188,625,626],{},"Module",[188,628,193],{},[188,630,631],{},"Location",[207,633,634,652,671,689,704,719,737,752,767],{},[185,635,636,641,644],{},[212,637,638],{},[172,639,640],{},"common",[212,642,643],{},"Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces.",[212,645,646,233,649],{},[172,647,648],{},"arma\u002Fclient\u002Faddons\u002Fcommon",[172,650,651],{},"arma\u002Fserver\u002Faddons\u002Fcommon",[185,653,654,659,666],{},[212,655,656],{},[172,657,658],{},"extension",[212,660,661,662,665],{},"Server SQF bridge around ",[172,663,664],{},"forge_server"," extension calls and chunked transport.",[212,667,668],{},[172,669,670],{},"arma\u002Fserver\u002Faddons\u002Fextension",[185,672,673,678,681],{},[212,674,675],{},[172,676,677],{},"main",[212,679,680],{},"Mod-level configuration, pre-init wiring, and server\u002Fclient startup glue.",[212,682,683,233,686],{},[172,684,685],{},"arma\u002Fclient\u002Faddons\u002Fmain",[172,687,688],{},"arma\u002Fserver\u002Faddons\u002Fmain",[185,690,691,696,699],{},[212,692,693],{},[172,694,695],{},"economy",[212,697,698],{},"Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank\u002Fcash first, then organization funds with repayable member debt when personal funds cannot cover the bill.",[212,700,701],{},[172,702,703],{},"arma\u002Fserver\u002Faddons\u002Feconomy",[185,705,706,711,714],{},[212,707,708],{},[172,709,710],{},"notifications",[212,712,713],{},"Client notification UI, sounds, and UI event handling.",[212,715,716],{},[172,717,718],{},"arma\u002Fclient\u002Faddons\u002Fnotifications",[185,720,721,726,729],{},[212,722,723],{},[172,724,725],{},"icom",[212,727,728],{},"Rust helper for interprocess communication and event broadcasting.",[212,730,731,233,734],{},[172,732,733],{},"bin\u002Ficom",[172,735,736],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ficom.rs",[185,738,739,744,747],{},[212,740,741],{},[172,742,743],{},"terrain",[212,745,746],{},"Extension-side terrain export helper.",[212,748,749],{},[172,750,751],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fterrain.rs",[185,753,754,759,762],{},[212,755,756],{},[172,757,758],{},"transport",[212,760,761],{},"Chunked request\u002Fresponse handling for large extension payloads.",[212,763,764],{},[172,765,766],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ftransport.rs",[185,768,769,774,777],{},[212,770,771],{},[172,772,773],{},"surreal",[212,775,776],{},"SurrealDB connection lifecycle and status reporting.",[212,778,779],{},[172,780,781],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fsurreal.rs",[159,783,785],{"id":784},"extension-command-groups","Extension Command Groups",[155,787,788],{},"Commands are invoked with:",[164,790,794],{"className":791,"code":792,"language":793,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"group:command\", [_arg1, _arg2]];\n","sqf",[172,795,796],{"__ignoreMap":170},[797,798,801],"span",{"class":799,"line":800},"line",1,[797,802,792],{},[155,804,805,806,809,810,582],{},"Nested groups use additional ",[172,807,808],{},":"," separators, for example\n",[172,811,812],{},"bank:hot:deposit",[814,815,817],"h3",{"id":816},"core","Core",[179,819,820,829],{},[182,821,822],{},[185,823,824,827],{},[188,825,826],{},"Command",[188,828,193],{},[207,830,831,841,851],{},[185,832,833,838],{},[212,834,835],{},[172,836,837],{},"version",[212,839,840],{},"Return the extension version string.",[185,842,843,848],{},[212,844,845],{},[172,846,847],{},"status",[212,849,850],{},"Return SurrealDB connection state.",[185,852,853,858],{},[212,854,855],{},[172,856,857],{},"surreal:status",[212,859,860],{},"Return SurrealDB connection state directly from the Surreal module.",[814,862,214],{"id":863},"actor",[179,865,866,874],{},[182,867,868],{},[185,869,870,872],{},[188,871,826],{},[188,873,193],{},[207,875,876,886,896,906,923,933],{},[185,877,878,883],{},[212,879,880],{},[172,881,882],{},"actor:get",[212,884,885],{},"Fetch actor data for a resolved player UID.",[185,887,888,893],{},[212,889,890],{},[172,891,892],{},"actor:create",[212,894,895],{},"Create actor data from JSON.",[185,897,898,903],{},[212,899,900],{},[172,901,902],{},"actor:update",[212,904,905],{},"Apply actor JSON updates.",[185,907,908,913],{},[212,909,910],{},[172,911,912],{},"actor:exists",[212,914,915,916,919,920,582],{},"Return ",[172,917,918],{},"true"," or ",[172,921,922],{},"false",[185,924,925,930],{},[212,926,927],{},[172,928,929],{},"actor:delete",[212,931,932],{},"Delete actor data.",[185,934,935,955],{},[212,936,937,233,940,233,943,233,946,233,949,233,952],{},[172,938,939],{},"actor:hot:init",[172,941,942],{},"actor:hot:get",[172,944,945],{},"actor:hot:keys",[172,947,948],{},"actor:hot:override",[172,950,951],{},"actor:hot:save",[172,953,954],{},"actor:hot:remove",[212,956,957],{},"Manage actor hot state.",[155,959,960,961,963],{},"See ",[557,962,49],{"href":50}," for examples.",[814,965,246],{"id":966},"bank",[179,968,969,977],{},[182,970,971],{},[185,972,973,975],{},[188,974,826],{},[188,976,193],{},[207,978,979,1001,1026,1044,1054],{},[185,980,981,998],{},[212,982,983,233,986,233,989,233,992,233,995],{},[172,984,985],{},"bank:get",[172,987,988],{},"bank:create",[172,990,991],{},"bank:update",[172,993,994],{},"bank:exists",[172,996,997],{},"bank:delete",[212,999,1000],{},"Durable bank CRUD.",[185,1002,1003,1023],{},[212,1004,1005,233,1008,233,1011,233,1014,233,1017,233,1020],{},[172,1006,1007],{},"bank:hot:init",[172,1009,1010],{},"bank:hot:get",[172,1012,1013],{},"bank:hot:override",[172,1015,1016],{},"bank:hot:patch",[172,1018,1019],{},"bank:hot:save",[172,1021,1022],{},"bank:hot:remove",[212,1024,1025],{},"Manage bank hot state.",[185,1027,1028,1041],{},[212,1029,1030,233,1032,233,1035,233,1038],{},[172,1031,812],{},[172,1033,1034],{},"bank:hot:withdraw",[172,1036,1037],{},"bank:hot:deposit_earnings",[172,1039,1040],{},"bank:hot:transfer",[212,1042,1043],{},"Mutate hot bank balances with operation context.",[185,1045,1046,1051],{},[212,1047,1048],{},[172,1049,1050],{},"bank:hot:charge_checkout",[212,1052,1053],{},"Charge a checkout against hot bank state.",[185,1055,1056,1061],{},[212,1057,1058],{},[172,1059,1060],{},"bank:hot:validate_pin",[212,1062,1063],{},"Validate a PIN for bank operations.",[155,1065,960,1066,963],{},[557,1067,61],{"href":62},[814,1069,311],{"id":1070},"garage",[179,1072,1073,1081],{},[182,1074,1075],{},[185,1076,1077,1079],{},[188,1078,826],{},[188,1080,193],{},[207,1082,1083,1114],{},[185,1084,1085,1111],{},[212,1086,1087,233,1090,233,1093,233,1096,233,1099,233,1102,233,1105,233,1108],{},[172,1088,1089],{},"garage:create",[172,1091,1092],{},"garage:get",[172,1094,1095],{},"garage:add",[172,1097,1098],{},"garage:update",[172,1100,1101],{},"garage:patch",[172,1103,1104],{},"garage:remove",[172,1106,1107],{},"garage:delete",[172,1109,1110],{},"garage:exists",[212,1112,1113],{},"Durable player garage operations.",[185,1115,1116,1139],{},[212,1117,1118,233,1121,233,1124,233,1127,233,1130,233,1133,233,1136],{},[172,1119,1120],{},"garage:hot:init",[172,1122,1123],{},"garage:hot:get",[172,1125,1126],{},"garage:hot:override",[172,1128,1129],{},"garage:hot:add",[172,1131,1132],{},"garage:hot:remove_vehicle",[172,1134,1135],{},"garage:hot:save",[172,1137,1138],{},"garage:hot:remove",[212,1140,1141],{},"Manage player garage hot state.",[155,1143,960,1144,963],{},[557,1145,73],{"href":74},[814,1147,345],{"id":1148},"locker",[179,1150,1151,1159],{},[182,1152,1153],{},[185,1154,1155,1157],{},[188,1156,826],{},[188,1158,193],{},[207,1160,1161,1192],{},[185,1162,1163,1189],{},[212,1164,1165,233,1168,233,1171,233,1174,233,1177,233,1180,233,1183,233,1186],{},[172,1166,1167],{},"locker:create",[172,1169,1170],{},"locker:get",[172,1172,1173],{},"locker:add",[172,1175,1176],{},"locker:update",[172,1178,1179],{},"locker:patch",[172,1181,1182],{},"locker:remove",[172,1184,1185],{},"locker:delete",[172,1187,1188],{},"locker:exists",[212,1190,1191],{},"Durable player locker operations.",[185,1193,1194,1211],{},[212,1195,1196,233,1199,233,1202,233,1205,233,1208],{},[172,1197,1198],{},"locker:hot:init",[172,1200,1201],{},"locker:hot:get",[172,1203,1204],{},"locker:hot:override",[172,1206,1207],{},"locker:hot:save",[172,1209,1210],{},"locker:hot:remove",[212,1212,1213],{},"Manage player locker hot state.",[155,1215,960,1216,963],{},[557,1217,77],{"href":78},[814,1219,379],{"id":1220},"organization",[179,1222,1223,1231],{},[182,1224,1225],{},[185,1226,1227,1229],{},[188,1228,826],{},[188,1230,193],{},[207,1232,1233,1255,1268,1281,1297],{},[185,1234,1235,1252],{},[212,1236,1237,233,1240,233,1243,233,1246,233,1249],{},[172,1238,1239],{},"org:get",[172,1241,1242],{},"org:create",[172,1244,1245],{},"org:update",[172,1247,1248],{},"org:exists",[172,1250,1251],{},"org:delete",[212,1253,1254],{},"Durable organization CRUD.",[185,1256,1257,1265],{},[212,1258,1259,233,1262],{},[172,1260,1261],{},"org:assets:get",[172,1263,1264],{},"org:assets:update",[212,1266,1267],{},"Manage organization assets.",[185,1269,1270,1278],{},[212,1271,1272,233,1275],{},[172,1273,1274],{},"org:fleet:get",[172,1276,1277],{},"org:fleet:update",[212,1279,1280],{},"Manage organization fleet entries.",[185,1282,1283,1294],{},[212,1284,1285,233,1288,233,1291],{},[172,1286,1287],{},"org:members:get",[172,1289,1290],{},"org:members:add",[172,1292,1293],{},"org:members:remove",[212,1295,1296],{},"Manage organization membership.",[185,1298,1299,1303],{},[212,1300,1301],{},[172,1302,408],{},[212,1304,1305],{},"Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.",[155,1307,960,1308,963],{},[557,1309,1310],{"href":82},"Org Usage Guide",[814,1312,413],{"id":1313},"phone",[179,1315,1316,1324],{},[182,1317,1318],{},[185,1319,1320,1322],{},[188,1321,826],{},[188,1323,193],{},[207,1325,1326,1336,1352,1374,1393],{},[185,1327,1328,1333],{},[212,1329,1330],{},[172,1331,1332],{},"phone:init",[212,1334,1335],{},"Initialize phone state for a UID.",[185,1337,1338,1349],{},[212,1339,1340,233,1343,233,1346],{},[172,1341,1342],{},"phone:contacts:list",[172,1344,1345],{},"phone:contacts:add",[172,1347,1348],{},"phone:contacts:remove",[212,1350,1351],{},"Manage contacts.",[185,1353,1354,1371],{},[212,1355,1356,233,1359,233,1362,233,1365,233,1368],{},[172,1357,1358],{},"phone:messages:list",[172,1360,1361],{},"phone:messages:thread",[172,1363,1364],{},"phone:messages:send",[172,1366,1367],{},"phone:messages:mark_read",[172,1369,1370],{},"phone:messages:delete",[212,1372,1373],{},"Manage messages.",[185,1375,1376,1390],{},[212,1377,1378,233,1381,233,1384,233,1387],{},[172,1379,1380],{},"phone:emails:list",[172,1382,1383],{},"phone:emails:send",[172,1385,1386],{},"phone:emails:mark_read",[172,1388,1389],{},"phone:emails:delete",[212,1391,1392],{},"Manage emails.",[185,1394,1395,1400],{},[212,1396,1397],{},[172,1398,1399],{},"phone:remove",[212,1401,1402],{},"Remove phone state for a UID.",[155,1404,960,1405,963],{},[557,1406,89],{"href":90},[814,1408,280],{"id":1409},"cad",[179,1411,1412,1421],{},[182,1413,1414],{},[185,1415,1416,1419],{},[188,1417,1418],{},"Command Group",[188,1420,193],{},[207,1422,1423,1436,1461,1486,1511,1530,1540],{},[185,1424,1425,1433],{},[212,1426,1427,233,1430],{},[172,1428,1429],{},"cad:activity:append",[172,1431,1432],{},"cad:activity:recent",[212,1434,1435],{},"Append and read recent activity.",[185,1437,1438,1458],{},[212,1439,1440,233,1443,233,1446,233,1449,233,1452,233,1455],{},[172,1441,1442],{},"cad:assignments:list",[172,1444,1445],{},"cad:assignments:assign",[172,1447,1448],{},"cad:assignments:acknowledge",[172,1450,1451],{},"cad:assignments:decline",[172,1453,1454],{},"cad:assignments:upsert",[172,1456,1457],{},"cad:assignments:delete",[212,1459,1460],{},"Manage dispatch assignments.",[185,1462,1463,1483],{},[212,1464,1465,233,1468,233,1471,233,1474,233,1477,233,1480],{},[172,1466,1467],{},"cad:orders:list",[172,1469,1470],{},"cad:orders:create",[172,1472,1473],{},"cad:orders:create_from_context",[172,1475,1476],{},"cad:orders:close",[172,1478,1479],{},"cad:orders:upsert",[172,1481,1482],{},"cad:orders:delete",[212,1484,1485],{},"Manage orders.",[185,1487,1488,1508],{},[212,1489,1490,233,1493,233,1496,233,1499,233,1502,233,1505],{},[172,1491,1492],{},"cad:requests:list",[172,1494,1495],{},"cad:requests:submit",[172,1497,1498],{},"cad:requests:submit_from_context",[172,1500,1501],{},"cad:requests:close",[172,1503,1504],{},"cad:requests:upsert",[172,1506,1507],{},"cad:requests:delete",[212,1509,1510],{},"Manage requests.",[185,1512,1513,1527],{},[212,1514,1515,233,1518,233,1521,233,1524],{},[172,1516,1517],{},"cad:profiles:list",[172,1519,1520],{},"cad:profiles:update_from_context",[172,1522,1523],{},"cad:profiles:upsert",[172,1525,1526],{},"cad:profiles:delete",[212,1528,1529],{},"Manage profiles.",[185,1531,1532,1537],{},[212,1533,1534],{},[172,1535,1536],{},"cad:groups:build",[212,1538,1539],{},"Build grouped CAD state.",[185,1541,1542,1547],{},[212,1543,1544],{},[172,1545,1546],{},"cad:view:hydrate",[212,1548,1549],{},"Build the dispatcher view model.",[155,1551,960,1552,963],{},[557,1553,65],{"href":66},[814,1555,475],{"id":1556},"task",[179,1558,1559,1567],{},[182,1560,1561],{},[185,1562,1563,1565],{},[188,1564,1418],{},[188,1566,193],{},[207,1568,1569,1579,1598,1617,1633,1646],{},[185,1570,1571,1576],{},[212,1572,1573],{},[172,1574,1575],{},"task:reset",[212,1577,1578],{},"Reset task state.",[185,1580,1581,1595],{},[212,1582,1583,233,1586,233,1589,233,1592],{},[172,1584,1585],{},"task:catalog:active",[172,1587,1588],{},"task:catalog:get",[172,1590,1591],{},"task:catalog:upsert",[172,1593,1594],{},"task:catalog:delete",[212,1596,1597],{},"Manage task catalog entries.",[185,1599,1600,1614],{},[212,1601,1602,233,1605,233,1608,233,1611],{},[172,1603,1604],{},"task:ownership:bind",[172,1606,1607],{},"task:ownership:release",[172,1609,1610],{},"task:ownership:accept",[172,1612,1613],{},"task:ownership:reward_context",[212,1615,1616],{},"Manage task ownership and rewards.",[185,1618,1619,1630],{},[212,1620,1621,233,1624,233,1627],{},[172,1622,1623],{},"task:status:set",[172,1625,1626],{},"task:status:get",[172,1628,1629],{},"task:status:clear",[212,1631,1632],{},"Manage task status.",[185,1634,1635,1643],{},[212,1636,1637,233,1640],{},[172,1638,1639],{},"task:defuse:increment",[172,1641,1642],{},"task:defuse:get",[212,1644,1645],{},"Manage defuse counters.",[185,1647,1648,1653],{},[212,1649,1650],{},[172,1651,1652],{},"task:clear",[212,1654,1655],{},"Clear task state.",[155,1657,960,1658,963],{},[557,1659,57],{"href":58},[814,1661,575],{"id":1662},"owned-storage",[179,1664,1665,1673],{},[182,1666,1667],{},[185,1668,1669,1671],{},[188,1670,1418],{},[188,1672,193],{},[207,1674,1675,1703,1713,1741],{},[185,1676,1677,1700],{},[212,1678,1679,233,1682,233,1685,233,1688,233,1691,233,1694,233,1697],{},[172,1680,1681],{},"owned:garage:create",[172,1683,1684],{},"owned:garage:fetch",[172,1686,1687],{},"owned:garage:get",[172,1689,1690],{},"owned:garage:add",[172,1692,1693],{},"owned:garage:remove",[172,1695,1696],{},"owned:garage:delete",[172,1698,1699],{},"owned:garage:exists",[212,1701,1702],{},"Owner-scoped vehicle storage.",[185,1704,1705,1710],{},[212,1706,1707],{},[172,1708,1709],{},"owned:garage:hot:*",[212,1711,1712],{},"Owner-scoped vehicle hot state.",[185,1714,1715,1738],{},[212,1716,1717,233,1720,233,1723,233,1726,233,1729,233,1732,233,1735],{},[172,1718,1719],{},"owned:locker:create",[172,1721,1722],{},"owned:locker:fetch",[172,1724,1725],{},"owned:locker:get",[172,1727,1728],{},"owned:locker:add",[172,1730,1731],{},"owned:locker:remove",[172,1733,1734],{},"owned:locker:delete",[172,1736,1737],{},"owned:locker:exists",[212,1739,1740],{},"Owner-scoped item storage.",[185,1742,1743,1748],{},[212,1744,1745],{},[172,1746,1747],{},"owned:locker:hot:*",[212,1749,1750],{},"Owner-scoped item hot state.",[155,1752,960,1753,963],{},[557,1754,85],{"href":86},[814,1756,1758],{"id":1757},"other-extension-groups","Other Extension Groups",[179,1760,1761,1769],{},[182,1762,1763],{},[185,1764,1765,1767],{},[188,1766,1418],{},[188,1768,193],{},[207,1770,1771,1780,1796,1806,1819,1832],{},[185,1772,1773,1777],{},[212,1774,1775],{},[172,1776,470],{},[212,1778,1779],{},"Run store checkout behavior.",[185,1781,1782,1793],{},[212,1783,1784,233,1787,233,1790],{},[172,1785,1786],{},"icom:connect",[172,1788,1789],{},"icom:broadcast",[172,1791,1792],{},"icom:send_event",[212,1794,1795],{},"ICom connection and event forwarding.",[185,1797,1798,1803],{},[212,1799,1800],{},[172,1801,1802],{},"terrain:exportSVG",[212,1804,1805],{},"Export terrain data as SVG.",[185,1807,1808,1816],{},[212,1809,1810,233,1813],{},[172,1811,1812],{},"transport:invoke",[172,1814,1815],{},"transport:invoke_stored",[212,1817,1818],{},"Invoke commands through transport.",[185,1820,1821,1829],{},[212,1822,1823,233,1826],{},[172,1824,1825],{},"transport:request:append",[172,1827,1828],{},"transport:request:clear",[212,1830,1831],{},"Manage stored request chunks.",[185,1833,1834,1842],{},[212,1835,1836,233,1839],{},[172,1837,1838],{},"transport:response:get",[172,1840,1841],{},"transport:response:clear",[212,1843,1844],{},"Manage stored response chunks.",[159,1846,1848],{"id":1847},"rust-crates","Rust Crates",[179,1850,1851,1861],{},[182,1852,1853],{},[185,1854,1855,1858],{},[188,1856,1857],{},"Crate",[188,1859,1860],{},"Role",[207,1862,1863,1873,1883,1893,1903,1913],{},[185,1864,1865,1870],{},[212,1866,1867],{},[172,1868,1869],{},"forge-models",[212,1871,1872],{},"Domain models and validation. Keep these serializable and free of persistence details.",[185,1874,1875,1880],{},[212,1876,1877],{},[172,1878,1879],{},"forge-repositories",[212,1881,1882],{},"Repository traits and in-memory implementations. Keep these storage-agnostic.",[185,1884,1885,1890],{},[212,1886,1887],{},[172,1888,1889],{},"forge-services",[212,1891,1892],{},"Business rules and workflows. Depend on repository traits, not concrete databases.",[185,1894,1895,1900],{},[212,1896,1897],{},[172,1898,1899],{},"forge-shared",[212,1901,1902],{},"Cross-crate helpers. Keep dependencies light.",[185,1904,1905,1910],{},[212,1906,1907],{},[172,1908,1909],{},"forge-server",[212,1911,1912],{},"Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.",[185,1914,1915,1920],{},[212,1916,1917],{},[172,1918,1919],{},"forge-icom",[212,1921,1922],{},"ICom helper binary and client library.",[1924,1925,1926],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":1928,"depth":1928,"links":1929},2,[1930,1931,1932,1933,1947],{"id":161,"depth":1928,"text":162},{"id":176,"depth":1928,"text":177},{"id":616,"depth":1928,"text":617},{"id":784,"depth":1928,"text":785,"children":1934},[1935,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946],{"id":816,"depth":1936,"text":817},3,{"id":863,"depth":1936,"text":214},{"id":966,"depth":1936,"text":246},{"id":1070,"depth":1936,"text":311},{"id":1148,"depth":1936,"text":345},{"id":1220,"depth":1936,"text":379},{"id":1313,"depth":1936,"text":413},{"id":1409,"depth":1936,"text":280},{"id":1556,"depth":1936,"text":475},{"id":1662,"depth":1936,"text":575},{"id":1757,"depth":1936,"text":1758},{"id":1847,"depth":1928,"text":1848},"md",null,{},true,{"title":15,"description":157},"DvQwc2rM4FqseD3QHUyCecRoLIjQmfZuZK0p1V8hxZw",[1955,1957],{"title":11,"path":12,"stem":13,"description":1956,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",{"title":19,"path":20,"stem":21,"description":1958,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/surrealdb-setup.html b/docus/dist/getting-started/surrealdb-setup.html new file mode 100644 index 0000000..dd2195a --- /dev/null +++ b/docus/dist/getting-started/surrealdb-setup.html @@ -0,0 +1,139 @@ +SurrealDB Setup - forge-docus
Getting Started

SurrealDB Setup

Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config.

SurrealDB Setup

Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config.

Choose the Right Path

Developer or Server Operator

Use this path if you are building Forge, running a local test server, or +hosting the live Arma server.

Official SurrealDB resources:

Install SurrealDB with the official method for your platform:

# Windows
+iwr https://windows.surrealdb.com -useb | iex
+
# macOS
+brew install surrealdb/tap/surreal
+
# Linux
+curl -sSf https://install.surrealdb.com | sh
+

For Forge, start a persistent local database instead of the default in-memory +mode:

surreal start surrealkv://forge.db --bind 127.0.0.1:8000 --user root --pass root
+

Then copy arma/server/extension/config.example.toml to config.toml next to +forge_server_x64.dll and keep the values aligned with the database you +started:

[surreal]
+endpoint = "127.0.0.1:8000"
+namespace = "forge"
+database = "main"
+username = "root"
+password = "root"
+connect_timeout_ms = 5000
+

After that:

  1. Start the Arma server with the Forge extension enabled.
  2. Let the extension connect and apply the Forge schema modules.
  3. Verify the connection state:
"forge_server" callExtension ["status", []];
+"forge_server" callExtension ["surreal:status", []];
+

If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's config.toml.

Mission Designer or Community Manager/Leader

Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code.

Official SurrealDB resources:

Recommended approach:

  1. Install Surrealist Desktop. It is the better fit for Forge because the +official docs note that the web app can be limited when connecting to +localhost or non-HTTPS endpoints.
  2. Connect Surrealist to the same database Forge uses.
  3. Use the values from the server's config.toml:
Endpoint:   http://127.0.0.1:8000
+Namespace:  forge
+Database:   main
+Username:   root
+Password:   root
+

If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +surreal executable is installed and available on your PATH.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/getting-started/surrealdb-setup/_payload.json b/docus/dist/getting-started/surrealdb-setup/_payload.json new file mode 100644 index 0000000..d5bdb3b --- /dev/null +++ b/docus/dist/getting-started/surrealdb-setup/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-surrealdb-setup":145,"-getting-started-surrealdb-setup-surround":483},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":23,"body":147,"description":157,"extension":477,"links":478,"meta":479,"navigation":480,"path":24,"seo":481,"stem":25,"__hash__":482},"docs\u002F1.getting-started\u002F4.surrealdb-setup.md",{"type":148,"value":149,"toc":471},"minimark",[150,154,158,163,168,171,174,199,202,225,251,279,282,291,306,353,356,368,385,391,395,398,400,423,426,449,457,467],[151,152,23],"h1",{"id":153},"surrealdb-setup",[155,156,157],"p",{},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",[159,160,162],"h2",{"id":161},"choose-the-right-path","Choose the Right Path",[164,165,167],"h3",{"id":166},"developer-or-server-operator","Developer or Server Operator",[155,169,170],{},"Use this path if you are building Forge, running a local test server, or\nhosting the live Arma server.",[155,172,173],{},"Official SurrealDB resources:",[175,176,177,187],"ul",{},[178,179,180],"li",{},[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Fsurrealdb.com\u002Finstall",[185],"nofollow","SurrealDB install page",[178,188,189],{},[181,190,193,194,198],{"href":191,"rel":192},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Freference\u002Fcli\u002Fsurrealdb-cli\u002Fcommands\u002Fstart",[185],"SurrealDB CLI ",[195,196,197],"code",{},"start"," reference",[155,200,201],{},"Install SurrealDB with the official method for your platform:",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Windows\niwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n","powershell","",[195,210,211,219],{"__ignoreMap":208},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"# Windows\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"iwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n",[203,226,230],{"className":227,"code":228,"language":229,"meta":208,"style":208},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# macOS\nbrew install surrealdb\u002Ftap\u002Fsurreal\n","bash",[195,231,232,238],{"__ignoreMap":208},[212,233,234],{"class":214,"line":215},[212,235,237],{"class":236},"sHwdD","# macOS\n",[212,239,240,244,248],{"class":214,"line":221},[212,241,243],{"class":242},"sBMFI","brew",[212,245,247],{"class":246},"sfazB"," install",[212,249,250],{"class":246}," surrealdb\u002Ftap\u002Fsurreal\n",[203,252,254],{"className":227,"code":253,"language":229,"meta":208,"style":208},"# Linux\ncurl -sSf https:\u002F\u002Finstall.surrealdb.com | sh\n",[195,255,256,261],{"__ignoreMap":208},[212,257,258],{"class":214,"line":215},[212,259,260],{"class":236},"# Linux\n",[212,262,263,266,269,272,276],{"class":214,"line":221},[212,264,265],{"class":242},"curl",[212,267,268],{"class":246}," -sSf",[212,270,271],{"class":246}," https:\u002F\u002Finstall.surrealdb.com",[212,273,275],{"class":274},"sMK4o"," |",[212,277,278],{"class":242}," sh\n",[155,280,281],{},"For Forge, start a persistent local database instead of the default in-memory\nmode:",[203,283,285],{"className":205,"code":284,"language":207,"meta":208,"style":208},"surreal start surrealkv:\u002F\u002Fforge.db --bind 127.0.0.1:8000 --user root --pass root\n",[195,286,287],{"__ignoreMap":208},[212,288,289],{"class":214,"line":215},[212,290,284],{},[155,292,293,294,297,298,301,302,305],{},"Then copy ",[195,295,296],{},"arma\u002Fserver\u002Fextension\u002Fconfig.example.toml"," to ",[195,299,300],{},"config.toml"," next to\n",[195,303,304],{},"forge_server_x64.dll"," and keep the values aligned with the database you\nstarted:",[203,307,311],{"className":308,"code":309,"language":310,"meta":208,"style":208},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[195,312,313,318,323,329,335,341,347],{"__ignoreMap":208},[212,314,315],{"class":214,"line":215},[212,316,317],{},"[surreal]\n",[212,319,320],{"class":214,"line":221},[212,321,322],{},"endpoint = \"127.0.0.1:8000\"\n",[212,324,326],{"class":214,"line":325},3,[212,327,328],{},"namespace = \"forge\"\n",[212,330,332],{"class":214,"line":331},4,[212,333,334],{},"database = \"main\"\n",[212,336,338],{"class":214,"line":337},5,[212,339,340],{},"username = \"root\"\n",[212,342,344],{"class":214,"line":343},6,[212,345,346],{},"password = \"root\"\n",[212,348,350],{"class":214,"line":349},7,[212,351,352],{},"connect_timeout_ms = 5000\n",[155,354,355],{},"After that:",[357,358,359,362,365],"ol",{},[178,360,361],{},"Start the Arma server with the Forge extension enabled.",[178,363,364],{},"Let the extension connect and apply the Forge schema modules.",[178,366,367],{},"Verify the connection state:",[203,369,373],{"className":370,"code":371,"language":372,"meta":208,"style":208},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf",[195,374,375,380],{"__ignoreMap":208},[212,376,377],{"class":214,"line":215},[212,378,379],{},"\"forge_server\" callExtension [\"status\", []];\n",[212,381,382],{"class":214,"line":221},[212,383,384],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,386,387,388,390],{},"If you change the endpoint, namespace, database, username, or password in\nSurrealDB, change the same values in Forge's ",[195,389,300],{},".",[164,392,394],{"id":393},"mission-designer-or-community-managerleader","Mission Designer or Community Manager\u002FLeader",[155,396,397],{},"Use this path if you mostly need to inspect, query, or adjust data for a test\nor live server and you are not changing Forge source code.",[155,399,173],{},[175,401,402,409,416],{},[178,403,404],{},[181,405,408],{"href":406,"rel":407},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Finstallation",[185],"Surrealist installation",[178,410,411],{},[181,412,415],{"href":413,"rel":414},"https:\u002F\u002Fapp.surrealdb.com",[185],"Surrealist web app",[178,417,418],{},[181,419,422],{"href":420,"rel":421},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Fconcepts\u002Flocal-database-serving",[185],"Surrealist local database serving",[155,424,425],{},"Recommended approach:",[357,427,428,440,443],{},[178,429,430,431,435,436,439],{},"Install ",[432,433,434],"strong",{},"Surrealist Desktop",". It is the better fit for Forge because the\nofficial docs note that the web app can be limited when connecting to\n",[195,437,438],{},"localhost"," or non-HTTPS endpoints.",[178,441,442],{},"Connect Surrealist to the same database Forge uses.",[178,444,445,446,448],{},"Use the values from the server's ",[195,447,300],{},":",[203,450,455],{"className":451,"code":453,"language":454,"meta":208},[452],"language-text","Endpoint: http:\u002F\u002F127.0.0.1:8000\nNamespace: forge\nDatabase: main\nUsername: root\nPassword: root\n","text",[195,456,453],{"__ignoreMap":208},[155,458,459,460,463,464,390],{},"If you need your own local sandbox instead of connecting to an existing Forge\nserver, install SurrealDB first and follow the developer\u002Fserver-operator path\nabove. Surrealist Desktop can also launch a local database for you after the\n",[195,461,462],{},"surreal"," executable is installed and available on your ",[195,465,466],{},"PATH",[468,469,470],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":208,"searchDepth":221,"depth":221,"links":472},[473],{"id":161,"depth":221,"text":162,"children":474},[475,476],{"id":166,"depth":325,"text":167},{"id":393,"depth":325,"text":394},"md",null,{},true,{"title":23,"description":157},"Mzg_hZr3MJToQo6L-0UrTXsAtDW3i2aJ-CYUHBu0nB8",[484,486],{"title":19,"path":20,"stem":21,"description":485,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",{"title":28,"path":29,"stem":30,"description":487,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/index.html b/docus/dist/index.html new file mode 100644 index 0000000..fd4ff5c --- /dev/null +++ b/docus/dist/index.html @@ -0,0 +1,106 @@ +Forge Framework Documentation - forge-docus

Forge Framework Documentation

Forge is a persistent Arma 3 framework that combines SQF addons, a Rust +arma-rs extension, SurrealDB persistence, shared domain crates, and +browser-backed player interfaces.

Use these docs to understand the runtime architecture, extension API surface, +server gameplay modules, and client addon integration patterns.

What Forge Covers

    Domain Modules
    Actor, bank, CAD, garage, locker, organization, phone, store, task, and +owned-storage workflows share a consistent service and extension model.
    Rust Extension
    The server extension keeps command parsing thin, routes domain requests into +services, and persists durable state through SurrealDB.
    Durable Persistence
    Repository traits stay storage-agnostic while concrete adapters in the +extension handle schema and database mapping.
    Browser UIs
    Client addons host web-based interfaces inside Arma displays and synchronize +state through namespaced browser bridge events.
    Transport Layer
    Large payloads move through chunked request and response transport while +smaller commands still use direct callExtension paths.
    Development Workflow
    The docs cover module boundaries, local validation checks, and where new +domain logic belongs across Rust, SQF, and web UI layers.

Documentation Areas

    Getting Started
    Framework overview, architecture, module reference, and development rules.
    Server Extension
    Extension architecture, command surface, and SQF usage examples.
    Server Modules
    Gameplay-domain usage guides for persistence, hot state, and command flows.
    Client Addons
    Browser bridge, client UX entry points, and addon-specific event contracts.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/llms-full.txt b/docus/dist/llms-full.txt new file mode 100644 index 0000000..25a9080 --- /dev/null +++ b/docus/dist/llms-full.txt @@ -0,0 +1,4206 @@ +# Getting Started + +Use this section as the main entry point for the Forge framework. + +Forge combines: + +- Arma 3 client addons for UX and browser-hosted interfaces +- Arma 3 server addons for mission integration and authoritative flow control +- a Rust server extension for command routing and persistence +- shared Rust crates for models, repositories, and services +- SurrealDB for durable storage + +## Common Commands + +```powershell +cargo test +npm run build:webui +.\build-arma.ps1 +``` + +## Start Here + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-network + title: Architecture + to: https://innovativedevsolutions.github.io/getting-started/architecture + --- + Understand how SQF, Rust services, SurrealDB, and browser UIs fit together. + ::: + + :::u-page-card + --- + icon: i-lucide-boxes + title: Module Reference + to: https://innovativedevsolutions.github.io/getting-started/module-reference + --- + Review gameplay domains, infrastructure modules, and extension command groups. + ::: + + :::u-page-card + --- + icon: i-lucide-wrench + title: Development Guide + to: https://innovativedevsolutions.github.io/getting-started/development + --- + See the rules for adding modules and changing boundaries without regressions. + ::: + + :::u-page-card + --- + icon: i-lucide-database + title: SurrealDB Setup + to: https://innovativedevsolutions.github.io/getting-started/surrealdb-setup + --- + Install SurrealDB, match Forge config values, and choose the right setup path + for developers or admin-facing roles. + ::: + + :::u-page-card + --- + icon: i-lucide-server-cog + title: Server Extension + to: https://innovativedevsolutions.github.io/server-extension + --- + Follow the extension architecture, API surface, and SQF usage examples. + ::: + + :::u-page-card + --- + icon: i-lucide-layers-3 + title: Server Modules + to: https://innovativedevsolutions.github.io/server-modules + --- + Dive into the actor, bank, CAD, garage, locker, organization, phone, store, + task, and owned-storage guides. + ::: + + :::u-page-card + --- + icon: i-lucide-monitor-smartphone + title: Client Addons + to: https://innovativedevsolutions.github.io/client-addons + --- + Explore the client bridge model and addon-specific browser integration rules. + ::: +:: + + +# Framework Architecture + +Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI. + +## Runtime Flow + +```text +Arma client UI or SQF action + -> client addon bridge + -> server addon function + -> forge_server callExtension command + -> extension command group + -> forge-services domain service + -> forge-repositories trait + -> SurrealDB repository implementation + -> SurrealDB +``` + +For small payloads, server SQF calls `forge_server` directly through the +extension bridge. For large payloads, `arma/server/addons/extension` stages +request and response chunks through the extension transport module. + +## Main Layers + +### Client Addons + +Client addons live under `arma/client/addons`. They own local player UX, +keybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs +durable or authoritative state, it routes work to the matching server addon +instead of touching persistence directly. + +### Server Addons + +Server addons live under `arma/server/addons`. They own server-side SQF +initialization, game-object integration, validation near the Arma runtime, and +calls into the Rust extension. The `extension` addon is the shared bridge for +`callExtension` and transport handling. + +### Rust Extension + +The server extension lives under `arma/server/extension`. It registers the +`forge_server` command groups, loads configuration, initializes SurrealDB, and +maps SQF command inputs into service calls. + +The extension should stay thin: + +- Parse and validate command arguments that arrive from SQF. +- Resolve Arma-specific context such as player UID when required. +- Call the matching service. +- Serialize the service result back to JSON or a simple string. + +### Shared Rust Crates + +The `lib` workspace contains reusable Rust crates: + +- `forge-models`: shared domain structs and serialization rules. +- `forge-repositories`: storage-agnostic repository traits and in-memory + implementations used by tests and hot-state services. +- `forge-services`: domain behavior, validation, and mutation workflows. +- `forge-shared`: cross-crate helpers. + +### Persistence + +Durable storage is SurrealDB. Schema modules live under +`arma/server/extension/src/schema`, and concrete SurrealDB repository +implementations live under `arma/server/extension/src/storage`. + +Repository traits stay in `lib/repositories` so service logic remains testable +without a database. + +## Hot State + +Several domains have `hot` command groups. Hot state keeps a runtime copy of +frequently accessed data in memory, then saves it back to durable storage when +requested. This is useful for player state that changes often during a session. + +Typical hot-state flow: + +```text +actor:hot:init +actor:hot:get +actor:hot:override +actor:hot:save +actor:hot:remove +``` + +Use hot state for session workflows. Use normal domain commands for direct +durable CRUD operations. + +## Transport Layer + +The transport layer exists because Arma extension calls have practical payload +size limits. It provides chunked request and response handling while still +routing to the same domain command groups. + +Common direct command: + +```sqf +"forge_server" callExtension ["status", []]; +``` + +Common transport path: + +```text +server addon fnc_extCall + -> transport:request:append + -> transport:invoke_stored + -> transport:response:get +``` + +## Configuration + +The server extension reads `config.toml` next to the extension DLL. The current +persistence section is: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +For install links and role-based setup guidance, see +[SurrealDB Setup](https://innovativedevsolutions.github.io/getting-started/surrealdb-setup). + +Check persistence readiness before issuing commands that require storage: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + + +# Module Reference + +This reference lists the main Forge modules and where each layer lives. + +## Directory Map + +```text +arma/client/addons/ Client-side Arma addons and browser UIs +arma/server/addons/ Server-side Arma addons and extension bridge +arma/server/extension/ Rust arma-rs extension and SurrealDB adapters +bin/icom/ Interprocess communication helper +lib/models/ Shared domain data models +lib/repositories/ Repository traits and in-memory stores +lib/services/ Domain services and workflow logic +lib/shared/ Cross-crate helpers +tools/ Web UI build tooling +docs/ Framework-level documentation +``` + +## Gameplay Domains + +| Domain | Purpose | Client addon | Server addon | Service/model layer | Extension group | +| ------------ | ---------------------------------------------------------------------------------------------------------------- | --------------------------- | --------------------------- | ------------------------------------------------------------ | -------------------------- | +| Actor | Player identity, loadout, position, status, contact identifiers, and persistent character data. | `arma/client/addons/actor` | `arma/server/addons/actor` | `lib/models/src/actor.rs`, `lib/services/src/actor.rs` | `actor:*` | +| Bank | Player accounts, cash/bank balances, PIN validation, transfers, checkout charging, and transaction context. | `arma/client/addons/bank` | `arma/server/addons/bank` | `lib/models/src/bank.rs`, `lib/services/src/bank.rs` | `bank:*`, `bank:hot:*` | +| CAD | Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views. | `arma/client/addons/cad` | `arma/server/addons/cad` | `lib/models/src/cad.rs`, `lib/services/src/cad.rs` | `cad:*` | +| Garage | Player vehicle storage with plate IDs, fuel, damage, and hit point state. | `arma/client/addons/garage` | `arma/server/addons/garage` | `lib/models/src/garage.rs`, `lib/services/src/garage.rs` | `garage:*`, `garage:hot:*` | +| Locker | Player item storage keyed by classname with category and amount. | `arma/client/addons/locker` | `arma/server/addons/locker` | `lib/models/src/locker.rs`, `lib/services/src/locker.rs` | `locker:*`, `locker:hot:*` | +| Organization | Player organizations, membership, treasury, credit lines, shared assets, and fleet data. | `arma/client/addons/org` | `arma/server/addons/org` | `lib/models/src/org.rs`, `lib/services/src/org.rs` | `org:*`, `org:hot:*` | +| Phone | Contacts, messages, and email state. | `arma/client/addons/phone` | `arma/server/addons/phone` | `lib/models/src/phone.rs`, `lib/services/src/phone.rs` | `phone:*` | +| Store | Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration. | `arma/client/addons/store` | `arma/server/addons/store` | `lib/models/src/store.rs`, `lib/services/src/store.rs` | `store:checkout` | +| Task | Server-owned mission/task flows, catalog, ownership, status, participant tracking, rewards, and defuse counters. | none | `arma/server/addons/task` | `lib/models/src/task.rs`, `lib/services/src/task.rs` | `task:*` | +| Owned Garage | Organization or owner-scoped vehicle unlock storage. | via garage/org UI | server extension only | `lib/models/src/v_garage.rs`, `lib/services/src/v_garage.rs` | `owned:garage:*` | +| Owned Locker | Organization or owner-scoped arsenal unlock storage. | via locker/org UI | server extension only | `lib/models/src/v_locker.rs`, `lib/services/src/v_locker.rs` | `owned:locker:*` | + +Server and extension guides: +[Actor](https://innovativedevsolutions.github.io/server-modules/actor), +[Bank](https://innovativedevsolutions.github.io/server-modules/bank), +[CAD](https://innovativedevsolutions.github.io/server-modules/cad), +[Economy](https://innovativedevsolutions.github.io/server-modules/economy), +[Garage](https://innovativedevsolutions.github.io/server-modules/garage), +[Locker](https://innovativedevsolutions.github.io/server-modules/locker), +[Organization](https://innovativedevsolutions.github.io/server-modules/organization), +[Owned Storage](https://innovativedevsolutions.github.io/server-modules/owned-storage), +[Phone](https://innovativedevsolutions.github.io/server-modules/phone), +[Store](https://innovativedevsolutions.github.io/server-modules/store), +[Task](https://innovativedevsolutions.github.io/server-modules/task). + +Client guides: +[Client Overview](https://innovativedevsolutions.github.io/client-addons), +[Main](https://innovativedevsolutions.github.io/client-addons/main), +[Common](https://innovativedevsolutions.github.io/client-addons/common), +[Actor](https://innovativedevsolutions.github.io/client-addons/actor), +[Bank](https://innovativedevsolutions.github.io/client-addons/bank), +[CAD](https://innovativedevsolutions.github.io/client-addons/cad), +[Garage](https://innovativedevsolutions.github.io/client-addons/garage), +[Locker](https://innovativedevsolutions.github.io/client-addons/locker), +[Notifications](https://innovativedevsolutions.github.io/client-addons/notifications), +[Organization](https://innovativedevsolutions.github.io/client-addons/organization), +[Phone](https://innovativedevsolutions.github.io/client-addons/phone), +[Store](https://innovativedevsolutions.github.io/client-addons/store). + +## Infrastructure Modules + +| Module | Purpose | Location | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | +| `common` | Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces. | `arma/client/addons/common`, `arma/server/addons/common` | +| `extension` | Server SQF bridge around `forge_server` extension calls and chunked transport. | `arma/server/addons/extension` | +| `main` | Mod-level configuration, pre-init wiring, and server/client startup glue. | `arma/client/addons/main`, `arma/server/addons/main` | +| `economy` | Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank/cash first, then organization funds with repayable member debt when personal funds cannot cover the bill. | `arma/server/addons/economy` | +| `notifications` | Client notification UI, sounds, and UI event handling. | `arma/client/addons/notifications` | +| `icom` | Rust helper for interprocess communication and event broadcasting. | `bin/icom`, `arma/server/extension/src/icom.rs` | +| `terrain` | Extension-side terrain export helper. | `arma/server/extension/src/terrain.rs` | +| `transport` | Chunked request/response handling for large extension payloads. | `arma/server/extension/src/transport.rs` | +| `surreal` | SurrealDB connection lifecycle and status reporting. | `arma/server/extension/src/surreal.rs` | + +## Extension Command Groups + +Commands are invoked with: + +```sqf +"forge_server" callExtension ["group:command", [_arg1, _arg2]]; +``` + +Nested groups use additional `:` separators, for example +`bank:hot:deposit`. + +### Core + +| Command | Purpose | +| ---------------- | ------------------------------------------------------------------- | +| `version` | Return the extension version string. | +| `status` | Return SurrealDB connection state. | +| `surreal:status` | Return SurrealDB connection state directly from the Surreal module. | + +### Actor + +| Command | Purpose | +| --------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | +| `actor:get` | Fetch actor data for a resolved player UID. | +| `actor:create` | Create actor data from JSON. | +| `actor:update` | Apply actor JSON updates. | +| `actor:exists` | Return `true` or `false`. | +| `actor:delete` | Delete actor data. | +| `actor:hot:init`, `actor:hot:get`, `actor:hot:keys`, `actor:hot:override`, `actor:hot:save`, `actor:hot:remove` | Manage actor hot state. | + +See [Actor Usage Guide](https://innovativedevsolutions.github.io/server-modules/actor) for examples. + +### Bank + +| Command | Purpose | +| ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | +| `bank:get`, `bank:create`, `bank:update`, `bank:exists`, `bank:delete` | Durable bank CRUD. | +| `bank:hot:init`, `bank:hot:get`, `bank:hot:override`, `bank:hot:patch`, `bank:hot:save`, `bank:hot:remove` | Manage bank hot state. | +| `bank:hot:deposit`, `bank:hot:withdraw`, `bank:hot:deposit_earnings`, `bank:hot:transfer` | Mutate hot bank balances with operation context. | +| `bank:hot:charge_checkout` | Charge a checkout against hot bank state. | +| `bank:hot:validate_pin` | Validate a PIN for bank operations. | + +See [Bank Usage Guide](https://innovativedevsolutions.github.io/server-modules/bank) for examples. + +### Garage + +| Command | Purpose | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | +| `garage:create`, `garage:get`, `garage:add`, `garage:update`, `garage:patch`, `garage:remove`, `garage:delete`, `garage:exists` | Durable player garage operations. | +| `garage:hot:init`, `garage:hot:get`, `garage:hot:override`, `garage:hot:add`, `garage:hot:remove_vehicle`, `garage:hot:save`, `garage:hot:remove` | Manage player garage hot state. | + +See [Garage Usage Guide](https://innovativedevsolutions.github.io/server-modules/garage) for examples. + +### Locker + +| Command | Purpose | +| ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | +| `locker:create`, `locker:get`, `locker:add`, `locker:update`, `locker:patch`, `locker:remove`, `locker:delete`, `locker:exists` | Durable player locker operations. | +| `locker:hot:init`, `locker:hot:get`, `locker:hot:override`, `locker:hot:save`, `locker:hot:remove` | Manage player locker hot state. | + +See [Locker Usage Guide](https://innovativedevsolutions.github.io/server-modules/locker) for examples. + +### Organization + +| Command | Purpose | +| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `org:get`, `org:create`, `org:update`, `org:exists`, `org:delete` | Durable organization CRUD. | +| `org:assets:get`, `org:assets:update` | Manage organization assets. | +| `org:fleet:get`, `org:fleet:update` | Manage organization fleet entries. | +| `org:members:get`, `org:members:add`, `org:members:remove` | Manage organization membership. | +| `org:hot:*` | Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove. | + +See [Org Usage Guide](https://innovativedevsolutions.github.io/server-modules/organization) for examples. + +### Phone + +| Command | Purpose | +| -------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | +| `phone:init` | Initialize phone state for a UID. | +| `phone:contacts:list`, `phone:contacts:add`, `phone:contacts:remove` | Manage contacts. | +| `phone:messages:list`, `phone:messages:thread`, `phone:messages:send`, `phone:messages:mark_read`, `phone:messages:delete` | Manage messages. | +| `phone:emails:list`, `phone:emails:send`, `phone:emails:mark_read`, `phone:emails:delete` | Manage emails. | +| `phone:remove` | Remove phone state for a UID. | + +See [Phone Usage Guide](https://innovativedevsolutions.github.io/server-modules/phone) for examples. + +### CAD + +| Command Group | Purpose | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| `cad:activity:append`, `cad:activity:recent` | Append and read recent activity. | +| `cad:assignments:list`, `cad:assignments:assign`, `cad:assignments:acknowledge`, `cad:assignments:decline`, `cad:assignments:upsert`, `cad:assignments:delete` | Manage dispatch assignments. | +| `cad:orders:list`, `cad:orders:create`, `cad:orders:create_from_context`, `cad:orders:close`, `cad:orders:upsert`, `cad:orders:delete` | Manage orders. | +| `cad:requests:list`, `cad:requests:submit`, `cad:requests:submit_from_context`, `cad:requests:close`, `cad:requests:upsert`, `cad:requests:delete` | Manage requests. | +| `cad:profiles:list`, `cad:profiles:update_from_context`, `cad:profiles:upsert`, `cad:profiles:delete` | Manage profiles. | +| `cad:groups:build` | Build grouped CAD state. | +| `cad:view:hydrate` | Build the dispatcher view model. | + +See [CAD Usage Guide](https://innovativedevsolutions.github.io/server-modules/cad) for examples. + +### Task + +| Command Group | Purpose | +| --------------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `task:reset` | Reset task state. | +| `task:catalog:active`, `task:catalog:get`, `task:catalog:upsert`, `task:catalog:delete` | Manage task catalog entries. | +| `task:ownership:bind`, `task:ownership:release`, `task:ownership:accept`, `task:ownership:reward_context` | Manage task ownership and rewards. | +| `task:status:set`, `task:status:get`, `task:status:clear` | Manage task status. | +| `task:defuse:increment`, `task:defuse:get` | Manage defuse counters. | +| `task:clear` | Clear task state. | + +See [Task Usage Guide](https://innovativedevsolutions.github.io/server-modules/task) for examples. + +### Owned Storage + +| Command Group | Purpose | +| -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | +| `owned:garage:create`, `owned:garage:fetch`, `owned:garage:get`, `owned:garage:add`, `owned:garage:remove`, `owned:garage:delete`, `owned:garage:exists` | Owner-scoped vehicle storage. | +| `owned:garage:hot:*` | Owner-scoped vehicle hot state. | +| `owned:locker:create`, `owned:locker:fetch`, `owned:locker:get`, `owned:locker:add`, `owned:locker:remove`, `owned:locker:delete`, `owned:locker:exists` | Owner-scoped item storage. | +| `owned:locker:hot:*` | Owner-scoped item hot state. | + +See [Owned Storage Usage Guide](https://innovativedevsolutions.github.io/server-modules/owned-storage) for examples. + +### Other Extension Groups + +| Command Group | Purpose | +| ----------------------------------------------------- | ------------------------------------- | +| `store:checkout` | Run store checkout behavior. | +| `icom:connect`, `icom:broadcast`, `icom:send_event` | ICom connection and event forwarding. | +| `terrain:exportSVG` | Export terrain data as SVG. | +| `transport:invoke`, `transport:invoke_stored` | Invoke commands through transport. | +| `transport:request:append`, `transport:request:clear` | Manage stored request chunks. | +| `transport:response:get`, `transport:response:clear` | Manage stored response chunks. | + +## Rust Crates + +| Crate | Role | +| -------------------- | --------------------------------------------------------------------------------------------------------- | +| `forge-models` | Domain models and validation. Keep these serializable and free of persistence details. | +| `forge-repositories` | Repository traits and in-memory implementations. Keep these storage-agnostic. | +| `forge-services` | Business rules and workflows. Depend on repository traits, not concrete databases. | +| `forge-shared` | Cross-crate helpers. Keep dependencies light. | +| `forge-server` | Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters. | +| `forge-icom` | ICom helper binary and client library. | + + +# Development Guide + +This guide covers the usual path for adding or changing a Forge module. + +## Local Checks + +Before running storage-backed workflows locally, complete +[SurrealDB Setup](https://innovativedevsolutions.github.io/getting-started/surrealdb-setup). + +Run these before pushing Rust or extension changes: + +```powershell +cargo fmt --check +cargo check +cargo test +cargo build +cargo clippy --all-targets --all-features -- -D warnings +``` + +Run this after changing browser UI sources: + +```powershell +npm run build:webui +``` + +Build Arma packages with: + +```powershell +.\build-arma.ps1 +``` + +## Module Boundaries + +Keep each layer responsible for one kind of work: + +| Layer | Owns | Avoid | +| ----------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------- | +| `lib/models` | Data structures, serde defaults, validation helpers. | Database calls, SQF-specific context. | +| `lib/repositories` | Repository traits and in-memory stores. | SurrealDB-specific code. | +| `lib/services` | Business rules, workflow orchestration, structured results. | Arma engine calls, extension transport details. | +| `arma/server/extension` | Command parsing, context resolution, SurrealDB implementations, serialization to SQF. | Business rules that belong in services. | +| `arma/server/addons` | Server SQF lifecycle, game-object integration, calls into `forge_server`. | Direct database logic. | +| `arma/client/addons` | Client UI, keybinds, local UI events. | Authoritative persistence. | + +## Adding a Domain Module + +1. Add the model in `lib/models/src/.rs`. +2. Export the model from `lib/models/src/lib.rs`. +3. Add repository traits in `lib/repositories/src/.rs`. +4. Add in-memory repository support if the service needs tests or hot state. +5. Export the traits from `lib/repositories/src/lib.rs`. +6. Add service logic in `lib/services/src/.rs`. +7. Add focused unit tests for service behavior. +8. Export the service from `lib/services/src/lib.rs`. +9. Add a SurrealDB schema module under `arma/server/extension/src/schema`. +10. Add the concrete storage adapter under `arma/server/extension/src/storage`. +11. Register the storage adapter in `arma/server/extension/src/storage.rs`. +12. Add an extension command group under `arma/server/extension/src/.rs`. +13. Register the command group in `arma/server/extension/src/lib.rs`. +14. Add server addon functions under `arma/server/addons/` if SQF needs a module-level API. +15. Add client addon or browser UI files under `arma/client/addons/` if the module has player-facing UI. +16. Add documentation in `docs/` and module-level READMEs. + +## Extension Command Rules + +Commands should return one of these forms: + +- JSON string for structured results. +- `"true"` or `"false"` for simple existence and boolean operations. +- `"OK"` for successful destructive operations with no response body. +- `"Error: "` for failures. + +Prefer stable JSON shapes over ad hoc strings. SQF callers should always check +for the `"Error:"` prefix before parsing JSON. + +Example: + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor request failed: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` + +## Persistence Rules + +SurrealDB is the durable store. Keep database-specific mapping in the extension +storage adapters, not in services or repository traits. + +When changing persisted data: + +- Update or add the matching `.surql` schema module. +- Update the concrete storage adapter. +- Preserve existing records when possible through serde defaults or migration + logic. +- Add tests at the service level for behavior, and add storage tests only when + database mapping is the risk. + +## Hot-State Rules + +Use hot state for data that is read or mutated frequently during a player +session. Hot-state modules usually provide: + +- `init` to load durable state into memory. +- `get` to read the runtime copy. +- `override` or focused mutation commands to update the runtime copy. +- `save` to write the runtime copy back to SurrealDB. +- `remove` to evict the runtime copy. + +Do not assume hot state is durable until `save` succeeds. + +## Web UI Rules + +Browser UI source files live under each client addon. Built assets usually land +under that addon's `ui/_site` directory. + +Use the existing common bridge in `arma/client/addons/common` when a UI needs +to send events back to SQF. Keep UI state and rendering in JavaScript, and keep +server-authoritative decisions in server SQF or Rust services. + +## Documentation Checklist + +When adding or changing a module, update: + +- `docs/MODULE_REFERENCE.md` for framework-level inventory. +- A module-specific README in the addon directory when SQF or UI usage changes. +- `arma/server/docs/api-reference.md` when extension commands change. +- Existing usage guides when payload shapes or workflows change. + + +# SurrealDB Setup + +Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config. + +## Choose the Right Path + +### Developer or Server Operator + +Use this path if you are building Forge, running a local test server, or +hosting the live Arma server. + +Official SurrealDB resources: + +- [SurrealDB install page](https://surrealdb.com/install){rel=""nofollow""} +- [SurrealDB CLI `start` reference](https://surrealdb.com/docs/reference/cli/surrealdb-cli/commands/start){rel=""nofollow""} + +Install SurrealDB with the official method for your platform: + +```powershell +# Windows +iwr https://windows.surrealdb.com -useb | iex +``` + +```bash +# macOS +brew install surrealdb/tap/surreal +``` + +```bash +# Linux +curl -sSf https://install.surrealdb.com | sh +``` + +For Forge, start a persistent local database instead of the default in-memory +mode: + +```powershell +surreal start surrealkv://forge.db --bind 127.0.0.1:8000 --user root --pass root +``` + +Then copy `arma/server/extension/config.example.toml` to `config.toml` next to +`forge_server_x64.dll` and keep the values aligned with the database you +started: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +After that: + +1. Start the Arma server with the Forge extension enabled. +2. Let the extension connect and apply the Forge schema modules. +3. Verify the connection state: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's `config.toml`. + +### Mission Designer or Community Manager/Leader + +Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code. + +Official SurrealDB resources: + +- [Surrealist installation](https://surrealdb.com/docs/explore/surrealist/installation){rel=""nofollow""} +- [Surrealist web app](https://app.surrealdb.com){rel=""nofollow""} +- [Surrealist local database serving](https://surrealdb.com/docs/explore/surrealist/concepts/local-database-serving){rel=""nofollow""} + +Recommended approach: + +1. Install **Surrealist Desktop**. It is the better fit for Forge because the + official docs note that the web app can be limited when connecting to + `localhost` or non-HTTPS endpoints. +2. Connect Surrealist to the same database Forge uses. +3. Use the values from the server's `config.toml`: + +```text +Endpoint: http://127.0.0.1:8000 +Namespace: forge +Database: main +Username: root +Password: root +``` + +If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +`surreal` executable is installed and available on your `PATH`. + + +# Forge Server Extension + +Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB. + +## Architecture + +SQF modules call `forge_server` through `fnc_extCall`. Small requests use the +direct `callExtension` path, while large payloads are staged through the +transport layer. + +```text +SQF module + -> extension bridge + -> domain command + -> service layer + -> repository + -> SurrealDB +``` + +## Configuration + +Copy `config.example.toml` to `config.toml` next to the extension DLL. + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +For install links and Forge-specific setup steps, see +[SurrealDB Setup](https://innovativedevsolutions.github.io/getting-started/surrealdb-setup). + +## References + +- [API Reference](https://innovativedevsolutions.github.io/server-extension/api-reference) +- [Usage Examples](https://innovativedevsolutions.github.io/server-extension/usage-examples) +- [Framework Module Guides](https://innovativedevsolutions.github.io/getting-started) + + +# Forge Server API Reference + +The Forge server extension exposes domain-oriented commands through +`callExtension`. Persistent data is stored through the configured SurrealDB +connection and schema modules. + +## Core Commands + +```sqf +"forge_server" callExtension ["version", []]; +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +`status` and `surreal:status` return `initializing`, `connected`, or `failed`. + +## Domain Commands + +Game systems should call the domain APIs instead of raw database operations: + +- `actor:*` +- `bank:*` +- `garage:*` +- `locker:*` +- `org:*` +- `phone:*` +- `store:*` +- `task:*` +- `cad:*` +- `owned:garage:*` +- `owned:locker:*` +- `transport:*` + +Large request and response payloads are routed through the transport layer when +needed by `forge_server_addons_extension_fnc_extCall`. + +## Module Guides + +- [Actor](https://innovativedevsolutions.github.io/server-modules/actor) +- [Bank](https://innovativedevsolutions.github.io/server-modules/bank) +- [CAD](https://innovativedevsolutions.github.io/server-modules/cad) +- [Garage](https://innovativedevsolutions.github.io/server-modules/garage) +- [Locker](https://innovativedevsolutions.github.io/server-modules/locker) +- [Organization](https://innovativedevsolutions.github.io/server-modules/organization) +- [Owned Storage](https://innovativedevsolutions.github.io/server-modules/owned-storage) +- [Phone](https://innovativedevsolutions.github.io/server-modules/phone) +- [Store](https://innovativedevsolutions.github.io/server-modules/store) +- [Task](https://innovativedevsolutions.github.io/server-modules/task) + + +# Forge Server Usage Examples + +These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB. + +## Status Check + +```sqf +["status", []] call forge_server_extension_fnc_extCall params ["_status", "_ok"]; +if (_ok && {_status isEqualTo "connected"}) then { + systemChat "Forge persistence is online."; +}; +``` + +## Actor Fetch + +```sqf +private _uid = getPlayerUID player; +["actor:get", [_uid]] call forge_server_extension_fnc_extCall params ["_payload", "_ok"]; +if (_ok) then { + private _actor = fromJSON _payload; + systemChat format ["Loaded actor %1", _actor getOrDefault ["uid", _uid]]; +}; +``` + +## Store Checkout + +```sqf +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [ + createHashMapFromArray [ + ["classname", "FirstAidKit"], + ["category", "item"], + ["priceValue", 50], + ["quantity", 2] + ] + ]], + ["vehicles", []] +]; + +["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall; +``` + + +# Server Module Guides + +These pages document the authoritative server-side workflows in Forge. + +Most modules follow the same shape: + +1. Server SQF gathers game context and validates mission/runtime assumptions. +2. The `forge_server` extension routes the request into the matching command group. +3. Services apply business rules through storage-agnostic repository traits. +4. The extension persists durable state through SurrealDB adapters when needed. + +## Gameplay Domains + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-user-round + title: Actor + to: https://innovativedevsolutions.github.io/server-modules/actor + --- + Persistent player identity, position, loadout, contact fields, and hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-wallet + title: Bank + to: https://innovativedevsolutions.github.io/server-modules/bank + --- + Player funds, transfers, PIN validation, checkout charging, and bank hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-map + title: CAD + to: https://innovativedevsolutions.github.io/server-modules/cad + --- + Dispatch requests, assignments, profiles, grouped state, and hydrated views. + ::: + + :::u-page-card + --- + icon: i-lucide-ambulance + title: Economy + to: https://innovativedevsolutions.github.io/server-modules/economy + --- + Fuel, service, and medical charging rules across player and organization funds. + ::: + + :::u-page-card + --- + icon: i-lucide-car-front + title: Garage + to: https://innovativedevsolutions.github.io/server-modules/garage + --- + Vehicle storage, hot-state updates, and persistence of vehicle condition. + ::: + + :::u-page-card + --- + icon: i-lucide-package + title: Locker + to: https://innovativedevsolutions.github.io/server-modules/locker + --- + Player inventory storage, unique item limits, and locker hot-state behavior. + ::: + + :::u-page-card + --- + icon: i-lucide-building-2 + title: Organization + to: https://innovativedevsolutions.github.io/server-modules/organization + --- + Membership, treasury, shared assets, fleet, and organization hot workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-key-round + title: Owned Storage + to: https://innovativedevsolutions.github.io/server-modules/owned-storage + --- + Owner-scoped locker and vehicle unlock storage used by org-linked features. + ::: + + :::u-page-card + --- + icon: i-lucide-smartphone + title: Phone + to: https://innovativedevsolutions.github.io/server-modules/phone + --- + Contacts, message threads, and email state for in-game phone workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-shopping-cart + title: Store + to: https://innovativedevsolutions.github.io/server-modules/store + --- + Checkout orchestration across pricing, grants, payment sources, and rollback. + ::: + + :::u-page-card + --- + icon: i-lucide-flag + title: Task + to: https://innovativedevsolutions.github.io/server-modules/task + --- + Task catalog, ownership, status transitions, defuse counters, and rewards. + ::: +:: + + +# Actor Usage Guide + +The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization. + +## Storage Model + +Actor data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "loadout": {}, + "position": [1234.5, 6789.0, 0.0], + "direction": 90.0, + "stance": "STAND", + "email": "0160000000@spearnet.mil", + "phone_number": "0160000000", + "state": "HEALTHY", + "holster": true, + "rank": null, + "organization": "default" +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument and must be a 17-digit Steam + UID. +- `name` is optional, but cannot be empty when set and cannot exceed 50 + characters. +- `position` must be three finite numbers when set. +- `direction` must be in the `0.0 <= direction < 360.0` range. +- `email` must contain `@` and end with `.mil` when set. +- `phone_number` must start with `0160` and be 10 digits when set. +- Empty `phone_number`, `email`, or `organization` fields are filled on create. + +## Commands + +All commands are called on the `actor` group. + +| Command | Arguments | Returns | +| -------------- | ------------------- | -------------------------------------------------------------------------------- | +| `actor:get` | `uid` | Actor JSON. If no actor exists, returns a default actor but does not persist it. | +| `actor:create` | `uid`, `actor_json` | Persisted actor JSON. | +| `actor:update` | `uid`, `patch_json` | Updated actor JSON. | +| `actor:exists` | `uid` | `true` or `false`. | +| `actor:delete` | `uid` | `OK`. | + +## Create an Actor + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _actor = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["loadout", getUnitLoadout player], + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["email", ""], + ["phone_number", ""], + ["state", "HEALTHY"], + ["holster", true], + ["organization", "default"] +]; + +private _result = "forge_server" callExtension ["actor:create", [ + getPlayerUID player, + toJSON _actor +]]; +``` + +## Update an Actor + +`actor:update` accepts a JSON object containing only fields to change. + +```sqf +private _patch = createHashMapFromArray [ + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["loadout", getUnitLoadout player] +]; + +private _result = "forge_server" callExtension ["actor:update", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +Supported patch fields are `name`, `position`, `direction`, `stance`, `email`, +`phone_number`, `state`, `holster`, `rank`, `organization`, and `loadout`. +`uid` is ignored. + +## Hot State + +The `actor:hot:*` commands keep a runtime copy of actor data and write it back +only when `actor:hot:save` runs. + +| Command | Arguments | Returns | +| -------------------- | ------------------- | ---------------------------------------------- | +| `actor:hot:init` | `uid` | Actor JSON from durable storage. | +| `actor:hot:get` | `uid` | Actor JSON. | +| `actor:hot:keys` | none | JSON array of hot actor UIDs. | +| `actor:hot:override` | `uid`, `actor_json` | Actor JSON. | +| `actor:hot:save` | `uid` | Current hot actor JSON and async durable save. | +| `actor:hot:remove` | `uid` | `OK`. | + +Use hot state for frequently updated session data such as position and loadout. +Use durable commands for account creation and administrative changes. + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor error: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` + + +# Store Usage Guide + +The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks. + +## Server SQF Module + +The server addon uses two long-lived module objects: + +- `StorefrontStore` is the storefront workflow facade. It builds hydrate + payloads, validates checkout requests, calls the Rust `store:checkout` + command, syncs UI patches, and asks related module stores to save hot state. +- `StoreCatalogService` scans configured item and vehicle categories, builds + catalog responses, resolves checkout entries, and calculates authoritative + prices. + +Editor-placed store entities are initialized by `fnc_initStore` during store +post-init. The initializer matches non-null mission namespace objects whose +variable names contain `store` and sets `isStore = true`, following the same +pattern used by garage entities. + +## Checkout Model + +`store:checkout` accepts one JSON context. + +```json +{ + "requesterUid": "76561198000000000", + "requesterName": "Player Name", + "orgId": "default", + "requesterIsDefaultOrgCeo": false, + "paymentMethod": "bank", + "items": [ + { + "classname": "arifle_MX_F", + "category": "weapon", + "priceValue": 500, + "quantity": 1 + } + ], + "vehicles": [ + { + "classname": "B_Quadbike_01_F", + "category": "cars", + "priceValue": 1500 + } + ] +} +``` + +Rules validated by the Rust service: + +- `requesterUid` is required. +- At least one item or vehicle is required. +- The checkout total must be greater than zero. +- Item categories must be `item`, `attachment`, `weapon`, `magazine`, or + `backpack`. +- Vehicle categories must be `cars`, `armor`, `helis`, `planes`, `naval`, or + `other`. +- Payment method must be `cash`, `bank`, `org_funds`, or `credit_line`. +- Player locker capacity cannot exceed 25 unique items after checkout. +- Organization funds can only be charged by the org owner or the default org + CEO flag. + +## Command + +| Command | Arguments | Returns | +| ---------------- | --------------- | --------------------- | +| `store:checkout` | `checkout_json` | Checkout result JSON. | + +## Result Model + +```json +{ + "chargedTotal": 2000.0, + "paymentMethod": "bank", + "message": "Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).", + "lockerGranted": [], + "vehicleGranted": [], + "lockerPatch": {}, + "vaPatch": {}, + "vgaragePatch": {}, + "bankPatch": {}, + "orgPatch": {}, + "orgTargetUids": [] +} +``` + +Patch fields are intended for UI updates after checkout. The service commits +all grants and payment changes together, and attempts rollback if a later write +fails. + +## Player Bank Checkout + +```sqf +private _item = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["category", "weapon"], + ["priceValue", 500], + ["quantity", 1] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [_item]], + ["vehicles", []] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Organization Funds Checkout + +When `paymentMethod` is `org_funds`, vehicles are also added to the +organization fleet patch. + +```sqf +private _vehicle = createHashMapFromArray [ + ["classname", "B_Quadbike_01_F"], + ["category", "cars"], + ["priceValue", 1500] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "org_funds"], + ["items", []], + ["vehicles", [_vehicle]] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Checkout failed: %1", _payload]; +}; + +private _checkoutResult = fromJSON _payload; +``` + + +# Task Usage Guide + +The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants. + +The server addon at `arma/server/addons/task` also owns task execution: +creating BIS tasks, registering task entities, tracking participants, binding +task ownership, applying player/org rewards, and clearing task state when a +task completes. + +Runtime dependencies: + +- `forge_server_extension` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_bank` +- `forge_server_org` +- `forge_client_notifications` + +## Data Model + +Catalog entries are flexible JSON objects. The service normalizes these fields +when a catalog entry is inserted or ownership changes: + +- `taskId` +- `taskID` +- `accepted` +- `requesterUid` +- `orgID` + +Ownership context: + +```json +{ + "requesterUid": "76561198000000000", + "orgId": "default" +} +``` + +## Commands + +| Command | Arguments | Returns | +| ------------------------------- | --------------------------- | -------------------------------- | +| `task:reset` | none | `true`. | +| `task:catalog:active` | none | Active catalog entry array JSON. | +| `task:catalog:get` | `task_id` | Catalog entry JSON or `null`. | +| `task:catalog:upsert` | `task_id`, `entry_json` | Stored catalog entry JSON. | +| `task:catalog:delete` | `task_id` | `true`. | +| `task:ownership:bind` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:release` | `task_id` | Ownership mutation result JSON. | +| `task:ownership:accept` | `task_id`, `ownership_json` | Ownership mutation result JSON. | +| `task:ownership:reward_context` | `task_id` | Reward context JSON. | +| `task:status:set` | `task_id`, `status` | `true`. | +| `task:status:get` | `task_id` | Status string JSON. | +| `task:status:clear` | `task_id` | `true`. | +| `task:defuse:increment` | `task_id` | New counter value JSON. | +| `task:defuse:get` | `task_id` | Counter value JSON. | +| `task:clear` | `task_id` | `true`. | + +## Upsert a Catalog Entry + +```sqf +private _entry = createHashMapFromArray [ + ["title", "Destroy Cache"], + ["description", "Destroy the enemy supply cache."], + ["reward", 1500] +]; + +private _result = "forge_server" callExtension ["task:catalog:upsert", [ + "task-cache-1", + toJSON _entry +]]; +``` + +## Mark a Task Active + +```sqf +"forge_server" callExtension ["task:status:set", [ + "task-cache-1", + "active" +]]; + +private _active = "forge_server" callExtension ["task:catalog:active", []]; +``` + +Completed statuses `succeeded` and `failed` are also stored as completed status +fallbacks. Clearing status removes active and completed state. + +## Accept a Task + +```sqf +private _ownership = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", "default"] +]; + +private _result = "forge_server" callExtension ["task:ownership:accept", [ + "task-cache-1", + toJSON _ownership +]]; +``` + +`task:ownership:accept` fails if the task is not active or another requester +already accepted it. + +## Rewards + +```sqf +private _result = "forge_server" callExtension ["task:ownership:reward_context", [ + "task-cache-1" +]]; + +private _context = fromJSON (_result select 0); +``` + +The reward context contains `requesterUid` and `orgId`. + +## Server Task Flows + +The task addon provides these server-owned task flows: + +- `attack` +- `defend` +- `defuse` +- `delivery` +- `destroy` +- `hostage` +- `hvt` + +Mission designers can create tasks in four ways: + +- Eden modules for editor-authored tasks. +- `forge_server_task_fnc_startTask` for script-authored tasks. +- `forge_server_task_fnc_handler` for pre-registered entities with reputation + gating and ownership binding. This path expects the BIS task and catalog + entry to already exist if map-task and CAD visibility are required. +- Direct task function calls for server-owned or mission-authored flows that + intentionally fall back to the `default` org. This path expects the BIS task + to already exist if map-task visibility is required. + +The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path. + +## CAD Compatibility + +CAD hydrates assignable tasks from `TaskStore.getActiveTaskCatalog`. A task must +have a catalog entry and active task status before CAD can show and assign it. + +CAD-compatible creation paths: + +- Eden modules: compatible because they delegate to + `forge_server_task_fnc_startTask`. +- `forge_server_task_fnc_startTask`: compatible because it registers the + catalog entry, creates the BIS task, and dispatches through the handler. +- Dynamic mission manager attack tasks: compatible because the mission manager + uses `forge_server_task_fnc_startTask`. + +Limited or incompatible paths: + +- `forge_server_task_fnc_handler`: only compatible if a catalog entry was + already registered elsewhere. The handler sets active status and ownership, + but it does not create the BIS task shown in the map task tab or upsert the + catalog entry. +- Direct task function calls: not CAD-compatible by default. They bypass + `startTask` and usually do not register the task catalog entry or active + status that CAD hydrates from. They also only call `BIS_fnc_taskSetState` at + completion/failure; they do not create the BIS task first. + +## BIS Map Task Prerequisite + +Only the Eden task modules and `forge_server_task_fnc_startTask` create the BIS +task automatically through `BIS_fnc_taskCreate`. + +If a mission uses `forge_server_task_fnc_handler` directly or calls a task flow +function such as `forge_server_task_fnc_attack`, the mission must create a BIS +task with the same task ID before the Forge task completes. Otherwise the +success/failure `BIS_fnc_taskSetState` call has no visible map task to update. + +That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted `BIS_fnc_taskCreate` call. `forge_server_task_fnc_startTask` is the +preferred Forge path because it handles BIS task creation, Forge catalog +registration, entity registration, and handler dispatch together. + +## Eden Modules + +Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules. + +Available task modules: + +- `FORGE_Module_Attack`: sync directly to target units or vehicles. +- `FORGE_Module_Destroy`: sync directly to objects, vehicles, or units. +- `FORGE_Module_Defuse`: sync to `FORGE_Module_Explosives` and optionally + `FORGE_Module_Protected`. +- `FORGE_Module_Delivery`: sync to `FORGE_Module_Cargo`; the cargo module syncs + to cargo objects. +- `FORGE_Module_Hostage`: sync to `FORGE_Module_Hostages` and + `FORGE_Module_Shooters`. +- `FORGE_Module_HVT`: sync directly to HVT units. +- `FORGE_Module_Defend`: configure the defense marker and wave settings. + +These modules delegate to `forge_server_task_fnc_startTask`. + +## Scripted Start Task + +Use `forge_server_task_fnc_startTask` when creating tasks from modules, +mission scripts, or generated mission-manager content. It registers task +entities, creates the BIS task, stores the catalog entry, then dispatches +through `forge_server_task_fnc_handler`. + +```sqf +[ + "attack", + "compound_attack_01", + getPosATL leader1, + "Attack: East Compound", + "Eliminate all hostile forces.", + createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", 3], + ["funds", 50000], + ["ratingFail", -10], + ["ratingSuccess", 20], + ["timeLimit", 900] + ], + 0, + getPlayerUID player, + "script" +] call forge_server_task_fnc_startTask; +``` + +## Handler Calls + +Use `forge_server_task_fnc_handler` directly when the task entities are already +registered and you want reputation gating plus ownership binding. Create the +BIS task and catalog entry separately if this task should appear in the map +task tab or CAD: + +```sqf +[ + "delivery", + ["delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900], + 250, + getPlayerUID player +] call forge_server_task_fnc_handler; +``` + +## Direct Task Calls + +Direct task function calls still work for mission-authored or server-owned +tasks, but they do not provide a requester UID. Ownership falls back to the +`default` org. Create the BIS task separately if this task should appear in the +map task tab. + +## Timer Semantics + +Task time limits use `0` for no limit: + +- attack `timeLimit` +- destroy `timeLimit` +- delivery `timeLimit` +- hostage `timeLimit` +- HVT `timeLimit` + +Positive values are measured in seconds. Do not pass `-1` as a no-limit value; +the task runtime treats any non-zero task time limit as active. + +Defuse IED timers are different. `iedTimer` must be greater than `0`, because +IEDs are expected to have an active countdown. The Eden defuse module defaults +to `300` seconds. + +## Defuse Counter + +```sqf +"forge_server" callExtension ["task:defuse:increment", ["task-cache-1"]]; +private _count = "forge_server" callExtension ["task:defuse:get", ["task-cache-1"]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Task error: %1", _payload]; +}; +``` + + +# Bank Usage Guide + +The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, and PIN validation. + +## Storage Model + +Bank data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "bank": 1000.0, + "cash": 250.0, + "earnings": 0.0, + "pin": 1234, + "transactions": [] +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument. +- `name` cannot be empty. +- `bank` and `cash` cannot be negative. +- `pin` must be a four-digit number. +- Durable `bank:get` requires an existing bank account. + +## Durable Commands + +| Command | Arguments | Returns | +| ------------- | ------------------- | -------------------- | +| `bank:create` | `uid`, `bank_json` | Persisted bank JSON. | +| `bank:get` | `uid` | Bank JSON. | +| `bank:update` | `uid`, `patch_json` | Updated bank JSON. | +| `bank:exists` | `uid` | `true` or `false`. | +| `bank:delete` | `uid` | `OK`. | + +## Create an Account + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _account = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["bank", 0], + ["cash", 0], + ["earnings", 0], + ["pin", 1234], + ["transactions", []] +]; + +private _result = "forge_server" callExtension ["bank:create", [ + getPlayerUID player, + toJSON _account +]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| --------------------------- | ---------------------------------------------------- | --------------------------------------------- | +| `bank:hot:init` | `uid` | Bank JSON loaded into hot state. | +| `bank:hot:get` | `uid` | Bank JSON. | +| `bank:hot:override` | `uid`, `bank_json` | Bank JSON. | +| `bank:hot:patch` | `uid`, `patch_json` | `{ account, patch }`. | +| `bank:hot:deposit` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:withdraw` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:deposit_earnings` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:transfer` | `source_uid`, `target_uid`, `amount`, `context_json` | Transfer result JSON. | +| `bank:hot:charge_checkout` | `uid`, `amount`, `context_json` | `{ account, patch }`. | +| `bank:hot:validate_pin` | `uid`, `pin`, `context_json` | `{}` on success. | +| `bank:hot:save` | `uid` | Current hot bank JSON and async durable save. | +| `bank:hot:remove` | `uid` | `OK`. | + +Use hot-state commands for UI workflows. They return patch objects so the UI can +update only changed fields. + +## Deposit and Withdraw + +ATM sessions require `atmAuthorized: true`. Full bank sessions can set +`mode: "bank"`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "atm"], + ["atmAuthorized", true] +]; + +private _deposit = "forge_server" callExtension ["bank:hot:deposit", [ + getPlayerUID player, + "100", + toJSON _context +]]; + +private _withdraw = "forge_server" callExtension ["bank:hot:withdraw", [ + getPlayerUID player, + "50", + toJSON _context +]]; +``` + +## Transfer + +Transfers are only available from the full bank interface. `fromField` can be +`bank` or `cash`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false], + ["fromField", "bank"] +]; + +private _result = "forge_server" callExtension ["bank:hot:transfer", [ + getPlayerUID player, + _targetUid, + "250", + toJSON _context +]]; +``` + +## Checkout Charge + +Checkout charging supports `sourceField: "cash"` or `sourceField: "bank"`. +Set `commit` to `false` to preview the patch without saving. + +```sqf +private _context = createHashMapFromArray [ + ["sourceField", "bank"], + ["commit", true] +]; + +private _result = "forge_server" callExtension ["bank:hot:charge_checkout", [ + getPlayerUID player, + "125", + toJSON _context +]]; +``` + +## PIN Validation + +PIN entry is only valid in ATM mode. + +```sqf +private _context = createHashMapFromArray [["mode", "atm"]]; + +private _result = "forge_server" callExtension ["bank:hot:validate_pin", [ + getPlayerUID player, + "1234", + toJSON _context +]]; +``` + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["bank:hot:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Bank error: %1", _payload]; +}; + +private _bank = fromJSON _payload; +``` + + +# CAD Usage Guide + +The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle. + +## Data Model + +Most CAD records are flexible JSON objects. The service normalizes important +IDs and returns structured mutation results for higher-level workflows. + +Common generated IDs: + +- Orders: `cad-order:` +- Requests: `cad-request:` +- Assignments usually share a task ID or order ID. + +## Commands + +### Activity + +| Command | Arguments | Returns | +| --------------------- | --------------- | --------------------------- | +| `cad:activity:append` | `activity_json` | `OK`. | +| `cad:activity:recent` | `limit` | Recent activity array JSON. | + +### Assignments + +| Command | Arguments | Returns | +| ----------------------------- | ----------------------------- | ------------------------------------------------------- | +| `cad:assignments:list` | none | Assignment array JSON. | +| `cad:assignments:assign` | `entry_id`, `assignment_json` | Assignment mutation result JSON. | +| `cad:assignments:acknowledge` | `entry_id`, `patch_json` | Assignment mutation result JSON. | +| `cad:assignments:decline` | `entry_id`, `patch_json` | Assignment mutation result JSON and removes assignment. | +| `cad:assignments:upsert` | `entry_id`, `assignment_json` | `OK`. | +| `cad:assignments:delete` | `entry_id` | `OK`. | + +### Orders + +| Command | Arguments | Returns | +| -------------------------------- | ------------------------ | ----------------------------------------------------------------- | +| `cad:orders:list` | none | Order array JSON. | +| `cad:orders:create` | `order_seed_json` | Dispatch order mutation result JSON. | +| `cad:orders:create_from_context` | `context_json` | Dispatch order mutation result JSON. | +| `cad:orders:close` | `entry_id` | Dispatch order mutation result JSON and removes order/assignment. | +| `cad:orders:upsert` | `entry_id`, `order_json` | `OK`. | +| `cad:orders:delete` | `entry_id` | `OK`. | + +### Requests + +| Command | Arguments | Returns | +| ---------------------------------- | -------------------------- | ------------------------------------------------- | +| `cad:requests:list` | none | Request array JSON. | +| `cad:requests:submit` | `request_json` | Request mutation result JSON. | +| `cad:requests:submit_from_context` | `context_json` | Request mutation result JSON. | +| `cad:requests:close` | `entry_id` | Request mutation result JSON and removes request. | +| `cad:requests:upsert` | `entry_id`, `request_json` | `OK`. | +| `cad:requests:delete` | `entry_id` | `OK`. | + +### Profiles and Views + +| Command | Arguments | Returns | +| ---------------------------------- | -------------------------- | ----------------------------- | +| `cad:profiles:list` | none | Profile array JSON. | +| `cad:profiles:update_from_context` | `context_json` | Profile mutation result JSON. | +| `cad:profiles:upsert` | `entry_id`, `profile_json` | `OK`. | +| `cad:profiles:delete` | `entry_id` | `OK`. | +| `cad:groups:build` | `groups_seed_json` | Group array JSON. | +| `cad:view:hydrate` | `hydrate_seed_json` | Hydrated CAD payload JSON. | + +## Submit a Support Request + +```sqf +private _fields = createHashMapFromArray [ + ["pickup_location", "Grid 123456"], + ["precedence", "urgent"], + ["security", "secure"] +]; + +private _context = createHashMapFromArray [ + ["type", "medevac_9line"], + ["fields", _fields], + ["groupId", "alpha"], + ["groupCallsign", "Alpha 1-1"], + ["submittedByUid", getPlayerUID player], + ["submittedByName", name player], + ["priority", "emergency"], + ["position", getPosATL player], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [ + toJSON _context +]]; +``` + +Supported priority values are `routine`, `priority`, and `emergency`. Unknown +values normalize to `priority`. + +## Create a Dispatch Order + +```sqf +private _context = createHashMapFromArray [ + ["assigneeGroupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["targetGroupId", "alpha"], + ["targetGroupCallsign", "Alpha 1-1"], + ["targetPosition", getPosATL player], + ["createdByUid", getPlayerUID player], + ["createdByName", name player], + ["requestId", "cad-request:1"], + ["requestType", "logreq"], + ["requestTitle", "LOGREQ | Alpha 1-1"], + ["requestSummary", "Ammo resupply requested"], + ["requestFields", createHashMap], + ["note", "Support Alpha 1-1 at current position."], + ["priority", "priority"], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:orders:create_from_context", [ + toJSON _context +]]; +``` + +## Assignment Workflow + +```sqf +private _assignment = createHashMapFromArray [ + ["groupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["assignedByUid", getPlayerUID player], + ["assignedByName", name player], + ["assignedAt", diag_tickTime], + ["state", "assigned"] +]; + +"forge_server" callExtension ["cad:assignments:assign", [ + "task-123", + toJSON _assignment +]]; + +private _ack = createHashMapFromArray [ + ["state", "acknowledged"], + ["acknowledgedByUid", getPlayerUID player], + ["acknowledgedAt", diag_tickTime] +]; + +"forge_server" callExtension ["cad:assignments:acknowledge", [ + "task-123", + toJSON _ack +]]; +``` + +## Hydrate the CAD UI + +```sqf +private _session = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["orgId", "default"], + ["isDispatcher", true], + ["groupId", "alpha"], + ["isLeader", true] +]; + +private _seed = createHashMapFromArray [ + ["groups", _liveGroups], + ["activeTasks", _activeTasks], + ["session", _session] +]; + +private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["CAD error: %1", _payload]; +}; +``` + + +# Economy Usage Guide + +The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied. + +## Dependencies + +- `forge_server_common` for logging, formatting, and player lookup. +- `forge_server_bank` for personal medical billing. +- `forge_server_org` for organization-funded services and medical fallback + debt. +- `forge_client_actor` and `forge_client_notifications` for targeted client + responses. + +## Fuel + +Fuel is organization-funded. + +When refueling stops, `fnc_initFEconomyStore.sqf` calculates the fuel delta and +cost, charges the player's organization through `OrgStore chargeCheckout`, and +syncs the organization patch to online members. If organization funds cannot +cover the refuel, the vehicle is rolled back to the fuel level it had when the +session started. + +Garage UI refuel requests use the server `RefuelService` event. The fuel store +calculates missing fuel from the vehicle config `fuelCapacity`, charges the +player's organization, and fills the vehicle only after the organization charge +succeeds. + +## Repair + +Repair is organization-funded. + +Use the repair service event: + +```sqf +[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service repair cost. +The target is only repaired after the organization charge succeeds. + +The client garage UI forwards selected nearby vehicle repair requests through +the same event. + +## Medical + +Medical is player-funded first. + +When a heal is requested, `fnc_initMEconomyStore.sqf` uses this billing order: + +1. Charge the player's bank balance when it can cover the medical fee. +2. Otherwise charge the player's cash when it can cover the fee. +3. If neither personal balance can cover the fee, charge organization funds. +4. When organization funds cover the fallback charge, record the same amount as + debt on the player's organization credit line. + +The heal only completes after one of those charges succeeds. If personal +billing is unavailable, the heal does not fall back to organization funds +because the server cannot verify that the player is unable to cover the fee. + +## Medical Debt Repayment + +Medical fallback debt uses the existing organization credit-line repayment +flow. The organization treasury is reduced when the service is rendered, and +the player's credit-line `amount_due` increases by the medical fee. When the +player repays through the bank credit-line repayment action, player bank funds +are moved back into the organization treasury. + +## Hot-Cache Boundary + +The economy addon should stay server-authoritative for world effects such as +vehicle fuel, vehicle repair, healing, respawn placement, and death inventory +movement. Bank and organization balances should continue to mutate through the +extension-backed hot-cache services. + + +# Garage Usage Guide + +The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage. + +## Storage Model + +Garage data is persisted through SurrealDB by the server extension. + +```json +{ + "plate-uuid": { + "plate": "plate-uuid", + "classname": "B_Quadbike_01_F", + "fuel": 1.0, + "damage": 0.0, + "hit_points": { + "names": ["hitengine"], + "selections": ["engine_hitpoint"], + "values": [0.0] + } + } +} +``` + +Rules validated by the Rust service: + +- A player garage can contain up to 5 vehicles. +- `garage:add` generates a UUID plate automatically. +- `fuel`, `damage`, and every hit point value must be between `0.0` and `1.0`. +- `hit_points.names`, `hit_points.selections`, and `hit_points.values` must have + the same length. +- `garage:get`, `garage:patch`, and `garage:remove` require an existing garage. +- `garage:add` creates an empty garage automatically when one does not exist. + +## Commands + +All commands are called on the `garage` group. + +| Command | Arguments | Returns | +| --------------- | ---------------------- | ----------------------------- | +| `garage:create` | `uid` | Empty vehicle map as JSON. | +| `garage:get` | `uid` | Vehicle map as JSON. | +| `garage:add` | `uid`, `vehicle_json` | Updated vehicle map as JSON. | +| `garage:update` | `uid`, `vehicles_json` | Replaced vehicle map as JSON. | +| `garage:patch` | `uid`, `patch_json` | Updated vehicle map as JSON. | +| `garage:remove` | `uid`, `remove_json` | Updated vehicle map as JSON. | +| `garage:delete` | `uid` | `OK`. | +| `garage:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Garage error: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +## Add a Vehicle + +`garage:add` requires `classname`, `fuel`, `damage`, and `hit_points`. + +```sqf +private _hitPointData = getAllHitPointsDamage _vehicle; +private _hitPoints = createHashMapFromArray [ + ["names", _hitPointData select 0], + ["selections", _hitPointData select 1], + ["values", _hitPointData select 2] +]; + +private _vehicleData = createHashMapFromArray [ + ["classname", typeOf _vehicle], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle], + ["hit_points", _hitPoints] +]; + +private _result = "forge_server" callExtension ["garage:add", [ + getPlayerUID player, + toJSON _vehicleData +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store vehicle: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +The returned value is a hash map keyed by generated plate. To find the newly +stored vehicle, compare returned keys before and after the add, or search by +classname if your workflow guarantees a unique pending vehicle. + +```sqf +private _storedPlate = ""; +{ + private _vehicleRecord = _garage get _x; + if ((_vehicleRecord get "classname") == typeOf _vehicle) then { + _storedPlate = _x; + }; +} forEach keys _garage; +``` + +## Patch a Vehicle + +`garage:patch` updates selected fields for one plate. The `plate` field is +required. `fuel`, `damage`, and `hit_points` are optional. + +```sqf +private _patch = createHashMapFromArray [ + ["plate", _vehicle getVariable ["forge_garage_plate", ""]], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle] +]; + +private _result = "forge_server" callExtension ["garage:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove a Vehicle + +`garage:remove` expects JSON with a `plate` field. + +```sqf +private _remove = createHashMapFromArray [ + ["plate", _plate] +]; + +private _result = "forge_server" callExtension ["garage:remove", [ + getPlayerUID player, + toJSON _remove +]]; +``` + +## Spawn a Stored Vehicle + +```sqf +fnc_spawnGarageVehicle = { + params ["_plate"]; + + private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load garage: %1", _payload]; + objNull + }; + + private _garage = fromJSON _payload; + private _vehicleData = _garage getOrDefault [_plate, createHashMap]; + if (_vehicleData isEqualTo createHashMap) exitWith { + hint "Vehicle plate was not found in your garage."; + objNull + }; + + private _vehicle = (_vehicleData get "classname") createVehicle (player getPos [10, getDir player]); + _vehicle setFuel (_vehicleData getOrDefault ["fuel", 1]); + _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]); + _vehicle setVariable ["forge_garage_plate", _plate, true]; + + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _names = _hitPoints getOrDefault ["names", []]; + private _values = _hitPoints getOrDefault ["values", []]; + + { + _vehicle setHitPointDamage [_x, _values select _forEachIndex]; + } forEach _names; + + private _remove = createHashMapFromArray [["plate", _plate]]; + "forge_server" callExtension ["garage:remove", [getPlayerUID player, toJSON _remove]]; + + _vehicle +}; +``` + +## Hot State + +The `garage:hot:*` commands keep a runtime copy of a player's garage and write +it back only when `garage:hot:save` runs. + +| Command | Arguments | Returns | +| --------------------------- | ---------------------- | -------------------------------- | +| `garage:hot:init` | `uid` | Vehicle map as JSON. | +| `garage:hot:get` | `uid` | Vehicle map as JSON. | +| `garage:hot:override` | `uid`, `vehicles_json` | Vehicle map as JSON. | +| `garage:hot:add` | `uid`, `vehicle_json` | Vehicle map as JSON. | +| `garage:hot:remove_vehicle` | `uid`, `remove_json` | Vehicle map as JSON. | +| `garage:hot:save` | `uid` | Current hot vehicle map as JSON. | +| `garage:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy vehicle workflows. Use the durable commands for +simple store/retrieve operations. + +## Best Practices + +- Store the generated plate on spawned vehicles with `setVariable`. +- Use `garage:patch` for frequent fuel and damage syncs. +- Use `garage:update` only when replacing the whole vehicle map intentionally. +- Do not delete the world vehicle until `garage:add` succeeds. +- Treat vehicle maps as hash maps keyed by plate, not arrays. + + +# Locker Usage Guide + +The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +[Owned Storage Usage Guide](https://innovativedevsolutions.github.io/server-modules/owned-storage). + +## Storage Model + +Locker data is persisted through SurrealDB by the server extension. + +```json +{ + "arifle_MX_F": { + "category": "weapon", + "classname": "arifle_MX_F", + "amount": 1 + } +} +``` + +Rules validated by the Rust service: + +- A locker can contain up to 25 unique classnames. +- `category` and `classname` cannot be empty. +- `amount` must be greater than `0`. +- `locker:add` creates an empty locker automatically when one does not exist. +- `locker:get`, `locker:patch`, and `locker:remove` require an existing locker. +- `locker:remove` takes the classname directly, not a JSON object. + +## Commands + +All commands are called on the `locker` group. + +| Command | Arguments | Returns | +| --------------- | ------------------- | -------------------------- | +| `locker:create` | `uid` | Empty item map as JSON. | +| `locker:get` | `uid` | Item map as JSON. | +| `locker:add` | `uid`, `item_json` | Updated item map as JSON. | +| `locker:update` | `uid`, `items_json` | Replaced item map as JSON. | +| `locker:patch` | `uid`, `patch_json` | Updated item map as JSON. | +| `locker:remove` | `uid`, `classname` | Updated item map as JSON. | +| `locker:delete` | `uid` | `OK`. | +| `locker:exists` | `uid` | `true` or `false`. | + +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Locker error: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Add an Item + +`locker:add` creates or overwrites one classname entry. + +```sqf +private _item = createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] +]; + +private _result = "forge_server" callExtension ["locker:add", [ + getPlayerUID player, + toJSON _item +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store item: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Patch an Amount + +`locker:patch` currently patches the `amount` field for an existing classname. + +```sqf +private _patch = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["amount", 5] +]; + +private _result = "forge_server" callExtension ["locker:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove an Item + +`locker:remove` takes the classname as the second argument. + +```sqf +private _result = "forge_server" callExtension ["locker:remove", [ + getPlayerUID player, + "arifle_MX_F" +]]; +``` + +## Retrieve an Item + +```sqf +fnc_retrieveLockerItem = { + params ["_classname"]; + + private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load locker: %1", _payload]; + false + }; + + private _locker = fromJSON _payload; + private _item = _locker getOrDefault [_classname, createHashMap]; + if (_item isEqualTo createHashMap) exitWith { + hint "Item was not found in your locker."; + false + }; + + private _amount = _item getOrDefault ["amount", 0]; + if (_amount <= 0) exitWith { + hint "Item is out of stock."; + false + }; + + if !(player canAdd _classname) exitWith { + hint "Not enough inventory space."; + false + }; + + player addItem _classname; + + if (_amount > 1) then { + private _patch = createHashMapFromArray [ + ["classname", _classname], + ["amount", _amount - 1] + ]; + "forge_server" callExtension ["locker:patch", [getPlayerUID player, toJSON _patch]]; + } else { + "forge_server" callExtension ["locker:remove", [getPlayerUID player, _classname]]; + }; + + true +}; +``` + +## Replace the Whole Locker + +`locker:update` replaces the whole item map. Use it for explicit bulk syncs, +not single-item changes. + +```sqf +private _items = createHashMapFromArray [ + ["arifle_MX_F", createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] + ]] +]; + +private _result = "forge_server" callExtension ["locker:update", [ + getPlayerUID player, + toJSON _items +]]; +``` + +## Hot State + +The `locker:hot:*` commands keep a runtime copy of a player's locker and write +it back only when `locker:hot:save` runs. + +| Command | Arguments | Returns | +| --------------------- | ------------------- | ----------------------------- | +| `locker:hot:init` | `uid` | Item map as JSON. | +| `locker:hot:get` | `uid` | Item map as JSON. | +| `locker:hot:override` | `uid`, `items_json` | Item map as JSON. | +| `locker:hot:save` | `uid` | Current hot item map as JSON. | +| `locker:hot:remove` | `uid` | `OK`. | + +Use hot state for session-heavy locker workflows. Use the durable commands for +simple item deposits and withdrawals. + +## Best Practices + +- Keep categories normalized, for example `weapon`, `magazine`, `item`, or + `backpack`. +- Use `locker:patch` for quantity changes. +- Use `locker:remove` when quantity reaches zero. +- Treat the locker response as a hash map keyed by classname. +- Check capacity before bulk operations that may exceed 25 unique items. + + +# Organization Usage Guide + +The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows. + +## Storage Model + +Core organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {} +} +``` + +Hot organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {}, + "assets": {}, + "fleet": {}, + "members": {}, + "pending_invites": {} +} +``` + +Rules validated by the Rust service: + +- `id` must be non-empty and contain only alphanumeric characters or `_`. +- `owner` must be `server` or a 17-digit Steam UID. +- `name` cannot be empty, cannot exceed 100 characters, and cannot contain + control characters. +- `funds`, reputation, and credit line amounts cannot be negative. +- Player registration is rejected when the player already belongs to a + non-default organization. + +## Durable Commands + +| Command | Arguments | Returns | +| -------------------- | ----------------------- | -------------------------- | +| `org:create` | `org_id`, `org_json` | Organization JSON. | +| `org:get` | `org_id` | Organization JSON. | +| `org:update` | `org_id`, `patch_json` | Updated organization JSON. | +| `org:exists` | `org_id` | `true` or `false`. | +| `org:delete` | `org_id` | `OK`. | +| `org:assets:get` | `org_id` | Asset map JSON. | +| `org:assets:update` | `org_id`, `assets_json` | Updated asset map JSON. | +| `org:fleet:get` | `org_id` | Fleet map JSON. | +| `org:fleet:update` | `org_id`, `fleet_json` | Updated fleet map JSON. | +| `org:members:get` | `org_id` | Member array JSON. | +| `org:members:add` | `org_id`, `member_uid` | `OK`. | +| `org:members:remove` | `org_id`, `member_uid` | `OK`. | + +## Create an Organization + +The command key is authoritative for `id`. + +```sqf +private _org = createHashMapFromArray [ + ["id", _orgId], + ["owner", getPlayerUID player], + ["name", "Spearnet Logistics"], + ["funds", 0], + ["reputation", 0], + ["credit_lines", createHashMap] +]; + +private _result = "forge_server" callExtension ["org:create", [ + _orgId, + toJSON _org +]]; +``` + +## Update Organization Funds + +```sqf +private _patch = createHashMapFromArray [ + ["funds", 5000], + ["reputation", 10] +]; + +private _result = "forge_server" callExtension ["org:update", [ + _orgId, + toJSON _patch +]]; +``` + +Supported durable patch fields are `id`, `owner`, `name`, `funds`, +`reputation`, and `credit_lines`. + +## Assets and Fleet + +Assets are grouped by category, then classname. + +```sqf +private _assets = createHashMapFromArray [ + ["ammo", createHashMapFromArray [ + ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [ + ["classname", "ACE_30Rnd_65x39_caseless_mag"], + ["type", "ammo"], + ["quantity", 20] + ]] + ]] +]; + +"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]]; +``` + +Fleet is keyed by an internal fleet entry ID. + +```sqf +private _fleet = createHashMapFromArray [ + ["B_Truck_01_transport_F_0", createHashMapFromArray [ + ["classname", "B_Truck_01_transport_F"], + ["name", "Transport Truck"], + ["type", "cars"], + ["status", "Ready"], + ["damage", "0%"] + ]] +]; + +"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]]; +``` + +## Hot-State Commands + +| Command | Arguments | Returns | +| ---------------------------- | ----------------------------- | ----------------------------------------------------- | +| `org:hot:init` | `org_id` | Hot organization JSON. | +| `org:hot:get` | `org_id` | Hot organization JSON. | +| `org:hot:override` | `org_id`, `hot_org_json` | Hot organization JSON. | +| `org:hot:ensure_member` | `context_json` | Hot organization JSON. | +| `org:hot:member_invites` | `member_uid` | Invite array JSON. | +| `org:hot:register` | `context_json` | Register result JSON. | +| `org:hot:invite_member` | `context_json` | Invite result JSON. | +| `org:hot:accept_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:decline_invite` | `context_json` | Invite decision result JSON. | +| `org:hot:assign_credit_line` | `context_json` | Mutation result JSON. | +| `org:hot:repay_credit_line` | `context_json` | Repayment result JSON. | +| `org:hot:charge_checkout` | `context_json` | Mutation result JSON. | +| `org:hot:add_assets` | `context_json`, `assets_json` | Mutation result JSON. | +| `org:hot:add_fleet` | `context_json`, `fleet_json` | Mutation result JSON. | +| `org:hot:leave` | `context_json` | Leave result JSON. | +| `org:hot:disband` | `context_json` | Disband result JSON. | +| `org:hot:save` | `org_id` | Current hot organization JSON and async durable save. | +| `org:hot:remove` | `org_id` | `OK`. | + +## Register from UI Context + +```sqf +private _context = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["orgName", "Spearnet Logistics"], + ["existingOrgId", "default"] +]; + +private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]]; +``` + +## Invite and Accept + +```sqf +private _invite = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["targetUid", _targetUid], + ["targetName", _targetName], + ["targetOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]]; + +private _decision = createHashMapFromArray [ + ["requesterUid", _targetUid], + ["requesterName", _targetName], + ["orgId", _orgId], + ["existingOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]]; +``` + +## Credit Line Checkout + +```sqf +private _credit = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["memberUid", _memberUid], + ["memberName", _memberName], + ["amount", 1000] +]; + +"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]]; + +private _charge = createHashMapFromArray [ + ["requesterUid", _memberUid], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["source", "credit_line"], + ["amount", 250], + ["commit", true] +]; + +"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Organization error: %1", _payload]; +}; +``` + + +# Owned Storage Usage Guide + +Owned storage covers the `owned:locker` and `owned:garage` extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances. + +Use these modules for virtual arsenal and virtual garage unlocks. Use +[Locker Usage Guide](https://innovativedevsolutions.github.io/server-modules/locker) and +[Garage Usage Guide](https://innovativedevsolutions.github.io/server-modules/garage) for physical inventory and stored +vehicle instances. + +## Owned Locker Model + +```json +{ + "items": ["FirstAidKit"], + "weapons": ["arifle_MX_F"], + "magazines": ["30Rnd_65x39_caseless_black_mag"], + "backpacks": ["B_AssaultPack_rgr"] +} +``` + +Supported owned locker categories: + +- `items` +- `weapons` +- `magazines` +- `backpacks` + +New owned lockers are created with default unlocks from the Rust model. + +## Owned Garage Model + +```json +{ + "cars": ["B_Quadbike_01_F"], + "armor": [], + "helis": [], + "planes": [], + "naval": [], + "other": [] +} +``` + +Supported owned garage categories: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +The durable `owned:garage:remove` command currently accepts `heli` for the +helicopter category. Add, get, and hot remove accept `helis`. + +New owned garages are created with default unlocks from the Rust model. + +## Owned Locker Commands + +| Command | Arguments | Returns | +| --------------------- | ------------------------------------ | ------------------------------ | +| `owned:locker:create` | `uid` | Full owned locker JSON. | +| `owned:locker:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:get` | `uid`, `category` | Category classname array JSON. | +| `owned:locker:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:locker:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:locker:delete` | `uid` | `OK`. | +| `owned:locker:exists` | `uid` | `true` or `false`. | + +## Owned Garage Commands + +| Command | Arguments | Returns | +| --------------------- | ------------------------------------ | ------------------------------ | +| `owned:garage:create` | `uid` | Full owned garage JSON. | +| `owned:garage:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:get` | `uid`, `category` | Category classname array JSON. | +| `owned:garage:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:remove` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:delete` | `uid` | `OK`. | +| `owned:garage:exists` | `uid` | `true` or `false`. | + +## Add Virtual Arsenal Unlocks + +```sqf +private _classes = ["arifle_MX_F", "hgun_P07_F"]; + +private _result = "forge_server" callExtension ["owned:locker:add", [ + getPlayerUID player, + "weapons", + toJSON _classes +]]; +``` + +## Add Virtual Garage Unlocks + +```sqf +private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"]; + +private _result = "forge_server" callExtension ["owned:garage:add", [ + getPlayerUID player, + "cars", + toJSON _classes +]]; +``` + +## Remove an Unlock + +```sqf +"forge_server" callExtension ["owned:locker:remove", [ + getPlayerUID player, + "weapons", + "arifle_MX_F" +]]; + +"forge_server" callExtension ["owned:garage:remove", [ + getPlayerUID player, + "cars", + "B_Quadbike_01_F" +]]; +``` + +## Hot-State Commands + +Both owned storage modules support hot state. + +Owned locker: + +| Command | Arguments | Returns | +| --------------------------- | -------------------- | ----------------------------------------------------- | +| `owned:locker:hot:init` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:fetch` | `uid` | Full owned locker JSON. | +| `owned:locker:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:locker:hot:override` | `uid`, `locker_json` | Full owned locker JSON. | +| `owned:locker:hot:save` | `uid` | Current hot owned locker JSON and async durable save. | +| `owned:locker:hot:remove` | `uid` | `OK`. | + +Owned garage: + +| Command | Arguments | Returns | +| ------------------------------ | ------------------------------------ | ----------------------------------------------------- | +| `owned:garage:hot:init` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:fetch` | `uid` | Full owned garage JSON. | +| `owned:garage:hot:get` | `uid`, `category` | Category array JSON. | +| `owned:garage:hot:override` | `uid`, `garage_json` | Full owned garage JSON. | +| `owned:garage:hot:add` | `uid`, `category`, `classnames_json` | Updated category array JSON. | +| `owned:garage:hot:remove_item` | `uid`, `category`, `classname` | Updated category array JSON. | +| `owned:garage:hot:save` | `uid` | Current hot owned garage JSON and async durable save. | +| `owned:garage:hot:remove` | `uid` | `OK`. | + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Owned storage error: %1", _payload]; +}; +``` + + +# Phone Usage Guide + +The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB. + +## Storage Model + +```json +{ + "contacts": ["76561198000000000", "field_commander"], + "messages": [ + { + "id": "phone-message:sender:receiver:1", + "from": "sender", + "to": "receiver", + "message": "Text body", + "timestamp": 123.45, + "read": false + } + ], + "emails": [ + { + "id": "phone-email:sender:receiver:2", + "from": "sender", + "to": "receiver", + "subject": "Subject", + "body": "Email body", + "timestamp": 123.45, + "read": false + } + ] +} +``` + +Rules validated by the Rust service: + +- UID arguments cannot be empty. +- Message and email bodies cannot be empty. +- Empty email subjects become `No subject`. +- Player messages and emails cannot target `field_commander`. +- `field_commander` can send messages or emails to players. +- Deleting a message or email removes it only from the requesting UID's index. + +## Commands + +| Command | Arguments | Returns | +| -------------------------- | ---------------------------------------------------- | ------------------------------------ | +| `phone:init` | `uid` | Full phone payload. | +| `phone:contacts:list` | `uid` | Contact UID array. | +| `phone:contacts:add` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:contacts:remove` | `uid`, `contact_uid` | `true` or `false`. | +| `phone:messages:list` | `uid` | Message array. | +| `phone:messages:thread` | `uid`, `other_uid` | Message array for both participants. | +| `phone:messages:send` | `from_uid`, `to_uid`, `message`, `timestamp` | Message JSON. | +| `phone:messages:mark_read` | `uid`, `message_id` | `true` or `false`. | +| `phone:messages:delete` | `uid`, `message_id` | `true` or `false`. | +| `phone:emails:list` | `uid` | Email array. | +| `phone:emails:send` | `from_uid`, `to_uid`, `subject`, `body`, `timestamp` | Email JSON. | +| `phone:emails:mark_read` | `uid`, `email_id` | `true` or `false`. | +| `phone:emails:delete` | `uid`, `email_id` | `true` or `false`. | +| `phone:remove` | `uid` | `OK`. | + +## Initialize Phone State + +`phone:init` creates phone state if needed and seeds self-contact plus +`field_commander`. + +```sqf +private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Phone init failed: %1", _payload]; +}; + +private _phone = fromJSON _payload; +``` + +## Send a Message + +```sqf +private _timestamp = str diag_tickTime; + +private _result = "forge_server" callExtension ["phone:messages:send", [ + getPlayerUID player, + _targetUid, + "Move to checkpoint Alpha.", + _timestamp +]]; +``` + +## Read a Conversation + +```sqf +private _result = "forge_server" callExtension ["phone:messages:thread", [ + getPlayerUID player, + _otherUid +]]; + +private _messages = fromJSON (_result select 0); +``` + +## Send an Email + +```sqf +private _result = "forge_server" callExtension ["phone:emails:send", [ + getPlayerUID player, + _targetUid, + "Supply Request", + "Requesting resupply at grid 123456.", + str diag_tickTime +]]; +``` + +## Mark and Delete Records + +```sqf +"forge_server" callExtension ["phone:messages:mark_read", [ + getPlayerUID player, + _messageId +]]; + +"forge_server" callExtension ["phone:emails:delete", [ + getPlayerUID player, + _emailId +]]; +``` + +## Error Handling + +```sqf +private _payload = (_result select 0); +if (_payload find "Error:" == 0) then { + systemChat format ["Phone error: %1", _payload]; +}; +``` + + +# Client Usage Guide + +Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons. + +Use this guide as the entry point for client-side integration. Domain data, +validation, persistence, rewards, ownership, and checkout behavior remain +server-side responsibilities. + +## Client Responsibilities + +- Open Arma displays and `CT_WEBBROWSER` controls. +- Load browser UI assets from each addon's `ui/_site` folder. +- Receive browser alerts through `JSDialog` handlers. +- Translate browser events into local actions or CBA server events. +- Cache display state in client repositories. +- Push server responses back into browser UIs with `ExecJS`. +- Provide local-only utility state where the feature is intentionally local. + +## Authoritative Boundaries + +Client repositories are view state. They are useful for rendering, local UI +decisions, and short-lived session behavior, but they should not be treated as +durable state. + +Authoritative state lives in: + +- server SQF addons for mission and player workflow ownership +- the `forge_server` extension for durable and hot-state domain logic +- SurrealDB where the extension persists durable domain records + +## Common Runtime Flow + +Most browser-backed client addons follow this shape: + +1. The addon creates a display, finds a browser control, and registers a + `JSDialog` event handler. +2. The browser loads an HTML entrypoint from `ui/_site`. +3. The browser sends JSON alerts with an `event` name and `data` payload. +4. `fnc_handleUIEvents.sqf` parses the alert and routes the event. +5. A bridge object or repository sends a CBA server event when server data is + needed. +6. Server responses are caught in `XEH_postInitClient.sqf`. +7. The bridge sends browser update events back through `ExecJS`. + +Browser alert payload: + +```json +{ + "event": "module::action", + "data": {} +} +``` + +## Open UI Entry Points + +| UI | Entry point | +| ------------------- | ------------------------------------------- | +| Actor menu | `call forge_client_actor_fnc_openUI;` | +| Bank | `call forge_client_bank_fnc_openUI;` | +| ATM | `[true] call forge_client_bank_fnc_openUI;` | +| CAD | `call forge_client_cad_fnc_openUI;` | +| Garage | `call forge_client_garage_fnc_openUI;` | +| Virtual garage | `call forge_client_garage_fnc_openVG;` | +| Organization portal | `call forge_client_org_fnc_openUI;` | +| Phone | `call forge_client_phone_fnc_openUI;` | +| Store | `call forge_client_store_fnc_openUI;` | + +Notifications are normally opened during client initialization and then updated +through the notification event/service. + +## Addon Guides + +- [Client Main Usage Guide](https://innovativedevsolutions.github.io/client-addons/main) +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/client-addons/common) +- [Client Actor Usage Guide](https://innovativedevsolutions.github.io/client-addons/actor) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client CAD Usage Guide](https://innovativedevsolutions.github.io/client-addons/cad) +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/client-addons/garage) +- [Client Locker Usage Guide](https://innovativedevsolutions.github.io/client-addons/locker) +- [Client Notifications Usage Guide](https://innovativedevsolutions.github.io/client-addons/notifications) +- [Client Organization Usage Guide](https://innovativedevsolutions.github.io/client-addons/organization) +- [Client Phone Usage Guide](https://innovativedevsolutions.github.io/client-addons/phone) +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/client-addons/store) + +## Extension Calls + +Client addons should usually call server SQF events, not the `forge_server` +extension directly. The server addon owns validation context and converts the +request into extension commands. + +Example: + +```sqf +[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent); +``` + +Direct extension calls from client code bypass server authorization boundaries +and should be avoided. + +## Browser Bridge Notes + +`forge_client_common_fnc_initWebUIBridge` provides reusable bridge and screen +objects for newer browser UIs. It queues outbound events until a browser screen +is ready, then delivers payloads through: + +```sqf +_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]]; +``` + +Feature addons still own their event names, request payloads, and response +mapping. + +## Development Checklist + +- Keep feature-specific behavior in the owning addon. +- Send authoritative changes to the server addon. +- Use namespaced browser events such as `bank::deposit::request`. +- Treat `profileNamespace` as local player preference or utility state only. +- Make browser-ready events request the current server state before rendering + stale data. +- Queue or ignore bridge responses when the display is closed. +- Keep mission object setup on the mission/server side and client display logic + on the client side. + + +# Client Main Usage Guide + +The client `main` addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons. + +## Purpose + +Use `forge_client_main` as the foundation dependency for client addons that +need Forge macros, function naming, settings, or mod-level configuration. + +Feature logic should stay in the owning addon. `main` should remain limited to +shared client configuration and compile infrastructure. + +## Key Files + +| File | Purpose | +| -------------------- | ---------------------------- | +| `script_mod.hpp` | Client mod identity. | +| `script_version.hpp` | Client mod version values. | +| `script_macros.hpp` | Shared client macros. | +| `CfgSettings.hpp` | Client CBA settings. | +| `config.cpp` | Addon config and mod wiring. | + +## Dependency Pattern + +Feature addons normally depend on `forge_client_main` in their `config.cpp`. + +```cpp +class forge_client_example { + requiredAddons[] = { + "forge_client_main" + }; +}; +``` + +## Usage Notes + +- Put domain UI, repositories, and event handling in feature addons. +- Put reusable browser bridge behavior in `forge_client_common`. +- Put server-only behavior in `arma/server/addons`. +- Keep settings in `CfgSettings.hpp` when they apply to the client mod as a + whole or to a client feature toggle. + +## Related Guides + +- [Client Usage Guide](https://innovativedevsolutions.github.io/client-addons) +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/client-addons/common) +- [Development Guide](https://innovativedevsolutions.github.io/getting-started/development) + + +# Client Phone Usage Guide + +The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms. + +## Open Phone UI + +```sqf +call forge_client_phone_fnc_openUI; +``` + +The phone UI creates `RscPhone`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_phone_fnc_handleUIEvents`. + +## State Ownership + +Contacts, messages, and emails are server-owned and requested through the +server phone addon. + +Local utility app state is stored in `profileNamespace`: + +- notes +- calendar events +- world clocks +- alarms +- theme/preferences + +## Phone Class + +`forge_client_phone_fnc_initClass` creates `GVAR(PhoneClass)`. + +The phone class currently owns local notes, events, and settings helpers. +Contacts, messages, and emails continue to use server-backed request/response +events. + +## Browser Events + +### Session and Preferences + +| Event | Client behavior | +| -------------------- | ----------------------------------------------- | +| `phone::get::player` | Send player UID to browser with `setPlayerUid`. | +| `phone::get::theme` | Send saved light/dark theme to browser. | +| `phone::set::theme` | Save theme preference to `profileNamespace`. | + +### Contacts + +| Event | Client behavior | +| -------------------------------- | ------------------------------------------------ | +| `phone::get::contacts` | Load cached contacts and request server refresh. | +| `phone::refresh::contacts` | Request contacts from server. | +| `phone::add::contact` | Add contact by phone number. | +| `phone::add::contact::by::phone` | Add contact by phone number. | +| `phone::add::contact::by::email` | Add contact by email. | +| `phone::remove::contact` | Remove contact by UID. | + +### Messages + +| Event | Client behavior | +| ----------------------------- | -------------------------------- | +| `phone::get::messages` | Request messages from server. | +| `phone::get::message::thread` | Request thread with another UID. | +| `phone::send::message` | Send SMS through server. | +| `phone::mark::message::read` | Mark message read on server. | +| `phone::delete::message` | Delete message on server. | + +### Email + +| Event | Client behavior | +| -------------------------- | --------------------------- | +| `phone::get::emails` | Request emails from server. | +| `phone::send::email` | Send email through server. | +| `phone::mark::email::read` | Mark email read on server. | +| `phone::delete::email` | Delete email on server. | + +### Local Utility Apps + +| Event | Client behavior | +| ---------------------- | --------------------------------- | +| `phone::get::notes` | Load local notes. | +| `phone::save::note` | Save local note. | +| `phone::delete::note` | Delete local note. | +| `phone::get::events` | Load local calendar events. | +| `phone::save::event` | Save local calendar event. | +| `phone::delete::event` | Delete local calendar event. | +| `phone::get::clocks` | Load local world clocks. | +| `phone::save::clock` | Save local world clock. | +| `phone::delete::clock` | Delete local world clock. | +| `phone::get::alarms` | Load local alarms. | +| `phone::save::alarm` | Save local alarm. | +| `phone::delete::alarm` | Delete local alarm. | +| `phone::toggle::alarm` | Toggle local alarm enabled state. | + +## Usage Rules + +- Send contact, message, and email mutations to the server phone addon. +- Keep local-only utility apps in `profileNamespace` until they are migrated to + server-backed storage. +- Do not treat local phone utility state as shared multiplayer state. +- Validate required UID, phone, email, subject, and message fields before + sending server requests. + +## Related Guides + +- [Phone Usage Guide](https://innovativedevsolutions.github.io/server-modules/phone) +- [Client Notifications Usage Guide](https://innovativedevsolutions.github.io/client-addons/notifications) + + +# Client Store Usage Guide + +The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests. + +## Open Store UI + +```sqf +call forge_client_store_fnc_openUI; +``` + +The UI opens `RscStore`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_store_fnc_handleUIEvents`. + +## Bridge + +`forge_client_store_fnc_initUIBridge` owns: + +- browser control lookup +- store hydrate requests +- category requests +- checkout requests +- category hydrate/failure responses +- checkout success/failure responses +- store config refresh after successful checkout + +Store currently uses its own `StoreUIBridge.receive(...)` browser bridge rather +than the shared `ForgeBridge.receive(...)` delivery used by newer bridges. + +## Browser Events + +| Event | Client behavior | +| -------------------------- | -------------------------------------- | +| `store::ready` | Request store hydrate from the server. | +| `store::category::request` | Request catalog items for a category. | +| `store::checkout::request` | Forward checkout JSON to the server. | +| `store::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| -------------------------- | ------------------------------------------ | +| `store::hydrate` | Initial storefront/session/config payload. | +| `store::config::hydrate` | Refreshed payment/source config. | +| `store::category::hydrate` | Category catalog payload. | +| `store::category::failure` | Category request failure. | +| `store::checkout::success` | Checkout success payload. | +| `store::checkout::failure` | Checkout failure payload. | + +## Category Requests + +Category requests require a non-empty category value. + +```json +{ + "category": "weapons" +} +``` + +The client lowercases the category before forwarding it to the server store +addon. + +## Checkout Requests + +Checkout requests send a serialized checkout payload: + +```json +{ + "checkoutJson": "{\"items\":[],\"paymentSource\":\"cash\"}" +} +``` + +The client only forwards the checkout data. The server store addon and +extension validate prices, inventory grants, payment source authorization, and +integration with bank, organization, locker, and garage state. + +After a successful checkout, the client asks the server for a fresh store config +payload so payment-source balances and permissions stay current. + +## Authoritative State + +Catalog data, prices, checkout validation, money movement, organization funds, +credit lines, locker grants, garage grants, and persistence are server-owned. + +## Related Guides + +- [Store Usage Guide](https://innovativedevsolutions.github.io/server-modules/store) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client Organization Usage Guide](https://innovativedevsolutions.github.io/client-addons/organization) +- [Client Locker Usage Guide](https://innovativedevsolutions.github.io/client-addons/locker) +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/client-addons/garage) + + +# Client Common Usage Guide + +The client `common` addon contains shared browser UI bridge declarations and +common client-side browser integration patterns. + +## Purpose + +Use `forge_client_common` when a browser-backed feature UI needs reusable +screen lifecycle behavior: + +- active browser control tracking +- browser ready state +- pending event queues +- `ExecJS` payload delivery +- shared bridge object inheritance through `createHashMapObject` + +Feature addons still own their app-specific events and server RPC mapping. + +## Shared Bridge + +Initialize the bridge declarations with: + +```sqf +private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge; +private _bridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; +``` + +Feature bridges can inherit from the shared declaration: + +```sqf +GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _bridgeDeclaration], + ["#type", "MyUIBridgeBaseClass"], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self call ["setActiveBrowserControl", [_control]]; + _self call ["sendEvent", ["myAddon::hydrate", createHashMap, _control]]; + }] +]; +``` + +## Event Delivery + +`sendEvent` builds this payload: + +```json +{ + "event": "myAddon::event", + "data": {} +} +``` + +If the browser control is missing or not ready, the payload is queued on the +screen object. When the screen marks ready, `flushPendingEvents` delivers the +queue. + +## Screen Lifecycle + +The shared screen object tracks: + +| Field | Purpose | +| --------------- | ------------------------------------------------- | +| `control` | Active browser control. | +| `readyState` | Whether the browser app has sent its ready event. | +| `pendingEvents` | Outbound events waiting for a ready browser. | + +Call `handleClose` or `dispose` when a display closes so stale controls and +queued events are cleared. + +## Current Consumers + +The common bridge pattern is used by the newer bank, CAD, garage, and +organization client bridges. Store currently keeps its own bridge object and +browser bridge function names. + +## Usage Rules + +- Keep bridge inheritance in feature addons thin and explicit. +- Keep shared code generic; do not add bank, CAD, org, or store-specific logic + to `common`. +- Prefer namespaced events such as `garage::sync`. +- Send hash maps or arrays that can be safely serialized with `toJSON`. +- Avoid direct extension calls from the client bridge; send CBA server events. + +## Related Guides + +- [Client Usage Guide](https://innovativedevsolutions.github.io/client-addons) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client CAD Usage Guide](https://innovativedevsolutions.github.io/client-addons/cad) +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/client-addons/garage) +- [Client Organization Usage Guide](https://innovativedevsolutions.github.io/client-addons/organization) + + +# Client Actor Usage Guide + +The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs. + +## Open the Actor Menu + +```sqf +call forge_client_actor_fnc_openUI; +``` + +The actor menu opens `RscActorMenu`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_actor_fnc_handleUIEvents`. + +## Repository + +`forge_client_actor_fnc_initRepository` creates `GVAR(ActorRepository)`. + +The repository: + +- requests actor initialization from the server +- saves actor state through the server actor addon +- caches client-visible actor fields +- applies position, direction, stance, rank, and loadout on JIP sync when the + relevant settings allow it +- provides nearby interaction actions to the browser UI + +Initialize actor state through the repository: + +```sqf +GVAR(ActorRepository) call ["init", []]; +``` + +Save actor state through the server: + +```sqf +GVAR(ActorRepository) call ["save", [true]]; +``` + +## Nearby Actions + +The menu asks for nearby actions with: + +```text +actor::get::actions +``` + +The repository scans objects within 5 meters and returns actions based on +mission object variables: + +| Variable | Action | +| ------------------ | ----------------------------------------- | +| `storeType` | store | +| `isAtm` | ATM | +| `isBank` | bank | +| `isGarage` | garage | +| `garageType` | garage subtype | +| `isLocker` | virtual arsenal action when VA is enabled | +| `deviceType` | device action placeholder | +| nearby player unit | player interaction placeholder | + +The response is pushed into the browser with `updateAvailableActions(...)`. + +## Browser Events + +| Event | Client behavior | +| ---------------------- | --------------------------------------- | +| `actor::get::actions` | Refresh nearby actions. | +| `actor::close::menu` | Close actor menu. | +| `actor::open::atm` | Open bank UI in ATM mode. | +| `actor::open::bank` | Open bank UI in bank mode. | +| `actor::open::cad` | Open CAD UI. | +| `actor::open::garage` | Open garage UI. | +| `actor::open::vgarage` | Open virtual garage. | +| `actor::open::org` | Open organization UI. | +| `actor::open::vlocker` | Open ACE arsenal on `FORGE_Locker_Box`. | +| `actor::open::phone` | Open phone UI. | +| `actor::open::store` | Open store UI. | + +Device and player interaction events currently display placeholder feedback. + +## Authoritative State + +Actor persistence is server-owned. The client repository requests and displays +actor data, but actor creation, durable updates, and hot-state behavior are +handled by the server actor addon and extension. + +## Related Guides + +- [Actor Usage Guide](https://innovativedevsolutions.github.io/server-modules/actor) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client CAD Usage Guide](https://innovativedevsolutions.github.io/client-addons/cad) +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/client-addons/garage) +- [Client Locker Usage Guide](https://innovativedevsolutions.github.io/client-addons/locker) +- [Client Organization Usage Guide](https://innovativedevsolutions.github.io/client-addons/organization) +- [Client Phone Usage Guide](https://innovativedevsolutions.github.io/client-addons/phone) +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/client-addons/store) + + +# Client Bank Usage Guide + +The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser. + +## Open Bank UI + +Open full bank mode: + +```sqf +call forge_client_bank_fnc_openUI; +``` + +Open ATM mode: + +```sqf +[true] call forge_client_bank_fnc_openUI; +``` + +The open function creates `RscBank`, sets the bridge mode to `bank` or `atm`, +loads `ui/_site/index.html`, and routes browser events through +`forge_client_bank_fnc_handleUIEvents`. + +## Bridge and Repository + +`forge_client_bank_fnc_initRepository` tracks account load and cached account +state. + +`forge_client_bank_fnc_initUIBridge` owns: + +- active browser control tracking +- bank/ATM mode +- browser ready handling +- account hydrate and sync responses +- deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN + requests +- browser notice delivery + +## Browser Events + +| Event | Client behavior | +| -------------------------------- | ------------------------------------------------------- | +| `bank::ready` | Mark browser ready and request hydrate from the server. | +| `bank::refresh` | Request fresh bank hydrate data. | +| `bank::deposit::request` | Forward deposit amount to the server. | +| `bank::withdraw::request` | Forward withdrawal amount to the server. | +| `bank::transfer::request` | Forward target, source field, and amount. | +| `bank::depositEarnings::request` | Request earnings deposit. | +| `bank::repayCreditLine::request` | Request credit-line repayment. | +| `bank::pin::request` | Forward PIN validation request. | +| `bank::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +The bridge sends: + +| Event | Purpose | +| --------------- | ----------------------------- | +| `bank::hydrate` | Full session/account payload. | +| `bank::sync` | Account patch or sync data. | +| `bank::notice` | UI-visible notice payload. | + +## Request Flow + +Example deposit flow: + +1. Browser sends `bank::deposit::request` with an `amount`. +2. Client bridge calls the server bank request event. +3. Server bank addon validates the request and calls bank hot-state logic. +4. Server response is caught by the client post-init event handlers. +5. Client bridge sends `bank::sync` or `bank::notice` back to the browser. + +## Authoritative State + +Balances, PIN authorization, transfers, checkout charges, credit lines, and +persistence are server-owned. The client should only display account data and +request mutations through server events. + +## Related Guides + +- [Bank Usage Guide](https://innovativedevsolutions.github.io/server-modules/bank) +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/client-addons/common) +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/client-addons/store) + + +# Client CAD Usage Guide + +The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows. + +## Open CAD UI + +```sqf +call forge_client_cad_fnc_openUI; +``` + +The CAD UI opens `RscMapUI` and loads separate browser controls for: + +- top bar +- bottom bar +- side panel +- dispatcher board + +The native Arma map remains part of the same display. + +## Repository and Bridge + +`forge_client_cad_fnc_initRepository` caches the hydrated CAD payload, +selected mode, dispatch view, session data, groups, tasks, requests, and +assignments. + +`forge_client_cad_fnc_initUIBridge` owns: + +- ready state for side panel, top bar, and dispatcher board +- operations vs dispatch mode +- board vs map dispatch view +- hydrate requests +- task assignment, acknowledge, and decline requests +- dispatch order create/close requests +- support request submit/close requests +- group status, role, and profile requests +- map focus actions + +## Browser Events + +| Event | Client behavior | +| ----------------------------- | -------------------------------------------------- | +| `cad::topbar::ready` | Mark top bar ready and push top bar state. | +| `cad::ready` | Mark side panel ready and request hydrate. | +| `cad::dispatcher::ready` | Mark dispatcher board ready and push hydrate data. | +| `cad::mode::set` | Switch between operations and dispatch mode. | +| `cad::dispatchView::set` | Switch dispatch board/map view. | +| `cad::refresh` | Request fresh CAD hydrate data. | +| `cad::tasks::assign` | Assign a task to a group. | +| `cad::tasks::acknowledge` | Acknowledge assigned task. | +| `cad::tasks::decline` | Decline assigned task. | +| `cad::dispatchOrder::create` | Create dispatch order. | +| `cad::dispatchOrder::close` | Close dispatch order. | +| `cad::supportRequest::submit` | Submit support request. | +| `cad::supportRequest::close` | Close support request. | +| `cad::groups::status` | Update group status. | +| `cad::groups::role` | Update group role. | +| `cad::groups::profile` | Update status and role together. | +| `cad::groups::focus` | Center map on a group. | +| `cad::tasks::focus` | Center map on a task. | +| `cad::requests::focus` | Center map on a support request. | +| `map::zoomIn` | Zoom native map in. | +| `map::zoomOut` | Zoom native map out. | +| `map::search` | Placeholder status update. | +| `map::close` | Dispose bridge state and close the display. | + +## Response Events + +The bridge pushes: + +| Event | Purpose | +| --------------------------- | -------------------------------------------- | +| `cad::hydrate` | Full hydrated CAD payload to the side panel. | +| `cad::assignment::response` | Task assignment/acknowledge/decline result. | +| `cad::group::response` | Group status/role/profile result. | +| `cad::request::response` | Support request result. | + +Dispatcher board controls also receive direct `ExecJS` status and hydrate +calls. + +## Task Compatibility + +CAD task visibility depends on server-side task catalog entries. Tasks created +through Eden Forge task modules or `forge_server_task_fnc_startTask` are the +normal CAD-compatible task sources because they register task catalog data. + +Direct handler or task-function calls only work with CAD when the task catalog +entry already exists. + +## Authorization Notes + +Only dispatcher sessions can enter dispatch mode. If the hydrated session is +not a dispatcher, the bridge forces the UI back to operations mode. + +## Related Guides + +- [CAD Usage Guide](https://innovativedevsolutions.github.io/server-modules/cad) +- [Task Usage Guide](https://innovativedevsolutions.github.io/server-modules/task) +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/client-addons/common) + + +# Client Garage Usage Guide + +The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view. + +## Open Garage UI + +```sqf +call forge_client_garage_fnc_openUI; +``` + +The garage UI opens `RscGarage`, loads `ui/_site/index.html`, and routes +browser events through `forge_client_garage_fnc_handleUIEvents`. + +## Open Virtual Garage + +```sqf +call forge_client_garage_fnc_openVG; +``` + +The virtual garage uses mission-configured `FORGE_CfgGarages` locations to set +the spawn/preview position, opens the BIS garage interface, and restricts the +available vehicle lists from the virtual garage repository. + +## Client Services + +| Service | Purpose | +| ---------------------- | --------------------------------------------------------------------------------------------- | +| `GarageRepository` | Player garage view state. | +| `VGRepository` | Virtual garage unlock view state. | +| `GarageHelperService` | Vehicle names, hit points, and payload helpers. | +| `GarageContextService` | Nearby/current vehicle context. | +| `GaragePayloadService` | Browser hydrate payload construction. | +| `GarageActionService` | Store/retrieve request handling and selected nearby vehicle refuel/repair request forwarding. | +| `GarageUIBridge` | Browser ready, hydrate, and sync delivery. | + +## Browser Events + +| Event | Client behavior | +| ------------------------------------ | ----------------------------------------------------------------------------- | +| `garage::ready` | Mark browser ready and send `garage::hydrate`. | +| `garage::refresh` | Send current garage payload as `garage::sync`. | +| `garage::vehicle::retrieve::request` | Forward retrieve request through the action service. | +| `garage::vehicle::store::request` | Forward store request through the action service. | +| `garage::vehicle::refuel::request` | Forward selected nearby vehicle refuel request to the server economy service. | +| `garage::vehicle::repair::request` | Forward selected nearby vehicle repair request to the server economy service. | +| `garage::close` | Dispose bridge screen state and close the display. | + +## Browser Response Events + +| Event | Purpose | +| -------------------------- | --------------------------------------------------- | +| `garage::hydrate` | Initial vehicle and session payload. | +| `garage::sync` | Refreshed vehicle payload. | +| `garage::service::success` | Browser notice for accepted refuel/repair requests. | +| `garage::service::failure` | Browser notice for rejected refuel/repair requests. | + +Server action responses are handled by the action service and notification +flow. + +## Vehicle Service + +The selected vehicle detail panel includes refuel and repair actions for nearby +world vehicles. Stored records must be retrieved first because server economy +services operate on live vehicle objects, not stored garage records. + +Refuel requests use the server economy `RefuelService` event. Repair requests +use the server economy `RepairService` event. Both services are billed by the +server economy addon through organization funds. + +## Mission Setup + +Garage interactions are normally surfaced through the actor menu when nearby +objects have garage variables such as: + +```sqf +_object setVariable ["isGarage", true, true]; +_object setVariable ["garageType", "cars", true]; +``` + +Virtual garage access also requires configured garage locations in mission +config so the preview/spawn position can be resolved. + +## Authoritative State + +The client gathers vehicle context and sends store/retrieve requests. Stored +vehicle state, validation, spawning, removal, and persistence are owned by the +server garage addon and extension. + +## Related Guides + +- [Garage Usage Guide](https://innovativedevsolutions.github.io/server-modules/garage) +- [Client Actor Usage Guide](https://innovativedevsolutions.github.io/client-addons/actor) +- [Client Notifications Usage Guide](https://innovativedevsolutions.github.io/client-addons/notifications) + + +# Client Locker Usage Guide + +The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state. + +## Repositories + +`forge_client_locker_fnc_initRepository` creates `GVAR(LockerRepository)`. + +`forge_client_locker_fnc_initVARepository` creates `GVAR(VARepository)`. + +Initialize locker state: + +```sqf +GVAR(LockerRepository) call ["init", []]; +GVAR(VARepository) call ["init", []]; +``` + +## Locker Container Flow + +The repository searches mission namespace variables whose names contain +`locker` and refer to objects. For each server/mission locker object, it creates +a local `Box_NATO_Equip_F` at the same position and attaches container event +handlers. + +On container open: + +- the local container is cleared +- cached locker items are inserted into the container +- over-capacity warnings are emitted when the item count is above 25 + +On container close: + +- cargo, nested container items, and weapon attachments are read back +- the new locker map is sent to the server with the override request +- the local repository cache is updated + +## Virtual Arsenal Flow + +The virtual arsenal repository creates a local `FORGE_Locker_Box` and requests +virtual arsenal unlocks from the server. + +As sync data arrives, it applies unlocks through ACE Arsenal: + +| Data key | Client behavior | +| ----------- | ---------------------- | +| `items` | Add virtual items. | +| `weapons` | Add virtual weapons. | +| `magazines` | Add virtual magazines. | +| `backpacks` | Add virtual backpacks. | + +The actor menu opens the virtual locker with: + +```sqf +[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox; +``` + +## Server Events + +The client repository sends requests for: + +- locker initialization +- locker save +- locker override after container close +- virtual arsenal initialization +- virtual arsenal save + +The server locker addon and extension own the saved locker and virtual arsenal +state. + +## Mission Setup + +Mission locker objects must be placed into `missionNamespace` with a variable +name containing `locker`. The client creates local interactive containers from +those authoritative mission objects. + +Example: + +```sqf +missionNamespace setVariable ["forge_locker_alpha", _lockerObject, true]; +``` + +## Related Guides + +- [Locker Usage Guide](https://innovativedevsolutions.github.io/server-modules/locker) +- [Owned Storage Usage Guide](https://innovativedevsolutions.github.io/server-modules/owned-storage) +- [Client Actor Usage Guide](https://innovativedevsolutions.github.io/client-addons/actor) + + +# Client Notifications Usage Guide + +The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules. + +## Runtime Behavior + +The notification display is created during client initialization. The browser +HUD sends: + +```text +notifications::ready +``` + +When that event is received, `NotificationService` initializes and sends a +startup notification. + +## Create a Notification + +Use the notification service when available: + +```sqf +GVAR(NotificationService) call ["create", [ + "success", + "Title", + "Notification text.", + 4000 +]]; +``` + +Arguments: + +| Argument | Purpose | +| ----------- | -------------------------------------------------------------------- | +| `_type` | Notification type, such as `success`, `info`, `warning`, or `error`. | +| `_title` | Notification title. | +| `_content` | Notification body text. | +| `_duration` | Display duration in milliseconds. | + +The service dispatches a browser `forge:notify` custom event. + +## CBA Event Surface + +Other addons can use the client notification event: + +```sqf +["forge_client_notifications_recieveNotification", [ + "warning", + "Garage", + "Vehicle spawn position is blocked.", + 3000 +]] call CBA_fnc_localEvent; +``` + +The event payload is: + +```sqf +[_type, _title, _content, _duration] +``` + +## Usage Rules + +- Use the shared notification service instead of opening separate transient + browser UIs. +- Keep server-driven player feedback short and actionable. +- Treat notification state as transient client UI state. +- Do not use notifications as the only record of durable domain changes. + +## Related Guides + +- [Client Usage Guide](https://innovativedevsolutions.github.io/client-addons) +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/client-addons/garage) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/client-addons/store) + + +# Client Organization Usage Guide + +The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display. + +## Open Organization UI + +```sqf +call forge_client_org_fnc_openUI; +``` + +The UI opens `RscOrg`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_org_fnc_handleUIEvents`. + +## Repository and Bridge + +`forge_client_org_fnc_initRepository` caches organization portal state. + +`forge_client_org_fnc_initUIBridge` owns: + +- active browser control tracking +- portal hydrate requests +- create/login response routing +- leave and disband requests +- credit-line assignment requests +- invite, accept invite, and decline invite requests +- targeted browser response events + +## Browser Events + +| Event | Client behavior | +| ----------------------- | ------------------------------------------------- | +| `org::ready` | Mark browser ready and request `org::sync`. | +| `org::login::request` | Request portal hydrate as `org::login::success`. | +| `org::create::request` | Validate org name and request creation on server. | +| `org::disband::request` | Request disband on server. | +| `org::leave::request` | Request leave on server. | +| `org::credit::request` | Request credit-line assignment. | +| `org::invite::request` | Request member invite. | +| `org::invite::accept` | Accept invite by org ID. | +| `org::invite::decline` | Decline invite by org ID. | +| `org::close` | Close the display. | + +## Browser Response Events + +| Event | Purpose | +| -------------------------------- | ------------------------------------------------------ | +| `org::sync` | Full portal sync payload. | +| `org::login::success` | Login hydrate payload. | +| `org::create::success` | Creation hydrate payload. | +| `org::create::failure` | Creation validation or server failure. | +| `org::disband::success` | Requester disband success. | +| `org::disband::failure` | Disband failure. | +| `org::portal::revoked` | Portal state revoked by someone else's disband action. | +| `org::leave::success` | Leave success. | +| `org::leave::failure` | Leave failure. | +| `org::credit::success` | Credit-line request success. | +| `org::credit::failure` | Credit-line request failure. | +| `org::member::creditUpdated` | Targeted member credit-line patch. | +| `org::invite::success` | Invite success. | +| `org::invite::failure` | Invite failure. | +| `org::invite::decision::success` | Invite accept/decline success. | +| `org::invite::decision::failure` | Invite accept/decline failure. | + +## Request Examples + +Create organization request payload: + +```json +{ + "orgName": "Example Logistics" +} +``` + +Credit-line request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 2500 +} +``` + +Invite request payload: + +```json +{ + "targetUid": "76561198000000000", + "targetName": "Player Name" +} +``` + +## Authoritative State + +Organization funds, reputation, membership, invites, credit lines, assets, +fleet, and persistence are server-owned. The client portal only displays and +requests changes. + +## Related Guides + +- [Organization Usage Guide](https://innovativedevsolutions.github.io/server-modules/organization) +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/client-addons/common) +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/client-addons/bank) +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/client-addons/store) + + +# Forge Framework Documentation + +::u-page-hero +#title +Forge Framework Documentation + +#description +Forge is a persistent Arma 3 framework that combines SQF addons, a Rust +`arma-rs` extension, SurrealDB persistence, shared domain crates, and +browser-backed player interfaces. + +Use these docs to understand the runtime architecture, extension API surface, +server gameplay modules, and client addon integration patterns. + +#links + :::u-button + --- + color: primary + size: xl + to: https://innovativedevsolutions.github.io/getting-started + trailing-icon: i-lucide-arrow-right + --- + Start here + ::: + + :::u-button + --- + color: neutral + icon: simple-icons-github + size: xl + to: https://github.com/InnovativeDevSolutions/forge + variant: outline + --- + View source + ::: +:: + +::u-page-section +#title +What Forge Covers + +#features + :::u-page-feature + --- + icon: i-lucide-boxes + --- + #title + Domain [Modules]{.text-primary} + + #description + Actor, bank, CAD, garage, locker, organization, phone, store, task, and + owned-storage workflows share a consistent service and extension model. + ::: + + :::u-page-feature + --- + icon: i-lucide-server + --- + #title + Rust [Extension]{.text-primary} + + #description + The server extension keeps command parsing thin, routes domain requests into + services, and persists durable state through SurrealDB. + ::: + + :::u-page-feature + --- + icon: i-lucide-database-zap + --- + #title + Durable [Persistence]{.text-primary} + + #description + Repository traits stay storage-agnostic while concrete adapters in the + extension handle schema and database mapping. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + --- + #title + Browser [UIs]{.text-primary} + + #description + Client addons host web-based interfaces inside Arma displays and synchronize + state through namespaced browser bridge events. + ::: + + :::u-page-feature + --- + icon: i-lucide-arrow-left-right + --- + #title + Transport [Layer]{.text-primary} + + #description + Large payloads move through chunked request and response transport while + smaller commands still use direct `callExtension` paths. + ::: + + :::u-page-feature + --- + icon: i-lucide-wrench + --- + #title + Development [Workflow]{.text-primary} + + #description + The docs cover module boundaries, local validation checks, and where new + domain logic belongs across Rust, SQF, and web UI layers. + ::: +:: + +::u-page-section +#title +Documentation Areas + +#features + :::u-page-feature + --- + icon: i-lucide-rocket + to: https://innovativedevsolutions.github.io/getting-started + --- + #title + [Getting Started]{.text-primary} + + #description + Framework overview, architecture, module reference, and development rules. + ::: + + :::u-page-feature + --- + icon: i-lucide-server-cog + to: https://innovativedevsolutions.github.io/server-extension + --- + #title + Server [Extension]{.text-primary} + + #description + Extension architecture, command surface, and SQF usage examples. + ::: + + :::u-page-feature + --- + icon: i-lucide-layers-3 + to: https://innovativedevsolutions.github.io/server-modules + --- + #title + Server [Modules]{.text-primary} + + #description + Gameplay-domain usage guides for persistence, hot state, and command flows. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + to: https://innovativedevsolutions.github.io/client-addons + --- + #title + Client [Addons]{.text-primary} + + #description + Browser bridge, client UX entry points, and addon-specific event contracts. + ::: +:: diff --git a/docus/dist/llms.txt b/docus/dist/llms.txt new file mode 100644 index 0000000..3469f77 --- /dev/null +++ b/docus/dist/llms.txt @@ -0,0 +1,96 @@ +# forge-docus + +## Documentation Sets + +- [forge-docus](https://innovativedevsolutions.github.io/llms-full.txt) + +## Docs + +- [Getting Started](https://innovativedevsolutions.github.io/raw/getting-started.md): Use this section as the main entry point for the Forge framework. +- [Framework Architecture](https://innovativedevsolutions.github.io/raw/getting-started/architecture.md): Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI. +- [Module Reference](https://innovativedevsolutions.github.io/raw/getting-started/module-reference.md): This reference lists the main Forge modules and where each layer lives. +- [Development Guide](https://innovativedevsolutions.github.io/raw/getting-started/development.md): This guide covers the usual path for adding or changing a Forge module. +- [SurrealDB Setup](https://innovativedevsolutions.github.io/raw/getting-started/surrealdb-setup.md): Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config. +- [Forge Server Extension](https://innovativedevsolutions.github.io/raw/server-extension.md): Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB. +- [Forge Server API Reference](https://innovativedevsolutions.github.io/raw/server-extension/api-reference.md): The Forge server extension exposes domain-oriented commands through +callExtension. Persistent data is stored through the configured SurrealDB +connection and schema modules. +- [Forge Server Usage Examples](https://innovativedevsolutions.github.io/raw/server-extension/usage-examples.md): These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB. +- [Server Module Guides](https://innovativedevsolutions.github.io/raw/server-modules.md): These pages document the authoritative server-side workflows in Forge. +- [Actor Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/actor.md): The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization. +- [Store Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/store.md): The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks. +- [Task Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/task.md): The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants. +- [Bank Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/bank.md): The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, and PIN validation. +- [CAD Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/cad.md): The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle. +- [Economy Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/economy.md): The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied. +- [Garage Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/garage.md): The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage. +- [Locker Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/locker.md): The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +Owned Storage Usage Guide. +- [Organization Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/organization.md): The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows. +- [Owned Storage Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/owned-storage.md): Owned storage covers the owned:locker and owned:garage extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances. +- [Phone Usage Guide](https://innovativedevsolutions.github.io/raw/server-modules/phone.md): The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB. +- [Client Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons.md): Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons. +- [Client Main Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/main.md): The client main addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons. +- [Client Phone Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/phone.md): The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms. +- [Client Store Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/store.md): The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests. +- [Client Common Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/common.md): The client common addon contains shared browser UI bridge declarations and +common client-side browser integration patterns. +- [Client Actor Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/actor.md): The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs. +- [Client Bank Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/bank.md): The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser. +- [Client CAD Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/cad.md): The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows. +- [Client Garage Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/garage.md): The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view. +- [Client Locker Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/locker.md): The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state. +- [Client Notifications Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/notifications.md): The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules. +- [Client Organization Usage Guide](https://innovativedevsolutions.github.io/raw/client-addons/organization.md): The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display. + +## Landing + +- [Forge Framework Documentation](https://innovativedevsolutions.github.io/raw/index.md): Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs. \ No newline at end of file diff --git a/docus/dist/raw/client-addons.md b/docus/dist/raw/client-addons.md new file mode 100644 index 0000000..5c8e4a5 --- /dev/null +++ b/docus/dist/raw/client-addons.md @@ -0,0 +1,237 @@ +# Client Usage Guide + +Forge Client contains the Arma client-side addons that open player interfaces, +handle browser events, cache client-visible state, and forward authoritative +requests to the server addons. + +Use this guide as the entry point for client-side integration. Domain data, +validation, persistence, rewards, ownership, and checkout behavior remain +server-side responsibilities. + +## Client Responsibilities + +- Open Arma displays and `CT_WEBBROWSER` controls. +- Load browser UI assets from each addon's `ui/_site` folder. +- Receive browser alerts through `JSDialog` handlers. +- Translate browser events into local actions or CBA server events. +- Cache display state in client repositories. +- Push server responses back into browser UIs with `ExecJS`. +- Provide local-only utility state where the feature is intentionally local. + +## Authoritative Boundaries + +Client repositories are view state. They are useful for rendering, local UI +decisions, and short-lived session behavior, but they should not be treated as +durable state. + +Authoritative state lives in: + +- server SQF addons for mission and player workflow ownership +- the `forge_server` extension for durable and hot-state domain logic +- SurrealDB where the extension persists durable domain records + +## Common Runtime Flow + +Most browser-backed client addons follow this shape: + +1. The addon creates a display, finds a browser control, and registers a +`JSDialog` event handler. +2. The browser loads an HTML entrypoint from `ui/_site`. +3. The browser sends JSON alerts with an `event` name and `data` payload. +4. `fnc_handleUIEvents.sqf` parses the alert and routes the event. +5. A bridge object or repository sends a CBA server event when server data is +needed. +6. Server responses are caught in `XEH_postInitClient.sqf`. +7. The bridge sends browser update events back through `ExecJS`. + +Browser alert payload: + +```json +{ + "event": "module::action", + "data": {} +} +``` + +## Open UI Entry Points + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ UI + + Entry point +
+ Actor menu + + + call forge_client_actor_fnc_openUI; + +
+ Bank + + + call forge_client_bank_fnc_openUI; + +
+ ATM + + + [true] call forge_client_bank_fnc_openUI; + +
+ CAD + + + call forge_client_cad_fnc_openUI; + +
+ Garage + + + call forge_client_garage_fnc_openUI; + +
+ Virtual garage + + + call forge_client_garage_fnc_openVG; + +
+ Organization portal + + + call forge_client_org_fnc_openUI; + +
+ Phone + + + call forge_client_phone_fnc_openUI; + +
+ Store + + + call forge_client_store_fnc_openUI; + +
+ +Notifications are normally opened during client initialization and then updated +through the notification event/service. + +## Addon Guides + +- [Client Main Usage Guide](/client-addons/main) +- [Client Common Usage Guide](/client-addons/common) +- [Client Actor Usage Guide](/client-addons/actor) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Notifications Usage Guide](/client-addons/notifications) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Phone Usage Guide](/client-addons/phone) +- [Client Store Usage Guide](/client-addons/store) + +## Extension Calls + +Client addons should usually call server SQF events, not the `forge_server` +extension directly. The server addon owns validation context and converts the +request into extension commands. + +Example: + +```sqf +[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent); +``` + +Direct extension calls from client code bypass server authorization boundaries +and should be avoided. + +## Browser Bridge Notes + +`forge_client_common_fnc_initWebUIBridge` provides reusable bridge and screen +objects for newer browser UIs. It queues outbound events until a browser screen +is ready, then delivers payloads through: + +```sqf +_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]]; +``` + +Feature addons still own their event names, request payloads, and response +mapping. + +## Development Checklist + +- Keep feature-specific behavior in the owning addon. +- Send authoritative changes to the server addon. +- Use namespaced browser events such as `bank::deposit::request`. +- Treat `profileNamespace` as local player preference or utility state only. +- Make browser-ready events request the current server state before rendering +stale data. +- Queue or ignore bridge responses when the display is closed. +- Keep mission object setup on the mission/server side and client display logic +on the client side. diff --git a/docus/dist/raw/client-addons/actor.md b/docus/dist/raw/client-addons/actor.md new file mode 100644 index 0000000..0593a4e --- /dev/null +++ b/docus/dist/raw/client-addons/actor.md @@ -0,0 +1,335 @@ +# Client Actor Usage Guide + +The client actor addon owns the player interaction menu and client-side actor +repository. It is the main launcher for nearby player actions and other Forge +client UIs. + +## Open the Actor Menu + +```sqf +call forge_client_actor_fnc_openUI; +``` + +The actor menu opens `RscActorMenu`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_actor_fnc_handleUIEvents`. + +## Repository + +`forge_client_actor_fnc_initRepository` creates `GVAR(ActorRepository)`. + +The repository: + +- requests actor initialization from the server +- saves actor state through the server actor addon +- caches client-visible actor fields +- applies position, direction, stance, rank, and loadout on JIP sync when the +relevant settings allow it +- provides nearby interaction actions to the browser UI + +Initialize actor state through the repository: + +```sqf +GVAR(ActorRepository) call ["init", []]; +``` + +Save actor state through the server: + +```sqf +GVAR(ActorRepository) call ["save", [true]]; +``` + +## Nearby Actions + +The menu asks for nearby actions with: + +```text +actor::get::actions +``` + +The repository scans objects within 5 meters and returns actions based on +mission object variables: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Variable + + Action +
+ + storeType + + + store +
+ + isAtm + + + ATM +
+ + isBank + + + bank +
+ + isGarage + + + garage +
+ + garageType + + + garage subtype +
+ + isLocker + + + virtual arsenal action when VA is enabled +
+ + deviceType + + + device action placeholder +
+ nearby player unit + + player interaction placeholder +
+ +The response is pushed into the browser with `updateAvailableActions(...)`. + +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + actor::get::actions + + + Refresh nearby actions. +
+ + actor::close::menu + + + Close actor menu. +
+ + actor::open::atm + + + Open bank UI in ATM mode. +
+ + actor::open::bank + + + Open bank UI in bank mode. +
+ + actor::open::cad + + + Open CAD UI. +
+ + actor::open::garage + + + Open garage UI. +
+ + actor::open::vgarage + + + Open virtual garage. +
+ + actor::open::org + + + Open organization UI. +
+ + actor::open::vlocker + + + Open ACE arsenal on + FORGE_Locker_Box + + + . +
+ + actor::open::phone + + + Open phone UI. +
+ + actor::open::store + + + Open store UI. +
+ +Device and player interaction events currently display placeholder feedback. + +## Authoritative State + +Actor persistence is server-owned. The client repository requests and displays +actor data, but actor creation, durable updates, and hot-state behavior are +handled by the server actor addon and extension. + +## Related Guides + +- [Actor Usage Guide](/server-modules/actor) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Phone Usage Guide](/client-addons/phone) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/dist/raw/client-addons/bank.md b/docus/dist/raw/client-addons/bank.md new file mode 100644 index 0000000..cc627f8 --- /dev/null +++ b/docus/dist/raw/client-addons/bank.md @@ -0,0 +1,242 @@ +# Client Bank Usage Guide + +The client bank addon opens the bank and ATM browser UI, forwards banking +requests to the server bank addon, and pushes account updates back into the +browser. + +## Open Bank UI + +Open full bank mode: + +```sqf +call forge_client_bank_fnc_openUI; +``` + +Open ATM mode: + +```sqf +[true] call forge_client_bank_fnc_openUI; +``` + +The open function creates `RscBank`, sets the bridge mode to `bank` or `atm`, +loads `ui/_site/index.html`, and routes browser events through +`forge_client_bank_fnc_handleUIEvents`. + +## Bridge and Repository + +`forge_client_bank_fnc_initRepository` tracks account load and cached account +state. + +`forge_client_bank_fnc_initUIBridge` owns: + +- active browser control tracking +- bank/ATM mode +- browser ready handling +- account hydrate and sync responses +- deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN +requests +- browser notice delivery + +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + bank::ready + + + Mark browser ready and request hydrate from the server. +
+ + bank::refresh + + + Request fresh bank hydrate data. +
+ + bank::deposit::request + + + Forward deposit amount to the server. +
+ + bank::withdraw::request + + + Forward withdrawal amount to the server. +
+ + bank::transfer::request + + + Forward target, source field, and amount. +
+ + bank::depositEarnings::request + + + Request earnings deposit. +
+ + bank::repayCreditLine::request + + + Request credit-line repayment. +
+ + bank::pin::request + + + Forward PIN validation request. +
+ + bank::close + + + Dispose bridge screen state and close the display. +
+ +## Browser Response Events + +The bridge sends: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Purpose +
+ + bank::hydrate + + + Full session/account payload. +
+ + bank::sync + + + Account patch or sync data. +
+ + bank::notice + + + UI-visible notice payload. +
+ +## Request Flow + +Example deposit flow: + +1. Browser sends `bank::deposit::request` with an `amount`. +2. Client bridge calls the server bank request event. +3. Server bank addon validates the request and calls bank hot-state logic. +4. Server response is caught by the client post-init event handlers. +5. Client bridge sends `bank::sync` or `bank::notice` back to the browser. + +## Authoritative State + +Balances, PIN authorization, transfers, checkout charges, credit lines, and +persistence are server-owned. The client should only display account data and +request mutations through server events. + +## Related Guides + +- [Bank Usage Guide](/server-modules/bank) +- [Client Common Usage Guide](/client-addons/common) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/dist/raw/client-addons/cad.md b/docus/dist/raw/client-addons/cad.md new file mode 100644 index 0000000..a6b11dc --- /dev/null +++ b/docus/dist/raw/client-addons/cad.md @@ -0,0 +1,423 @@ +# Client CAD Usage Guide + +The client CAD addon provides the map and dispatch UI for groups, active +tasks, task assignment, dispatch orders, support requests, and task +acknowledge/decline workflows. + +## Open CAD UI + +```sqf +call forge_client_cad_fnc_openUI; +``` + +The CAD UI opens `RscMapUI` and loads separate browser controls for: + +- top bar +- bottom bar +- side panel +- dispatcher board + +The native Arma map remains part of the same display. + +## Repository and Bridge + +`forge_client_cad_fnc_initRepository` caches the hydrated CAD payload, +selected mode, dispatch view, session data, groups, tasks, requests, and +assignments. + +`forge_client_cad_fnc_initUIBridge` owns: + +- ready state for side panel, top bar, and dispatcher board +- operations vs dispatch mode +- board vs map dispatch view +- hydrate requests +- task assignment, acknowledge, and decline requests +- dispatch order create/close requests +- support request submit/close requests +- group status, role, and profile requests +- map focus actions + +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + cad::topbar::ready + + + Mark top bar ready and push top bar state. +
+ + cad::ready + + + Mark side panel ready and request hydrate. +
+ + cad::dispatcher::ready + + + Mark dispatcher board ready and push hydrate data. +
+ + cad::mode::set + + + Switch between operations and dispatch mode. +
+ + cad::dispatchView::set + + + Switch dispatch board/map view. +
+ + cad::refresh + + + Request fresh CAD hydrate data. +
+ + cad::tasks::assign + + + Assign a task to a group. +
+ + cad::tasks::acknowledge + + + Acknowledge assigned task. +
+ + cad::tasks::decline + + + Decline assigned task. +
+ + cad::dispatchOrder::create + + + Create dispatch order. +
+ + cad::dispatchOrder::close + + + Close dispatch order. +
+ + cad::supportRequest::submit + + + Submit support request. +
+ + cad::supportRequest::close + + + Close support request. +
+ + cad::groups::status + + + Update group status. +
+ + cad::groups::role + + + Update group role. +
+ + cad::groups::profile + + + Update status and role together. +
+ + cad::groups::focus + + + Center map on a group. +
+ + cad::tasks::focus + + + Center map on a task. +
+ + cad::requests::focus + + + Center map on a support request. +
+ + map::zoomIn + + + Zoom native map in. +
+ + map::zoomOut + + + Zoom native map out. +
+ + map::search + + + Placeholder status update. +
+ + map::close + + + Dispose bridge state and close the display. +
+ +## Response Events + +The bridge pushes: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Purpose +
+ + cad::hydrate + + + Full hydrated CAD payload to the side panel. +
+ + cad::assignment::response + + + Task assignment/acknowledge/decline result. +
+ + cad::group::response + + + Group status/role/profile result. +
+ + cad::request::response + + + Support request result. +
+ +Dispatcher board controls also receive direct `ExecJS` status and hydrate +calls. + +## Task Compatibility + +CAD task visibility depends on server-side task catalog entries. Tasks created +through Eden Forge task modules or `forge_server_task_fnc_startTask` are the +normal CAD-compatible task sources because they register task catalog data. + +Direct handler or task-function calls only work with CAD when the task catalog +entry already exists. + +## Authorization Notes + +Only dispatcher sessions can enter dispatch mode. If the hydrated session is +not a dispatcher, the bridge forces the UI back to operations mode. + +## Related Guides + +- [CAD Usage Guide](/server-modules/cad) +- [Task Usage Guide](/server-modules/task) +- [Client Common Usage Guide](/client-addons/common) diff --git a/docus/dist/raw/client-addons/common.md b/docus/dist/raw/client-addons/common.md new file mode 100644 index 0000000..0db5e4b --- /dev/null +++ b/docus/dist/raw/client-addons/common.md @@ -0,0 +1,138 @@ +# Client Common Usage Guide + +The client `common` addon contains shared browser UI bridge declarations and +common client-side browser integration patterns. + +## Purpose + +Use `forge_client_common` when a browser-backed feature UI needs reusable +screen lifecycle behavior: + +- active browser control tracking +- browser ready state +- pending event queues +- `ExecJS` payload delivery +- shared bridge object inheritance through `createHashMapObject` + +Feature addons still own their app-specific events and server RPC mapping. + +## Shared Bridge + +Initialize the bridge declarations with: + +```sqf +private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge; +private _bridgeDeclaration = _webUIDeclarations get "bridgeDeclaration"; +``` + +Feature bridges can inherit from the shared declaration: + +```sqf +GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [ + ["#base", _bridgeDeclaration], + ["#type", "MyUIBridgeBaseClass"], + ["handleReady", compileFinal { + params [["_control", controlNull, [controlNull]]]; + + _self call ["setActiveBrowserControl", [_control]]; + _self call ["sendEvent", ["myAddon::hydrate", createHashMap, _control]]; + }] +]; +``` + +## Event Delivery + +`sendEvent` builds this payload: + +```json +{ + "event": "myAddon::event", + "data": {} +} +``` + +If the browser control is missing or not ready, the payload is queued on the +screen object. When the screen marks ready, `flushPendingEvents` delivers the +queue. + +## Screen Lifecycle + +The shared screen object tracks: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Purpose +
+ + control + + + Active browser control. +
+ + readyState + + + Whether the browser app has sent its ready event. +
+ + pendingEvents + + + Outbound events waiting for a ready browser. +
+ +Call `handleClose` or `dispose` when a display closes so stale controls and +queued events are cleared. + +## Current Consumers + +The common bridge pattern is used by the newer bank, CAD, garage, and +organization client bridges. Store currently keeps its own bridge object and +browser bridge function names. + +## Usage Rules + +- Keep bridge inheritance in feature addons thin and explicit. +- Keep shared code generic; do not add bank, CAD, org, or store-specific logic +to `common`. +- Prefer namespaced events such as `garage::sync`. +- Send hash maps or arrays that can be safely serialized with `toJSON`. +- Avoid direct extension calls from the client bridge; send CBA server events. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client CAD Usage Guide](/client-addons/cad) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Organization Usage Guide](/client-addons/organization) diff --git a/docus/dist/raw/client-addons/garage.md b/docus/dist/raw/client-addons/garage.md new file mode 100644 index 0000000..57672b9 --- /dev/null +++ b/docus/dist/raw/client-addons/garage.md @@ -0,0 +1,340 @@ +# Client Garage Usage Guide + +The client garage addon provides player vehicle storage UI, vehicle +store/retrieve actions, selected nearby vehicle service requests, vehicle +context building, and the virtual garage view. + +## Open Garage UI + +```sqf +call forge_client_garage_fnc_openUI; +``` + +The garage UI opens `RscGarage`, loads `ui/_site/index.html`, and routes +browser events through `forge_client_garage_fnc_handleUIEvents`. + +## Open Virtual Garage + +```sqf +call forge_client_garage_fnc_openVG; +``` + +The virtual garage uses mission-configured `FORGE_CfgGarages` locations to set +the spawn/preview position, opens the BIS garage interface, and restricts the +available vehicle lists from the virtual garage repository. + +## Client Services + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Service + + Purpose +
+ + GarageRepository + + + Player garage view state. +
+ + VGRepository + + + Virtual garage unlock view state. +
+ + GarageHelperService + + + Vehicle names, hit points, and payload helpers. +
+ + GarageContextService + + + Nearby/current vehicle context. +
+ + GaragePayloadService + + + Browser hydrate payload construction. +
+ + GarageActionService + + + Store/retrieve request handling and selected nearby vehicle refuel/repair request forwarding. +
+ + GarageUIBridge + + + Browser ready, hydrate, and sync delivery. +
+ +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + garage::ready + + + Mark browser ready and send + garage::hydrate + + + . +
+ + garage::refresh + + + Send current garage payload as + garage::sync + + + . +
+ + garage::vehicle::retrieve::request + + + Forward retrieve request through the action service. +
+ + garage::vehicle::store::request + + + Forward store request through the action service. +
+ + garage::vehicle::refuel::request + + + Forward selected nearby vehicle refuel request to the server economy service. +
+ + garage::vehicle::repair::request + + + Forward selected nearby vehicle repair request to the server economy service. +
+ + garage::close + + + Dispose bridge screen state and close the display. +
+ +## Browser Response Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Purpose +
+ + garage::hydrate + + + Initial vehicle and session payload. +
+ + garage::sync + + + Refreshed vehicle payload. +
+ + garage::service::success + + + Browser notice for accepted refuel/repair requests. +
+ + garage::service::failure + + + Browser notice for rejected refuel/repair requests. +
+ +Server action responses are handled by the action service and notification +flow. + +## Vehicle Service + +The selected vehicle detail panel includes refuel and repair actions for nearby +world vehicles. Stored records must be retrieved first because server economy +services operate on live vehicle objects, not stored garage records. + +Refuel requests use the server economy `RefuelService` event. Repair requests +use the server economy `RepairService` event. Both services are billed by the +server economy addon through organization funds. + +## Mission Setup + +Garage interactions are normally surfaced through the actor menu when nearby +objects have garage variables such as: + +```sqf +_object setVariable ["isGarage", true, true]; +_object setVariable ["garageType", "cars", true]; +``` + +Virtual garage access also requires configured garage locations in mission +config so the preview/spawn position can be resolved. + +## Authoritative State + +The client gathers vehicle context and sends store/retrieve requests. Stored +vehicle state, validation, spawning, removal, and persistence are owned by the +server garage addon and extension. + +## Related Guides + +- [Garage Usage Guide](/server-modules/garage) +- [Client Actor Usage Guide](/client-addons/actor) +- [Client Notifications Usage Guide](/client-addons/notifications) diff --git a/docus/dist/raw/client-addons/locker.md b/docus/dist/raw/client-addons/locker.md new file mode 100644 index 0000000..f0c7dec --- /dev/null +++ b/docus/dist/raw/client-addons/locker.md @@ -0,0 +1,144 @@ +# Client Locker Usage Guide + +The client locker addon manages personal locker display state, local locker +container behavior, and virtual arsenal unlock state. + +## Repositories + +`forge_client_locker_fnc_initRepository` creates `GVAR(LockerRepository)`. + +`forge_client_locker_fnc_initVARepository` creates `GVAR(VARepository)`. + +Initialize locker state: + +```sqf +GVAR(LockerRepository) call ["init", []]; +GVAR(VARepository) call ["init", []]; +``` + +## Locker Container Flow + +The repository searches mission namespace variables whose names contain +`locker` and refer to objects. For each server/mission locker object, it creates +a local `Box_NATO_Equip_F` at the same position and attaches container event +handlers. + +On container open: + +- the local container is cleared +- cached locker items are inserted into the container +- over-capacity warnings are emitted when the item count is above 25 + +On container close: + +- cargo, nested container items, and weapon attachments are read back +- the new locker map is sent to the server with the override request +- the local repository cache is updated + +## Virtual Arsenal Flow + +The virtual arsenal repository creates a local `FORGE_Locker_Box` and requests +virtual arsenal unlocks from the server. + +As sync data arrives, it applies unlocks through ACE Arsenal: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Data key + + Client behavior +
+ + items + + + Add virtual items. +
+ + weapons + + + Add virtual weapons. +
+ + magazines + + + Add virtual magazines. +
+ + backpacks + + + Add virtual backpacks. +
+ +The actor menu opens the virtual locker with: + +```sqf +[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox; +``` + +## Server Events + +The client repository sends requests for: + +- locker initialization +- locker save +- locker override after container close +- virtual arsenal initialization +- virtual arsenal save + +The server locker addon and extension own the saved locker and virtual arsenal +state. + +## Mission Setup + +Mission locker objects must be placed into `missionNamespace` with a variable +name containing `locker`. The client creates local interactive containers from +those authoritative mission objects. + +Example: + +```sqf +missionNamespace setVariable ["forge_locker_alpha", _lockerObject, true]; +``` + +## Related Guides + +- [Locker Usage Guide](/server-modules/locker) +- [Owned Storage Usage Guide](/server-modules/owned-storage) +- [Client Actor Usage Guide](/client-addons/actor) diff --git a/docus/dist/raw/client-addons/main.md b/docus/dist/raw/client-addons/main.md new file mode 100644 index 0000000..0fb66f4 --- /dev/null +++ b/docus/dist/raw/client-addons/main.md @@ -0,0 +1,116 @@ +# Client Main Usage Guide + +The client `main` addon provides the shared mod identity, version metadata, +CBA settings, and macro foundation used by the Forge client addons. + +## Purpose + +Use `forge_client_main` as the foundation dependency for client addons that +need Forge macros, function naming, settings, or mod-level configuration. + +Feature logic should stay in the owning addon. `main` should remain limited to +shared client configuration and compile infrastructure. + +## Key Files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ File + + Purpose +
+ + script_mod.hpp + + + Client mod identity. +
+ + script_version.hpp + + + Client mod version values. +
+ + script_macros.hpp + + + Shared client macros. +
+ + CfgSettings.hpp + + + Client CBA settings. +
+ + config.cpp + + + Addon config and mod wiring. +
+ +## Dependency Pattern + +Feature addons normally depend on `forge_client_main` in their `config.cpp`. + +```cpp +class forge_client_example { + requiredAddons[] = { + "forge_client_main" + }; +}; +``` + +## Usage Notes + +- Put domain UI, repositories, and event handling in feature addons. +- Put reusable browser bridge behavior in `forge_client_common`. +- Put server-only behavior in `arma/server/addons`. +- Keep settings in `CfgSettings.hpp` when they apply to the client mod as a +whole or to a client feature toggle. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Common Usage Guide](/client-addons/common) +- [Development Guide](/getting-started/development) diff --git a/docus/dist/raw/client-addons/notifications.md b/docus/dist/raw/client-addons/notifications.md new file mode 100644 index 0000000..38899e6 --- /dev/null +++ b/docus/dist/raw/client-addons/notifications.md @@ -0,0 +1,147 @@ +# Client Notifications Usage Guide + +The client notifications addon owns the notification HUD, notification sound, +and local notification service used by Forge client and server modules. + +## Runtime Behavior + +The notification display is created during client initialization. The browser +HUD sends: + +```text +notifications::ready +``` + +When that event is received, `NotificationService` initializes and sends a +startup notification. + +## Create a Notification + +Use the notification service when available: + +```sqf +GVAR(NotificationService) call ["create", [ + "success", + "Title", + "Notification text.", + 4000 +]]; +``` + +Arguments: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Argument + + Purpose +
+ + _type + + + Notification type, such as + success + + + , + info + + + , + warning + + + , or + error + + + . +
+ + _title + + + Notification title. +
+ + _content + + + Notification body text. +
+ + _duration + + + Display duration in milliseconds. +
+ +The service dispatches a browser `forge:notify` custom event. + +## CBA Event Surface + +Other addons can use the client notification event: + +```sqf +["forge_client_notifications_recieveNotification", [ + "warning", + "Garage", + "Vehicle spawn position is blocked.", + 3000 +]] call CBA_fnc_localEvent; +``` + +The event payload is: + +```sqf +[_type, _title, _content, _duration] +``` + +## Usage Rules + +- Use the shared notification service instead of opening separate transient +browser UIs. +- Keep server-driven player feedback short and actionable. +- Treat notification state as transient client UI state. +- Do not use notifications as the only record of durable domain changes. + +## Related Guides + +- [Client Usage Guide](/client-addons) +- [Client Garage Usage Guide](/client-addons/garage) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/dist/raw/client-addons/organization.md b/docus/dist/raw/client-addons/organization.md new file mode 100644 index 0000000..755df2b --- /dev/null +++ b/docus/dist/raw/client-addons/organization.md @@ -0,0 +1,426 @@ +# Client Organization Usage Guide + +The client organization addon provides the organization portal UI and browser +bridge for login, registration, membership, invites, credit lines, leave and +disband flows, assets, fleet, and treasury display. + +## Open Organization UI + +```sqf +call forge_client_org_fnc_openUI; +``` + +The UI opens `RscOrg`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_org_fnc_handleUIEvents`. + +## Repository and Bridge + +`forge_client_org_fnc_initRepository` caches organization portal state. + +`forge_client_org_fnc_initUIBridge` owns: + +- active browser control tracking +- portal hydrate requests +- create/login response routing +- leave and disband requests +- credit-line assignment requests +- invite, accept invite, and decline invite requests +- targeted browser response events + +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + org::ready + + + Mark browser ready and request + org::sync + + + . +
+ + org::login::request + + + Request portal hydrate as + org::login::success + + + . +
+ + org::create::request + + + Validate org name and request creation on server. +
+ + org::disband::request + + + Request disband on server. +
+ + org::leave::request + + + Request leave on server. +
+ + org::credit::request + + + Request credit-line assignment. +
+ + org::invite::request + + + Request member invite. +
+ + org::invite::accept + + + Accept invite by org ID. +
+ + org::invite::decline + + + Decline invite by org ID. +
+ + org::close + + + Close the display. +
+ +## Browser Response Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Purpose +
+ + org::sync + + + Full portal sync payload. +
+ + org::login::success + + + Login hydrate payload. +
+ + org::create::success + + + Creation hydrate payload. +
+ + org::create::failure + + + Creation validation or server failure. +
+ + org::disband::success + + + Requester disband success. +
+ + org::disband::failure + + + Disband failure. +
+ + org::portal::revoked + + + Portal state revoked by someone else's disband action. +
+ + org::leave::success + + + Leave success. +
+ + org::leave::failure + + + Leave failure. +
+ + org::credit::success + + + Credit-line request success. +
+ + org::credit::failure + + + Credit-line request failure. +
+ + org::member::creditUpdated + + + Targeted member credit-line patch. +
+ + org::invite::success + + + Invite success. +
+ + org::invite::failure + + + Invite failure. +
+ + org::invite::decision::success + + + Invite accept/decline success. +
+ + org::invite::decision::failure + + + Invite accept/decline failure. +
+ +## Request Examples + +Create organization request payload: + +```json +{ + "orgName": "Example Logistics" +} +``` + +Credit-line request payload: + +```json +{ + "memberUid": "76561198000000000", + "memberName": "Player Name", + "amount": 2500 +} +``` + +Invite request payload: + +```json +{ + "targetUid": "76561198000000000", + "targetName": "Player Name" +} +``` + +## Authoritative State + +Organization funds, reputation, membership, invites, credit lines, assets, +fleet, and persistence are server-owned. The client portal only displays and +requests changes. + +## Related Guides + +- [Organization Usage Guide](/server-modules/organization) +- [Client Common Usage Guide](/client-addons/common) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Store Usage Guide](/client-addons/store) diff --git a/docus/dist/raw/client-addons/phone.md b/docus/dist/raw/client-addons/phone.md new file mode 100644 index 0000000..51fbfba --- /dev/null +++ b/docus/dist/raw/client-addons/phone.md @@ -0,0 +1,521 @@ +# Client Phone Usage Guide + +The client phone addon provides the in-game phone UI for contacts, SMS +messages, email, and local utility apps such as notes, calendar events, world +clocks, and alarms. + +## Open Phone UI + +```sqf +call forge_client_phone_fnc_openUI; +``` + +The phone UI creates `RscPhone`, loads `ui/_site/index.html`, and routes +browser alerts through `forge_client_phone_fnc_handleUIEvents`. + +## State Ownership + +Contacts, messages, and emails are server-owned and requested through the +server phone addon. + +Local utility app state is stored in `profileNamespace`: + +- notes +- calendar events +- world clocks +- alarms +- theme/preferences + +## Phone Class + +`forge_client_phone_fnc_initClass` creates `GVAR(PhoneClass)`. + +The phone class currently owns local notes, events, and settings helpers. +Contacts, messages, and emails continue to use server-backed request/response +events. + +## Browser Events + +### Session and Preferences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + phone::get::player + + + Send player UID to browser with + setPlayerUid + + + . +
+ + phone::get::theme + + + Send saved light/dark theme to browser. +
+ + phone::set::theme + + + Save theme preference to + profileNamespace + + + . +
+ +### Contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + phone::get::contacts + + + Load cached contacts and request server refresh. +
+ + phone::refresh::contacts + + + Request contacts from server. +
+ + phone::add::contact + + + Add contact by phone number. +
+ + phone::add::contact::by::phone + + + Add contact by phone number. +
+ + phone::add::contact::by::email + + + Add contact by email. +
+ + phone::remove::contact + + + Remove contact by UID. +
+ +### Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + phone::get::messages + + + Request messages from server. +
+ + phone::get::message::thread + + + Request thread with another UID. +
+ + phone::send::message + + + Send SMS through server. +
+ + phone::mark::message::read + + + Mark message read on server. +
+ + phone::delete::message + + + Delete message on server. +
+ +### Email + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + phone::get::emails + + + Request emails from server. +
+ + phone::send::email + + + Send email through server. +
+ + phone::mark::email::read + + + Mark email read on server. +
+ + phone::delete::email + + + Delete email on server. +
+ +### Local Utility Apps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + phone::get::notes + + + Load local notes. +
+ + phone::save::note + + + Save local note. +
+ + phone::delete::note + + + Delete local note. +
+ + phone::get::events + + + Load local calendar events. +
+ + phone::save::event + + + Save local calendar event. +
+ + phone::delete::event + + + Delete local calendar event. +
+ + phone::get::clocks + + + Load local world clocks. +
+ + phone::save::clock + + + Save local world clock. +
+ + phone::delete::clock + + + Delete local world clock. +
+ + phone::get::alarms + + + Load local alarms. +
+ + phone::save::alarm + + + Save local alarm. +
+ + phone::delete::alarm + + + Delete local alarm. +
+ + phone::toggle::alarm + + + Toggle local alarm enabled state. +
+ +## Usage Rules + +- Send contact, message, and email mutations to the server phone addon. +- Keep local-only utility apps in `profileNamespace` until they are migrated to +server-backed storage. +- Do not treat local phone utility state as shared multiplayer state. +- Validate required UID, phone, email, subject, and message fields before +sending server requests. + +## Related Guides + +- [Phone Usage Guide](/server-modules/phone) +- [Client Notifications Usage Guide](/client-addons/notifications) diff --git a/docus/dist/raw/client-addons/store.md b/docus/dist/raw/client-addons/store.md new file mode 100644 index 0000000..5796a61 --- /dev/null +++ b/docus/dist/raw/client-addons/store.md @@ -0,0 +1,228 @@ +# Client Store Usage Guide + +The client store addon provides the storefront browser UI for catalog browsing, +category hydration, payment source display, cart handling, and checkout +requests. + +## Open Store UI + +```sqf +call forge_client_store_fnc_openUI; +``` + +The UI opens `RscStore`, loads `ui/_site/index.html`, and routes browser alerts +through `forge_client_store_fnc_handleUIEvents`. + +## Bridge + +`forge_client_store_fnc_initUIBridge` owns: + +- browser control lookup +- store hydrate requests +- category requests +- checkout requests +- category hydrate/failure responses +- checkout success/failure responses +- store config refresh after successful checkout + +Store currently uses its own `StoreUIBridge.receive(...)` browser bridge rather +than the shared `ForgeBridge.receive(...)` delivery used by newer bridges. + +## Browser Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Client behavior +
+ + store::ready + + + Request store hydrate from the server. +
+ + store::category::request + + + Request catalog items for a category. +
+ + store::checkout::request + + + Forward checkout JSON to the server. +
+ + store::close + + + Close the display. +
+ +## Browser Response Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Event + + Purpose +
+ + store::hydrate + + + Initial storefront/session/config payload. +
+ + store::config::hydrate + + + Refreshed payment/source config. +
+ + store::category::hydrate + + + Category catalog payload. +
+ + store::category::failure + + + Category request failure. +
+ + store::checkout::success + + + Checkout success payload. +
+ + store::checkout::failure + + + Checkout failure payload. +
+ +## Category Requests + +Category requests require a non-empty category value. + +```json +{ + "category": "weapons" +} +``` + +The client lowercases the category before forwarding it to the server store +addon. + +## Checkout Requests + +Checkout requests send a serialized checkout payload: + +```json +{ + "checkoutJson": "{\"items\":[],\"paymentSource\":\"cash\"}" +} +``` + +The client only forwards the checkout data. The server store addon and +extension validate prices, inventory grants, payment source authorization, and +integration with bank, organization, locker, and garage state. + +After a successful checkout, the client asks the server for a fresh store config +payload so payment-source balances and permissions stay current. + +## Authoritative State + +Catalog data, prices, checkout validation, money movement, organization funds, +credit lines, locker grants, garage grants, and persistence are server-owned. + +## Related Guides + +- [Store Usage Guide](/server-modules/store) +- [Client Bank Usage Guide](/client-addons/bank) +- [Client Organization Usage Guide](/client-addons/organization) +- [Client Locker Usage Guide](/client-addons/locker) +- [Client Garage Usage Guide](/client-addons/garage) diff --git a/docus/dist/raw/getting-started.md b/docus/dist/raw/getting-started.md new file mode 100644 index 0000000..4718453 --- /dev/null +++ b/docus/dist/raw/getting-started.md @@ -0,0 +1,67 @@ +# Getting Started + +Use this section as the main entry point for the Forge framework. + +Forge combines: + +- Arma 3 client addons for UX and browser-hosted interfaces +- Arma 3 server addons for mission integration and authoritative flow control +- a Rust server extension for command routing and persistence +- shared Rust crates for models, repositories, and services +- SurrealDB for durable storage + +## Common Commands + +```powershell +cargo test +npm run build:webui +.\build-arma.ps1 +``` + +## Start Here + + + + +Understand how SQF, Rust services, SurrealDB, and browser UIs fit together. + + + + + +Review gameplay domains, infrastructure modules, and extension command groups. + + + + + +See the rules for adding modules and changing boundaries without regressions. + + + + + +Install SurrealDB, match Forge config values, and choose the right setup path +for developers or admin-facing roles. + + + + + +Follow the extension architecture, API surface, and SQF usage examples. + + + + + +Dive into the actor, bank, CAD, garage, locker, organization, phone, store, +task, and owned-storage guides. + + + + + +Explore the client bridge model and addon-specific browser integration rules. + + + diff --git a/docus/dist/raw/getting-started/architecture.md b/docus/dist/raw/getting-started/architecture.md new file mode 100644 index 0000000..fcb54e7 --- /dev/null +++ b/docus/dist/raw/getting-started/architecture.md @@ -0,0 +1,136 @@ +# Framework Architecture + +Forge is organized around domain modules. A domain usually has SQF addon +entry points, Rust models, repository traits, service logic, extension command +handlers, and optional browser UI. + +## Runtime Flow + +```text +Arma client UI or SQF action + -> client addon bridge + -> server addon function + -> forge_server callExtension command + -> extension command group + -> forge-services domain service + -> forge-repositories trait + -> SurrealDB repository implementation + -> SurrealDB +``` + +For small payloads, server SQF calls `forge_server` directly through the +extension bridge. For large payloads, `arma/server/addons/extension` stages +request and response chunks through the extension transport module. + +## Main Layers + +### Client Addons + +Client addons live under `arma/client/addons`. They own local player UX, +keybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs +durable or authoritative state, it routes work to the matching server addon +instead of touching persistence directly. + +### Server Addons + +Server addons live under `arma/server/addons`. They own server-side SQF +initialization, game-object integration, validation near the Arma runtime, and +calls into the Rust extension. The `extension` addon is the shared bridge for +`callExtension` and transport handling. + +### Rust Extension + +The server extension lives under `arma/server/extension`. It registers the +`forge_server` command groups, loads configuration, initializes SurrealDB, and +maps SQF command inputs into service calls. + +The extension should stay thin: + +- Parse and validate command arguments that arrive from SQF. +- Resolve Arma-specific context such as player UID when required. +- Call the matching service. +- Serialize the service result back to JSON or a simple string. + +### Shared Rust Crates + +The `lib` workspace contains reusable Rust crates: + +- `forge-models`: shared domain structs and serialization rules. +- `forge-repositories`: storage-agnostic repository traits and in-memory +implementations used by tests and hot-state services. +- `forge-services`: domain behavior, validation, and mutation workflows. +- `forge-shared`: cross-crate helpers. + +### Persistence + +Durable storage is SurrealDB. Schema modules live under +`arma/server/extension/src/schema`, and concrete SurrealDB repository +implementations live under `arma/server/extension/src/storage`. + +Repository traits stay in `lib/repositories` so service logic remains testable +without a database. + +## Hot State + +Several domains have `hot` command groups. Hot state keeps a runtime copy of +frequently accessed data in memory, then saves it back to durable storage when +requested. This is useful for player state that changes often during a session. + +Typical hot-state flow: + +```text +actor:hot:init +actor:hot:get +actor:hot:override +actor:hot:save +actor:hot:remove +``` + +Use hot state for session workflows. Use normal domain commands for direct +durable CRUD operations. + +## Transport Layer + +The transport layer exists because Arma extension calls have practical payload +size limits. It provides chunked request and response handling while still +routing to the same domain command groups. + +Common direct command: + +```sqf +"forge_server" callExtension ["status", []]; +``` + +Common transport path: + +```text +server addon fnc_extCall + -> transport:request:append + -> transport:invoke_stored + -> transport:response:get +``` + +## Configuration + +The server extension reads `config.toml` next to the extension DLL. The current +persistence section is: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +For install links and role-based setup guidance, see +[SurrealDB Setup](/getting-started/surrealdb-setup). + +Check persistence readiness before issuing commands that require storage: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` diff --git a/docus/dist/raw/getting-started/development.md b/docus/dist/raw/getting-started/development.md new file mode 100644 index 0000000..3989bf4 --- /dev/null +++ b/docus/dist/raw/getting-started/development.md @@ -0,0 +1,243 @@ +# Development Guide + +This guide covers the usual path for adding or changing a Forge module. + +## Local Checks + +Before running storage-backed workflows locally, complete +[SurrealDB Setup](/getting-started/surrealdb-setup). + +Run these before pushing Rust or extension changes: + +```powershell +cargo fmt --check +cargo check +cargo test +cargo build +cargo clippy --all-targets --all-features -- -D warnings +``` + +Run this after changing browser UI sources: + +```powershell +npm run build:webui +``` + +Build Arma packages with: + +```powershell +.\build-arma.ps1 +``` + +## Module Boundaries + +Keep each layer responsible for one kind of work: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Layer + + Owns + + Avoid +
+ + lib/models + + + Data structures, serde defaults, validation helpers. + + Database calls, SQF-specific context. +
+ + lib/repositories + + + Repository traits and in-memory stores. + + SurrealDB-specific code. +
+ + lib/services + + + Business rules, workflow orchestration, structured results. + + Arma engine calls, extension transport details. +
+ + arma/server/extension + + + Command parsing, context resolution, SurrealDB implementations, serialization to SQF. + + Business rules that belong in services. +
+ + arma/server/addons + + + Server SQF lifecycle, game-object integration, calls into + forge_server + + + . + + Direct database logic. +
+ + arma/client/addons + + + Client UI, keybinds, local UI events. + + Authoritative persistence. +
+ +## Adding a Domain Module + +1. Add the model in `lib/models/src/.rs`. +2. Export the model from `lib/models/src/lib.rs`. +3. Add repository traits in `lib/repositories/src/.rs`. +4. Add in-memory repository support if the service needs tests or hot state. +5. Export the traits from `lib/repositories/src/lib.rs`. +6. Add service logic in `lib/services/src/.rs`. +7. Add focused unit tests for service behavior. +8. Export the service from `lib/services/src/lib.rs`. +9. Add a SurrealDB schema module under `arma/server/extension/src/schema`. +10. Add the concrete storage adapter under `arma/server/extension/src/storage`. +11. Register the storage adapter in `arma/server/extension/src/storage.rs`. +12. Add an extension command group under `arma/server/extension/src/.rs`. +13. Register the command group in `arma/server/extension/src/lib.rs`. +14. Add server addon functions under `arma/server/addons/` if SQF needs a module-level API. +15. Add client addon or browser UI files under `arma/client/addons/` if the module has player-facing UI. +16. Add documentation in `docs/` and module-level READMEs. + +## Extension Command Rules + +Commands should return one of these forms: + +- JSON string for structured results. +- `"true"` or `"false"` for simple existence and boolean operations. +- `"OK"` for successful destructive operations with no response body. +- `"Error: "` for failures. + +Prefer stable JSON shapes over ad hoc strings. SQF callers should always check +for the `"Error:"` prefix before parsing JSON. + +Example: + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor request failed: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` + +## Persistence Rules + +SurrealDB is the durable store. Keep database-specific mapping in the extension +storage adapters, not in services or repository traits. + +When changing persisted data: + +- Update or add the matching `.surql` schema module. +- Update the concrete storage adapter. +- Preserve existing records when possible through serde defaults or migration +logic. +- Add tests at the service level for behavior, and add storage tests only when +database mapping is the risk. + +## Hot-State Rules + +Use hot state for data that is read or mutated frequently during a player +session. Hot-state modules usually provide: + +- `init` to load durable state into memory. +- `get` to read the runtime copy. +- `override` or focused mutation commands to update the runtime copy. +- `save` to write the runtime copy back to SurrealDB. +- `remove` to evict the runtime copy. + +Do not assume hot state is durable until `save` succeeds. + +## Web UI Rules + +Browser UI source files live under each client addon. Built assets usually land +under that addon's `ui/_site` directory. + +Use the existing common bridge in `arma/client/addons/common` when a UI needs +to send events back to SQF. Keep UI state and rendering in JavaScript, and keep +server-authoritative decisions in server SQF or Rust services. + +## Documentation Checklist + +When adding or changing a module, update: + +- `docs/MODULE_REFERENCE.md` for framework-level inventory. +- A module-specific README in the addon directory when SQF or UI usage changes. +- `arma/server/docs/api-reference.md` when extension commands change. +- Existing usage guides when payload shapes or workflows change. diff --git a/docus/dist/raw/getting-started/module-reference.md b/docus/dist/raw/getting-started/module-reference.md new file mode 100644 index 0000000..ad528bf --- /dev/null +++ b/docus/dist/raw/getting-started/module-reference.md @@ -0,0 +1,2052 @@ +# Module Reference + +This reference lists the main Forge modules and where each layer lives. + +## Directory Map + +```text +arma/client/addons/ Client-side Arma addons and browser UIs +arma/server/addons/ Server-side Arma addons and extension bridge +arma/server/extension/ Rust arma-rs extension and SurrealDB adapters +bin/icom/ Interprocess communication helper +lib/models/ Shared domain data models +lib/repositories/ Repository traits and in-memory stores +lib/services/ Domain services and workflow logic +lib/shared/ Cross-crate helpers +tools/ Web UI build tooling +docs/ Framework-level documentation +``` + +## Gameplay Domains + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Domain + + Purpose + + Client addon + + Server addon + + Service/model layer + + Extension group +
+ Actor + + Player identity, loadout, position, status, contact identifiers, and persistent character data. + + + arma/client/addons/actor + + + + arma/server/addons/actor + + + + lib/models/src/actor.rs + + + , + lib/services/src/actor.rs + + + + actor:* + +
+ Bank + + Player accounts, cash/bank balances, PIN validation, transfers, checkout charging, and transaction context. + + + arma/client/addons/bank + + + + arma/server/addons/bank + + + + lib/models/src/bank.rs + + + , + lib/services/src/bank.rs + + + + bank:* + + + , + bank:hot:* + +
+ CAD + + Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views. + + + arma/client/addons/cad + + + + arma/server/addons/cad + + + + lib/models/src/cad.rs + + + , + lib/services/src/cad.rs + + + + cad:* + +
+ Garage + + Player vehicle storage with plate IDs, fuel, damage, and hit point state. + + + arma/client/addons/garage + + + + arma/server/addons/garage + + + + lib/models/src/garage.rs + + + , + lib/services/src/garage.rs + + + + garage:* + + + , + garage:hot:* + +
+ Locker + + Player item storage keyed by classname with category and amount. + + + arma/client/addons/locker + + + + arma/server/addons/locker + + + + lib/models/src/locker.rs + + + , + lib/services/src/locker.rs + + + + locker:* + + + , + locker:hot:* + +
+ Organization + + Player organizations, membership, treasury, credit lines, shared assets, and fleet data. + + + arma/client/addons/org + + + + arma/server/addons/org + + + + lib/models/src/org.rs + + + , + lib/services/src/org.rs + + + + org:* + + + , + org:hot:* + +
+ Phone + + Contacts, messages, and email state. + + + arma/client/addons/phone + + + + arma/server/addons/phone + + + + lib/models/src/phone.rs + + + , + lib/services/src/phone.rs + + + + phone:* + +
+ Store + + Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration. + + + arma/client/addons/store + + + + arma/server/addons/store + + + + lib/models/src/store.rs + + + , + lib/services/src/store.rs + + + + store:checkout + +
+ Task + + Server-owned mission/task flows, catalog, ownership, status, participant tracking, rewards, and defuse counters. + + none + + + arma/server/addons/task + + + + lib/models/src/task.rs + + + , + lib/services/src/task.rs + + + + task:* + +
+ Owned Garage + + Organization or owner-scoped vehicle unlock storage. + + via garage/org UI + + server extension only + + + lib/models/src/v_garage.rs + + + , + lib/services/src/v_garage.rs + + + + owned:garage:* + +
+ Owned Locker + + Organization or owner-scoped arsenal unlock storage. + + via locker/org UI + + server extension only + + + lib/models/src/v_locker.rs + + + , + lib/services/src/v_locker.rs + + + + owned:locker:* + +
+ +Server and extension guides: +[Actor](/server-modules/actor), +[Bank](/server-modules/bank), +[CAD](/server-modules/cad), +[Economy](/server-modules/economy), +[Garage](/server-modules/garage), +[Locker](/server-modules/locker), +[Organization](/server-modules/organization), +[Owned Storage](/server-modules/owned-storage), +[Phone](/server-modules/phone), +[Store](/server-modules/store), +[Task](/server-modules/task). + +Client guides: +[Client Overview](/client-addons), +[Main](/client-addons/main), +[Common](/client-addons/common), +[Actor](/client-addons/actor), +[Bank](/client-addons/bank), +[CAD](/client-addons/cad), +[Garage](/client-addons/garage), +[Locker](/client-addons/locker), +[Notifications](/client-addons/notifications), +[Organization](/client-addons/organization), +[Phone](/client-addons/phone), +[Store](/client-addons/store). + +## Infrastructure Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Module + + Purpose + + Location +
+ + common + + + Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces. + + + arma/client/addons/common + + + , + arma/server/addons/common + +
+ + extension + + + Server SQF bridge around + forge_server + + + extension calls and chunked transport. + + + arma/server/addons/extension + +
+ + main + + + Mod-level configuration, pre-init wiring, and server/client startup glue. + + + arma/client/addons/main + + + , + arma/server/addons/main + +
+ + economy + + + Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank/cash first, then organization funds with repayable member debt when personal funds cannot cover the bill. + + + arma/server/addons/economy + +
+ + notifications + + + Client notification UI, sounds, and UI event handling. + + + arma/client/addons/notifications + +
+ + icom + + + Rust helper for interprocess communication and event broadcasting. + + + bin/icom + + + , + arma/server/extension/src/icom.rs + +
+ + terrain + + + Extension-side terrain export helper. + + + arma/server/extension/src/terrain.rs + +
+ + transport + + + Chunked request/response handling for large extension payloads. + + + arma/server/extension/src/transport.rs + +
+ + surreal + + + SurrealDB connection lifecycle and status reporting. + + + arma/server/extension/src/surreal.rs + +
+ +## Extension Command Groups + +Commands are invoked with: + +```sqf +"forge_server" callExtension ["group:command", [_arg1, _arg2]]; +``` + +Nested groups use additional `:` separators, for example +`bank:hot:deposit`. + +### Core + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + version + + + Return the extension version string. +
+ + status + + + Return SurrealDB connection state. +
+ + surreal:status + + + Return SurrealDB connection state directly from the Surreal module. +
+ +### Actor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + actor:get + + + Fetch actor data for a resolved player UID. +
+ + actor:create + + + Create actor data from JSON. +
+ + actor:update + + + Apply actor JSON updates. +
+ + actor:exists + + + Return + true + + + or + false + + + . +
+ + actor:delete + + + Delete actor data. +
+ + actor:hot:init + + + , + actor:hot:get + + + , + actor:hot:keys + + + , + actor:hot:override + + + , + actor:hot:save + + + , + actor:hot:remove + + + Manage actor hot state. +
+ +See [Actor Usage Guide](/server-modules/actor) for examples. + +### Bank + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + bank:get + + + , + bank:create + + + , + bank:update + + + , + bank:exists + + + , + bank:delete + + + Durable bank CRUD. +
+ + bank:hot:init + + + , + bank:hot:get + + + , + bank:hot:override + + + , + bank:hot:patch + + + , + bank:hot:save + + + , + bank:hot:remove + + + Manage bank hot state. +
+ + bank:hot:deposit + + + , + bank:hot:withdraw + + + , + bank:hot:deposit_earnings + + + , + bank:hot:transfer + + + Mutate hot bank balances with operation context. +
+ + bank:hot:charge_checkout + + + Charge a checkout against hot bank state. +
+ + bank:hot:validate_pin + + + Validate a PIN for bank operations. +
+ +See [Bank Usage Guide](/server-modules/bank) for examples. + +### Garage + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + garage:create + + + , + garage:get + + + , + garage:add + + + , + garage:update + + + , + garage:patch + + + , + garage:remove + + + , + garage:delete + + + , + garage:exists + + + Durable player garage operations. +
+ + garage:hot:init + + + , + garage:hot:get + + + , + garage:hot:override + + + , + garage:hot:add + + + , + garage:hot:remove_vehicle + + + , + garage:hot:save + + + , + garage:hot:remove + + + Manage player garage hot state. +
+ +See [Garage Usage Guide](/server-modules/garage) for examples. + +### Locker + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + locker:create + + + , + locker:get + + + , + locker:add + + + , + locker:update + + + , + locker:patch + + + , + locker:remove + + + , + locker:delete + + + , + locker:exists + + + Durable player locker operations. +
+ + locker:hot:init + + + , + locker:hot:get + + + , + locker:hot:override + + + , + locker:hot:save + + + , + locker:hot:remove + + + Manage player locker hot state. +
+ +See [Locker Usage Guide](/server-modules/locker) for examples. + +### Organization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + org:get + + + , + org:create + + + , + org:update + + + , + org:exists + + + , + org:delete + + + Durable organization CRUD. +
+ + org:assets:get + + + , + org:assets:update + + + Manage organization assets. +
+ + org:fleet:get + + + , + org:fleet:update + + + Manage organization fleet entries. +
+ + org:members:get + + + , + org:members:add + + + , + org:members:remove + + + Manage organization membership. +
+ + org:hot:* + + + Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove. +
+ +See [Org Usage Guide](/server-modules/organization) for examples. + +### Phone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Purpose +
+ + phone:init + + + Initialize phone state for a UID. +
+ + phone:contacts:list + + + , + phone:contacts:add + + + , + phone:contacts:remove + + + Manage contacts. +
+ + phone:messages:list + + + , + phone:messages:thread + + + , + phone:messages:send + + + , + phone:messages:mark_read + + + , + phone:messages:delete + + + Manage messages. +
+ + phone:emails:list + + + , + phone:emails:send + + + , + phone:emails:mark_read + + + , + phone:emails:delete + + + Manage emails. +
+ + phone:remove + + + Remove phone state for a UID. +
+ +See [Phone Usage Guide](/server-modules/phone) for examples. + +### CAD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command Group + + Purpose +
+ + cad:activity:append + + + , + cad:activity:recent + + + Append and read recent activity. +
+ + cad:assignments:list + + + , + cad:assignments:assign + + + , + cad:assignments:acknowledge + + + , + cad:assignments:decline + + + , + cad:assignments:upsert + + + , + cad:assignments:delete + + + Manage dispatch assignments. +
+ + cad:orders:list + + + , + cad:orders:create + + + , + cad:orders:create_from_context + + + , + cad:orders:close + + + , + cad:orders:upsert + + + , + cad:orders:delete + + + Manage orders. +
+ + cad:requests:list + + + , + cad:requests:submit + + + , + cad:requests:submit_from_context + + + , + cad:requests:close + + + , + cad:requests:upsert + + + , + cad:requests:delete + + + Manage requests. +
+ + cad:profiles:list + + + , + cad:profiles:update_from_context + + + , + cad:profiles:upsert + + + , + cad:profiles:delete + + + Manage profiles. +
+ + cad:groups:build + + + Build grouped CAD state. +
+ + cad:view:hydrate + + + Build the dispatcher view model. +
+ +See [CAD Usage Guide](/server-modules/cad) for examples. + +### Task + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command Group + + Purpose +
+ + task:reset + + + Reset task state. +
+ + task:catalog:active + + + , + task:catalog:get + + + , + task:catalog:upsert + + + , + task:catalog:delete + + + Manage task catalog entries. +
+ + task:ownership:bind + + + , + task:ownership:release + + + , + task:ownership:accept + + + , + task:ownership:reward_context + + + Manage task ownership and rewards. +
+ + task:status:set + + + , + task:status:get + + + , + task:status:clear + + + Manage task status. +
+ + task:defuse:increment + + + , + task:defuse:get + + + Manage defuse counters. +
+ + task:clear + + + Clear task state. +
+ +See [Task Usage Guide](/server-modules/task) for examples. + +### Owned Storage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command Group + + Purpose +
+ + owned:garage:create + + + , + owned:garage:fetch + + + , + owned:garage:get + + + , + owned:garage:add + + + , + owned:garage:remove + + + , + owned:garage:delete + + + , + owned:garage:exists + + + Owner-scoped vehicle storage. +
+ + owned:garage:hot:* + + + Owner-scoped vehicle hot state. +
+ + owned:locker:create + + + , + owned:locker:fetch + + + , + owned:locker:get + + + , + owned:locker:add + + + , + owned:locker:remove + + + , + owned:locker:delete + + + , + owned:locker:exists + + + Owner-scoped item storage. +
+ + owned:locker:hot:* + + + Owner-scoped item hot state. +
+ +See [Owned Storage Usage Guide](/server-modules/owned-storage) for examples. + +### Other Extension Groups + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command Group + + Purpose +
+ + store:checkout + + + Run store checkout behavior. +
+ + icom:connect + + + , + icom:broadcast + + + , + icom:send_event + + + ICom connection and event forwarding. +
+ + terrain:exportSVG + + + Export terrain data as SVG. +
+ + transport:invoke + + + , + transport:invoke_stored + + + Invoke commands through transport. +
+ + transport:request:append + + + , + transport:request:clear + + + Manage stored request chunks. +
+ + transport:response:get + + + , + transport:response:clear + + + Manage stored response chunks. +
+ +## Rust Crates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Crate + + Role +
+ + forge-models + + + Domain models and validation. Keep these serializable and free of persistence details. +
+ + forge-repositories + + + Repository traits and in-memory implementations. Keep these storage-agnostic. +
+ + forge-services + + + Business rules and workflows. Depend on repository traits, not concrete databases. +
+ + forge-shared + + + Cross-crate helpers. Keep dependencies light. +
+ + forge-server + + + Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters. +
+ + forge-icom + + + ICom helper binary and client library. +
diff --git a/docus/dist/raw/getting-started/surrealdb-setup.md b/docus/dist/raw/getting-started/surrealdb-setup.md new file mode 100644 index 0000000..b86ca1c --- /dev/null +++ b/docus/dist/raw/getting-started/surrealdb-setup.md @@ -0,0 +1,101 @@ +# SurrealDB Setup + +Forge uses SurrealDB for durable storage. The Rust server extension connects to +SurrealDB on startup and applies Forge schema modules automatically, so setup +comes down to running a reachable database and matching the Forge config. + +## Choose the Right Path + +### Developer or Server Operator + +Use this path if you are building Forge, running a local test server, or +hosting the live Arma server. + +Official SurrealDB resources: + +- [SurrealDB install page](https://surrealdb.com/install) +- [SurrealDB CLI `start` reference](https://surrealdb.com/docs/reference/cli/surrealdb-cli/commands/start) + +Install SurrealDB with the official method for your platform: + +```powershell +# Windows +iwr https://windows.surrealdb.com -useb | iex +``` + +```bash +# macOS +brew install surrealdb/tap/surreal +``` + +```bash +# Linux +curl -sSf https://install.surrealdb.com | sh +``` + +For Forge, start a persistent local database instead of the default in-memory +mode: + +```powershell +surreal start surrealkv://forge.db --bind 127.0.0.1:8000 --user root --pass root +``` + +Then copy `arma/server/extension/config.example.toml` to `config.toml` next to +`forge_server_x64.dll` and keep the values aligned with the database you +started: + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +After that: + +1. Start the Arma server with the Forge extension enabled. +2. Let the extension connect and apply the Forge schema modules. +3. Verify the connection state: + +```sqf +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +If you change the endpoint, namespace, database, username, or password in +SurrealDB, change the same values in Forge's `config.toml`. + +### Mission Designer or Community Manager/Leader + +Use this path if you mostly need to inspect, query, or adjust data for a test +or live server and you are not changing Forge source code. + +Official SurrealDB resources: + +- [Surrealist installation](https://surrealdb.com/docs/explore/surrealist/installation) +- [Surrealist web app](https://app.surrealdb.com) +- [Surrealist local database serving](https://surrealdb.com/docs/explore/surrealist/concepts/local-database-serving) + +Recommended approach: + +1. Install **Surrealist Desktop**. It is the better fit for Forge because the +official docs note that the web app can be limited when connecting to +`localhost` or non-HTTPS endpoints. +2. Connect Surrealist to the same database Forge uses. +3. Use the values from the server's `config.toml`: + +```text +Endpoint: http://127.0.0.1:8000 +Namespace: forge +Database: main +Username: root +Password: root +``` + +If you need your own local sandbox instead of connecting to an existing Forge +server, install SurrealDB first and follow the developer/server-operator path +above. Surrealist Desktop can also launch a local database for you after the +`surreal` executable is installed and available on your `PATH`. diff --git a/docus/dist/raw/index.md b/docus/dist/raw/index.md new file mode 100644 index 0000000..3250c94 --- /dev/null +++ b/docus/dist/raw/index.md @@ -0,0 +1,231 @@ +# + +> + + + + + + + + + + + + + + + + + + + + diff --git a/docus/dist/raw/server-extension.md b/docus/dist/raw/server-extension.md new file mode 100644 index 0000000..8f9201b --- /dev/null +++ b/docus/dist/raw/server-extension.md @@ -0,0 +1,43 @@ +# Forge Server Extension + +Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB. + +## Architecture + +SQF modules call `forge_server` through `fnc_extCall`. Small requests use the +direct `callExtension` path, while large payloads are staged through the +transport layer. + +```text +SQF module + -> extension bridge + -> domain command + -> service layer + -> repository + -> SurrealDB +``` + +## Configuration + +Copy `config.example.toml` to `config.toml` next to the extension DLL. + +```toml +[surreal] +endpoint = "127.0.0.1:8000" +namespace = "forge" +database = "main" +username = "root" +password = "root" +connect_timeout_ms = 5000 +``` + +For install links and Forge-specific setup steps, see +[SurrealDB Setup](/getting-started/surrealdb-setup). + +## References + +- [API Reference](/server-extension/api-reference) +- [Usage Examples](/server-extension/usage-examples) +- [Framework Module Guides](/getting-started) diff --git a/docus/dist/raw/server-extension/api-reference.md b/docus/dist/raw/server-extension/api-reference.md new file mode 100644 index 0000000..1ad6653 --- /dev/null +++ b/docus/dist/raw/server-extension/api-reference.md @@ -0,0 +1,48 @@ +# Forge Server API Reference + +The Forge server extension exposes domain-oriented commands through +`callExtension`. Persistent data is stored through the configured SurrealDB +connection and schema modules. + +## Core Commands + +```sqf +"forge_server" callExtension ["version", []]; +"forge_server" callExtension ["status", []]; +"forge_server" callExtension ["surreal:status", []]; +``` + +`status` and `surreal:status` return `initializing`, `connected`, or `failed`. + +## Domain Commands + +Game systems should call the domain APIs instead of raw database operations: + +- `actor:*` +- `bank:*` +- `garage:*` +- `locker:*` +- `org:*` +- `phone:*` +- `store:*` +- `task:*` +- `cad:*` +- `owned:garage:*` +- `owned:locker:*` +- `transport:*` + +Large request and response payloads are routed through the transport layer when +needed by `forge_server_addons_extension_fnc_extCall`. + +## Module Guides + +- [Actor](/server-modules/actor) +- [Bank](/server-modules/bank) +- [CAD](/server-modules/cad) +- [Garage](/server-modules/garage) +- [Locker](/server-modules/locker) +- [Organization](/server-modules/organization) +- [Owned Storage](/server-modules/owned-storage) +- [Phone](/server-modules/phone) +- [Store](/server-modules/store) +- [Task](/server-modules/task) diff --git a/docus/dist/raw/server-extension/usage-examples.md b/docus/dist/raw/server-extension/usage-examples.md new file mode 100644 index 0000000..c766ea2 --- /dev/null +++ b/docus/dist/raw/server-extension/usage-examples.md @@ -0,0 +1,47 @@ +# Forge Server Usage Examples + +These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB. + +## Status Check + +```sqf +["status", []] call forge_server_extension_fnc_extCall params ["_status", "_ok"]; +if (_ok && {_status isEqualTo "connected"}) then { + systemChat "Forge persistence is online."; +}; +``` + +## Actor Fetch + +```sqf +private _uid = getPlayerUID player; +["actor:get", [_uid]] call forge_server_extension_fnc_extCall params ["_payload", "_ok"]; +if (_ok) then { + private _actor = fromJSON _payload; + systemChat format ["Loaded actor %1", _actor getOrDefault ["uid", _uid]]; +}; +``` + +## Store Checkout + +```sqf +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [ + createHashMapFromArray [ + ["classname", "FirstAidKit"], + ["category", "item"], + ["priceValue", 50], + ["quantity", 2] + ] + ]], + ["vehicles", []] +]; + +["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall; +``` diff --git a/docus/dist/raw/server-modules.md b/docus/dist/raw/server-modules.md new file mode 100644 index 0000000..2521fa1 --- /dev/null +++ b/docus/dist/raw/server-modules.md @@ -0,0 +1,80 @@ +# Server Module Guides + +These pages document the authoritative server-side workflows in Forge. + +Most modules follow the same shape: + +1. Server SQF gathers game context and validates mission/runtime assumptions. +2. The `forge_server` extension routes the request into the matching command group. +3. Services apply business rules through storage-agnostic repository traits. +4. The extension persists durable state through SurrealDB adapters when needed. + +## Gameplay Domains + + + + +Persistent player identity, position, loadout, contact fields, and hot state. + + + + + +Player funds, transfers, PIN validation, checkout charging, and bank hot state. + + + + + +Dispatch requests, assignments, profiles, grouped state, and hydrated views. + + + + + +Fuel, service, and medical charging rules across player and organization funds. + + + + + +Vehicle storage, hot-state updates, and persistence of vehicle condition. + + + + + +Player inventory storage, unique item limits, and locker hot-state behavior. + + + + + +Membership, treasury, shared assets, fleet, and organization hot workflows. + + + + + +Owner-scoped locker and vehicle unlock storage used by org-linked features. + + + + + +Contacts, message threads, and email state for in-game phone workflows. + + + + + +Checkout orchestration across pricing, grants, payment sources, and rollback. + + + + + +Task catalog, ownership, status transitions, defuse counters, and rewards. + + + diff --git a/docus/dist/raw/server-modules/actor.md b/docus/dist/raw/server-modules/actor.md new file mode 100644 index 0000000..f5e97d3 --- /dev/null +++ b/docus/dist/raw/server-modules/actor.md @@ -0,0 +1,374 @@ +# Actor Usage Guide + +The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization. + +## Storage Model + +Actor data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "loadout": {}, + "position": [1234.5, 6789.0, 0.0], + "direction": 90.0, + "stance": "STAND", + "email": "0160000000@spearnet.mil", + "phone_number": "0160000000", + "state": "HEALTHY", + "holster": true, + "rank": null, + "organization": "default" +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument and must be a 17-digit Steam +UID. +- `name` is optional, but cannot be empty when set and cannot exceed 50 +characters. +- `position` must be three finite numbers when set. +- `direction` must be in the `0.0 <= direction < 360.0` range. +- `email` must contain `@` and end with `.mil` when set. +- `phone_number` must start with `0160` and be 10 digits when set. +- Empty `phone_number`, `email`, or `organization` fields are filled on create. + +## Commands + +All commands are called on the `actor` group. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + actor:get + + + + uid + + + Actor JSON. If no actor exists, returns a default actor but does not persist it. +
+ + actor:create + + + + uid + + + , + actor_json + + + Persisted actor JSON. +
+ + actor:update + + + + uid + + + , + patch_json + + + Updated actor JSON. +
+ + actor:exists + + + + uid + + + + true + + + or + false + + + . +
+ + actor:delete + + + + uid + + + + OK + + + . +
+ +## Create an Actor + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _actor = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["loadout", getUnitLoadout player], + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["email", ""], + ["phone_number", ""], + ["state", "HEALTHY"], + ["holster", true], + ["organization", "default"] +]; + +private _result = "forge_server" callExtension ["actor:create", [ + getPlayerUID player, + toJSON _actor +]]; +``` + +## Update an Actor + +`actor:update` accepts a JSON object containing only fields to change. + +```sqf +private _patch = createHashMapFromArray [ + ["position", getPosATL player], + ["direction", getDir player], + ["stance", stance player], + ["loadout", getUnitLoadout player] +]; + +private _result = "forge_server" callExtension ["actor:update", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +Supported patch fields are `name`, `position`, `direction`, `stance`, `email`, +`phone_number`, `state`, `holster`, `rank`, `organization`, and `loadout`. +`uid` is ignored. + +## Hot State + +The `actor:hot:*` commands keep a runtime copy of actor data and write it back +only when `actor:hot:save` runs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + actor:hot:init + + + + uid + + + Actor JSON from durable storage. +
+ + actor:hot:get + + + + uid + + + Actor JSON. +
+ + actor:hot:keys + + + none + + JSON array of hot actor UIDs. +
+ + actor:hot:override + + + + uid + + + , + actor_json + + + Actor JSON. +
+ + actor:hot:save + + + + uid + + + Current hot actor JSON and async durable save. +
+ + actor:hot:remove + + + + uid + + + + OK + + + . +
+ +Use hot state for frequently updated session data such as position and loadout. +Use durable commands for account creation and administrative changes. + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Actor error: %1", _payload]; +}; + +private _actor = fromJSON _payload; +``` diff --git a/docus/dist/raw/server-modules/bank.md b/docus/dist/raw/server-modules/bank.md new file mode 100644 index 0000000..f57b692 --- /dev/null +++ b/docus/dist/raw/server-modules/bank.md @@ -0,0 +1,600 @@ +# Bank Usage Guide + +The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, and PIN validation. + +## Storage Model + +Bank data is persisted through SurrealDB by the server extension. + +```json +{ + "uid": "76561198000000000", + "name": "Player Name", + "bank": 1000.0, + "cash": 250.0, + "earnings": 0.0, + "pin": 1234, + "transactions": [] +} +``` + +Rules validated by the Rust service: + +- `uid` is authoritative from the command argument. +- `name` cannot be empty. +- `bank` and `cash` cannot be negative. +- `pin` must be a four-digit number. +- Durable `bank:get` requires an existing bank account. + +## Durable Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + bank:create + + + + uid + + + , + bank_json + + + Persisted bank JSON. +
+ + bank:get + + + + uid + + + Bank JSON. +
+ + bank:update + + + + uid + + + , + patch_json + + + Updated bank JSON. +
+ + bank:exists + + + + uid + + + + true + + + or + false + + + . +
+ + bank:delete + + + + uid + + + + OK + + + . +
+ +## Create an Account + +The `uid` field in the JSON is overwritten with the command UID. + +```sqf +private _account = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["name", name player], + ["bank", 0], + ["cash", 0], + ["earnings", 0], + ["pin", 1234], + ["transactions", []] +]; + +private _result = "forge_server" callExtension ["bank:create", [ + getPlayerUID player, + toJSON _account +]]; +``` + +## Hot-State Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + bank:hot:init + + + + uid + + + Bank JSON loaded into hot state. +
+ + bank:hot:get + + + + uid + + + Bank JSON. +
+ + bank:hot:override + + + + uid + + + , + bank_json + + + Bank JSON. +
+ + bank:hot:patch + + + + uid + + + , + patch_json + + + + { account, patch } + + + . +
+ + bank:hot:deposit + + + + uid + + + , + amount + + + , + context_json + + + + { account, patch } + + + . +
+ + bank:hot:withdraw + + + + uid + + + , + amount + + + , + context_json + + + + { account, patch } + + + . +
+ + bank:hot:deposit_earnings + + + + uid + + + , + amount + + + , + context_json + + + + { account, patch } + + + . +
+ + bank:hot:transfer + + + + source_uid + + + , + target_uid + + + , + amount + + + , + context_json + + + Transfer result JSON. +
+ + bank:hot:charge_checkout + + + + uid + + + , + amount + + + , + context_json + + + + { account, patch } + + + . +
+ + bank:hot:validate_pin + + + + uid + + + , + pin + + + , + context_json + + + + {} + + + on success. +
+ + bank:hot:save + + + + uid + + + Current hot bank JSON and async durable save. +
+ + bank:hot:remove + + + + uid + + + + OK + + + . +
+ +Use hot-state commands for UI workflows. They return patch objects so the UI can +update only changed fields. + +## Deposit and Withdraw + +ATM sessions require `atmAuthorized: true`. Full bank sessions can set +`mode: "bank"`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "atm"], + ["atmAuthorized", true] +]; + +private _deposit = "forge_server" callExtension ["bank:hot:deposit", [ + getPlayerUID player, + "100", + toJSON _context +]]; + +private _withdraw = "forge_server" callExtension ["bank:hot:withdraw", [ + getPlayerUID player, + "50", + toJSON _context +]]; +``` + +## Transfer + +Transfers are only available from the full bank interface. `fromField` can be +`bank` or `cash`. + +```sqf +private _context = createHashMapFromArray [ + ["mode", "bank"], + ["atmAuthorized", false], + ["fromField", "bank"] +]; + +private _result = "forge_server" callExtension ["bank:hot:transfer", [ + getPlayerUID player, + _targetUid, + "250", + toJSON _context +]]; +``` + +## Checkout Charge + +Checkout charging supports `sourceField: "cash"` or `sourceField: "bank"`. +Set `commit` to `false` to preview the patch without saving. + +```sqf +private _context = createHashMapFromArray [ + ["sourceField", "bank"], + ["commit", true] +]; + +private _result = "forge_server" callExtension ["bank:hot:charge_checkout", [ + getPlayerUID player, + "125", + toJSON _context +]]; +``` + +## PIN Validation + +PIN entry is only valid in ATM mode. + +```sqf +private _context = createHashMapFromArray [["mode", "atm"]]; + +private _result = "forge_server" callExtension ["bank:hot:validate_pin", [ + getPlayerUID player, + "1234", + toJSON _context +]]; +``` + +## Error Handling + +```sqf +private _result = "forge_server" callExtension ["bank:hot:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Bank error: %1", _payload]; +}; + +private _bank = fromJSON _payload; +``` diff --git a/docus/dist/raw/server-modules/cad.md b/docus/dist/raw/server-modules/cad.md new file mode 100644 index 0000000..5be47b5 --- /dev/null +++ b/docus/dist/raw/server-modules/cad.md @@ -0,0 +1,766 @@ +# CAD Usage Guide + +The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle. + +## Data Model + +Most CAD records are flexible JSON objects. The service normalizes important +IDs and returns structured mutation results for higher-level workflows. + +Common generated IDs: + +- Orders: `cad-order:` +- Requests: `cad-request:` +- Assignments usually share a task ID or order ID. + +## Commands + +### Activity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + cad:activity:append + + + + activity_json + + + + OK + + + . +
+ + cad:activity:recent + + + + limit + + + Recent activity array JSON. +
+ +### Assignments + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + cad:assignments:list + + + none + + Assignment array JSON. +
+ + cad:assignments:assign + + + + entry_id + + + , + assignment_json + + + Assignment mutation result JSON. +
+ + cad:assignments:acknowledge + + + + entry_id + + + , + patch_json + + + Assignment mutation result JSON. +
+ + cad:assignments:decline + + + + entry_id + + + , + patch_json + + + Assignment mutation result JSON and removes assignment. +
+ + cad:assignments:upsert + + + + entry_id + + + , + assignment_json + + + + OK + + + . +
+ + cad:assignments:delete + + + + entry_id + + + + OK + + + . +
+ +### Orders + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + cad:orders:list + + + none + + Order array JSON. +
+ + cad:orders:create + + + + order_seed_json + + + Dispatch order mutation result JSON. +
+ + cad:orders:create_from_context + + + + context_json + + + Dispatch order mutation result JSON. +
+ + cad:orders:close + + + + entry_id + + + Dispatch order mutation result JSON and removes order/assignment. +
+ + cad:orders:upsert + + + + entry_id + + + , + order_json + + + + OK + + + . +
+ + cad:orders:delete + + + + entry_id + + + + OK + + + . +
+ +### Requests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + cad:requests:list + + + none + + Request array JSON. +
+ + cad:requests:submit + + + + request_json + + + Request mutation result JSON. +
+ + cad:requests:submit_from_context + + + + context_json + + + Request mutation result JSON. +
+ + cad:requests:close + + + + entry_id + + + Request mutation result JSON and removes request. +
+ + cad:requests:upsert + + + + entry_id + + + , + request_json + + + + OK + + + . +
+ + cad:requests:delete + + + + entry_id + + + + OK + + + . +
+ +### Profiles and Views + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + cad:profiles:list + + + none + + Profile array JSON. +
+ + cad:profiles:update_from_context + + + + context_json + + + Profile mutation result JSON. +
+ + cad:profiles:upsert + + + + entry_id + + + , + profile_json + + + + OK + + + . +
+ + cad:profiles:delete + + + + entry_id + + + + OK + + + . +
+ + cad:groups:build + + + + groups_seed_json + + + Group array JSON. +
+ + cad:view:hydrate + + + + hydrate_seed_json + + + Hydrated CAD payload JSON. +
+ +## Submit a Support Request + +```sqf +private _fields = createHashMapFromArray [ + ["pickup_location", "Grid 123456"], + ["precedence", "urgent"], + ["security", "secure"] +]; + +private _context = createHashMapFromArray [ + ["type", "medevac_9line"], + ["fields", _fields], + ["groupId", "alpha"], + ["groupCallsign", "Alpha 1-1"], + ["submittedByUid", getPlayerUID player], + ["submittedByName", name player], + ["priority", "emergency"], + ["position", getPosATL player], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [ + toJSON _context +]]; +``` + +Supported priority values are `routine`, `priority`, and `emergency`. Unknown +values normalize to `priority`. + +## Create a Dispatch Order + +```sqf +private _context = createHashMapFromArray [ + ["assigneeGroupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["targetGroupId", "alpha"], + ["targetGroupCallsign", "Alpha 1-1"], + ["targetPosition", getPosATL player], + ["createdByUid", getPlayerUID player], + ["createdByName", name player], + ["requestId", "cad-request:1"], + ["requestType", "logreq"], + ["requestTitle", "LOGREQ | Alpha 1-1"], + ["requestSummary", "Ammo resupply requested"], + ["requestFields", createHashMap], + ["note", "Support Alpha 1-1 at current position."], + ["priority", "priority"], + ["createdAt", diag_tickTime] +]; + +private _result = "forge_server" callExtension ["cad:orders:create_from_context", [ + toJSON _context +]]; +``` + +## Assignment Workflow + +```sqf +private _assignment = createHashMapFromArray [ + ["groupId", "bravo"], + ["assigneeGroupCallsign", "Bravo 1-1"], + ["assignedByUid", getPlayerUID player], + ["assignedByName", name player], + ["assignedAt", diag_tickTime], + ["state", "assigned"] +]; + +"forge_server" callExtension ["cad:assignments:assign", [ + "task-123", + toJSON _assignment +]]; + +private _ack = createHashMapFromArray [ + ["state", "acknowledged"], + ["acknowledgedByUid", getPlayerUID player], + ["acknowledgedAt", diag_tickTime] +]; + +"forge_server" callExtension ["cad:assignments:acknowledge", [ + "task-123", + toJSON _ack +]]; +``` + +## Hydrate the CAD UI + +```sqf +private _session = createHashMapFromArray [ + ["uid", getPlayerUID player], + ["orgId", "default"], + ["isDispatcher", true], + ["groupId", "alpha"], + ["isLeader", true] +]; + +private _seed = createHashMapFromArray [ + ["groups", _liveGroups], + ["activeTasks", _activeTasks], + ["session", _session] +]; + +private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["CAD error: %1", _payload]; +}; +``` diff --git a/docus/dist/raw/server-modules/economy.md b/docus/dist/raw/server-modules/economy.md new file mode 100644 index 0000000..d28a61c --- /dev/null +++ b/docus/dist/raw/server-modules/economy.md @@ -0,0 +1,77 @@ +# Economy Usage Guide + +The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied. + +## Dependencies + +- `forge_server_common` for logging, formatting, and player lookup. +- `forge_server_bank` for personal medical billing. +- `forge_server_org` for organization-funded services and medical fallback +debt. +- `forge_client_actor` and `forge_client_notifications` for targeted client +responses. + +## Fuel + +Fuel is organization-funded. + +When refueling stops, `fnc_initFEconomyStore.sqf` calculates the fuel delta and +cost, charges the player's organization through `OrgStore chargeCheckout`, and +syncs the organization patch to online members. If organization funds cannot +cover the refuel, the vehicle is rolled back to the fuel level it had when the +session started. + +Garage UI refuel requests use the server `RefuelService` event. The fuel store +calculates missing fuel from the vehicle config `fuelCapacity`, charges the +player's organization, and fills the vehicle only after the organization charge +succeeds. + +## Repair + +Repair is organization-funded. + +Use the repair service event: + +```sqf +[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent; +``` + +`_cost` is optional. Passing `-1` uses the configured service repair cost. +The target is only repaired after the organization charge succeeds. + +The client garage UI forwards selected nearby vehicle repair requests through +the same event. + +## Medical + +Medical is player-funded first. + +When a heal is requested, `fnc_initMEconomyStore.sqf` uses this billing order: + +1. Charge the player's bank balance when it can cover the medical fee. +2. Otherwise charge the player's cash when it can cover the fee. +3. If neither personal balance can cover the fee, charge organization funds. +4. When organization funds cover the fallback charge, record the same amount as +debt on the player's organization credit line. + +The heal only completes after one of those charges succeeds. If personal +billing is unavailable, the heal does not fall back to organization funds +because the server cannot verify that the player is unable to cover the fee. + +## Medical Debt Repayment + +Medical fallback debt uses the existing organization credit-line repayment +flow. The organization treasury is reduced when the service is rendered, and +the player's credit-line `amount_due` increases by the medical fee. When the +player repays through the bank credit-line repayment action, player bank funds +are moved back into the organization treasury. + +## Hot-Cache Boundary + +The economy addon should stay server-authoritative for world effects such as +vehicle fuel, vehicle repair, healing, respawn placement, and death inventory +movement. Bank and organization balances should continue to mutate through the +extension-backed hot-cache services. diff --git a/docus/dist/raw/server-modules/garage.md b/docus/dist/raw/server-modules/garage.md new file mode 100644 index 0000000..503ee36 --- /dev/null +++ b/docus/dist/raw/server-modules/garage.md @@ -0,0 +1,545 @@ +# Garage Usage Guide + +The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage. + +## Storage Model + +Garage data is persisted through SurrealDB by the server extension. + +```json +{ + "plate-uuid": { + "plate": "plate-uuid", + "classname": "B_Quadbike_01_F", + "fuel": 1.0, + "damage": 0.0, + "hit_points": { + "names": ["hitengine"], + "selections": ["engine_hitpoint"], + "values": [0.0] + } + } +} +``` + +Rules validated by the Rust service: + +- A player garage can contain up to 5 vehicles. +- `garage:add` generates a UUID plate automatically. +- `fuel`, `damage`, and every hit point value must be between `0.0` and `1.0`. +- `hit_points.names`, `hit_points.selections`, and `hit_points.values` must have +the same length. +- `garage:get`, `garage:patch`, and `garage:remove` require an existing garage. +- `garage:add` creates an empty garage automatically when one does not exist. + +## Commands + +All commands are called on the `garage` group. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + garage:create + + + + uid + + + Empty vehicle map as JSON. +
+ + garage:get + + + + uid + + + Vehicle map as JSON. +
+ + garage:add + + + + uid + + + , + vehicle_json + + + Updated vehicle map as JSON. +
+ + garage:update + + + + uid + + + , + vehicles_json + + + Replaced vehicle map as JSON. +
+ + garage:patch + + + + uid + + + , + patch_json + + + Updated vehicle map as JSON. +
+ + garage:remove + + + + uid + + + , + remove_json + + + Updated vehicle map as JSON. +
+ + garage:delete + + + + uid + + + + OK + + + . +
+ + garage:exists + + + + uid + + + + true + + + or + false + + + . +
+ +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Garage error: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +## Add a Vehicle + +`garage:add` requires `classname`, `fuel`, `damage`, and `hit_points`. + +```sqf +private _hitPointData = getAllHitPointsDamage _vehicle; +private _hitPoints = createHashMapFromArray [ + ["names", _hitPointData select 0], + ["selections", _hitPointData select 1], + ["values", _hitPointData select 2] +]; + +private _vehicleData = createHashMapFromArray [ + ["classname", typeOf _vehicle], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle], + ["hit_points", _hitPoints] +]; + +private _result = "forge_server" callExtension ["garage:add", [ + getPlayerUID player, + toJSON _vehicleData +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store vehicle: %1", _payload]; +}; + +private _garage = fromJSON _payload; +``` + +The returned value is a hash map keyed by generated plate. To find the newly +stored vehicle, compare returned keys before and after the add, or search by +classname if your workflow guarantees a unique pending vehicle. + +```sqf +private _storedPlate = ""; +{ + private _vehicleRecord = _garage get _x; + if ((_vehicleRecord get "classname") == typeOf _vehicle) then { + _storedPlate = _x; + }; +} forEach keys _garage; +``` + +## Patch a Vehicle + +`garage:patch` updates selected fields for one plate. The `plate` field is +required. `fuel`, `damage`, and `hit_points` are optional. + +```sqf +private _patch = createHashMapFromArray [ + ["plate", _vehicle getVariable ["forge_garage_plate", ""]], + ["fuel", fuel _vehicle], + ["damage", damage _vehicle] +]; + +private _result = "forge_server" callExtension ["garage:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove a Vehicle + +`garage:remove` expects JSON with a `plate` field. + +```sqf +private _remove = createHashMapFromArray [ + ["plate", _plate] +]; + +private _result = "forge_server" callExtension ["garage:remove", [ + getPlayerUID player, + toJSON _remove +]]; +``` + +## Spawn a Stored Vehicle + +```sqf +fnc_spawnGarageVehicle = { + params ["_plate"]; + + private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load garage: %1", _payload]; + objNull + }; + + private _garage = fromJSON _payload; + private _vehicleData = _garage getOrDefault [_plate, createHashMap]; + if (_vehicleData isEqualTo createHashMap) exitWith { + hint "Vehicle plate was not found in your garage."; + objNull + }; + + private _vehicle = (_vehicleData get "classname") createVehicle (player getPos [10, getDir player]); + _vehicle setFuel (_vehicleData getOrDefault ["fuel", 1]); + _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]); + _vehicle setVariable ["forge_garage_plate", _plate, true]; + + private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap]; + private _names = _hitPoints getOrDefault ["names", []]; + private _values = _hitPoints getOrDefault ["values", []]; + + { + _vehicle setHitPointDamage [_x, _values select _forEachIndex]; + } forEach _names; + + private _remove = createHashMapFromArray [["plate", _plate]]; + "forge_server" callExtension ["garage:remove", [getPlayerUID player, toJSON _remove]]; + + _vehicle +}; +``` + +## Hot State + +The `garage:hot:*` commands keep a runtime copy of a player's garage and write +it back only when `garage:hot:save` runs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + garage:hot:init + + + + uid + + + Vehicle map as JSON. +
+ + garage:hot:get + + + + uid + + + Vehicle map as JSON. +
+ + garage:hot:override + + + + uid + + + , + vehicles_json + + + Vehicle map as JSON. +
+ + garage:hot:add + + + + uid + + + , + vehicle_json + + + Vehicle map as JSON. +
+ + garage:hot:remove_vehicle + + + + uid + + + , + remove_json + + + Vehicle map as JSON. +
+ + garage:hot:save + + + + uid + + + Current hot vehicle map as JSON. +
+ + garage:hot:remove + + + + uid + + + + OK + + + . +
+ +Use hot state for session-heavy vehicle workflows. Use the durable commands for +simple store/retrieve operations. + +## Best Practices + +- Store the generated plate on spawned vehicles with `setVariable`. +- Use `garage:patch` for frequent fuel and damage syncs. +- Use `garage:update` only when replacing the whole vehicle map intentionally. +- Do not delete the world vehicle until `garage:add` succeeds. +- Treat vehicle maps as hash maps keyed by plate, not arrays. diff --git a/docus/dist/raw/server-modules/locker.md b/docus/dist/raw/server-modules/locker.md new file mode 100644 index 0000000..3b29e90 --- /dev/null +++ b/docus/dist/raw/server-modules/locker.md @@ -0,0 +1,494 @@ +# Locker Usage Guide + +The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +[Owned Storage Usage Guide](/server-modules/owned-storage). + +## Storage Model + +Locker data is persisted through SurrealDB by the server extension. + +```json +{ + "arifle_MX_F": { + "category": "weapon", + "classname": "arifle_MX_F", + "amount": 1 + } +} +``` + +Rules validated by the Rust service: + +- A locker can contain up to 25 unique classnames. +- `category` and `classname` cannot be empty. +- `amount` must be greater than `0`. +- `locker:add` creates an empty locker automatically when one does not exist. +- `locker:get`, `locker:patch`, and `locker:remove` require an existing locker. +- `locker:remove` takes the classname directly, not a JSON object. + +## Commands + +All commands are called on the `locker` group. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + locker:create + + + + uid + + + Empty item map as JSON. +
+ + locker:get + + + + uid + + + Item map as JSON. +
+ + locker:add + + + + uid + + + , + item_json + + + Updated item map as JSON. +
+ + locker:update + + + + uid + + + , + items_json + + + Replaced item map as JSON. +
+ + locker:patch + + + + uid + + + , + patch_json + + + Updated item map as JSON. +
+ + locker:remove + + + + uid + + + , + classname + + + Updated item map as JSON. +
+ + locker:delete + + + + uid + + + + OK + + + . +
+ + locker:exists + + + + uid + + + + true + + + or + false + + + . +
+ +## Error Handling + +Every command returns a string payload. Always check for the `Error:` prefix +before parsing JSON. + +```sqf +private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Locker error: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Add an Item + +`locker:add` creates or overwrites one classname entry. + +```sqf +private _item = createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] +]; + +private _result = "forge_server" callExtension ["locker:add", [ + getPlayerUID player, + toJSON _item +]]; + +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to store item: %1", _payload]; +}; + +private _locker = fromJSON _payload; +``` + +## Patch an Amount + +`locker:patch` currently patches the `amount` field for an existing classname. + +```sqf +private _patch = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["amount", 5] +]; + +private _result = "forge_server" callExtension ["locker:patch", [ + getPlayerUID player, + toJSON _patch +]]; +``` + +## Remove an Item + +`locker:remove` takes the classname as the second argument. + +```sqf +private _result = "forge_server" callExtension ["locker:remove", [ + getPlayerUID player, + "arifle_MX_F" +]]; +``` + +## Retrieve an Item + +```sqf +fnc_retrieveLockerItem = { + params ["_classname"]; + + private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]]; + private _payload = _result select 0; + + if (_payload find "Error:" == 0) exitWith { + hint format ["Failed to load locker: %1", _payload]; + false + }; + + private _locker = fromJSON _payload; + private _item = _locker getOrDefault [_classname, createHashMap]; + if (_item isEqualTo createHashMap) exitWith { + hint "Item was not found in your locker."; + false + }; + + private _amount = _item getOrDefault ["amount", 0]; + if (_amount <= 0) exitWith { + hint "Item is out of stock."; + false + }; + + if !(player canAdd _classname) exitWith { + hint "Not enough inventory space."; + false + }; + + player addItem _classname; + + if (_amount > 1) then { + private _patch = createHashMapFromArray [ + ["classname", _classname], + ["amount", _amount - 1] + ]; + "forge_server" callExtension ["locker:patch", [getPlayerUID player, toJSON _patch]]; + } else { + "forge_server" callExtension ["locker:remove", [getPlayerUID player, _classname]]; + }; + + true +}; +``` + +## Replace the Whole Locker + +`locker:update` replaces the whole item map. Use it for explicit bulk syncs, +not single-item changes. + +```sqf +private _items = createHashMapFromArray [ + ["arifle_MX_F", createHashMapFromArray [ + ["category", "weapon"], + ["classname", "arifle_MX_F"], + ["amount", 1] + ]] +]; + +private _result = "forge_server" callExtension ["locker:update", [ + getPlayerUID player, + toJSON _items +]]; +``` + +## Hot State + +The `locker:hot:*` commands keep a runtime copy of a player's locker and write +it back only when `locker:hot:save` runs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + locker:hot:init + + + + uid + + + Item map as JSON. +
+ + locker:hot:get + + + + uid + + + Item map as JSON. +
+ + locker:hot:override + + + + uid + + + , + items_json + + + Item map as JSON. +
+ + locker:hot:save + + + + uid + + + Current hot item map as JSON. +
+ + locker:hot:remove + + + + uid + + + + OK + + + . +
+ +Use hot state for session-heavy locker workflows. Use the durable commands for +simple item deposits and withdrawals. + +## Best Practices + +- Keep categories normalized, for example `weapon`, `magazine`, `item`, or +`backpack`. +- Use `locker:patch` for quantity changes. +- Use `locker:remove` when quantity reaches zero. +- Treat the locker response as a hash map keyed by classname. +- Check capacity before bulk operations that may exceed 25 unique items. diff --git a/docus/dist/raw/server-modules/organization.md b/docus/dist/raw/server-modules/organization.md new file mode 100644 index 0000000..2431d12 --- /dev/null +++ b/docus/dist/raw/server-modules/organization.md @@ -0,0 +1,836 @@ +# Organization Usage Guide + +The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows. + +## Storage Model + +Core organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {} +} +``` + +Hot organization: + +```json +{ + "id": "default", + "owner": "server", + "name": "Default Organization", + "funds": 0.0, + "reputation": 0, + "credit_lines": {}, + "assets": {}, + "fleet": {}, + "members": {}, + "pending_invites": {} +} +``` + +Rules validated by the Rust service: + +- `id` must be non-empty and contain only alphanumeric characters or `_`. +- `owner` must be `server` or a 17-digit Steam UID. +- `name` cannot be empty, cannot exceed 100 characters, and cannot contain +control characters. +- `funds`, reputation, and credit line amounts cannot be negative. +- Player registration is rejected when the player already belongs to a +non-default organization. + +## Durable Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + org:create + + + + org_id + + + , + org_json + + + Organization JSON. +
+ + org:get + + + + org_id + + + Organization JSON. +
+ + org:update + + + + org_id + + + , + patch_json + + + Updated organization JSON. +
+ + org:exists + + + + org_id + + + + true + + + or + false + + + . +
+ + org:delete + + + + org_id + + + + OK + + + . +
+ + org:assets:get + + + + org_id + + + Asset map JSON. +
+ + org:assets:update + + + + org_id + + + , + assets_json + + + Updated asset map JSON. +
+ + org:fleet:get + + + + org_id + + + Fleet map JSON. +
+ + org:fleet:update + + + + org_id + + + , + fleet_json + + + Updated fleet map JSON. +
+ + org:members:get + + + + org_id + + + Member array JSON. +
+ + org:members:add + + + + org_id + + + , + member_uid + + + + OK + + + . +
+ + org:members:remove + + + + org_id + + + , + member_uid + + + + OK + + + . +
+ +## Create an Organization + +The command key is authoritative for `id`. + +```sqf +private _org = createHashMapFromArray [ + ["id", _orgId], + ["owner", getPlayerUID player], + ["name", "Spearnet Logistics"], + ["funds", 0], + ["reputation", 0], + ["credit_lines", createHashMap] +]; + +private _result = "forge_server" callExtension ["org:create", [ + _orgId, + toJSON _org +]]; +``` + +## Update Organization Funds + +```sqf +private _patch = createHashMapFromArray [ + ["funds", 5000], + ["reputation", 10] +]; + +private _result = "forge_server" callExtension ["org:update", [ + _orgId, + toJSON _patch +]]; +``` + +Supported durable patch fields are `id`, `owner`, `name`, `funds`, +`reputation`, and `credit_lines`. + +## Assets and Fleet + +Assets are grouped by category, then classname. + +```sqf +private _assets = createHashMapFromArray [ + ["ammo", createHashMapFromArray [ + ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [ + ["classname", "ACE_30Rnd_65x39_caseless_mag"], + ["type", "ammo"], + ["quantity", 20] + ]] + ]] +]; + +"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]]; +``` + +Fleet is keyed by an internal fleet entry ID. + +```sqf +private _fleet = createHashMapFromArray [ + ["B_Truck_01_transport_F_0", createHashMapFromArray [ + ["classname", "B_Truck_01_transport_F"], + ["name", "Transport Truck"], + ["type", "cars"], + ["status", "Ready"], + ["damage", "0%"] + ]] +]; + +"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]]; +``` + +## Hot-State Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + org:hot:init + + + + org_id + + + Hot organization JSON. +
+ + org:hot:get + + + + org_id + + + Hot organization JSON. +
+ + org:hot:override + + + + org_id + + + , + hot_org_json + + + Hot organization JSON. +
+ + org:hot:ensure_member + + + + context_json + + + Hot organization JSON. +
+ + org:hot:member_invites + + + + member_uid + + + Invite array JSON. +
+ + org:hot:register + + + + context_json + + + Register result JSON. +
+ + org:hot:invite_member + + + + context_json + + + Invite result JSON. +
+ + org:hot:accept_invite + + + + context_json + + + Invite decision result JSON. +
+ + org:hot:decline_invite + + + + context_json + + + Invite decision result JSON. +
+ + org:hot:assign_credit_line + + + + context_json + + + Mutation result JSON. +
+ + org:hot:repay_credit_line + + + + context_json + + + Repayment result JSON. +
+ + org:hot:charge_checkout + + + + context_json + + + Mutation result JSON. +
+ + org:hot:add_assets + + + + context_json + + + , + assets_json + + + Mutation result JSON. +
+ + org:hot:add_fleet + + + + context_json + + + , + fleet_json + + + Mutation result JSON. +
+ + org:hot:leave + + + + context_json + + + Leave result JSON. +
+ + org:hot:disband + + + + context_json + + + Disband result JSON. +
+ + org:hot:save + + + + org_id + + + Current hot organization JSON and async durable save. +
+ + org:hot:remove + + + + org_id + + + + OK + + + . +
+ +## Register from UI Context + +```sqf +private _context = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["orgName", "Spearnet Logistics"], + ["existingOrgId", "default"] +]; + +private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]]; +``` + +## Invite and Accept + +```sqf +private _invite = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["targetUid", _targetUid], + ["targetName", _targetName], + ["targetOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]]; + +private _decision = createHashMapFromArray [ + ["requesterUid", _targetUid], + ["requesterName", _targetName], + ["orgId", _orgId], + ["existingOrgId", "default"] +]; + +"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]]; +``` + +## Credit Line Checkout + +```sqf +private _credit = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["memberUid", _memberUid], + ["memberName", _memberName], + ["amount", 1000] +]; + +"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]]; + +private _charge = createHashMapFromArray [ + ["requesterUid", _memberUid], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["source", "credit_line"], + ["amount", 250], + ["commit", true] +]; + +"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Organization error: %1", _payload]; +}; +``` diff --git a/docus/dist/raw/server-modules/owned-storage.md b/docus/dist/raw/server-modules/owned-storage.md new file mode 100644 index 0000000..d494fdf --- /dev/null +++ b/docus/dist/raw/server-modules/owned-storage.md @@ -0,0 +1,806 @@ +# Owned Storage Usage Guide + +Owned storage covers the `owned:locker` and `owned:garage` extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances. + +Use these modules for virtual arsenal and virtual garage unlocks. Use +[Locker Usage Guide](/server-modules/locker) and +[Garage Usage Guide](/server-modules/garage) for physical inventory and stored +vehicle instances. + +## Owned Locker Model + +```json +{ + "items": ["FirstAidKit"], + "weapons": ["arifle_MX_F"], + "magazines": ["30Rnd_65x39_caseless_black_mag"], + "backpacks": ["B_AssaultPack_rgr"] +} +``` + +Supported owned locker categories: + +- `items` +- `weapons` +- `magazines` +- `backpacks` + +New owned lockers are created with default unlocks from the Rust model. + +## Owned Garage Model + +```json +{ + "cars": ["B_Quadbike_01_F"], + "armor": [], + "helis": [], + "planes": [], + "naval": [], + "other": [] +} +``` + +Supported owned garage categories: + +- `cars` +- `armor` +- `helis` +- `planes` +- `naval` +- `other` + +The durable `owned:garage:remove` command currently accepts `heli` for the +helicopter category. Add, get, and hot remove accept `helis`. + +New owned garages are created with default unlocks from the Rust model. + +## Owned Locker Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + owned:locker:create + + + + uid + + + Full owned locker JSON. +
+ + owned:locker:fetch + + + + uid + + + Full owned locker JSON. +
+ + owned:locker:get + + + + uid + + + , + category + + + Category classname array JSON. +
+ + owned:locker:add + + + + uid + + + , + category + + + , + classnames_json + + + Updated category array JSON. +
+ + owned:locker:remove + + + + uid + + + , + category + + + , + classname + + + Updated category array JSON. +
+ + owned:locker:delete + + + + uid + + + + OK + + + . +
+ + owned:locker:exists + + + + uid + + + + true + + + or + false + + + . +
+ +## Owned Garage Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + owned:garage:create + + + + uid + + + Full owned garage JSON. +
+ + owned:garage:fetch + + + + uid + + + Full owned garage JSON. +
+ + owned:garage:get + + + + uid + + + , + category + + + Category classname array JSON. +
+ + owned:garage:add + + + + uid + + + , + category + + + , + classnames_json + + + Updated category array JSON. +
+ + owned:garage:remove + + + + uid + + + , + category + + + , + classname + + + Updated category array JSON. +
+ + owned:garage:delete + + + + uid + + + + OK + + + . +
+ + owned:garage:exists + + + + uid + + + + true + + + or + false + + + . +
+ +## Add Virtual Arsenal Unlocks + +```sqf +private _classes = ["arifle_MX_F", "hgun_P07_F"]; + +private _result = "forge_server" callExtension ["owned:locker:add", [ + getPlayerUID player, + "weapons", + toJSON _classes +]]; +``` + +## Add Virtual Garage Unlocks + +```sqf +private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"]; + +private _result = "forge_server" callExtension ["owned:garage:add", [ + getPlayerUID player, + "cars", + toJSON _classes +]]; +``` + +## Remove an Unlock + +```sqf +"forge_server" callExtension ["owned:locker:remove", [ + getPlayerUID player, + "weapons", + "arifle_MX_F" +]]; + +"forge_server" callExtension ["owned:garage:remove", [ + getPlayerUID player, + "cars", + "B_Quadbike_01_F" +]]; +``` + +## Hot-State Commands + +Both owned storage modules support hot state. + +Owned locker: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + owned:locker:hot:init + + + + uid + + + Full owned locker JSON. +
+ + owned:locker:hot:fetch + + + + uid + + + Full owned locker JSON. +
+ + owned:locker:hot:get + + + + uid + + + , + category + + + Category array JSON. +
+ + owned:locker:hot:override + + + + uid + + + , + locker_json + + + Full owned locker JSON. +
+ + owned:locker:hot:save + + + + uid + + + Current hot owned locker JSON and async durable save. +
+ + owned:locker:hot:remove + + + + uid + + + + OK + + + . +
+ +Owned garage: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + owned:garage:hot:init + + + + uid + + + Full owned garage JSON. +
+ + owned:garage:hot:fetch + + + + uid + + + Full owned garage JSON. +
+ + owned:garage:hot:get + + + + uid + + + , + category + + + Category array JSON. +
+ + owned:garage:hot:override + + + + uid + + + , + garage_json + + + Full owned garage JSON. +
+ + owned:garage:hot:add + + + + uid + + + , + category + + + , + classnames_json + + + Updated category array JSON. +
+ + owned:garage:hot:remove_item + + + + uid + + + , + category + + + , + classname + + + Updated category array JSON. +
+ + owned:garage:hot:save + + + + uid + + + Current hot owned garage JSON and async durable save. +
+ + owned:garage:hot:remove + + + + uid + + + + OK + + + . +
+ +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Owned storage error: %1", _payload]; +}; +``` diff --git a/docus/dist/raw/server-modules/phone.md b/docus/dist/raw/server-modules/phone.md new file mode 100644 index 0000000..5cdd3dc --- /dev/null +++ b/docus/dist/raw/server-modules/phone.md @@ -0,0 +1,499 @@ +# Phone Usage Guide + +The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB. + +## Storage Model + +```json +{ + "contacts": ["76561198000000000", "field_commander"], + "messages": [ + { + "id": "phone-message:sender:receiver:1", + "from": "sender", + "to": "receiver", + "message": "Text body", + "timestamp": 123.45, + "read": false + } + ], + "emails": [ + { + "id": "phone-email:sender:receiver:2", + "from": "sender", + "to": "receiver", + "subject": "Subject", + "body": "Email body", + "timestamp": 123.45, + "read": false + } + ] +} +``` + +Rules validated by the Rust service: + +- UID arguments cannot be empty. +- Message and email bodies cannot be empty. +- Empty email subjects become `No subject`. +- Player messages and emails cannot target `field_commander`. +- `field_commander` can send messages or emails to players. +- Deleting a message or email removes it only from the requesting UID's index. + +## Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + phone:init + + + + uid + + + Full phone payload. +
+ + phone:contacts:list + + + + uid + + + Contact UID array. +
+ + phone:contacts:add + + + + uid + + + , + contact_uid + + + + true + + + or + false + + + . +
+ + phone:contacts:remove + + + + uid + + + , + contact_uid + + + + true + + + or + false + + + . +
+ + phone:messages:list + + + + uid + + + Message array. +
+ + phone:messages:thread + + + + uid + + + , + other_uid + + + Message array for both participants. +
+ + phone:messages:send + + + + from_uid + + + , + to_uid + + + , + message + + + , + timestamp + + + Message JSON. +
+ + phone:messages:mark_read + + + + uid + + + , + message_id + + + + true + + + or + false + + + . +
+ + phone:messages:delete + + + + uid + + + , + message_id + + + + true + + + or + false + + + . +
+ + phone:emails:list + + + + uid + + + Email array. +
+ + phone:emails:send + + + + from_uid + + + , + to_uid + + + , + subject + + + , + body + + + , + timestamp + + + Email JSON. +
+ + phone:emails:mark_read + + + + uid + + + , + email_id + + + + true + + + or + false + + + . +
+ + phone:emails:delete + + + + uid + + + , + email_id + + + + true + + + or + false + + + . +
+ + phone:remove + + + + uid + + + + OK + + + . +
+ +## Initialize Phone State + +`phone:init` creates phone state if needed and seeds self-contact plus +`field_commander`. + +```sqf +private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]]; +private _payload = _result select 0; + +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Phone init failed: %1", _payload]; +}; + +private _phone = fromJSON _payload; +``` + +## Send a Message + +```sqf +private _timestamp = str diag_tickTime; + +private _result = "forge_server" callExtension ["phone:messages:send", [ + getPlayerUID player, + _targetUid, + "Move to checkpoint Alpha.", + _timestamp +]]; +``` + +## Read a Conversation + +```sqf +private _result = "forge_server" callExtension ["phone:messages:thread", [ + getPlayerUID player, + _otherUid +]]; + +private _messages = fromJSON (_result select 0); +``` + +## Send an Email + +```sqf +private _result = "forge_server" callExtension ["phone:emails:send", [ + getPlayerUID player, + _targetUid, + "Supply Request", + "Requesting resupply at grid 123456.", + str diag_tickTime +]]; +``` + +## Mark and Delete Records + +```sqf +"forge_server" callExtension ["phone:messages:mark_read", [ + getPlayerUID player, + _messageId +]]; + +"forge_server" callExtension ["phone:emails:delete", [ + getPlayerUID player, + _emailId +]]; +``` + +## Error Handling + +```sqf +private _payload = (_result select 0); +if (_payload find "Error:" == 0) then { + systemChat format ["Phone error: %1", _payload]; +}; +``` diff --git a/docus/dist/raw/server-modules/store.md b/docus/dist/raw/server-modules/store.md new file mode 100644 index 0000000..fc29a9b --- /dev/null +++ b/docus/dist/raw/server-modules/store.md @@ -0,0 +1,185 @@ +# Store Usage Guide + +The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks. + +## Server SQF Module + +The server addon uses two long-lived module objects: + +- `StorefrontStore` is the storefront workflow facade. It builds hydrate +payloads, validates checkout requests, calls the Rust `store:checkout` +command, syncs UI patches, and asks related module stores to save hot state. +- `StoreCatalogService` scans configured item and vehicle categories, builds +catalog responses, resolves checkout entries, and calculates authoritative +prices. + +Editor-placed store entities are initialized by `fnc_initStore` during store +post-init. The initializer matches non-null mission namespace objects whose +variable names contain `store` and sets `isStore = true`, following the same +pattern used by garage entities. + +## Checkout Model + +`store:checkout` accepts one JSON context. + +```json +{ + "requesterUid": "76561198000000000", + "requesterName": "Player Name", + "orgId": "default", + "requesterIsDefaultOrgCeo": false, + "paymentMethod": "bank", + "items": [ + { + "classname": "arifle_MX_F", + "category": "weapon", + "priceValue": 500, + "quantity": 1 + } + ], + "vehicles": [ + { + "classname": "B_Quadbike_01_F", + "category": "cars", + "priceValue": 1500 + } + ] +} +``` + +Rules validated by the Rust service: + +- `requesterUid` is required. +- At least one item or vehicle is required. +- The checkout total must be greater than zero. +- Item categories must be `item`, `attachment`, `weapon`, `magazine`, or +`backpack`. +- Vehicle categories must be `cars`, `armor`, `helis`, `planes`, `naval`, or +`other`. +- Payment method must be `cash`, `bank`, `org_funds`, or `credit_line`. +- Player locker capacity cannot exceed 25 unique items after checkout. +- Organization funds can only be charged by the org owner or the default org +CEO flag. + +## Command + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + store:checkout + + + + checkout_json + + + Checkout result JSON. +
+ +## Result Model + +```json +{ + "chargedTotal": 2000.0, + "paymentMethod": "bank", + "message": "Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).", + "lockerGranted": [], + "vehicleGranted": [], + "lockerPatch": {}, + "vaPatch": {}, + "vgaragePatch": {}, + "bankPatch": {}, + "orgPatch": {}, + "orgTargetUids": [] +} +``` + +Patch fields are intended for UI updates after checkout. The service commits +all grants and payment changes together, and attempts rollback if a later write +fails. + +## Player Bank Checkout + +```sqf +private _item = createHashMapFromArray [ + ["classname", "arifle_MX_F"], + ["category", "weapon"], + ["priceValue", 500], + ["quantity", 1] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", "default"], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "bank"], + ["items", [_item]], + ["vehicles", []] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Organization Funds Checkout + +When `paymentMethod` is `org_funds`, vehicles are also added to the +organization fleet patch. + +```sqf +private _vehicle = createHashMapFromArray [ + ["classname", "B_Quadbike_01_F"], + ["category", "cars"], + ["priceValue", 1500] +]; + +private _checkout = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["requesterName", name player], + ["orgId", _orgId], + ["requesterIsDefaultOrgCeo", false], + ["paymentMethod", "org_funds"], + ["items", []], + ["vehicles", [_vehicle]] +]; + +private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + hint format ["Checkout failed: %1", _payload]; +}; + +private _checkoutResult = fromJSON _payload; +``` diff --git a/docus/dist/raw/server-modules/task.md b/docus/dist/raw/server-modules/task.md new file mode 100644 index 0000000..268654d --- /dev/null +++ b/docus/dist/raw/server-modules/task.md @@ -0,0 +1,597 @@ +# Task Usage Guide + +The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants. + +The server addon at `arma/server/addons/task` also owns task execution: +creating BIS tasks, registering task entities, tracking participants, binding +task ownership, applying player/org rewards, and clearing task state when a +task completes. + +Runtime dependencies: + +- `forge_server_extension` +- `forge_server_common` +- `forge_server_actor` +- `forge_server_bank` +- `forge_server_org` +- `forge_client_notifications` + +## Data Model + +Catalog entries are flexible JSON objects. The service normalizes these fields +when a catalog entry is inserted or ownership changes: + +- `taskId` +- `taskID` +- `accepted` +- `requesterUid` +- `orgID` + +Ownership context: + +```json +{ + "requesterUid": "76561198000000000", + "orgId": "default" +} +``` + +## Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Command + + Arguments + + Returns +
+ + task:reset + + + none + + + true + + + . +
+ + task:catalog:active + + + none + + Active catalog entry array JSON. +
+ + task:catalog:get + + + + task_id + + + Catalog entry JSON or + null + + + . +
+ + task:catalog:upsert + + + + task_id + + + , + entry_json + + + Stored catalog entry JSON. +
+ + task:catalog:delete + + + + task_id + + + + true + + + . +
+ + task:ownership:bind + + + + task_id + + + , + ownership_json + + + Ownership mutation result JSON. +
+ + task:ownership:release + + + + task_id + + + Ownership mutation result JSON. +
+ + task:ownership:accept + + + + task_id + + + , + ownership_json + + + Ownership mutation result JSON. +
+ + task:ownership:reward_context + + + + task_id + + + Reward context JSON. +
+ + task:status:set + + + + task_id + + + , + status + + + + true + + + . +
+ + task:status:get + + + + task_id + + + Status string JSON. +
+ + task:status:clear + + + + task_id + + + + true + + + . +
+ + task:defuse:increment + + + + task_id + + + New counter value JSON. +
+ + task:defuse:get + + + + task_id + + + Counter value JSON. +
+ + task:clear + + + + task_id + + + + true + + + . +
+ +## Upsert a Catalog Entry + +```sqf +private _entry = createHashMapFromArray [ + ["title", "Destroy Cache"], + ["description", "Destroy the enemy supply cache."], + ["reward", 1500] +]; + +private _result = "forge_server" callExtension ["task:catalog:upsert", [ + "task-cache-1", + toJSON _entry +]]; +``` + +## Mark a Task Active + +```sqf +"forge_server" callExtension ["task:status:set", [ + "task-cache-1", + "active" +]]; + +private _active = "forge_server" callExtension ["task:catalog:active", []]; +``` + +Completed statuses `succeeded` and `failed` are also stored as completed status +fallbacks. Clearing status removes active and completed state. + +## Accept a Task + +```sqf +private _ownership = createHashMapFromArray [ + ["requesterUid", getPlayerUID player], + ["orgId", "default"] +]; + +private _result = "forge_server" callExtension ["task:ownership:accept", [ + "task-cache-1", + toJSON _ownership +]]; +``` + +`task:ownership:accept` fails if the task is not active or another requester +already accepted it. + +## Rewards + +```sqf +private _result = "forge_server" callExtension ["task:ownership:reward_context", [ + "task-cache-1" +]]; + +private _context = fromJSON (_result select 0); +``` + +The reward context contains `requesterUid` and `orgId`. + +## Server Task Flows + +The task addon provides these server-owned task flows: + +- `attack` +- `defend` +- `defuse` +- `delivery` +- `destroy` +- `hostage` +- `hvt` + +Mission designers can create tasks in four ways: + +- Eden modules for editor-authored tasks. +- `forge_server_task_fnc_startTask` for script-authored tasks. +- `forge_server_task_fnc_handler` for pre-registered entities with reputation +gating and ownership binding. This path expects the BIS task and catalog +entry to already exist if map-task and CAD visibility are required. +- Direct task function calls for server-owned or mission-authored flows that +intentionally fall back to the `default` org. This path expects the BIS task +to already exist if map-task visibility is required. + +The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path. + +## CAD Compatibility + +CAD hydrates assignable tasks from `TaskStore.getActiveTaskCatalog`. A task must +have a catalog entry and active task status before CAD can show and assign it. + +CAD-compatible creation paths: + +- Eden modules: compatible because they delegate to +`forge_server_task_fnc_startTask`. +- `forge_server_task_fnc_startTask`: compatible because it registers the +catalog entry, creates the BIS task, and dispatches through the handler. +- Dynamic mission manager attack tasks: compatible because the mission manager +uses `forge_server_task_fnc_startTask`. + +Limited or incompatible paths: + +- `forge_server_task_fnc_handler`: only compatible if a catalog entry was +already registered elsewhere. The handler sets active status and ownership, +but it does not create the BIS task shown in the map task tab or upsert the +catalog entry. +- Direct task function calls: not CAD-compatible by default. They bypass +`startTask` and usually do not register the task catalog entry or active +status that CAD hydrates from. They also only call `BIS_fnc_taskSetState` at +completion/failure; they do not create the BIS task first. + +## BIS Map Task Prerequisite + +Only the Eden task modules and `forge_server_task_fnc_startTask` create the BIS +task automatically through `BIS_fnc_taskCreate`. + +If a mission uses `forge_server_task_fnc_handler` directly or calls a task flow +function such as `forge_server_task_fnc_attack`, the mission must create a BIS +task with the same task ID before the Forge task completes. Otherwise the +success/failure `BIS_fnc_taskSetState` call has no visible map task to update. + +That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted `BIS_fnc_taskCreate` call. `forge_server_task_fnc_startTask` is the +preferred Forge path because it handles BIS task creation, Forge catalog +registration, entity registration, and handler dispatch together. + +## Eden Modules + +Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules. + +Available task modules: + +- `FORGE_Module_Attack`: sync directly to target units or vehicles. +- `FORGE_Module_Destroy`: sync directly to objects, vehicles, or units. +- `FORGE_Module_Defuse`: sync to `FORGE_Module_Explosives` and optionally +`FORGE_Module_Protected`. +- `FORGE_Module_Delivery`: sync to `FORGE_Module_Cargo`; the cargo module syncs +to cargo objects. +- `FORGE_Module_Hostage`: sync to `FORGE_Module_Hostages` and +`FORGE_Module_Shooters`. +- `FORGE_Module_HVT`: sync directly to HVT units. +- `FORGE_Module_Defend`: configure the defense marker and wave settings. + +These modules delegate to `forge_server_task_fnc_startTask`. + +## Scripted Start Task + +Use `forge_server_task_fnc_startTask` when creating tasks from modules, +mission scripts, or generated mission-manager content. It registers task +entities, creates the BIS task, stores the catalog entry, then dispatches +through `forge_server_task_fnc_handler`. + +```sqf +[ + "attack", + "compound_attack_01", + getPosATL leader1, + "Attack: East Compound", + "Eliminate all hostile forces.", + createHashMapFromArray [["targets", [unit1, unit2, unit3]]], + createHashMapFromArray [ + ["limitFail", 0], + ["limitSuccess", 3], + ["funds", 50000], + ["ratingFail", -10], + ["ratingSuccess", 20], + ["timeLimit", 900] + ], + 0, + getPlayerUID player, + "script" +] call forge_server_task_fnc_startTask; +``` + +## Handler Calls + +Use `forge_server_task_fnc_handler` directly when the task entities are already +registered and you want reputation gating plus ownership binding. Create the +BIS task and catalog entry separately if this task should appear in the map +task tab or CAD: + +```sqf +[ + "delivery", + ["delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900], + 250, + getPlayerUID player +] call forge_server_task_fnc_handler; +``` + +## Direct Task Calls + +Direct task function calls still work for mission-authored or server-owned +tasks, but they do not provide a requester UID. Ownership falls back to the +`default` org. Create the BIS task separately if this task should appear in the +map task tab. + +## Timer Semantics + +Task time limits use `0` for no limit: + +- attack `timeLimit` +- destroy `timeLimit` +- delivery `timeLimit` +- hostage `timeLimit` +- HVT `timeLimit` + +Positive values are measured in seconds. Do not pass `-1` as a no-limit value; +the task runtime treats any non-zero task time limit as active. + +Defuse IED timers are different. `iedTimer` must be greater than `0`, because +IEDs are expected to have an active countdown. The Eden defuse module defaults +to `300` seconds. + +## Defuse Counter + +```sqf +"forge_server" callExtension ["task:defuse:increment", ["task-cache-1"]]; +private _count = "forge_server" callExtension ["task:defuse:get", ["task-cache-1"]]; +``` + +## Error Handling + +```sqf +private _payload = _result select 0; +if (_payload find "Error:" == 0) exitWith { + systemChat format ["Task error: %1", _payload]; +}; +``` diff --git a/docus/dist/server-extension.html b/docus/dist/server-extension.html new file mode 100644 index 0000000..5090d1a --- /dev/null +++ b/docus/dist/server-extension.html @@ -0,0 +1,125 @@ +Forge Server Extension - forge-docus
Forge Server Extension

Forge Server Extension

Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB.

Forge Server Extension

Forge Server is an arma-rs extension for Arma 3 server-side persistence and +domain services. It exposes game-facing commands and stores durable state in +SurrealDB.

Architecture

SQF modules call forge_server through fnc_extCall. Small requests use the +direct callExtension path, while large payloads are staged through the +transport layer.

SQF module
+  -> extension bridge
+  -> domain command
+  -> service layer
+  -> repository
+  -> SurrealDB
+

Configuration

Copy config.example.toml to config.toml next to the extension DLL.

[surreal]
+endpoint = "127.0.0.1:8000"
+namespace = "forge"
+database = "main"
+username = "root"
+password = "root"
+connect_timeout_ms = 5000
+

For install links and Forge-specific setup steps, see +SurrealDB Setup.

References

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-extension/_payload.json b/docus/dist/server-extension/_payload.json new file mode 100644 index 0000000..96e5c31 --- /dev/null +++ b/docus/dist/server-extension/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"navigation_docs":3,"-server-extension":145,"-server-extension-surround":300},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":28,"body":147,"description":157,"extension":294,"links":295,"meta":296,"navigation":297,"path":29,"seo":298,"stem":30,"__hash__":299},"docs\u002F2.server-extension\u002F0.index.md",{"type":148,"value":149,"toc":289},"minimark",[150,154,158,163,179,189,193,204,255,262,266,285],[151,152,28],"h1",{"id":153},"forge-server-extension",[155,156,157],"p",{},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",[159,160,162],"h2",{"id":161},"architecture","Architecture",[155,164,165,166,170,171,174,175,178],{},"SQF modules call ",[167,168,169],"code",{},"forge_server"," through ",[167,172,173],{},"fnc_extCall",". Small requests use the\ndirect ",[167,176,177],{},"callExtension"," path, while large payloads are staged through the\ntransport layer.",[180,181,187],"pre",{"className":182,"code":184,"language":185,"meta":186},[183],"language-text","SQF module\n -> extension bridge\n -> domain command\n -> service layer\n -> repository\n -> SurrealDB\n","text","",[167,188,184],{"__ignoreMap":186},[159,190,192],{"id":191},"configuration","Configuration",[155,194,195,196,199,200,203],{},"Copy ",[167,197,198],{},"config.example.toml"," to ",[167,201,202],{},"config.toml"," next to the extension DLL.",[180,205,209],{"className":206,"code":207,"language":208,"meta":186,"style":186},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[167,210,211,219,225,231,237,243,249],{"__ignoreMap":186},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"[surreal]\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"endpoint = \"127.0.0.1:8000\"\n",[212,226,228],{"class":214,"line":227},3,[212,229,230],{},"namespace = \"forge\"\n",[212,232,234],{"class":214,"line":233},4,[212,235,236],{},"database = \"main\"\n",[212,238,240],{"class":214,"line":239},5,[212,241,242],{},"username = \"root\"\n",[212,244,246],{"class":214,"line":245},6,[212,247,248],{},"password = \"root\"\n",[212,250,252],{"class":214,"line":251},7,[212,253,254],{},"connect_timeout_ms = 5000\n",[155,256,257,258,261],{},"For install links and Forge-specific setup steps, see\n",[259,260,23],"a",{"href":24},".",[159,263,265],{"id":264},"references","References",[267,268,269,275,280],"ul",{},[270,271,272],"li",{},[259,273,274],{"href":35},"API Reference",[270,276,277],{},[259,278,279],{"href":39},"Usage Examples",[270,281,282],{},[259,283,284],{"href":6},"Framework Module Guides",[286,287,288],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":186,"searchDepth":221,"depth":221,"links":290},[291,292,293],{"id":161,"depth":221,"text":162},{"id":191,"depth":221,"text":192},{"id":264,"depth":221,"text":265},"md",null,{},true,{"title":28,"description":157},"SU6vHrINTwEWo9oGCzI4XL2aIeAMs6_cQbRNoeKCsys",[301,303],{"title":23,"path":24,"stem":25,"description":302,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",{"title":34,"path":35,"stem":36,"description":304,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",1776806627034] \ No newline at end of file diff --git a/docus/dist/server-extension/api-reference.html b/docus/dist/server-extension/api-reference.html new file mode 100644 index 0000000..b72f125 --- /dev/null +++ b/docus/dist/server-extension/api-reference.html @@ -0,0 +1,112 @@ +Forge Server API Reference - forge-docus
Forge Server Extension

Forge Server API Reference

The Forge server extension exposes domain-oriented commands through +callExtension. Persistent data is stored through the configured SurrealDB +connection and schema modules.

Forge Server API Reference

The Forge server extension exposes domain-oriented commands through +callExtension. Persistent data is stored through the configured SurrealDB +connection and schema modules.

Core Commands

"forge_server" callExtension ["version", []];
+"forge_server" callExtension ["status", []];
+"forge_server" callExtension ["surreal:status", []];
+

status and surreal:status return initializing, connected, or failed.

Domain Commands

Game systems should call the domain APIs instead of raw database operations:

  • actor:*
  • bank:*
  • garage:*
  • locker:*
  • org:*
  • phone:*
  • store:*
  • task:*
  • cad:*
  • owned:garage:*
  • owned:locker:*
  • transport:*

Large request and response payloads are routed through the transport layer when +needed by forge_server_addons_extension_fnc_extCall.

Module Guides

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-extension/api-reference/_payload.json b/docus/dist/server-extension/api-reference/_payload.json new file mode 100644 index 0000000..c0b1b03 --- /dev/null +++ b/docus/dist/server-extension/api-reference/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":374},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-api-reference":145,"-server-extension-api-reference-surround":369},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":34,"body":147,"description":362,"extension":363,"links":364,"meta":365,"navigation":366,"path":35,"seo":367,"stem":36,"__hash__":368},"docs\u002F2.server-extension\u002F1.api-reference.md",{"type":148,"value":149,"toc":357},"minimark",[150,154,163,168,197,219,223,226,290,296,300,353],[151,152,34],"h1",{"id":153},"forge-server-api-reference",[155,156,157,158,162],"p",{},"The Forge server extension exposes domain-oriented commands through\n",[159,160,161],"code",{},"callExtension",". Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",[164,165,167],"h2",{"id":166},"core-commands","Core Commands",[169,170,175],"pre",{"className":171,"code":172,"language":173,"meta":174,"style":174},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"version\", []];\n\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf","",[159,176,177,185,191],{"__ignoreMap":174},[178,179,182],"span",{"class":180,"line":181},"line",1,[178,183,184],{},"\"forge_server\" callExtension [\"version\", []];\n",[178,186,188],{"class":180,"line":187},2,[178,189,190],{},"\"forge_server\" callExtension [\"status\", []];\n",[178,192,194],{"class":180,"line":193},3,[178,195,196],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,198,199,202,203,206,207,210,211,214,215,218],{},[159,200,201],{},"status"," and ",[159,204,205],{},"surreal:status"," return ",[159,208,209],{},"initializing",", ",[159,212,213],{},"connected",", or ",[159,216,217],{},"failed",".",[164,220,222],{"id":221},"domain-commands","Domain Commands",[155,224,225],{},"Game systems should call the domain APIs instead of raw database operations:",[227,228,229,235,240,245,250,255,260,265,270,275,280,285],"ul",{},[230,231,232],"li",{},[159,233,234],{},"actor:*",[230,236,237],{},[159,238,239],{},"bank:*",[230,241,242],{},[159,243,244],{},"garage:*",[230,246,247],{},[159,248,249],{},"locker:*",[230,251,252],{},[159,253,254],{},"org:*",[230,256,257],{},[159,258,259],{},"phone:*",[230,261,262],{},[159,263,264],{},"store:*",[230,266,267],{},[159,268,269],{},"task:*",[230,271,272],{},[159,273,274],{},"cad:*",[230,276,277],{},[159,278,279],{},"owned:garage:*",[230,281,282],{},[159,283,284],{},"owned:locker:*",[230,286,287],{},[159,288,289],{},"transport:*",[155,291,292,293,218],{},"Large request and response payloads are routed through the transport layer when\nneeded by ",[159,294,295],{},"forge_server_addons_extension_fnc_extCall",[164,297,299],{"id":298},"module-guides","Module Guides",[227,301,302,308,313,318,323,328,333,338,343,348],{},[230,303,304],{},[305,306,307],"a",{"href":50},"Actor",[230,309,310],{},[305,311,312],{"href":62},"Bank",[230,314,315],{},[305,316,317],{"href":66},"CAD",[230,319,320],{},[305,321,322],{"href":74},"Garage",[230,324,325],{},[305,326,327],{"href":78},"Locker",[230,329,330],{},[305,331,332],{"href":82},"Organization",[230,334,335],{},[305,336,337],{"href":86},"Owned Storage",[230,339,340],{},[305,341,342],{"href":90},"Phone",[230,344,345],{},[305,346,347],{"href":54},"Store",[230,349,350],{},[305,351,352],{"href":58},"Task",[354,355,356],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":174,"searchDepth":187,"depth":187,"links":358},[359,360,361],{"id":166,"depth":187,"text":167},{"id":221,"depth":187,"text":222},{"id":298,"depth":187,"text":299},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.","md",null,{},true,{"title":34,"description":362},"j66Yivw9bhQFaFdk5v93_NuOAXUf0pyKZ7fE_8PMmcQ",[370,372],{"title":28,"path":29,"stem":30,"description":371,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",{"title":38,"path":39,"stem":40,"description":373,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-extension/usage-examples.html b/docus/dist/server-extension/usage-examples.html new file mode 100644 index 0000000..10fda26 --- /dev/null +++ b/docus/dist/server-extension/usage-examples.html @@ -0,0 +1,131 @@ +Forge Server Usage Examples - forge-docus
Forge Server Extension

Forge Server Usage Examples

These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB.

Forge Server Usage Examples

These examples use the domain command surface exposed by the extension. +Persistence is handled by the server through SurrealDB.

Status Check

["status", []] call forge_server_extension_fnc_extCall params ["_status", "_ok"];
+if (_ok && {_status isEqualTo "connected"}) then {
+    systemChat "Forge persistence is online.";
+};
+

Actor Fetch

private _uid = getPlayerUID player;
+["actor:get", [_uid]] call forge_server_extension_fnc_extCall params ["_payload", "_ok"];
+if (_ok) then {
+    private _actor = fromJSON _payload;
+    systemChat format ["Loaded actor %1", _actor getOrDefault ["uid", _uid]];
+};
+

Store Checkout

private _checkout = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["requesterName", name player],
+    ["orgId", "default"],
+    ["requesterIsDefaultOrgCeo", false],
+    ["paymentMethod", "bank"],
+    ["items", [
+        createHashMapFromArray [
+            ["classname", "FirstAidKit"],
+            ["category", "item"],
+            ["priceValue", 50],
+            ["quantity", 2]
+        ]
+    ]],
+    ["vehicles", []]
+];
+
+["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall;
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-extension/usage-examples/_payload.json b/docus/dist/server-extension/usage-examples/_payload.json new file mode 100644 index 0000000..605a29a --- /dev/null +++ b/docus/dist/server-extension/usage-examples/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":370},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-usage-examples":145,"-server-extension-usage-examples-surround":365},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":38,"body":147,"description":157,"extension":360,"links":361,"meta":362,"navigation":343,"path":39,"seo":363,"stem":40,"__hash__":364},"docs\u002F2.server-extension\u002F2.usage-examples.md",{"type":148,"value":149,"toc":355},"minimark",[150,154,158,163,199,203,239,243,351],[151,152,38],"h1",{"id":153},"forge-server-usage-examples",[155,156,157],"p",{},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",[159,160,162],"h2",{"id":161},"status-check","Status Check",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\nif (_ok && {_status isEqualTo \"connected\"}) then {\n systemChat \"Forge persistence is online.\";\n};\n","sqf","",[171,172,173,181,187,193],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,180],{},"[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\n",[174,182,184],{"class":176,"line":183},2,[174,185,186],{},"if (_ok && {_status isEqualTo \"connected\"}) then {\n",[174,188,190],{"class":176,"line":189},3,[174,191,192],{}," systemChat \"Forge persistence is online.\";\n",[174,194,196],{"class":176,"line":195},4,[174,197,198],{},"};\n",[159,200,202],{"id":201},"actor-fetch","Actor Fetch",[164,204,206],{"className":166,"code":205,"language":168,"meta":169,"style":169},"private _uid = getPlayerUID player;\n[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\nif (_ok) then {\n private _actor = fromJSON _payload;\n systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n};\n",[171,207,208,213,218,223,228,234],{"__ignoreMap":169},[174,209,210],{"class":176,"line":177},[174,211,212],{},"private _uid = getPlayerUID player;\n",[174,214,215],{"class":176,"line":183},[174,216,217],{},"[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\n",[174,219,220],{"class":176,"line":189},[174,221,222],{},"if (_ok) then {\n",[174,224,225],{"class":176,"line":195},[174,226,227],{}," private _actor = fromJSON _payload;\n",[174,229,231],{"class":176,"line":230},5,[174,232,233],{}," systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n",[174,235,237],{"class":176,"line":236},6,[174,238,198],{},[159,240,242],{"id":241},"store-checkout","Store Checkout",[164,244,246],{"className":166,"code":245,"language":168,"meta":169,"style":169},"private _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [\n createHashMapFromArray [\n [\"classname\", \"FirstAidKit\"],\n [\"category\", \"item\"],\n [\"priceValue\", 50],\n [\"quantity\", 2]\n ]\n ]],\n [\"vehicles\", []]\n];\n\n[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[171,247,248,253,258,263,268,273,278,284,290,296,302,308,314,320,326,332,338,345],{"__ignoreMap":169},[174,249,250],{"class":176,"line":177},[174,251,252],{},"private _checkout = createHashMapFromArray [\n",[174,254,255],{"class":176,"line":183},[174,256,257],{}," [\"requesterUid\", getPlayerUID player],\n",[174,259,260],{"class":176,"line":189},[174,261,262],{}," [\"requesterName\", name player],\n",[174,264,265],{"class":176,"line":195},[174,266,267],{}," [\"orgId\", \"default\"],\n",[174,269,270],{"class":176,"line":230},[174,271,272],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[174,274,275],{"class":176,"line":236},[174,276,277],{}," [\"paymentMethod\", \"bank\"],\n",[174,279,281],{"class":176,"line":280},7,[174,282,283],{}," [\"items\", [\n",[174,285,287],{"class":176,"line":286},8,[174,288,289],{}," createHashMapFromArray [\n",[174,291,293],{"class":176,"line":292},9,[174,294,295],{}," [\"classname\", \"FirstAidKit\"],\n",[174,297,299],{"class":176,"line":298},10,[174,300,301],{}," [\"category\", \"item\"],\n",[174,303,305],{"class":176,"line":304},11,[174,306,307],{}," [\"priceValue\", 50],\n",[174,309,311],{"class":176,"line":310},12,[174,312,313],{}," [\"quantity\", 2]\n",[174,315,317],{"class":176,"line":316},13,[174,318,319],{}," ]\n",[174,321,323],{"class":176,"line":322},14,[174,324,325],{}," ]],\n",[174,327,329],{"class":176,"line":328},15,[174,330,331],{}," [\"vehicles\", []]\n",[174,333,335],{"class":176,"line":334},16,[174,336,337],{},"];\n",[174,339,341],{"class":176,"line":340},17,[174,342,344],{"emptyLinePlaceholder":343},true,"\n",[174,346,348],{"class":176,"line":347},18,[174,349,350],{},"[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[352,353,354],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":183,"depth":183,"links":356},[357,358,359],{"id":161,"depth":183,"text":162},{"id":201,"depth":183,"text":202},{"id":241,"depth":183,"text":242},"md",null,{},{"title":38,"description":157},"O2TDcTyKl2_BCCIWxjtCzQoYYhkNwSnA_sZaeMXSjNw",[366,368],{"title":34,"path":35,"stem":36,"description":367,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",{"title":47,"path":43,"stem":44,"description":369,"children":-1},"These pages document the authoritative server-side workflows in Forge.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules.html b/docus/dist/server-modules.html new file mode 100644 index 0000000..f22f735 --- /dev/null +++ b/docus/dist/server-modules.html @@ -0,0 +1,100 @@ +Server Module Guides - forge-docus
Server Modules

Server Module Guides

These pages document the authoritative server-side workflows in Forge.

Server Module Guides

These pages document the authoritative server-side workflows in Forge.

Most modules follow the same shape:

  1. Server SQF gathers game context and validates mission/runtime assumptions.
  2. The forge_server extension routes the request into the matching command group.
  3. Services apply business rules through storage-agnostic repository traits.
  4. The extension persists durable state through SurrealDB adapters when needed.

Gameplay Domains

Actor
Persistent player identity, position, loadout, contact fields, and hot state.
Bank
Player funds, transfers, PIN validation, checkout charging, and bank hot state.
CAD
Dispatch requests, assignments, profiles, grouped state, and hydrated views.
Economy
Fuel, service, and medical charging rules across player and organization funds.
Garage
Vehicle storage, hot-state updates, and persistence of vehicle condition.
Locker
Player inventory storage, unique item limits, and locker hot-state behavior.
Organization
Membership, treasury, shared assets, fleet, and organization hot workflows.
Owned Storage
Owner-scoped locker and vehicle unlock storage used by org-linked features.
Phone
Contacts, message threads, and email state for in-game phone workflows.
Store
Checkout orchestration across pricing, grants, payment sources, and rollback.
Task
Task catalog, ownership, status transitions, defuse counters, and rewards.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/_payload.json b/docus/dist/server-modules/_payload.json new file mode 100644 index 0000000..22def03 --- /dev/null +++ b/docus/dist/server-modules/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":262},["ShallowReactive",2],{"navigation_docs":3,"-server-modules":145,"-server-modules-surround":257},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":47,"body":147,"description":157,"extension":251,"links":252,"meta":253,"navigation":254,"path":43,"seo":255,"stem":44,"__hash__":256},"docs\u002F3.server-modules\u002F0.index.md",{"type":148,"value":149,"toc":246},"minimark",[150,154,158,161,182,187],[151,152,47],"h1",{"id":153},"server-module-guides",[155,156,157],"p",{},"These pages document the authoritative server-side workflows in Forge.",[155,159,160],{},"Most modules follow the same shape:",[162,163,164,168,176,179],"ol",{},[165,166,167],"li",{},"Server SQF gathers game context and validates mission\u002Fruntime assumptions.",[165,169,170,171,175],{},"The ",[172,173,174],"code",{},"forge_server"," extension routes the request into the matching command group.",[165,177,178],{},"Services apply business rules through storage-agnostic repository traits.",[165,180,181],{},"The extension persists durable state through SurrealDB adapters when needed.",[183,184,186],"h2",{"id":185},"gameplay-domains","Gameplay Domains",[188,189,190,196,201,206,211,216,221,226,231,236,241],"u-page-grid",{},[191,192,195],"u-page-card",{"icon":193,"title":194,"to":50},"i-lucide-user-round","Actor","Persistent player identity, position, loadout, contact fields, and hot state.",[191,197,200],{"icon":198,"title":199,"to":62},"i-lucide-wallet","Bank","Player funds, transfers, PIN validation, checkout charging, and bank hot state.",[191,202,205],{"icon":203,"title":204,"to":66},"i-lucide-map","CAD","Dispatch requests, assignments, profiles, grouped state, and hydrated views.",[191,207,210],{"icon":208,"title":209,"to":70},"i-lucide-ambulance","Economy","Fuel, service, and medical charging rules across player and organization funds.",[191,212,215],{"icon":213,"title":214,"to":74},"i-lucide-car-front","Garage","Vehicle storage, hot-state updates, and persistence of vehicle condition.",[191,217,220],{"icon":218,"title":219,"to":78},"i-lucide-package","Locker","Player inventory storage, unique item limits, and locker hot-state behavior.",[191,222,225],{"icon":223,"title":224,"to":82},"i-lucide-building-2","Organization","Membership, treasury, shared assets, fleet, and organization hot workflows.",[191,227,230],{"icon":228,"title":229,"to":86},"i-lucide-key-round","Owned Storage","Owner-scoped locker and vehicle unlock storage used by org-linked features.",[191,232,235],{"icon":233,"title":234,"to":90},"i-lucide-smartphone","Phone","Contacts, message threads, and email state for in-game phone workflows.",[191,237,240],{"icon":238,"title":239,"to":54},"i-lucide-shopping-cart","Store","Checkout orchestration across pricing, grants, payment sources, and rollback.",[191,242,245],{"icon":243,"title":244,"to":58},"i-lucide-flag","Task","Task catalog, ownership, status transitions, defuse counters, and rewards.",{"title":247,"searchDepth":248,"depth":248,"links":249},"",2,[250],{"id":185,"depth":248,"text":186},"md",null,{},true,{"title":47,"description":157},"6TeKjF0JW1R_YnkuNXMM5vx2uv1q0ZlB9jRteQjAnto",[258,260],{"title":38,"path":39,"stem":40,"description":259,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",{"title":49,"path":50,"stem":51,"description":261,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",1776806627034] \ No newline at end of file diff --git a/docus/dist/server-modules/actor.html b/docus/dist/server-modules/actor.html new file mode 100644 index 0000000..5d803ea --- /dev/null +++ b/docus/dist/server-modules/actor.html @@ -0,0 +1,164 @@ +Actor Usage Guide - forge-docus
Server Modules

Actor Usage Guide

The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization.

Actor Usage Guide

The actor module stores persistent player character data: identity, loadout, +position, direction, stance, contact fields, state, holster status, rank, and +organization.

Storage Model

Actor data is persisted through SurrealDB by the server extension.

{
+  "uid": "76561198000000000",
+  "name": "Player Name",
+  "loadout": {},
+  "position": [1234.5, 6789.0, 0.0],
+  "direction": 90.0,
+  "stance": "STAND",
+  "email": "0160000000@spearnet.mil",
+  "phone_number": "0160000000",
+  "state": "HEALTHY",
+  "holster": true,
+  "rank": null,
+  "organization": "default"
+}
+

Rules validated by the Rust service:

  • uid is authoritative from the command argument and must be a 17-digit Steam +UID.
  • name is optional, but cannot be empty when set and cannot exceed 50 +characters.
  • position must be three finite numbers when set.
  • direction must be in the 0.0 <= direction < 360.0 range.
  • email must contain @ and end with .mil when set.
  • phone_number must start with 0160 and be 10 digits when set.
  • Empty phone_number, email, or organization fields are filled on create.

Commands

All commands are called on the actor group.

CommandArgumentsReturns
actor:getuidActor JSON. If no actor exists, returns a default actor but does not persist it.
actor:createuid, actor_jsonPersisted actor JSON.
actor:updateuid, patch_jsonUpdated actor JSON.
actor:existsuidtrue or false.
actor:deleteuidOK.

Create an Actor

The uid field in the JSON is overwritten with the command UID.

private _actor = createHashMapFromArray [
+    ["uid", getPlayerUID player],
+    ["name", name player],
+    ["loadout", getUnitLoadout player],
+    ["position", getPosATL player],
+    ["direction", getDir player],
+    ["stance", stance player],
+    ["email", ""],
+    ["phone_number", ""],
+    ["state", "HEALTHY"],
+    ["holster", true],
+    ["organization", "default"]
+];
+
+private _result = "forge_server" callExtension ["actor:create", [
+    getPlayerUID player,
+    toJSON _actor
+]];
+

Update an Actor

actor:update accepts a JSON object containing only fields to change.

private _patch = createHashMapFromArray [
+    ["position", getPosATL player],
+    ["direction", getDir player],
+    ["stance", stance player],
+    ["loadout", getUnitLoadout player]
+];
+
+private _result = "forge_server" callExtension ["actor:update", [
+    getPlayerUID player,
+    toJSON _patch
+]];
+

Supported patch fields are name, position, direction, stance, email, +phone_number, state, holster, rank, organization, and loadout. +uid is ignored.

Hot State

The actor:hot:* commands keep a runtime copy of actor data and write it back +only when actor:hot:save runs.

CommandArgumentsReturns
actor:hot:inituidActor JSON from durable storage.
actor:hot:getuidActor JSON.
actor:hot:keysnoneJSON array of hot actor UIDs.
actor:hot:overrideuid, actor_jsonActor JSON.
actor:hot:saveuidCurrent hot actor JSON and async durable save.
actor:hot:removeuidOK.

Use hot state for frequently updated session data such as position and loadout. +Use durable commands for account creation and administrative changes.

Error Handling

private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Actor error: %1", _payload];
+};
+
+private _actor = fromJSON _payload;
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/actor/_payload.json b/docus/dist/server-modules/actor/_payload.json new file mode 100644 index 0000000..c598302 --- /dev/null +++ b/docus/dist/server-modules/actor/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1011},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-actor":145,"-server-modules-actor-surround":1006},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":49,"body":147,"description":157,"extension":1001,"links":1002,"meta":1003,"navigation":709,"path":50,"seo":1004,"stem":51,"__hash__":1005},"docs\u002F3.server-modules\u002F1.actor.md",{"type":148,"value":149,"toc":993},"minimark",[150,154,158,163,166,439,442,504,508,515,623,627,633,735,739,744,797,827,831,841,939,942,946,989],[151,152,49],"h1",{"id":153},"actor-usage-guide",[155,156,157],"p",{},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Actor data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"loadout\": {},\n \"position\": [1234.5, 6789.0, 0.0],\n \"direction\": 90.0,\n \"stance\": \"STAND\",\n \"email\": \"0160000000@spearnet.mil\",\n \"phone_number\": \"0160000000\",\n \"state\": \"HEALTHY\",\n \"holster\": true,\n \"rank\": null,\n \"organization\": \"default\"\n}\n","json","",[174,175,176,185,213,234,249,282,299,320,341,362,383,398,413,433],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"loadout",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,248],{"class":183}," {},\n",[177,250,252,254,257,259,261,264,268,271,274,276,279],{"class":179,"line":251},5,[177,253,190],{"class":183},[177,255,256],{"class":193},"position",[177,258,197],{"class":183},[177,260,200],{"class":183},[177,262,263],{"class":183}," [",[177,265,267],{"class":266},"sbssI","1234.5",[177,269,270],{"class":183},",",[177,272,273],{"class":266}," 6789.0",[177,275,270],{"class":183},[177,277,278],{"class":266}," 0.0",[177,280,281],{"class":183},"],\n",[177,283,285,287,290,292,294,297],{"class":179,"line":284},6,[177,286,190],{"class":183},[177,288,289],{"class":193},"direction",[177,291,197],{"class":183},[177,293,200],{"class":183},[177,295,296],{"class":266}," 90.0",[177,298,212],{"class":183},[177,300,302,304,307,309,311,313,316,318],{"class":179,"line":301},7,[177,303,190],{"class":183},[177,305,306],{"class":193},"stance",[177,308,197],{"class":183},[177,310,200],{"class":183},[177,312,203],{"class":183},[177,314,315],{"class":206},"STAND",[177,317,197],{"class":183},[177,319,212],{"class":183},[177,321,323,325,328,330,332,334,337,339],{"class":179,"line":322},8,[177,324,190],{"class":183},[177,326,327],{"class":193},"email",[177,329,197],{"class":183},[177,331,200],{"class":183},[177,333,203],{"class":183},[177,335,336],{"class":206},"0160000000@spearnet.mil",[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,344,346,349,351,353,355,358,360],{"class":179,"line":343},9,[177,345,190],{"class":183},[177,347,348],{"class":193},"phone_number",[177,350,197],{"class":183},[177,352,200],{"class":183},[177,354,203],{"class":183},[177,356,357],{"class":206},"0160000000",[177,359,197],{"class":183},[177,361,212],{"class":183},[177,363,365,367,370,372,374,376,379,381],{"class":179,"line":364},10,[177,366,190],{"class":183},[177,368,369],{"class":193},"state",[177,371,197],{"class":183},[177,373,200],{"class":183},[177,375,203],{"class":183},[177,377,378],{"class":206},"HEALTHY",[177,380,197],{"class":183},[177,382,212],{"class":183},[177,384,386,388,391,393,395],{"class":179,"line":385},11,[177,387,190],{"class":183},[177,389,390],{"class":193},"holster",[177,392,197],{"class":183},[177,394,200],{"class":183},[177,396,397],{"class":183}," true,\n",[177,399,401,403,406,408,410],{"class":179,"line":400},12,[177,402,190],{"class":183},[177,404,405],{"class":193},"rank",[177,407,197],{"class":183},[177,409,200],{"class":183},[177,411,412],{"class":183}," null,\n",[177,414,416,418,421,423,425,427,430],{"class":179,"line":415},13,[177,417,190],{"class":183},[177,419,420],{"class":193},"organization",[177,422,197],{"class":183},[177,424,200],{"class":183},[177,426,203],{"class":183},[177,428,429],{"class":206},"default",[177,431,432],{"class":183},"\"\n",[177,434,436],{"class":179,"line":435},14,[177,437,438],{"class":183},"}\n",[155,440,441],{},"Rules validated by the Rust service:",[443,444,445,451,456,461,470,483,492],"ul",{},[446,447,448,450],"li",{},[174,449,194],{}," is authoritative from the command argument and must be a 17-digit Steam\nUID.",[446,452,453,455],{},[174,454,220],{}," is optional, but cannot be empty when set and cannot exceed 50\ncharacters.",[446,457,458,460],{},[174,459,256],{}," must be three finite numbers when set.",[446,462,463,465,466,469],{},[174,464,289],{}," must be in the ",[174,467,468],{},"0.0 \u003C= direction \u003C 360.0"," range.",[446,471,472,474,475,478,479,482],{},[174,473,327],{}," must contain ",[174,476,477],{},"@"," and end with ",[174,480,481],{},".mil"," when set.",[446,484,485,487,488,491],{},[174,486,348],{}," must start with ",[174,489,490],{},"0160"," and be 10 digits when set.",[446,493,494,495,497,498,500,501,503],{},"Empty ",[174,496,348],{},", ",[174,499,327],{},", or ",[174,502,420],{}," fields are filled on create.",[159,505,507],{"id":506},"commands","Commands",[155,509,510,511,514],{},"All commands are called on the ",[174,512,513],{},"actor"," group.",[516,517,518,534],"table",{},[519,520,521],"thead",{},[522,523,524,528,531],"tr",{},[525,526,527],"th",{},"Command",[525,529,530],{},"Arguments",[525,532,533],{},"Returns",[535,536,537,552,569,586,607],"tbody",{},[522,538,539,545,549],{},[540,541,542],"td",{},[174,543,544],{},"actor:get",[540,546,547],{},[174,548,194],{},[540,550,551],{},"Actor JSON. If no actor exists, returns a default actor but does not persist it.",[522,553,554,559,566],{},[540,555,556],{},[174,557,558],{},"actor:create",[540,560,561,497,563],{},[174,562,194],{},[174,564,565],{},"actor_json",[540,567,568],{},"Persisted actor JSON.",[522,570,571,576,583],{},[540,572,573],{},[174,574,575],{},"actor:update",[540,577,578,497,580],{},[174,579,194],{},[174,581,582],{},"patch_json",[540,584,585],{},"Updated actor JSON.",[522,587,588,593,597],{},[540,589,590],{},[174,591,592],{},"actor:exists",[540,594,595],{},[174,596,194],{},[540,598,599,602,603,606],{},[174,600,601],{},"true"," or ",[174,604,605],{},"false",".",[522,608,609,614,618],{},[540,610,611],{},[174,612,613],{},"actor:delete",[540,615,616],{},[174,617,194],{},[540,619,620,606],{},[174,621,622],{},"OK",[159,624,626],{"id":625},"create-an-actor","Create an Actor",[155,628,629,630,632],{},"The ",[174,631,194],{}," field in the JSON is overwritten with the command UID.",[167,634,638],{"className":635,"code":636,"language":637,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _actor = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"loadout\", getUnitLoadout player],\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"email\", \"\"],\n [\"phone_number\", \"\"],\n [\"state\", \"HEALTHY\"],\n [\"holster\", true],\n [\"organization\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:create\", [\n getPlayerUID player,\n toJSON _actor\n]];\n","sqf",[174,639,640,645,650,655,660,665,670,675,680,685,690,695,700,705,711,717,723,729],{"__ignoreMap":172},[177,641,642],{"class":179,"line":180},[177,643,644],{},"private _actor = createHashMapFromArray [\n",[177,646,647],{"class":179,"line":187},[177,648,649],{}," [\"uid\", getPlayerUID player],\n",[177,651,652],{"class":179,"line":215},[177,653,654],{}," [\"name\", name player],\n",[177,656,657],{"class":179,"line":236},[177,658,659],{}," [\"loadout\", getUnitLoadout player],\n",[177,661,662],{"class":179,"line":251},[177,663,664],{}," [\"position\", getPosATL player],\n",[177,666,667],{"class":179,"line":284},[177,668,669],{}," [\"direction\", getDir player],\n",[177,671,672],{"class":179,"line":301},[177,673,674],{}," [\"stance\", stance player],\n",[177,676,677],{"class":179,"line":322},[177,678,679],{}," [\"email\", \"\"],\n",[177,681,682],{"class":179,"line":343},[177,683,684],{}," [\"phone_number\", \"\"],\n",[177,686,687],{"class":179,"line":364},[177,688,689],{}," [\"state\", \"HEALTHY\"],\n",[177,691,692],{"class":179,"line":385},[177,693,694],{}," [\"holster\", true],\n",[177,696,697],{"class":179,"line":400},[177,698,699],{}," [\"organization\", \"default\"]\n",[177,701,702],{"class":179,"line":415},[177,703,704],{},"];\n",[177,706,707],{"class":179,"line":435},[177,708,710],{"emptyLinePlaceholder":709},true,"\n",[177,712,714],{"class":179,"line":713},15,[177,715,716],{},"private _result = \"forge_server\" callExtension [\"actor:create\", [\n",[177,718,720],{"class":179,"line":719},16,[177,721,722],{}," getPlayerUID player,\n",[177,724,726],{"class":179,"line":725},17,[177,727,728],{}," toJSON _actor\n",[177,730,732],{"class":179,"line":731},18,[177,733,734],{},"]];\n",[159,736,738],{"id":737},"update-an-actor","Update an Actor",[155,740,741,743],{},[174,742,575],{}," accepts a JSON object containing only fields to change.",[167,745,747],{"className":635,"code":746,"language":637,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"loadout\", getUnitLoadout player]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:update\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,748,749,754,758,762,766,771,775,779,784,788,793],{"__ignoreMap":172},[177,750,751],{"class":179,"line":180},[177,752,753],{},"private _patch = createHashMapFromArray [\n",[177,755,756],{"class":179,"line":187},[177,757,664],{},[177,759,760],{"class":179,"line":215},[177,761,669],{},[177,763,764],{"class":179,"line":236},[177,765,674],{},[177,767,768],{"class":179,"line":251},[177,769,770],{}," [\"loadout\", getUnitLoadout player]\n",[177,772,773],{"class":179,"line":284},[177,774,704],{},[177,776,777],{"class":179,"line":301},[177,778,710],{"emptyLinePlaceholder":709},[177,780,781],{"class":179,"line":322},[177,782,783],{},"private _result = \"forge_server\" callExtension [\"actor:update\", [\n",[177,785,786],{"class":179,"line":343},[177,787,722],{},[177,789,790],{"class":179,"line":364},[177,791,792],{}," toJSON _patch\n",[177,794,795],{"class":179,"line":385},[177,796,734],{},[155,798,799,800,497,802,497,804,497,806,497,808,212,810,497,812,497,814,497,816,497,818,820,821,823,824,826],{},"Supported patch fields are ",[174,801,220],{},[174,803,256],{},[174,805,289],{},[174,807,306],{},[174,809,327],{},[174,811,348],{},[174,813,369],{},[174,815,390],{},[174,817,405],{},[174,819,420],{},", and ",[174,822,241],{},".\n",[174,825,194],{}," is ignored.",[159,828,830],{"id":829},"hot-state","Hot State",[155,832,629,833,836,837,840],{},[174,834,835],{},"actor:hot:*"," commands keep a runtime copy of actor data and write it back\nonly when ",[174,838,839],{},"actor:hot:save"," runs.",[516,842,843,853],{},[519,844,845],{},[522,846,847,849,851],{},[525,848,527],{},[525,850,530],{},[525,852,533],{},[535,854,855,869,883,896,911,924],{},[522,856,857,862,866],{},[540,858,859],{},[174,860,861],{},"actor:hot:init",[540,863,864],{},[174,865,194],{},[540,867,868],{},"Actor JSON from durable storage.",[522,870,871,876,880],{},[540,872,873],{},[174,874,875],{},"actor:hot:get",[540,877,878],{},[174,879,194],{},[540,881,882],{},"Actor JSON.",[522,884,885,890,893],{},[540,886,887],{},[174,888,889],{},"actor:hot:keys",[540,891,892],{},"none",[540,894,895],{},"JSON array of hot actor UIDs.",[522,897,898,903,909],{},[540,899,900],{},[174,901,902],{},"actor:hot:override",[540,904,905,497,907],{},[174,906,194],{},[174,908,565],{},[540,910,882],{},[522,912,913,917,921],{},[540,914,915],{},[174,916,839],{},[540,918,919],{},[174,920,194],{},[540,922,923],{},"Current hot actor JSON and async durable save.",[522,925,926,931,935],{},[540,927,928],{},[174,929,930],{},"actor:hot:remove",[540,932,933],{},[174,934,194],{},[540,936,937,606],{},[174,938,622],{},[155,940,941],{},"Use hot state for frequently updated session data such as position and loadout.\nUse durable commands for account creation and administrative changes.",[159,943,945],{"id":944},"error-handling","Error Handling",[167,947,949],{"className":635,"code":948,"language":637,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor error: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n",[174,950,951,956,961,965,970,975,980,984],{"__ignoreMap":172},[177,952,953],{"class":179,"line":180},[177,954,955],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[177,957,958],{"class":179,"line":187},[177,959,960],{},"private _payload = _result select 0;\n",[177,962,963],{"class":179,"line":215},[177,964,710],{"emptyLinePlaceholder":709},[177,966,967],{"class":179,"line":236},[177,968,969],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,971,972],{"class":179,"line":251},[177,973,974],{}," systemChat format [\"Actor error: %1\", _payload];\n",[177,976,977],{"class":179,"line":284},[177,978,979],{},"};\n",[177,981,982],{"class":179,"line":301},[177,983,710],{"emptyLinePlaceholder":709},[177,985,986],{"class":179,"line":322},[177,987,988],{},"private _actor = fromJSON _payload;\n",[990,991,992],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":994},[995,996,997,998,999,1000],{"id":161,"depth":187,"text":162},{"id":506,"depth":187,"text":507},{"id":625,"depth":187,"text":626},{"id":737,"depth":187,"text":738},{"id":829,"depth":187,"text":830},{"id":944,"depth":187,"text":945},"md",null,{},{"title":49,"description":157},"lOr0hGaOrJo611Lgdf6VCoSehV0NudH7u2_V75BKoZ0",[1007,1009],{"title":47,"path":43,"stem":44,"description":1008,"children":-1},"These pages document the authoritative server-side workflows in Forge.",{"title":53,"path":54,"stem":55,"description":1010,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/bank.html b/docus/dist/server-modules/bank.html new file mode 100644 index 0000000..cd96e91 --- /dev/null +++ b/docus/dist/server-modules/bank.html @@ -0,0 +1,190 @@ +Bank Usage Guide - forge-docus
Server Modules

Bank Usage Guide

The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, and PIN validation.

Bank Usage Guide

The bank module stores player account balances, earnings, PINs, and transaction +strings. The hot-state API also owns the active banking workflows used by the +UI: deposit, withdraw, transfer, checkout charge, and PIN validation.

Storage Model

Bank data is persisted through SurrealDB by the server extension.

{
+  "uid": "76561198000000000",
+  "name": "Player Name",
+  "bank": 1000.0,
+  "cash": 250.0,
+  "earnings": 0.0,
+  "pin": 1234,
+  "transactions": []
+}
+

Rules validated by the Rust service:

  • uid is authoritative from the command argument.
  • name cannot be empty.
  • bank and cash cannot be negative.
  • pin must be a four-digit number.
  • Durable bank:get requires an existing bank account.

Durable Commands

CommandArgumentsReturns
bank:createuid, bank_jsonPersisted bank JSON.
bank:getuidBank JSON.
bank:updateuid, patch_jsonUpdated bank JSON.
bank:existsuidtrue or false.
bank:deleteuidOK.

Create an Account

The uid field in the JSON is overwritten with the command UID.

private _account = createHashMapFromArray [
+    ["uid", getPlayerUID player],
+    ["name", name player],
+    ["bank", 0],
+    ["cash", 0],
+    ["earnings", 0],
+    ["pin", 1234],
+    ["transactions", []]
+];
+
+private _result = "forge_server" callExtension ["bank:create", [
+    getPlayerUID player,
+    toJSON _account
+]];
+

Hot-State Commands

CommandArgumentsReturns
bank:hot:inituidBank JSON loaded into hot state.
bank:hot:getuidBank JSON.
bank:hot:overrideuid, bank_jsonBank JSON.
bank:hot:patchuid, patch_json{ account, patch }.
bank:hot:deposituid, amount, context_json{ account, patch }.
bank:hot:withdrawuid, amount, context_json{ account, patch }.
bank:hot:deposit_earningsuid, amount, context_json{ account, patch }.
bank:hot:transfersource_uid, target_uid, amount, context_jsonTransfer result JSON.
bank:hot:charge_checkoutuid, amount, context_json{ account, patch }.
bank:hot:validate_pinuid, pin, context_json{} on success.
bank:hot:saveuidCurrent hot bank JSON and async durable save.
bank:hot:removeuidOK.

Use hot-state commands for UI workflows. They return patch objects so the UI can +update only changed fields.

Deposit and Withdraw

ATM sessions require atmAuthorized: true. Full bank sessions can set +mode: "bank".

private _context = createHashMapFromArray [
+    ["mode", "atm"],
+    ["atmAuthorized", true]
+];
+
+private _deposit = "forge_server" callExtension ["bank:hot:deposit", [
+    getPlayerUID player,
+    "100",
+    toJSON _context
+]];
+
+private _withdraw = "forge_server" callExtension ["bank:hot:withdraw", [
+    getPlayerUID player,
+    "50",
+    toJSON _context
+]];
+

Transfer

Transfers are only available from the full bank interface. fromField can be +bank or cash.

private _context = createHashMapFromArray [
+    ["mode", "bank"],
+    ["atmAuthorized", false],
+    ["fromField", "bank"]
+];
+
+private _result = "forge_server" callExtension ["bank:hot:transfer", [
+    getPlayerUID player,
+    _targetUid,
+    "250",
+    toJSON _context
+]];
+

Checkout Charge

Checkout charging supports sourceField: "cash" or sourceField: "bank". +Set commit to false to preview the patch without saving.

private _context = createHashMapFromArray [
+    ["sourceField", "bank"],
+    ["commit", true]
+];
+
+private _result = "forge_server" callExtension ["bank:hot:charge_checkout", [
+    getPlayerUID player,
+    "125",
+    toJSON _context
+]];
+

PIN Validation

PIN entry is only valid in ATM mode.

private _context = createHashMapFromArray [["mode", "atm"]];
+
+private _result = "forge_server" callExtension ["bank:hot:validate_pin", [
+    getPlayerUID player,
+    "1234",
+    toJSON _context
+]];
+

Error Handling

private _result = "forge_server" callExtension ["bank:hot:get", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Bank error: %1", _payload];
+};
+
+private _bank = fromJSON _payload;
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/bank/_payload.json b/docus/dist/server-modules/bank/_payload.json new file mode 100644 index 0000000..2c301c0 --- /dev/null +++ b/docus/dist/server-modules/bank/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1149},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-bank":145,"-server-modules-bank-surround":1144},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":61,"body":147,"description":157,"extension":1139,"links":1140,"meta":1141,"navigation":540,"path":62,"seo":1142,"stem":63,"__hash__":1143},"docs\u002F3.server-modules\u002F2.bank.md",{"type":148,"value":149,"toc":1128},"minimark",[150,154,158,163,166,324,327,361,365,473,477,483,566,570,794,797,801,811,890,894,905,964,968,985,1034,1038,1041,1077,1081,1124],[151,152,61],"h1",{"id":153},"bank-usage-guide",[155,156,157],"p",{},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Bank data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"bank\": 1000.0,\n \"cash\": 250.0,\n \"earnings\": 0.0,\n \"pin\": 1234,\n \"transactions\": []\n}\n","json","",[174,175,176,185,213,234,252,269,286,303,318],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,250],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"bank",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,249],{"class":248},"sbssI"," 1000.0",[177,251,212],{"class":183},[177,253,255,257,260,262,264,267],{"class":179,"line":254},5,[177,256,190],{"class":183},[177,258,259],{"class":193},"cash",[177,261,197],{"class":183},[177,263,200],{"class":183},[177,265,266],{"class":248}," 250.0",[177,268,212],{"class":183},[177,270,272,274,277,279,281,284],{"class":179,"line":271},6,[177,273,190],{"class":183},[177,275,276],{"class":193},"earnings",[177,278,197],{"class":183},[177,280,200],{"class":183},[177,282,283],{"class":248}," 0.0",[177,285,212],{"class":183},[177,287,289,291,294,296,298,301],{"class":179,"line":288},7,[177,290,190],{"class":183},[177,292,293],{"class":193},"pin",[177,295,197],{"class":183},[177,297,200],{"class":183},[177,299,300],{"class":248}," 1234",[177,302,212],{"class":183},[177,304,306,308,311,313,315],{"class":179,"line":305},8,[177,307,190],{"class":183},[177,309,310],{"class":193},"transactions",[177,312,197],{"class":183},[177,314,200],{"class":183},[177,316,317],{"class":183}," []\n",[177,319,321],{"class":179,"line":320},9,[177,322,323],{"class":183},"}\n",[155,325,326],{},"Rules validated by the Rust service:",[328,329,330,336,341,349,354],"ul",{},[331,332,333,335],"li",{},[174,334,194],{}," is authoritative from the command argument.",[331,337,338,340],{},[174,339,220],{}," cannot be empty.",[331,342,343,345,346,348],{},[174,344,241],{}," and ",[174,347,259],{}," cannot be negative.",[331,350,351,353],{},[174,352,293],{}," must be a four-digit number.",[331,355,356,357,360],{},"Durable ",[174,358,359],{},"bank:get"," requires an existing bank account.",[159,362,364],{"id":363},"durable-commands","Durable Commands",[366,367,368,384],"table",{},[369,370,371],"thead",{},[372,373,374,378,381],"tr",{},[375,376,377],"th",{},"Command",[375,379,380],{},"Arguments",[375,382,383],{},"Returns",[385,386,387,406,419,436,457],"tbody",{},[372,388,389,395,403],{},[390,391,392],"td",{},[174,393,394],{},"bank:create",[390,396,397,399,400],{},[174,398,194],{},", ",[174,401,402],{},"bank_json",[390,404,405],{},"Persisted bank JSON.",[372,407,408,412,416],{},[390,409,410],{},[174,411,359],{},[390,413,414],{},[174,415,194],{},[390,417,418],{},"Bank JSON.",[372,420,421,426,433],{},[390,422,423],{},[174,424,425],{},"bank:update",[390,427,428,399,430],{},[174,429,194],{},[174,431,432],{},"patch_json",[390,434,435],{},"Updated bank JSON.",[372,437,438,443,447],{},[390,439,440],{},[174,441,442],{},"bank:exists",[390,444,445],{},[174,446,194],{},[390,448,449,452,453,456],{},[174,450,451],{},"true"," or ",[174,454,455],{},"false",".",[372,458,459,464,468],{},[390,460,461],{},[174,462,463],{},"bank:delete",[390,465,466],{},[174,467,194],{},[390,469,470,456],{},[174,471,472],{},"OK",[159,474,476],{"id":475},"create-an-account","Create an Account",[155,478,479,480,482],{},"The ",[174,481,194],{}," field in the JSON is overwritten with the command UID.",[167,484,488],{"className":485,"code":486,"language":487,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _account = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"bank\", 0],\n [\"cash\", 0],\n [\"earnings\", 0],\n [\"pin\", 1234],\n [\"transactions\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:create\", [\n getPlayerUID player,\n toJSON _account\n]];\n","sqf",[174,489,490,495,500,505,510,515,520,525,530,535,542,548,554,560],{"__ignoreMap":172},[177,491,492],{"class":179,"line":180},[177,493,494],{},"private _account = createHashMapFromArray [\n",[177,496,497],{"class":179,"line":187},[177,498,499],{}," [\"uid\", getPlayerUID player],\n",[177,501,502],{"class":179,"line":215},[177,503,504],{}," [\"name\", name player],\n",[177,506,507],{"class":179,"line":236},[177,508,509],{}," [\"bank\", 0],\n",[177,511,512],{"class":179,"line":254},[177,513,514],{}," [\"cash\", 0],\n",[177,516,517],{"class":179,"line":271},[177,518,519],{}," [\"earnings\", 0],\n",[177,521,522],{"class":179,"line":288},[177,523,524],{}," [\"pin\", 1234],\n",[177,526,527],{"class":179,"line":305},[177,528,529],{}," [\"transactions\", []]\n",[177,531,532],{"class":179,"line":320},[177,533,534],{},"];\n",[177,536,538],{"class":179,"line":537},10,[177,539,541],{"emptyLinePlaceholder":540},true,"\n",[177,543,545],{"class":179,"line":544},11,[177,546,547],{},"private _result = \"forge_server\" callExtension [\"bank:create\", [\n",[177,549,551],{"class":179,"line":550},12,[177,552,553],{}," getPlayerUID player,\n",[177,555,557],{"class":179,"line":556},13,[177,558,559],{}," toJSON _account\n",[177,561,563],{"class":179,"line":562},14,[177,564,565],{},"]];\n",[159,567,569],{"id":568},"hot-state-commands","Hot-State Commands",[366,571,572,582],{},[369,573,574],{},[372,575,576,578,580],{},[375,577,377],{},[375,579,380],{},[375,581,383],{},[385,583,584,598,611,626,644,665,684,703,725,744,765,779],{},[372,585,586,591,595],{},[390,587,588],{},[174,589,590],{},"bank:hot:init",[390,592,593],{},[174,594,194],{},[390,596,597],{},"Bank JSON loaded into hot state.",[372,599,600,605,609],{},[390,601,602],{},[174,603,604],{},"bank:hot:get",[390,606,607],{},[174,608,194],{},[390,610,418],{},[372,612,613,618,624],{},[390,614,615],{},[174,616,617],{},"bank:hot:override",[390,619,620,399,622],{},[174,621,194],{},[174,623,402],{},[390,625,418],{},[372,627,628,633,639],{},[390,629,630],{},[174,631,632],{},"bank:hot:patch",[390,634,635,399,637],{},[174,636,194],{},[174,638,432],{},[390,640,641,456],{},[174,642,643],{},"{ account, patch }",[372,645,646,651,661],{},[390,647,648],{},[174,649,650],{},"bank:hot:deposit",[390,652,653,399,655,399,658],{},[174,654,194],{},[174,656,657],{},"amount",[174,659,660],{},"context_json",[390,662,663,456],{},[174,664,643],{},[372,666,667,672,680],{},[390,668,669],{},[174,670,671],{},"bank:hot:withdraw",[390,673,674,399,676,399,678],{},[174,675,194],{},[174,677,657],{},[174,679,660],{},[390,681,682,456],{},[174,683,643],{},[372,685,686,691,699],{},[390,687,688],{},[174,689,690],{},"bank:hot:deposit_earnings",[390,692,693,399,695,399,697],{},[174,694,194],{},[174,696,657],{},[174,698,660],{},[390,700,701,456],{},[174,702,643],{},[372,704,705,710,722],{},[390,706,707],{},[174,708,709],{},"bank:hot:transfer",[390,711,712,399,715,399,718,399,720],{},[174,713,714],{},"source_uid",[174,716,717],{},"target_uid",[174,719,657],{},[174,721,660],{},[390,723,724],{},"Transfer result JSON.",[372,726,727,732,740],{},[390,728,729],{},[174,730,731],{},"bank:hot:charge_checkout",[390,733,734,399,736,399,738],{},[174,735,194],{},[174,737,657],{},[174,739,660],{},[390,741,742,456],{},[174,743,643],{},[372,745,746,751,759],{},[390,747,748],{},[174,749,750],{},"bank:hot:validate_pin",[390,752,753,399,755,399,757],{},[174,754,194],{},[174,756,293],{},[174,758,660],{},[390,760,761,764],{},[174,762,763],{},"{}"," on success.",[372,766,767,772,776],{},[390,768,769],{},[174,770,771],{},"bank:hot:save",[390,773,774],{},[174,775,194],{},[390,777,778],{},"Current hot bank JSON and async durable save.",[372,780,781,786,790],{},[390,782,783],{},[174,784,785],{},"bank:hot:remove",[390,787,788],{},[174,789,194],{},[390,791,792,456],{},[174,793,472],{},[155,795,796],{},"Use hot-state commands for UI workflows. They return patch objects so the UI can\nupdate only changed fields.",[159,798,800],{"id":799},"deposit-and-withdraw","Deposit and Withdraw",[155,802,803,804,807,808,456],{},"ATM sessions require ",[174,805,806],{},"atmAuthorized: true",". Full bank sessions can set\n",[174,809,810],{},"mode: \"bank\"",[167,812,814],{"className":485,"code":813,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"atm\"],\n [\"atmAuthorized\", true]\n];\n\nprivate _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n getPlayerUID player,\n \"100\",\n toJSON _context\n]];\n\nprivate _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n getPlayerUID player,\n \"50\",\n toJSON _context\n]];\n",[174,815,816,821,826,831,835,839,844,848,853,858,862,866,871,875,880,885],{"__ignoreMap":172},[177,817,818],{"class":179,"line":180},[177,819,820],{},"private _context = createHashMapFromArray [\n",[177,822,823],{"class":179,"line":187},[177,824,825],{}," [\"mode\", \"atm\"],\n",[177,827,828],{"class":179,"line":215},[177,829,830],{}," [\"atmAuthorized\", true]\n",[177,832,833],{"class":179,"line":236},[177,834,534],{},[177,836,837],{"class":179,"line":254},[177,838,541],{"emptyLinePlaceholder":540},[177,840,841],{"class":179,"line":271},[177,842,843],{},"private _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n",[177,845,846],{"class":179,"line":288},[177,847,553],{},[177,849,850],{"class":179,"line":305},[177,851,852],{}," \"100\",\n",[177,854,855],{"class":179,"line":320},[177,856,857],{}," toJSON _context\n",[177,859,860],{"class":179,"line":537},[177,861,565],{},[177,863,864],{"class":179,"line":544},[177,865,541],{"emptyLinePlaceholder":540},[177,867,868],{"class":179,"line":550},[177,869,870],{},"private _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n",[177,872,873],{"class":179,"line":556},[177,874,553],{},[177,876,877],{"class":179,"line":562},[177,878,879],{}," \"50\",\n",[177,881,883],{"class":179,"line":882},15,[177,884,857],{},[177,886,888],{"class":179,"line":887},16,[177,889,565],{},[159,891,893],{"id":892},"transfer","Transfer",[155,895,896,897,900,901,452,903,456],{},"Transfers are only available from the full bank interface. ",[174,898,899],{},"fromField"," can be\n",[174,902,241],{},[174,904,259],{},[167,906,908],{"className":485,"code":907,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"bank\"],\n [\"atmAuthorized\", false],\n [\"fromField\", \"bank\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n getPlayerUID player,\n _targetUid,\n \"250\",\n toJSON _context\n]];\n",[174,909,910,914,919,924,929,933,937,942,946,951,956,960],{"__ignoreMap":172},[177,911,912],{"class":179,"line":180},[177,913,820],{},[177,915,916],{"class":179,"line":187},[177,917,918],{}," [\"mode\", \"bank\"],\n",[177,920,921],{"class":179,"line":215},[177,922,923],{}," [\"atmAuthorized\", false],\n",[177,925,926],{"class":179,"line":236},[177,927,928],{}," [\"fromField\", \"bank\"]\n",[177,930,931],{"class":179,"line":254},[177,932,534],{},[177,934,935],{"class":179,"line":271},[177,936,541],{"emptyLinePlaceholder":540},[177,938,939],{"class":179,"line":288},[177,940,941],{},"private _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n",[177,943,944],{"class":179,"line":305},[177,945,553],{},[177,947,948],{"class":179,"line":320},[177,949,950],{}," _targetUid,\n",[177,952,953],{"class":179,"line":537},[177,954,955],{}," \"250\",\n",[177,957,958],{"class":179,"line":544},[177,959,857],{},[177,961,962],{"class":179,"line":550},[177,963,565],{},[159,965,967],{"id":966},"checkout-charge","Checkout Charge",[155,969,970,971,452,974,977,978,981,982,984],{},"Checkout charging supports ",[174,972,973],{},"sourceField: \"cash\"",[174,975,976],{},"sourceField: \"bank\"",".\nSet ",[174,979,980],{},"commit"," to ",[174,983,455],{}," to preview the patch without saving.",[167,986,988],{"className":485,"code":987,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"sourceField\", \"bank\"],\n [\"commit\", true]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n getPlayerUID player,\n \"125\",\n toJSON _context\n]];\n",[174,989,990,994,999,1004,1008,1012,1017,1021,1026,1030],{"__ignoreMap":172},[177,991,992],{"class":179,"line":180},[177,993,820],{},[177,995,996],{"class":179,"line":187},[177,997,998],{}," [\"sourceField\", \"bank\"],\n",[177,1000,1001],{"class":179,"line":215},[177,1002,1003],{}," [\"commit\", true]\n",[177,1005,1006],{"class":179,"line":236},[177,1007,534],{},[177,1009,1010],{"class":179,"line":254},[177,1011,541],{"emptyLinePlaceholder":540},[177,1013,1014],{"class":179,"line":271},[177,1015,1016],{},"private _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n",[177,1018,1019],{"class":179,"line":288},[177,1020,553],{},[177,1022,1023],{"class":179,"line":305},[177,1024,1025],{}," \"125\",\n",[177,1027,1028],{"class":179,"line":320},[177,1029,857],{},[177,1031,1032],{"class":179,"line":537},[177,1033,565],{},[159,1035,1037],{"id":1036},"pin-validation","PIN Validation",[155,1039,1040],{},"PIN entry is only valid in ATM mode.",[167,1042,1044],{"className":485,"code":1043,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n getPlayerUID player,\n \"1234\",\n toJSON _context\n]];\n",[174,1045,1046,1051,1055,1060,1064,1069,1073],{"__ignoreMap":172},[177,1047,1048],{"class":179,"line":180},[177,1049,1050],{},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n",[177,1052,1053],{"class":179,"line":187},[177,1054,541],{"emptyLinePlaceholder":540},[177,1056,1057],{"class":179,"line":215},[177,1058,1059],{},"private _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n",[177,1061,1062],{"class":179,"line":236},[177,1063,553],{},[177,1065,1066],{"class":179,"line":254},[177,1067,1068],{}," \"1234\",\n",[177,1070,1071],{"class":179,"line":271},[177,1072,857],{},[177,1074,1075],{"class":179,"line":288},[177,1076,565],{},[159,1078,1080],{"id":1079},"error-handling","Error Handling",[167,1082,1084],{"className":485,"code":1083,"language":487,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Bank error: %1\", _payload];\n};\n\nprivate _bank = fromJSON _payload;\n",[174,1085,1086,1091,1096,1100,1105,1110,1115,1119],{"__ignoreMap":172},[177,1087,1088],{"class":179,"line":180},[177,1089,1090],{},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\n",[177,1092,1093],{"class":179,"line":187},[177,1094,1095],{},"private _payload = _result select 0;\n",[177,1097,1098],{"class":179,"line":215},[177,1099,541],{"emptyLinePlaceholder":540},[177,1101,1102],{"class":179,"line":236},[177,1103,1104],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1106,1107],{"class":179,"line":254},[177,1108,1109],{}," systemChat format [\"Bank error: %1\", _payload];\n",[177,1111,1112],{"class":179,"line":271},[177,1113,1114],{},"};\n",[177,1116,1117],{"class":179,"line":288},[177,1118,541],{"emptyLinePlaceholder":540},[177,1120,1121],{"class":179,"line":305},[177,1122,1123],{},"private _bank = fromJSON _payload;\n",[1125,1126,1127],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1129},[1130,1131,1132,1133,1134,1135,1136,1137,1138],{"id":161,"depth":187,"text":162},{"id":363,"depth":187,"text":364},{"id":475,"depth":187,"text":476},{"id":568,"depth":187,"text":569},{"id":799,"depth":187,"text":800},{"id":892,"depth":187,"text":893},{"id":966,"depth":187,"text":967},{"id":1036,"depth":187,"text":1037},{"id":1079,"depth":187,"text":1080},"md",null,{},{"title":61,"description":157},"sIOXEyzlGQFhd8qUZozTWTtuL76YtpRKFT959rOS7FM",[1145,1147],{"title":57,"path":58,"stem":59,"description":1146,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",{"title":65,"path":66,"stem":67,"description":1148,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/cad.html b/docus/dist/server-modules/cad.html new file mode 100644 index 0000000..2b1fbdc --- /dev/null +++ b/docus/dist/server-modules/cad.html @@ -0,0 +1,201 @@ +CAD Usage Guide - forge-docus
Server Modules

CAD Usage Guide

The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle.

CAD Usage Guide

The CAD module stores transient operational state for dispatch activity, +assignments, dispatch orders, support requests, group profiles, grouped views, +and hydrated UI payloads. CAD state is in-memory and follows the active server +or mission lifecycle.

Data Model

Most CAD records are flexible JSON objects. The service normalizes important +IDs and returns structured mutation results for higher-level workflows.

Common generated IDs:

  • Orders: cad-order:<sequence>
  • Requests: cad-request:<sequence>
  • Assignments usually share a task ID or order ID.

Commands

Activity

CommandArgumentsReturns
cad:activity:appendactivity_jsonOK.
cad:activity:recentlimitRecent activity array JSON.

Assignments

CommandArgumentsReturns
cad:assignments:listnoneAssignment array JSON.
cad:assignments:assignentry_id, assignment_jsonAssignment mutation result JSON.
cad:assignments:acknowledgeentry_id, patch_jsonAssignment mutation result JSON.
cad:assignments:declineentry_id, patch_jsonAssignment mutation result JSON and removes assignment.
cad:assignments:upsertentry_id, assignment_jsonOK.
cad:assignments:deleteentry_idOK.

Orders

CommandArgumentsReturns
cad:orders:listnoneOrder array JSON.
cad:orders:createorder_seed_jsonDispatch order mutation result JSON.
cad:orders:create_from_contextcontext_jsonDispatch order mutation result JSON.
cad:orders:closeentry_idDispatch order mutation result JSON and removes order/assignment.
cad:orders:upsertentry_id, order_jsonOK.
cad:orders:deleteentry_idOK.

Requests

CommandArgumentsReturns
cad:requests:listnoneRequest array JSON.
cad:requests:submitrequest_jsonRequest mutation result JSON.
cad:requests:submit_from_contextcontext_jsonRequest mutation result JSON.
cad:requests:closeentry_idRequest mutation result JSON and removes request.
cad:requests:upsertentry_id, request_jsonOK.
cad:requests:deleteentry_idOK.

Profiles and Views

CommandArgumentsReturns
cad:profiles:listnoneProfile array JSON.
cad:profiles:update_from_contextcontext_jsonProfile mutation result JSON.
cad:profiles:upsertentry_id, profile_jsonOK.
cad:profiles:deleteentry_idOK.
cad:groups:buildgroups_seed_jsonGroup array JSON.
cad:view:hydratehydrate_seed_jsonHydrated CAD payload JSON.

Submit a Support Request

private _fields = createHashMapFromArray [
+    ["pickup_location", "Grid 123456"],
+    ["precedence", "urgent"],
+    ["security", "secure"]
+];
+
+private _context = createHashMapFromArray [
+    ["type", "medevac_9line"],
+    ["fields", _fields],
+    ["groupId", "alpha"],
+    ["groupCallsign", "Alpha 1-1"],
+    ["submittedByUid", getPlayerUID player],
+    ["submittedByName", name player],
+    ["priority", "emergency"],
+    ["position", getPosATL player],
+    ["createdAt", diag_tickTime]
+];
+
+private _result = "forge_server" callExtension ["cad:requests:submit_from_context", [
+    toJSON _context
+]];
+

Supported priority values are routine, priority, and emergency. Unknown +values normalize to priority.

Create a Dispatch Order

private _context = createHashMapFromArray [
+    ["assigneeGroupId", "bravo"],
+    ["assigneeGroupCallsign", "Bravo 1-1"],
+    ["targetGroupId", "alpha"],
+    ["targetGroupCallsign", "Alpha 1-1"],
+    ["targetPosition", getPosATL player],
+    ["createdByUid", getPlayerUID player],
+    ["createdByName", name player],
+    ["requestId", "cad-request:1"],
+    ["requestType", "logreq"],
+    ["requestTitle", "LOGREQ | Alpha 1-1"],
+    ["requestSummary", "Ammo resupply requested"],
+    ["requestFields", createHashMap],
+    ["note", "Support Alpha 1-1 at current position."],
+    ["priority", "priority"],
+    ["createdAt", diag_tickTime]
+];
+
+private _result = "forge_server" callExtension ["cad:orders:create_from_context", [
+    toJSON _context
+]];
+

Assignment Workflow

private _assignment = createHashMapFromArray [
+    ["groupId", "bravo"],
+    ["assigneeGroupCallsign", "Bravo 1-1"],
+    ["assignedByUid", getPlayerUID player],
+    ["assignedByName", name player],
+    ["assignedAt", diag_tickTime],
+    ["state", "assigned"]
+];
+
+"forge_server" callExtension ["cad:assignments:assign", [
+    "task-123",
+    toJSON _assignment
+]];
+
+private _ack = createHashMapFromArray [
+    ["state", "acknowledged"],
+    ["acknowledgedByUid", getPlayerUID player],
+    ["acknowledgedAt", diag_tickTime]
+];
+
+"forge_server" callExtension ["cad:assignments:acknowledge", [
+    "task-123",
+    toJSON _ack
+]];
+

Hydrate the CAD UI

private _session = createHashMapFromArray [
+    ["uid", getPlayerUID player],
+    ["orgId", "default"],
+    ["isDispatcher", true],
+    ["groupId", "alpha"],
+    ["isLeader", true]
+];
+
+private _seed = createHashMapFromArray [
+    ["groups", _liveGroups],
+    ["activeTasks", _activeTasks],
+    ["session", _session]
+];
+
+private _result = "forge_server" callExtension ["cad:view:hydrate", [toJSON _seed]];
+

Error Handling

private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["CAD error: %1", _payload];
+};
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/cad/_payload.json b/docus/dist/server-modules/cad/_payload.json new file mode 100644 index 0000000..74c9de0 --- /dev/null +++ b/docus/dist/server-modules/cad/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-cad":145,"-server-modules-cad-surround":1204},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":65,"body":147,"description":157,"extension":1199,"links":1200,"meta":1201,"navigation":735,"path":66,"seo":1202,"stem":67,"__hash__":1203},"docs\u002F3.server-modules\u002F3.cad.md",{"type":148,"value":149,"toc":1184},"minimark",[150,154,158,163,166,169,189,193,198,254,258,368,372,474,478,578,582,685,689,825,841,845,949,953,1072,1076,1151,1155,1180],[151,152,65],"h1",{"id":153},"cad-usage-guide",[155,156,157],"p",{},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",[159,160,162],"h2",{"id":161},"data-model","Data Model",[155,164,165],{},"Most CAD records are flexible JSON objects. The service normalizes important\nIDs and returns structured mutation results for higher-level workflows.",[155,167,168],{},"Common generated IDs:",[170,171,172,180,186],"ul",{},[173,174,175,176],"li",{},"Orders: ",[177,178,179],"code",{},"cad-order:\u003Csequence>",[173,181,182,183],{},"Requests: ",[177,184,185],{},"cad-request:\u003Csequence>",[173,187,188],{},"Assignments usually share a task ID or order ID.",[159,190,192],{"id":191},"commands","Commands",[194,195,197],"h3",{"id":196},"activity","Activity",[199,200,201,217],"table",{},[202,203,204],"thead",{},[205,206,207,211,214],"tr",{},[208,209,210],"th",{},"Command",[208,212,213],{},"Arguments",[208,215,216],{},"Returns",[218,219,220,239],"tbody",{},[205,221,222,228,233],{},[223,224,225],"td",{},[177,226,227],{},"cad:activity:append",[223,229,230],{},[177,231,232],{},"activity_json",[223,234,235,238],{},[177,236,237],{},"OK",".",[205,240,241,246,251],{},[223,242,243],{},[177,244,245],{},"cad:activity:recent",[223,247,248],{},[177,249,250],{},"limit",[223,252,253],{},"Recent activity array JSON.",[194,255,257],{"id":256},"assignments","Assignments",[199,259,260,270],{},[202,261,262],{},[205,263,264,266,268],{},[208,265,210],{},[208,267,213],{},[208,269,216],{},[218,271,272,285,304,320,336,353],{},[205,273,274,279,282],{},[223,275,276],{},[177,277,278],{},"cad:assignments:list",[223,280,281],{},"none",[223,283,284],{},"Assignment array JSON.",[205,286,287,292,301],{},[223,288,289],{},[177,290,291],{},"cad:assignments:assign",[223,293,294,297,298],{},[177,295,296],{},"entry_id",", ",[177,299,300],{},"assignment_json",[223,302,303],{},"Assignment mutation result JSON.",[205,305,306,311,318],{},[223,307,308],{},[177,309,310],{},"cad:assignments:acknowledge",[223,312,313,297,315],{},[177,314,296],{},[177,316,317],{},"patch_json",[223,319,303],{},[205,321,322,327,333],{},[223,323,324],{},[177,325,326],{},"cad:assignments:decline",[223,328,329,297,331],{},[177,330,296],{},[177,332,317],{},[223,334,335],{},"Assignment mutation result JSON and removes assignment.",[205,337,338,343,349],{},[223,339,340],{},[177,341,342],{},"cad:assignments:upsert",[223,344,345,297,347],{},[177,346,296],{},[177,348,300],{},[223,350,351,238],{},[177,352,237],{},[205,354,355,360,364],{},[223,356,357],{},[177,358,359],{},"cad:assignments:delete",[223,361,362],{},[177,363,296],{},[223,365,366,238],{},[177,367,237],{},[194,369,371],{"id":370},"orders","Orders",[199,373,374,384],{},[202,375,376],{},[205,377,378,380,382],{},[208,379,210],{},[208,381,213],{},[208,383,216],{},[218,385,386,398,413,427,441,459],{},[205,387,388,393,395],{},[223,389,390],{},[177,391,392],{},"cad:orders:list",[223,394,281],{},[223,396,397],{},"Order array JSON.",[205,399,400,405,410],{},[223,401,402],{},[177,403,404],{},"cad:orders:create",[223,406,407],{},[177,408,409],{},"order_seed_json",[223,411,412],{},"Dispatch order mutation result JSON.",[205,414,415,420,425],{},[223,416,417],{},[177,418,419],{},"cad:orders:create_from_context",[223,421,422],{},[177,423,424],{},"context_json",[223,426,412],{},[205,428,429,434,438],{},[223,430,431],{},[177,432,433],{},"cad:orders:close",[223,435,436],{},[177,437,296],{},[223,439,440],{},"Dispatch order mutation result JSON and removes order\u002Fassignment.",[205,442,443,448,455],{},[223,444,445],{},[177,446,447],{},"cad:orders:upsert",[223,449,450,297,452],{},[177,451,296],{},[177,453,454],{},"order_json",[223,456,457,238],{},[177,458,237],{},[205,460,461,466,470],{},[223,462,463],{},[177,464,465],{},"cad:orders:delete",[223,467,468],{},[177,469,296],{},[223,471,472,238],{},[177,473,237],{},[194,475,477],{"id":476},"requests","Requests",[199,479,480,490],{},[202,481,482],{},[205,483,484,486,488],{},[208,485,210],{},[208,487,213],{},[208,489,216],{},[218,491,492,504,519,532,546,563],{},[205,493,494,499,501],{},[223,495,496],{},[177,497,498],{},"cad:requests:list",[223,500,281],{},[223,502,503],{},"Request array JSON.",[205,505,506,511,516],{},[223,507,508],{},[177,509,510],{},"cad:requests:submit",[223,512,513],{},[177,514,515],{},"request_json",[223,517,518],{},"Request mutation result JSON.",[205,520,521,526,530],{},[223,522,523],{},[177,524,525],{},"cad:requests:submit_from_context",[223,527,528],{},[177,529,424],{},[223,531,518],{},[205,533,534,539,543],{},[223,535,536],{},[177,537,538],{},"cad:requests:close",[223,540,541],{},[177,542,296],{},[223,544,545],{},"Request mutation result JSON and removes request.",[205,547,548,553,559],{},[223,549,550],{},[177,551,552],{},"cad:requests:upsert",[223,554,555,297,557],{},[177,556,296],{},[177,558,515],{},[223,560,561,238],{},[177,562,237],{},[205,564,565,570,574],{},[223,566,567],{},[177,568,569],{},"cad:requests:delete",[223,571,572],{},[177,573,296],{},[223,575,576,238],{},[177,577,237],{},[194,579,581],{"id":580},"profiles-and-views","Profiles and Views",[199,583,584,594],{},[202,585,586],{},[205,587,588,590,592],{},[208,589,210],{},[208,591,213],{},[208,593,216],{},[218,595,596,608,622,640,655,670],{},[205,597,598,603,605],{},[223,599,600],{},[177,601,602],{},"cad:profiles:list",[223,604,281],{},[223,606,607],{},"Profile array JSON.",[205,609,610,615,619],{},[223,611,612],{},[177,613,614],{},"cad:profiles:update_from_context",[223,616,617],{},[177,618,424],{},[223,620,621],{},"Profile mutation result JSON.",[205,623,624,629,636],{},[223,625,626],{},[177,627,628],{},"cad:profiles:upsert",[223,630,631,297,633],{},[177,632,296],{},[177,634,635],{},"profile_json",[223,637,638,238],{},[177,639,237],{},[205,641,642,647,651],{},[223,643,644],{},[177,645,646],{},"cad:profiles:delete",[223,648,649],{},[177,650,296],{},[223,652,653,238],{},[177,654,237],{},[205,656,657,662,667],{},[223,658,659],{},[177,660,661],{},"cad:groups:build",[223,663,664],{},[177,665,666],{},"groups_seed_json",[223,668,669],{},"Group array JSON.",[205,671,672,677,682],{},[223,673,674],{},[177,675,676],{},"cad:view:hydrate",[223,678,679],{},[177,680,681],{},"hydrate_seed_json",[223,683,684],{},"Hydrated CAD payload JSON.",[159,686,688],{"id":687},"submit-a-support-request","Submit a Support Request",[690,691,696],"pre",{"className":692,"code":693,"language":694,"meta":695,"style":695},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _fields = createHashMapFromArray [\n [\"pickup_location\", \"Grid 123456\"],\n [\"precedence\", \"urgent\"],\n [\"security\", \"secure\"]\n];\n\nprivate _context = createHashMapFromArray [\n [\"type\", \"medevac_9line\"],\n [\"fields\", _fields],\n [\"groupId\", \"alpha\"],\n [\"groupCallsign\", \"Alpha 1-1\"],\n [\"submittedByUid\", getPlayerUID player],\n [\"submittedByName\", name player],\n [\"priority\", \"emergency\"],\n [\"position\", getPosATL player],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n toJSON _context\n]];\n","sqf","",[177,697,698,706,712,718,724,730,737,743,749,755,761,767,773,779,785,791,797,802,807,813,819],{"__ignoreMap":695},[699,700,703],"span",{"class":701,"line":702},"line",1,[699,704,705],{},"private _fields = createHashMapFromArray [\n",[699,707,709],{"class":701,"line":708},2,[699,710,711],{}," [\"pickup_location\", \"Grid 123456\"],\n",[699,713,715],{"class":701,"line":714},3,[699,716,717],{}," [\"precedence\", \"urgent\"],\n",[699,719,721],{"class":701,"line":720},4,[699,722,723],{}," [\"security\", \"secure\"]\n",[699,725,727],{"class":701,"line":726},5,[699,728,729],{},"];\n",[699,731,733],{"class":701,"line":732},6,[699,734,736],{"emptyLinePlaceholder":735},true,"\n",[699,738,740],{"class":701,"line":739},7,[699,741,742],{},"private _context = createHashMapFromArray [\n",[699,744,746],{"class":701,"line":745},8,[699,747,748],{}," [\"type\", \"medevac_9line\"],\n",[699,750,752],{"class":701,"line":751},9,[699,753,754],{}," [\"fields\", _fields],\n",[699,756,758],{"class":701,"line":757},10,[699,759,760],{}," [\"groupId\", \"alpha\"],\n",[699,762,764],{"class":701,"line":763},11,[699,765,766],{}," [\"groupCallsign\", \"Alpha 1-1\"],\n",[699,768,770],{"class":701,"line":769},12,[699,771,772],{}," [\"submittedByUid\", getPlayerUID player],\n",[699,774,776],{"class":701,"line":775},13,[699,777,778],{}," [\"submittedByName\", name player],\n",[699,780,782],{"class":701,"line":781},14,[699,783,784],{}," [\"priority\", \"emergency\"],\n",[699,786,788],{"class":701,"line":787},15,[699,789,790],{}," [\"position\", getPosATL player],\n",[699,792,794],{"class":701,"line":793},16,[699,795,796],{}," [\"createdAt\", diag_tickTime]\n",[699,798,800],{"class":701,"line":799},17,[699,801,729],{},[699,803,805],{"class":701,"line":804},18,[699,806,736],{"emptyLinePlaceholder":735},[699,808,810],{"class":701,"line":809},19,[699,811,812],{},"private _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n",[699,814,816],{"class":701,"line":815},20,[699,817,818],{}," toJSON _context\n",[699,820,822],{"class":701,"line":821},21,[699,823,824],{},"]];\n",[155,826,827,828,297,831,834,835,838,839,238],{},"Supported priority values are ",[177,829,830],{},"routine",[177,832,833],{},"priority",", and ",[177,836,837],{},"emergency",". Unknown\nvalues normalize to ",[177,840,833],{},[159,842,844],{"id":843},"create-a-dispatch-order","Create a Dispatch Order",[690,846,848],{"className":692,"code":847,"language":694,"meta":695,"style":695},"private _context = createHashMapFromArray [\n [\"assigneeGroupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"targetGroupId\", \"alpha\"],\n [\"targetGroupCallsign\", \"Alpha 1-1\"],\n [\"targetPosition\", getPosATL player],\n [\"createdByUid\", getPlayerUID player],\n [\"createdByName\", name player],\n [\"requestId\", \"cad-request:1\"],\n [\"requestType\", \"logreq\"],\n [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n [\"requestSummary\", \"Ammo resupply requested\"],\n [\"requestFields\", createHashMap],\n [\"note\", \"Support Alpha 1-1 at current position.\"],\n [\"priority\", \"priority\"],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n toJSON _context\n]];\n",[177,849,850,854,859,864,869,874,879,884,889,894,899,904,909,914,919,924,928,932,936,941,945],{"__ignoreMap":695},[699,851,852],{"class":701,"line":702},[699,853,742],{},[699,855,856],{"class":701,"line":708},[699,857,858],{}," [\"assigneeGroupId\", \"bravo\"],\n",[699,860,861],{"class":701,"line":714},[699,862,863],{}," [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n",[699,865,866],{"class":701,"line":720},[699,867,868],{}," [\"targetGroupId\", \"alpha\"],\n",[699,870,871],{"class":701,"line":726},[699,872,873],{}," [\"targetGroupCallsign\", \"Alpha 1-1\"],\n",[699,875,876],{"class":701,"line":732},[699,877,878],{}," [\"targetPosition\", getPosATL player],\n",[699,880,881],{"class":701,"line":739},[699,882,883],{}," [\"createdByUid\", getPlayerUID player],\n",[699,885,886],{"class":701,"line":745},[699,887,888],{}," [\"createdByName\", name player],\n",[699,890,891],{"class":701,"line":751},[699,892,893],{}," [\"requestId\", \"cad-request:1\"],\n",[699,895,896],{"class":701,"line":757},[699,897,898],{}," [\"requestType\", \"logreq\"],\n",[699,900,901],{"class":701,"line":763},[699,902,903],{}," [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n",[699,905,906],{"class":701,"line":769},[699,907,908],{}," [\"requestSummary\", \"Ammo resupply requested\"],\n",[699,910,911],{"class":701,"line":775},[699,912,913],{}," [\"requestFields\", createHashMap],\n",[699,915,916],{"class":701,"line":781},[699,917,918],{}," [\"note\", \"Support Alpha 1-1 at current position.\"],\n",[699,920,921],{"class":701,"line":787},[699,922,923],{}," [\"priority\", \"priority\"],\n",[699,925,926],{"class":701,"line":793},[699,927,796],{},[699,929,930],{"class":701,"line":799},[699,931,729],{},[699,933,934],{"class":701,"line":804},[699,935,736],{"emptyLinePlaceholder":735},[699,937,938],{"class":701,"line":809},[699,939,940],{},"private _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n",[699,942,943],{"class":701,"line":815},[699,944,818],{},[699,946,947],{"class":701,"line":821},[699,948,824],{},[159,950,952],{"id":951},"assignment-workflow","Assignment Workflow",[690,954,956],{"className":692,"code":955,"language":694,"meta":695,"style":695},"private _assignment = createHashMapFromArray [\n [\"groupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"assignedByUid\", getPlayerUID player],\n [\"assignedByName\", name player],\n [\"assignedAt\", diag_tickTime],\n [\"state\", \"assigned\"]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:assign\", [\n \"task-123\",\n toJSON _assignment\n]];\n\nprivate _ack = createHashMapFromArray [\n [\"state\", \"acknowledged\"],\n [\"acknowledgedByUid\", getPlayerUID player],\n [\"acknowledgedAt\", diag_tickTime]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n \"task-123\",\n toJSON _ack\n]];\n",[177,957,958,963,968,972,977,982,987,992,996,1000,1005,1010,1015,1019,1023,1028,1033,1038,1043,1047,1051,1056,1061,1067],{"__ignoreMap":695},[699,959,960],{"class":701,"line":702},[699,961,962],{},"private _assignment = createHashMapFromArray [\n",[699,964,965],{"class":701,"line":708},[699,966,967],{}," [\"groupId\", \"bravo\"],\n",[699,969,970],{"class":701,"line":714},[699,971,863],{},[699,973,974],{"class":701,"line":720},[699,975,976],{}," [\"assignedByUid\", getPlayerUID player],\n",[699,978,979],{"class":701,"line":726},[699,980,981],{}," [\"assignedByName\", name player],\n",[699,983,984],{"class":701,"line":732},[699,985,986],{}," [\"assignedAt\", diag_tickTime],\n",[699,988,989],{"class":701,"line":739},[699,990,991],{}," [\"state\", \"assigned\"]\n",[699,993,994],{"class":701,"line":745},[699,995,729],{},[699,997,998],{"class":701,"line":751},[699,999,736],{"emptyLinePlaceholder":735},[699,1001,1002],{"class":701,"line":757},[699,1003,1004],{},"\"forge_server\" callExtension [\"cad:assignments:assign\", [\n",[699,1006,1007],{"class":701,"line":763},[699,1008,1009],{}," \"task-123\",\n",[699,1011,1012],{"class":701,"line":769},[699,1013,1014],{}," toJSON _assignment\n",[699,1016,1017],{"class":701,"line":775},[699,1018,824],{},[699,1020,1021],{"class":701,"line":781},[699,1022,736],{"emptyLinePlaceholder":735},[699,1024,1025],{"class":701,"line":787},[699,1026,1027],{},"private _ack = createHashMapFromArray [\n",[699,1029,1030],{"class":701,"line":793},[699,1031,1032],{}," [\"state\", \"acknowledged\"],\n",[699,1034,1035],{"class":701,"line":799},[699,1036,1037],{}," [\"acknowledgedByUid\", getPlayerUID player],\n",[699,1039,1040],{"class":701,"line":804},[699,1041,1042],{}," [\"acknowledgedAt\", diag_tickTime]\n",[699,1044,1045],{"class":701,"line":809},[699,1046,729],{},[699,1048,1049],{"class":701,"line":815},[699,1050,736],{"emptyLinePlaceholder":735},[699,1052,1053],{"class":701,"line":821},[699,1054,1055],{},"\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n",[699,1057,1059],{"class":701,"line":1058},22,[699,1060,1009],{},[699,1062,1064],{"class":701,"line":1063},23,[699,1065,1066],{}," toJSON _ack\n",[699,1068,1070],{"class":701,"line":1069},24,[699,1071,824],{},[159,1073,1075],{"id":1074},"hydrate-the-cad-ui","Hydrate the CAD UI",[690,1077,1079],{"className":692,"code":1078,"language":694,"meta":695,"style":695},"private _session = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"orgId\", \"default\"],\n [\"isDispatcher\", true],\n [\"groupId\", \"alpha\"],\n [\"isLeader\", true]\n];\n\nprivate _seed = createHashMapFromArray [\n [\"groups\", _liveGroups],\n [\"activeTasks\", _activeTasks],\n [\"session\", _session]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[177,1080,1081,1086,1091,1096,1101,1105,1110,1114,1118,1123,1128,1133,1138,1142,1146],{"__ignoreMap":695},[699,1082,1083],{"class":701,"line":702},[699,1084,1085],{},"private _session = createHashMapFromArray [\n",[699,1087,1088],{"class":701,"line":708},[699,1089,1090],{}," [\"uid\", getPlayerUID player],\n",[699,1092,1093],{"class":701,"line":714},[699,1094,1095],{}," [\"orgId\", \"default\"],\n",[699,1097,1098],{"class":701,"line":720},[699,1099,1100],{}," [\"isDispatcher\", true],\n",[699,1102,1103],{"class":701,"line":726},[699,1104,760],{},[699,1106,1107],{"class":701,"line":732},[699,1108,1109],{}," [\"isLeader\", true]\n",[699,1111,1112],{"class":701,"line":739},[699,1113,729],{},[699,1115,1116],{"class":701,"line":745},[699,1117,736],{"emptyLinePlaceholder":735},[699,1119,1120],{"class":701,"line":751},[699,1121,1122],{},"private _seed = createHashMapFromArray [\n",[699,1124,1125],{"class":701,"line":757},[699,1126,1127],{}," [\"groups\", _liveGroups],\n",[699,1129,1130],{"class":701,"line":763},[699,1131,1132],{}," [\"activeTasks\", _activeTasks],\n",[699,1134,1135],{"class":701,"line":769},[699,1136,1137],{}," [\"session\", _session]\n",[699,1139,1140],{"class":701,"line":775},[699,1141,729],{},[699,1143,1144],{"class":701,"line":781},[699,1145,736],{"emptyLinePlaceholder":735},[699,1147,1148],{"class":701,"line":787},[699,1149,1150],{},"private _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[159,1152,1154],{"id":1153},"error-handling","Error Handling",[690,1156,1158],{"className":692,"code":1157,"language":694,"meta":695,"style":695},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"CAD error: %1\", _payload];\n};\n",[177,1159,1160,1165,1170,1175],{"__ignoreMap":695},[699,1161,1162],{"class":701,"line":702},[699,1163,1164],{},"private _payload = _result select 0;\n",[699,1166,1167],{"class":701,"line":708},[699,1168,1169],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[699,1171,1172],{"class":701,"line":714},[699,1173,1174],{}," systemChat format [\"CAD error: %1\", _payload];\n",[699,1176,1177],{"class":701,"line":720},[699,1178,1179],{},"};\n",[1181,1182,1183],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":695,"searchDepth":708,"depth":708,"links":1185},[1186,1187,1194,1195,1196,1197,1198],{"id":161,"depth":708,"text":162},{"id":191,"depth":708,"text":192,"children":1188},[1189,1190,1191,1192,1193],{"id":196,"depth":714,"text":197},{"id":256,"depth":714,"text":257},{"id":370,"depth":714,"text":371},{"id":476,"depth":714,"text":477},{"id":580,"depth":714,"text":581},{"id":687,"depth":708,"text":688},{"id":843,"depth":708,"text":844},{"id":951,"depth":708,"text":952},{"id":1074,"depth":708,"text":1075},{"id":1153,"depth":708,"text":1154},"md",null,{},{"title":65,"description":157},"VANsWEF49OB4tZwmlVZ0NzEGZIfaS-nx6IfKliEbIFw",[1205,1207],{"title":61,"path":62,"stem":63,"description":1206,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",{"title":69,"path":70,"stem":71,"description":1208,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/economy.html b/docus/dist/server-modules/economy.html new file mode 100644 index 0000000..33fd521 --- /dev/null +++ b/docus/dist/server-modules/economy.html @@ -0,0 +1,136 @@ +Economy Usage Guide - forge-docus
Server Modules

Economy Usage Guide

The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied.

Economy Usage Guide

The economy server addon owns Arma-world service behavior for fuel, medical, +and repair interactions. It does not own money state. Money mutations go +through extension-backed bank and organization hot state before the world +effect is applied.

Dependencies

  • forge_server_common for logging, formatting, and player lookup.
  • forge_server_bank for personal medical billing.
  • forge_server_org for organization-funded services and medical fallback +debt.
  • forge_client_actor and forge_client_notifications for targeted client +responses.

Fuel

Fuel is organization-funded.

When refueling stops, fnc_initFEconomyStore.sqf calculates the fuel delta and +cost, charges the player's organization through OrgStore chargeCheckout, and +syncs the organization patch to online members. If organization funds cannot +cover the refuel, the vehicle is rolled back to the fuel level it had when the +session started.

Garage UI refuel requests use the server RefuelService event. The fuel store +calculates missing fuel from the vehicle config fuelCapacity, charges the +player's organization, and fills the vehicle only after the organization charge +succeeds.

Repair

Repair is organization-funded.

Use the repair service event:

[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent;
+

_cost is optional. Passing -1 uses the configured service repair cost. +The target is only repaired after the organization charge succeeds.

The client garage UI forwards selected nearby vehicle repair requests through +the same event.

Medical

Medical is player-funded first.

When a heal is requested, fnc_initMEconomyStore.sqf uses this billing order:

  1. Charge the player's bank balance when it can cover the medical fee.
  2. Otherwise charge the player's cash when it can cover the fee.
  3. If neither personal balance can cover the fee, charge organization funds.
  4. When organization funds cover the fallback charge, record the same amount as +debt on the player's organization credit line.

The heal only completes after one of those charges succeeds. If personal +billing is unavailable, the heal does not fall back to organization funds +because the server cannot verify that the player is unable to cover the fee.

Medical Debt Repayment

Medical fallback debt uses the existing organization credit-line repayment +flow. The organization treasury is reduced when the service is rendered, and +the player's credit-line amount_due increases by the medical fee. When the +player repays through the bank credit-line repayment action, player bank funds +are moved back into the organization treasury.

Hot-Cache Boundary

The economy addon should stay server-authoritative for world effects such as +vehicle fuel, vehicle repair, healing, respawn placement, and death inventory +movement. Bank and organization balances should continue to mutate through the +extension-backed hot-cache services.

Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/economy/_payload.json b/docus/dist/server-modules/economy/_payload.json new file mode 100644 index 0000000..1eeaa0d --- /dev/null +++ b/docus/dist/server-modules/economy/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":338},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-economy":145,"-server-modules-economy-surround":333},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":69,"body":147,"description":157,"extension":327,"links":328,"meta":329,"navigation":330,"path":70,"seo":331,"stem":71,"__hash__":332},"docs\u002F3.server-modules\u002F4.economy.md",{"type":148,"value":149,"toc":318},"minimark",[150,154,158,163,196,200,203,214,225,229,232,235,251,261,264,268,271,278,293,296,300,307,311,314],[151,152,69],"h1",{"id":153},"economy-usage-guide",[155,156,157],"p",{},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",[159,160,162],"h2",{"id":161},"dependencies","Dependencies",[164,165,166,174,180,186],"ul",{},[167,168,169,173],"li",{},[170,171,172],"code",{},"forge_server_common"," for logging, formatting, and player lookup.",[167,175,176,179],{},[170,177,178],{},"forge_server_bank"," for personal medical billing.",[167,181,182,185],{},[170,183,184],{},"forge_server_org"," for organization-funded services and medical fallback\ndebt.",[167,187,188,191,192,195],{},[170,189,190],{},"forge_client_actor"," and ",[170,193,194],{},"forge_client_notifications"," for targeted client\nresponses.",[159,197,199],{"id":198},"fuel","Fuel",[155,201,202],{},"Fuel is organization-funded.",[155,204,205,206,209,210,213],{},"When refueling stops, ",[170,207,208],{},"fnc_initFEconomyStore.sqf"," calculates the fuel delta and\ncost, charges the player's organization through ",[170,211,212],{},"OrgStore chargeCheckout",", and\nsyncs the organization patch to online members. If organization funds cannot\ncover the refuel, the vehicle is rolled back to the fuel level it had when the\nsession started.",[155,215,216,217,220,221,224],{},"Garage UI refuel requests use the server ",[170,218,219],{},"RefuelService"," event. The fuel store\ncalculates missing fuel from the vehicle config ",[170,222,223],{},"fuelCapacity",", charges the\nplayer's organization, and fills the vehicle only after the organization charge\nsucceeds.",[159,226,228],{"id":227},"repair","Repair",[155,230,231],{},"Repair is organization-funded.",[155,233,234],{},"Use the repair service event:",[236,237,242],"pre",{"className":238,"code":239,"language":240,"meta":241,"style":241},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent;\n","sqf","",[170,243,244],{"__ignoreMap":241},[245,246,249],"span",{"class":247,"line":248},"line",1,[245,250,239],{},[155,252,253,256,257,260],{},[170,254,255],{},"_cost"," is optional. Passing ",[170,258,259],{},"-1"," uses the configured service repair cost.\nThe target is only repaired after the organization charge succeeds.",[155,262,263],{},"The client garage UI forwards selected nearby vehicle repair requests through\nthe same event.",[159,265,267],{"id":266},"medical","Medical",[155,269,270],{},"Medical is player-funded first.",[155,272,273,274,277],{},"When a heal is requested, ",[170,275,276],{},"fnc_initMEconomyStore.sqf"," uses this billing order:",[279,280,281,284,287,290],"ol",{},[167,282,283],{},"Charge the player's bank balance when it can cover the medical fee.",[167,285,286],{},"Otherwise charge the player's cash when it can cover the fee.",[167,288,289],{},"If neither personal balance can cover the fee, charge organization funds.",[167,291,292],{},"When organization funds cover the fallback charge, record the same amount as\ndebt on the player's organization credit line.",[155,294,295],{},"The heal only completes after one of those charges succeeds. If personal\nbilling is unavailable, the heal does not fall back to organization funds\nbecause the server cannot verify that the player is unable to cover the fee.",[159,297,299],{"id":298},"medical-debt-repayment","Medical Debt Repayment",[155,301,302,303,306],{},"Medical fallback debt uses the existing organization credit-line repayment\nflow. The organization treasury is reduced when the service is rendered, and\nthe player's credit-line ",[170,304,305],{},"amount_due"," increases by the medical fee. When the\nplayer repays through the bank credit-line repayment action, player bank funds\nare moved back into the organization treasury.",[159,308,310],{"id":309},"hot-cache-boundary","Hot-Cache Boundary",[155,312,313],{},"The economy addon should stay server-authoritative for world effects such as\nvehicle fuel, vehicle repair, healing, respawn placement, and death inventory\nmovement. Bank and organization balances should continue to mutate through the\nextension-backed hot-cache services.",[315,316,317],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":241,"searchDepth":319,"depth":319,"links":320},2,[321,322,323,324,325,326],{"id":161,"depth":319,"text":162},{"id":198,"depth":319,"text":199},{"id":227,"depth":319,"text":228},{"id":266,"depth":319,"text":267},{"id":298,"depth":319,"text":299},{"id":309,"depth":319,"text":310},"md",null,{},true,{"title":69,"description":157},"lJi1fhh3OVngURwg54r03VgJ7l-YhNr9VR2saYNlGOE",[334,336],{"title":65,"path":66,"stem":67,"description":335,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",{"title":73,"path":74,"stem":75,"description":337,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/garage.html b/docus/dist/server-modules/garage.html new file mode 100644 index 0000000..4fce907 --- /dev/null +++ b/docus/dist/server-modules/garage.html @@ -0,0 +1,224 @@ +Garage Usage Guide - forge-docus
Server Modules

Garage Usage Guide

The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage.

Garage Usage Guide

The garage module stores physical player vehicles. Each record keeps the +vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit +point damage.

Storage Model

Garage data is persisted through SurrealDB by the server extension.

{
+  "plate-uuid": {
+    "plate": "plate-uuid",
+    "classname": "B_Quadbike_01_F",
+    "fuel": 1.0,
+    "damage": 0.0,
+    "hit_points": {
+      "names": ["hitengine"],
+      "selections": ["engine_hitpoint"],
+      "values": [0.0]
+    }
+  }
+}
+

Rules validated by the Rust service:

  • A player garage can contain up to 5 vehicles.
  • garage:add generates a UUID plate automatically.
  • fuel, damage, and every hit point value must be between 0.0 and 1.0.
  • hit_points.names, hit_points.selections, and hit_points.values must have +the same length.
  • garage:get, garage:patch, and garage:remove require an existing garage.
  • garage:add creates an empty garage automatically when one does not exist.

Commands

All commands are called on the garage group.

CommandArgumentsReturns
garage:createuidEmpty vehicle map as JSON.
garage:getuidVehicle map as JSON.
garage:adduid, vehicle_jsonUpdated vehicle map as JSON.
garage:updateuid, vehicles_jsonReplaced vehicle map as JSON.
garage:patchuid, patch_jsonUpdated vehicle map as JSON.
garage:removeuid, remove_jsonUpdated vehicle map as JSON.
garage:deleteuidOK.
garage:existsuidtrue or false.

Error Handling

Every command returns a string payload. Always check for the Error: prefix +before parsing JSON.

private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Garage error: %1", _payload];
+};
+
+private _garage = fromJSON _payload;
+

Add a Vehicle

garage:add requires classname, fuel, damage, and hit_points.

private _hitPointData = getAllHitPointsDamage _vehicle;
+private _hitPoints = createHashMapFromArray [
+    ["names", _hitPointData select 0],
+    ["selections", _hitPointData select 1],
+    ["values", _hitPointData select 2]
+];
+
+private _vehicleData = createHashMapFromArray [
+    ["classname", typeOf _vehicle],
+    ["fuel", fuel _vehicle],
+    ["damage", damage _vehicle],
+    ["hit_points", _hitPoints]
+];
+
+private _result = "forge_server" callExtension ["garage:add", [
+    getPlayerUID player,
+    toJSON _vehicleData
+]];
+
+private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    hint format ["Failed to store vehicle: %1", _payload];
+};
+
+private _garage = fromJSON _payload;
+

The returned value is a hash map keyed by generated plate. To find the newly +stored vehicle, compare returned keys before and after the add, or search by +classname if your workflow guarantees a unique pending vehicle.

private _storedPlate = "";
+{
+    private _vehicleRecord = _garage get _x;
+    if ((_vehicleRecord get "classname") == typeOf _vehicle) then {
+        _storedPlate = _x;
+    };
+} forEach keys _garage;
+

Patch a Vehicle

garage:patch updates selected fields for one plate. The plate field is +required. fuel, damage, and hit_points are optional.

private _patch = createHashMapFromArray [
+    ["plate", _vehicle getVariable ["forge_garage_plate", ""]],
+    ["fuel", fuel _vehicle],
+    ["damage", damage _vehicle]
+];
+
+private _result = "forge_server" callExtension ["garage:patch", [
+    getPlayerUID player,
+    toJSON _patch
+]];
+

Remove a Vehicle

garage:remove expects JSON with a plate field.

private _remove = createHashMapFromArray [
+    ["plate", _plate]
+];
+
+private _result = "forge_server" callExtension ["garage:remove", [
+    getPlayerUID player,
+    toJSON _remove
+]];
+

Spawn a Stored Vehicle

fnc_spawnGarageVehicle = {
+    params ["_plate"];
+
+    private _result = "forge_server" callExtension ["garage:get", [getPlayerUID player]];
+    private _payload = _result select 0;
+
+    if (_payload find "Error:" == 0) exitWith {
+        hint format ["Failed to load garage: %1", _payload];
+        objNull
+    };
+
+    private _garage = fromJSON _payload;
+    private _vehicleData = _garage getOrDefault [_plate, createHashMap];
+    if (_vehicleData isEqualTo createHashMap) exitWith {
+        hint "Vehicle plate was not found in your garage.";
+        objNull
+    };
+
+    private _vehicle = (_vehicleData get "classname") createVehicle (player getPos [10, getDir player]);
+    _vehicle setFuel (_vehicleData getOrDefault ["fuel", 1]);
+    _vehicle setDamage (_vehicleData getOrDefault ["damage", 0]);
+    _vehicle setVariable ["forge_garage_plate", _plate, true];
+
+    private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap];
+    private _names = _hitPoints getOrDefault ["names", []];
+    private _values = _hitPoints getOrDefault ["values", []];
+
+    {
+        _vehicle setHitPointDamage [_x, _values select _forEachIndex];
+    } forEach _names;
+
+    private _remove = createHashMapFromArray [["plate", _plate]];
+    "forge_server" callExtension ["garage:remove", [getPlayerUID player, toJSON _remove]];
+
+    _vehicle
+};
+

Hot State

The garage:hot:* commands keep a runtime copy of a player's garage and write +it back only when garage:hot:save runs.

CommandArgumentsReturns
garage:hot:inituidVehicle map as JSON.
garage:hot:getuidVehicle map as JSON.
garage:hot:overrideuid, vehicles_jsonVehicle map as JSON.
garage:hot:adduid, vehicle_jsonVehicle map as JSON.
garage:hot:remove_vehicleuid, remove_jsonVehicle map as JSON.
garage:hot:saveuidCurrent hot vehicle map as JSON.
garage:hot:removeuidOK.

Use hot state for session-heavy vehicle workflows. Use the durable commands for +simple store/retrieve operations.

Best Practices

  • Store the generated plate on spawned vehicles with setVariable.
  • Use garage:patch for frequent fuel and damage syncs.
  • Use garage:update only when replacing the whole vehicle map intentionally.
  • Do not delete the world vehicle until garage:add succeeds.
  • Treat vehicle maps as hash maps keyed by plate, not arrays.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/garage/_payload.json b/docus/dist/server-modules/garage/_payload.json new file mode 100644 index 0000000..2b12cbc --- /dev/null +++ b/docus/dist/server-modules/garage/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1356},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-garage":145,"-server-modules-garage-surround":1351},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":73,"body":147,"description":157,"extension":1346,"links":1347,"meta":1348,"navigation":640,"path":74,"seo":1349,"stem":75,"__hash__":1350},"docs\u002F3.server-modules\u002F5.garage.md",{"type":148,"value":149,"toc":1335},"minimark",[150,154,158,163,166,386,389,447,451,458,608,612,619,666,670,683,816,819,858,862,877,927,931,939,980,984,1168,1172,1183,1296,1299,1303,1331],[151,152,73],"h1",{"id":153},"garage-usage-guide",[155,156,157],"p",{},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Garage data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"plate-uuid\": {\n \"plate\": \"plate-uuid\",\n \"classname\": \"B_Quadbike_01_F\",\n \"fuel\": 1.0,\n \"damage\": 0.0,\n \"hit_points\": {\n \"names\": [\"hitengine\"],\n \"selections\": [\"engine_hitpoint\"],\n \"values\": [0.0]\n }\n }\n}\n","json","",[174,175,176,185,204,229,250,268,285,299,325,348,368,374,380],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","plate-uuid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," {\n",[177,205,207,210,214,216,218,221,224,226],{"class":179,"line":206},3,[177,208,209],{"class":183}," \"",[177,211,213],{"class":212},"sBMFI","plate",[177,215,197],{"class":183},[177,217,200],{"class":183},[177,219,220],{"class":183}," \"",[177,222,194],{"class":223},"sfazB",[177,225,197],{"class":183},[177,227,228],{"class":183},",\n",[177,230,232,234,237,239,241,243,246,248],{"class":179,"line":231},4,[177,233,209],{"class":183},[177,235,236],{"class":212},"classname",[177,238,197],{"class":183},[177,240,200],{"class":183},[177,242,220],{"class":183},[177,244,245],{"class":223},"B_Quadbike_01_F",[177,247,197],{"class":183},[177,249,228],{"class":183},[177,251,253,255,258,260,262,266],{"class":179,"line":252},5,[177,254,209],{"class":183},[177,256,257],{"class":212},"fuel",[177,259,197],{"class":183},[177,261,200],{"class":183},[177,263,265],{"class":264},"sbssI"," 1.0",[177,267,228],{"class":183},[177,269,271,273,276,278,280,283],{"class":179,"line":270},6,[177,272,209],{"class":183},[177,274,275],{"class":212},"damage",[177,277,197],{"class":183},[177,279,200],{"class":183},[177,281,282],{"class":264}," 0.0",[177,284,228],{"class":183},[177,286,288,290,293,295,297],{"class":179,"line":287},7,[177,289,209],{"class":183},[177,291,292],{"class":212},"hit_points",[177,294,197],{"class":183},[177,296,200],{"class":183},[177,298,203],{"class":183},[177,300,302,305,308,310,312,315,317,320,322],{"class":179,"line":301},8,[177,303,304],{"class":183}," \"",[177,306,307],{"class":264},"names",[177,309,197],{"class":183},[177,311,200],{"class":183},[177,313,314],{"class":183}," [",[177,316,197],{"class":183},[177,318,319],{"class":223},"hitengine",[177,321,197],{"class":183},[177,323,324],{"class":183},"],\n",[177,326,328,330,333,335,337,339,341,344,346],{"class":179,"line":327},9,[177,329,304],{"class":183},[177,331,332],{"class":264},"selections",[177,334,197],{"class":183},[177,336,200],{"class":183},[177,338,314],{"class":183},[177,340,197],{"class":183},[177,342,343],{"class":223},"engine_hitpoint",[177,345,197],{"class":183},[177,347,324],{"class":183},[177,349,351,353,356,358,360,362,365],{"class":179,"line":350},10,[177,352,304],{"class":183},[177,354,355],{"class":264},"values",[177,357,197],{"class":183},[177,359,200],{"class":183},[177,361,314],{"class":183},[177,363,364],{"class":264},"0.0",[177,366,367],{"class":183},"]\n",[177,369,371],{"class":179,"line":370},11,[177,372,373],{"class":183}," }\n",[177,375,377],{"class":179,"line":376},12,[177,378,379],{"class":183}," }\n",[177,381,383],{"class":179,"line":382},13,[177,384,385],{"class":183},"}\n",[155,387,388],{},"Rules validated by the Rust service:",[390,391,392,396,402,417,430,442],"ul",{},[393,394,395],"li",{},"A player garage can contain up to 5 vehicles.",[393,397,398,401],{},[174,399,400],{},"garage:add"," generates a UUID plate automatically.",[393,403,404,406,407,409,410,412,413,416],{},[174,405,257],{},", ",[174,408,275],{},", and every hit point value must be between ",[174,411,364],{}," and ",[174,414,415],{},"1.0",".",[393,418,419,406,422,425,426,429],{},[174,420,421],{},"hit_points.names",[174,423,424],{},"hit_points.selections",", and ",[174,427,428],{},"hit_points.values"," must have\nthe same length.",[393,431,432,406,435,425,438,441],{},[174,433,434],{},"garage:get",[174,436,437],{},"garage:patch",[174,439,440],{},"garage:remove"," require an existing garage.",[393,443,444,446],{},[174,445,400],{}," creates an empty garage automatically when one does not exist.",[159,448,450],{"id":449},"commands","Commands",[155,452,453,454,457],{},"All commands are called on the ",[174,455,456],{},"garage"," group.",[459,460,461,477],"table",{},[462,463,464],"thead",{},[465,466,467,471,474],"tr",{},[468,469,470],"th",{},"Command",[468,472,473],{},"Arguments",[468,475,476],{},"Returns",[478,479,480,496,509,525,542,557,572,588],"tbody",{},[465,481,482,488,493],{},[483,484,485],"td",{},[174,486,487],{},"garage:create",[483,489,490],{},[174,491,492],{},"uid",[483,494,495],{},"Empty vehicle map as JSON.",[465,497,498,502,506],{},[483,499,500],{},[174,501,434],{},[483,503,504],{},[174,505,492],{},[483,507,508],{},"Vehicle map as JSON.",[465,510,511,515,522],{},[483,512,513],{},[174,514,400],{},[483,516,517,406,519],{},[174,518,492],{},[174,520,521],{},"vehicle_json",[483,523,524],{},"Updated vehicle map as JSON.",[465,526,527,532,539],{},[483,528,529],{},[174,530,531],{},"garage:update",[483,533,534,406,536],{},[174,535,492],{},[174,537,538],{},"vehicles_json",[483,540,541],{},"Replaced vehicle map as JSON.",[465,543,544,548,555],{},[483,545,546],{},[174,547,437],{},[483,549,550,406,552],{},[174,551,492],{},[174,553,554],{},"patch_json",[483,556,524],{},[465,558,559,563,570],{},[483,560,561],{},[174,562,440],{},[483,564,565,406,567],{},[174,566,492],{},[174,568,569],{},"remove_json",[483,571,524],{},[465,573,574,579,583],{},[483,575,576],{},[174,577,578],{},"garage:delete",[483,580,581],{},[174,582,492],{},[483,584,585,416],{},[174,586,587],{},"OK",[465,589,590,595,599],{},[483,591,592],{},[174,593,594],{},"garage:exists",[483,596,597],{},[174,598,492],{},[483,600,601,604,605,416],{},[174,602,603],{},"true"," or ",[174,606,607],{},"false",[159,609,611],{"id":610},"error-handling","Error Handling",[155,613,614,615,618],{},"Every command returns a string payload. Always check for the ",[174,616,617],{},"Error:"," prefix\nbefore parsing JSON.",[167,620,624],{"className":621,"code":622,"language":623,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Garage error: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n","sqf",[174,625,626,631,636,642,647,652,657,661],{"__ignoreMap":172},[177,627,628],{"class":179,"line":180},[177,629,630],{},"private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,632,633],{"class":179,"line":187},[177,634,635],{},"private _payload = _result select 0;\n",[177,637,638],{"class":179,"line":206},[177,639,641],{"emptyLinePlaceholder":640},true,"\n",[177,643,644],{"class":179,"line":231},[177,645,646],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,648,649],{"class":179,"line":252},[177,650,651],{}," systemChat format [\"Garage error: %1\", _payload];\n",[177,653,654],{"class":179,"line":270},[177,655,656],{},"};\n",[177,658,659],{"class":179,"line":287},[177,660,641],{"emptyLinePlaceholder":640},[177,662,663],{"class":179,"line":301},[177,664,665],{},"private _garage = fromJSON _payload;\n",[159,667,669],{"id":668},"add-a-vehicle","Add a Vehicle",[155,671,672,674,675,406,677,406,679,425,681,416],{},[174,673,400],{}," requires ",[174,676,236],{},[174,678,257],{},[174,680,275],{},[174,682,292],{},[167,684,686],{"className":621,"code":685,"language":623,"meta":172,"style":172},"private _hitPointData = getAllHitPointsDamage _vehicle;\nprivate _hitPoints = createHashMapFromArray [\n [\"names\", _hitPointData select 0],\n [\"selections\", _hitPointData select 1],\n [\"values\", _hitPointData select 2]\n];\n\nprivate _vehicleData = createHashMapFromArray [\n [\"classname\", typeOf _vehicle],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle],\n [\"hit_points\", _hitPoints]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:add\", [\n getPlayerUID player,\n toJSON _vehicleData\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store vehicle: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n",[174,687,688,693,698,703,708,713,718,722,727,732,737,742,747,751,756,762,768,774,780,785,790,795,801,806,811],{"__ignoreMap":172},[177,689,690],{"class":179,"line":180},[177,691,692],{},"private _hitPointData = getAllHitPointsDamage _vehicle;\n",[177,694,695],{"class":179,"line":187},[177,696,697],{},"private _hitPoints = createHashMapFromArray [\n",[177,699,700],{"class":179,"line":206},[177,701,702],{}," [\"names\", _hitPointData select 0],\n",[177,704,705],{"class":179,"line":231},[177,706,707],{}," [\"selections\", _hitPointData select 1],\n",[177,709,710],{"class":179,"line":252},[177,711,712],{}," [\"values\", _hitPointData select 2]\n",[177,714,715],{"class":179,"line":270},[177,716,717],{},"];\n",[177,719,720],{"class":179,"line":287},[177,721,641],{"emptyLinePlaceholder":640},[177,723,724],{"class":179,"line":301},[177,725,726],{},"private _vehicleData = createHashMapFromArray [\n",[177,728,729],{"class":179,"line":327},[177,730,731],{}," [\"classname\", typeOf _vehicle],\n",[177,733,734],{"class":179,"line":350},[177,735,736],{}," [\"fuel\", fuel _vehicle],\n",[177,738,739],{"class":179,"line":370},[177,740,741],{}," [\"damage\", damage _vehicle],\n",[177,743,744],{"class":179,"line":376},[177,745,746],{}," [\"hit_points\", _hitPoints]\n",[177,748,749],{"class":179,"line":382},[177,750,717],{},[177,752,754],{"class":179,"line":753},14,[177,755,641],{"emptyLinePlaceholder":640},[177,757,759],{"class":179,"line":758},15,[177,760,761],{},"private _result = \"forge_server\" callExtension [\"garage:add\", [\n",[177,763,765],{"class":179,"line":764},16,[177,766,767],{}," getPlayerUID player,\n",[177,769,771],{"class":179,"line":770},17,[177,772,773],{}," toJSON _vehicleData\n",[177,775,777],{"class":179,"line":776},18,[177,778,779],{},"]];\n",[177,781,783],{"class":179,"line":782},19,[177,784,641],{"emptyLinePlaceholder":640},[177,786,788],{"class":179,"line":787},20,[177,789,635],{},[177,791,793],{"class":179,"line":792},21,[177,794,646],{},[177,796,798],{"class":179,"line":797},22,[177,799,800],{}," hint format [\"Failed to store vehicle: %1\", _payload];\n",[177,802,804],{"class":179,"line":803},23,[177,805,656],{},[177,807,809],{"class":179,"line":808},24,[177,810,641],{"emptyLinePlaceholder":640},[177,812,814],{"class":179,"line":813},25,[177,815,665],{},[155,817,818],{},"The returned value is a hash map keyed by generated plate. To find the newly\nstored vehicle, compare returned keys before and after the add, or search by\nclassname if your workflow guarantees a unique pending vehicle.",[167,820,822],{"className":621,"code":821,"language":623,"meta":172,"style":172},"private _storedPlate = \"\";\n{\n private _vehicleRecord = _garage get _x;\n if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n _storedPlate = _x;\n };\n} forEach keys _garage;\n",[174,823,824,829,833,838,843,848,853],{"__ignoreMap":172},[177,825,826],{"class":179,"line":180},[177,827,828],{},"private _storedPlate = \"\";\n",[177,830,831],{"class":179,"line":187},[177,832,184],{},[177,834,835],{"class":179,"line":206},[177,836,837],{}," private _vehicleRecord = _garage get _x;\n",[177,839,840],{"class":179,"line":231},[177,841,842],{}," if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n",[177,844,845],{"class":179,"line":252},[177,846,847],{}," _storedPlate = _x;\n",[177,849,850],{"class":179,"line":270},[177,851,852],{}," };\n",[177,854,855],{"class":179,"line":287},[177,856,857],{},"} forEach keys _garage;\n",[159,859,861],{"id":860},"patch-a-vehicle","Patch a Vehicle",[155,863,864,866,867,869,870,406,872,425,874,876],{},[174,865,437],{}," updates selected fields for one plate. The ",[174,868,213],{}," field is\nrequired. ",[174,871,257],{},[174,873,275],{},[174,875,292],{}," are optional.",[167,878,880],{"className":621,"code":879,"language":623,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,881,882,887,892,896,901,905,909,914,918,923],{"__ignoreMap":172},[177,883,884],{"class":179,"line":180},[177,885,886],{},"private _patch = createHashMapFromArray [\n",[177,888,889],{"class":179,"line":187},[177,890,891],{}," [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n",[177,893,894],{"class":179,"line":206},[177,895,736],{},[177,897,898],{"class":179,"line":231},[177,899,900],{}," [\"damage\", damage _vehicle]\n",[177,902,903],{"class":179,"line":252},[177,904,717],{},[177,906,907],{"class":179,"line":270},[177,908,641],{"emptyLinePlaceholder":640},[177,910,911],{"class":179,"line":287},[177,912,913],{},"private _result = \"forge_server\" callExtension [\"garage:patch\", [\n",[177,915,916],{"class":179,"line":301},[177,917,767],{},[177,919,920],{"class":179,"line":327},[177,921,922],{}," toJSON _patch\n",[177,924,925],{"class":179,"line":350},[177,926,779],{},[159,928,930],{"id":929},"remove-a-vehicle","Remove a Vehicle",[155,932,933,935,936,938],{},[174,934,440],{}," expects JSON with a ",[174,937,213],{}," field.",[167,940,942],{"className":621,"code":941,"language":623,"meta":172,"style":172},"private _remove = createHashMapFromArray [\n [\"plate\", _plate]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:remove\", [\n getPlayerUID player,\n toJSON _remove\n]];\n",[174,943,944,949,954,958,962,967,971,976],{"__ignoreMap":172},[177,945,946],{"class":179,"line":180},[177,947,948],{},"private _remove = createHashMapFromArray [\n",[177,950,951],{"class":179,"line":187},[177,952,953],{}," [\"plate\", _plate]\n",[177,955,956],{"class":179,"line":206},[177,957,717],{},[177,959,960],{"class":179,"line":231},[177,961,641],{"emptyLinePlaceholder":640},[177,963,964],{"class":179,"line":252},[177,965,966],{},"private _result = \"forge_server\" callExtension [\"garage:remove\", [\n",[177,968,969],{"class":179,"line":270},[177,970,767],{},[177,972,973],{"class":179,"line":287},[177,974,975],{}," toJSON _remove\n",[177,977,978],{"class":179,"line":301},[177,979,779],{},[159,981,983],{"id":982},"spawn-a-stored-vehicle","Spawn a Stored Vehicle",[167,985,987],{"className":621,"code":986,"language":623,"meta":172,"style":172},"fnc_spawnGarageVehicle = {\n params [\"_plate\"];\n\n private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load garage: %1\", _payload];\n objNull\n };\n\n private _garage = fromJSON _payload;\n private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n if (_vehicleData isEqualTo createHashMap) exitWith {\n hint \"Vehicle plate was not found in your garage.\";\n objNull\n };\n\n private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n\n private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n private _names = _hitPoints getOrDefault [\"names\", []];\n private _values = _hitPoints getOrDefault [\"values\", []];\n\n {\n _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n } forEach _names;\n\n private _remove = createHashMapFromArray [[\"plate\", _plate]];\n \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n\n _vehicle\n};\n",[174,988,989,994,999,1003,1008,1013,1017,1022,1027,1032,1036,1040,1045,1050,1055,1060,1064,1068,1072,1077,1082,1087,1092,1096,1101,1106,1112,1117,1123,1129,1135,1140,1146,1152,1157,1163],{"__ignoreMap":172},[177,990,991],{"class":179,"line":180},[177,992,993],{},"fnc_spawnGarageVehicle = {\n",[177,995,996],{"class":179,"line":187},[177,997,998],{}," params [\"_plate\"];\n",[177,1000,1001],{"class":179,"line":206},[177,1002,641],{"emptyLinePlaceholder":640},[177,1004,1005],{"class":179,"line":231},[177,1006,1007],{}," private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,1009,1010],{"class":179,"line":252},[177,1011,1012],{}," private _payload = _result select 0;\n",[177,1014,1015],{"class":179,"line":270},[177,1016,641],{"emptyLinePlaceholder":640},[177,1018,1019],{"class":179,"line":287},[177,1020,1021],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[177,1023,1024],{"class":179,"line":301},[177,1025,1026],{}," hint format [\"Failed to load garage: %1\", _payload];\n",[177,1028,1029],{"class":179,"line":327},[177,1030,1031],{}," objNull\n",[177,1033,1034],{"class":179,"line":350},[177,1035,852],{},[177,1037,1038],{"class":179,"line":370},[177,1039,641],{"emptyLinePlaceholder":640},[177,1041,1042],{"class":179,"line":376},[177,1043,1044],{}," private _garage = fromJSON _payload;\n",[177,1046,1047],{"class":179,"line":382},[177,1048,1049],{}," private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n",[177,1051,1052],{"class":179,"line":753},[177,1053,1054],{}," if (_vehicleData isEqualTo createHashMap) exitWith {\n",[177,1056,1057],{"class":179,"line":758},[177,1058,1059],{}," hint \"Vehicle plate was not found in your garage.\";\n",[177,1061,1062],{"class":179,"line":764},[177,1063,1031],{},[177,1065,1066],{"class":179,"line":770},[177,1067,852],{},[177,1069,1070],{"class":179,"line":776},[177,1071,641],{"emptyLinePlaceholder":640},[177,1073,1074],{"class":179,"line":782},[177,1075,1076],{}," private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n",[177,1078,1079],{"class":179,"line":787},[177,1080,1081],{}," _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n",[177,1083,1084],{"class":179,"line":792},[177,1085,1086],{}," _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n",[177,1088,1089],{"class":179,"line":797},[177,1090,1091],{}," _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n",[177,1093,1094],{"class":179,"line":803},[177,1095,641],{"emptyLinePlaceholder":640},[177,1097,1098],{"class":179,"line":808},[177,1099,1100],{}," private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n",[177,1102,1103],{"class":179,"line":813},[177,1104,1105],{}," private _names = _hitPoints getOrDefault [\"names\", []];\n",[177,1107,1109],{"class":179,"line":1108},26,[177,1110,1111],{}," private _values = _hitPoints getOrDefault [\"values\", []];\n",[177,1113,1115],{"class":179,"line":1114},27,[177,1116,641],{"emptyLinePlaceholder":640},[177,1118,1120],{"class":179,"line":1119},28,[177,1121,1122],{}," {\n",[177,1124,1126],{"class":179,"line":1125},29,[177,1127,1128],{}," _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n",[177,1130,1132],{"class":179,"line":1131},30,[177,1133,1134],{}," } forEach _names;\n",[177,1136,1138],{"class":179,"line":1137},31,[177,1139,641],{"emptyLinePlaceholder":640},[177,1141,1143],{"class":179,"line":1142},32,[177,1144,1145],{}," private _remove = createHashMapFromArray [[\"plate\", _plate]];\n",[177,1147,1149],{"class":179,"line":1148},33,[177,1150,1151],{}," \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n",[177,1153,1155],{"class":179,"line":1154},34,[177,1156,641],{"emptyLinePlaceholder":640},[177,1158,1160],{"class":179,"line":1159},35,[177,1161,1162],{}," _vehicle\n",[177,1164,1166],{"class":179,"line":1165},36,[177,1167,656],{},[159,1169,1171],{"id":1170},"hot-state","Hot State",[155,1173,1174,1175,1178,1179,1182],{},"The ",[174,1176,1177],{},"garage:hot:*"," commands keep a runtime copy of a player's garage and write\nit back only when ",[174,1180,1181],{},"garage:hot:save"," runs.",[459,1184,1185,1195],{},[462,1186,1187],{},[465,1188,1189,1191,1193],{},[468,1190,470],{},[468,1192,473],{},[468,1194,476],{},[478,1196,1197,1210,1223,1238,1253,1268,1281],{},[465,1198,1199,1204,1208],{},[483,1200,1201],{},[174,1202,1203],{},"garage:hot:init",[483,1205,1206],{},[174,1207,492],{},[483,1209,508],{},[465,1211,1212,1217,1221],{},[483,1213,1214],{},[174,1215,1216],{},"garage:hot:get",[483,1218,1219],{},[174,1220,492],{},[483,1222,508],{},[465,1224,1225,1230,1236],{},[483,1226,1227],{},[174,1228,1229],{},"garage:hot:override",[483,1231,1232,406,1234],{},[174,1233,492],{},[174,1235,538],{},[483,1237,508],{},[465,1239,1240,1245,1251],{},[483,1241,1242],{},[174,1243,1244],{},"garage:hot:add",[483,1246,1247,406,1249],{},[174,1248,492],{},[174,1250,521],{},[483,1252,508],{},[465,1254,1255,1260,1266],{},[483,1256,1257],{},[174,1258,1259],{},"garage:hot:remove_vehicle",[483,1261,1262,406,1264],{},[174,1263,492],{},[174,1265,569],{},[483,1267,508],{},[465,1269,1270,1274,1278],{},[483,1271,1272],{},[174,1273,1181],{},[483,1275,1276],{},[174,1277,492],{},[483,1279,1280],{},"Current hot vehicle map as JSON.",[465,1282,1283,1288,1292],{},[483,1284,1285],{},[174,1286,1287],{},"garage:hot:remove",[483,1289,1290],{},[174,1291,492],{},[483,1293,1294,416],{},[174,1295,587],{},[155,1297,1298],{},"Use hot state for session-heavy vehicle workflows. Use the durable commands for\nsimple store\u002Fretrieve operations.",[159,1300,1302],{"id":1301},"best-practices","Best Practices",[390,1304,1305,1311,1317,1322,1328],{},[393,1306,1307,1308,416],{},"Store the generated plate on spawned vehicles with ",[174,1309,1310],{},"setVariable",[393,1312,1313,1314,1316],{},"Use ",[174,1315,437],{}," for frequent fuel and damage syncs.",[393,1318,1313,1319,1321],{},[174,1320,531],{}," only when replacing the whole vehicle map intentionally.",[393,1323,1324,1325,1327],{},"Do not delete the world vehicle until ",[174,1326,400],{}," succeeds.",[393,1329,1330],{},"Treat vehicle maps as hash maps keyed by plate, not arrays.",[1332,1333,1334],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1336},[1337,1338,1339,1340,1341,1342,1343,1344,1345],{"id":161,"depth":187,"text":162},{"id":449,"depth":187,"text":450},{"id":610,"depth":187,"text":611},{"id":668,"depth":187,"text":669},{"id":860,"depth":187,"text":861},{"id":929,"depth":187,"text":930},{"id":982,"depth":187,"text":983},{"id":1170,"depth":187,"text":1171},{"id":1301,"depth":187,"text":1302},"md",null,{},{"title":73,"description":157},"EH_wB2YH4wCw-T1stsEVmDq0ztTnbpLjX9816UfP4Vk",[1352,1354],{"title":69,"path":70,"stem":71,"description":1353,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",{"title":77,"path":78,"stem":79,"description":1355,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/locker.html b/docus/dist/server-modules/locker.html new file mode 100644 index 0000000..a18bc22 --- /dev/null +++ b/docus/dist/server-modules/locker.html @@ -0,0 +1,214 @@ +Locker Usage Guide - forge-docus
Server Modules

Locker Usage Guide

The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +Owned Storage Usage Guide.

Locker Usage Guide

The locker module stores physical player inventory items by classname. It is +separate from the virtual arsenal unlock module documented in +Owned Storage Usage Guide.

Storage Model

Locker data is persisted through SurrealDB by the server extension.

{
+  "arifle_MX_F": {
+    "category": "weapon",
+    "classname": "arifle_MX_F",
+    "amount": 1
+  }
+}
+

Rules validated by the Rust service:

  • A locker can contain up to 25 unique classnames.
  • category and classname cannot be empty.
  • amount must be greater than 0.
  • locker:add creates an empty locker automatically when one does not exist.
  • locker:get, locker:patch, and locker:remove require an existing locker.
  • locker:remove takes the classname directly, not a JSON object.

Commands

All commands are called on the locker group.

CommandArgumentsReturns
locker:createuidEmpty item map as JSON.
locker:getuidItem map as JSON.
locker:adduid, item_jsonUpdated item map as JSON.
locker:updateuid, items_jsonReplaced item map as JSON.
locker:patchuid, patch_jsonUpdated item map as JSON.
locker:removeuid, classnameUpdated item map as JSON.
locker:deleteuidOK.
locker:existsuidtrue or false.

Error Handling

Every command returns a string payload. Always check for the Error: prefix +before parsing JSON.

private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Locker error: %1", _payload];
+};
+
+private _locker = fromJSON _payload;
+

Add an Item

locker:add creates or overwrites one classname entry.

private _item = createHashMapFromArray [
+    ["category", "weapon"],
+    ["classname", "arifle_MX_F"],
+    ["amount", 1]
+];
+
+private _result = "forge_server" callExtension ["locker:add", [
+    getPlayerUID player,
+    toJSON _item
+]];
+
+private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    hint format ["Failed to store item: %1", _payload];
+};
+
+private _locker = fromJSON _payload;
+

Patch an Amount

locker:patch currently patches the amount field for an existing classname.

private _patch = createHashMapFromArray [
+    ["classname", "arifle_MX_F"],
+    ["amount", 5]
+];
+
+private _result = "forge_server" callExtension ["locker:patch", [
+    getPlayerUID player,
+    toJSON _patch
+]];
+

Remove an Item

locker:remove takes the classname as the second argument.

private _result = "forge_server" callExtension ["locker:remove", [
+    getPlayerUID player,
+    "arifle_MX_F"
+]];
+

Retrieve an Item

fnc_retrieveLockerItem = {
+    params ["_classname"];
+
+    private _result = "forge_server" callExtension ["locker:get", [getPlayerUID player]];
+    private _payload = _result select 0;
+
+    if (_payload find "Error:" == 0) exitWith {
+        hint format ["Failed to load locker: %1", _payload];
+        false
+    };
+
+    private _locker = fromJSON _payload;
+    private _item = _locker getOrDefault [_classname, createHashMap];
+    if (_item isEqualTo createHashMap) exitWith {
+        hint "Item was not found in your locker.";
+        false
+    };
+
+    private _amount = _item getOrDefault ["amount", 0];
+    if (_amount <= 0) exitWith {
+        hint "Item is out of stock.";
+        false
+    };
+
+    if !(player canAdd _classname) exitWith {
+        hint "Not enough inventory space.";
+        false
+    };
+
+    player addItem _classname;
+
+    if (_amount > 1) then {
+        private _patch = createHashMapFromArray [
+            ["classname", _classname],
+            ["amount", _amount - 1]
+        ];
+        "forge_server" callExtension ["locker:patch", [getPlayerUID player, toJSON _patch]];
+    } else {
+        "forge_server" callExtension ["locker:remove", [getPlayerUID player, _classname]];
+    };
+
+    true
+};
+

Replace the Whole Locker

locker:update replaces the whole item map. Use it for explicit bulk syncs, +not single-item changes.

private _items = createHashMapFromArray [
+    ["arifle_MX_F", createHashMapFromArray [
+        ["category", "weapon"],
+        ["classname", "arifle_MX_F"],
+        ["amount", 1]
+    ]]
+];
+
+private _result = "forge_server" callExtension ["locker:update", [
+    getPlayerUID player,
+    toJSON _items
+]];
+

Hot State

The locker:hot:* commands keep a runtime copy of a player's locker and write +it back only when locker:hot:save runs.

CommandArgumentsReturns
locker:hot:inituidItem map as JSON.
locker:hot:getuidItem map as JSON.
locker:hot:overrideuid, items_jsonItem map as JSON.
locker:hot:saveuidCurrent hot item map as JSON.
locker:hot:removeuidOK.

Use hot state for session-heavy locker workflows. Use the durable commands for +simple item deposits and withdrawals.

Best Practices

  • Keep categories normalized, for example weapon, magazine, item, or +backpack.
  • Use locker:patch for quantity changes.
  • Use locker:remove when quantity reaches zero.
  • Treat the locker response as a hash map keyed by classname.
  • Check capacity before bulk operations that may exceed 25 unique items.
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/locker/_payload.json b/docus/dist/server-modules/locker/_payload.json new file mode 100644 index 0000000..26ae8fb --- /dev/null +++ b/docus/dist/server-modules/locker/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1212},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-locker":145,"-server-modules-locker-surround":1207},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":77,"body":147,"description":1201,"extension":1202,"links":1203,"meta":1204,"navigation":525,"path":78,"seo":1205,"stem":79,"__hash__":1206},"docs\u002F3.server-modules\u002F6.locker.md",{"type":148,"value":149,"toc":1189},"minimark",[150,154,162,167,170,282,285,333,337,344,493,497,504,552,556,561,653,657,665,710,714,719,742,746,976,980,985,1046,1050,1061,1144,1147,1151,1185],[151,152,77],"h1",{"id":153},"locker-usage-guide",[155,156,157,158,161],"p",{},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\n",[159,160,85],"a",{"href":86},".",[163,164,166],"h2",{"id":165},"storage-model","Storage Model",[155,168,169],{},"Locker data is persisted through SurrealDB by the server extension.",[171,172,177],"pre",{"className":173,"code":174,"language":175,"meta":176,"style":176},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"arifle_MX_F\": {\n \"category\": \"weapon\",\n \"classname\": \"arifle_MX_F\",\n \"amount\": 1\n }\n}\n","json","",[178,179,180,189,208,234,254,270,276],"code",{"__ignoreMap":176},[181,182,185],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"sMK4o","{\n",[181,190,192,195,199,202,205],{"class":183,"line":191},2,[181,193,194],{"class":187}," \"",[181,196,198],{"class":197},"spNyl","arifle_MX_F",[181,200,201],{"class":187},"\"",[181,203,204],{"class":187},":",[181,206,207],{"class":187}," {\n",[181,209,211,214,218,220,222,225,229,231],{"class":183,"line":210},3,[181,212,213],{"class":187}," \"",[181,215,217],{"class":216},"sBMFI","category",[181,219,201],{"class":187},[181,221,204],{"class":187},[181,223,224],{"class":187}," \"",[181,226,228],{"class":227},"sfazB","weapon",[181,230,201],{"class":187},[181,232,233],{"class":187},",\n",[181,235,237,239,242,244,246,248,250,252],{"class":183,"line":236},4,[181,238,213],{"class":187},[181,240,241],{"class":216},"classname",[181,243,201],{"class":187},[181,245,204],{"class":187},[181,247,224],{"class":187},[181,249,198],{"class":227},[181,251,201],{"class":187},[181,253,233],{"class":187},[181,255,257,259,262,264,266],{"class":183,"line":256},5,[181,258,213],{"class":187},[181,260,261],{"class":216},"amount",[181,263,201],{"class":187},[181,265,204],{"class":187},[181,267,269],{"class":268},"sbssI"," 1\n",[181,271,273],{"class":183,"line":272},6,[181,274,275],{"class":187}," }\n",[181,277,279],{"class":183,"line":278},7,[181,280,281],{"class":187},"}\n",[155,283,284],{},"Rules validated by the Rust service:",[286,287,288,292,300,308,314,328],"ul",{},[289,290,291],"li",{},"A locker can contain up to 25 unique classnames.",[289,293,294,296,297,299],{},[178,295,217],{}," and ",[178,298,241],{}," cannot be empty.",[289,301,302,304,305,161],{},[178,303,261],{}," must be greater than ",[178,306,307],{},"0",[289,309,310,313],{},[178,311,312],{},"locker:add"," creates an empty locker automatically when one does not exist.",[289,315,316,319,320,323,324,327],{},[178,317,318],{},"locker:get",", ",[178,321,322],{},"locker:patch",", and ",[178,325,326],{},"locker:remove"," require an existing locker.",[289,329,330,332],{},[178,331,326],{}," takes the classname directly, not a JSON object.",[163,334,336],{"id":335},"commands","Commands",[155,338,339,340,343],{},"All commands are called on the ",[178,341,342],{},"locker"," group.",[345,346,347,363],"table",{},[348,349,350],"thead",{},[351,352,353,357,360],"tr",{},[354,355,356],"th",{},"Command",[354,358,359],{},"Arguments",[354,361,362],{},"Returns",[364,365,366,382,395,411,428,443,457,473],"tbody",{},[351,367,368,374,379],{},[369,370,371],"td",{},[178,372,373],{},"locker:create",[369,375,376],{},[178,377,378],{},"uid",[369,380,381],{},"Empty item map as JSON.",[351,383,384,388,392],{},[369,385,386],{},[178,387,318],{},[369,389,390],{},[178,391,378],{},[369,393,394],{},"Item map as JSON.",[351,396,397,401,408],{},[369,398,399],{},[178,400,312],{},[369,402,403,319,405],{},[178,404,378],{},[178,406,407],{},"item_json",[369,409,410],{},"Updated item map as JSON.",[351,412,413,418,425],{},[369,414,415],{},[178,416,417],{},"locker:update",[369,419,420,319,422],{},[178,421,378],{},[178,423,424],{},"items_json",[369,426,427],{},"Replaced item map as JSON.",[351,429,430,434,441],{},[369,431,432],{},[178,433,322],{},[369,435,436,319,438],{},[178,437,378],{},[178,439,440],{},"patch_json",[369,442,410],{},[351,444,445,449,455],{},[369,446,447],{},[178,448,326],{},[369,450,451,319,453],{},[178,452,378],{},[178,454,241],{},[369,456,410],{},[351,458,459,464,468],{},[369,460,461],{},[178,462,463],{},"locker:delete",[369,465,466],{},[178,467,378],{},[369,469,470,161],{},[178,471,472],{},"OK",[351,474,475,480,484],{},[369,476,477],{},[178,478,479],{},"locker:exists",[369,481,482],{},[178,483,378],{},[369,485,486,489,490,161],{},[178,487,488],{},"true"," or ",[178,491,492],{},"false",[163,494,496],{"id":495},"error-handling","Error Handling",[155,498,499,500,503],{},"Every command returns a string payload. Always check for the ",[178,501,502],{},"Error:"," prefix\nbefore parsing JSON.",[171,505,509],{"className":506,"code":507,"language":508,"meta":176,"style":176},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Locker error: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n","sqf",[178,510,511,516,521,527,532,537,542,546],{"__ignoreMap":176},[181,512,513],{"class":183,"line":184},[181,514,515],{},"private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,517,518],{"class":183,"line":191},[181,519,520],{},"private _payload = _result select 0;\n",[181,522,523],{"class":183,"line":210},[181,524,526],{"emptyLinePlaceholder":525},true,"\n",[181,528,529],{"class":183,"line":236},[181,530,531],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[181,533,534],{"class":183,"line":256},[181,535,536],{}," systemChat format [\"Locker error: %1\", _payload];\n",[181,538,539],{"class":183,"line":272},[181,540,541],{},"};\n",[181,543,544],{"class":183,"line":278},[181,545,526],{"emptyLinePlaceholder":525},[181,547,549],{"class":183,"line":548},8,[181,550,551],{},"private _locker = fromJSON _payload;\n",[163,553,555],{"id":554},"add-an-item","Add an Item",[155,557,558,560],{},[178,559,312],{}," creates or overwrites one classname entry.",[171,562,564],{"className":506,"code":563,"language":508,"meta":176,"style":176},"private _item = createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:add\", [\n getPlayerUID player,\n toJSON _item\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store item: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n",[178,565,566,571,576,581,586,591,595,600,605,611,617,622,627,632,638,643,648],{"__ignoreMap":176},[181,567,568],{"class":183,"line":184},[181,569,570],{},"private _item = createHashMapFromArray [\n",[181,572,573],{"class":183,"line":191},[181,574,575],{}," [\"category\", \"weapon\"],\n",[181,577,578],{"class":183,"line":210},[181,579,580],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,582,583],{"class":183,"line":236},[181,584,585],{}," [\"amount\", 1]\n",[181,587,588],{"class":183,"line":256},[181,589,590],{},"];\n",[181,592,593],{"class":183,"line":272},[181,594,526],{"emptyLinePlaceholder":525},[181,596,597],{"class":183,"line":278},[181,598,599],{},"private _result = \"forge_server\" callExtension [\"locker:add\", [\n",[181,601,602],{"class":183,"line":548},[181,603,604],{}," getPlayerUID player,\n",[181,606,608],{"class":183,"line":607},9,[181,609,610],{}," toJSON _item\n",[181,612,614],{"class":183,"line":613},10,[181,615,616],{},"]];\n",[181,618,620],{"class":183,"line":619},11,[181,621,526],{"emptyLinePlaceholder":525},[181,623,625],{"class":183,"line":624},12,[181,626,520],{},[181,628,630],{"class":183,"line":629},13,[181,631,531],{},[181,633,635],{"class":183,"line":634},14,[181,636,637],{}," hint format [\"Failed to store item: %1\", _payload];\n",[181,639,641],{"class":183,"line":640},15,[181,642,541],{},[181,644,646],{"class":183,"line":645},16,[181,647,526],{"emptyLinePlaceholder":525},[181,649,651],{"class":183,"line":650},17,[181,652,551],{},[163,654,656],{"id":655},"patch-an-amount","Patch an Amount",[155,658,659,661,662,664],{},[178,660,322],{}," currently patches the ",[178,663,261],{}," field for an existing classname.",[171,666,668],{"className":506,"code":667,"language":508,"meta":176,"style":176},"private _patch = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 5]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[178,669,670,675,679,684,688,692,697,701,706],{"__ignoreMap":176},[181,671,672],{"class":183,"line":184},[181,673,674],{},"private _patch = createHashMapFromArray [\n",[181,676,677],{"class":183,"line":191},[181,678,580],{},[181,680,681],{"class":183,"line":210},[181,682,683],{}," [\"amount\", 5]\n",[181,685,686],{"class":183,"line":236},[181,687,590],{},[181,689,690],{"class":183,"line":256},[181,691,526],{"emptyLinePlaceholder":525},[181,693,694],{"class":183,"line":272},[181,695,696],{},"private _result = \"forge_server\" callExtension [\"locker:patch\", [\n",[181,698,699],{"class":183,"line":278},[181,700,604],{},[181,702,703],{"class":183,"line":548},[181,704,705],{}," toJSON _patch\n",[181,707,708],{"class":183,"line":607},[181,709,616],{},[163,711,713],{"id":712},"remove-an-item","Remove an Item",[155,715,716,718],{},[178,717,326],{}," takes the classname as the second argument.",[171,720,722],{"className":506,"code":721,"language":508,"meta":176,"style":176},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n getPlayerUID player,\n \"arifle_MX_F\"\n]];\n",[178,723,724,729,733,738],{"__ignoreMap":176},[181,725,726],{"class":183,"line":184},[181,727,728],{},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n",[181,730,731],{"class":183,"line":191},[181,732,604],{},[181,734,735],{"class":183,"line":210},[181,736,737],{}," \"arifle_MX_F\"\n",[181,739,740],{"class":183,"line":236},[181,741,616],{},[163,743,745],{"id":744},"retrieve-an-item","Retrieve an Item",[171,747,749],{"className":506,"code":748,"language":508,"meta":176,"style":176},"fnc_retrieveLockerItem = {\n params [\"_classname\"];\n\n private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load locker: %1\", _payload];\n false\n };\n\n private _locker = fromJSON _payload;\n private _item = _locker getOrDefault [_classname, createHashMap];\n if (_item isEqualTo createHashMap) exitWith {\n hint \"Item was not found in your locker.\";\n false\n };\n\n private _amount = _item getOrDefault [\"amount\", 0];\n if (_amount \u003C= 0) exitWith {\n hint \"Item is out of stock.\";\n false\n };\n\n if !(player canAdd _classname) exitWith {\n hint \"Not enough inventory space.\";\n false\n };\n\n player addItem _classname;\n\n if (_amount > 1) then {\n private _patch = createHashMapFromArray [\n [\"classname\", _classname],\n [\"amount\", _amount - 1]\n ];\n \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n } else {\n \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n };\n\n true\n};\n",[178,750,751,756,761,765,770,775,779,784,789,794,799,803,808,813,818,823,827,831,836,842,848,854,859,864,869,875,881,886,891,896,902,907,913,919,925,931,937,943,949,955,960,965,971],{"__ignoreMap":176},[181,752,753],{"class":183,"line":184},[181,754,755],{},"fnc_retrieveLockerItem = {\n",[181,757,758],{"class":183,"line":191},[181,759,760],{}," params [\"_classname\"];\n",[181,762,763],{"class":183,"line":210},[181,764,526],{"emptyLinePlaceholder":525},[181,766,767],{"class":183,"line":236},[181,768,769],{}," private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,771,772],{"class":183,"line":256},[181,773,774],{}," private _payload = _result select 0;\n",[181,776,777],{"class":183,"line":272},[181,778,526],{"emptyLinePlaceholder":525},[181,780,781],{"class":183,"line":278},[181,782,783],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[181,785,786],{"class":183,"line":548},[181,787,788],{}," hint format [\"Failed to load locker: %1\", _payload];\n",[181,790,791],{"class":183,"line":607},[181,792,793],{}," false\n",[181,795,796],{"class":183,"line":613},[181,797,798],{}," };\n",[181,800,801],{"class":183,"line":619},[181,802,526],{"emptyLinePlaceholder":525},[181,804,805],{"class":183,"line":624},[181,806,807],{}," private _locker = fromJSON _payload;\n",[181,809,810],{"class":183,"line":629},[181,811,812],{}," private _item = _locker getOrDefault [_classname, createHashMap];\n",[181,814,815],{"class":183,"line":634},[181,816,817],{}," if (_item isEqualTo createHashMap) exitWith {\n",[181,819,820],{"class":183,"line":640},[181,821,822],{}," hint \"Item was not found in your locker.\";\n",[181,824,825],{"class":183,"line":645},[181,826,793],{},[181,828,829],{"class":183,"line":650},[181,830,798],{},[181,832,834],{"class":183,"line":833},18,[181,835,526],{"emptyLinePlaceholder":525},[181,837,839],{"class":183,"line":838},19,[181,840,841],{}," private _amount = _item getOrDefault [\"amount\", 0];\n",[181,843,845],{"class":183,"line":844},20,[181,846,847],{}," if (_amount \u003C= 0) exitWith {\n",[181,849,851],{"class":183,"line":850},21,[181,852,853],{}," hint \"Item is out of stock.\";\n",[181,855,857],{"class":183,"line":856},22,[181,858,793],{},[181,860,862],{"class":183,"line":861},23,[181,863,798],{},[181,865,867],{"class":183,"line":866},24,[181,868,526],{"emptyLinePlaceholder":525},[181,870,872],{"class":183,"line":871},25,[181,873,874],{}," if !(player canAdd _classname) exitWith {\n",[181,876,878],{"class":183,"line":877},26,[181,879,880],{}," hint \"Not enough inventory space.\";\n",[181,882,884],{"class":183,"line":883},27,[181,885,793],{},[181,887,889],{"class":183,"line":888},28,[181,890,798],{},[181,892,894],{"class":183,"line":893},29,[181,895,526],{"emptyLinePlaceholder":525},[181,897,899],{"class":183,"line":898},30,[181,900,901],{}," player addItem _classname;\n",[181,903,905],{"class":183,"line":904},31,[181,906,526],{"emptyLinePlaceholder":525},[181,908,910],{"class":183,"line":909},32,[181,911,912],{}," if (_amount > 1) then {\n",[181,914,916],{"class":183,"line":915},33,[181,917,918],{}," private _patch = createHashMapFromArray [\n",[181,920,922],{"class":183,"line":921},34,[181,923,924],{}," [\"classname\", _classname],\n",[181,926,928],{"class":183,"line":927},35,[181,929,930],{}," [\"amount\", _amount - 1]\n",[181,932,934],{"class":183,"line":933},36,[181,935,936],{}," ];\n",[181,938,940],{"class":183,"line":939},37,[181,941,942],{}," \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n",[181,944,946],{"class":183,"line":945},38,[181,947,948],{}," } else {\n",[181,950,952],{"class":183,"line":951},39,[181,953,954],{}," \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n",[181,956,958],{"class":183,"line":957},40,[181,959,798],{},[181,961,963],{"class":183,"line":962},41,[181,964,526],{"emptyLinePlaceholder":525},[181,966,968],{"class":183,"line":967},42,[181,969,970],{}," true\n",[181,972,974],{"class":183,"line":973},43,[181,975,541],{},[163,977,979],{"id":978},"replace-the-whole-locker","Replace the Whole Locker",[155,981,982,984],{},[178,983,417],{}," replaces the whole item map. Use it for explicit bulk syncs,\nnot single-item changes.",[171,986,988],{"className":506,"code":987,"language":508,"meta":176,"style":176},"private _items = createHashMapFromArray [\n [\"arifle_MX_F\", createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n ]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:update\", [\n getPlayerUID player,\n toJSON _items\n]];\n",[178,989,990,995,1000,1005,1010,1015,1020,1024,1028,1033,1037,1042],{"__ignoreMap":176},[181,991,992],{"class":183,"line":184},[181,993,994],{},"private _items = createHashMapFromArray [\n",[181,996,997],{"class":183,"line":191},[181,998,999],{}," [\"arifle_MX_F\", createHashMapFromArray [\n",[181,1001,1002],{"class":183,"line":210},[181,1003,1004],{}," [\"category\", \"weapon\"],\n",[181,1006,1007],{"class":183,"line":236},[181,1008,1009],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,1011,1012],{"class":183,"line":256},[181,1013,1014],{}," [\"amount\", 1]\n",[181,1016,1017],{"class":183,"line":272},[181,1018,1019],{}," ]]\n",[181,1021,1022],{"class":183,"line":278},[181,1023,590],{},[181,1025,1026],{"class":183,"line":548},[181,1027,526],{"emptyLinePlaceholder":525},[181,1029,1030],{"class":183,"line":607},[181,1031,1032],{},"private _result = \"forge_server\" callExtension [\"locker:update\", [\n",[181,1034,1035],{"class":183,"line":613},[181,1036,604],{},[181,1038,1039],{"class":183,"line":619},[181,1040,1041],{}," toJSON _items\n",[181,1043,1044],{"class":183,"line":624},[181,1045,616],{},[163,1047,1049],{"id":1048},"hot-state","Hot State",[155,1051,1052,1053,1056,1057,1060],{},"The ",[178,1054,1055],{},"locker:hot:*"," commands keep a runtime copy of a player's locker and write\nit back only when ",[178,1058,1059],{},"locker:hot:save"," runs.",[345,1062,1063,1073],{},[348,1064,1065],{},[351,1066,1067,1069,1071],{},[354,1068,356],{},[354,1070,359],{},[354,1072,362],{},[364,1074,1075,1088,1101,1116,1129],{},[351,1076,1077,1082,1086],{},[369,1078,1079],{},[178,1080,1081],{},"locker:hot:init",[369,1083,1084],{},[178,1085,378],{},[369,1087,394],{},[351,1089,1090,1095,1099],{},[369,1091,1092],{},[178,1093,1094],{},"locker:hot:get",[369,1096,1097],{},[178,1098,378],{},[369,1100,394],{},[351,1102,1103,1108,1114],{},[369,1104,1105],{},[178,1106,1107],{},"locker:hot:override",[369,1109,1110,319,1112],{},[178,1111,378],{},[178,1113,424],{},[369,1115,394],{},[351,1117,1118,1122,1126],{},[369,1119,1120],{},[178,1121,1059],{},[369,1123,1124],{},[178,1125,378],{},[369,1127,1128],{},"Current hot item map as JSON.",[351,1130,1131,1136,1140],{},[369,1132,1133],{},[178,1134,1135],{},"locker:hot:remove",[369,1137,1138],{},[178,1139,378],{},[369,1141,1142,161],{},[178,1143,472],{},[155,1145,1146],{},"Use hot state for session-heavy locker workflows. Use the durable commands for\nsimple item deposits and withdrawals.",[163,1148,1150],{"id":1149},"best-practices","Best Practices",[286,1152,1153,1168,1174,1179,1182],{},[289,1154,1155,1156,319,1158,319,1161,1164,1165,161],{},"Keep categories normalized, for example ",[178,1157,228],{},[178,1159,1160],{},"magazine",[178,1162,1163],{},"item",", or\n",[178,1166,1167],{},"backpack",[289,1169,1170,1171,1173],{},"Use ",[178,1172,322],{}," for quantity changes.",[289,1175,1170,1176,1178],{},[178,1177,326],{}," when quantity reaches zero.",[289,1180,1181],{},"Treat the locker response as a hash map keyed by classname.",[289,1183,1184],{},"Check capacity before bulk operations that may exceed 25 unique items.",[1186,1187,1188],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":176,"searchDepth":191,"depth":191,"links":1190},[1191,1192,1193,1194,1195,1196,1197,1198,1199,1200],{"id":165,"depth":191,"text":166},{"id":335,"depth":191,"text":336},{"id":495,"depth":191,"text":496},{"id":554,"depth":191,"text":555},{"id":655,"depth":191,"text":656},{"id":712,"depth":191,"text":713},{"id":744,"depth":191,"text":745},{"id":978,"depth":191,"text":979},{"id":1048,"depth":191,"text":1049},{"id":1149,"depth":191,"text":1150},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.","md",null,{},{"title":77,"description":1201},"yRC1-bz2AkCaQBkRxr04sEYnq81grmtAwyDVDqAvkaM",[1208,1210],{"title":73,"path":74,"stem":75,"description":1209,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",{"title":81,"path":82,"stem":83,"description":1211,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/organization.html b/docus/dist/server-modules/organization.html new file mode 100644 index 0000000..95fe49f --- /dev/null +++ b/docus/dist/server-modules/organization.html @@ -0,0 +1,230 @@ +Organization Usage Guide - forge-docus
Server Modules

Organization Usage Guide

The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows.

Organization Usage Guide

The organization module stores organization records, members, assets, fleet +entries, and credit lines. Durable commands manage persisted records directly. +Hot-state commands support the active organization UI workflows.

Storage Model

Core organization:

{
+  "id": "default",
+  "owner": "server",
+  "name": "Default Organization",
+  "funds": 0.0,
+  "reputation": 0,
+  "credit_lines": {}
+}
+

Hot organization:

{
+  "id": "default",
+  "owner": "server",
+  "name": "Default Organization",
+  "funds": 0.0,
+  "reputation": 0,
+  "credit_lines": {},
+  "assets": {},
+  "fleet": {},
+  "members": {},
+  "pending_invites": {}
+}
+

Rules validated by the Rust service:

  • id must be non-empty and contain only alphanumeric characters or _.
  • owner must be server or a 17-digit Steam UID.
  • name cannot be empty, cannot exceed 100 characters, and cannot contain +control characters.
  • funds, reputation, and credit line amounts cannot be negative.
  • Player registration is rejected when the player already belongs to a +non-default organization.

Durable Commands

CommandArgumentsReturns
org:createorg_id, org_jsonOrganization JSON.
org:getorg_idOrganization JSON.
org:updateorg_id, patch_jsonUpdated organization JSON.
org:existsorg_idtrue or false.
org:deleteorg_idOK.
org:assets:getorg_idAsset map JSON.
org:assets:updateorg_id, assets_jsonUpdated asset map JSON.
org:fleet:getorg_idFleet map JSON.
org:fleet:updateorg_id, fleet_jsonUpdated fleet map JSON.
org:members:getorg_idMember array JSON.
org:members:addorg_id, member_uidOK.
org:members:removeorg_id, member_uidOK.

Create an Organization

The command key is authoritative for id.

private _org = createHashMapFromArray [
+    ["id", _orgId],
+    ["owner", getPlayerUID player],
+    ["name", "Spearnet Logistics"],
+    ["funds", 0],
+    ["reputation", 0],
+    ["credit_lines", createHashMap]
+];
+
+private _result = "forge_server" callExtension ["org:create", [
+    _orgId,
+    toJSON _org
+]];
+

Update Organization Funds

private _patch = createHashMapFromArray [
+    ["funds", 5000],
+    ["reputation", 10]
+];
+
+private _result = "forge_server" callExtension ["org:update", [
+    _orgId,
+    toJSON _patch
+]];
+

Supported durable patch fields are id, owner, name, funds, +reputation, and credit_lines.

Assets and Fleet

Assets are grouped by category, then classname.

private _assets = createHashMapFromArray [
+    ["ammo", createHashMapFromArray [
+        ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [
+            ["classname", "ACE_30Rnd_65x39_caseless_mag"],
+            ["type", "ammo"],
+            ["quantity", 20]
+        ]]
+    ]]
+];
+
+"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]];
+

Fleet is keyed by an internal fleet entry ID.

private _fleet = createHashMapFromArray [
+    ["B_Truck_01_transport_F_0", createHashMapFromArray [
+        ["classname", "B_Truck_01_transport_F"],
+        ["name", "Transport Truck"],
+        ["type", "cars"],
+        ["status", "Ready"],
+        ["damage", "0%"]
+    ]]
+];
+
+"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]];
+

Hot-State Commands

CommandArgumentsReturns
org:hot:initorg_idHot organization JSON.
org:hot:getorg_idHot organization JSON.
org:hot:overrideorg_id, hot_org_jsonHot organization JSON.
org:hot:ensure_membercontext_jsonHot organization JSON.
org:hot:member_invitesmember_uidInvite array JSON.
org:hot:registercontext_jsonRegister result JSON.
org:hot:invite_membercontext_jsonInvite result JSON.
org:hot:accept_invitecontext_jsonInvite decision result JSON.
org:hot:decline_invitecontext_jsonInvite decision result JSON.
org:hot:assign_credit_linecontext_jsonMutation result JSON.
org:hot:repay_credit_linecontext_jsonRepayment result JSON.
org:hot:charge_checkoutcontext_jsonMutation result JSON.
org:hot:add_assetscontext_json, assets_jsonMutation result JSON.
org:hot:add_fleetcontext_json, fleet_jsonMutation result JSON.
org:hot:leavecontext_jsonLeave result JSON.
org:hot:disbandcontext_jsonDisband result JSON.
org:hot:saveorg_idCurrent hot organization JSON and async durable save.
org:hot:removeorg_idOK.

Register from UI Context

private _context = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["requesterName", name player],
+    ["orgId", _orgId],
+    ["orgName", "Spearnet Logistics"],
+    ["existingOrgId", "default"]
+];
+
+private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]];
+

Invite and Accept

private _invite = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["requesterName", name player],
+    ["orgId", _orgId],
+    ["requesterIsDefaultOrgCeo", false],
+    ["targetUid", _targetUid],
+    ["targetName", _targetName],
+    ["targetOrgId", "default"]
+];
+
+"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]];
+
+private _decision = createHashMapFromArray [
+    ["requesterUid", _targetUid],
+    ["requesterName", _targetName],
+    ["orgId", _orgId],
+    ["existingOrgId", "default"]
+];
+
+"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]];
+

Credit Line Checkout

private _credit = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["orgId", _orgId],
+    ["requesterIsDefaultOrgCeo", false],
+    ["memberUid", _memberUid],
+    ["memberName", _memberName],
+    ["amount", 1000]
+];
+
+"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]];
+
+private _charge = createHashMapFromArray [
+    ["requesterUid", _memberUid],
+    ["orgId", _orgId],
+    ["requesterIsDefaultOrgCeo", false],
+    ["source", "credit_line"],
+    ["amount", 250],
+    ["commit", true]
+];
+
+"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]];
+

Error Handling

private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Organization error: %1", _payload];
+};
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/organization/_payload.json b/docus/dist/server-modules/organization/_payload.json new file mode 100644 index 0000000..5289186 --- /dev/null +++ b/docus/dist/server-modules/organization/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1602},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-organization":145,"-server-modules-organization-surround":1597},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":81,"body":147,"description":157,"extension":1592,"links":1593,"meta":1594,"navigation":798,"path":82,"seo":1595,"stem":83,"__hash__":1596},"docs\u002F3.server-modules\u002F7.organization.md",{"type":148,"value":149,"toc":1580},"minimark",[150,154,158,163,166,311,314,478,481,515,519,738,742,747,821,825,871,887,891,894,952,955,1012,1016,1284,1288,1336,1340,1442,1446,1547,1551,1576],[151,152,81],"h1",{"id":153},"organization-usage-guide",[155,156,157],"p",{},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Core organization:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {}\n}\n","json","",[174,175,176,185,213,234,255,273,290,305],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","id",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","default",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"owner",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"server",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,248,251,253],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"name",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,203],{"class":183},[177,249,250],{"class":206},"Default Organization",[177,252,197],{"class":183},[177,254,212],{"class":183},[177,256,258,260,263,265,267,271],{"class":179,"line":257},5,[177,259,190],{"class":183},[177,261,262],{"class":193},"funds",[177,264,197],{"class":183},[177,266,200],{"class":183},[177,268,270],{"class":269},"sbssI"," 0.0",[177,272,212],{"class":183},[177,274,276,278,281,283,285,288],{"class":179,"line":275},6,[177,277,190],{"class":183},[177,279,280],{"class":193},"reputation",[177,282,197],{"class":183},[177,284,200],{"class":183},[177,286,287],{"class":269}," 0",[177,289,212],{"class":183},[177,291,293,295,298,300,302],{"class":179,"line":292},7,[177,294,190],{"class":183},[177,296,297],{"class":193},"credit_lines",[177,299,197],{"class":183},[177,301,200],{"class":183},[177,303,304],{"class":183}," {}\n",[177,306,308],{"class":179,"line":307},8,[177,309,310],{"class":183},"}\n",[155,312,313],{},"Hot organization:",[167,315,317],{"className":169,"code":316,"language":171,"meta":172,"style":172},"{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {},\n \"assets\": {},\n \"fleet\": {},\n \"members\": {},\n \"pending_invites\": {}\n}\n",[174,318,319,323,341,359,377,391,405,418,431,445,459,473],{"__ignoreMap":172},[177,320,321],{"class":179,"line":180},[177,322,184],{"class":183},[177,324,325,327,329,331,333,335,337,339],{"class":179,"line":187},[177,326,190],{"class":183},[177,328,194],{"class":193},[177,330,197],{"class":183},[177,332,200],{"class":183},[177,334,203],{"class":183},[177,336,207],{"class":206},[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,343,345,347,349,351,353,355,357],{"class":179,"line":215},[177,344,190],{"class":183},[177,346,220],{"class":193},[177,348,197],{"class":183},[177,350,200],{"class":183},[177,352,203],{"class":183},[177,354,229],{"class":206},[177,356,197],{"class":183},[177,358,212],{"class":183},[177,360,361,363,365,367,369,371,373,375],{"class":179,"line":236},[177,362,190],{"class":183},[177,364,241],{"class":193},[177,366,197],{"class":183},[177,368,200],{"class":183},[177,370,203],{"class":183},[177,372,250],{"class":206},[177,374,197],{"class":183},[177,376,212],{"class":183},[177,378,379,381,383,385,387,389],{"class":179,"line":257},[177,380,190],{"class":183},[177,382,262],{"class":193},[177,384,197],{"class":183},[177,386,200],{"class":183},[177,388,270],{"class":269},[177,390,212],{"class":183},[177,392,393,395,397,399,401,403],{"class":179,"line":275},[177,394,190],{"class":183},[177,396,280],{"class":193},[177,398,197],{"class":183},[177,400,200],{"class":183},[177,402,287],{"class":269},[177,404,212],{"class":183},[177,406,407,409,411,413,415],{"class":179,"line":292},[177,408,190],{"class":183},[177,410,297],{"class":193},[177,412,197],{"class":183},[177,414,200],{"class":183},[177,416,417],{"class":183}," {},\n",[177,419,420,422,425,427,429],{"class":179,"line":307},[177,421,190],{"class":183},[177,423,424],{"class":193},"assets",[177,426,197],{"class":183},[177,428,200],{"class":183},[177,430,417],{"class":183},[177,432,434,436,439,441,443],{"class":179,"line":433},9,[177,435,190],{"class":183},[177,437,438],{"class":193},"fleet",[177,440,197],{"class":183},[177,442,200],{"class":183},[177,444,417],{"class":183},[177,446,448,450,453,455,457],{"class":179,"line":447},10,[177,449,190],{"class":183},[177,451,452],{"class":193},"members",[177,454,197],{"class":183},[177,456,200],{"class":183},[177,458,417],{"class":183},[177,460,462,464,467,469,471],{"class":179,"line":461},11,[177,463,190],{"class":183},[177,465,466],{"class":193},"pending_invites",[177,468,197],{"class":183},[177,470,200],{"class":183},[177,472,304],{"class":183},[177,474,476],{"class":179,"line":475},12,[177,477,310],{"class":183},[155,479,480],{},"Rules validated by the Rust service:",[482,483,484,494,502,507,512],"ul",{},[485,486,487,489,490,493],"li",{},[174,488,194],{}," must be non-empty and contain only alphanumeric characters or ",[174,491,492],{},"_",".",[485,495,496,498,499,501],{},[174,497,220],{}," must be ",[174,500,229],{}," or a 17-digit Steam UID.",[485,503,504,506],{},[174,505,241],{}," cannot be empty, cannot exceed 100 characters, and cannot contain\ncontrol characters.",[485,508,509,511],{},[174,510,262],{},", reputation, and credit line amounts cannot be negative.",[485,513,514],{},"Player registration is rejected when the player already belongs to a\nnon-default organization.",[159,516,518],{"id":517},"durable-commands","Durable Commands",[520,521,522,538],"table",{},[523,524,525],"thead",{},[526,527,528,532,535],"tr",{},[529,530,531],"th",{},"Command",[529,533,534],{},"Arguments",[529,536,537],{},"Returns",[539,540,541,561,574,591,611,627,641,658,672,689,703,721],"tbody",{},[526,542,543,549,558],{},[544,545,546],"td",{},[174,547,548],{},"org:create",[544,550,551,554,555],{},[174,552,553],{},"org_id",", ",[174,556,557],{},"org_json",[544,559,560],{},"Organization JSON.",[526,562,563,568,572],{},[544,564,565],{},[174,566,567],{},"org:get",[544,569,570],{},[174,571,553],{},[544,573,560],{},[526,575,576,581,588],{},[544,577,578],{},[174,579,580],{},"org:update",[544,582,583,554,585],{},[174,584,553],{},[174,586,587],{},"patch_json",[544,589,590],{},"Updated organization JSON.",[526,592,593,598,602],{},[544,594,595],{},[174,596,597],{},"org:exists",[544,599,600],{},[174,601,553],{},[544,603,604,607,608,493],{},[174,605,606],{},"true"," or ",[174,609,610],{},"false",[526,612,613,618,622],{},[544,614,615],{},[174,616,617],{},"org:delete",[544,619,620],{},[174,621,553],{},[544,623,624,493],{},[174,625,626],{},"OK",[526,628,629,634,638],{},[544,630,631],{},[174,632,633],{},"org:assets:get",[544,635,636],{},[174,637,553],{},[544,639,640],{},"Asset map JSON.",[526,642,643,648,655],{},[544,644,645],{},[174,646,647],{},"org:assets:update",[544,649,650,554,652],{},[174,651,553],{},[174,653,654],{},"assets_json",[544,656,657],{},"Updated asset map JSON.",[526,659,660,665,669],{},[544,661,662],{},[174,663,664],{},"org:fleet:get",[544,666,667],{},[174,668,553],{},[544,670,671],{},"Fleet map JSON.",[526,673,674,679,686],{},[544,675,676],{},[174,677,678],{},"org:fleet:update",[544,680,681,554,683],{},[174,682,553],{},[174,684,685],{},"fleet_json",[544,687,688],{},"Updated fleet map JSON.",[526,690,691,696,700],{},[544,692,693],{},[174,694,695],{},"org:members:get",[544,697,698],{},[174,699,553],{},[544,701,702],{},"Member array JSON.",[526,704,705,710,717],{},[544,706,707],{},[174,708,709],{},"org:members:add",[544,711,712,554,714],{},[174,713,553],{},[174,715,716],{},"member_uid",[544,718,719,493],{},[174,720,626],{},[526,722,723,728,734],{},[544,724,725],{},[174,726,727],{},"org:members:remove",[544,729,730,554,732],{},[174,731,553],{},[174,733,716],{},[544,735,736,493],{},[174,737,626],{},[159,739,741],{"id":740},"create-an-organization","Create an Organization",[155,743,744,745,493],{},"The command key is authoritative for ",[174,746,194],{},[167,748,752],{"className":749,"code":750,"language":751,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _org = createHashMapFromArray [\n [\"id\", _orgId],\n [\"owner\", getPlayerUID player],\n [\"name\", \"Spearnet Logistics\"],\n [\"funds\", 0],\n [\"reputation\", 0],\n [\"credit_lines\", createHashMap]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:create\", [\n _orgId,\n toJSON _org\n]];\n","sqf",[174,753,754,759,764,769,774,779,784,789,794,800,805,810,815],{"__ignoreMap":172},[177,755,756],{"class":179,"line":180},[177,757,758],{},"private _org = createHashMapFromArray [\n",[177,760,761],{"class":179,"line":187},[177,762,763],{}," [\"id\", _orgId],\n",[177,765,766],{"class":179,"line":215},[177,767,768],{}," [\"owner\", getPlayerUID player],\n",[177,770,771],{"class":179,"line":236},[177,772,773],{}," [\"name\", \"Spearnet Logistics\"],\n",[177,775,776],{"class":179,"line":257},[177,777,778],{}," [\"funds\", 0],\n",[177,780,781],{"class":179,"line":275},[177,782,783],{}," [\"reputation\", 0],\n",[177,785,786],{"class":179,"line":292},[177,787,788],{}," [\"credit_lines\", createHashMap]\n",[177,790,791],{"class":179,"line":307},[177,792,793],{},"];\n",[177,795,796],{"class":179,"line":433},[177,797,799],{"emptyLinePlaceholder":798},true,"\n",[177,801,802],{"class":179,"line":447},[177,803,804],{},"private _result = \"forge_server\" callExtension [\"org:create\", [\n",[177,806,807],{"class":179,"line":461},[177,808,809],{}," _orgId,\n",[177,811,812],{"class":179,"line":475},[177,813,814],{}," toJSON _org\n",[177,816,818],{"class":179,"line":817},13,[177,819,820],{},"]];\n",[159,822,824],{"id":823},"update-organization-funds","Update Organization Funds",[167,826,828],{"className":749,"code":827,"language":751,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"funds\", 5000],\n [\"reputation\", 10]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:update\", [\n _orgId,\n toJSON _patch\n]];\n",[174,829,830,835,840,845,849,853,858,862,867],{"__ignoreMap":172},[177,831,832],{"class":179,"line":180},[177,833,834],{},"private _patch = createHashMapFromArray [\n",[177,836,837],{"class":179,"line":187},[177,838,839],{}," [\"funds\", 5000],\n",[177,841,842],{"class":179,"line":215},[177,843,844],{}," [\"reputation\", 10]\n",[177,846,847],{"class":179,"line":236},[177,848,793],{},[177,850,851],{"class":179,"line":257},[177,852,799],{"emptyLinePlaceholder":798},[177,854,855],{"class":179,"line":275},[177,856,857],{},"private _result = \"forge_server\" callExtension [\"org:update\", [\n",[177,859,860],{"class":179,"line":292},[177,861,809],{},[177,863,864],{"class":179,"line":307},[177,865,866],{}," toJSON _patch\n",[177,868,869],{"class":179,"line":433},[177,870,820],{},[155,872,873,874,554,876,554,878,554,880,212,882,884,885,493],{},"Supported durable patch fields are ",[174,875,194],{},[174,877,220],{},[174,879,241],{},[174,881,262],{},[174,883,280],{},", and ",[174,886,297],{},[159,888,890],{"id":889},"assets-and-fleet","Assets and Fleet",[155,892,893],{},"Assets are grouped by category, then classname.",[167,895,897],{"className":749,"code":896,"language":751,"meta":172,"style":172},"private _assets = createHashMapFromArray [\n [\"ammo\", createHashMapFromArray [\n [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n [\"type\", \"ammo\"],\n [\"quantity\", 20]\n ]]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[174,898,899,904,909,914,919,924,929,934,939,943,947],{"__ignoreMap":172},[177,900,901],{"class":179,"line":180},[177,902,903],{},"private _assets = createHashMapFromArray [\n",[177,905,906],{"class":179,"line":187},[177,907,908],{}," [\"ammo\", createHashMapFromArray [\n",[177,910,911],{"class":179,"line":215},[177,912,913],{}," [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n",[177,915,916],{"class":179,"line":236},[177,917,918],{}," [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n",[177,920,921],{"class":179,"line":257},[177,922,923],{}," [\"type\", \"ammo\"],\n",[177,925,926],{"class":179,"line":275},[177,927,928],{}," [\"quantity\", 20]\n",[177,930,931],{"class":179,"line":292},[177,932,933],{}," ]]\n",[177,935,936],{"class":179,"line":307},[177,937,938],{}," ]]\n",[177,940,941],{"class":179,"line":433},[177,942,793],{},[177,944,945],{"class":179,"line":447},[177,946,799],{"emptyLinePlaceholder":798},[177,948,949],{"class":179,"line":461},[177,950,951],{},"\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[155,953,954],{},"Fleet is keyed by an internal fleet entry ID.",[167,956,958],{"className":749,"code":957,"language":751,"meta":172,"style":172},"private _fleet = createHashMapFromArray [\n [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n [\"classname\", \"B_Truck_01_transport_F\"],\n [\"name\", \"Transport Truck\"],\n [\"type\", \"cars\"],\n [\"status\", \"Ready\"],\n [\"damage\", \"0%\"]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[174,959,960,965,970,975,980,985,990,995,999,1003,1007],{"__ignoreMap":172},[177,961,962],{"class":179,"line":180},[177,963,964],{},"private _fleet = createHashMapFromArray [\n",[177,966,967],{"class":179,"line":187},[177,968,969],{}," [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n",[177,971,972],{"class":179,"line":215},[177,973,974],{}," [\"classname\", \"B_Truck_01_transport_F\"],\n",[177,976,977],{"class":179,"line":236},[177,978,979],{}," [\"name\", \"Transport Truck\"],\n",[177,981,982],{"class":179,"line":257},[177,983,984],{}," [\"type\", \"cars\"],\n",[177,986,987],{"class":179,"line":275},[177,988,989],{}," [\"status\", \"Ready\"],\n",[177,991,992],{"class":179,"line":292},[177,993,994],{}," [\"damage\", \"0%\"]\n",[177,996,997],{"class":179,"line":307},[177,998,938],{},[177,1000,1001],{"class":179,"line":433},[177,1002,793],{},[177,1004,1005],{"class":179,"line":447},[177,1006,799],{"emptyLinePlaceholder":798},[177,1008,1009],{"class":179,"line":461},[177,1010,1011],{},"\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[159,1013,1015],{"id":1014},"hot-state-commands","Hot-State Commands",[520,1017,1018,1028],{},[523,1019,1020],{},[526,1021,1022,1024,1026],{},[529,1023,531],{},[529,1025,534],{},[529,1027,537],{},[539,1029,1030,1044,1057,1073,1087,1101,1115,1129,1143,1156,1170,1184,1197,1212,1227,1241,1255,1269],{},[526,1031,1032,1037,1041],{},[544,1033,1034],{},[174,1035,1036],{},"org:hot:init",[544,1038,1039],{},[174,1040,553],{},[544,1042,1043],{},"Hot organization JSON.",[526,1045,1046,1051,1055],{},[544,1047,1048],{},[174,1049,1050],{},"org:hot:get",[544,1052,1053],{},[174,1054,553],{},[544,1056,1043],{},[526,1058,1059,1064,1071],{},[544,1060,1061],{},[174,1062,1063],{},"org:hot:override",[544,1065,1066,554,1068],{},[174,1067,553],{},[174,1069,1070],{},"hot_org_json",[544,1072,1043],{},[526,1074,1075,1080,1085],{},[544,1076,1077],{},[174,1078,1079],{},"org:hot:ensure_member",[544,1081,1082],{},[174,1083,1084],{},"context_json",[544,1086,1043],{},[526,1088,1089,1094,1098],{},[544,1090,1091],{},[174,1092,1093],{},"org:hot:member_invites",[544,1095,1096],{},[174,1097,716],{},[544,1099,1100],{},"Invite array JSON.",[526,1102,1103,1108,1112],{},[544,1104,1105],{},[174,1106,1107],{},"org:hot:register",[544,1109,1110],{},[174,1111,1084],{},[544,1113,1114],{},"Register result JSON.",[526,1116,1117,1122,1126],{},[544,1118,1119],{},[174,1120,1121],{},"org:hot:invite_member",[544,1123,1124],{},[174,1125,1084],{},[544,1127,1128],{},"Invite result JSON.",[526,1130,1131,1136,1140],{},[544,1132,1133],{},[174,1134,1135],{},"org:hot:accept_invite",[544,1137,1138],{},[174,1139,1084],{},[544,1141,1142],{},"Invite decision result JSON.",[526,1144,1145,1150,1154],{},[544,1146,1147],{},[174,1148,1149],{},"org:hot:decline_invite",[544,1151,1152],{},[174,1153,1084],{},[544,1155,1142],{},[526,1157,1158,1163,1167],{},[544,1159,1160],{},[174,1161,1162],{},"org:hot:assign_credit_line",[544,1164,1165],{},[174,1166,1084],{},[544,1168,1169],{},"Mutation result JSON.",[526,1171,1172,1177,1181],{},[544,1173,1174],{},[174,1175,1176],{},"org:hot:repay_credit_line",[544,1178,1179],{},[174,1180,1084],{},[544,1182,1183],{},"Repayment result JSON.",[526,1185,1186,1191,1195],{},[544,1187,1188],{},[174,1189,1190],{},"org:hot:charge_checkout",[544,1192,1193],{},[174,1194,1084],{},[544,1196,1169],{},[526,1198,1199,1204,1210],{},[544,1200,1201],{},[174,1202,1203],{},"org:hot:add_assets",[544,1205,1206,554,1208],{},[174,1207,1084],{},[174,1209,654],{},[544,1211,1169],{},[526,1213,1214,1219,1225],{},[544,1215,1216],{},[174,1217,1218],{},"org:hot:add_fleet",[544,1220,1221,554,1223],{},[174,1222,1084],{},[174,1224,685],{},[544,1226,1169],{},[526,1228,1229,1234,1238],{},[544,1230,1231],{},[174,1232,1233],{},"org:hot:leave",[544,1235,1236],{},[174,1237,1084],{},[544,1239,1240],{},"Leave result JSON.",[526,1242,1243,1248,1252],{},[544,1244,1245],{},[174,1246,1247],{},"org:hot:disband",[544,1249,1250],{},[174,1251,1084],{},[544,1253,1254],{},"Disband result JSON.",[526,1256,1257,1262,1266],{},[544,1258,1259],{},[174,1260,1261],{},"org:hot:save",[544,1263,1264],{},[174,1265,553],{},[544,1267,1268],{},"Current hot organization JSON and async durable save.",[526,1270,1271,1276,1280],{},[544,1272,1273],{},[174,1274,1275],{},"org:hot:remove",[544,1277,1278],{},[174,1279,553],{},[544,1281,1282,493],{},[174,1283,626],{},[159,1285,1287],{"id":1286},"register-from-ui-context","Register from UI Context",[167,1289,1291],{"className":749,"code":1290,"language":751,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"orgName\", \"Spearnet Logistics\"],\n [\"existingOrgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[174,1292,1293,1298,1303,1308,1313,1318,1323,1327,1331],{"__ignoreMap":172},[177,1294,1295],{"class":179,"line":180},[177,1296,1297],{},"private _context = createHashMapFromArray [\n",[177,1299,1300],{"class":179,"line":187},[177,1301,1302],{}," [\"requesterUid\", getPlayerUID player],\n",[177,1304,1305],{"class":179,"line":215},[177,1306,1307],{}," [\"requesterName\", name player],\n",[177,1309,1310],{"class":179,"line":236},[177,1311,1312],{}," [\"orgId\", _orgId],\n",[177,1314,1315],{"class":179,"line":257},[177,1316,1317],{}," [\"orgName\", \"Spearnet Logistics\"],\n",[177,1319,1320],{"class":179,"line":275},[177,1321,1322],{}," [\"existingOrgId\", \"default\"]\n",[177,1324,1325],{"class":179,"line":292},[177,1326,793],{},[177,1328,1329],{"class":179,"line":307},[177,1330,799],{"emptyLinePlaceholder":798},[177,1332,1333],{"class":179,"line":433},[177,1334,1335],{},"private _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[159,1337,1339],{"id":1338},"invite-and-accept","Invite and Accept",[167,1341,1343],{"className":749,"code":1342,"language":751,"meta":172,"style":172},"private _invite = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"targetUid\", _targetUid],\n [\"targetName\", _targetName],\n [\"targetOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n\nprivate _decision = createHashMapFromArray [\n [\"requesterUid\", _targetUid],\n [\"requesterName\", _targetName],\n [\"orgId\", _orgId],\n [\"existingOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[174,1344,1345,1350,1354,1358,1362,1367,1372,1377,1382,1386,1390,1395,1399,1404,1410,1416,1421,1426,1431,1436],{"__ignoreMap":172},[177,1346,1347],{"class":179,"line":180},[177,1348,1349],{},"private _invite = createHashMapFromArray [\n",[177,1351,1352],{"class":179,"line":187},[177,1353,1302],{},[177,1355,1356],{"class":179,"line":215},[177,1357,1307],{},[177,1359,1360],{"class":179,"line":236},[177,1361,1312],{},[177,1363,1364],{"class":179,"line":257},[177,1365,1366],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[177,1368,1369],{"class":179,"line":275},[177,1370,1371],{}," [\"targetUid\", _targetUid],\n",[177,1373,1374],{"class":179,"line":292},[177,1375,1376],{}," [\"targetName\", _targetName],\n",[177,1378,1379],{"class":179,"line":307},[177,1380,1381],{}," [\"targetOrgId\", \"default\"]\n",[177,1383,1384],{"class":179,"line":433},[177,1385,793],{},[177,1387,1388],{"class":179,"line":447},[177,1389,799],{"emptyLinePlaceholder":798},[177,1391,1392],{"class":179,"line":461},[177,1393,1394],{},"\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n",[177,1396,1397],{"class":179,"line":475},[177,1398,799],{"emptyLinePlaceholder":798},[177,1400,1401],{"class":179,"line":817},[177,1402,1403],{},"private _decision = createHashMapFromArray [\n",[177,1405,1407],{"class":179,"line":1406},14,[177,1408,1409],{}," [\"requesterUid\", _targetUid],\n",[177,1411,1413],{"class":179,"line":1412},15,[177,1414,1415],{}," [\"requesterName\", _targetName],\n",[177,1417,1419],{"class":179,"line":1418},16,[177,1420,1312],{},[177,1422,1424],{"class":179,"line":1423},17,[177,1425,1322],{},[177,1427,1429],{"class":179,"line":1428},18,[177,1430,793],{},[177,1432,1434],{"class":179,"line":1433},19,[177,1435,799],{"emptyLinePlaceholder":798},[177,1437,1439],{"class":179,"line":1438},20,[177,1440,1441],{},"\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[159,1443,1445],{"id":1444},"credit-line-checkout","Credit Line Checkout",[167,1447,1449],{"className":749,"code":1448,"language":751,"meta":172,"style":172},"private _credit = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"memberUid\", _memberUid],\n [\"memberName\", _memberName],\n [\"amount\", 1000]\n];\n\n\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n\nprivate _charge = createHashMapFromArray [\n [\"requesterUid\", _memberUid],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"source\", \"credit_line\"],\n [\"amount\", 250],\n [\"commit\", true]\n];\n\n\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[174,1450,1451,1456,1460,1464,1468,1473,1478,1483,1487,1491,1496,1500,1505,1510,1514,1518,1523,1528,1533,1537,1541],{"__ignoreMap":172},[177,1452,1453],{"class":179,"line":180},[177,1454,1455],{},"private _credit = createHashMapFromArray [\n",[177,1457,1458],{"class":179,"line":187},[177,1459,1302],{},[177,1461,1462],{"class":179,"line":215},[177,1463,1312],{},[177,1465,1466],{"class":179,"line":236},[177,1467,1366],{},[177,1469,1470],{"class":179,"line":257},[177,1471,1472],{}," [\"memberUid\", _memberUid],\n",[177,1474,1475],{"class":179,"line":275},[177,1476,1477],{}," [\"memberName\", _memberName],\n",[177,1479,1480],{"class":179,"line":292},[177,1481,1482],{}," [\"amount\", 1000]\n",[177,1484,1485],{"class":179,"line":307},[177,1486,793],{},[177,1488,1489],{"class":179,"line":433},[177,1490,799],{"emptyLinePlaceholder":798},[177,1492,1493],{"class":179,"line":447},[177,1494,1495],{},"\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n",[177,1497,1498],{"class":179,"line":461},[177,1499,799],{"emptyLinePlaceholder":798},[177,1501,1502],{"class":179,"line":475},[177,1503,1504],{},"private _charge = createHashMapFromArray [\n",[177,1506,1507],{"class":179,"line":817},[177,1508,1509],{}," [\"requesterUid\", _memberUid],\n",[177,1511,1512],{"class":179,"line":1406},[177,1513,1312],{},[177,1515,1516],{"class":179,"line":1412},[177,1517,1366],{},[177,1519,1520],{"class":179,"line":1418},[177,1521,1522],{}," [\"source\", \"credit_line\"],\n",[177,1524,1525],{"class":179,"line":1423},[177,1526,1527],{}," [\"amount\", 250],\n",[177,1529,1530],{"class":179,"line":1428},[177,1531,1532],{}," [\"commit\", true]\n",[177,1534,1535],{"class":179,"line":1433},[177,1536,793],{},[177,1538,1539],{"class":179,"line":1438},[177,1540,799],{"emptyLinePlaceholder":798},[177,1542,1544],{"class":179,"line":1543},21,[177,1545,1546],{},"\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[159,1548,1550],{"id":1549},"error-handling","Error Handling",[167,1552,1554],{"className":749,"code":1553,"language":751,"meta":172,"style":172},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Organization error: %1\", _payload];\n};\n",[174,1555,1556,1561,1566,1571],{"__ignoreMap":172},[177,1557,1558],{"class":179,"line":180},[177,1559,1560],{},"private _payload = _result select 0;\n",[177,1562,1563],{"class":179,"line":187},[177,1564,1565],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1567,1568],{"class":179,"line":215},[177,1569,1570],{}," systemChat format [\"Organization error: %1\", _payload];\n",[177,1572,1573],{"class":179,"line":236},[177,1574,1575],{},"};\n",[1577,1578,1579],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1581},[1582,1583,1584,1585,1586,1587,1588,1589,1590,1591],{"id":161,"depth":187,"text":162},{"id":517,"depth":187,"text":518},{"id":740,"depth":187,"text":741},{"id":823,"depth":187,"text":824},{"id":889,"depth":187,"text":890},{"id":1014,"depth":187,"text":1015},{"id":1286,"depth":187,"text":1287},{"id":1338,"depth":187,"text":1339},{"id":1444,"depth":187,"text":1445},{"id":1549,"depth":187,"text":1550},"md",null,{},{"title":81,"description":157},"Y4vjjEPJa4IV64tDJwWSmfGqOhldckNTPDy2PpGmT14",[1598,1600],{"title":77,"path":78,"stem":79,"description":1599,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",{"title":85,"path":86,"stem":87,"description":1601,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/owned-storage.html b/docus/dist/server-modules/owned-storage.html new file mode 100644 index 0000000..cf2c5bc --- /dev/null +++ b/docus/dist/server-modules/owned-storage.html @@ -0,0 +1,155 @@ +Owned Storage Usage Guide - forge-docus
Server Modules

Owned Storage Usage Guide

Owned storage covers the owned:locker and owned:garage extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances.

Owned Storage Usage Guide

Owned storage covers the owned:locker and owned:garage extension command +groups. These modules store unlock lists rather than physical item or vehicle +instances.

Use these modules for virtual arsenal and virtual garage unlocks. Use +Locker Usage Guide and +Garage Usage Guide for physical inventory and stored +vehicle instances.

Owned Locker Model

{
+  "items": ["FirstAidKit"],
+  "weapons": ["arifle_MX_F"],
+  "magazines": ["30Rnd_65x39_caseless_black_mag"],
+  "backpacks": ["B_AssaultPack_rgr"]
+}
+

Supported owned locker categories:

  • items
  • weapons
  • magazines
  • backpacks

New owned lockers are created with default unlocks from the Rust model.

Owned Garage Model

{
+  "cars": ["B_Quadbike_01_F"],
+  "armor": [],
+  "helis": [],
+  "planes": [],
+  "naval": [],
+  "other": []
+}
+

Supported owned garage categories:

  • cars
  • armor
  • helis
  • planes
  • naval
  • other

The durable owned:garage:remove command currently accepts heli for the +helicopter category. Add, get, and hot remove accept helis.

New owned garages are created with default unlocks from the Rust model.

Owned Locker Commands

CommandArgumentsReturns
owned:locker:createuidFull owned locker JSON.
owned:locker:fetchuidFull owned locker JSON.
owned:locker:getuid, categoryCategory classname array JSON.
owned:locker:adduid, category, classnames_jsonUpdated category array JSON.
owned:locker:removeuid, category, classnameUpdated category array JSON.
owned:locker:deleteuidOK.
owned:locker:existsuidtrue or false.

Owned Garage Commands

CommandArgumentsReturns
owned:garage:createuidFull owned garage JSON.
owned:garage:fetchuidFull owned garage JSON.
owned:garage:getuid, categoryCategory classname array JSON.
owned:garage:adduid, category, classnames_jsonUpdated category array JSON.
owned:garage:removeuid, category, classnameUpdated category array JSON.
owned:garage:deleteuidOK.
owned:garage:existsuidtrue or false.

Add Virtual Arsenal Unlocks

private _classes = ["arifle_MX_F", "hgun_P07_F"];
+
+private _result = "forge_server" callExtension ["owned:locker:add", [
+    getPlayerUID player,
+    "weapons",
+    toJSON _classes
+]];
+

Add Virtual Garage Unlocks

private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"];
+
+private _result = "forge_server" callExtension ["owned:garage:add", [
+    getPlayerUID player,
+    "cars",
+    toJSON _classes
+]];
+

Remove an Unlock

"forge_server" callExtension ["owned:locker:remove", [
+    getPlayerUID player,
+    "weapons",
+    "arifle_MX_F"
+]];
+
+"forge_server" callExtension ["owned:garage:remove", [
+    getPlayerUID player,
+    "cars",
+    "B_Quadbike_01_F"
+]];
+

Hot-State Commands

Both owned storage modules support hot state.

Owned locker:

CommandArgumentsReturns
owned:locker:hot:inituidFull owned locker JSON.
owned:locker:hot:fetchuidFull owned locker JSON.
owned:locker:hot:getuid, categoryCategory array JSON.
owned:locker:hot:overrideuid, locker_jsonFull owned locker JSON.
owned:locker:hot:saveuidCurrent hot owned locker JSON and async durable save.
owned:locker:hot:removeuidOK.

Owned garage:

CommandArgumentsReturns
owned:garage:hot:inituidFull owned garage JSON.
owned:garage:hot:fetchuidFull owned garage JSON.
owned:garage:hot:getuid, categoryCategory array JSON.
owned:garage:hot:overrideuid, garage_jsonFull owned garage JSON.
owned:garage:hot:adduid, category, classnames_jsonUpdated category array JSON.
owned:garage:hot:remove_itemuid, category, classnameUpdated category array JSON.
owned:garage:hot:saveuidCurrent hot owned garage JSON and async durable save.
owned:garage:hot:removeuidOK.

Error Handling

private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Owned storage error: %1", _payload];
+};
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/owned-storage/_payload.json b/docus/dist/server-modules/owned-storage/_payload.json new file mode 100644 index 0000000..f29b8ae --- /dev/null +++ b/docus/dist/server-modules/owned-storage/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1207},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-owned-storage":145,"-server-modules-owned-storage-surround":1202},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":85,"body":147,"description":1196,"extension":1197,"links":1198,"meta":1199,"navigation":777,"path":86,"seo":1200,"stem":87,"__hash__":1201},"docs\u002F3.server-modules\u002F8.owned-storage.md",{"type":148,"value":149,"toc":1185},"minimark",[150,154,167,177,182,306,309,329,332,336,440,443,469,483,486,490,632,636,757,761,804,808,844,848,904,908,911,914,1015,1018,1152,1156,1181],[151,152,85],"h1",{"id":153},"owned-storage-usage-guide",[155,156,157,158,162,163,166],"p",{},"Owned storage covers the ",[159,160,161],"code",{},"owned:locker"," and ",[159,164,165],{},"owned:garage"," extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",[155,168,169,170,173,174,176],{},"Use these modules for virtual arsenal and virtual garage unlocks. Use\n",[171,172,77],"a",{"href":78}," and\n",[171,175,73],{"href":74}," for physical inventory and stored\nvehicle instances.",[178,179,181],"h2",{"id":180},"owned-locker-model","Owned Locker Model",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"items\": [\"FirstAidKit\"],\n \"weapons\": [\"arifle_MX_F\"],\n \"magazines\": [\"30Rnd_65x39_caseless_black_mag\"],\n \"backpacks\": [\"B_AssaultPack_rgr\"]\n}\n","json","",[159,190,191,200,230,253,276,300],{"__ignoreMap":188},[192,193,196],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"sMK4o","{\n",[192,201,203,206,210,213,216,219,221,225,227],{"class":194,"line":202},2,[192,204,205],{"class":198}," \"",[192,207,209],{"class":208},"spNyl","items",[192,211,212],{"class":198},"\"",[192,214,215],{"class":198},":",[192,217,218],{"class":198}," [",[192,220,212],{"class":198},[192,222,224],{"class":223},"sfazB","FirstAidKit",[192,226,212],{"class":198},[192,228,229],{"class":198},"],\n",[192,231,233,235,238,240,242,244,246,249,251],{"class":194,"line":232},3,[192,234,205],{"class":198},[192,236,237],{"class":208},"weapons",[192,239,212],{"class":198},[192,241,215],{"class":198},[192,243,218],{"class":198},[192,245,212],{"class":198},[192,247,248],{"class":223},"arifle_MX_F",[192,250,212],{"class":198},[192,252,229],{"class":198},[192,254,256,258,261,263,265,267,269,272,274],{"class":194,"line":255},4,[192,257,205],{"class":198},[192,259,260],{"class":208},"magazines",[192,262,212],{"class":198},[192,264,215],{"class":198},[192,266,218],{"class":198},[192,268,212],{"class":198},[192,270,271],{"class":223},"30Rnd_65x39_caseless_black_mag",[192,273,212],{"class":198},[192,275,229],{"class":198},[192,277,279,281,284,286,288,290,292,295,297],{"class":194,"line":278},5,[192,280,205],{"class":198},[192,282,283],{"class":208},"backpacks",[192,285,212],{"class":198},[192,287,215],{"class":198},[192,289,218],{"class":198},[192,291,212],{"class":198},[192,293,294],{"class":223},"B_AssaultPack_rgr",[192,296,212],{"class":198},[192,298,299],{"class":198},"]\n",[192,301,303],{"class":194,"line":302},6,[192,304,305],{"class":198},"}\n",[155,307,308],{},"Supported owned locker categories:",[310,311,312,317,321,325],"ul",{},[313,314,315],"li",{},[159,316,209],{},[313,318,319],{},[159,320,237],{},[313,322,323],{},[159,324,260],{},[313,326,327],{},[159,328,283],{},[155,330,331],{},"New owned lockers are created with default unlocks from the Rust model.",[178,333,335],{"id":334},"owned-garage-model","Owned Garage Model",[183,337,339],{"className":185,"code":338,"language":187,"meta":188,"style":188},"{\n \"cars\": [\"B_Quadbike_01_F\"],\n \"armor\": [],\n \"helis\": [],\n \"planes\": [],\n \"naval\": [],\n \"other\": []\n}\n",[159,340,341,345,367,381,394,407,420,435],{"__ignoreMap":188},[192,342,343],{"class":194,"line":195},[192,344,199],{"class":198},[192,346,347,349,352,354,356,358,360,363,365],{"class":194,"line":202},[192,348,205],{"class":198},[192,350,351],{"class":208},"cars",[192,353,212],{"class":198},[192,355,215],{"class":198},[192,357,218],{"class":198},[192,359,212],{"class":198},[192,361,362],{"class":223},"B_Quadbike_01_F",[192,364,212],{"class":198},[192,366,229],{"class":198},[192,368,369,371,374,376,378],{"class":194,"line":232},[192,370,205],{"class":198},[192,372,373],{"class":208},"armor",[192,375,212],{"class":198},[192,377,215],{"class":198},[192,379,380],{"class":198}," [],\n",[192,382,383,385,388,390,392],{"class":194,"line":255},[192,384,205],{"class":198},[192,386,387],{"class":208},"helis",[192,389,212],{"class":198},[192,391,215],{"class":198},[192,393,380],{"class":198},[192,395,396,398,401,403,405],{"class":194,"line":278},[192,397,205],{"class":198},[192,399,400],{"class":208},"planes",[192,402,212],{"class":198},[192,404,215],{"class":198},[192,406,380],{"class":198},[192,408,409,411,414,416,418],{"class":194,"line":302},[192,410,205],{"class":198},[192,412,413],{"class":208},"naval",[192,415,212],{"class":198},[192,417,215],{"class":198},[192,419,380],{"class":198},[192,421,423,425,428,430,432],{"class":194,"line":422},7,[192,424,205],{"class":198},[192,426,427],{"class":208},"other",[192,429,212],{"class":198},[192,431,215],{"class":198},[192,433,434],{"class":198}," []\n",[192,436,438],{"class":194,"line":437},8,[192,439,305],{"class":198},[155,441,442],{},"Supported owned garage categories:",[310,444,445,449,453,457,461,465],{},[313,446,447],{},[159,448,351],{},[313,450,451],{},[159,452,373],{},[313,454,455],{},[159,456,387],{},[313,458,459],{},[159,460,400],{},[313,462,463],{},[159,464,413],{},[313,466,467],{},[159,468,427],{},[155,470,471,472,475,476,479,480,482],{},"The durable ",[159,473,474],{},"owned:garage:remove"," command currently accepts ",[159,477,478],{},"heli"," for the\nhelicopter category. Add, get, and hot remove accept ",[159,481,387],{},".",[155,484,485],{},"New owned garages are created with default unlocks from the Rust model.",[178,487,489],{"id":488},"owned-locker-commands","Owned Locker Commands",[491,492,493,509],"table",{},[494,495,496],"thead",{},[497,498,499,503,506],"tr",{},[500,501,502],"th",{},"Command",[500,504,505],{},"Arguments",[500,507,508],{},"Returns",[510,511,512,528,541,559,578,596,612],"tbody",{},[497,513,514,520,525],{},[515,516,517],"td",{},[159,518,519],{},"owned:locker:create",[515,521,522],{},[159,523,524],{},"uid",[515,526,527],{},"Full owned locker JSON.",[497,529,530,535,539],{},[515,531,532],{},[159,533,534],{},"owned:locker:fetch",[515,536,537],{},[159,538,524],{},[515,540,527],{},[497,542,543,548,556],{},[515,544,545],{},[159,546,547],{},"owned:locker:get",[515,549,550,552,553],{},[159,551,524],{},", ",[159,554,555],{},"category",[515,557,558],{},"Category classname array JSON.",[497,560,561,566,575],{},[515,562,563],{},[159,564,565],{},"owned:locker:add",[515,567,568,552,570,552,572],{},[159,569,524],{},[159,571,555],{},[159,573,574],{},"classnames_json",[515,576,577],{},"Updated category array JSON.",[497,579,580,585,594],{},[515,581,582],{},[159,583,584],{},"owned:locker:remove",[515,586,587,552,589,552,591],{},[159,588,524],{},[159,590,555],{},[159,592,593],{},"classname",[515,595,577],{},[497,597,598,603,607],{},[515,599,600],{},[159,601,602],{},"owned:locker:delete",[515,604,605],{},[159,606,524],{},[515,608,609,482],{},[159,610,611],{},"OK",[497,613,614,619,623],{},[515,615,616],{},[159,617,618],{},"owned:locker:exists",[515,620,621],{},[159,622,524],{},[515,624,625,628,629,482],{},[159,626,627],{},"true"," or ",[159,630,631],{},"false",[178,633,635],{"id":634},"owned-garage-commands","Owned Garage Commands",[491,637,638,648],{},[494,639,640],{},[497,641,642,644,646],{},[500,643,502],{},[500,645,505],{},[500,647,508],{},[510,649,650,664,677,692,709,725,740],{},[497,651,652,657,661],{},[515,653,654],{},[159,655,656],{},"owned:garage:create",[515,658,659],{},[159,660,524],{},[515,662,663],{},"Full owned garage JSON.",[497,665,666,671,675],{},[515,667,668],{},[159,669,670],{},"owned:garage:fetch",[515,672,673],{},[159,674,524],{},[515,676,663],{},[497,678,679,684,690],{},[515,680,681],{},[159,682,683],{},"owned:garage:get",[515,685,686,552,688],{},[159,687,524],{},[159,689,555],{},[515,691,558],{},[497,693,694,699,707],{},[515,695,696],{},[159,697,698],{},"owned:garage:add",[515,700,701,552,703,552,705],{},[159,702,524],{},[159,704,555],{},[159,706,574],{},[515,708,577],{},[497,710,711,715,723],{},[515,712,713],{},[159,714,474],{},[515,716,717,552,719,552,721],{},[159,718,524],{},[159,720,555],{},[159,722,593],{},[515,724,577],{},[497,726,727,732,736],{},[515,728,729],{},[159,730,731],{},"owned:garage:delete",[515,733,734],{},[159,735,524],{},[515,737,738,482],{},[159,739,611],{},[497,741,742,747,751],{},[515,743,744],{},[159,745,746],{},"owned:garage:exists",[515,748,749],{},[159,750,524],{},[515,752,753,628,755,482],{},[159,754,627],{},[159,756,631],{},[178,758,760],{"id":759},"add-virtual-arsenal-unlocks","Add Virtual Arsenal Unlocks",[183,762,766],{"className":763,"code":764,"language":765,"meta":188,"style":188},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n getPlayerUID player,\n \"weapons\",\n toJSON _classes\n]];\n","sqf",[159,767,768,773,779,784,789,794,799],{"__ignoreMap":188},[192,769,770],{"class":194,"line":195},[192,771,772],{},"private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n",[192,774,775],{"class":194,"line":202},[192,776,778],{"emptyLinePlaceholder":777},true,"\n",[192,780,781],{"class":194,"line":232},[192,782,783],{},"private _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n",[192,785,786],{"class":194,"line":255},[192,787,788],{}," getPlayerUID player,\n",[192,790,791],{"class":194,"line":278},[192,792,793],{}," \"weapons\",\n",[192,795,796],{"class":194,"line":302},[192,797,798],{}," toJSON _classes\n",[192,800,801],{"class":194,"line":422},[192,802,803],{},"]];\n",[178,805,807],{"id":806},"add-virtual-garage-unlocks","Add Virtual Garage Unlocks",[183,809,811],{"className":763,"code":810,"language":765,"meta":188,"style":188},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n getPlayerUID player,\n \"cars\",\n toJSON _classes\n]];\n",[159,812,813,818,822,827,831,836,840],{"__ignoreMap":188},[192,814,815],{"class":194,"line":195},[192,816,817],{},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n",[192,819,820],{"class":194,"line":202},[192,821,778],{"emptyLinePlaceholder":777},[192,823,824],{"class":194,"line":232},[192,825,826],{},"private _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n",[192,828,829],{"class":194,"line":255},[192,830,788],{},[192,832,833],{"class":194,"line":278},[192,834,835],{}," \"cars\",\n",[192,837,838],{"class":194,"line":302},[192,839,798],{},[192,841,842],{"class":194,"line":422},[192,843,803],{},[178,845,847],{"id":846},"remove-an-unlock","Remove an Unlock",[183,849,851],{"className":763,"code":850,"language":765,"meta":188,"style":188},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n getPlayerUID player,\n \"weapons\",\n \"arifle_MX_F\"\n]];\n\n\"forge_server\" callExtension [\"owned:garage:remove\", [\n getPlayerUID player,\n \"cars\",\n \"B_Quadbike_01_F\"\n]];\n",[159,852,853,858,862,866,871,875,879,884,888,893,899],{"__ignoreMap":188},[192,854,855],{"class":194,"line":195},[192,856,857],{},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n",[192,859,860],{"class":194,"line":202},[192,861,788],{},[192,863,864],{"class":194,"line":232},[192,865,793],{},[192,867,868],{"class":194,"line":255},[192,869,870],{}," \"arifle_MX_F\"\n",[192,872,873],{"class":194,"line":278},[192,874,803],{},[192,876,877],{"class":194,"line":302},[192,878,778],{"emptyLinePlaceholder":777},[192,880,881],{"class":194,"line":422},[192,882,883],{},"\"forge_server\" callExtension [\"owned:garage:remove\", [\n",[192,885,886],{"class":194,"line":437},[192,887,788],{},[192,889,891],{"class":194,"line":890},9,[192,892,835],{},[192,894,896],{"class":194,"line":895},10,[192,897,898],{}," \"B_Quadbike_01_F\"\n",[192,900,902],{"class":194,"line":901},11,[192,903,803],{},[178,905,907],{"id":906},"hot-state-commands","Hot-State Commands",[155,909,910],{},"Both owned storage modules support hot state.",[155,912,913],{},"Owned locker:",[491,915,916,926],{},[494,917,918],{},[497,919,920,922,924],{},[500,921,502],{},[500,923,505],{},[500,925,508],{},[510,927,928,941,954,970,986,1000],{},[497,929,930,935,939],{},[515,931,932],{},[159,933,934],{},"owned:locker:hot:init",[515,936,937],{},[159,938,524],{},[515,940,527],{},[497,942,943,948,952],{},[515,944,945],{},[159,946,947],{},"owned:locker:hot:fetch",[515,949,950],{},[159,951,524],{},[515,953,527],{},[497,955,956,961,967],{},[515,957,958],{},[159,959,960],{},"owned:locker:hot:get",[515,962,963,552,965],{},[159,964,524],{},[159,966,555],{},[515,968,969],{},"Category array JSON.",[497,971,972,977,984],{},[515,973,974],{},[159,975,976],{},"owned:locker:hot:override",[515,978,979,552,981],{},[159,980,524],{},[159,982,983],{},"locker_json",[515,985,527],{},[497,987,988,993,997],{},[515,989,990],{},[159,991,992],{},"owned:locker:hot:save",[515,994,995],{},[159,996,524],{},[515,998,999],{},"Current hot owned locker JSON and async durable save.",[497,1001,1002,1007,1011],{},[515,1003,1004],{},[159,1005,1006],{},"owned:locker:hot:remove",[515,1008,1009],{},[159,1010,524],{},[515,1012,1013,482],{},[159,1014,611],{},[155,1016,1017],{},"Owned garage:",[491,1019,1020,1030],{},[494,1021,1022],{},[497,1023,1024,1026,1028],{},[500,1025,502],{},[500,1027,505],{},[500,1029,508],{},[510,1031,1032,1045,1058,1073,1089,1106,1123,1137],{},[497,1033,1034,1039,1043],{},[515,1035,1036],{},[159,1037,1038],{},"owned:garage:hot:init",[515,1040,1041],{},[159,1042,524],{},[515,1044,663],{},[497,1046,1047,1052,1056],{},[515,1048,1049],{},[159,1050,1051],{},"owned:garage:hot:fetch",[515,1053,1054],{},[159,1055,524],{},[515,1057,663],{},[497,1059,1060,1065,1071],{},[515,1061,1062],{},[159,1063,1064],{},"owned:garage:hot:get",[515,1066,1067,552,1069],{},[159,1068,524],{},[159,1070,555],{},[515,1072,969],{},[497,1074,1075,1080,1087],{},[515,1076,1077],{},[159,1078,1079],{},"owned:garage:hot:override",[515,1081,1082,552,1084],{},[159,1083,524],{},[159,1085,1086],{},"garage_json",[515,1088,663],{},[497,1090,1091,1096,1104],{},[515,1092,1093],{},[159,1094,1095],{},"owned:garage:hot:add",[515,1097,1098,552,1100,552,1102],{},[159,1099,524],{},[159,1101,555],{},[159,1103,574],{},[515,1105,577],{},[497,1107,1108,1113,1121],{},[515,1109,1110],{},[159,1111,1112],{},"owned:garage:hot:remove_item",[515,1114,1115,552,1117,552,1119],{},[159,1116,524],{},[159,1118,555],{},[159,1120,593],{},[515,1122,577],{},[497,1124,1125,1130,1134],{},[515,1126,1127],{},[159,1128,1129],{},"owned:garage:hot:save",[515,1131,1132],{},[159,1133,524],{},[515,1135,1136],{},"Current hot owned garage JSON and async durable save.",[497,1138,1139,1144,1148],{},[515,1140,1141],{},[159,1142,1143],{},"owned:garage:hot:remove",[515,1145,1146],{},[159,1147,524],{},[515,1149,1150,482],{},[159,1151,611],{},[178,1153,1155],{"id":1154},"error-handling","Error Handling",[183,1157,1159],{"className":763,"code":1158,"language":765,"meta":188,"style":188},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Owned storage error: %1\", _payload];\n};\n",[159,1160,1161,1166,1171,1176],{"__ignoreMap":188},[192,1162,1163],{"class":194,"line":195},[192,1164,1165],{},"private _payload = _result select 0;\n",[192,1167,1168],{"class":194,"line":202},[192,1169,1170],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[192,1172,1173],{"class":194,"line":232},[192,1174,1175],{}," systemChat format [\"Owned storage error: %1\", _payload];\n",[192,1177,1178],{"class":194,"line":255},[192,1179,1180],{},"};\n",[1182,1183,1184],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":188,"searchDepth":202,"depth":202,"links":1186},[1187,1188,1189,1190,1191,1192,1193,1194,1195],{"id":180,"depth":202,"text":181},{"id":334,"depth":202,"text":335},{"id":488,"depth":202,"text":489},{"id":634,"depth":202,"text":635},{"id":759,"depth":202,"text":760},{"id":806,"depth":202,"text":807},{"id":846,"depth":202,"text":847},{"id":906,"depth":202,"text":907},{"id":1154,"depth":202,"text":1155},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.","md",null,{},{"title":85,"description":1196},"nP0406Z4TVsnIwUqdf0Vek8hNgWLWl16LRWagO6eMP0",[1203,1205],{"title":81,"path":82,"stem":83,"description":1204,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",{"title":89,"path":90,"stem":91,"description":1206,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/phone.html b/docus/dist/server-modules/phone.html new file mode 100644 index 0000000..4c1b40e --- /dev/null +++ b/docus/dist/server-modules/phone.html @@ -0,0 +1,172 @@ +Phone Usage Guide - forge-docus
Server Modules

Phone Usage Guide

The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB.

Phone Usage Guide

The phone module stores contacts, messages, and emails for each UID. It is a +server-extension state module backed by SurrealDB.

Storage Model

{
+  "contacts": ["76561198000000000", "field_commander"],
+  "messages": [
+    {
+      "id": "phone-message:sender:receiver:1",
+      "from": "sender",
+      "to": "receiver",
+      "message": "Text body",
+      "timestamp": 123.45,
+      "read": false
+    }
+  ],
+  "emails": [
+    {
+      "id": "phone-email:sender:receiver:2",
+      "from": "sender",
+      "to": "receiver",
+      "subject": "Subject",
+      "body": "Email body",
+      "timestamp": 123.45,
+      "read": false
+    }
+  ]
+}
+

Rules validated by the Rust service:

  • UID arguments cannot be empty.
  • Message and email bodies cannot be empty.
  • Empty email subjects become No subject.
  • Player messages and emails cannot target field_commander.
  • field_commander can send messages or emails to players.
  • Deleting a message or email removes it only from the requesting UID's index.

Commands

CommandArgumentsReturns
phone:inituidFull phone payload.
phone:contacts:listuidContact UID array.
phone:contacts:adduid, contact_uidtrue or false.
phone:contacts:removeuid, contact_uidtrue or false.
phone:messages:listuidMessage array.
phone:messages:threaduid, other_uidMessage array for both participants.
phone:messages:sendfrom_uid, to_uid, message, timestampMessage JSON.
phone:messages:mark_readuid, message_idtrue or false.
phone:messages:deleteuid, message_idtrue or false.
phone:emails:listuidEmail array.
phone:emails:sendfrom_uid, to_uid, subject, body, timestampEmail JSON.
phone:emails:mark_readuid, email_idtrue or false.
phone:emails:deleteuid, email_idtrue or false.
phone:removeuidOK.

Initialize Phone State

phone:init creates phone state if needed and seeds self-contact plus +field_commander.

private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]];
+private _payload = _result select 0;
+
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Phone init failed: %1", _payload];
+};
+
+private _phone = fromJSON _payload;
+

Send a Message

private _timestamp = str diag_tickTime;
+
+private _result = "forge_server" callExtension ["phone:messages:send", [
+    getPlayerUID player,
+    _targetUid,
+    "Move to checkpoint Alpha.",
+    _timestamp
+]];
+

Read a Conversation

private _result = "forge_server" callExtension ["phone:messages:thread", [
+    getPlayerUID player,
+    _otherUid
+]];
+
+private _messages = fromJSON (_result select 0);
+

Send an Email

private _result = "forge_server" callExtension ["phone:emails:send", [
+    getPlayerUID player,
+    _targetUid,
+    "Supply Request",
+    "Requesting resupply at grid 123456.",
+    str diag_tickTime
+]];
+

Mark and Delete Records

"forge_server" callExtension ["phone:messages:mark_read", [
+    getPlayerUID player,
+    _messageId
+]];
+
+"forge_server" callExtension ["phone:emails:delete", [
+    getPlayerUID player,
+    _emailId
+]];
+

Error Handling

private _payload = (_result select 0);
+if (_payload find "Error:" == 0) then {
+    systemChat format ["Phone error: %1", _payload];
+};
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/phone/_payload.json b/docus/dist/server-modules/phone/_payload.json new file mode 100644 index 0000000..06cb92f --- /dev/null +++ b/docus/dist/server-modules/phone/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1139},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-phone":145,"-server-modules-phone-surround":1134},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":89,"body":147,"description":157,"extension":1129,"links":1130,"meta":1131,"navigation":887,"path":90,"seo":1132,"stem":91,"__hash__":1133},"docs\u002F3.server-modules\u002F9.phone.md",{"type":148,"value":149,"toc":1119},"minimark",[150,154,158,163,540,543,573,577,855,859,866,913,917,961,965,997,1001,1038,1042,1087,1091,1115],[151,152,89],"h1",{"id":153},"phone-usage-guide",[155,156,157],"p",{},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"contacts\": [\"76561198000000000\", \"field_commander\"],\n \"messages\": [\n {\n \"id\": \"phone-message:sender:receiver:1\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"message\": \"Text body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ],\n \"emails\": [\n {\n \"id\": \"phone-email:sender:receiver:2\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"subject\": \"Subject\",\n \"body\": \"Email body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ]\n}\n","json","",[171,172,173,182,223,238,244,268,289,310,331,349,364,370,376,390,395,415,434,453,474,495,510,523,528,534],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sMK4o","{\n",[174,183,185,188,192,195,198,201,203,207,209,212,215,218,220],{"class":176,"line":184},2,[174,186,187],{"class":180}," \"",[174,189,191],{"class":190},"spNyl","contacts",[174,193,194],{"class":180},"\"",[174,196,197],{"class":180},":",[174,199,200],{"class":180}," [",[174,202,194],{"class":180},[174,204,206],{"class":205},"sfazB","76561198000000000",[174,208,194],{"class":180},[174,210,211],{"class":180},",",[174,213,214],{"class":180}," \"",[174,216,217],{"class":205},"field_commander",[174,219,194],{"class":180},[174,221,222],{"class":180},"],\n",[174,224,226,228,231,233,235],{"class":176,"line":225},3,[174,227,187],{"class":180},[174,229,230],{"class":190},"messages",[174,232,194],{"class":180},[174,234,197],{"class":180},[174,236,237],{"class":180}," [\n",[174,239,241],{"class":176,"line":240},4,[174,242,243],{"class":180}," {\n",[174,245,247,250,254,256,258,260,263,265],{"class":176,"line":246},5,[174,248,249],{"class":180}," \"",[174,251,253],{"class":252},"sBMFI","id",[174,255,194],{"class":180},[174,257,197],{"class":180},[174,259,214],{"class":180},[174,261,262],{"class":205},"phone-message:sender:receiver:1",[174,264,194],{"class":180},[174,266,267],{"class":180},",\n",[174,269,271,273,276,278,280,282,285,287],{"class":176,"line":270},6,[174,272,249],{"class":180},[174,274,275],{"class":252},"from",[174,277,194],{"class":180},[174,279,197],{"class":180},[174,281,214],{"class":180},[174,283,284],{"class":205},"sender",[174,286,194],{"class":180},[174,288,267],{"class":180},[174,290,292,294,297,299,301,303,306,308],{"class":176,"line":291},7,[174,293,249],{"class":180},[174,295,296],{"class":252},"to",[174,298,194],{"class":180},[174,300,197],{"class":180},[174,302,214],{"class":180},[174,304,305],{"class":205},"receiver",[174,307,194],{"class":180},[174,309,267],{"class":180},[174,311,313,315,318,320,322,324,327,329],{"class":176,"line":312},8,[174,314,249],{"class":180},[174,316,317],{"class":252},"message",[174,319,194],{"class":180},[174,321,197],{"class":180},[174,323,214],{"class":180},[174,325,326],{"class":205},"Text body",[174,328,194],{"class":180},[174,330,267],{"class":180},[174,332,334,336,339,341,343,347],{"class":176,"line":333},9,[174,335,249],{"class":180},[174,337,338],{"class":252},"timestamp",[174,340,194],{"class":180},[174,342,197],{"class":180},[174,344,346],{"class":345},"sbssI"," 123.45",[174,348,267],{"class":180},[174,350,352,354,357,359,361],{"class":176,"line":351},10,[174,353,249],{"class":180},[174,355,356],{"class":252},"read",[174,358,194],{"class":180},[174,360,197],{"class":180},[174,362,363],{"class":180}," false\n",[174,365,367],{"class":176,"line":366},11,[174,368,369],{"class":180}," }\n",[174,371,373],{"class":176,"line":372},12,[174,374,375],{"class":180}," ],\n",[174,377,379,381,384,386,388],{"class":176,"line":378},13,[174,380,187],{"class":180},[174,382,383],{"class":190},"emails",[174,385,194],{"class":180},[174,387,197],{"class":180},[174,389,237],{"class":180},[174,391,393],{"class":176,"line":392},14,[174,394,243],{"class":180},[174,396,398,400,402,404,406,408,411,413],{"class":176,"line":397},15,[174,399,249],{"class":180},[174,401,253],{"class":252},[174,403,194],{"class":180},[174,405,197],{"class":180},[174,407,214],{"class":180},[174,409,410],{"class":205},"phone-email:sender:receiver:2",[174,412,194],{"class":180},[174,414,267],{"class":180},[174,416,418,420,422,424,426,428,430,432],{"class":176,"line":417},16,[174,419,249],{"class":180},[174,421,275],{"class":252},[174,423,194],{"class":180},[174,425,197],{"class":180},[174,427,214],{"class":180},[174,429,284],{"class":205},[174,431,194],{"class":180},[174,433,267],{"class":180},[174,435,437,439,441,443,445,447,449,451],{"class":176,"line":436},17,[174,438,249],{"class":180},[174,440,296],{"class":252},[174,442,194],{"class":180},[174,444,197],{"class":180},[174,446,214],{"class":180},[174,448,305],{"class":205},[174,450,194],{"class":180},[174,452,267],{"class":180},[174,454,456,458,461,463,465,467,470,472],{"class":176,"line":455},18,[174,457,249],{"class":180},[174,459,460],{"class":252},"subject",[174,462,194],{"class":180},[174,464,197],{"class":180},[174,466,214],{"class":180},[174,468,469],{"class":205},"Subject",[174,471,194],{"class":180},[174,473,267],{"class":180},[174,475,477,479,482,484,486,488,491,493],{"class":176,"line":476},19,[174,478,249],{"class":180},[174,480,481],{"class":252},"body",[174,483,194],{"class":180},[174,485,197],{"class":180},[174,487,214],{"class":180},[174,489,490],{"class":205},"Email body",[174,492,194],{"class":180},[174,494,267],{"class":180},[174,496,498,500,502,504,506,508],{"class":176,"line":497},20,[174,499,249],{"class":180},[174,501,338],{"class":252},[174,503,194],{"class":180},[174,505,197],{"class":180},[174,507,346],{"class":345},[174,509,267],{"class":180},[174,511,513,515,517,519,521],{"class":176,"line":512},21,[174,514,249],{"class":180},[174,516,356],{"class":252},[174,518,194],{"class":180},[174,520,197],{"class":180},[174,522,363],{"class":180},[174,524,526],{"class":176,"line":525},22,[174,527,369],{"class":180},[174,529,531],{"class":176,"line":530},23,[174,532,533],{"class":180}," ]\n",[174,535,537],{"class":176,"line":536},24,[174,538,539],{"class":180},"}\n",[155,541,542],{},"Rules validated by the Rust service:",[544,545,546,550,553,560,565,570],"ul",{},[547,548,549],"li",{},"UID arguments cannot be empty.",[547,551,552],{},"Message and email bodies cannot be empty.",[547,554,555,556,559],{},"Empty email subjects become ",[171,557,558],{},"No subject",".",[547,561,562,563,559],{},"Player messages and emails cannot target ",[171,564,217],{},[547,566,567,569],{},[171,568,217],{}," can send messages or emails to players.",[547,571,572],{},"Deleting a message or email removes it only from the requesting UID's index.",[159,574,576],{"id":575},"commands","Commands",[578,579,580,596],"table",{},[581,582,583],"thead",{},[584,585,586,590,593],"tr",{},[587,588,589],"th",{},"Command",[587,591,592],{},"Arguments",[587,594,595],{},"Returns",[597,598,599,615,629,653,672,686,703,725,745,764,778,800,820,839],"tbody",{},[584,600,601,607,612],{},[602,603,604],"td",{},[171,605,606],{},"phone:init",[602,608,609],{},[171,610,611],{},"uid",[602,613,614],{},"Full phone payload.",[584,616,617,622,626],{},[602,618,619],{},[171,620,621],{},"phone:contacts:list",[602,623,624],{},[171,625,611],{},[602,627,628],{},"Contact UID array.",[584,630,631,636,644],{},[602,632,633],{},[171,634,635],{},"phone:contacts:add",[602,637,638,640,641],{},[171,639,611],{},", ",[171,642,643],{},"contact_uid",[602,645,646,649,650,559],{},[171,647,648],{},"true"," or ",[171,651,652],{},"false",[584,654,655,660,666],{},[602,656,657],{},[171,658,659],{},"phone:contacts:remove",[602,661,662,640,664],{},[171,663,611],{},[171,665,643],{},[602,667,668,649,670,559],{},[171,669,648],{},[171,671,652],{},[584,673,674,679,683],{},[602,675,676],{},[171,677,678],{},"phone:messages:list",[602,680,681],{},[171,682,611],{},[602,684,685],{},"Message array.",[584,687,688,693,700],{},[602,689,690],{},[171,691,692],{},"phone:messages:thread",[602,694,695,640,697],{},[171,696,611],{},[171,698,699],{},"other_uid",[602,701,702],{},"Message array for both participants.",[584,704,705,710,722],{},[602,706,707],{},[171,708,709],{},"phone:messages:send",[602,711,712,640,715,640,718,640,720],{},[171,713,714],{},"from_uid",[171,716,717],{},"to_uid",[171,719,317],{},[171,721,338],{},[602,723,724],{},"Message JSON.",[584,726,727,732,739],{},[602,728,729],{},[171,730,731],{},"phone:messages:mark_read",[602,733,734,640,736],{},[171,735,611],{},[171,737,738],{},"message_id",[602,740,741,649,743,559],{},[171,742,648],{},[171,744,652],{},[584,746,747,752,758],{},[602,748,749],{},[171,750,751],{},"phone:messages:delete",[602,753,754,640,756],{},[171,755,611],{},[171,757,738],{},[602,759,760,649,762,559],{},[171,761,648],{},[171,763,652],{},[584,765,766,771,775],{},[602,767,768],{},[171,769,770],{},"phone:emails:list",[602,772,773],{},[171,774,611],{},[602,776,777],{},"Email array.",[584,779,780,785,797],{},[602,781,782],{},[171,783,784],{},"phone:emails:send",[602,786,787,640,789,640,791,640,793,640,795],{},[171,788,714],{},[171,790,717],{},[171,792,460],{},[171,794,481],{},[171,796,338],{},[602,798,799],{},"Email JSON.",[584,801,802,807,814],{},[602,803,804],{},[171,805,806],{},"phone:emails:mark_read",[602,808,809,640,811],{},[171,810,611],{},[171,812,813],{},"email_id",[602,815,816,649,818,559],{},[171,817,648],{},[171,819,652],{},[584,821,822,827,833],{},[602,823,824],{},[171,825,826],{},"phone:emails:delete",[602,828,829,640,831],{},[171,830,611],{},[171,832,813],{},[602,834,835,649,837,559],{},[171,836,648],{},[171,838,652],{},[584,840,841,846,850],{},[602,842,843],{},[171,844,845],{},"phone:remove",[602,847,848],{},[171,849,611],{},[602,851,852,559],{},[171,853,854],{},"OK",[159,856,858],{"id":857},"initialize-phone-state","Initialize Phone State",[155,860,861,863,864,559],{},[171,862,606],{}," creates phone state if needed and seeds self-contact plus\n",[171,865,217],{},[164,867,871],{"className":868,"code":869,"language":870,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Phone init failed: %1\", _payload];\n};\n\nprivate _phone = fromJSON _payload;\n","sqf",[171,872,873,878,883,889,894,899,904,908],{"__ignoreMap":169},[174,874,875],{"class":176,"line":177},[174,876,877],{},"private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\n",[174,879,880],{"class":176,"line":184},[174,881,882],{},"private _payload = _result select 0;\n",[174,884,885],{"class":176,"line":225},[174,886,888],{"emptyLinePlaceholder":887},true,"\n",[174,890,891],{"class":176,"line":240},[174,892,893],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[174,895,896],{"class":176,"line":246},[174,897,898],{}," systemChat format [\"Phone init failed: %1\", _payload];\n",[174,900,901],{"class":176,"line":270},[174,902,903],{},"};\n",[174,905,906],{"class":176,"line":291},[174,907,888],{"emptyLinePlaceholder":887},[174,909,910],{"class":176,"line":312},[174,911,912],{},"private _phone = fromJSON _payload;\n",[159,914,916],{"id":915},"send-a-message","Send a Message",[164,918,920],{"className":868,"code":919,"language":870,"meta":169,"style":169},"private _timestamp = str diag_tickTime;\n\nprivate _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n getPlayerUID player,\n _targetUid,\n \"Move to checkpoint Alpha.\",\n _timestamp\n]];\n",[171,921,922,927,931,936,941,946,951,956],{"__ignoreMap":169},[174,923,924],{"class":176,"line":177},[174,925,926],{},"private _timestamp = str diag_tickTime;\n",[174,928,929],{"class":176,"line":184},[174,930,888],{"emptyLinePlaceholder":887},[174,932,933],{"class":176,"line":225},[174,934,935],{},"private _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n",[174,937,938],{"class":176,"line":240},[174,939,940],{}," getPlayerUID player,\n",[174,942,943],{"class":176,"line":246},[174,944,945],{}," _targetUid,\n",[174,947,948],{"class":176,"line":270},[174,949,950],{}," \"Move to checkpoint Alpha.\",\n",[174,952,953],{"class":176,"line":291},[174,954,955],{}," _timestamp\n",[174,957,958],{"class":176,"line":312},[174,959,960],{},"]];\n",[159,962,964],{"id":963},"read-a-conversation","Read a Conversation",[164,966,968],{"className":868,"code":967,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n getPlayerUID player,\n _otherUid\n]];\n\nprivate _messages = fromJSON (_result select 0);\n",[171,969,970,975,979,984,988,992],{"__ignoreMap":169},[174,971,972],{"class":176,"line":177},[174,973,974],{},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n",[174,976,977],{"class":176,"line":184},[174,978,940],{},[174,980,981],{"class":176,"line":225},[174,982,983],{}," _otherUid\n",[174,985,986],{"class":176,"line":240},[174,987,960],{},[174,989,990],{"class":176,"line":246},[174,991,888],{"emptyLinePlaceholder":887},[174,993,994],{"class":176,"line":270},[174,995,996],{},"private _messages = fromJSON (_result select 0);\n",[159,998,1000],{"id":999},"send-an-email","Send an Email",[164,1002,1004],{"className":868,"code":1003,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n getPlayerUID player,\n _targetUid,\n \"Supply Request\",\n \"Requesting resupply at grid 123456.\",\n str diag_tickTime\n]];\n",[171,1005,1006,1011,1015,1019,1024,1029,1034],{"__ignoreMap":169},[174,1007,1008],{"class":176,"line":177},[174,1009,1010],{},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n",[174,1012,1013],{"class":176,"line":184},[174,1014,940],{},[174,1016,1017],{"class":176,"line":225},[174,1018,945],{},[174,1020,1021],{"class":176,"line":240},[174,1022,1023],{}," \"Supply Request\",\n",[174,1025,1026],{"class":176,"line":246},[174,1027,1028],{}," \"Requesting resupply at grid 123456.\",\n",[174,1030,1031],{"class":176,"line":270},[174,1032,1033],{}," str diag_tickTime\n",[174,1035,1036],{"class":176,"line":291},[174,1037,960],{},[159,1039,1041],{"id":1040},"mark-and-delete-records","Mark and Delete Records",[164,1043,1045],{"className":868,"code":1044,"language":870,"meta":169,"style":169},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n getPlayerUID player,\n _messageId\n]];\n\n\"forge_server\" callExtension [\"phone:emails:delete\", [\n getPlayerUID player,\n _emailId\n]];\n",[171,1046,1047,1052,1056,1061,1065,1069,1074,1078,1083],{"__ignoreMap":169},[174,1048,1049],{"class":176,"line":177},[174,1050,1051],{},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n",[174,1053,1054],{"class":176,"line":184},[174,1055,940],{},[174,1057,1058],{"class":176,"line":225},[174,1059,1060],{}," _messageId\n",[174,1062,1063],{"class":176,"line":240},[174,1064,960],{},[174,1066,1067],{"class":176,"line":246},[174,1068,888],{"emptyLinePlaceholder":887},[174,1070,1071],{"class":176,"line":270},[174,1072,1073],{},"\"forge_server\" callExtension [\"phone:emails:delete\", [\n",[174,1075,1076],{"class":176,"line":291},[174,1077,940],{},[174,1079,1080],{"class":176,"line":312},[174,1081,1082],{}," _emailId\n",[174,1084,1085],{"class":176,"line":333},[174,1086,960],{},[159,1088,1090],{"id":1089},"error-handling","Error Handling",[164,1092,1094],{"className":868,"code":1093,"language":870,"meta":169,"style":169},"private _payload = (_result select 0);\nif (_payload find \"Error:\" == 0) then {\n systemChat format [\"Phone error: %1\", _payload];\n};\n",[171,1095,1096,1101,1106,1111],{"__ignoreMap":169},[174,1097,1098],{"class":176,"line":177},[174,1099,1100],{},"private _payload = (_result select 0);\n",[174,1102,1103],{"class":176,"line":184},[174,1104,1105],{},"if (_payload find \"Error:\" == 0) then {\n",[174,1107,1108],{"class":176,"line":225},[174,1109,1110],{}," systemChat format [\"Phone error: %1\", _payload];\n",[174,1112,1113],{"class":176,"line":240},[174,1114,903],{},[1116,1117,1118],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":184,"depth":184,"links":1120},[1121,1122,1123,1124,1125,1126,1127,1128],{"id":161,"depth":184,"text":162},{"id":575,"depth":184,"text":576},{"id":857,"depth":184,"text":858},{"id":915,"depth":184,"text":916},{"id":963,"depth":184,"text":964},{"id":999,"depth":184,"text":1000},{"id":1040,"depth":184,"text":1041},{"id":1089,"depth":184,"text":1090},"md",null,{},{"title":89,"description":157},"elJIYhe9Y4PRTMP0qH-9WZBe1BS2fDPtsEpKldSRzNI",[1135,1137],{"title":85,"path":86,"stem":87,"description":1136,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",{"title":99,"path":95,"stem":96,"description":1138,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/store.html b/docus/dist/server-modules/store.html new file mode 100644 index 0000000..6561b07 --- /dev/null +++ b/docus/dist/server-modules/store.html @@ -0,0 +1,198 @@ +Store Usage Guide - forge-docus
Server Modules

Store Usage Guide

The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks.

Store Usage Guide

The store module processes checkout requests. It charges a payment source and +grants purchased items to the player locker, virtual arsenal locker, and +virtual garage unlocks.

Server SQF Module

The server addon uses two long-lived module objects:

  • StorefrontStore is the storefront workflow facade. It builds hydrate +payloads, validates checkout requests, calls the Rust store:checkout +command, syncs UI patches, and asks related module stores to save hot state.
  • StoreCatalogService scans configured item and vehicle categories, builds +catalog responses, resolves checkout entries, and calculates authoritative +prices.

Editor-placed store entities are initialized by fnc_initStore during store +post-init. The initializer matches non-null mission namespace objects whose +variable names contain store and sets isStore = true, following the same +pattern used by garage entities.

Checkout Model

store:checkout accepts one JSON context.

{
+  "requesterUid": "76561198000000000",
+  "requesterName": "Player Name",
+  "orgId": "default",
+  "requesterIsDefaultOrgCeo": false,
+  "paymentMethod": "bank",
+  "items": [
+    {
+      "classname": "arifle_MX_F",
+      "category": "weapon",
+      "priceValue": 500,
+      "quantity": 1
+    }
+  ],
+  "vehicles": [
+    {
+      "classname": "B_Quadbike_01_F",
+      "category": "cars",
+      "priceValue": 1500
+    }
+  ]
+}
+

Rules validated by the Rust service:

  • requesterUid is required.
  • At least one item or vehicle is required.
  • The checkout total must be greater than zero.
  • Item categories must be item, attachment, weapon, magazine, or +backpack.
  • Vehicle categories must be cars, armor, helis, planes, naval, or +other.
  • Payment method must be cash, bank, org_funds, or credit_line.
  • Player locker capacity cannot exceed 25 unique items after checkout.
  • Organization funds can only be charged by the org owner or the default org +CEO flag.

Command

CommandArgumentsReturns
store:checkoutcheckout_jsonCheckout result JSON.

Result Model

{
+  "chargedTotal": 2000.0,
+  "paymentMethod": "bank",
+  "message": "Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).",
+  "lockerGranted": [],
+  "vehicleGranted": [],
+  "lockerPatch": {},
+  "vaPatch": {},
+  "vgaragePatch": {},
+  "bankPatch": {},
+  "orgPatch": {},
+  "orgTargetUids": []
+}
+

Patch fields are intended for UI updates after checkout. The service commits +all grants and payment changes together, and attempts rollback if a later write +fails.

Player Bank Checkout

private _item = createHashMapFromArray [
+    ["classname", "arifle_MX_F"],
+    ["category", "weapon"],
+    ["priceValue", 500],
+    ["quantity", 1]
+];
+
+private _checkout = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["requesterName", name player],
+    ["orgId", "default"],
+    ["requesterIsDefaultOrgCeo", false],
+    ["paymentMethod", "bank"],
+    ["items", [_item]],
+    ["vehicles", []]
+];
+
+private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]];
+

Organization Funds Checkout

When paymentMethod is org_funds, vehicles are also added to the +organization fleet patch.

private _vehicle = createHashMapFromArray [
+    ["classname", "B_Quadbike_01_F"],
+    ["category", "cars"],
+    ["priceValue", 1500]
+];
+
+private _checkout = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["requesterName", name player],
+    ["orgId", _orgId],
+    ["requesterIsDefaultOrgCeo", false],
+    ["paymentMethod", "org_funds"],
+    ["items", []],
+    ["vehicles", [_vehicle]]
+];
+
+private _result = "forge_server" callExtension ["store:checkout", [toJSON _checkout]];
+

Error Handling

private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    hint format ["Checkout failed: %1", _payload];
+};
+
+private _checkoutResult = fromJSON _payload;
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/store/_payload.json b/docus/dist/server-modules/store/_payload.json new file mode 100644 index 0000000..c732bc6 --- /dev/null +++ b/docus/dist/server-modules/store/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1088},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-store":145,"-server-modules-store-surround":1083},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":53,"body":147,"description":157,"extension":1078,"links":1079,"meta":1080,"navigation":878,"path":54,"seo":1081,"stem":55,"__hash__":1082},"docs\u002F3.server-modules\u002F10.store.md",{"type":148,"value":149,"toc":1069},"minimark",[150,154,158,163,166,187,202,206,211,535,538,612,616,652,656,830,833,837,933,937,946,1027,1031,1065],[151,152,53],"h1",{"id":153},"store-usage-guide",[155,156,157],"p",{},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",[159,160,162],"h2",{"id":161},"server-sqf-module","Server SQF Module",[155,164,165],{},"The server addon uses two long-lived module objects:",[167,168,169,181],"ul",{},[170,171,172,176,177,180],"li",{},[173,174,175],"code",{},"StorefrontStore"," is the storefront workflow facade. It builds hydrate\npayloads, validates checkout requests, calls the Rust ",[173,178,179],{},"store:checkout","\ncommand, syncs UI patches, and asks related module stores to save hot state.",[170,182,183,186],{},[173,184,185],{},"StoreCatalogService"," scans configured item and vehicle categories, builds\ncatalog responses, resolves checkout entries, and calculates authoritative\nprices.",[155,188,189,190,193,194,197,198,201],{},"Editor-placed store entities are initialized by ",[173,191,192],{},"fnc_initStore"," during store\npost-init. The initializer matches non-null mission namespace objects whose\nvariable names contain ",[173,195,196],{},"store"," and sets ",[173,199,200],{},"isStore = true",", following the same\npattern used by garage entities.",[159,203,205],{"id":204},"checkout-model","Checkout Model",[155,207,208,210],{},[173,209,179],{}," accepts one JSON context.",[212,213,218],"pre",{"className":214,"code":215,"language":216,"meta":217,"style":217},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"requesterName\": \"Player Name\",\n \"orgId\": \"default\",\n \"requesterIsDefaultOrgCeo\": false,\n \"paymentMethod\": \"bank\",\n \"items\": [\n {\n \"classname\": \"arifle_MX_F\",\n \"category\": \"weapon\",\n \"priceValue\": 500,\n \"quantity\": 1\n }\n ],\n \"vehicles\": [\n {\n \"classname\": \"B_Quadbike_01_F\",\n \"category\": \"cars\",\n \"priceValue\": 1500\n }\n ]\n}\n","json","",[173,219,220,229,257,278,299,314,335,350,356,379,400,418,433,439,445,459,464,484,504,518,523,529],{"__ignoreMap":217},[221,222,225],"span",{"class":223,"line":224},"line",1,[221,226,228],{"class":227},"sMK4o","{\n",[221,230,232,235,239,242,245,248,252,254],{"class":223,"line":231},2,[221,233,234],{"class":227}," \"",[221,236,238],{"class":237},"spNyl","requesterUid",[221,240,241],{"class":227},"\"",[221,243,244],{"class":227},":",[221,246,247],{"class":227}," \"",[221,249,251],{"class":250},"sfazB","76561198000000000",[221,253,241],{"class":227},[221,255,256],{"class":227},",\n",[221,258,260,262,265,267,269,271,274,276],{"class":223,"line":259},3,[221,261,234],{"class":227},[221,263,264],{"class":237},"requesterName",[221,266,241],{"class":227},[221,268,244],{"class":227},[221,270,247],{"class":227},[221,272,273],{"class":250},"Player Name",[221,275,241],{"class":227},[221,277,256],{"class":227},[221,279,281,283,286,288,290,292,295,297],{"class":223,"line":280},4,[221,282,234],{"class":227},[221,284,285],{"class":237},"orgId",[221,287,241],{"class":227},[221,289,244],{"class":227},[221,291,247],{"class":227},[221,293,294],{"class":250},"default",[221,296,241],{"class":227},[221,298,256],{"class":227},[221,300,302,304,307,309,311],{"class":223,"line":301},5,[221,303,234],{"class":227},[221,305,306],{"class":237},"requesterIsDefaultOrgCeo",[221,308,241],{"class":227},[221,310,244],{"class":227},[221,312,313],{"class":227}," false,\n",[221,315,317,319,322,324,326,328,331,333],{"class":223,"line":316},6,[221,318,234],{"class":227},[221,320,321],{"class":237},"paymentMethod",[221,323,241],{"class":227},[221,325,244],{"class":227},[221,327,247],{"class":227},[221,329,330],{"class":250},"bank",[221,332,241],{"class":227},[221,334,256],{"class":227},[221,336,338,340,343,345,347],{"class":223,"line":337},7,[221,339,234],{"class":227},[221,341,342],{"class":237},"items",[221,344,241],{"class":227},[221,346,244],{"class":227},[221,348,349],{"class":227}," [\n",[221,351,353],{"class":223,"line":352},8,[221,354,355],{"class":227}," {\n",[221,357,359,362,366,368,370,372,375,377],{"class":223,"line":358},9,[221,360,361],{"class":227}," \"",[221,363,365],{"class":364},"sBMFI","classname",[221,367,241],{"class":227},[221,369,244],{"class":227},[221,371,247],{"class":227},[221,373,374],{"class":250},"arifle_MX_F",[221,376,241],{"class":227},[221,378,256],{"class":227},[221,380,382,384,387,389,391,393,396,398],{"class":223,"line":381},10,[221,383,361],{"class":227},[221,385,386],{"class":364},"category",[221,388,241],{"class":227},[221,390,244],{"class":227},[221,392,247],{"class":227},[221,394,395],{"class":250},"weapon",[221,397,241],{"class":227},[221,399,256],{"class":227},[221,401,403,405,408,410,412,416],{"class":223,"line":402},11,[221,404,361],{"class":227},[221,406,407],{"class":364},"priceValue",[221,409,241],{"class":227},[221,411,244],{"class":227},[221,413,415],{"class":414},"sbssI"," 500",[221,417,256],{"class":227},[221,419,421,423,426,428,430],{"class":223,"line":420},12,[221,422,361],{"class":227},[221,424,425],{"class":364},"quantity",[221,427,241],{"class":227},[221,429,244],{"class":227},[221,431,432],{"class":414}," 1\n",[221,434,436],{"class":223,"line":435},13,[221,437,438],{"class":227}," }\n",[221,440,442],{"class":223,"line":441},14,[221,443,444],{"class":227}," ],\n",[221,446,448,450,453,455,457],{"class":223,"line":447},15,[221,449,234],{"class":227},[221,451,452],{"class":237},"vehicles",[221,454,241],{"class":227},[221,456,244],{"class":227},[221,458,349],{"class":227},[221,460,462],{"class":223,"line":461},16,[221,463,355],{"class":227},[221,465,467,469,471,473,475,477,480,482],{"class":223,"line":466},17,[221,468,361],{"class":227},[221,470,365],{"class":364},[221,472,241],{"class":227},[221,474,244],{"class":227},[221,476,247],{"class":227},[221,478,479],{"class":250},"B_Quadbike_01_F",[221,481,241],{"class":227},[221,483,256],{"class":227},[221,485,487,489,491,493,495,497,500,502],{"class":223,"line":486},18,[221,488,361],{"class":227},[221,490,386],{"class":364},[221,492,241],{"class":227},[221,494,244],{"class":227},[221,496,247],{"class":227},[221,498,499],{"class":250},"cars",[221,501,241],{"class":227},[221,503,256],{"class":227},[221,505,507,509,511,513,515],{"class":223,"line":506},19,[221,508,361],{"class":227},[221,510,407],{"class":364},[221,512,241],{"class":227},[221,514,244],{"class":227},[221,516,517],{"class":414}," 1500\n",[221,519,521],{"class":223,"line":520},20,[221,522,438],{"class":227},[221,524,526],{"class":223,"line":525},21,[221,527,528],{"class":227}," ]\n",[221,530,532],{"class":223,"line":531},22,[221,533,534],{"class":227},"}\n",[155,536,537],{},"Rules validated by the Rust service:",[167,539,540,545,548,551,571,591,606,609],{},[170,541,542,544],{},[173,543,238],{}," is required.",[170,546,547],{},"At least one item or vehicle is required.",[170,549,550],{},"The checkout total must be greater than zero.",[170,552,553,554,557,558,557,561,557,563,566,567,570],{},"Item categories must be ",[173,555,556],{},"item",", ",[173,559,560],{},"attachment",[173,562,395],{},[173,564,565],{},"magazine",", or\n",[173,568,569],{},"backpack",".",[170,572,573,574,557,576,557,579,557,582,557,585,566,588,570],{},"Vehicle categories must be ",[173,575,499],{},[173,577,578],{},"armor",[173,580,581],{},"helis",[173,583,584],{},"planes",[173,586,587],{},"naval",[173,589,590],{},"other",[170,592,593,594,557,597,557,599,602,603,570],{},"Payment method must be ",[173,595,596],{},"cash",[173,598,330],{},[173,600,601],{},"org_funds",", or ",[173,604,605],{},"credit_line",[170,607,608],{},"Player locker capacity cannot exceed 25 unique items after checkout.",[170,610,611],{},"Organization funds can only be charged by the org owner or the default org\nCEO flag.",[159,613,615],{"id":614},"command","Command",[617,618,619,634],"table",{},[620,621,622],"thead",{},[623,624,625,628,631],"tr",{},[626,627,615],"th",{},[626,629,630],{},"Arguments",[626,632,633],{},"Returns",[635,636,637],"tbody",{},[623,638,639,644,649],{},[640,641,642],"td",{},[173,643,179],{},[640,645,646],{},[173,647,648],{},"checkout_json",[640,650,651],{},"Checkout result JSON.",[159,653,655],{"id":654},"result-model","Result Model",[212,657,659],{"className":214,"code":658,"language":216,"meta":217,"style":217},"{\n \"chargedTotal\": 2000.0,\n \"paymentMethod\": \"bank\",\n \"message\": \"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).\",\n \"lockerGranted\": [],\n \"vehicleGranted\": [],\n \"lockerPatch\": {},\n \"vaPatch\": {},\n \"vgaragePatch\": {},\n \"bankPatch\": {},\n \"orgPatch\": {},\n \"orgTargetUids\": []\n}\n",[173,660,661,665,681,699,719,733,746,760,773,786,799,812,826],{"__ignoreMap":217},[221,662,663],{"class":223,"line":224},[221,664,228],{"class":227},[221,666,667,669,672,674,676,679],{"class":223,"line":231},[221,668,234],{"class":227},[221,670,671],{"class":237},"chargedTotal",[221,673,241],{"class":227},[221,675,244],{"class":227},[221,677,678],{"class":414}," 2000.0",[221,680,256],{"class":227},[221,682,683,685,687,689,691,693,695,697],{"class":223,"line":259},[221,684,234],{"class":227},[221,686,321],{"class":237},[221,688,241],{"class":227},[221,690,244],{"class":227},[221,692,247],{"class":227},[221,694,330],{"class":250},[221,696,241],{"class":227},[221,698,256],{"class":227},[221,700,701,703,706,708,710,712,715,717],{"class":223,"line":280},[221,702,234],{"class":227},[221,704,705],{"class":237},"message",[221,707,241],{"class":227},[221,709,244],{"class":227},[221,711,247],{"class":227},[221,713,714],{"class":250},"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).",[221,716,241],{"class":227},[221,718,256],{"class":227},[221,720,721,723,726,728,730],{"class":223,"line":301},[221,722,234],{"class":227},[221,724,725],{"class":237},"lockerGranted",[221,727,241],{"class":227},[221,729,244],{"class":227},[221,731,732],{"class":227}," [],\n",[221,734,735,737,740,742,744],{"class":223,"line":316},[221,736,234],{"class":227},[221,738,739],{"class":237},"vehicleGranted",[221,741,241],{"class":227},[221,743,244],{"class":227},[221,745,732],{"class":227},[221,747,748,750,753,755,757],{"class":223,"line":337},[221,749,234],{"class":227},[221,751,752],{"class":237},"lockerPatch",[221,754,241],{"class":227},[221,756,244],{"class":227},[221,758,759],{"class":227}," {},\n",[221,761,762,764,767,769,771],{"class":223,"line":352},[221,763,234],{"class":227},[221,765,766],{"class":237},"vaPatch",[221,768,241],{"class":227},[221,770,244],{"class":227},[221,772,759],{"class":227},[221,774,775,777,780,782,784],{"class":223,"line":358},[221,776,234],{"class":227},[221,778,779],{"class":237},"vgaragePatch",[221,781,241],{"class":227},[221,783,244],{"class":227},[221,785,759],{"class":227},[221,787,788,790,793,795,797],{"class":223,"line":381},[221,789,234],{"class":227},[221,791,792],{"class":237},"bankPatch",[221,794,241],{"class":227},[221,796,244],{"class":227},[221,798,759],{"class":227},[221,800,801,803,806,808,810],{"class":223,"line":402},[221,802,234],{"class":227},[221,804,805],{"class":237},"orgPatch",[221,807,241],{"class":227},[221,809,244],{"class":227},[221,811,759],{"class":227},[221,813,814,816,819,821,823],{"class":223,"line":420},[221,815,234],{"class":227},[221,817,818],{"class":237},"orgTargetUids",[221,820,241],{"class":227},[221,822,244],{"class":227},[221,824,825],{"class":227}," []\n",[221,827,828],{"class":223,"line":435},[221,829,534],{"class":227},[155,831,832],{},"Patch fields are intended for UI updates after checkout. The service commits\nall grants and payment changes together, and attempts rollback if a later write\nfails.",[159,834,836],{"id":835},"player-bank-checkout","Player Bank Checkout",[212,838,842],{"className":839,"code":840,"language":841,"meta":217,"style":217},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _item = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"category\", \"weapon\"],\n [\"priceValue\", 500],\n [\"quantity\", 1]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [_item]],\n [\"vehicles\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n","sqf",[173,843,844,849,854,859,864,869,874,880,885,890,895,900,905,910,915,920,924,928],{"__ignoreMap":217},[221,845,846],{"class":223,"line":224},[221,847,848],{},"private _item = createHashMapFromArray [\n",[221,850,851],{"class":223,"line":231},[221,852,853],{}," [\"classname\", \"arifle_MX_F\"],\n",[221,855,856],{"class":223,"line":259},[221,857,858],{}," [\"category\", \"weapon\"],\n",[221,860,861],{"class":223,"line":280},[221,862,863],{}," [\"priceValue\", 500],\n",[221,865,866],{"class":223,"line":301},[221,867,868],{}," [\"quantity\", 1]\n",[221,870,871],{"class":223,"line":316},[221,872,873],{},"];\n",[221,875,876],{"class":223,"line":337},[221,877,879],{"emptyLinePlaceholder":878},true,"\n",[221,881,882],{"class":223,"line":352},[221,883,884],{},"private _checkout = createHashMapFromArray [\n",[221,886,887],{"class":223,"line":358},[221,888,889],{}," [\"requesterUid\", getPlayerUID player],\n",[221,891,892],{"class":223,"line":381},[221,893,894],{}," [\"requesterName\", name player],\n",[221,896,897],{"class":223,"line":402},[221,898,899],{}," [\"orgId\", \"default\"],\n",[221,901,902],{"class":223,"line":420},[221,903,904],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[221,906,907],{"class":223,"line":435},[221,908,909],{}," [\"paymentMethod\", \"bank\"],\n",[221,911,912],{"class":223,"line":441},[221,913,914],{}," [\"items\", [_item]],\n",[221,916,917],{"class":223,"line":447},[221,918,919],{}," [\"vehicles\", []]\n",[221,921,922],{"class":223,"line":461},[221,923,873],{},[221,925,926],{"class":223,"line":466},[221,927,879],{"emptyLinePlaceholder":878},[221,929,930],{"class":223,"line":486},[221,931,932],{},"private _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[159,934,936],{"id":935},"organization-funds-checkout","Organization Funds Checkout",[155,938,939,940,942,943,945],{},"When ",[173,941,321],{}," is ",[173,944,601],{},", vehicles are also added to the\norganization fleet patch.",[212,947,949],{"className":839,"code":948,"language":841,"meta":217,"style":217},"private _vehicle = createHashMapFromArray [\n [\"classname\", \"B_Quadbike_01_F\"],\n [\"category\", \"cars\"],\n [\"priceValue\", 1500]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"org_funds\"],\n [\"items\", []],\n [\"vehicles\", [_vehicle]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[173,950,951,956,961,966,971,975,979,983,987,991,996,1000,1005,1010,1015,1019,1023],{"__ignoreMap":217},[221,952,953],{"class":223,"line":224},[221,954,955],{},"private _vehicle = createHashMapFromArray [\n",[221,957,958],{"class":223,"line":231},[221,959,960],{}," [\"classname\", \"B_Quadbike_01_F\"],\n",[221,962,963],{"class":223,"line":259},[221,964,965],{}," [\"category\", \"cars\"],\n",[221,967,968],{"class":223,"line":280},[221,969,970],{}," [\"priceValue\", 1500]\n",[221,972,973],{"class":223,"line":301},[221,974,873],{},[221,976,977],{"class":223,"line":316},[221,978,879],{"emptyLinePlaceholder":878},[221,980,981],{"class":223,"line":337},[221,982,884],{},[221,984,985],{"class":223,"line":352},[221,986,889],{},[221,988,989],{"class":223,"line":358},[221,990,894],{},[221,992,993],{"class":223,"line":381},[221,994,995],{}," [\"orgId\", _orgId],\n",[221,997,998],{"class":223,"line":402},[221,999,904],{},[221,1001,1002],{"class":223,"line":420},[221,1003,1004],{}," [\"paymentMethod\", \"org_funds\"],\n",[221,1006,1007],{"class":223,"line":435},[221,1008,1009],{}," [\"items\", []],\n",[221,1011,1012],{"class":223,"line":441},[221,1013,1014],{}," [\"vehicles\", [_vehicle]]\n",[221,1016,1017],{"class":223,"line":447},[221,1018,873],{},[221,1020,1021],{"class":223,"line":461},[221,1022,879],{"emptyLinePlaceholder":878},[221,1024,1025],{"class":223,"line":466},[221,1026,932],{},[159,1028,1030],{"id":1029},"error-handling","Error Handling",[212,1032,1034],{"className":839,"code":1033,"language":841,"meta":217,"style":217},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Checkout failed: %1\", _payload];\n};\n\nprivate _checkoutResult = fromJSON _payload;\n",[173,1035,1036,1041,1046,1051,1056,1060],{"__ignoreMap":217},[221,1037,1038],{"class":223,"line":224},[221,1039,1040],{},"private _payload = _result select 0;\n",[221,1042,1043],{"class":223,"line":231},[221,1044,1045],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[221,1047,1048],{"class":223,"line":259},[221,1049,1050],{}," hint format [\"Checkout failed: %1\", _payload];\n",[221,1052,1053],{"class":223,"line":280},[221,1054,1055],{},"};\n",[221,1057,1058],{"class":223,"line":301},[221,1059,879],{"emptyLinePlaceholder":878},[221,1061,1062],{"class":223,"line":316},[221,1063,1064],{},"private _checkoutResult = fromJSON _payload;\n",[1066,1067,1068],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":217,"searchDepth":231,"depth":231,"links":1070},[1071,1072,1073,1074,1075,1076,1077],{"id":161,"depth":231,"text":162},{"id":204,"depth":231,"text":205},{"id":614,"depth":231,"text":615},{"id":654,"depth":231,"text":655},{"id":835,"depth":231,"text":836},{"id":935,"depth":231,"text":936},{"id":1029,"depth":231,"text":1030},"md",null,{},{"title":53,"description":157},"PagD8Wx8XDQTlB6cdVUen7XOkIgjt96Gazqirt2_9qw",[1084,1086],{"title":49,"path":50,"stem":51,"description":1085,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",{"title":57,"path":58,"stem":59,"description":1087,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/task.html b/docus/dist/server-modules/task.html new file mode 100644 index 0000000..29633b8 --- /dev/null +++ b/docus/dist/server-modules/task.html @@ -0,0 +1,219 @@ +Task Usage Guide - forge-docus
Server Modules

Task Usage Guide

The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants.

Task Usage Guide

The task module stores transient mission task metadata for active server or +mission lifecycle workflows. SQF still owns Arma-only runtime state such as +objects and participants.

The server addon at arma/server/addons/task also owns task execution: +creating BIS tasks, registering task entities, tracking participants, binding +task ownership, applying player/org rewards, and clearing task state when a +task completes.

Runtime dependencies:

  • forge_server_extension
  • forge_server_common
  • forge_server_actor
  • forge_server_bank
  • forge_server_org
  • forge_client_notifications

Data Model

Catalog entries are flexible JSON objects. The service normalizes these fields +when a catalog entry is inserted or ownership changes:

  • taskId
  • taskID
  • accepted
  • requesterUid
  • orgID

Ownership context:

{
+  "requesterUid": "76561198000000000",
+  "orgId": "default"
+}
+

Commands

CommandArgumentsReturns
task:resetnonetrue.
task:catalog:activenoneActive catalog entry array JSON.
task:catalog:gettask_idCatalog entry JSON or null.
task:catalog:upserttask_id, entry_jsonStored catalog entry JSON.
task:catalog:deletetask_idtrue.
task:ownership:bindtask_id, ownership_jsonOwnership mutation result JSON.
task:ownership:releasetask_idOwnership mutation result JSON.
task:ownership:accepttask_id, ownership_jsonOwnership mutation result JSON.
task:ownership:reward_contexttask_idReward context JSON.
task:status:settask_id, statustrue.
task:status:gettask_idStatus string JSON.
task:status:cleartask_idtrue.
task:defuse:incrementtask_idNew counter value JSON.
task:defuse:gettask_idCounter value JSON.
task:cleartask_idtrue.

Upsert a Catalog Entry

private _entry = createHashMapFromArray [
+    ["title", "Destroy Cache"],
+    ["description", "Destroy the enemy supply cache."],
+    ["reward", 1500]
+];
+
+private _result = "forge_server" callExtension ["task:catalog:upsert", [
+    "task-cache-1",
+    toJSON _entry
+]];
+

Mark a Task Active

"forge_server" callExtension ["task:status:set", [
+    "task-cache-1",
+    "active"
+]];
+
+private _active = "forge_server" callExtension ["task:catalog:active", []];
+

Completed statuses succeeded and failed are also stored as completed status +fallbacks. Clearing status removes active and completed state.

Accept a Task

private _ownership = createHashMapFromArray [
+    ["requesterUid", getPlayerUID player],
+    ["orgId", "default"]
+];
+
+private _result = "forge_server" callExtension ["task:ownership:accept", [
+    "task-cache-1",
+    toJSON _ownership
+]];
+

task:ownership:accept fails if the task is not active or another requester +already accepted it.

Rewards

private _result = "forge_server" callExtension ["task:ownership:reward_context", [
+    "task-cache-1"
+]];
+
+private _context = fromJSON (_result select 0);
+

The reward context contains requesterUid and orgId.

Server Task Flows

The task addon provides these server-owned task flows:

  • attack
  • defend
  • defuse
  • delivery
  • destroy
  • hostage
  • hvt

Mission designers can create tasks in four ways:

  • Eden modules for editor-authored tasks.
  • forge_server_task_fnc_startTask for script-authored tasks.
  • forge_server_task_fnc_handler for pre-registered entities with reputation +gating and ownership binding. This path expects the BIS task and catalog +entry to already exist if map-task and CAD visibility are required.
  • Direct task function calls for server-owned or mission-authored flows that +intentionally fall back to the default org. This path expects the BIS task +to already exist if map-task visibility is required.

The dynamic mission manager can also generate attack tasks from config. That is +system-generated content rather than a hand-authored task creation path.

CAD Compatibility

CAD hydrates assignable tasks from TaskStore.getActiveTaskCatalog. A task must +have a catalog entry and active task status before CAD can show and assign it.

CAD-compatible creation paths:

  • Eden modules: compatible because they delegate to +forge_server_task_fnc_startTask.
  • forge_server_task_fnc_startTask: compatible because it registers the +catalog entry, creates the BIS task, and dispatches through the handler.
  • Dynamic mission manager attack tasks: compatible because the mission manager +uses forge_server_task_fnc_startTask.

Limited or incompatible paths:

  • forge_server_task_fnc_handler: only compatible if a catalog entry was +already registered elsewhere. The handler sets active status and ownership, +but it does not create the BIS task shown in the map task tab or upsert the +catalog entry.
  • Direct task function calls: not CAD-compatible by default. They bypass +startTask and usually do not register the task catalog entry or active +status that CAD hydrates from. They also only call BIS_fnc_taskSetState at +completion/failure; they do not create the BIS task first.

BIS Map Task Prerequisite

Only the Eden task modules and forge_server_task_fnc_startTask create the BIS +task automatically through BIS_fnc_taskCreate.

If a mission uses forge_server_task_fnc_handler directly or calls a task flow +function such as forge_server_task_fnc_attack, the mission must create a BIS +task with the same task ID before the Forge task completes. Otherwise the +success/failure BIS_fnc_taskSetState call has no visible map task to update.

That prerequisite can be satisfied with a vanilla Eden task creation module or +a scripted BIS_fnc_taskCreate call. forge_server_task_fnc_startTask is the +preferred Forge path because it handles BIS task creation, Forge catalog +registration, entity registration, and handler dispatch together.

Eden Modules

Eden task modules are the normal designer-facing path. Place the module, +configure its attributes, and sync it to the relevant entities or grouping +modules.

Available task modules:

  • FORGE_Module_Attack: sync directly to target units or vehicles.
  • FORGE_Module_Destroy: sync directly to objects, vehicles, or units.
  • FORGE_Module_Defuse: sync to FORGE_Module_Explosives and optionally +FORGE_Module_Protected.
  • FORGE_Module_Delivery: sync to FORGE_Module_Cargo; the cargo module syncs +to cargo objects.
  • FORGE_Module_Hostage: sync to FORGE_Module_Hostages and +FORGE_Module_Shooters.
  • FORGE_Module_HVT: sync directly to HVT units.
  • FORGE_Module_Defend: configure the defense marker and wave settings.

These modules delegate to forge_server_task_fnc_startTask.

Scripted Start Task

Use forge_server_task_fnc_startTask when creating tasks from modules, +mission scripts, or generated mission-manager content. It registers task +entities, creates the BIS task, stores the catalog entry, then dispatches +through forge_server_task_fnc_handler.

[
+    "attack",
+    "compound_attack_01",
+    getPosATL leader1,
+    "Attack: East Compound",
+    "Eliminate all hostile forces.",
+    createHashMapFromArray [["targets", [unit1, unit2, unit3]]],
+    createHashMapFromArray [
+        ["limitFail", 0],
+        ["limitSuccess", 3],
+        ["funds", 50000],
+        ["ratingFail", -10],
+        ["ratingSuccess", 20],
+        ["timeLimit", 900]
+    ],
+    0,
+    getPlayerUID player,
+    "script"
+] call forge_server_task_fnc_startTask;
+

Handler Calls

Use forge_server_task_fnc_handler directly when the task entities are already +registered and you want reputation gating plus ownership binding. Create the +BIS task and catalog entry separately if this task should appear in the map +task tab or CAD:

[
+    "delivery",
+    ["delivery_1", 1, 3, "delivery_zone", 250000, -75, 300, false, false, 900],
+    250,
+    getPlayerUID player
+] call forge_server_task_fnc_handler;
+

Direct Task Calls

Direct task function calls still work for mission-authored or server-owned +tasks, but they do not provide a requester UID. Ownership falls back to the +default org. Create the BIS task separately if this task should appear in the +map task tab.

Timer Semantics

Task time limits use 0 for no limit:

  • attack timeLimit
  • destroy timeLimit
  • delivery timeLimit
  • hostage timeLimit
  • HVT timeLimit

Positive values are measured in seconds. Do not pass -1 as a no-limit value; +the task runtime treats any non-zero task time limit as active.

Defuse IED timers are different. iedTimer must be greater than 0, because +IEDs are expected to have an active countdown. The Eden defuse module defaults +to 300 seconds.

Defuse Counter

"forge_server" callExtension ["task:defuse:increment", ["task-cache-1"]];
+private _count = "forge_server" callExtension ["task:defuse:get", ["task-cache-1"]];
+

Error Handling

private _payload = _result select 0;
+if (_payload find "Error:" == 0) exitWith {
+    systemChat format ["Task error: %1", _payload];
+};
+
Copyright © 2026
\ No newline at end of file diff --git a/docus/dist/server-modules/task/_payload.json b/docus/dist/server-modules/task/_payload.json new file mode 100644 index 0000000..e0500a0 --- /dev/null +++ b/docus/dist/server-modules/task/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":1325},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-task":145,"-server-modules-task-surround":1320},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":57,"body":147,"description":157,"extension":1315,"links":1316,"meta":1317,"navigation":609,"path":58,"seo":1318,"stem":59,"__hash__":1319},"docs\u002F3.server-modules\u002F11.task.md",{"type":148,"value":149,"toc":1297},"minimark",[150,154,158,166,169,203,208,211,238,241,312,316,567,571,635,639,671,682,686,732,737,741,769,776,780,783,820,823,846,849,853,860,863,880,883,901,905,914,927,936,940,943,946,1006,1011,1015,1023,1132,1136,1141,1175,1179,1185,1189,1196,1224,1231,1245,1249,1264,1268,1293],[151,152,57],"h1",{"id":153},"task-usage-guide",[155,156,157],"p",{},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",[155,159,160,161,165],{},"The server addon at ",[162,163,164],"code",{},"arma\u002Fserver\u002Faddons\u002Ftask"," also owns task execution:\ncreating BIS tasks, registering task entities, tracking participants, binding\ntask ownership, applying player\u002Forg rewards, and clearing task state when a\ntask completes.",[155,167,168],{},"Runtime dependencies:",[170,171,172,178,183,188,193,198],"ul",{},[173,174,175],"li",{},[162,176,177],{},"forge_server_extension",[173,179,180],{},[162,181,182],{},"forge_server_common",[173,184,185],{},[162,186,187],{},"forge_server_actor",[173,189,190],{},[162,191,192],{},"forge_server_bank",[173,194,195],{},[162,196,197],{},"forge_server_org",[173,199,200],{},[162,201,202],{},"forge_client_notifications",[204,205,207],"h2",{"id":206},"data-model","Data Model",[155,209,210],{},"Catalog entries are flexible JSON objects. The service normalizes these fields\nwhen a catalog entry is inserted or ownership changes:",[170,212,213,218,223,228,233],{},[173,214,215],{},[162,216,217],{},"taskId",[173,219,220],{},[162,221,222],{},"taskID",[173,224,225],{},[162,226,227],{},"accepted",[173,229,230],{},[162,231,232],{},"requesterUid",[173,234,235],{},[162,236,237],{},"orgID",[155,239,240],{},"Ownership context:",[242,243,248],"pre",{"className":244,"code":245,"language":246,"meta":247,"style":247},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"orgId\": \"default\"\n}\n","json","",[162,249,250,259,286,306],{"__ignoreMap":247},[251,252,255],"span",{"class":253,"line":254},"line",1,[251,256,258],{"class":257},"sMK4o","{\n",[251,260,262,265,268,271,274,277,281,283],{"class":253,"line":261},2,[251,263,264],{"class":257}," \"",[251,266,232],{"class":267},"spNyl",[251,269,270],{"class":257},"\"",[251,272,273],{"class":257},":",[251,275,276],{"class":257}," \"",[251,278,280],{"class":279},"sfazB","76561198000000000",[251,282,270],{"class":257},[251,284,285],{"class":257},",\n",[251,287,289,291,294,296,298,300,303],{"class":253,"line":288},3,[251,290,264],{"class":257},[251,292,293],{"class":267},"orgId",[251,295,270],{"class":257},[251,297,273],{"class":257},[251,299,276],{"class":257},[251,301,302],{"class":279},"default",[251,304,305],{"class":257},"\"\n",[251,307,309],{"class":253,"line":308},4,[251,310,311],{"class":257},"}\n",[204,313,315],{"id":314},"commands","Commands",[317,318,319,335],"table",{},[320,321,322],"thead",{},[323,324,325,329,332],"tr",{},[326,327,328],"th",{},"Command",[326,330,331],{},"Arguments",[326,333,334],{},"Returns",[336,337,338,355,367,385,403,418,435,448,463,477,495,509,524,538,552],"tbody",{},[323,339,340,346,349],{},[341,342,343],"td",{},[162,344,345],{},"task:reset",[341,347,348],{},"none",[341,350,351,354],{},[162,352,353],{},"true",".",[323,356,357,362,364],{},[341,358,359],{},[162,360,361],{},"task:catalog:active",[341,363,348],{},[341,365,366],{},"Active catalog entry array JSON.",[323,368,369,374,379],{},[341,370,371],{},[162,372,373],{},"task:catalog:get",[341,375,376],{},[162,377,378],{},"task_id",[341,380,381,382,354],{},"Catalog entry JSON or ",[162,383,384],{},"null",[323,386,387,392,400],{},[341,388,389],{},[162,390,391],{},"task:catalog:upsert",[341,393,394,396,397],{},[162,395,378],{},", ",[162,398,399],{},"entry_json",[341,401,402],{},"Stored catalog entry JSON.",[323,404,405,410,414],{},[341,406,407],{},[162,408,409],{},"task:catalog:delete",[341,411,412],{},[162,413,378],{},[341,415,416,354],{},[162,417,353],{},[323,419,420,425,432],{},[341,421,422],{},[162,423,424],{},"task:ownership:bind",[341,426,427,396,429],{},[162,428,378],{},[162,430,431],{},"ownership_json",[341,433,434],{},"Ownership mutation result JSON.",[323,436,437,442,446],{},[341,438,439],{},[162,440,441],{},"task:ownership:release",[341,443,444],{},[162,445,378],{},[341,447,434],{},[323,449,450,455,461],{},[341,451,452],{},[162,453,454],{},"task:ownership:accept",[341,456,457,396,459],{},[162,458,378],{},[162,460,431],{},[341,462,434],{},[323,464,465,470,474],{},[341,466,467],{},[162,468,469],{},"task:ownership:reward_context",[341,471,472],{},[162,473,378],{},[341,475,476],{},"Reward context JSON.",[323,478,479,484,491],{},[341,480,481],{},[162,482,483],{},"task:status:set",[341,485,486,396,488],{},[162,487,378],{},[162,489,490],{},"status",[341,492,493,354],{},[162,494,353],{},[323,496,497,502,506],{},[341,498,499],{},[162,500,501],{},"task:status:get",[341,503,504],{},[162,505,378],{},[341,507,508],{},"Status string JSON.",[323,510,511,516,520],{},[341,512,513],{},[162,514,515],{},"task:status:clear",[341,517,518],{},[162,519,378],{},[341,521,522,354],{},[162,523,353],{},[323,525,526,531,535],{},[341,527,528],{},[162,529,530],{},"task:defuse:increment",[341,532,533],{},[162,534,378],{},[341,536,537],{},"New counter value JSON.",[323,539,540,545,549],{},[341,541,542],{},[162,543,544],{},"task:defuse:get",[341,546,547],{},[162,548,378],{},[341,550,551],{},"Counter value JSON.",[323,553,554,559,563],{},[341,555,556],{},[162,557,558],{},"task:clear",[341,560,561],{},[162,562,378],{},[341,564,565,354],{},[162,566,353],{},[204,568,570],{"id":569},"upsert-a-catalog-entry","Upsert a Catalog Entry",[242,572,576],{"className":573,"code":574,"language":575,"meta":247,"style":247},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _entry = createHashMapFromArray [\n [\"title\", \"Destroy Cache\"],\n [\"description\", \"Destroy the enemy supply cache.\"],\n [\"reward\", 1500]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n \"task-cache-1\",\n toJSON _entry\n]];\n","sqf",[162,577,578,583,588,593,598,604,611,617,623,629],{"__ignoreMap":247},[251,579,580],{"class":253,"line":254},[251,581,582],{},"private _entry = createHashMapFromArray [\n",[251,584,585],{"class":253,"line":261},[251,586,587],{}," [\"title\", \"Destroy Cache\"],\n",[251,589,590],{"class":253,"line":288},[251,591,592],{}," [\"description\", \"Destroy the enemy supply cache.\"],\n",[251,594,595],{"class":253,"line":308},[251,596,597],{}," [\"reward\", 1500]\n",[251,599,601],{"class":253,"line":600},5,[251,602,603],{},"];\n",[251,605,607],{"class":253,"line":606},6,[251,608,610],{"emptyLinePlaceholder":609},true,"\n",[251,612,614],{"class":253,"line":613},7,[251,615,616],{},"private _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n",[251,618,620],{"class":253,"line":619},8,[251,621,622],{}," \"task-cache-1\",\n",[251,624,626],{"class":253,"line":625},9,[251,627,628],{}," toJSON _entry\n",[251,630,632],{"class":253,"line":631},10,[251,633,634],{},"]];\n",[204,636,638],{"id":637},"mark-a-task-active","Mark a Task Active",[242,640,642],{"className":573,"code":641,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:status:set\", [\n \"task-cache-1\",\n \"active\"\n]];\n\nprivate _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[162,643,644,649,653,658,662,666],{"__ignoreMap":247},[251,645,646],{"class":253,"line":254},[251,647,648],{},"\"forge_server\" callExtension [\"task:status:set\", [\n",[251,650,651],{"class":253,"line":261},[251,652,622],{},[251,654,655],{"class":253,"line":288},[251,656,657],{}," \"active\"\n",[251,659,660],{"class":253,"line":308},[251,661,634],{},[251,663,664],{"class":253,"line":600},[251,665,610],{"emptyLinePlaceholder":609},[251,667,668],{"class":253,"line":606},[251,669,670],{},"private _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[155,672,673,674,677,678,681],{},"Completed statuses ",[162,675,676],{},"succeeded"," and ",[162,679,680],{},"failed"," are also stored as completed status\nfallbacks. Clearing status removes active and completed state.",[204,683,685],{"id":684},"accept-a-task","Accept a Task",[242,687,689],{"className":573,"code":688,"language":575,"meta":247,"style":247},"private _ownership = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n \"task-cache-1\",\n toJSON _ownership\n]];\n",[162,690,691,696,701,706,710,714,719,723,728],{"__ignoreMap":247},[251,692,693],{"class":253,"line":254},[251,694,695],{},"private _ownership = createHashMapFromArray [\n",[251,697,698],{"class":253,"line":261},[251,699,700],{}," [\"requesterUid\", getPlayerUID player],\n",[251,702,703],{"class":253,"line":288},[251,704,705],{}," [\"orgId\", \"default\"]\n",[251,707,708],{"class":253,"line":308},[251,709,603],{},[251,711,712],{"class":253,"line":600},[251,713,610],{"emptyLinePlaceholder":609},[251,715,716],{"class":253,"line":606},[251,717,718],{},"private _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n",[251,720,721],{"class":253,"line":613},[251,722,622],{},[251,724,725],{"class":253,"line":619},[251,726,727],{}," toJSON _ownership\n",[251,729,730],{"class":253,"line":625},[251,731,634],{},[155,733,734,736],{},[162,735,454],{}," fails if the task is not active or another requester\nalready accepted it.",[204,738,740],{"id":739},"rewards","Rewards",[242,742,744],{"className":573,"code":743,"language":575,"meta":247,"style":247},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n \"task-cache-1\"\n]];\n\nprivate _context = fromJSON (_result select 0);\n",[162,745,746,751,756,760,764],{"__ignoreMap":247},[251,747,748],{"class":253,"line":254},[251,749,750],{},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n",[251,752,753],{"class":253,"line":261},[251,754,755],{}," \"task-cache-1\"\n",[251,757,758],{"class":253,"line":288},[251,759,634],{},[251,761,762],{"class":253,"line":308},[251,763,610],{"emptyLinePlaceholder":609},[251,765,766],{"class":253,"line":600},[251,767,768],{},"private _context = fromJSON (_result select 0);\n",[155,770,771,772,677,774,354],{},"The reward context contains ",[162,773,232],{},[162,775,293],{},[204,777,779],{"id":778},"server-task-flows","Server Task Flows",[155,781,782],{},"The task addon provides these server-owned task flows:",[170,784,785,790,795,800,805,810,815],{},[173,786,787],{},[162,788,789],{},"attack",[173,791,792],{},[162,793,794],{},"defend",[173,796,797],{},[162,798,799],{},"defuse",[173,801,802],{},[162,803,804],{},"delivery",[173,806,807],{},[162,808,809],{},"destroy",[173,811,812],{},[162,813,814],{},"hostage",[173,816,817],{},[162,818,819],{},"hvt",[155,821,822],{},"Mission designers can create tasks in four ways:",[170,824,825,828,834,840],{},[173,826,827],{},"Eden modules for editor-authored tasks.",[173,829,830,833],{},[162,831,832],{},"forge_server_task_fnc_startTask"," for script-authored tasks.",[173,835,836,839],{},[162,837,838],{},"forge_server_task_fnc_handler"," for pre-registered entities with reputation\ngating and ownership binding. This path expects the BIS task and catalog\nentry to already exist if map-task and CAD visibility are required.",[173,841,842,843,845],{},"Direct task function calls for server-owned or mission-authored flows that\nintentionally fall back to the ",[162,844,302],{}," org. This path expects the BIS task\nto already exist if map-task visibility is required.",[155,847,848],{},"The dynamic mission manager can also generate attack tasks from config. That is\nsystem-generated content rather than a hand-authored task creation path.",[204,850,852],{"id":851},"cad-compatibility","CAD Compatibility",[155,854,855,856,859],{},"CAD hydrates assignable tasks from ",[162,857,858],{},"TaskStore.getActiveTaskCatalog",". A task must\nhave a catalog entry and active task status before CAD can show and assign it.",[155,861,862],{},"CAD-compatible creation paths:",[170,864,865,870,875],{},[173,866,867,868,354],{},"Eden modules: compatible because they delegate to\n",[162,869,832],{},[173,871,872,874],{},[162,873,832],{},": compatible because it registers the\ncatalog entry, creates the BIS task, and dispatches through the handler.",[173,876,877,878,354],{},"Dynamic mission manager attack tasks: compatible because the mission manager\nuses ",[162,879,832],{},[155,881,882],{},"Limited or incompatible paths:",[170,884,885,890],{},[173,886,887,889],{},[162,888,838],{},": only compatible if a catalog entry was\nalready registered elsewhere. The handler sets active status and ownership,\nbut it does not create the BIS task shown in the map task tab or upsert the\ncatalog entry.",[173,891,892,893,896,897,900],{},"Direct task function calls: not CAD-compatible by default. They bypass\n",[162,894,895],{},"startTask"," and usually do not register the task catalog entry or active\nstatus that CAD hydrates from. They also only call ",[162,898,899],{},"BIS_fnc_taskSetState"," at\ncompletion\u002Ffailure; they do not create the BIS task first.",[204,902,904],{"id":903},"bis-map-task-prerequisite","BIS Map Task Prerequisite",[155,906,907,908,910,911,354],{},"Only the Eden task modules and ",[162,909,832],{}," create the BIS\ntask automatically through ",[162,912,913],{},"BIS_fnc_taskCreate",[155,915,916,917,919,920,923,924,926],{},"If a mission uses ",[162,918,838],{}," directly or calls a task flow\nfunction such as ",[162,921,922],{},"forge_server_task_fnc_attack",", the mission must create a BIS\ntask with the same task ID before the Forge task completes. Otherwise the\nsuccess\u002Ffailure ",[162,925,899],{}," call has no visible map task to update.",[155,928,929,930,932,933,935],{},"That prerequisite can be satisfied with a vanilla Eden task creation module or\na scripted ",[162,931,913],{}," call. ",[162,934,832],{}," is the\npreferred Forge path because it handles BIS task creation, Forge catalog\nregistration, entity registration, and handler dispatch together.",[204,937,939],{"id":938},"eden-modules","Eden Modules",[155,941,942],{},"Eden task modules are the normal designer-facing path. Place the module,\nconfigure its attributes, and sync it to the relevant entities or grouping\nmodules.",[155,944,945],{},"Available task modules:",[170,947,948,954,960,973,982,994,1000],{},[173,949,950,953],{},[162,951,952],{},"FORGE_Module_Attack",": sync directly to target units or vehicles.",[173,955,956,959],{},[162,957,958],{},"FORGE_Module_Destroy",": sync directly to objects, vehicles, or units.",[173,961,962,965,966,969,970,354],{},[162,963,964],{},"FORGE_Module_Defuse",": sync to ",[162,967,968],{},"FORGE_Module_Explosives"," and optionally\n",[162,971,972],{},"FORGE_Module_Protected",[173,974,975,965,978,981],{},[162,976,977],{},"FORGE_Module_Delivery",[162,979,980],{},"FORGE_Module_Cargo","; the cargo module syncs\nto cargo objects.",[173,983,984,965,987,990,991,354],{},[162,985,986],{},"FORGE_Module_Hostage",[162,988,989],{},"FORGE_Module_Hostages"," and\n",[162,992,993],{},"FORGE_Module_Shooters",[173,995,996,999],{},[162,997,998],{},"FORGE_Module_HVT",": sync directly to HVT units.",[173,1001,1002,1005],{},[162,1003,1004],{},"FORGE_Module_Defend",": configure the defense marker and wave settings.",[155,1007,1008,1009,354],{},"These modules delegate to ",[162,1010,832],{},[204,1012,1014],{"id":1013},"scripted-start-task","Scripted Start Task",[155,1016,1017,1018,1020,1021,354],{},"Use ",[162,1019,832],{}," when creating tasks from modules,\nmission scripts, or generated mission-manager content. It registers task\nentities, creates the BIS task, stores the catalog entry, then dispatches\nthrough ",[162,1022,838],{},[242,1024,1026],{"className":573,"code":1025,"language":575,"meta":247,"style":247},"[\n \"attack\",\n \"compound_attack_01\",\n getPosATL leader1,\n \"Attack: East Compound\",\n \"Eliminate all hostile forces.\",\n createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n createHashMapFromArray [\n [\"limitFail\", 0],\n [\"limitSuccess\", 3],\n [\"funds\", 50000],\n [\"ratingFail\", -10],\n [\"ratingSuccess\", 20],\n [\"timeLimit\", 900]\n ],\n 0,\n getPlayerUID player,\n \"script\"\n] call forge_server_task_fnc_startTask;\n",[162,1027,1028,1033,1038,1043,1048,1053,1058,1063,1068,1073,1078,1084,1090,1096,1102,1108,1114,1120,1126],{"__ignoreMap":247},[251,1029,1030],{"class":253,"line":254},[251,1031,1032],{},"[\n",[251,1034,1035],{"class":253,"line":261},[251,1036,1037],{}," \"attack\",\n",[251,1039,1040],{"class":253,"line":288},[251,1041,1042],{}," \"compound_attack_01\",\n",[251,1044,1045],{"class":253,"line":308},[251,1046,1047],{}," getPosATL leader1,\n",[251,1049,1050],{"class":253,"line":600},[251,1051,1052],{}," \"Attack: East Compound\",\n",[251,1054,1055],{"class":253,"line":606},[251,1056,1057],{}," \"Eliminate all hostile forces.\",\n",[251,1059,1060],{"class":253,"line":613},[251,1061,1062],{}," createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n",[251,1064,1065],{"class":253,"line":619},[251,1066,1067],{}," createHashMapFromArray [\n",[251,1069,1070],{"class":253,"line":625},[251,1071,1072],{}," [\"limitFail\", 0],\n",[251,1074,1075],{"class":253,"line":631},[251,1076,1077],{}," [\"limitSuccess\", 3],\n",[251,1079,1081],{"class":253,"line":1080},11,[251,1082,1083],{}," [\"funds\", 50000],\n",[251,1085,1087],{"class":253,"line":1086},12,[251,1088,1089],{}," [\"ratingFail\", -10],\n",[251,1091,1093],{"class":253,"line":1092},13,[251,1094,1095],{}," [\"ratingSuccess\", 20],\n",[251,1097,1099],{"class":253,"line":1098},14,[251,1100,1101],{}," [\"timeLimit\", 900]\n",[251,1103,1105],{"class":253,"line":1104},15,[251,1106,1107],{}," ],\n",[251,1109,1111],{"class":253,"line":1110},16,[251,1112,1113],{}," 0,\n",[251,1115,1117],{"class":253,"line":1116},17,[251,1118,1119],{}," getPlayerUID player,\n",[251,1121,1123],{"class":253,"line":1122},18,[251,1124,1125],{}," \"script\"\n",[251,1127,1129],{"class":253,"line":1128},19,[251,1130,1131],{},"] call forge_server_task_fnc_startTask;\n",[204,1133,1135],{"id":1134},"handler-calls","Handler Calls",[155,1137,1017,1138,1140],{},[162,1139,838],{}," directly when the task entities are already\nregistered and you want reputation gating plus ownership binding. Create the\nBIS task and catalog entry separately if this task should appear in the map\ntask tab or CAD:",[242,1142,1144],{"className":573,"code":1143,"language":575,"meta":247,"style":247},"[\n \"delivery\",\n [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n 250,\n getPlayerUID player\n] call forge_server_task_fnc_handler;\n",[162,1145,1146,1150,1155,1160,1165,1170],{"__ignoreMap":247},[251,1147,1148],{"class":253,"line":254},[251,1149,1032],{},[251,1151,1152],{"class":253,"line":261},[251,1153,1154],{}," \"delivery\",\n",[251,1156,1157],{"class":253,"line":288},[251,1158,1159],{}," [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n",[251,1161,1162],{"class":253,"line":308},[251,1163,1164],{}," 250,\n",[251,1166,1167],{"class":253,"line":600},[251,1168,1169],{}," getPlayerUID player\n",[251,1171,1172],{"class":253,"line":606},[251,1173,1174],{},"] call forge_server_task_fnc_handler;\n",[204,1176,1178],{"id":1177},"direct-task-calls","Direct Task Calls",[155,1180,1181,1182,1184],{},"Direct task function calls still work for mission-authored or server-owned\ntasks, but they do not provide a requester UID. Ownership falls back to the\n",[162,1183,302],{}," org. Create the BIS task separately if this task should appear in the\nmap task tab.",[204,1186,1188],{"id":1187},"timer-semantics","Timer Semantics",[155,1190,1191,1192,1195],{},"Task time limits use ",[162,1193,1194],{},"0"," for no limit:",[170,1197,1198,1204,1209,1214,1219],{},[173,1199,1200,1201],{},"attack ",[162,1202,1203],{},"timeLimit",[173,1205,1206,1207],{},"destroy ",[162,1208,1203],{},[173,1210,1211,1212],{},"delivery ",[162,1213,1203],{},[173,1215,1216,1217],{},"hostage ",[162,1218,1203],{},[173,1220,1221,1222],{},"HVT ",[162,1223,1203],{},[155,1225,1226,1227,1230],{},"Positive values are measured in seconds. Do not pass ",[162,1228,1229],{},"-1"," as a no-limit value;\nthe task runtime treats any non-zero task time limit as active.",[155,1232,1233,1234,1237,1238,1240,1241,1244],{},"Defuse IED timers are different. ",[162,1235,1236],{},"iedTimer"," must be greater than ",[162,1239,1194],{},", because\nIEDs are expected to have an active countdown. The Eden defuse module defaults\nto ",[162,1242,1243],{},"300"," seconds.",[204,1246,1248],{"id":1247},"defuse-counter","Defuse Counter",[242,1250,1252],{"className":573,"code":1251,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\nprivate _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[162,1253,1254,1259],{"__ignoreMap":247},[251,1255,1256],{"class":253,"line":254},[251,1257,1258],{},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\n",[251,1260,1261],{"class":253,"line":261},[251,1262,1263],{},"private _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[204,1265,1267],{"id":1266},"error-handling","Error Handling",[242,1269,1271],{"className":573,"code":1270,"language":575,"meta":247,"style":247},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Task error: %1\", _payload];\n};\n",[162,1272,1273,1278,1283,1288],{"__ignoreMap":247},[251,1274,1275],{"class":253,"line":254},[251,1276,1277],{},"private _payload = _result select 0;\n",[251,1279,1280],{"class":253,"line":261},[251,1281,1282],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[251,1284,1285],{"class":253,"line":288},[251,1286,1287],{}," systemChat format [\"Task error: %1\", _payload];\n",[251,1289,1290],{"class":253,"line":308},[251,1291,1292],{},"};\n",[1294,1295,1296],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":247,"searchDepth":261,"depth":261,"links":1298},[1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314],{"id":206,"depth":261,"text":207},{"id":314,"depth":261,"text":315},{"id":569,"depth":261,"text":570},{"id":637,"depth":261,"text":638},{"id":684,"depth":261,"text":685},{"id":739,"depth":261,"text":740},{"id":778,"depth":261,"text":779},{"id":851,"depth":261,"text":852},{"id":903,"depth":261,"text":904},{"id":938,"depth":261,"text":939},{"id":1013,"depth":261,"text":1014},{"id":1134,"depth":261,"text":1135},{"id":1177,"depth":261,"text":1178},{"id":1187,"depth":261,"text":1188},{"id":1247,"depth":261,"text":1248},{"id":1266,"depth":261,"text":1267},"md",null,{},{"title":57,"description":157},"KdbrlSiS5YQ3OEJob3r0ceVGYCznKZq-sUb7FfWDctU",[1321,1323],{"title":53,"path":54,"stem":55,"description":1322,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",{"title":61,"path":62,"stem":63,"description":1324,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",1776806627742] \ No newline at end of file diff --git a/docus/dist/sitemap.xml b/docus/dist/sitemap.xml new file mode 100644 index 0000000..e42eda2 --- /dev/null +++ b/docus/dist/sitemap.xml @@ -0,0 +1,102 @@ + + + + /getting-started + + + /getting-started/architecture + + + /getting-started/module-reference + + + /getting-started/development + + + /getting-started/surrealdb-setup + + + /server-extension + + + /server-extension/api-reference + + + /server-extension/usage-examples + + + /server-modules + + + /server-modules/actor + + + /server-modules/store + + + /server-modules/task + + + /server-modules/bank + + + /server-modules/cad + + + /server-modules/economy + + + /server-modules/garage + + + /server-modules/locker + + + /server-modules/organization + + + /server-modules/owned-storage + + + /server-modules/phone + + + /client-addons + + + /client-addons/main + + + /client-addons/phone + + + /client-addons/store + + + /client-addons/common + + + /client-addons/actor + + + /client-addons/bank + + + /client-addons/cad + + + /client-addons/garage + + + /client-addons/locker + + + /client-addons/notifications + + + /client-addons/organization + + + / + + diff --git a/docus/nuxt.config.ts b/docus/nuxt.config.ts new file mode 100644 index 0000000..f0e9aa7 --- /dev/null +++ b/docus/nuxt.config.ts @@ -0,0 +1,44 @@ +const baseURL = + process.env.DOCS_BASE_URL || + (process.env.NODE_ENV === 'production' ? '/forge/' : '/'); +const siteUrl = + process.env.DOCS_SITE_URL || + 'https://innovativedevsolutions.github.io/forge'; + +process.env.NUXT_SITE_URL ||= siteUrl; +process.env.NUXT_PUBLIC_SITE_URL ||= siteUrl; + +export default defineNuxtConfig({ + extends: ['docus'], + + site: { + url: siteUrl + }, + + llms: { + domain: siteUrl + }, + + robots: { + robotsTxt: false + }, + + app: { + baseURL, + buildAssetsDir: '/_nuxt/' + }, + + nitro: { + preset: 'static', + prerender: { + crawlLinks: true, + routes: ['/'] + } + }, + + devtools: { + enabled: false + }, + + compatibilityDate: '2026-04-21' +}); diff --git a/docus/package-lock.json b/docus/package-lock.json new file mode 100644 index 0000000..0bb4b4a --- /dev/null +++ b/docus/package-lock.json @@ -0,0 +1,21942 @@ +{ + "name": "forge-docus", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "forge-docus", + "dependencies": { + "@takumi-rs/core": "^1.0.15", + "better-sqlite3": "^12.9.0", + "docus": "^5.10.0", + "nuxt": "^4.4.2" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "3.0.115", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.115.tgz", + "integrity": "sha512-xonmGfN9pt54WdKqMzWe68BRYS3rsYvraBzioyA0gfNcecHs8Ir5qk/X8grJSyZ95hghjWiOphrK6bAc11E6SA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider-utils": "4.0.27", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/mcp": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-1.0.42.tgz", + "integrity": "sha512-ctRhX9vNLXvjGSFf+RlM+ZutIhlzIgMPWzo2BoJKfIW9JzLneA/57bZkkaUvWSdbYFu1FCyxMarNV/4D/pOUzA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider-utils": "4.0.27", + "pkce-challenge": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", + "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", + "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.10", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/vue": { + "version": "3.0.168", + "resolved": "https://registry.npmjs.org/@ai-sdk/vue/-/vue-3.0.168.tgz", + "integrity": "sha512-HO9s+ufO6h7aDpayAFNkokeLlipUn2zr5UkTojwwy8pdJqh7JYZ56GK6IirHUGzZIr87gbdGIuegQIf5U/XHEQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "4.0.23", + "ai": "6.0.168", + "swrv": "^1.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vue": "^3.3.4" + } + }, + "node_modules/@ai-sdk/vue/node_modules/@ai-sdk/provider": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/vue/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz", + "integrity": "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz", + "integrity": "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.29.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.3.1.tgz", + "integrity": "sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.4.0.tgz", + "integrity": "sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.3.1", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@colordx/core": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.4.3.tgz", + "integrity": "sha512-kIxYSfA5T8HXjav55UaaH/o/cKivF6jCCGIb8eqtcsfI46wsvlSiT8jMDyrl779qLec3c2c2oHBZo4oAhvbjrQ==", + "license": "MIT" + }, + "node_modules/@dxup/nuxt": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@dxup/nuxt/-/nuxt-0.4.1.tgz", + "integrity": "sha512-gtYffW6OfWNvoLW+XD3Mx/K8uUq08PMGLYJoDxc92EzZAWqR0FhcR5iaLm5r/OxyGTKz+P5f5Y7Aoir9+SjYaw==", + "license": "MIT", + "dependencies": { + "@dxup/unimport": "^0.1.2", + "@nuxt/kit": "^4.4.2", + "chokidar": "^5.0.0", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.16" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@dxup/unimport": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@dxup/unimport/-/unimport-0.1.2.tgz", + "integrity": "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==", + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@fastify/accept-negotiator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.0.1.tgz", + "integrity": "sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/@fingerprintjs/botd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fingerprintjs/botd/-/botd-2.0.0.tgz", + "integrity": "sha512-yhuz23NKEcBDTHmGz/ULrXlGnbHenO+xZmVwuBkuqHUkqvaZ5TAA0kAgcRy4Wyo5dIBdkIf57UXX8/c9UlMLJg==", + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", + "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@floating-ui/utils": "^0.2.11", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify-json/lucide": { + "version": "1.2.108", + "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.108.tgz", + "integrity": "sha512-jnmMx7xxShfsKeNNJhn47IKj3gD/AbRz+poKLIPn4rSIXw+yVbXCfUBXza/Jo9YIEEFajBk6Zayet8DqGCvX6w==", + "license": "ISC", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.82", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.82.tgz", + "integrity": "sha512-4p978qHx8eD/QBOhgBzp/p7uS3OO2KCnVpFPJTUvuhuDXv1Hr4RcxcZ5MWc6ptkf/3Dlb1xb23068OtPyx10mA==", + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/vscode-icons": { + "version": "1.2.49", + "resolved": "https://registry.npmjs.org/@iconify-json/vscode-icons/-/vscode-icons-1.2.49.tgz", + "integrity": "sha512-kPSF7NYMEepp/YxM/Sz9AK3+8tEb4Vz94N67OH4Xw9PetIs6at9iETVAAD47WR1sV+VkQo+Uynd8IMKw3J5NGQ==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/collections": { + "version": "1.0.684", + "resolved": "https://registry.npmjs.org/@iconify/collections/-/collections-1.0.684.tgz", + "integrity": "sha512-rF0xgqIgUVtjjGyOLscEhwi6Y3dLDQLOokGyXpE5BJXPTcT8Kb80Hrq68+f6WX8Zv4NRbVKBIVPP0+c7JbvNRA==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@iconify/vue": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-5.0.1.tgz", + "integrity": "sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3.0.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.1.tgz", + "integrity": "sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.6.tgz", + "integrity": "sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@intlify/bundle-utils": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-11.2.0.tgz", + "integrity": "sha512-1LYqrb6vyd3VndVANfTvkcW03FoQbvpmR+rvbniAul/veMJQ1ulDnJwoRhHwv1FVlj53/pwxcdt3/m8I1yegjQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "~11.4.2", + "@intlify/shared": "~11.4.2", + "acorn": "^8.8.2", + "esbuild": "^0.25.4", + "escodegen": "^2.1.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "source-map-js": "^1.2.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">= 22.13" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@intlify/core/-/core-11.4.2.tgz", + "integrity": "sha512-JmvqM9s2ltrrlsIy3/4iYiU/KwRvIUkZn5GYmyK/92GilEEKyCYi5r9fpjnteqUOhE3rqSkGj4a5JZxS/UWosg==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.4.2", + "@intlify/shared": "11.4.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/core-base": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.4.2.tgz", + "integrity": "sha512-7fpuCcVmeLv2T9qHsARqGvh8xt+sV2fH+Q+gMHFwB/rPXzo85DpbJFKn7dBH1L5p0c2cSh2DW+2h/64EKrISmA==", + "license": "MIT", + "dependencies": { + "@intlify/devtools-types": "11.4.2", + "@intlify/message-compiler": "11.4.2", + "@intlify/shared": "11.4.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/devtools-types": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-types/-/devtools-types-11.4.2.tgz", + "integrity": "sha512-3u8EN1kB6EMSi96KXs5k7a8y2X2g4+h3X6iwVZU47cP4n+mTuq//WMjG588BzSp/2XQ/dTXo2BLUXX+XS+PNfA==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.4.2", + "@intlify/shared": "11.4.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/h3": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@intlify/h3/-/h3-0.7.4.tgz", + "integrity": "sha512-BtL5+U3Dd9Qz6so+ArOMQWZ+nV21rOqqYUXnqwvW6J3VUXr66A9+9+vUFb/NAQvOU4kdfkO3c/9LMRGU9WZ8vw==", + "license": "MIT", + "dependencies": { + "@intlify/core": "^11.1.12", + "@intlify/utils": "^0.13.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/h3/node_modules/@intlify/utils": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@intlify/utils/-/utils-0.13.0.tgz", + "integrity": "sha512-8i3uRdAxCGzuHwfmHcVjeLQBtysQB2aXl/ojoagDut5/gY5lvWCQ2+cnl2TiqE/fXj/D8EhWG/SLKA7qz4a3QA==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.4.2.tgz", + "integrity": "sha512-a6CDSGSMTGrg0BjD97x8TBYPf7qQMDlZipJ6UDfv/pd4OIym8TMlHu3MsH0bTNnRdAG2D6EFEykIgiQPqvtTkA==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "11.4.2", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.4.2.tgz", + "integrity": "sha512-NzpHbguRCsOHDwxmlBa9qu/imc+/QWgsYUaK6FZeNC0wK8QfAbhqrktEp/haVzxU1aikH8IX4ytD+mfFEMi/9A==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-11.2.0.tgz", + "integrity": "sha512-GcjFuI/awrDhLUJWCZJqoQVmGQ+243I1bburUO1spHtOY4rP2DtPvZt7UjJrOoGt3L4lZ9yvyGJoLsqU6yr4Qw==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@intlify/bundle-utils": "11.2.0", + "@intlify/shared": "~11.4.2", + "@intlify/vue-i18n-extensions": "^8.0.0", + "@rollup/pluginutils": "^5.1.0", + "@typescript-eslint/scope-manager": "^8.13.0", + "@typescript-eslint/typescript-estree": "^8.13.0", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "pathe": "^2.0.3", + "picocolors": "^1.0.0", + "unplugin": "^2.3.4", + "vue": "~3.5.34" + }, + "engines": { + "node": ">= 22.13" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25", + "vue-i18n": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vite": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/unplugin-vue-i18n/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@intlify/utils": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@intlify/utils/-/utils-0.14.1.tgz", + "integrity": "sha512-/NVDhX6sG87h0PXIwUCTW9DeHbKeqlni6qVV8xzMULQRHE9azIETldBlTKaBji7z6ostyDIH4s6SWI3AAI4uFg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/vue-i18n-extensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-8.0.0.tgz", + "integrity": "sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.6", + "@intlify/shared": "^10.0.0", + "@vue/compiler-dom": "^3.2.45", + "vue-i18n": "^10.0.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@intlify/shared": "^9.0.0 || ^10.0.0 || ^11.0.0", + "@vue/compiler-dom": "^3.0.0", + "vue": "^3.0.0", + "vue-i18n": "^9.0.0 || ^10.0.0 || ^11.0.0" + }, + "peerDependenciesMeta": { + "@intlify/shared": { + "optional": true + }, + "@vue/compiler-dom": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/core-base": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.8.tgz", + "integrity": "sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "10.0.8", + "@intlify/shared": "10.0.8" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/message-compiler": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.8.tgz", + "integrity": "sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "10.0.8", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/shared": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.8.tgz", + "integrity": "sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/vue-i18n-extensions/node_modules/vue-i18n": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.8.tgz", + "integrity": "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==", + "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "10.0.8", + "@intlify/shared": "10.0.8", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", + "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@miyaneee/rollup-plugin-json5": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@miyaneee/rollup-plugin-json5/-/rollup-plugin-json5-1.2.0.tgz", + "integrity": "sha512-JjTIaXZp9WzhUHpElrqPnl1AzBi/rvRs065F71+aTmlqvTMVkdbjZ8vfFl4nRlgJy+TPBw69ZK4pwFdmOAt4aA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "json5": "^2.2.3" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/cli": { + "version": "3.35.2", + "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.35.2.tgz", + "integrity": "sha512-sCxNnFuYamqippdj+Cj4Nue55yaUvasaneyf2mnowK5/F1TKln/WVqTH18McxQ4baLlIlVapIFovKjJx1L8XMQ==", + "license": "MIT", + "dependencies": { + "@bomb.sh/tab": "^0.0.15", + "@clack/prompts": "^1.3.0", + "c12": "^3.3.4", + "citty": "^0.2.2", + "confbox": "^0.2.4", + "consola": "^3.4.2", + "debug": "^4.4.3", + "defu": "^6.1.7", + "exsolve": "^1.0.8", + "fuse.js": "^7.3.0", + "fzf": "^0.5.2", + "giget": "^3.2.0", + "jiti": "^2.7.0", + "listhen": "^1.10.0", + "nypm": "^0.6.6", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.1", + "scule": "^1.3.0", + "semver": "^7.8.0", + "srvx": "^0.11.15", + "std-env": "^4.1.0", + "tinyclip": "^0.1.12", + "tinyexec": "^1.1.2", + "ufo": "^1.6.4", + "youch": "^4.1.1" + }, + "bin": { + "nuxi": "bin/nuxi.mjs", + "nuxi-ng": "bin/nuxi.mjs", + "nuxt": "bin/nuxi.mjs", + "nuxt-cli": "bin/nuxi.mjs" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + }, + "peerDependencies": { + "@nuxt/schema": "^4.4.5" + }, + "peerDependenciesMeta": { + "@nuxt/schema": { + "optional": true + } + } + }, + "node_modules/@nuxt/cli/node_modules/@bomb.sh/tab": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@bomb.sh/tab/-/tab-0.0.15.tgz", + "integrity": "sha512-Y90ub44TAvbdO9P8mcD/XPyQjFhiR5xmd4Fk7JErmWmEWEUimNnjWiBrVZ16Tj3GA1rLZ+uvCN2V/pzLawv31g==", + "license": "MIT", + "bin": { + "tab": "dist/bin/cli.mjs" + }, + "peerDependencies": { + "cac": "^6.7.14", + "citty": "^0.1.6 || ^0.2.0", + "commander": "^13.1.0" + }, + "peerDependenciesMeta": { + "cac": { + "optional": true + }, + "citty": { + "optional": true + }, + "commander": { + "optional": true + } + } + }, + "node_modules/@nuxt/cli/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/@nuxt/content": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-3.13.0.tgz", + "integrity": "sha512-ZpZ1l0yGzK/Y9QjBT8uReJ62DnOKDMlw+vkzSnkc8YDyZ0ZNhFj1fviMwDhEkArwvQTRfxi12GqzB/wxu01vEw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "@nuxtjs/mdc": "^0.21.0", + "@shikijs/langs": "^4.0.2", + "@sqlite.org/sqlite-wasm": "3.50.4-build1", + "@standard-schema/spec": "^1.1.0", + "@webcontainer/env": "^1.1.1", + "c12": "^3.3.3", + "chokidar": "^5.0.0", + "consola": "^3.4.2", + "db0": "^0.3.4", + "defu": "^6.1.4", + "destr": "^2.0.5", + "git-url-parse": "^16.1.0", + "hookable": "^5.5.3", + "isomorphic-git": "^1.37.4", + "jiti": "^2.6.1", + "json-schema-to-typescript-lite": "^15.0.0", + "mdast-util-to-hast": "^13.2.1", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.2", + "micromark-util-character": "^2.1.1", + "micromark-util-chunked": "^2.0.1", + "micromark-util-resolve-all": "^2.0.1", + "micromark-util-sanitize-uri": "^2.0.1", + "micromatch": "^4.0.8", + "minimark": "^0.2.0", + "minimatch": "^10.2.4", + "nuxt-component-meta": "0.17.2", + "nypm": "^0.6.5", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "remark-mdc": "^3.10.0", + "scule": "^1.3.0", + "shiki": "^4.0.2", + "slugify": "^1.6.8", + "socket.io-client": "^4.8.3", + "std-env": "^4.0.0", + "tinyglobby": "^0.2.15", + "ufo": "^1.6.3", + "unctx": "^2.5.0", + "unified": "^11.0.5", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.1.0", + "unplugin": "^3.0.0", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.2" + }, + "engines": { + "node": ">= 20.19.0" + }, + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "@valibot/to-json-schema": "^1.5.0", + "better-sqlite3": "^12.5.0", + "sqlite3": "*", + "valibot": "^1.2.0" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@valibot/to-json-schema": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "valibot": { + "optional": true + } + } + }, + "node_modules/@nuxt/content/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@nuxt/devalue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", + "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==", + "license": "MIT" + }, + "node_modules/@nuxt/devtools": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-3.2.4.tgz", + "integrity": "sha512-VPbFy7hlPzWpEZk4BsuVpNuHq1ZYGV9xezjb7/NGuePuNLqeNn74YZugU+PCtva7OwKhEeTXmMK0Mqo/6+nwNA==", + "license": "MIT", + "dependencies": { + "@nuxt/devtools-kit": "3.2.4", + "@nuxt/devtools-wizard": "3.2.4", + "@nuxt/kit": "^4.4.2", + "@vue/devtools-core": "^8.1.0", + "@vue/devtools-kit": "^8.1.0", + "birpc": "^4.0.0", + "consola": "^3.4.2", + "destr": "^2.0.5", + "error-stack-parser-es": "^1.0.5", + "execa": "^8.0.1", + "fast-npm-meta": "^1.4.2", + "get-port-please": "^3.2.0", + "hookable": "^6.1.0", + "image-meta": "^0.2.2", + "is-installed-globally": "^1.0.0", + "launch-editor": "^2.13.1", + "local-pkg": "^1.1.2", + "magicast": "^0.5.2", + "nypm": "^0.6.5", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "semver": "^7.7.4", + "simple-git": "^3.33.0", + "sirv": "^3.0.2", + "structured-clone-es": "^2.0.0", + "tinyglobby": "^0.2.15", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-tracer": "^1.3.0", + "which": "^6.0.1", + "ws": "^8.19.0" + }, + "bin": { + "devtools": "cli.mjs" + }, + "peerDependencies": { + "@vitejs/devtools": "*", + "vite": ">=6.0" + }, + "peerDependenciesMeta": { + "@vitejs/devtools": { + "optional": true + } + } + }, + "node_modules/@nuxt/devtools-kit": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-3.2.4.tgz", + "integrity": "sha512-Yxy2Xgmq5hf3dQy983V0xh0OJV2mYwRZz9eVIGc3EaribdFGPDNGMMbYqX9qCty3Pbxn/bCF3J0UyPaNlHVayQ==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "execa": "^8.0.1" + }, + "peerDependencies": { + "vite": ">=6.0" + } + }, + "node_modules/@nuxt/devtools-wizard": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-3.2.4.tgz", + "integrity": "sha512-5tu2+Quu9XTxwtpzM8CUN0UKn/bzZIfJcoGd+at5Yy1RiUQJ4E52tRK0idW1rMSUDkbkvX3dSnu8Tpj7SAtWdQ==", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^1.1.0", + "consola": "^3.4.2", + "diff": "^8.0.3", + "execa": "^8.0.1", + "magicast": "^0.5.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "semver": "^7.7.4" + }, + "bin": { + "devtools-wizard": "cli.mjs" + } + }, + "node_modules/@nuxt/devtools/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@nuxt/devtools/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@nuxt/devtools/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@nuxt/fonts": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nuxt/fonts/-/fonts-0.14.0.tgz", + "integrity": "sha512-4uXQl9fa5F4ibdgU8zomoOcyMdnwgdem+Pi8JEqeDYI5yPR32Kam6HnuRr47dTb97CstaepAvXPWQUUHMtjsFQ==", + "license": "MIT", + "dependencies": { + "@nuxt/devtools-kit": "^3.2.1", + "@nuxt/kit": "^4.2.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "fontless": "^0.2.1", + "h3": "^1.15.5", + "magic-regexp": "^0.10.0", + "ofetch": "^1.5.1", + "pathe": "^2.0.3", + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "ufo": "^1.6.3", + "unifont": "^0.7.4", + "unplugin": "^3.0.0", + "unstorage": "^1.17.4" + } + }, + "node_modules/@nuxt/icon": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/icon/-/icon-2.2.2.tgz", + "integrity": "sha512-K9wINW21M9x5GcKF5JEXzPKAT/Kfxl/vdnEyppw54hh5qoLcdi5HmsYoTfDP9gbJ6Z1T6IdH5JxBWk72HMe1Zg==", + "license": "MIT", + "dependencies": { + "@iconify/collections": "^1.0.679", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^3.1.1", + "@iconify/vue": "^5.0.0", + "@nuxt/devtools-kit": "^3.2.4", + "@nuxt/kit": "^4.4.4", + "consola": "^3.4.2", + "local-pkg": "^1.1.2", + "mlly": "^1.8.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "picomatch": "^4.0.4", + "std-env": "^4.1.0", + "tinyglobby": "^0.2.16" + } + }, + "node_modules/@nuxt/image": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nuxt/image/-/image-2.0.0.tgz", + "integrity": "sha512-otHi6gAoYXKLrp8m27ZjX1PjxOPaltQ4OiUs/BhkW995mF/vXf8SWQTw68fww+Uric0v+XgoVrP9icDi+yT6zw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.2.0", + "consola": "^3.4.2", + "defu": "^6.1.4", + "h3": "^1.15.4", + "image-meta": "^0.2.2", + "knitwork": "^1.2.0", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "std-env": "^3.10.0", + "ufo": "^1.6.1" + }, + "engines": { + "node": ">=18.20.6" + }, + "optionalDependencies": { + "ipx": "^3.1.1" + } + }, + "node_modules/@nuxt/image/node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/@nuxt/kit": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.4.5.tgz", + "integrity": "sha512-J0BpoOomzd3iVZozYlZJ7AwAVliXRgeChZnAkQLfg8d0h/Q+aMK9kkHuhwFULASaRn5idiD4BIhOUz7/uoLbSw==", + "license": "MIT", + "dependencies": { + "c12": "^3.3.4", + "consola": "^3.4.2", + "defu": "^6.1.7", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.8", + "ignore": "^7.0.5", + "jiti": "^2.6.1", + "klona": "^2.0.6", + "mlly": "^1.8.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "rc9": "^3.0.1", + "scule": "^1.3.0", + "semver": "^7.7.4", + "tinyglobby": "^0.2.16", + "ufo": "^1.6.4", + "unctx": "^2.5.0", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/nitro-server": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@nuxt/nitro-server/-/nitro-server-4.4.5.tgz", + "integrity": "sha512-ZxmfxZbQ6Yr/DYkuGmPFtE/A1hDbbcOurlPeh/H4oHfAkv/N6W7OWg/3PGViKwckmF69jUMe/a89HAguaH+r5A==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-typescript": "^7.28.6", + "@nuxt/devalue": "^2.0.2", + "@nuxt/kit": "4.4.5", + "@unhead/vue": "^2.1.13", + "@vue/shared": "^3.5.33", + "consola": "^3.4.2", + "defu": "^6.1.7", + "destr": "^2.0.5", + "devalue": "^5.8.0", + "errx": "^0.1.0", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.0.8", + "h3": "^1.15.11", + "impound": "^1.1.5", + "klona": "^2.0.6", + "mocked-exports": "^0.1.1", + "nitropack": "^2.13.4", + "nypm": "^0.6.6", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "rou3": "^0.8.1", + "std-env": "^4.1.0", + "ufo": "^1.6.4", + "unctx": "^2.5.0", + "unstorage": "^1.17.5", + "vue": "^3.5.33", + "vue-bundle-renderer": "^2.2.0", + "vue-devtools-stub": "^0.1.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@babel/plugin-proposal-decorators": "^7.25.0", + "@rollup/plugin-babel": "^6.0.0 || ^7.0.0", + "nuxt": "^4.4.5" + }, + "peerDependenciesMeta": { + "@babel/plugin-proposal-decorators": { + "optional": true + }, + "@rollup/plugin-babel": { + "optional": true + } + } + }, + "node_modules/@nuxt/nitro-server/node_modules/@unhead/vue": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.15.tgz", + "integrity": "sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1", + "unhead": "2.1.15" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, + "node_modules/@nuxt/nitro-server/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxt/nitro-server/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@nuxt/nitro-server/node_modules/unhead": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.15.tgz", + "integrity": "sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@nuxt/schema": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-4.4.5.tgz", + "integrity": "sha512-kPacVsBInUgM3JiFiHUGd5fr8Ohe+79PGrBwjipfGzA61UMPfj7CmPuKrvmL1i4oLS1I3/flHvU5VFVyQ/wyxQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "^3.5.33", + "defu": "^6.1.7", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "std-env": "^4.1.0" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@nuxt/telemetry": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.8.0.tgz", + "integrity": "sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.1", + "consola": "^3.4.2", + "ofetch": "^2.0.0-alpha.3", + "rc9": "^3.0.0", + "std-env": "^4.0.0" + }, + "bin": { + "nuxt-telemetry": "bin/nuxt-telemetry.mjs" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@nuxt/kit": ">=3.0.0" + } + }, + "node_modules/@nuxt/telemetry/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/@nuxt/telemetry/node_modules/ofetch": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-2.0.0-alpha.3.tgz", + "integrity": "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==", + "license": "MIT" + }, + "node_modules/@nuxt/ui": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@nuxt/ui/-/ui-4.7.1.tgz", + "integrity": "sha512-s3Ix89RkJTeNDlLg7EflckkFxQgzm2W9bt4CBsudi7wNdmhbb3nzYG6rcns2R2Wos0gZlYkSfDKaX1o3zMC+Aw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@iconify/vue": "^5.0.0", + "@internationalized/date": "^3.12.1", + "@internationalized/number": "^3.6.6", + "@nuxt/fonts": "^0.14.0", + "@nuxt/icon": "^2.2.1", + "@nuxt/kit": "^4.4.2", + "@nuxt/schema": "^4.4.2", + "@nuxtjs/color-mode": "^3.5.2", + "@standard-schema/spec": "^1.1.0", + "@tailwindcss/postcss": "^4.2.4", + "@tailwindcss/vite": "^4.2.4", + "@tanstack/vue-table": "^8.21.3", + "@tanstack/vue-virtual": "^3.13.24", + "@tiptap/core": "^3.22.4", + "@tiptap/extension-bubble-menu": "^3.22.4", + "@tiptap/extension-code": "^3.22.4", + "@tiptap/extension-collaboration": "^3.22.4", + "@tiptap/extension-drag-handle": "^3.22.4", + "@tiptap/extension-drag-handle-vue-3": "^3.22.4", + "@tiptap/extension-floating-menu": "^3.22.4", + "@tiptap/extension-horizontal-rule": "^3.22.4", + "@tiptap/extension-image": "^3.22.4", + "@tiptap/extension-mention": "^3.22.4", + "@tiptap/extension-node-range": "^3.22.4", + "@tiptap/extension-placeholder": "^3.22.4", + "@tiptap/markdown": "^3.22.4", + "@tiptap/pm": "^3.22.4", + "@tiptap/starter-kit": "^3.22.4", + "@tiptap/suggestion": "^3.22.4", + "@tiptap/vue-3": "^3.22.4", + "@unhead/vue": "^2.1.13", + "@vueuse/core": "^14.2.1", + "@vueuse/integrations": "^14.2.1", + "@vueuse/shared": "^14.2.1", + "colortranslator": "^5.0.0", + "consola": "^3.4.2", + "defu": "^6.1.7", + "embla-carousel-auto-height": "^8.6.0", + "embla-carousel-auto-scroll": "^8.6.0", + "embla-carousel-autoplay": "^8.6.0", + "embla-carousel-class-names": "^8.6.0", + "embla-carousel-fade": "^8.6.0", + "embla-carousel-vue": "^8.6.0", + "embla-carousel-wheel-gestures": "^8.1.0", + "fuse.js": "^7.3.0", + "hookable": "^6.1.1", + "knitwork": "^1.3.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "motion-v": "^2.2.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "reka-ui": "2.9.6", + "scule": "^1.3.0", + "tailwind-merge": "^3.5.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.2.4", + "tinyglobby": "^0.2.16", + "ufo": "^1.6.3", + "unplugin": "^3.0.0", + "unplugin-auto-import": "^21.0.0", + "unplugin-vue-components": "^32.0.0", + "vaul-vue": "0.4.1", + "vue-component-type-helpers": "^3.2.7" + }, + "bin": { + "nuxt-ui": "cli/index.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@inertiajs/vue3": "^2.0.7 || ^3.0.0", + "@internationalized/date": "^3.0.0", + "@internationalized/number": "^3.0.0", + "@nuxt/content": "^3.0.0", + "joi": "^18.0.0", + "superstruct": "^2.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.6.3 || ^6.0.0", + "valibot": "^1.0.0", + "vue-router": "^4.5.0 || ^5.0.0", + "yup": "^1.7.0", + "zod": "^3.24.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@inertiajs/vue3": { + "optional": true + }, + "@internationalized/date": { + "optional": true + }, + "@internationalized/number": { + "optional": true + }, + "@nuxt/content": { + "optional": true + }, + "joi": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vue-router": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@nuxt/ui/node_modules/@unhead/vue": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.15.tgz", + "integrity": "sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1", + "unhead": "2.1.15" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, + "node_modules/@nuxt/ui/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@nuxt/ui/node_modules/unhead": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.15.tgz", + "integrity": "sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@nuxt/vite-builder": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-4.4.5.tgz", + "integrity": "sha512-PLb1a3yjSES6CEAKqCuT9qPqT7xLtf5VH3XeE3rZ0iBQ+ReVkglwouE+M/lRR61R7PjlvAszjOyjnKbOG1pOAg==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "4.4.5", + "@rollup/plugin-replace": "^6.0.3", + "@vitejs/plugin-vue": "^6.0.6", + "@vitejs/plugin-vue-jsx": "^5.1.5", + "autoprefixer": "^10.5.0", + "consola": "^3.4.2", + "cssnano": "^7.1.9", + "defu": "^6.1.7", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.0.8", + "get-port-please": "^3.2.0", + "jiti": "^2.6.1", + "knitwork": "^1.3.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "mocked-exports": "^0.1.1", + "nypm": "^0.6.6", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "postcss": "^8.5.14", + "seroval": "^1.5.3", + "std-env": "^4.1.0", + "ufo": "^1.6.4", + "unenv": "^2.0.0-rc.24", + "vite": "^7.3.2", + "vite-node": "^5.3.0", + "vite-plugin-checker": "^0.13.0", + "vue-bundle-renderer": "^2.2.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@babel/plugin-proposal-decorators": "^7.25.0", + "@babel/plugin-syntax-jsx": "^7.25.0", + "nuxt": "4.4.5", + "rolldown": "^1.0.0-beta.38", + "rollup-plugin-visualizer": "^6.0.0 || ^7.0.1", + "vue": "^3.3.4" + }, + "peerDependenciesMeta": { + "@babel/plugin-proposal-decorators": { + "optional": true + }, + "@babel/plugin-syntax-jsx": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup-plugin-visualizer": { + "optional": true + } + } + }, + "node_modules/@nuxt/vite-builder/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxtjs/color-mode": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/color-mode/-/color-mode-3.5.2.tgz", + "integrity": "sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.13.2", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "semver": "^7.6.3" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/@nuxt/kit": { + "version": "3.21.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.21.5.tgz", + "integrity": "sha512-eGo9DjJ9NzKMbJpFU/UTd4c5iOSYuivghKD8W/jVGHs7kew+hdSMvUy401IfQB7EObKPvt/WXEutAIaTg9OsyA==", + "license": "MIT", + "dependencies": { + "c12": "^3.3.4", + "consola": "^3.4.2", + "defu": "^6.1.7", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.8", + "ignore": "^7.0.5", + "jiti": "^2.7.0", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "mlly": "^1.8.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "rc9": "^3.0.1", + "scule": "^1.3.0", + "semver": "^7.7.4", + "tinyglobby": "^0.2.16", + "ufo": "^1.6.4", + "unctx": "^2.5.0", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/@nuxt/kit/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/@nuxtjs/color-mode/node_modules/@nuxt/kit/node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/@nuxtjs/color-mode/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/pkg-types/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/@nuxtjs/color-mode/node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/@nuxtjs/i18n": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-10.3.0.tgz", + "integrity": "sha512-qomybFaGXQ2RveUOVIQvjOmoeiyd60E22RVseMk9hgjgayDHnLfEpUyLWBam1cMyjMO4FXBvwGRgTEiszsNnvQ==", + "license": "MIT", + "dependencies": { + "@intlify/core": "^11.2.8", + "@intlify/h3": "^0.7.4", + "@intlify/shared": "^11.2.8", + "@intlify/unplugin-vue-i18n": "^11.1.2", + "@intlify/utils": "^0.14.1", + "@miyaneee/rollup-plugin-json5": "^1.2.0", + "@nuxt/kit": "^4.4.2", + "@rollup/plugin-yaml": "^4.1.2", + "@vue/compiler-sfc": "^3.5.22", + "defu": "^6.1.4", + "devalue": "^5.1.1", + "h3": "^1.15.4", + "knitwork": "^1.2.0", + "magic-string": "^0.30.21", + "mlly": "^1.7.4", + "nuxt-define": "^1.0.0", + "oxc-parser": "^0.112.0", + "oxc-transform": "^0.112.0", + "oxc-walker": "^0.7.0", + "pathe": "^2.0.3", + "ufo": "^1.6.1", + "unplugin": "^2.3.11", + "unrouting": "^0.1.5", + "unstorage": "^1.16.1", + "vue-i18n": "^11.1.11", + "vue-router": "^5.0.4" + }, + "engines": { + "node": ">=20.11.1" + }, + "funding": { + "url": "https://github.com/sponsors/bobbiegoede" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxtjs/mcp-toolkit": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@nuxtjs/mcp-toolkit/-/mcp-toolkit-0.13.4.tgz", + "integrity": "sha512-cjV0uCEsFXK8hmqx7TSvhq3oQQ77ECwN07Prun6TSQhEB0ZbkSTvsNwPLuw4+cI13Cbm/G3k9jfKsXhmU65p3Q==", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.29.0", + "@nuxt/kit": "^4.4.2", + "tinyglobby": "^0.2.15" + }, + "peerDependencies": { + "agents": ">=0.9.0", + "h3": ">=1.15.11", + "secure-exec": ">=0.2.1", + "zod": "^4.1.13" + }, + "peerDependenciesMeta": { + "agents": { + "optional": true + }, + "h3": { + "optional": false + }, + "secure-exec": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@nuxtjs/mdc": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.21.1.tgz", + "integrity": "sha512-DIeUD7IahWVUSoZExysxH9dX51Io6hcQYgGJODq0cMTGqaoDD32lRfHBJxYUmy+sUCV1+1hfa2ixspgJgEd2GA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "@shikijs/core": "^4.0.2", + "@shikijs/engine-javascript": "^4.0.2", + "@shikijs/langs": "^4.0.2", + "@shikijs/themes": "^4.0.2", + "@shikijs/transformers": "^4.0.2", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@vue/compiler-core": "^3.5.31", + "consola": "^3.4.2", + "debug": "^4.4.3", + "defu": "^6.1.4", + "destr": "^2.0.5", + "detab": "^3.0.2", + "github-slugger": "^2.0.0", + "hast-util-format": "^1.1.0", + "hast-util-to-mdast": "^10.1.2", + "hast-util-to-string": "^3.0.1", + "mdast-util-to-hast": "^13.2.1", + "micromark-util-sanitize-uri": "^2.0.1", + "parse5": "^8.0.0", + "pathe": "^2.0.3", + "property-information": "^7.1.0", + "rehype-external-links": "^3.0.0", + "rehype-minify-whitespace": "^6.0.2", + "rehype-raw": "^7.0.0", + "rehype-remark": "^10.0.1", + "rehype-slug": "^6.0.0", + "rehype-sort-attribute-values": "^5.0.1", + "rehype-sort-attributes": "^5.0.1", + "remark-emoji": "^5.0.2", + "remark-gfm": "^4.0.1", + "remark-mdc": "^3.10.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "scule": "^1.3.0", + "shiki": "^4.0.2", + "ufo": "^1.6.3", + "unified": "^11.0.5", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.1.0", + "unwasm": "^0.5.3", + "vfile": "^6.0.3" + } + }, + "node_modules/@nuxtjs/robots": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-6.0.8.tgz", + "integrity": "sha512-oVP4p3TbolnP+Ky3sFFU6Y19pecz8jtb2AxnrQa8hSj3auqVmJUxexjbFEBnA8+yeWCWAEcXCqlnz5mmJmLCSQ==", + "license": "MIT", + "dependencies": { + "@fingerprintjs/botd": "^2.0.0", + "@nuxt/kit": "^4.4.2", + "consola": "^3.4.2", + "defu": "^6.1.7", + "h3": "^1.15.11", + "nuxt-site-config": "^4.0.8", + "nuxtseo-shared": "^5.1.3", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "ufo": "^1.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "zod": ">=3" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@oxc-minify/binding-android-arm-eabi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm-eabi/-/binding-android-arm-eabi-0.128.0.tgz", + "integrity": "sha512-EwdDhZLRmXxSnfy0v9gdOru7TutM8ItRg1Xv8e2B4boWMnHlFCIH38JfwgQnenbkF8SVTwVJtDCkmwEzN4q3xA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-android-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.128.0.tgz", + "integrity": "sha512-kwJ8YxWTzty8hD36jXxKiB+Po/ecmHZvT1xAYklkATbr0A4NUqV32sV+3Wfm8TecdA6jX34/mc+4CKK2+Hha2Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-darwin-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.128.0.tgz", + "integrity": "sha512-WBV8j5EZ7/3rvFbiJ8LxowmobR/XH+l2iRzkE7zRYLD5VC+TvZayYGrVGGDXQvXm6cGED0B1NweByTmeT4lpGQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-darwin-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.128.0.tgz", + "integrity": "sha512-U4k1CSBsY1uf6yHE+vCNJp0mHzjsUUXgOZXMyhRN3sE2ovBDT9Gl8oACmLWPjg0R68jwP+1vhnNPsSqpTEOycg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-freebsd-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.128.0.tgz", + "integrity": "sha512-NT1GtcWpX4sOuU5dMdSNpdXJRpk9BGAHHnKc42IUId8E+jEhZUrg9vqIRIlspZG5O9Y7FjO2r6GBK93bpyIIUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.128.0.tgz", + "integrity": "sha512-OskPMYMH2KtkqvRMULF2/+55hFo/qmRz2p/g7Cp7XNiqdjZ/DvQDiVbME63rVoX3dYjgS15DolGbo54mHTyA9w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm-musleabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.128.0.tgz", + "integrity": "sha512-fKUY7Y1vb8CYlGnS5FzqTeeM5zQz1Fleyaqz/T9iNHYAYNJ0Os9iT0rACLfAVCQKP9yOqPSwZ80xgZdVVGD61w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.128.0.tgz", + "integrity": "sha512-T+CQQZ3BoWY/TxQk9LZsXZYj3madR/5tCErV6wzphTYZJfVjvKmQxnxMaT+TKE40Jha6+iGgwzxwcYWJfltULQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.128.0.tgz", + "integrity": "sha512-F6RkJ90S1Xt25Mk7/wPUmddsE4RZ7Nei+HlEa2FAjfhpoaTciOwV6E/Gtp7wPIYbwft7UfhMYwuEuZiZQytVWw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-ppc64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.128.0.tgz", + "integrity": "sha512-0HP2FBGMlquLjShIIJvS4cebc6sdRRYL04GtxVpg96MtpejrkHYI2gQWcezsTUaGgg+eNRsuv2tdZPENu5+iWA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.128.0.tgz", + "integrity": "sha512-2j6Bd340IZqZbu4KUI28z87Ao9aHhq56HH1Qz5/+EdE732ajFYIoDF3z+QcxHXY0CFOG/Ur1ZOKTBEIWQ6BYIw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.128.0.tgz", + "integrity": "sha512-z5HSppdxNwB6//3Eo7mDWbTrLeyuTKvL/iLXaKEgocrJg1MhZLbRR7P5ore9gKvS4lF4EtEpA24xzilFxQK0iw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-s390x-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.128.0.tgz", + "integrity": "sha512-9rxYqH7P8NiYqRlLxlnNjJSF8BYADOmihM5ZHVkmlE4tqjHkoLNevdAyAP2ZBkL8QJflm1WGOXFWmFnWA54EvA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.128.0.tgz", + "integrity": "sha512-sy5+4Oamw6Ly5gUNUIDQ7346Lryt7AhqjKhOtWl5dzYZnTIwwoI0V2DeIl3bR/vU8D629ZMYQOqhquRtSyBUOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.128.0.tgz", + "integrity": "sha512-59Cxvjppy09TsaB15gr6rA9Bf87rm9t0bD1EW9dCZsdxWElnAC+TvWZ7v9dFUIeYeZUkhAAMPtpdqa3Y9CI2zA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-openharmony-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-openharmony-arm64/-/binding-openharmony-arm64-0.128.0.tgz", + "integrity": "sha512-XGa03zmiYpD7Kf1aXy6vjgkjfaCR90qH0TzGplnUXo6FF6gNe6sH9Zgneo9kxOyYt8CKKzXYD4VudT/nDTXq8Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-wasm32-wasi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-wasm32-wasi/-/binding-wasm32-wasi-0.128.0.tgz", + "integrity": "sha512-W+fK3cWhu/cUgx3NIAmDYcAyJs01aULlr3E3n/ZN79Q1/CX+FS+yWfwt/IysIi4FhpVL7z58azbJHDzhEx4X4g==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-arm64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.128.0.tgz", + "integrity": "sha512-pwMZd27FF+j4tHLYKtu4QBl6KI0gkt6xTNGLffs8VlH5vfDPHUvLo/AS6y66tdEjQ3chhs8OGg1mAFhPoQldDw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-ia32-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.128.0.tgz", + "integrity": "sha512-GskPdx/Fsn3ttkJbzxh51LYhla4N4p1sMufJKgf6PHupt5RukBaHI/GKM/2ni6ObxUI0b9UK37fROdV+5ekpMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-x64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.128.0.tgz", + "integrity": "sha512-m8oakspZCbCod3WuY0U9DvwQlhMYaU31bK+Way1Rb+JGs455WLtkebEie/luSuN5DeF+aZyRH/zt1AY4weKQQg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.112.0.tgz", + "integrity": "sha512-retxBzJ39Da7Lh/eZTn9+HJgTeDUxZIpuI0urOsmcFsBKXAth3lc1jIvwseQ9qbAI/VrsoFOXiGIzgclARbAHg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.112.0.tgz", + "integrity": "sha512-pRkbBRbuIIsufUWpOJ+JHWfJFNupkidy4sbjfcm37e6xwYrn9LSKMLubPHvNaL1Zf92ZRhGiwaYkEcmaFg2VcA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.112.0.tgz", + "integrity": "sha512-fh6/KQL/cbH5DukT3VkdCqnULLuvVnszVKySD5IgSE0WZb32YZo/cPsPdEv052kk6w3N4agu+NTiMnZjcvhUIg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.112.0.tgz", + "integrity": "sha512-vUBOOY1E30vlu/DoTGDoT1UbLlwu5Yv9tqeBabAwRzwNDz8Skho16VKhsBDUiyqddtpsR3//v6vNk38w4c+6IA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.112.0.tgz", + "integrity": "sha512-hnEtO/9AVnYWzrgnp6L+oPs/6UqlFeteUL6n7magkd2tttgmx1C01hyNNh6nTpZfLzEVJSNJ0S+4NTsK2q2CxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.112.0.tgz", + "integrity": "sha512-WxJrUz3pcIc2hp4lvJbvt/sTL33oX9NPvkD3vDDybE6tc0V++rS+hNOJxwXdD2FDIFPkHs/IEn5asEZFVH+VKw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.112.0.tgz", + "integrity": "sha512-jj8A8WWySaJQqM9XKAIG8U2Q3qxhFQKrXPWv98d1oC35at+L1h+C+V4M3l8BAKhpHKCu3dYlloaAbHd5q1Hw6A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.112.0.tgz", + "integrity": "sha512-G2F8H6FcAExVK5vvhpSh61tqWx5QoaXXUnSsj5FyuDiFT/K7AMMVSQVqnZREDc+YxhrjB0vnKjCcuobXK63kIw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.112.0.tgz", + "integrity": "sha512-3R0iqjM3xYOZCnwgcxOQXH7hrz64/USDIuLbNTM1kZqQzRqaR4w7SwoWKU934zABo8d0op2oSwOp+CV3hZnM7A==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.112.0.tgz", + "integrity": "sha512-lAQf8PQxfgy7h0bmcfSVE3hg3qMueshPYULFsCrHM+8KefGZ9W+ZMvRyU33gLrB4w1O3Fz1orR0hmKMCRxXNrQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.112.0.tgz", + "integrity": "sha512-2QlvQBUhHuAE3ezD4X3CAEKMXdfgInggQ5Bj/7gb5NcYP3GyfLTj7c+mMu+BRwfC9B3AXBNyqHWbqEuuUvZyRQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.112.0.tgz", + "integrity": "sha512-v06iu0osHszgqJ1dLQRb6leWFU1sjG/UQk4MoVBtE6ZPewgfTkby6G9II1SpEAf2onnAuQceVYxQH9iuU3NJqw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.112.0.tgz", + "integrity": "sha512-+5HhNHtxsdcd7+ljXFnn9FOoCNXJX3UPgIfIE6vdwS1HqdGNH6eAcVobuqGOp54l8pvcxDQA6F4cPswCgLrQfQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.112.0.tgz", + "integrity": "sha512-jKwO7ZLNkjxwg7FoCLw+fJszooL9yXRZsDN0AQ1AQUTWq1l8GH/2e44k68N3fcP19jl8O8jGpqLAZcQTYk6skA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.112.0.tgz", + "integrity": "sha512-TYqnuKV/p3eOc+N61E0961nA7DC+gaCeJ3+V2LcjJdTwFMdikqWL6uVk1jlrpUCBrozHDATVUKDZYH7r4FQYjQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.112.0.tgz", + "integrity": "sha512-ZhrVmWFifVEFQX4XPwLoVFDHw9tAWH9p9vHsHFH+5uCKdfVR+jje4WxVo6YrokWCboGckoOzHq5KKMOcPZfkRg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.112.0.tgz", + "integrity": "sha512-Gr8X2PUU3hX1g3F5oLWIZB8DhzDmjr5TfOrmn5tlBOo9l8ojPGdKjnIBfObM7X15928vza8QRKW25RTR7jfivg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.112.0.tgz", + "integrity": "sha512-t5CDLbU70Ea88bGRhvU/dLJTc/Wcrtf2Jp534E8P3cgjAvHDjdKsfDDqBZrhybJ8Jv9v9vW5ngE40EK51BluDA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.112.0.tgz", + "integrity": "sha512-rZH0JynCCwnhe2HfRoyNOl/Kfd9pudoWxgpC5OZhj7j77pMK0UOAa35hYDfrtSOUk2HLzrikV5dPUOY2DpSBSA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.112.0.tgz", + "integrity": "sha512-oGHluohzmVFAuQrkEnl1OXAxMz2aYmimxUqIgKXpBgbr7PvFv0doELB273sX+5V3fKeggohKg1A2Qq21W9Z9cQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.112.0.tgz", + "integrity": "sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxc-transform/binding-android-arm-eabi": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.112.0.tgz", + "integrity": "sha512-r4LuBaPnOAi0eUOBNi880Fm2tO2omH7N1FRrL6+nyz/AjQ+QPPLtoyZJva0O+sKi1buyN/7IzM5p9m+5ANSDbg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-android-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.112.0.tgz", + "integrity": "sha512-ve46vQcQrY8eGe8990VSlS9gkD+AogJqbtfOkeua+5sQGQTDgeIRRxOm7ktCo19uZc2bEBwXRJITgosd+NRVmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.112.0.tgz", + "integrity": "sha512-ddbmLU3Tr+i7MOynfwAXxUXud3SjJKlv7XNjaq08qiI8Av/QvhXVGc2bMhXkWQSMSBUeTDoiughKjK+Zsb6y/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-x64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.112.0.tgz", + "integrity": "sha512-TKvmNw96jQZPqYb4pRrzLFDailNB3YS14KNn+x2hwRbqc6CqY96S9PYwyOpVpYdxfoRjYO9WgX9SoS+62a1DPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-freebsd-x64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.112.0.tgz", + "integrity": "sha512-YPMkSCDaelO8HHYRMYjm+Q+IfkfIbdtQzwPuasItYkq8UUkNeHNPheNh2JkvQa3c+io3E9ePOgHQ2yihpk7o/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.112.0.tgz", + "integrity": "sha512-nA7kzQGNEpuTRknst/IJ3l8hqmDmEda3aun6jkXgp7gKxESjuHeaNH04mKISxvJ7fIacvP2g/wtTSnm4u5jL8Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-musleabihf": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.112.0.tgz", + "integrity": "sha512-w8GuLmckKlGc3YujaZKhtbFxziCcosvM2l9GnQjCb/yENWLGDiyQOy0BTAgPGdJwpYTiOeJblEXSuXYvlE1Ong==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.112.0.tgz", + "integrity": "sha512-9LwwGnJ8+WT0rXcrI8M0RJtDNt91eMqcDPPEvJxhRFHIMcHTy5D5xT+fOl3Us0yMqKo3HUWkbfUYqAp4GoZ3Jw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.112.0.tgz", + "integrity": "sha512-Lg6VOuSd3oXv7J0eGywgqh/086h+qQzIBOD+47pYKMTTJcbDe+f3h/RgGoMKJE5HhiwT5sH1aGEJfIfaYUiVSw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-ppc64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.112.0.tgz", + "integrity": "sha512-PXzmj82o1moA4IGphYImTRgc2youTi4VRfyFX3CHwLjxPcQ5JtcsgbDt4QUdOzXZ+zC07s5jf2ZzhRapEOlj2w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.112.0.tgz", + "integrity": "sha512-vhJsMsVH/6xwa3bt1LGts33FXUkGjaEGDwsRyp4lIfOjSfQVWMtCmWMFNaA0dW9FVWdD2Gt2fSFBSZ+azDxlpg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.112.0.tgz", + "integrity": "sha512-cXWFb7z+2IjFUEcXtRwluq9oEG5qnyFCjiu3SWrgYNcWwPdHusv3I/7K5/CTbbi4StoZ5txbi7/iSfDHNyWuRw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-s390x-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.112.0.tgz", + "integrity": "sha512-eEFu4SRqJTJ20/88KRWmp+jpHKAw0Y1DsnSgpEeXyBIIcsOaLIUMU/TfYWUmqRbvbMV9rmOmI3kp5xWYUq6kSQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-gnu": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.112.0.tgz", + "integrity": "sha512-ST1MDT+TlOyZ1c5btrGinRSUW2Jf4Pa+0gdKwsyjDSOC3dxy2ZNkN3mosTf4ywc3J+mxfYKqtjs7zSwHz03ILA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-musl": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.112.0.tgz", + "integrity": "sha512-ISQoA3pD4cyTGpf9sXXeerH6pL2L6EIpdy6oAy2ttkswyVFDyQNVOVIGIdLZDgbpmqGljxZnWqt/J/N68pQaig==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-openharmony-arm64": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.112.0.tgz", + "integrity": "sha512-UOGVrGIv7yLJovyEXEyUTADuLq98vd/cbMHFLJweRXD+11I8Tn4jASi4WzdsN8C3BVYGRHrXH2NlSBmhz33a4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.112.0.tgz", + "integrity": "sha512-XIX7Gpq9koAvzBVHDlVFHM79r5uOVK6kTEsdsN4qaajpjkgtv4tdsAOKIYK6l7fUbsbE6xS+6w1+yRFrDeC1kg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-transform/binding-win32-arm64-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.112.0.tgz", + "integrity": "sha512-EgXef9kOne9BNsbYBbuRqxk2hteT0xsAGcx/VbtCBMJYNj8fANFhT271DUSOgfa4DAgrQQmsyt/Kr1aV9mpU9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-ia32-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.112.0.tgz", + "integrity": "sha512-6QaB0qjNaou2YR+blncHdw7j0e26IOwOIjLbhVGDeuf9+4rjJeiqRXJ2hOtCcS4zblnao/MjdgQuZ3fM0nl+Kw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-x64-msvc": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.112.0.tgz", + "integrity": "sha512-FRKYlY959QeqRPx9kXs0HjU2xuXPT1cdF+vvA200D9uAX/KLcC34MwRqUKTYml4kCc2Vf/P2pBR9cQuBm3zECQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.6.tgz", + "integrity": "sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==", + "bundleDependencies": [ + "napi-wasm" + ], + "license": "MIT", + "dependencies": { + "is-glob": "^4.0.3", + "napi-wasm": "^1.1.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.7.0.tgz", + "integrity": "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-alias": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz", + "integrity": "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "rollup": ">=4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.2.tgz", + "integrity": "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", + "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", + "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==", + "license": "MIT", + "dependencies": { + "serialize-javascript": "^7.0.3", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-yaml": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz", + "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "js-yaml": "^4.1.0", + "tosource": "^2.0.0-alpha.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/transformers": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.0.2.tgz", + "integrity": "sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", + "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", + "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.3" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "license": "CC0-1.0" + }, + "node_modules/@sqlite.org/sqlite-wasm": { + "version": "3.50.4-build1", + "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.50.4-build1.tgz", + "integrity": "sha512-Qig2Wso7gPkU1PtXwFzndh+CTRzrIFxVGqv6eCetjU7YqxlHItj+GvQYwYTppCRgAPawtRN/4AJcEgB9xDHGug==", + "license": "Apache-2.0", + "bin": { + "sqlite-wasm": "bin/index.js" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", + "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "postcss": "^8.5.10", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@takumi-rs/core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core/-/core-1.1.2.tgz", + "integrity": "sha512-JI0kUis5MCPzOt2sCahBZLVJERpp1t1fXTRBaBbCGploUa/hqRA9HW6Nr+tccDM/C6wy9FDrJnI4SB56W0HfDA==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@takumi-rs/helpers": "1.1.2" + }, + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + }, + "optionalDependencies": { + "@takumi-rs/core-darwin-arm64": "1.1.2", + "@takumi-rs/core-darwin-x64": "1.1.2", + "@takumi-rs/core-linux-arm64-gnu": "1.1.2", + "@takumi-rs/core-linux-arm64-musl": "1.1.2", + "@takumi-rs/core-linux-x64-gnu": "1.1.2", + "@takumi-rs/core-linux-x64-musl": "1.1.2", + "@takumi-rs/core-win32-arm64-msvc": "1.1.2", + "@takumi-rs/core-win32-x64-msvc": "1.1.2" + } + }, + "node_modules/@takumi-rs/core-darwin-arm64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-darwin-arm64/-/core-darwin-arm64-1.1.2.tgz", + "integrity": "sha512-CLPzikYAND2xFm0Lg5HKImCOnl+Sue4F/WIcm1Z2ykL7h2r9rWDBzcFqGhAEFj9onMJH6c60Mph8kDa1jdj2rQ==", + "cpu": [ + "arm64" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-darwin-x64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-darwin-x64/-/core-darwin-x64-1.1.2.tgz", + "integrity": "sha512-eH351x+BJOMdLQgUoVKEIfTQbBjR6Dv7rzTLZUdWwbbwjEe38geCNsxQunHQ96nsB7M+0sGc8aJjOkd+0qoK3g==", + "cpu": [ + "x64" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-arm64-gnu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.1.2.tgz", + "integrity": "sha512-2cuSnKWAfQjQwS+7aprz0LRkztPVsGqWGTto0TydVI81z7sNyC4kZWoJMTpkNb3439HB03UBStQVacgUeVOL+w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-arm64-musl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-arm64-musl/-/core-linux-arm64-musl-1.1.2.tgz", + "integrity": "sha512-7OIdvVy6lbr49LIBe96uvlOg4Awmye5w+DgL4d0rRi1Zv7bmY23ciBCGaM+7jjkZgcThGrlZKz1Ecopx56pPqA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-x64-gnu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-x64-gnu/-/core-linux-x64-gnu-1.1.2.tgz", + "integrity": "sha512-IXEhQjGSGye+kwawDad00kN2cLpj1rPF5u0K4KsANvWxa/dho32Nnw+RX8cCtPGiuvEKhtENxtdc7pVSx1E84g==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-x64-musl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-x64-musl/-/core-linux-x64-musl-1.1.2.tgz", + "integrity": "sha512-Q2vuZCwQ/XmHwwbJxSKNNEKdWdhsvBMhTF8pyyGti5s44yx7W6+a0MkDdMRAkStzDhH6HeZlpknpHcUk4R4g8w==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-win32-arm64-msvc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.1.2.tgz", + "integrity": "sha512-CKpslxYCltih/lL+h7xkVzsfIZtDcXp3WGk01fudgx82Ic87b/jjRMX5KE4f/exkgrKxshRF4yCQGGeQ3vIhiw==", + "cpu": [ + "arm64" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-win32-x64-msvc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-win32-x64-msvc/-/core-win32-x64-msvc-1.1.2.tgz", + "integrity": "sha512-c+n2vPpDscMuTHZ29eJp8did5tlJ/KKBKicc51D6AdkA5jhr7MLeryzIKe3ob59iQttWYd/1j4+tUwoO6yEusg==", + "cpu": [ + "x64" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/helpers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@takumi-rs/helpers/-/helpers-1.1.2.tgz", + "integrity": "sha512-Edvmk7UzPhlbUCYpIqeBBfq9h/lAeWAhtwIhJJ10vxv7qNWjgfIPakzNWeAYhFVj8KT5y47S3RLT3cKVniqI5g==", + "license": "(MIT OR Apache-2.0)", + "peerDependencies": { + "react": "^19.2.5", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.14.0.tgz", + "integrity": "sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/vue-table/-/vue-table-8.21.3.tgz", + "integrity": "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": ">=3.2" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.24", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.24.tgz", + "integrity": "sha512-A0k2qF0zFSUStXSZkGXABouXr2Tw2Ztl/cVIYG9qy84uR8W7UNjAcX3DvzBS3YnDcwvLxab8v7dbmYBZ39itDA==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.14.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@tiptap/core": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.23.4.tgz", + "integrity": "sha512-ni2LWE52bVeSt3L2HVBSmbBw+elc32ATej9C68EyKzN/8vR5ILxFn6RCdDTKm4asmwZyq2jys12dKmBdWMr9QA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.23.4.tgz", + "integrity": "sha512-7YjSibNlPcy9eGK+tHt5G/Njr7nPxl+rZ3rCC6TwtLIRLSHPnoGDsfFOgTPkXxaQcE1a/VQwemnYfWc3kdIjDQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.23.4.tgz", + "integrity": "sha512-3L9tnZ12i+98u5df2nV2zGu/sc3rhI87E3ocn1YYAO8PJUAgZnMwdet8JawCrS1uut5sRKlxo3SXEmdNfRVm/w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.23.4.tgz", + "integrity": "sha512-EPTpL/IFp/aTGZErBq/Mc3dKznj6G/qNEkVYWjueOn1oKApyT0P6WVHGvu/vpMdErhzmoGDuFPPGVS6T8Upx2Q==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.23.4.tgz", + "integrity": "sha512-mXB2KZOz1R+E6VNTZ3vzdAk7ZDGKjPmsJEZIQg1B5qRycTKg49/rCCkLA2QnqAwX6BzS3mLLH1RWE2W0oXD7vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.23.4" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.23.4.tgz", + "integrity": "sha512-C0TeRipMycUEBnV+Mzx6eLp/yZb6Vi/waP3Tkb0lO5/ikg7LWLB7AlmMunjIXEUcR/pJHID/aEh5PfJFpysUDg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.23.4.tgz", + "integrity": "sha512-UEU1w/85CSNKktbhESnIRmtjKcH7DeschReZA8err1wAnYLTKzid5ucnJSJ25iRg2V5Fnuws5gnPT5CVgdfXCQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-collaboration": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-3.23.4.tgz", + "integrity": "sha512-28TJFayxCk7J9TmHBG4+8lVAz6YgyjN0RqzZueVeimWxSEgnTDGlkfHx6Ho5tOuyLwDa6SMBhN/6Q0iUMdnwMQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4", + "@tiptap/y-tiptap": "^3.0.2", + "yjs": "^13" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.23.4.tgz", + "integrity": "sha512-YC4G6VkxT629rlqUTwD6XvOpxjvghn7fxrK4RbyKVJY2C6E1vgmX0won1Ast6v+qTE6iONOMS6f6VyPxSGjg4w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-drag-handle": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle/-/extension-drag-handle-3.23.4.tgz", + "integrity": "sha512-ia027RBIdZIA9YBzt7Yuc4fGFAgdbxbVhrPqiDDJIN41IVsbb1PSQHDp8NVit50BNH1XVeAEB/E6WA/QLBoOgw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/extension-collaboration": "3.23.4", + "@tiptap/extension-node-range": "3.23.4", + "@tiptap/pm": "3.23.4", + "@tiptap/y-tiptap": "^3.0.2" + } + }, + "node_modules/@tiptap/extension-drag-handle-vue-3": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle-vue-3/-/extension-drag-handle-vue-3-3.23.4.tgz", + "integrity": "sha512-cAG6wU+th5/fPLBvr4MXyjPM3MYvCSESnfy4o0eq6VuKwPBcoWprY234nDG0dwzcPFxXQGmBg2GLwFqowrMYDA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-drag-handle": "3.23.4", + "@tiptap/pm": "3.23.4", + "@tiptap/vue-3": "3.23.4", + "vue": "^3.0.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.23.4.tgz", + "integrity": "sha512-ujJQUIENk0RwVFCh5g/TOSEv1a7Pnam/cjHmSUqHWUNZkYS9aOqjm+JfURJPCinRS2oHvo3AARul5mkKgDJYcA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.23.4" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.23.4.tgz", + "integrity": "sha512-eAc72bKM26yIPx0jsU8qdjE71vFNVu5R9jGbdItBMFc0SPLS4qY8g+8RJ+iWoLwbcSEpgooLS9D9sLfdAU+Tvw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.23.4.tgz", + "integrity": "sha512-RuyvOlIGP6UpVOc0Lw0L63jKLtYM49CNhPV2OMSfwwwbBZ3pJGos2/SqpYg71d3sn+qpsAopS4Pfr8iPZog73A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.23.4" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.23.4.tgz", + "integrity": "sha512-ODlpZCi7n136BH9luM09EFL8Pg+bbRCd0tzCQM5BKMXRkLitYZA8Gl/f5DLmGJ50wzFsDPXK2Br2g9UvZK7COg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.23.4.tgz", + "integrity": "sha512-8W9Hqi0J69Xbqg08nPf4xRMJXMccaKFAgUE1tvy5PAWJSQxOMwkKQXgZXxwe+80sOMUnV8qveBqUy/ODMPgAxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.23.4.tgz", + "integrity": "sha512-EA4kK8ywZ4dQNOdxeZbplmDDs5T5LjMgHpqxRwukj9wwKiILOK5E3fcKm1fCKh9Q02w96jax6YVccHwmgJP3sQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-image": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.23.4.tgz", + "integrity": "sha512-qandp5HLRl+n8D61+LCT67qtb1uSKffyEGD0fVTkg/RfbyFsJvCDFbjVEoiIG8JOx8O5DehgrDCvS35QOWgr2A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.23.4.tgz", + "integrity": "sha512-jUAHi+HZlg47BzgVIy6y/UH5vev7vPQ95jddhB5K3hC122kvWFMXlken7UOnqzbxNcHs2+4Oi/ZJirYMpT4P5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.23.4.tgz", + "integrity": "sha512-XjxltY7MomwfTs6jmN6Bw5bb/upb34lpyqv2RiXppFTK25Br7ipksRjUpWpB4/csZeg30qwrLGVKxCol38ffrw==", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.3.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-list": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.23.4.tgz", + "integrity": "sha512-yuauDm6qW/7q+ZO0YJBKQEGdnUm6DDTJM8AMp9bMZrT4jRf/zyUtNcZ91QEfFvBcyVuI+10PIOXtNPevhQ741Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.23.4.tgz", + "integrity": "sha512-Q/JXosShD5oyDwukE6igdrZD2lb0ZgyoQTHYchk0pzU4frClFbn3RI1wKP+XeqKLhdO6KH2WZ9rERGH7PtDi7Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.23.4" + } + }, + "node_modules/@tiptap/extension-list-keymap": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.23.4.tgz", + "integrity": "sha512-9FezifCfuoc0o+5K6l4QNOOfelqxnDGg/f9oL1D/LFZPC54bPxpWWft9QCWOqyqZgyLCLjbCjciAlbgkrFUmmw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.23.4" + } + }, + "node_modules/@tiptap/extension-mention": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-3.23.4.tgz", + "integrity": "sha512-4Fq4shW/XQ8h4wyaudOP4HWze9NWN4MTCQAQb8BSHWaMOosVRzve+WnTQL53axWj0pbYqM+d9iYpMgvdMmMm9g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4", + "@tiptap/suggestion": "3.23.4" + } + }, + "node_modules/@tiptap/extension-node-range": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-node-range/-/extension-node-range-3.23.4.tgz", + "integrity": "sha512-wmJrIT2Ng4TP4HniA0+WCNtqL09ZBZYd9bSnyDfZiz5phEcnqfCTBGpPXiA+jTjxZp/ZrJPFTjgQPevNQIAa9g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.23.4.tgz", + "integrity": "sha512-+3ofyssYnOTa1+nFWEmCAY1ngn8nAV1xo25JnNNC87NMU9WkSgr93jB7/uUJP0uui1C2dBLlaup3XXm108yarw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.23.4" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.23.4.tgz", + "integrity": "sha512-KbhXjCFzWphvFn5VU7E4dtmYDm+bssI1i0+CnXPWCXkjdaaX88ck68Xp1fKz8/bbI/CqlgiNDO/3TvqgtZ6woQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.23.4.tgz", + "integrity": "sha512-yHtAZkFR9M2AQmCi555w4ns1BBCqwRyYDYMtd10DBvqPX7T3TmGerPdUfI6sLr74GxnZ5zHOnOYdwAbeG5JzNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.23.4" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.23.4.tgz", + "integrity": "sha512-Vnq5vW801zPbu1LtKeA5k4R241jY+hRjXeijYwIPxy15KzIiipY12518HiCf6/8kkRbMxgOfdYg9X4BRV3HV3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.23.4.tgz", + "integrity": "sha512-q9kxver/MR18p66aWZHSPycnr9hcBFyVGeGj8gf+BQCzn5hpvtSYTfLvk1nq8GFhygdQ9/e3f7B5ovrm/jnpvw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.23.4.tgz", + "integrity": "sha512-F1ocPT10LV+seky25R1TMCRdc/Iof99jLcDSYDGr6mNEDY4ct2RvOeSM8aDdYq6CkH+vXt3i3JDeRwV23KzswQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4" + } + }, + "node_modules/@tiptap/extensions": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.23.4.tgz", + "integrity": "sha512-SlGPXauW8iKWG7wwuwC/0y/smLImp0h6GBIGgNnTBgIP/ThXQnjLMSZH0mW/REO87dQxkku01V3ARRywi+juhg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/markdown": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/markdown/-/markdown-3.23.4.tgz", + "integrity": "sha512-jRh/oa7WyhnXo+vaiaiZ42a5h/m1vvsrEWJHy12vD1qMivRKfNmRJN+lZmYpBV+6h+5vhQpg7EMMIH82xvVWRQ==", + "license": "MIT", + "dependencies": { + "marked": "^17.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/pm": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.23.4.tgz", + "integrity": "sha512-+C5ngcoza47n3MjtjVBqBEBICPC0McdbwzJ+X6SSCviCLoqnSYanv5mIX9HWG0Q4fJ4BkdNM3VibZUxQaTbKyQ==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.38.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.23.4.tgz", + "integrity": "sha512-3VhU+NO6/ec9DMj/5Ej0nzARSq42cXnqW+QHCmTL3FNXkXQz+tw1KlfruT5GGJ3M0RssjWjRC0a39N/4S3qxeA==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^3.23.4", + "@tiptap/extension-blockquote": "^3.23.4", + "@tiptap/extension-bold": "^3.23.4", + "@tiptap/extension-bullet-list": "^3.23.4", + "@tiptap/extension-code": "^3.23.4", + "@tiptap/extension-code-block": "^3.23.4", + "@tiptap/extension-document": "^3.23.4", + "@tiptap/extension-dropcursor": "^3.23.4", + "@tiptap/extension-gapcursor": "^3.23.4", + "@tiptap/extension-hard-break": "^3.23.4", + "@tiptap/extension-heading": "^3.23.4", + "@tiptap/extension-horizontal-rule": "^3.23.4", + "@tiptap/extension-italic": "^3.23.4", + "@tiptap/extension-link": "^3.23.4", + "@tiptap/extension-list": "^3.23.4", + "@tiptap/extension-list-item": "^3.23.4", + "@tiptap/extension-list-keymap": "^3.23.4", + "@tiptap/extension-ordered-list": "^3.23.4", + "@tiptap/extension-paragraph": "^3.23.4", + "@tiptap/extension-strike": "^3.23.4", + "@tiptap/extension-text": "^3.23.4", + "@tiptap/extension-underline": "^3.23.4", + "@tiptap/extensions": "^3.23.4", + "@tiptap/pm": "^3.23.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/suggestion": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.23.4.tgz", + "integrity": "sha512-KvrHKQcGpEKPPuetH2N4K21kA7hc31n5WDzw3FM+fNpMKdJOToYoNZzS9rmuBBHmNZ9wyK2sWmzi09enmv6wbg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4" + } + }, + "node_modules/@tiptap/vue-3": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-3.23.4.tgz", + "integrity": "sha512-D8aUfiXSM1InPOe4jI4bBPSilz7bc42uVt5dMeto1cYYZrlzZEIe1vXvGm/0tvd/oVUtqQNk2Mjz+w0xoABT3Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.23.4", + "@tiptap/extension-floating-menu": "^3.23.4" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.23.4", + "@tiptap/pm": "3.23.4", + "vue": "^3.0.0" + } + }, + "node_modules/@tiptap/y-tiptap": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@tiptap/y-tiptap/-/y-tiptap-3.0.3.tgz", + "integrity": "sha512-8UvuV4lTisCE9cMTc/X8kRyTn9edUO7Kball0I6wb17VwZSjNDfh/YKtP4O5vcPawEzFHQIvZGq/k1h37kAf0w==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.100" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz", + "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/parse-path": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", + "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@unhead/bundler": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@unhead/bundler/-/bundler-3.1.0.tgz", + "integrity": "sha512-PzIa26mo1fk2t3KJ6ACJXTi1MD1nDJXb4hl/P8+UTMmdK0EWyDo3LMttePsIgKKR5PTnrtSeyhd43Pdoym4z2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vitejs/devtools-kit": "^0.1.15", + "magic-string": "^0.30.21", + "oxc-parser": "^0.127.0", + "oxc-walker": "^0.7.0", + "ufo": "^1.6.3", + "unplugin": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "@unhead/cli": "^3.1.0", + "esbuild": ">=0.17.0", + "lightningcss": ">=1.20.0", + "rolldown": ">=1.0.0-beta.0", + "unhead": "^3.1.0", + "vite": ">=6.4.2", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "@unhead/cli": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@unhead/bundler/node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.127.0.tgz", + "integrity": "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.127.0.tgz", + "integrity": "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.127.0.tgz", + "integrity": "sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.127.0.tgz", + "integrity": "sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.127.0.tgz", + "integrity": "sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.127.0.tgz", + "integrity": "sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.127.0.tgz", + "integrity": "sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.127.0.tgz", + "integrity": "sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.127.0.tgz", + "integrity": "sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.127.0.tgz", + "integrity": "sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.127.0.tgz", + "integrity": "sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.127.0.tgz", + "integrity": "sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.127.0.tgz", + "integrity": "sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.127.0.tgz", + "integrity": "sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.127.0.tgz", + "integrity": "sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.127.0.tgz", + "integrity": "sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.127.0.tgz", + "integrity": "sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", + "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.127.0.tgz", + "integrity": "sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.127.0.tgz", + "integrity": "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@unhead/bundler/node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@unhead/bundler/node_modules/oxc-parser": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.127.0.tgz", + "integrity": "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/types": "^0.127.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.127.0", + "@oxc-parser/binding-android-arm64": "0.127.0", + "@oxc-parser/binding-darwin-arm64": "0.127.0", + "@oxc-parser/binding-darwin-x64": "0.127.0", + "@oxc-parser/binding-freebsd-x64": "0.127.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.127.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.127.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.127.0", + "@oxc-parser/binding-linux-arm64-musl": "0.127.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.127.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-musl": "0.127.0", + "@oxc-parser/binding-openharmony-arm64": "0.127.0", + "@oxc-parser/binding-wasm32-wasi": "0.127.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.127.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.127.0", + "@oxc-parser/binding-win32-x64-msvc": "0.127.0" + } + }, + "node_modules/@unhead/vue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-3.1.0.tgz", + "integrity": "sha512-ib0YCfaoD0lL40Dg1FEQJksZhZ5Q+LMESXUxyfMrtlSUb43+Ha7btUIPyQuAfkjhlTihE1x5i9QdswEdhe0LWg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@unhead/bundler": "3.1.0", + "hookable": "^6.1.1", + "unhead": "3.1.0", + "unplugin": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vite": ">=6.4.2", + "vue": ">=3.5.18", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@unhead/vue/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@valibot/to-json-schema": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@valibot/to-json-schema/-/to-json-schema-1.7.0.tgz", + "integrity": "sha512-Y3pPVibbIOHzohrlxSINvO7w/bvXkoYS3BQHoImV9ynE+bXKf171bdMucPurV2zp7gdmt0L1HCcNAsbo7cFRQw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "valibot": "^1.4.0" + } + }, + "node_modules/@vercel/nft": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", + "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/oidc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@vitejs/devtools-kit": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/@vitejs/devtools-kit/-/devtools-kit-0.1.24.tgz", + "integrity": "sha512-sHM4i80Rrx4HTv/c2d28pQpeMz99GQe/2lVvJvna9t/YcoVouqpsms8oKiF/NcX8474A5gx3TtJHXWvqbov1dg==", + "license": "MIT", + "peer": true, + "dependencies": { + "birpc": "^4.0.0", + "devframe": "0.2.2", + "logs-sdk": "^0.0.6", + "mlly": "^1.8.2", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "tinyexec": "^1.1.2" + }, + "peerDependencies": { + "vite": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.5.tgz", + "integrity": "sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-syntax-typescript": "^7.28.6", + "@babel/plugin-transform-typescript": "^7.28.6", + "@rolldown/pluginutils": "^1.0.0-rc.2", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", + "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.34", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", + "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", + "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.34", + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.14", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", + "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/devtools-core": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.1.2.tgz", + "integrity": "sha512-ZGGyaSBP4/+bN2Nd9ZHNYAVDRIzMw1rv2RyXWtyZlo6mQal+IDmTvKY4V+DjAEBhaXt30mHmsgYp1yXJ/2tIWg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.2", + "@vue/devtools-shared": "^8.1.2" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.2.tgz", + "integrity": "sha512-f75/upc+GCyjXErpgPGz4582ujS0L/adAltGy+tqXMGUJpgAcfGr6CxnnhpZY8BHuMYt6KpbF8uaFrrQG66rGQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.2", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-kit/node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.2.tgz", + "integrity": "sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.9.tgz", + "integrity": "sha512-ie0ojt/0fU/GfIogh+zgHbaYRPlt9S+cLOxcWwF7nTSFh897BVgnFKL2byT4kpp1mlqYWZ2psGwSniyE2xsxYw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", + "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", + "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", + "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.34", + "@vue/runtime-core": "3.5.34", + "@vue/shared": "3.5.34", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", + "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34" + }, + "peerDependencies": { + "vue": "3.5.34" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", + "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.3.0", + "@vueuse/shared": "14.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.3.0.tgz", + "integrity": "sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "14.3.0", + "@vueuse/shared": "14.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7 || ^8", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7 || ^8", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", + "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", + "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", + "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ai": { + "version": "6.0.168", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.168.tgz", + "integrity": "sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "3.0.104", + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.23", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ai/node_modules/@ai-sdk/gateway": { + "version": "3.0.104", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.104.tgz", + "integrity": "sha512-ZKX5n74io8VIRlhIMSLWVlvT3sXC8Z7cZ9GHuWBWZDVi96+62AIsWuLGvMfcBA1STYuSoDrp6rIziZmvrTq0TA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.23", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz", + "integrity": "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.0.tgz", + "integrity": "sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bare-events": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.3.tgz", + "integrity": "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", + "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", + "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.3.tgz", + "integrity": "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-sqlite3": { + "version": "12.10.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz", + "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/birpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.0.0.tgz", + "integrity": "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", + "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "defu": "^6.1.6", + "dotenv": "^17.3.1", + "exsolve": "^1.0.8", + "giget": "^3.2.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "rc9": "^3.0.1" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrome-launcher": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.2.1.tgz", + "integrity": "sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^2.0.1" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.cjs" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "license": "Apache-2.0" + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colortranslator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-5.0.0.tgz", + "integrity": "sha512-Z3UPUKasUVDFCDYAjP2fmlVRf1jFHJv1izAmPjiOa0OCIw1W7iC8PZ2GsoDa8uZv+mKyWopxxStT9q05+27h7w==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compatx": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.2.0.tgz", + "integrity": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==", + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/croner": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/croner/-/croner-10.0.1.tgz", + "integrity": "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==", + "funding": [ + { + "type": "other", + "url": "https://paypal.me/hexagonpp" + }, + { + "type": "github", + "url": "https://github.com/sponsors/hexagon" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "license": "MIT", + "optional": true + }, + "node_modules/cssnano": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz", + "integrity": "sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.17", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz", + "integrity": "sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.3", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.10", + "postcss-convert-values": "^7.0.12", + "postcss-discard-comments": "^7.0.8", + "postcss-discard-duplicates": "^7.0.4", + "postcss-discard-empty": "^7.0.3", + "postcss-discard-overridden": "^7.0.3", + "postcss-merge-longhand": "^7.0.7", + "postcss-merge-rules": "^7.0.11", + "postcss-minify-font-values": "^7.0.3", + "postcss-minify-gradients": "^7.0.5", + "postcss-minify-params": "^7.0.9", + "postcss-minify-selectors": "^7.1.2", + "postcss-normalize-charset": "^7.0.3", + "postcss-normalize-display-values": "^7.0.3", + "postcss-normalize-positions": "^7.0.4", + "postcss-normalize-repeat-style": "^7.0.4", + "postcss-normalize-string": "^7.0.3", + "postcss-normalize-timing-functions": "^7.0.3", + "postcss-normalize-unicode": "^7.0.9", + "postcss-normalize-url": "^7.0.3", + "postcss-normalize-whitespace": "^7.0.3", + "postcss-ordered-values": "^7.0.4", + "postcss-reduce-initial": "^7.0.9", + "postcss-reduce-transforms": "^7.0.3", + "postcss-svgo": "^7.1.3", + "postcss-unique-selectors": "^7.0.7" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz", + "integrity": "sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/culori": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/culori/-/culori-4.0.2.tgz", + "integrity": "sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/db0": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.4.tgz", + "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", + "license": "MIT", + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "better-sqlite3": "*", + "drizzle-orm": "*", + "mysql2": "*", + "sqlite3": "*" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT", + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detab": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detab/-/detab-3.0.2.tgz", + "integrity": "sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "license": "MIT" + }, + "node_modules/devframe": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/devframe/-/devframe-0.2.2.tgz", + "integrity": "sha512-nB5xJR0XREJSVD7Me7j9UUY1NIpPlBGYI/b6EMigeoVPaUv7/RwKf/uyc/94P00yMMxQzSMy/94NzWemDd70SQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@valibot/to-json-schema": "^1.7.0", + "birpc": "^4.0.0", + "cac": "^7.0.0", + "h3": "2.0.1-rc.22", + "logs-sdk": "^0.0.6", + "mrmime": "^2.0.1", + "pathe": "^2.0.3", + "valibot": "^1.4.0", + "ws": "^8.20.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.0.0" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/devframe/node_modules/h3": { + "version": "2.0.1-rc.22", + "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.22.tgz", + "integrity": "sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==", + "license": "MIT", + "peer": true, + "dependencies": { + "rou3": "^0.8.1", + "srvx": "^0.11.15" + }, + "bin": { + "h3": "bin/h3.mjs" + }, + "engines": { + "node": ">=20.11.1" + }, + "peerDependencies": { + "crossws": "^0.4.1" + }, + "peerDependenciesMeta": { + "crossws": { + "optional": true + } + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "license": "MIT" + }, + "node_modules/docus": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/docus/-/docus-5.11.0.tgz", + "integrity": "sha512-4/6O+mAOmEGJsjAVJNNBm60wyYfmUoj+kv+ZjoI4p3trMpe7JShWHzXeG6NrO/WuQSrXm0ODneMs2Bg6dWQgBA==", + "license": "MIT", + "dependencies": { + "@ai-sdk/gateway": "^3.0.104", + "@ai-sdk/mcp": "^1.0.36", + "@ai-sdk/vue": "3.0.168", + "@iconify-json/lucide": "^1.2.102", + "@iconify-json/simple-icons": "^1.2.79", + "@iconify-json/vscode-icons": "^1.2.45", + "@nuxt/content": "^3.13.0", + "@nuxt/image": "^2.0.0", + "@nuxt/kit": "^4.4.2", + "@nuxt/ui": "^4.7.1", + "@nuxtjs/i18n": "^10.2.4", + "@nuxtjs/mcp-toolkit": "^0.13.4", + "@nuxtjs/mdc": "^0.21.1", + "@nuxtjs/robots": "^6.0.7", + "@shikijs/core": "^4.0.2", + "@shikijs/engine-javascript": "^4.0.2", + "@shikijs/langs": "^4.0.2", + "@shikijs/themes": "^4.0.2", + "@takumi-rs/core": "^1.0.15", + "@vueuse/core": "^14.2.1", + "ai": "6.0.168", + "defu": "^6.1.7", + "exsolve": "^1.0.8", + "git-url-parse": "^16.1.0", + "motion-v": "^2.2.1", + "nuxt-llms": "^0.2.0", + "nuxt-og-image": "^6.4.5", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "scule": "^1.3.0", + "shiki-stream": "^0.1.4", + "tailwindcss": "^4.2.3", + "ufo": "^1.6.3", + "yaml": "^2.8.3", + "zod": "^4.3.6", + "zod-to-json-schema": "^3.25.2" + }, + "peerDependencies": { + "better-sqlite3": "12.x", + "nuxt": "4.x" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.1.0.tgz", + "integrity": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==", + "license": "MIT", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.357", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", + "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-auto-height": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-auto-height/-/embla-carousel-auto-height-8.6.0.tgz", + "integrity": "sha512-/HrJQOEM6aol/oF33gd2QlINcXy3e19fJWvHDuHWp2bpyTa+2dm9tVVJak30m2Qy6QyQ6Fc8DkImtv7pxWOJUQ==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-auto-scroll": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-auto-scroll/-/embla-carousel-auto-scroll-8.6.0.tgz", + "integrity": "sha512-WT9fWhNXFpbQ6kP+aS07oF5IHYLZ1Dx4DkwgCY8Hv2ZyYd2KMCPfMV1q/cA3wFGuLO7GMgKiySLX90/pQkcOdQ==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz", + "integrity": "sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-class-names": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-class-names/-/embla-carousel-class-names-8.6.0.tgz", + "integrity": "sha512-l1hm1+7GxQ+zwdU2sea/LhD946on7XO2qk3Xq2XWSwBaWfdgchXdK567yzLtYSHn4sWYdiX+x4nnaj+saKnJkw==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-fade": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz", + "integrity": "sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-vue": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-vue/-/embla-carousel-vue-8.6.0.tgz", + "integrity": "sha512-v8UO5UsyLocZnu/LbfQA7Dn2QHuZKurJY93VUmZYP//QRWoCWOsionmvLLAlibkET3pGPs7++03VhJKbWD7vhQ==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "vue": "^3.2.37" + } + }, + "node_modules/embla-carousel-wheel-gestures": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/embla-carousel-wheel-gestures/-/embla-carousel-wheel-gestures-8.1.0.tgz", + "integrity": "sha512-J68jkYrxbWDmXOm2n2YHl+uMEXzkGSKjWmjaEgL9xVvPb3HqVmg6rJSKfI3sqIDVvm7mkeTy87wtG/5263XqHQ==", + "license": "MIT", + "dependencies": { + "wheel-gestures": "^2.2.5" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "embla-carousel": "^8.0.0 || ~8.0.0-rc03" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/errx": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", + "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT", + "peer": true + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", + "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT", + "peer": true + }, + "node_modules/fast-npm-meta": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-1.5.1.tgz", + "integrity": "sha512-tWhw7z4jFuQgZB9tbQyUh5BY9nNd/wimM+fBLfmmJjakkJDNvbJKm0nQ5ruPKC0us1HGg7L6iBk1fxpSzcgSaA==", + "license": "MIT", + "bin": { + "fast-npm-meta": "dist/cli.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", + "integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", + "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "license": "ISC", + "peer": true + }, + "node_modules/fontaine": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/fontaine/-/fontaine-0.8.0.tgz", + "integrity": "sha512-eek1GbzOdWIj9FyQH/emqW1aEdfC3lYRCHepzwlFCm5T77fBSRSyNRKE6/antF1/B1M+SfJXVRQTY9GAr7lnDg==", + "license": "MIT", + "dependencies": { + "@capsizecss/unpack": "^4.0.0", + "css-tree": "^3.1.0", + "magic-regexp": "^0.10.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "ufo": "^1.6.1", + "unplugin": "^2.3.10" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/fontaine/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fontless": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fontless/-/fontless-0.2.1.tgz", + "integrity": "sha512-mUWZ8w91/mw2KEcZ6gHNoNNmsAq9Wiw2IypIux5lM03nhXm+WSloXGUNuRETNTLqZexMgpt7Aj/v63qqrsWraQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.4.2", + "css-tree": "^3.1.0", + "defu": "^6.1.4", + "esbuild": "^0.27.0", + "fontaine": "0.8.0", + "jiti": "^2.6.1", + "lightningcss": "^1.30.2", + "magic-string": "^0.30.21", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "ufo": "^1.6.1", + "unifont": "^0.7.4", + "unstorage": "^1.17.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", + "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.3.0.tgz", + "integrity": "sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", + "license": "BSD-3-Clause" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.2.0.tgz", + "integrity": "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==", + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/git-up": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^9.2.0" + } + }, + "node_modules/git-url-parse": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "license": "MIT", + "dependencies": { + "git-up": "^8.1.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.0.tgz", + "integrity": "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", + "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", + "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "hast-util-to-text": "^4.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-minify-whitespace": "^6.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.12.19", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.19.tgz", + "integrity": "sha512-xa3eYXYXx68XTT4hZ7dRzsXBhaq85ToSrlUJNoR0gwz/1Ap/CNwX47wfvV7pc/xWhjKVVkLT7zBJy8chhNguqQ==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/httpxy": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.1.tgz", + "integrity": "sha512-JPhqYiixe1A1I+MXDewWDZqeudBGU8Q9jCHYN8ML+779RQzLjTi78HBvWz4jMxUD6h2/vUL12g4q/mFM0OUw1A==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-meta": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.2.tgz", + "integrity": "sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==", + "license": "MIT" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/impound": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/impound/-/impound-1.1.5.tgz", + "integrity": "sha512-5AUn+QE0UofqNHu5f2Skf6Svukdg4ehOIq8O0EtqIx4jta0CDZYBPqpIHt0zrlUTiFVYlLpeH39DoikXBjPKpA==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "es-module-lexer": "^2.0.0", + "pathe": "^2.0.3", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ioredis": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz", + "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.5.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ipx/-/ipx-3.1.1.tgz", + "integrity": "sha512-7Xnt54Dco7uYkfdAw0r2vCly3z0rSaVhEXMzPvl3FndsTVm5p26j+PO+gyinkYmcsEUvX2Rh7OGK7KzYWRu6BA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@fastify/accept-negotiator": "^2.0.1", + "citty": "^0.1.6", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "etag": "^1.8.1", + "h3": "^1.15.3", + "image-meta": "^0.2.1", + "listhen": "^1.9.0", + "ofetch": "^1.4.1", + "pathe": "^2.0.3", + "sharp": "^0.34.3", + "svgo": "^4.0.0", + "ufo": "^1.6.1", + "unstorage": "^1.16.1", + "xss": "^1.0.15" + }, + "bin": { + "ipx": "bin/ipx.mjs" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isomorphic-git": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.38.0.tgz", + "integrity": "sha512-gsBFnAT8Fxrpx+53ymG5kEOHSrUDVcSMFl7fCEGVnPpQbPS0aKti3UzZXR+3DKA0yyf+4z6CXJxULlQ5QPxDJw==", + "license": "MIT", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/isomorphic-git/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT", + "peer": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-to-typescript-lite": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript-lite/-/json-schema-to-typescript-lite-15.0.0.tgz", + "integrity": "sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^14.1.1", + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.3.0.tgz", + "integrity": "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==", + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", + "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lib0": { + "version": "0.2.117", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz", + "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/lighthouse-logger": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz", + "integrity": "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.1", + "marky": "^1.2.2" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/linkifyjs": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz", + "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==", + "license": "MIT" + }, + "node_modules/listhen": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.10.0.tgz", + "integrity": "sha512-kfz4C0OrC6IpaVMtYDJtf6PFjurxe9NBBoDAh/o2p587INryFOO4DQ9OetbCdDrWFt1m1CJKvYrzkGsuPHw8nQ==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.6", + "@parcel/watcher-wasm": "^2.5.6", + "citty": "^0.2.2", + "consola": "^3.4.2", + "crossws": ">=0.2.0 <0.5.0", + "defu": "^6.1.7", + "get-port-please": "^3.2.0", + "h3": "^1.15.11", + "http-shutdown": "^1.2.2", + "jiti": "^2.6.1", + "mlly": "^1.8.2", + "node-forge": "^1.4.0", + "pathe": "^2.0.3", + "std-env": "^4.1.0", + "tinyclip": "^0.1.12", + "ufo": "^1.6.4", + "untun": "^0.1.3", + "uqr": "^0.1.3" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + } + }, + "node_modules/listhen/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/logs-sdk": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/logs-sdk/-/logs-sdk-0.0.6.tgz", + "integrity": "sha512-G4M1C9aLLBOIWpmw/Lqk4zrap/T2IJsoUOuUDjRcVSLy6lHQqxr3wCqIT1FvvpYTUYpEwvu4utsMY42jTNvx8Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "magic-string": "^0.30.21", + "oxc-parser": "^0.126.0", + "unplugin": "^3.0.0" + } + }, + "node_modules/logs-sdk/node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/logs-sdk/node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.126.0.tgz", + "integrity": "sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.126.0.tgz", + "integrity": "sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.126.0.tgz", + "integrity": "sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.126.0.tgz", + "integrity": "sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.126.0.tgz", + "integrity": "sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.126.0.tgz", + "integrity": "sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.126.0.tgz", + "integrity": "sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.126.0.tgz", + "integrity": "sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.126.0.tgz", + "integrity": "sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.126.0.tgz", + "integrity": "sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.126.0.tgz", + "integrity": "sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.126.0.tgz", + "integrity": "sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.126.0.tgz", + "integrity": "sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.126.0.tgz", + "integrity": "sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.126.0.tgz", + "integrity": "sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.126.0.tgz", + "integrity": "sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.126.0.tgz", + "integrity": "sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.126.0.tgz", + "integrity": "sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.126.0.tgz", + "integrity": "sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.126.0.tgz", + "integrity": "sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/logs-sdk/node_modules/@oxc-project/types": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.126.0.tgz", + "integrity": "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/logs-sdk/node_modules/oxc-parser": { + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.126.0.tgz", + "integrity": "sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/types": "^0.126.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.126.0", + "@oxc-parser/binding-android-arm64": "0.126.0", + "@oxc-parser/binding-darwin-arm64": "0.126.0", + "@oxc-parser/binding-darwin-x64": "0.126.0", + "@oxc-parser/binding-freebsd-x64": "0.126.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.126.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.126.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.126.0", + "@oxc-parser/binding-linux-arm64-musl": "0.126.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.126.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.126.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.126.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.126.0", + "@oxc-parser/binding-linux-x64-gnu": "0.126.0", + "@oxc-parser/binding-linux-x64-musl": "0.126.0", + "@oxc-parser/binding-openharmony-arm64": "0.126.0", + "@oxc-parser/binding-wasm32-wasi": "0.126.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.126.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.126.0", + "@oxc-parser/binding-win32-x64-msvc": "0.126.0" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-regexp": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", + "integrity": "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12", + "mlly": "^1.7.2", + "regexp-tree": "^0.1.27", + "type-level-regexp": "~0.1.17", + "ufo": "^1.5.4", + "unplugin": "^2.0.0" + } + }, + "node_modules/magic-regexp/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/magic-regexp/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", + "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/marky": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimark": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimark/-/minimark-0.2.0.tgz", + "integrity": "sha512-AmtWU9pO0C2/3AM2pikaVhJ//8E5rOpJ7+ioFQfjIq+wCsBeuZoxPd97hBFZ9qrI7DMHZudwGH3r8A7BMnsIew==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mocked-exports": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/mocked-exports/-/mocked-exports-0.1.1.tgz", + "integrity": "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==", + "license": "MIT" + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", + "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", + "license": "MIT" + }, + "node_modules/motion-v": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/motion-v/-/motion-v-2.2.1.tgz", + "integrity": "sha512-BYbABe1Ep/u33dHOrK+8SoVU2MuiQqT94JOYsgrge8QbrwkKf2lS6rHW2QyzP6t89wcyBvzZeLQQwfrx76dj9A==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.38.0", + "hey-listen": "^1.0.8", + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0" + }, + "peerDependencies": { + "@vueuse/core": ">=10.0.0", + "vue": ">=3.0.0" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanotar": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.3.0.tgz", + "integrity": "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==", + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT", + "peer": true + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nitropack": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.13.4.tgz", + "integrity": "sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==", + "license": "MIT", + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.4.2", + "@rollup/plugin-alias": "^6.0.0", + "@rollup/plugin-commonjs": "^29.0.2", + "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "@rollup/plugin-terser": "^1.0.0", + "@vercel/nft": "^1.5.0", + "archiver": "^7.0.1", + "c12": "^3.3.4", + "chokidar": "^5.0.0", + "citty": "^0.2.2", + "compatx": "^0.2.0", + "confbox": "^0.2.4", + "consola": "^3.4.2", + "cookie-es": "^2.0.1", + "croner": "^10.0.1", + "crossws": "^0.3.5", + "db0": "^0.3.4", + "defu": "^6.1.7", + "destr": "^2.0.5", + "dot-prop": "^10.1.0", + "esbuild": "^0.28.0", + "escape-string-regexp": "^5.0.0", + "etag": "^1.8.1", + "exsolve": "^1.0.8", + "globby": "^16.2.0", + "gzip-size": "^7.0.0", + "h3": "^1.15.11", + "hookable": "^5.5.3", + "httpxy": "^0.5.1", + "ioredis": "^5.10.1", + "jiti": "^2.6.1", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "listhen": "^1.9.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mime": "^4.1.0", + "mlly": "^1.8.2", + "node-fetch-native": "^1.6.7", + "node-mock-http": "^1.0.4", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.1", + "pretty-bytes": "^7.1.0", + "radix3": "^1.1.2", + "rollup": "^4.60.2", + "rollup-plugin-visualizer": "^7.0.1", + "scule": "^1.3.0", + "semver": "^7.7.4", + "serve-placeholder": "^2.0.2", + "serve-static": "^2.2.1", + "source-map": "^0.7.6", + "std-env": "^4.1.0", + "ufo": "^1.6.4", + "ultrahtml": "^1.6.0", + "uncrypto": "^0.1.3", + "unctx": "^2.5.0", + "unenv": "2.0.0-rc.24", + "unimport": "^6.2.0", + "unplugin-utils": "^0.3.1", + "unstorage": "^1.17.5", + "untyped": "^2.0.0", + "unwasm": "^0.5.3", + "youch": "^4.1.1", + "youch-core": "^0.3.3" + }, + "bin": { + "nitro": "dist/cli/index.mjs", + "nitropack": "dist/cli/index.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "xml2js": "^0.6.2" + }, + "peerDependenciesMeta": { + "xml2js": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/nitropack/node_modules/cookie-es": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz", + "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==", + "license": "MIT" + }, + "node_modules/nitropack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nitropack/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nuxt": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-4.4.5.tgz", + "integrity": "sha512-MwTf3wyaEIm1U9/T1VKpqg7rGhhrn5Cx2ZS40lwo8GxsiY9xE7UOj5Cg0eAI0fSbJzyXlzdxspytgqWsgL+nIA==", + "license": "MIT", + "dependencies": { + "@dxup/nuxt": "^0.4.1", + "@nuxt/cli": "^3.35.1", + "@nuxt/devtools": "^3.2.4", + "@nuxt/kit": "4.4.5", + "@nuxt/nitro-server": "4.4.5", + "@nuxt/schema": "4.4.5", + "@nuxt/telemetry": "^2.8.0", + "@nuxt/vite-builder": "4.4.5", + "@unhead/vue": "^2.1.13", + "@vue/shared": "^3.5.33", + "chokidar": "^5.0.0", + "compatx": "^0.2.0", + "consola": "^3.4.2", + "cookie-es": "^2.0.1", + "defu": "^6.1.7", + "devalue": "^5.8.0", + "errx": "^0.1.0", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.0.8", + "hookable": "^6.1.1", + "ignore": "^7.0.5", + "impound": "^1.1.5", + "jiti": "^2.6.1", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "nanotar": "^0.3.0", + "nypm": "^0.6.6", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "on-change": "^6.0.2", + "oxc-minify": "^0.128.0", + "oxc-parser": "^0.128.0", + "oxc-transform": "^0.128.0", + "oxc-walker": "^0.7.0", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "picomatch": "^4.0.4", + "pkg-types": "^2.3.1", + "rou3": "^0.8.1", + "scule": "^1.3.0", + "semver": "^7.7.4", + "std-env": "^4.1.0", + "tinyglobby": "^0.2.16", + "ufo": "^1.6.4", + "ultrahtml": "^1.6.0", + "uncrypto": "^0.1.3", + "unctx": "^2.5.0", + "unimport": "^6.2.0", + "unplugin": "^3.0.0", + "unrouting": "^0.1.7", + "untyped": "^2.0.0", + "vue": "^3.5.33", + "vue-router": "^5.0.6" + }, + "bin": { + "nuxi": "bin/nuxt.mjs", + "nuxt": "bin/nuxt.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "@types/node": ">=18.12.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + }, + "@types/node": { + "optional": true + } + } + }, + "node_modules/nuxt-component-meta": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/nuxt-component-meta/-/nuxt-component-meta-0.17.2.tgz", + "integrity": "sha512-2/mSSqutOX8t+r8cAX1yUYwAPBqicPO5Rfum3XaHVszxKCF4tXEXBiPGfJY9Zn69x/CIeOdw+aM9wmHzQ5Q+lA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.2.2", + "citty": "^0.1.6", + "mlly": "^1.8.0", + "ohash": "^2.0.11", + "scule": "^1.3.0", + "typescript": "^5.9.3", + "ufo": "^1.6.2", + "vue-component-meta": "^3.2.2" + }, + "bin": { + "nuxt-component-meta": "bin/nuxt-component-meta.mjs" + } + }, + "node_modules/nuxt-component-meta/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/nuxt-define": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nuxt-define/-/nuxt-define-1.0.0.tgz", + "integrity": "sha512-CYZ2WjU+KCyCDVzjYUM4eEpMF0rkPmkpiFrybTqqQCRpUbPt2h3snswWIpFPXTi+osRCY6Og0W/XLAQgDL4FfQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/bobbiegoede" + } + }, + "node_modules/nuxt-llms": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nuxt-llms/-/nuxt-llms-0.2.0.tgz", + "integrity": "sha512-GoEW00x8zaZ1wS0R0aOYptt3b54JEaRwlyVtuAiQoH51BwYdjN5/3+00/+4wi39M5cT4j5XcnGwOxJ7v4WVb9A==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.2.2" + } + }, + "node_modules/nuxt-og-image": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/nuxt-og-image/-/nuxt-og-image-6.5.0.tgz", + "integrity": "sha512-ewCV474kHKFDeOs+N70D6YsnGQ7qKzXtTxh0Y0uQajivZmtmzE6m4IKTOcphah89yVPSC3810en7Ac8IArPAyw==", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^1.3.0", + "@nuxt/kit": "^4.4.4", + "@vue/compiler-sfc": "^3.5.33", + "chrome-launcher": "^1.2.1", + "consola": "^3.4.2", + "culori": "^4.0.2", + "defu": "^6.1.7", + "devalue": "^5.8.0", + "exsolve": "^1.0.8", + "lightningcss": "^1.32.0", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mocked-exports": "^0.1.1", + "nuxt-site-config": "^4.0.8", + "nuxtseo-shared": "^5.1.3", + "nypm": "^0.6.6", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "oxc-parser": "^0.128.0", + "oxc-walker": "^0.7.0", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "radix3": "^1.1.2", + "std-env": "^4.1.0", + "strip-literal": "^3.1.0", + "tinyexec": "^1.1.2", + "tinyglobby": "^0.2.16", + "ufo": "^1.6.4", + "ultrahtml": "^1.6.0", + "unplugin": "^3.0.0" + }, + "bin": { + "nuxt-og-image": "bin/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "@resvg/resvg-js": "^2.6.0", + "@resvg/resvg-wasm": "^2.6.0", + "@takumi-rs/core": "^1.0.0-beta.3", + "@takumi-rs/wasm": "^1.0.0-beta.3", + "@unhead/vue": "^2.0.5 || ^3.0.0", + "fontless": "^0.2.0", + "playwright-core": "^1.50.0", + "satori": ">=0.19.2", + "sharp": "^0.34.0", + "tailwindcss": "^4.0.0", + "unifont": "^0.7.0", + "unstorage": "^1.15.0" + }, + "peerDependenciesMeta": { + "@resvg/resvg-js": { + "optional": true + }, + "@resvg/resvg-wasm": { + "optional": true + }, + "@takumi-rs/core": { + "optional": true + }, + "@takumi-rs/wasm": { + "optional": true + }, + "fontless": { + "optional": true + }, + "playwright-core": { + "optional": true + }, + "satori": { + "optional": true + }, + "sharp": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "unifont": { + "optional": true + } + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.128.0.tgz", + "integrity": "sha512-aca6ZvzmCBUGOANQRiRQRZuRKYI3ENhcit6GisnknOOmcezfQc7xJ4dxlPU7MV7mOvrC7RNR1u3LAD7xyaiCxA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.128.0.tgz", + "integrity": "sha512-BbeDmuohoJ7Rz/it5wnkj69i/OsCPS3Z51nLEzwO/Y6YshtC4JU+15oNwhY8v4LRKRYclRc7ggOikwrsJ/eOEQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.128.0.tgz", + "integrity": "sha512-tRUHPt80417QmvNpoSslJT1VY8NUbWdrWR+L14Zn+RbOTcaqB8E6PYE/ZGN8jjWBzqporiA/H4MfO50ew/NCNA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.128.0.tgz", + "integrity": "sha512-rWI2Hb1Nt3U/vKsjyNvZzDC8i/l144U20DKjhzaTmwIhIiSRGeroPWWiImwypmKLqrw8GuIixbWJkpGWLbkzrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.128.0.tgz", + "integrity": "sha512-hhpdVMaNCLgQxjgNPeeFzSeJMmZPc5lKfv0NGSI3egZq9EdnEGqeC8JsYsQjK7PoQgbvZ17xlj0SO5ziH5Obkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.128.0.tgz", + "integrity": "sha512-093zNw0zZ/e/obML+rhlSdmnzR0mVZluPcAkxunEc5E3F0yBVsFn24Y1ILfsEte11Ud041qn/gp2OJ1jxNqUng==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.128.0.tgz", + "integrity": "sha512-fq7DmKmfC+dvD97IXrgbph6Jzwe0EDu+PYMofmzZ6fv5X1k9vtaqLpDGMuICO9MmUnyKAQmVl+wIv2RNy4Dz8g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.128.0.tgz", + "integrity": "sha512-Xvm48jJah8TlIrURIjNOP/gNiGe6aKvCB+r06VliflFo8Kq7VOLE8PxtgShJzZIqubrgdMdYfvuPPozn7F6MbQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.128.0.tgz", + "integrity": "sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.128.0.tgz", + "integrity": "sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.128.0.tgz", + "integrity": "sha512-gyHjOTFpg9bTTYjxPmQirvufb89+VdZwVfcMtAUyPr6F5H8ZswvCQshK4qOW+Q+2Xyb33hduRgY/eFHJQjU/vQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.128.0.tgz", + "integrity": "sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.128.0.tgz", + "integrity": "sha512-BdzTmqxfxoYkpgokoLaSnOX6T+R3/goL42klre2tnG+kHbG2TXS0VN+P5BPofH1axdKOHy5ei4ENZrjmCOt2lA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.128.0.tgz", + "integrity": "sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.128.0.tgz", + "integrity": "sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.128.0.tgz", + "integrity": "sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.128.0.tgz", + "integrity": "sha512-L38ojghJYHmgiz6fJd7jwLB/ESDBpB02NdFxh+smqVM6P2anCEvHn0jhaSrt5eVNR1Ak8+moOeftUlofeyvniA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.128.0.tgz", + "integrity": "sha512-xgvO35GyHBtjlQ5AEpaYr7Rll1rvY7zqIhT6ty8E3ezBW2J1SFLjIDEvI/tcgDg6oaseDAqVcM+jU1HuCekgZw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.128.0.tgz", + "integrity": "sha512-OY+3eM2SN72prHKRB22mPz8o5A/7dJ+f5DFLBVvggyZhEaNDAH9IB+ElMjmOkOIwf5MDCUAowCK7pAncNxzpBA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.128.0.tgz", + "integrity": "sha512-NE9ny+cPUCCObXa0IKLfj0tCdPd7pe/dz9ZpkxpUOymB3miNeMPybdlYYTBSGJUalMWeBM85/4JcCErCNTqOXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-og-image/node_modules/@oxc-project/types": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", + "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/nuxt-og-image/node_modules/oxc-parser": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.128.0.tgz", + "integrity": "sha512-XkOw3eiIxAgQ19WRew/Bq9wc5Ga/guaWIzDBzq80z1PyuDNGvWBpPby9k6YGwV8A8uMw+Nlq3xqlzuDYmUFYUw==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.128.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.128.0", + "@oxc-parser/binding-android-arm64": "0.128.0", + "@oxc-parser/binding-darwin-arm64": "0.128.0", + "@oxc-parser/binding-darwin-x64": "0.128.0", + "@oxc-parser/binding-freebsd-x64": "0.128.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.128.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.128.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.128.0", + "@oxc-parser/binding-linux-arm64-musl": "0.128.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.128.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.128.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.128.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.128.0", + "@oxc-parser/binding-linux-x64-gnu": "0.128.0", + "@oxc-parser/binding-linux-x64-musl": "0.128.0", + "@oxc-parser/binding-openharmony-arm64": "0.128.0", + "@oxc-parser/binding-wasm32-wasi": "0.128.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.128.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.128.0", + "@oxc-parser/binding-win32-x64-msvc": "0.128.0" + } + }, + "node_modules/nuxt-site-config": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-4.0.8.tgz", + "integrity": "sha512-H7wHoOJ5Z6ZnTqD5vUugaKkWZbejZ9kGmzpr2dheOaC6RdT8JafCfMrmJG7W+cyJiJJ3YmzL+bzPBW2bW6MExA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "h3": "^1.15.11", + "nuxt-site-config-kit": "4.0.8", + "nuxtseo-shared": "^5.1.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "site-config-stack": "4.0.8", + "ufo": "^1.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxt-site-config-kit": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-4.0.8.tgz", + "integrity": "sha512-7g3giKXt0M2vssCUg8XFfR6+u4U0zywQ8p8i4msy4p+9etteFNrkrCmVHZ83xiWGFbnoTgiaymPjbaQH3KZqAg==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "site-config-stack": "4.0.8", + "std-env": "^4.0.0", + "ufo": "^1.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.128.0.tgz", + "integrity": "sha512-aca6ZvzmCBUGOANQRiRQRZuRKYI3ENhcit6GisnknOOmcezfQc7xJ4dxlPU7MV7mOvrC7RNR1u3LAD7xyaiCxA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.128.0.tgz", + "integrity": "sha512-BbeDmuohoJ7Rz/it5wnkj69i/OsCPS3Z51nLEzwO/Y6YshtC4JU+15oNwhY8v4LRKRYclRc7ggOikwrsJ/eOEQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.128.0.tgz", + "integrity": "sha512-tRUHPt80417QmvNpoSslJT1VY8NUbWdrWR+L14Zn+RbOTcaqB8E6PYE/ZGN8jjWBzqporiA/H4MfO50ew/NCNA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.128.0.tgz", + "integrity": "sha512-rWI2Hb1Nt3U/vKsjyNvZzDC8i/l144U20DKjhzaTmwIhIiSRGeroPWWiImwypmKLqrw8GuIixbWJkpGWLbkzrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.128.0.tgz", + "integrity": "sha512-hhpdVMaNCLgQxjgNPeeFzSeJMmZPc5lKfv0NGSI3egZq9EdnEGqeC8JsYsQjK7PoQgbvZ17xlj0SO5ziH5Obkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.128.0.tgz", + "integrity": "sha512-093zNw0zZ/e/obML+rhlSdmnzR0mVZluPcAkxunEc5E3F0yBVsFn24Y1ILfsEte11Ud041qn/gp2OJ1jxNqUng==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.128.0.tgz", + "integrity": "sha512-fq7DmKmfC+dvD97IXrgbph6Jzwe0EDu+PYMofmzZ6fv5X1k9vtaqLpDGMuICO9MmUnyKAQmVl+wIv2RNy4Dz8g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.128.0.tgz", + "integrity": "sha512-Xvm48jJah8TlIrURIjNOP/gNiGe6aKvCB+r06VliflFo8Kq7VOLE8PxtgShJzZIqubrgdMdYfvuPPozn7F6MbQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.128.0.tgz", + "integrity": "sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.128.0.tgz", + "integrity": "sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.128.0.tgz", + "integrity": "sha512-gyHjOTFpg9bTTYjxPmQirvufb89+VdZwVfcMtAUyPr6F5H8ZswvCQshK4qOW+Q+2Xyb33hduRgY/eFHJQjU/vQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.128.0.tgz", + "integrity": "sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.128.0.tgz", + "integrity": "sha512-BdzTmqxfxoYkpgokoLaSnOX6T+R3/goL42klre2tnG+kHbG2TXS0VN+P5BPofH1axdKOHy5ei4ENZrjmCOt2lA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.128.0.tgz", + "integrity": "sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.128.0.tgz", + "integrity": "sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.128.0.tgz", + "integrity": "sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.128.0.tgz", + "integrity": "sha512-L38ojghJYHmgiz6fJd7jwLB/ESDBpB02NdFxh+smqVM6P2anCEvHn0jhaSrt5eVNR1Ak8+moOeftUlofeyvniA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.128.0.tgz", + "integrity": "sha512-xgvO35GyHBtjlQ5AEpaYr7Rll1rvY7zqIhT6ty8E3ezBW2J1SFLjIDEvI/tcgDg6oaseDAqVcM+jU1HuCekgZw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.128.0.tgz", + "integrity": "sha512-OY+3eM2SN72prHKRB22mPz8o5A/7dJ+f5DFLBVvggyZhEaNDAH9IB+ElMjmOkOIwf5MDCUAowCK7pAncNxzpBA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.128.0.tgz", + "integrity": "sha512-NE9ny+cPUCCObXa0IKLfj0tCdPd7pe/dz9ZpkxpUOymB3miNeMPybdlYYTBSGJUalMWeBM85/4JcCErCNTqOXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-project/types": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", + "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-android-arm-eabi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.128.0.tgz", + "integrity": "sha512-qVO4izEs88ZSo7KOK4P+O5nAXXJmkSadInvFjGkhVnm2R2Wr8trU/GLhjAK0S0u8Qv9bkXspNhgpECk+CTQ/ew==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-android-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.128.0.tgz", + "integrity": "sha512-F3RXlbCzIgkpRWlz1PEguDZl5NzZRmbeHKTFTQWFnK6mIdw2EkWihPVv9+CIcO80c7+sF/YRGOBaji6hwUDhtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-darwin-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.128.0.tgz", + "integrity": "sha512-xj63gIzQ67LDYHCOWXSHgfx4LbPVz1ck0G3y0eR6mbgYk3CwwylbhWi/CaDC6BWsHwoLQryeYjHB5XBCR0EPMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-darwin-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.128.0.tgz", + "integrity": "sha512-YQkvFqNqpwEt197RjREAOWeRANalPtCD+ayZlx4IjTQ6IOYZEP83B9/++gTQisHV3r8E7dU8UqJKeSS1cHlTQg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-freebsd-x64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.128.0.tgz", + "integrity": "sha512-Jvd3Ximb3x3o0+xRBB5lq63JlzxhJN787IsBjn0PEnmuocYQj+tJ5BB4n9xPIG27GXwg3ycckQPO/RsWeEcBPg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.128.0.tgz", + "integrity": "sha512-TaRKWeGnAJNIdCa5+m0I8/SksBgkLX94iH40qy3chvLuaIOGAmOViUStYx8geXBzO9P99V7En8nHXLoqCONBRQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-arm-musleabihf": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.128.0.tgz", + "integrity": "sha512-7TMrtA5/3SCvS+yMPrGnri5T4ZhIoCbjwKWV6Kn8d3v+vx7MpEmNkfe+CdF3rb5LlnuxeDMPwr1E2ntya0b8HQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-arm64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.128.0.tgz", + "integrity": "sha512-lMQEa1jLBNm1N+5uvyj9zX9urVY4xKkLnhO8/4CtSGdXX+mExqsVawyQPAZqbtq1fLQ0yt1QYJ9YuM0+fiSJTQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-arm64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.128.0.tgz", + "integrity": "sha512-dPSjyd0gQ9dE3mpdJi0BHNJaqQz4V7mVW6Fbs6jRSiGnrxwGfXdMJFInXoJ49B3k5Zhfa9Is9Ixp6St7c6ouCA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-ppc64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.128.0.tgz", + "integrity": "sha512-YNa9XAotPKvAXFJrHC7kBsHMVg0HOB4vRiKuYUjzFsfLkxTbuztKHTKG/gW5kjp7dBw+TNFofTaVCVZgOnHXPQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-riscv64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.128.0.tgz", + "integrity": "sha512-jjSiG9H8ya/U3igW5DdIBFIDwhffF7Vbc7th2tcHV73eg0DQz75n36a9RmQ1/0aS9vknUuNtY6SODr8/gmuzsQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-riscv64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.128.0.tgz", + "integrity": "sha512-FVUr/XNT7BfQA4XVMel/HTCJi5mQyEitslgX42ztYPnCFMRFG1sQQKgnlLJdl7qifuyxpvKLR1f7h7HEuwWw1Q==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-s390x-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.128.0.tgz", + "integrity": "sha512-caJnVw5PG8v339zAyHgA7p34xXa3A4Kc9VyrDgsT1znr51qacaUv4BRlgRi0qkqxRWXYNVFfsbU2g0t1qS7E9w==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-x64-gnu": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.128.0.tgz", + "integrity": "sha512-zkQKjsHEUX3ckQBcZTtHE/7pgFMkWQp6y/4t7N8eT3j8wnoL+vapv7l4ISjgx1/EePRJN1HErYXmriz7tPVKRg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-linux-x64-musl": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.128.0.tgz", + "integrity": "sha512-NjYtwl9ijp34iisHxYBvE7nii1Ac0QPP3doHv8MQHhDA3zjUcDCROuBNybfaEYCxnJ1aF+cAPqsyeopnAGsyuQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-openharmony-arm64": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.128.0.tgz", + "integrity": "sha512-itsi0tVkVdrYphSppdFChLq9tD0pvbRRS3EV8NQYKZ/NWHMoxzjlf9TFA/ZZYV113juYo1Dq3glVX48knhBeFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-wasm32-wasi": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.128.0.tgz", + "integrity": "sha512-elzjX2gy1jcseeFaKtbk/6T2FPTpGNx0IpeD0iyk6cahWN7wD6eHY5u7th1X85cYbRq9rqniS+xYIxN3StthWg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-win32-arm64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.128.0.tgz", + "integrity": "sha512-p5LmbI66dk2dziJSUzjQ24gOWeI6pJpXcOC6famloRtKCq54V5/KegsztFgZZCtYFEAEqFgcfspFHrV+CcKWcg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-win32-ia32-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.128.0.tgz", + "integrity": "sha512-CMU3Yn05rXeLw7GyVlDB3bbp2iV14yt3VWyF0pNuMK9NVgOmUkXgFLe5SOcX9rEm64TRJjOMEghtE5+r0GtqIQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@oxc-transform/binding-win32-x64-msvc": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.128.0.tgz", + "integrity": "sha512-Vck5AdNH2JPYMQWVDxvX5PbDFfqVG+tCOgKJzAC/S9bgbD3qcMjN5Dx6FOmEbwY3hZm//fzOsY4tErofoiK/aQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt/node_modules/@unhead/vue": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.15.tgz", + "integrity": "sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1", + "unhead": "2.1.15" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, + "node_modules/nuxt/node_modules/cookie-es": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz", + "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==", + "license": "MIT" + }, + "node_modules/nuxt/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nuxt/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/nuxt/node_modules/oxc-parser": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.128.0.tgz", + "integrity": "sha512-XkOw3eiIxAgQ19WRew/Bq9wc5Ga/guaWIzDBzq80z1PyuDNGvWBpPby9k6YGwV8A8uMw+Nlq3xqlzuDYmUFYUw==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.128.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.128.0", + "@oxc-parser/binding-android-arm64": "0.128.0", + "@oxc-parser/binding-darwin-arm64": "0.128.0", + "@oxc-parser/binding-darwin-x64": "0.128.0", + "@oxc-parser/binding-freebsd-x64": "0.128.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.128.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.128.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.128.0", + "@oxc-parser/binding-linux-arm64-musl": "0.128.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.128.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.128.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.128.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.128.0", + "@oxc-parser/binding-linux-x64-gnu": "0.128.0", + "@oxc-parser/binding-linux-x64-musl": "0.128.0", + "@oxc-parser/binding-openharmony-arm64": "0.128.0", + "@oxc-parser/binding-wasm32-wasi": "0.128.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.128.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.128.0", + "@oxc-parser/binding-win32-x64-msvc": "0.128.0" + } + }, + "node_modules/nuxt/node_modules/oxc-transform": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.128.0.tgz", + "integrity": "sha512-8DfEHlmUiLOHlCK9DGX+d5tORc1xwPPvoRSHSJCYgLHyGjKp4PvfBrvgi59DkEW0SMOWfO8GL9t+R7vdKtupbg==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-transform/binding-android-arm-eabi": "0.128.0", + "@oxc-transform/binding-android-arm64": "0.128.0", + "@oxc-transform/binding-darwin-arm64": "0.128.0", + "@oxc-transform/binding-darwin-x64": "0.128.0", + "@oxc-transform/binding-freebsd-x64": "0.128.0", + "@oxc-transform/binding-linux-arm-gnueabihf": "0.128.0", + "@oxc-transform/binding-linux-arm-musleabihf": "0.128.0", + "@oxc-transform/binding-linux-arm64-gnu": "0.128.0", + "@oxc-transform/binding-linux-arm64-musl": "0.128.0", + "@oxc-transform/binding-linux-ppc64-gnu": "0.128.0", + "@oxc-transform/binding-linux-riscv64-gnu": "0.128.0", + "@oxc-transform/binding-linux-riscv64-musl": "0.128.0", + "@oxc-transform/binding-linux-s390x-gnu": "0.128.0", + "@oxc-transform/binding-linux-x64-gnu": "0.128.0", + "@oxc-transform/binding-linux-x64-musl": "0.128.0", + "@oxc-transform/binding-openharmony-arm64": "0.128.0", + "@oxc-transform/binding-wasm32-wasi": "0.128.0", + "@oxc-transform/binding-win32-arm64-msvc": "0.128.0", + "@oxc-transform/binding-win32-ia32-msvc": "0.128.0", + "@oxc-transform/binding-win32-x64-msvc": "0.128.0" + } + }, + "node_modules/nuxt/node_modules/unhead": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.15.tgz", + "integrity": "sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxtseo-shared": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/nuxtseo-shared/-/nuxtseo-shared-5.1.3.tgz", + "integrity": "sha512-euCaYANxdjeLzJcxvEczKpLuikxPy/LUT/v69orStKlG2U4pvWaqDv74QO8YMCCmUbAO+8BoRj/SJccu9GcJGQ==", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^1.2.0", + "@nuxt/devtools-kit": "4.0.0-alpha.3", + "@nuxt/kit": "^4.4.2", + "birpc": "^4.0.0", + "consola": "^3.4.2", + "defu": "^6.1.7", + "ofetch": "^1.5.1", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "radix3": "^1.1.2", + "sirv": "^3.0.2", + "std-env": "^4.0.0", + "ufo": "^1.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "@nuxt/schema": "^3.16.0 || ^4.0.0", + "nuxt": "^3.16.0 || ^4.0.0", + "nuxt-site-config": "^3.2.0 || ^4.0.0", + "vue": "^3.5.0", + "zod": "^3.23.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "nuxt-site-config": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/nuxtseo-shared/node_modules/@nuxt/devtools-kit": { + "version": "4.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-4.0.0-alpha.3.tgz", + "integrity": "sha512-ymp4jqS3hFfwRw8uDkv8cpu4kWvhQrX+S4jnA/oOc76s4AXf2HCZZJgrncKxh+txqi1NJj8nsQNBbaqRAo3g4w==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.2", + "tinyexec": "^1.0.4" + }, + "peerDependencies": { + "vite": ">=6.0" + } + }, + "node_modules/nypm": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", + "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.2", + "pathe": "^2.0.3", + "tinyexec": "^1.1.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/on-change": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/on-change/-/on-change-6.0.2.tgz", + "integrity": "sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/on-change?sponsor=1" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/oxc-minify": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.128.0.tgz", + "integrity": "sha512-VIXQO2W886aB+N17yV55Sack6aCpbUqtuNAYhNcPV6dFiWIZ5+kwOjvvw36igWwoljfjWhasu99CQ5wtvPJDYg==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-minify/binding-android-arm-eabi": "0.128.0", + "@oxc-minify/binding-android-arm64": "0.128.0", + "@oxc-minify/binding-darwin-arm64": "0.128.0", + "@oxc-minify/binding-darwin-x64": "0.128.0", + "@oxc-minify/binding-freebsd-x64": "0.128.0", + "@oxc-minify/binding-linux-arm-gnueabihf": "0.128.0", + "@oxc-minify/binding-linux-arm-musleabihf": "0.128.0", + "@oxc-minify/binding-linux-arm64-gnu": "0.128.0", + "@oxc-minify/binding-linux-arm64-musl": "0.128.0", + "@oxc-minify/binding-linux-ppc64-gnu": "0.128.0", + "@oxc-minify/binding-linux-riscv64-gnu": "0.128.0", + "@oxc-minify/binding-linux-riscv64-musl": "0.128.0", + "@oxc-minify/binding-linux-s390x-gnu": "0.128.0", + "@oxc-minify/binding-linux-x64-gnu": "0.128.0", + "@oxc-minify/binding-linux-x64-musl": "0.128.0", + "@oxc-minify/binding-openharmony-arm64": "0.128.0", + "@oxc-minify/binding-wasm32-wasi": "0.128.0", + "@oxc-minify/binding-win32-arm64-msvc": "0.128.0", + "@oxc-minify/binding-win32-ia32-msvc": "0.128.0", + "@oxc-minify/binding-win32-x64-msvc": "0.128.0" + } + }, + "node_modules/oxc-parser": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.112.0.tgz", + "integrity": "sha512-7rQ3QdJwobMQLMZwQaPuPYMEF2fDRZwf51lZ//V+bA37nejjKW5ifMHbbCwvA889Y4RLhT+/wLJpPRhAoBaZYw==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.112.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.112.0", + "@oxc-parser/binding-android-arm64": "0.112.0", + "@oxc-parser/binding-darwin-arm64": "0.112.0", + "@oxc-parser/binding-darwin-x64": "0.112.0", + "@oxc-parser/binding-freebsd-x64": "0.112.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.112.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.112.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.112.0", + "@oxc-parser/binding-linux-arm64-musl": "0.112.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.112.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.112.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.112.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.112.0", + "@oxc-parser/binding-linux-x64-gnu": "0.112.0", + "@oxc-parser/binding-linux-x64-musl": "0.112.0", + "@oxc-parser/binding-openharmony-arm64": "0.112.0", + "@oxc-parser/binding-wasm32-wasi": "0.112.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.112.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.112.0", + "@oxc-parser/binding-win32-x64-msvc": "0.112.0" + } + }, + "node_modules/oxc-transform": { + "version": "0.112.0", + "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.112.0.tgz", + "integrity": "sha512-cIRRvZgrHfsAHrkt8LWdAX4+Do8R0MzQSfeo9yzErzHeYiuyNiP4PCTPbOy/wBXL4MYzt3ebrBa5jt3akQkKAg==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-transform/binding-android-arm-eabi": "0.112.0", + "@oxc-transform/binding-android-arm64": "0.112.0", + "@oxc-transform/binding-darwin-arm64": "0.112.0", + "@oxc-transform/binding-darwin-x64": "0.112.0", + "@oxc-transform/binding-freebsd-x64": "0.112.0", + "@oxc-transform/binding-linux-arm-gnueabihf": "0.112.0", + "@oxc-transform/binding-linux-arm-musleabihf": "0.112.0", + "@oxc-transform/binding-linux-arm64-gnu": "0.112.0", + "@oxc-transform/binding-linux-arm64-musl": "0.112.0", + "@oxc-transform/binding-linux-ppc64-gnu": "0.112.0", + "@oxc-transform/binding-linux-riscv64-gnu": "0.112.0", + "@oxc-transform/binding-linux-riscv64-musl": "0.112.0", + "@oxc-transform/binding-linux-s390x-gnu": "0.112.0", + "@oxc-transform/binding-linux-x64-gnu": "0.112.0", + "@oxc-transform/binding-linux-x64-musl": "0.112.0", + "@oxc-transform/binding-openharmony-arm64": "0.112.0", + "@oxc-transform/binding-wasm32-wasi": "0.112.0", + "@oxc-transform/binding-win32-arm64-msvc": "0.112.0", + "@oxc-transform/binding-win32-ia32-msvc": "0.112.0", + "@oxc-transform/binding-win32-x64-msvc": "0.112.0" + } + }, + "node_modules/oxc-walker": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-0.7.0.tgz", + "integrity": "sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==", + "license": "MIT", + "dependencies": { + "magic-regexp": "^0.10.0" + }, + "peerDependencies": { + "oxc-parser": ">=0.98.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "license": "MIT", + "dependencies": { + "@types/parse-path": "^7.0.0", + "parse-path": "^7.0.0" + }, + "engines": { + "node": ">=14.13.0" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz", + "integrity": "sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==", + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.4.3", + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz", + "integrity": "sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz", + "integrity": "sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz", + "integrity": "sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz", + "integrity": "sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz", + "integrity": "sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz", + "integrity": "sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.11" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz", + "integrity": "sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.3", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz", + "integrity": "sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz", + "integrity": "sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==", + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.4.3", + "cssnano-utils": "^5.0.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz", + "integrity": "sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "cssnano-utils": "^5.0.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz", + "integrity": "sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-api": "^3.0.0", + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz", + "integrity": "sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz", + "integrity": "sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz", + "integrity": "sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz", + "integrity": "sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz", + "integrity": "sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz", + "integrity": "sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz", + "integrity": "sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz", + "integrity": "sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz", + "integrity": "sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz", + "integrity": "sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^5.0.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz", + "integrity": "sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz", + "integrity": "sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz", + "integrity": "sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz", + "integrity": "sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.0.tgz", + "integrity": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-changeset": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", + "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.6", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.6.tgz", + "integrity": "sha512-RIm+e9BiqAaJ1mRECv3vR3C+VG8ELoTTI+47tVudGi82yLnFOx3G/p/iSPK1HmHQdKhkkrJ68NJqxh7S+FBVmQ==", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", + "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.8", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.8.tgz", + "integrity": "sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc9": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz", + "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.6", + "destr": "^2.0.5" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-minify-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz", + "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-remark": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", + "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "hast-util-to-mdast": "^10.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attribute-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attribute-values/-/rehype-sort-attribute-values-5.0.1.tgz", + "integrity": "sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attributes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attributes/-/rehype-sort-attributes-5.0.1.tgz", + "integrity": "sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reka-ui": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.6.tgz", + "integrity": "sha512-K6bL457owpvWONc7hsjFxo3HDC9s6IzhRqShW0w9JSKelPGfRbkHD558UQTn/NH1cvrXVHygKyC7fExFmRketg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^14.1.0", + "@vueuse/shared": "^14.1.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.5", + "ohash": "^2.0.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/zernonia" + }, + "peerDependencies": { + "vue": ">= 3.4.0" + } + }, + "node_modules/remark-emoji": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", + "integrity": "sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.4", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.3", + "unified": "^11.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdc": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/remark-mdc/-/remark-mdc-3.11.0.tgz", + "integrity": "sha512-xFrKmGRa+xgsfAZPA2CDaKILSHSOhX2irjJBrrPLxNrxaz2NFI+gXuVjo6Bkbh2vx7fKKTB5S9yyKyIwJh+FsQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3", + "flat": "^6.0.1", + "mdast-util-from-markdown": "^2.0.3", + "mdast-util-to-markdown": "^2.1.2", + "micromark": "^4.0.2", + "micromark-core-commonmark": "^2.0.3", + "micromark-factory-space": "^2.0.1", + "micromark-factory-whitespace": "^2.0.1", + "micromark-util-character": "^2.1.1", + "micromark-util-types": "^2.0.2", + "parse-entities": "^4.0.2", + "scule": "^1.3.0", + "stringify-entities": "^4.0.4", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "yaml": "^2.9.0" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.0.1.tgz", + "integrity": "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==", + "license": "MIT", + "dependencies": { + "open": "^11.0.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^18.0.0" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/rou3": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.8.1.tgz", + "integrity": "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==", + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialize-javascript": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/seroval": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", + "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/serve-placeholder": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", + "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/shiki-stream": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/shiki-stream/-/shiki-stream-0.1.4.tgz", + "integrity": "sha512-4pz6JGSDmVTTkPJ/ueixHkFAXY4ySCc+unvCaDZV7hqq/sdJZirRxgIXSuNSKgiFlGTgRR97sdu2R8K55sPsrw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "react": "^19.0.0", + "solid-js": "^1.9.0", + "vue": "^3.2.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "solid-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/shiki-stream/node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/shiki-stream/node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-git": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", + "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "@simple-git/args-pathspec": "^1.0.3", + "@simple-git/argv-parser": "^1.1.0", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/site-config-stack": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-4.0.8.tgz", + "integrity": "sha512-Su+57p7CGqd3QSMmaDV+qU9EqWmgAT3SGX4Wurb5VsEBMFC3oXvai8BlrXVUnH1ay9hA1WOn0g0i6+y/RJX5Yw==", + "license": "MIT", + "dependencies": { + "ufo": "^1.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": "^3.5.30" + } + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slugify": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smob": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/srvx": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", + "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "license": "MIT" + }, + "node_modules/structured-clone-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/structured-clone-es/-/structured-clone-es-2.0.0.tgz", + "integrity": "sha512-5UuAHmBLXYPCl22xWJrFuGmIhBKQzxISPVz6E7nmTmTcAOpUzlbjKJsRrCE4vADmMQ0dzeCnlWn9XufnAGf76Q==", + "license": "ISC" + }, + "node_modules/stylehacks": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz", + "integrity": "sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.13" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/swrv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/swrv/-/swrv-1.2.0.tgz", + "integrity": "sha512-lH/g4UcNyj+7lzK4eRGT4C68Q4EhQ6JtM9otPRIASfhhzfLWtbZPHcMuhuba7S9YVYuxkMUGImwMyGpfbkH07A==", + "license": "Apache-2.0", + "peerDependencies": { + "vue": ">=3.2.26 < 4" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-fs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/terser": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz", + "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tosource": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz", + "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==", + "engines": { + "node": ">=10" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", + "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-level-regexp": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/type-level-regexp/-/type-level-regexp-0.1.17.tgz", + "integrity": "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==", + "license": "MIT" + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unctx": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.5.0.tgz", + "integrity": "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "unplugin": "^2.3.11" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unctx/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unhead": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-3.1.0.tgz", + "integrity": "sha512-SH1PAjAMspLIoBjAjE/R8hty2NYo7YcIrdu5I+PVfiW4QmmwEG4pgoiKG0MCs6WRSwiatzeha+4lqSqvHW9PEg==", + "license": "MIT", + "peer": true, + "dependencies": { + "hookable": "^6.1.1", + "unplugin": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vite": ">=6.4.2" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/unhead/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT", + "peer": true + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unimport": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-6.3.0.tgz", + "integrity": "sha512-M+Dxk5W9WRd+8j56W9tp8lGW/dmMc7g5zj7BWQnEjKQhryBstqsi1V0izb0zHwSkEN8cSYV7K75/bykairV2tA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "pathe": "^2.0.3", + "picomatch": "^4.0.4", + "pkg-types": "^2.3.1", + "scule": "^1.3.0", + "strip-literal": "^3.1.0", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "oxc-parser": "*", + "rolldown": "^1.0.0" + }, + "peerDependenciesMeta": { + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unist-builder": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", + "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-21.0.0.tgz", + "integrity": "sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==", + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "picomatch": "^4.0.3", + "unimport": "^5.6.0", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unplugin-auto-import/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/unimport": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.7.0.tgz", + "integrity": "sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "pkg-types": "^2.3.0", + "scule": "^1.3.0", + "strip-literal": "^3.1.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "32.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-32.0.0.tgz", + "integrity": "sha512-uLdccgS7mf3pv1bCCP20y/hm+u1eOjAmygVkh+Oa70MPkzgl1eQv1L0CwdHNM3gscO8/GDMGIET98Ja47CBbZg==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "obug": "^2.1.1", + "picomatch": "^4.0.3", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unrouting": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/unrouting/-/unrouting-0.1.7.tgz", + "integrity": "sha512-+0hfD+CVWtD636rc5Fn9VEjjTEDhdqgMpbwAuVoUmydSHDaMNiFW93SJG4LV++RoGSEAyvQN5uABAscYpDphpQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "ufo": "^1.6.3" + } + }, + "node_modules/unrouting/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/untun": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "pathe": "^1.1.1" + }, + "bin": { + "untun": "bin/untun.mjs" + } + }, + "node_modules/untun/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/unwasm": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.5.3.tgz", + "integrity": "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==", + "license": "MIT", + "dependencies": { + "exsolve": "^1.0.8", + "knitwork": "^1.3.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uqr": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.3.tgz", + "integrity": "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/valibot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.0.tgz", + "integrity": "sha512-iC/x7fVcSyOwlm/VSt7RlHnzNGLGvR9GnxdifUeWoCJo0q4ZZvrVkIHC6faTlkxG47I2Y4UrFquPuVHCrOnrLg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vaul-vue": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/vaul-vue/-/vaul-vue-0.4.1.tgz", + "integrity": "sha512-A6jOWOZX5yvyo1qMn7IveoWN91mJI5L3BUKsIwkg6qrTGgHs1Sb1JF/vyLJgnbN1rH4OOOxFbtqL9A46bOyGUQ==", + "dependencies": { + "@vueuse/core": "^10.8.0", + "reka-ui": "^2.0.0", + "vue": "^3.4.5" + }, + "peerDependencies": { + "reka-ui": "^2.0.0", + "vue": "^3.3.0" + } + }, + "node_modules/vaul-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/vaul-vue/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-dev-rpc/node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-hot-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz", + "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-node": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-5.3.0.tgz", + "integrity": "sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ==", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "es-module-lexer": "^2.0.0", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "vite": "^7.3.1" + }, + "bin": { + "vite-node": "dist/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://opencollective.com/antfu" + } + }, + "node_modules/vite-node/node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.13.0.tgz", + "integrity": "sha512-14EkOZmfinVZNxRmg2uCNDwtqGc/33lU/UEJansHgu27+ad+r6mMBf1Xtnq57jGZWiO/xzwtiEKPYsganw7ZFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.4", + "proper-lockfile": "^4.1.2", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.15", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=16.11" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=9.39.4", + "meow": "^13.2.0 || ^14.0.0", + "optionator": "^0.9.4", + "oxlint": ">=1", + "stylelint": ">=16.26.1", + "typescript": "*", + "vite": ">=5.4.21", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.10 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "oxlint": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vite-plugin-checker/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vite-plugin-checker/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect/node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-vue-tracer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.4.0.tgz", + "integrity": "sha512-0tQCjCqZWVSK6UeRW9S4ABbf47lKQ68zvrT2FNvZmiL+alDydCVyH/T3Jlfbdc3T3C2Iuyyl5aVsMbF8IQIoxA==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "exsolve": "^1.0.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "source-map-js": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.5.0" + } + }, + "node_modules/vite-plugin-vue-tracer/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", + "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-sfc": "3.5.34", + "@vue/runtime-dom": "3.5.34", + "@vue/server-renderer": "3.5.34", + "@vue/shared": "3.5.34" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-bundle-renderer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.2.0.tgz", + "integrity": "sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==", + "license": "MIT", + "dependencies": { + "ufo": "^1.6.1" + } + }, + "node_modules/vue-component-meta": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-3.2.9.tgz", + "integrity": "sha512-18FIQDctfCwpuTrMmAZJXR7fM48wrXNVcWrrhKgvARz2Sr8i1gIQ7gZdUaQwC9hfTxa9S0wIauPSf1et2xp0vQ==", + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.2.9", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.9.tgz", + "integrity": "sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==", + "license": "MIT" + }, + "node_modules/vue-devtools-stub": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", + "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==", + "license": "MIT" + }, + "node_modules/vue-i18n": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.4.2.tgz", + "integrity": "sha512-sADDeKXqAGsPX6tK3t3y2ZiMpbVWN12tG+MhTiJ06rVoh58eGtM4wFyw3uWGbVkXByVp9Ne/AP+nSSzI+J9OAQ==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.4.2", + "@intlify/devtools-types": "11.4.2", + "@intlify/shared": "11.4.2", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.7.tgz", + "integrity": "sha512-dqfk8kvRbCutmCOCj/XLDqDEYxc1wBdAOGLuVy5M93ifYMsBd5fIjfaPN4tQAbxr5IprdBDIox1gr4wYyOx/SA==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^8.0.0-rc.4", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.1.1", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34", + "pinia": "^3.0.4", + "vue": "^3.5.34" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@babel/generator": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.5.tgz", + "integrity": "sha512-nFZPWz3FHIS7y6rMIVoa/WBwjdutfIaRJIBQjzn+t3RnecZoRNlGmGcyR2wb0T/IgSd50Kz/6dG8/LvMCRunjg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0-rc.5", + "@babel/types": "^8.0.0-rc.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-string-parser": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.5.tgz", + "integrity": "sha512-sN7R8rBvDurfaziNfDEIjIntlazmlkCDGO4SNl2RJ3wRCn+QxspLV7hzYAE8WWVd2joVuT8sUxeePdLp2idI1A==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.5.tgz", + "integrity": "sha512-ehJDxHvtbZ85RtX/L2fi0h9AGsBNqB5Euv1EB8RMAvGYvD+2X+QbpzzOpbklnNXO+WSZJNOaetw2BBj27xsWVg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/parser": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.5.tgz", + "integrity": "sha512-/Mfg83rK3+jsRbl4Vbd0jqxc6M1A1/WNFtgrowRM1unEsD3XcNnrBdMM0JWakd0/RN9lseQKwPduW1TiEwKOlQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.0-rc.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/types": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.5.tgz", + "integrity": "sha512-JeSVu/m8x/zpp4CLjYHVNXuhEyOkhPXuxM8YOXjh6L4LlvQNKuUNOTo5KdBuKAcTDHw8DquToTaEkhsBqPXOaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.5", + "@babel/helper-validator-identifier": "^8.0.0-rc.5" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.2.tgz", + "integrity": "sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.2" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wheel-gestures": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/wheel-gestures/-/wheel-gestures-2.2.48.tgz", + "integrity": "sha512-f+Gy33Oa5Z14XY9679Zze+7VFhbsQfBFXodnU2x589l4kxGM9L5Y8zETTmcMR5pWOPQyRv4Z0lNax6xCO0NSlA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xss": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", + "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==", + "license": "MIT", + "optional": true, + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT", + "optional": true + }, + "node_modules/y-protocols": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz", + "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yjs": { + "version": "13.6.30", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.30.tgz", + "integrity": "sha512-vv/9h42eCMC81ZHDFswuu/MKzkl/vyq1BhaNGfHyOonwlG4CJbQF4oiBBJPvfdeCt/PlVDWh7Nov9D34YY09uQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.99" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.1.tgz", + "integrity": "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.6", + "@poppinss/dumper": "^0.7.0", + "@speed-highlight/core": "^1.2.14", + "cookie-es": "^3.0.1", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/youch/node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "license": "MIT" + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docus/package.json b/docus/package.json new file mode 100644 index 0000000..be76a6f --- /dev/null +++ b/docus/package.json @@ -0,0 +1,20 @@ +{ + "name": "forge-docus", + "private": true, + "scripts": { + "sync:content": "node ../tools/sync-docus-docs.mjs", + "predev": "npm run sync:content", + "dev": "nuxt dev --extends docus", + "prebuild": "npm run sync:content", + "build": "nuxt build --extends docus" + }, + "dependencies": { + "@takumi-rs/core": "^1.0.15", + "better-sqlite3": "^12.9.0", + "docus": "^5.10.0", + "nuxt": "^4.4.2" + }, + "overrides": { + "esbuild": "0.27.7" + } +} diff --git a/docus/public/architecture-flow.png b/docus/public/architecture-flow.png new file mode 100644 index 0000000..6e7927a Binary files /dev/null and b/docus/public/architecture-flow.png differ diff --git a/docus/public/architecture-flow.svg b/docus/public/architecture-flow.svg new file mode 100644 index 0000000..90a5eb1 --- /dev/null +++ b/docus/public/architecture-flow.svg @@ -0,0 +1 @@ +

Arma Client Addon

Server SQF Addon

forge_server callExtension

Rust Extension

forge-services

forge-repositories traits

SurrealDB adapters

SurrealDB

\ No newline at end of file diff --git a/docus/public/images/eden/.gitkeep b/docus/public/images/eden/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docus/public/images/eden/.gitkeep @@ -0,0 +1 @@ + diff --git a/docus/public/images/eden/atm_obj.jpg b/docus/public/images/eden/atm_obj.jpg new file mode 100644 index 0000000..88afde9 Binary files /dev/null and b/docus/public/images/eden/atm_obj.jpg differ diff --git a/docus/public/images/eden/atm_obj_var.jpg b/docus/public/images/eden/atm_obj_var.jpg new file mode 100644 index 0000000..154dbd8 Binary files /dev/null and b/docus/public/images/eden/atm_obj_var.jpg differ diff --git a/docus/public/images/eden/attack_task_mod.jpg b/docus/public/images/eden/attack_task_mod.jpg new file mode 100644 index 0000000..d1c9f5c Binary files /dev/null and b/docus/public/images/eden/attack_task_mod.jpg differ diff --git a/docus/public/images/eden/attack_task_mod_params.jpg b/docus/public/images/eden/attack_task_mod_params.jpg new file mode 100644 index 0000000..609aacd Binary files /dev/null and b/docus/public/images/eden/attack_task_mod_params.jpg differ diff --git a/docus/public/images/eden/attack_task_tgts.jpg b/docus/public/images/eden/attack_task_tgts.jpg new file mode 100644 index 0000000..5773ff9 Binary files /dev/null and b/docus/public/images/eden/attack_task_tgts.jpg differ diff --git a/docus/public/images/eden/bank_obj.jpg b/docus/public/images/eden/bank_obj.jpg new file mode 100644 index 0000000..0cde286 Binary files /dev/null and b/docus/public/images/eden/bank_obj.jpg differ diff --git a/docus/public/images/eden/bank_obj_var.jpg b/docus/public/images/eden/bank_obj_var.jpg new file mode 100644 index 0000000..b36f2b0 Binary files /dev/null and b/docus/public/images/eden/bank_obj_var.jpg differ diff --git a/docus/public/images/eden/blacklist_mrkr.jpg b/docus/public/images/eden/blacklist_mrkr.jpg new file mode 100644 index 0000000..962582e Binary files /dev/null and b/docus/public/images/eden/blacklist_mrkr.jpg differ diff --git a/docus/public/images/eden/blacklist_mrkr_var.jpg b/docus/public/images/eden/blacklist_mrkr_var.jpg new file mode 100644 index 0000000..477ceb4 Binary files /dev/null and b/docus/public/images/eden/blacklist_mrkr_var.jpg differ diff --git a/docus/public/images/eden/cad-visible-task.jpg b/docus/public/images/eden/cad-visible-task.jpg new file mode 100644 index 0000000..6427894 Binary files /dev/null and b/docus/public/images/eden/cad-visible-task.jpg differ diff --git a/docus/public/images/eden/ceo_unit.jpg b/docus/public/images/eden/ceo_unit.jpg new file mode 100644 index 0000000..699eb98 Binary files /dev/null and b/docus/public/images/eden/ceo_unit.jpg differ diff --git a/docus/public/images/eden/ceo_unit_var.jpg b/docus/public/images/eden/ceo_unit_var.jpg new file mode 100644 index 0000000..a2beee6 Binary files /dev/null and b/docus/public/images/eden/ceo_unit_var.jpg differ diff --git a/docus/public/images/eden/create_task_mod.jpg b/docus/public/images/eden/create_task_mod.jpg new file mode 100644 index 0000000..17681c5 Binary files /dev/null and b/docus/public/images/eden/create_task_mod.jpg differ diff --git a/docus/public/images/eden/create_task_mod_params.jpg b/docus/public/images/eden/create_task_mod_params.jpg new file mode 100644 index 0000000..1f901b7 Binary files /dev/null and b/docus/public/images/eden/create_task_mod_params.jpg differ diff --git a/docus/public/images/eden/defend_task_mod.jpg b/docus/public/images/eden/defend_task_mod.jpg new file mode 100644 index 0000000..86732a9 Binary files /dev/null and b/docus/public/images/eden/defend_task_mod.jpg differ diff --git a/docus/public/images/eden/defend_task_mod_params.jpg b/docus/public/images/eden/defend_task_mod_params.jpg new file mode 100644 index 0000000..5844a8c Binary files /dev/null and b/docus/public/images/eden/defend_task_mod_params.jpg differ diff --git a/docus/public/images/eden/defend_zone_mrkr.jpg b/docus/public/images/eden/defend_zone_mrkr.jpg new file mode 100644 index 0000000..143a14d Binary files /dev/null and b/docus/public/images/eden/defend_zone_mrkr.jpg differ diff --git a/docus/public/images/eden/defend_zone_mrkr_var.jpg b/docus/public/images/eden/defend_zone_mrkr_var.jpg new file mode 100644 index 0000000..51400ac Binary files /dev/null and b/docus/public/images/eden/defend_zone_mrkr_var.jpg differ diff --git a/docus/public/images/eden/defuse_explosives_mod.jpg b/docus/public/images/eden/defuse_explosives_mod.jpg new file mode 100644 index 0000000..301f699 Binary files /dev/null and b/docus/public/images/eden/defuse_explosives_mod.jpg differ diff --git a/docus/public/images/eden/defuse_protected_mod.jpg b/docus/public/images/eden/defuse_protected_mod.jpg new file mode 100644 index 0000000..4ef8c6a Binary files /dev/null and b/docus/public/images/eden/defuse_protected_mod.jpg differ diff --git a/docus/public/images/eden/defuse_task_mod.jpg b/docus/public/images/eden/defuse_task_mod.jpg new file mode 100644 index 0000000..c463663 Binary files /dev/null and b/docus/public/images/eden/defuse_task_mod.jpg differ diff --git a/docus/public/images/eden/defuse_task_mod_params.jpg b/docus/public/images/eden/defuse_task_mod_params.jpg new file mode 100644 index 0000000..39f5e86 Binary files /dev/null and b/docus/public/images/eden/defuse_task_mod_params.jpg differ diff --git a/docus/public/images/eden/delivery_cargo_mod.jpg b/docus/public/images/eden/delivery_cargo_mod.jpg new file mode 100644 index 0000000..d2c39a8 Binary files /dev/null and b/docus/public/images/eden/delivery_cargo_mod.jpg differ diff --git a/docus/public/images/eden/delivery_task_mod.jpg b/docus/public/images/eden/delivery_task_mod.jpg new file mode 100644 index 0000000..d080ed2 Binary files /dev/null and b/docus/public/images/eden/delivery_task_mod.jpg differ diff --git a/docus/public/images/eden/delivery_task_mod_params.jpg b/docus/public/images/eden/delivery_task_mod_params.jpg new file mode 100644 index 0000000..462c3f7 Binary files /dev/null and b/docus/public/images/eden/delivery_task_mod_params.jpg differ diff --git a/docus/public/images/eden/delivery_zone_mrkr.jpg b/docus/public/images/eden/delivery_zone_mrkr.jpg new file mode 100644 index 0000000..86b7fe3 Binary files /dev/null and b/docus/public/images/eden/delivery_zone_mrkr.jpg differ diff --git a/docus/public/images/eden/delivery_zone_mrkr_var.jpg b/docus/public/images/eden/delivery_zone_mrkr_var.jpg new file mode 100644 index 0000000..1610cac Binary files /dev/null and b/docus/public/images/eden/delivery_zone_mrkr_var.jpg differ diff --git a/docus/public/images/eden/destroy_task_mod.jpg b/docus/public/images/eden/destroy_task_mod.jpg new file mode 100644 index 0000000..5228cec Binary files /dev/null and b/docus/public/images/eden/destroy_task_mod.jpg differ diff --git a/docus/public/images/eden/destroy_task_mod_params.jpg b/docus/public/images/eden/destroy_task_mod_params.jpg new file mode 100644 index 0000000..214f986 Binary files /dev/null and b/docus/public/images/eden/destroy_task_mod_params.jpg differ diff --git a/docus/public/images/eden/destroy_task_tgts.jpg b/docus/public/images/eden/destroy_task_tgts.jpg new file mode 100644 index 0000000..b03eb61 Binary files /dev/null and b/docus/public/images/eden/destroy_task_tgts.jpg differ diff --git a/docus/public/images/eden/dispatch_unit.jpg b/docus/public/images/eden/dispatch_unit.jpg new file mode 100644 index 0000000..f06242f Binary files /dev/null and b/docus/public/images/eden/dispatch_unit.jpg differ diff --git a/docus/public/images/eden/dispatch_unit_var.jpg b/docus/public/images/eden/dispatch_unit_var.jpg new file mode 100644 index 0000000..7bbb6c1 Binary files /dev/null and b/docus/public/images/eden/dispatch_unit_var.jpg differ diff --git a/docus/public/images/eden/garage_obj.jpg b/docus/public/images/eden/garage_obj.jpg new file mode 100644 index 0000000..007f78d Binary files /dev/null and b/docus/public/images/eden/garage_obj.jpg differ diff --git a/docus/public/images/eden/garage_obj_1.jpg b/docus/public/images/eden/garage_obj_1.jpg new file mode 100644 index 0000000..43f5c02 Binary files /dev/null and b/docus/public/images/eden/garage_obj_1.jpg differ diff --git a/docus/public/images/eden/garage_obj_1_var.jpg b/docus/public/images/eden/garage_obj_1_var.jpg new file mode 100644 index 0000000..e18015f Binary files /dev/null and b/docus/public/images/eden/garage_obj_1_var.jpg differ diff --git a/docus/public/images/eden/garage_obj_2.jpg b/docus/public/images/eden/garage_obj_2.jpg new file mode 100644 index 0000000..c037992 Binary files /dev/null and b/docus/public/images/eden/garage_obj_2.jpg differ diff --git a/docus/public/images/eden/garage_obj_2_var.jpg b/docus/public/images/eden/garage_obj_2_var.jpg new file mode 100644 index 0000000..bec80db Binary files /dev/null and b/docus/public/images/eden/garage_obj_2_var.jpg differ diff --git a/docus/public/images/eden/garage_obj_var.jpg b/docus/public/images/eden/garage_obj_var.jpg new file mode 100644 index 0000000..8ddf8a0 Binary files /dev/null and b/docus/public/images/eden/garage_obj_var.jpg differ diff --git a/docus/public/images/eden/garage_spawn_1_mrkr.jpg b/docus/public/images/eden/garage_spawn_1_mrkr.jpg new file mode 100644 index 0000000..e9ed1a5 Binary files /dev/null and b/docus/public/images/eden/garage_spawn_1_mrkr.jpg differ diff --git a/docus/public/images/eden/garage_spawn_1_mrkr_var.jpg b/docus/public/images/eden/garage_spawn_1_mrkr_var.jpg new file mode 100644 index 0000000..fad27f3 Binary files /dev/null and b/docus/public/images/eden/garage_spawn_1_mrkr_var.jpg differ diff --git a/docus/public/images/eden/garage_spawn_2_mrkrs.jpg b/docus/public/images/eden/garage_spawn_2_mrkrs.jpg new file mode 100644 index 0000000..31b1ec1 Binary files /dev/null and b/docus/public/images/eden/garage_spawn_2_mrkrs.jpg differ diff --git a/docus/public/images/eden/garage_spawn_mrkrs.jpg b/docus/public/images/eden/garage_spawn_mrkrs.jpg new file mode 100644 index 0000000..a42ea77 Binary files /dev/null and b/docus/public/images/eden/garage_spawn_mrkrs.jpg differ diff --git a/docus/public/images/eden/hostage_entities_mod.jpg b/docus/public/images/eden/hostage_entities_mod.jpg new file mode 100644 index 0000000..93b01fd Binary files /dev/null and b/docus/public/images/eden/hostage_entities_mod.jpg differ diff --git a/docus/public/images/eden/hostage_ext_zone_mrkr.jpg b/docus/public/images/eden/hostage_ext_zone_mrkr.jpg new file mode 100644 index 0000000..8743ff7 Binary files /dev/null and b/docus/public/images/eden/hostage_ext_zone_mrkr.jpg differ diff --git a/docus/public/images/eden/hostage_ext_zone_mrkr_var.jpg b/docus/public/images/eden/hostage_ext_zone_mrkr_var.jpg new file mode 100644 index 0000000..8f10257 Binary files /dev/null and b/docus/public/images/eden/hostage_ext_zone_mrkr_var.jpg differ diff --git a/docus/public/images/eden/hostage_shooters_mod.jpg b/docus/public/images/eden/hostage_shooters_mod.jpg new file mode 100644 index 0000000..875b620 Binary files /dev/null and b/docus/public/images/eden/hostage_shooters_mod.jpg differ diff --git a/docus/public/images/eden/hostage_task_mod.jpg b/docus/public/images/eden/hostage_task_mod.jpg new file mode 100644 index 0000000..90b1c15 Binary files /dev/null and b/docus/public/images/eden/hostage_task_mod.jpg differ diff --git a/docus/public/images/eden/hostage_task_mod_params.jpg b/docus/public/images/eden/hostage_task_mod_params.jpg new file mode 100644 index 0000000..b12efdb Binary files /dev/null and b/docus/public/images/eden/hostage_task_mod_params.jpg differ diff --git a/docus/public/images/eden/hvt_capture_task_mod.jpg b/docus/public/images/eden/hvt_capture_task_mod.jpg new file mode 100644 index 0000000..6125489 Binary files /dev/null and b/docus/public/images/eden/hvt_capture_task_mod.jpg differ diff --git a/docus/public/images/eden/hvt_capture_task_mod_params.jpg b/docus/public/images/eden/hvt_capture_task_mod_params.jpg new file mode 100644 index 0000000..b78e839 Binary files /dev/null and b/docus/public/images/eden/hvt_capture_task_mod_params.jpg differ diff --git a/docus/public/images/eden/hvt_ext_zone_mrkr.jpg b/docus/public/images/eden/hvt_ext_zone_mrkr.jpg new file mode 100644 index 0000000..8743ff7 Binary files /dev/null and b/docus/public/images/eden/hvt_ext_zone_mrkr.jpg differ diff --git a/docus/public/images/eden/hvt_ext_zone_mrkr_var.jpg b/docus/public/images/eden/hvt_ext_zone_mrkr_var.jpg new file mode 100644 index 0000000..8f10257 Binary files /dev/null and b/docus/public/images/eden/hvt_ext_zone_mrkr_var.jpg differ diff --git a/docus/public/images/eden/hvt_task_mod.jpg b/docus/public/images/eden/hvt_task_mod.jpg new file mode 100644 index 0000000..c60fc88 Binary files /dev/null and b/docus/public/images/eden/hvt_task_mod.jpg differ diff --git a/docus/public/images/eden/hvt_task_mod_params.jpg b/docus/public/images/eden/hvt_task_mod_params.jpg new file mode 100644 index 0000000..9c01bba Binary files /dev/null and b/docus/public/images/eden/hvt_task_mod_params.jpg differ diff --git a/docus/public/images/eden/locker_obj.jpg b/docus/public/images/eden/locker_obj.jpg new file mode 100644 index 0000000..78b0f12 Binary files /dev/null and b/docus/public/images/eden/locker_obj.jpg differ diff --git a/docus/public/images/eden/locker_obj_var.jpg b/docus/public/images/eden/locker_obj_var.jpg new file mode 100644 index 0000000..2e583f9 Binary files /dev/null and b/docus/public/images/eden/locker_obj_var.jpg differ diff --git a/docus/public/images/eden/med_spawn_obj.jpg b/docus/public/images/eden/med_spawn_obj.jpg new file mode 100644 index 0000000..c8942bf Binary files /dev/null and b/docus/public/images/eden/med_spawn_obj.jpg differ diff --git a/docus/public/images/eden/med_spawn_obj_var.jpg b/docus/public/images/eden/med_spawn_obj_var.jpg new file mode 100644 index 0000000..44342f2 Binary files /dev/null and b/docus/public/images/eden/med_spawn_obj_var.jpg differ diff --git a/docus/public/images/eden/store_obj.jpg b/docus/public/images/eden/store_obj.jpg new file mode 100644 index 0000000..f32d1bf Binary files /dev/null and b/docus/public/images/eden/store_obj.jpg differ diff --git a/docus/public/images/eden/store_obj_var.jpg b/docus/public/images/eden/store_obj_var.jpg new file mode 100644 index 0000000..3746315 Binary files /dev/null and b/docus/public/images/eden/store_obj_var.jpg differ diff --git a/docus/public/images/player/atm_app_home.jpg b/docus/public/images/player/atm_app_home.jpg new file mode 100644 index 0000000..074d6d4 Binary files /dev/null and b/docus/public/images/player/atm_app_home.jpg differ diff --git a/docus/public/images/player/atm_app_pin.jpg b/docus/public/images/player/atm_app_pin.jpg new file mode 100644 index 0000000..518740f Binary files /dev/null and b/docus/public/images/player/atm_app_pin.jpg differ diff --git a/docus/public/images/player/bank_app.jpg b/docus/public/images/player/bank_app.jpg new file mode 100644 index 0000000..a0a1e15 Binary files /dev/null and b/docus/public/images/player/bank_app.jpg differ diff --git a/docus/public/images/player/cad_dispatch_board.jpg b/docus/public/images/player/cad_dispatch_board.jpg new file mode 100644 index 0000000..f8dd719 Binary files /dev/null and b/docus/public/images/player/cad_dispatch_board.jpg differ diff --git a/docus/public/images/player/cad_ops_board.jpg b/docus/public/images/player/cad_ops_board.jpg new file mode 100644 index 0000000..9ea0970 Binary files /dev/null and b/docus/public/images/player/cad_ops_board.jpg differ diff --git a/docus/public/images/player/garage.jpg b/docus/public/images/player/garage.jpg new file mode 100644 index 0000000..d570a18 Binary files /dev/null and b/docus/public/images/player/garage.jpg differ diff --git a/docus/public/images/player/interaction_menu.jpg b/docus/public/images/player/interaction_menu.jpg new file mode 100644 index 0000000..7ff3dba Binary files /dev/null and b/docus/public/images/player/interaction_menu.jpg differ diff --git a/docus/public/images/player/locker.jpg b/docus/public/images/player/locker.jpg new file mode 100644 index 0000000..59cd0f6 Binary files /dev/null and b/docus/public/images/player/locker.jpg differ diff --git a/docus/public/images/player/medical_respawn.jpg b/docus/public/images/player/medical_respawn.jpg new file mode 100644 index 0000000..c211af5 Binary files /dev/null and b/docus/public/images/player/medical_respawn.jpg differ diff --git a/docus/public/images/player/org_dashboard.jpg b/docus/public/images/player/org_dashboard.jpg new file mode 100644 index 0000000..be15976 Binary files /dev/null and b/docus/public/images/player/org_dashboard.jpg differ diff --git a/docus/public/images/player/org_home.jpg b/docus/public/images/player/org_home.jpg new file mode 100644 index 0000000..a176145 Binary files /dev/null and b/docus/public/images/player/org_home.jpg differ diff --git a/docus/public/images/player/org_registration.jpg b/docus/public/images/player/org_registration.jpg new file mode 100644 index 0000000..9475fc9 Binary files /dev/null and b/docus/public/images/player/org_registration.jpg differ diff --git a/docus/public/images/player/org_treasury.jpg b/docus/public/images/player/org_treasury.jpg new file mode 100644 index 0000000..a338bae Binary files /dev/null and b/docus/public/images/player/org_treasury.jpg differ diff --git a/docus/public/images/player/phone_contacts.jpg b/docus/public/images/player/phone_contacts.jpg new file mode 100644 index 0000000..5a16cdd Binary files /dev/null and b/docus/public/images/player/phone_contacts.jpg differ diff --git a/docus/public/images/player/phone_email.jpg b/docus/public/images/player/phone_email.jpg new file mode 100644 index 0000000..15d90f9 Binary files /dev/null and b/docus/public/images/player/phone_email.jpg differ diff --git a/docus/public/images/player/phone_email_example.jpg b/docus/public/images/player/phone_email_example.jpg new file mode 100644 index 0000000..2b85a58 Binary files /dev/null and b/docus/public/images/player/phone_email_example.jpg differ diff --git a/docus/public/images/player/phone_home.jpg b/docus/public/images/player/phone_home.jpg new file mode 100644 index 0000000..0017134 Binary files /dev/null and b/docus/public/images/player/phone_home.jpg differ diff --git a/docus/public/images/player/phone_message_example.jpg b/docus/public/images/player/phone_message_example.jpg new file mode 100644 index 0000000..a700db0 Binary files /dev/null and b/docus/public/images/player/phone_message_example.jpg differ diff --git a/docus/public/images/player/phone_messages.jpg b/docus/public/images/player/phone_messages.jpg new file mode 100644 index 0000000..e79ad37 Binary files /dev/null and b/docus/public/images/player/phone_messages.jpg differ diff --git a/docus/public/images/player/phone_wallet.jpg b/docus/public/images/player/phone_wallet.jpg new file mode 100644 index 0000000..a9290bb Binary files /dev/null and b/docus/public/images/player/phone_wallet.jpg differ diff --git a/docus/public/images/player/store_catalog.jpg b/docus/public/images/player/store_catalog.jpg new file mode 100644 index 0000000..82e3d08 Binary files /dev/null and b/docus/public/images/player/store_catalog.jpg differ diff --git a/docus/public/images/player/store_checkout.jpg b/docus/public/images/player/store_checkout.jpg new file mode 100644 index 0000000..f01d7ac Binary files /dev/null and b/docus/public/images/player/store_checkout.jpg differ diff --git a/docus/public/images/player/virtual_arsenal.jpg b/docus/public/images/player/virtual_arsenal.jpg new file mode 100644 index 0000000..42c2fc5 Binary files /dev/null and b/docus/public/images/player/virtual_arsenal.jpg differ diff --git a/docus/public/images/player/virtual_garage.jpg b/docus/public/images/player/virtual_garage.jpg new file mode 100644 index 0000000..cc42860 Binary files /dev/null and b/docus/public/images/player/virtual_garage.jpg differ diff --git a/examples/cba_settings.sqf b/examples/cba_settings.sqf new file mode 100644 index 0000000..1df6119 --- /dev/null +++ b/examples/cba_settings.sqf @@ -0,0 +1,7 @@ +// Forge framework CBA mission overrides. +// Place this file in your mission root as cba_settings.sqf. + +force forge_client_actor_enableLoc = true; +force forge_client_actor_enableGear = true; +force forge_client_actor_enableVA = true; +force forge_client_actor_enableVG = true; diff --git a/examples/ext_data.sqf b/examples/ext_data.sqf new file mode 100644 index 0000000..f384341 --- /dev/null +++ b/examples/ext_data.sqf @@ -0,0 +1,62 @@ +/* + * Server Side Registries + * + * These are the registries that are stored on the server and are used for + * game state management. + */ + +// Actor Registry +[["_SP_PLAYER_",[["rank","CAPTAIN"],["name","Jacob Schmidt"],["holster",true],["state","HEALTHY"],["organization","0160566824"],["loadout",[[],[],[],["U_BG_Guerrilla_RF",[]],[],[],"lxWS_H_CapB_rvs_blk_ION","G_Glasses_black_RF",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]],["stance","CROUCH"],["uid","_SP_PLAYER_"],["phone_number","0160566824"],["direction",0],["position",[0,0.0498047,5.00144]],["email","0160566824@spearnet.mil"]]]]; + +// Bank Registry +[["_SP_PLAYER_",[["pin",1234],["name","Jacob Schmidt"],["earnings",0],["bank",2000],["transactions",[]],["cash",0],["uid","_SP_PLAYER_"]]]]; +// Bank Index Registry +[["_SP_PLAYER_",[["name","Jacob Schmidt"],["uid","_SP_PLAYER_"]]]]; + +// Garage Registry +[["_SP_PLAYER_",[["efccebda-5f16-48f6-b4a5-da8dbfb19d02",[["plate","efccebda-5f16-48f6-b4a5-da8dbfb19d02"],["hit_points",[["names",["hitlfwheel","hitlf2wheel","hitrfwheel","hitrf2wheel","hitfuel","hithull","hitengine","hitbody","hitglass1","hitrglass","hitlglass","hitglass2","hitglass3","hitglass4","hitglass5","hitglass6","hitlbwheel","hitlmwheel","hitrbwheel","hitrmwheel","#light_1_hitpoint","#light_2_hitpoint"]],["selections",["wheel_1_1_steering","wheel_1_2_steering","wheel_2_1_steering","wheel_2_2_steering","fuel_hitpoint","fuel_hitpoint","engine_hitpoint","body_hitpoint","","","","","","","","","","","","","light_1_hitpoint","light_2_hitpoint"]],["values",[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]]],["damage",0],["classname","B_LSV_01_unarmed_F"],["fuel",1]]]]]]; + +// Locker Registry +[["_SP_PLAYER_",[["30Rnd_65x39_caseless_mag",[["amount",4],["classname","30Rnd_65x39_caseless_mag"],["category","magazine"]]],["arifle_MX_F",[["amount",1],["classname","arifle_MX_F"],["category","weapon"]]],["NVGoggles",[["amount",1],["classname","NVGoggles"],["category","hmd"]]]]]]; + +// Org Registry +[["default",[["name","Forge Dynamics"],["id","default"],["funds",200000],["reputation",0],["owner","server"]]],["0160566824",[["name","Black Rifle Company"],["id","0160566824"],["funds",0],["reputation",0],["owner","_SP_PLAYER_"],["members",[["_SP_PLAYER_",[["name","Jacob Schmidt"],["uid","_SP_PLAYER_"]]]]]]]]; +// Org Index Registry +[["_SP_PLAYER_",[["orgID","0160566824"]]]]; + +// Player Session Registry +[["_SP_PLAYER_",[["sessionToken","855837"]]]]; + +// Virtual Arsenal Registry +[["_SP_PLAYER_",[["items",["saber_light_ir_sand_lxWS","optic_Hamr_sand_lxWS","acc_pointer_IR_pistol_RF","U_BG_Guerrilla_RF","V_PlateCarrier1_rgr_noflag_F","lxWS_H_CapB_rvs_blk_ION","G_Glasses_black_RF","ItemMap","ItemCompass","ItemGPS","ItemRadio","ItemWatch"]],["backpacks",["B_AssaultPack_rgr"]],["weapons",["arifle_XMS_Sand_lxWS","hgun_Glock19_Tan_RF","Binocular"]],["magazines",["30Rnd_556x45_AP_Stanag_red_RF","17Rnd_9x19_red_Mag_RF"]]]]]; + +// Virtual Garage Registry +[["_SP_PLAYER_",[["armor",[]],["helis",[]],["cars",["B_Quadbike_01_F","B_ION_Pickup_rf"]],["other",[]],["planes",[]],["naval",[]]]]]; + +/* + * Client Side Classes + * + * These are the classes that are stored on the client and are used for + * optimistic UI updates. (Read-Only) + */ + +// Actor Class +[["rank","CAPTAIN"],["name","Jacob Schmidt"],["holster",true],["state","HEALTHY"],["organization","0160566824"],["loadout",[[],[],[],["U_BG_Guerrilla_RF",[]],[],[],"lxWS_H_CapB_rvs_blk_ION","G_Glasses_black_RF",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]],["stance","CROUCH"],["uid","_SP_PLAYER_"],["phone_number","0160566824"],["direction",0],["position",[0,0.0498047,5.00144]],["email","0160566824@spearnet.mil"]]; + +// Bank Class +[["pin",1234],["name","Jacob Schmidt"],["earnings",0],["bank",2000],["transactions",[]],["cash",0],["uid","_SP_PLAYER_"]]; + +// Garage Class +[["efccebda-5f16-48f6-b4a5-da8dbfb19d02",[["plate","efccebda-5f16-48f6-b4a5-da8dbfb19d02"],["hit_points",[["names",["hitlfwheel","hitlf2wheel","hitrfwheel","hitrf2wheel","hitfuel","hithull","hitengine","hitbody","hitglass1","hitrglass","hitlglass","hitglass2","hitglass3","hitglass4","hitglass5","hitglass6","hitlbwheel","hitlmwheel","hitrbwheel","hitrmwheel","#light_1_hitpoint","#light_2_hitpoint"]],["selections",["wheel_1_1_steering","wheel_1_2_steering","wheel_2_1_steering","wheel_2_2_steering","fuel_hitpoint","fuel_hitpoint","engine_hitpoint","body_hitpoint","","","","","","","","","","","","","light_1_hitpoint","light_2_hitpoint"]],["values",[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]]],["damage",0],["classname","B_LSV_01_unarmed_F"],["fuel",1]]]]; + +// Locker Class +[["30Rnd_65x39_caseless_mag",[["amount",4],["classname","30Rnd_65x39_caseless_mag"],["category","magazine"]]],["arifle_MX_F",[["amount",1],["classname","arifle_MX_F"],["category","weapon"]]],["NVGoggles",[["amount",1],["classname","NVGoggles"],["category","hmd"]]]]; + +// Organization Class +[["assets",[]],["name","Black Rifle Company"],["id","0160566824"],["funds",0],["reputation",0],["owner","_SP_PLAYER_"],["members",[["_SP_PLAYER_",[["name","Jacob Schmidt"],["uid","_SP_PLAYER_"]]]]]]; + +// Virtual Arsenal Class +[["items",["saber_light_ir_sand_lxWS","optic_Hamr_sand_lxWS","acc_pointer_IR_pistol_RF","U_BG_Guerrilla_RF","V_PlateCarrier1_rgr_noflag_F","lxWS_H_CapB_rvs_blk_ION","G_Glasses_black_RF","ItemMap","ItemCompass","ItemGPS","ItemRadio","ItemWatch"]],["backpacks",["B_AssaultPack_rgr"]],["weapons",["arifle_XMS_Sand_lxWS","hgun_Glock19_Tan_RF","Binocular"]],["magazines",["30Rnd_556x45_AP_Stanag_red_RF","17Rnd_9x19_red_Mag_RF"]]]; + +// Virtual Garage Class +[["armor",[]],["helis",[]],["cars",["B_Quadbike_01_F","B_ION_Pickup_rf"]],["other",[]],["planes",[]],["naval",[]]]; diff --git a/examples/icom_usage.sqf b/examples/icom_usage.sqf new file mode 100644 index 0000000..2c8744f --- /dev/null +++ b/examples/icom_usage.sqf @@ -0,0 +1,183 @@ +// ICOM (Internal Communication) Usage Example +// Complete guide for using ICOM to communicate between Arma 3 servers + +// ============================================================================ +// STEP 1: Define the event handler (in init.sqf or mission init) +// ============================================================================ +forge_icom_event = { + params ["_eventName", "_data"]; + + systemChat format ["📡 ICOM Event: %1", _eventName]; + diag_log format ["[ICOM] Event received: %1 | Data: %2", _eventName, _data]; + + // Handle specific events + switch (_eventName) do { + case "supply_drop": { + systemChat "📦 Supply drop incoming!"; + + if (_data isEqualType createHashMap) then { + private _coords = _data getOrDefault ["coords", []]; + private _supplies = _data getOrDefault ["supplies", []]; + + // Spawn supply crate at coordinates + if (count _coords >= 2) then { + private _pos = [_coords select 0, _coords select 1, 0]; + private _crate = createVehicle ["Box_NATO_Ammo_F", _pos, [], 0, "NONE"]; + + systemChat format ["Supply crate spawned at %1", _pos]; + diag_log format ["[ICOM] Supply drop: %1 supplies at %2", _supplies, _pos]; + }; + }; + }; + + case "spawn_mission": { + systemChat "🎯 New mission spawning!"; + + if (_data isEqualType createHashMap) then { + private _missionType = _data getOrDefault ["mission_type", ""]; + private _location = _data getOrDefault ["location", []]; + private _difficulty = _data getOrDefault ["difficulty", "normal"]; + + // Trigger mission spawn logic here + systemChat format ["Mission: %1 (%2) at %3", _missionType, _difficulty, _location]; + }; + }; + + case "global_alert": { + systemChat "⚠️ GLOBAL ALERT"; + + if (_data isEqualType createHashMap) then { + private _message = _data getOrDefault ["message", ""]; + private _severity = _data getOrDefault ["severity", "info"]; + + if (_message != "") then { + systemChat format ["Alert: %1", _message]; + + // Play sound based on severity + switch (_severity) do { + case "critical": { playSound "alarm"; }; + case "warning": { playSound "hint"; }; + }; + }; + }; + }; + + case "player_join": { + if (_data isEqualType createHashMap) then { + private _playerName = _data getOrDefault ["name", "Unknown"]; + private _serverName = _data getOrDefault ["server", "Unknown"]; + + systemChat format ["Player %1 joined %2", _playerName, _serverName]; + }; + }; + + default { + diag_log format ["[ICOM] Unhandled event: %1", _eventName]; + }; + }; +}; + +systemChat "✅ ICOM event handler registered"; +diag_log "[ICOM] Event handler initialized"; + + +// ============================================================================ +// STEP 2: Send events to other servers +// ============================================================================ + +// Example 1: Send supply drop to server_2 +private _supplyData = createHashMapFromArray [ + ["coords", [1234, 5678, 0]], + ["supplies", ["ammo_box", "medical_supplies", "repair_kit"]] +]; +private _result = "forge_server" callExtension ["icom:send_event", ["server_2", "supply_drop", (toJSON _supplyData)]]; +// Returns: ["OK",0,0] on success, ["ERROR: ...",0,0] on failure + +// Example 2: Spawn mission on server_2 +private _missionData = createHashMapFromArray [ + ["mission_type", "convoy_ambush"], + ["difficulty", "hard"], + ["location", [2345, 6789, 0]], + ["reward", 5000] +]; +"forge_server" callExtension ["icom:send_event", ["server_2", "spawn_mission", (toJSON _missionData)]]; + +// Example 3: Broadcast to all servers +private _alertData = createHashMapFromArray [ + ["message", "Server restart in 5 minutes"], + ["severity", "warning"] +]; +"forge_server" callExtension ["icom:broadcast", ["global_alert", (toJSON _alertData)]]; + +// Example 4: Notify all servers when a player joins +private _playerJoinData = createHashMapFromArray [ + ["name", name player], + ["uid", getPlayerUID player], + ["server", "server_1"] +]; +"forge_server" callExtension ["icom:broadcast", ["player_join", (toJSON _playerJoinData)]]; + + +// ============================================================================ +// TIPS AND BEST PRACTICES +// ============================================================================ + +// 1. Always use toJSON to convert hashmaps to JSON strings +private _data = createHashMapFromArray [["key", "value"]]; +private _json = toJSON _data; + +// 2. Check for errors +private _result = "forge_server" callExtension ["icom:send_event", ["server_2", "test", _json]]; +if ((_result select 0) find "ERROR" != -1) then { + systemChat "Failed to send event!"; + diag_log format ["[ICOM] Error: %1", _result select 0]; +}; + +// 3. Handle missing data gracefully in the event handler +// Use getOrDefault instead of direct hash access + +// 4. Log everything for debugging +// All ICOM events are logged to @forge_server/logs/icom.log + +// 5. Server IDs must match what's configured in the extension +// Default is "server_1", configure others as needed + + +// ============================================================================ +// COMMON EVENT PATTERNS +// ============================================================================ + +// Pattern 1: Request-Response +// Server 1 requests something from Server 2 +private _requestData = createHashMapFromArray [ + ["request_id", str (random 10000)], + ["request_type", "player_data"], + ["player_uid", getPlayerUID player] +]; +"forge_server" callExtension ["icom:send_event", ["server_2", "data_request", (toJSON _requestData)]]; +// Server 2 responds with a "data_response" event back to server_1 + +// Pattern 2: Cross-server triggers +// Trigger an action on all servers simultaneously +private _triggerData = createHashMapFromArray [ + ["trigger_type", "airdrop"], + ["position", [5000, 5000, 0]], + ["timestamp", time] +]; +"forge_server" callExtension ["icom:broadcast", ["synchronized_trigger", (toJSON _triggerData)]]; + +// Pattern 3: Server status updates +// Periodically broadcast server status to other servers +[] spawn { + while {true} do { + sleep 60; // Every minute + + private _statusData = createHashMapFromArray [ + ["player_count", count allPlayers], + ["server_fps", diag_fps], + ["mission_time", time] + ]; + + "forge_server" callExtension ["icom:broadcast", ["server_status", (toJSON _statusData)]]; + }; +}; diff --git a/forge.code-workspace b/forge.code-workspace new file mode 100644 index 0000000..fc23c3d --- /dev/null +++ b/forge.code-workspace @@ -0,0 +1,67 @@ +{ + "folders": [ + { + "path": ".", + }, + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config", + }, + "psi-header.changes-tracking": { + "isActive": true, + "include": ["sqf"], + "modDate": "Last Update:", + "modDateFormat": "YYYY-MM-DD", + "autoHeader": "manualSave", + }, + "psi-header.lang-config": [ + { + "license": "APL-SA", + "language": "sqf", + "rootDirFileName": "common_includes.hpp", + "beforeHeader": ["#include \"..\\script_component.hpp\"", ""], + "blankLinesBefore": 1, + "begin": "/*", + "prefix": " * ", + "end": " */", + "blankLinesAfter": 1, + "forceToTop": true, + }, + ], + "psi-header.templates": [ + { + "language": "sqf", + "template": [ + "File: <>", + "Author: IDSolutions", + "Date: <>", + "Last Update:", + "Public: No", + "", + "Description:", + " No description added yet.", + "", + "Parameter(s):", + " N/A", + "", + "Returns:", + " Something [BOOL]", + "", + "Example(s):", + " [parameter] call forge_x_component_fnc_myFunction", + ], + }, + ], + }, +} diff --git a/history.txt b/history.txt new file mode 100644 index 0000000..12ef808 --- /dev/null +++ b/history.txt @@ -0,0 +1,101 @@ +#V2 +DEFINE FIELD OVERWRITE updated_at ON org_fleet_vehicle TYPE option; +DEFINE INDEX IF NOT EXISTS org_fleet_vehicle_org ON org_fleet_vehicle COLUMNS org_id; +DEFINE INDEX IF NOT EXISTS org_fleet_vehicle_unique ON org_fleet_vehicle COLUMNS org_id, fleet_key UNIQUE; +DEFINE TABLE IF NOT EXISTS locker SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON locker TYPE string; +DEFINE FIELD OVERWRITE updated_at ON locker TYPE option; +DEFINE INDEX IF NOT EXISTS locker_uid ON locker COLUMNS uid UNIQUE; +DEFINE TABLE IF NOT EXISTS locker_item SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS category ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON locker_item TYPE string; +DEFINE FIELD IF NOT EXISTS amount ON locker_item TYPE int; +DEFINE FIELD OVERWRITE updated_at ON locker_item TYPE option; +DEFINE INDEX IF NOT EXISTS locker_item_owner ON locker_item COLUMNS uid; +DEFINE INDEX IF NOT EXISTS locker_item_unique ON locker_item COLUMNS uid, classname UNIQUE; +DEFINE TABLE IF NOT EXISTS owned_locker SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON owned_locker TYPE string; +DEFINE FIELD OVERWRITE updated_at ON owned_locker TYPE option; +DEFINE INDEX IF NOT EXISTS owned_locker_uid ON owned_locker COLUMNS uid UNIQUE; +DEFINE TABLE IF NOT EXISTS locker_unlock SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS category ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON locker_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS source ON locker_unlock TYPE option; +DEFINE FIELD OVERWRITE unlocked_at ON locker_unlock TYPE option; +DEFINE INDEX IF NOT EXISTS locker_unlock_owner ON locker_unlock COLUMNS uid; +DEFINE INDEX IF NOT EXISTS locker_unlock_unique ON locker_unlock COLUMNS uid, category, classname UNIQUE; +DEFINE TABLE IF NOT EXISTS garage SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON garage TYPE string; +DEFINE FIELD OVERWRITE updated_at ON garage TYPE option; +DEFINE INDEX IF NOT EXISTS garage_uid ON garage COLUMNS uid UNIQUE; +DEFINE TABLE IF NOT EXISTS garage_vehicle SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS plate ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON garage_vehicle TYPE string; +DEFINE FIELD IF NOT EXISTS fuel ON garage_vehicle TYPE number; +DEFINE FIELD IF NOT EXISTS damage ON garage_vehicle TYPE number; +DEFINE FIELD IF NOT EXISTS hit_points ON garage_vehicle TYPE object; +DEFINE FIELD OVERWRITE updated_at ON garage_vehicle TYPE option; +DEFINE INDEX IF NOT EXISTS garage_vehicle_owner ON garage_vehicle COLUMNS uid; +DEFINE INDEX IF NOT EXISTS garage_vehicle_unique ON garage_vehicle COLUMNS uid, plate UNIQUE; +DEFINE TABLE IF NOT EXISTS owned_garage SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON owned_garage TYPE string; +DEFINE FIELD OVERWRITE updated_at ON owned_garage TYPE option; +DEFINE INDEX IF NOT EXISTS owned_garage_uid ON owned_garage COLUMNS uid UNIQUE; +DEFINE TABLE IF NOT EXISTS garage_unlock SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS category ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS classname ON garage_unlock TYPE string; +DEFINE FIELD IF NOT EXISTS source ON garage_unlock TYPE option; +DEFINE FIELD OVERWRITE unlocked_at ON garage_unlock TYPE option; +DEFINE INDEX IF NOT EXISTS garage_unlock_owner ON garage_unlock COLUMNS uid; +DEFINE INDEX IF NOT EXISTS garage_unlock_unique ON garage_unlock COLUMNS uid, category, classname UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_user SCHEMALESS; +DEFINE FIELD IF NOT EXISTS uid ON phone_user TYPE string; +DEFINE FIELD OVERWRITE updated_at ON phone_user TYPE option; +DEFINE INDEX IF NOT EXISTS phone_user_uid ON phone_user COLUMNS uid UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_contact SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_contact TYPE string; +DEFINE FIELD IF NOT EXISTS contact_uid ON phone_contact TYPE string; +DEFINE FIELD OVERWRITE created_at ON phone_contact TYPE option; +DEFINE INDEX IF NOT EXISTS phone_contact_owner ON phone_contact COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_contact_unique ON phone_contact COLUMNS uid, contact_uid UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_message SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS message_id ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS from_uid ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS to_uid ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS message ON phone_message TYPE string; +DEFINE FIELD IF NOT EXISTS timestamp ON phone_message TYPE number; +DEFINE FIELD OVERWRITE created_at ON phone_message TYPE option; +DEFINE INDEX IF NOT EXISTS phone_message_message_id ON phone_message COLUMNS message_id UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_message_index SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_message_index TYPE string; +DEFINE FIELD IF NOT EXISTS message_id ON phone_message_index TYPE string; +DEFINE FIELD IF NOT EXISTS is_read ON phone_message_index TYPE bool; +DEFINE FIELD OVERWRITE updated_at ON phone_message_index TYPE option; +DEFINE INDEX IF NOT EXISTS phone_message_index_owner ON phone_message_index COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_message_index_message ON phone_message_index COLUMNS message_id; +DEFINE INDEX IF NOT EXISTS phone_message_index_unique ON phone_message_index COLUMNS uid, message_id UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_email SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS email_id ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS from_uid ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS to_uid ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS subject ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS body ON phone_email TYPE string; +DEFINE FIELD IF NOT EXISTS timestamp ON phone_email TYPE number; +DEFINE FIELD OVERWRITE created_at ON phone_email TYPE option; +DEFINE INDEX IF NOT EXISTS phone_email_email_id ON phone_email COLUMNS email_id UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_email_index SCHEMAFULL; +DEFINE FIELD IF NOT EXISTS uid ON phone_email_index TYPE string; +DEFINE FIELD IF NOT EXISTS email_id ON phone_email_index TYPE string; +DEFINE FIELD IF NOT EXISTS is_read ON phone_email_index TYPE bool; +DEFINE FIELD OVERWRITE updated_at ON phone_email_index TYPE option; +DEFINE INDEX IF NOT EXISTS phone_email_index_owner ON phone_email_index COLUMNS uid; +DEFINE INDEX IF NOT EXISTS phone_email_index_email ON phone_email_index COLUMNS email_id; +DEFINE INDEX IF NOT EXISTS phone_email_index_unique ON phone_email_index COLUMNS uid, email_id UNIQUE; +DEFINE TABLE IF NOT EXISTS phone_sequence SCHEMALESS; +DEFINE FIELD IF NOT EXISTS sequence_id ON phone_sequence TYPE string; +DEFINE FIELD IF NOT EXISTS value ON phone_sequence TYPE int; +DEFINE INDEX IF NOT EXISTS phone_sequence_id ON phone_sequence COLUMNS sequence_id UNIQUE; diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..a828334 --- /dev/null +++ b/lib/README.md @@ -0,0 +1,26 @@ +# Forge Shared Libraries + +The `lib` workspace contains reusable Rust crates for Forge domain models, +repository traits, services, and shared helpers. + +## Crates + +- `forge-models`: serializable domain models shared by services and extension + routes. +- `forge-repositories`: repository traits plus in-memory implementations used + by tests and transient hot-state stores. +- `forge-services`: business logic for actor, bank, garage, locker, org, + phone, store, task, and CAD workflows. +- `forge-shared`: validation and cross-crate helpers. + +Durable persistence is implemented in the server extension with SurrealDB +repository implementations. + +## Test + +```powershell +cargo test -p forge-models +cargo test -p forge-repositories +cargo test -p forge-services +cargo test -p forge-shared +``` diff --git a/lib/models/Cargo.toml b/lib/models/Cargo.toml new file mode 100644 index 0000000..f0f9a26 --- /dev/null +++ b/lib/models/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "forge-models" +version = "0.1.0" +edition = "2024" +description = "FORGE data models" +authors = ["IDSolutions", "J. Schmidt"] + +[dependencies] +arma-rs = { workspace = true, optional = true } +serde = { workspace = true } +serde_json = { workspace = true, optional = true } +forge-shared = { path = "../shared" } + +[features] +default = ["actor", "bank", "member", "org", "task"] + +actor = ["arma-rs", "serde_json"] +bank = ["arma-rs", "serde_json"] +member = ["arma-rs", "serde_json"] +org = ["arma-rs", "serde_json"] +task = ["arma-rs", "serde_json"] +arma-rs = ["arma-rs/serde_json"] diff --git a/lib/models/README.md b/lib/models/README.md new file mode 100644 index 0000000..8ed9d76 --- /dev/null +++ b/lib/models/README.md @@ -0,0 +1,144 @@ +# Forge Models + +This crate defines the shared data structures (models) used throughout the Forge application. These models represent the core entities of the game and are shared between the Extension, Service, and Repository layers. + +## Actor Model + +The `Actor` struct represents a player in the game. It contains all persistent data associated with a character. + +### Fields + +| Field | Type | Description | +| :------------- | :----------------------- | :--------------------------------------------- | +| `uid` | `String` | Unique Steam ID (64-bit). Immutable. | +| `name` | `Option` | Player's display name. | +| `loadout` | `serde_json::Value` | JSON representation of the player's equipment. | +| `position` | `Option>` | `[x, y, z]` coordinates. | +| `direction` | `f64` | Compass direction (0-360). | +| `stance` | `Option` | Player stance (e.g., "STAND", "CROUCH"). | +| `email` | `String` | In-game email address (auto-generated). | +| `phone_number` | `String` | In-game phone number (auto-generated). | +| `bank` | `f64` | Money in the bank. | +| `cash` | `f64` | Money on hand. | +| `earnings` | `f64` | Total earnings. | +| `state` | `String` | Health/Status state (default: "HEALTHY"). | +| `holster` | `bool` | Whether the weapon is holstered. | +| `rank` | `Option` | Rank within an organization. | +| `organization` | `String` | ID of the organization the player belongs to. | +| `transactions` | `Vec` | History of financial transactions. | + +### Validation Rules + +- **UID**: Must be a 17-digit numeric string. +- **Name**: Max 50 characters, cannot be empty if set. +- **Position**: Must be an array of 3 finite numbers. +- **Direction**: Must be between 0.0 and 360.0. +- **Phone Number**: Must start with "0160" and be 10 digits long. +- **Email**: Must end with "@spearnet.mil". + +### Arma Integration + +The `Actor` struct implements `FromArma` and `IntoArma` for seamless conversion between Rust structs and SQF values. + +- **From Arma**: Expects a JSON string. +- **To Arma**: Returns a JSON string. + +## Organization Model + +The `Org` struct represents a guild, clan, or group of players. + +### Fields + +| Field | Type | Description | +| :----------- | :------- | :-------------------------------- | +| `id` | `String` | Unique identifier (slug). | +| `owner` | `String` | UID of the organization leader. | +| `name` | `String` | Display name of the organization. | +| `funds` | `f64` | Shared organization funds. | +| `reputation` | `i64` | Organization's reputation score. | + +### Validation Rules + +- **ID**: Alphanumeric and underscores only. Cannot be empty. +- **Owner**: Must be a valid 17-digit UID. +- **Name**: Max 100 characters, no control characters. +- **Funds**: Cannot be negative. + +## Contributing + +We welcome contributions to the Forge Models crate! When adding a new model, please follow these guidelines to ensure consistency. + +### Adding a New Model + +To add a new model (e.g., `Vehicle`), follow these steps: + +1. **Define the Struct**: Create a new file in `src/` (e.g., `src/vehicle.rs`) and define your struct. + - Derive `Debug`, `Clone`, `Serialize`, and `Deserialize`. + - Use `#[serde(default)]` for optional fields that should have default values. + + ```rust + #[derive(Debug, Clone, Serialize, Deserialize)] + pub struct Vehicle { + pub id: String, + pub class_name: String, + #[serde(default)] + pub damage: f64, + } + ``` + +2. **Implement `new`**: Provide a constructor that initializes the struct with valid defaults. + + ```rust + impl Vehicle { + pub fn new(id: String, class_name: String) -> Result { + let vehicle = Self { + id, + class_name, + damage: 0.0, + }; + vehicle.validate()?; + Ok(vehicle) + } + } + ``` + +3. **Implement `validate`**: Create a method to enforce business rules and data integrity. + + ```rust + impl Vehicle { + pub fn validate(&self) -> Result<(), String> { + if self.id.is_empty() { + return Err("ID cannot be empty".to_string()); + } + if self.damage < 0.0 || self.damage > 1.0 { + return Err("Damage must be between 0.0 and 1.0".to_string()); + } + Ok(()) + } + } + ``` + +4. **Implement Arma Traits**: Implement `FromArma` and `IntoArma` for SQF interoperability. + + ```rust + use arma_rs::{FromArma, IntoArma, Value}; + + impl FromArma for Vehicle { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s).map_err(|e| ... ) + } + } + + impl IntoArma for Vehicle { + fn to_arma(&self) -> Value { + let json = serde_json::to_string(self).unwrap_or_default(); + Value::String(json) + } + } + ``` + +5. **Register the Module**: Add your new module to `src/lib.rs`. + ```rust + pub mod vehicle; + pub use vehicle::Vehicle; + ``` diff --git a/lib/models/src/actor.rs b/lib/models/src/actor.rs new file mode 100644 index 0000000..51e8b53 --- /dev/null +++ b/lib/models/src/actor.rs @@ -0,0 +1,184 @@ +use arma_rs::{ + FromArma, IntoArma, + loadout::{AssignedItems, InventoryItem, Loadout as ArmaLoadout}, +}; +use forge_shared::{ + ActorValidationError, arma_value_to_json, generate_email, generate_phone_number, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Actor { + pub uid: String, + pub name: Option, + + #[serde(default)] + pub loadout: serde_json::Value, + + pub position: Option>, + #[serde(default)] + pub direction: f64, + pub stance: Option, + + #[serde(default)] + pub email: String, + #[serde(default)] + pub phone_number: String, + + #[serde(default)] + pub state: String, + #[serde(default)] + pub holster: bool, + pub rank: Option, + #[serde(default)] + pub organization: String, +} + +impl Actor { + pub fn new>(uid: S) -> Result { + let uid_string = uid.into(); + + if uid_string.trim().is_empty() { + return Err(ActorValidationError::EmptyUid); + } + + if !uid_string.chars().all(|c| c.is_numeric()) || uid_string.len() != 17 { + return Err(ActorValidationError::InvalidUid(uid_string)); + } + + let phone_number = generate_phone_number(&uid_string); + let email = generate_email(&phone_number); + + let actor = Self { + uid: uid_string, + name: None, + loadout: Self::default_loadout_json(), + position: None, + direction: 0.0, + stance: None, + email, + phone_number, + state: "HEALTHY".to_string(), + holster: true, + rank: None, + organization: "default".to_string(), + }; + + actor.validate()?; + Ok(actor) + } + + pub fn validate(&self) -> Result<(), ActorValidationError> { + if self.uid.trim().is_empty() { + return Err(ActorValidationError::EmptyUid); + } + + if !self.uid.chars().all(|c| c.is_numeric()) || self.uid.len() != 17 { + return Err(ActorValidationError::InvalidUid(self.uid.clone())); + } + + if let Some(ref name) = self.name + && (name.trim().is_empty() || name.len() > 50) + { + return Err(ActorValidationError::InvalidName(name.clone())); + } + + if let Some(ref pos) = self.position { + if pos.len() != 3 { + return Err(ActorValidationError::InvalidPosition( + "Position must have exactly 3 coordinates".to_string(), + )); + } + for coord in pos { + if !coord.is_finite() { + return Err(ActorValidationError::InvalidPosition( + "Position coordinates must be finite numbers".to_string(), + )); + } + } + } + + if !self.direction.is_finite() || self.direction < 0.0 || self.direction >= 360.0 { + return Err(ActorValidationError::InvalidDirection(self.direction)); + } + + if !self.phone_number.is_empty() + && (!self.phone_number.starts_with("0160") || self.phone_number.len() != 10) + { + return Err(ActorValidationError::InvalidPhoneNumber( + self.phone_number.clone(), + )); + } + + if !self.email.is_empty() && (!self.email.contains('@') || !self.email.ends_with(".mil")) { + return Err(ActorValidationError::InvalidEmail(self.email.clone())); + } + + if !self.organization.is_empty() && self.organization.len() > 100 { + return Err(ActorValidationError::InvalidOrganization( + self.organization.clone(), + )); + } + + Ok(()) + } + + pub fn uid(&self) -> &str { + &self.uid + } + + fn default_loadout_json() -> serde_json::Value { + let mut loadout = ArmaLoadout::default(); + + let uniform = loadout.uniform_mut(); + uniform.set_class("U_BG_Guerrilla_6_1".to_string()); + + let uniform_items = uniform.items_mut().unwrap(); + uniform_items.push(InventoryItem::new_item("FirstAidKit".to_string(), 1)); + + loadout.set_headgear("H_Cap_blk_ION".to_string()); + + let mut items = AssignedItems::default(); + items.set_map("ItemMap".to_string()); + items.set_terminal("ItemGPS".to_string()); + items.set_radio("ItemRadio".to_string()); + items.set_compass("ItemCompass".to_string()); + items.set_watch("ItemWatch".to_string()); + loadout.set_assigned_items(items); + + let arma_value = loadout.to_arma(); + arma_value_to_json(&arma_value) + } + + pub fn get_loadout(&self) -> Result { + let loadout_str = serde_json::to_string(&self.loadout) + .map_err(|e| format!("Failed to serialize loadout: {}", e))?; + ArmaLoadout::from_arma(loadout_str).map_err(|e| format!("Failed to parse loadout: {}", e)) + } + + pub fn set_loadout(&mut self, loadout: ArmaLoadout) { + let arma_value = loadout.to_arma(); + self.loadout = arma_value_to_json(&arma_value); + } +} + +impl FromArma for Actor { + fn from_arma(s: String) -> Result { + let mut actor: Actor = serde_json::from_str(&s).map_err(|e| { + arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e)) + })?; + + if actor.organization.trim().is_empty() { + actor.organization = "default".to_string(); + } + + Ok(actor) + } +} + +impl IntoArma for Actor { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/bank.rs b/lib/models/src/bank.rs new file mode 100644 index 0000000..7f9344b --- /dev/null +++ b/lib/models/src/bank.rs @@ -0,0 +1,120 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::BankValidationError; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Bank { + pub uid: String, + pub name: String, + pub bank: f64, + pub cash: f64, + pub earnings: f64, + pub pin: u64, + pub transactions: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankMutationResult { + pub account: Bank, + pub patch: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankTransferResult { + pub source_account: Bank, + pub source_patch: HashMap, + pub target_account: Bank, + pub target_patch: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankOperationContext { + pub mode: String, + pub atm_authorized: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankTransferContext { + pub mode: String, + pub atm_authorized: bool, + pub from_field: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankCheckoutContext { + pub source_field: String, + pub commit: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BankPinContext { + pub mode: String, + #[serde(default)] + pub atm_authorized: bool, +} + +impl Bank { + pub fn new>(uid: S, name: S, pin: u64) -> Result { + let bank = Self { + uid: uid.into(), + name: name.into(), + bank: 0.0, + cash: 0.0, + earnings: 0.0, + pin, + transactions: Vec::new(), + }; + + bank.validate()?; + Ok(bank) + } + + pub fn validate(&self) -> Result<(), BankValidationError> { + if self.uid.trim().is_empty() { + return Err(BankValidationError::UidEmpty); + } + + if self.name.trim().is_empty() { + return Err(BankValidationError::NameEmpty); + } + + if self.bank < 0.0 { + return Err(BankValidationError::BankNegative); + } + + if self.cash < 0.0 { + return Err(BankValidationError::CashNegative); + } + + if self.pin < 1000 || self.pin > 9999 { + return Err(BankValidationError::InvalidPin(self.pin)); + } + + Ok(()) + } + + pub fn uid(&self) -> &str { + &self.uid + } +} + +impl FromArma for Bank { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Bank { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/cad.rs b/lib/models/src/cad.rs new file mode 100644 index 0000000..ee58e7c --- /dev/null +++ b/lib/models/src/cad.rs @@ -0,0 +1,237 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; + +pub type CadJsonMap = Map; + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(transparent)] +pub struct CadRecord { + pub fields: CadJsonMap, +} + +impl CadRecord { + pub fn into_value(self) -> Value { + Value::Object(self.fields) + } + + pub fn to_value(&self) -> Value { + Value::Object(self.fields.clone()) + } + + pub fn is_empty(&self) -> bool { + self.fields.is_empty() + } + + pub fn merge(mut self, patch: CadRecord) -> Self { + for (key, value) in patch.fields { + self.fields.insert(key, value); + } + + self + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadDispatchOrderCreateSeed { + #[serde(default)] + pub order: CadRecord, + #[serde(default)] + pub assignment: CadRecord, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadDispatchOrderContextSeed { + #[serde(default)] + pub assignee_group_id: String, + #[serde(default)] + pub assignee_group_callsign: String, + #[serde(default)] + pub target_group_id: String, + #[serde(default)] + pub target_group_callsign: String, + #[serde(default)] + pub target_position: Value, + #[serde(default)] + pub created_by_uid: String, + #[serde(default)] + pub created_by_name: String, + #[serde(default)] + pub request_id: String, + #[serde(default)] + pub request_type: String, + #[serde(default)] + pub request_title: String, + #[serde(default)] + pub request_summary: String, + #[serde(default)] + pub request_fields: CadRecord, + #[serde(default)] + pub note: String, + #[serde(default)] + pub priority: String, + #[serde(default)] + pub created_at: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadDispatchOrderMutationResult { + #[serde(default)] + pub task_id: String, + #[serde(default)] + pub order: Value, + #[serde(default)] + pub assignment: Value, + #[serde(default)] + pub message: String, + #[serde(default)] + pub activity: CadActivityEntry, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadActivityEntry { + #[serde(default)] + #[serde(rename = "type")] + pub entry_type: String, + #[serde(default)] + pub message: String, + #[serde(default)] + pub task_id: String, + #[serde(default)] + pub group_id: String, + #[serde(default)] + pub actor_uid: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadAssignmentMutationResult { + #[serde(default)] + pub assignment: Value, + #[serde(default)] + pub message: String, + #[serde(default)] + pub activity: CadActivityEntry, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadRequestMutationResult { + #[serde(default)] + pub request: Value, + #[serde(default)] + pub message: String, + #[serde(default)] + pub activity: CadActivityEntry, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadGroupProfileUpdateSeed { + #[serde(default)] + pub group_id: String, + #[serde(default)] + pub group_callsign: String, + #[serde(default)] + pub requester_uid: String, + #[serde(default)] + pub current_role: String, + #[serde(default)] + pub current_status: String, + #[serde(default)] + pub role: String, + #[serde(default)] + pub status: String, + #[serde(default)] + pub mode: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadGroupProfileMutationResult { + #[serde(default)] + pub profile: Value, + #[serde(default)] + pub message: String, + #[serde(default)] + pub activity: CadActivityEntry, + #[serde(default)] + pub changed: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadSupportRequestSubmitSeed { + #[serde(rename = "type")] + #[serde(default)] + pub request_type: String, + #[serde(default)] + pub fields: CadRecord, + #[serde(default)] + pub group_id: String, + #[serde(default)] + pub group_callsign: String, + #[serde(default)] + pub submitted_by_uid: String, + #[serde(default)] + pub submitted_by_name: String, + #[serde(default)] + pub priority: String, + #[serde(default)] + pub position: Value, + #[serde(default)] + pub created_at: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadGroupBuildSeed { + #[serde(default)] + pub live_groups: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadSession { + #[serde(default)] + pub uid: String, + #[serde(default)] + pub org_id: String, + #[serde(default)] + pub is_dispatcher: bool, + #[serde(default)] + pub group_id: String, + #[serde(default)] + pub is_leader: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadHydrateSeed { + #[serde(default)] + pub groups: Vec, + #[serde(default)] + pub active_tasks: Vec, + #[serde(default)] + pub session: CadSession, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CadHydratePayload { + #[serde(default)] + pub groups: Vec, + #[serde(default)] + pub contracts: Vec, + #[serde(default)] + pub requests: Vec, + #[serde(default)] + pub assignments: Vec, + #[serde(default)] + pub activity: Vec, + #[serde(default)] + pub session: CadSession, +} diff --git a/lib/models/src/garage.rs b/lib/models/src/garage.rs new file mode 100644 index 0000000..aa78101 --- /dev/null +++ b/lib/models/src/garage.rs @@ -0,0 +1,238 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::GarageValidationError; +use serde::{Deserialize, Deserializer, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Garage { + pub vehicles: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Vehicle { + pub plate: String, + pub classname: String, + pub fuel: f64, + pub damage: f64, + pub hit_points: HitPoints, +} + +#[derive(Debug, Clone, Serialize)] +pub struct HitPoints { + pub names: Vec, + pub selections: Vec, + pub values: Vec, +} + +#[derive(Deserialize)] +struct HitPointsWire { + #[serde(default)] + names: Vec, + #[serde(default)] + selections: Vec, + #[serde(default)] + values: Vec, +} + +impl HitPoints { + pub fn new() -> Self { + Self { + names: Vec::new(), + selections: Vec::new(), + values: Vec::new(), + } + } + + fn normalize_legacy_fields(&mut self) { + if self.names.is_empty() + && !self.selections.is_empty() + && self.selections.len() == self.values.len() + { + self.names = self.selections.clone(); + } + + if self.selections.is_empty() + && !self.names.is_empty() + && self.names.len() == self.values.len() + { + self.selections = self.names.clone(); + } + } + + pub fn from_json_str(json_str: &str) -> Result { + let hit_points: HitPoints = serde_json::from_str(json_str) + .map_err(|e| format!("Failed to parse hit_points JSON: {}", e))?; + + let names_len = hit_points.names.len(); + let selections_len = hit_points.selections.len(); + let values_len = hit_points.values.len(); + + if names_len != selections_len || names_len != values_len { + return Err(format!( + "Hitpoint array length mismatch: names={}, selections={}, values={}", + names_len, selections_len, values_len + )); + } + + Ok(hit_points) + } +} + +impl<'de> Deserialize<'de> for HitPoints { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let wire = HitPointsWire::deserialize(deserializer)?; + let mut hit_points = Self { + names: wire.names, + selections: wire.selections, + values: wire.values, + }; + hit_points.normalize_legacy_fields(); + Ok(hit_points) + } +} + +impl Default for HitPoints { + fn default() -> Self { + Self::new() + } +} + +impl Vehicle { + pub fn new>( + plate: S, + classname: S, + fuel: f64, + damage: f64, + hit_points: HitPoints, + ) -> Result { + let vehicle = Self { + plate: plate.into(), + classname: classname.into(), + fuel, + damage, + hit_points, + }; + + vehicle.validate()?; + Ok(vehicle) + } + + pub fn validate(&self) -> Result<(), GarageValidationError> { + if self.classname.trim().is_empty() { + return Err(GarageValidationError::ClassnameEmpty); + } + + if self.fuel < 0.0 || self.fuel > 1.0 { + return Err(GarageValidationError::FuelInvalid); + } + + if self.damage < 0.0 || self.damage > 1.0 { + return Err(GarageValidationError::DamageInvalid); + } + + let names_len = self.hit_points.names.len(); + let selections_len = self.hit_points.selections.len(); + let values_len = self.hit_points.values.len(); + + if names_len != selections_len || names_len != values_len { + return Err(GarageValidationError::HitpointArrayLengthMismatch); + } + + for (i, value) in self.hit_points.values.iter().enumerate() { + if *value < 0.0 || *value > 1.0 { + return Err(GarageValidationError::HitpointValueInvalid(i)); + } + } + + Ok(()) + } +} + +impl Garage { + pub fn new() -> Result { + let garage = Self { + vehicles: HashMap::new(), + }; + + garage.validate()?; + Ok(garage) + } + + pub fn validate(&self) -> Result<(), GarageValidationError> { + for vehicle in self.vehicles.values() { + vehicle.validate()?; + } + + Ok(()) + } + + pub fn add_vehicle(&mut self, vehicle: Vehicle) -> Result<(), GarageValidationError> { + vehicle.validate()?; + self.vehicles.insert(vehicle.plate.clone(), vehicle); + Ok(()) + } + + pub fn remove_vehicle(&mut self, plate: &str) -> Option { + self.vehicles.remove(plate) + } + + pub fn get_vehicle(&self, plate: &str) -> Option<&Vehicle> { + self.vehicles.get(plate) + } + + pub fn get_vehicle_mut(&mut self, plate: &str) -> Option<&mut Vehicle> { + self.vehicles.get_mut(plate) + } +} + +impl FromArma for Vehicle { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Vehicle { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} + +#[cfg(test)] +mod tests { + use super::HitPoints; + + #[test] + fn deserializes_legacy_hit_points_missing_names() { + let hit_points = + HitPoints::from_json_str(r#"{"selections":["engine_hitpoint"],"values":[0.35]}"#) + .expect("legacy hit points should deserialize"); + + assert_eq!(hit_points.names, vec!["engine_hitpoint"]); + assert_eq!(hit_points.selections, vec!["engine_hitpoint"]); + assert_eq!(hit_points.values, vec![0.35]); + } + + #[test] + fn deserializes_empty_legacy_hit_points_object() { + let hit_points = + HitPoints::from_json_str(r#"{}"#).expect("empty legacy hit points should deserialize"); + + assert!(hit_points.names.is_empty()); + assert!(hit_points.selections.is_empty()); + assert!(hit_points.values.is_empty()); + } + + #[test] + fn rejects_unbalanced_legacy_hit_points() { + let error = + HitPoints::from_json_str(r#"{"selections":["engine_hitpoint"],"values":[0.35,0.5]}"#) + .expect_err("unbalanced hit points should be rejected"); + + assert!(error.contains("Hitpoint array length mismatch")); + } +} diff --git a/lib/models/src/lib.rs b/lib/models/src/lib.rs new file mode 100644 index 0000000..3d968c1 --- /dev/null +++ b/lib/models/src/lib.rs @@ -0,0 +1,44 @@ +pub mod actor; +pub mod bank; +pub mod cad; +pub mod garage; +pub mod locker; +pub mod org; +pub mod phone; +pub mod store; +pub mod task; +pub mod v_garage; +pub mod v_locker; + +pub use actor::Actor; +pub use bank::{ + Bank, BankCheckoutContext, BankMutationResult, BankOperationContext, BankPinContext, + BankTransferContext, BankTransferResult, +}; +pub use cad::{ + CadActivityEntry, CadAssignmentMutationResult, CadDispatchOrderContextSeed, + CadDispatchOrderCreateSeed, CadDispatchOrderMutationResult, CadGroupBuildSeed, + CadGroupProfileMutationResult, CadGroupProfileUpdateSeed, CadHydratePayload, CadHydrateSeed, + CadJsonMap, CadRecord, CadRequestMutationResult, CadSession, CadSupportRequestSubmitSeed, +}; +pub use garage::{Garage, HitPoints, Vehicle}; +pub use locker::{Item, Locker}; +pub use org::{ + CreditLineSummary, DEFAULT_CREDIT_LINE_INTEREST_RATE, HotOrgRecord, MemberSummary, Org, + OrgAssetEntry, OrgAssetGrantSeed, OrgCheckoutContext, OrgCreditLineContext, + OrgCreditLineRepaymentContext, OrgCreditLineRepaymentResult, OrgDisbandMemberResult, + OrgDisbandResult, OrgEnsureMemberContext, OrgFleetEntry, OrgFleetGrantSeed, OrgGrantContext, + OrgInviteContext, OrgInviteDecisionContext, OrgInviteDecisionResult, OrgInviteRecord, + OrgInviteResult, OrgLeaveContext, OrgLeaveResult, OrgMutationResult, OrgRegisterContext, + OrgRegisterResult, +}; +pub use phone::{PhoneEmail, PhoneMessage, PhonePayload}; +pub use store::{ + StoreCheckoutContext, StoreCheckoutItemSeed, StoreCheckoutResult, StoreCheckoutVehicleSeed, + StoreGrantedItem, StoreGrantedVehicle, +}; +pub use task::{ + TaskJsonMap, TaskOwnershipContext, TaskOwnershipMutationResult, TaskRecord, TaskRewardContext, +}; +pub use v_garage::{VGarage, VehicleCategory}; +pub use v_locker::{EquipmentCategory, VLocker}; diff --git a/lib/models/src/locker.rs b/lib/models/src/locker.rs new file mode 100644 index 0000000..bee33a1 --- /dev/null +++ b/lib/models/src/locker.rs @@ -0,0 +1,100 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::LockerValidationError; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Locker { + pub items: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Item { + pub category: String, + pub classname: String, + pub amount: u32, +} + +impl Item { + pub fn new>( + category: S, + classname: S, + amount: u32, + ) -> Result { + let item = Self { + category: category.into(), + classname: classname.into(), + amount, + }; + + item.validate()?; + Ok(item) + } + + pub fn validate(&self) -> Result<(), LockerValidationError> { + if self.category.trim().is_empty() { + return Err(LockerValidationError::CategoryEmpty); + } + + if self.classname.trim().is_empty() { + return Err(LockerValidationError::ClassnameEmpty); + } + + if self.amount == 0 { + return Err(LockerValidationError::AmountZero); + } + + Ok(()) + } +} + +impl Locker { + pub fn new() -> Result { + let locker = Self { + items: HashMap::new(), + }; + + locker.validate()?; + Ok(locker) + } + + pub fn validate(&self) -> Result<(), LockerValidationError> { + for item in self.items.values() { + item.validate()?; + } + + Ok(()) + } + + pub fn add_item(&mut self, item: Item) -> Result<(), LockerValidationError> { + item.validate()?; + self.items.insert(item.classname.clone(), item); + Ok(()) + } + + pub fn remove_item(&mut self, classname: &str) -> Option { + self.items.remove(classname) + } + + pub fn get_item(&self, classname: &str) -> Option<&Item> { + self.items.get(classname) + } + + pub fn get_item_mut(&mut self, classname: &str) -> Option<&mut Item> { + self.items.get_mut(classname) + } +} + +impl FromArma for Item { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Item { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/org.rs b/lib/models/src/org.rs new file mode 100644 index 0000000..266fec3 --- /dev/null +++ b/lib/models/src/org.rs @@ -0,0 +1,448 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::OrgValidationError; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +pub const DEFAULT_CREDIT_LINE_INTEREST_RATE: f64 = 0.10; + +fn round_currency(value: f64) -> f64 { + (value.max(0.0) * 100.0).round() / 100.0 +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CreditLineSummary { + pub uid: String, + pub name: String, + #[serde(default)] + pub approved_amount: f64, + #[serde(default)] + pub available_amount: f64, + #[serde(default)] + pub outstanding_principal: f64, + #[serde(default = "default_credit_line_interest_rate")] + pub interest_rate: f64, + #[serde(default)] + pub amount_due: f64, + #[serde(default)] + pub amount: f64, +} + +fn default_credit_line_interest_rate() -> f64 { + DEFAULT_CREDIT_LINE_INTEREST_RATE +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OrgAssetEntry { + pub classname: String, + #[serde(rename = "type")] + pub asset_type: String, + pub quantity: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OrgFleetEntry { + pub classname: String, + pub name: String, + #[serde(rename = "type")] + pub fleet_type: String, + pub status: String, + pub damage: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Org { + pub id: String, + pub owner: String, + pub name: String, + + #[serde(default)] + pub funds: f64, + #[serde(default)] + pub reputation: i64, + #[serde(default)] + pub credit_lines: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MemberSummary { + pub uid: String, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgInviteRecord { + pub org_id: String, + pub org_name: String, + pub inviter_uid: String, + pub inviter_name: String, + pub target_uid: String, + pub target_name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HotOrgRecord { + pub id: String, + pub owner: String, + pub name: String, + pub funds: f64, + pub reputation: i64, + #[serde(default)] + pub credit_lines: HashMap, + #[serde(default)] + pub assets: HashMap>, + #[serde(default)] + pub fleet: HashMap, + #[serde(default)] + pub members: HashMap, + #[serde(default)] + pub pending_invites: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgEnsureMemberContext { + pub org_id: String, + pub member_uid: String, + pub member_name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgRegisterContext { + pub requester_uid: String, + pub requester_name: String, + pub org_id: String, + pub org_name: String, + pub existing_org_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgRegisterResult { + pub org: HotOrgRecord, + pub actor_organization: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgInviteContext { + pub requester_uid: String, + pub requester_name: String, + pub org_id: String, + pub requester_is_default_org_ceo: bool, + pub target_uid: String, + pub target_name: String, + pub target_org_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgInviteDecisionContext { + pub requester_uid: String, + pub requester_name: String, + pub org_id: String, + pub existing_org_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgInviteResult { + pub org: HotOrgRecord, + pub target_uid: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgInviteDecisionResult { + pub invited_org: HotOrgRecord, + pub previous_org: Option, + pub actor_organization: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgCreditLineContext { + pub requester_uid: String, + pub org_id: String, + pub requester_is_default_org_ceo: bool, + pub member_uid: String, + pub member_name: String, + pub amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgCheckoutContext { + pub requester_uid: String, + pub org_id: String, + pub requester_is_default_org_ceo: bool, + #[serde(default)] + pub allow_member_charge: bool, + #[serde(default)] + pub record_member_debt: bool, + pub source: String, + pub amount: f64, + pub commit: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgCreditLineRepaymentContext { + pub requester_uid: String, + pub org_id: String, + pub amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgAssetGrantSeed { + pub classname: String, + pub category: String, + pub quantity: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgFleetGrantSeed { + pub classname: String, + pub category: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgGrantContext { + pub requester_uid: String, + pub org_id: String, + pub commit: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgMutationResult { + pub org: HotOrgRecord, + pub patch: HashMap, + pub member_uids: Vec, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgCreditLineRepaymentResult { + pub org: HotOrgRecord, + pub patch: HashMap, + pub member_uids: Vec, + pub paid_amount: f64, + pub principal_paid: f64, + pub interest_paid: f64, + pub remaining_amount_due: f64, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgLeaveContext { + pub requester_uid: String, + pub requester_name: String, + pub org_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgLeaveResult { + pub actor_organization: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgDisbandMemberResult { + pub uid: String, + pub requester: bool, + pub actor_organization: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OrgDisbandResult { + pub message: String, + pub members: Vec, +} + +impl Org { + pub fn new>(id: S, owner: S, name: S) -> Result { + let org = Self { + id: id.into(), + owner: owner.into(), + name: name.into(), + funds: 0.0, + reputation: 0, + credit_lines: HashMap::new(), + }; + + org.validate()?; + Ok(org) + } + + pub fn validate(&self) -> Result<(), OrgValidationError> { + if self.id.trim().is_empty() { + return Err(OrgValidationError::EmptyId); + } + + if self.owner.trim().is_empty() { + return Err(OrgValidationError::EmptyOwner); + } + + if self.name.trim().is_empty() { + return Err(OrgValidationError::EmptyName); + } + + if self.funds < 0.0 { + return Err(OrgValidationError::NegativeFunds); + } + + if self.reputation < 0 { + return Err(OrgValidationError::InvalidName( + "Organization reputation cannot be negative".to_string(), + )); + } + + if !self.id.chars().all(|c| c.is_alphanumeric() || c == '_') { + return Err(OrgValidationError::InvalidId(self.id.clone())); + } + + if self.owner != "server" + && (!self.owner.chars().all(|c| c.is_numeric()) || self.owner.len() != 17) + { + return Err(OrgValidationError::InvalidOwner(self.owner.clone())); + } + + if self.name.len() > 100 || self.name.chars().any(|c| c.is_control()) { + return Err(OrgValidationError::InvalidName(self.name.clone())); + } + + for (uid, credit_line) in &self.credit_lines { + let resolved_uid = if credit_line.uid.trim().is_empty() { + uid + } else { + &credit_line.uid + }; + + if !resolved_uid.chars().all(|c| c.is_numeric()) || resolved_uid.len() != 17 { + return Err(OrgValidationError::InvalidCreditLineUid( + resolved_uid.to_string(), + )); + } + + if credit_line.approved_amount < 0.0 + || credit_line.available_amount < 0.0 + || credit_line.outstanding_principal < 0.0 + || credit_line.amount_due < 0.0 + || credit_line.amount < 0.0 + { + return Err(OrgValidationError::NegativeCreditLine( + resolved_uid.to_string(), + )); + } + } + + Ok(()) + } + + pub fn id(&self) -> &str { + &self.id + } + + pub fn normalize_credit_lines(&mut self) { + for credit_line in self.credit_lines.values_mut() { + credit_line.normalize(); + } + } +} + +impl HotOrgRecord { + pub fn from_parts( + org: Org, + assets: HashMap>, + fleet: HashMap, + members: Vec, + ) -> Self { + Self { + id: org.id, + owner: org.owner, + name: org.name, + funds: org.funds, + reputation: org.reputation, + credit_lines: org.credit_lines, + assets, + fleet, + members: members + .into_iter() + .map(|member| (member.uid.clone(), member)) + .collect(), + pending_invites: HashMap::new(), + } + } + + pub fn into_org(self) -> Org { + let mut org = Org { + id: self.id, + owner: self.owner, + name: self.name, + funds: self.funds, + reputation: self.reputation, + credit_lines: self.credit_lines, + }; + org.normalize_credit_lines(); + org + } +} + +impl CreditLineSummary { + pub fn normalize(&mut self) { + let legacy_amount = round_currency(self.amount); + + self.approved_amount = round_currency(self.approved_amount); + self.available_amount = round_currency(self.available_amount); + self.outstanding_principal = round_currency(self.outstanding_principal); + self.amount_due = round_currency(self.amount_due); + + if self.approved_amount <= 0.0 && self.available_amount <= 0.0 && legacy_amount > 0.0 { + self.approved_amount = legacy_amount; + self.available_amount = legacy_amount; + } else if self.approved_amount <= 0.0 && self.available_amount > 0.0 { + self.approved_amount = self.available_amount; + } else if self.available_amount <= 0.0 && self.approved_amount > 0.0 { + self.available_amount = self.approved_amount; + } + + if self.interest_rate <= 0.0 { + self.interest_rate = DEFAULT_CREDIT_LINE_INTEREST_RATE; + } + + if self.amount_due <= 0.0 && self.outstanding_principal > 0.0 { + self.amount_due = + round_currency(self.outstanding_principal * (1.0 + self.interest_rate)); + } + + self.amount = self.available_amount; + } +} + +impl FromArma for Org { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Org { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/phone.rs b/lib/models/src/phone.rs new file mode 100644 index 0000000..874c4b5 --- /dev/null +++ b/lib/models/src/phone.rs @@ -0,0 +1,48 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PhoneMessage { + #[serde(default)] + pub id: String, + #[serde(default)] + pub from: String, + #[serde(default)] + pub to: String, + #[serde(default)] + pub message: String, + #[serde(default)] + pub timestamp: f64, + #[serde(default)] + pub read: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PhoneEmail { + #[serde(default)] + pub id: String, + #[serde(default)] + pub from: String, + #[serde(default)] + pub to: String, + #[serde(default)] + pub subject: String, + #[serde(default)] + pub body: String, + #[serde(default)] + pub timestamp: f64, + #[serde(default)] + pub read: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PhonePayload { + #[serde(default)] + pub contacts: Vec, + #[serde(default)] + pub messages: Vec, + #[serde(default)] + pub emails: Vec, +} diff --git a/lib/models/src/store.rs b/lib/models/src/store.rs new file mode 100644 index 0000000..9665c5c --- /dev/null +++ b/lib/models/src/store.rs @@ -0,0 +1,72 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreCheckoutItemSeed { + pub classname: String, + pub category: String, + pub price_value: f64, + pub quantity: u32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreCheckoutVehicleSeed { + pub classname: String, + pub category: String, + pub price_value: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreCheckoutContext { + pub requester_uid: String, + pub requester_name: String, + pub org_id: String, + pub requester_is_default_org_ceo: bool, + pub payment_method: String, + #[serde(default)] + pub items: Vec, + #[serde(default)] + pub vehicles: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreGrantedItem { + pub classname: String, + pub category: String, + pub quantity: u32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreGrantedVehicle { + pub classname: String, + pub category: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoreCheckoutResult { + pub charged_total: f64, + pub payment_method: String, + pub message: String, + #[serde(default)] + pub locker_granted: Vec, + #[serde(default)] + pub vehicle_granted: Vec, + #[serde(default)] + pub locker_patch: HashMap, + #[serde(default)] + pub va_patch: HashMap, + #[serde(default)] + pub vgarage_patch: HashMap, + #[serde(default)] + pub bank_patch: HashMap, + #[serde(default)] + pub org_patch: HashMap, + #[serde(default)] + pub org_target_uids: Vec, +} diff --git a/lib/models/src/task.rs b/lib/models/src/task.rs new file mode 100644 index 0000000..75237ba --- /dev/null +++ b/lib/models/src/task.rs @@ -0,0 +1,57 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; + +pub type TaskJsonMap = Map; + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(transparent)] +pub struct TaskRecord { + pub fields: TaskJsonMap, +} + +impl TaskRecord { + pub fn into_value(self) -> Value { + Value::Object(self.fields) + } + + pub fn to_value(&self) -> Value { + Value::Object(self.fields.clone()) + } + + pub fn is_empty(&self) -> bool { + self.fields.is_empty() + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct TaskOwnershipContext { + #[serde(default)] + pub requester_uid: String, + #[serde(default)] + pub org_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct TaskOwnershipMutationResult { + #[serde(default)] + pub task_id: String, + #[serde(default)] + pub requester_uid: String, + #[serde(default)] + pub org_id: String, + #[serde(default)] + pub entry: Value, + #[serde(default)] + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct TaskRewardContext { + #[serde(default)] + pub requester_uid: String, + #[serde(default)] + pub org_id: String, +} diff --git a/lib/models/src/v_garage.rs b/lib/models/src/v_garage.rs new file mode 100644 index 0000000..dcb528b --- /dev/null +++ b/lib/models/src/v_garage.rs @@ -0,0 +1,103 @@ +use arma_rs::{FromArma, IntoArma}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum VehicleCategory { + Cars, + Armor, + Helis, + Planes, + Naval, + Other, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct VGarage { + pub cars: Vec, + pub armor: Vec, + pub helis: Vec, + pub planes: Vec, + pub naval: Vec, + pub other: Vec, +} + +impl VGarage { + pub fn new() -> Self { + Self::default_unlocks() + } + + fn default_unlocks() -> Self { + Self { + cars: vec!["B_Quadbike_01_F".to_string()], + armor: Vec::new(), + helis: Vec::new(), + planes: Vec::new(), + naval: Vec::new(), + other: Vec::new(), + } + } + + pub fn add(&mut self, category: VehicleCategory, classnames: Vec) { + let target_array = match category { + VehicleCategory::Cars => &mut self.cars, + VehicleCategory::Armor => &mut self.armor, + VehicleCategory::Helis => &mut self.helis, + VehicleCategory::Planes => &mut self.planes, + VehicleCategory::Naval => &mut self.naval, + VehicleCategory::Other => &mut self.other, + }; + + for classname in classnames { + if !target_array.contains(&classname) { + target_array.push(classname); + } + } + } + + pub fn get(&self, category: VehicleCategory) -> &Vec { + match category { + VehicleCategory::Cars => &self.cars, + VehicleCategory::Armor => &self.armor, + VehicleCategory::Helis => &self.helis, + VehicleCategory::Planes => &self.planes, + VehicleCategory::Naval => &self.naval, + VehicleCategory::Other => &self.other, + } + } + + pub fn remove(&mut self, category: VehicleCategory, classname: &str) -> Option { + let target_array = match category { + VehicleCategory::Cars => &mut self.cars, + VehicleCategory::Armor => &mut self.armor, + VehicleCategory::Helis => &mut self.helis, + VehicleCategory::Planes => &mut self.planes, + VehicleCategory::Naval => &mut self.naval, + VehicleCategory::Other => &mut self.other, + }; + + target_array + .iter() + .position(|x| x == classname) + .map(|pos| target_array.remove(pos)) + } +} + +impl Default for VGarage { + fn default() -> Self { + Self::new() + } +} + +impl FromArma for VGarage { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for VGarage { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/v_locker.rs b/lib/models/src/v_locker.rs new file mode 100644 index 0000000..f9f66a3 --- /dev/null +++ b/lib/models/src/v_locker.rs @@ -0,0 +1,119 @@ +use arma_rs::{FromArma, IntoArma}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum EquipmentCategory { + Items, + Weapons, + Magazines, + Backpacks, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct VLocker { + pub items: Vec, + pub weapons: Vec, + pub magazines: Vec, + pub backpacks: Vec, +} + +impl VLocker { + pub fn new() -> Self { + Self::default_unlocks() + } + + fn default_unlocks() -> Self { + Self { + items: vec![ + "FirstAidKit".to_string(), + "G_Combat".to_string(), + "H_Cap_blk_ION".to_string(), + "H_HelmetB".to_string(), + "ACE_EarPlugs".to_string(), + "ItemCompass".to_string(), + "ItemGPS".to_string(), + "ItemMap".to_string(), + "ItemRadio".to_string(), + "ItemWatch".to_string(), + "U_BG_Guerrilla_6_1".to_string(), + "V_TacVest_oli".to_string(), + ], + weapons: vec!["arifle_MX_F".to_string(), "hgun_P07_F".to_string()], + magazines: vec![ + "16Rnd_9x21_Mag".to_string(), + "30Rnd_65x39_caseless_black_mag".to_string(), + "Chemlight_blue".to_string(), + "Chemlight_green".to_string(), + "Chemlight_red".to_string(), + "Chemlight_yellow".to_string(), + "HandGrenade".to_string(), + "SmokeShell".to_string(), + "SmokeShellBlue".to_string(), + "SmokeShellGreen".to_string(), + "SmokeShellOrange".to_string(), + "SmokeShellPurple".to_string(), + "SmokeShellRed".to_string(), + "SmokeShellYellow".to_string(), + ], + backpacks: vec!["B_AssaultPack_rgr".to_string()], + } + } + + pub fn add(&mut self, category: EquipmentCategory, classnames: Vec) { + let target_array = match category { + EquipmentCategory::Items => &mut self.items, + EquipmentCategory::Weapons => &mut self.weapons, + EquipmentCategory::Magazines => &mut self.magazines, + EquipmentCategory::Backpacks => &mut self.backpacks, + }; + + for classname in classnames { + if !target_array.contains(&classname) { + target_array.push(classname); + } + } + } + + pub fn get(&self, category: EquipmentCategory) -> &Vec { + match category { + EquipmentCategory::Items => &self.items, + EquipmentCategory::Weapons => &self.weapons, + EquipmentCategory::Magazines => &self.magazines, + EquipmentCategory::Backpacks => &self.backpacks, + } + } + + pub fn remove(&mut self, category: EquipmentCategory, classname: &str) -> Option { + let target_array = match category { + EquipmentCategory::Items => &mut self.items, + EquipmentCategory::Weapons => &mut self.weapons, + EquipmentCategory::Magazines => &mut self.magazines, + EquipmentCategory::Backpacks => &mut self.backpacks, + }; + + target_array + .iter() + .position(|x| x == classname) + .map(|pos| target_array.remove(pos)) + } +} + +impl Default for VLocker { + fn default() -> Self { + Self::new() + } +} + +impl FromArma for VLocker { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for VLocker { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/repositories/Cargo.toml b/lib/repositories/Cargo.toml new file mode 100644 index 0000000..c343ce9 --- /dev/null +++ b/lib/repositories/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "forge-repositories" +version = "0.1.0" +edition = "2024" + +[dependencies] +forge-models = { path = "../models" } +forge-shared = { path = "../shared" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tokio = { workspace = true } diff --git a/lib/repositories/README.md b/lib/repositories/README.md new file mode 100644 index 0000000..c7beb5d --- /dev/null +++ b/lib/repositories/README.md @@ -0,0 +1,20 @@ +# Forge Repositories + +This crate defines repository traits used by the service layer. It also +provides in-memory implementations for tests and transient server state. + +Durable repository implementations live in the server extension because they +depend on extension configuration and the SurrealDB runtime client. + +## Contents + +- Actor, bank, garage, locker, org, phone, task, CAD, owned garage, and owned + locker repository traits. +- In-memory stores for unit tests and hot-state services. + +## Guidelines + +- Keep traits storage-agnostic. +- Return domain models instead of raw database records. +- Keep serialization and database-specific mapping in concrete implementations. +- Prefer focused in-memory tests for service behavior. diff --git a/lib/repositories/src/actor.rs b/lib/repositories/src/actor.rs new file mode 100644 index 0000000..57bbcda --- /dev/null +++ b/lib/repositories/src/actor.rs @@ -0,0 +1,82 @@ +//! Actor repository implementation for data persistence operations. +//! +//! This module provides the data access layer for actor (player) management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::Actor; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for actor data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait ActorRepository: Send + Sync { + /// Creates a new actor in the repository. + fn create(&self, actor: &Actor) -> Result<(), String>; + + /// Retrieves an actor by their unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing actor with new data. + fn update(&self, actor: &Actor) -> Result<(), String>; + + /// Permanently removes an actor from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an actor exists in the repository. + fn exists(&self, id: &str) -> Result; +} + +pub trait ActorHotRepository: Send + Sync { + fn get(&self, id: &str) -> Result, String>; + fn keys(&self) -> Result, String>; + fn save(&self, actor: &Actor) -> Result<(), String>; + fn delete(&self, id: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryActorHotRepository { + state: Arc>>, +} + +impl InMemoryActorHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl ActorHotRepository for InMemoryActorHotRepository { + fn get(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(id).cloned()) + .map_err(|_| "Actor hot state lock poisoned.".to_string()) + } + + fn keys(&self) -> Result, String> { + self.state + .read() + .map(|state| state.keys().cloned().collect()) + .map_err(|_| "Actor hot state lock poisoned.".to_string()) + } + + fn save(&self, actor: &Actor) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Actor hot state lock poisoned.".to_string())? + .insert(actor.uid.clone(), actor.clone()); + Ok(()) + } + + fn delete(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Actor hot state lock poisoned.".to_string())? + .remove(id); + Ok(()) + } +} diff --git a/lib/repositories/src/bank.rs b/lib/repositories/src/bank.rs new file mode 100644 index 0000000..5beb6f1 --- /dev/null +++ b/lib/repositories/src/bank.rs @@ -0,0 +1,74 @@ +//! Bank repository implementation for data persistence operations. +//! +//! This module provides the data access layer for bank account management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::Bank; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for bank data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait BankRepository: Send + Sync { + /// Creates a new bank in the repository. + fn create(&self, bank: &Bank) -> Result<(), String>; + + /// Retrieves an bank by their unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing bank with new data. + fn update(&self, bank: &Bank) -> Result<(), String>; + + /// Permanently removes an bank from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an bank exists in the repository. + fn exists(&self, id: &str) -> Result; +} + +pub trait BankHotRepository: Send + Sync { + fn get(&self, id: &str) -> Result, String>; + fn save(&self, bank: &Bank) -> Result<(), String>; + fn delete(&self, id: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryBankHotRepository { + state: Arc>>, +} + +impl InMemoryBankHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl BankHotRepository for InMemoryBankHotRepository { + fn get(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(id).cloned()) + .map_err(|_| "Bank hot state lock poisoned.".to_string()) + } + + fn save(&self, bank: &Bank) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Bank hot state lock poisoned.".to_string())? + .insert(bank.uid.clone(), bank.clone()); + Ok(()) + } + + fn delete(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Bank hot state lock poisoned.".to_string())? + .remove(id); + Ok(()) + } +} diff --git a/lib/repositories/src/cad.rs b/lib/repositories/src/cad.rs new file mode 100644 index 0000000..d9d32e5 --- /dev/null +++ b/lib/repositories/src/cad.rs @@ -0,0 +1,236 @@ +use forge_models::CadRecord; +use serde_json::Value; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +const CAD_ACTIVITY_LIMIT: usize = 200; + +pub trait CadRepository: Send + Sync { + fn append_activity(&self, entry: Value) -> Result<(), String>; + fn recent_activity(&self, limit: usize) -> Result, String>; + fn snapshot_activity(&self) -> Result, String>; + + fn list_assignments(&self) -> Result, String>; + fn get_assignment(&self, id: &str) -> Result, String>; + fn save_assignment(&self, id: String, entry: CadRecord) -> Result<(), String>; + fn delete_assignment(&self, id: &str) -> Result<(), String>; + + fn list_orders(&self) -> Result, String>; + fn get_order(&self, id: &str) -> Result, String>; + fn save_order(&self, id: String, entry: CadRecord) -> Result<(), String>; + fn delete_order(&self, id: &str) -> Result<(), String>; + + fn list_requests(&self) -> Result, String>; + fn get_request(&self, id: &str) -> Result, String>; + fn save_request(&self, id: String, entry: CadRecord) -> Result<(), String>; + fn delete_request(&self, id: &str) -> Result<(), String>; + + fn list_profiles(&self) -> Result, String>; + fn get_profile(&self, id: &str) -> Result, String>; + fn save_profile(&self, id: String, entry: CadRecord) -> Result<(), String>; + fn delete_profile(&self, id: &str) -> Result<(), String>; + + fn next_order_id(&self) -> Result; + fn next_request_id(&self) -> Result; +} + +#[derive(Debug, Default)] +struct CadState { + activity: Vec, + assignments: HashMap, + orders: HashMap, + requests: HashMap, + profiles: HashMap, + order_sequence: u64, + request_sequence: u64, +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryCadRepository { + state: Arc>, +} + +impl InMemoryCadRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl CadRepository for InMemoryCadRepository { + fn append_activity(&self, entry: Value) -> Result<(), String> { + let mut state = self + .state + .write() + .map_err(|_| "CAD activity state lock poisoned.".to_string())?; + + state.activity.push(entry); + if state.activity.len() > CAD_ACTIVITY_LIMIT { + let overflow = state.activity.len() - CAD_ACTIVITY_LIMIT; + state.activity.drain(0..overflow); + } + + Ok(()) + } + + fn recent_activity(&self, limit: usize) -> Result, String> { + let state = self + .state + .read() + .map_err(|_| "CAD activity state lock poisoned.".to_string())?; + let start = state.activity.len().saturating_sub(limit); + Ok(state.activity[start..].to_vec()) + } + + fn snapshot_activity(&self) -> Result, String> { + self.state + .read() + .map(|state| state.activity.clone()) + .map_err(|_| "CAD activity state lock poisoned.".to_string()) + } + + fn list_assignments(&self) -> Result, String> { + self.state + .read() + .map(|state| state.assignments.clone()) + .map_err(|_| "CAD assignments state lock poisoned.".to_string()) + } + + fn get_assignment(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.assignments.get(id).cloned()) + .map_err(|_| "CAD assignments state lock poisoned.".to_string()) + } + + fn save_assignment(&self, id: String, entry: CadRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD assignments state lock poisoned.".to_string())? + .assignments + .insert(id, entry); + Ok(()) + } + + fn delete_assignment(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD assignments state lock poisoned.".to_string())? + .assignments + .remove(id); + Ok(()) + } + + fn list_orders(&self) -> Result, String> { + self.state + .read() + .map(|state| state.orders.clone()) + .map_err(|_| "CAD orders state lock poisoned.".to_string()) + } + + fn get_order(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.orders.get(id).cloned()) + .map_err(|_| "CAD orders state lock poisoned.".to_string()) + } + + fn save_order(&self, id: String, entry: CadRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD orders state lock poisoned.".to_string())? + .orders + .insert(id, entry); + Ok(()) + } + + fn delete_order(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD orders state lock poisoned.".to_string())? + .orders + .remove(id); + Ok(()) + } + + fn list_requests(&self) -> Result, String> { + self.state + .read() + .map(|state| state.requests.clone()) + .map_err(|_| "CAD requests state lock poisoned.".to_string()) + } + + fn get_request(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.requests.get(id).cloned()) + .map_err(|_| "CAD requests state lock poisoned.".to_string()) + } + + fn save_request(&self, id: String, entry: CadRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD requests state lock poisoned.".to_string())? + .requests + .insert(id, entry); + Ok(()) + } + + fn delete_request(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD requests state lock poisoned.".to_string())? + .requests + .remove(id); + Ok(()) + } + + fn list_profiles(&self) -> Result, String> { + self.state + .read() + .map(|state| state.profiles.clone()) + .map_err(|_| "CAD profiles state lock poisoned.".to_string()) + } + + fn get_profile(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.profiles.get(id).cloned()) + .map_err(|_| "CAD profiles state lock poisoned.".to_string()) + } + + fn save_profile(&self, id: String, entry: CadRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD profiles state lock poisoned.".to_string())? + .profiles + .insert(id, entry); + Ok(()) + } + + fn delete_profile(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "CAD profiles state lock poisoned.".to_string())? + .profiles + .remove(id); + Ok(()) + } + + fn next_order_id(&self) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "CAD order sequence lock poisoned.".to_string())?; + state.order_sequence += 1; + Ok(format!("cad-order:{}", state.order_sequence)) + } + + fn next_request_id(&self) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "CAD request sequence lock poisoned.".to_string())?; + state.request_sequence += 1; + Ok(format!("cad-request:{}", state.request_sequence)) + } +} diff --git a/lib/repositories/src/garage.rs b/lib/repositories/src/garage.rs new file mode 100644 index 0000000..2461db6 --- /dev/null +++ b/lib/repositories/src/garage.rs @@ -0,0 +1,68 @@ +//! Garage repository implementation for vehicle data persistence operations. +//! +//! This module provides the data access layer for vehicle garage management. +//! Each player's garage is stored as a single JSON string containing all their vehicles. + +use forge_models::Garage; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for garage data operations. +pub trait GarageRepository: Send + Sync { + /// Creates a new garage for a player + fn create(&self, uid: &str, garage: &Garage) -> Result<(), String>; + + /// Updates an existing garage with new vehicle data + fn update(&self, uid: &str, garage: &Garage) -> Result<(), String>; + + /// Retrieves a player's garage + fn get(&self, uid: &str) -> Result, String>; + + /// Deletes a player's garage (all vehicles) + fn delete(&self, uid: &str) -> Result<(), String>; + + /// Checks if a player has a garage + fn exists(&self, uid: &str) -> Result; +} + +pub trait GarageHotRepository: Send + Sync { + fn get(&self, uid: &str) -> Result, String>; + fn save(&self, garage: &Garage, uid: &str) -> Result<(), String>; + fn delete(&self, uid: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryGarageHotRepository { + state: Arc>>, +} + +impl InMemoryGarageHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl GarageHotRepository for InMemoryGarageHotRepository { + fn get(&self, uid: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(uid).cloned()) + .map_err(|_| "Garage hot state lock poisoned.".to_string()) + } + + fn save(&self, garage: &Garage, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Garage hot state lock poisoned.".to_string())? + .insert(uid.to_string(), garage.clone()); + Ok(()) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Garage hot state lock poisoned.".to_string())? + .remove(uid); + Ok(()) + } +} diff --git a/lib/repositories/src/lib.rs b/lib/repositories/src/lib.rs new file mode 100644 index 0000000..7e64bc6 --- /dev/null +++ b/lib/repositories/src/lib.rs @@ -0,0 +1,21 @@ +pub mod actor; +pub mod bank; +pub mod cad; +pub mod garage; +pub mod locker; +pub mod org; +pub mod phone; +pub mod task; +pub mod v_garage; +pub mod v_locker; + +pub use actor::{ActorHotRepository, ActorRepository, InMemoryActorHotRepository}; +pub use bank::{BankHotRepository, BankRepository, InMemoryBankHotRepository}; +pub use cad::{CadRepository, InMemoryCadRepository}; +pub use garage::{GarageHotRepository, GarageRepository, InMemoryGarageHotRepository}; +pub use locker::{InMemoryLockerHotRepository, LockerHotRepository, LockerRepository}; +pub use org::{InMemoryOrgHotRepository, OrgHotRepository, OrgRepository}; +pub use phone::{InMemoryPhoneRepository, PhoneRepository}; +pub use task::{InMemoryTaskRepository, TaskRepository}; +pub use v_garage::{InMemoryVGarageHotRepository, VGarageHotRepository, VGarageRepository}; +pub use v_locker::{InMemoryVLockerHotRepository, VLockerHotRepository, VLockerRepository}; diff --git a/lib/repositories/src/locker.rs b/lib/repositories/src/locker.rs new file mode 100644 index 0000000..ea35c39 --- /dev/null +++ b/lib/repositories/src/locker.rs @@ -0,0 +1,68 @@ +//! Locker repository implementation for item data persistence operations. +//! +//! This module provides the data access layer for locker management. +//! Each player's locker is stored as a single JSON string containing all their items. + +use forge_models::Locker; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for locker data operations. +pub trait LockerRepository: Send + Sync { + /// Creates a new locker for a player + fn create(&self, uid: &str, locker: &Locker) -> Result<(), String>; + + /// Updates an existing locker with new item data + fn update(&self, uid: &str, locker: &Locker) -> Result<(), String>; + + /// Retrieves a player's locker + fn get(&self, uid: &str) -> Result, String>; + + /// Deletes a player's locker (all items) + fn delete(&self, uid: &str) -> Result<(), String>; + + /// Checks if a player has a locker + fn exists(&self, uid: &str) -> Result; +} + +pub trait LockerHotRepository: Send + Sync { + fn get(&self, uid: &str) -> Result, String>; + fn save(&self, locker: &Locker, uid: &str) -> Result<(), String>; + fn delete(&self, uid: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryLockerHotRepository { + state: Arc>>, +} + +impl InMemoryLockerHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl LockerHotRepository for InMemoryLockerHotRepository { + fn get(&self, uid: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(uid).cloned()) + .map_err(|_| "Locker hot state lock poisoned.".to_string()) + } + + fn save(&self, locker: &Locker, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Locker hot state lock poisoned.".to_string())? + .insert(uid.to_string(), locker.clone()); + Ok(()) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Locker hot state lock poisoned.".to_string())? + .remove(uid); + Ok(()) + } +} diff --git a/lib/repositories/src/org.rs b/lib/repositories/src/org.rs new file mode 100644 index 0000000..1636639 --- /dev/null +++ b/lib/repositories/src/org.rs @@ -0,0 +1,114 @@ +//! Organization repository implementation for data persistence operations. +//! +//! This module provides the data access layer for organization (guild/clan) management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::{HotOrgRecord, MemberSummary, Org, OrgAssetEntry, OrgFleetEntry}; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for organization data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait OrgRepository: Send + Sync { + /// Creates a new organization in the repository. + fn create(&self, org: &Org) -> Result<(), String>; + + /// Retrieves an organization by its unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing organization with new data. + fn update(&self, org: &Org) -> Result<(), String>; + + /// Permanently removes an organization from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an organization exists in the repository. + fn exists(&self, id: &str) -> Result; + + /// Adds a new member UID to an organization. + fn add_member(&self, org_id: &str, member_uid: &str) -> Result<(), String>; + + /// Retrieves all members of an organization as a list of MemberSummary objects. + fn get_members(&self, org_id: &str) -> Result, String>; + + /// Removes a specific member from an organization. + fn remove_member(&self, org_id: &str, member_uid: &str) -> Result<(), String>; + + /// Retrieves all organization assets grouped by category and classname. + fn get_assets( + &self, + org_id: &str, + ) -> Result>, String>; + + /// Replaces the organization asset hash with the provided grouped assets. + fn update_assets( + &self, + org_id: &str, + assets: &HashMap>, + ) -> Result<(), String>; + + /// Retrieves all organization fleet entries. + fn get_fleet(&self, org_id: &str) -> Result, String>; + + /// Replaces the organization fleet hash with the provided fleet entries. + fn update_fleet( + &self, + org_id: &str, + fleet: &HashMap, + ) -> Result<(), String>; +} + +pub trait OrgHotRepository: Send + Sync { + fn get(&self, id: &str) -> Result, String>; + fn keys(&self) -> Result, String>; + fn save(&self, org: &HotOrgRecord) -> Result<(), String>; + fn delete(&self, id: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryOrgHotRepository { + state: Arc>>, +} + +impl InMemoryOrgHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl OrgHotRepository for InMemoryOrgHotRepository { + fn get(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(id).cloned()) + .map_err(|_| "Org hot state lock poisoned.".to_string()) + } + + fn keys(&self) -> Result, String> { + self.state + .read() + .map(|state| state.keys().cloned().collect()) + .map_err(|_| "Org hot state lock poisoned.".to_string()) + } + + fn save(&self, org: &HotOrgRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Org hot state lock poisoned.".to_string())? + .insert(org.id.clone(), org.clone()); + Ok(()) + } + + fn delete(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Org hot state lock poisoned.".to_string())? + .remove(id); + Ok(()) + } +} diff --git a/lib/repositories/src/phone.rs b/lib/repositories/src/phone.rs new file mode 100644 index 0000000..1a0b2b6 --- /dev/null +++ b/lib/repositories/src/phone.rs @@ -0,0 +1,231 @@ +use forge_models::{PhoneEmail, PhoneMessage}; +use std::collections::{HashMap, HashSet}; +use std::sync::{Arc, RwLock}; + +pub trait PhoneRepository: Send + Sync { + fn init(&self, uid: &str) -> Result<(), String>; + fn add_contact(&self, uid: &str, contact_uid: &str) -> Result; + fn remove_contact(&self, uid: &str, contact_uid: &str) -> Result; + fn list_contacts(&self, uid: &str) -> Result, String>; + fn remove_phone(&self, uid: &str) -> Result<(), String>; + + fn append_message(&self, uid: &str, message: PhoneMessage) -> Result<(), String>; + fn list_messages(&self, uid: &str) -> Result, String>; + fn mark_message_read(&self, uid: &str, message_id: &str) -> Result; + fn delete_message(&self, uid: &str, message_id: &str) -> Result; + + fn append_email(&self, uid: &str, email: PhoneEmail) -> Result<(), String>; + fn list_emails(&self, uid: &str) -> Result, String>; + fn mark_email_read(&self, uid: &str, email_id: &str) -> Result; + fn delete_email(&self, uid: &str, email_id: &str) -> Result; + + fn next_sequence(&self) -> Result; +} + +#[derive(Debug, Default)] +struct PhoneState { + contacts: HashMap>, + messages: HashMap>, + emails: HashMap>, + sequence: u64, +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryPhoneRepository { + state: Arc>, +} + +impl InMemoryPhoneRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl PhoneRepository for InMemoryPhoneRepository { + fn init(&self, uid: &str) -> Result<(), String> { + let mut state = self + .state + .write() + .map_err(|_| "Phone state lock poisoned.".to_string())?; + state.contacts.entry(uid.to_string()).or_default(); + state.messages.entry(uid.to_string()).or_default(); + state.emails.entry(uid.to_string()).or_default(); + Ok(()) + } + + fn add_contact(&self, uid: &str, contact_uid: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone contact state lock poisoned.".to_string())?; + Ok(state + .contacts + .entry(uid.to_string()) + .or_default() + .insert(contact_uid.to_string())) + } + + fn remove_contact(&self, uid: &str, contact_uid: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone contact state lock poisoned.".to_string())?; + Ok(state + .contacts + .entry(uid.to_string()) + .or_default() + .remove(contact_uid)) + } + + fn list_contacts(&self, uid: &str) -> Result, String> { + let mut contacts = self + .state + .read() + .map_err(|_| "Phone contact state lock poisoned.".to_string())? + .contacts + .get(uid) + .map(|contacts| contacts.iter().cloned().collect::>()) + .unwrap_or_default(); + contacts.sort(); + Ok(contacts) + } + + fn remove_phone(&self, uid: &str) -> Result<(), String> { + let mut state = self + .state + .write() + .map_err(|_| "Phone state lock poisoned.".to_string())?; + state.contacts.remove(uid); + state.messages.remove(uid); + state.emails.remove(uid); + Ok(()) + } + + fn append_message(&self, uid: &str, message: PhoneMessage) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Phone message state lock poisoned.".to_string())? + .messages + .entry(uid.to_string()) + .or_default() + .push(message); + Ok(()) + } + + fn list_messages(&self, uid: &str) -> Result, String> { + let mut messages = self + .state + .read() + .map_err(|_| "Phone message state lock poisoned.".to_string())? + .messages + .get(uid) + .cloned() + .unwrap_or_default(); + messages.sort_by(|left, right| { + left.timestamp + .partial_cmp(&right.timestamp) + .unwrap_or(std::cmp::Ordering::Equal) + }); + Ok(messages) + } + + fn mark_message_read(&self, uid: &str, message_id: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone message state lock poisoned.".to_string())?; + let Some(messages) = state.messages.get_mut(uid) else { + return Ok(false); + }; + let mut found = false; + for message in messages { + if message.id == message_id { + message.read = true; + found = true; + } + } + Ok(found) + } + + fn delete_message(&self, uid: &str, message_id: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone message state lock poisoned.".to_string())?; + let Some(messages) = state.messages.get_mut(uid) else { + return Ok(false); + }; + let original_len = messages.len(); + messages.retain(|message| message.id != message_id); + Ok(messages.len() != original_len) + } + + fn append_email(&self, uid: &str, email: PhoneEmail) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Phone email state lock poisoned.".to_string())? + .emails + .entry(uid.to_string()) + .or_default() + .push(email); + Ok(()) + } + + fn list_emails(&self, uid: &str) -> Result, String> { + let mut emails = self + .state + .read() + .map_err(|_| "Phone email state lock poisoned.".to_string())? + .emails + .get(uid) + .cloned() + .unwrap_or_default(); + emails.sort_by(|left, right| { + right + .timestamp + .partial_cmp(&left.timestamp) + .unwrap_or(std::cmp::Ordering::Equal) + }); + Ok(emails) + } + + fn mark_email_read(&self, uid: &str, email_id: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone email state lock poisoned.".to_string())?; + let Some(emails) = state.emails.get_mut(uid) else { + return Ok(false); + }; + let mut found = false; + for email in emails { + if email.id == email_id { + email.read = true; + found = true; + } + } + Ok(found) + } + + fn delete_email(&self, uid: &str, email_id: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone email state lock poisoned.".to_string())?; + let Some(emails) = state.emails.get_mut(uid) else { + return Ok(false); + }; + let original_len = emails.len(); + emails.retain(|email| email.id != email_id); + Ok(emails.len() != original_len) + } + + fn next_sequence(&self) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Phone sequence lock poisoned.".to_string())?; + state.sequence += 1; + Ok(state.sequence) + } +} diff --git a/lib/repositories/src/task.rs b/lib/repositories/src/task.rs new file mode 100644 index 0000000..cdd09b3 --- /dev/null +++ b/lib/repositories/src/task.rs @@ -0,0 +1,204 @@ +use forge_models::{TaskOwnershipContext, TaskRecord}; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +pub trait TaskRepository: Send + Sync { + fn reset(&self) -> Result<(), String>; + + fn list_catalog(&self) -> Result, String>; + fn get_catalog_entry(&self, id: &str) -> Result, String>; + fn save_catalog_entry(&self, id: String, entry: TaskRecord) -> Result<(), String>; + fn delete_catalog_entry(&self, id: &str) -> Result<(), String>; + + fn get_ownership(&self, id: &str) -> Result, String>; + fn save_ownership(&self, id: String, ownership: TaskOwnershipContext) -> Result<(), String>; + fn delete_ownership(&self, id: &str) -> Result<(), String>; + + fn list_active_statuses(&self) -> Result, String>; + fn get_active_status(&self, id: &str) -> Result, String>; + fn set_active_status(&self, id: String, status: String) -> Result<(), String>; + fn delete_active_status(&self, id: &str) -> Result<(), String>; + + fn get_completed_status(&self, id: &str) -> Result, String>; + fn set_completed_status(&self, id: String, status: String) -> Result<(), String>; + fn delete_completed_status(&self, id: &str) -> Result<(), String>; + + fn increment_defuse_count(&self, id: &str) -> Result; + fn get_defuse_count(&self, id: &str) -> Result; + fn clear_defuse_count(&self, id: &str) -> Result<(), String>; +} + +#[derive(Debug, Default)] +struct TaskState { + catalog: HashMap, + ownership: HashMap, + active_statuses: HashMap, + completed_statuses: HashMap, + defuse_counts: HashMap, +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryTaskRepository { + state: Arc>, +} + +impl InMemoryTaskRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl TaskRepository for InMemoryTaskRepository { + fn reset(&self) -> Result<(), String> { + let mut state = self + .state + .write() + .map_err(|_| "Task state lock poisoned.".to_string())?; + state.catalog.clear(); + state.ownership.clear(); + state.active_statuses.clear(); + state.completed_statuses.clear(); + state.defuse_counts.clear(); + Ok(()) + } + + fn list_catalog(&self) -> Result, String> { + self.state + .read() + .map(|state| state.catalog.clone()) + .map_err(|_| "Task catalog state lock poisoned.".to_string()) + } + + fn get_catalog_entry(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.catalog.get(id).cloned()) + .map_err(|_| "Task catalog state lock poisoned.".to_string()) + } + + fn save_catalog_entry(&self, id: String, entry: TaskRecord) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task catalog state lock poisoned.".to_string())? + .catalog + .insert(id, entry); + Ok(()) + } + + fn delete_catalog_entry(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task catalog state lock poisoned.".to_string())? + .catalog + .remove(id); + Ok(()) + } + + fn get_ownership(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.ownership.get(id).cloned()) + .map_err(|_| "Task ownership state lock poisoned.".to_string()) + } + + fn save_ownership(&self, id: String, ownership: TaskOwnershipContext) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task ownership state lock poisoned.".to_string())? + .ownership + .insert(id, ownership); + Ok(()) + } + + fn delete_ownership(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task ownership state lock poisoned.".to_string())? + .ownership + .remove(id); + Ok(()) + } + + fn list_active_statuses(&self) -> Result, String> { + self.state + .read() + .map(|state| state.active_statuses.clone()) + .map_err(|_| "Task status state lock poisoned.".to_string()) + } + + fn get_active_status(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.active_statuses.get(id).cloned()) + .map_err(|_| "Task status state lock poisoned.".to_string()) + } + + fn set_active_status(&self, id: String, status: String) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task status state lock poisoned.".to_string())? + .active_statuses + .insert(id, status); + Ok(()) + } + + fn delete_active_status(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task status state lock poisoned.".to_string())? + .active_statuses + .remove(id); + Ok(()) + } + + fn get_completed_status(&self, id: &str) -> Result, String> { + self.state + .read() + .map(|state| state.completed_statuses.get(id).cloned()) + .map_err(|_| "Task completed status state lock poisoned.".to_string()) + } + + fn set_completed_status(&self, id: String, status: String) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task completed status state lock poisoned.".to_string())? + .completed_statuses + .insert(id, status); + Ok(()) + } + + fn delete_completed_status(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task completed status state lock poisoned.".to_string())? + .completed_statuses + .remove(id); + Ok(()) + } + + fn increment_defuse_count(&self, id: &str) -> Result { + let mut state = self + .state + .write() + .map_err(|_| "Task defuse state lock poisoned.".to_string())?; + let next_count = 1 + state.defuse_counts.get(id).copied().unwrap_or_default(); + state.defuse_counts.insert(id.to_string(), next_count); + Ok(next_count) + } + + fn get_defuse_count(&self, id: &str) -> Result { + self.state + .read() + .map(|state| state.defuse_counts.get(id).copied().unwrap_or_default()) + .map_err(|_| "Task defuse state lock poisoned.".to_string()) + } + + fn clear_defuse_count(&self, id: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Task defuse state lock poisoned.".to_string())? + .defuse_counts + .remove(id); + Ok(()) + } +} diff --git a/lib/repositories/src/v_garage.rs b/lib/repositories/src/v_garage.rs new file mode 100644 index 0000000..5c13915 --- /dev/null +++ b/lib/repositories/src/v_garage.rs @@ -0,0 +1,78 @@ +//! Virtual garage repository implementation for item data persistence operations. +//! +//! This module provides the data access layer for virtual garage management. +//! Each player's virtual garage is represented by six category fields: +//! - cars: JSON array of car classnames +//! - armor: JSON array of armor classnames +//! - helis: JSON array of helis classnames +//! - planes: JSON array of plane classnames +//! - naval: JSON array of naval classnames +//! - other: JSON array of other classnames + +use forge_models::VGarage; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for virtual garage data operations. +pub trait VGarageRepository: Send + Sync { + /// Creates a new virtual garage for a player + fn create(&self, uid: &str, garage: &VGarage) -> Result<(), String>; + + /// Updates an existing virtual garage with new item data + fn update(&self, uid: &str, garage: &VGarage) -> Result<(), String>; + + /// Retrieves a player's virtual garage + fn fetch(&self, uid: &str) -> Result, String>; + + /// Retrieves a specific field from a player's virtual garage + /// Fields: "cars", "armor", "helis", "planes", "naval", "other" + fn get(&self, uid: &str, field: &str) -> Result, String>; + + /// Deletes a player's virtual garage (all items) + fn delete(&self, uid: &str) -> Result<(), String>; + + /// Checks if a player has a virtual garage + fn exists(&self, uid: &str) -> Result; +} + +pub trait VGarageHotRepository: Send + Sync { + fn get(&self, uid: &str) -> Result, String>; + fn save(&self, garage: &VGarage, uid: &str) -> Result<(), String>; + fn delete(&self, uid: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryVGarageHotRepository { + state: Arc>>, +} + +impl InMemoryVGarageHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl VGarageHotRepository for InMemoryVGarageHotRepository { + fn get(&self, uid: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(uid).cloned()) + .map_err(|_| "Virtual garage hot state lock poisoned.".to_string()) + } + + fn save(&self, garage: &VGarage, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Virtual garage hot state lock poisoned.".to_string())? + .insert(uid.to_string(), garage.clone()); + Ok(()) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Virtual garage hot state lock poisoned.".to_string())? + .remove(uid); + Ok(()) + } +} diff --git a/lib/repositories/src/v_locker.rs b/lib/repositories/src/v_locker.rs new file mode 100644 index 0000000..d14e768 --- /dev/null +++ b/lib/repositories/src/v_locker.rs @@ -0,0 +1,76 @@ +//! Virtual locker repository implementation for item data persistence operations. +//! +//! This module provides the data access layer for virtual locker management. +//! Each player's virtual locker is represented by four category fields: +//! - items: JSON array of item classnames +//! - weapons: JSON array of weapon classnames +//! - magazines: JSON array of magazine classnames +//! - backpacks: JSON array of backpack classnames + +use forge_models::VLocker; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// Repository trait defining the contract for virtual locker data operations. +pub trait VLockerRepository: Send + Sync { + /// Creates a new virtual locker for a player + fn create(&self, uid: &str, locker: &VLocker) -> Result<(), String>; + + /// Updates an existing virtual locker with new item data + fn update(&self, uid: &str, locker: &VLocker) -> Result<(), String>; + + /// Retrieves a player's virtual locker + fn fetch(&self, uid: &str) -> Result, String>; + + /// Retrieves a specific field from a player's virtual locker + /// Fields: "items", "weapons", "magazines", "backpacks" + fn get(&self, uid: &str, field: &str) -> Result, String>; + + /// Deletes a player's virtual locker (all items) + fn delete(&self, uid: &str) -> Result<(), String>; + + /// Checks if a player has a virtual locker + fn exists(&self, uid: &str) -> Result; +} + +pub trait VLockerHotRepository: Send + Sync { + fn get(&self, uid: &str) -> Result, String>; + fn save(&self, locker: &VLocker, uid: &str) -> Result<(), String>; + fn delete(&self, uid: &str) -> Result<(), String>; +} + +#[derive(Clone, Debug, Default)] +pub struct InMemoryVLockerHotRepository { + state: Arc>>, +} + +impl InMemoryVLockerHotRepository { + pub fn new() -> Self { + Self::default() + } +} + +impl VLockerHotRepository for InMemoryVLockerHotRepository { + fn get(&self, uid: &str) -> Result, String> { + self.state + .read() + .map(|state| state.get(uid).cloned()) + .map_err(|_| "Virtual locker hot state lock poisoned.".to_string()) + } + + fn save(&self, locker: &VLocker, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Virtual locker hot state lock poisoned.".to_string())? + .insert(uid.to_string(), locker.clone()); + Ok(()) + } + + fn delete(&self, uid: &str) -> Result<(), String> { + self.state + .write() + .map_err(|_| "Virtual locker hot state lock poisoned.".to_string())? + .remove(uid); + Ok(()) + } +} diff --git a/lib/services/Cargo.toml b/lib/services/Cargo.toml new file mode 100644 index 0000000..5ddf3b2 --- /dev/null +++ b/lib/services/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "forge-services" +version = "0.1.0" +edition = "2024" + +[dependencies] +forge-models = { path = "../models" } +forge-repositories = { path = "../repositories" } +forge-shared = { path = "../shared" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +uuid = { workspace = true } diff --git a/lib/services/README.md b/lib/services/README.md new file mode 100644 index 0000000..c642953 --- /dev/null +++ b/lib/services/README.md @@ -0,0 +1,18 @@ +# Forge Services + +This crate owns domain behavior for Forge systems. Services depend on +repository traits, which keeps business logic testable with in-memory stores +and independent from the concrete persistence backend. + +## Responsibilities + +- Validate command inputs. +- Apply domain rules and mutation workflows. +- Return structured results for extension/SQF callers. +- Keep persistence details behind repository traits. + +## Test + +```powershell +cargo test -p forge-services +``` diff --git a/lib/services/src/actor.rs b/lib/services/src/actor.rs new file mode 100644 index 0000000..103330b --- /dev/null +++ b/lib/services/src/actor.rs @@ -0,0 +1,325 @@ +//! Actor service layer providing business logic for actor management operations. +//! +//! Implements the service layer of the actor management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::Actor; +use forge_repositories::{ActorHotRepository, ActorRepository}; +use forge_shared::{generate_email, generate_phone_number}; + +/// Service layer implementation for actor business logic and operations. +/// +/// Orchestrates actor management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct ActorService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of actor data, + /// abstracting away the specific database implementation details. + repository: R, +} + +pub struct ActorHotStateService { + service: ActorService, + repository: H, +} + +impl ActorHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: ActorService::new(repository), + repository: hot_repository, + } + } + + pub fn init_actor(&self, key: String) -> Result { + if let Some(actor) = self.repository.get(&key)? { + return Ok(actor); + } + + let actor = self + .service + .repository + .get_by_id(&key)? + .ok_or_else(|| format!("Actor with UID '{}' was not found", key))?; + self.repository.save(&actor)?; + Ok(actor) + } + + pub fn get_actor(&self, key: String) -> Result { + if let Some(actor) = self.repository.get(&key)? { + return Ok(actor); + } + + let actor = self + .service + .repository + .get_by_id(&key)? + .ok_or_else(|| format!("Actor with UID '{}' was not found", key))?; + self.repository.save(&actor)?; + Ok(actor) + } + + pub fn override_actor(&self, key: String, json_data: String) -> Result { + let mut actor: Actor = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Actor JSON: {}", e))?; + + actor.uid = key; + actor + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + self.repository.save(&actor)?; + Ok(actor) + } + + pub fn save_actor(&self, key: String) -> Result { + let actor = self + .repository + .get(&key)? + .ok_or_else(|| format!("Actor with UID '{}' not found in hot state", key))?; + let actor_json = serde_json::to_string(&actor) + .map_err(|e| format!("Failed to serialize actor: {}", e))?; + + let saved_actor = self.service.update_actor(key, actor_json)?; + self.repository.save(&saved_actor)?; + Ok(saved_actor) + } + + pub fn list_actor_keys(&self) -> Result, String> { + self.repository.keys() + } + + pub fn remove_actor(&self, key: String) -> Result<(), String> { + self.repository.delete(&key) + } +} + +impl ActorService { + /// Creates a new actor service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new actor with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create_actor(&self, key: String, json_data: String) -> Result { + // Parse JSON data to Actor struct + let mut actor: Actor = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Actor JSON: {}", e))?; + + // Set UID from parameter (authoritative source) + actor.uid = key; + + // Check if actor already exists to prevent duplicates + if self.repository.exists(&actor.uid)? { + return Err(format!("Actor with UID '{}' already exists", actor.uid)); + } + + // Generate phone number and email if they're empty (for new actors) + if actor.phone_number.is_empty() { + actor.phone_number = generate_phone_number(&actor.uid); + } + if actor.email.is_empty() { + actor.email = generate_email(&actor.phone_number); + } + if actor.organization.trim().is_empty() { + actor.organization = "default".to_string(); + } + + // Validate before persisting + actor + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + // Store the actor in the repository + self.repository.create(&actor)?; + Ok(actor) + } + + /// Retrieves an actor by their unique identifier with automatic fallback creation. + /// + /// Implements a "get-or-create" pattern: if the actor doesn't exist, a new one + /// with default values is returned (but not persisted). + pub fn get_actor(&self, key: String) -> Result { + // Attempt to retrieve actor from repository + match self.repository.get_by_id(&key)? { + // Actor found - return it + Some(actor) => Ok(actor), + // Actor not found - create fallback actor with default values + None => Actor::new(key).map_err(|e| e.to_string()), + } + } + + /// Updates an existing actor with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_actor(&self, key: String, json_update: String) -> Result { + // Retrieve existing actor from repository + let mut actor = match self.repository.get_by_id(&key)? { + Some(actor) => actor, + None => return Err(format!("Actor with UID '{}' not found", key)), + }; + + // Parse and validate JSON update data + let update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + // Create a temporary copy to safely apply updates with validation + let mut updated_actor = actor.clone(); + + // Apply updates field by field + if let Some(obj) = update_data.as_object() { + for (field, value) in obj { + match field.as_str() { + "uid" => { + // Skip UID - it's immutable and set by the system + continue; + } + "name" => { + updated_actor.name = if value.is_null() { + None + } else { + value.as_str().map(|s| s.to_string()) + }; + } + "position" => { + updated_actor.position = if value.is_null() { + None + } else if let Some(arr) = value.as_array() { + let coords: Result, _> = arr + .iter() + .map(|v| v.as_f64().ok_or("Invalid coordinate")) + .collect(); + match coords { + Ok(pos) if pos.len() == 3 => Some(pos), + _ => return Err("Position must be [x, y, z] array".to_string()), + } + } else { + return Err("Position must be an array".to_string()); + }; + } + "direction" => { + if let Some(dir_val) = value.as_f64() { + updated_actor.direction = dir_val % 360.0; + if updated_actor.direction < 0.0 { + updated_actor.direction += 360.0; + } + } else { + return Err("Direction must be a number".to_string()); + } + } + "stance" => { + updated_actor.stance = if value.is_null() { + None + } else { + value.as_str().map(|s| s.to_string()) + }; + } + "email" => { + if let Some(email_str) = value.as_str() { + updated_actor.email = email_str.to_string(); + } else { + return Err("Email must be a string".to_string()); + } + } + "phone_number" => { + if let Some(phone_str) = value.as_str() { + updated_actor.phone_number = phone_str.to_string(); + } else { + return Err("Phone number must be a string".to_string()); + } + } + "state" => { + if let Some(state_str) = value.as_str() { + updated_actor.state = state_str.to_uppercase(); + } else { + return Err("State must be a string".to_string()); + } + } + "holster" => { + if let Some(holster_val) = value.as_bool() { + updated_actor.holster = holster_val; + } else { + return Err("Holster must be a boolean".to_string()); + } + } + "rank" => { + updated_actor.rank = if value.is_null() { + None + } else if let Some(rank_str) = value.as_str() { + Some(rank_str.to_string()) + } else { + return Err("Rank must be a string or null".to_string()); + }; + } + "organization" => { + updated_actor.organization = if value.is_null() { + String::new() + } else if let Some(org_str) = value.as_str() { + org_str.to_string() + } else { + return Err("Organization must be a string or null".to_string()); + }; + } + "loadout" => { + updated_actor.loadout = value.clone(); + } + _ => { + return Err(format!("Unknown field: {}", field)); + } + } + } + } + + // Validate the updated actor before committing changes + updated_actor + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + // Only commit changes after validation passes + actor = updated_actor; + + // Persist the updated actor to repository + self.repository.update(&actor)?; + + Ok(actor) + } + + /// Permanently deletes an actor from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_actor(&self, key: String) -> Result<(), String> { + // Delegate deletion to repository layer + // Future enhancements could add business logic here: + // - Authorization checks + // - Audit logging + // - Cascade deletion + // - Soft deletion + self.repository.delete(&key) + } + + /// Checks if an actor exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn actor_exists(&self, key: String) -> Result { + // Delegate existence check to repository layer + // This is a lightweight operation that doesn't retrieve data + self.repository.exists(&key) + } +} diff --git a/lib/services/src/bank.rs b/lib/services/src/bank.rs new file mode 100644 index 0000000..8ea32af --- /dev/null +++ b/lib/services/src/bank.rs @@ -0,0 +1,634 @@ +//! Bank service layer providing business logic for bank management operations. +//! +//! Implements the service layer of the bank management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::{ + Bank, BankCheckoutContext, BankMutationResult, BankOperationContext, BankPinContext, + BankTransferContext, BankTransferResult, +}; +use forge_repositories::{BankHotRepository, BankRepository}; +use serde_json::{Value, json}; +use std::collections::HashMap; + +/// Service layer implementation for bank business logic and operations. +/// +/// Orchestrates bank management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct BankService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of bank data, + /// abstracting away the specific database implementation details. + repository: R, +} + +pub struct BankHotStateService { + service: BankService, + repository: H, +} + +impl BankHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: BankService::new(repository), + repository: hot_repository, + } + } + + pub fn init_bank(&self, key: String) -> Result { + if let Some(bank) = self.repository.get(&key)? { + return Ok(bank); + } + + let bank = self.service.get_bank(key)?; + self.repository.save(&bank)?; + Ok(bank) + } + + pub fn get_bank(&self, key: String) -> Result { + self.init_bank(key) + } + + pub fn override_bank(&self, key: String, json_data: String) -> Result { + let mut bank: Bank = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Bank JSON: {}", e))?; + + bank.uid = key; + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + self.repository.save(&bank)?; + Ok(bank) + } + + pub fn patch_bank( + &self, + key: String, + json_patch: String, + ) -> Result { + let patch_value: Value = + serde_json::from_str(&json_patch).map_err(|e| format!("Invalid patch JSON: {}", e))?; + let patch_object = patch_value + .as_object() + .ok_or_else(|| "Patch data must be a JSON object".to_string())?; + + let mut bank = self.get_bank(key.clone())?; + let mut patch = HashMap::new(); + + for (field, value) in patch_object { + apply_bank_field(&mut bank, field, value)?; + patch.insert(field.clone(), current_bank_field_value(&bank, field)?); + } + + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + self.repository.save(&bank)?; + + Ok(BankMutationResult { + account: bank, + patch, + }) + } + + pub fn charge_checkout( + &self, + key: String, + amount: f64, + context: BankCheckoutContext, + ) -> Result { + if amount <= 0.0 { + return Err("Checkout amount must be greater than zero".to_string()); + } + + let mut bank = self.get_bank(key)?; + let source_field = match context.source_field.trim().to_ascii_lowercase().as_str() { + "cash" => "cash", + "bank" => "bank", + _ => return Err("Selected bank payment source is unsupported.".to_string()), + }; + + let source_balance = match source_field { + "cash" => bank.cash, + _ => bank.bank, + }; + if source_balance < amount { + return Err(match source_field { + "cash" => "Cash on hand cannot cover this checkout.".to_string(), + _ => "Bank balance cannot cover this checkout.".to_string(), + }); + } + + match source_field { + "cash" => bank.cash -= amount, + _ => bank.bank -= amount, + } + + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + if context.commit { + self.repository.save(&bank)?; + } + + Ok(BankMutationResult { + account: bank.clone(), + patch: build_patch(&bank, &[source_field])?, + }) + } + + pub fn deposit( + &self, + key: String, + amount: f64, + context: BankOperationContext, + ) -> Result { + if amount <= 0.0 { + return Err("Deposit amount must be greater than zero".to_string()); + } + validate_atm_access(&context, "deposit")?; + + let mut bank = self.get_bank(key)?; + if bank.cash < amount { + return Err("Cash on hand cannot cover that deposit.".to_string()); + } + + bank.cash -= amount; + bank.bank += amount; + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + self.repository.save(&bank)?; + + Ok(BankMutationResult { + account: bank.clone(), + patch: build_patch(&bank, &["bank", "cash"])?, + }) + } + + pub fn withdraw( + &self, + key: String, + amount: f64, + context: BankOperationContext, + ) -> Result { + if amount <= 0.0 { + return Err("Withdrawal amount must be greater than zero".to_string()); + } + validate_atm_access(&context, "withdrawal")?; + + let mut bank = self.get_bank(key)?; + if bank.bank < amount { + return Err("Bank balance cannot cover that withdrawal.".to_string()); + } + + bank.bank -= amount; + bank.cash += amount; + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + self.repository.save(&bank)?; + + Ok(BankMutationResult { + account: bank.clone(), + patch: build_patch(&bank, &["bank", "cash"])?, + }) + } + + pub fn deposit_earnings( + &self, + key: String, + amount: f64, + context: BankOperationContext, + ) -> Result { + if amount <= 0.0 { + return Err("Deposit earnings amount must be greater than zero".to_string()); + } + validate_bank_mode(&context, "Earnings deposits")?; + + let mut bank = self.get_bank(key)?; + if bank.earnings < amount { + return Err("Pending earnings cannot cover that deposit request.".to_string()); + } + + bank.bank += amount; + bank.earnings -= amount; + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + self.repository.save(&bank)?; + + Ok(BankMutationResult { + account: bank.clone(), + patch: build_patch(&bank, &["bank", "earnings"])?, + }) + } + + pub fn transfer( + &self, + source_key: String, + target_key: String, + context: BankTransferContext, + amount: f64, + ) -> Result { + if amount <= 0.0 { + return Err("Transfer amount must be greater than zero".to_string()); + } + validate_bank_mode( + &BankOperationContext { + mode: context.mode.clone(), + atm_authorized: context.atm_authorized, + }, + "Transfers", + )?; + if source_key == target_key { + return Err("You cannot transfer funds to yourself.".to_string()); + } + + let mut source_account = self.get_bank(source_key)?; + let mut target_account = self.get_bank(target_key)?; + let source_field = match context.from_field.trim().to_ascii_lowercase().as_str() { + "cash" => "cash", + _ => "bank", + }; + + let source_balance = match source_field { + "cash" => source_account.cash, + _ => source_account.bank, + }; + if source_balance < amount { + return Err(match source_field { + "cash" => "Cash on hand cannot cover that transfer.".to_string(), + _ => "Bank balance cannot cover that transfer.".to_string(), + }); + } + + match source_field { + "cash" => source_account.cash -= amount, + _ => source_account.bank -= amount, + } + target_account.bank += amount; + + source_account + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + target_account + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + self.repository.save(&source_account)?; + self.repository.save(&target_account)?; + + Ok(BankTransferResult { + source_patch: build_patch(&source_account, &[source_field])?, + source_account, + target_patch: build_patch(&target_account, &["bank"])?, + target_account, + }) + } + + pub fn validate_pin( + &self, + key: String, + pin: String, + context: BankPinContext, + ) -> Result<(), String> { + if !context.mode.eq_ignore_ascii_case("atm") { + return Err("PIN entry is only available from an ATM session.".to_string()); + } + + if pin.len() != 4 || !pin.chars().all(|character| character.is_ascii_digit()) { + return Err("Enter your four-digit access PIN.".to_string()); + } + + let bank = self.get_bank(key)?; + if pin != bank.pin.to_string() { + return Err("Incorrect PIN.".to_string()); + } + + Ok(()) + } + + pub fn change_pin( + &self, + key: String, + current_pin: String, + new_pin: String, + context: BankPinContext, + ) -> Result { + let mode = context.mode.trim(); + if !mode.eq_ignore_ascii_case("bank") { + return Err("PIN changes are only available from the full bank interface.".to_string()); + } + + if !is_four_digit_pin(¤t_pin) { + return Err("Enter your current four-digit PIN.".to_string()); + } + if !is_four_digit_pin(&new_pin) { + return Err("Choose a new four-digit PIN.".to_string()); + } + if current_pin == new_pin { + return Err("Choose a different PIN from your current PIN.".to_string()); + } + + let mut bank = self.get_bank(key)?; + if current_pin != bank.pin.to_string() { + return Err("Current PIN is incorrect.".to_string()); + } + + bank.pin = new_pin + .parse::() + .map_err(|error| format!("Invalid new PIN: {}", error))?; + bank.validate() + .map_err(|e| format!("Validation failed: {}", e))?; + self.repository.save(&bank)?; + + Ok(BankMutationResult { + account: bank.clone(), + patch: build_patch(&bank, &["pin"])?, + }) + } + + pub fn save_bank(&self, key: String) -> Result { + let bank = self + .repository + .get(&key)? + .ok_or_else(|| format!("Bank with UID '{}' not found in hot state", key))?; + let bank_json = + serde_json::to_string(&bank).map_err(|e| format!("Failed to serialize bank: {}", e))?; + + let saved_bank = self.service.update_bank(key, bank_json)?; + self.repository.save(&saved_bank)?; + Ok(saved_bank) + } + + pub fn remove_bank(&self, key: String) -> Result<(), String> { + self.repository.delete(&key) + } +} + +fn apply_bank_field(bank: &mut Bank, field: &str, value: &Value) -> Result<(), String> { + match field { + "uid" => Ok(()), + "name" => { + bank.name = value + .as_str() + .ok_or_else(|| "Name must be a string".to_string())? + .to_string(); + Ok(()) + } + "bank" => { + bank.bank = value + .as_f64() + .ok_or_else(|| "Bank balance must be a number".to_string())?; + Ok(()) + } + "cash" => { + bank.cash = value + .as_f64() + .ok_or_else(|| "Cash must be a number".to_string())?; + Ok(()) + } + "earnings" => { + bank.earnings = value + .as_f64() + .ok_or_else(|| "Earnings must be a number".to_string())?; + Ok(()) + } + "pin" => { + bank.pin = value + .as_u64() + .ok_or_else(|| "PIN must be a number".to_string())?; + Ok(()) + } + "transactions" => { + let values = value + .as_array() + .ok_or_else(|| "Transactions must be an array".to_string())?; + bank.transactions = values + .iter() + .map(|entry| { + entry + .as_str() + .map(|item| item.to_string()) + .ok_or_else(|| "Transactions must contain strings".to_string()) + }) + .collect::, _>>()?; + Ok(()) + } + _ => Err(format!("Unknown field: {}", field)), + } +} + +fn current_bank_field_value(bank: &Bank, field: &str) -> Result { + match field { + "uid" => Ok(json!(bank.uid)), + "name" => Ok(json!(bank.name)), + "bank" => Ok(json!(bank.bank)), + "cash" => Ok(json!(bank.cash)), + "earnings" => Ok(json!(bank.earnings)), + "pin" => Ok(json!(bank.pin)), + "transactions" => Ok(json!(bank.transactions)), + _ => Err(format!("Unknown field: {}", field)), + } +} + +fn build_patch(bank: &Bank, fields: &[&str]) -> Result, String> { + let mut patch = HashMap::new(); + for field in fields { + patch.insert((*field).to_string(), current_bank_field_value(bank, field)?); + } + Ok(patch) +} + +fn is_four_digit_pin(pin: &str) -> bool { + pin.len() == 4 && pin.chars().all(|character| character.is_ascii_digit()) +} + +fn validate_atm_access(context: &BankOperationContext, action: &str) -> Result<(), String> { + if context.mode.eq_ignore_ascii_case("atm") && !context.atm_authorized { + return Err(format!("ATM authorization is required before {}.", action)); + } + + Ok(()) +} + +fn validate_bank_mode(context: &BankOperationContext, action: &str) -> Result<(), String> { + if !context.mode.eq_ignore_ascii_case("bank") { + return Err(format!( + "{} are only available from the full bank interface.", + action + )); + } + + Ok(()) +} + +impl BankService { + /// Creates a new bank service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new bank with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create(&self, key: String, json_data: String) -> Result { + // Parse JSON data to Bank struct + let mut bank: Bank = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Bank JSON: {}", e))?; + + // Set UID from parameter (authoritative source) + bank.uid = key; + + // Check if bank already exists to prevent duplicates + if self.repository.exists(&bank.uid)? { + return Err(format!("Bank with uid '{}' already exists", bank.uid)); + } + + if let Err(e) = bank.validate() { + return Err(format!("Invalid Bank JSON: {}", e)); + } + + self.repository.create(&bank)?; + + Ok(bank) + } + + /// Retrieves an bank by their unique identifier with automatic fallback creation. + /// + /// Implements a "get-or-create" pattern: if the bank doesn't exist, a new one + /// with default values is returned (but not persisted). + pub fn get_bank(&self, key: String) -> Result { + // Attempt to retrieve bank from repository + match self.repository.get_by_id(&key)? { + // Bank found - return it + Some(bank) => Ok(bank), + // Bank not found - create fallback bank with default values + None => Err(format!("Bank with UID '{}' not found", key)), + } + } + + /// Updates an existing bank with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_bank(&self, key: String, json_update: String) -> Result { + // Retrieve existing bank from repository + let mut bank = match self.repository.get_by_id(&key)? { + Some(bank) => bank, + None => return Err(format!("Bank with UID '{}' not found", key)), + }; + + // Parse and validate JSON update data + let update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + // Create a temporary copy to safely apply updates with validation + let mut updated_bank = bank.clone(); + + // Apply updates field by field + if let Some(obj) = update_data.as_object() { + for (field, value) in obj { + match field.as_str() { + "uid" => { + // Skip UID - it's immutable and set by the system + continue; + } + "name" => { + if let Some(name) = value.as_str() { + updated_bank.name = name.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "bank" => { + if let Some(bank_val) = value.as_f64() { + updated_bank.bank = bank_val; + } else { + return Err("Bank balance must be a number".to_string()); + } + } + "cash" => { + if let Some(cash_val) = value.as_f64() { + updated_bank.cash = cash_val; + } else { + return Err("Cash must be a number".to_string()); + } + } + "earnings" => { + if let Some(earnings_val) = value.as_f64() { + updated_bank.earnings = earnings_val; + } else { + return Err("Earnings must be a number".to_string()); + } + } + "pin" => { + if let Some(pin_val) = value.as_u64() { + updated_bank.pin = pin_val; + } else { + return Err("PIN must be a number".to_string()); + } + } + "transactions" => { + if let Some(arr) = value.as_array() { + updated_bank.transactions = arr + .iter() + .filter_map(|v| v.as_str().map(|s| s.to_string())) + .collect(); + } else { + return Err("Transactions must be an array".to_string()); + } + } + _ => { + return Err(format!("Unknown field: {}", field)); + } + } + } + } + + // Validate the updated bank before committing changes + updated_bank + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + // Only commit changes after validation passes + bank = updated_bank; + + // Persist the updated bank to repository + self.repository.update(&bank)?; + + Ok(bank) + } + + /// Permanently deletes an bank from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_bank(&self, key: String) -> Result<(), String> { + // Delegate deletion to repository layer + // Future enhancements could add business logic here: + // - Authorization checks + // - Audit logging + // - Cascade deletion + // - Soft deletion + self.repository.delete(&key) + } + + /// Checks if an bank exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn bank_exists(&self, key: String) -> Result { + // Delegate existence check to repository layer + // This is a lightweight operation that doesn't retrieve data + self.repository.exists(&key) + } +} diff --git a/lib/services/src/cad.rs b/lib/services/src/cad.rs new file mode 100644 index 0000000..f79cb84 --- /dev/null +++ b/lib/services/src/cad.rs @@ -0,0 +1,1169 @@ +use forge_models::{ + CadActivityEntry, CadAssignmentMutationResult, CadDispatchOrderContextSeed, + CadDispatchOrderCreateSeed, CadDispatchOrderMutationResult, CadGroupBuildSeed, + CadGroupProfileMutationResult, CadGroupProfileUpdateSeed, CadHydratePayload, CadHydrateSeed, + CadRecord, CadRequestMutationResult, CadSession, CadSupportRequestSubmitSeed, +}; +use forge_repositories::CadRepository; +use serde_json::{Map, Value}; +use std::collections::HashMap; + +const CAD_ACTIVITY_LIMIT: usize = 200; +const CAD_RECENT_ACTIVITY_LIMIT: usize = 50; + +pub struct CadStateService { + repository: R, +} + +impl CadStateService { + pub fn new(repository: R) -> Self { + Self { repository } + } + + pub fn append_activity(&self, json_data: String) -> Result<(), String> { + let entry = Self::parse_value(&json_data)?; + self.repository.append_activity(entry) + } + + pub fn recent_activity(&self, limit: String) -> Result, String> { + let parsed_limit = limit + .trim() + .parse::() + .ok() + .filter(|value| *value > 0) + .unwrap_or(CAD_RECENT_ACTIVITY_LIMIT) + .min(CAD_ACTIVITY_LIMIT); + + self.repository.recent_activity(parsed_limit) + } + + pub fn list_assignments(&self) -> Result, String> { + Ok(Self::records_to_values(self.repository.list_assignments()?)) + } + + pub fn assign_assignment( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let mut assignment = Self::parse_record(&json_data)?; + Self::set_task_id(&mut assignment, &entry_id); + self.repository + .save_assignment(entry_id.clone(), assignment.clone())?; + + let assignee = Self::display_group_name(&assignment.fields); + let assigned_by = Self::string_field(&assignment.fields, "assignedByName") + .unwrap_or_else(|| "Dispatcher".to_string()); + let group_id = Self::string_field(&assignment.fields, "groupId").unwrap_or_default(); + let actor_uid = Self::string_field(&assignment.fields, "assignedByUid").unwrap_or_default(); + Ok(CadAssignmentMutationResult { + assignment: assignment.into_value(), + message: "Task assigned.".to_string(), + activity: Self::build_activity( + "task_assigned", + format!("{assigned_by} assigned {entry_id} to {assignee}."), + entry_id, + group_id, + actor_uid, + ), + }) + } + + pub fn acknowledge_assignment( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let patch = Self::parse_record(&json_data)?; + let existing = self + .repository + .get_assignment(&entry_id)? + .ok_or_else(|| "CAD assignment could not be resolved.".to_string())?; + let merged = existing.merge(patch); + self.repository.save_assignment(entry_id, merged.clone())?; + Ok(CadAssignmentMutationResult { + assignment: merged.to_value(), + message: "Task acknowledged.".to_string(), + activity: Self::build_activity( + "task_acknowledged", + format!( + "{} acknowledged {}.", + Self::string_field(&merged.fields, "acknowledgedByUid").unwrap_or_default(), + Self::string_field(&merged.fields, "taskId").unwrap_or_default() + ), + Self::string_field(&merged.fields, "taskId").unwrap_or_default(), + Self::string_field(&merged.fields, "groupId").unwrap_or_default(), + Self::string_field(&merged.fields, "acknowledgedByUid").unwrap_or_default(), + ), + }) + } + + pub fn decline_assignment( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let patch = Self::parse_record(&json_data)?; + let existing = self + .repository + .get_assignment(&entry_id)? + .ok_or_else(|| "CAD assignment could not be resolved.".to_string())?; + let merged = existing.merge(patch); + self.repository.delete_assignment(&entry_id)?; + Ok(CadAssignmentMutationResult { + assignment: merged.to_value(), + message: "Task declined and returned to the contract board.".to_string(), + activity: Self::build_activity( + "task_declined", + format!( + "{} declined {}.", + Self::string_field(&merged.fields, "declinedByUid").unwrap_or_default(), + Self::string_field(&merged.fields, "taskId").unwrap_or_default() + ), + Self::string_field(&merged.fields, "taskId").unwrap_or_default(), + Self::string_field(&merged.fields, "groupId").unwrap_or_default(), + Self::string_field(&merged.fields, "declinedByUid").unwrap_or_default(), + ), + }) + } + + pub fn upsert_assignment(&self, entry_id: String, json_data: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + let entry = Self::parse_record(&json_data)?; + self.repository.save_assignment(entry_id, entry) + } + + pub fn delete_assignment(&self, entry_id: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_assignment(&entry_id) + } + + pub fn list_orders(&self) -> Result, String> { + Ok(Self::records_to_values(self.repository.list_orders()?)) + } + + pub fn create_order( + &self, + json_data: String, + ) -> Result { + let payload = serde_json::from_str::(&json_data) + .map_err(|error| format!("Invalid CAD order payload: {error}"))?; + + if payload.order.is_empty() { + return Err("Order payload is required.".to_string()); + } + if payload.assignment.is_empty() { + return Err("Assignment payload is required.".to_string()); + } + + let task_id = self.repository.next_order_id()?; + let mut order = payload.order; + let mut assignment = payload.assignment; + + Self::set_task_id(&mut order, &task_id); + order + .fields + .insert("isDispatchOrder".to_string(), Value::Bool(true)); + + Self::set_task_id(&mut assignment, &task_id); + + self.repository.save_order(task_id.clone(), order.clone())?; + self.repository + .save_assignment(task_id.clone(), assignment.clone())?; + + Ok(CadDispatchOrderMutationResult { + task_id: task_id.clone(), + order: order.to_value(), + assignment: assignment.to_value(), + message: "Dispatch order created.".to_string(), + activity: Self::build_activity( + "dispatch_order_created", + format!( + "{} created backup order {task_id} for {} to support {}.", + Self::string_field(&order.fields, "createdByName") + .unwrap_or_else(|| "Dispatcher".to_string()), + Self::display_group_name(&assignment.fields), + Self::string_field(&order.fields, "targetGroupCallsign") + .unwrap_or_else(|| Self::string_field(&order.fields, "targetGroupId") + .unwrap_or_else(|| "target group".to_string())) + ), + task_id, + Self::string_field(&assignment.fields, "groupId").unwrap_or_default(), + Self::string_field(&order.fields, "createdByUid").unwrap_or_default(), + ), + }) + } + + pub fn create_order_from_context( + &self, + json_data: String, + ) -> Result { + let seed = serde_json::from_str::(&json_data) + .map_err(|error| format!("Invalid CAD order context: {error}"))?; + + if seed.assignee_group_id.trim().is_empty() || seed.target_group_id.trim().is_empty() { + return Err("Assignee and target groups are required.".to_string()); + } + + let final_priority = Self::normalize_priority(&seed.priority); + let target_callsign = + Self::fallback_string(&seed.target_group_callsign, &seed.target_group_id); + let created_by_name = Self::fallback_string(&seed.created_by_name, "Dispatcher"); + let assignee_callsign = + Self::fallback_string(&seed.assignee_group_callsign, &seed.assignee_group_id); + + let order = CadRecord { + fields: Map::from_iter([ + ( + "title".to_string(), + Value::String(format!("Backup {target_callsign}")), + ), + ( + "description".to_string(), + Value::String(if seed.note.trim().is_empty() { + format!( + "Dispatch order to back up {target_callsign} at its current position." + ) + } else { + seed.note.clone() + }), + ), + ( + "type".to_string(), + Value::String("dispatch_order".to_string()), + ), + ("priority".to_string(), Value::String(final_priority)), + ("position".to_string(), seed.target_position.clone()), + ( + "targetGroupId".to_string(), + Value::String(seed.target_group_id.clone()), + ), + ( + "targetGroupCallsign".to_string(), + Value::String(target_callsign.clone()), + ), + ( + "createdByUid".to_string(), + Value::String(seed.created_by_uid.clone()), + ), + ( + "createdByName".to_string(), + Value::String(created_by_name.clone()), + ), + ( + "sourceRequestId".to_string(), + Value::String(seed.request_id.clone()), + ), + ( + "sourceRequestType".to_string(), + Value::String(seed.request_type.clone()), + ), + ( + "sourceRequestTitle".to_string(), + Value::String(seed.request_title.clone()), + ), + ( + "sourceRequestSummary".to_string(), + Value::String(seed.request_summary.clone()), + ), + ( + "sourceRequestFields".to_string(), + seed.request_fields.to_value(), + ), + ("createdAt".to_string(), Value::from(seed.created_at)), + ("note".to_string(), Value::String(seed.note.clone())), + ("isDispatchOrder".to_string(), Value::Bool(true)), + ]), + }; + + let assignment = CadRecord { + fields: Map::from_iter([ + ( + "groupId".to_string(), + Value::String(seed.assignee_group_id.clone()), + ), + ( + "assigneeGroupCallsign".to_string(), + Value::String(assignee_callsign.clone()), + ), + ( + "assignedByUid".to_string(), + Value::String(seed.created_by_uid.clone()), + ), + ( + "assignedByName".to_string(), + Value::String(created_by_name.clone()), + ), + ("assignedAt".to_string(), Value::from(seed.created_at)), + ("state".to_string(), Value::String("assigned".to_string())), + ("note".to_string(), Value::String(seed.note)), + ]), + }; + + let payload = CadDispatchOrderCreateSeed { order, assignment }; + self.create_order( + serde_json::to_string(&payload) + .map_err(|error| format!("Failed to serialize CAD order payload: {error}"))?, + ) + } + + pub fn close_order(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let order = self + .repository + .get_order(&entry_id)? + .ok_or_else(|| "CAD order could not be resolved.".to_string())?; + let assignment = self.repository.get_assignment(&entry_id)?; + + self.repository.delete_order(&entry_id)?; + self.repository.delete_assignment(&entry_id)?; + + Ok(CadDispatchOrderMutationResult { + task_id: entry_id.clone(), + order: order.to_value(), + assignment: assignment.map_or(Value::Null, CadRecord::into_value), + message: "Dispatch order closed.".to_string(), + activity: Self::build_activity( + "dispatch_order_closed", + format!("{entry_id} was closed."), + entry_id, + Self::string_field(&order.fields, "groupId").unwrap_or_default(), + String::new(), + ), + }) + } + + pub fn upsert_order(&self, entry_id: String, json_data: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + let entry = Self::parse_record(&json_data)?; + self.repository.save_order(entry_id, entry) + } + + pub fn delete_order(&self, entry_id: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_order(&entry_id) + } + + pub fn list_requests(&self) -> Result, String> { + Ok(Self::records_to_values(self.repository.list_requests()?)) + } + + pub fn submit_request(&self, json_data: String) -> Result { + let mut request = Self::parse_record(&json_data)?; + let request_id = self.repository.next_request_id()?; + request + .fields + .insert("requestId".to_string(), Value::String(request_id.clone())); + self.repository.save_request(request_id, request.clone())?; + Ok(CadRequestMutationResult { + request: request.to_value(), + message: "Support request submitted.".to_string(), + activity: Self::build_activity( + "support_request_submitted", + format!( + "{} submitted {}.", + Self::string_field(&request.fields, "groupCallsign") + .unwrap_or_else(|| "Unknown Group".to_string()), + Self::string_field(&request.fields, "title") + .unwrap_or_else(|| "support request".to_string()) + ), + Self::string_field(&request.fields, "requestId").unwrap_or_default(), + Self::string_field(&request.fields, "groupId").unwrap_or_default(), + Self::string_field(&request.fields, "submittedByUid").unwrap_or_default(), + ), + }) + } + + pub fn submit_request_from_context( + &self, + json_data: String, + ) -> Result { + let seed = serde_json::from_str::(&json_data) + .map_err(|error| format!("Invalid CAD support request context: {error}"))?; + + if seed.request_type.trim().is_empty() { + return Err("Support request type is required.".to_string()); + } + if seed.group_id.trim().is_empty() { + return Err("Group ID is required.".to_string()); + } + + let request_type = seed.request_type.to_lowercase(); + let group_callsign = Self::fallback_string(&seed.group_callsign, &seed.group_id); + let request = CadRecord { + fields: Map::from_iter([ + ("type".to_string(), Value::String(request_type.clone())), + ( + "title".to_string(), + Value::String(Self::build_request_title(&request_type, &group_callsign)), + ), + ( + "summary".to_string(), + Value::String(Self::build_request_summary( + &request_type, + &seed.fields.fields, + &group_callsign, + )), + ), + ("groupId".to_string(), Value::String(seed.group_id)), + ( + "groupCallsign".to_string(), + Value::String(group_callsign.clone()), + ), + ( + "submittedByUid".to_string(), + Value::String(seed.submitted_by_uid), + ), + ( + "submittedByName".to_string(), + Value::String(Self::fallback_string( + &seed.submitted_by_name, + &group_callsign, + )), + ), + ("fields".to_string(), seed.fields.into_value()), + ( + "priority".to_string(), + Value::String(Self::normalize_priority(&seed.priority)), + ), + ("position".to_string(), seed.position), + ("createdAt".to_string(), Value::from(seed.created_at)), + ]), + }; + + self.submit_request( + serde_json::to_string(&request) + .map_err(|error| format!("Failed to serialize CAD request payload: {error}"))?, + ) + } + + pub fn close_request(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let request = self + .repository + .get_request(&entry_id)? + .ok_or_else(|| "CAD request could not be resolved.".to_string())?; + self.repository.delete_request(&entry_id)?; + Ok(CadRequestMutationResult { + request: request.to_value(), + message: "Support request closed.".to_string(), + activity: Self::build_activity( + "support_request_closed", + format!( + "{} was closed.", + Self::string_field(&request.fields, "title").unwrap_or(entry_id.clone()) + ), + entry_id, + Self::string_field(&request.fields, "groupId").unwrap_or_default(), + String::new(), + ), + }) + } + + pub fn upsert_request(&self, entry_id: String, json_data: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + let entry = Self::parse_record(&json_data)?; + self.repository.save_request(entry_id, entry) + } + + pub fn delete_request(&self, entry_id: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_request(&entry_id) + } + + pub fn list_profiles(&self) -> Result, String> { + Ok(Self::records_to_values(self.repository.list_profiles()?)) + } + + pub fn update_profile_from_context( + &self, + json_data: String, + ) -> Result { + let seed = serde_json::from_str::(&json_data) + .map_err(|error| format!("Invalid CAD group profile context: {error}"))?; + + let group_id = Self::validate_entry_id(seed.group_id)?; + let mode = if seed.mode.trim().is_empty() { + "profile".to_string() + } else { + seed.mode.to_lowercase() + }; + + let current_role = Self::fallback_string(&seed.current_role, "infantry"); + let current_status = Self::fallback_string(&seed.current_status, "available"); + let final_role = if seed.role.trim().is_empty() { + current_role.clone() + } else { + seed.role.to_lowercase() + }; + let final_status = if seed.status.trim().is_empty() { + current_status.clone() + } else { + seed.status.to_lowercase() + }; + + let changed = current_role != final_role || current_status != final_status; + let callsign = Self::fallback_string(&seed.group_callsign, &group_id); + + let profile = if changed { + let patch = CadRecord { + fields: Map::from_iter([ + ("groupId".to_string(), Value::String(group_id.clone())), + ("role".to_string(), Value::String(final_role.clone())), + ("status".to_string(), Value::String(final_status.clone())), + ]), + }; + let existing = self.repository.get_profile(&group_id)?.unwrap_or_default(); + let merged = existing.merge(patch); + self.repository + .save_profile(group_id.clone(), merged.clone())?; + merged + } else { + CadRecord { + fields: Map::from_iter([ + ("groupId".to_string(), Value::String(group_id.clone())), + ("role".to_string(), Value::String(current_role.clone())), + ("status".to_string(), Value::String(current_status.clone())), + ]), + } + }; + + let message = if changed { + match mode.as_str() { + "status" => "Group status updated.".to_string(), + "role" => "Group role updated.".to_string(), + _ => "Group profile updated.".to_string(), + } + } else { + match mode.as_str() { + "status" => "Group status already up to date.".to_string(), + "role" => "Group role already up to date.".to_string(), + _ => "Group profile already up to date.".to_string(), + } + }; + + let activity = if changed { + match mode.as_str() { + "status" => Self::build_activity( + "group_status", + format!( + "{} updated {} to {}.", + seed.requester_uid, callsign, final_status + ), + String::new(), + group_id.clone(), + seed.requester_uid.clone(), + ), + "role" => Self::build_activity( + "group_role", + format!( + "{} updated {} role to {}.", + seed.requester_uid, callsign, final_role + ), + String::new(), + group_id.clone(), + seed.requester_uid.clone(), + ), + _ => { + let mut parts = Vec::new(); + if current_role != final_role { + parts.push(format!("role to {}", final_role)); + } + if current_status != final_status { + parts.push(format!("status to {}", final_status)); + } + Self::build_activity( + "group_profile", + format!( + "{} updated {} {}.", + seed.requester_uid, + callsign, + parts.join(" and ") + ), + String::new(), + group_id.clone(), + seed.requester_uid.clone(), + ) + } + } + } else { + CadActivityEntry::default() + }; + + Ok(CadGroupProfileMutationResult { + profile: profile.into_value(), + message, + activity, + changed, + }) + } + + pub fn build_groups(&self, json_data: String) -> Result, String> { + let seed: CadGroupBuildSeed = serde_json::from_str(&json_data) + .map_err(|error| format!("Invalid CAD group seed: {error}"))?; + let profiles = self.repository.list_profiles()?; + + let mut groups = Vec::with_capacity(seed.live_groups.len()); + for group in seed.live_groups { + let Some(mut entry) = Self::as_object_clone(&group) else { + continue; + }; + + let group_id = Self::string_field(&entry, "groupId").unwrap_or_default(); + if group_id.is_empty() { + continue; + } + + if let Some(profile) = profiles.get(&group_id) { + if let Some(role) = Self::string_field(&profile.fields, "role") { + entry.insert("role".to_string(), Value::String(role)); + } + if let Some(status) = Self::string_field(&profile.fields, "status") { + entry.insert("status".to_string(), Value::String(status)); + } + } + + groups.push(Value::Object(entry)); + } + + Ok(groups) + } + + pub fn upsert_profile(&self, entry_id: String, json_data: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + let entry = Self::parse_record(&json_data)?; + self.repository.save_profile(entry_id, entry) + } + + pub fn delete_profile(&self, entry_id: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_profile(&entry_id) + } + + pub fn build_hydrate_payload(&self, json_data: String) -> Result { + let seed: CadHydrateSeed = serde_json::from_str(&json_data) + .map_err(|error| format!("Invalid CAD hydrate seed: {error}"))?; + + let assignments = self.repository.list_assignments()?; + let dispatch_orders = self.repository.list_orders()?; + let requests = self.repository.list_requests()?; + let activity = self.repository.snapshot_activity()?; + + Ok(CadViewService::build_hydrate_payload( + seed, + assignments, + dispatch_orders, + requests, + activity, + )) + } + + fn validate_entry_id(entry_id: String) -> Result { + if entry_id.trim().is_empty() { + return Err("Entry ID is required.".to_string()); + } + + Ok(entry_id) + } + + fn parse_value(json_data: &str) -> Result { + serde_json::from_str::(json_data).map_err(|error| format!("Invalid JSON: {error}")) + } + + fn parse_record(json_data: &str) -> Result { + serde_json::from_str::(json_data) + .map_err(|error| format!("Invalid CAD JSON: {error}")) + } + + fn records_to_values(records: HashMap) -> Vec { + records.into_values().map(CadRecord::into_value).collect() + } + + fn set_task_id(record: &mut CadRecord, task_id: &str) { + let task_id_value = Value::String(task_id.to_string()); + record + .fields + .insert("taskId".to_string(), task_id_value.clone()); + record.fields.insert("taskID".to_string(), task_id_value); + } + + fn build_activity( + entry_type: &str, + message: String, + task_id: String, + group_id: String, + actor_uid: String, + ) -> CadActivityEntry { + CadActivityEntry { + entry_type: entry_type.to_string(), + message, + task_id, + group_id, + actor_uid, + } + } + + fn display_group_name(record: &Map) -> String { + Self::string_field(record, "groupCallsign") + .or_else(|| Self::string_field(record, "assigneeGroupCallsign")) + .or_else(|| Self::string_field(record, "groupId")) + .unwrap_or_else(|| "assigned group".to_string()) + } + + fn normalize_priority(priority: &str) -> String { + let normalized = priority.to_lowercase(); + if ["routine", "priority", "emergency"].contains(&normalized.as_str()) { + normalized + } else { + "priority".to_string() + } + } + + fn fallback_string(value: &str, fallback: &str) -> String { + if value.trim().is_empty() { + fallback.to_string() + } else { + value.to_string() + } + } + + fn build_request_title(request_type: &str, group_callsign: &str) -> String { + format!( + "{} | {}", + Self::format_request_type(request_type), + group_callsign + ) + } + + fn build_request_summary( + request_type: &str, + fields: &Map, + group_callsign: &str, + ) -> String { + match request_type { + "medevac_9line" => format!( + "Pickup {} | Precedence {} | Security {}", + Self::string_field(fields, "pickup_location") + .unwrap_or_else(|| "Unknown".to_string()), + Self::string_field(fields, "precedence").unwrap_or_else(|| "unknown".to_string()), + Self::string_field(fields, "security").unwrap_or_else(|| "unknown".to_string()) + ), + "ace_lace" => format!( + "Ammo {} | Casualties {} | Equipment {}", + Self::string_field(fields, "ammo").unwrap_or_else(|| "unknown".to_string()), + Self::string_field(fields, "casualties").unwrap_or_else(|| "unknown".to_string()), + Self::string_field(fields, "equipment").unwrap_or_else(|| "unknown".to_string()) + ), + "fire_support" => format!( + "Target {} | Effect {} | Danger Close {}", + Self::string_field(fields, "target_location") + .unwrap_or_else(|| "Unknown".to_string()), + Self::string_field(fields, "requested_effect") + .unwrap_or_else(|| "unknown".to_string()), + Self::string_field(fields, "danger_close").unwrap_or_else(|| "no".to_string()) + ), + "air_support" => format!( + "Target {} | Marking {} | Effect {}", + Self::string_field(fields, "target_location") + .unwrap_or_else(|| "Unknown".to_string()), + Self::string_field(fields, "target_marking") + .unwrap_or_else(|| "unknown".to_string()), + Self::string_field(fields, "requested_effect") + .unwrap_or_else(|| "unknown".to_string()) + ), + "logreq" => format!( + "Category {} | Requested {} | Quantity {} | Delivery {} | Location {}", + Self::string_field(fields, "category").unwrap_or_else(|| "mixed".to_string()), + Self::string_field(fields, "requested_items") + .unwrap_or_else(|| "unspecified".to_string()), + Self::string_field(fields, "quantity").unwrap_or_else(|| "unspecified".to_string()), + Self::string_field(fields, "delivery_method") + .unwrap_or_else(|| "dispatch discretion".to_string()), + Self::string_field(fields, "delivery_location") + .unwrap_or_else(|| "Unknown".to_string()) + ), + _ => format!( + "{} request from {}.", + Self::format_request_type(request_type), + group_callsign + ), + } + } + + fn format_request_type(request_type: &str) -> String { + match request_type { + "medevac_9line" => "9-Line MEDEVAC".to_string(), + "ace_lace" => "ACE/LACE".to_string(), + "fire_support" => "Fire Support".to_string(), + "air_support" => "Air Support".to_string(), + "logreq" => "LOGREQ".to_string(), + _ => request_type.to_string(), + } + } + + fn as_object_clone(value: &Value) -> Option> { + value.as_object().cloned() + } + + fn string_field(object: &Map, key: &str) -> Option { + object.get(key)?.as_str().map(ToString::to_string) + } +} + +pub struct CadViewService; + +impl CadViewService { + pub fn build_hydrate_payload( + seed: CadHydrateSeed, + assignments: HashMap, + dispatch_orders: HashMap, + requests: HashMap, + activity: Vec, + ) -> CadHydratePayload { + let groups = seed.groups.clone(); + let contracts = Self::build_contracts( + &seed.active_tasks, + &groups, + &seed.session, + &assignments, + &dispatch_orders, + ); + let requests = Self::build_requests(&seed.session, &requests); + let assignments = assignments + .into_values() + .map(CadRecord::into_value) + .collect(); + let activity = Self::build_activity(activity); + + CadHydratePayload { + groups, + contracts, + requests, + assignments, + activity, + session: seed.session, + } + } + + fn build_contracts( + active_tasks: &[Value], + groups: &[Value], + session: &CadSession, + assignments: &HashMap, + dispatch_orders: &HashMap, + ) -> Vec { + let mut contracts = Vec::new(); + + for task in active_tasks { + let Some(mut entry) = Self::as_object_clone(task) else { + continue; + }; + + let task_id = Self::string_field(&entry, "taskID") + .or_else(|| Self::string_field(&entry, "taskId")) + .unwrap_or_default(); + if task_id.is_empty() { + continue; + } + + let assignment = assignments.get(&task_id).map(|value| &value.fields); + let assigned_group_id = assignment + .and_then(|value| Self::string_field(value, "groupId")) + .unwrap_or_default(); + let assignment_state = assignment + .and_then(|value| Self::string_field(value, "state")) + .unwrap_or_else(|| "unassigned".to_string()); + + if !session.is_dispatcher + && (assigned_group_id.is_empty() || assigned_group_id != session.group_id) + { + continue; + } + + entry.insert("taskId".to_string(), Value::String(task_id)); + entry.insert( + "assignedGroupId".to_string(), + Value::String(assigned_group_id), + ); + entry.insert( + "assignmentState".to_string(), + Value::String(assignment_state), + ); + contracts.push(Value::Object(entry)); + } + + for (task_id, order) in dispatch_orders { + let assignment = assignments.get(task_id).map(|value| &value.fields); + let assigned_group_id = assignment + .and_then(|value| Self::string_field(value, "groupId")) + .unwrap_or_default(); + let assignment_state = assignment + .and_then(|value| Self::string_field(value, "state")) + .unwrap_or_else(|| "unassigned".to_string()); + + if !session.is_dispatcher + && (assigned_group_id.is_empty() || assigned_group_id != session.group_id) + { + continue; + } + + let mut entry = order.fields.clone(); + if let Some(target_group_id) = Self::string_field(&entry, "targetGroupId") + && let Some(target_group) = groups.iter().find_map(|group| { + let object = Self::as_object_ref(group)?; + (Self::string_field(object, "groupId").unwrap_or_default() == target_group_id) + .then_some(object) + }) + { + if let Some(callsign) = Self::string_field(target_group, "callsign") { + entry.insert( + "targetGroupCallsign".to_string(), + Value::String(callsign.clone()), + ); + entry.insert( + "title".to_string(), + Value::String(format!("Backup {callsign}")), + ); + } + + if let Some(position) = target_group.get("position") { + entry.insert("position".to_string(), position.clone()); + } + + if Self::string_field(&entry, "note") + .unwrap_or_default() + .is_empty() + && let Some(callsign) = Self::string_field(&entry, "targetGroupCallsign") + { + entry.insert( + "description".to_string(), + Value::String(format!( + "Dispatch order to back up {callsign} at its current position." + )), + ); + } + } + + entry.insert("taskId".to_string(), Value::String(task_id.clone())); + entry.insert("taskID".to_string(), Value::String(task_id.clone())); + entry.insert("isDispatchOrder".to_string(), Value::Bool(true)); + entry.insert( + "assignedGroupId".to_string(), + Value::String(assigned_group_id), + ); + entry.insert( + "assignmentState".to_string(), + Value::String(assignment_state), + ); + contracts.push(Value::Object(entry)); + } + + contracts + } + + fn build_requests(session: &CadSession, requests: &HashMap) -> Vec { + let mut filtered: Vec<(f64, Value)> = requests + .values() + .filter_map(|request| { + let object = &request.fields; + let group_id = Self::string_field(object, "groupId").unwrap_or_default(); + if !session.is_dispatcher && group_id != session.group_id { + return None; + } + + let created_at = Self::number_field(object, "createdAt").unwrap_or_default(); + Some((created_at, request.to_value())) + }) + .collect(); + + filtered.sort_by(|(left, _), (right, _)| { + right.partial_cmp(left).unwrap_or(std::cmp::Ordering::Equal) + }); + filtered.into_iter().map(|(_, value)| value).collect() + } + + fn build_activity(mut activity: Vec) -> Vec { + if activity.len() > CAD_RECENT_ACTIVITY_LIMIT { + let drain_count = activity.len() - CAD_RECENT_ACTIVITY_LIMIT; + activity.drain(0..drain_count); + } + + activity + } + + fn as_object_ref(value: &Value) -> Option<&Map> { + value.as_object() + } + + fn as_object_clone(value: &Value) -> Option> { + value.as_object().cloned() + } + + fn string_field(object: &Map, key: &str) -> Option { + object.get(key)?.as_str().map(ToString::to_string) + } + + fn number_field(object: &Map, key: &str) -> Option { + object.get(key)?.as_f64() + } +} + +#[cfg(test)] +mod tests { + use super::CadStateService; + use forge_repositories::{CadRepository, InMemoryCadRepository}; + use serde_json::Value; + + #[test] + fn create_order_assigns_shared_task_id() { + let repository = InMemoryCadRepository::new(); + let service = CadStateService::new(repository.clone()); + + let result = service + .create_order( + r#"{ + "order": {"type":"dispatch_order","targetGroupId":"alpha"}, + "assignment": {"groupId":"bravo","state":"assigned"} + }"# + .to_string(), + ) + .expect("create order should succeed"); + + assert_eq!(result.task_id, "cad-order:1"); + + let stored_order = repository + .get_order(&result.task_id) + .expect("get order should succeed") + .expect("order should exist"); + let stored_assignment = repository + .get_assignment(&result.task_id) + .expect("get assignment should succeed") + .expect("assignment should exist"); + + assert_eq!( + stored_order.fields.get("taskId"), + Some(&Value::String(result.task_id.clone())) + ); + assert_eq!( + stored_assignment.fields.get("taskId"), + Some(&Value::String(result.task_id)) + ); + } + + #[test] + fn create_order_from_context_persists_source_request_metadata() { + let repository = InMemoryCadRepository::new(); + let service = CadStateService::new(repository.clone()); + + let result = service + .create_order_from_context( + r#"{ + "assigneeGroupId": "bravo", + "assigneeGroupCallsign": "Bravo 1-1", + "targetGroupId": "alpha", + "targetGroupCallsign": "Alpha 1-1", + "targetPosition": [1000, 2000, 0], + "createdByUid": "dispatcher-1", + "createdByName": "Dispatch", + "requestId": "cad-request:7", + "requestType": "logreq", + "requestTitle": "LOGREQ | Alpha 1-1", + "requestSummary": "Category ammo | Requested MX rifle ammo", + "requestFields": { + "category": "ammo", + "requested_items": "MX rifle ammo", + "quantity": "4 crates" + }, + "note": "LOGREQ requested by Alpha 1-1. Requested Items MX rifle ammo | Quantity 4 crates", + "priority": "priority", + "createdAt": 123.45 + }"# + .to_string(), + ) + .expect("create order from context should succeed"); + + let stored_order = repository + .get_order(&result.task_id) + .expect("get order should succeed") + .expect("order should exist"); + + assert_eq!( + stored_order.fields.get("sourceRequestId"), + Some(&Value::String("cad-request:7".to_string())) + ); + assert_eq!( + stored_order.fields.get("sourceRequestType"), + Some(&Value::String("logreq".to_string())) + ); + assert_eq!( + stored_order.fields.get("sourceRequestFields"), + Some(&serde_json::json!({ + "category": "ammo", + "requested_items": "MX rifle ammo", + "quantity": "4 crates" + })) + ); + } + + #[test] + fn decline_assignment_returns_record_and_removes_state() { + let repository = InMemoryCadRepository::new(); + let service = CadStateService::new(repository.clone()); + + service + .assign_assignment( + "task-1".to_string(), + r#"{"groupId":"alpha","state":"assigned"}"#.to_string(), + ) + .expect("assign should succeed"); + + let declined = service + .decline_assignment( + "task-1".to_string(), + r#"{"state":"declined","declinedAt":123}"#.to_string(), + ) + .expect("decline should succeed"); + + assert_eq!( + declined.assignment.get("state").and_then(Value::as_str), + Some("declined") + ); + assert!( + repository + .get_assignment("task-1") + .expect("get assignment should succeed") + .is_none() + ); + } + + #[test] + fn submit_request_from_context_accepts_scalar_created_at() { + let repository = InMemoryCadRepository::new(); + let service = CadStateService::new(repository); + + let result = service + .submit_request_from_context( + r#"{ + "type": "medevac_9line", + "fields": {"pickup_location":"1000 2000"}, + "groupId": "alpha", + "groupCallsign": "Alpha 1-1", + "submittedByUid": "uid-1", + "submittedByName": "Leader", + "priority": "emergency", + "position": [1000, 2000, 0], + "createdAt": 123.45 + }"# + .to_string(), + ) + .expect("submit request should accept scalar createdAt"); + + assert_eq!( + result.request.get("createdAt").and_then(Value::as_f64), + Some(123.45) + ); + } +} diff --git a/lib/services/src/garage.rs b/lib/services/src/garage.rs new file mode 100644 index 0000000..0464db7 --- /dev/null +++ b/lib/services/src/garage.rs @@ -0,0 +1,289 @@ +//! Garage service layer providing business logic for vehicle garage management. +//! +//! Handles validation, storage, and retrieval of player vehicle garages. + +use forge_models::garage::{Garage, HitPoints, Vehicle}; +use forge_repositories::{GarageHotRepository, GarageRepository}; +use std::collections::HashMap; +use uuid::Uuid; + +/// Service layer implementation for garage business logic and operations. +pub struct GarageService { + repository: R, +} + +pub struct GarageHotStateService { + service: GarageService, + repository: H, +} + +impl GarageService { + /// Creates a new garage service with the provided repository. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new empty garage for a player + pub fn create_garage(&self, key: String) -> Result { + // Business rule: Check if garage already exists + if self.repository.exists(&key)? { + return Err(format!("Garage for '{}' already exists", key)); + } + + // Create empty garage (no vehicles) + let garage = Garage::new().map_err(|e| format!("Validation failed: {}", e))?; + self.repository.create(&key, &garage)?; + + Ok(garage) + } + + /// Replaces the entire garage content with the provided vehicles map + pub fn update_garage( + &self, + key: String, + vehicles: HashMap, + ) -> Result { + // Validate all vehicles + for vehicle in vehicles.values() { + vehicle + .validate() + .map_err(|e| format!("Validation failed for vehicle {}: {}", vehicle.plate, e))?; + } + + // Create garage object + let garage = Garage { vehicles }; + + // Validate garage (capacity, etc.) + // Business rule: Check if garage has reached maximum capacity + if garage.vehicles.len() > 5 { + return Err("Garage exceeds maximum capacity of 5 vehicles.".to_string()); + } + + // Update repository + self.repository.update(&key, &garage)?; + + Ok(garage) + } + + pub fn patch_vehicle( + &self, + key: String, + plate: String, + damage: Option, + fuel: Option, + hit_points_json: Option, + ) -> Result { + let mut garage = self.repository.get(&key)?.unwrap_or(Garage { + vehicles: HashMap::new(), + }); + + if let Some(vehicle) = garage.vehicles.get_mut(&plate) { + if let Some(d) = damage { + vehicle.damage = d; + } + if let Some(f) = fuel { + vehicle.fuel = f; + } + if let Some(hp_json) = hit_points_json + && let Ok(hp) = HitPoints::from_json_str(&hp_json) + { + vehicle.hit_points = hp; + } + } else { + return Err(format!("Vehicle with plate {} not found", plate)); + } + + self.repository.update(&key, &garage)?; + Ok(garage) + } + + /// Adds a new vehicle to a player's garage + pub fn add_vehicle( + &self, + key: String, + classname: String, + fuel: f64, + damage: f64, + hit_points_json: String, + ) -> Result { + // Get existing garage or create new one + let mut garage = match self.repository.get(&key)? { + Some(g) => g, + None => Garage::new().map_err(|e| format!("Failed to create garage: {}", e))?, + }; + + // Business rule: Check if garage has reached maximum capacity (5 vehicles) + if garage.vehicles.len() >= 5 { + return Err("Garage is full. Maximum of 5 vehicles allowed.".to_string()); + } + + // Generate a unique plate (vehicle ID) using UUID + let plate = Uuid::new_v4().to_string(); + + // Parse hit points from Arma 3 JSON + let hit_points = HitPoints::from_json_str(&hit_points_json)?; + + // Create new vehicle entry with validation + let new_vehicle = Vehicle::new(plate, classname, fuel, damage, hit_points) + .map_err(|e| format!("Validation failed: {}", e))?; + + // Add new vehicle to garage + garage + .add_vehicle(new_vehicle) + .map_err(|e| format!("Failed to add vehicle: {}", e))?; + + // Update garage with new vehicle + self.repository.update(&key, &garage)?; + + Ok(garage) + } + + /// Retrieves a player's garage + pub fn get_garage(&self, key: String) -> Result { + match self.repository.get(&key)? { + Some(garage) => Ok(garage), + None => Err(format!("No garage found for player '{}'", key)), + } + } + + /// Removes a vehicle from the garage by plate number + pub fn remove_vehicle(&self, key: String, plate: String) -> Result { + // Get existing garage + let mut garage = match self.repository.get(&key)? { + Some(g) => g, + None => return Err(format!("No garage found for player '{}'", key)), + }; + + // Remove the vehicle by plate + garage + .remove_vehicle(&plate) + .ok_or_else(|| format!("Vehicle with plate '{}' not found in garage", plate))?; + + // Update garage after removing vehicle + self.repository.update(&key, &garage)?; + + Ok(garage) + } + + /// Deletes all vehicles from a player's garage + pub fn delete_garage(&self, key: String) -> Result<(), String> { + self.repository.delete(&key) + } + + /// Checks if a player has a garage (even if empty) + pub fn garage_exists(&self, key: String) -> Result { + self.repository.exists(&key) + } +} + +impl GarageHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: GarageService::new(repository), + repository: hot_repository, + } + } + + pub fn init_garage(&self, uid: String) -> Result { + if let Some(garage) = self.repository.get(&uid)? { + return Ok(garage); + } + + let garage = match self.service.get_garage(uid.clone()) { + Ok(garage) => garage, + Err(_) => self.service.create_garage(uid.clone())?, + }; + self.repository.save(&garage, &uid)?; + Ok(garage) + } + + pub fn get_garage(&self, uid: String) -> Result { + self.init_garage(uid) + } + + pub fn override_garage( + &self, + uid: String, + vehicles: HashMap, + ) -> Result { + for vehicle in vehicles.values() { + vehicle + .validate() + .map_err(|e| format!("Validation failed for vehicle {}: {}", vehicle.plate, e))?; + } + + let garage = Garage { vehicles }; + if garage.vehicles.len() > 5 { + return Err("Garage exceeds maximum capacity of 5 vehicles.".to_string()); + } + + self.repository.save(&garage, &uid)?; + Ok(garage) + } + + pub fn save_garage(&self, uid: String) -> Result { + let garage = self + .repository + .get(&uid)? + .ok_or_else(|| format!("No garage found for player '{}'", uid))?; + let saved = self + .service + .update_garage(uid.clone(), garage.vehicles.clone())?; + self.repository.save(&saved, &uid)?; + Ok(saved) + } + + pub fn add_vehicle( + &self, + uid: String, + classname: String, + fuel: f64, + damage: f64, + hit_points_json: String, + ) -> Result { + let mut garage = match self.repository.get(&uid)? { + Some(garage) => garage, + None => match self.service.get_garage(uid.clone()) { + Ok(garage) => garage, + Err(_) => Garage::new().map_err(|e| format!("Failed to create garage: {}", e))?, + }, + }; + + if garage.vehicles.len() >= 5 { + return Err("Garage is full. Maximum of 5 vehicles allowed.".to_string()); + } + + let plate = Uuid::new_v4().to_string(); + let hit_points = HitPoints::from_json_str(&hit_points_json)?; + let new_vehicle = Vehicle::new(plate, classname, fuel, damage, hit_points) + .map_err(|e| format!("Validation failed: {}", e))?; + + garage + .add_vehicle(new_vehicle) + .map_err(|e| format!("Failed to add vehicle: {}", e))?; + + self.repository.save(&garage, &uid)?; + Ok(garage) + } + + pub fn remove_vehicle(&self, uid: String, plate: String) -> Result { + let mut garage = match self.repository.get(&uid)? { + Some(garage) => garage, + None => self + .service + .get_garage(uid.clone()) + .map_err(|_| format!("No garage found for player '{}'", uid))?, + }; + + garage + .remove_vehicle(&plate) + .ok_or_else(|| format!("Vehicle with plate '{}' not found in garage", plate))?; + + self.repository.save(&garage, &uid)?; + Ok(garage) + } + + pub fn remove_garage(&self, uid: String) -> Result<(), String> { + self.repository.delete(&uid) + } +} diff --git a/lib/services/src/lib.rs b/lib/services/src/lib.rs new file mode 100644 index 0000000..bb890d3 --- /dev/null +++ b/lib/services/src/lib.rs @@ -0,0 +1,23 @@ +pub mod actor; +pub mod bank; +pub mod cad; +pub mod garage; +pub mod locker; +pub mod org; +pub mod phone; +pub mod store; +pub mod task; +pub mod v_garage; +pub mod v_locker; + +pub use actor::{ActorHotStateService, ActorService}; +pub use bank::{BankHotStateService, BankService}; +pub use cad::{CadStateService, CadViewService}; +pub use garage::{GarageHotStateService, GarageService}; +pub use locker::{LockerHotStateService, LockerService}; +pub use org::{OrgHotStateService, OrgService}; +pub use phone::PhoneStateService; +pub use store::StoreService; +pub use task::TaskStateService; +pub use v_garage::{VGarageHotStateService, VGarageService}; +pub use v_locker::{VLockerHotStateService, VLockerService}; diff --git a/lib/services/src/locker.rs b/lib/services/src/locker.rs new file mode 100644 index 0000000..fded255 --- /dev/null +++ b/lib/services/src/locker.rs @@ -0,0 +1,204 @@ +//! Locker service layer providing business logic for item locker management. +//! +//! Handles validation, storage, and retrieval of player item lockers. + +use forge_models::locker::{Item, Locker}; +use forge_repositories::{LockerHotRepository, LockerRepository}; +use std::collections::HashMap; + +/// Service layer implementation for locker business logic and operations. +pub struct LockerService { + repository: R, +} + +pub struct LockerHotStateService { + service: LockerService, + repository: H, +} + +impl LockerService { + /// Creates a new locker service with the provided repository. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new empty locker for a player + pub fn create_locker(&self, uid: String) -> Result { + // Business rule: Check if locker already exists + if self.repository.exists(&uid)? { + return Err(format!("Locker for '{}' already exists", uid)); + } + + // Create empty locker (no items) + let locker = Locker::new().map_err(|e| format!("Validation failed: {}", e))?; + self.repository.create(&uid, &locker)?; + + Ok(locker) + } + + /// Replaces the entire locker with new data (Bulk Sync). + pub fn update_locker( + &self, + key: String, + items: HashMap, + ) -> Result { + let locker = Locker { items }; + + // Business rule: Check if locker has reached maximum capacity (25 items) + if locker.items.len() > 25 { + return Err("Locker exceeds maximum capacity of 25 items.".to_string()); + } + + self.repository.update(&key, &locker)?; + Ok(locker) + } + + /// Adds a new item to a player's locker + pub fn add_item(&self, uid: String, item: Item) -> Result { + // Get existing locker or create new one + let mut locker = match self.repository.get(&uid)? { + Some(l) => l, + None => Locker::new().map_err(|e| format!("Failed to create locker: {}", e))?, + }; + + // Business rule: Check if locker has reached maximum capacity (25 items) + // Only check if we are adding a NEW item (not updating existing) + if !locker.items.contains_key(&item.classname) && locker.items.len() >= 25 { + return Err("Locker is full. Maximum of 25 items allowed.".to_string()); + } + + // Add new item to locker (or overwrite existing) + locker + .add_item(item) + .map_err(|e| format!("Failed to add item: {}", e))?; + + // Update locker with new item + self.repository.update(&uid, &locker)?; + + Ok(locker) + } + + /// Retrieves a player's locker + pub fn get_locker(&self, uid: String) -> Result { + match self.repository.get(&uid)? { + Some(locker) => Ok(locker), + None => Err(format!("No locker found for player '{}'", uid)), + } + } + + /// Patches an existing item in the locker + pub fn patch_item( + &self, + uid: String, + classname: String, + amount: Option, + ) -> Result { + // Get existing locker + let mut locker = match self.repository.get(&uid)? { + Some(l) => l, + None => return Err(format!("No locker found for player '{}'", uid)), + }; + + // Find the item to update by classname + let existing_item = locker + .get_item_mut(&classname) + .ok_or_else(|| format!("Item with classname '{}' not found in locker", classname))?; + + if let Some(a) = amount { + if a == 0 { + return Err("Amount cannot be zero".to_string()); + } + existing_item.amount = a; + } + + // Update locker with modified item + self.repository.update(&uid, &locker)?; + + Ok(locker) + } + + /// Removes an item from the locker + pub fn remove_item(&self, uid: String, classname: String) -> Result { + // Get existing locker + let mut locker = match self.repository.get(&uid)? { + Some(l) => l, + None => return Err(format!("No locker found for player '{}'", uid)), + }; + + // Remove the item by classname + locker + .remove_item(&classname) + .ok_or_else(|| format!("Item with classname '{}' not found in locker", classname))?; + + // Update locker after removing item + self.repository.update(&uid, &locker)?; + + Ok(locker) + } + + /// Deletes a player's locker (all items) + pub fn delete_locker(&self, uid: String) -> Result<(), String> { + self.repository.delete(&uid) + } + + /// Checks if a player has a locker (even if empty) + pub fn locker_exists(&self, uid: String) -> Result { + self.repository.exists(&uid) + } +} + +impl LockerHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: LockerService::new(repository), + repository: hot_repository, + } + } + + pub fn init_locker(&self, uid: String) -> Result { + if let Some(locker) = self.repository.get(&uid)? { + return Ok(locker); + } + + let locker = match self.service.get_locker(uid.clone()) { + Ok(locker) => locker, + Err(_) => self.service.create_locker(uid.clone())?, + }; + self.repository.save(&locker, &uid)?; + Ok(locker) + } + + pub fn get_locker(&self, uid: String) -> Result { + self.init_locker(uid) + } + + pub fn override_locker( + &self, + uid: String, + items: HashMap, + ) -> Result { + let locker = Locker { items }; + if locker.items.len() > 25 { + return Err("Locker exceeds maximum capacity of 25 items.".to_string()); + } + + self.repository.save(&locker, &uid)?; + Ok(locker) + } + + pub fn save_locker(&self, uid: String) -> Result { + let locker = self + .repository + .get(&uid)? + .ok_or_else(|| format!("No locker found for player '{}'", uid))?; + let saved = self + .service + .update_locker(uid.clone(), locker.items.clone())?; + self.repository.save(&saved, &uid)?; + Ok(saved) + } + + pub fn remove_locker(&self, uid: String) -> Result<(), String> { + self.repository.delete(&uid) + } +} diff --git a/lib/services/src/org.rs b/lib/services/src/org.rs new file mode 100644 index 0000000..f3e5ae0 --- /dev/null +++ b/lib/services/src/org.rs @@ -0,0 +1,1422 @@ +//! Organization service layer providing business logic for organization management operations. +//! +//! Implements the service layer of the organization management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::{ + CreditLineSummary, DEFAULT_CREDIT_LINE_INTEREST_RATE, HotOrgRecord, MemberSummary, Org, + OrgAssetEntry, OrgAssetGrantSeed, OrgCheckoutContext, OrgCreditLineContext, + OrgCreditLineRepaymentContext, OrgCreditLineRepaymentResult, OrgDisbandMemberResult, + OrgDisbandResult, OrgEnsureMemberContext, OrgFleetEntry, OrgFleetGrantSeed, OrgGrantContext, + OrgInviteContext, OrgInviteDecisionContext, OrgInviteDecisionResult, OrgInviteRecord, + OrgInviteResult, OrgLeaveContext, OrgLeaveResult, OrgMutationResult, OrgRegisterContext, + OrgRegisterResult, +}; +use forge_repositories::{OrgHotRepository, OrgRepository}; +use serde_json::{Value, json}; +use std::collections::{HashMap, HashSet}; + +/// Service layer implementation for organization business logic and operations. +/// +/// Orchestrates organization management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct OrgService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of organization + /// and member data, abstracting away the specific database implementation details. + repository: R, +} + +pub struct OrgHotStateService { + service: OrgService, + repository: H, +} + +impl OrgService { + fn normalize_org_value( + mut org_value: serde_json::Value, + key_override: Option, + ) -> Result { + let org_object = org_value + .as_object_mut() + .ok_or_else(|| "Org payload must be a JSON object".to_string())?; + + if let Some(key) = key_override { + org_object.insert("id".to_string(), serde_json::Value::String(key)); + } + + if matches!( + org_object.get("credit_lines"), + Some(serde_json::Value::Array(lines)) if lines.is_empty() + ) { + org_object.insert( + "credit_lines".to_string(), + serde_json::Value::Object(serde_json::Map::new()), + ); + } + + let mut org = serde_json::from_value::(org_value) + .map_err(|e| format!("Invalid Org JSON: {}", e))?; + org.normalize_credit_lines(); + Ok(org) + } + + /// Creates a new organization service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new organization with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create_org(&self, key: String, json_data: String) -> Result { + let org_value: serde_json::Value = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Org JSON: {}", e))?; + let org = Self::normalize_org_value(org_value, Some(key))?; + + // Validate organization name is not empty + if org.name.trim().is_empty() { + return Err("Organization name cannot be empty".to_string()); + } + + // Check if organization already exists to prevent duplicates + if self.repository.exists(&org.id)? { + return Err(format!("Organization with ID '{}' already exists", org.id)); + } + + // Store the organization in the repository + self.repository.create(&org)?; + + Ok(org) + } + + pub fn get_org(&self, key: String) -> Result { + let mut org = self + .repository + .get_by_id(&key)? + .ok_or_else(|| format!("Organization with ID '{}' not found", key))?; + org.normalize_credit_lines(); + Ok(org) + } + + /// Updates an existing organization with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_org(&self, key: String, json_update: String) -> Result { + // Retrieve existing organization from repository + let mut org = match self.repository.get_by_id(&key)? { + Some(org) => org, + None => return Err(format!("Organization with ID '{}' not found", key)), + }; + + // Parse and validate JSON update data + let mut update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + if matches!( + update_data.get("credit_lines"), + Some(serde_json::Value::Array(lines)) if lines.is_empty() + ) { + update_data["credit_lines"] = serde_json::Value::Object(serde_json::Map::new()); + } + + // Create a temporary copy to safely apply updates with validation + let mut updated_org = org.clone(); + + // Apply updates field by field + if let Some(obj) = update_data.as_object() { + for (field, value) in obj { + match field.as_str() { + "id" => { + if let Some(id_str) = value.as_str() { + updated_org.id = id_str.to_string(); + } else { + return Err("ID must be a string".to_string()); + } + } + "owner" => { + if let Some(owner_str) = value.as_str() { + updated_org.owner = owner_str.to_string(); + } else { + return Err("Owner must be a string".to_string()); + } + } + "name" => { + if let Some(name_str) = value.as_str() { + updated_org.name = name_str.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "funds" => { + if let Some(funds_val) = value.as_f64() { + updated_org.funds = funds_val; + } else { + return Err("Funds must be a number".to_string()); + } + } + "reputation" => { + if let Some(rep_val) = value.as_i64() { + updated_org.reputation = rep_val; + } else { + return Err("Reputation must be an integer".to_string()); + } + } + "credit_lines" => { + if value.is_null() { + updated_org.credit_lines = HashMap::new(); + } else { + updated_org.credit_lines = serde_json::from_value::< + HashMap, + >(value.clone()) + .map_err(|e| { + format!( + "Credit lines must be an object of member credit entries: {}", + e + ) + })?; + } + } + _ => { + return Err(format!("Unknown field: {}", field)); + } + } + } + } + + // Validate the updated organization before committing changes + updated_org.normalize_credit_lines(); + updated_org + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + // Only commit changes after validation passes + org = updated_org; + + // Persist the updated organization to repository + self.repository.update(&org)?; + + Ok(org) + } + + /// Permanently deletes an organization from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_org(&self, key: String) -> Result<(), String> { + self.repository.delete(&key) + } + + /// Checks if an organization exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn org_exists(&self, key: String) -> Result { + // Delegate existence check to repository layer + self.repository.exists(&key) + } + + /// Adds a new member UID to an organization with validation. + pub fn add_member(&self, key: String, member_uid: String) -> Result<(), String> { + // Verify organization exists before adding member + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + // Add member UID to organization through repository + self.repository.add_member(&key, &member_uid) + } + + /// Retrieves all members of an organization as a UID to name mapping. + pub fn get_members(&self, key: String) -> Result, String> { + // Delegate member retrieval to repository layer + self.repository.get_members(&key) + } + + /// Permanently removes a specific member from an organization. + /// + /// Irreversible operation. Delegates to repository. + pub fn remove_member(&self, key: String, member_uid: String) -> Result<(), String> { + // Verify organization exists before attempting member removal + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + // Delegate member removal to repository layer + self.repository.remove_member(&key, &member_uid) + } + + pub fn get_assets( + &self, + key: String, + ) -> Result>, String> { + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + self.repository.get_assets(&key) + } + + pub fn update_assets( + &self, + key: String, + mut assets_update: serde_json::Value, + ) -> Result>, String> { + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + if matches!(&assets_update, serde_json::Value::Array(lines) if lines.is_empty()) { + assets_update = serde_json::Value::Object(serde_json::Map::new()); + } + + let assets = if assets_update.is_null() { + HashMap::new() + } else { + serde_json::from_value::>>(assets_update) + .map_err(|e| { + format!( + "Assets must be an object of category maps keyed by classname: {}", + e + ) + })? + }; + + self.repository.update_assets(&key, &assets)?; + Ok(assets) + } + + pub fn get_fleet(&self, key: String) -> Result, String> { + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + self.repository.get_fleet(&key) + } + + pub fn update_fleet( + &self, + key: String, + mut fleet_update: serde_json::Value, + ) -> Result, String> { + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + if matches!(&fleet_update, serde_json::Value::Array(lines) if lines.is_empty()) { + fleet_update = serde_json::Value::Object(serde_json::Map::new()); + } + + let fleet = if fleet_update.is_null() { + HashMap::new() + } else { + serde_json::from_value::>(fleet_update) + .map_err(|e| format!("Fleet must be an object of fleet entries: {}", e))? + }; + + self.repository.update_fleet(&key, &fleet)?; + Ok(fleet) + } +} + +impl OrgHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: OrgService::new(repository), + repository: hot_repository, + } + } + + pub fn init_org(&self, id: String) -> Result { + if let Some(org) = self.repository.get(&id)? { + if !org.members.is_empty() || !org.assets.is_empty() || !org.fleet.is_empty() { + return Ok(org); + } + + let hydrated_org = self.hydrate_org(&id)?; + if !hydrated_org.members.is_empty() + || !hydrated_org.assets.is_empty() + || !hydrated_org.fleet.is_empty() + { + self.repository.save(&hydrated_org)?; + return Ok(hydrated_org); + } + + return Ok(org); + } + + let hot_org = self.hydrate_org(&id)?; + self.repository.save(&hot_org)?; + Ok(hot_org) + } + + pub fn get_org(&self, id: String) -> Result { + self.init_org(id) + } + + pub fn get_member_invites(&self, member_uid: String) -> Result, String> { + if member_uid.trim().is_empty() { + return Ok(Vec::new()); + } + + let mut invites = Vec::new(); + for org_id in self.repository.keys()? { + let Some(org) = self.repository.get(&org_id)? else { + continue; + }; + + if let Some(invite) = org.pending_invites.get(&member_uid) { + invites.push(invite.clone()); + } + } + + invites.sort_by(|left, right| left.org_name.cmp(&right.org_name)); + Ok(invites) + } + + pub fn override_org( + &self, + id: String, + mut hot_org: HotOrgRecord, + ) -> Result { + hot_org.id = id; + self.repository.save(&hot_org)?; + Ok(hot_org) + } + + pub fn save_org(&self, id: String) -> Result { + let hot_org = self + .repository + .get(&id)? + .ok_or_else(|| format!("Organization with ID '{}' not found", id))?; + + let core_org = hot_org.clone().into_org(); + let current_members = self + .service + .get_members(id.clone())? + .into_iter() + .map(|member| member.uid) + .collect::>(); + let target_members = hot_org.members.keys().cloned().collect::>(); + + if self.service.org_exists(id.clone())? { + self.service.repository.update(&core_org)?; + } else { + self.service.repository.create(&core_org)?; + } + + self.service + .repository + .update_assets(&id, &hot_org.assets)?; + self.service.repository.update_fleet(&id, &hot_org.fleet)?; + + for member_uid in target_members.difference(¤t_members) { + self.service.repository.add_member(&id, member_uid)?; + } + + for member_uid in current_members.difference(&target_members) { + self.service.repository.remove_member(&id, member_uid)?; + } + + self.repository.save(&hot_org)?; + Ok(hot_org) + } + + pub fn remove_org(&self, id: String) -> Result<(), String> { + self.repository.delete(&id) + } + + pub fn ensure_member(&self, context: OrgEnsureMemberContext) -> Result { + if context.org_id.trim().is_empty() || context.member_uid.trim().is_empty() { + return Err("A valid organization and member UID are required.".to_string()); + } + + let mut org = self.get_org(context.org_id)?; + let member_name = if context.member_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.member_name + }; + let should_refresh_member_name = org + .members + .get(&context.member_uid) + .map(|member| { + let existing_name = member.name.trim(); + !member_name.eq_ignore_ascii_case("unknown") + && (existing_name.is_empty() || existing_name.eq_ignore_ascii_case("unknown")) + }) + .unwrap_or(false); + + if !org.members.contains_key(&context.member_uid) || should_refresh_member_name { + org.members.insert( + context.member_uid.clone(), + MemberSummary { + uid: context.member_uid, + name: member_name, + }, + ); + self.repository.save(&org)?; + } + + Ok(org) + } + + pub fn register_org(&self, context: OrgRegisterContext) -> Result { + if context.requester_uid.trim().is_empty() || context.org_id.trim().is_empty() { + return Err("A valid requester and organization ID are required.".to_string()); + } + if context.org_name.trim().is_empty() { + return Err("Organization name cannot be empty.".to_string()); + } + if !context.existing_org_id.trim().is_empty() + && !context.existing_org_id.eq_ignore_ascii_case("default") + { + return Err("Player already belongs to an organization.".to_string()); + } + if self.service.org_exists(context.org_id.clone())? + || self.repository.get(&context.org_id)?.is_some() + { + return Err("An organization already exists for this phone number.".to_string()); + } + + let org = Org { + id: context.org_id.clone(), + owner: context.requester_uid.clone(), + name: context.org_name, + funds: 0.0, + reputation: 0, + credit_lines: HashMap::new(), + }; + org.validate() + .map_err(|error| format!("Validation failed: {}", error))?; + + let json_data = serde_json::to_string(&org) + .map_err(|error| format!("Failed to serialize org: {}", error))?; + let persisted_org = self.service.create_org(context.org_id.clone(), json_data)?; + let mut hot_org = + HotOrgRecord::from_parts(persisted_org, HashMap::new(), HashMap::new(), Vec::new()); + hot_org.members.insert( + context.requester_uid.clone(), + MemberSummary { + uid: context.requester_uid.clone(), + name: if context.requester_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.requester_name + }, + }, + ); + self.repository.save(&hot_org)?; + + if context.existing_org_id.eq_ignore_ascii_case("default") { + let mut default_org = self.init_org("default".to_string())?; + default_org.members.remove(&context.requester_uid); + self.repository.save(&default_org)?; + } + + Ok(OrgRegisterResult { + org: hot_org, + actor_organization: context.org_id, + message: String::new(), + }) + } + + pub fn invite_member(&self, context: OrgInviteContext) -> Result { + if context.requester_uid.trim().is_empty() + || context.target_uid.trim().is_empty() + || context.org_id.trim().is_empty() + { + return Err("A valid organization invite request is required.".to_string()); + } + + let mut org = self.get_org(context.org_id.clone())?; + if !can_manage_treasury( + &org, + &context.requester_uid, + context.requester_is_default_org_ceo, + ) { + return Err( + "Only the organization leader or CEO can send organization invites.".to_string(), + ); + } + if context.target_uid == context.requester_uid { + return Err("You cannot invite yourself to the organization.".to_string()); + } + if org.members.contains_key(&context.target_uid) { + return Err("Selected player is already a member of this organization.".to_string()); + } + if !context.target_org_id.trim().is_empty() + && !context.target_org_id.eq_ignore_ascii_case("default") + { + return Err( + "Selected player must leave their current organization before joining another." + .to_string(), + ); + } + + let target_name = if context.target_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.target_name.clone() + }; + let inviter_name = if context.requester_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.requester_name.clone() + }; + + org.pending_invites.insert( + context.target_uid.clone(), + OrgInviteRecord { + org_id: org.id.clone(), + org_name: org.name.clone(), + inviter_uid: context.requester_uid, + inviter_name, + target_uid: context.target_uid.clone(), + target_name: target_name.clone(), + }, + ); + self.repository.save(&org)?; + + Ok(OrgInviteResult { + org, + target_uid: context.target_uid, + message: format!("Invitation sent to {}.", target_name), + }) + } + + pub fn accept_invite( + &self, + context: OrgInviteDecisionContext, + ) -> Result { + if context.requester_uid.trim().is_empty() || context.org_id.trim().is_empty() { + return Err("A valid organization invite acceptance is required.".to_string()); + } + if !context.existing_org_id.trim().is_empty() + && !context.existing_org_id.eq_ignore_ascii_case("default") + && !context + .existing_org_id + .eq_ignore_ascii_case(&context.org_id) + { + return Err( + "Leave your current organization before accepting another invite.".to_string(), + ); + } + + let mut invited_org = self.get_org(context.org_id.clone())?; + let invite = invited_org + .pending_invites + .remove(&context.requester_uid) + .ok_or_else(|| "That organization invite is no longer available.".to_string())?; + + if invited_org.members.contains_key(&context.requester_uid) { + self.repository.save(&invited_org)?; + return Ok(OrgInviteDecisionResult { + previous_org: None, + actor_organization: invited_org.id.clone(), + message: "You are already a member of that organization.".to_string(), + invited_org, + }); + } + + let requester_name = if context.requester_name.trim().is_empty() { + invite.target_name + } else { + context.requester_name + }; + + let mut previous_org = None; + if !context.existing_org_id.trim().is_empty() + && !context + .existing_org_id + .eq_ignore_ascii_case(&invited_org.id) + { + let mut current_org = self.init_org(context.existing_org_id.clone())?; + current_org.members.remove(&context.requester_uid); + self.repository.save(¤t_org)?; + previous_org = Some(current_org); + } + + invited_org.members.insert( + context.requester_uid.clone(), + MemberSummary { + uid: context.requester_uid, + name: requester_name, + }, + ); + self.repository.save(&invited_org)?; + + Ok(OrgInviteDecisionResult { + previous_org, + actor_organization: invited_org.id.clone(), + message: format!("You joined {}.", invited_org.name), + invited_org, + }) + } + + pub fn decline_invite( + &self, + context: OrgInviteDecisionContext, + ) -> Result { + if context.requester_uid.trim().is_empty() || context.org_id.trim().is_empty() { + return Err("A valid organization invite decline is required.".to_string()); + } + + let mut invited_org = self.get_org(context.org_id.clone())?; + let invite = invited_org + .pending_invites + .remove(&context.requester_uid) + .ok_or_else(|| "That organization invite is no longer available.".to_string())?; + self.repository.save(&invited_org)?; + + Ok(OrgInviteDecisionResult { + previous_org: None, + actor_organization: context.existing_org_id, + message: format!("Invitation from {} declined.", invite.org_name), + invited_org, + }) + } + + pub fn assign_credit_line( + &self, + context: OrgCreditLineContext, + ) -> Result { + if context.requester_uid.trim().is_empty() + || context.member_uid.trim().is_empty() + || context.org_id.trim().is_empty() + { + return Err("A valid requester, member, and organization are required.".to_string()); + } + if context.amount <= 0.0 { + return Err("A valid credit amount is required.".to_string()); + } + + let mut org = self.get_org(context.org_id)?; + if !can_manage_treasury( + &org, + &context.requester_uid, + context.requester_is_default_org_ceo, + ) { + return Err( + "Only the organization leader or CEO can manage treasury actions.".to_string(), + ); + } + + let member_record = org + .members + .get(&context.member_uid) + .cloned() + .ok_or_else(|| { + "Selected member was not found in the organization roster.".to_string() + })?; + let member_name = if context.member_name.trim().is_empty() { + member_record.name + } else { + context.member_name + }; + + let mut credit_line = org + .credit_lines + .get(&context.member_uid) + .cloned() + .unwrap_or_else(|| CreditLineSummary { + uid: context.member_uid.clone(), + name: member_name.clone(), + approved_amount: 0.0, + available_amount: 0.0, + outstanding_principal: 0.0, + interest_rate: DEFAULT_CREDIT_LINE_INTEREST_RATE, + amount_due: 0.0, + amount: 0.0, + }); + credit_line.normalize(); + + let next_reserved_amount = round_currency(context.amount); + let previous_reserved_amount = round_currency(credit_line.available_amount); + let treasury_delta = round_currency(next_reserved_amount - previous_reserved_amount); + if treasury_delta > 0.0 && org.funds < treasury_delta { + return Err("Organization funds cannot cover that credit assignment.".to_string()); + } + + org.funds = round_currency(org.funds - treasury_delta); + credit_line.uid = context.member_uid.clone(); + credit_line.name = member_name.clone(); + credit_line.approved_amount = next_reserved_amount; + credit_line.available_amount = next_reserved_amount; + credit_line.amount = next_reserved_amount; + if credit_line.interest_rate <= 0.0 { + credit_line.interest_rate = DEFAULT_CREDIT_LINE_INTEREST_RATE; + } + + org.credit_lines + .insert(context.member_uid.clone(), credit_line); + self.repository.save(&org)?; + + Ok(OrgMutationResult { + patch: build_org_patch(&org, &["funds", "credit_lines"])?, + member_uids: resolve_member_uids(&org, Some(&context.requester_uid)), + message: format!( + "Credit line for {} set to ${}.", + member_name, + format_currency(next_reserved_amount) + ), + org, + }) + } + + pub fn charge_checkout( + &self, + context: OrgCheckoutContext, + ) -> Result { + if context.requester_uid.trim().is_empty() || context.org_id.trim().is_empty() { + return Err("A valid requester and organization are required.".to_string()); + } + if context.amount <= 0.0 { + return Err("Checkout amount must be greater than zero.".to_string()); + } + + let mut org = self.get_org(context.org_id)?; + let member_uids = resolve_member_uids(&org, Some(&context.requester_uid)); + + match context.source.trim().to_ascii_lowercase().as_str() { + "org_funds" => { + let charged_amount = round_currency(context.amount); + let can_charge_org_funds = can_manage_treasury( + &org, + &context.requester_uid, + context.requester_is_default_org_ceo, + ) || (context.allow_member_charge + && org.members.contains_key(&context.requester_uid)); + + if !can_charge_org_funds { + return Err( + "Only the organization leader or CEO can charge org funds.".to_string() + ); + } + if org.funds < charged_amount { + return Err("Organization funds cannot cover this checkout.".to_string()); + } + + org.funds = round_currency(org.funds - charged_amount); + if context.record_member_debt { + let member_name = org + .members + .get(&context.requester_uid) + .map(|member| member.name.clone()) + .filter(|name| !name.trim().is_empty()) + .unwrap_or_else(|| "Unknown".to_string()); + let mut credit_line = org + .credit_lines + .get(&context.requester_uid) + .cloned() + .unwrap_or_else(|| CreditLineSummary { + uid: context.requester_uid.clone(), + name: member_name.clone(), + approved_amount: 0.0, + available_amount: 0.0, + outstanding_principal: 0.0, + interest_rate: DEFAULT_CREDIT_LINE_INTEREST_RATE, + amount_due: 0.0, + amount: 0.0, + }); + credit_line.normalize(); + credit_line.uid = context.requester_uid.clone(); + credit_line.name = member_name; + if credit_line.interest_rate <= 0.0 { + credit_line.interest_rate = DEFAULT_CREDIT_LINE_INTEREST_RATE; + } + credit_line.outstanding_principal = + round_currency(credit_line.outstanding_principal + charged_amount); + credit_line.amount_due = + round_currency(credit_line.amount_due + charged_amount); + credit_line.amount = credit_line.available_amount; + org.credit_lines + .insert(context.requester_uid.clone(), credit_line); + } + self.repository.save(&org)?; + + let patch_fields = if context.record_member_debt { + vec!["funds", "credit_lines"] + } else { + vec!["funds"] + }; + + Ok(OrgMutationResult { + patch: build_org_patch(&org, &patch_fields)?, + member_uids, + message: String::new(), + org, + }) + } + "credit_line" => { + let mut credit_line = org + .credit_lines + .get(&context.requester_uid) + .cloned() + .ok_or_else(|| { + "Assigned credit line cannot cover this checkout.".to_string() + })?; + + credit_line.normalize(); + + if credit_line.available_amount < context.amount { + return Err("Assigned credit line cannot cover this checkout.".to_string()); + } + + let charged_amount = round_currency(context.amount); + credit_line.available_amount = + round_currency(credit_line.available_amount - charged_amount); + credit_line.approved_amount = credit_line.available_amount; + credit_line.outstanding_principal = + round_currency(credit_line.outstanding_principal + charged_amount); + credit_line.amount_due = round_currency( + credit_line.amount_due + (charged_amount * (1.0 + credit_line.interest_rate)), + ); + credit_line.amount = credit_line.available_amount; + org.credit_lines + .insert(context.requester_uid.clone(), credit_line); + self.repository.save(&org)?; + + Ok(OrgMutationResult { + patch: build_org_patch(&org, &["credit_lines"])?, + member_uids, + message: String::new(), + org, + }) + } + _ => Err("Selected organization payment source is unsupported.".to_string()), + } + } + + pub fn repay_credit_line( + &self, + context: OrgCreditLineRepaymentContext, + ) -> Result { + if context.requester_uid.trim().is_empty() || context.org_id.trim().is_empty() { + return Err("A valid requester and organization are required.".to_string()); + } + if context.amount <= 0.0 { + return Err("Repayment amount must be greater than zero.".to_string()); + } + + let mut org = self.get_org(context.org_id)?; + let member_uids = resolve_member_uids(&org, Some(&context.requester_uid)); + let mut credit_line = org + .credit_lines + .get(&context.requester_uid) + .cloned() + .ok_or_else(|| "No active credit line is assigned to this member.".to_string())?; + credit_line.normalize(); + + if credit_line.amount_due <= 0.0 { + return Err("This credit line has no outstanding balance.".to_string()); + } + + let paid_amount = round_currency(context.amount.min(credit_line.amount_due)); + let principal_paid = if paid_amount >= credit_line.amount_due { + credit_line.outstanding_principal + } else { + round_currency( + paid_amount * (credit_line.outstanding_principal / credit_line.amount_due), + ) + .min(credit_line.outstanding_principal) + .min(paid_amount) + }; + let interest_paid = round_currency(paid_amount - principal_paid); + + credit_line.outstanding_principal = + round_currency(credit_line.outstanding_principal - principal_paid); + credit_line.amount_due = round_currency(credit_line.amount_due - paid_amount); + if credit_line.outstanding_principal <= 0.0 { + credit_line.outstanding_principal = 0.0; + } + if credit_line.amount_due <= 0.0 { + credit_line.amount_due = 0.0; + } + credit_line.amount = credit_line.available_amount; + + org.funds = round_currency(org.funds + paid_amount); + org.credit_lines + .insert(context.requester_uid.clone(), credit_line.clone()); + self.repository.save(&org)?; + + Ok(OrgCreditLineRepaymentResult { + patch: build_org_patch(&org, &["funds", "credit_lines"])?, + member_uids, + paid_amount, + principal_paid, + interest_paid, + remaining_amount_due: credit_line.amount_due, + message: if credit_line.amount_due > 0.0 { + format!( + "Credit repayment posted. ${} paid with ${} still due.", + format_currency(paid_amount), + format_currency(credit_line.amount_due) + ) + } else { + format!( + "Credit repayment posted. ${} cleared the outstanding balance.", + format_currency(paid_amount) + ) + }, + org, + }) + } + + pub fn add_assets( + &self, + context: OrgGrantContext, + assets: Vec, + ) -> Result { + if context.org_id.trim().is_empty() { + return Err("A valid organization is required for asset updates.".to_string()); + } + if assets.is_empty() { + let org = self.get_org(context.org_id)?; + return Ok(OrgMutationResult { + org, + patch: HashMap::new(), + member_uids: Vec::new(), + message: String::new(), + }); + } + + let mut org = self.get_org(context.org_id)?; + for asset in assets { + if asset.classname.trim().is_empty() || asset.quantity <= 0 { + continue; + } + let category = asset.category.trim().to_ascii_lowercase(); + let category_assets = org.assets.entry(category.clone()).or_default(); + let entry = category_assets + .entry(asset.classname.clone()) + .or_insert_with(|| OrgAssetEntry { + classname: asset.classname.clone(), + asset_type: category.clone(), + quantity: 0, + }); + entry.quantity += asset.quantity; + } + + self.repository.save(&org)?; + + Ok(OrgMutationResult { + patch: build_org_patch(&org, &["assets"])?, + member_uids: resolve_member_uids(&org, Some(&context.requester_uid)), + message: String::new(), + org, + }) + } + + pub fn add_fleet_vehicles( + &self, + context: OrgGrantContext, + vehicles: Vec, + ) -> Result { + if context.org_id.trim().is_empty() { + return Err("A valid organization is required for fleet updates.".to_string()); + } + if vehicles.is_empty() { + let org = self.get_org(context.org_id)?; + return Ok(OrgMutationResult { + org, + patch: HashMap::new(), + member_uids: Vec::new(), + message: String::new(), + }); + } + + let mut org = self.get_org(context.org_id)?; + let mut fleet_index = org.fleet.len(); + for vehicle in vehicles { + if vehicle.classname.trim().is_empty() { + continue; + } + let fleet_type = vehicle.category.trim().to_ascii_lowercase(); + let mut fleet_key = format!("{}_{}", vehicle.classname, fleet_index); + while org.fleet.contains_key(&fleet_key) { + fleet_index += 1; + fleet_key = format!("{}_{}", vehicle.classname, fleet_index); + } + + org.fleet.insert( + fleet_key, + OrgFleetEntry { + classname: vehicle.classname.clone(), + name: vehicle.classname, + fleet_type, + status: "Ready".to_string(), + damage: "0%".to_string(), + }, + ); + fleet_index += 1; + } + + self.repository.save(&org)?; + + Ok(OrgMutationResult { + patch: build_org_patch(&org, &["fleet"])?, + member_uids: resolve_member_uids(&org, Some(&context.requester_uid)), + message: String::new(), + org, + }) + } + + pub fn leave_org(&self, context: OrgLeaveContext) -> Result { + if context.requester_uid.trim().is_empty() { + return Err("A valid player UID is required.".to_string()); + } + if context.org_id.trim().is_empty() || context.org_id.eq_ignore_ascii_case("default") { + return Err("You are already assigned to the default organization.".to_string()); + } + + let mut org = self.get_org(context.org_id)?; + if org.owner == context.requester_uid { + return Err( + "Organization owners must disband the organization instead of leaving it." + .to_string(), + ); + } + + let org_name = org.name.clone(); + org.members.remove(&context.requester_uid); + self.repository.save(&org)?; + + let mut default_org = self.init_org("default".to_string())?; + let requester_uid = context.requester_uid.clone(); + default_org.members.insert( + requester_uid.clone(), + MemberSummary { + uid: requester_uid, + name: if context.requester_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.requester_name + }, + }, + ); + self.repository.save(&default_org)?; + + Ok(OrgLeaveResult { + actor_organization: "default".to_string(), + message: format!( + "You left {} and returned to the default organization.", + org_name + ), + }) + } + + pub fn disband_org(&self, context: OrgLeaveContext) -> Result { + if context.requester_uid.trim().is_empty() { + return Err("A valid player UID is required.".to_string()); + } + if context.org_id.trim().is_empty() || context.org_id.eq_ignore_ascii_case("default") { + return Err("Only active player organizations can be disbanded.".to_string()); + } + + let org = self.get_org(context.org_id.clone())?; + if org.owner != context.requester_uid { + return Err("Only the organization owner can disband this organization.".to_string()); + } + + let org_name = org.name.clone(); + let mut default_org = self.init_org("default".to_string())?; + let mut member_results = Vec::new(); + let mut seen = HashSet::new(); + + for (member_uid, member) in &org.members { + if seen.insert(member_uid.clone()) { + default_org + .members + .insert(member_uid.clone(), member.clone()); + member_results.push(OrgDisbandMemberResult { + uid: member_uid.clone(), + requester: member_uid == &context.requester_uid, + actor_organization: "default".to_string(), + message: if member_uid == &context.requester_uid { + format!("Your organization, {}, has been disbanded.", org_name) + } else { + format!("{} has been disbanded.", org_name) + }, + }); + } + } + + if seen.insert(context.requester_uid.clone()) { + default_org.members.insert( + context.requester_uid.clone(), + MemberSummary { + uid: context.requester_uid.clone(), + name: if context.requester_name.trim().is_empty() { + "Unknown".to_string() + } else { + context.requester_name + }, + }, + ); + member_results.push(OrgDisbandMemberResult { + uid: context.requester_uid, + requester: true, + actor_organization: "default".to_string(), + message: format!("Your organization, {}, has been disbanded.", org_name), + }); + } + + self.repository.save(&default_org)?; + self.service.delete_org(context.org_id.clone())?; + self.repository.delete(&context.org_id)?; + + Ok(OrgDisbandResult { + message: format!("{} has been disbanded.", org_name), + members: member_results, + }) + } + + fn hydrate_org(&self, id: &str) -> Result { + let org = self + .service + .get_org(id.to_string()) + .map_err(|error| format!("Organization with ID '{}' not found: {}", id, error))?; + let assets = self.service.get_assets(id.to_string())?; + let fleet = self.service.get_fleet(id.to_string())?; + let members = self.service.get_members(id.to_string())?; + Ok(HotOrgRecord::from_parts(org, assets, fleet, members)) + } +} + +fn can_manage_treasury( + org: &HotOrgRecord, + requester_uid: &str, + requester_is_default_org_ceo: bool, +) -> bool { + org.owner == requester_uid + || ((org.id.eq_ignore_ascii_case("default") || org.owner.eq_ignore_ascii_case("server")) + && requester_is_default_org_ceo) +} + +fn resolve_member_uids(org: &HotOrgRecord, requester_uid: Option<&str>) -> Vec { + let mut member_uids = org.members.keys().cloned().collect::>(); + if let Some(uid) = requester_uid + && !uid.is_empty() + && !member_uids.iter().any(|member_uid| member_uid == uid) + { + member_uids.push(uid.to_string()); + } + member_uids +} + +fn build_org_patch(org: &HotOrgRecord, fields: &[&str]) -> Result, String> { + let mut patch = HashMap::new(); + for field in fields { + patch.insert((*field).to_string(), current_org_field_value(org, field)?); + } + Ok(patch) +} + +fn current_org_field_value(org: &HotOrgRecord, field: &str) -> Result { + match field { + "id" => Ok(json!(org.id)), + "owner" => Ok(json!(org.owner)), + "name" => Ok(json!(org.name)), + "funds" => Ok(json!(org.funds)), + "reputation" => Ok(json!(org.reputation)), + "credit_lines" => serde_json::to_value(&org.credit_lines) + .map_err(|error| format!("Failed to serialize org credit lines: {}", error)), + "assets" => serde_json::to_value(&org.assets) + .map_err(|error| format!("Failed to serialize org assets: {}", error)), + "fleet" => serde_json::to_value(&org.fleet) + .map_err(|error| format!("Failed to serialize org fleet: {}", error)), + "members" => serde_json::to_value(&org.members) + .map_err(|error| format!("Failed to serialize org members: {}", error)), + "pending_invites" => serde_json::to_value(&org.pending_invites) + .map_err(|error| format!("Failed to serialize org invites: {}", error)), + _ => Err(format!("Unknown field: {}", field)), + } +} + +fn format_currency(amount: f64) -> String { + let rounded = round_currency(amount).round() as i64; + let digits = rounded.to_string(); + let mut formatted = String::new(); + + for (index, character) in digits.chars().rev().enumerate() { + if index > 0 && index % 3 == 0 { + formatted.push(','); + } + formatted.push(character); + } + + formatted.chars().rev().collect() +} + +fn round_currency(amount: f64) -> f64 { + (amount.max(0.0) * 100.0).round() / 100.0 +} + +#[cfg(test)] +mod tests { + use super::*; + use forge_repositories::InMemoryOrgHotRepository; + + #[derive(Clone, Default)] + struct TestOrgRepository; + + impl OrgRepository for TestOrgRepository { + fn create(&self, _org: &Org) -> Result<(), String> { + Ok(()) + } + + fn get_by_id(&self, _id: &str) -> Result, String> { + Ok(None) + } + + fn update(&self, _org: &Org) -> Result<(), String> { + Ok(()) + } + + fn delete(&self, _id: &str) -> Result<(), String> { + Ok(()) + } + + fn exists(&self, _id: &str) -> Result { + Ok(false) + } + + fn add_member(&self, _org_id: &str, _member_uid: &str) -> Result<(), String> { + Ok(()) + } + + fn get_members(&self, _org_id: &str) -> Result, String> { + Ok(Vec::new()) + } + + fn remove_member(&self, _org_id: &str, _member_uid: &str) -> Result<(), String> { + Ok(()) + } + + fn get_assets( + &self, + _org_id: &str, + ) -> Result>, String> { + Ok(HashMap::new()) + } + + fn update_assets( + &self, + _org_id: &str, + _assets: &HashMap>, + ) -> Result<(), String> { + Ok(()) + } + + fn get_fleet(&self, _org_id: &str) -> Result, String> { + Ok(HashMap::new()) + } + + fn update_fleet( + &self, + _org_id: &str, + _fleet: &HashMap, + ) -> Result<(), String> { + Ok(()) + } + } + + fn test_hot_org() -> HotOrgRecord { + let mut members = HashMap::new(); + members.insert( + "member".to_string(), + MemberSummary { + uid: "member".to_string(), + name: "Medic Patient".to_string(), + }, + ); + + HotOrgRecord { + id: "org".to_string(), + owner: "owner".to_string(), + name: "Test Org".to_string(), + funds: 500.0, + reputation: 0, + credit_lines: HashMap::new(), + assets: HashMap::new(), + fleet: HashMap::new(), + members, + pending_invites: HashMap::new(), + } + } + + fn test_service( + hot_repository: InMemoryOrgHotRepository, + ) -> OrgHotStateService { + OrgHotStateService::new(TestOrgRepository, hot_repository) + } + + #[test] + fn org_funds_checkout_without_member_debt_only_reduces_funds() { + let hot_repository = InMemoryOrgHotRepository::new(); + hot_repository.save(&test_hot_org()).unwrap(); + let service = test_service(hot_repository); + + let result = service + .charge_checkout(OrgCheckoutContext { + requester_uid: "member".to_string(), + org_id: "org".to_string(), + requester_is_default_org_ceo: false, + allow_member_charge: true, + record_member_debt: false, + source: "org_funds".to_string(), + amount: 125.0, + commit: true, + }) + .unwrap(); + + assert_eq!(result.org.funds, 375.0); + assert!(result.org.credit_lines.is_empty()); + assert!(result.patch.contains_key("funds")); + assert!(!result.patch.contains_key("credit_lines")); + } + + #[test] + fn org_funds_checkout_can_record_member_debt() { + let hot_repository = InMemoryOrgHotRepository::new(); + hot_repository.save(&test_hot_org()).unwrap(); + let service = test_service(hot_repository); + + let result = service + .charge_checkout(OrgCheckoutContext { + requester_uid: "member".to_string(), + org_id: "org".to_string(), + requester_is_default_org_ceo: false, + allow_member_charge: true, + record_member_debt: true, + source: "org_funds".to_string(), + amount: 100.0, + commit: true, + }) + .unwrap(); + + let credit_line = result.org.credit_lines.get("member").unwrap(); + assert_eq!(result.org.funds, 400.0); + assert_eq!(credit_line.uid, "member"); + assert_eq!(credit_line.name, "Medic Patient"); + assert_eq!(credit_line.outstanding_principal, 100.0); + assert_eq!(credit_line.amount_due, 100.0); + assert_eq!(credit_line.available_amount, 0.0); + assert!(result.patch.contains_key("funds")); + assert!(result.patch.contains_key("credit_lines")); + } +} diff --git a/lib/services/src/phone.rs b/lib/services/src/phone.rs new file mode 100644 index 0000000..0444b19 --- /dev/null +++ b/lib/services/src/phone.rs @@ -0,0 +1,437 @@ +use forge_models::{PhoneEmail, PhoneMessage, PhonePayload}; +use forge_repositories::PhoneRepository; + +const FIELD_COMMANDER_UID: &str = "field_commander"; + +pub struct PhoneStateService { + repository: R, +} + +impl PhoneStateService { + pub fn new(repository: R) -> Self { + Self { repository } + } + + pub fn init(&self, uid: String) -> Result { + let uid = Self::validate_uid(uid)?; + self.repository.init(&uid)?; + self.repository.add_contact(&uid, &uid)?; + self.repository.add_contact(&uid, FIELD_COMMANDER_UID)?; + self.payload_for(&uid) + } + + pub fn add_contact(&self, uid: String, contact_uid: String) -> Result { + let uid = Self::validate_uid(uid)?; + let contact_uid = Self::validate_uid(contact_uid)?; + self.repository.add_contact(&uid, &contact_uid) + } + + pub fn remove_contact(&self, uid: String, contact_uid: String) -> Result { + let uid = Self::validate_uid(uid)?; + let contact_uid = Self::validate_uid(contact_uid)?; + self.repository.remove_contact(&uid, &contact_uid) + } + + pub fn list_contacts(&self, uid: String) -> Result, String> { + let uid = Self::validate_uid(uid)?; + self.repository.list_contacts(&uid) + } + + pub fn send_message( + &self, + from_uid: String, + to_uid: String, + message: String, + timestamp: String, + ) -> Result { + let from_uid = Self::validate_uid(from_uid)?; + let to_uid = Self::validate_uid(to_uid)?; + let message = Self::validate_non_empty(message, "Message body is required.")?; + Self::validate_send_target( + &from_uid, + &to_uid, + "Field Commander cannot receive player messages.", + )?; + let timestamp = Self::parse_timestamp(timestamp); + let id = format!( + "phone-message:{}:{}:{}", + from_uid, + to_uid, + self.repository.next_sequence()? + ); + let record = PhoneMessage { + id, + from: from_uid.clone(), + to: to_uid.clone(), + message, + timestamp, + read: false, + }; + + self.repository.append_message(&from_uid, record.clone())?; + if to_uid != from_uid { + self.repository.append_message(&to_uid, record.clone())?; + } + Ok(record) + } + + pub fn list_messages(&self, uid: String) -> Result, String> { + let uid = Self::validate_uid(uid)?; + self.repository.list_messages(&uid) + } + + pub fn message_thread( + &self, + uid: String, + other_uid: String, + ) -> Result, String> { + let uid = Self::validate_uid(uid)?; + let other_uid = Self::validate_uid(other_uid)?; + Ok(self + .repository + .list_messages(&uid)? + .into_iter() + .filter(|message| { + (message.from == uid && message.to == other_uid) + || (message.from == other_uid && message.to == uid) + }) + .collect()) + } + + pub fn mark_message_read(&self, uid: String, message_id: String) -> Result { + let uid = Self::validate_uid(uid)?; + let message_id = Self::validate_non_empty(message_id, "Message ID is required.")?; + self.repository.mark_message_read(&uid, &message_id) + } + + pub fn delete_message(&self, uid: String, message_id: String) -> Result { + let uid = Self::validate_uid(uid)?; + let message_id = Self::validate_non_empty(message_id, "Message ID is required.")?; + self.repository.delete_message(&uid, &message_id) + } + + pub fn send_email( + &self, + from_uid: String, + to_uid: String, + subject: String, + body: String, + timestamp: String, + ) -> Result { + let from_uid = Self::validate_uid(from_uid)?; + let to_uid = Self::validate_uid(to_uid)?; + let subject = Self::default_subject(subject); + let body = Self::validate_non_empty(body, "Email body is required.")?; + Self::validate_send_target( + &from_uid, + &to_uid, + "Field Commander cannot receive player emails.", + )?; + let timestamp = Self::parse_timestamp(timestamp); + let id = format!( + "phone-email:{}:{}:{}", + from_uid, + to_uid, + self.repository.next_sequence()? + ); + let record = PhoneEmail { + id, + from: from_uid.clone(), + to: to_uid.clone(), + subject, + body, + timestamp, + read: false, + }; + + self.repository.append_email(&to_uid, record.clone())?; + if from_uid != to_uid { + self.repository.append_email(&from_uid, record.clone())?; + self.repository.mark_email_read(&from_uid, &record.id)?; + } + Ok(record) + } + + pub fn list_emails(&self, uid: String) -> Result, String> { + let uid = Self::validate_uid(uid)?; + self.repository.list_emails(&uid) + } + + pub fn mark_email_read(&self, uid: String, email_id: String) -> Result { + let uid = Self::validate_uid(uid)?; + let email_id = Self::validate_non_empty(email_id, "Email ID is required.")?; + self.repository.mark_email_read(&uid, &email_id) + } + + pub fn delete_email(&self, uid: String, email_id: String) -> Result { + let uid = Self::validate_uid(uid)?; + let email_id = Self::validate_non_empty(email_id, "Email ID is required.")?; + self.repository.delete_email(&uid, &email_id) + } + + pub fn remove(&self, uid: String) -> Result<(), String> { + let uid = Self::validate_uid(uid)?; + self.repository.remove_phone(&uid) + } + + fn payload_for(&self, uid: &str) -> Result { + Ok(PhonePayload { + contacts: self.repository.list_contacts(uid)?, + messages: self.repository.list_messages(uid)?, + emails: self.repository.list_emails(uid)?, + }) + } + + fn validate_uid(uid: String) -> Result { + let uid = uid.trim().to_string(); + if uid.is_empty() { + Err("UID is required.".to_string()) + } else { + Ok(uid) + } + } + + fn validate_non_empty(value: String, message: &str) -> Result { + let value = value.trim().to_string(); + if value.is_empty() { + Err(message.to_string()) + } else { + Ok(value) + } + } + + fn default_subject(value: String) -> String { + let value = value.trim().to_string(); + if value.is_empty() { + "No subject".to_string() + } else { + value + } + } + + fn validate_send_target(from_uid: &str, to_uid: &str, message: &str) -> Result<(), String> { + if to_uid == FIELD_COMMANDER_UID && from_uid != FIELD_COMMANDER_UID { + Err(message.to_string()) + } else { + Ok(()) + } + } + + fn parse_timestamp(timestamp: String) -> f64 { + timestamp.trim().parse::().unwrap_or_default() + } +} + +#[cfg(test)] +mod tests { + use super::PhoneStateService; + use forge_repositories::InMemoryPhoneRepository; + + #[test] + fn send_message_indexes_sender_and_receiver_threads() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + let message = service + .send_message( + "sender".to_string(), + "receiver".to_string(), + "Test".to_string(), + "123".to_string(), + ) + .expect("message should send"); + + assert_eq!( + service + .list_messages("sender".to_string()) + .expect("sender messages should load") + .len(), + 1 + ); + assert_eq!( + service + .message_thread("receiver".to_string(), "sender".to_string()) + .expect("thread should load") + .first() + .map(|entry| entry.id.clone()), + Some(message.id) + ); + } + + #[test] + fn contact_can_reference_self_for_owner_card() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + assert!( + service + .add_contact("same".to_string(), "same".to_string()) + .expect("self contact should be allowed") + ); + } + + #[test] + fn init_seeds_owner_and_field_commander_contacts() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + let payload = service + .init("player".to_string()) + .expect("phone should initialize"); + + assert!(payload.contacts.iter().any(|uid| uid == "player")); + assert!(payload.contacts.iter().any(|uid| uid == "field_commander")); + } + + #[test] + fn player_cannot_message_field_commander() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + assert!( + service + .send_message( + "player".to_string(), + "field_commander".to_string(), + "Test".to_string(), + "123".to_string(), + ) + .is_err() + ); + } + + #[test] + fn field_commander_can_message_player() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + assert!( + service + .send_message( + "field_commander".to_string(), + "player".to_string(), + "Orders".to_string(), + "123".to_string(), + ) + .is_ok() + ); + } + + #[test] + fn player_cannot_email_field_commander() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + assert!( + service + .send_email( + "player".to_string(), + "field_commander".to_string(), + "Subject".to_string(), + "Body".to_string(), + "123".to_string(), + ) + .is_err() + ); + } + + #[test] + fn email_allows_empty_subject() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + let email = service + .send_email( + "player".to_string(), + "player".to_string(), + "".to_string(), + "Body".to_string(), + "123".to_string(), + ) + .expect("email should allow empty subject"); + + assert_eq!(email.subject, "No subject"); + } + + #[test] + fn self_message_is_indexed_once() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + service + .send_message( + "same".to_string(), + "same".to_string(), + "Test".to_string(), + "123".to_string(), + ) + .expect("self message should send"); + + assert_eq!( + service + .list_messages("same".to_string()) + .expect("self messages should load") + .len(), + 1 + ); + } + + #[test] + fn delete_message_removes_only_requesting_users_index() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + let message = service + .send_message( + "sender".to_string(), + "receiver".to_string(), + "Test".to_string(), + "123".to_string(), + ) + .expect("message should send"); + + assert!( + service + .delete_message("sender".to_string(), message.id.clone()) + .expect("message should delete") + ); + assert!( + service + .list_messages("sender".to_string()) + .expect("sender messages should load") + .is_empty() + ); + assert_eq!( + service + .list_messages("receiver".to_string()) + .expect("receiver messages should load") + .len(), + 1 + ); + } + + #[test] + fn delete_email_removes_requesting_users_index() { + let service = PhoneStateService::new(InMemoryPhoneRepository::new()); + + let email = service + .send_email( + "sender".to_string(), + "receiver".to_string(), + "Subject".to_string(), + "Body".to_string(), + "123".to_string(), + ) + .expect("email should send"); + + assert!( + service + .delete_email("receiver".to_string(), email.id.clone()) + .expect("email should delete") + ); + assert!( + service + .list_emails("receiver".to_string()) + .expect("receiver emails should load") + .is_empty() + ); + assert_eq!( + service + .list_emails("sender".to_string()) + .expect("sender emails should remain") + .len(), + 1 + ); + } +} diff --git a/lib/services/src/store.rs b/lib/services/src/store.rs new file mode 100644 index 0000000..d7656d0 --- /dev/null +++ b/lib/services/src/store.rs @@ -0,0 +1,698 @@ +use forge_models::{ + Bank, BankCheckoutContext, BankMutationResult, EquipmentCategory, HotOrgRecord, Item, Locker, + OrgFleetEntry, StoreCheckoutContext, StoreCheckoutResult, StoreGrantedItem, + StoreGrantedVehicle, VGarage, VLocker, VehicleCategory, +}; +use forge_repositories::{ + BankHotRepository, BankRepository, LockerHotRepository, LockerRepository, OrgHotRepository, + OrgRepository, VGarageHotRepository, VGarageRepository, VLockerHotRepository, + VLockerRepository, +}; +use serde_json::json; +use std::collections::HashMap; + +use crate::{ + BankHotStateService, LockerHotStateService, OrgHotStateService, VGarageHotStateService, + VLockerHotStateService, +}; + +pub trait StoreBankBackend { + fn get_bank(&self, uid: &str) -> Result; + fn preview_checkout( + &self, + uid: &str, + amount: f64, + source: &str, + ) -> Result; + fn override_bank(&self, uid: &str, bank: &Bank) -> Result; +} + +pub trait StoreOrgBackend { + fn get_org(&self, org_id: &str) -> Result; + fn override_org(&self, org_id: &str, org: HotOrgRecord) -> Result; +} + +pub trait StoreLockerBackend { + fn get_locker(&self, uid: &str) -> Result; + fn override_locker(&self, uid: &str, items: HashMap) -> Result; +} + +pub trait StoreVLockerBackend { + fn fetch_locker(&self, uid: &str) -> Result; + fn override_locker(&self, uid: &str, locker: VLocker) -> Result; +} + +pub trait StoreVGarageBackend { + fn fetch_garage(&self, uid: &str) -> Result; + fn override_garage(&self, uid: &str, garage: VGarage) -> Result; +} + +impl StoreBankBackend for BankHotStateService { + fn get_bank(&self, uid: &str) -> Result { + BankHotStateService::get_bank(self, uid.to_string()) + } + + fn preview_checkout( + &self, + uid: &str, + amount: f64, + source: &str, + ) -> Result { + BankHotStateService::charge_checkout( + self, + uid.to_string(), + amount, + BankCheckoutContext { + source_field: source.to_string(), + commit: false, + }, + ) + } + + fn override_bank(&self, uid: &str, bank: &Bank) -> Result { + let json = serde_json::to_string(bank) + .map_err(|error| format!("Invalid bank override JSON: {}", error))?; + BankHotStateService::override_bank(self, uid.to_string(), json) + } +} + +impl StoreBankBackend for &BankHotStateService { + fn get_bank(&self, uid: &str) -> Result { + BankHotStateService::get_bank(self, uid.to_string()) + } + + fn preview_checkout( + &self, + uid: &str, + amount: f64, + source: &str, + ) -> Result { + BankHotStateService::charge_checkout( + self, + uid.to_string(), + amount, + BankCheckoutContext { + source_field: source.to_string(), + commit: false, + }, + ) + } + + fn override_bank(&self, uid: &str, bank: &Bank) -> Result { + let json = serde_json::to_string(bank) + .map_err(|error| format!("Invalid bank override JSON: {}", error))?; + BankHotStateService::override_bank(self, uid.to_string(), json) + } +} + +impl StoreOrgBackend for OrgHotStateService { + fn get_org(&self, org_id: &str) -> Result { + OrgHotStateService::get_org(self, org_id.to_string()) + } + + fn override_org(&self, org_id: &str, org: HotOrgRecord) -> Result { + OrgHotStateService::override_org(self, org_id.to_string(), org) + } +} + +impl StoreOrgBackend for &OrgHotStateService { + fn get_org(&self, org_id: &str) -> Result { + OrgHotStateService::get_org(self, org_id.to_string()) + } + + fn override_org(&self, org_id: &str, org: HotOrgRecord) -> Result { + OrgHotStateService::override_org(self, org_id.to_string(), org) + } +} + +impl StoreLockerBackend + for LockerHotStateService +{ + fn get_locker(&self, uid: &str) -> Result { + LockerHotStateService::get_locker(self, uid.to_string()) + } + + fn override_locker(&self, uid: &str, items: HashMap) -> Result { + LockerHotStateService::override_locker(self, uid.to_string(), items) + } +} + +impl StoreLockerBackend + for &LockerHotStateService +{ + fn get_locker(&self, uid: &str) -> Result { + LockerHotStateService::get_locker(self, uid.to_string()) + } + + fn override_locker(&self, uid: &str, items: HashMap) -> Result { + LockerHotStateService::override_locker(self, uid.to_string(), items) + } +} + +impl StoreVLockerBackend + for VLockerHotStateService +{ + fn fetch_locker(&self, uid: &str) -> Result { + VLockerHotStateService::fetch_locker(self, uid) + } + + fn override_locker(&self, uid: &str, locker: VLocker) -> Result { + VLockerHotStateService::override_locker(self, uid, locker) + } +} + +impl StoreVLockerBackend + for &VLockerHotStateService +{ + fn fetch_locker(&self, uid: &str) -> Result { + VLockerHotStateService::fetch_locker(self, uid) + } + + fn override_locker(&self, uid: &str, locker: VLocker) -> Result { + VLockerHotStateService::override_locker(self, uid, locker) + } +} + +impl StoreVGarageBackend + for VGarageHotStateService +{ + fn fetch_garage(&self, uid: &str) -> Result { + VGarageHotStateService::fetch_garage(self, uid) + } + + fn override_garage(&self, uid: &str, garage: VGarage) -> Result { + VGarageHotStateService::override_garage(self, uid, garage) + } +} + +impl StoreVGarageBackend + for &VGarageHotStateService +{ + fn fetch_garage(&self, uid: &str) -> Result { + VGarageHotStateService::fetch_garage(self, uid) + } + + fn override_garage(&self, uid: &str, garage: VGarage) -> Result { + VGarageHotStateService::override_garage(self, uid, garage) + } +} + +pub struct StoreService { + bank: B, + org: O, + locker: L, + vlocker: VL, + vgarage: VG, +} + +impl StoreService { + pub fn new(bank: B, org: O, locker: L, vlocker: VL, vgarage: VG) -> Self { + Self { + bank, + org, + locker, + vlocker, + vgarage, + } + } +} + +impl StoreService +where + B: StoreBankBackend, + O: StoreOrgBackend, + L: StoreLockerBackend, + VL: StoreVLockerBackend, + VG: StoreVGarageBackend, +{ + pub fn checkout(&self, context: StoreCheckoutContext) -> Result { + if context.requester_uid.trim().is_empty() { + return Err("A valid requester UID is required.".to_string()); + } + if context.items.is_empty() && context.vehicles.is_empty() { + return Err("Add at least one item before checkout.".to_string()); + } + + let charged_total = checkout_total(&context); + if charged_total <= 0.0 { + return Err("Checkout total must be greater than zero.".to_string()); + } + + let requester_uid = context.requester_uid.trim(); + let payment_method = context.payment_method.trim().to_ascii_lowercase(); + + let original_locker = self.locker.get_locker(requester_uid)?; + let original_vlocker = self.vlocker.fetch_locker(requester_uid)?; + let original_vgarage = self.vgarage.fetch_garage(requester_uid)?; + + let mut next_locker = original_locker.clone(); + let mut next_vlocker = original_vlocker.clone(); + let mut next_vgarage = original_vgarage.clone(); + + let mut locker_patch = HashMap::new(); + let mut va_patch = HashMap::new(); + let mut vgarage_patch = HashMap::new(); + let mut locker_granted = Vec::new(); + let mut vehicle_granted = Vec::new(); + let mut va_categories_changed: Vec<&str> = Vec::new(); + let mut vgarage_categories_changed: Vec<&str> = Vec::new(); + + for item_seed in &context.items { + if item_seed.classname.trim().is_empty() || item_seed.quantity == 0 { + return Err("Checkout contains an invalid item entry.".to_string()); + } + + let locker_category = resolve_locker_category(&item_seed.category)?; + let arsenal_category = resolve_arsenal_category(&item_seed.category)?; + + let existing_amount = next_locker + .items + .get(&item_seed.classname) + .map(|entry| entry.amount) + .unwrap_or(0); + let updated_item = Item { + category: locker_category.to_string(), + classname: item_seed.classname.clone(), + amount: existing_amount.saturating_add(item_seed.quantity), + }; + + next_locker + .items + .insert(item_seed.classname.clone(), updated_item.clone()); + locker_patch.insert( + item_seed.classname.clone(), + serde_json::to_value(&updated_item) + .map_err(|error| format!("Failed to serialize locker patch: {}", error))?, + ); + locker_granted.push(StoreGrantedItem { + classname: item_seed.classname.clone(), + category: locker_category.to_string(), + quantity: item_seed.quantity, + }); + + match arsenal_category { + EquipmentCategory::Items => { + push_unique(&mut next_vlocker.items, &item_seed.classname); + push_unique_str(&mut va_categories_changed, "items"); + } + EquipmentCategory::Weapons => { + push_unique(&mut next_vlocker.weapons, &item_seed.classname); + push_unique_str(&mut va_categories_changed, "weapons"); + } + EquipmentCategory::Magazines => { + push_unique(&mut next_vlocker.magazines, &item_seed.classname); + push_unique_str(&mut va_categories_changed, "magazines"); + } + EquipmentCategory::Backpacks => { + push_unique(&mut next_vlocker.backpacks, &item_seed.classname); + push_unique_str(&mut va_categories_changed, "backpacks"); + } + } + } + + if next_locker.items.len() > 25 { + return Err( + "Locker capacity would exceed 25 unique items. Clear space before checkout." + .to_string(), + ); + } + + for category in va_categories_changed { + match category { + "items" => { + va_patch.insert(category.to_string(), json!(next_vlocker.items)); + } + "weapons" => { + va_patch.insert(category.to_string(), json!(next_vlocker.weapons)); + } + "magazines" => { + va_patch.insert(category.to_string(), json!(next_vlocker.magazines)); + } + "backpacks" => { + va_patch.insert(category.to_string(), json!(next_vlocker.backpacks)); + } + _ => {} + } + } + + for vehicle_seed in &context.vehicles { + if vehicle_seed.classname.trim().is_empty() { + return Err("Vehicle checkout entry was missing a classname.".to_string()); + } + + let vehicle_category = resolve_vehicle_category(&vehicle_seed.category)?; + match vehicle_category { + VehicleCategory::Cars => { + push_unique(&mut next_vgarage.cars, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "cars"); + } + VehicleCategory::Armor => { + push_unique(&mut next_vgarage.armor, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "armor"); + } + VehicleCategory::Helis => { + push_unique(&mut next_vgarage.helis, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "helis"); + } + VehicleCategory::Planes => { + push_unique(&mut next_vgarage.planes, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "planes"); + } + VehicleCategory::Naval => { + push_unique(&mut next_vgarage.naval, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "naval"); + } + VehicleCategory::Other => { + push_unique(&mut next_vgarage.other, &vehicle_seed.classname); + push_unique_str(&mut vgarage_categories_changed, "other"); + } + } + + vehicle_granted.push(StoreGrantedVehicle { + classname: vehicle_seed.classname.clone(), + category: vehicle_seed.category.clone(), + }); + } + + for category in vgarage_categories_changed { + match category { + "cars" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.cars)); + } + "armor" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.armor)); + } + "helis" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.helis)); + } + "planes" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.planes)); + } + "naval" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.naval)); + } + "other" => { + vgarage_patch.insert(category.to_string(), json!(next_vgarage.other)); + } + _ => {} + } + } + + let mut bank_patch = HashMap::new(); + let mut final_bank = None; + let mut original_bank = None; + + let mut org_patch = HashMap::new(); + let mut org_target_uids = Vec::new(); + let mut final_org = None; + let mut original_org = None; + + match payment_method.as_str() { + "cash" | "bank" => { + original_bank = Some(self.bank.get_bank(requester_uid)?); + let preview = self.bank.preview_checkout( + requester_uid, + charged_total, + payment_method.as_str(), + )?; + bank_patch = preview.patch.clone(); + final_bank = Some(preview.account); + } + "org_funds" | "credit_line" => { + if context.org_id.trim().is_empty() { + return Err("A valid organization is required for this checkout.".to_string()); + } + + let mut org = self.org.get_org(&context.org_id)?; + original_org = Some(org.clone()); + + match payment_method.as_str() { + "org_funds" => { + if !can_manage_treasury( + &org, + requester_uid, + context.requester_is_default_org_ceo, + ) { + return Err( + "Only the organization leader or CEO can charge org funds." + .to_string(), + ); + } + if org.funds < charged_total { + return Err( + "Organization funds cannot cover this checkout.".to_string() + ); + } + org.funds -= charged_total; + org_patch.insert("funds".to_string(), json!(org.funds)); + } + "credit_line" => { + let credit_line = + org.credit_lines.get_mut(requester_uid).ok_or_else(|| { + "Assigned credit line cannot cover this checkout.".to_string() + })?; + credit_line.normalize(); + if credit_line.available_amount < charged_total { + return Err( + "Assigned credit line cannot cover this checkout.".to_string() + ); + } + + credit_line.available_amount = + round_currency(credit_line.available_amount - charged_total); + credit_line.approved_amount = credit_line.available_amount; + credit_line.outstanding_principal = + round_currency(credit_line.outstanding_principal + charged_total); + credit_line.amount_due = round_currency( + credit_line.amount_due + + (charged_total * (1.0 + credit_line.interest_rate)), + ); + credit_line.amount = credit_line.available_amount; + org_patch.insert("credit_lines".to_string(), json!(org.credit_lines)); + } + _ => unreachable!(), + } + + if payment_method == "org_funds" && !context.vehicles.is_empty() { + add_org_fleet_vehicles(&mut org, &context.vehicles); + org_patch.insert("fleet".to_string(), json!(org.fleet)); + } + + org_target_uids = resolve_member_uids(&org, Some(requester_uid)); + final_org = Some(org); + } + _ => return Err("Selected payment source is unsupported.".to_string()), + } + + let mut locker_saved = false; + let mut vlocker_saved = false; + let mut vgarage_saved = false; + let mut org_saved = false; + + let commit_result = (|| -> Result<(), String> { + if !locker_patch.is_empty() { + self.locker + .override_locker(requester_uid, next_locker.items.clone())?; + locker_saved = true; + } + + if !va_patch.is_empty() { + self.vlocker + .override_locker(requester_uid, next_vlocker.clone())?; + vlocker_saved = true; + } + + if !vgarage_patch.is_empty() { + self.vgarage + .override_garage(requester_uid, next_vgarage.clone())?; + vgarage_saved = true; + } + + if let Some(org) = final_org.clone() { + self.org.override_org(&context.org_id, org)?; + org_saved = true; + } + + if let Some(bank) = final_bank.as_ref() { + self.bank.override_bank(requester_uid, bank)?; + } + + Ok(()) + })(); + + if let Err(error) = commit_result { + if org_saved && let Some(org) = original_org { + let org_id = org.id.clone(); + let _ = self.org.override_org(&org_id, org); + } + if vgarage_saved { + let _ = self + .vgarage + .override_garage(requester_uid, original_vgarage); + } + if vlocker_saved { + let _ = self + .vlocker + .override_locker(requester_uid, original_vlocker); + } + if locker_saved { + let _ = self + .locker + .override_locker(requester_uid, original_locker.items); + } + if let Some(bank) = original_bank { + let _ = self.bank.override_bank(requester_uid, &bank); + } + return Err(error); + } + + Ok(StoreCheckoutResult { + charged_total, + payment_method, + message: format!( + "Checkout completed. {} charged, {} locker grant(s), {} vehicle unlock(s).", + format_currency(charged_total), + locker_granted.len(), + vehicle_granted.len() + ), + locker_granted, + vehicle_granted, + locker_patch, + va_patch, + vgarage_patch, + bank_patch, + org_patch, + org_target_uids, + }) + } +} + +fn checkout_total(context: &StoreCheckoutContext) -> f64 { + let item_total = context + .items + .iter() + .map(|entry| entry.price_value.max(0.0) * f64::from(entry.quantity)) + .sum::(); + let vehicle_total = context + .vehicles + .iter() + .map(|entry| entry.price_value.max(0.0)) + .sum::(); + + (item_total + vehicle_total).floor() +} + +fn resolve_locker_category(category: &str) -> Result<&'static str, String> { + match category.trim().to_ascii_lowercase().as_str() { + "item" | "attachment" => Ok("item"), + "weapon" => Ok("weapon"), + "magazine" => Ok("magazine"), + "backpack" => Ok("backpack"), + other => Err(format!("Store item category '{}' is unsupported.", other)), + } +} + +fn resolve_arsenal_category(category: &str) -> Result { + match category.trim().to_ascii_lowercase().as_str() { + "item" | "attachment" => Ok(EquipmentCategory::Items), + "weapon" => Ok(EquipmentCategory::Weapons), + "magazine" => Ok(EquipmentCategory::Magazines), + "backpack" => Ok(EquipmentCategory::Backpacks), + other => Err(format!("Store item category '{}' is unsupported.", other)), + } +} + +fn resolve_vehicle_category(category: &str) -> Result { + match category.trim().to_ascii_lowercase().as_str() { + "cars" => Ok(VehicleCategory::Cars), + "armor" => Ok(VehicleCategory::Armor), + "helis" | "heli" => Ok(VehicleCategory::Helis), + "planes" => Ok(VehicleCategory::Planes), + "naval" => Ok(VehicleCategory::Naval), + "other" => Ok(VehicleCategory::Other), + other => Err(format!("Vehicle category '{}' is unsupported.", other)), + } +} + +fn push_unique(values: &mut Vec, value: &str) { + if !values.iter().any(|entry| entry == value) { + values.push(value.to_string()); + } +} + +fn push_unique_str<'a>(values: &mut Vec<&'a str>, value: &'a str) { + if !values.contains(&value) { + values.push(value); + } +} + +fn can_manage_treasury( + org: &HotOrgRecord, + requester_uid: &str, + requester_is_default_org_ceo: bool, +) -> bool { + org.owner == requester_uid + || ((org.id.eq_ignore_ascii_case("default") || org.owner.eq_ignore_ascii_case("server")) + && requester_is_default_org_ceo) +} + +fn resolve_member_uids(org: &HotOrgRecord, requester_uid: Option<&str>) -> Vec { + let mut member_uids = org.members.keys().cloned().collect::>(); + if let Some(uid) = requester_uid + && !uid.is_empty() + && !member_uids.iter().any(|member_uid| member_uid == uid) + { + member_uids.push(uid.to_string()); + } + member_uids +} + +fn add_org_fleet_vehicles( + org: &mut HotOrgRecord, + vehicles: &[forge_models::StoreCheckoutVehicleSeed], +) { + let mut fleet_index = org.fleet.len(); + for vehicle in vehicles { + if vehicle.classname.trim().is_empty() { + continue; + } + + let fleet_type = vehicle.category.trim().to_ascii_lowercase(); + let mut fleet_key = format!("{}_{}", vehicle.classname, fleet_index); + while org.fleet.contains_key(&fleet_key) { + fleet_index += 1; + fleet_key = format!("{}_{}", vehicle.classname, fleet_index); + } + + org.fleet.insert( + fleet_key, + OrgFleetEntry { + classname: vehicle.classname.clone(), + name: vehicle.classname.clone(), + fleet_type, + status: "Ready".to_string(), + damage: "0%".to_string(), + }, + ); + fleet_index += 1; + } +} + +fn format_currency(amount: f64) -> String { + let rounded = amount.max(0.0).round() as i64; + let digits = rounded.to_string(); + let mut formatted = String::new(); + + for (index, character) in digits.chars().rev().enumerate() { + if index > 0 && index % 3 == 0 { + formatted.push(','); + } + formatted.push(character); + } + + format!("${}", formatted.chars().rev().collect::()) +} + +fn round_currency(amount: f64) -> f64 { + (amount.max(0.0) * 100.0).round() / 100.0 +} diff --git a/lib/services/src/task.rs b/lib/services/src/task.rs new file mode 100644 index 0000000..3f803d5 --- /dev/null +++ b/lib/services/src/task.rs @@ -0,0 +1,519 @@ +use forge_models::{ + TaskOwnershipContext, TaskOwnershipMutationResult, TaskRecord, TaskRewardContext, +}; +use forge_repositories::TaskRepository; +use serde_json::Value; + +pub struct TaskStateService { + repository: R, +} + +impl TaskStateService { + pub fn new(repository: R) -> Self { + Self { repository } + } + + pub fn reset(&self) -> Result { + self.repository.reset()?; + Ok(true) + } + + pub fn upsert_catalog_entry( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let mut entry = Self::parse_record(&json_data)?; + Self::normalize_catalog_entry(&mut entry, &entry_id); + self.repository + .save_catalog_entry(entry_id, entry.clone())?; + Ok(entry) + } + + pub fn get_catalog_entry(&self, entry_id: String) -> Result, String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository + .get_catalog_entry(&entry_id) + .map(|entry| entry.map(TaskRecord::into_value)) + } + + pub fn delete_catalog_entry(&self, entry_id: String) -> Result<(), String> { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_catalog_entry(&entry_id) + } + + pub fn list_active_catalog(&self) -> Result, String> { + let catalog = self.repository.list_catalog()?; + let mut active_entries = Vec::new(); + + for (task_id, entry) in catalog { + let status = self.derive_catalog_status(&task_id, &entry)?; + if !matches!(status.as_str(), "available" | "assigned" | "active") { + continue; + } + + let mut entry = entry.fields.clone(); + entry.insert("taskId".to_string(), Value::String(task_id.clone())); + entry.insert("taskID".to_string(), Value::String(task_id)); + entry.insert("status".to_string(), Value::String(status)); + active_entries.push(Value::Object(entry)); + } + + Ok(active_entries) + } + + pub fn bind_ownership( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let mut ownership = Self::parse_ownership_context(&json_data)?; + if ownership.org_id.trim().is_empty() { + ownership.org_id = "default".to_string(); + } + + self.repository + .save_ownership(entry_id.clone(), ownership.clone())?; + let accepted = !ownership.requester_uid.trim().is_empty(); + let entry = self.patch_catalog_ownership( + &entry_id, + accepted, + &ownership.requester_uid, + &ownership.org_id, + )?; + + Ok(TaskOwnershipMutationResult { + task_id: entry_id, + requester_uid: ownership.requester_uid, + org_id: ownership.org_id, + entry, + message: "Task ownership updated.".to_string(), + }) + } + + pub fn release_ownership( + &self, + entry_id: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let ownership = self + .repository + .get_ownership(&entry_id)? + .unwrap_or_default(); + self.repository.delete_ownership(&entry_id)?; + let entry = self.patch_catalog_ownership(&entry_id, false, "", "default")?; + + Ok(TaskOwnershipMutationResult { + task_id: entry_id, + requester_uid: ownership.requester_uid, + org_id: ownership.org_id, + entry, + message: "Task ownership released.".to_string(), + }) + } + + pub fn accept_task( + &self, + entry_id: String, + json_data: String, + ) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let ownership = Self::parse_ownership_context(&json_data)?; + if ownership.requester_uid.trim().is_empty() { + return Err("Missing task ID or requester UID.".to_string()); + } + + if !matches!( + self.get_status(entry_id.clone())?.as_str(), + "assigned" | "active" + ) { + return Err("Task is not assigned or active.".to_string()); + } + + if let Some(existing) = self.repository.get_ownership(&entry_id)? + && !existing.requester_uid.trim().is_empty() + && existing.requester_uid != ownership.requester_uid + { + return Err("Task has already been accepted.".to_string()); + } + + let mut result = self.bind_ownership( + entry_id, + serde_json::to_string(&ownership) + .map_err(|error| format!("Failed to serialize task ownership: {error}"))?, + )?; + result.message = "Task accepted.".to_string(); + Ok(result) + } + + pub fn set_status(&self, entry_id: String, status: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let final_status = Self::validate_status(status)?; + self.repository + .set_active_status(entry_id.clone(), final_status.clone())?; + if matches!(final_status.as_str(), "succeeded" | "failed") { + self.repository + .set_completed_status(entry_id, final_status)?; + } else { + self.repository.delete_completed_status(&entry_id)?; + } + + Ok(true) + } + + pub fn get_status(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + if let Some(status) = self.repository.get_active_status(&entry_id)? { + return Ok(status); + } + + if let Some(status) = self.repository.get_completed_status(&entry_id)? { + return Ok(status); + } + + let Some(entry) = self.repository.get_catalog_entry(&entry_id)? else { + return Ok(String::new()); + }; + + Ok(Self::default_catalog_status(&entry)) + } + + pub fn clear_status(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_active_status(&entry_id)?; + self.repository.delete_completed_status(&entry_id)?; + Ok(true) + } + + pub fn get_reward_context(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + let ownership = self + .repository + .get_ownership(&entry_id)? + .unwrap_or_default(); + Ok(TaskRewardContext { + requester_uid: ownership.requester_uid, + org_id: ownership.org_id, + }) + } + + pub fn increment_defuse_count(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.increment_defuse_count(&entry_id) + } + + pub fn get_defuse_count(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.get_defuse_count(&entry_id) + } + + pub fn clear_task(&self, entry_id: String) -> Result { + let entry_id = Self::validate_entry_id(entry_id)?; + self.repository.delete_catalog_entry(&entry_id)?; + self.repository.delete_ownership(&entry_id)?; + self.repository.delete_active_status(&entry_id)?; + self.repository.delete_completed_status(&entry_id)?; + self.repository.clear_defuse_count(&entry_id)?; + Ok(true) + } + + fn patch_catalog_ownership( + &self, + entry_id: &str, + accepted: bool, + requester_uid: &str, + org_id: &str, + ) -> Result { + let Some(mut entry) = self.repository.get_catalog_entry(entry_id)? else { + return Ok(Value::Null); + }; + + entry + .fields + .insert("accepted".to_string(), Value::Bool(accepted)); + entry.fields.insert( + "requesterUid".to_string(), + Value::String(requester_uid.to_string()), + ); + entry + .fields + .insert("orgID".to_string(), Value::String(org_id.to_string())); + Self::normalize_catalog_entry(&mut entry, entry_id); + self.repository + .save_catalog_entry(entry_id.to_string(), entry.clone())?; + Ok(entry.into_value()) + } + + fn derive_catalog_status(&self, entry_id: &str, entry: &TaskRecord) -> Result { + if let Some(status) = self.repository.get_active_status(entry_id)? { + return Ok(status); + } + + if let Some(status) = self.repository.get_completed_status(entry_id)? { + return Ok(status); + } + + Ok(Self::default_catalog_status(entry)) + } + + fn default_catalog_status(entry: &TaskRecord) -> String { + if entry + .fields + .get("locked") + .and_then(Value::as_bool) + .unwrap_or(false) + { + "locked".to_string() + } else { + "available".to_string() + } + } + + fn normalize_catalog_entry(entry: &mut TaskRecord, entry_id: &str) { + let fields = &mut entry.fields; + fields + .entry("accepted".to_string()) + .or_insert(Value::Bool(false)); + fields + .entry("requesterUid".to_string()) + .or_insert(Value::String(String::new())); + fields + .entry("orgID".to_string()) + .or_insert(Value::String("default".to_string())); + fields + .entry("taskId".to_string()) + .or_insert(Value::String(entry_id.to_string())); + fields + .entry("taskID".to_string()) + .or_insert(Value::String(entry_id.to_string())); + } + + fn validate_entry_id(entry_id: String) -> Result { + if entry_id.trim().is_empty() { + return Err("Task ID is required.".to_string()); + } + + Ok(entry_id) + } + + fn validate_status(status: String) -> Result { + if status.trim().is_empty() { + return Err("Task status is required.".to_string()); + } + + Ok(status) + } + + fn parse_record(json_data: &str) -> Result { + serde_json::from_str::(json_data) + .map_err(|error| format!("Invalid task JSON: {error}")) + } + + fn parse_ownership_context(json_data: &str) -> Result { + serde_json::from_str::(json_data) + .map_err(|error| format!("Invalid task ownership JSON: {error}")) + } +} + +#[cfg(test)] +mod tests { + use super::TaskStateService; + use forge_repositories::{InMemoryTaskRepository, TaskRepository}; + use serde_json::Value; + + #[test] + fn bind_ownership_updates_catalog_entry() { + let repository = InMemoryTaskRepository::new(); + let service = TaskStateService::new(repository.clone()); + + service + .upsert_catalog_entry("task-1".to_string(), r#"{"title":"Attack"}"#.to_string()) + .expect("catalog upsert should succeed"); + + let result = service + .bind_ownership( + "task-1".to_string(), + r#"{"requesterUid":"uid-1","orgId":"org-1"}"#.to_string(), + ) + .expect("bind should succeed"); + + assert_eq!(result.requester_uid, "uid-1"); + assert_eq!(result.org_id, "org-1"); + assert_eq!( + result.entry.get("accepted").and_then(Value::as_bool), + Some(true) + ); + + let stored = repository + .get_catalog_entry("task-1") + .expect("catalog lookup should succeed") + .expect("catalog entry should exist"); + assert_eq!( + stored.fields.get("requesterUid").and_then(Value::as_str), + Some("uid-1") + ); + } + + #[test] + fn bind_ownership_without_requester_does_not_accept_task() { + let repository = InMemoryTaskRepository::new(); + let service = TaskStateService::new(repository.clone()); + + service + .upsert_catalog_entry("task-1".to_string(), r#"{"title":"Hostage"}"#.to_string()) + .expect("catalog upsert should succeed"); + + let result = service + .bind_ownership( + "task-1".to_string(), + r#"{"requesterUid":"","orgId":"default"}"#.to_string(), + ) + .expect("bind should succeed"); + + assert_eq!(result.requester_uid, ""); + assert_eq!(result.org_id, "default"); + assert_eq!( + result.entry.get("accepted").and_then(Value::as_bool), + Some(false) + ); + + let stored = repository + .get_catalog_entry("task-1") + .expect("catalog lookup should succeed") + .expect("catalog entry should exist"); + assert_eq!( + stored.fields.get("requesterUid").and_then(Value::as_str), + Some("") + ); + } + + #[test] + fn get_status_falls_back_to_completed_status() { + let repository = InMemoryTaskRepository::new(); + let service = TaskStateService::new(repository.clone()); + + service + .set_status("task-1".to_string(), "failed".to_string()) + .expect("status update should succeed"); + repository + .delete_active_status("task-1") + .expect("active status delete should succeed"); + + assert_eq!( + service + .get_status("task-1".to_string()) + .expect("status lookup should succeed"), + "failed" + ); + } + + #[test] + fn get_status_defaults_catalog_entries_to_available_or_locked() { + let service = TaskStateService::new(InMemoryTaskRepository::new()); + + service + .upsert_catalog_entry("task-open".to_string(), r#"{"title":"Open"}"#.to_string()) + .expect("open catalog upsert should succeed"); + service + .upsert_catalog_entry( + "task-locked".to_string(), + r#"{"title":"Locked","locked":true}"#.to_string(), + ) + .expect("locked catalog upsert should succeed"); + + assert_eq!( + service + .get_status("task-open".to_string()) + .expect("open status lookup should succeed"), + "available" + ); + assert_eq!( + service + .get_status("task-locked".to_string()) + .expect("locked status lookup should succeed"), + "locked" + ); + } + + #[test] + fn list_active_catalog_returns_assignable_and_active_entries() { + let service = TaskStateService::new(InMemoryTaskRepository::new()); + + service + .upsert_catalog_entry( + "task-available".to_string(), + r#"{"title":"Available"}"#.to_string(), + ) + .expect("available catalog upsert should succeed"); + service + .upsert_catalog_entry( + "task-assigned".to_string(), + r#"{"title":"Assigned"}"#.to_string(), + ) + .expect("assigned catalog upsert should succeed"); + service + .upsert_catalog_entry( + "task-active".to_string(), + r#"{"title":"Active"}"#.to_string(), + ) + .expect("active catalog upsert should succeed"); + service + .upsert_catalog_entry("task-done".to_string(), r#"{"title":"Done"}"#.to_string()) + .expect("done catalog upsert should succeed"); + service + .set_status("task-available".to_string(), "available".to_string()) + .expect("available status update should succeed"); + service + .set_status("task-assigned".to_string(), "assigned".to_string()) + .expect("assigned status update should succeed"); + service + .set_status("task-active".to_string(), "active".to_string()) + .expect("active status update should succeed"); + service + .set_status("task-done".to_string(), "succeeded".to_string()) + .expect("done status update should succeed"); + + let active_catalog = service + .list_active_catalog() + .expect("active catalog should build"); + + let task_ids: Vec<_> = active_catalog + .iter() + .filter_map(|entry| entry.get("taskId").and_then(Value::as_str)) + .collect(); + + assert_eq!(active_catalog.len(), 3); + assert!(task_ids.contains(&"task-available")); + assert!(task_ids.contains(&"task-assigned")); + assert!(task_ids.contains(&"task-active")); + } + + #[test] + fn list_active_catalog_includes_unstatused_unlocked_entries() { + let service = TaskStateService::new(InMemoryTaskRepository::new()); + + service + .upsert_catalog_entry("task-open".to_string(), r#"{"title":"Open"}"#.to_string()) + .expect("open catalog upsert should succeed"); + service + .upsert_catalog_entry( + "task-locked".to_string(), + r#"{"title":"Locked","locked":true}"#.to_string(), + ) + .expect("locked catalog upsert should succeed"); + + let active_catalog = service + .list_active_catalog() + .expect("active catalog should build"); + + let task_ids: Vec<_> = active_catalog + .iter() + .filter_map(|entry| entry.get("taskId").and_then(Value::as_str)) + .collect(); + + assert_eq!(active_catalog.len(), 1); + assert!(task_ids.contains(&"task-open")); + } +} diff --git a/lib/services/src/v_garage.rs b/lib/services/src/v_garage.rs new file mode 100644 index 0000000..c8563d7 --- /dev/null +++ b/lib/services/src/v_garage.rs @@ -0,0 +1,218 @@ +//! Virtual garage service layer providing business logic for garage management operations. +//! +//! Implements the service layer of the virtual garage system, handling business logic, +//! validation, and orchestration. + +use forge_models::{VGarage, VehicleCategory}; +use forge_repositories::{VGarageHotRepository, VGarageRepository}; + +/// Service layer implementation for virtual garage business logic and operations. +/// +/// Orchestrates virtual garage management operations, handling business logic, validation, +/// and data transformation. Manages equipment storage across four categories: items, +/// weapons, magazines, and backpacks. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct VGarageService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of garage data, + /// abstracting away the specific database implementation details. + repository: R, +} + +pub struct VGarageHotStateService { + service: VGarageService, + repository: H, +} + +impl VGarageService { + /// Creates a new garage service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new empty virtual garage for a player. + /// + /// Handles duplicate checking and persistence. + pub fn create_garage(&self, uid: &str) -> Result { + // Business rule: Check if garage already exists + if self.repository.exists(uid)? { + return Err(format!("Garage for '{}' already exists", uid)); + } + + // Create empty garage (no items) + let garage = VGarage::new(); + self.repository.create(uid, &garage)?; + + Ok(garage) + } + + /// Retrieves a player's virtual garage. + pub fn fetch_garage(&self, uid: &str) -> Result { + match self.repository.fetch(uid)? { + Some(garage) => Ok(garage), + None => Err(format!("No garage found for player '{}'", uid)), + } + } + + pub fn update_garage(&self, uid: &str, garage: &VGarage) -> Result { + self.repository.update(uid, garage)?; + Ok(garage.clone()) + } + + /// Retrieves a specific field from a player's virtual garage. + /// + /// Fields: "cars", "armor", "heli", "planes", "naval", "other" + pub fn get_garage(&self, uid: &str, field: &str) -> Result, String> { + self.repository.get(uid, field) + } + + /// Adds classnames to a player's virtual garage. + pub fn add_garage( + &self, + uid: &str, + category: VehicleCategory, + classnames: Vec, + ) -> Result { + let mut garage = match self.repository.fetch(uid)? { + Some(g) => g, + None => VGarage::new(), + }; + + garage.add(category, classnames); + self.repository.update(uid, &garage)?; + + Ok(garage) + } + + /// Removes a classname from a player's virtual garage. + pub fn remove_garage( + &self, + uid: &str, + category: VehicleCategory, + classname: &str, + ) -> Result { + let mut garage = match self.repository.fetch(uid)? { + Some(g) => g, + None => return Err(format!("No garage found for player '{}'", uid)), + }; + + if garage.remove(category, classname).is_none() { + return Err(format!("Item '{}' not found in garage", classname)); + } + + self.repository.update(uid, &garage)?; + + Ok(garage) + } + + /// Permanently deletes a player's virtual garage. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_garage(&self, uid: &str) -> Result<(), String> { + // Business rule: Check if garage exists + if !self.repository.exists(uid)? { + return Err(format!("No garage found for player '{}'", uid)); + } + + // Delete garage + self.repository.delete(uid)?; + + Ok(()) + } + + /// Checks if a player has a virtual garage. + /// + /// Lightweight check without data retrieval. + pub fn garage_exists(&self, uid: &str) -> Result { + self.repository.exists(uid) + } +} + +impl VGarageHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: VGarageService::new(repository), + repository: hot_repository, + } + } + + pub fn init_garage(&self, uid: &str) -> Result { + if let Some(garage) = self.repository.get(uid)? { + return Ok(garage); + } + + let garage = match self.service.fetch_garage(uid) { + Ok(garage) => garage, + Err(_) => self.service.create_garage(uid)?, + }; + self.repository.save(&garage, uid)?; + Ok(garage) + } + + pub fn fetch_garage(&self, uid: &str) -> Result { + self.init_garage(uid) + } + + pub fn get_garage(&self, uid: &str, field: &str) -> Result, String> { + let garage = self.init_garage(uid)?; + Ok(match field.to_lowercase().as_str() { + "cars" => garage.cars, + "armor" => garage.armor, + "helis" | "heli" => garage.helis, + "planes" => garage.planes, + "naval" => garage.naval, + "other" => garage.other, + _ => Vec::new(), + }) + } + + pub fn override_garage(&self, uid: &str, garage: VGarage) -> Result { + self.repository.save(&garage, uid)?; + Ok(garage) + } + + pub fn save_garage(&self, uid: &str) -> Result { + let garage = self + .repository + .get(uid)? + .ok_or_else(|| format!("No garage found for player '{}'", uid))?; + let saved = if self.service.garage_exists(uid)? { + self.service.update_garage(uid, &garage)? + } else { + self.service.create_garage(uid)? + }; + self.repository.save(&saved, uid)?; + Ok(saved) + } + + pub fn add_garage( + &self, + uid: &str, + category: VehicleCategory, + classnames: Vec, + ) -> Result { + let garage = self.service.add_garage(uid, category, classnames)?; + self.repository.save(&garage, uid)?; + Ok(garage) + } + + pub fn remove_garage( + &self, + uid: &str, + category: VehicleCategory, + classname: &str, + ) -> Result { + let garage = self.service.remove_garage(uid, category, classname)?; + self.repository.save(&garage, uid)?; + Ok(garage) + } + + pub fn remove_hot_garage(&self, uid: &str) -> Result<(), String> { + self.repository.delete(uid) + } +} diff --git a/lib/services/src/v_locker.rs b/lib/services/src/v_locker.rs new file mode 100644 index 0000000..59ac643 --- /dev/null +++ b/lib/services/src/v_locker.rs @@ -0,0 +1,194 @@ +//! Virtual locker service layer providing business logic for locker management operations. +//! +//! Implements the service layer of the virtual locker system, handling business logic, +//! validation, and orchestration. + +use forge_models::{EquipmentCategory, VLocker}; +use forge_repositories::{VLockerHotRepository, VLockerRepository}; + +/// Service layer implementation for virtual locker business logic and operations. +/// +/// Orchestrates virtual locker management operations, handling business logic, validation, +/// and data transformation. Manages equipment storage across four categories: items, +/// weapons, magazines, and backpacks. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct VLockerService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of locker data, + /// abstracting away the specific database implementation details. + repository: R, +} + +pub struct VLockerHotStateService { + service: VLockerService, + repository: H, +} + +impl VLockerService { + /// Creates a new locker service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new empty locker for a player. + /// + /// Handles duplicate checking and persistence. + pub fn create_locker(&self, uid: &str) -> Result { + // Business rule: Check if locker already exists + if self.repository.exists(uid)? { + return Err(format!("Locker for '{}' already exists", uid)); + } + + // Create empty locker (no items) + let locker = VLocker::new(); + self.repository.create(uid, &locker)?; + + Ok(locker) + } + + /// Retrieves a player's virtual locker. + pub fn fetch_locker(&self, uid: &str) -> Result { + match self.repository.fetch(uid)? { + Some(locker) => Ok(locker), + None => Err(format!("No locker found for player '{}'", uid)), + } + } + + pub fn update_locker(&self, uid: &str, locker: &VLocker) -> Result { + self.repository.update(uid, locker)?; + Ok(locker.clone()) + } + + /// Retrieves a specific field from a player's virtual locker. + /// + /// Fields: "items", "weapons", "magazines", "backpacks" + pub fn get_locker(&self, uid: &str, field: &str) -> Result, String> { + self.repository.get(uid, field) + } + + /// Generic method to add items to any category. + pub fn add_locker( + &self, + uid: &str, + category: EquipmentCategory, + classnames: Vec, + ) -> Result { + let mut locker = match self.repository.fetch(uid)? { + Some(l) => l, + None => VLocker::new(), + }; + + locker.add(category, classnames); + self.repository.update(uid, &locker)?; + + Ok(locker) + } + + /// Generic method to remove an item from any category. + pub fn remove_locker( + &self, + uid: &str, + category: EquipmentCategory, + classname: &str, + ) -> Result { + let mut locker = match self.repository.fetch(uid)? { + Some(l) => l, + None => return Err(format!("No locker found for player '{}'", uid)), + }; + + if locker.remove(category, classname).is_none() { + return Err(format!("Item '{}' not found in locker", classname)); + } + + self.repository.update(uid, &locker)?; + + Ok(locker) + } + + /// Permanently deletes a player's virtual locker. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_locker(&self, uid: &str) -> Result<(), String> { + // Business rule: Check if locker exists + if !self.repository.exists(uid)? { + return Err(format!("No locker found for player '{}'", uid)); + } + + // Delete locker + self.repository.delete(uid)?; + + Ok(()) + } + + /// Checks if a player has a virtual locker. + /// + /// Lightweight check without data retrieval. + pub fn locker_exists(&self, uid: &str) -> Result { + self.repository.exists(uid) + } +} + +impl VLockerHotStateService { + pub fn new(repository: R, hot_repository: H) -> Self { + Self { + service: VLockerService::new(repository), + repository: hot_repository, + } + } + + pub fn init_locker(&self, uid: &str) -> Result { + if let Some(locker) = self.repository.get(uid)? { + return Ok(locker); + } + + let locker = match self.service.fetch_locker(uid) { + Ok(locker) => locker, + Err(_) => self.service.create_locker(uid)?, + }; + self.repository.save(&locker, uid)?; + Ok(locker) + } + + pub fn fetch_locker(&self, uid: &str) -> Result { + self.init_locker(uid) + } + + pub fn get_locker(&self, uid: &str, field: &str) -> Result, String> { + let locker = self.init_locker(uid)?; + Ok(match field.to_lowercase().as_str() { + "items" => locker.items, + "weapons" => locker.weapons, + "magazines" => locker.magazines, + "backpacks" => locker.backpacks, + _ => Vec::new(), + }) + } + + pub fn override_locker(&self, uid: &str, locker: VLocker) -> Result { + self.repository.save(&locker, uid)?; + Ok(locker) + } + + pub fn save_locker(&self, uid: &str) -> Result { + let locker = self + .repository + .get(uid)? + .ok_or_else(|| format!("No locker found for player '{}'", uid))?; + let saved = if self.service.locker_exists(uid)? { + self.service.update_locker(uid, &locker)? + } else { + self.service.create_locker(uid)? + }; + self.repository.save(&saved, uid)?; + Ok(saved) + } + + pub fn remove_locker(&self, uid: &str) -> Result<(), String> { + self.repository.delete(uid) + } +} diff --git a/lib/shared/Cargo.toml b/lib/shared/Cargo.toml new file mode 100644 index 0000000..8de94b7 --- /dev/null +++ b/lib/shared/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "forge-shared" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde_json = { workspace = true } +arma-rs = { workspace = true } diff --git a/lib/shared/src/lib.rs b/lib/shared/src/lib.rs new file mode 100644 index 0000000..3f6a0b7 --- /dev/null +++ b/lib/shared/src/lib.rs @@ -0,0 +1,52 @@ +pub mod validation; + +pub use validation::{ + ActorValidationError, BankValidationError, GarageValidationError, LockerValidationError, + OrgValidationError, +}; + +/// Converts an arma_rs::Value to a serde_json::Value. +/// +/// This helper function is used to bridge the gap between Arma's SQF data types +/// and standard JSON, which is used for storage and API communication. +pub fn arma_value_to_json(arma_value: &arma_rs::Value) -> serde_json::Value { + match arma_value { + arma_rs::Value::String(s) => serde_json::Value::String(s.clone()), + arma_rs::Value::Number(n) => serde_json::Number::from_f64(*n) + .map(serde_json::Value::Number) + .unwrap_or(serde_json::Value::Null), + arma_rs::Value::Boolean(b) => serde_json::Value::Bool(*b), + arma_rs::Value::Array(arr) => { + let json_array: Vec = arr.iter().map(arma_value_to_json).collect(); + serde_json::Value::Array(json_array) + } + arma_rs::Value::Null => serde_json::Value::Null, + arma_rs::Value::Unknown(s) => serde_json::Value::String(s.clone()), + } +} + +/// Generates a phone number from a UID. +/// +/// Uses the last 6 digits of the UID and prefixes with 0160. +pub fn generate_phone_number(uid: &str) -> String { + let uid_chars: Vec = uid.chars().collect(); + let uid_len = uid_chars.len(); + + if uid_len >= 6 { + let last_six: String = uid_chars[uid_len - 6..].iter().collect(); + format!("0160{}", last_six) + } else { + format!("0160{:0>6}", uid) + } +} + +/// Generates an email from a phone number. +/// +/// Uses the phone number as the local part and @spearnet.mil as the domain. +pub fn generate_email(phone_number: &str) -> String { + if phone_number.is_empty() { + String::new() + } else { + format!("{}@spearnet.mil", phone_number) + } +} diff --git a/lib/shared/src/validation.rs b/lib/shared/src/validation.rs new file mode 100644 index 0000000..2c2152d --- /dev/null +++ b/lib/shared/src/validation.rs @@ -0,0 +1,217 @@ +use std::fmt; + +/// Validation errors for Actor model +#[derive(Debug, Clone)] +pub enum ActorValidationError { + EmptyUid, + InvalidName(String), + InvalidUid(String), + InvalidPosition(String), + InvalidDirection(f64), + InvalidEmail(String), + InvalidPhoneNumber(String), + InvalidState(String), + InvalidRank(String), + InvalidOrganization(String), + LoadoutError(String), + UidModificationAttempt, +} + +impl fmt::Display for ActorValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ActorValidationError::EmptyUid => write!(f, "UID cannot be empty"), + ActorValidationError::InvalidName(name) => write!( + f, + "Invalid name '{}' - cannot be empty or longer than 50 characters", + name + ), + ActorValidationError::InvalidUid(uid) => write!( + f, + "Invalid UID format '{}' - must be a 17-digit Steam ID", + uid + ), + ActorValidationError::InvalidPosition(msg) => write!(f, "Invalid position: {}", msg), + ActorValidationError::InvalidDirection(dir) => write!( + f, + "Invalid direction {} - must be between 0 and 360 degrees", + dir + ), + ActorValidationError::InvalidEmail(email) => write!( + f, + "Invalid email format '{}' - must contain @ and end with .mil", + email + ), + ActorValidationError::InvalidPhoneNumber(phone) => write!( + f, + "Invalid phone number '{}' - must start with 0160 and be 10 digits", + phone + ), + ActorValidationError::InvalidState(state) => write!( + f, + "Invalid state '{}' - must be HEALTHY, INJURED, INCAPACITATED, or DEAD", + state + ), + ActorValidationError::InvalidRank(rank) => write!( + f, + "Invalid rank '{}' - cannot be empty or longer than 50 characters", + rank + ), + ActorValidationError::InvalidOrganization(org) => write!( + f, + "Invalid organization '{}' - cannot be empty or longer than 100 characters", + org + ), + ActorValidationError::LoadoutError(msg) => write!(f, "Loadout error: {}", msg), + ActorValidationError::UidModificationAttempt => write!( + f, + "UID cannot be modified - it's the player's permanent Steam ID" + ), + } + } +} + +impl std::error::Error for ActorValidationError {} + +/// Validation errors for Organization model +#[derive(Debug, Clone)] +pub enum OrgValidationError { + EmptyId, + EmptyOwner, + EmptyName, + NegativeFunds, + NegativeCreditLine(String), + InvalidId(String), + InvalidOwner(String), + InvalidName(String), + InvalidCreditLineUid(String), +} + +impl fmt::Display for OrgValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + OrgValidationError::EmptyId => write!(f, "Organization ID cannot be empty"), + OrgValidationError::EmptyOwner => write!(f, "Organization owner cannot be empty"), + OrgValidationError::EmptyName => write!(f, "Organization name cannot be empty"), + OrgValidationError::NegativeFunds => { + write!(f, "Organization funds cannot be negative") + } + OrgValidationError::NegativeCreditLine(uid) => { + write!(f, "Credit line for '{}' cannot be negative", uid) + } + OrgValidationError::InvalidId(id) => write!( + f, + "Invalid organization ID '{}' - must contain only alphanumeric characters and underscores", + id + ), + OrgValidationError::InvalidOwner(owner) => { + write!(f, "Invalid owner '{}' - must be a 17-digit Steam ID", owner) + } + OrgValidationError::InvalidName(name) => write!( + f, + "Invalid organization name '{}' - cannot exceed 100 characters or contain control characters", + name + ), + OrgValidationError::InvalidCreditLineUid(uid) => write!( + f, + "Invalid credit line UID '{}' - must be a 17-digit Steam ID", + uid + ), + } + } +} + +impl std::error::Error for OrgValidationError {} + +/// Validation errors for Bank model +#[derive(Debug, Clone)] +pub enum BankValidationError { + UidEmpty, + NameEmpty, + BankNegative, + CashNegative, + InvalidPin(u64), +} + +impl fmt::Display for BankValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + BankValidationError::UidEmpty => write!(f, "UID cannot be empty"), + BankValidationError::NameEmpty => write!(f, "Name cannot be empty"), + BankValidationError::BankNegative => write!(f, "Bank balance cannot be negative"), + BankValidationError::CashNegative => write!(f, "Cash cannot be negative"), + BankValidationError::InvalidPin(pin) => { + write!(f, "Invalid PIN format '{}' - must be a 4-digit number", pin) + } + } + } +} + +impl std::error::Error for BankValidationError {} + +/// Validation errors for Garage model +#[derive(Debug, Clone)] +pub enum GarageValidationError { + UidEmpty, + ClassnameEmpty, + FuelInvalid, + DamageInvalid, + HitpointNamesEmpty, + SelectionNamesEmpty, + DamageValuesEmpty, + HitpointArrayLengthMismatch, + HitpointValueInvalid(usize), +} + +impl fmt::Display for GarageValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + GarageValidationError::UidEmpty => write!(f, "UID cannot be empty"), + GarageValidationError::ClassnameEmpty => write!(f, "Classname cannot be empty"), + GarageValidationError::FuelInvalid => write!(f, "Fuel must be between 0.0 and 1.0"), + GarageValidationError::DamageInvalid => write!(f, "Damage must be between 0.0 and 1.0"), + GarageValidationError::HitpointNamesEmpty => { + write!(f, "Hitpoint names cannot be empty") + } + GarageValidationError::SelectionNamesEmpty => { + write!(f, "Selection names cannot be empty") + } + GarageValidationError::DamageValuesEmpty => write!(f, "Damage values cannot be empty"), + GarageValidationError::HitpointArrayLengthMismatch => write!( + f, + "Hit point arrays (names, selections, values) must all have the same length" + ), + GarageValidationError::HitpointValueInvalid(index) => write!( + f, + "Hitpoint value at index {} is invalid - must be between 0.0 and 1.0", + index + ), + } + } +} + +impl std::error::Error for GarageValidationError {} + +/// Validation errors for Locker model +#[derive(Debug, Clone)] +pub enum LockerValidationError { + UidEmpty, + CategoryEmpty, + ClassnameEmpty, + AmountZero, + ItemValidationError, +} + +impl fmt::Display for LockerValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + LockerValidationError::UidEmpty => write!(f, "UID cannot be empty"), + LockerValidationError::CategoryEmpty => write!(f, "Category cannot be empty"), + LockerValidationError::ClassnameEmpty => write!(f, "Classname cannot be empty"), + LockerValidationError::AmountZero => write!(f, "Amount cannot be zero"), + LockerValidationError::ItemValidationError => write!(f, "Item validation error"), + } + } +} + +impl std::error::Error for LockerValidationError {} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d65ee4d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,699 @@ +{ + "name": "forge-webui", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "forge-webui", + "devDependencies": { + "html-minifier-terser": "^7.2.0", + "lightningcss": "^1.29.3", + "postcss": "^8.5.6", + "postcss-nested": "^7.0.2", + "prettier": "^3.6.2", + "terser": "^5.44.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c41651 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "forge-webui", + "private": true, + "devDependencies": { + "html-minifier-terser": "^7.2.0", + "lightningcss": "^1.29.3", + "postcss": "^8.5.6", + "postcss-nested": "^7.0.2", + "prettier": "^3.6.2", + "terser": "^5.44.0" + }, + "scripts": { + "build:webui": "node tools/build-webui.mjs", + "docs:sync": "node tools/sync-docus-docs.mjs", + "docs:dev": "npm --prefix docus run dev", + "docs:build": "npm --prefix docus run build" + } +} diff --git a/tools/build-webui.mjs b/tools/build-webui.mjs new file mode 100644 index 0000000..0103401 --- /dev/null +++ b/tools/build-webui.mjs @@ -0,0 +1,393 @@ +import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises"; +import { spawn } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { minify as minifyHtml } from "html-minifier-terser"; +import { transform as transformCss } from "lightningcss"; +import postcss from "postcss"; +import postcssNested from "postcss-nested"; +import { minify as minifyJs } from "terser"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDir = path.resolve(__dirname, ".."); +const commonUiSrcDir = "arma/client/addons/common/ui/src"; +const commonUiSiteDir = "arma/client/addons/common/ui/_site"; +const clientAddonsDir = path.join(rootDir, "arma/client/addons"); + +function toRepoRelative(absolutePath) { + return path.relative(rootDir, absolutePath).replace(/\\/g, "/"); +} + +function resolveFromRoot(...segments) { + return toRepoRelative(path.join(rootDir, ...segments)); +} + +function resolveFromConfigDir(configDir, relativePath) { + return toRepoRelative(path.resolve(configDir, relativePath)); +} + +const commonJsBundles = [ + { + name: "Forge Web UI runtime", + output: resolveFromRoot(commonUiSiteDir, "forge-webui.js"), + sources: [ + "runtime.js", + "host.js", + "bridge.js", + "app.js", + "windowTitleBar.js", + "index.js", + ].map((relativePath) => resolveFromRoot(commonUiSrcDir, relativePath)), + }, + { + name: "Forge Web UI site loader", + output: resolveFromRoot(commonUiSiteDir, "forge-site-loader.js"), + sources: [resolveFromRoot(commonUiSrcDir, "siteLoader.js")], + }, +]; +const commonFormatSourceTargets = [resolveFromRoot(commonUiSrcDir)]; + +function unique(values) { + return Array.from(new Set(values)); +} + +async function readSource(relativePath) { + const absolutePath = path.join(rootDir, relativePath); + return readFile(absolutePath, "utf8"); +} + +async function writeBundle(outputRelativePath, content) { + const outputPath = path.join(rootDir, outputRelativePath); + await mkdir(path.dirname(outputPath), { recursive: true }); + await writeFile(outputPath, content, "utf8"); +} + +async function cleanOutputDirs(outputDirs) { + const uniqueDirs = unique(outputDirs).filter(Boolean); + + await Promise.all( + uniqueDirs.map(async (relativeDir) => { + const absoluteDir = path.join(rootDir, relativeDir); + await rm(absoluteDir, { force: true, recursive: true }); + await mkdir(absoluteDir, { recursive: true }); + }), + ); +} + +async function buildJsBundle({ name, output, sources }) { + const chunks = await Promise.all(sources.map(readSource)); + const bundleSource = chunks.join("\n\n"); + const result = await minifyJs(bundleSource, { + compress: true, + mangle: true, + format: { + comments: false, + }, + }); + + if (!result?.code) { + throw new Error(`Failed to minify JavaScript bundle for ${name}.`); + } + + await writeBundle(output, result.code); + console.log(`Built ${output}`); +} + +async function buildCssBundle({ name, output, sources }) { + const chunks = await Promise.all(sources.map(readSource)); + const nestedResult = await postcss([postcssNested]).process( + chunks.join("\n\n"), + { + from: undefined, + }, + ); + const result = transformCss({ + filename: output, + code: Buffer.from(nestedResult.css), + minify: true, + }); + + await writeBundle(output, result.code.toString("utf8")); + console.log(`Built ${output}`); +} + +function renderSiteIndex({ title, siteConfig }) { + const configJson = JSON.stringify(siteConfig, null, 16) + .replace(/^/gm, " ".repeat(12)) + .trimStart(); + + return ` + + + + + ${title} + + + + +
+ + +`; +} + +async function buildHtmlPage({ name, output, title, siteConfig }) { + const html = renderSiteIndex({ title, siteConfig }); + const minifiedHtml = await minifyHtml(html, { + collapseBooleanAttributes: true, + collapseWhitespace: true, + minifyCSS: true, + minifyJS: true, + removeComments: true, + removeRedundantAttributes: true, + }); + + await writeBundle(output, minifiedHtml); + console.log(`Built ${output}`); +} + +async function buildHtmlTemplate({ name, output, source }) { + const html = await readSource(source); + const minifiedHtml = await minifyHtml(html, { + collapseBooleanAttributes: true, + collapseWhitespace: true, + minifyCSS: true, + minifyJS: true, + removeComments: true, + removeRedundantAttributes: true, + }); + + await writeBundle(output, minifiedHtml); + console.log(`Built ${output}`); +} + +async function pathExists(absolutePath) { + try { + await stat(absolutePath); + return true; + } catch { + return false; + } +} + +async function runPrettier(targets) { + const uniqueTargets = unique(targets).filter(Boolean); + if (uniqueTargets.length === 0) { + return; + } + + console.log(`Formatting ${uniqueTargets.length} Web UI target(s) with Prettier`); + + await new Promise((resolve, reject) => { + const quotedTargets = uniqueTargets.map((target) => + `"${String(target).replace(/"/g, '\\"')}"`, + ); + const command = `npx prettier --write --ignore-unknown ${quotedTargets.join(" ")}`; + const child = spawn(command, [], { + cwd: rootDir, + stdio: "inherit", + shell: true, + }); + + child.on("error", reject); + child.on("exit", (code) => { + if (code === 0) { + resolve(); + return; + } + + reject( + new Error(`Prettier failed with exit code ${code ?? "unknown"}.`), + ); + }); + }); +} + +async function discoverUiConfigs() { + const addons = await readdir(clientAddonsDir, { withFileTypes: true }); + const configPaths = []; + + for (const entry of addons) { + if (!entry.isDirectory()) { + continue; + } + + const configPath = path.join( + clientAddonsDir, + entry.name, + "ui", + "ui.config.mjs", + ); + + try { + const configStat = await stat(configPath); + if (configStat.isFile()) { + configPaths.push(configPath); + } + } catch { + // UI config is optional per addon. + } + } + + configPaths.sort((left, right) => left.localeCompare(right)); + return configPaths; +} + +async function loadUiConfig(absoluteConfigPath) { + const configModule = await import(pathToFileURL(absoluteConfigPath).href); + const config = configModule.default; + + if (!config || !config.addonName || !config.outputDir || !config.site) { + throw new Error( + `Invalid UI config at ${toRepoRelative(absoluteConfigPath)}.`, + ); + } + + const configDir = path.dirname(absoluteConfigPath); + const configRelativePath = toRepoRelative(absoluteConfigPath); + const outputDir = resolveFromConfigDir(configDir, config.outputDir); + const srcDirPath = path.join(configDir, "src"); + const formatSourceTargets = [configRelativePath]; + + if (await pathExists(srcDirPath)) { + formatSourceTargets.push(toRepoRelative(srcDirPath)); + } + + const jsBundles = (config.jsBundles || []).map((bundle) => ({ + name: bundle.name, + output: resolveFromConfigDir(configDir, path.join(config.outputDir, bundle.output)), + sources: (bundle.sources || []).map((source) => + resolveFromConfigDir(configDir, source), + ), + })); + const cssBundles = (config.cssBundles || []).map((bundle) => ({ + name: bundle.name, + output: resolveFromConfigDir(configDir, path.join(config.outputDir, bundle.output)), + sources: (bundle.sources || []).map((source) => + resolveFromConfigDir(configDir, source), + ), + })); + const htmlPages = []; + if (config.generateIndex !== false) { + htmlPages.push({ + kind: "generated", + name: `${config.addonName} UI index`, + output: resolveFromConfigDir(configDir, path.join(config.outputDir, "index.html")), + title: config.title, + siteConfig: { + addonName: config.addonName, + logLabel: config.logLabel || `${config.addonName} UI`, + ...config.site, + }, + }); + } + + for (const page of config.htmlTemplates || []) { + htmlPages.push({ + kind: "template", + name: page.name || `${config.addonName} UI template`, + output: resolveFromConfigDir( + configDir, + path.join(config.outputDir, page.output), + ), + source: resolveFromConfigDir(configDir, page.source), + }); + } + + return { + outputDir, + jsBundles, + cssBundles, + htmlPages, + formatSourceTargets, + }; +} + +async function collectUiBuildArtifacts() { + const configPaths = await discoverUiConfigs(); + const uiConfigs = await Promise.all(configPaths.map(loadUiConfig)); + + return { + outputDirs: uiConfigs.map((config) => config.outputDir), + jsBundles: uiConfigs.flatMap((config) => config.jsBundles), + cssBundles: uiConfigs.flatMap((config) => config.cssBundles), + htmlPages: uiConfigs.flatMap((config) => config.htmlPages), + formatSourceTargets: uiConfigs.flatMap( + (config) => config.formatSourceTargets, + ), + }; +} + +async function build() { + const uiArtifacts = await collectUiBuildArtifacts(); + const commonOutputDirs = [resolveFromRoot(commonUiSiteDir)]; + + await runPrettier([ + ...commonFormatSourceTargets, + ...uiArtifacts.formatSourceTargets, + ]); + + await cleanOutputDirs([...commonOutputDirs, ...uiArtifacts.outputDirs]); + + await Promise.all([ + ...commonJsBundles.map(buildJsBundle), + ...uiArtifacts.jsBundles.map(buildJsBundle), + ]); + await Promise.all(uiArtifacts.cssBundles.map(buildCssBundle)); + await Promise.all( + uiArtifacts.htmlPages.map((page) => + page.kind === "template" ? buildHtmlTemplate(page) : buildHtmlPage(page), + ), + ); +} + +build().catch((error) => { + console.error("Failed to build Forge Web UI bundles."); + console.error(error); + process.exitCode = 1; +}); diff --git a/tools/sync-docus-docs.mjs b/tools/sync-docus-docs.mjs new file mode 100644 index 0000000..c6c5228 --- /dev/null +++ b/tools/sync-docus-docs.mjs @@ -0,0 +1,851 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const docusDir = path.join(repoRoot, 'docus'); +const contentDir = path.join(docusDir, 'content'); + +const generatedPages = [ + { + source: 'docs/FRAMEWORK_ARCHITECTURE.md', + target: '1.getting-started/1.architecture.md' + }, + { + source: 'docs/MODULE_REFERENCE.md', + target: '1.getting-started/2.module-reference.md' + }, + { + source: 'docs/DEVELOPMENT_GUIDE.md', + target: '1.getting-started/3.development.md' + }, + { + source: 'docs/MISSION_DESIGNER_GUIDE.md', + target: '1.getting-started/4.mission-designer.md' + }, + { + source: 'docs/PLAYER_GUIDE.md', + target: '1.getting-started/5.player-guide.md' + }, + { + source: 'docs/surrealdb-setup.md', + target: '1.getting-started/6.surrealdb-setup.md' + }, + { + source: 'arma/server/docs/README.md', + target: '2.server-extension/0.index.md' + }, + { + source: 'arma/server/docs/api-reference.md', + target: '2.server-extension/1.api-reference.md' + }, + { + source: 'arma/server/docs/usage-examples.md', + target: '2.server-extension/2.usage-examples.md' + }, + { + source: 'arma/server/addons/common/README.md', + target: '2.server-extension/3.common.md' + }, + { + source: 'docs/ICOM_USAGE_GUIDE.md', + target: '2.server-extension/4.icom.md' + }, + { + source: 'docs/ACTOR_USAGE_GUIDE.md', + target: '3.server-modules/1.actor.md' + }, + { + source: 'docs/BANK_USAGE_GUIDE.md', + target: '3.server-modules/2.bank.md' + }, + { + source: 'docs/CAD_USAGE_GUIDE.md', + target: '3.server-modules/3.cad.md' + }, + { + source: 'docs/ECONOMY_USAGE_GUIDE.md', + target: '3.server-modules/4.economy.md' + }, + { + source: 'docs/GARAGE_USAGE_GUIDE.md', + target: '3.server-modules/5.garage.md' + }, + { + source: 'docs/LOCKER_USAGE_GUIDE.md', + target: '3.server-modules/6.locker.md' + }, + { + source: 'docs/ORG_USAGE_GUIDE.md', + target: '3.server-modules/7.organization.md' + }, + { + source: 'docs/OWNED_STORAGE_USAGE_GUIDE.md', + target: '3.server-modules/8.owned-storage.md' + }, + { + source: 'docs/PHONE_USAGE_GUIDE.md', + target: '3.server-modules/9.phone.md' + }, + { + source: 'docs/STORE_USAGE_GUIDE.md', + target: '3.server-modules/10.store.md' + }, + { + source: 'docs/TASK_USAGE_GUIDE.md', + target: '3.server-modules/11.task.md' + }, + { + source: 'docs/CLIENT_USAGE_GUIDE.md', + target: '4.client-addons/0.index.md' + }, + { + source: 'docs/CLIENT_MAIN_USAGE_GUIDE.md', + target: '4.client-addons/1.main.md' + }, + { + source: 'docs/CLIENT_COMMON_USAGE_GUIDE.md', + target: '4.client-addons/2.common.md' + }, + { + source: 'docs/CLIENT_ACTOR_USAGE_GUIDE.md', + target: '4.client-addons/3.actor.md' + }, + { + source: 'docs/CLIENT_BANK_USAGE_GUIDE.md', + target: '4.client-addons/4.bank.md' + }, + { + source: 'docs/CLIENT_CAD_USAGE_GUIDE.md', + target: '4.client-addons/5.cad.md' + }, + { + source: 'docs/CLIENT_GARAGE_USAGE_GUIDE.md', + target: '4.client-addons/6.garage.md' + }, + { + source: 'docs/CLIENT_LOCKER_USAGE_GUIDE.md', + target: '4.client-addons/7.locker.md' + }, + { + source: 'docs/CLIENT_NOTIFICATIONS_USAGE_GUIDE.md', + target: '4.client-addons/8.notifications.md' + }, + { + source: 'docs/CLIENT_ORG_USAGE_GUIDE.md', + target: '4.client-addons/9.organization.md' + }, + { + source: 'docs/CLIENT_PHONE_USAGE_GUIDE.md', + target: '4.client-addons/10.phone.md' + }, + { + source: 'docs/CLIENT_STORE_USAGE_GUIDE.md', + target: '4.client-addons/11.store.md' + } +]; + +const virtualRoutes = new Map([ + ['README.md', '/getting-started'], + ['docs/README.md', '/getting-started'] +]); + +for (const page of generatedPages) { + virtualRoutes.set(toPosix(page.source), toRoute(page.target)); +} + +const staticFiles = [ + { + target: 'index.md', + content: `--- +seo: + title: Forge Framework Documentation + description: Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs. +--- + +::u-page-hero +#title +Forge Framework Documentation + +#description +Forge is a persistent Arma 3 framework that combines SQF addons, a Rust +\`arma-rs\` extension, SurrealDB persistence, shared domain crates, and +browser-backed player interfaces. + +Use these docs to understand the runtime architecture, extension API surface, +server gameplay modules, and client addon integration patterns. + +Server owners and developers must start SurrealDB and place a matching +\`config.toml\` beside \`forge_server_x64.dll\` before launching a +Forge-enabled server or local multiplayer test. + +#links + :::u-button + --- + color: primary + size: xl + to: /getting-started + trailing-icon: i-lucide-arrow-right + --- + Start here + ::: + + :::u-button + --- + color: neutral + icon: simple-icons-github + size: xl + to: https://github.com/InnovativeDevSolutions/forge + variant: outline + --- + View source + ::: +:: + +::u-page-section +#title +What Forge Covers + +#features + :::u-page-feature + --- + icon: i-lucide-boxes + --- + #title + Domain [Modules]{.text-primary} + + #description + Actor, bank, CAD, garage, locker, organization, phone, store, task, and + owned-storage workflows share a consistent service and extension model. + ::: + + :::u-page-feature + --- + icon: i-lucide-server + --- + #title + Rust [Extension]{.text-primary} + + #description + The server extension keeps command parsing thin, routes domain requests into + services, and persists durable state through SurrealDB. + ::: + + :::u-page-feature + --- + icon: i-lucide-database-zap + --- + #title + Durable [Persistence]{.text-primary} + + #description + Repository traits stay storage-agnostic while concrete adapters in the + extension handle schema and database mapping. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + --- + #title + Browser [UIs]{.text-primary} + + #description + Client addons host web-based interfaces inside Arma displays and synchronize + state through namespaced browser bridge events. + ::: + + :::u-page-feature + --- + icon: i-lucide-arrow-left-right + --- + #title + Transport [Layer]{.text-primary} + + #description + Large payloads move through chunked request and response transport while + smaller commands still use direct \`callExtension\` paths. + ::: + + :::u-page-feature + --- + icon: i-lucide-wrench + --- + #title + Development [Workflow]{.text-primary} + + #description + The docs cover module boundaries, local validation checks, and where new + domain logic belongs across Rust, SQF, and web UI layers. + ::: +:: + +::u-page-section +#title +Documentation Areas + +#features + :::u-page-feature + --- + icon: i-lucide-rocket + to: /getting-started + --- + #title + [Getting Started]{.text-primary} + + #description + Framework overview, architecture, module reference, and development rules. + ::: + + :::u-page-feature + --- + icon: i-lucide-map + to: /getting-started/mission-designer + --- + #title + Mission [Designers]{.text-primary} + + #description + Eden object placement, garage markers, and CAD-compatible task setup. + ::: + + :::u-page-feature + --- + icon: i-lucide-server-cog + to: /server-extension + --- + #title + Server [Extension]{.text-primary} + + #description + Extension architecture, command surface, and SQF usage examples. + ::: + + :::u-page-feature + --- + icon: i-lucide-network + to: /server-extension/icom + --- + #title + ICOM [Events]{.text-primary} + + #description + Inter-server event routing through the Forge ICOM hub and extension commands. + ::: + + :::u-page-feature + --- + icon: i-lucide-layers-3 + to: /server-modules + --- + #title + Server [Modules]{.text-primary} + + #description + Gameplay-domain usage guides for persistence, hot state, and command flows. + ::: + + :::u-page-feature + --- + icon: i-lucide-monitor-smartphone + to: /client-addons + --- + #title + Client [Addons]{.text-primary} + + #description + Browser bridge, client UX entry points, and addon-specific event contracts. + ::: +:: +` + }, + { + target: '1.getting-started/.navigation.yml', + content: `title: Getting Started +icon: i-lucide-rocket +` + }, + { + target: '1.getting-started/0.index.md', + content: `--- +title: Getting Started +description: Use this section as the main entry point for the Forge framework. +--- + +Forge combines: + +- Arma 3 client addons for UX and browser-hosted interfaces +- Arma 3 server addons for mission integration and authoritative flow control +- a Rust server extension for command routing and persistence +- shared Rust crates for models, repositories, and services +- SurrealDB for durable storage + +## Launch Prerequisites + +Before starting a Forge-enabled dedicated server or local multiplayer test, +server owners and developers must start SurrealDB and make sure +\`config.toml\` is beside \`forge_server_x64.dll\`. The config values must match +the running SurrealDB endpoint, namespace, database, username, and password. + +Mission designers and players do not need their own SurrealDB instance unless +they are hosting locally, but the server they join must have these prerequisites +ready. + +## Common Commands + +\`\`\`powershell +cargo test +npm run build:webui +.\\build-arma.ps1 +\`\`\` + +## Start Here + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-network + title: Architecture + to: /getting-started/architecture + --- + Understand how SQF, Rust services, SurrealDB, and browser UIs fit together. + ::: + + :::u-page-card + --- + icon: i-lucide-boxes + title: Module Reference + to: /getting-started/module-reference + --- + Review gameplay domains, infrastructure modules, and extension command groups. + ::: + + :::u-page-card + --- + icon: i-lucide-wrench + title: Development Guide + to: /getting-started/development + --- + See the rules for adding modules and changing boundaries without regressions. + ::: + + :::u-page-card + --- + icon: i-lucide-map + title: Mission Designer Guide + to: /getting-started/mission-designer + --- + Place Eden interaction objects, garage markers, and Forge task modules for + playable missions. + ::: + + :::u-page-card + --- + icon: i-lucide-user-round-check + title: Player Guide + to: /getting-started/player-guide + --- + Learn the player-facing CAD, phone, bank, store, locker, garage, and economy + workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-database + title: SurrealDB Setup + to: /getting-started/surrealdb-setup + --- + Install SurrealDB, match Forge config values, and choose the right setup path + for developers or admin-facing roles. + ::: + + :::u-page-card + --- + icon: i-lucide-server-cog + title: Server Extension + to: /server-extension + --- + Follow the extension architecture, API surface, and SQF usage examples. + ::: + + :::u-page-card + --- + icon: i-lucide-layers-3 + title: Server Modules + to: /server-modules + --- + Dive into the actor, bank, CAD, garage, locker, organization, phone, store, + task, and owned-storage guides. + ::: + + :::u-page-card + --- + icon: i-lucide-monitor-smartphone + title: Client Addons + to: /client-addons + --- + Explore the client bridge model and addon-specific browser integration rules. + ::: +:: +` + }, + { + target: '2.server-extension/.navigation.yml', + content: `title: Forge Server Extension +icon: i-lucide-server-cog +` + }, + { + target: '3.server-modules/.navigation.yml', + content: `title: Server Modules +icon: i-lucide-layers-3 +` + }, + { + target: '3.server-modules/0.index.md', + content: `--- +title: Server Module Guides +description: These pages document the authoritative server-side workflows in Forge. +--- + +Most modules follow the same shape: + +1. Server SQF gathers game context and validates mission/runtime assumptions. +2. The \`forge_server\` extension routes the request into the matching command group. +3. Services apply business rules through storage-agnostic repository traits. +4. The extension persists durable state through SurrealDB adapters when needed. + +## Gameplay Domains + +::u-page-grid + :::u-page-card + --- + icon: i-lucide-user-round + title: Actor + to: /server-modules/actor + --- + Persistent player identity, position, loadout, contact fields, and hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-wallet + title: Bank + to: /server-modules/bank + --- + Player funds, transfers, PIN validation, checkout charging, and bank hot state. + ::: + + :::u-page-card + --- + icon: i-lucide-map + title: CAD + to: /server-modules/cad + --- + Dispatch requests, assignments, profiles, grouped state, and hydrated views. + ::: + + :::u-page-card + --- + icon: i-lucide-ambulance + title: Economy + to: /server-modules/economy + --- + Fuel, service, and medical charging rules across player and organization funds. + ::: + + :::u-page-card + --- + icon: i-lucide-car-front + title: Garage + to: /server-modules/garage + --- + Vehicle storage, hot-state updates, and persistence of vehicle condition. + ::: + + :::u-page-card + --- + icon: i-lucide-package + title: Locker + to: /server-modules/locker + --- + Player inventory storage, unique item limits, and locker hot-state behavior. + ::: + + :::u-page-card + --- + icon: i-lucide-building-2 + title: Organization + to: /server-modules/organization + --- + Membership, treasury, shared assets, fleet, and organization hot workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-key-round + title: Owned Storage + to: /server-modules/owned-storage + --- + Owner-scoped locker and vehicle unlock storage used by org-linked features. + ::: + + :::u-page-card + --- + icon: i-lucide-smartphone + title: Phone + to: /server-modules/phone + --- + Contacts, message threads, and email state for in-game phone workflows. + ::: + + :::u-page-card + --- + icon: i-lucide-shopping-cart + title: Store + to: /server-modules/store + --- + Checkout orchestration across pricing, grants, payment sources, and rollback. + ::: + + :::u-page-card + --- + icon: i-lucide-flag + title: Task + to: /server-modules/task + --- + Task catalog, ownership, status transitions, defuse counters, and rewards. + ::: +:: +` + }, + { + target: '4.client-addons/.navigation.yml', + content: `title: Client Addons +icon: i-lucide-monitor-smartphone +` + } +]; + +await fs.rm(contentDir, { recursive: true, force: true }); +await fs.mkdir(contentDir, { recursive: true }); + +for (const file of staticFiles) { + await writeContentFile(file.target, file.content); +} + +for (const page of generatedPages) { + const sourceRel = toPosix(page.source); + const sourcePath = path.join(repoRoot, page.source); + const rawContent = await fs.readFile(sourcePath, 'utf8'); + const content = prepareGeneratedPageContent(rewriteMarkdownLinks(rawContent, sourceRel)); + await writeContentFile(page.target, content); +} + +console.log(`Generated ${staticFiles.length + generatedPages.length} Docus content files.`); + +function rewriteMarkdownLinks(content, sourceRel) { + const sourceDir = path.posix.dirname(sourceRel); + + return content.replace(/\]\(([^)]+)\)/g, (match, rawTarget) => { + if ( + rawTarget.startsWith('http://') || + rawTarget.startsWith('https://') || + rawTarget.startsWith('#') || + rawTarget.startsWith('mailto:') + ) { + return match; + } + + const [targetPath, targetHash] = rawTarget.split('#'); + if (!targetPath || !targetPath.toLowerCase().endsWith('.md')) { + return match; + } + + const normalizedTarget = toPosix( + path.posix.normalize(path.posix.join(sourceDir, targetPath.replace(/\\/g, '/'))) + ); + const route = virtualRoutes.get(normalizedTarget); + if (!route) { + return match; + } + + return `](${route}${targetHash ? `#${targetHash}` : ''})`; + }); +} + +function prepareGeneratedPageContent(content) { + const title = extractFirstH1(content); + const description = extractLeadParagraph(content); + const body = stripMatchingLeadParagraph(stripFirstH1(content), description).trimStart(); + const frontmatter = [ + '---', + title ? `title: ${yamlString(title)}` : undefined, + description ? `description: ${yamlString(description)}` : undefined, + '---' + ].filter(Boolean).join('\n'); + + return `${frontmatter}\n\n${body}`; +} + +function extractFirstH1(content) { + const match = content.match(/^#\s+(.+?)\s*#*\s*$/m); + return match ? match[1].trim() : ''; +} + +function extractLeadParagraph(content) { + const lines = stripFirstH1(content).split(/\r?\n/); + + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index].trim(); + if (!line) { + continue; + } + + if (!isParagraphStart(line)) { + continue; + } + + const paragraph = []; + for (let paragraphIndex = index; paragraphIndex < lines.length; paragraphIndex += 1) { + const paragraphLine = lines[paragraphIndex].trim(); + if (!paragraphLine) { + break; + } + + paragraph.push(paragraphLine); + } + + return normalizeParagraph(paragraph.join(' ')); + } + + return ''; +} + +function stripFirstH1(content) { + const lines = content.split(/\r?\n/); + const headingIndex = lines.findIndex((line) => /^#\s+.+/.test(line.trim())); + if (headingIndex === -1) { + return content; + } + + lines.splice(headingIndex, 1); + while (headingIndex < lines.length && !lines[headingIndex].trim()) { + lines.splice(headingIndex, 1); + } + + return lines.join('\n'); +} + +function stripMatchingLeadParagraph(content, description) { + if (!description) { + return content; + } + + const lines = content.split(/\r?\n/); + let startIndex = 0; + while (startIndex < lines.length && !lines[startIndex].trim()) { + startIndex += 1; + } + + if (startIndex < lines.length && /^##\s+overview\s*$/i.test(lines[startIndex].trim())) { + const sectionStart = startIndex; + startIndex += 1; + while (startIndex < lines.length && !lines[startIndex].trim()) { + startIndex += 1; + } + + let sectionEnd = startIndex; + const sectionLines = []; + while (sectionEnd < lines.length && !/^#{2,}\s+/.test(lines[sectionEnd].trim())) { + if (lines[sectionEnd].trim()) { + sectionLines.push(lines[sectionEnd].trim()); + } + + sectionEnd += 1; + } + + if (normalizeParagraph(sectionLines.join(' ')) === description) { + while (sectionEnd < lines.length && !lines[sectionEnd].trim()) { + sectionEnd += 1; + } + + return [...lines.slice(0, sectionStart), ...lines.slice(sectionEnd)].join('\n'); + } + + startIndex = sectionStart; + } + + if (startIndex >= lines.length || !isParagraphStart(lines[startIndex].trim())) { + return content; + } + + let endIndex = startIndex; + const paragraph = []; + while (endIndex < lines.length && lines[endIndex].trim()) { + paragraph.push(lines[endIndex].trim()); + endIndex += 1; + } + + if (normalizeParagraph(paragraph.join(' ')) !== description) { + return content; + } + + while (endIndex < lines.length && !lines[endIndex].trim()) { + endIndex += 1; + } + + return [...lines.slice(0, startIndex), ...lines.slice(endIndex)].join('\n'); +} + +function isParagraphStart(line) { + return !( + line.startsWith('#') || + line.startsWith('![') || + line.startsWith('```') || + line.startsWith(':::') || + line.startsWith('::') || + line.startsWith('|') || + /^[-*+]\s+/.test(line) || + /^\d+\.\s+/.test(line) + ); +} + +function normalizeParagraph(value) { + return value.replace(/\s+/g, ' ').trim(); +} + +function yamlString(value) { + return JSON.stringify(value); +} + +function toRoute(target) { + const withoutExt = toPosix(target).replace(/\.md$/i, ''); + const parts = withoutExt.split('/'); + + if (parts.length === 1 && parts[0] === 'index') { + return '/'; + } + + const mapped = parts + .map((part, index) => { + if (index === parts.length - 1 && (part === '0.index' || part === 'index')) { + return ''; + } + + return part.replace(/^\d+\./, ''); + }) + .filter(Boolean); + + return `/${mapped.join('/')}`; +} + +function toPosix(value) { + return value.replace(/\\/g, '/'); +} + +async function writeContentFile(target, content) { + const targetPath = path.join(contentDir, target); + await fs.mkdir(path.dirname(targetPath), { recursive: true }); + await fs.writeFile(targetPath, content.endsWith('\n') ? content : `${content}\n`, 'utf8'); +}